import { defineConfig } from "vite"; import react from "@vitejs/plugin-react"; import tailwindcss from "@tailwindcss/vite"; import { viteModuleInventoryPlugin } from "./scripts/lib/vite-module-inventory.ts"; const techLogRouteChunks = Object.freeze({ "/public/pages/home-page.tsx": "route-tech-log-home", "/public/pages/explore-page.tsx": "route-tech-log-explore", "/public/pages/explore-kind-page.tsx": "route-tech-log-explore-kind", "/public/pages/case-page.tsx": "route-tech-log-case", "/public/pages/reference-page.tsx": "route-tech-log-reference", "/public/pages/question-page.tsx": "route-tech-log-question", "/public/pages/topic-page.tsx": "route-tech-log-topic", "/public/pages/projects-page.tsx": "route-tech-log-projects", "/public/pages/project-overview-page.tsx": "route-tech-log-project", "/public/pages/project-records-page.tsx": "route-tech-log-project-records", "/public/pages/project-decisions-page.tsx": "route-tech-log-project-decisions", "/public/pages/project-activity-page.tsx": "route-tech-log-project-activity", "/public/pages/releases-page.tsx": "route-tech-log-releases", "/public/pages/release-page.tsx": "route-tech-log-release", "/public/pages/profile-page.tsx": "route-tech-log-profile", "/public/pages/search-page.tsx": "route-tech-log-search", "/studio/pages/studio-home-page.tsx": "route-tech-log-studio-home", "/studio/pages/documents-page.tsx": "route-tech-log-studio-documents", "/studio/pages/new-document-page.tsx": "route-tech-log-studio-document-new", "/studio/pages/document-edit-page.tsx": "route-tech-log-studio-document-edit", "/studio/pages/document-validation-page.tsx": "route-tech-log-studio-document-validation", "/studio/pages/document-preview-page.tsx": "route-tech-log-studio-document-preview", "/studio/pages/document-publish-page.tsx": "route-tech-log-studio-document-publish", "/studio/pages/publications-page.tsx": "route-tech-log-studio-publications", "/studio/pages/publication-preview-page.tsx": "route-tech-log-studio-publication-preview", "/studio/pages/assets-page.tsx": "route-tech-log-studio-assets", "/studio/pages/taxonomy-page.tsx": "route-tech-log-studio-taxonomy", "/studio/pages/project-edit-page.tsx": "route-tech-log-studio-project-edit", "/studio/pages/releases-page.tsx": "route-tech-log-studio-releases", "/studio/pages/studio-not-found-page.tsx": "route-tech-log-studio-not-found", "/public/pages/public-not-found-page.tsx": "route-not-found", } as const); function routeChunkName(moduleId: string): string | undefined { const normalized = moduleId.replaceAll("\\", "/"); const featurePath = "/src/features/tech-log/presentation"; const featureIndex = normalized.lastIndexOf(featurePath); if (featureIndex < 0) return undefined; const routePath = normalized.slice(featureIndex + featurePath.length); return techLogRouteChunks[routePath as keyof typeof techLogRouteChunks]; } /** * ยง6.1. One sub-path, declared once. * * `VITE_ROUTER_BASE_PATH` already drives the router and the Service Worker * scope. Vite's asset `base` was left at its default, so a build served from * `/app/` emitted root-absolute asset URLs and loaded nothing: the three * consumers of the same setting disagreed. They are read from one value here so * a sub-path deployment is coherent or fails at build time. */ function routerBasePath(environment: NodeJS.ProcessEnv): string { const declared = environment["VITE_ROUTER_BASE_PATH"]; if (declared === undefined || declared === "") return "/"; if (!declared.startsWith("/") || !declared.endsWith("/")) { throw new Error( `VITE_ROUTER_BASE_PATH must start and end with "/"; received ${declared}`, ); } return declared; } export default defineConfig({ base: routerBasePath(process.env), plugins: [react(), tailwindcss(), viteModuleInventoryPlugin()], build: { manifest: true, sourcemap: false, rolldownOptions: { output: { manualChunks: routeChunkName, }, }, }, });