편집 폼이 릴리즈 목록 아래에 열렸다. 릴리즈가 열 개 스무 개로 늘면 편집하려고 목록 전체를 지나 내려가야 하고, 저장 버튼은 그보다 더 아래에 있다. 목록이 길어질수록 편집이 멀어지는 구조다. `/studio/releases/:id` 를 연다 — 문서와 프로젝트가 각자 편집 주소를 갖는 것과 같은 이유다. 목록의 "편집" 은 토글이 아니라 링크가 되고, 새 릴리즈를 만들면 곧바로 그 화면으로 간다(만들자마자 편집할 것이 분명하다). 라우트가 하나 늘어 CI 게이트가 함께 움직였다 — 아티팩트 기준선 133→134, 증거 개수 112→113, 게이트 형태 다이제스트 재계산(f9e7e521… 을 이전 gates.json 에서 먼저 재현해 계산 방법을 확인했다), 서빙 패턴 하나 추가. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01XEHXspz4rv5pB5wiiSsVDu
84 lines
4.0 KiB
TypeScript
84 lines
4.0 KiB
TypeScript
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/release-edit-page.tsx": "route-tech-log-studio-release-edit",
|
|
"/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,
|
|
},
|
|
},
|
|
},
|
|
});
|