From 8aeecaa0efc95b05df5dd7c86157a365b1b0ec88 Mon Sep 17 00:00:00 2001 From: John O'Keefe Date: Wed, 21 Oct 2026 09:27:59 -0400 Subject: [PATCH] Experiment: migrate web build to vite-plus 1.3.0 - vp migrate rewrote scripts (vite build -> vp build), aliased vite to @voidzero-dev/vite-plus-core 1.3.0 with an overrides pin, and switched the config import to vite-plus. - Manual one-line fix migrate missed: minify "esbuild" -> true (Vite 8 dropped bundled esbuild; oxc minifier is the replacement). - Widened cleanStaleChunks sweep from .js/.js.map to .css/.mjs too: Rolldown renames emitted css chunks, and two stale vite-7-era css files (annotation_layer_builder, text_layer_builder) survived the old js-only regex. - Verified: both custom plugins survive; prod/dev/watch builds OK; two consecutive builds idempotent at 289 files; vendor/pdfjs assets byte-identical; entry names (main.js/reader.js) unchanged. --- package.json | 12 ++++++++---- vite.config.ts | 11 +++++------ 2 files changed, 13 insertions(+), 10 deletions(-) diff --git a/package.json b/package.json index d2e73fb5..4572d221 100644 --- a/package.json +++ b/package.json @@ -5,9 +5,9 @@ "scripts": { "build:css": "tailwindcss -i ./web/static/input.css -o ./web/static/style.css --watch", "build:css:prod": "tailwindcss -i ./web/static/input.css -o ./web/static/style.css --minify", - "build:ts": "cp node_modules/htmx.org/dist/htmx.min.js web/static/htmx.min.js && vite build", - "build:ts:dev": "cp node_modules/htmx.org/dist/htmx.min.js web/static/htmx.min.js && vite build --mode development", - "build:ts:watch": "cp node_modules/htmx.org/dist/htmx.min.js web/static/htmx.min.js && vite build --watch", + "build:ts": "cp node_modules/htmx.org/dist/htmx.min.js web/static/htmx.min.js && vp build", + "build:ts:dev": "cp node_modules/htmx.org/dist/htmx.min.js web/static/htmx.min.js && vp build --mode development", + "build:ts:watch": "cp node_modules/htmx.org/dist/htmx.min.js web/static/htmx.min.js && vp build --watch", "build": "npm run build:ts && npm run build:css:prod", "dev": "npm run build:ts:dev && npm run build:css" }, @@ -34,6 +34,10 @@ "playwright": "^1.64.1", "tailwindcss": "^3.4.19", "typescript": "^5.9.3", - "vite": "^7.3.1" + "vite": "npm:@voidzero-dev/vite-plus-core@1.3.0", + "vite-plus": "1.3.0" + }, + "overrides": { + "vite": "npm:@voidzero-dev/vite-plus-core@1.3.0" } } diff --git a/vite.config.ts b/vite.config.ts index c9124cc7..7e036618 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -1,4 +1,4 @@ -import { defineConfig } from "vite"; +import { defineConfig } from "vite-plus"; import { cpSync, mkdirSync, readdirSync, rmSync } from "node:fs"; import { join } from "node:path"; @@ -6,8 +6,7 @@ const pdfjsAssets = () => ({ name: "pdfjs-assets", closeBundle() { const outDir = "web/static/vendor/pdfjs"; - const srcDir = - "node_modules/@bookhoard/foliate-js/vendor/pdfjs"; + const srcDir = "node_modules/@bookhoard/foliate-js/vendor/pdfjs"; mkdirSync(outDir, { recursive: true }); cpSync(join(srcDir, "standard_fonts"), join(outDir, "standard_fonts"), { recursive: true, @@ -19,7 +18,7 @@ const pdfjsAssets = () => ({ // emptyOutDir must stay false (web/static also holds tracked assets), // so hashed chunks from previous builds would otherwise accumulate // forever and leak into Docker images via the build context. Remove -// any *-.js(.map) that this build did not produce. +// any *-.js/.css/.mjs(.map) that this build did not produce. const cleanStaleChunks = () => { const produced = new Set(); return { @@ -29,7 +28,7 @@ const cleanStaleChunks = () => { }, closeBundle() { const outDir = "web/static"; - const chunkRe = /-[A-Za-z0-9_-]{8}\.js(\.map)?$/; + const chunkRe = /-[A-Za-z0-9_-]{8}\.(js|css|mjs)(\.map)?$/; for (const f of readdirSync(outDir)) { if (chunkRe.test(f) && !produced.has(f)) { rmSync(join(outDir, f)); @@ -63,6 +62,6 @@ export default defineConfig({ }, target: "esnext", sourcemap: true, - minify: "esbuild", + minify: true, }, });