Files
tech-log-frontend/vite.config.ts
T
DongHyeonkaandClaude Opus 5 16e5b9f4ec feat: 프로젝트를 편집하고 활동을 남길 수 있게 한다
홈의 집중 카드가 제목만 보여 주고 "현재 목표"·"다음 작업" 칸이 비어 있었다.
프로젝트 페이지의 "활동" 도 늘 비어 있었다.

프로젝트를 만들 수는 있었지만 고칠 화면이 없었다. 그래서 이름과 slug 말고는 아무
값도 가질 수 없었고, 그 값을 읽는 공개 화면들은 빈칸을 그렸다 — 백엔드의
`updateProject` 는 처음부터 구현돼 있었고 채울 화면만 없었다.

`/studio/projects/:id` 를 연다. 프로젝트 필드 전부와 활동 목록을 한 화면에 둔다 —
프로젝트 밖의 활동은 존재하지 않고, 무엇이 공개 타임라인에 실리는지를 프로젝트 필드와
같은 자리에서 보는 편이 낫다.

이미 공개된 프로젝트는 저장한 뒤 투영도 함께 갱신한다. 투영은 게시할 때 세워지므로,
저장만 하면 공개 화면에는 예전 값이 남는다.

단계와 활동 유형의 선택지는 DB CHECK 제약과 같은 목록이다. 화면이 더 많은 값을
보여 주면 저장이 제약에서 터지고, 작성자는 왜 안 되는지 알 수 없다.

라우트가 하나 늘어 CI 게이트가 함께 움직였다 — FE-GATE-009 는 설치된 라우트마다 수동
접근성 증거를 하나씩 요구하고 그 집합이 정확히 일치하지 않으면 거절한다. 아티팩트
기준선 132→133, 증거 개수 111→112, 게이트 형태 다이제스트 재계산(이전 상수 187dbd96…
을 이전 gates.json 에서 먼저 재현해 계산 방법을 확인했다), 서빙 패턴 하나 추가.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01XEHXspz4rv5pB5wiiSsVDu
2026-08-23 19:45:00 +09:00

83 lines
3.9 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/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,
},
},
},
});