Vendors the canonical studio-v1.yaml, generates types via an isolated `pnpm dlx` toolchain (openapi-typescript needs TypeScript 5's classic compiler API; this repo pins TypeScript 7.0.2 per VD-01, whose root export has none), and adds an offline drift gate that checks the vendored yaml/generated types/canonical-source.json against each other without touching the sibling design-package repo or the network. Regenerating from canonical surfaces real, new required fields on existing schemas (WorkingCopyDetail.nextAction, PreviewDetail/PublicPreview .dependencyRevision, StudioDashboard.totals.needsValidation, PublicationSnapshot.contentFormatVersion/rendererContractVersion) and a new required EvidenceFigureBlock.asset. The mock gateway and fixtures are updated to satisfy the former; the latter exposes a real authoring- vs-rendering conflation in the content-format parser (it declared its output as the server's fully-resolved PublicRenderModel type, which it has no asset catalog to satisfy). Split that boundary: the parser now produces an authoring block type omitting the resolved asset, and each of its three consumers (the mock gateway, the Studio instant preview, and the static Case demo page) attaches the resolved descriptor from its own asset source through a shared, pure domain-level resolver. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
177 lines
15 KiB
JSON
177 lines
15 KiB
JSON
{
|
|
"name": "tech-log-frontend",
|
|
"version": "0.1.0",
|
|
"private": true,
|
|
"type": "module",
|
|
"packageManager": "pnpm@11.17.0",
|
|
"engines": {
|
|
"node": ">=24.11.0 <25.0.0",
|
|
"pnpm": ">=11.0.0 <12.0.0"
|
|
},
|
|
"scripts": {
|
|
"dev": "vite",
|
|
"build": "node scripts/build-frontend.ts",
|
|
"build:profile": "node scripts/generate-runtime-config.ts",
|
|
"build:release-candidate": "corepack pnpm build && corepack pnpm generate:supply-chain && corepack pnpm scan:security && corepack pnpm verify:release && node scripts/verify-supply-chain-artifacts.ts && node scripts/create-release-candidate.ts",
|
|
"preview": "node dist/server.mjs",
|
|
"verify:tech-log-source-parity": "node tests/support/browser/verify-tech-log-source-parity.ts",
|
|
"lint": "eslint src scripts tests recipes .storybook vite.config.ts vitest.config.ts playwright*.config.ts --max-warnings=0",
|
|
"check:architecture": "node scripts/check-architecture.ts",
|
|
"check:design-system": "node scripts/check-design-system.ts",
|
|
"check:design-system:fixture": "node scripts/check-design-system.ts --fixture",
|
|
"check:i18n": "node scripts/check-i18n.ts",
|
|
"check:i18n:fixture": "node scripts/check-i18n.ts --fixture",
|
|
"check:adapter-inventory": "node scripts/check-adapter-inventory.ts",
|
|
"check:remediation-ledger": "node scripts/check-remediation-ledger.ts",
|
|
"check:release-admission": "node scripts/check-release-admission.ts",
|
|
"check:diagnostics": "node scripts/check-diagnostics.ts",
|
|
"check:diagnostics:fixture": "node scripts/check-diagnostics.ts --fixture",
|
|
"check:types": "corepack pnpm check:types:app && corepack pnpm check:types:node && corepack pnpm check:types:test && corepack pnpm check:types:recipes && corepack pnpm check:types:web-worker && corepack pnpm check:types:service-worker",
|
|
"check:types:app": "tsc --project tsconfig.app.json",
|
|
"check:types:node": "tsc --project tsconfig.node.json",
|
|
"check:types:test": "tsc --project tsconfig.test.json",
|
|
"check:types:recipes": "node scripts/check-optional-recipe-types.ts",
|
|
"check:types:fixture": "tsc --ignoreConfig --strict --noEmit --target ES2022 --module NodeNext --moduleResolution NodeNext tests/fixtures/typecheck/invalid-port-call.ts",
|
|
"check:types:fixture:ts-port": "tsc --ignoreConfig --strict --noEmit --target ES2022 --module ESNext --moduleResolution Bundler tests/fixtures/typecheck/invalid-port-implementation.ts",
|
|
"check:types:fixture:ts-result": "tsc --ignoreConfig --strict --noEmit --target ES2022 --module ESNext --moduleResolution Bundler tests/fixtures/typecheck/invalid-result-narrowing.ts",
|
|
"check:types:fixture:application-output": "tsc --ignoreConfig --strict --noEmit --skipLibCheck --target ES2022 --module ESNext --moduleResolution Bundler tests/fixtures/typecheck/invalid-application-output.ts",
|
|
"check:types:fixture:application-input": "tsc --ignoreConfig --strict --noEmit --skipLibCheck --target ES2022 --module ESNext --moduleResolution Bundler tests/fixtures/typecheck/invalid-application-input.ts",
|
|
"check:types:fixture:feature-input": "tsc --ignoreConfig --strict --noEmit --skipLibCheck --target ES2022 --module ESNext --moduleResolution Bundler tests/fixtures/typecheck/invalid-feature-input.ts",
|
|
"check:types:fixture:failure-kind": "tsc --ignoreConfig --strict --noEmit --skipLibCheck --target ES2022 --module ESNext --moduleResolution Bundler tests/fixtures/typecheck/invalid-failure-kind.ts",
|
|
"check:types:fixture:reference-operation": "tsc --ignoreConfig --strict --noEmit --skipLibCheck --target ES2022 --module ESNext --moduleResolution Bundler tests/fixtures/typecheck/invalid-reference-operation.ts",
|
|
"check:types:fixture:async-overlay": "tsc --ignoreConfig --strict --noEmit --skipLibCheck --target ES2022 --module ESNext --moduleResolution Bundler tests/fixtures/typecheck/invalid-async-overlay.ts",
|
|
"check:types:fixture:route-runtime": "tsc --ignoreConfig --strict --noEmit --skipLibCheck --target ES2022 --module ESNext --moduleResolution Bundler tests/fixtures/typecheck/invalid-route-runtime.ts",
|
|
"check:types:fixture:page-action": "tsc --ignoreConfig --strict --noEmit --skipLibCheck --target ES2022 --module ESNext --moduleResolution Bundler --jsx react-jsx tests/fixtures/typecheck/invalid-page-action.tsx",
|
|
"check:types:fixture:icon-button": "tsc --ignoreConfig --strict --noEmit --skipLibCheck --target ES2022 --module ESNext --moduleResolution Bundler --jsx react-jsx tests/fixtures/typecheck/invalid-icon-button.tsx",
|
|
"check:types:fixture:i18n-key": "tsc --ignoreConfig --strict --noEmit --skipLibCheck --target ES2022 --module ESNext --moduleResolution Bundler tests/fixtures/typecheck/invalid-message-key.ts",
|
|
"check:types:fixture:i18n-params": "tsc --ignoreConfig --strict --noEmit --skipLibCheck --target ES2022 --module ESNext --moduleResolution Bundler tests/fixtures/typecheck/invalid-message-params.ts",
|
|
"check:types:fixture:diagnostics": "tsc --ignoreConfig --strict --noEmit --skipLibCheck --target ES2022 --module ESNext --moduleResolution Bundler tests/fixtures/typecheck/invalid-diagnostics-port.ts",
|
|
"check:types:fixture:image-resolve-signal": "tsc --ignoreConfig --strict --noEmit --skipLibCheck --target ES2022 --module ESNext --moduleResolution Bundler tests/fixtures/typecheck/invalid-image-cdn-resolve-signal.ts",
|
|
"test:runtime-schema": "vitest run tests/runtime-schema --reporter=default --reporter=junit --outputFile.junit=artifacts/tests/runtime-schema.xml --passWithNoTests",
|
|
"test:unit": "vitest run tests/unit --reporter=default --reporter=junit --outputFile.junit=artifacts/tests/unit.xml",
|
|
"test:component": "vitest run tests/component --reporter=default --reporter=junit --outputFile.junit=artifacts/tests/component.xml",
|
|
"test:integration": "vitest run tests/integration --reporter=default --reporter=junit --outputFile.junit=artifacts/tests/integration.xml",
|
|
"test:http-scenario-catalog": "vitest run tests/integration/http-scenario-catalog.test.ts --reporter=default --maxWorkers=1",
|
|
"test:http-scenario-evidence": "node scripts/run-http-scenario-evidence.ts",
|
|
"test:recipes": "vitest run tests/recipes --reporter=default --reporter=junit --outputFile.junit=artifacts/tests/optional-recipes.xml --passWithNoTests",
|
|
"test:e2e": "playwright test",
|
|
"test:e2e:dev": "playwright test --config playwright.dev.config.ts",
|
|
"test:browser-capabilities": "playwright test --config playwright.capabilities.config.ts",
|
|
"verify:browser-capability-evidence": "node scripts/verify-browser-capability-evidence.ts",
|
|
"storybook": "storybook dev -p 6006",
|
|
"build:storybook": "storybook build -o artifacts/storybook/static",
|
|
"test:storybook": "playwright test --config playwright.storybook.config.ts",
|
|
"test:visual": "playwright test --config playwright.visual.config.ts",
|
|
"test:visual:update": "playwright test --config playwright.visual.config.ts --update-snapshots",
|
|
"check:test-evidence": "node scripts/check-test-evidence.ts",
|
|
"check:test-evidence:browser": "node scripts/check-test-evidence.ts --skip-scenario-executions",
|
|
"check:http-scenario-evidence": "node scripts/check-test-evidence.ts --scenario-only --artifact artifacts/quality/http-scenario-evidence.json",
|
|
"check:http-scenario-evidence:fixture": "node scripts/check-test-evidence.ts --scenario-only --source-root tests/fixtures/test-evidence/scenarios/source --policy tests/fixtures/test-evidence/scenarios/policy.json --catalog tests/fixtures/test-evidence/scenarios/catalog.json --receipt tests/fixtures/test-evidence/scenarios/receipt.json --artifact artifacts/quality/http-scenario-evidence-fixture.json",
|
|
"check:test-evidence:source": "node scripts/check-test-evidence.ts --source-only --artifact artifacts/quality/test-evidence-source.json",
|
|
"check:test-evidence:fixture": "node scripts/check-test-evidence.ts --source-root tests/fixtures/test-evidence/forbidden --artifact artifacts/quality/test-evidence-fixture.json",
|
|
"test:a11y": "playwright test --grep @a11y && node scripts/write-a11y-report.ts",
|
|
"review:a11y-manual": "node scripts/verify-a11y-manual.ts",
|
|
"test:sample-removal": "node scripts/test-sample-removal.ts",
|
|
"test:optional-recipe-removal": "node scripts/test-optional-recipe-removal.ts",
|
|
"test:browser-file-storage-removal": "node scripts/test-browser-file-storage-runtime-removal.ts",
|
|
"test:realtime-removal": "node scripts/test-realtime-runtime-removal.ts",
|
|
"test:reference-feature": "vitest run tests/features/reference-feature --reporter=default --reporter=junit --outputFile.junit=artifacts/tests/reference-feature.xml --passWithNoTests",
|
|
"test:tech-log": "vitest run tests/features/tech-log --reporter=default --reporter=junit --outputFile.junit=artifacts/tests/tech-log.xml",
|
|
"check:v8-coverage-counter-semantics": "node scripts/check-v8-coverage-counter-semantics.ts",
|
|
"test:coverage": "corepack pnpm check:v8-coverage-counter-semantics && vitest run tests/runtime-schema tests/unit tests/component tests/integration tests/features/reference-feature tests/features/tech-log --coverage --maxWorkers=4 --reporter=default --reporter=junit --outputFile.junit=artifacts/tests/coverage.xml && node scripts/check-risk-coverage.ts",
|
|
"check:coverage:fixture": "node scripts/check-risk-coverage.ts --summary tests/fixtures/coverage/below-threshold.json --artifact artifacts/quality/risk-coverage-fixture.json",
|
|
"test:all": "corepack pnpm test:runtime-schema && corepack pnpm test:unit && corepack pnpm test:component && corepack pnpm test:integration && corepack pnpm test:reference-feature && corepack pnpm test:tech-log && corepack pnpm test:recipes",
|
|
"verify:lockfile": "corepack pnpm install --frozen-lockfile --ignore-scripts",
|
|
"check:frozen-lockfile:fixture": "node scripts/check-frozen-lockfile-fixture.ts",
|
|
"generate:artifact-schemas": "node scripts/generate-artifact-schemas.ts",
|
|
"check:artifact-schemas": "node scripts/generate-artifact-schemas.ts --check",
|
|
"generate:tech-log-contract": "node scripts/generate-tech-log-contract.ts",
|
|
"check:tech-log-contract": "node scripts/generate-tech-log-contract.ts --check",
|
|
"generate:supply-chain": "node scripts/generate-supply-chain.ts",
|
|
"verify:local-evidence": "node scripts/verify-release-candidate.ts && node scripts/verify-release.ts && node scripts/verify-supply-chain-artifacts.ts && node scripts/verify-archived-local-evidence.ts && node scripts/verify-release-candidate.ts",
|
|
"verify:promotion": "node scripts/verify-exact-promotion-bundle.ts",
|
|
"update:dependency-baseline": "node scripts/update-dependency-baseline.ts",
|
|
"check:supply-chain:fixtures": "node scripts/check-supply-chain-fixtures.ts",
|
|
"check:supply-chain:provider-fixtures": "node scripts/check-supply-chain-provider-fixtures.ts",
|
|
"verify:reproducible-build": "node scripts/verify-reproducible-build.ts",
|
|
"scan:security": "node scripts/security-scan.ts",
|
|
"scan:security:fixture": "node scripts/security-scan.ts --policy tests/fixtures/security/secret-detection/forbidden-policy.json --artifact artifacts/security/scan-fixture.sarif",
|
|
"check:security:fixtures": "node scripts/check-security-fixtures.ts",
|
|
"check:browser-security": "node scripts/check-browser-security.ts",
|
|
"check:browser-file-storage-boundaries": "node scripts/check-browser-file-storage-boundaries.ts",
|
|
"check:realtime-boundaries": "node scripts/check-realtime-boundaries.ts",
|
|
"check:realtime-boundaries:fixture": "node scripts/check-realtime-boundary-fixtures.ts",
|
|
"check:optional-recipes": "node scripts/check-optional-recipes.ts --require-dist",
|
|
"check:optional-recipes:source": "node scripts/check-optional-recipes.ts",
|
|
"check:optional-recipe-fixtures": "node scripts/check-optional-recipe-fixtures.ts",
|
|
"check:registries": "node scripts/check-registries.ts",
|
|
"check:registries:structure": "node scripts/check-registries.ts --no-baseline",
|
|
"check:registries:compatibility-fixtures": "node scripts/check-registry-compatibility-fixtures.ts",
|
|
"check:registries:baseline-fixture": "node scripts/check-registries.ts --approval tests/fixtures/registry/compatibility/tampered-approval.json --artifact artifacts/quality/registry-baseline-fixture.json",
|
|
"check:registries:fixture": "node scripts/check-registries.ts --governance tests/fixtures/registry/forbidden/governance.json --artifact artifacts/quality/registry-fixture.json",
|
|
"check:routes:fixture": "node scripts/check-registries.ts --governance tests/fixtures/registry/routes/governance.json --artifact artifacts/quality/route-registry-fixture.json",
|
|
"verify:compatibility": "node scripts/check-compatibility.ts",
|
|
"verify:release": "node scripts/verify-release.ts",
|
|
"verify:hosting-headers": "node scripts/verify-hosting-headers.ts",
|
|
"check:bundle": "node scripts/generate-supply-chain.ts && node scripts/check-bundle.ts",
|
|
"test:performance": "node scripts/test-performance.ts",
|
|
"collect:web-vitals-evidence": "node scripts/collect-web-vitals-evidence.ts",
|
|
"drill:runbook": "node scripts/drill-runbook.ts",
|
|
"drill:runbooks": "corepack pnpm drill:runbook -- FE-RB-001 && corepack pnpm drill:runbook -- FE-RB-002 && corepack pnpm drill:runbook -- FE-RB-003 && corepack pnpm drill:runbook -- FE-RB-004 && corepack pnpm drill:runbook -- FE-RB-005",
|
|
"ci:gate": "node scripts/run-ci-gate.ts",
|
|
"generate:ci-workflow": "node scripts/generate-ci-workflow.ts",
|
|
"check:ci-workflow": "node scripts/generate-ci-workflow.ts --check",
|
|
"check:ci": "corepack pnpm check:artifact-schemas && node scripts/check-ci-contract.ts && corepack pnpm check:ci-workflow",
|
|
"verify:documentation": "node scripts/verify-documentation-readiness.ts",
|
|
"build:app-only": "vite build && node scripts/generate-build-manifest.ts",
|
|
"generate:contract-set": "node scripts/generate-contract-set.ts",
|
|
"check:types:web-worker": "tsc --project tsconfig.web-worker.json",
|
|
"check:types:service-worker": "tsc --project tsconfig.service-worker.json"
|
|
},
|
|
"dependencies": {
|
|
"@fontsource/ibm-plex-mono": "5.3.0",
|
|
"@tanstack/react-query": "5.101.4",
|
|
"lucide-react": "1.25.0",
|
|
"pretendard": "1.3.9",
|
|
"react": "19.2.8",
|
|
"react-dom": "19.2.8",
|
|
"react-router-dom": "7.18.1",
|
|
"remark-directive": "4.0.0",
|
|
"remark-gfm": "4.0.1",
|
|
"remark-parse": "11.0.0",
|
|
"unified": "11.0.5",
|
|
"zod": "4.4.3"
|
|
},
|
|
"devDependencies": {
|
|
"@axe-core/playwright": "4.12.1",
|
|
"@babel/core": "8.0.1",
|
|
"@babel/eslint-parser": "8.0.1",
|
|
"@babel/plugin-syntax-jsx": "8.0.1",
|
|
"@babel/plugin-syntax-typescript": "8.0.3",
|
|
"@eslint/js": "10.0.1",
|
|
"@playwright/test": "1.62.0",
|
|
"@storybook/addon-a11y": "10.5.4",
|
|
"@storybook/react-vite": "10.5.4",
|
|
"@tailwindcss/vite": "4.3.3",
|
|
"@testing-library/jest-dom": "7.0.0",
|
|
"@testing-library/react": "16.3.2",
|
|
"@testing-library/user-event": "14.6.1",
|
|
"@types/node": "24.13.3",
|
|
"@types/react": "19.2.8",
|
|
"@types/react-dom": "19.2.3",
|
|
"@vitejs/plugin-react": "6.0.4",
|
|
"@vitest/coverage-v8": "4.1.10",
|
|
"dependency-cruiser": "18.1.0",
|
|
"eslint": "10.8.0",
|
|
"eslint-plugin-react-hooks": "7.1.1",
|
|
"globals": "17.7.0",
|
|
"jsdom": "29.1.1",
|
|
"msw": "2.15.0",
|
|
"storybook": "10.5.4",
|
|
"tailwindcss": "4.3.3",
|
|
"typescript": "7.0.2",
|
|
"vite": "8.1.5",
|
|
"vitest": "4.1.10"
|
|
}
|
|
}
|