39bfcd2032
Task 3 of Plan 02-03: ship the PIPE-02 structural assertion that Season-1
content reaches the build output. Three structural checks (any one
sufficient): chunk filename slug match (fragments / season1 / 01-soil),
chunk-contents reference to /content/seasons/01-soil/ source path or to
known fragment ids, and a future-extension hook for index.html manifest
inspection.
Phase 2 ships eager-corpus loading alongside the lazy
loadSeasonFragments surface, so currently chunkContentMatch=true via
inlined ?raw content. When Plan 02-04+ switches consumers to lazy-only
and Vite emits a separate Season-1 chunk, chunkNameMatch will also
start passing — at which point either path satisfies the assertion. The
plumbing is structurally proven now; the chunk-naming side is documented
as the path of least resistance for the Phase-4 Season-2 onboarding.
scripts/check-bundle-split.mjs:
- Refactored body into export function runCheck() returning a structured
result; the CLI invocation guard wraps process.exit so Vitest can
import the module without termination (verified by the test file).
scripts/check-bundle-split.test.mjs:
- 3 cases: file exists, parses + imports without process.exit firing,
runCheck() returns the documented {ok, message, chunkNameMatch,
chunkContentMatch, files} shape. The on-disk dist/-required happy path
fires via the package.json scripts.ci chain (`npm run build &&
npm run check:bundle-split`).
package.json:
- New `check:bundle-split` script.
- `ci` chain extended: lint → test → validate:assets → build →
check:bundle-split. dist/ is populated by build before the bundle-split
assertion runs.
`npm run ci` exits 0 end-to-end. 217/217 tests green (was 214; +3 new
this task). The PIPE-02 verification step now refuses any future change
that breaks the lazy-content plumbing.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
53 lines
1.7 KiB
JSON
53 lines
1.7 KiB
JSON
{
|
|
"name": "the-last-garden",
|
|
"version": "0.0.0",
|
|
"private": true,
|
|
"type": "module",
|
|
"description": "A 7-Season browser narrative idle game in the lineage of A Dark Room and Universal Paperclips.",
|
|
"scripts": {
|
|
"dev": "vite",
|
|
"build": "tsc -b && vite build",
|
|
"preview": "vite preview",
|
|
"lint": "eslint . --max-warnings 0",
|
|
"test": "vitest run --passWithNoTests=false",
|
|
"test:watch": "vitest",
|
|
"validate:assets": "node scripts/validate-assets.mjs",
|
|
"check:bundle-split": "node scripts/check-bundle-split.mjs",
|
|
"compile:ink": "echo \"[compile:ink] no .ink files yet — Phase 2 will populate /content/dialogue/\" && exit 0",
|
|
"ci": "npm run lint && npm run test && npm run validate:assets && npm run build && npm run check:bundle-split"
|
|
},
|
|
"dependencies": {
|
|
"break_eternity.js": "^2.1.3",
|
|
"crc-32": "^1.2.2",
|
|
"gray-matter": "^4.0.3",
|
|
"idb": "^8.0.3",
|
|
"inkjs": "^2.4.0",
|
|
"lz-string": "^1.5.0",
|
|
"phaser": "^4.1.0",
|
|
"react": "^19.2.6",
|
|
"react-dom": "^19.2.6",
|
|
"yaml": "^2.8.4",
|
|
"zod": "^4.4.3",
|
|
"zustand": "^5.0.13"
|
|
},
|
|
"devDependencies": {
|
|
"@playwright/test": "^1.59.1",
|
|
"@testing-library/react": "^16.3.2",
|
|
"@types/node": "^22.19.18",
|
|
"@types/react": "^19.2.14",
|
|
"@types/react-dom": "^19.2.3",
|
|
"@vitejs/plugin-react": "^6.0.1",
|
|
"@vitest/ui": "^4.1.5",
|
|
"eslint": "^9.39.4",
|
|
"eslint-import-resolver-typescript": "^4.4.4",
|
|
"eslint-plugin-boundaries": "^6.0.2",
|
|
"fake-indexeddb": "^6.2.5",
|
|
"happy-dom": "^20.9.0",
|
|
"inklecate": "^1.8.1",
|
|
"typescript": "^6.0.3",
|
|
"typescript-eslint": "^8.59.2",
|
|
"vite": "^8.0.11",
|
|
"vitest": "^4.1.5"
|
|
}
|
|
}
|