New `brief` context — a letter-composition feature with a drafter/approver approval workflow, built as a teaching vertical slice on the repo's existing FP + Elm + atomic-design patterns (see plan in ~/.claude/plans). Domain (pure): - Rich text as a serialisable value tree (placeholders are first-class nodes), moved to @shared/kernel/rich-text.ts so the shared editor can use it. - lintPlaceholders: a pure, total content -> Diagnostic[] linter, derived never stored. - brief.machine.ts: status sum-type with guarded transitions; frozen-snapshot = deep value copy; derived diagnostics/editability. Full specs. Backend (.NET stub): - BriefStore + seed, GET/PUT /brief and submit/approve/reject/send endpoints, role via X-Role header (mirrors X-Admin), transition + approver!=drafter guards, audit logging. Regenerated typed client via gen:api. +6 backend tests. Seam: - brief.adapter.ts maps flat wire unions <-> domain discriminated unions at the parse boundary (+ spec). UI (atomic): - shared atoms: checkbox, placeholder-chip; molecule: rich-text-editor (no-dep contenteditable, DOM<->RichTextBlock round-trip tested). - brief/ui: letter-block, passage-picker, diagnostics-panel, rejection-comments, letter-section, letter-composer, letter-preview, brief.page + /brief route. - Dev-only ?role=drafter|approver toggle + roleInterceptor; dashboard nav link. Enforcement: @brief/* alias + eslint layer boundary (brief depends only on shared). Also included (same session): - Value-object specs (postcode/uren/big-nummer) — closes the "domain must have a spec" gap. - src/docs/ Storybook MDX foundation pages (atomic design, tokens, FP-in-UI). - .storybook/tsconfig.json: add @angular/localize to types (Storybook was fully broken — $localize unresolved — dev + build). Verified: 168 FE tests, 68 backend tests, lint/build/check:tokens green, Storybook boots, end-to-end HTTP smoke (self-approve 403, approver 200, full flow). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
41 lines
1.2 KiB
JSON
41 lines
1.2 KiB
JSON
/* To learn more about Typescript configuration file: https://www.typescriptlang.org/docs/handbook/tsconfig-json.html. */
|
|
/* To learn more about Angular compiler options: https://angular.dev/reference/configs/angular-compiler-options. */
|
|
{
|
|
"compileOnSave": false,
|
|
"compilerOptions": {
|
|
"noImplicitOverride": true,
|
|
"noPropertyAccessFromIndexSignature": true,
|
|
"noImplicitReturns": true,
|
|
"noFallthroughCasesInSwitch": true,
|
|
"skipLibCheck": true,
|
|
"isolatedModules": true,
|
|
"experimentalDecorators": true,
|
|
"importHelpers": true,
|
|
"target": "ES2022",
|
|
"module": "preserve",
|
|
"ignoreDeprecations": "6.0",
|
|
"baseUrl": ".",
|
|
"paths": {
|
|
"@shared/*": ["src/app/shared/*"],
|
|
"@auth/*": ["src/app/auth/*"],
|
|
"@registratie/*": ["src/app/registratie/*"],
|
|
"@herregistratie/*": ["src/app/herregistratie/*"],
|
|
"@brief/*": ["src/app/brief/*"]
|
|
}
|
|
},
|
|
"angularCompilerOptions": {
|
|
"enableI18nLegacyMessageIdFormat": false,
|
|
"strictInjectionParameters": true,
|
|
"strictInputAccessModifiers": true
|
|
},
|
|
"files": [],
|
|
"references": [
|
|
{
|
|
"path": "./tsconfig.app.json"
|
|
},
|
|
{
|
|
"path": "./tsconfig.spec.json"
|
|
}
|
|
]
|
|
}
|