Three fixes to the parts of the template that contradicted its own
"illegal states unrepresentable" claim:
- tsconfig: turn on strict + strictTemplates (measured zero fallout —
the codebase already typechecked cleanly, it just wasn't enforced).
- RemoteData<T> drops its unused error type parameter (Resource.error
is always Error) and Failure now carries a real Error. Pages read the
union with @let instead of re-deriving from the resource, which
deletes the non-null assertion strictNullChecks would otherwise flag.
- users.adapter.ts never checked response.ok, so an HTTP error resolved
as a garbage Success and crashed instead of reaching RemoteData's
Failure branch. New shared/infrastructure/http.ts adds the status
check plus hand-written parse guards and abortSignal forwarding; the
six fetch stubs across the test suite (which encoded the missing
check) and adapter spec now cover the Failure and Empty paths.
Also adds real routing (@angular/router was a dependency with zero
imports and a fake "Back" button): /users and /users/:id are now
deep-linkable via withComponentInputBinding(), tested with
RouterTestingHarness driving real navigation.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Extracted from atomic-design-poc: RemoteData<E,T> (bare union + fromResource,
no combinators) + a trimmed <app-async> switch, no Elm-style store — state is
resource() plus one plain signal. Minimal DDD layering per context
(domain/infrastructure/application/ui) combined with atomic design inside
ui/ (atoms/molecules/organisms/templates/pages), mirroring the POC's
conventions at template scale.
One worked feature (users/): a list with a click-through to a detail view
(its own independent resource() fetch) and a Back action. Tests are
BDD-style (describe/it, one assertion per it) and black-box (assert
rendered DOM/emitted events only) - 100% branch/line coverage. README.md
documents what's deliberately omitted vs. the POC and the concrete growth
path back to it.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>