Bound supported compiler ranges to TypeScript 5.9 and 6, remove the obsolete Web Components suppression, and give declaration contract compilers enough time in CI.
Co-Authored-By: Paperclip <noreply@paperclip.ing>
Fold the separate `if (isStandalone === undefined)` fallback into the
declaration as `?? true` per review feedback. The `??` operand is
parenthesized because nullish coalescing cannot be mixed with `&&`
without parentheses; semantics are unchanged (false is not nullish).
Also link the Angular update guide (https://angular.dev/update-guide)
from the MIGRATION.md section, mirroring the Next.js section.
The 1.x line's peer declarations stop at Angular 20 while both peers are
optional, so yarn silently pairs it with the Angular 21 toolchain this
package now develops against. ^2.5.2 (resolves 2.6.1) is the version
@storybook/angular-vite already runs and declares devkit peers ^17..^22.
The experimentalZoneless version checks in build-storybook and
start-storybook were constant-true under the 21 floor; both now default
to true, matching the PropertyExtractor collapse. Explicit
experimentalZoneless: false in project options is still honored.
Bump @angular/* devDependencies ^19.1.1 -> ^21.2.x (devkit ^0.2102.x,
build-angular ^21.2.12, zone.js ^0.16.2), matching @storybook/angular-vite,
so the package is developed and tested against a supported Angular. The
187-test suite now exercises the same major the peers advertise.
tsconfig-paths treats a missing baseUrl as the leaf tsconfig directory, so Nx-style path maps in tsconfig.base.json fail under webpack, the indexer, and react-docgen. Pass TypeScript's pathsBasePath instead so aliases work without restoring baseUrl.
Compodoc reports a `model()` under the same bare name in both its input
and output lists, so the parser treated a name in both lists as two-way:
it dropped the output and synthesized `${name}Change`.
An `@Input('shared')` declared next to an `@Output('shared')` collides the
same way with no `model()` involved, so a real output was being deleted
and a phantom one invented. Requiring the declaration line to match too
separates the cases, since a `model()` is one property on one line.
The rule is lifted into a named function and the quirk is written up,
rather than resting on a comment that claimed the name alone was
sufficient. A collision now costs the aliased input its row instead of
its output, which the README records as a known limitation.
Compodoc reports whether an input is required, and we never read it. We
computed requiredness from the TypeScript-optional marker instead, so every
signal input rendered as required regardless of how it was declared.
Requiredness now comes from Compodoc's flag, with the optional marker still
consulted. Both are needed: Compodoc derives its flag from the presence of the
`required` key in an `@Input({...})` argument rather than its value, so
`@Input({ required: false })` reports itself as required and optional at once,
and only requiring the two to agree keeps that case right.
A `model()` signal's synthesized change output is now always optional. It used
to inherit the requiredness of the input it derives from, which disagreed with
how every real output reads.
Plain decorator inputs still read as required. Compodoc emits neither flag for
them, which is an upstream gap; when it is fixed they correct themselves.
The code that turns Compodoc's output into argTypes existed twice, once in
each of the two Angular framework packages, as byte-identical copies. Any
fix applied to one had to be remembered for the other, and in practice they
drifted. It now lives in one place both of them share.
The extracted module no longer assumes a browser. What differs between
environments is passed in rather than reached for: the Compodoc data, the
feature flag, a logger, and the helper that unwraps Compodoc's
HTML-rendered JSDoc. Each framework's preview supplies its own.
The shared package is private and compiled into both framework packages
rather than published, so nothing new appears on npm and neither package
gains a runtime dependency.
No behaviour changes. Both frameworks' existing test suites pass untouched,
and the preview still unwraps HTML with DOMParser exactly as before.
oxlint reports these directives as unused: they suppress rules that are
either not enabled in the oxlint config (type-aware rules, dropped
plugins) or implemented with different heuristics. Verified with
`oxlint --report-unused-disable-directives` reporting zero findings in
both code/ and scripts/ afterwards.