{ // 型検査専用の設定 (#1001)。 // // 検査範囲は「UI の TypeScript 全部」——src に加えて E2E 仕様と、ui/ 直下の // playwright / vite の設定ファイル。 // // ビルド用 (tsconfig.json) と分けてある理由: build は Dockerfile の // `npm run build:ui` から呼ばれる**製品ビルド**の経路にある。そこに E2E を // 混ぜると、製品イメージのビルドが @playwright/test や better-sqlite3 と // いった devDependency に依存する。`npm ci --omit=dev` を足す、COPY の順を // 入れ替える——そういう普通の変更が、テストではなく製品ビルドを壊すように // なってしまう。検査の網は広く、ビルドの依存は狭く。 "extends": "./tsconfig.json", "compilerOptions": { // Node の型を明示で戻す (#1316)。 // // 引き継ぎ元 (tsconfig.json) は types: [] で親ディレクトリの型定義を断って // いる。あちらは出荷物だけを見る設定なので断てるが、こちらの検査対象には // Node の上で動くものが混ざる: ui/ 直下の vite.config.ts (__dirname) と // playwright の設定 (process.env / process.execPath)、e2e 一式、そして src の // テスト (node:fs / node:path / global)。断ったままだと、これらが落ちる。 // // ここは「取り込む型定義を選んで名指しする」のであって、自動取り込みには // 戻さない。名指しなので、増えるのは node 1 つだけ。参照先を ui 自身の // node_modules に固定するため、@types/node は ui/package.json の // devDependencies に入れてある (版は直下と同じ ^20.11.30)。 // // 版をそろえる意味は #1314 のときとは変わっている。#1314 で踏んだ「直下が 20 の // ままこちらだけ新しくなると出荷物が落ちる」形は、tsconfig.json が types: [] に // なった時点で出荷物の側からは消えた。いま残る意味は、画面側の検査とサーバー側の // Node の版をそろえておくこと。将来 Node を 22 に上げるとき、直下だけ上げた瞬間に // scripts/ui-typecheck-gate.test.ts の版そろえの見張りが落ちる——意図した動作で、 // 「こちらも一緒に上げろ」の合図。 // // なお、この設定は「ブラウザに無いものを止める関所」にはならない。e2e が // better-sqlite3 を読み、その .d.ts の `/// ` が // Node の型をプログラム全体へ呼び戻すので、types をどう書いても src で // Buffer が通る (--explainFiles で確認)。関所は tsconfig.json 側。 "types": ["node"], "noEmit": true }, "include": ["src", "e2e", "e2e-auth", "*.ts"], // exclude は extends で引き継がれる。引き継ぎ元はテストを外しているので、 // ここで書き直さないと src のテストが黙って検査対象から外れる (#1316)。 "exclude": ["node_modules", "dist"] }