@ritsubi/contract generated 配置移行設計と実施履歴¶
目的¶
@ritsubi/contract の codegen 生成物を packages/contract/generated/ に置き、src/ 直下の generated artifact 例外をなくす。
現行では packages/contract/generated/*.ts を tracked 正本として扱う。runtime / codegen の安定性を壊さずに、package root ベースの公開面で維持する。
実施状況¶
- 完了:
- Phase 0: package root entrypoint(
index.ts/paths.ts/validation/common.ts)を追加 - Phase 1: consumer の source alias を
packages/contract/srcから package root へ切替 - Phase 2: codegen 正本を
packages/contract/generated/*.tsへ移動 - Phase 3:
packages/contract/src/index.ts/src/paths.tsの互換層を削除 - 継続運用:
packages/contract/generated/*.tsを tracked 正本とするsrc/配下の emitted JS / declaration artifact は tracked 正本にしない- 別件として残るもの:
ritsubi-vendure-server:codegenの flaky は@ritsubi/pluginsbuild / dist 解決系の不安定として別トピックで扱う
現行状態¶
- tracked 正本:
packages/contract/generated/*.ts- package 公開面:
packages/contract/package.jsonのmain/types/exportsはdist/を正本にする- compile-time alias:
- root
tsconfig.json apps/storefront/tsconfig.jsonapps/vendure-server/tsconfig.typecheck.jsonpackages/plugins/tsconfig*.jsonなどがpackages/contract/srcを直接参照している- runtime / codegen:
vendure-serverは runtime とtsx実行の都合でdist正本を維持する必要がある
最終形の方針¶
公開面¶
- 手書き契約:
packages/contract/src/** - generated 正本:
packages/contract/generated/*.ts - workspace 向け source entrypoint:
packages/contract/直下 index.tspaths.tsvalidation/common.ts- runtime / package export:
dist/
目標¶
- consumer が
packages/contract/srcを alias 正本として見ない状態にする - generated の物理配置を
src/外へ移し、srcartifact guard と整合させる @ritsubi/contract/pathsの runtime 振る舞いは維持する
非目標¶
@ritsubi/contractを別 package に分割しない- runtime / codegen を source 直接解決に寄せない
vendure-serverの runtime / typecheck 分離を今回なくさない
推奨移行フェーズ¶
Phase 0: package root entrypoint を追加する¶
目的¶
consumer 側が src/ を直接見なくても source 解決できる土台を先に作る。
変更対象¶
packages/contract/index.ts(新設)packages/contract/paths.ts(新設)packages/contract/validation/common.ts(新設)packages/contract/tsconfig.jsonpackages/contract/tsconfig.build.jsonpackages/contract/project.json- 必要に応じて
packages/contract/package.json
受け入れ条件¶
pnpm exec nx run @ritsubi/contract:codegenpnpm exec nx run @ritsubi/contract:buildpnpm exec nx run @ritsubi/contract:typecheck@ritsubi/contract/pathsの runtime 解決が変わらない
Phase 1: source alias を src/ から package root へ切り替える¶
目的¶
generated 移動前に、consumer 側の src 直依存を断つ。
主な変更対象¶
tsconfig.jsonapps/storefront/tsconfig.jsonapps/vendure-server/tsconfig.typecheck.jsonpackages/plugins/tsconfig.jsonpackages/plugins/tsconfig.typecheck.jsonpackages/sdk/shop/tsconfig.jsonapps/storefront/vite.config.tsapps/storefront/vitest.config.tsapps/storefront/playwright.ct.config.tsapps/vendure-server/vitest.integration.config.tspackages/plugins/vitest*.ts
変更方針¶
@ritsubi/contract→packages/contract/index.ts@ritsubi/contract/*→packages/contract/*
受け入れ条件¶
grepでpackages/contract/srcを alias 正本にしている consumer 設定が解消される- storefront / plugins / vendure-server の typecheck / build / test alias が維持される
Phase 2: generated を src/ から generated/ へ移動する¶
目的¶
tracked codegen 正本を src/ 外へ出し、artifact ルールと一致させる。
主な変更対象¶
packages/contract/codegen.tspackages/contract/index.tspackages/contract/tsconfig.jsonpackages/contract/tsconfig.build.jsonpackages/contract/project.jsonnx.json.github/workflows/_ci-pr-core-quality.ymlscripts/dev/ci-local.shscripts/hooks/hook-common.sh.oxfmtrc.jsonAGENTS.mdpackages/contract/AGENTS.mddocs/development-guide.mddocs/development-standards.md
変更方針¶
- codegen 出力先を
src/generated/*.tsからgenerated/*.tsへ変更 - root entrypoint の generated export を
./generated/*.jsに切替 - Nx / CI / hook の outputs / clean-check を新パスへ追従
受け入れ条件¶
packages/contract/src/generated/**が再生成されないpackages/contract/generated/*.tsが codegen 正本として更新されるpnpm run lint:tracked-src-artifactsが通る- dependent build / codegen / typecheck が維持される
Phase 3: 互換層を掃除する¶
目的¶
移行後に不要になった src 前提の互換コードとコメントを消す。
受け入れ条件¶
- workspace 全体で
packages/contract/srcを alias 正本として参照しない - package root entrypoint が source 正本として定着している
リスク¶
@ritsubi/contract/pathsの runtime パス解決が崩れる- Vite / Vitest / Playwright の alias と tsconfig paths が不整合になる
- Nx outputs と CI clean-check の更新漏れで false red が出る
vendure-serverの runtime/dist と typecheck/source の分離を壊す
ロールバック方針¶
- Phase 0 失敗時:
- package root entrypoint の追加を戻す
- Phase 1 失敗時:
- alias 設定群のみ元へ戻す
- Phase 2 失敗時:
- codegen 出力先を
src/generated/*.tsに戻す - CI / hook / docs の参照パスを戻す
検証コマンド¶
pnpm exec nx run @ritsubi/contract:codegen
pnpm exec nx run @ritsubi/contract:build
pnpm exec nx run @ritsubi/contract:typecheck
pnpm -C packages/plugins build
pnpm exec nx run ritsubi-vendure-server:codegen
pnpm exec nx run ritsubi-vendure-server:typecheck
pnpm exec nx run ritsubi-vendure-server:build
pnpm run lint:tracked-src-artifacts
現行運用との関係¶
この文書は移行設計であり、現行正本を直ちに変更するものではない。移行着手までは以下を維持する。
packages/contract/generated/*.tsを tracked 正本とするsrc/配下の*.js/*.d.ts/*.mapは tracked 正本にしない
移行の各フェーズで green を確認しながら、現行ルールを段階的に置き換える。