Compare commits

..

857 Commits

Author SHA1 Message Date
kirjs 8fd585cc0b release: cut the v21.0.7 release 2026-01-07 16:45:50 -05:00
Leon Senft ff531752b0 refactor(forms): remove customError()
Remove the `customError` function and `CustomValidationError` type.

These were made obsolete by support for returning plain object literals
as custom errors.

This also catches few `field` properties that were missed in the
renaming to `fieldTree`.

(cherry picked from commit 46dbd18566)
2026-01-07 15:07:35 -05:00
arturovt 5e9e09aee0 fix(router): handle errors from view transition updateCallbackDone promise
Firefox-specific workaround: Firefox 144+ creates the `updateCallbackDone` promise
internally during error handling (e.g., duplicate view-transition-name), even before
the property is accessed. This can cause unhandled promise rejections to appear in
error tracking tools like Rollbar/Sentry. We must attach catch handlers to all three
promises immediately to prevent these unhandled rejections.
See: https://bugzilla.mozilla.org/show_bug.cgi?id=1999336 (if applicable)
Spec: https://drafts.csswg.org/css-view-transitions-1/#dom-viewtransition-updatecallbackdone

(cherry picked from commit 9e043decaf)
2026-01-07 15:06:02 -05:00
Kristiyan Kostadinov fbb37d8388 refactor(core): remove unused instruction parameter
The `thisArg` in pure functions isn't used so we can drop it. We still need to keep it on the underlying implementation, because pipe instructions rely on it.

(cherry picked from commit 4dc5ae54a9)
2026-01-07 15:05:24 -05:00
SkyZeroZx c3adc5a707 docs(docs-infra): Fix combobox dialog styles for dark theme
Fixes combobox dialog styles to ensure correct text color and contrast in dark theme.
This improves readability and visual consistency when using the docs in dark mode.

(cherry picked from commit 090484c853)
2026-01-07 14:19:35 -05:00
SkyZeroZx 8eb0cd51de docs: enhance programmatic rendering guide by covering ngComponentOutlet options
(cherry picked from commit f9e9fc4ffe)
2026-01-07 14:18:37 -05:00
Shuaib Hasan Akib 0b26947802 docs: standardize component decorator placeholders in markdown
Updates `@Component({ ... })` to `@Component({/*...*/})` across
documentation examples for consistency and clearer formatting.

(cherry picked from commit d129d201c1)
2026-01-07 14:17:42 -05:00
SkyZeroZx 35fe58f7da docs(vscode-extension): update angular.io links to angular.dev in messages
(cherry picked from commit 8c8c5b24a1)
2026-01-07 14:12:19 -05:00
SkyZeroZx 8aa77557f1 docs: update angular.io links to angular.dev in comments, TSDoc, and warnings
(cherry picked from commit b2f417585a)
2026-01-07 14:12:18 -05:00
Andrew Scott 41cd4a6af8 fix(router): Fix RouterLink href not updating with queryParamsHandling
There was a bug introduced in #60875. While RouterLink doesn't
necessarily depend on Router state, its link can change when navigations
cause the `ActivatedRoute` paths to change. It is difficult to determine
which segments the link depends on. Luckily, the commit had flawed
logic:

```
!this.queryParamsHandling && !dependsOnRouterState(this.options?.defaultQueryParamsHandling);
```

The subscription gets created whenever `queryParamsHandling` was not
defined, or it was non-default. This is pretty much all scenarios since
nobody is likely to set it explicitly to the default value. In addition,
the `click` handler recomputes the tree because `urlTree` is a getter
that does the computation.

This commit effectively rolls back #60875

(cherry picked from commit bcef77d950)
2026-01-07 14:08:17 -05:00
SkyZeroZx ae1dc16bb0 fix(forms): clean up abort listener after timeout
Removes the abort event listener once the debounce timeout completes.

This avoids lingering listeners, prevents potential memory leaks, and ensures
the abort logic runs at most once.

(cherry picked from commit e7d99f02cb)
2026-01-07 14:07:28 -05:00
Kristiyan Kostadinov 63b1cdcf70 fix(compiler): produce accurate span for typeof and void expressions
Fixes that the `typeof` and `void` expressions were starting their spans from the expression start, rather than the keyword.

Fixes #66174.

(cherry picked from commit 3a56c1367f)
2026-01-07 14:04:09 -05:00
SkyZeroZx c3f3ebec8f docs: remove Component suffix from examples in DI & Drag and Drop
Updates documentation examples to remove the `Component` suffix, aligning them with the current Angular Style Guide.

(cherry picked from commit 0d6ac92ccb)
2026-01-07 13:59:20 -05:00
Angular Robot 61370dc8c8 docs: update cross-repo adev docs
Updated Angular adev cross repo docs files.
2026-01-07 13:34:27 -05:00
Kristiyan Kostadinov 7c74674eb0 fix(core): avoid leaking view data in animations
The animations code currently tracks which views have running leave animations by adding them to a `Set`. This can leak memory if we don't clean something up on time.

These changes switch to tracking the views by their ID which doesn't risk retaining the view.

Fixes #66255.

(cherry picked from commit 80b0fbba1f)
2026-01-07 12:39:04 -05:00
Matthieu Riegler 7738eb94cb docs(docs-infra): Use category for signal forms guides
(cherry picked from commit b17f93b6d1)
2026-01-07 09:35:22 -05:00
hawkgs c1e9627f6d docs(core): fix Ivy view data docs tables
The current formatting prevents the tables to be rendered making it hard to read them.

(cherry picked from commit 51ed487fae)
2026-01-07 09:22:47 -05:00
SkyZeroZx d699eef2ca docs: add docs for transform property in built-in loaders
(cherry picked from commit 3dfdb71d65)
2026-01-07 09:18:03 -05:00
Paweł Kawula 0ff2d5af2d docs: fixed incorrect link in migrating-to-vitest.md
provided correct link to section about vitest fake timer

(cherry picked from commit f811c6c69d)
2026-01-07 09:10:33 -05:00
Andrew Scott 4161161320 Revert "fix(router): Ensure createUrlTree does not reuse segments of input"
This reverts commit 39efb62c0f.

(cherry picked from commit 174d2da29a)
2026-01-07 00:29:22 +00:00
Miles Malerba e3fba182f9 feat(forms): add [formField] directive
This will replace the `[field]` directive, since `[field]` is a very
generic name for signal forms to commandeer

refactor(forms): hook up `formField` directive in compiler

Hooks up the `formField` direcive to get the same treatment as the
`field` directive in the compiler.

apply updated formatting

(cherry picked from commit 2d85ae5811)
2026-01-06 17:21:09 -05:00
Angular Robot defc9246a5 build: update cross-repo angular dependencies
See associated pull request for more information.
2026-01-06 15:19:53 -05:00
Leon Senft af1d4acb9d refactor(forms): bind native properties on interop controls
The framework will now bind all field state properties to their
corresponding native properties (if any) on interop form controls (those
using `ControlValueAccessor`), excluding those handled explicitly by
`ControlValueAccessor` such as `disabled`.

(cherry picked from commit 82a2de201f)
2026-01-06 13:12:21 -05:00
Leon Senft 0e8b9d8cde refactor(forms): bind field properties to all directives on interop controls
The framework will now bind the field state properties to all matching
directive inputs on form controls using Reactive Forms'
`ControlValueAccessor`.

(cherry picked from commit 15bddbdcda)
2026-01-06 13:12:21 -05:00
Leon Senft ff37a13913 refactor(forms): bind field properties to all directives on custom controls
The framework will now bind the field state properties to all matching
directive inputs on custom form controls.

(cherry picked from commit 0c8f15d546)
2026-01-06 13:12:21 -05:00
Leon Senft a4ba820d36 refactor(forms): bind field properties to all directives on native controls
Since the `Field` directive manages binding `FieldState` properties to
the underlying form control automatically, the type checker prohibits
explicit bindings to the same properties to avoid conflicts. This proved
problematic in cases where developers wanted to bind these properties to
the inputs of other directives on form controls. Now the framework will
bind the field state properties to all matching directive inputs on
native controls.

Fix #65617

(cherry picked from commit c149f47ef6)
2026-01-06 13:12:21 -05:00
Andrew Scott 92c162e1b9 fix(router): Ensure createUrlTree does not reuse segments of input
Mutating the `UrlTree` that is returned by `createUrlTree` can cause the
input, which might even be an active route, to be mutated. This ensures
the `UrlSegment`s are recreated and do not mutate the input.

fixes #54624

(cherry picked from commit 39efb62c0f)
2026-01-06 13:11:58 -05:00
Kristiyan Kostadinov 8e808740c9 fix(compiler): better types for a few expression AST nodes
We had `any` types for `LiteralArray.expressions`, `Chain.expressions`, `BindingPipe.args`, `LiteralPrimitive.value` and `LiteralMap.values`. These changes add proper types to them.

(cherry picked from commit 10da2f9029)
2026-01-06 12:16:32 -05:00
Alan Agius f9c29572d2 fix(core): sanitize sensitive attributes on SVG script elements
This commit updates the DOM security schema and sanitization logic to properly recognize and sanitize `href` and `xlink:href` attributes on SVG `<script>` elements.
2026-01-06 12:16:03 -05:00
Shuaib Hasan Akib 45bfd824bf docs(forms): add documentation links to Signal Forms API
Add @see JSDoc tags to Signal Forms API functions and classes to link to the essentials guide and detailed documentation pages. This improves discoverability of Signal Forms documentation from the API reference.

(cherry picked from commit b93d5ec27a)
2026-01-06 10:34:49 -05:00
Angular Robot 9d33cf3793 build: lock file maintenance
See associated pull request for more information.
2026-01-06 10:20:35 -05:00
Angular Robot 4917befe59 build: update cross-repo angular dependencies
See associated pull request for more information.
2026-01-06 10:19:00 -05:00
Matthieu Riegler a119427834 docs: rewrite testing docs
Those rewrites focus on using Vitest instead of jasmine, drop usages of `fakeAsync`, present modern testing strategy that rely on `whenStable` more than explicit calls to `detectChanges`.

fixes #42748, #48510, #64962, #65987, #66029,  #66150

(cherry picked from commit 71cde39ff0)
2026-01-05 19:38:27 -05:00
Angular Robot b16c2f59ee build: update cross-repo angular dependencies
See associated pull request for more information.
2026-01-05 19:28:19 -05:00
Shuaib Hasan Akib e21076d068 docs(forms): fix duplicate validator reference titles in AbstractControl
The removeValidators and hasValidator methods both had identical "Reference to a ValidatorFn" section titles, causing duplicate entries in the API documentation table of contents.

(cherry picked from commit 456ca35906)
2026-01-05 19:26:34 -05:00
SkyZeroZx 8f26a52aa8 refactor(core): introduce tree-shakeable runtime error codes for NgModule handling and ViewContainerRef errors
Adds new tree-shakeable runtime error codes to improve error reporting for
NgModule resolution issues (duplicate or missing IDs) and invalid ViewContainerRef
operations involving destroyed views.

(cherry picked from commit 1532be9d00)
2026-01-05 16:52:27 -05:00
Matthieu Riegler 1748c8984c docs(docs-infra): Add package filter to the API list
This commit also introduces the usage of signal forms on adev

(cherry picked from commit 15308149db)
2026-01-05 15:21:37 -05:00
Angular Robot 834bae1331 docs: update cross-repo adev docs
Updated Angular adev cross repo docs files.
2026-01-05 14:43:08 -05:00
Shuaib Hasan Akib 9494b56cc3 docs(docs-infra): sync heading colors between docs and API pages
Aligns documentation heading colors across docs and API pages to ensure
visual consistency and a cohesive reading experience.

(cherry picked from commit e6631f0007)
2026-01-05 12:37:02 -05:00
SkyZeroZx cc067c2a0d feat(docs-infra): Extracts aliases from doc entries
Implements a mechanism to extract alias names from a directive's selector.

(cherry picked from commit ed7bfb3c88)
2026-01-05 12:33:19 -05:00
SkyZeroZx 6cfbc736b4 docs: update tsDoc code examples to use TypeScript syntax highlighting
(cherry picked from commit b735c45974)
2026-01-05 12:31:47 -05:00
Angular Robot 7e9dc56186 build: lock file maintenance
See associated pull request for more information.
2026-01-05 12:21:40 -05:00
SkyZeroZx c1f22a3fa4 docs: Add form control state management and event options
(cherry picked from commit b1a0d1d8e2)
2026-01-05 12:16:14 -05:00
SkyZeroZx e65c3cabe5 docs(docs-infra): add external link styles to API reference documentation
Adds the missing icon external link styling to the API reference documentation.

(cherry picked from commit c1d72af10d)
2026-01-05 12:14:34 -05:00
SkyZeroZx 06109f5ad3 docs: add @see links to API docs for better discoverability
(cherry picked from commit fa430bffb0)
2026-01-05 12:12:28 -05:00
SkyZeroZx 5e6a9ba2af refactor(router): Simplifies unsubscribe logic
Uses optional chaining to simplify unsubscribe handling.
Also improving tree-shaking by limiting injector names to route paths using `ngDevMode`

(cherry picked from commit 712d8f41e8)
2026-01-05 12:08:14 -05:00
Angular Robot b2d6d36458 build: update cross-repo angular dependencies
See associated pull request for more information.
2026-01-05 12:07:00 -05:00
SkyZeroZx 73a3fd5bf7 docs: add section on converting writable signals to readonly
(cherry picked from commit a9283ca93a)
2026-01-05 12:03:15 -05:00
Shuaib Hasan Akib 4227a4915e docs: fix incorrect Input import in example
Update the documentation example to import input instead of Input,
ensuring the code reflects the signal-based API and current Angular
recommendations.

(cherry picked from commit bcaa001cac)
2026-01-05 12:02:20 -05:00
Shuaib Hasan Akib aac05ff1d6 fix(docs-infra): stop auto-linking "state" and "group" to APIs
Prevents common words used in code examples from being incorrectly
linked to API references.

Fixes: #66292
(cherry picked from commit 8358e548ce)
2026-01-05 12:01:55 -05:00
SkyZeroZx d75cd8ed25 docs: prevent mobile overflow in the route behavior customization example
(cherry picked from commit 5d3708e5ed)
2026-01-05 12:01:02 -05:00
Logan Mzz 6c911adf05 docs: fix reference to parent from children resolvers
(cherry picked from commit ef48826dc7)
2026-01-05 11:55:56 -05:00
Kirill Cherkashin c98549d6de docs(forms): update migration guide (#66111)
PR Close #66111
2026-01-05 11:54:45 -05:00
kirjs 22399296f0 docs(forms): Address feedback (#66111)
Update `Automatic status class` section

PR Close #66111
2026-01-05 11:54:45 -05:00
kirjs 958d7f7909 docs(forms): Address feedback (#66111)
Update the Automatic status classes section to make NG_STATUS_CLASSES go first.

PR Close #66111
2026-01-05 11:54:45 -05:00
kirjs 6ee4834d35 docs(forms): Address feedback (#66111)
Change wording and formatting and clean up.

PR Close #66111
2026-01-05 11:54:45 -05:00
kirjs cf57c01ca6 docs(forms): Add a section for automatic form binding (#66111)
To avoid manually adding classes like `.ng-valid`, `.ng-dirty` etc to every field, you can provide a global configuration using `provideSignalFormsConfig`.

PR Close #66111
2026-01-05 11:54:45 -05:00
kirjs b0a4ecc50e docs(forms): add a Accessing values section (#66111)
This explains how to get the value of a compat form

PR Close #66111
2026-01-05 11:54:45 -05:00
kirjs 65a2a0da8f docs(forms): add migration guide for Signal Forms (#66111)
This commit introduces a new guide for migrating from legacy forms (Reactive and Template-driven) to the new Signal Forms.

PR Close #66111
2026-01-05 11:54:45 -05:00
SkyZeroZx caeea1ced9 docs(docs-infra): Fixes the visibility of the copy link button in CLI headings
Fixes the visibility of the copy link button in CLI documentation headings.

(cherry picked from commit a5ebdd9cd1)
2026-01-05 11:52:27 -05:00
Matthieu Riegler 70a4739113 docs: fix typos in Effects doc in Signals guide
(cherry picked from commit c225b03c91)
2026-01-05 11:51:04 -05:00
Matthieu Riegler d669763a31 docs(docs-infra): Modernize tests
Remove usages of `detectChanges` and rely on `whenStable`.
This commit also removed the usage of `provideZonelessChangeDetection` which is no longer necessary.

(cherry picked from commit 3a85031dc0)
2026-01-05 11:47:12 -05:00
Angular Robot 71a4373fbb build: update cross-repo angular dependencies
See associated pull request for more information.
2026-01-02 14:24:47 +01:00
Kristiyan Kostadinov f8b6a3fed1 Revert "refactor(core): Add ngDevMode guards and new sanitization error codes"
This reverts commit 4e7e38c591.

(cherry picked from commit 1765ebe79b)
2026-01-02 11:37:26 +01:00
Angular Robot d370c4ba44 build: update bazel dependencies
See associated pull request for more information.
2026-01-02 08:32:09 +01:00
Angular Robot 5725509e88 build: update pnpm to v10.27.0
See associated pull request for more information.
2026-01-02 08:30:14 +01:00
Kristiyan Kostadinov b4fc0dace5 test(compiler): switch compliance tests to es2022
Sets up the compliance tests to target es2022 since that's the default in the CLI. Also updates all of the tests, primarily because the generated output for static properties has changed.

(cherry picked from commit 41eacff363)
2026-01-02 08:29:16 +01:00
Shuaib Hasan Akib efaf84a168 docs: Incorrect Highlighting in Content Queries Example
Fixes: #66284
(cherry picked from commit 75fa37a0dd)
2026-01-02 08:28:48 +01:00
Shuaib Hasan Akib c0cdec5cee docs: fix incorrect FormArray example link
Update the typed forms guide link to point to the correct
FormArray section instead of the FormControl getting started example.

(cherry picked from commit e3781cd88a)
2026-01-02 08:28:21 +01:00
Kristiyan Kostadinov cd405685af fix(compiler-cli): fix up spelling of diagnostic
Fixes the spelling for the `component is missing a template` diagnostic and expands it a bit.

(cherry picked from commit 3a26244d61)
2026-01-02 08:27:30 +01:00
Adam Podroužek 263e7290bd docs: fix URL link to valibot
(cherry picked from commit 402ecaf85c)
2026-01-02 08:27:07 +01:00
aparziale 09ba268fc5 docs(docs-infra): LoadComponent along with loadChildren
Added example with loadComponent along with loadChildren

Fix #66257

(cherry picked from commit b54bc1b16e)
2026-01-02 08:26:34 +01:00
kirjs 6bd22df987 fix(forms): Support readonly arrays in signal forms
This would allow using `readonly Array<...>` in types

(cherry picked from commit 282220d032)
2026-01-02 08:26:09 +01:00
SkyZeroZx 86374b2c0e docs: use currentNavigation instead of deprecated getCurrentNavigation
(cherry picked from commit 004813dc37)
2026-01-02 08:25:47 +01:00
SkyZeroZx a45141383f docs(docs-infra): fixes copy-to-clipboard icon moves to a new line for long heading text
Fixes an issue where the copy-to-clipboard icon moves to a new line when heading text is long and wraps.
Applies improved text wrapping for headings to keep the icon visually aligned.

Fixes #66239

(cherry picked from commit e409757208)
2026-01-02 08:24:43 +01:00
SkyZeroZx 9babb85fed docs: update next steps in Signal Forms tutorial and fix broken link
(cherry picked from commit baa19e2cf0)
2026-01-02 08:23:47 +01:00
SkyZeroZx 4789653db0 docs(docs-infra): apply OnPush change detection and remove redundant root provider
Adds OnPush change detection and removes a redundant `providedIn: 'root'` injection token.

(cherry picked from commit 3b73eff0b4)
2026-01-02 08:23:23 +01:00
Matthieu Riegler 7cc2a7669f docs(docs-infra): user-select none for buttons
fixes #66214

(cherry picked from commit 80eb5c4d8a)
2026-01-02 08:22:20 +01:00
Kristiyan Kostadinov 523dbaf1c3 fix(compiler): stop ThisReceiver inheritance from ImplicitReceiver
Back in #39323, I added a new `ThisReceiver` node to represent accesses done through `this` and I ended up making it inherit from `ImplicitReceiver`. The logic was that in most cases accessing through `this` was the same as the implicit access.

Over the years this has proven to not be a great idea, because no other AST nodes do this and one has to keep it in mind whenever dealing with `ImplicitReceiver`.

These changes remove the inheritance and update all of the usage sites accordingly.

(cherry picked from commit fa7cb4b87a)
2026-01-02 08:21:53 +01:00
JoostK 778460fcca fix(compiler-cli): support qualified names in typeof type references
This commit expands the static interpreter to now understand qualified names in `typeof`
type queries.

Fixes #65686

(cherry picked from commit f12e160bc1)
2026-01-02 08:21:12 +01:00
JoostK 4d9c4567ed fix(compiler-cli): ensure component import diagnostics are reported within the imports expression
PR #60455 improved error reporting for `@Component.imports` by scoping the diagnostic to an individual
element within the `imports` array, but this may introduce hard to track diagnostics when it ends
up being reported (far) away from the component itself.

This can be even more problematic when the diagnostic would end up being reported in a declaration file,
as happened in issue #65686; the declaration files of an imported library contained syntax that the
static interpreter did not support, hence the `@Component.imports` was rejected with a diagnostic reported
in the library's declaration file. This diagnostic isn't guaranteed to be reported (e.g. the CLI only
gathers Angular-specific diagnostics for Angular-compiled files, which excludes declaration files).

This commit changes the diagnostic location to ensure it is being reported within the `@Component.imports`
expression, in most cases retaining the desirable effect of #60455 while avoiding out-of-band diagnostics.

(cherry picked from commit 106ba63650)
2026-01-02 08:21:12 +01:00
SkyZeroZx aa3b028e25 refactor(core): implement missing OnDestroy for schedulers
Implements the missing OnDestroy interface. Also removes an unused generic from a performance logging function.

(cherry picked from commit 02e80b4ea2)
2026-01-02 08:20:00 +01:00
aparziale 514abbfc82 docs(docs-infra): Fix incorrect code highlight in Creating an output based on an RxJS Observable
Fix highlighted line in output-interop.md documentation

Fixes: #66187
(cherry picked from commit 66637f1c3f)
2026-01-02 08:18:35 +01:00
Kristiyan Kostadinov 3c3ae0cb64 fix(compiler): provide location information for literal map keys
Adds spans for the keys of a `LiteralMap`.

Fixes #66175.

(cherry picked from commit 76fa180005)
2026-01-02 08:18:06 +01:00
SkyZeroZx b37f46b652 refactor(forms): add MANAGED_METADATA_LAZY_CREATION runtime error
Add the `MANAGED_METADATA_LAZY_CREATION` `RuntimeError`  in signal form,
making it tree-shakeable.

(cherry picked from commit 398078f456)
2026-01-02 08:17:43 +01:00
Alan Agius 31a2ac2a22 build: switch Node.js toolchain to derive version from .nvmrc.
Remove hardcoded node.js version

(cherry picked from commit 0d9e51e766)
2026-01-02 08:16:55 +01:00
SkyZeroZx 71998069bd docs: update localization docs and modernize examples
Improves the localization documentation by updating code highlight syntax issues
and removing outdated TODOs.

Additionally, the CDK examples have been updated to use the viewChild query signal API,
aligning the docs with current recommended patterns.

(cherry picked from commit a7762c79b8)
2026-01-02 08:16:28 +01:00
Matthieu Riegler f173acab69 ci: add Charles & Doug as optional adev reviewers
Since we also have tooling docs...

(cherry picked from commit c69b67147a)
2026-01-02 08:14:41 +01:00
Alan Agius 349b54351a docs: update flattened type definitions description to include rollup-plugin-dts.
(cherry picked from commit e11f02af81)
2026-01-02 08:14:09 +01:00
Shuaib Hasan Akib b9d7455d9c refactor(core): mark VERSION exports as pure for better tree-shaking
Adds a PURE annotation to VERSION constants, enabling tree-shaking
and keeping the implementation consistent with other pure exports.

(cherry picked from commit abb179466d)
2026-01-02 08:13:44 +01:00
Shuaib Hasan Akib d4799c1e82 docs: update Angular Package Format version references to latest
(cherry picked from commit 54a49ad9eb)
2026-01-02 08:12:50 +01:00
Alan Agius 901d66dbb7 build: correct markdown link syntax for commit hashes in changelog generation
The links were generated incorrectly

(cherry picked from commit 98bfd139ee)
2026-01-02 08:11:51 +01:00
SkyZeroZx 0aa5c7b815 refactor(core): remove unused Injector and Renderer2 dependencies from hydration functions
Removes the unsued `Injector` & `Renderer2` dependency from the hydration annotation process.

(cherry picked from commit 93fe833088)
2026-01-02 08:11:19 +01:00
SkyZeroZx 269799979f docs(docs-infra): adjust z-index to prevent adev tutorial nav overlapping sidebar
Updated the z-index hierarchy to avoid the adev tutorial navigation bar
overlapping the main sidebar.

(cherry picked from commit 59c1dcc662)
2026-01-02 08:10:57 +01:00
Leon Senft 85621f11e1 test(forms): add test coverage for binding errors to custon controls
This input was missing dedicated test coverage.

(cherry picked from commit e7745dc9dd)
2026-01-02 08:09:39 +01:00
Leon Senft 6d167bd64c test(forms): remove duplicate test case
We had two test cases that tested the `Field` directive synchronizes
with a custom checkbox control components.

(cherry picked from commit 8832fc01b2)
2026-01-02 08:09:39 +01:00
Leon Senft ec110f170b fix(forms): allow custom controls to require pending input
* Allow custom controls to make `pending` a required input
* Refactor test for `pending` input to be consistent with other control
  properties
* Test that `pending` inputs are reset when the field binding changes

(cherry picked from commit 1a4c3eb1d0)
2026-01-02 08:09:39 +01:00
Leon Senft 79d16919a5 test(forms): remove obsolete test case
There's no longer a need to test that inputs are set before
initialization on custom controls now that required inputs are
supported.

(cherry picked from commit 9ad603fa11)
2026-01-02 08:09:39 +01:00
Leon Senft 8c83266816 test(forms): refactor and improve test coverage for disabledReasons input
* Refactor test for `disabledReasons` input to be consistent with other control
  properties
* Test that `disabledReasons` inputs are reset when the field binding changes

(cherry picked from commit 4f73a350a5)
2026-01-02 08:09:39 +01:00
Leon Senft 561772b152 fix(forms): allow custom controls to require dirty input
* Allow custom controls to make `dirty` a required input
* Refactor test for `dirty` input to be consistent with other control
  properties
* Test that `dirty` inputs are reset when the field binding changes

(cherry picked from commit 89c37f1f7f)
2026-01-02 08:09:39 +01:00
Leon Senft 929306e658 test(forms): refactor and improve test coverage for invalid input
* Refactor test for `invalid` input to be consistent with other control
  properties
* Test that `invalid` inputs are reset when the field binding changes

(cherry picked from commit b563b5cfc2)
2026-01-02 08:09:39 +01:00
Leon Senft f0fb1d8581 fix(forms): allow custom controls to require hidden input
* Allow custom controls to make `hidden` a required input
* Refactor test for `hidden` input to be consistent with other control
  properties
* Test that `hidden` inputs are reset when the field binding changes

(cherry picked from commit 82edf18427)
2026-01-02 08:09:38 +01:00
Leon Senft 9748b0d5da fix(forms): support custom controls with non signal-based models
* Recognize directives with non signal-based models as valid custom controls
* Relax type checker to allow non signal-based models

The `FormValueControl` and `FormCheckboxControl` interfaces still
require a `model()`-input, however, a custom control need not implement
either interface to be bound by the `Field` directive.

All of the following examples can be used to define a custom control:

```ts
// Preferred: model()
class MyFormControl implements FormValueControl<string> {
  readonly value: model.required<string>();
}

// Supported: input() + output()
class MyFormControl {
  readonly value: input.required<string>();
  readonly valueChange: output<string>();
}

// Supported: @Input() + @Output()
class MyFormControl {
  @Input({required: true}) value!: string;
  @Output() valueChange: new EventEmitter<string>();
}
```

The latter two may still choose to implement `FormUiControl` for other
properties, but again it is not required.

Fix #65478

(cherry picked from commit cb09fb8308)
2026-01-02 08:09:07 +01:00
Leon Senft ab86c90c20 refactor(forms): always bind [field] to ControlValueAccessor if present
Change the order of precedence that `[field]` binds to from

  1. Custom control (`FormValueControl`, `FormCheckboxControl`)
  2. Interop control (`ControlValueAccessor`)
  3. Native control (`<input>`, `<select>`, `<textarea>`)

to

  1. Interop control (`ControlValueAccessor`)
  2. Custom control (`FormValueControl`, `FormCheckboxControl`)
  3. Native control (`<input>`, `<select>`, `<textarea>`)

This ensures that Reactive Forms controls authored to use
`ControlValueAccessor` work correctly with Signal Forms, even if they
happen to conform to the `FormValueControl` interface.

(cherry picked from commit 817e2b87a8)
2026-01-02 08:09:06 +01:00
SkyZeroZx ce7b1ab3b6 refactor(core): Add ngDevMode guards and new sanitization error codes
Adds new runtime sanitization error codes. Adds `ngDevMode` guards around
error message strings to ensure detailed diagnostics are included only
in development mode. This allows production builds to tree-shake verbose error descriptions, reducing bundle size.

(cherry picked from commit 4e7e38c591)
2026-01-02 08:08:25 +01:00
Angular Robot 069974a519 build: update dependency @angular/aria to v21.0.4
See associated pull request for more information.
2025-12-17 16:57:02 -08:00
Miles Malerba 59b3790031 refactor(forms): rename server errors to submission errors
This better reflects the intent to indicate an error during submission,
regardless of whether the error came from the server or not.

(cherry picked from commit 244b54c9bf)
2025-12-17 15:42:11 -08:00
Angular Robot 96dccc4e6f docs: update cross-repo adev docs
Updated Angular adev cross repo docs files.
2025-12-17 15:40:54 -08:00
Andrew Seguin 0edbee4550 fix(core): explicitly cast signal node value to String
If the computed's `toString` is called and `node.value` is a Symbol, the browser will throw an exception `ERROR TypeError: Cannot convert a Symbol value to a string`

Symbols cannot be implicitly changed to strings. This change changes the conversion to be explicit by wrapping `node.value` with `String()`

This can be reproduced if you create a computed with `createComputed(computation, equal)` and call `toString()` while `node.value` is something like `Symbol(UNSET)`

(cherry picked from commit e2a9938c51)
2025-12-17 14:38:41 -08:00
Angular Robot a8127273a6 build: update cross-repo angular dependencies
See associated pull request for more information.
2025-12-17 14:35:48 -08:00
Shuaib Hasan Akib 441d158302 docs(docs-infra): clean up TODO comment, unused imports, and helper function
(cherry picked from commit e9d1c6478a)
2025-12-17 14:34:02 -08:00
Shuaib Hasan Akib c8d14d75ba docs: fix incorrect line highlighting in tutorials
Ensures highlighted lines in tutorial examples match the
corresponding code shown to readers.

(cherry picked from commit ad88c72f24)
2025-12-17 14:26:34 -08:00
Miles Malerba ae0d707d44 docs: call out breaking changes as experimental
Explicitly calls out that recent breaking changes were only for
experimental features

(cherry picked from commit 5b06996fb2)
2025-12-17 14:25:36 -08:00
Andrew Scott eaa68c4cd7 release: bump VSCode extension version to 21.0.1 (#66153) 2025-12-17 13:51:34 -08:00
Andrew Kushnir 85317f405a release: cut the v21.0.6 release 2025-12-17 13:12:23 -08:00
Alan Agius 8d7bcbc881 build: migrate Bazel ignore rules from .bazelignore to REPO.bazel
See: https://bazel.build/rules/lib/globals/repo and https://github.com/aspect-build/rules_js/blob/092dd7892b816f899c7ab5b794fdb6236abb6939/docs/pnpm.md?plain=1#L77
2025-12-17 10:14:32 -08:00
Andrew Scott 5047be4bc1 fix(language-service): Prevent language service from crashing on suggestion diagnostic errors
This prevents the language service from crashing when a
`FatalDiagnosticError` is thrown when retrieving suggestion diagnostics.

fixes #66069

(cherry picked from commit ce1a4769f9)
2025-12-17 10:13:15 -08:00
Angular Robot a27bdd3327 build: update bazel dependencies
See associated pull request for more information.
2025-12-17 10:00:39 -08:00
Angular Robot 2bb5bb47e0 build: update all github actions
See associated pull request for more information.
2025-12-17 09:59:09 -08:00
Shuaib Hasan Akib 3b3b982fa3 docs: add documentation for schema validation with Signal Forms
Fixes: #66098
(cherry picked from commit 3e57f9eaf5)
2025-12-17 09:52:50 -08:00
SkyZeroZx 14b529e5ce docs: align lightweight injection tokens with the style guide
(cherry picked from commit 50d5c2997f)
2025-12-17 09:45:18 -08:00
Matthieu Riegler dd38869b46 docs(docs-infra): leverage the search on 404
This introduces a search result matching the requested url when the page couldn't not be found.

(cherry picked from commit d23ce76821)
2025-12-17 09:40:47 -08:00
kirjs 4d966c99e3 refactor(forms): convert Signal Forms errors to use RuntimeError
- Added 13 new error codes to forms/src/errors.ts (1900-1999)
- use RuntimeError

(cherry picked from commit 6f6b2408fa)
2025-12-17 09:40:01 -08:00
SkyZeroZx e0694df3ec fix(language-service): avoid interpolation highlighting inside @let
This change omits treating `{{ }}` interpolation syntax as valid inside `@let` binding strings, preventing the interpolation curly braces from superseding the match of the surrounding binding expression and ensuring the highlighter reflects the correct semantics of `@let` bindings.

fixes #61643

(cherry picked from commit 9f5744a92d)
2025-12-17 09:39:23 -08:00
Alan Agius 48492524ea fix(core): use mutable ResponseInit type for RESPONSE_INIT token
The `RESPONSE_INIT` token previously used `ResponseInit`. However, `@types/node` (and `undici`) definitions for `ResponseInit` mark properties as `readonly`, which differs from the standard DOM `ResponseInit`.

This commit introduces a `ResponseInit` type that explicitly removes `readonly` modifiers to ensure compatibility and allow for mutable options. This type is now used by the `RESPONSE_INIT` token and is exported from `@angular/core`.

(cherry picked from commit f516370c8e)
2025-12-17 09:35:27 -08:00
Andrew Kushnir a4d2de8179 Revert "fix(core): explicitly cast signal node value to String"
This reverts commit c501b25d04.

(cherry picked from commit 9fa77af110)
2025-12-16 17:37:38 -08:00
Andrew Seguin 0eb623c05a fix(core): explicitly cast signal node value to String
If the computed's `toString` is called and `node.value` is a Symbol, the browser will throw an exception `ERROR TypeError: Cannot convert a Symbol value to a string`

Symbols cannot be implicitly changed to strings. This change changes the conversion to be explicit by wrapping `node.value` with `String()`

This can be reproduced if you create a computed with `createComputed(computation, equal)` and call `toString()` while `node.value` is something like `Symbol(UNSET)`

(cherry picked from commit c501b25d04)
2025-12-16 16:38:07 -08:00
SkyZeroZx dc0aae9a59 docs: add section about reactive contexts
(cherry picked from commit 62ccd64e9f)
2025-12-16 16:35:28 -08:00
Marc Stammerjohann 0e59ac795c docs(router): add missing inject import
(cherry picked from commit dc7ae9aef3)
2025-12-16 16:34:23 -08:00
Matthieu Riegler feed89e83c ci: reformat files
This is after we've slightly changed a rule in #66056

(cherry picked from commit 6270bba056)
2025-12-16 14:44:25 -08:00
Miles Malerba 729b96476b refactor(forms): rename field to fieldTree in FieldContext and ValidationError
BREAKING CHANGE:

(cherry picked from commit ae0c59028a)
2025-12-16 10:26:26 -08:00
SkyZeroZx 8d92f05105 refactor(platform-browser): remove unused platformIsServer flag from renderer
The` platformIsServer` flag is no longer referenced by the renderer and is effectively unused.
Removing it simplifies the implementation and avoids carrying redundant state.

(cherry picked from commit 2ccdf50fba)
2025-12-16 10:25:14 -08:00
SkyZeroZx 0a5fd6b6d4 refactor(core): conditionally include debug names based on ngDevMode
Conditionally include debug-related metadata based on `ngDevMode` to avoid
unnecessary information in production builds.

(cherry picked from commit bf2e50843d)
2025-12-16 09:37:42 -08:00
Angular Robot 7846bccdfc build: lock file maintenance
See associated pull request for more information.
2025-12-16 09:36:56 -08:00
Angular Robot b92ffccf43 build: update cross-repo angular dependencies
See associated pull request for more information.
2025-12-16 09:34:00 -08:00
Ben Hong 61a46487f1 docs: update links to guides in signal forms overview
(cherry picked from commit 3750622c46)
2025-12-16 09:29:15 -08:00
SkyZeroZx 561d300302 docs: update lightweight injection tokens guide to use contentChild, contentChildren, and inject APIs.
(cherry picked from commit 53c447e3c8)
2025-12-16 09:28:27 -08:00
Matthieu Riegler df5ba9e2bd ci: reformat files
This is after we've slightly changed a rule in #66056
2025-12-16 09:25:37 -08:00
Shuaib Hasan Akib c250bd01fe refactor(docs-infra): remove deprecated h.JSX.HTMLAttributes usage
Import HTMLAttributes directly from preact to address deprecation warning in header-api.tsx

(cherry picked from commit 3ff20a58d3)
2025-12-15 17:44:27 -08:00
Angular Robot ca167b9f57 build: update cross-repo angular dependencies
See associated pull request for more information.
2025-12-15 14:22:55 -08:00
Alan Agius 31b909040a refactor(compiler): remove unnecessary sanitization for safe attributes
Remove sanitization for attributes that cannot execute code (e.g. `javascript: URIs`).

(cherry picked from commit d4111eebc6)
2025-12-15 14:13:42 -08:00
Kirill Cherkashin 5afb1eb600 docs(forms): improve JSDoc for Signal Forms Schema types
Improved documentation for Schema, SchemaFn, and SchemaOrSchemaFn types
with clearer descriptions and usage examples.

(cherry picked from commit 193aa332fc)
2025-12-15 14:02:39 -08:00
Angular Robot 0905eb63b5 docs: update cross-repo adev docs
Updated Angular adev cross repo docs files.
2025-12-15 13:28:07 -08:00
Matthieu Riegler 3151c05e04 refactor(forms): add signal forms to the type tests
This will ensure that signal forms emit valid typings.
Also this commits moves `@standard-schema/spec` from peer-dep to regular dep

(cherry picked from commit 44d4439bc4)
2025-12-15 11:44:58 -08:00
kirjs 45e967b295 refactor(forms): convert Signal Forms errors to use RuntimeError
- Added 13 new error codes to forms/src/errors.ts (1900-1999)
- use RuntimeError

(cherry picked from commit 3a01d72850)
2025-12-15 11:44:06 -08:00
Angular Robot e08350dfdd build: update dependency bazel to v8.5.0
See associated pull request for more information.

Closes #66067 as a pr takeover

(cherry picked from commit aabf719a6d)
2025-12-15 11:41:47 -08:00
Alan Agius 5148523bec build: remove API doc generation for localize/init and add mnemonic to API rendering rule.
The removed target was not used and was generating an empty output which causes `java.io.IOException: mandatory output packages/localize/init/localize_docs_html was not created`

(cherry picked from commit 2a5c6919d0)
2025-12-15 11:41:47 -08:00
Andrew Scott def3c6636e docs: update link to releases for vscode extension
(cherry picked from commit a1eb2cef16)
2025-12-15 11:41:18 -08:00
Shuaib Hasan Akib 0dd5417352 docs: format CLI builder JSON examples using fenced blocks
Replaces custom docs-code components with fenced ```json``` blocks for
CLI builder examples, improving readability, consistency, and copy
support across the documentation.

Fixes #66060

(cherry picked from commit a2aa8fef05)
2025-12-15 11:35:01 -08:00
aparziale 01a6426ce3 docs(docs-infra): Fix broken link
Fix broken link side effects

Fix #66051

(cherry picked from commit a29a3988d6)
2025-12-15 11:34:00 -08:00
SkyZeroZx 3c417c7e56 docs: update code block syntax highlighting in documentation & fixed identation
(cherry picked from commit b043c7490f)
2025-12-15 11:33:34 -08:00
SkyZeroZx 15fd24d506 docs: replace @debugging tag with proper Markdown syntax
(cherry picked from commit 23fbe5cf9f)
2025-12-15 10:01:03 -08:00
Axel Jäger 23b2ca880a docs(forms): include update() in example for updating form value
(cherry picked from commit a1f5f52880)
2025-12-15 10:00:32 -08:00
Angular Robot 467a8aec63 build: update all github actions
See associated pull request for more information.
2025-12-15 09:59:39 -08:00
Matthieu Riegler 3267b98eb7 ci: enable embeddedLanguageFormatting for prettier
This allows to format inline templates

(cherry picked from commit f530b777b9)
2025-12-15 09:54:51 -08:00
SkyZeroZx 69b089a6c9 docs: Adds documentation for the NG0919 error
Adds a new documentation page for the NG0919 error, which indicates a circular dependency in Angular applications.

fixes  #65968

(cherry picked from commit bb65520991)
2025-12-15 09:52:20 -08:00
Joey Perrott 8d387658e1 ci: update google sync configuration to not include package.json
We don't use the package.json files within google3 and they don't need to be marked for sync

(cherry picked from commit 5f01f121df)
2025-12-15 09:51:23 -08:00
Matthieu Riegler fe59d9abbc ci: fix deployement of previews
By pulling the fix angular/dev-infra/pull/3301

patch backport of #65971
2025-12-15 09:45:37 -08:00
Andrew Kushnir 534b1b507d Revert "refactor(compiler): remove unnecessary sanitization for safe attributes"
This reverts commit 128aef0ede.

(cherry picked from commit 8243bb3064)
2025-12-12 12:59:50 -08:00
Angular Robot 88e1829496 build: update cross-repo angular dependencies
See associated pull request for more information.
2025-12-12 11:41:17 -08:00
Matthieu Riegler 8cabd67faf docs: update guidelines.md to match best-practices.md
fixes #65953

(cherry picked from commit be5dbf45ba)
2025-12-12 10:10:37 -08:00
Angular Robot d6b02a788b docs: update cross-repo adev docs
Updated Angular adev cross repo docs files.
2025-12-12 10:06:13 -08:00
Angular Robot 27bb376641 build: update cross-repo angular dependencies
See associated pull request for more information.
2025-12-12 09:54:50 -08:00
Miles Malerba 81772b420d feat(forms): pass field directive to class config
Updates signal forms to pass the full `Field` directive to the class
configuration functions, rather than just the state. This allows
developers to take the element as well as the state into consideration
when deciding classes to apply.

Closes #65762

BREAKING CHANGE: The shape of `SignalFormsConfig.classes` has changed

Previously each function in the `classes` map took a `FieldState`. Now
it takes a `Field` directive.

For example if you previously had:
```
provideSignalFormsConfig({
  classes: {
    'my-valid': (state) => state.valid()
  }
})
```

You would need to update to:
```
provideSignalFormsConfig({
  classes: {
    'my-valid': ({state}) => state().valid()
  }
})
```

(cherry picked from commit 348f149e8b)
2025-12-12 08:07:57 -08:00
Kristiyan Kostadinov 4c8fb3631d fix(core): throw better errors for potential circular references
Currently circular references in user code manifest themselves with an error like `Cannot read properties of undefined (reading 'ɵcmp')`. This is a bit cryptic so these changes add an assertion mentioning circular references.

Relates to #65917.

(cherry picked from commit 7be4ddef1c)
2025-12-12 08:06:30 -08:00
Alan Agius b8cb6cda30 refactor(compiler): remove unnecessary sanitization for safe attributes
Remove sanitization for attributes that cannot execute code (e.g. `javascript: URIs`).

(cherry picked from commit 128aef0ede)
2025-12-12 08:06:03 -08:00
SkyZeroZx 6d9d2b83f6 refactor(common): remove redundant providedIn: 'root' from injection tokens
Removes unnecessary declarations from injection tokens

(cherry picked from commit 8485579649)
2025-12-12 08:05:34 -08:00
Angular Robot 0b90940461 build: update bazel dependencies
See associated pull request for more information.
2025-12-12 08:04:05 -08:00
Angular Robot a507029666 docs: update cross-repo adev docs
Updated Angular adev cross repo docs files.
2025-12-12 08:01:08 -08:00
Angular Robot 87d20fd3ff build: update cross-repo angular dependencies
See associated pull request for more information.
2025-12-11 17:18:42 -08:00
Shuaib Hasan Akib 4d3b2bff88 docs: simplify example headers by showing only the file name
Removed redundant `src/app/` prefixes from <docs-code> headers to make
examples cleaner and easier to read. The full path remains available via
the `path` attribute, so the shortened headers improve clarity without
losing context.

(cherry picked from commit 63538524bc)
2025-12-11 17:17:09 -08:00
Andrew Xue 25f800712f docs(docs-infra): add primary color vars for tutorial button
(cherry picked from commit ff68806c67)
2025-12-11 17:11:31 -08:00
Leon Senft 8906814750 docs(forms): fix broken example
As written, the example rewrote the input value as the user edited it,
causing all kinds of confusing behavior which rendered the input nearly
unusable. While such implementations are possible, they require great
care to manage the cursor position while editing. For the sake of
brevity, this example now only updates the model on `blur` events; once
the user is done editing.

(cherry picked from commit f0ad30cce6)
2025-12-11 17:10:55 -08:00
SkyZeroZx 4781696edd docs: fixed tutorial steps with identation formatting
(cherry picked from commit c4e7ac1b81)
2025-12-11 17:10:18 -08:00
Angular Robot 25921f8c3c build: update all github actions
See associated pull request for more information.
2025-12-11 17:09:25 -08:00
SkyZeroZx 8ad00bc31a docs(docs-infra): Fix prefer/avoid rule matching with word boundaries
Improve code block rule detection by adding word-boundary anchors.
Also update indentation for consistency.

(cherry picked from commit a8fac4ce3b)
2025-12-11 17:08:54 -08:00
SkyZeroZx 3d25759117 docs(language-service): add link to hydration guide in built-in names documentation
Adds link to hydration guide for `hydrate` keyword

(cherry picked from commit ef45637ca8)
2025-12-11 17:06:39 -08:00
Charles 4c8564e2ce docs: overhaul unit testing overview guide
This commit introduces a series of improvements to the unit testing overview guide to enhance clarity, organization, and accuracy.

(cherry picked from commit 97c7025d7d)
2025-12-11 17:06:03 -08:00
Miles Malerba eedcbbda4f docs(forms): add guide on designing form models
Adds a new guide on designing form model for signal forms

(cherry picked from commit fba0c88c9e)
2025-12-11 17:04:15 -08:00
Alex Rickabaugh 5a214653a8 release: cut the v21.0.5 release 2025-12-11 15:41:58 -08:00
Miles Malerba 4fd2b722b4 fix(forms): fix signal forms type error
Removes the `implements` clause on the `Field` directive since it is
causing type errors for people.

(cherry picked from commit d0097f7d0c)
2025-12-11 15:33:17 -08:00
SkyZeroZx 69d243abb7 fix(core): avoid false-positive deprecation when using InjectionToken with factory only
Prevents the deprecation warning that was incorrectly triggered when
defining an InjectionToken with only a `factory`, which correctly
defaults to the `root` scope.

(cherry picked from commit 4f6014a756)
2025-12-11 11:20:17 -08:00
Alex Rickabaugh fa4e6e6763 release: cut the v21.0.4 release 2025-12-10 16:49:04 -08:00
Angular Robot c937da491c build: update cross-repo angular dependencies
See associated pull request for more information.
2025-12-10 16:42:43 -08:00
jnizet 67a5a65a24 docs: fix typos and clarify root effect
(cherry picked from commit c63ef9cb6a)
2025-12-10 12:41:04 -08:00
Chathulanka Gamage 8a31eb8fb8 docs: update control-flow.md to replace else-if with else if
fix incorrect hyphenated form "else-if" and update documentation to match correct syntax "else if"

(cherry picked from commit 7674ada620)
2025-12-10 12:39:25 -08:00
Angular Robot fe581f38fd build: update pnpm to v10.25.0
See associated pull request for more information.
2025-12-10 12:36:08 -08:00
Michael Small de6dc043fb docs: add 'new' to page 'Side effects for non-reactive APIs'
(cherry picked from commit 3ab17876ba)
2025-12-10 12:27:30 -08:00
Matthieu Riegler f20d301bdc refactor: spread rules with glob syntax
prettierignore does not support the glob syntax for multiple extensions.

(cherry picked from commit c429e701fc)
2025-12-10 12:26:57 -08:00
Matthieu Riegler 42c89f1c98 docs: add the version of angular being used to the footer
Include the version of angular being used for the build in the footer of the application

This is a backport of #64863
2025-12-10 12:24:50 -08:00
SkyZeroZx 6930a2e8c8 docs: update forwardRef usage with signals and add HostListener note
(cherry picked from commit bff2dcb93c)
2025-12-10 12:23:33 -08:00
Angular Robot 68a98118d2 build: lock file maintenance
See associated pull request for more information.
2025-12-10 12:22:25 -08:00
Andrew Scott 497c0e36ab refactor(core): Add transition.to property to FakeNavigation
This matches the upstream changes in https://github.com/whatwg/html/commit/f19930f98afeb7565cfc1cbc6a1d4a2086535bca

(cherry picked from commit 5988bdedae)
2025-12-10 10:18:13 -08:00
diegoinost02 7fde186157 docs(forms): document array item validation in Signal Forms
(cherry picked from commit 9dd08c571a)
2025-12-10 10:17:33 -08:00
diegoinost02 8c8bd3e856 docs(forms): add signal forms documentation for validating array items
(cherry picked from commit e6865af8f1)
2025-12-10 10:17:33 -08:00
SkyZeroZx 49fca78f27 docs(docs-infra): Fixes the visibility of the copy link button in API documentation headings
Fixes the visibility of the copy link button in API documentation headings.
The button now appears on hover, improving the user experience.

(cherry picked from commit 15e3407dab)
2025-12-10 10:16:04 -08:00
Shuaib Hasan Akib 2dd971b73e docs: hide menu icons from screen readers in aria example
Add aria-hidden="true" to decorative icon elements in the ARIA menu documentation
example to prevent screen readers from announcing both icon names and labels.
This improves the accessibility experience by ensuring only meaningful text
is announced to screen reader users.

Fixes: #65768
(cherry picked from commit 1c6049584e)
2025-12-10 10:09:41 -08:00
Matthieu Riegler cbb10179c8 fix(forms): allow resetting with empty string
Both empty string and null values should be accepted when resetting

fixes #65949

(cherry picked from commit 14713d0992)
2025-12-10 10:04:58 -08:00
Shuaib Hasan Akib 834593b9c0 docs: use fenced code blocks and format examples
Replaces custom docs-code blocks with fenced Markdown code blocks and reformats examples to improve readability, consistency, and copy-paste behavior.

(cherry picked from commit d0a34a6ca5)
2025-12-10 09:35:56 -08:00
Shuaib Hasan Akib ac6f34a43b fix(docs-infra): parse linenums attribute from triple backtick metadata
The triple backtick code block parser now extracts the linenums attribute
from metadata and applies it to enable line number display in code examples

(cherry picked from commit 1f29577077)
2025-12-10 09:31:48 -08:00
Andrew Scott 01ab257da4 refactor(core): match spec updates for FakeNavigation
Updates FakeNavigation based on updates in https://github.com/whatwg/html/pull/11952

(cherry picked from commit d355205198)
2025-12-10 08:19:28 -08:00
Matthieu Riegler 84f397c831 refactor(core): Support Error like object for on resource errors.
Error like object will be treated as errors.

Related to #61861

(cherry picked from commit 835a643161)
2025-12-10 08:18:24 -08:00
Joey Perrott 96bb4c6ae3 build: add the ignore all rc files flag when running bazel info
Due to a bug in bazel we need to ignore all of the rc files when running bazel info commands

(cherry picked from commit 9ace7d7a0d)
2025-12-09 13:44:49 -08:00
Matthieu Riegler 4043ec5bdd docs: create a separate effect guide
This also includes details about `afterRenderEffect`

WIP.

fixes #63757

(cherry picked from commit 827f5a6fd5)
2025-12-09 13:11:05 -08:00
Kristiyan Kostadinov 65297c6201 fix(compiler-cli): expand type for native controls with a dynamic type
We recently allowed users to have a dynamic input `type` with signal forms, but the logic that infers the value type falls back to `string` even though in theory it can be any of the other types.

These changes expand the inferred type to `string | number | boolean | Date | null` if we detect a dynamic `type` binding.

(cherry picked from commit 8a3f3a91cf)
2025-12-09 13:01:35 -08:00
kirjs 6d7475582f fix(forms): Reuse key in parent in compat structure
This fixes the "Compat nodes do not use keyInParent." error when trying to bind compatField.

(cherry picked from commit 179b4cba67)
2025-12-09 12:59:27 -08:00
arturovt bb0061ba63 refactor(core): wrap operationsCounter calls with ngDevMode checks
Wrap operationsCounter method calls (recordCreate, recordDestroy, reset)
with ngDevMode guards to ensure they are tree-shaken in production builds.

This aligns with the existing pattern where operationsCounter is only
initialized in development mode, and eliminates unnecessary method call
overhead in production.

The optional chaining (?.) is retained as TypeScript doesn't narrow types
based on ngDevMode checks, but the entire expression will be removed during
production builds.

(cherry picked from commit 80dbd74ae8)
2025-12-09 10:38:44 -08:00
Matthieu Riegler ffad78360f refactor(core): add dedicated deprecated signatures for providedIn: any / NgModule.
Those were deprecated by #47616 back in v15.

fixes #65923

(cherry picked from commit 8199945637)
2025-12-09 10:38:14 -08:00
Angular Robot 4bfee61aa7 docs: update cross-repo adev docs
Updated Angular adev cross repo docs files.
2025-12-09 10:37:00 -08:00
Miles Malerba f254ff4f2e feat(forms): expose element on signal forms Field directive
This allows for easier focusing of the relevant element based on the
`field` property of a `ValidationError`

(cherry picked from commit aff8b248b3)
2025-12-09 09:47:56 -08:00
Andrew Scott 91532626a9 docs: Update tutorial last step to use markForCheck
Ideally this tutorial would have used signals but didn't. That's a bigger change than
we are able to make right now and there are other things we would like
to update at the same time. This fix is a temporary patch to the
existing content until there is time to redo the tutorial and videos
entirely.

fixes #65863

(cherry picked from commit 200d923436)
2025-12-09 09:39:37 -08:00
Angular Robot d8162373d7 build: update cross-repo angular dependencies
See associated pull request for more information.
2025-12-09 09:28:32 -08:00
SkyZeroZx 5d73893219 docs(docs-infra): Refactors tutorial generation and updates ng-container docs
Updates the `ng-container` documentation page to use the correct `angular-html` code format and removes an unused CLI documentation file.

(cherry picked from commit 9a6b8e0315)
2025-12-09 09:25:34 -08:00
Kristiyan Kostadinov f901cc9eb3 perf(compiler): chain query creation instructions
We always emit the query creation instructions in a group which makes them good candidates for chaining.

(cherry picked from commit ae1c0dc490)
2025-12-09 09:24:41 -08:00
Andrew Scott a41b0ce025 fix(vscode-extension): Show warning if multiple versions of Angular are detected in workspace
This shows a more prominent warning when multiple versions of Angular
are detected in the workspace and we are forced to choose one to use for
the language server. This also logs those versions with their locations
and directs the user to view the output panel.

fixes #65466

(cherry picked from commit c9dfc6c484)
2025-12-09 09:23:52 -08:00
Matthieu Riegler 182116582e docs(docs-infra): prefer/avoid code block styling
fixes #65866

(cherry picked from commit 3411638f65)
2025-12-09 09:23:17 -08:00
Miles Malerba 5880fbc73c feat(forms): redo the signal forms metadata API
This PR makes a number of changes to the metadata API to address design
flaws in the previous API. Some of the changes include:

- Replaces the previous `MetadataKey` and `AggregateMetadataKey` with a
  single unified `MetadataKey` that is used for all metadata.
- The new `MetadataKey` is only defined for fields that explicitly set
  it in their schema logic
- All metadata now has reducer / aggregate behavior
- The new `MetadataKey` has an option to create a managed key which
  wraps the result of its computed aggregate into some other structure
  such as a `Resource` or `linkedSignal`
- There are now two APIs to create metadata keys
  - `createMetadataKey` for pure computed metadata
  - `createManagedMetadataKey` for metadata that manages its computation
    internally

(cherry picked from commit ebc5c2b083)
2025-12-09 09:21:45 -08:00
Joey Perrott 53f752e7a3 build: update repository to use node 22.21.1 in bazel
The repository was updated to use node 22.21.1 via nvm, but bazel had not been updated to match

(cherry picked from commit 349133374f)
2025-12-09 09:19:19 -08:00
Shuaib Hasan Akib d9522d9033 docs(docs-infra): hide trailing empty line in code examples
Add CSS rule to hide the last empty line in code blocks to prevent displaying
unnecessary empty lines when source files end with a newline character.
The empty line remains in the DOM for proper copy-paste functionality.

(cherry picked from commit 4b9fffaa79)
2025-12-09 09:17:46 -08:00
Gouvernathor 1a4ce250e7 docs(common): Explain how ::ng-deep works
Co-authored-by: Matthieu Riegler <kyro38@gmail.com>
(cherry picked from commit 5607f513a7)
2025-12-09 09:16:51 -08:00
cexbrayat 55fc677cef fix(forms): add signals for dirty, hidden, and pending states in custom controls
FormUiControl states that hidden, pending and dirty will be bind in custom controls, but this is currently not the case.

Fixes #65575

(cherry picked from commit 9fe9566581)
2025-12-08 10:30:48 -08:00
Anuj Chhajed 288238abef refactor(core): correct all typeof ngDevMode comparison patterns introduced by #63875
This change replaces all remaining occurrences of `typeof ngDevMode !== undefined`
with the correct `typeof ngDevMode !== 'undefined'` form. This aligns the codebase
with JavaScript typeof semantics and maintains consistency with other Angular code.

(cherry picked from commit 96b79fc393)
2025-12-08 10:30:06 -08:00
Miles Malerba a4c436a058 refactor: followup cleanup for #65758 fallout
Fixes some issues left behind by recent refactor

(cherry picked from commit efde94a525)
2025-12-08 10:28:04 -08:00
mahmoudaboueleneen 7c82f4e410 docs: fix typo in 'components' word in host elements guide
(cherry picked from commit bad758d4ea)
2025-12-08 10:24:10 -08:00
Shuaib Hasan Akib 55709c1de6 refactor(core): use proper type for stringifyTypeFromDebugify parameter
Replace the 'any' type with ClassDebugInfo for the debugInfo parameter in
stringifyTypeFromDebugInfo function. This removes the TODO comment that was
tracking the need for proper typing without creating circular dependencies.

The change improves type safety while avoiding circular imports since
stringify_utils.ts doesn't export anything that definition.ts imports.

(cherry picked from commit 5fd75410a9)
2025-12-08 10:23:21 -08:00
Joey Perrott ed7db0e0a2 build: update to bazel version 8.4.2
Update bazel to use version 8.4.2

(cherry picked from commit aa92f19307)
2025-12-08 10:22:04 -08:00
Alan Agius f18af4b0db build: ignore adev generated content JSON files in Prettier
These files are auto generated.

(cherry picked from commit 22eda59a31)
2025-12-08 10:20:34 -08:00
Matthieu Riegler 10bdae9098 build: enable angular formatting on all html files
This should also be safe on any html file that isn't an angular template

(cherry picked from commit 9d1d742f1b)
2025-12-08 10:19:50 -08:00
Alessio Pelliccione 7f967997fb feat(docs-infra): add complexity level badge
Introduces the new complexity badge in recommendation cards.
The implementation utilizes CSS variables and `color-mix` to efficiently
handle color themes (Basic, Medium, Advanced) and dark mode support.

Closes #65378

(cherry picked from commit 253dc95d63)
2025-12-08 10:05:51 -08:00
Angular Robot b2ea55c969 build: update cross-repo angular dependencies
See associated pull request for more information.
2025-12-08 09:36:30 -08:00
SkyZeroZx 7ab88c1697 docs: add attribute binding reference in accessibility guide
(cherry picked from commit 70e024ea80)
2025-12-08 09:24:30 -08:00
Shuaib Hasan Akib 46f7986a02 docs: add missing page title to update guide
Fixes the missing page title so the update guide displays a proper heading.

(cherry picked from commit c9cba99407)
2025-12-08 09:23:28 -08:00
SkyZeroZx 3c8b3ac07b docs: Updates tutorial syntaxis highlight
(cherry picked from commit ccf31349c5)
2025-12-08 09:21:48 -08:00
Angular Robot f253f1200d build: update bazel dependencies
See associated pull request for more information.
2025-12-08 09:13:52 -08:00
SkyZeroZx 71568e069c docs: add documentation HOST_TAG_NAME
(cherry picked from commit 6f2ef918e3)
2025-12-08 09:08:55 -08:00
Jessica Janiuk 0352d552a1 docs: Update contributing guidelines
This commit updates the CONTRIBUTING.md file to provide clearer
guidelines for new contributors, including sections on code style,
testing, and the pull request process.

(cherry picked from commit ce4ddf4b47)
2025-12-08 09:06:31 -08:00
Miles Malerba 195c574ca1 test: fix broken adev tests
Fixes a broken adev tests and enables another one that seems to work
fine now

(cherry picked from commit cda56db20f)
2025-12-08 09:04:55 -08:00
SkyZeroZx 56418b108e docs: add documentation for HTTP_TRANSFER_CACHE_ORIGIN_MAP
(cherry picked from commit 7e1e396a00)
2025-12-08 09:00:13 -08:00
SkyZeroZx 5b911d6025 docs(docs-infra): fix hideCopy option to code snippets
Adds the ability to hide the copy button on code snippets.

Updates documentation to use the new `hideCopy` option with the new
markdown code fence syntax.

(cherry picked from commit a4563044ad)
2025-12-08 08:48:25 -08:00
Shuaib Hasan Akib b8ed18c527 docs: fix lazy loading documentation reference
Updates broken or outdated references in the lazy loading guide.

Fixes: #65906
(cherry picked from commit 45aa63308e)
2025-12-08 08:47:45 -08:00
Alan Agius 8bedd996ac build: format manifest files after updating its version
This commit run the formatter during the release.

(cherry picked from commit d2ac93d5ca)
2025-12-08 08:44:01 -08:00
Alan Agius 79ebbf7e36 refactor: move Prettier ignore rules from ng-dev config to .prettierignore
This moves all prettier ignore rules to the prettier config

(cherry picked from commit 52aac81829)
2025-12-08 08:43:11 -08:00
Matthieu Riegler 5d8adf2105 docs(docs-infra): fix next version dropdown
fixes #65912

(cherry picked from commit 13bc1bc721)
2025-12-08 08:42:24 -08:00
Matthieu Riegler bd4cfc88ef docs(docs-infra): expose VERSION from @angular/upgrade
The missing src was responsible for not exposing the symbols during the doc extraction.

fixes #65916

(cherry picked from commit 81cf319534)
2025-12-08 08:41:40 -08:00
kirjs 28e7546edc feat(docs-infra): forward preview error locations
Intercept the WebContainer preview overlay open-in-editor requests and relay them to the editor via postMessage so errors open the matching file.

(cherry picked from commit 789f91bd4f)
2025-12-04 11:45:56 -08:00
kirjs 3d58d10e68 feat(docs-infra): allow navigating to editor error locations
This shows up in a little pop-up, and is clickable now, and leads to exact line

(cherry picked from commit 21b995f4b7)
2025-12-04 11:45:56 -08:00
diegoinost02 ba61579cb7 docs: clarify linkedSignal update behavior
Updates the linkedSignal documentation to specify that it updates its value when the source changes or when any signal referenced in the computation changes, ensuring the description accurately reflects its behavior.

(cherry picked from commit e311f3df72)
2025-12-04 11:42:51 -08:00
Shuaib Hasan Akib ab38d91891 docs: update rxResource changes in updated page
Add both `request` and `loader` changes in rxResource section

(cherry picked from commit abcd6b5bfb)
2025-12-04 11:41:41 -08:00
SkyZeroZx 36cffc72d3 docs: update zone pollution guide highlight syntax
(cherry picked from commit 3adb091c1a)
2025-12-04 11:40:07 -08:00
Kirill Cherkashin 7de8558219 refactor(forms): Break logic.ts into separate files
This would make it easier to navigate

(cherry picked from commit 5be33048cc)
2025-12-04 11:33:26 -08:00
Nakul Sharma d40a517c0f refactor(core): use getComponentDef in stringify_utils
- Use getComponentDef in debugStringifyTypeForError to clean up TODO
- Remove outdated comment from stringify_utils

(cherry picked from commit 0bb8924ab6)
2025-12-04 11:32:17 -08:00
Joey Perrott c3bd22d10d build: update cross-repo angular dependencies
See associated pull request for more information.
2025-12-04 11:26:14 -08:00
Alex Rickabaugh bf1c12cd93 fix(forms): memoize reads of child fields in signal forms (#65802)
Previously, navigating a `FieldTree` in signal forms involved reactive reads
of the value of the parent field(s), both directly and via `.childrenMap()`.

This meant that on _any_ change to the value of a field, reactive
notifications would trigger updates of computeds, reruns of effects, etc.
So for example, this effect would run on every change to the form:

```ts
const f = form(signal({data: 'abc', unrelated: 0}));
effect(() => {
  // accessing f.data incurs a dependency on f().value() which changes
  // on every change in the whole form
  console.log(f.data().value());
});
```

This is deeply counterintuitive and troublesome when attempting to write
effect logic, and also results in `computed`s unnecessarily updating.

This change introduces the concept of a "reader" computed, which memoizes
the access of a field at a given key via the reactive graph. With this, the
same `f.data` access above now depends on the `data` reader in `f` only,
which is effectively a constant computed. As a result, the effect only
reruns on changes to `data`'s value, as intended.

PR Close #65802
2025-12-03 12:52:43 -08:00
Alex Rickabaugh 2c12661620 refactor(forms): simplify child field creation (#65802)
Previously, several values were being passed into the creation of
`FieldNodeStructure`s that were only used in the creation of child nodes.
Separately, we also passed a `createChildNode` function which these values
were passed back into.

Instead, this moves the small bit of logic from structure.ts behind the
`createChildNode` callback, which reduces the passing of values back-and-
forth and gives `createChildNode` a much more suitable signature.

PR Close #65802
2025-12-03 12:52:43 -08:00
cexbrayat 565c022a87 build: disable assistant_to_the_branch_manager on forks
It currently fails as it is triggered on push, but requires an angular-robot-key that forks don't have.

(cherry picked from commit fc23fcdd3b)
2025-12-03 12:33:18 -08:00
Angular Robot 4e19d6c072 docs: update cross-repo adev docs
Updated Angular adev cross repo docs files.
2025-12-03 12:32:36 -08:00
Joey Perrott fbc43f9272 build: use mjs files for ng-dev configuration
In preperation for ng-dev requiring mjs files for configuration, switch over our usage
2025-12-03 12:30:55 -08:00
Joey Perrott 34caae5978 ci: use defined ng-dev config for deploying docs site
Use the repo defined ng-dev configuration for deploying the docs site

(cherry picked from commit eebcaf49f1)
2025-12-03 11:26:10 -08:00
Shuaib Hasan Akib 2e5d187120 fix(docs-infra): prevent readonly TypeScript keyword from being linked
This updates the docs infrastructure to avoid incorrectly linking the `readonly` keyword in TypeScript examples.

Fixes #65632

(cherry picked from commit 7f8ffa3304)
2025-12-03 16:30:55 +01:00
Pawel Kozlowski c355ffd99e release: cut the v21.0.3 release 2025-12-03 16:18:30 +01:00
SkyZeroZx 6b4ab876e8 feat(forms): Allows transforms on FormUiControl signals
Extends the `FormUiControl` interface to allow `InputSignalWithTransform` in addition to `InputSignal` for its properties.

Fixes #65756

(cherry picked from commit 7d1e502345)
2025-12-03 15:13:06 +01:00
Leon Senft 609699ae17 perf(core): tree shake unused dynamic [field] binding instructions (#65599)
Move the instructions used to dynamically bind a `Field` directive to a
form control onto the `Field` itself. This way the instructions are only
retained if the app uses the `Field` directive.

PR Close #65599
2025-12-03 15:10:50 +01:00
Leon Senft a5dbd4b382 fix(forms): support dynamic [field] bindings (#65599)
Support binding a `Field` directive to a component created dynamically
with `createComponent()`.

Fix #64632

PR Close #65599
2025-12-03 15:10:49 +01:00
Kristiyan Kostadinov 4bb085311e fix(core): unable to inject viewProviders when host directive with providers is present
When registering providers, the DI system assumes that `viewProviders` are registered before plain `providers`. This was reinforced by components always being first in the array of directive matches, only one component being allowed per node and the fact that only components can have `viewProviders`.

This breaks down if there are host directives with `providers` on the component, because they'll execute earlier, throwing off the order of operations.

These changes fix the issue by separating out the resolvers for `viewProviders` and plain `providers` and explicitly running the component's `viewProviders` resolver before any others. This also has the benefit of not attempting to resolve `viewProviders` for directives which are guaranteed not to have them.

Fixes #65724.

(cherry picked from commit 886cf6c452)
2025-12-03 15:09:53 +01:00
Angular Robot 6491df9175 build: lock file maintenance
See associated pull request for more information.
2025-12-03 13:24:37 +01:00
Alan Agius 20474d3f0f fix(http): enable XSRF protection for same-origin absolute URLs
Previously, the XSRF interceptor only added the XSRF token to requests with relative URLs.
This commit updates the interceptor to also add the token to requests with absolute URLs, provided they match the current origin.

(cherry picked from commit 0659d11c85)
2025-12-03 12:19:46 +01:00
Kristiyan Kostadinov 1f1856e897 fix(compiler-cli): check that field radio button values are strings
Adds some type checking code which verifies that the bound `value` on a `Field` radio button is a string.

Fixes #65726.

(cherry picked from commit 6773d3b97d)
2025-12-03 12:19:01 +01:00
arturovt 48b89f9fbe fix(router): handle errors from view transition finished promise
This commit adds a `.catch()` handler to `transition.finished` from `document.startViewTransition` to prevent unhandled promise rejections. The finished promise can reject with `TimeoutError` or `InvalidStateError` when transitions fail during or after the animation phase.

Based on the Blink source code, the `finished` promise can reject with:
* `TimeoutError`: "Transition was aborted because of timeout in DOM update"
* `InvalidStateError`: "Transition was aborted because of invalid state"

This may happen when the DOM update phase exceeds the browser's internal timeout threshold.

(cherry picked from commit b74a0693f2)
2025-12-03 12:17:02 +01:00
Joey Perrott 0f50ea8f97 docs: prevent showing typescript diagnostic errors until the node runtime reaches a ready state
Prevent the overlay box showing diagnostics errors until after the initial setup of the node runtime is completed.

Fixes #52649

(cherry picked from commit 819b640c2d)
2025-12-03 11:54:58 +01:00
Pawel Kozlowski c112ef1808 Revert "build: update cross-repo angular dependencies"
This reverts commit 82d616b681.
2025-12-03 11:34:40 +01:00
Pawel Kozlowski 2a459a0e3f Revert "build: update bazel dependencies"
This reverts commit 42fbb64aec.
2025-12-03 11:34:40 +01:00
Angular Robot 42fbb64aec build: update bazel dependencies
See associated pull request for more information.
2025-12-03 10:12:32 +01:00
Joey Perrott 82d616b681 build: update cross-repo angular dependencies
See associated pull request for more information.
2025-12-03 10:09:29 +01:00
Joey Perrott 8e837cc226 docs: rename visibleRegion to region
Use the attribute region instead of visibleRegion

(cherry picked from commit 34bedae101)
2025-12-03 10:06:06 +01:00
Joey Perrott 76f784c340 refactor(docs-infra): extract only the visibleRegion
Previously we extracted the regions and only made the visible region visible on the page, but since there is not a need for the
non-visible code to be presented, we don't need to include it in the generated code snippets.

(cherry picked from commit 9b3b5fb4cf)
2025-12-03 10:06:05 +01:00
Kirill Cherkashin e95d2e3a34 docs: Update adev/src/content/guide/forms/signals/models.md
Co-authored-by: Matthieu Riegler <kyro38@gmail.com>
(cherry picked from commit 29223c440f)
2025-12-02 19:30:57 +01:00
kirjs 1ee0ff8cfb docs(forms): Polish the docs
- Recommend using form/fields to set the value
- Drop "Dynamic field addition" section as for the above reason

(cherry picked from commit 1fd8303659)
2025-12-02 19:30:57 +01:00
Andrew Scott c2a8934d12 Revert "refactor(router): compress synchronous end to router navigation to single operator"
This reverts commit 71362733cf.
2025-12-02 19:13:07 +01:00
Andrew Scott 71362733cf refactor(router): compress synchronous end to router navigation to single operator
The end of the Router navigation is a block of synchronous logic that
can be compressed into a single operator rather than splitting it across
several, making it harder to step through. The only benefit from the
split is automatic unsubscribe/cancellation, which we can replicate
with an additional 'shouldContinue' check before proceeding.

(cherry picked from commit b7d21e209a)
2025-12-02 16:44:06 +01:00
Kristiyan Kostadinov 5a80a48e96 fix(compiler-cli): avoid allocating an object for signals in production mode
Currently when the signal debug name transform sees something like `const foo = signal(0);`, it transforms the signal into `signal(0, {...(ngDevMode ? { debugName: 'foo' } : {})})`. After minification this becomes `signal(0, {})` which will allocate memory for the empty object literal.

These changes rework the logic to produce `signal(0, ...(ngDevMode ? [{ debugName: 'foo' }] : []))` which will be fully tree shaken away to `signal(0)`.

(cherry picked from commit e30e61b789)
2025-12-02 15:06:55 +01:00
Jessica Janiuk 8c3304c766 fix(core): run animation queue in environment injector context
In the case that a component injector is destroyed before the animation
queue runs, the animation queue would fail to run because it was using a
destroyed injector. This commit changes the animation queue to run in the
context of the EnvironmentInjector, which is not destroyed until the app
is destroyed.

fixes: #65628
(cherry picked from commit d8ab83ca82)
2025-12-02 15:05:21 +01:00
Matthieu Riegler 017672f742 refactor(compiler): Generate the controlCreate instruction after the native element has been created
This is necessary to exclude a race condition where the MutationObserver initialized by the instruction fired before the inputs are binded.

fixes #65678

(cherry picked from commit f35b2ef47c)
2025-12-02 12:59:53 +01:00
Matthieu Riegler 8e0df4083d docs(docs-infra): Show examples on function overloads
(cherry picked from commit a784995a98)
2025-12-02 12:13:16 +01:00
Georgi Serev c0e0010bb9 fix(devtools): hide profiler node details when the frame is changed
Hide the details panel when the user selects a new frame.

(cherry picked from commit 2eaa4d54ad)
2025-12-02 12:05:58 +01:00
Joey Perrott 53e0aaba4e refactor(docs-infra): move header id tracking into RendererContext
Move the header id tracking into the renderer context rather than a global state.  Since the RendererContext is
initialized for each execution of the marked parser, we can store the context of which header ids have been seen within
a single page there which allows us to run these parse interactions in parallel.

(cherry picked from commit a16a70ca74)
2025-12-02 12:03:39 +01:00
Joey Perrott 5ec3bd9c55 refactor(docs-infra): transform all headings using the built in transformer
Rather than manually calling the transformer we use for headings from within a render function, we now properly call into the Renderer to do them
via the tokens they are require instead.  This is being done to allow us to have a per Renderer instance of state instead of a global state, which will
allow us to run marked async and hopefully speed up the pipeline

(cherry picked from commit 8b296543ae)
2025-12-02 12:03:38 +01:00
Tim Deschryver efe4b72abb docs: fix documentation link for currentNavigation method
(cherry picked from commit 680de24c3c)
2025-12-02 12:02:28 +01:00
SkyZeroZx ea45b4d54c docs: add platform-specific implementation and helpers
(cherry picked from commit 0c7508bf56)
2025-12-02 12:00:05 +01:00
Angular Robot 2935fef3af build: update cross-repo angular dependencies
See associated pull request for more information.
2025-12-02 10:47:29 +01:00
SkyZeroZx 35b39bd86f docs: improve formatting and fixed numeration issue in attribute directives guide
(cherry picked from commit 03c04d4c83)
2025-12-02 10:45:51 +01:00
SkyZeroZx 893fbdfb04 docs: update syntax highlighting in component documentation
(cherry picked from commit 7fd5890d48)
2025-12-02 10:38:20 +01:00
Gaston f368ab957c docs: add FormArrayDirective documentation to reactive forms guide
Update adev/src/content/guide/forms/reactive-forms.md

Co-authored-by: Matthieu Riegler <kyro38@gmail.com>
(cherry picked from commit da99b5d1d0)
2025-12-02 10:36:17 +01:00
Matthieu Riegler 7f289bdc3a docs: fix submit example
`async` keyword is required for the `submit` callback

(cherry picked from commit bc93b398af)
2025-12-02 10:35:10 +01:00
Angular Robot 706d7620e8 build: update cross-repo angular dependencies
See associated pull request for more information.
2025-12-01 19:36:18 +01:00
SkyZeroZx b4c8c939b0 docs: update notes to use consistent formatting in various guides
(cherry picked from commit aea2465a59)
2025-12-01 19:33:36 +01:00
Angular Robot 48008c2f6f docs: update cross-repo adev docs
Updated Angular adev cross repo docs files.
2025-12-01 19:30:14 +01:00
Shuaib Hasan Akib 8ab759497c docs: format typescript examples and replace <docs-code> with fenced code blocks
Replaced <docs-code language="typescript"  to improved
readability and consistency across documentation.

(cherry picked from commit 3731f07579)
2025-12-01 19:20:23 +01:00
SkyZeroZx dad3d7900f feat(docs-infra): Adds copy link to anchor functionality
Enables copying a direct link to any section by clicking its anchor. Also updates the aria-label to remove the code tag

(cherry picked from commit 4e89bc6244)
2025-12-01 19:19:35 +01:00
Angular Robot c139b35d5d build: update rules_angular digest to 9409450
See associated pull request for more information.
2025-12-01 19:18:09 +01:00
til0r ed32e8c364 docs: fix npm link URL in creating-libraries guide
- Update `npm link` to the official docs URL.
- Keep `pnpm link` reference intact

(cherry picked from commit 721080aaa9)
2025-12-01 18:58:37 +01:00
Pratyush Swain fe863aad05 docs(docs-infra): update NG0910 documentation with new control flow
(cherry picked from commit 27d1ccb2df)
2025-12-01 18:54:02 +01:00
Shuaib Hasan Akib 7efcd9ad4c docs: link inject function to its API reference
Replaced plain code-form usage of `inject` with a link to the
API docs (`/api/core/inject`) to improve navigation and
help readers access detailed reference information more easily.

(cherry picked from commit 7b33554d24)
2025-12-01 18:53:08 +01:00
aparziale 4d036fcc41 docs(docs-infra): Fix Incorrect indentation
Fix Incorrect indentation in hierarchical dependency injection guide

Fix #65722

(cherry picked from commit a850987519)
2025-12-01 18:52:20 +01:00
Shuaib Hasan Akib 74cbe36fa6 docs: update examples to use self-closing tags for consistency with recommended practices
Updated various template examples to use self-closing component tags
(e.g., `<my-comp />`) instead of the expanded form (`<my-comp></my-comp>`),
improving consistency across the documentation and aligning with current
Angular style recommendations.

(cherry picked from commit a464406ebf)
2025-12-01 18:50:54 +01:00
aparziale ce961fe5c0 docs(docs-infra): Fix Drag handle SVG is not visible
Fix Drag handle SVG is not visible. The css style overrides the default behavior

Fixes #65545

(cherry picked from commit 7a39565916)
2025-12-01 18:49:10 +01:00
SkyZeroZx b7ccb308b8 docs(docs-infra): Improves symbol linking for Angular Aria selectors
Improves the symbol linking logic to handle Angular component selectors (e.g., ngCombobox). It attempts to convert Angular selector patterns to their corresponding class names, improving navigation to Angular API documentation.

(cherry picked from commit 2d854e01bc)
2025-12-01 18:47:23 +01:00
galmi bc6cb6830e docs(forms): fix links in signal forms guides and use docs-pill-row links for next steps
(cherry picked from commit 726dfad9db)
2025-12-01 18:46:22 +01:00
Shuaib Hasan Akib cb2847c8d9 fix(docs-infra): truncate long TOC items and add title tooltips
Long TOC entries now truncate with …, and a title attribute is added to display the full label on hover.

Fixes: #65727
(cherry picked from commit 313454bf17)
2025-12-01 18:43:50 +01:00
Ben Hong 8cfe9d8100 docs: update aria listbox selection mode section
(cherry picked from commit 7ea5b66a70)
2025-12-01 18:41:57 +01:00
Kristiyan Kostadinov c46f65df39 docs: fix up font in drag drop examples
Fixes that the CDK drag&drop examples were using a serif font.

(cherry picked from commit 649e2ec1d4)
2025-12-01 18:40:38 +01:00
aparziale 505e1a1f6b docs(docs-infra): fix content projection documentation
Fixed documentation issues in content projection examples.
- Component decorator without '@'
- Self-closing tag for ng-content

Fix #65675

(cherry picked from commit f18dd5e54c)
2025-12-01 18:38:20 +01:00
kirjs 9aab858871 feat(docs-infra): prevent browser save dialog in adev code editor
Add Cmd+S/Ctrl+S keyboard shortcut to the adev code editor that prevents
the annoying browser save dialog from appearing. The shortcut is a no-op
since the editor already has auto-save functionality that persists changes
after 500ms of inactivity.

(cherry picked from commit cb04cee7b2)
2025-12-01 18:36:06 +01:00
Kristiyan Kostadinov 8c4a1524da release: cut the v21.0.2 release 2025-12-01 12:51:18 +01:00
Alan Agius 78fd159b78 fix(compiler): prevent XSS via SVG animation attributeName and MathML/SVG URLs
This commit implements a security fix to prevent XSS vulnerabilities where SVG animation elements (`<animate>`, `<set>`, etc.) could be used to modify the `href` or `xlink:href` attributes of other elements to `javascript:` URLs.

(cherry picked from commit 1c6b0704fb)
2025-12-01 10:27:00 +01:00
SkyZeroZx fec1f1ae5f docs: update code snippets in reference doocumentation
(cherry picked from commit 8f3fdc3e80)
2025-11-26 16:01:17 -05:00
Matthieu Riegler a4084154f2 refactor(migrations): don't migration the server bootstrapApplicaiton on zoneless apps.
With the change we specifically analyse `boostrapApplication` with a config that uses `mergeApplicationConfig`.

fixes #65408

(cherry picked from commit c1dfd9cde6)
2025-11-26 15:58:57 -05:00
aparziale 99b6341ca5 docs(docs-infra): fix form custom control example uses syntax
Fixed form custom control example uses non-working syntax in template

Fix #65647

(cherry picked from commit a3fb41e797)
2025-11-26 15:48:20 -05:00
Matthieu Riegler 4207d89455 docs(docs-infra): fix visible lines/regions
fixes #65552

(cherry picked from commit 1c3868198e)
2025-11-26 13:43:40 -05:00
Matthieu Riegler 1260d1ac6d refactor(devtools): Use the same error message as the signal custom formatter for signal errors
When signals throw errors on read, the devtools will show the same error message as the signal custom formatter.
We also don't log errors anymore to the console as those might be surprising to see as errors and are buggy behavior of the devtools.

(cherry picked from commit a0930e166c)
2025-11-26 13:11:10 -05:00
Matthieu Riegler 151616dd7c refactor(core): show error message on signal error
When a signal throws an error on read. The formatter will show the error message.

(cherry picked from commit 5b720aa2eb)
2025-11-26 13:11:10 -05:00
Leon Senft 0ae14cb746 test(core): test bundling of dynamic component creation and bindings
Add test coverage for bundling dynamic component creation API like
`createComponent()` and `inputBinding()`. This will be used to test that
Signal Forms related features for #64632 can be tree-shaken when unused.

(cherry picked from commit add8c41e5b)
2025-11-26 11:57:18 -05:00
SkyZeroZx 10201b6873 docs(docs-infra): renders inline code snippets in docs pills
Improves the rendering of `DocsPillRow` to correctly display inline code snippets (using backticks) within the pill labels.

(cherry picked from commit ef034c15c1)
2025-11-25 18:30:09 -05:00
kirjs 47a739611a release: cut the v21.0.1 release 2025-11-25 15:04:58 -05:00
Alan Agius 3240d856d9 fix(http): prevent XSRF token leakage to protocol-relative URLs
The XSRF interceptor previously failed to detect protocol-relative URLs (starting with `//`) as absolute URLs. This allowed requests to such URLs to include the XSRF token, potentially leaking it to external domains.

This change updates the interceptor to correctly identify protocol-relative URLs as absolute and exclude them from receiving the XSRF token.

(cherry picked from commit 40790ef980)
2025-11-25 13:47:29 -05:00
Alan Agius 908b5a41a3 refactor: replace getDocument() with inject(DOCUMENT)
This replaces `getDocument()` with `inject(DOCUMENT)` across hydration and transfer state logic.

(cherry picked from commit 400fc82c43)
2025-11-25 13:05:01 -05:00
Kristiyan Kostadinov 6b20adff62 refactor: add mark for signal forms
Adds a mark for signal forms so we can track adoption. Also moves the call for `@let` into `declareLet` since we don't need it to fire as often as in `storeLet`.

(cherry picked from commit c994267f17)
2025-11-25 13:03:46 -05:00
Alan Agius 49ad7c6508 fix(core): use injected DOCUMENT for CSP_NONCE
This ensures that the right document is used and that `CSP_NONCE` can be used in `provideAppInitializer` and `provideEnvironmentInitializer`.

Closes #65624

(cherry picked from commit 3b1fa8235b)
2025-11-25 11:39:23 -05:00
AntonChesnokov 8d3a89a477 fix(compiler-cli): escape angular control flow in jsdoc
Escape @-prefixed template control flow constructs during doc extraction so JSDoc parsing keeps description text intact. Add regression coverage for @for snippets.

(cherry picked from commit 5bfa027d41)
2025-11-25 11:33:29 -05:00
Angelo Parziale 4634b467c2 docs(docs-infra): Fix anchor link DI
Fix anchor link for Dependency Injection Overview.

(cherry picked from commit 346caefa8d)
2025-11-25 11:05:45 -05:00
kirjs e3f5f34732 refactor(forms): Make reset take value
Now you can do form.reset({name: 'cat', age: 4});

(cherry picked from commit dec222d4d7)
2025-11-25 10:51:38 -05:00
Angular Robot 9aa3e92c82 build: lock file maintenance
See associated pull request for more information.
2025-11-25 10:34:12 -05:00
Miles Malerba 7d5c7cf99a feat(forms): add DI option for classes on Field directive
Adds a DI configuration option for signal forms that allows the
developer to specify CSS classes that should be automatically added
by the `Field` directive based on the field's status.

(cherry picked from commit c70e246c23)
2025-11-25 10:33:41 -05:00
SkyZeroZx 477df38d17 docs: improve core package API documentation with additional reference links
(cherry picked from commit 67d41e9bcc)
2025-11-25 10:19:39 -05:00
Cheng-Hsuan Tsai 69d6f8fe2c docs: replace aria grid overview example
(cherry picked from commit 56e059948f)
2025-11-25 10:17:00 -05:00
Leon Senft 8acf5d2756 fix(forms): allow dynamic type bindings on signal form controls
The type checker will no longer prohibit binding the Signal Forms `[field]`
directive to an input with a dynamic `[attr.type]` or `[type]` binding.

(cherry picked from commit 3a1eb07c46)
2025-11-25 09:16:01 -05:00
Oyama Michinoku c9f50b424b docs: fix typo by correcting W3 to W3C
(cherry picked from commit 2102bfe5aa)
2025-11-25 09:14:03 -05:00
Hussein Mahmoud Kandil d5b339c1a3 docs: fix example imports and missing event URL reference
The analytics tracking example contained unused and missing imports,
and it incorrectly referenced the page's URL.
This update fixes the imports and ensures the handler uses `event.url`,
allowing the example to work correctly.

(cherry picked from commit a294e3b94d)
2025-11-25 07:44:08 -05:00
Andrew Scott 0e458c7e12 refactor(core): Remove toggles used for zoneless by default migration
this migration is complete both internally and externally

(cherry picked from commit 51ebe9a4fc)
2025-11-24 16:57:52 -05:00
Kristiyan Kostadinov 70507b8c1c fix(core): debug data causing memory leak for root effects
We track all effects that are created for debugging purposes in the `resolverToEffects` map. This ends up leaking memory for effects registered on long-living resolvers (e.g. on the root injector), because they stay in the array, even if the effect itself has been destroyed.

These changes add a callback to clean up the references.

Fixes #65265.

(cherry picked from commit ca6ab6c914)
2025-11-24 15:26:12 -05:00
Leon Senft 4845a33018 refactor(forms): support custom control directives
Support binding `[field]` to directives that implement
`FormValueControl` or `FormCheckboxControl`.

The `[field]` binds to whichever directive (or component) matches first in the
event there are multiple implementations. We are considering whether to make
this an error state, which could be reported during type checking.

Closes #63910, Closes #64992

(cherry picked from commit f97a1d4856)
2025-11-24 13:48:20 -05:00
Ben Hong 534cc3dc37 docs: standardize aria code examples to not use component suffix
(cherry picked from commit d442c72f87)
2025-11-24 13:28:36 -05:00
Matthieu Riegler 6cb191bade docs: add callout on zone base testing helpers
With zoneless being the default, we need to make these requirements more explicit.

fixes #65539

(cherry picked from commit b34e48bdff)
2025-11-24 13:27:49 -05:00
Joey Perrott 0424a998c9 refactor(docs-infra): make docs-alert an inline token
Migrate docs-alert to be inline instead of block, this ensures that the content is placed within a <p> tag as expected. This is important
for ensuring that the iconography is placed correctly within the wrapper div generated for the alert. Additionally, we refactor the matcher
code to be more efficient, running with fewer loops.

(cherry picked from commit 046501fd33)
2025-11-24 13:26:03 -05:00
Matthieu Riegler 9b0900f0e9 ci: update pullapprove reviewers
Removing Minko from the pool of automatically picked reviewers

(cherry picked from commit 98ceb0a80d)
2025-11-24 13:25:30 -05:00
SkyZeroZx a62162d2ee docs: Update router docs to add references and components input fixed syntaxis
(cherry picked from commit 2ac826867b)
2025-11-24 13:18:31 -05:00
Alessio Pelliccione 9d6b86958a docs(docs-infra): fix missing syntax highlighting
closed angular#65565

(cherry picked from commit 7d20f2071c)
2025-11-24 13:13:25 -05:00
Shuaib Hasan Akib b513008fc8 refactor(common): remove redundant standalone: true as it is default now
-removing `standalone: true` from integration
- removed whitespace

(cherry picked from commit 93cff501e9)
2025-11-24 13:12:18 -05:00
Kristiyan Kostadinov 39c577bc36 fix(compiler-cli): do not type check native controls with ControlValueAccessor
Currently when we detect a `field` binding on a native element, we treat it as a built-in native control. This might not be the case if it's a pre-existing `ControlValueAccessor` relying on the CVA interop.

These changes try to detect any CVA-like directive on the element and disable the additional type checking if there are any.

Fixes #65468.

(cherry picked from commit 6b8720de91)
2025-11-24 13:08:46 -05:00
Kristiyan Kostadinov f0b34854cc refactor(compiler-cli): track public methods during analysis
Updates the directive analysis to track the public methods of the class.

(cherry picked from commit 5cfdd7897b)
2025-11-24 13:08:46 -05:00
Tomer953 f394215b14 fix(migrations): detect structural ngTemplateOutlet and ngComponentOutlet
the common-to-standalone migration only matched [ngTemplateOutlet] and
[ngComponentOutlet] bindings and missed their structural forms
(*ngTemplateOutlet and *ngComponentOutlet). This caused missing imports
when removing CommonModule. This change adds structural directive
patterns so the migration correctly identifies needed imports.

(cherry picked from commit a4f50bdd54)
2025-11-24 12:41:01 -05:00
Shuaib Hasan Akib 70bc3115c5 docs(docs-infra): keep 'Show code' button aligned right and prevent metadata wrapping
Ensures the example viewer header displays correctly by keeping the "Show code"
button aligned to the right and preventing metadata text from wrapping.
Improves layout consistency across documentation examples.

(cherry picked from commit b26fe73a91)
2025-11-24 12:23:40 -05:00
Matthieu Riegler f73cfd5a92 ci: adding myself as optional to the compiler scope
For whenever I feel confortable approving compiler PRs like diagnostics

(cherry picked from commit 9dd7cc13ca)
2025-11-24 12:18:30 -05:00
Alan Agius 6d4e68977f build: update release script to support changelog cherry-picking
This commit updates the release script to support cherry-picking changelog updates to the main branch when releasing from a patch branch. It also introduces a marker in the changelog to separate releases and ensures the GitHub release uses the formatted changelog from disk.

(cherry picked from commit c843a46912)
2025-11-24 12:17:23 -05:00
hawkgs 98520333bd refactor(compiler-cli): add a resource debugName transform (#64172)
Add a TS transform for `resource` (and `httpResource`) `debugName`. Test the transformations.

PR Close #64172
2025-11-24 11:30:13 -05:00
hawkgs 6de8926594 refactor(core): add debug name to resource (#64172)
Decorate `resource` (and `httpResource`) with `debugName`, along with all of its internal signals.

PR Close #64172
2025-11-24 11:30:13 -05:00
Matthieu Riegler 102cb872c7 docs: update devtools guide
- splits the injector inspector into its own guide
- update the screenshots
- add defer block section
- add hydration section

(cherry picked from commit b5ae62c02b)
2025-11-24 11:11:30 -05:00
NicoPolazzi 2739ae4b9d docs: correct signals tutorial inconsistencies in chapters 6-10
(cherry picked from commit 325ab18084)
2025-11-24 11:08:31 -05:00
Shuaib Hasan Akib 4303f5153c docs: html examples and replace <docs-code> with fenced code blocks
Replaced <docs-code language="html" with fenced html for improved readability and consistency across documentation.

(cherry picked from commit 0203dad09b)
2025-11-24 10:38:35 -05:00
Matthieu Riegler 1f20b54256 docs(docs-infra): simplify tab selection
Tab selection relied on the tabs being visible whe nthe example is loaded. That didn't work when `hideCode` was used.

fixes #65550

(cherry picked from commit 119c6ddaeb)
2025-11-24 10:24:42 -05:00
HyperLife1119 2ebe685298 docs: fix order of render phases in lifecycle documentation
(cherry picked from commit b6b6fae483)
2025-11-24 10:22:32 -05:00
Shuaib Hasan Akib cdfc782770 docs: fix internal links showing as external
Replace absolute URLs (https://angular.dev/...) with relative URLs
(/...) to prevent internal documentation links from being treated
as external links and opening in new tabs.

(cherry picked from commit 8f89507a0b)
2025-11-24 10:21:42 -05:00
Kristiyan Kostadinov 290513f5b6 test: remove unnecessary test calls
Removes calls to `TestBed.configureTestingModule` since they aren't necessary.

(cherry picked from commit 26e2092dd1)
2025-11-24 10:18:21 -05:00
Shuaib Hasan Akib d3c3b83f8b fix(docs-infra): update deprecated API link to use correct status value
Replaced `status=deprecated` with the correct numeric value `status=8`
to ensure the Deprecated APIs link resolves properly in the docs.

(cherry picked from commit 16a0b7dfdb)
2025-11-24 10:17:35 -05:00
Yahya-Almubarak 730803ad26 docs: fix typo in tutorial
(cherry picked from commit e501b7e445)
2025-11-24 10:15:05 -05:00
Alan Agius 2d658b3662 build: run e2e in sandbox
Updates the E2E test configuration to run within the Bazel sandbox.

(cherry picked from commit f7f9707508)
2025-11-24 10:03:03 -05:00
Angular Robot c7ae6f3fee build: update all github actions
See associated pull request for more information.
2025-11-24 09:34:02 -05:00
Alan Agius 4eb2d3ea2c docs: update ng serve builder to @angular/build:dev-server and detail proxy path matching behavior.
Closes #53652

(cherry picked from commit b28570b227)
2025-11-24 09:33:27 -05:00
Angular Robot de46b2429f build: update pnpm to v10.23.0
See associated pull request for more information.
2025-11-24 09:30:40 -05:00
Matthieu Riegler 92f0b6687d docs: fix v21 event header image
fixes #65572

(cherry picked from commit 48a05dd38c)
2025-11-24 09:08:22 -05:00
Hussein Mahmoud Kandil 696aaa11e9 docs: fix router event subscription in error handler example
The example incorrectly persisted the error message after a successful
navigation retry because the stream only emitted NavigationError events.
This update removes the filter and returns an empty string for non-error
events, allowing the signal to clear the message on normal navigation.

(cherry picked from commit 72b1f7fd43)
2025-11-22 09:10:57 -05:00
SkyZeroZx a70a191713 docs: Adds signal type checking documentation
(cherry picked from commit 38a354ffa2)
2025-11-21 16:31:16 -05:00
Matthieu Riegler 0ea1e07174 fix(core): apply bootstrap-options migration to platformBrowserDynamic
The migration wasn't applied to projects relying on `platformBrowserDynamic()` prior to this fix.

(cherry picked from commit b6fee3f107)
2025-11-21 16:28:23 -05:00
Shuaib Hasan Akib 5170fd4c05 docs: format JSON examples and replace <docs-code> with fenced code blocks
Replaced <docs-code language="json" for improved
readability and consistency across documentation.

(cherry picked from commit f884c181b3)
2025-11-21 16:23:55 -05:00
Shuaib Hasan Akib b8da1d4fdb docs: format JSON examples and replace <docs-code> with fenced code blocks
Replaced <docs-code language="json" header=".postcssrc.json"> with fenced
JSON code blocks using ```json {header: '.postcssrc.json'} for improved
readability and consistency across documentation.

(cherry picked from commit 68aa83e8cf)
2025-11-21 15:48:45 -05:00
Matthieu Riegler 16babdd74c refactor(devtools): don't query defer nodes
This prevents from throwing errors when selecting defer nodes

(cherry picked from commit 67d3c2529f)
2025-11-21 15:42:57 -05:00
cexbrayat df1d129d0b docs: consistent casing for onpush zoneless migration MCP tool name
The tool has been renamed in the CLI for consistency https://github.com/angular/angular-cli/pull/31866

(cherry picked from commit 88546ab127)
2025-11-21 13:26:02 -05:00
SkyZeroZx 93ef5d410e feat(docs-infra): add docs-image extension for enhanced image handling in markdown
Extends the Markdown parser to support `loading`, `decoding`, and `fetchpriority` attributes for images via curly brace syntax.

(cherry picked from commit 46269be842)
2025-11-21 13:25:02 -05:00
Shuaib Hasan Akib 0331b1f766 docs: format example code blocks for consistency and readability
(cherry picked from commit 6f1329f34a)
2025-11-21 13:24:26 -05:00
Joey Perrott d40770fd94 refactor(docs-infra): remove the multiple code example view modes
Rather than using multiple view modes for code examples, we can just treat the previous snippet mode as
as multifile mode that just only has one file in it.

(cherry picked from commit f61e61ac4f)
2025-11-21 13:22:03 -05:00
Joey Perrott a30fe81ae8 refactor(docs-infra): improve code efficiency for adding line numbers
Only run the code for adding line numbers if line numbers are required, otherwise skip the code block

(cherry picked from commit 88753d6a5a)
2025-11-21 13:20:49 -05:00
Joey Perrott 557cc41ff0 refactor(docs-infra): remove the unnecessary whitespace using shiki
Use a transformer within shiki to remove the unnecessary whitespace between code lines

(cherry picked from commit a873c4eb1a)
2025-11-21 13:20:49 -05:00
Joey Perrott 121997b8c2 refactor(docs-infra): drop support for providing a file diff in docs-code
Drop support for exposing a diff view in the docs-code element as it is unused and costly to even check for

(cherry picked from commit 8ec0a4ee5c)
2025-11-21 13:20:49 -05:00
Joey Perrott 7f7a2187a8 refactor(docs-infra): use shiki for highlighting
Use shiki to perform highlighting instead of a postprocessing action

(cherry picked from commit fee79e37d5)
2025-11-21 13:20:49 -05:00
Joey Perrott 70195636cc fix(docs-infra): link to the snippet location at the proper commit for examples
Within examples, we now link to the github URL using the commit that was made to create adev, rather than
always on main, which may change over time.

(cherry picked from commit a8f46e598a)
2025-11-21 13:19:55 -05:00
Shuaib Hasan Akib 133baadea1 docs: format example code blocks for consistency and readability and keep only file name in header
(cherry picked from commit 9565938534)
2025-11-21 13:17:20 -05:00
Shuaib Hasan Akib 0e13b4713c docs: clarify strictInputAccessModifiers applies to both input types
Update the strictInputAccessModifiers documentation to clarify that:
- The flag applies to both @Input() decorator and input() signal-based inputs
- The checking only applies to inputs, not outputs
- format interface with fenced block

Fixes docs part of #65243

(cherry picked from commit 34fa11ec9d)
2025-11-21 13:16:12 -05:00
SkyZeroZx 6b6af053f9 docs(docs-infra): update syntax highlighting for inline templates in decorators
Updates syntax highlighting rules to properly handle inline templates defined within decorators, improving readability and consistency in code examples

(cherry picked from commit 1672493d1a)
2025-11-21 13:14:57 -05:00
Shuaib Hasan Akib 444be37b41 docs: Indented the <docs-code> blocks inside numbered list items to ensure correct Markdown rendering and prevent the steps from breaking visually.
- Remove path from header

(cherry picked from commit aafc8e75a1)
2025-11-21 13:14:13 -05:00
Ben Hong 1dfce39775 docs: move aria tabs into content organization category
(cherry picked from commit 8f346ad070)
2025-11-21 12:25:39 -05:00
voi99 9d82c86811 docs(forms): update error class to error-list in signal forms example
(cherry picked from commit 5685e3879c)
2025-11-21 12:23:52 -05:00
Shuaib Hasan Akib 11df3d6ca8 docs: remove unnecessary standalone: true from examples
Standalone components are now the default, so explicitly specifying
`standalone: true` is no longer required. Updated relevant documentation
examples to avoid redundant configuration and keep the guides concise.

(cherry picked from commit f825547353)
2025-11-21 12:23:30 -05:00
Alan Agius 36c967e0ef build: automate GitHub release creation for vscode extension
Update the release script to automatically create a GitHub release and upload the VSIX asset.

Example release: https://github.com/angular/angular/releases/tag/vsix-21.0.0

(cherry picked from commit 74405c7e7a)
2025-11-21 12:22:22 -05:00
Angular Robot 77f059910e build: update bazel dependencies
See associated pull request for more information.
2025-11-21 12:21:20 -05:00
Syam Gadde bc34083d34 fix(compiler-cli): ignore non-existent files
Ignore files that fail fs.exists() rather than throw ENOENT.  Some applications deliberately create "broken" symbolic links that are not relevant to compilation (e.g. emacs lock files that link to owner "user@host").

(cherry picked from commit 1628125bcb)
2025-11-21 11:39:01 -05:00
Shuaib Hasan Akib 1cdcd5a947 docs: fix incorrect Signal Forms link
Updated outdated link guide/forms/signal-forms/ to the correct path guide/forms/signals/ to ensure proper navigation.

Fixes: #65461 #65462
(cherry picked from commit 68f5ceeb46)
2025-11-21 10:55:55 -05:00
Ben Hong 053bf98f57 docs: iterate on signal forms essentials guide
(cherry picked from commit b7d91a796b)
2025-11-21 10:48:04 -05:00
Shuaib Hasan Akib 2f44ede102 docs: add missing ARIA patterns and API reference
Adds the missing ARIA usage patterns and links to the relevant API reference
sections to improve accessibility guidance and ensure examples follow recommended
best practices.

(cherry picked from commit cea19803d8)
2025-11-21 10:18:39 -05:00
Alessio Pelliccione 1925721226 refactor(docs-infra): automate algolia index name based on package version
Previously, the Algolia index name was hardcoded in the configuration, requiring manual updates for every new major release branch.

This commit automates the index name selection by deriving the version directly @angular/core. It dynamically assigns:
- `angular_next_dev` for pre-releases (`-next`, `-rc`) and local snapshots (`0.0.0`).
- `angular_vXX` (e.g., `angular_v19`) for stable releases.

(cherry picked from commit 2ddf26e699)
2025-11-20 19:21:34 -05:00
SkyZeroZx b170aa925b docs: updates code block language tags in signal forms
(cherry picked from commit 889afe9aa2)
2025-11-20 19:20:33 -05:00
Raxabi fd44d7b794 docs: Fix missing single quote in the first navigateByUrl example.
(cherry picked from commit ee57b0f2fa)
2025-11-20 19:19:46 -05:00
marktechson c0a8f0c694 docs: fix update guide typo
The update from 20 to 21 featured the wrong number, this fixes that

(cherry picked from commit c4722820e7)
2025-11-20 19:19:19 -05:00
Alan Agius 70fb1d6cf2 ci: try to resolve vscode extension e2e flakes
Update e2e test runner to VS Code 1.102.0, streamline test activation, and manage temporary directories via `TEST_TMPDIR`.

(cherry picked from commit 1a094ddb2b)
2025-11-20 17:03:18 -05:00
Doug Parker da97099e67 docs: correct v21 LTS end date and v20 active end date
Updated to align the v20 active end date with the v21 release date and fix the v21 LTS to be 1-year after the active period ends.

(cherry picked from commit 2ecdb221d3)
2025-11-20 16:47:29 -05:00
Johannes Hoppe 65c39ea324 docs(core): remove outdated regex template restriction in best-practices.md
Regular expressions in templates are now supported as of Angular 21.

(cherry picked from commit 11da7a65c0)
2025-11-20 16:42:55 -05:00
Charles Lyding b9181f1172 docs: prioritize ng add for Tailwind CSS and clarify manual steps
This commit updates the Tailwind CSS integration guide (`adev/src/content/guide/tailwind.md`) to introduce `ng add tailwindcss` as the primary, automated method for integrating Tailwind CSS.

(cherry picked from commit 396c25ef5a)
2025-11-20 15:00:28 -05:00
Angular Robot 82c085d0b6 docs: update cross-repo adev docs
Updated Angular adev cross repo docs files.
2025-11-20 14:24:05 -05:00
Devin Chasanoff 72197597b9 docs: add v21 event game
(cherry picked from commit b8fa9cc7d5)
2025-11-20 13:27:49 -05:00
Ben Hong cd86de1447 docs: consolidate patterns and iterate on conclusion for angular aria overview
(cherry picked from commit be6f2f066f)
2025-11-20 12:38:22 -05:00
Matthieu Riegler 5467cdcaff docs: backport content from main 2025-11-20 12:37:13 -05:00
JoostK d7484f0519 refactor(core): let the profiler handle asymmetric events leniently
Although the prior commit has made more profiler events guaranteed symmetric
through the use of finally-blocks, there continue to be some situations
that could potentially result in asymmetric events, e.g. application
bootstrap doesn't guarantee symmetric events. This commit makes the profiler
lenient to these situations by unrolling the stack past the asymmetric event
data, eventually reaching the expected start event.

(cherry picked from commit 913cde8ab4)
2025-11-20 12:30:02 -05:00
JoostK a55482fca3 fix(core): notify profiler events in case of errors
Profiler events are expected to be symmetric, yet in the case of errors this symmetry may break
if events aren't always kept in sync with their corresponding start event. This commit moves
various end events to be run from a finally-block, allowing them to notify the profiler even
when an error has occurred.

Fixes #62947

(cherry picked from commit 3760045e3e)
2025-11-20 12:30:02 -05:00
kirjs cc3b4ae701 docs: remove unnecessary @ts-ignore from signal forms playground
The @ts-ignore comment is no longer needed as the module resolution
issue has been fixed in the playground editor configuration.

(cherry picked from commit bea7358225)
2025-11-20 12:26:25 -05:00
marktechson eadc8deaf8 docs: add 20 to 21 update guide
(cherry picked from commit 183d194025)
2025-11-20 11:46:49 -05:00
Wagner Maciel f349a9168b docs: fix standlone menu overlay
(cherry picked from commit 29185a864f)
2025-11-20 11:20:41 -05:00
David Kingma 630a3b29d8 refactor(core): add debugName option to rxjs-interop toSignal
toSignal predates the debugName option for signals to name the signals in the Angular dev-tools This adds the debugName option to toSignal.

(cherry picked from commit 0812ac3bec)
2025-11-20 10:49:54 -05:00
Charles Lyding 2a614aa25c docs: add note about Karma/Jasmine examples in testing services guide
This guide currently contains Karma/Jasmine specific code examples.
Adding a note to inform readers that Vitest equivalents are being worked on.

(cherry picked from commit 80202bffee)
2025-11-20 10:47:37 -05:00
Alessio Pelliccione 8d6d13afd2 fix(docs-infra): prevent icons from being translated in aria guide
This commit adds the `translate="no"` attribute to the icon elements to ensure they are preserved in their original form and not modified by translation tools.

Closes #65406

(cherry picked from commit 42c05650ff)
2025-11-20 10:47:15 -05:00
Ben Hong cf7579f506 docs: add signal forms custom controls guide
Co-authored-by: Leon Senft <leonsenft@users.noreply.github.com>

docs: add signal forms custom controls guide
(cherry picked from commit fc2e414262)
2025-11-20 10:35:01 -05:00
marktechson f31fbdd0b9 docs: adds a link to the signal forms example
(cherry picked from commit 890414245f)
2025-11-20 00:41:05 +00:00
Charles 88559649bb docs: separate Zone.js-specific testing utilities into new guide
This commit moves documentation for Zone.js-dependent testing utilities
(`waitForAsync`, `fakeAsync`, `tick`, `discardPeriodicTasks`, `flushMicrotasks`)
from `testing/utility-apis.md` to a new dedicated guide:
`testing/zone-js-testing-utilities.md`.

(cherry picked from commit e77fb1fb14)
2025-11-20 00:40:38 +00:00
tsc036 2bf0c52775 refactor(core): export profile event as enum and move profile_types.ts and framework to shared devtools folder
move framework enum and profile_types to a shared folder so it can be used by wiz

(cherry picked from commit 34e1fe235f)
2025-11-19 23:22:53 +00:00
Ben Hong dff1233cc1 docs: add signal forms validation guide 2025-11-19 15:18:16 -08:00
Angular Robot e0026c870a build: update cross-repo angular dependencies
See associated pull request for more information.
2025-11-19 15:08:39 -08:00
Joey Perrott 6ead2ce995 build: fix lockfile
Fix the missing lockfile entries
2025-11-19 15:08:06 -08:00
Ben Hong ac54791140 docs: add redirect for angular overview
(cherry picked from commit 4771dc9cf7)
2025-11-19 22:52:42 +00:00
SkyZeroZx cb15142190 docs: Adds documentation for generic type argument to SimpleChanges
(cherry picked from commit e9ba63a4c1)
2025-11-19 22:31:57 +00:00
Joey Perrott a877e8abaa build: update to latest ng-dev tooling for caretaker handoff update
Update to the latest tooling to upate how caretaker handoff is handled, using new standardized groupings

(cherry picked from commit 0bb09dc5ba)
2025-11-19 22:30:20 +00:00
Shuaib Hasan Akib 35dc3ecfda refactor(common): update examples to align with Angular best practices
Updated examples to use the standalone component approach and the latest

(cherry picked from commit c7affdfbc9)
2025-11-19 22:29:53 +00:00
Kristiyan Kostadinov cc1ec09931 perf(core): avoid repeat searches for field directive
The `getControlDirective` is called multiple times, both at init and during each update run. Under the hood it performs a linear search for the `Field` directive.

We can speed this up by finding its index once and reusing it since the array of directive matches is static.

(cherry picked from commit 5e6d8573f4)
2025-11-19 22:28:59 +00:00
Kristiyan Kostadinov 279824c953 refactor(compiler): remove interpolation-related symbols
We removed the ability to customize the interpolation some time ago. These changes remove the remaining code related to them.

(cherry picked from commit 81ce1ba1d9)
2025-11-19 22:28:23 +00:00
Kristiyan Kostadinov 00531864e0 refactor(compiler): remove container blocks config
Removes the ability to specify container blocks when creating an i18n parser. We were only passing in `switch` and it likely won't change.

(cherry picked from commit b6c141bf8b)
2025-11-19 22:28:23 +00:00
Miles Malerba de5fca94c5 fix(forms): run reset as untracked
Run the signal forms `reset()` as untracked so it does not trigger
`effect` to rerun when the model changes

Fixes https://github.com/angular/angular/issues/65322

(cherry picked from commit 7ddf4a6b07)
2025-11-19 22:27:55 +00:00
Alan Agius 47fc721202 refactor: improve release process instructions and vsce login handling
This commit introduces several improvements to the release process:

- Adds a clear warning and instructions to test the extension before merging the release PR
- Removes the explicit `vsce login` command.

(cherry picked from commit 22ad71d752)
2025-11-19 22:22:48 +00:00
Cheng-Hsuan Tsai d9017a4fcc docs: update aria overview page
(cherry picked from commit d2fe8674f1)
2025-11-19 22:11:23 +00:00
Alessio Pelliccione 404e90dd29 docs: add style binding example to style guide
Adds a parallel example for style bindings alongside the existing class binding example, demonstrating the preferred syntax of [style.property] and [style] over [ngStyle] directive.

(cherry picked from commit 7e5fca2608)
2025-11-19 22:09:50 +00:00
Alan Agius 2a38387466 docs: add release document
Adds the initial documentation for the VSCode Angular Language Service release.
2025-11-19 14:08:36 -08:00
Alan Agius f88e950f65 build: add vsce script
Adds a "vsce" script to package.json to facilitate easier VSCE packaging.
2025-11-19 14:08:36 -08:00
Joey Perrott 22f23ee7bc docs: add version 21 to update guide page
(cherry picked from commit 2013261243)
2025-11-19 22:08:10 +00:00
Georgi Serev df37a30924 docs(docs-infra): fix code editor file creation and renaming
Hide the field when the user unfocuses from it; Fill the input with the file name when renaming; Fix file path renaming

(cherry picked from commit 0a33a18fa4)
2025-11-19 22:07:34 +00:00
Ben Hong 1c1b50f180 docs: add signal forms field state management guide
(cherry picked from commit 2ead438634)
2025-11-19 22:07:06 +00:00
Ben Hong 563e505df0 docs: improve instruction for import in signal forms tutorial
(cherry picked from commit fb32a5bafa)
2025-11-19 22:06:16 +00:00
Ben Hong 9e16f0363f docs: add signal forms tutorial
(cherry picked from commit d352484773)
2025-11-19 22:06:15 +00:00
Angular Robot 480e8cfb8c docs: update cross-repo adev docs
Updated Angular adev cross repo docs files.
2025-11-19 14:05:01 -08:00
Devin Chasanoff 4e14a53ab6 docs: add release blog to v21 page
(cherry picked from commit c2317949a8)
2025-11-19 21:34:44 +00:00
Joey Perrott bcab911846 docs: link to v21 blog post in changelog
(cherry picked from commit 1b4d1f88dc)
2025-11-19 21:34:18 +00:00
Jessica Janiuk 685477632f build: bump core zone.js version
this bumps the core dep on zone.js to 0.16.0.

(cherry picked from commit 11ea1a01ff)
2025-11-19 21:22:17 +00:00
Joey Perrott 3d9c82c21d build: provide a specific version of zone.js for the vscode pre standalone test
Use zone.js 0.15.0 specifically instead of moving to a later verison of zone.js for the test

(cherry picked from commit c03883ec54)
2025-11-19 21:07:46 +00:00
Jessica Janiuk 28810e0914 build: bump adev version
Bump adev versions for v21 release

(cherry picked from commit d42d7523ec)
2025-11-19 20:09:29 +00:00
Joey Perrott fe5c9a1e6a release: bump version of in memory web api
(cherry picked from commit 9a663a28f9)
2025-11-19 20:05:54 +00:00
Jessica Janiuk 63a95c7b9e release: cut the v21.0.0 release 2025-11-19 10:07:09 -08:00
Joey Perrott 8b492ce06e docs: update the actively supported versions
Update the actively supported versions table

(cherry picked from commit a51ba9c7a9)
2025-11-19 16:47:51 +00:00
Wagner Maciel f06c1fb834 docs: fix menubar overlay bug
(cherry picked from commit 3e31a9967e)
2025-11-19 16:45:40 +00:00
kirjs ac34824608 fix(docs-infra): add moduleResolution to TypeScript compiler options for playground
This fixes signal forms, but idk if it breas other things

(cherry picked from commit 040af1aaa1)
2025-11-19 16:26:24 +00:00
Cheng-Hsuan Tsai e69855ad13 docs: aria grid replace overview example with a playful one
(cherry picked from commit 1289371474)
2025-11-19 16:18:59 +00:00
Joey Perrott 17b7d56ae9 build: force angular cli to run in non-TTY mode for adev and devapp
Force adev and devapp to run in non-TTY mode so it doesn't create a prompt that can't be interacted with. This will initially have no effect,
but the fix is expected to land in CLI to make this work as expected in the next few days.
2025-11-19 08:14:19 -08:00
Angular Robot 12193b1e36 build: update all github actions
See associated pull request for more information.
2025-11-19 08:13:48 -08:00
Ben Hong 27ef566b98 docs: update aria component api links
(cherry picked from commit d3ea7cbcc9)
2025-11-19 16:12:55 +00:00
Angular Robot 1017cf3b92 build: update bazel dependencies
See associated pull request for more information.
2025-11-19 08:10:35 -08:00
Aristeidis Bampakos 4598ca3766 fix(docs-infra): add install in pnpm
Add missing install option in pnpm command.

(cherry picked from commit 0e1ddce1cb)
2025-11-19 16:10:14 +00:00
Ben Hong 21c126e743 docs: remove redundant labels on aria since section is marked new
(cherry picked from commit 758cd113b3)
2025-11-19 16:08:30 +00:00
Ben Hong ccb0264edb docs: add signal forms playground template
(cherry picked from commit e0eb619c03)
2025-11-19 16:03:57 +00:00
Devin Chasanoff c2c0140532 docs: add v21 banner
(cherry picked from commit 3810422521)
2025-11-19 16:02:18 +00:00
Ben Hong 28c1a2dc72 docs: add signal forms comparison guide
(cherry picked from commit 7a910e66d4)
2025-11-19 01:01:42 +00:00
Matthieu Riegler 36784d70c0 docs: fix docs heading alignment
(cherry picked from commit c7424c8f07)
2025-11-19 01:00:29 +00:00
Ben Hong 012326e914 docs: update angular aria guides structure, subnav menu, and examples
(cherry picked from commit 47eb77ffb1)
2025-11-18 15:29:51 -08:00
Angular Robot 77fc03ffb6 build: update cross-repo angular dependencies
See associated pull request for more information.
2025-11-18 15:29:10 -08:00
Wagner Maciel 21e288963c docs: aria combobox examples
(cherry picked from commit 114c83ed8b)
2025-11-18 14:55:59 -08:00
Wagner Maciel d285ba27a6 docs: aria menubar examples
(cherry picked from commit 695f4df912)
2025-11-18 14:55:59 -08:00
Wagner Maciel dce20b9289 docs: aria menu examples
(cherry picked from commit 1963bd67cc)
2025-11-18 14:55:59 -08:00
Wagner Maciel 903cb23df9 docs: aria tabs examples
(cherry picked from commit 04859b41a2)
2025-11-18 14:55:59 -08:00
Wagner Maciel 363bcb311c docs: aria autocomplete examples
(cherry picked from commit b2080c8fb0)
2025-11-18 14:55:58 -08:00
Andrew Seguin 1355edde69 docs: hide temporary prerender tabs and multifile docs sections
(cherry picked from commit d4595791d6)
2025-11-18 14:54:52 -08:00
Amy Sorto e08a8e2678 docs: update overview page
(cherry picked from commit 111a7644ef)
2025-11-18 14:54:13 -08:00
Shuaib Hasan Akib 73e9700788 docs: format examples with replacing <docs-code> typescript examples with fenced ts code blocks
Update adev/src/content/reference/migrations/cleanup-unused-imports.md

Co-authored-by: Alan Agius <alan.agius4@gmail.com>

Update adev/src/content/reference/extended-diagnostics/NG8102.md

Co-authored-by: Alan Agius <alan.agius4@gmail.com>

Update adev/src/content/reference/extended-diagnostics/NG8103.md

Co-authored-by: Alan Agius <alan.agius4@gmail.com>

Update adev/src/content/reference/extended-diagnostics/NG8103.md

Co-authored-by: Alan Agius <alan.agius4@gmail.com>

Update adev/src/content/reference/extended-diagnostics/NG8103.md

Co-authored-by: Alan Agius <alan.agius4@gmail.com>

Update adev/src/content/reference/migrations/cleanup-unused-imports.md

Co-authored-by: Alan Agius <alan.agius4@gmail.com>

Update adev/src/content/reference/migrations/cleanup-unused-imports.md

Co-authored-by: Alan Agius <alan.agius4@gmail.com>
(cherry picked from commit 27fa993fb8)
2025-11-18 22:11:28 +00:00
Cheng-Hsuan Tsai 40875702b0 docs: add aria tree examples and disable text selection
(cherry picked from commit 24814ce43e)
2025-11-18 22:10:37 +00:00
Andrew Scott 00dcbf2eeb release: bump VSCode extension version to 21.0.0 2025-11-18 14:09:30 -08:00
Angular Robot e43b4dafbf build: update cross-repo angular dependencies
See associated pull request for more information.
2025-11-18 11:17:30 -08:00
Cheng-Hsuan Tsai 646d3a0df5 docs: add aria grid examples
(cherry picked from commit d0877a524a)
2025-11-18 19:14:58 +00:00
Cheng-Hsuan Tsai ff6e9c0b7b docs: add aria accordion examples
(cherry picked from commit c639f84347)
2025-11-18 19:14:30 +00:00
Cheng-Hsuan Tsai afc25d1f70 docs: add aria tree examples
(cherry picked from commit 41e9c7b4bf)
2025-11-18 19:13:55 +00:00
Nicolò Polazzi fdb8671493 docs: correct inconsistencies in signals tutorial
(cherry picked from commit 661a554b8d)
2025-11-18 19:11:29 +00:00
Angular Robot 56ba2c8344 build: lock file maintenance
See associated pull request for more information.
2025-11-18 08:17:14 -08:00
Shuaib Hasan Akib ab119a8bad docs: simplify docs-code header by removing paths and keeping only file name and info
(cherry picked from commit 374c36d810)
2025-11-18 16:15:46 +00:00
Shuaib Hasan Akib 6c3840b620 docs: replace legacy <docs-code> with fenced code blocks with highlight metadata
Replaced older <docs-code> components (e.g.
<docs-code language="ts" highlight="3">…</docs-code>)
with modern fenced code blocks using {highlight:[3]} metadata

(cherry picked from commit 0182939d5e)
2025-11-18 16:15:05 +00:00
Devin Chasanoff bc1eb6932f docs: add AI tutor instructions
(cherry picked from commit 631035a2e0)
2025-11-18 16:14:37 +00:00
Angular Robot 1b43bfbbab build: update cross-repo angular dependencies
See associated pull request for more information.
2025-11-17 16:35:53 -08:00
Angular Robot 9400afa5ba build: update cross-repo angular dependencies to v21.0.0-rc.3
See associated pull request for more information.
2025-11-17 15:20:16 -08:00
SkyZeroZx 97237483c7 docs: replace @HostListener with host event bindings in attribute directives
(cherry picked from commit c93d02151a)
2025-11-17 23:09:16 +00:00
ljasek cd74b94e9f docs: fix JetBrains AI Assistant MCP JSON configuration
(cherry picked from commit 6d35ab8c28)
2025-11-17 23:08:19 +00:00
hawkgs 91de09423c fix(devtools): refine when signal graph button is shown
Show the signal graph button only when a signal-graph-eligible node from the directive explorer is selected; Fix client app error when a `defer` node is selected (related)

(cherry picked from commit e7a6e31a70)
2025-11-17 22:45:05 +00:00
aparziale 5ffc906dbe docs(docs-infra): add advanced recommendations
Added recommendation in advanced section for redirectTo and canMatch will generate an error. These properties are incompatible together

fixes #65267

(cherry picked from commit c757fd6c29)
2025-11-17 22:40:13 +00:00
Alan Agius 414191e87e build: improve vscode-ng-language-service release process
This commit improves the release process for the vscode-ng-language-service by adding automated changelog generation and updating the package.json version.
2025-11-17 14:35:12 -08:00
Paul Leflon 123464a304 docs: fix markdown table in custom elements guide
(cherry picked from commit f13159f811)
2025-11-17 22:33:37 +00:00
Angelo Parziale cd7dee3fc3 refactor: convert docs-code blocks to inline TypeScript documentation
This PR converts the custom <docs-code> blocks to standard Markdown code blocks with TypeScript syntax highlighting.

(cherry picked from commit 7a2d5116f2)
2025-11-17 22:33:03 +00:00
Jessica Janiuk f279aabfb8 release: cut the v21.0.0-rc.3 release 2025-11-17 13:39:05 -08:00
Angular Robot e8f238a26c build: update cross-repo angular dependencies
See associated pull request for more information.
2025-11-17 11:47:21 -08:00
Cheng-Hsuan Tsai 5e66675bb0 docs(docs-infra): fix broken code tabs
When `<mat-tab-group>` is conditionally removed by `@if` it loses the
`<mat-tab>` projected content somehow.

(cherry picked from commit d104acb286)
2025-11-17 19:45:22 +00:00
Joey Perrott 6551b65172 docs: update examples to latest Angular
Updates the adev examples to use Angular 21.0.0-rc.2

(cherry picked from commit 7e70682f2b)
2025-11-17 19:18:01 +00:00
Joey Perrott b7e91839b6 Revert "ci: remove cache usage from pr.yml"
This reverts commit 3760feb5ec.

(cherry picked from commit 25546f6152)
2025-11-17 19:08:57 +00:00
Joey Perrott 655dacd0e4 ci: remove cache usage from ci.yml
Remove the @actions/cache usages from ci.yml

(cherry picked from commit cf07486532)
2025-11-17 19:08:57 +00:00
Angular Robot 652d719388 build: update cross-repo angular dependencies
See associated pull request for more information.
2025-11-17 10:58:30 -08:00
Angular Robot 1a7b854cfe docs: update cross-repo adev docs
Updated Angular adev cross repo docs files.
2025-11-17 10:57:39 -08:00
Wagner Maciel 7483c961b5 docs: aria listbox examples (#65273)
PR Close #65273
2025-11-17 18:39:01 +00:00
Wagner Maciel 0322f02fe5 docs: multiselect examples (#65273)
PR Close #65273
2025-11-17 18:39:00 +00:00
Wagner Maciel 92c81b862d docs: aria select skins (#65273)
docs: select examples

PR Close #65273
2025-11-17 18:39:00 +00:00
Wagner Maciel a2d6318906 docs: aria toolbar examples (#65273)
docs: aria toolbar retro example

docs: aria toolbar material example

docs: organize aria toolbar examples

docs: vertical examples

docs: final aria toolbar examples

docs: wip aria toolbar docs

PR Close #65273
2025-11-17 18:39:00 +00:00
Ben Hong 68cbcaec93 docs: add aria menubar component guide
(cherry picked from commit 9b87689558)
2025-11-17 18:38:28 +00:00
Jessica Janiuk 210f5ea5ec Revert "docs: replace legacy <docs-code> with fenced code blocks with highlight metadata"
This reverts commit c5c1689348.

(cherry picked from commit b2171c6c14)
2025-11-17 18:37:00 +00:00
Jessica Janiuk 127cadd3fc Revert "refactor(core): let the profiler handle asymmetric events leniently"
This reverts commit da9911f2b4.

(cherry picked from commit 88dfd96ec9)
2025-11-17 18:10:41 +00:00
Jessica Janiuk e430d69603 Revert "fix(core): notify profiler events in case of errors"
This reverts commit af1ba52587.

(cherry picked from commit adc2a57be0)
2025-11-17 18:10:41 +00:00
Matthew Beck ecea909bcc fix(compiler): don't choke on unbalanced parens in declaration block
Following https://github.com/angular/angular/pull/64509 we started
choking on unbalanced closing parentheses in declaration blocks,
specifically in quoted background-image urls. This was reported in
https://github.com/angular/angular/issues/65137.

This occured because we previously (and now again) traverse the entire
declaration block when selecting for :host-context() selectors to shim.
This is an oddity of how we parse styles today, and is likely something
we'd want to remove if we parsed selectors properly.

This change adds a new flag to _splitOnTopLevelCommas which allows it to
continue past unbalanced closing parentheses in the declaration block,
returning _convertColonHostContext to its previous behavior while
keeping support for the extra nesting in :host-context().

(cherry picked from commit 9e7ddcaa10)
2025-11-17 17:46:04 +00:00
Matthieu Riegler 035e07e3be refactor(core): promote the custom track profiler to stable.
We didn't get much report on the feature itself so we feel confident about promoting it to stable. In parallel we'll also land #62959 but one is not blocking the other.

fixes #64996

(cherry picked from commit c15836c8c7)
2025-11-17 17:42:35 +00:00
Matthieu Riegler 91d8d55a80 fix(forms): Set error message of a schema error.
Use the error message of the issue as the error message of the error itself.

fixes #65247

(cherry picked from commit b41a94bc85)
2025-11-17 17:41:57 +00:00
Miles Malerba 6aa4b7ea63 refactor(forms): avoid console warnings when setting NaN
It can be useful for a developer to set `NaN` as the value for a number
input, as a way to say "clear the input". However, directly setting this
value to the `.valueAsNumber` causes a console warning. This PR fixes
the console warning by just doing `.value = ''` when we would otherwise
to `.valueAsNumber = NaN`

(cherry picked from commit f47637426f)
2025-11-17 17:41:32 +00:00
Leon Senft e682f00e29 refactor(forms): reduce boilerplate needed to define custom controls
An early piece of feedback received regarding custom controls hosted on
native inputs was that they required a lot of boilerplate to bind
`FieldState` properties. Each property required an input to accept the
property, and a host binding to forward it to the native control.

(cherry picked from commit c727df5d38)
2025-11-17 17:41:02 +00:00
JoostK 780e37241f refactor(core): let the profiler handle asymmetric events leniently
Although the prior commit has made more profiler events guaranteed symmetric
through the use of finally-blocks, there continue to be some situations
that could potentially result in asymmetric events, e.g. application
bootstrap doesn't guarantee symmetric events. This commit makes the profiler
lenient to these situations by unrolling the stack past the asymmetric event
data, eventually reaching the expected start event.

(cherry picked from commit da9911f2b4)
2025-11-17 17:40:10 +00:00
JoostK 7ada2519f1 fix(core): notify profiler events in case of errors
Profiler events are expected to be symmetric, yet in the case of errors this symmetry may break
if events aren't always kept in sync with their corresponding start event. This commit moves
various end events to be run from a finally-block, allowing them to notify the profiler even
when an error has occurred.

Fixes #62947

(cherry picked from commit af1ba52587)
2025-11-17 17:40:10 +00:00
Joey Perrott cc621ea634 ci: remove cache usage from pr.yml
Remove the @actions/cache usages from pr.yml

(cherry picked from commit 3760feb5ec)
2025-11-17 17:29:52 +00:00
Cheng-Hsuan Tsai b5cd4522d9 docs(docs-infra): aria attribute typo
(cherry picked from commit 4dc226231c)
2025-11-17 17:29:29 +00:00
Cheng-Hsuan Tsai ac4a95e364 docs: add aria grid basic examples: pill list, calendar, and table
(cherry picked from commit 35d8654a02)
2025-11-17 17:29:06 +00:00
Shuaib Hasan Akib f340398141 docs: replace <docs-code> shell examples with fenced shell code blocks
Updated shell command examples to use fenced code blocks (```shell) instead of <docs-code> components, improving formatting consistency and aligning with current documentation standards.

(cherry picked from commit dff9d12bc3)
2025-11-17 17:28:43 +00:00
Cheng-Hsuan Tsai 16abc8a0d5 docs(docs-infra): set max-height to code example
(cherry picked from commit 138e65356b)
2025-11-17 17:28:19 +00:00
SkyZeroZx a7dddcca51 docs: Adds links to relevant guides for APIs in core package
(cherry picked from commit 0432e76171)
2025-11-17 16:47:40 +00:00
SkyZeroZx 697f3616b1 docs: add documentation for HostAttributeToken
(cherry picked from commit d70310896c)
2025-11-17 16:47:03 +00:00
SkyZeroZx 00ffe91c89 refactor(common): removes unused NgModuleFactory config in NgComponentOutlet
Removes the `ngComponentOutletNgModuleFactory`  in `_needToReCreateNgModuleInstance`

(cherry picked from commit 24243e34d9)
2025-11-17 16:46:12 +00:00
Alessio Pelliccione 363a0ddb8b fix(devtools): ensure external docs link opens correctly from extension popup
Adds target="_blank" and rel="noopener noreferrer" to prevent tab-nabbing and follow modern security best practices.

(cherry picked from commit 1aed9408a4)
2025-11-17 16:45:37 +00:00
Shuaib Hasan Akib 8e03261a58 docs: replace legacy <docs-code> with fenced code blocks with highlight metadata
Replaced older <docs-code> components (e.g.
<docs-code language="ts" highlight="3">…</docs-code>)
with modern fenced code blocks using {highlight:[3]} metadata

(cherry picked from commit c5c1689348)
2025-11-17 16:43:41 +00:00
Alessio Pelliccione 5308d83cbd docs(docs-infra): update ARIA binding guidance and remove outdated attr. prefix requirement
(cherry picked from commit bc03c45b60)
2025-11-17 16:43:03 +00:00
Shuaib Hasan Akib 1aaeb98411 docs: replace <docs-code> bash examples with fenced bash code blocks
Updated bash command examples to use fenced code blocks (```bash) instead of <docs-code> components, improving formatting consistency and aligning with current documentation standards.

(cherry picked from commit 7ea60052f0)
2025-11-17 16:42:27 +00:00
hawkgs 30125eeb27 fix(devtools): show profiler exec details only if there are directives
Show the execution details of a captured frame entry only if there are recorded directives.

(cherry picked from commit 68d823a241)
2025-11-17 16:39:39 +00:00
hawkgs cf0552ffa0 fix(devtools): don't round decimal vals previews in the state serializer
The actual numerical data can only be checked in the prop edit mode. This fixes that and makes the real value visible all the time.

(cherry picked from commit d6be289603)
2025-11-17 16:39:13 +00:00
Alessio Pelliccione 67c06a4c12 fix(devtools): forward Angular detection to background
Ensure the content script forwards Angular detection results to the service worker so the popup/icon reflects the page state.

(cherry picked from commit 7d41716703)
2025-11-17 16:38:23 +00:00
hawkgs 7497ad4302 refactor(devtools): increase font weight in the demo app
Increase the global font weight to `500`.

(cherry picked from commit 6fdb12357f)
2025-11-17 16:37:58 +00:00
Leon Senft d89e522a1f fix(forms): debounce updates from interop controls
* Apply any debounce rules to updates from interop controls (if configured).
* Add tests to ensure debouncing works for all control types (native, custom,
  and interop).

(cherry picked from commit b1037ec2f0)
2025-11-17 16:37:29 +00:00
Shuaib Hasan Akib 2bfd841611 docs: replace <docs-code> shell examples with fenced shell code blocks
Updated shell command examples to use fenced code blocks (```shell) instead of components, improving formatting consistency and aligning with current documentation standards.

(cherry picked from commit 576f9ba889)
2025-11-17 16:35:20 +00:00
Shuaib Hasan Akib 70736309f5 docs: improve accessibility with descriptive link and main landmark
- Replaced <a><button></button></a> with a proper <a> containing text and
  aria-label to ensure links have discernible text.

- Added main tag in home page to provide
  a consistent main landmark, improving accessibility for screen readers
  and satisfying WCAG and Lighthouse requirements.

Fixes #65181.

(cherry picked from commit ee5947db38)
2025-11-17 16:32:05 +00:00
Shuaib Hasan Akib c03b1fa8a0 fix(docs-infra): add bash language support for shell prompt rendering
Code blocks with `bash` language identifier were not rendering the `$`
prefix, while `shell` blocks did.

This ensures consistent command-line prompt rendering across both
`bash` and `shell` code blocks in the documentation.

(cherry picked from commit f462684211)
2025-11-17 16:31:31 +00:00
Shuaib Hasan Akib 5f8f007cca docs(docs-infra): simplify file headers in <docs-code> blocks
Removed redundant "src/app/" prefix from file headers (e.g.
"src/app/open-close.component.ts" → "open-close.component.ts")
to keep examples concise and avoid unnecessary path noise.

Aligns with prior cleanup patterns (similar to angular#65016).

(cherry picked from commit 073dcd7ffd)
2025-11-17 16:30:35 +00:00
SkyZeroZx 02061d4b81 docs: add documentation for DOCUMENT injection token usage in SSR
(cherry picked from commit 846d50ab23)
2025-11-17 16:28:05 +00:00
Angelo Parziale b770d39493 docs(docs-infra): add npm link documentation for library development
Add comprehensive guide for using npm link with Angular libraries, including required angular.json.

(cherry picked from commit a458a83133)
2025-11-17 16:26:02 +00:00
Angular Robot d591a64122 build: update bazel dependencies
See associated pull request for more information.
2025-11-17 08:24:23 -08:00
Aristeidis Bampakos 97c18819fa docs: use the new format for the X account
(cherry picked from commit 73295b1087)
2025-11-17 16:22:24 +00:00
Angular Robot 9adc71afef docs: update cross-repo adev docs
Updated Angular adev cross repo docs files.
2025-11-17 08:21:28 -08:00
Charles Lyding 59543d6b19 docs: add bun package manager and standardize order in testing guides
This commit updates the testing documentation to include `bun` as a package manager option in all relevant code examples.

Additionally, it standardizes the presentation of package manager commands by:
- Consistently using a multi-tab format (`<docs-code-multifile>`).
- Enforcing a consistent order: `npm`, `yarn`, `pnpm`, `bun`.

These changes improve the user experience by providing clear instructions for multiple package managers and ensuring consistency across the testing guides.

(cherry picked from commit 599b72ec5a)
2025-11-17 16:11:26 +00:00
Charles Lyding b43ed852dd docs: update testing guides for Vitest and reorder navigation
This commit updates the unit testing, code coverage, and debugging guides to align with the Vitest test runner, which is now the default for new Angular CLI projects.

Key changes include:
- **Unit Testing Overview**: Revised to focus on Vitest, including details on DOM emulation (jsdom/happy-dom), browser testing setup, and custom Vitest configuration via `runnerConfig`. A prominent note links to the Karma-to-Vitest migration guide.
- **Code Coverage**: Updated to reflect Vitest-specific prerequisites (`@vitest/coverage-v8`), command-line flags, and `angular.json` configuration for coverage reporting and threshold enforcement.
- **Debugging**: Completely rewritten to provide instructions for debugging Vitest tests in both Node.js and browser environments using the `--debug` flag.
- **Navigation Reordering**: The 'Testing' section in `sub-navigation-data.ts` has been reordered to present a more logical educational flow, starting with core concepts and progressing to advanced topics and migration.

(cherry picked from commit f5a7719373)
2025-11-17 16:11:26 +00:00
Ben Hong f62e2b599f docs: add draft aria component guides (pt 2)
(cherry picked from commit c61a195391)
2025-11-17 16:09:14 +00:00
portneon 7928ff1637 docs(router): update navigation event example to use event.code
(cherry picked from commit 93d548fba4)
2025-11-17 16:08:33 +00:00
Cheng-Hsuan Tsai 7020ef6c60 docs(docs-infra): make show code button more discoverable when collapsed
(cherry picked from commit 48cff8c128)
2025-11-17 16:07:06 +00:00
hawkgs 97a6f9fd4f docs(docs-infra): fix misaligned tutorials card
Fix the "Deferrable views" illustration which fixes the aligned within the `docs-card`.

(cherry picked from commit 6bfe107404)
2025-11-17 16:06:37 +00:00
Kristiyan Kostadinov 7ec9f357f4 fix(docs-infra): prevent example resets from affecting CDK
The example viewer has some `::ng-deep` styles that are used to reset global styles that leak into the live examples. It works by applying a style like `.docs-example-viewer-preview * {all: revert;}`.

The problem with this is that depending on when the first example is rendered, the styles will be lower or higher in the cascade, thus making the reset unreliable. Furthermore, it can affect structural styles from the CDK which intentionally have low specificity.

These changes move the resets into the global stylesheet to make them more predictable.

(cherry picked from commit 1ba50caefc)
2025-11-17 16:05:15 +00:00
Angular Robot 63ca0de1ec build: update dependency bazel to v7.7.1
See associated pull request for more information.
2025-11-17 08:01:00 -08:00
Shuaib Hasan Akib d365024444 docs(docs-infra): simplify file headers in <docs-code> blocks
Removed redundant "src/app/" prefix from file headers (e.g.,
"src/app/open-close.component.ts" → "open-close.component.ts")
to make code examples cleaner and more focused.

(cherry picked from commit b3adb6001c)
2025-11-17 16:00:25 +00:00
Charles Lyding 31ae88f411 docs: standardize package manager commands in guides
This commit updates the elements and tailwind guides to use the standardized `docs-code-multifile` format for package manager commands. This change introduces `yarn`, `pnpm`, and `bun` alternatives to the existing `npm` commands, providing a consistent experience for users across different package managers.

(cherry picked from commit 6208016026)
2025-11-17 15:59:53 +00:00
Angular Robot 0f5c0dae51 docs: update cross-repo adev docs
Updated Angular adev cross repo docs files.
2025-11-17 07:58:36 -08:00
Angular Robot 74b95dec3b build: update cross-repo angular dependencies
See associated pull request for more information.
2025-11-14 15:35:56 -08:00
SkyZeroZx a315afbfd3 docs: add formArray clear() example clarifies array manipulation
(cherry picked from commit c1057c69f0)
2025-11-14 23:30:52 +00:00
Miles Malerba e1a7c35370 refactor(forms): improve typing on min & max (#65212)
If we're calling `min` on a path that's guaranteed to be `number` we
don't want to make the users validator function handle the `null` or
`string` cases.

This uncovered an issue in the `SchemaTreePath` type which needed to be
fixed by preventing the model type from being distributed over.

PR Close #65212
2025-11-14 21:56:58 +00:00
Miles Malerba ff4633dab8 refactor(forms): allow passing number|string|null paths to min & max (#65212)
Relaxes the constraints on which paths can be used with the `min` &
`max` validation rules, since people may want to validate a
potentially-null number, or a numeric value represented as a string

PR Close #65212
2025-11-14 21:56:58 +00:00
Wagner Maciel 05cf14ba44 docs: aria toolbar examples
(cherry picked from commit a99e724c60)
2025-11-14 21:56:16 +00:00
Angular Robot ad0c059bb2 build: update cross-repo angular dependencies
See associated pull request for more information.
2025-11-14 13:55:52 -08:00
Cheng-Hsuan Tsai 3228cce727 docs(docs-infra): enable tabs layout
(cherry picked from commit de234def0e)
2025-11-14 20:24:05 +00:00
Ben Hong 8a5b284ef5 docs: add draft of aria component guides
(cherry picked from commit 8b59653788)
2025-11-14 19:26:50 +00:00
Miles Malerba 966bfae337 build(forms): expose signal forms compat package
Hooks up @angular/forms/signals/compat to be released and have its docs
published

(cherry picked from commit fc1ef79ad4)
2025-11-14 17:23:39 +00:00
Angular Robot 911999e75b docs: update cross-repo adev docs
Updated Angular adev cross repo docs files.
2025-11-14 08:53:42 -08:00
cexbrayat f550f4ab4a docs: ExperimentalIsolatedShadowDom mentions
(cherry picked from commit c137f1fe91)
2025-11-14 16:41:16 +00:00
cexbrayat 1a8dbd79e6 docs: FormArrayDirective mentions
(cherry picked from commit b0dd813664)
2025-11-14 16:40:44 +00:00
Kristiyan Kostadinov 4dda271985 refactor(compiler-cli): split up large file
The `type_check_block.ts` file was getting quite large and difficult to navigate. These changes split up the different pieces of functionality into separate files.

(cherry picked from commit 81bd455de8)
2025-11-14 16:40:14 +00:00
Leon Senft 8e988124ab test(forms): [field] inputs on components should just pass through
Test that a component with a bound `[field]` input is not treated as a
control, and that `fieldBinding` does not include the corresponding
`Field` instance.

(cherry picked from commit acb78eeb7a)
2025-11-14 16:37:45 +00:00
Angular Robot 513c5f5d1c build: update pnpm to v10.22.0
See associated pull request for more information.
2025-11-14 08:35:37 -08:00
Angular Robot 84bf0d26bf build: update cross-repo angular dependencies
See associated pull request for more information.
2025-11-14 08:33:42 -08:00
SkyZeroZx 8481939f5b docs: Uses the self-closing tag syntax
(cherry picked from commit 9ec964334e)
2025-11-14 16:32:40 +00:00
KAUSHIK REDDY AWALA 167eb584ed docs(docs-infra): update di factory provider function to use correct parameters
This PR fixes a parameter mismatch in the `apiClientFactory` function documentation example. The factory was previously passing only http and `userService` to the ``ApiClient`` constructor, but the constructor actually requires http, `baseUrl`, and `rateLimitMs` as separate parameters.

Key Changes:

Extracts baseUrl and rateLimitMs from UserService using getter methods
Updates the ApiClient instantiation to pass all three required constructor parameters
Adds a comment explaining the assumption about UserService providing these values

(cherry picked from commit 6f716e400e)
2025-11-14 16:32:12 +00:00
Alan Agius 4fb29588cf fix(docs-infra): update firebase caching regex for generated files
The regex for caching generated files in firebase.json has been updated to
include lowercase letters and underscores in the 8-character hash. This
ensures that files with names like `chunk-CrXHmw_W.js` are correctly
cached.

(cherry picked from commit e840cd547d)
2025-11-14 08:29:06 -08:00
Ben Hong c2a52fd278 docs: add aria toolbar component guide 2025-11-13 16:02:14 -08:00
Cheng-Hsuan Tsai afeba79ac8 docs(docs-infra): hide file tabs when code example is hidden
(cherry picked from commit 6d8c3fc888)
2025-11-13 23:58:14 +00:00
Ben Hong 750da17f48 docs: add signal forms models guide 2025-11-13 15:41:36 -08:00
Angular Robot d7101de374 build: update cross-repo angular dependencies
See associated pull request for more information.
2025-11-13 15:23:10 -08:00
Angular Robot 99945bf9a5 docs: update cross-repo adev docs
Updated Angular adev cross repo docs files.
2025-11-13 15:21:55 -08:00
Joey Perrott 4b0f20830b ci: use hardcoded global approvers group
Use a single hardcoded, within the pullapprove config file, group for global approvers instead of leveraging a github team as a group
2025-11-13 15:13:25 -08:00
Alessio Pelliccione 482e1376e9 docs(docs-infra): improve theme picker accessibility and add animations
(cherry picked from commit 25320ae1eb)
2025-11-13 22:05:12 +00:00
Matthieu Riegler 16d51f6fbe refactor(core): flip ngDevMode condition for formatter
In cases the `ngDevMode` flag hasn't been set, still enable the formatter. What matters is if `ngDevMode` is `false ` we tree shake that away.

(cherry picked from commit 1b895fece6)
2025-11-13 18:01:13 +00:00
SkyZeroZx 9950165145 docs: adds guide references to router APIs
Adds `@see` tags with links to relevant guides in the router documentation.

(cherry picked from commit 718eb7bb3a)
2025-11-13 18:00:24 +00:00
Leon Senft 37463525be refactor(forms): use AbortSignal to cancel debounced updates
Add an `AbortSignal` parameter to `Debouncer`. Implementations may
choose to accept this parameter to be informed when a debounced
operation is aborted. This may be useful for canceling pending timers or
avoiding unnecessary work.

(cherry picked from commit 98ce9a7b17)
2025-11-13 17:59:22 +00:00
Angular Robot 2406172d50 docs: update cross-repo adev docs
Updated Angular adev cross repo docs files.
2025-11-13 09:45:50 -08:00
Matthieu Riegler 4f6f9b8e8d docs(docs-infra): Add support for metadata on fenced code blocks
This will help us replace `docs-code` with inline code usages and prevent future indentation issues

(cherry picked from commit f737a9dd5c)
2025-11-13 17:36:17 +00:00
Ben Hong 119be3488e docs: add signal forms overview guide 2025-11-13 09:35:53 -08:00
Shuaib Hasan Akib c12f0159f9 docs: replace <docs-code> block with standard fenced code block for typescript example
Replaced the <docs-code> wrapper with a Markdown fenced code block to improve
copy/paste usability, syntax highlighting consistency, and alignment with current
documentation formatting standards.

Inspired by #65043

(cherry picked from commit 3cfd4361a5)
2025-11-13 17:34:15 +00:00
Kristiyan Kostadinov 67fbd5ff1e fix(core): SSR error in signal forms
Resolves an SSR error, because we weren't checking if `MutationObserver` is available.

(cherry picked from commit 3f80ae74ba)
2025-11-13 17:12:45 +00:00
Matthieu Riegler 0c27954a4d refactor(core): remove resource flag.
This was used to migrate G3 and is no longer necessary.

(cherry picked from commit d1ab73dd87)
2025-11-13 17:12:22 +00:00
Shuaib Hasan Akib c7df828c48 docs: replace <docs-code> block with standard fenced code block for typescript example
Replaced the <docs-code> wrapper with a Markdown fenced code block to improve
copy/paste usability, syntax highlighting consistency, and alignment with current
documentation formatting standards.

Inspired by angular#65043

(cherry picked from commit caaa5ec8e6)
2025-11-13 17:11:26 +00:00
Charles Lyding 50938b786e docs: create Vitest migration guide
This commit introduces a new guide for migrating existing Angular projects from Karma/Jasmine to Vitest.

The guide covers:
- Manual steps for installing dependencies and updating `angular.json`.
- Handling custom `karma.conf.js` configurations.
- Removing Karma-related files and packages.
- Configuring browser mode for Vitest.
- Details on the `refactor-jasmine-vitest` schematic for automated test refactoring.

The guide also clarifies that while Vitest is the default for new projects, migration for existing projects is experimental. It emphasizes reviewing changes and provides guidance on adapting custom Karma configurations to Vitest.

Renames `experimental-unit-test.md` to `migrating-to-vitest.md` and updates `sub-navigation-data.ts` accordingly.

(cherry picked from commit 258c295b92)
2025-11-13 17:10:59 +00:00
Angular Robot 2606b6e938 build: update cross-repo angular dependencies
See associated pull request for more information.
2025-11-13 09:09:10 -08:00
hawkgs c133f48902 docs(docs-infra): improve playground layout
Improve the layout and optimize the empty space; Introduce some minor improvements to the code editor

(cherry picked from commit 7ab1b3a32a)
2025-11-13 17:07:58 +00:00
SkyZeroZx 31ca56aa20 docs: Fixed mermaid diagram node label contrast in dark mode
(cherry picked from commit b6a91d4c39)
2025-11-12 23:01:40 +00:00
Kristiyan Kostadinov be371292f2 refactor(compiler-cli): rework type checking for signal forms
Reworks the way we approach type checking of signal forms to be closer to the behavior at runtime. There are a couple of scenarios that we handle:

1. For native controls, we now produce simplified type checking code that looks as follows:

```
var t1 = null! as number | string; // Type depends on the input `type`.
t1 = someField().value();
```

2. For custom controls we generate bindings to the individual inputs, rather than checking conformance against `FormValueControl`/`FormCheckboxControl`. This is closer to the behavior at runtime and it allows us to handle generic directives properly.

(cherry picked from commit f7e58577a4)
2025-11-12 21:13:51 +00:00
Kristiyan Kostadinov afda85f24c refactor(core): remove unused type
Removes the `ExtractFromControlValue` type since it won't be necessary anymore.

(cherry picked from commit 14152f69b9)
2025-11-12 21:13:51 +00:00
SkyZeroZx 4d8b97627c docs: update tutorials with self-closing tags, standalone router directives, and fix syntax highlighting
(cherry picked from commit 4544135b1e)
2025-11-12 21:13:27 +00:00
Angular Robot eb9034d4a8 build: update cross-repo angular dependencies
See associated pull request for more information.
2025-11-12 11:56:11 -08:00
SkyZeroZx dc11db1f37 docs: correct example for RouteReuseStrategy getRouteKey
Update the example to properly demonstrate the getRouteKey method usage fixes #65021

(cherry picked from commit a48029b810)
2025-11-12 19:49:08 +00:00
Angular Robot 16f2c5529a docs: update cross-repo adev docs
Updated Angular adev cross repo docs files.
2025-11-12 11:48:42 -08:00
SkyZeroZx 129e16dc86 docs: correct code block language in error handling and signals interop
(cherry picked from commit 05ef2a5ca9)
2025-11-12 19:35:14 +00:00
Angular Robot 1021b7a394 build: update cross-repo angular dependencies
See associated pull request for more information.
2025-11-12 11:32:20 -08:00
Angular Robot 18cc2606e3 build: update bazel dependencies
See associated pull request for more information.
2025-11-12 09:41:42 -08:00
Angular Robot 8636f8aa83 build: update pnpm to v10.21.0
See associated pull request for more information.
2025-11-12 09:38:59 -08:00
Ben Hong 4f936cafda docs: iterate on essentials signal forms guide 2025-11-12 09:37:15 -08:00
Ben Hong d02374a45c docs: iterate on signal forms essential guide 2025-11-12 09:37:15 -08:00
Alan Agius a55a96a5fb build: allow any version of @angular/* packages for peer dependencies
This change configures pnpm to allow any version of  `@angular/*` packages to satisfy peer dependencies. This is necessary because `@angular/*` packages are managed within this monorepo, and this rule prevents issues with peer dependency resolution when different versions might be present during development or testing.

(cherry picked from commit 46099910c0)
2025-11-12 09:36:01 -08:00
Andrew Kushnir 909588e57f release: cut the v21.0.0-rc.2 release 2025-11-12 08:39:31 -08:00
Danny Koppenhagen c05cf4145b refactor(core): render additional WAI-ARIA 1.3 property bindings as attributes
Support additional ARIA properties from Accessible Rich Internet Applications (WAI-ARIA) version 1.3.

| attribute | property |
|-----------|----------|
| `aria-activedescendant`           | `ariaActiveDescendantElement` |
| `aria-colindextext`           | `ariaColIndexText` |
| `aria-controls`           | `ariaControlsElements ` |
| `aria-describeyby`           | `ariaDescribedByElements ` |
| `aria-description`           | `ariaDescription` |
| `aria-details`           | `ariaDetailsElements ` |
| `aria-errormessage`           | `ariaErrorMessageElements ` |
| `aria-flowto`           | `ariaFlowToElements ` |
| `aria-labelledby`           | `ariaLabelledByElements ` |
| `aria-owns`           | `ariaOwnsElements ` |
| `aria-rowindextext`           | `ariaRowIndexText ` |

closes #64847

(cherry picked from commit c3e82fb2d5)
2025-11-11 14:09:02 -08:00
Matthew Beck 814b2713f5 fix(compiler): support complex selectors in :nth-child()
:nth-child() (and its siblings) support complex expressions, e.g.
`:nth-child(2n of :is(.foo, .bar))`. Previously we'd choke because of
the `:is()`. Now, we reuse the `_parenSuffix` subexpression to match
nested parentheses the same way we do for :host() and :host-context().
Note that we only support 3 levels of nesting, so a selector like
`:nth-child(n of :is(:has(:not(.foo))))` will still break.

I'll say yet again that we really should add a proper parser so we stop
getting bug reports like this :)

Fixes #64913

(cherry picked from commit 24cfd5a0ed)
2025-11-11 14:03:37 -08:00
Alan Agius 7811d95b89 refactor(core): improve resource loading with async/await
Refactor  to use async/await for clearer asynchronous operations and enhanced error handling.
Simplify resource caching and streamline the resolution of component templates and styles.
Update  in the router to align with the new async resource resolution.

(cherry picked from commit 4ed8781301)
2025-11-11 12:50:19 -08:00
Andrew Scott e5b0a9739c Revert "feat(service-worker): notify clients about version failures (#62718)"
This reverts commit 6d011687ec.

issue #63500 reproduces at head on the main branch in the dev app.
Reverting this change along resolves it.

fixes https://github.com/angular/angular/issues/63500

(cherry picked from commit 4af408afcb)
2025-11-11 12:48:49 -08:00
Leon Senft a278ee358c feat(forms): add debounce() rule for signal forms
The `debounce()` rule allows developers to control when changes to a
form control are synchronized to the form model.

This feature necessitated some changes to `FieldState`:

  * `controlValue` is a new signal property that represents the current
    value of a form field as it appears in its corresponding control.

  * `value` conceptually remains unchanged; however, its value may lag
    behind that of `controlValue` if a `debounce()` rule is applied.

The `debounce()` rule essentially manages when changes to `controlValue` are
synchronized to `value`. The intent is that an expensive or slow
validation rule can react to the debounced `value`, rather than a more
frequently changing `controlValue`.

Directly updating `value` immediately updates `controlValue`, and cancels any
pending debounced updates.

When multiple `debounce()` rules are applied to the same field, the last
currently active rule is used to debounce an update. These rules are
applied to child fields as well, unless they override them with their
own rule.

(cherry picked from commit d337cfb68f)
2025-11-11 12:00:13 -08:00
Leon Senft 33ed7d116b refactor(forms): do not infer accumulated metadata type from initial value
This removes the need to specify type arguments for
`reducedMetadataKey()` when the value returned from the `getIntial`
callback is a subtype of the accumulated type.

(cherry picked from commit 8866934334)
2025-11-11 12:00:12 -08:00
Angular Robot fc3a28e647 build: update cross-repo angular dependencies
See associated pull request for more information.
2025-11-11 11:51:32 -08:00
Angular Robot baf33d01c1 build: update cross-repo angular dependencies
See associated pull request for more information.
2025-11-11 10:21:35 -08:00
Doug Parker c9f977833e fix(core): skip Angular formatting when formatting signals recursively
The flag `skipFormatting` got renamed to `ngSkipFormatting` during review of https://github.com/angular/angular/pull/64000, but a couple usages got missed, causing some unfortunate UI recursion.

(cherry picked from commit 490435bf76)
2025-11-11 10:14:33 -08:00
Kristiyan Kostadinov 20319fea85 refactor(compiler): remove unused code
The `fullInheritane` flag from the metadata and the `CopyDefinitionFeature` that it controls appear to no longer be used since `fullInheritance` is always false. The feature appears to have been there to support ngcc which was removed some time ago.

(cherry picked from commit 8277906455)
2025-11-11 10:04:32 -08:00
Angular Robot 91dbb4b4c1 build: lock file maintenance
See associated pull request for more information.
2025-11-11 08:48:21 -08:00
SkyZeroZx 8765b66f5a docs: add reference to Built-in Pipes in multiple pipe files
(cherry picked from commit d999667b57)
2025-11-11 08:47:12 -08:00
Matthieu Riegler 6213cbf1a8 refactor(core): rename ExperimentalIsolatedShadowDom to IsolatedShadowDom
This API is still experimental

(cherry picked from commit 21ca49cf62)
2025-11-11 08:46:10 -08:00
Matthieu Riegler 5e86299ec4 docs(docs-infra): Add support for experimental enum entries
(cherry picked from commit 16e61f5dd0)
2025-11-11 08:46:09 -08:00
RobinReinecke 557213e211 docs: correct mermaid code block formatting
(cherry picked from commit 07703875b5)
2025-11-11 08:33:32 -08:00
SkyZeroZx c72efd67de docs: improve discoverability in service worker documentation
(cherry picked from commit dde18c2303)
2025-11-11 08:32:19 -08:00
cexbrayat eea81c2733 docs: remove error mentions in signal forms docs
`error` no longer exists and is called `validate`

(cherry picked from commit 800b01f5a1)
2025-11-11 08:30:13 -08:00
Devin Chasanoff 2019940ddc docs: add links to SDUI example and livestream
(cherry picked from commit 5af33724a4)
2025-11-10 14:16:23 -08:00
arturovt ab98e71c41 fix(common): remove placeholder image listeners once view is removed
Prior to this commit, attempting to resolve a `ChangeDetectorRef` after views or app have been destroyed would result in an error. In this commit, we clean up listeners once the view is destroyed, before the placeholder loads or fails to load.

(cherry picked from commit feb86e3fde)
2025-11-10 12:05:24 -08:00
Shuaib Hasan Akib e5a19cb736 refactor(router): add ngDevMode guards to InjectionToken names and cleanup imports
Wraps InjectionToken names with `typeof ngDevMode !== 'undefined' && ngDevMode`
checks to enable tree-shaking of descriptive token names in production builds.
This ensures debug-only strings are removed from production bundles, reducing size.

Also removes unused imports found during refactor.

(cherry picked from commit b0b834d7f1)
2025-11-10 12:04:35 -08:00
arturovt 8ab084754b refactor(core): mark VERSION as @__PURE__ for better tree-shaking
Annotate the `new Version(...)` call with `/* @__PURE__ */` to signal to optimizers that the constructor is side-effect free.

Without this hint, bundlers such as Terser or ESBuild may conservatively retain the `VERSION` instantiation even when unused. With the annotation, the constant can be tree-shaken away in production builds if not referenced, reducing bundle size.

(cherry picked from commit d3f67f6ca8)
2025-11-10 12:04:09 -08:00
Alan Agius 5f1436779c docs: use markdown code fences in service worker docs
Replaces the <docs-code> component with standard markdown code fences in the service worker documentation. This improves the readability and maintainability of the documentation.

(cherry picked from commit d42f9ce3a9)
2025-11-10 12:03:36 -08:00
Angular Robot 63418fb938 docs: update cross-repo adev docs
Updated Angular adev cross repo docs files.
2025-11-10 10:35:02 -08:00
SkyZeroZx 650af71026 refactor(http): migrate XSRF classes to use inject() function
Remove constructor injection in favor of inject() calls

(cherry picked from commit 55be477979)
2025-11-10 09:49:14 -08:00
arturovt 9db114f4ff refactor(router): replace Optional with inject() flags
Replace `@Optional() link: RouterLink` constructor parameter with
`link = inject(RouterLink, {optional: true})` to enable tree-shaking
of the `Optional` decorator and its factory scaffolding.

Bundle size reduction: `Optional` is a runtime value created by
`makeParamDecorator()`. Even in production builds, ESBuild and other
bundlers must keep their factory code because it is referenced via
`Optional`. With `inject()`, this class is no longer referenced,
allowing it and the `makeParamDecorator` scaffolding to be tree-shaken
when unused elsewhere.

Note: This updates the constructor signature but should not be
considered a breaking change. Angular's official guidance is that
directives, components, and pipes should be instantiated by the
framework, not by user code. Directly calling `new RouterLinkActive(...)`
is an unsupported pattern that goes against Angular's design principles.

(cherry picked from commit 7724a9460d)
2025-11-10 09:48:36 -08:00
Angular Robot afa2ac2801 build: update cross-repo angular dependencies
See associated pull request for more information.
2025-11-10 08:24:22 -08:00
Shuaib Hasan Akib 5092a89e96 docs: add shell language to CLI installation examples
Added `language="shell"` to installation command examples to display
the shell prompt `$` icon consistently across npm, pnpm, yarn, and bun
code blocks.

(cherry picked from commit 27d54654e3)
2025-11-10 08:01:34 -08:00
Shuaib Hasan Akib af0ed124c4 docs(docs-infra): simplify file headers in <docs-code> blocks
Removed redundant "src/app/" prefix from file headers (e.g.,
"src/app/open-close.component.ts" → "open-close.component.ts")
to make code examples cleaner and more focused.

(cherry picked from commit e0a4bdd72b)
2025-11-10 08:00:38 -08:00
Shuaib Hasan Akib 55360994af docs(docs-infra): removed unused import and use self-closing syntax for component
(cherry picked from commit 8c6619a531)
2025-11-10 08:00:11 -08:00
SkyZeroZx 511200265b docs: improve discoverability of forms
(cherry picked from commit e3fc57e8fc)
2025-11-10 07:57:48 -08:00
jnizet 0e13ae5dfc fix(docs-infra): avoid double slash in sitemap urls
Previously, the URLs in the  generated sitemap contained double slashes between the host and the path. It's not the case anymore.

fix #65022

(cherry picked from commit afe5fc0399)
2025-11-10 07:53:44 -08:00
SkyZeroZx 50a9ca0bb1 docs: correct import path and self-closing tag in ng-content example
(cherry picked from commit 6a2f4a88de)
2025-11-10 07:52:51 -08:00
Matthew Beck b69763c728 test(compiler): add test for :host:has(> .foo)
I took a quick look at my recent changes to see if I had inadvertently
fixed this bug, but I couldn't seem to reproduce it even before my
changes. Seems like it's working, though.

Closes #58436

(cherry picked from commit 4b871b139b)
2025-11-10 07:51:21 -08:00
arturovt a8b123c18d refactor(core): tree-shake REF_EXTRACTOR_REGEXP (and dependencies)
`new RegExp()` with computed strings can't be analyzed statically. The bundler can't prove the template string evaluation has no side effects; as thus this expression is considered a side-effect.

(cherry picked from commit 7f95f02d05)
2025-11-10 07:48:42 -08:00
Leon Senft 2667d8c23d refactor(forms): remove a TODO and simplify update on <select> mutations
Remove an unnecessary TODO comment. The native `<select>` tracks its
`value` by keeping track of the selected `<option>`. Thus if the value
was set *before* the corresponding option is created, the `<select>`
will ignore it, but the framework doesn't know that and will cache the
bound value anyways. Therefore, checking if the value changed since it
was last bound when the mutation that creates the selected `<option>`
occurs would in fact prevent a needed update, leaving the `<select>` and
field values out of sync.

Furthermore, we know the control type is a native `<select>` element, so
we can update its value directly instead of going through
`updateNativeControl()` which would perform a redundant input type
check.

(cherry picked from commit 44cd18c183)
2025-11-10 07:48:01 -08:00
hawkgs 6c025fa709 refactor(devtools): update inspect icon
Use a custom version of Material `pin_end` icon that doesn't have a dot.

(cherry picked from commit 402f396b76)
2025-11-10 07:47:18 -08:00
Ben Hong 1876c7c48c docs: add draft for aria autocomplete component guide 2025-11-10 07:46:48 -08:00
Danny Koppenhagen 590244a8f9 docs(core): add a11y considerations related to @defer()
closes #53466

(cherry picked from commit d2b854b37e)
2025-11-07 15:27:15 -08:00
Andrew Scott 647e640603 refactor(core): Extract NavigateEvent cancel steps based on recent spec update
This updates the cancel/abort steps of fake navigation to match the
current spec.

Relevant commit seems to be
* https://github.com/whatwg/html/commit/b0b40cca16f5d04b7fdca5a1bdca32cc6f824689

(cherry picked from commit 8bccd8671c)
2025-11-07 12:54:18 -08:00
Andrew Scott 916ff6a340 refactor(core): Update commit steps of PlatformNavigation fake to match spec updates
Brings commit steps in line with recent spec updates

* https://github.com/whatwg/html/commit/a3809244c003103243e769855aa4c5792b8937e3
* https://github.com/whatwg/html/commit/bd347bdfebc558f4009109c101bf7fb495400031

(cherry picked from commit 7a5ac69144)
2025-11-07 12:54:17 -08:00
Angular Robot 6db214899a docs: update cross-repo adev docs
Updated Angular adev cross repo docs files.
2025-11-07 12:52:12 -08:00
Leon Senft 781a3299f9 perf(forms): only update interop controls when bound field changes
https://github.com/angular/angular/pull/64590 implemented change
detection for field bindings, but only for those bound to native or
custom form controls. This change extends that optimization to apply to
field bindings on interoperable controls built using Reactive Forms as well.

(cherry picked from commit 850f0d6b3d)
2025-11-07 11:58:20 -08:00
Kristiyan Kostadinov c81620f2c1 refactor(compiler-cli): update set of required inputs
Updates the required inputs that can be ignored for form controls.

(cherry picked from commit 877678345a)
2025-11-07 11:57:53 -08:00
Kristiyan Kostadinov cc25f96f02 test(forms): fix type checking errors in signal form tests
Fixes some type checking errors in the signal forms tests that accumulated while there wasn't any type checking.

(cherry picked from commit 10915f2f5f)
2025-11-07 11:57:53 -08:00
Kristiyan Kostadinov 71ab11ccf0 fix(compiler-cli): make field detection logic more robust
Currently the logic for detecting `Field` directives only works if it's imported from `@angular/forms/signals` which doesn't cover our own tests.

These changes make the check more robust.

(cherry picked from commit 0b6b78ca74)
2025-11-07 11:57:53 -08:00
Kristiyan Kostadinov 5b55200edf fix(compiler-cli): allow value to be set on radio fields
Updates the logic that checks for unsupported bindigns to allow `value` to be set on `radio` controls.

(cherry picked from commit a61e01d51f)
2025-11-07 11:57:53 -08:00
Kristiyan Kostadinov bd322ca410 fix(compiler-cli): do not flag custom control required inputs as missing when field is present
Adds some logic that won't report the `value` or `checked` inputs as missing when the `Field` directive is present since it will bind to the inputs implicitly.

(cherry picked from commit 165634264e)
2025-11-07 11:57:53 -08:00
Kristiyan Kostadinov 01290ab275 fix(compiler-cli): use any when checking field interface conformance
Switches to checking against `FormValueControl<any>` instead of `FormValueControl<unknown>` when checking whether custom controls conform to the interface.

Fixes #64946.

(cherry picked from commit 4d0778529f)
2025-11-07 11:57:53 -08:00
Andrew Scott 89095946cf fix(language-service): address potential memory leak during project creation
This addresses a potential memory leak in plugin-factory.ts.
The require call inside the create function reloads the entire language
service module for every new project, which is inefficient and could be a cause of the memory leak during branch
switching. This ensures the module is loaded only once and the same
instance is shared across all projects.

(cherry picked from commit 4405725943)
2025-11-07 11:57:25 -08:00
Alan Agius aada582e96 build: update rules_angular to latest
Update `rules_angular` to latest.
2025-11-07 11:43:47 -08:00
Alan Agius 1e53f4e957 refactor: exclude tsconfig.json from VSIX package contents (#64991)
The  file is no longer included in the VSCode extension package.
This change updates the golden file and the  file to reflect this exclusion.

PR Close #64991
2025-11-07 11:36:31 -08:00
Alan Agius 8967d9bc40 test: add golden file test for VSCode extension package contents (#64991)
This commit introduces a golden file test to verify the contents of the VSCode extension package.
The test ensures that the list of files included in the extension package remains consistent.

A new Bazel rule  is added to generate the list of files, and  is used to compare it against the golden file. A helper script  is also added to facilitate the generation of the golden file.

PR Close #64991
2025-11-07 11:36:31 -08:00
Matthew Beck f54cc4f28a fix(compiler): support commas in :host() argument
This change adds support for commas in :host() arguments (e.g.
`:host(:not(.foo, .bar))` as well as in nested parens when the argument
is applied without parens (e.g. `:host:not(:has(.foo, .bar))`).
Previously these selectors would receive an extra `[nghost]` attr, e.g.
`[nghost]:not(.foo, [nghost].bar)`.

I didn't file a bug for this one, but it's also blocking on an internal
LSC. Like the other CSS changes, I'll run a TGP to confirm this isn't
breaking.

(cherry picked from commit 680c3c7bff)
2025-11-07 10:43:37 -08:00
Shuaib Hasan Akib 0552e728a8 docs(docs-infra): use self-closing syntax for component examples
Replaced multiple component tags such as `<example></example>` with
self-closing syntax (`<example />`) across documentation examples.
This improves readability and aligns with the current Angular
style conventions.

(cherry picked from commit a2cd36777a)
2025-11-07 10:24:41 -08:00
Charles Lyding 31846ded2d docs: remove invalid service dependency guide section
The current section `Services with dependencies` within the testing services
guide is non-functional and has been removed. The example service is using
`inject` but the test code is using constructor-based injection. The further
sections discuss the use of TestBed to adjust providers which better handles
these cases.

(cherry picked from commit e3143036ba)
2025-11-07 10:23:50 -08:00
SkyZeroZx 46c1a80b8f docs(docs-infra): refactor update to use host property and refactor isWindows
(cherry picked from commit dff803514e)
2025-11-07 10:13:26 -08:00
Alon Mishne dec8d74ecf docs: Update MCP docs to include all current stable and experimental tools
(cherry picked from commit b481fee049)
2025-11-07 10:12:33 -08:00
Charles Lyding 27b355b220 docs: Update testing guides for Vitest and Karma
This commit updates the testing documentation to reflect the introduction of Vitest as the default test runner, while ensuring Karma testing instructions are still available.

Key changes include:
- Adding a new guide for "Testing with Karma" (`guide/testing/karma.md`).
- Updating the "Code Coverage" guide (`guide/testing/code-coverage.md`) to use `angular.json` for coverage enforcement and referencing Vitest documentation.
- Modifying the "Testing Overview" guide (`guide/testing/overview.md`) to introduce Vitest as the default, update `ng test` output examples, and link to the new Karma guide.
- Updating navigation data to include the new Karma testing guide.

(cherry picked from commit 2a2397acc4)
2025-11-07 10:10:29 -08:00
Andrew Scott 3f7111a9c3 fix(language-server): fix directory renaming on Windows
Hopefully addresses issues on Windows where fs.watch on a directory
locks that directory.

fixes https://github.com/angular/vscode-ng-language-service/issues/1398

(cherry picked from commit c91d8203a2)
2025-11-07 10:10:00 -08:00
Miles Malerba a3cb1dfd1a refactor(forms): nicer type errors
By intersecting with `object` instead of `unknown` in the primitive and
`FormControl` cases, we get TypeScript to show nicer type errors that
mention `FieldTree<...>` insetad of `() => FieldState<...>`

(cherry picked from commit 0efb3f6d1f)
2025-11-07 15:45:08 +00:00
SkyZeroZx b15325f409 refactor(devtools): replace HostListener with host metadata for keydown handling
Uses host metadata instead of the HostListener decorator for keydown events

(cherry picked from commit c74367c5de)
2025-11-07 15:44:46 +00:00
khanhkhanhlele 59798a13dd docs: Fix typos in some files
(cherry picked from commit a625f6bb20)
2025-11-07 15:44:08 +00:00
Angular Robot 8e73f54f38 build: update cross-repo angular dependencies
See associated pull request for more information.
2025-11-06 15:28:28 -08:00
tsc036 e69ada4ceb refactor(core): move profile_types.ts to primtives
move profile_types.ts so the types can be used in Wiz code

(cherry picked from commit cf47ce2db9)
2025-11-06 22:22:38 +00:00
Miles Malerba 6d6fda8610 refactor(forms): allow FieldTree of recursive type
Adjusts our typings to work better with recursive types and avoid
infinite recursion in the type system.

(cherry picked from commit faccf03ee0)
2025-11-06 21:43:46 +00:00
Miles Malerba 9ea1c2216d refactor(forms): expose pathKeys as part of the API
Currently we maintain the pathKeys internally, but do not expose them
through the `FieldContext`, this PR updates the `FieldContext` to expose
this property.

(cherry picked from commit 2fd8dc9195)
2025-11-06 21:43:15 +00:00
Miles Malerba 8b4195fe7e refactor(forms): support dynamic object logic
extends `applyEach` to work on objects as well, conditionally applying
logic to each property of the object.

(cherry picked from commit c9058087ae)
2025-11-06 21:42:51 +00:00
Angular Robot 86a9feb9b5 build: update cross-repo angular dependencies to v21.0.0-rc.1
See associated pull request for more information.
2025-11-06 13:22:03 -08:00
Jessica Janiuk dcfd7fe399 Revert "build: restrain visibility to compiler-cli subpackages (#64732)"
This reverts commit acaa1e6104.
2025-11-06 13:09:27 -08:00
Jessica Janiuk 7c0daeac89 Revert "refactor(compiler-cli): remove deep imports from compiler-cli (#64732)"
This reverts commit af16b48ac7.
2025-11-06 13:09:27 -08:00
Matthieu Riegler acaa1e6104 build: restrain visibility to compiler-cli subpackages (#64732)
This should solve future deep imports issues.

PR Close #64732
2025-11-06 20:01:27 +00:00
Matthieu Riegler af16b48ac7 refactor(compiler-cli): remove deep imports from compiler-cli (#64732)
Accessed symbols are grouped into dedicated `private` entries

PR Close #64732
2025-11-06 20:01:27 +00:00
SkyZeroZx 593f902f24 refactor(platform-browser): remove unused Platform ID dependency from DomRendererFactory2
Eliminates the unnecessary injection and usage of Platform ID in the renderer factory logic, along with related test scaffolding cleanup

(cherry picked from commit 5343001835)
2025-11-06 20:00:50 +00:00
Angular Robot de2ff121d5 build: update cross-repo angular dependencies
See associated pull request for more information.
2025-11-06 11:56:14 -08:00
arturovt e90f9e418c refactor(forms): tree-shake ngControlStatusHost and ngGroupStatusHost
This commit removes `ngGroupStatusHost` variable because it's a side-effect, ending up preserving `ngControlStatusHost` and `ngGroupStatusHost`.

(cherry picked from commit 9f76fb61df)
2025-11-06 18:57:48 +00:00
Matthew Berry aad6ced0ef fix(compiler): support one additional level of nesting in :host()
Previously we supported one level of nested parentheses inside of a
`:host()` selector, e.g. `:host(:not(p))`. This caused a breakage in g3
when I migrated a selector from `:host:not(:has(p))` to
`:host(:not(:has(p)))`. This change adds support for just one more level
of nesting.

It'd be nice to move everything to a real CSS parser (or even update it
to count parentheses like I did with :host-context()), but I wasn't able
to get that to work in ~20 minutes and I'm focusing on other things at
the moment.

This change punts the problem until somebody tries to use just one more
level of nesting in a selector.

Fixes #64830

(cherry picked from commit 444143758e)
2025-11-06 18:53:47 +00:00
kirjs 3bbcae6ce8 refactor(forms): add compatForm
This allows using reactive form controls in signal forms

(cherry picked from commit 60447945bc)
2025-11-06 18:51:31 +00:00
Alan Agius 3bed9f0f16 build: format md files
This commit configures prettier to format markdown files.
2025-11-06 10:07:13 -08:00
Miles Malerba 60ce31fb62 test(forms): re-enable some disabled tests
Adjusts test behavior to reflect current implementation and enables them

(cherry picked from commit fa02d96508)
2025-11-06 17:41:31 +00:00
Jessica Janiuk a3c2fe819a Revert "refactor(common): Removes unused imports to clean up dependencies"
This reverts commit 6d3e0f1a51.
2025-11-06 09:05:05 -08:00
SkyZeroZx 6d3e0f1a51 refactor(common): Removes unused imports to clean up dependencies
Eliminates unnecessary imports to reduce clutter and improve maintainability

(cherry picked from commit ca3ef38143)
2025-11-06 16:35:32 +00:00
tsc036 b30bcc514d refactor(core): export types from primitives
export Version type and a type for linkedSignal previous value so they can be used for the Wiz implementations

(cherry picked from commit 104f7d57c1)
2025-11-06 16:34:58 +00:00
SkyZeroZx d8c656bd58 docs: correct formatting in dependency injection guides
(cherry picked from commit 61066071cf)
2025-11-06 16:34:31 +00:00
Joey Perrott 26995e2082 fix(docs-infra): properly expose the prerendered routes for sitemap generation
Properly expose the prerendered routes for sitemap generation rather than only copying the browser directory
2025-11-06 07:52:22 -08:00
Joey Perrott 5fb0b80f10 feat(docs-infra): generate the sitemap for angular.dev
We automatically generate the sitemap for the angular.dev deployment and include it in the assets pushed
to firebase.

Co-authored-by: Matthieu Riegler <kyro38@gmail.com>
2025-11-06 07:52:22 -08:00
Miles Malerba f3e2252f4b refactor(forms): add better support for Object.keys and Symbol.iterator
Improves support for using `Object.keys` (and related methods) and
`Symbol.iterator` to work with a `FieldTree` of unknown shape.

(cherry picked from commit e87f423d90)
2025-11-06 15:51:31 +00:00
Miles Malerba d1f4c8c18c refactor(forms): improved select support
When we set the `value` on a `<select>` element we're really just
setting the selected `<option>`. It treats the selected option as the
source of truth, rather than the actual value. This means that if
options are added or removed or their value changes, the `<select>` may
wind up with a different `value` than what's in our model.

This PR resolves this issue by adding a `MutationObserver` to the select
that is used to resync its value to the model whenever the options may
have changed.

(cherry picked from commit 194b41199b)
2025-11-06 15:49:09 +00:00
Angular Robot 87ffa3ca28 docs: update cross-repo adev docs
Updated Angular adev cross repo docs files.
2025-11-06 07:47:27 -08:00
Angular Robot f0ffd9bebd build: update cross-repo angular dependencies
See associated pull request for more information.
2025-11-05 15:26:25 -08:00
Joey Perrott 827a267511 build: update diff release package script
Update the diff relase package script to properly recursively apply the chmod and support a flag for writing the
diff to a file instead of only logging it to the console.

(cherry picked from commit de1f22cf2c)
2025-11-05 23:24:53 +00:00
Angular Robot 086ce4b40f build: update all github actions
See associated pull request for more information.
2025-11-05 15:17:38 -08:00
Angular Robot 0a75a0aee2 build: update bazel dependencies
See associated pull request for more information.
2025-11-05 15:17:18 -08:00
Miles Malerba 4bdd317596 docs: improve docs generation for namespaces (#64747)
Improves docs epxerience for interfaces / type aliases that are merged
with a namespace.

PR Close #64747
2025-11-05 22:42:59 +00:00
Miles Malerba c3b4bea951 refactor(forms): improve discoverability of ValidationError flavors (#64747)
Improves discoverability by putting the WithField, WithoutField, etc as
subtypes of the main ValidationError type

PR Close #64747
2025-11-05 22:42:59 +00:00
Erik Wegner bf19fd499f docs: Add the missing function call to use the signal's actual value
(cherry picked from commit e18aac88d4)
2025-11-05 11:47:20 -08:00
Andrew Scott 24f9d760a6 release: cut the v21.0.0-rc.1 release 2025-11-05 19:27:38 +00:00
Matthieu Riegler 01c5ba50d2 docs(docs-infra): fix heading layout on mobile
Long code blocks overflow the headings on narrow screen (like mobiles), this messes up the global layout of the page. With the ellipsis with fix that.

fixes #64845

(cherry picked from commit 7f44345db3)
2025-11-05 09:49:53 -08:00
Andrew Scott d3d2a3416f build: 20.3.3 release notes
update release notes for 20.3.3 of vscode extension
2025-11-05 17:36:29 +00:00
Andrew Scott 3a63bfda94 build: 20.3.2 release for vscode extension
changelog and version bump for 20.3.2
2025-11-05 17:36:29 +00:00
Kristiyan Kostadinov bdecb0345a test(compiler-cli): set up TCB tests for signal forms
Adds TCB-specific tests for the generated code in signal forms since they tend to be a bit easier to read and follow.

(cherry picked from commit 748caf9a74)
2025-11-05 09:35:53 -08:00
Kristiyan Kostadinov 0e081a6ef9 refactor(compiler-cli): check that custom control conforms to control interfaces
Generates additional type checking code to ensure that custom control conform to either `FormValueControl` or `FormCheckboxControl`.

(cherry picked from commit 3c7751020e)
2025-11-05 09:35:53 -08:00
Kristiyan Kostadinov 93283e076f refactor(compiler-cli): flag unsupported static bindings on field directives
Expands the diagnostic for unuspported bindings on fields to also capture static attributes.

(cherry picked from commit 04ed91071b)
2025-11-05 09:35:52 -08:00
Kristiyan Kostadinov d1a9258ed2 refactor(compiler-cli): split up form field ops
Splits up the custom form field and native form field into two separate `TcbOp`s with a shared base class.

(cherry picked from commit a5b596b83d)
2025-11-05 09:35:51 -08:00
Kristiyan Kostadinov c371251e4c fix(compiler-cli): report invalid bindings on form controls
Adds validation that users don't bind to unsupported properties on nodes with the `Field` directive.

(cherry picked from commit f20103a1d7)
2025-11-05 09:35:51 -08:00
Kristiyan Kostadinov 471da8a311 fix(compiler-cli): infer type of custom field controls
Adds the logic to infer the type of a custom field control that's on the same element as the `Field` directive.

(cherry picked from commit 948e2f4f01)
2025-11-05 09:35:51 -08:00
Kristiyan Kostadinov 6df098f76c refactor(core): add utility type for extracting the value of a custom control
Adds the `ɵExtractFormControlValue` type that we can use during template type checking to extract the type of a custom control.

(cherry picked from commit 4b68bddd62)
2025-11-05 09:35:50 -08:00
Kristiyan Kostadinov 96cb0cffda fix(compiler-cli): infer types of signal forms set on native inputs
Sets up the logic for inferring the type of the signal form that is set on a native `input`, `textarea` or `select`.

(cherry picked from commit 6b51fc3e9d)
2025-11-05 09:35:50 -08:00
Kristiyan Kostadinov a021006276 refactor(compiler-cli): allow the forms module to be loaded in tests
Updates the testing utilities to allow for `@angular/forms` to be loaded.

(cherry picked from commit c5ac77cb32)
2025-11-05 09:35:50 -08:00
SkyZeroZx 47578e0967 refactor(common): remove redundant providedIn: 'root' from injection tokens
Removes unnecessary `providedIn: 'root'` declarations from injection tokens

(cherry picked from commit 7c49c5338f)
2025-11-05 09:08:44 -08:00
SkyZeroZx 6de14b14e0 refactor(http): simplifies destruction tracking using destroyed property
Replaces the manual destroyed state with destroyed property

(cherry picked from commit 44435ea97b)
2025-11-05 09:05:34 -08:00
Jessica Janiuk a453d603c0 fix(core): skip leave animations on view swaps
We accounted for skipping leave animations during moves, but not swaps.
This accounts for the swap cases and updates how we deal with swaps and
moves. Now we always queue animations and then essentially dequeue them
if we attach them back in the same render pass.

fixes: #64818
fixes: #64730
(cherry picked from commit 373d263834)
2025-11-05 09:04:21 -08:00
Alan Agius 78c12b32e8 build: update typescript dependency for vscode-ng-language-service
Updates the typescript dependency to 5.9.3 in vscode-ng-language-service/package.json
and updates pnpm-lock.yaml accordingly.

(cherry picked from commit 3ef2edc076)
2025-11-05 09:02:41 -08:00
Leon Senft 507b3466ee perf(forms): implement change detection for field control bindings
For each field state property, check if it has changed since the last
time it was checked before writing it the corresponding form control
property.

The `pattern` and `required` properties of the field state now return a
default value rather than `undefined` if not defined by metadata.

(cherry picked from commit 41be02da2f)
2025-11-04 16:11:33 -08:00
Angular Robot bb267d1f04 build: update cross-repo angular dependencies
See associated pull request for more information.
2025-11-05 00:07:49 +00:00
Lukas Matta e1f933fed0 fix(migrations): Prevent removal of templates referenced with preceding whitespace characters
In https://github.com/angular/angular/pull/64745, a fix was introduced for templates referenced with a trailing semicolon. However, templates are still incorrectly removed when there are whitespace characters before the template name.

This commit updates the control flow migration logic to ensure templates referenced with preceding whitespace are not removed.

Fixes #64854

(cherry picked from commit 5b210e97af)
2025-11-04 15:26:08 -08:00
SkyZeroZx 9c59ea869a docs(docs-infra): add missing meta tags for author, keywords, and Twitter
(cherry picked from commit b5e37ffb77)
2025-11-04 14:58:34 -08:00
Angular Robot 9596020956 docs: update cross-repo adev docs
Updated Angular adev cross repo docs files.
2025-11-04 19:16:54 +00:00
Angular Robot 0b1339ef34 build: lock file maintenance
See associated pull request for more information.
2025-11-04 18:56:49 +00:00
Andrew Scott 65d6c9317a build: release VSCode extension 20.3.1
bump version and readme for vscode extension release
2025-11-04 18:54:06 +00:00
Jan Martin bb839bec33 ci: update handle for jkrems/hybrist
The username was changed earlier today and the old username is no
longer in use.
2025-11-04 17:48:38 +00:00
Gerome Grignon 3ccda42182 docs(router): uniformize lazy loading syntax
(cherry picked from commit 8f49af90d0)
2025-11-04 09:39:21 -08:00
SkyZeroZx 36f4c9b299 refactor(core): Removes unused flag for onDestroy
Eliminates an unnecessary configuration flag

(cherry picked from commit 2ad1b5979f)
2025-11-03 20:21:07 -08:00
SkyZeroZx 3140b87fd6 docs: simplify tutorial signals with self-closing component tags
(cherry picked from commit b61847f877)
2025-11-03 16:34:46 -08:00
SkyZeroZx 250e4c4a82 docs: Update highlight inputs & code block formatting in component guides
(cherry picked from commit 82a579c7e6)
2025-11-03 16:32:48 -08:00
SkyZeroZx 33f833984d refactor(platform-browser): remove redundant providedIn: 'root' from injection tokens
Removes unnecessary `providedIn: 'root'` declarations from injection tokens

(cherry picked from commit 97169b4689)
2025-11-03 16:31:58 -08:00
SkyZeroZx 1b5e2c84b5 refactor(platform-server): remove redundant providedIn: 'root' from injection tokens
Removes unnecessary `providedIn: 'root'` declarations from injection tokens

(cherry picked from commit 5e4437baf8)
2025-11-03 16:31:58 -08:00
SkyZeroZx f32a364045 refactor(router): remove redundant providedIn: 'root' from injection tokens
Removes unnecessary `providedIn: 'root'` declarations from injection tokens

(cherry picked from commit 67da4eb04c)
2025-11-03 16:31:58 -08:00
SkyZeroZx d3ed745653 refactor(forms): remove redundant providedIn: 'root' from injection tokens
Removes unnecessary `providedIn: 'root'` declarations from injection tokens

(cherry picked from commit 78e6716f40)
2025-11-03 16:31:58 -08:00
SkyZeroZx 20fa3841ba refactor(core): remove redundant providedIn: 'root' from injection tokens
Removes unnecessary `providedIn: 'root'` declarations from injection tokens

(cherry picked from commit 64efbc53aa)
2025-11-03 16:31:58 -08:00
Shuaib Hasan Akib 34f53aad06 docs: remove standalone: true since it's now the default
Removes redundant `standalone: true` declarations from code examples.
Standalone components are now the default in Angular, so the flag is
no longer necessary in documentation snippets.

(cherry picked from commit c4c7fb88ac)
2025-11-03 16:27:04 -08:00
Angular Robot a702c87833 build: update cross-repo angular dependencies
See associated pull request for more information.
2025-11-04 00:00:22 +00:00
marktechson fcd5f9f0ef docs: add v21 landing page
Adds a new landing page for developer events, starting with the v21 page. It also includes an ICS file link for calendar invites. Also updated the tests for the docs-pill to support two new attributes so developers can add the event to their calendars.

(cherry picked from commit 7a422c209a)
2025-11-03 15:59:31 -08:00
Matthieu Riegler 6b3fdf3e9f docs: remove feature from changelog.
#64584 reverted that change
2025-11-03 23:29:55 +00:00
SkyZeroZx d66384db49 docs(docs-infra): Improve font loading performance with preconnect
Adds preconnect links for Google Fonts domains to establish early
connections, reducing latency and improving font loading speed

(cherry picked from commit ffa19ddd3f)
2025-11-03 14:31:09 -08:00
Angular Robot 97c31ae1a8 build: update dependency bazel to v7.7.0
See associated pull request for more information.
2025-11-03 22:27:46 +00:00
SkyZeroZx 92f7052bc3 docs(docs-infra): Updates page title strategy to sync meta tags
Ensures that page title changes are reflected in relevant meta tags for improved SEO and sharing support

(cherry picked from commit 429672d6ab)
2025-11-03 13:30:21 -08:00
Kristiyan Kostadinov 4c6e29f72f fix(compiler-cli): make required inputs diagnostic less noisy
Currently when a required input is missing, we produce a diagnostic on the entire start tag. This can be really noisy if there are already some attributes on the element.

This change switch to only highlighting the tag name instead.

(cherry picked from commit f233f7420a)
2025-11-03 13:27:54 -08:00
Matthieu Riegler dc99f4c55a docs(docs-infra): ensure all redirections are absolute
fixes #64824

(cherry picked from commit 434ddbcfc9)
2025-11-03 13:01:54 -08:00
Angular Robot 32a166bdb7 build: update bazel dependencies
See associated pull request for more information.
2025-11-03 20:18:33 +00:00
Matthieu Riegler 5d75d0ec30 refactor(core): Replace usages of the Function type for animations
`Function` is usually not recommended as its not specific enough.

(cherry picked from commit 79b7ac722a)
2025-11-03 12:05:09 -08:00
Angular Robot 303bff6740 build: update cross-repo angular dependencies
See associated pull request for more information.
2025-11-03 19:52:27 +00:00
Angular Robot ac97c72495 build: update pnpm to v10.20.0
See associated pull request for more information.
2025-11-03 19:49:47 +00:00
SkyZeroZx a44083a2b9 docs(devtools): Removes comment about enum deprecation
Removes comment about enum deprecation

(cherry picked from commit a0fe177682)
2025-10-30 12:40:23 -07:00
SkyZeroZx c4742322dc refactor(devtools): Removes redundant input undefined in angularVersion
Simplifies the initialization of the version input by removing
an unnecessary undefined

(cherry picked from commit bd27e96273)
2025-10-30 12:40:22 -07:00
Kristiyan Kostadinov a4fe078969 refactor(common): remove unused import (#64699)
Cleans up unused code to improve readability and maintainability.

PR Close #64699
2025-10-30 19:27:34 +00:00
Ben Hong fee4baf5e5 docs: update dependency injection guides (part 1) (#63652)
PR Close #63652
2025-10-30 19:22:42 +00:00
Alan Agius 26f4944586 ci: refactor cross-repo documentation update scripts (#64792)
Consolidate separate scripts for updating Aria, CDK, and CLI documentation into a single, unified  script. This change streamlines the documentation update process and improves maintainability. The workflow file has been updated to use the new consolidated script.

PR Close #64792
2025-10-30 19:19:21 +00:00
Matthieu Riegler d23bb3cf6d docs(docs-infra): allow cors for json files (#64783)
fixes #64710

PR Close #64783
2025-10-30 17:50:07 +00:00
SkyZeroZx eb78d3552c docs: Standardize route parameter input signal & code block tags in routing docs (#64788)
PR Close #64788
2025-10-30 17:48:00 +00:00
Angular Robot c721de112c build: update cross-repo angular dependencies (#64781)
See associated pull request for more information.

PR Close #64781
2025-10-30 17:47:12 +00:00
aparziale ca0e77b25f fix(docs-infra): Cannot find module message (#64701)
Fixed the import error message in the editor section. The build would complete successfully, but an error message would be incorrectly reported.

PR Close #64701
2025-10-30 17:42:27 +00:00
Ben Hong 58f921d34c docs: add essential signal forms guide (#64665)
PR Close #64665
2025-10-30 17:24:58 +00:00
Joey Perrott 7a4813104c ci: make the github action fail when a firebase command fails (#64801)
When a firebase command line execution fails, the github action should be shown as failing instead of continuing to attempt to run and resulting in
an exit code of 0 and success

PR Close #64801
2025-10-30 17:24:27 +00:00
Angular Robot 90452f53df docs: update Angular Aria apis (#64804)
Updated Angular Aria api files.

PR Close #64804
2025-10-30 17:17:32 +00:00
Andrew Scott 60cc3cbde4 refactor(core): Move patch toggles inside functions to allow tree shaking
In general, global level const will cause DCE bailouts.

(cherry picked from commit fb569ef614)
2025-10-29 13:57:56 -07:00
Matthieu Riegler 366392b692 refactor(compiler): desambiguate and export RegularExpressionLiteralExpr
This allows all symbols used by `ExpressionVisitor` to be accessible.

(cherry picked from commit cfba831966)
2025-10-29 13:45:20 -07:00
Cheng-Hsuan Tsai 81b18fcbb7 ci: add workflow to copy and generate aria api pages
- add a script to copy Aria API json files from `angular/aria-builds`.
- build Aria API docs from json files.

(cherry picked from commit 3784fbcc12)
2025-10-29 13:38:40 -07:00
Matthieu Riegler 20b4b2c43c refactor(core): expose isWritableSignal to the publicApi
This is alongside the already exisiting isSignal()

fixes #64763

(cherry picked from commit 76adbbcd0a)
2025-10-29 13:31:53 -07:00
Miles Malerba 981fabc9b6 feat(docs-infra): add support for namespaces
Adds support for generating docs for namespaces (and merged declarations
of namespace + type)

(cherry picked from commit 662f0e5c00)
2025-10-29 13:22:26 -07:00
paszesoft 2a06e2b138 docs: Rename TodoListItem to UserProfile and fix usage of isValidUserId
(cherry picked from commit 6cc6d93e70)
2025-10-29 18:49:47 +01:00
paszesoft c9f8671960 Update button disabled property logic in template logical bug fix
isValidUserId = true is logically wrong to use to disable the Save button.
So is logically wrong to use isValidUserId = false to enable the Save button.
Also the default state of this button should be most likely disabled, if we are bothering to check, so the initial value of the signal should most likely be set to true.
To resolve these 2 issues, I propose to use:
- isInValidUserId instead of isValidUserId and:
- isInValidUserId = signal(true); // isValidUserId = signal(false);
After these 2 changes the snippet should make logical sense.

(cherry picked from commit b5dae85b27)
2025-10-29 18:49:47 +01:00
SkyZeroZx 207a26c125 docs(docs-infra): Prevent empty extends clause in interface documentation
Interfaces with no extends clause were incorrectly rendered with a trailing extends keyword followed by nothing, resulting in invalid TypeScript syntax

(cherry picked from commit f3d056a065)
2025-10-29 18:48:35 +01:00
Shuaib Hasan Akib ed500e42e6 fix(docs-infra): extract header attribute as title in multifile code snippets
The DocViewer component's getCodeSnippetsFromMultifileWrapper method was not
extracting the header attribute from nested <docs-code> elements, causing the
ExampleViewer to fall back to displaying file paths instead of custom headers
in tab labels.

This change adds title extraction from the header attribute when processing
multifile code snippets, ensuring that custom headers are properly displayed
in the code viewer tabs.

Fixes #64760

(cherry picked from commit 5d8b76b4fa)
2025-10-29 18:48:05 +01:00
Angular Robot 81fcfe5cbc docs: update Angular CLI help
Updated Angular CLI help contents.
2025-10-29 18:47:13 +01:00
Kristiyan Kostadinov 07b6fcac59 release: cut the v21.0.0-rc.0 release 2025-10-29 18:43:43 +01:00
Kristiyan Kostadinov db72aeff78 release: cut the v21.0.0-next.10 release 2025-10-29 18:40:08 +01:00
Lukas Matta 95344c19f3 fix(migrations): Do not remove a template if it is referenced even with a trailing semilocon
This commit fixes a behavior where under certain conditions, the migration script ignored
a template reference with a trailing semicolon and incorrectly removed the definition
of a referenced template.

Fixes #64741

(cherry picked from commit 64cb08529d)
2025-10-29 10:51:01 +01:00
Alan Agius feac577414 build: update typescript to 5.9.3
The beta version was unused in the pnpmfile.

(cherry picked from commit 13c386936b)
2025-10-29 10:46:50 +01:00
Angular Robot 209f0f964f build: update github/codeql-action action to v4.31.0
See associated pull request for more information.
2025-10-29 10:44:25 +01:00
Angular Robot ba5ca63330 build: update dependency node to v22.21.1
See associated pull request for more information.
2025-10-29 10:43:26 +01:00
Miles Malerba 9cecae81de docs(forms): make FIELD experimental
Adds `@experimental` tag to `FIELD`

(cherry picked from commit a7180b65db)
2025-10-29 10:40:53 +01:00
Miles Malerba e0a9cfc973 refactor(forms): rename the logic property on FieldPathNode
`logic` was a confusing name, as it is a logic builder instance, not a
logic instance.

(cherry picked from commit 3d70d68676)
2025-10-29 10:40:10 +01:00
Miles Malerba 60c8e2779c refactor(forms): preserve logic order when apply is used on root path
In some cases the logic order was not preserved properly when using `apply`. In particular this occurs when some logic is registered on a child of the root, followed by an apply to the root, followed by further logic registered on a child. In this case the final registered logic wound up running before the applied logic.

This happened because `FieldPathNode` for a child path was caching its `LogicNodeBuilder` at creation time. This meant that if the parent's `LogicNodeBuilder` changed (e.g., due to an `apply` call), the child would still be using the old one.

This commit fixes the issue by dynamically resolving the `LogicNodeBuilder` for a child path whenever it is accessed.

(cherry picked from commit fa13a167f1)
2025-10-29 10:40:09 +01:00
Alan Agius 6e004caa5b refactor(docs-infra): switch to unit test builder for unit tests
- Deletes the old Karma configuration and test entry point.
- Updates `angular.json` to use the `@angular/build` builders.
- Adjusts test files to align with the new setup.
2025-10-28 20:53:12 +01:00
Miles Malerba 07e56596a5 refactor(forms): track arrays in a parent array by index
This commit changes arrays in a parent array to be tracked the same way
as primitive values like strings and numbers. This is necessary because
the tracking key symbol used to maintain identity for objects in an
array does not survive the array spread operation:

```
return {...oldValue} // tracking symbol preserved ✅
return [...oldValue] // tracking symbol lost ❌
```

(cherry picked from commit f80b51a738)
2025-10-28 20:52:54 +01:00
Alan Agius ebdfd71f50 refactor(migrations): exclude all @angular/* packages from schematics bundle
This change updates the rollup configuration for the core schematics to exclude all `@angular/*` packages from the bundle. This is possible following https://github.com/angular/angular/pull/64703

This significantly reduces the size of the `@angular/core` schematics bundle, resulting in a size reduction to 5.8mb.

(cherry picked from commit b4e798ed87)
2025-10-28 20:51:53 +01:00
kirjs d74fb923cc refactor(forms): Allow returning plain values from validators
This makes the API nicer to use

(cherry picked from commit c57bbaa87d)
2025-10-28 20:50:48 +01:00
kirjs 07b9be1d2c refactor(forms): Allow returning plain values from validators
This makes the API nicer to use

(cherry picked from commit 8562e29be4)
2025-10-28 20:50:48 +01:00
kirjs 71a6266dd3 refactor(forms): Allow returning plain values from validators
This makes the API nicer to use

(cherry picked from commit 28847c9a19)
2025-10-28 20:50:48 +01:00
kirjs 2c2ea2c0da refactor(forms): Allow returning plain values from validators
This makes the API nicer to use

(cherry picked from commit b5c29d0d0a)
2025-10-28 20:50:48 +01:00
Angular Robot 098f6751ef build: update cross-repo angular dependencies
See associated pull request for more information.
2025-10-28 20:49:10 +01:00
Angular Robot b41a0704ec build: update cross-repo angular dependencies
See associated pull request for more information.
2025-10-28 10:26:32 -07:00
Matthieu Riegler d1d5c724e3 docs(docs-infra): allow cors for json files
fixes #64710

(cherry picked from commit f2de963bf3)
2025-10-28 16:55:57 +01:00
Matthieu Riegler 4f21ea72cb refactor(compiler-cli): Remove deep imports of compiler-cli in angular/core
migration schematics will pull from `compiler-cli/private/migrations`
core tests will pull from `compiler-cli/private/testing`

(cherry picked from commit 8e50cdb930)
2025-10-28 15:58:59 +01:00
Shuaib Hasan Akib c0a50bf18f fix(docs-infra): update guide navigation to remain active with query params
The navigation list component was using `routerLinkActive` with
`{ exact: true }`, which required an exact URL match including query
parameters. When visiting `/update-guide?v=19.0-20.0&l=1`, the link
`/update-guide` didn't match, so the active class wasn't applied.

Updated `routerLinkActiveOptions` to ignore query parameters while
maintaining exact path matching so the navigation item stays highlighted
when interacting with the update guide form.

(cherry picked from commit 33a872d90a)
2025-10-28 15:58:29 +01:00
Andrew Scott d303cde96d refactor(core): Remove zone toggles for test and standalone
The migration is complete internally. All that remains is bootstrapModule

(cherry picked from commit a253739ac8)
2025-10-28 15:58:02 +01:00
arielbackenroth 3fbaaa0176 refactor(http): add hooks for propagating traces across XHR callbacks.
Enables propagating a trace across XHR callbacks by providing a hook for
wrapping the callback with a function bound to the send trace context.

(cherry picked from commit 07b8e953f4)
2025-10-28 15:09:00 +01:00
tjshiu 3617167d3c docs: align adev best practices with llm-eval
(cherry picked from commit 763db3a70b)
2025-10-28 15:08:17 +01:00
Angular Robot 81b876582c build: lock file maintenance
See associated pull request for more information.
2025-10-28 10:27:50 +01:00
Shuaib Hasan Akib 845c1cd63e docs: remove shell language from terminal output block
Changed terminal output code block in installation.md from shell
language to plain text to prevent rendering of shell prompt ($).
The block displays read-only log output that users should not
execute as commands.

(cherry picked from commit e9b29c359d)
2025-10-28 10:26:53 +01:00
Angular Robot c87d1e0d84 docs: update Angular CLI help
Updated Angular CLI help contents.
2025-10-28 10:26:25 +01:00
Matthieu Riegler 7b77336603 docs: callout for provide function order
(cherry picked from commit be731deb7c)
2025-10-28 10:25:00 +01:00
Shuaib Hasan Akib ba719f4d15 refactor(router): remove redundant default value from routerOutletData input
Since `input()` defaults to `undefined`, the explicit initializer was unnecessary.
This improves clarity and reduces boilerplate.

(cherry picked from commit 8291760f9b)
2025-10-28 10:24:27 +01:00
Matt Lewis 54ad2304e3 fix(core): Clear lView from IcuIteratorState when stack is empty to prevent memory leak
If a component template contains an icu expression it is being retained until the next change detection cycle for that template. This results in a net retention of only ever a single copy of the given lView but that creates an opportunity for compounding leaks.

Change the icu i18n_icu_container_visitor to free the IcuIteratorState retained lView when the stack is empty so that garbage collection can occur when the view is discarded.

(cherry picked from commit 59e648913c)
2025-10-27 19:42:22 +01:00
SkyZeroZx 05bfda484e refactor(devtools): Improves clipboard error feedback with snackbar and logging
Enhances user experience by displaying a snackbar notification when clipboard copy fails, and logs detailed error information via the message bus

(cherry picked from commit bfcaf17005)
2025-10-27 19:41:57 +01:00
Matthieu Riegler ce5ca247e5 refactor(migrations): use the applicationProviders for the zoneless migration
PR #64354 introduced the `applicationProviders` for `bootstrapModule`, this allows a simpler migration output.

(cherry picked from commit eec6669733)
2025-10-27 19:41:32 +01:00
Angular Robot 8511759706 build: update rules_angular digest to 1f1aa3e
See associated pull request for more information.
2025-10-27 17:14:19 +01:00
Angular Robot 87eb11f961 build: update cross-repo angular dependencies
See associated pull request for more information.
2025-10-27 17:14:00 +01:00
Alan Agius 843f30afc9 build: reduce package size of @angular/core
The schematics bundle size is reduced by externalizing @angular/compiler. This reduces the package size from 11mb to 9.1mb.

(cherry picked from commit 9d00c6892f)
2025-10-27 17:12:51 +01:00
csorrentino bd780366e8 refactor(forms): add onError callback to validateHttp for HTTP errors
Adds onError callback inside validateHttp validator in signal forms

PR-Close: #63949
(cherry picked from commit a5678f6f2b)
2025-10-27 17:12:28 +01:00
Matthew Beck 04dd75ba94 fix(compiler): support arbitrary nesting in :host-context()
Previously we supported one level of nested pseudo-element selectors
inside :host-context(), e.g. :host-context(:is(.foo, .bar)). This was
based on a regex-based approach. We could support deeper levels of
nesting by updating the regex, but using a regex approach prohibits us
from supporting arbitrary nesting.

Rather than just adding one more level to the existing expression, I've
added a new generator function which splits selectors on commas in a
parenthesis-aware way. This allows us to support arbitrary nesting.

It's likely we'll want to reuse this in other places where we're not as
careful today. We'll probably do this on a request-based basis, though.

Fixes #59176

(cherry picked from commit b478e91068)
2025-10-27 13:40:50 +01:00
Alan Agius fdedc24794 build: remove unused rollup-plugin-sourcemaps dependency
This dependency is not used as we use `rollup-plugin-sourcemaps2` instead.

(cherry picked from commit 7a187a3bfd)
2025-10-27 13:40:02 +01:00
Alan Agius 350a16a28f build: add @babel/core to list of rollup_runtime_deps
This will be needed following https://github.com/devversion/rules_angular/pull/72

(cherry picked from commit fffd34bb6e)
2025-10-27 13:39:36 +01:00
Alan Agius a1b4e381e6 build: refactor location of best-practices.md
This commit moves the best-practices.md file from adev/src/context to packages/core/resources. The BUILD.bazel files and other configuration files have been updated to reflect this change.

(cherry picked from commit 25e8bcbdf6)
2025-10-27 09:31:39 +01:00
Shuaib Hasan Akib e62da0d1c7 fix(docs-infra): preserve shell class for multifile code blocks
The ExampleViewer component was extracting only innerHTML from code
blocks in multifile examples, which lost the shell class applied by
the formatCode function. This caused the $ prompt to not appear for
shell commands in multifile blocks even when language="shell" was set.

Modified the Snippet interface to track shell language state and
updated getCodeSnippetsFromMultifileWrapper and getStandaloneCodeSnippet
methods to preserve the shell class. Updated example-viewer template
to conditionally apply the shell class to the code wrapper element.

Fixes inconsistency between standalone and multifile shell code blocks.

(cherry picked from commit 27e183330e)
2025-10-27 09:29:42 +01:00
idembele70 00a996dd12 docs: fix accessibility of @empty block message
(cherry picked from commit 202fceed73)
2025-10-27 09:29:15 +01:00
Angular Robot 38606bb99a build: update cross-repo angular dependencies
See associated pull request for more information.
2025-10-27 09:28:44 +01:00
Miles Malerba 22c012c985 refactor(forms): fix some typos
Fix some typos in signal forms code

(cherry picked from commit 01e1ad2b37)
2025-10-27 09:27:05 +01:00
Alan Agius 9b77b43241 refactor(docs-infra): streamline adev build configuration
This commit introduces a number of changes to streamline the build configuration for adev, the documentation application.

(cherry picked from commit 53287bce9b)
2025-10-27 09:26:25 +01:00
SkyZeroZx 3bc260c630 docs: Adds guide links to HTTP API docs for better discoverability
(cherry picked from commit c5e6b8bdc8)
2025-10-27 09:26:01 +01:00
aparziale 91eb1e1fe2 refactor: inject an instance of typescript-vfs.worker
Modified tsVfsWorker worker initialization logic

(cherry picked from commit e155a1e9d7)
2025-10-27 09:25:00 +01:00
AleksanderBodurri cbeedb03d4 refactor(devtools): use getRouterInstance to replace manual parsing logic
Previously we would look in the DI tree for a token named 'Router' and resolve its value.

Now we use the already existing getRouterInstance, which depends on ng global debug APIs to get the router instance of an application.

(cherry picked from commit c963569c0e)
2025-10-27 09:23:20 +01:00
Andrew Scott 7a2d029f51 refactor(router): Add provider for integrating with Navigation API and Location shim
This adds a (private) provider for integrating with the browser Navigation API.
This provider ensures that interactions with the `Location` service
use the underlying platform navigation rather than the history and
location APIs.

(cherry picked from commit dd09da8ba2)
2025-10-27 09:22:00 +01:00
Kristiyan Kostadinov 9e8b4eb686 fix(docs-infra): fix broken adev tests
Fixes some adev tests that are broken on main.

(cherry picked from commit b5f8d0b5b1)
2025-10-24 21:28:32 +02:00
Alan Agius e9f55a8817 Revert "build: refactor location of best-practices.md"
This reverts commit 07a51872d5.

(cherry picked from commit 620e2c4926)
2025-10-24 19:02:42 +02:00
Angular Robot 5099ed4f18 build: update cross-repo angular dependencies
See associated pull request for more information.
2025-10-24 18:48:39 +02:00
Matthieu Riegler d8388b210a docs(docs-infra): Support linking to individual playground templates
(cherry picked from commit 6e7b3c2aa6)
2025-10-24 18:47:14 +02:00
SkyZeroZx 2abf2fb501 feat(common): Blocks IPv6 localhost from preconnect checks
Prevents unnecessary preconnect warnings by adding IPv6 loopback ('[::1]') to the blocklist.

(cherry picked from commit a3639e2258)
2025-10-24 18:46:48 +02:00
SkyZeroZx fd65ebca0f refactor(common): Add missing OnDestroy interface in PreconnectLinkChecker
The OnDestroy interface was implemented but not declared; this adds the missing interface declaration

(cherry picked from commit 207baad322)
2025-10-24 18:46:48 +02:00
Andrew Scott de5b0661e9 fix(zone.js): Support jasmine v6
This fixes the jasmine patch to ensure we are patching the private APIs
off of the right location, which changed in v6.

see https://github.com/jasmine/jasmine/commit/168ff0a751b6280b170ce097410d77a4c7c1f449

(cherry picked from commit 48abe007d9)
2025-10-24 18:46:09 +02:00
Alan Agius fb13537949 build: refactor location of best-practices.md
This commit moves the best-practices.md file from adev/src/context to packages/core/resources. The BUILD.bazel files and other configuration files have been updated to reflect this change.

(cherry picked from commit 07a51872d5)
2025-10-24 18:45:36 +02:00
Angular Robot d430d99965 docs: update Angular CLI help
Updated Angular CLI help contents.
2025-10-24 15:29:27 +02:00
Angular Robot a8f1784970 build: update cross-repo angular dependencies
See associated pull request for more information.
2025-10-24 15:26:00 +02:00
jase88 4f5a4a4297 docs: update workspace configuration link in security documentation
(cherry picked from commit cdfd073448)
2025-10-24 15:25:15 +02:00
SkyZeroZx 17a71e9c59 docs: Fix syntax highlighting & formatting in HTTP guide
(cherry picked from commit b1a0bad342)
2025-10-24 15:24:02 +02:00
Matthieu Riegler c89062b130 docs(docs-infra): enable strict templates
(cherry picked from commit 57af0d7e1b)
2025-10-24 15:23:32 +02:00
Angular Robot c02aa80c5e docs: update Angular CDK apis (#64642)
Updated Angular CDK api files.

PR Close #64642
2025-10-24 09:38:54 +02:00
Angular Robot ebdef35a6b build: update cypress-io/github-action action to v6.10.3 (#64636)
See associated pull request for more information.

PR Close #64636
2025-10-24 09:36:34 +02:00
Angular Robot c590401e74 build: update cross-repo angular dependencies (#64630)
See associated pull request for more information.

PR Close #64630
2025-10-24 09:33:45 +02:00
Alan Agius 9c518fcfc5 build: enable auto merge strategy for pull requests (#64624)
This commit enables the 'auto' merge strategy for pull requests.
This strategy automatically determines the best merge method based on the
pull request's commits.

The auto merge strategy can:
- Delegate to the autosquash merge strategy if the PR has fixup/squash
  commits against multiple normal commits.
- Squash commits if the PR has only one normal commit and some
  fixup/squash commits.
- Rebase commits if the PR has no fixup/squash commits.

This improves the developer experience by automating the merge process. A
key benefit is that PRs that can be cleanly rebased will now appear as
'merged' in GitHub's UI, providing a clearer history than the previous
'unmerged' status that could occur with squashing.

Additionally, `dev-infra` and `bazel` are removed from the exempted scopes
for target labels as they are no longer necessary.

PR Close #64624
2025-10-24 09:32:13 +02:00
Matthieu Riegler a1ac9a6415 fix(forms): interop supports CVAs with signals (#64618)
The directive implemnetation might set CVA values during the template evaluation. Since the template is a reactive context we need to untrack when setting the CVA values to prevent writing to signals in a reactive context.

fixes #64614

PR Close #64618
2025-10-24 09:31:39 +02:00
Miles Malerba aa389a691b fix(core): ensure @for iteration over field is reactive (#64113)
When working with a proxy object such as signal forms' `Field`,
accessing the `lenght` or `Symbol.iterator` may trgger a reactive read.
This change ensures that `@for` properly captrues this before clearing
the active consumer.

PR Close #64113
2025-10-24 09:29:29 +02:00
Miles Malerba 0af83e6855 test(forms): test reactive iteration over array field (#64113)
Adds a test that verifies @for iteration over an array field is actually
reactive to new items being added to the array.

PR Close #64113
2025-10-24 09:29:29 +02:00
Angular Robot d7e85a4da5 docs: update Angular CLI help (#64620)
Updated Angular CLI help contents.

PR Close #64620
2025-10-23 18:24:28 +02:00
Angular Robot 4ce1ffc65c build: update cross-repo angular dependencies (#64623)
See associated pull request for more information.

PR Close #64623
2025-10-23 18:23:56 +02:00
Miles Malerba 02f7263133 refactor(forms): rename files related to metadata (#64603)
Renames some files to reflect the property => metadata name change

PR Close #64603
2025-10-23 18:13:16 +02:00
Miles Malerba a6a5fd7b7d refactor(forms): rename field state related to metdata (#64603)
Renames the field state related to metadata to reflect the new
"metadata" name. In particular:
- `property(...)` is renamed to `metadata(...)`
- `hasProperty(...)` is renamed to `hasMetadata(...)`

PR Close #64603
2025-10-23 18:13:16 +02:00
Miles Malerba f3c547b750 refactor(forms): rename logic functions related to metadata (#64603)
Renames logic functions related to metadata to align with the new
"metadata" name. Notably:
- `property(...)` => `metadata(...)`
- `aggregateProperty(...)` => `aggregateMetadata(...)`

PR Close #64603
2025-10-23 18:13:16 +02:00
Miles Malerba d963e7c035 refactor(forms): rename Property and AggregateProperty (#64603)
These have been renamed to `MetadataKey` and `AggregateMetadataKey`
respectively. The team consensus is that the term "property" is so
overloaded that it makes the topic difficult to explain & discuss, hence
the rename.

PR Close #64603
2025-10-23 18:13:16 +02:00
Angular Robot 0385c8163a build: update cross-repo angular dependencies (#64617)
See associated pull request for more information.

PR Close #64617
2025-10-23 16:00:22 +02:00
Angular Robot c443c07225 build: update cross-repo angular dependencies (#64610)
See associated pull request for more information.

PR Close #64610
2025-10-23 12:39:58 +02:00
Angular Robot b23c876d2a build: update pnpm to v10.19.0 (#64608)
See associated pull request for more information.

PR Close #64608
2025-10-23 12:38:35 +02:00
Angular Robot 29fd414a05 build: update dependency aspect_rules_js to v2.7.0 (#64607)
See associated pull request for more information.

PR Close #64607
2025-10-23 12:37:55 +02:00
SkyZeroZx 87afeb833b docs: Add router config options (#64529)
PR Close #64529
2025-10-23 12:34:58 +02:00
Andrew Scott b7cefeb864 fix(router): handle parenthesized outlets without a name in DefaultUrlSerializer (#64507)
Previously, the `DefaultUrlSerializer` would incorrectly parse URLs with a parenthesized outlet that did not have a name, such as `/(left)`. This would result in an `undefined` outlet name in the serialized URL.

This commit fixes the issue by ensuring that parenthesized outlets without a name are treated as primary outlets.

fixes #58516. Based on the description, either the URL was constructed
manually or by custom serializer.

PR Close #64507
2025-10-23 12:33:59 +02:00
Andrew Scott 292b9e3da5 refactor(zone.js): Improve missing proxy zone error for jest imported (#64497)
test functions

This improves the fakeAsync error message when importing it, describe,
etc from jest

We will not be further expanding the ZoneJS patches to support
additional use-cases.

fixes #47603

PR Close #64497
2025-10-22 23:26:25 +00:00
Angular Robot de2ee6ebd5 docs: update Angular CDK apis (#64599)
Updated Angular CDK api files.

PR Close #64599
2025-10-22 21:57:17 +00:00
Angular Robot d183153545 build: update cross-repo angular dependencies (#64602)
See associated pull request for more information.

PR Close #64602
2025-10-22 21:46:06 +00:00
Jessica Janiuk 2b51a838b2 release: cut the v21.0.0-next.9 release 2025-10-22 14:24:57 -07:00
2192 changed files with 105252 additions and 114664 deletions
-1
View File
@@ -1 +0,0 @@
../../AGENTS.md
-1
View File
@@ -1 +0,0 @@
../.gemini/skills
-3
View File
@@ -1,6 +1,3 @@
# Disable NG CLI TTY mode
build --action_env=NG_FORCE_TTY=false
# Enable debugging tests with --config=debug
test:debug --test_arg=--node_options=--inspect-brk --test_output=streamed --test_strategy=exclusive --test_timeout=9999 --nocache_test_results --strategy=TestRunner=standalone
+1 -1
View File
@@ -1 +1 @@
8.5.1
8.5.0
+12 -5
View File
@@ -1,16 +1,23 @@
# Image metadata and config.
# Ideally, the Node.js version should match what we use on CI.
FROM cimg/node:22.21.1-browsers@sha256:eee8ed828d5a54196456a86ac6872c43325acad54e59632261e23b486c458992
FROM cimg/node:18.13.0@sha256:45d0ee279f522c4562a464df71108104cc9b2187205333ffd0707d4f05589731
LABEL name="Angular dev environment" \
description="This image can be used to create a dev environment for building Angular." \
vendor="angular" \
version="1.0"
description="This image can be used to create a dev environment for building Angular." \
vendor="angular" \
version="1.0"
EXPOSE 4000 4200 4433 5000 8080 9876
EXPOSE 4200 4201 4205 4206 9876
# Switch to `root`.
USER root
# Configure `Node.js`/`npm`.
RUN npm config --global set user root
# Go! (And keep going.)
CMD ["tail", "--follow", "/dev/null"]
+5 -6
View File
@@ -2,11 +2,10 @@
{
"name": "Angular dev container",
"dockerFile": "Dockerfile",
"forwardPorts": [4200, 4201, 4205, 4206, 9876],
"appPort": [4000, 4200, 4433, 5000, 8080, 9876],
"postCreateCommand": "pnpm install",
"customizations": {
"vscode": {
"extensions": ["BazelBuild.vscode-bazel", "ms-vscode.vscode-typescript-tslint-plugin"]
}
}
"extensions": [
"devondcarew.bazel-code",
"ms-vscode.vscode-typescript-tslint-plugin"
],
}
-70
View File
@@ -1,70 +0,0 @@
description = "Researches part of the codebase and creates a skill for it"
prompt="""
## Role
You are an experienced senior developer specializing in reverse engineering and understanding
complex code, prompt engineering, and context engineering.
Your task is to build a complete understanding of the mental model and architecture of the code,
and to create an efficient context file that allows a coding agent to understand and work with the
code.
## Guiding Principles
1. **Deep Analysis:** Understand the _why_ behind the code. Not just a surface level listing of
files and classes.
2. **Curiosity:** Be curious. If something is unclear, confusing, or unexpected you _MUST_
investigate further until you fully understand.
3. **Efficient Token Use:** The final output will be directly included into the context of the
coding assistant, so be sure to make efficient use of tokens. Think deeply, but only capture the
most important information for the coding agent in the final output
## Procedure
1. Fully explore the code before first, with a focus on understanding the architecture and how all
of the pieces fit together.
2. Develop an understanding of the mental model behind the architecture. _Why_ is the code is
architected this way? How should developers think about the system?
3. Document your findings using the given output format described in the next section.
## Output Format
Note the following placeholders below:
- `[package]`: is a unique identifier for the current code package (for example if you're looking at
code under `packages/forms/signals` you might use `signal-forms` as the `[package]`)
- `[code-location]`: is the location of the current code within the larger repository
- `[context]`: is the context to add to the coding agent when it is working with this code.
With those placeholders in mind, write a file create a new directory under `.gemini/skills` with the
name `reference-[package]/`, and under that directory add a `SKILL.md` file with the following
content:
```md
---
name: reference-[package]
description: Explains the mental model and architecture of the code under `[code-location]`. You MUST use this skill any time you plan to work with code in `[code-location]`
---
[context]
```
## Additional User Instructions
The user may have additional instructions.
- The user should indicate what package to research
- The user may indicate that they want to update a package that has already been researched. In this
case, read the existing skill and make any required updates based on your research
- The user may request supplemental information be added to the skill (if so, add this to the
existing skill in a new markdown file under a `references` directory within the skill. Add a
section to the main `SKILL.md` that mentions what supplemental information is available)
Here are the user's additional instructions:
{{args}}
"""
-5
View File
@@ -1,5 +0,0 @@
{
"context": {
"fileName": ["AGENTS.md", "GEMINI.md"]
}
}
-178
View File
@@ -1,178 +0,0 @@
---
name: adev-writing-guide
description: Comprehensive writing guide for Angular documentation (adev). Covers Google Technical Writing standards, Angular-specific markdown extensions, code blocks, and components. Use when authoring or reviewing content in adev/src/content.
---
# Angular Documentation (adev) Writing Guide
This skill provides comprehensive guidelines for authoring content in `adev/src/content`. It combines Google's technical writing standards with Angular-specific markdown conventions, components, and best practices.
## I. Google Technical Writing Guidelines
### Tone and Content
- **Be conversational and friendly:** Maintain a helpful yet professional tone. Avoid being overly casual.
- **Write accessibly:** Ensure documentation is understandable to a diverse global audience, including non-native English speakers.
- **Audience-first:** Focus on what the user needs to do, not just what the system does.
- **Avoid pre-announcing:** Do not mention unreleased features or make unsupported claims.
- **Use descriptive link text:** Link text should clearly indicate the destination (e.g., avoid "click here").
### Language and Grammar
- **Use second person ("you"):** Address the reader directly.
- **Prefer active voice:** Clearly state who or what is performing the action (e.g., "The system generates a token" vs "A token is generated").
- **Standard American English:** Use standard American spelling and punctuation.
- **Conditional clauses first:** Place "if" or "when" clauses before the instruction (e.g., "If you encounter an error, check the logs").
- **Define terms:** Introduce new or unfamiliar terms/acronyms upon first use.
- **Consistent terminology:** Use the same term for the same concept throughout the document.
- **Conciseness:** Aim for one idea per sentence. Keep sentences short.
### Formatting and Organization
- **Sentence case for headings:** Capitalize only the first word and proper nouns in titles and headings.
- **Lists:**
- **Numbered lists:** Use for sequential steps or prioritized items.
- **Bulleted lists:** Use for unordered collections of items.
- **Description lists:** Use for term-definition pairs.
- **Serial commas:** Use the Oxford comma (comma before the last item in a list of three or more).
- **Code formatting:** Use code font for code-related text (filenames, variables, commands).
- **UI Elements:** formatting user interface elements in **bold**.
- **Date formatting:** Use unambiguous formats (e.g., "September 4, 2024" rather than "9/4/2024").
- **Structure:** Use logical hierarchy with clear introductions and navigation. Headings should be task-based where possible.
### Images and Code Samples
- **Images:** Use simple, clear illustrations to enhance understanding.
- **Captions:** Write captions that support the image.
- **Code Samples:**
- Ensure code is correct and builds without errors.
- Follow language-specific conventions.
- **Comments:** Focus on _why_, not _what_. Avoid commenting on obvious code.
### Reference Hierarchy
1. Project-specific style guidelines (if any exist in `CONTRIBUTING.md` or similar).
2. Google Developer Documentation Style Guide.
3. Merriam-Webster (spelling).
4. Chicago Manual of Style (non-technical).
5. Microsoft Writing Style Guide (technical).
---
## II. Angular Documentation Specifics
### Code Blocks
Use the appropriate language identifier for syntax highlighting:
- **TypeScript (Angular):** Use `angular-ts` when TypeScript code examples contain inline templates.
- **HTML (Angular):** Use `angular-html` for Angular templates.
- **TypeScript (Generic):** Use `ts` for plain TypeScript.
- **HTML (Generic):** Use `html` for plain HTML.
- **Shell/Terminal:** Use `shell` or `bash`.
- **Mermaid Diagrams:** Use `mermaid`.
#### Attributes
You can enhance code blocks with attributes in curly braces `{}` after the language identifier:
- `header="Title"`: Adds a title to the code block.
- `linenums`: Enables line numbering.
- `highlight="[1, 3-5]"`: Highlights specific lines.
- `hideCopy`: Hides the copy button.
- `prefer`: Marks code as a preferred example (green border/check).
- `avoid`: Marks code as an example to avoid (red border/cross).
**Example:**
````markdown
```angular-ts {header:"My Component", linenums, highlight="[2]"}
@Component({
selector: 'my-app',
template: '<h1>Hello</h1>',
})
export class App {}
```
````
#### `<docs-code>` Component
For more advanced code block features, use the `<docs-code>` component:
- `path`: Path to a source file (e.g., `adev/src/content/examples/...`).
- `header`: Custom header text.
- `language`: Language identifier (e.g., `angular-ts`).
- `linenums`: Boolean attribute.
- `highlight`: Array of line numbers/ranges (e.g., `[[3,7], 9]`).
- `diff`: Path to diff file.
- `visibleLines`: Range of lines to show initially (collapsible).
- `region`: Region to extract from source file.
- `preview`: Boolean. Renders a live preview (StackBlitz). _Only works with standalone examples._
- `hideCode`: Boolean. Collapses code by default.
**Multifile Example:**
```html
<docs-code-multifile path="..." preview>
<docs-code path="..." />
<docs-code path="..." />
</docs-code-multifile>
```
### Alerts / Admonitions
Use specific keywords followed by a colon for alerts. These render as styled blocks.
- `NOTE:` For ancillary information.
- `TIP:` For helpful hints or shortcuts.
- `IMPORTANT:` For crucial information.
- `CRITICAL:` For warnings about potential data loss or severe issues.
- `TODO`: For incomplete documentation.
- `QUESTION:` To pose a question to the reader.
- `SUMMARY:` For section summaries.
- `TLDR:` For concise summaries.
- `HELPFUL:` For best practices.
**Example:**
```markdown
TIP: Use `ng serve` to run your application locally.
```
### Custom Components
- **Cards (`<docs-card>`):**
- Must be inside `<docs-card-container>`.
- Attributes: `title`, `link`, `href`.
- **Callouts (`<docs-callout>`):**
- Attributes: `title`, `important`, `critical`.
- **Pills (`<docs-pill>`):**
- Must be inside `<docs-pill-row>`.
- Attributes: `title`, `href`.
- **Steps / Workflow (`<docs-step>`):**
- Must be inside `<docs-workflow>`.
- Attributes: `title`.
- **Tabs (`<docs-tab>`):**
- Must be inside `<docs-tab-group>`.
- Attributes: `label`.
- **Videos (`<docs-video>`):**
- Attributes: `src` (YouTube embed URL), `alt`.
### Images
Use standard markdown syntax with optional attributes for sizing and loading behavior.
- `#small`, `#medium`: Append to image URL for sizing.
- `{loading: 'lazy'}`: Add attribute for lazy loading.
**Example:**
```markdown
![Alt Text](path/to/image.png#medium {loading: 'lazy'})
```
### Headers
- Use markdown headers (`#`, `##`, `###`).
- Ensure a logical hierarchy (don't skip levels).
- `h2` and `h3` are most common for content structure.
@@ -1,91 +0,0 @@
---
name: reference-compiler-cli
description: Explains the mental model and architecture of the code under `packages/compiler-cli`. You MUST use this skill any time you plan to work with code in `packages/compiler-cli`
---
# Angular Compiler CLI (`ngtsc`) Architecture
## Overview
The `packages/compiler-cli` package contains the Angular Compiler (Ivy), often referred to as `ngtsc`. It is a wrapper around the TypeScript compiler (`tsc`) that extends it with Angular-specific capabilities.
The core goal of `ngtsc` is to compile Angular decorators (like `@Component`, `@Directive`, `@Pipe`) into static properties on the class (Ivy instructions, e.g., `static ɵcmp = ...`). It also performs template type checking and ahead-of-time (AOT) compilation.
## Mental Model
The compiler is designed as a **lazy, incremental, and partial** compilation pipeline.
1. **Wrapper Pattern**: `NgtscProgram` wraps the standard `ts.Program`. It intercepts calls to act as a drop-in replacement for standard tooling.
2. **Traits System**: Every class with an Angular decorator is considered a "Trait". The compiler manages the state of these traits through a state machine:
- **Pending**: Detected but not processed.
- **Analyzed**: Metadata extracted, template parsed (but dependencies not yet linked).
- **Resolved**: Dependencies (directives/pipes in template) resolved, import cycles handled.
- **Skipped**: Not an Angular class.
3. **Lazy Analysis**: Analysis only happens when necessary (e.g., when diagnostics are requested or emit is prepared).
4. **Output AST**: The compiler generates an intermediate "Output AST" (`o.Expression`) for the generated code, which is then translated into TypeScript AST nodes during the emit phase.
## Key Subsystems
### 1. Core Orchestration (`ngtsc/core`)
- **`NgtscProgram`**: The public API implementing `api.Program`. It manages the `ts.Program` and the `NgCompiler`.
- **`NgCompiler`**: The brain of the compiler. It orchestrates the compilation phases (Analysis, Resolution, Type Checking, Emit). It holds the `TraitCompiler`.
### 2. Trait Compilation (`ngtsc/transform`)
- **`TraitCompiler`**: Manages the lifecycle of "Traits". It iterates over source files, identifies decorated classes, and delegates to the appropriate `DecoratorHandler`.
- **`Trait`**: A state container for a class, holding its handler, analysis results, and resolution results.
### 3. Decorator Handlers (`ngtsc/annotations`)
- **`DecoratorHandler`**: An interface for handling specific decorators.
- **`ComponentDecoratorHandler`**: The most complex handler. It:
- Extracts metadata (selector, inputs, outputs).
- Parses the template.
- Resolves used directives and pipes (`R3TargetBinder`).
- Generates the `ɵcmp` instruction.
- **`DirectiveDecoratorHandler`**, **`PipeDecoratorHandler`**, **`NgModuleDecoratorHandler`**: Handle their respective decorators.
### 4. Template Type Checking (`ngtsc/typecheck`)
- **`TemplateTypeChecker`**: Generates "Type Check Blocks" (TCBs). A TCB is a block of TypeScript code that represents the template's logic in a way `tsc` can understand and check for errors.
- **`TypeCheckBlock`**: The actual generated code that validates bindings, events, and structural directives.
### 5. Metadata & Scope (`ngtsc/metadata`, `ngtsc/scope`)
- **`MetadataReader`**: Reads Angular metadata from source files (using `LocalMetadataRegistry`) and `.d.ts` files (using `DtsMetadataReader`).
- **`ScopeRegistry`**: Determines the "compilation scope" of a component (which directives/pipes are available to it), handling `NgModule` transitive exports and Standalone Component imports.
### 6. Emit & Transformation (`ngtsc/transform`)
- **`ivyTransformFactory`**: A TypeScript transformer factory.
- **`IvyCompilationVisitor`**: Visits classes, triggers compilation via `TraitCompiler`, and collects the Output AST.
- **`IvyTransformationVisitor`**: Translates the Output AST into TypeScript AST, injects the `static ɵ...` fields, and removes the original decorators.
## Compilation Phases
1. **Construction**: `NgtscProgram` creates `NgCompiler`, which sets up all registries and the `TraitCompiler`.
2. **Analysis** (`analyzeSync`):
- The `TraitCompiler` scans files.
- `DecoratorHandler`s extract metadata and parse templates.
- No cross-file resolution happens here (allowing for parallelism and caching).
3. **Resolution** (`resolve`):
- `TraitCompiler` resolves traits.
- Components link their templates to specific Directives and Pipes (found via `ScopeRegistry`).
- Import cycles are detected and handled (e.g., via "remote scoping").
4. **Type Checking**:
- `TemplateTypeChecker` creates TCBs for all components.
- TypeScript diagnostics are retrieved for these TCBs.
5. **Emit** (`prepareEmit`):
- `ivyTransformFactory` is created.
- TS `emit` is called.
- The transformers run, injecting the compiled Ivy instructions into the JS/DTS output.
## Important File Locations
- `packages/compiler-cli/src/ngtsc/program.ts`: Entry point (`NgtscProgram`).
- `packages/compiler-cli/src/ngtsc/core/src/compiler.ts`: Core logic (`NgCompiler`).
- `packages/compiler-cli/src/ngtsc/transform/src/trait.ts`: Trait state machine.
- `packages/compiler-cli/src/ngtsc/annotations/component/src/handler.ts`: Component compilation logic.
- `packages/compiler-cli/src/ngtsc/typecheck/src/template_type_checker.ts`: Type checking logic.
- `packages/compiler-cli/src/ngtsc/transform/src/transform.ts`: AST transformation logic.
-96
View File
@@ -1,96 +0,0 @@
---
name: reference-core
description: Explains the mental model and architecture of the code under `packages/core`. You MUST use this skill any time you plan to work with code in `packages/core`
---
# Angular Core (`packages/core`) Mental Model
This document outlines the architecture and mental model for `packages/core`, the heart of the Angular framework.
## 1. High-Level Architecture
`packages/core` contains the runtime logic for Angular. Its primary responsibilities are:
1. **Rendering (Ivy/Render3)**: Transforming templates into DOM updates.
2. **Dependency Injection (DI)**: Managing object creation and lifetime.
3. **Change Detection**: Synchronizing the model with the view.
4. **Reactivity**: Signals and Zone.js integration.
## 2. Rendering Engine (Ivy / Render3)
The rendering engine (located in `packages/core/src/render3`) uses an **instruction-based** approach.
### Key Concepts
- **Instructions**: The Angular compiler transforms templates into a sequence of instruction calls (e.g., `ɵɵelementStart`, `ɵɵtext`, `ɵɵproperty`). These instructions are executed at runtime to create and update the view.
- _Location_: `packages/core/src/render3/instructions`
- **LView (Logical View)**: An array containing the _state_ of a specific view instance. It holds:
- DOM nodes (`RElement`, `RText`).
- Binding values (for change detection).
- Directive/Component instances.
- _Context_: `packages/core/src/render3/interfaces/view.ts`
- **TView (Template View)**: An array containing the _static structure_ of a view. It is shared across all instances (`LView`s) of the same component/template. It holds:
- Property names for bindings.
- Node relationship information.
- Compiled directive definitions.
- _Context_: `packages/core/src/render3/interfaces/view.ts`
- **Memory Layout**: `LView` and `TView` are parallel arrays. Index `i` in `LView` corresponds to metadata at index `i` in `TView`.
- `HEADER`: Fixed size, contains context (Parent, Host, etc.).
- `DECLS`: Static nodes (elements, text, pipes).
- `VARS`: Binding values.
- `EXPANDO`: Dynamic data (host bindings, injectors).
### The Render Cycle
1. **Creation Mode**: Instructions create DOM nodes and store them in `LView`.
2. **Update Mode**: Instructions check current values against previous values stored in `LView`. If changed, they update the DOM.
## 3. Dependency Injection (DI)
DI in Angular is hierarchical and split into two systems that interact:
### Module Injector (`R3Injector`)
- Configured via `@NgModule.providers` or `providedIn: 'root'`.
- Stored in a hierarchy of `R3Injector` instances.
- _Location_: `packages/core/src/di/r3_injector.ts`
### Node Injector
- Configured via `@Component.providers` or `@Directive.providers`.
- **Not a class**, but a data structure embedded in the `LView` ("Expando" section).
- Uses **Bloom Filters** (`TView.data`) to quickly check if a token is present at a specific node index before traversing up the tree.
- Resolves tokens starting from the current node, walking up the view tree (Element Injector hierarchy), and falling back to the Module Injector if not found.
## 4. Change Detection
- **Dirty Checking**: Angular checks if values bound in templates have changed.
- **Strategies**:
- `Default`: Checks everything.
- `OnPush`: Checks only if inputs change, events fire, or signals update.
- **Signals**: The new reactivity primitive. Signals notify the scheduler when they change, potentially allowing for fine-grained updates (Zoneless).
## 5. Key Directories to Know
- `src/render3`: The Ivy rendering engine.
- `instructions`: The runtime instructions called by compiled code.
- `interfaces`: `LView`, `TView`, `TNode` definitions.
- `src/di`: Dependency injection system.
- `src/change_detection`: Change detection logic.
- `src/zone`: Zone.js integration.
- `src/signal`: Signals implementation (if present in this version, otherwise likely in `primitives`).
## 6. Conventions & Gotchas
- **Prefixes**: Private/Internal exports often start with `ɵ`.
- **Global State**: Ivy relies heavily on global state (e.g., `getLView()`) during instruction execution to avoid passing context arguments everywhere. This is for performance and code size.
- **Performance**: The code is highly optimized for performance and memory. You will see arrays used instead of objects, bitmasks, and manual memory management patterns. **Respect these patterns.**
## 7. How to Modify Core
1. **Understand the Instruction**: If modifying runtime behavior, find the corresponding instruction in `src/render3/instructions`.
2. **Check `LView`/`TView` Impact**: If adding state, understand where it fits in the `LView` array.
3. **Tests**: Core has extensive tests. Run them using Bazel.
@@ -1,104 +0,0 @@
---
name: reference-signal-forms
description: Explains the mental model and architecture of the code under `packages/forms/signals`. You MUST use this skill any time you plan to work with code in `packages/forms/signals`
---
# Signal Forms Architecture
The `packages/forms/signals` directory contains an experimental, signal-based forms API for Angular.
This system differs significantly from the existing Reactive and Template-driven forms.
## Mental Model
1. **Model-Driven**: The system is built around a `WritableSignal<T>` which serves as the **single source of truth**.
Unlike Reactive Forms where the `FormControl` holds the value, here the `Signal` holds the value.
The form is merely a _view_ or _projection_ of that signal, adding form-specific state (validity, dirty, touched).
2. **Proxy-Based Traversal**: The form API (`form(signal)`) returns a `FieldTree`. This object is a **Proxy**.
It allows accessing nested fields (e.g., `myForm.user.name`) without manually creating control groups.
Accessing a property on the proxy lazily resolves or creates the corresponding `FieldNode`.
3. **Schema-Based Logic**: Validation, disabled state, and other metadata are defined separately via **Schemas**.
Schemas are applied to the form structure using functions like `apply`, `applyEach` (for arrays), and `applyWhen`.
This separates the _structure_ of the data from the _rules_ governing it.
4. **Directives as Glue**: The `[formField]` directive binds a DOM element (native input or custom control) to a `FieldNode`.
It handles:
- Syncing the value between the DOM and the Signal.
- Reflecting state (valid, touched, etc.) to the UI.
- Handling user interaction events (blur, input).
## Key Components
### 1. `FieldNode` (`src/field/node.ts`)
The central internal class representing a single field in the form graph. It aggregates several state managers:
- `structure`: Manages parent/child relationships and signal slicing.
- `validationState`: Computes `valid`, `invalid`, `errors` signals.
- `nodeState`: Tracks `touched`, `dirty`, `pristine`.
- `metadataState`: Stores metadata like `min`, `max`, `required`.
- `submitState`: Tracks submission status and server errors.
### 2. `ValidationState` (`src/field/validation.ts`)
Manages the complexity of validation:
- **Synchronous Errors**: Derived from schema rules.
- **Asynchronous Errors**: Handled via signals, including 'pending' states.
- **Tree Errors**: Errors that bubble up or are targeted at specific fields.
- **Submission Errors**: Server-side errors injected imperatively via `submit()`.
### 3. `FormField` Directive (`src/directive/form_field_directive.ts`)
The bridge between the `FieldNode` and the DOM.
- Selector: `[formField]`
- It supports:
- **Native Elements**: `<input>`, `<select>`, `<textarea>`.
- **Custom Controls**: Components implementing `FormUiControl` or `FormValueControl`.
- **Legacy Interop**: Components implementing `ControlValueAccessor` (via `InteropNgControl`).
### 4. `Schema` (`src/api/structure.ts` & `src/api/rules`)
Defines the behavior.
- Created via `schema(fn)`.
- Applied via `apply(path, schema)`.
- Rules include validators (`required`, `pattern`, `min`, `max`) and state modifiers (`disabled`, `hidden`).
## Data Flow
1. **Read**: `form.field.value()` reads directly from the underlying signal (projected to the specific path).
2. **Write**: Writing to the form (e.g., via UI) updates the underlying signal.
3. **Validation**: A computed effect observes the value signal and runs validators defined in the schema.
## Usage Example (Conceptual)
```typescript
// 1. Define Model
const user = signal({name: '', age: 0});
// 2. Define Schema
const userRules = schema((u) => {
required(u.name);
min(u.age, 18);
});
// 3. Create Form
const userForm = form(user, userRules); // OR apply(userForm, userRules)
// 4. Bind in Template
// <input [formField]="userForm.name">
```
## Important Files
- `packages/forms/signals/src/api/structure.ts`: Public API entry points (`form`, `apply`).
- `packages/forms/signals/src/api/control.ts`: Interfaces for custom controls (`FormUiControl`).
- `packages/forms/signals/src/field/node.ts`: The `FieldNode` implementation.
- `packages/forms/signals/src/directive/form_field_directive.ts`: The `[formField]` directive.
## Supplemental Information
- [Compiler & Core Integration](references/integration.md): Details how `[formField]` hooks into type-checking and the runtime.
@@ -1,46 +0,0 @@
# Signal Forms Integration: Compiler & Core
This document explains how the Signal Forms system hooks into the Angular compiler and runtime to provide seamless type-checking and efficient updates.
## 1. Compiler-CLI Integration (Type Checking)
The `packages/compiler-cli` package contains specific logic to support `[formField]`. This is primarily handled in `src/ngtsc/typecheck/src/ops/signal_forms.ts`.
### Key Mechanisms:
- **Detection**: The compiler identifies a directive as a "Field Directive" if it has the `ɵNgFieldDirective` property or comes from `@angular/forms/signals`.
- **Synthetic Binding Expansion**: When you write `<input [formField]="mySignal" />`, the type checker doesn't just check `formField`. It synthetically expands this into a set of bindings for validation:
- `[value]="mySignal()"` (or `checked` for checkboxes)
- `[disabled]="mySignal.disabled()"`
- `[required]="mySignal.required()"`
- ...and so on.
- This ensures that `mySignal` (the `FieldNode`) has all the necessary properties to drive the form control.
- **Conflict Detection**: It actively prevents "double binding". If you bind `[formField]`, you are _banned_ from also binding `[value]`, `[disabled]`, `[required]`, etc., as the signal form should be the single source of truth.
- **Element Type Validation**:
- **Native Elements**: Checks that the signal's value type matches the element type (e.g., `<input type="checkbox">` requires a `boolean` signal).
- **Custom Controls**: Detects if a custom component is a "Form Value Control" (has a `value` input/output) or "Form Checkbox Control" (has a `checked` input/output) and validates against that.
### Relevant Files:
- `packages/compiler-cli/src/ngtsc/typecheck/src/ops/signal_forms.ts`: The core logic for `TcbNativeFieldOp` and `SignalFormFieldOp`.
## 2. Core Runtime Integration
The `packages/core` package provides the low-level instructions that power the `FormField` directive. This allows it to do things normal directives cannot, like efficiently syncing state without change detection overhead for every property.
### Key Mechanisms:
- **`ɵngControlCreate` Hook**: The `FormField` directive defines a special method `ɵngControlCreate`.
- **`ɵɵcontrol` Instructions**: When the compiler sees `ɵngControlCreate`, it emits:
- `ɵɵcontrolCreate`: Called during the creation phase.
- `ɵɵcontrol`: Called during the update phase.
- **`ControlDirectiveHost`**: These instructions provide the directive with a `ControlDirectiveHost`. This is a privileged interface that allows the `FormField` directive to:
- **Access the Element**: Get direct access to the native element or component instance.
- **Set Inputs**: Write directly to inputs of _other directives_ on the same node (e.g., setting the `value` input of a custom control).
- **Listen to Outputs**: Subscribe to outputs of other directives (e.g., `valueChange`).
- **Bypass Templates**: It effectively acts as a "meta-directive" that manages the bindings for you, bypassing the need for explicit template syntax for every property.
### Relevant Files:
- `packages/core/src/render3/instructions/control.ts`: Implementation of `ɵɵcontrol` instructions.
- `packages/forms/signals/src/directive/form_field_directive.ts`: The directive that implements the hook.
-2
View File
@@ -19,8 +19,6 @@ cc34e5fb072e7903e01463953a19d18503a39347
f9781f9804f1e7c84df356d9aeb267730a7fc499
dc62446ef7f2898a20d3be1196ecaf2a92a1077d
711cb416260ca11ff158fc39b372efa2cf022d36
af77b89e2abb67bba201a53d500874ad572b8384
6270bba056cfaadb3fe0b2bf3b17036bdc28b90e
# commits that switch to relative imports
3d2263cb1f208e561692e41c5a17196c3c57877f
ae047c59c0041e0a43cec020520d40ccd981b444
-48
View File
@@ -1,48 +0,0 @@
name: 'VSCode Angular Language Service extension'
description: Report an issue or suggest a feature for the VSCode Angular Language Service extension
body:
- type: checkboxes
id: bug-report-or-feature-request
attributes:
label: Is this a bug report or a feature request?
description: Select one.
options:
- label: Bug Report
- label: Feature Request
- type: textarea
id: reproduction-steps
attributes:
label: Please provide the steps to reproduce the issue [Bug Report only]
- type: textarea
id: expected-vs-actual-behavior
attributes:
label: Please provide the expected behavior vs the actual behavior you encountered [Bug Report only]
- type: textarea
id: screenshot
attributes:
label: Please provide a screenshot if possible [Bug Report only]
- type: textarea
id: exception-or-error
attributes:
label: Please provide the exception or error you saw [Bug Report only]
render: true
- type: textarea
id: description
attributes:
label: Description [Feature Request only]
- type: textarea
id: proposed-solution
attributes:
label: Proposed solution [Feature Request only]
- type: textarea
id: alternatives-considered
attributes:
label: Alternatives considered [Feature Request only]
@@ -1,53 +1,33 @@
import {Deployment} from './deployments.mjs';
import {join} from 'node:path';
import {readFile, writeFile} from 'node:fs/promises';
import {join} from 'path';
import {readFileSync, writeFileSync} from 'fs';
export async function generateSitemap(deployment: Deployment, distDir: string) {
const servingUrlWithoutEndingSlash = deployment.servingUrl.endsWith('/')
? deployment.servingUrl.slice(0, -1)
: deployment.servingUrl;
export async function generateSitemap(deployment: Deployment, distDir: string): Promise<void> {
/** Timestamp string used to of the last file update. */
const lastModifiedTimestamp = new Date().toISOString();
/** An object containing all of the routes available within the application. */
const {routes} = JSON.parse(await readFile(join(distDir, 'prerendered-routes.json'), 'utf-8'));
const routePaths = Object.keys(routes);
const routes = JSON.parse(readFileSync(join(distDir, 'prerendered-routes.json'), 'utf-8'));
/** The generated sitemap string. */
const sitemap = `<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
${routePaths
.map(
(route) => `<url>
<loc>${joinUrlParts(deployment.servingUrl, route)}</loc>
${Object.keys(routes.routes)
.map((route) => {
const routeWithoutLeadingSlash = route.startsWith('/') ? route.slice(1) : route;
return `
<url>
<loc>${servingUrlWithoutEndingSlash}/${routeWithoutLeadingSlash}</loc>
<lastmod>${lastModifiedTimestamp}</lastmod>
<changefreq>daily</changefreq>
<priority>1.0</priority>
</url>`,
)
</url>
`;
})
.join('')}
</urlset>`;
await writeFile(join(distDir, 'browser', 'sitemap.xml'), sitemap, 'utf-8');
console.log(`Generated sitemap with ${routePaths.length} entries.`);
}
function joinUrlParts(...parts: string[]): string {
const normalizeParts: string[] = [];
for (const part of parts) {
if (part === '') {
// Skip any empty parts
continue;
}
let normalizedPart = part;
if (part[0] === '/') {
normalizedPart = normalizedPart.slice(1);
}
if (part.at(-1) === '/') {
normalizedPart = normalizedPart.slice(0, -1);
}
if (normalizedPart !== '') {
normalizeParts.push(normalizedPart);
}
}
return normalizeParts.join('/');
writeFileSync(join(distDir, 'browser', 'sitemap.xml'), sitemap, 'utf-8');
console.log(`Generated sitemap with ${Object.keys(routes.routes).length} entries.`);
}
File diff suppressed because one or more lines are too long
+2 -2
View File
@@ -5,9 +5,9 @@ runs:
using: 'composite'
steps:
- name: Setup Bazel
uses: angular/dev-infra/github-actions/bazel/setup@16c5f6e199e3e1b67ae5a62385d36366bb9a429d
uses: angular/dev-infra/github-actions/bazel/setup@87ed54ddedde42b443be7c6fe36cdaf0a907ea39
- name: Setup Saucelabs Variables
uses: angular/dev-infra/github-actions/saucelabs@16c5f6e199e3e1b67ae5a62385d36366bb9a429d
uses: angular/dev-infra/github-actions/saucelabs@87ed54ddedde42b443be7c6fe36cdaf0a907ea39
- name: Starting Saucelabs tunnel service
shell: bash
run: ./tools/saucelabs/sauce-service.sh run &
+4 -5
View File
@@ -21,17 +21,16 @@ jobs:
(github.event.action == 'synchronize' && contains(github.event.pull_request.labels.*.name, 'adev: preview'))
steps:
- name: Initialize environment
uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@16c5f6e199e3e1b67ae5a62385d36366bb9a429d
uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@87ed54ddedde42b443be7c6fe36cdaf0a907ea39
- name: Setup Bazel
uses: angular/dev-infra/github-actions/bazel/setup@16c5f6e199e3e1b67ae5a62385d36366bb9a429d
uses: angular/dev-infra/github-actions/bazel/setup@87ed54ddedde42b443be7c6fe36cdaf0a907ea39
- name: Setup Bazel RBE
uses: angular/dev-infra/github-actions/bazel/configure-remote@16c5f6e199e3e1b67ae5a62385d36366bb9a429d
uses: angular/dev-infra/github-actions/bazel/configure-remote@87ed54ddedde42b443be7c6fe36cdaf0a907ea39
- name: Install node modules
run: pnpm install --frozen-lockfile
- name: Build adev
# `snapshot-build` config is used to stamp the exact version with sha in the footer.
run: pnpm bazel build //adev:build.production --config=snapshot-build
- uses: angular/dev-infra/github-actions/previews/pack-and-upload-artifact@16c5f6e199e3e1b67ae5a62385d36366bb9a429d
- uses: angular/dev-infra/github-actions/previews/pack-and-upload-artifact@87ed54ddedde42b443be7c6fe36cdaf0a907ea39
with:
workflow-artifact-name: 'adev-preview'
pull-number: '${{github.event.pull_request.number}}'
+2 -2
View File
@@ -29,7 +29,7 @@ jobs:
runs-on: ubuntu-latest
if: ${{ github.event.workflow_run.conclusion == 'success' }}
steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
- uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5
with:
token: '${{secrets.GITHUB_TOKEN}}'
@@ -40,7 +40,7 @@ jobs:
npx -y firebase-tools@latest target:clear --config adev/firebase.json --project ${{env.PREVIEW_PROJECT}} hosting angular-docs
npx -y firebase-tools@latest target:apply --config adev/firebase.json --project ${{env.PREVIEW_PROJECT}} hosting angular-docs ${{env.PREVIEW_SITE}}
- uses: angular/dev-infra/github-actions/previews/upload-artifacts-to-firebase@16c5f6e199e3e1b67ae5a62385d36366bb9a429d
- uses: angular/dev-infra/github-actions/previews/upload-artifacts-to-firebase@87ed54ddedde42b443be7c6fe36cdaf0a907ea39
with:
github-token: '${{secrets.GITHUB_TOKEN}}'
workflow-artifact-name: 'adev-preview'
@@ -14,9 +14,9 @@ jobs:
runs-on: ubuntu-latest
if: github.event.repository.fork == false
steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
- uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1
with:
persist-credentials: false
- uses: angular/dev-infra/github-actions/branch-manager@16c5f6e199e3e1b67ae5a62385d36366bb9a429d
- uses: angular/dev-infra/github-actions/branch-manager@87ed54ddedde42b443be7c6fe36cdaf0a907ea39
with:
angular-robot-key: ${{ secrets.ANGULAR_ROBOT_PRIVATE_KEY }}
+2 -2
View File
@@ -28,7 +28,7 @@ jobs:
- uses: alessbell/pull-request-comment-branch@aad01d65d6982b8eacabed5e9a684cd8ceb98da6 # v1.1
id: comment-branch
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
- uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1
with:
# Specify repository as the PR branch might be from a fork.
repository: ${{steps.comment-branch.outputs.head_owner}}/${{steps.comment-branch.outputs.head_repo}}
@@ -38,7 +38,7 @@ jobs:
- run: pnpm install --frozen-lockfile
- uses: angular/dev-infra/github-actions/bazel/configure-remote@16c5f6e199e3e1b67ae5a62385d36366bb9a429d
- uses: angular/dev-infra/github-actions/bazel/configure-remote@87ed54ddedde42b443be7c6fe36cdaf0a907ea39
with:
bazelrc: ./.bazelrc.user
+27 -27
View File
@@ -21,7 +21,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Initialize environment
uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@16c5f6e199e3e1b67ae5a62385d36366bb9a429d
uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@87ed54ddedde42b443be7c6fe36cdaf0a907ea39
- name: Install node modules
run: pnpm install --frozen-lockfile
- name: Check code lint
@@ -39,13 +39,13 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Initialize environment
uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@16c5f6e199e3e1b67ae5a62385d36366bb9a429d
uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@87ed54ddedde42b443be7c6fe36cdaf0a907ea39
with:
disable-package-manager-cache: true
- name: Setup Bazel
uses: angular/dev-infra/github-actions/bazel/setup@16c5f6e199e3e1b67ae5a62385d36366bb9a429d
uses: angular/dev-infra/github-actions/bazel/setup@87ed54ddedde42b443be7c6fe36cdaf0a907ea39
- name: Setup Bazel RBE
uses: angular/dev-infra/github-actions/bazel/configure-remote@16c5f6e199e3e1b67ae5a62385d36366bb9a429d
uses: angular/dev-infra/github-actions/bazel/configure-remote@87ed54ddedde42b443be7c6fe36cdaf0a907ea39
with:
google_credential: ${{ secrets.RBE_TRUSTED_BUILDS_USER }}
- name: Install node modules
@@ -55,7 +55,7 @@ jobs:
- name: Test build
run: pnpm devtools:build:chrome
- name: Cypress run
uses: cypress-io/github-action@e44ee0fa67251ab7e2d854d85b3a466577f47d14 # v7.1.3
uses: cypress-io/github-action@2ad32e649e4db26c07674ebae31a297601dbcbaf # v6.10.8
with:
command: pnpm devtools:test:e2e
start: pnpm bazel run //devtools/src:devserver
@@ -67,11 +67,11 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Initialize environment
uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@16c5f6e199e3e1b67ae5a62385d36366bb9a429d
uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@87ed54ddedde42b443be7c6fe36cdaf0a907ea39
- name: Setup Bazel
uses: angular/dev-infra/github-actions/bazel/setup@16c5f6e199e3e1b67ae5a62385d36366bb9a429d
uses: angular/dev-infra/github-actions/bazel/setup@87ed54ddedde42b443be7c6fe36cdaf0a907ea39
- name: Setup Bazel Remote Caching
uses: angular/dev-infra/github-actions/bazel/configure-remote@16c5f6e199e3e1b67ae5a62385d36366bb9a429d
uses: angular/dev-infra/github-actions/bazel/configure-remote@87ed54ddedde42b443be7c6fe36cdaf0a907ea39
with:
google_credential: ${{ secrets.RBE_TRUSTED_BUILDS_USER }}
- name: Install node modules
@@ -83,11 +83,11 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Initialize environment
uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@16c5f6e199e3e1b67ae5a62385d36366bb9a429d
uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@87ed54ddedde42b443be7c6fe36cdaf0a907ea39
- name: Setup Bazel
uses: angular/dev-infra/github-actions/bazel/setup@16c5f6e199e3e1b67ae5a62385d36366bb9a429d
uses: angular/dev-infra/github-actions/bazel/setup@87ed54ddedde42b443be7c6fe36cdaf0a907ea39
- name: Setup Bazel Remote Caching
uses: angular/dev-infra/github-actions/bazel/configure-remote@16c5f6e199e3e1b67ae5a62385d36366bb9a429d
uses: angular/dev-infra/github-actions/bazel/configure-remote@87ed54ddedde42b443be7c6fe36cdaf0a907ea39
with:
google_credential: ${{ secrets.RBE_TRUSTED_BUILDS_USER }}
- name: Install node modules
@@ -100,11 +100,11 @@ jobs:
labels: ubuntu-latest
steps:
- name: Initialize environment
uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@16c5f6e199e3e1b67ae5a62385d36366bb9a429d
uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@87ed54ddedde42b443be7c6fe36cdaf0a907ea39
- name: Setup Bazel
uses: angular/dev-infra/github-actions/bazel/setup@16c5f6e199e3e1b67ae5a62385d36366bb9a429d
uses: angular/dev-infra/github-actions/bazel/setup@87ed54ddedde42b443be7c6fe36cdaf0a907ea39
- name: Setup Bazel RBE
uses: angular/dev-infra/github-actions/bazel/configure-remote@16c5f6e199e3e1b67ae5a62385d36366bb9a429d
uses: angular/dev-infra/github-actions/bazel/configure-remote@87ed54ddedde42b443be7c6fe36cdaf0a907ea39
with:
google_credential: ${{ secrets.RBE_TRUSTED_BUILDS_USER }}
- name: Install node modules
@@ -119,11 +119,11 @@ jobs:
labels: ubuntu-latest
steps:
- name: Initialize environment
uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@16c5f6e199e3e1b67ae5a62385d36366bb9a429d
uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@87ed54ddedde42b443be7c6fe36cdaf0a907ea39
- name: Setup Bazel
uses: angular/dev-infra/github-actions/bazel/setup@16c5f6e199e3e1b67ae5a62385d36366bb9a429d
uses: angular/dev-infra/github-actions/bazel/setup@87ed54ddedde42b443be7c6fe36cdaf0a907ea39
- name: Setup Bazel RBE
uses: angular/dev-infra/github-actions/bazel/configure-remote@16c5f6e199e3e1b67ae5a62385d36366bb9a429d
uses: angular/dev-infra/github-actions/bazel/configure-remote@87ed54ddedde42b443be7c6fe36cdaf0a907ea39
with:
google_credential: ${{ secrets.RBE_TRUSTED_BUILDS_USER }}
- name: Install node modules
@@ -136,11 +136,11 @@ jobs:
labels: ubuntu-latest
steps:
- name: Initialize environment
uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@16c5f6e199e3e1b67ae5a62385d36366bb9a429d
uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@87ed54ddedde42b443be7c6fe36cdaf0a907ea39
- name: Setup Bazel
uses: angular/dev-infra/github-actions/bazel/setup@16c5f6e199e3e1b67ae5a62385d36366bb9a429d
uses: angular/dev-infra/github-actions/bazel/setup@87ed54ddedde42b443be7c6fe36cdaf0a907ea39
- name: Setup Bazel RBE
uses: angular/dev-infra/github-actions/bazel/configure-remote@16c5f6e199e3e1b67ae5a62385d36366bb9a429d
uses: angular/dev-infra/github-actions/bazel/configure-remote@87ed54ddedde42b443be7c6fe36cdaf0a907ea39
- name: Install node modules
run: pnpm install --frozen-lockfile
- run: echo "https://${{secrets.SNAPSHOT_BUILDS_GITHUB_TOKEN}}:@github.com" > ${HOME}/.git_credentials
@@ -152,11 +152,11 @@ jobs:
labels: ubuntu-latest
steps:
- name: Initialize environment
uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@16c5f6e199e3e1b67ae5a62385d36366bb9a429d
uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@87ed54ddedde42b443be7c6fe36cdaf0a907ea39
- name: Setup Bazel
uses: angular/dev-infra/github-actions/bazel/setup@16c5f6e199e3e1b67ae5a62385d36366bb9a429d
uses: angular/dev-infra/github-actions/bazel/setup@87ed54ddedde42b443be7c6fe36cdaf0a907ea39
- name: Setup Bazel RBE
uses: angular/dev-infra/github-actions/bazel/configure-remote@16c5f6e199e3e1b67ae5a62385d36366bb9a429d
uses: angular/dev-infra/github-actions/bazel/configure-remote@87ed54ddedde42b443be7c6fe36cdaf0a907ea39
with:
google_credential: ${{ secrets.RBE_TRUSTED_BUILDS_USER }}
- name: Install node modules
@@ -206,11 +206,11 @@ jobs:
runs-on: ubuntu-latest-8core
steps:
- name: Initialize environment
uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@16c5f6e199e3e1b67ae5a62385d36366bb9a429d
uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@87ed54ddedde42b443be7c6fe36cdaf0a907ea39
- name: Setup Bazel
uses: angular/dev-infra/github-actions/bazel/setup@16c5f6e199e3e1b67ae5a62385d36366bb9a429d
uses: angular/dev-infra/github-actions/bazel/setup@87ed54ddedde42b443be7c6fe36cdaf0a907ea39
- name: Setup Bazel RBE
uses: angular/dev-infra/github-actions/bazel/configure-remote@16c5f6e199e3e1b67ae5a62385d36366bb9a429d
uses: angular/dev-infra/github-actions/bazel/configure-remote@87ed54ddedde42b443be7c6fe36cdaf0a907ea39
- name: Install node modules
run: pnpm install --frozen-lockfile
- name: Build adev
@@ -224,6 +224,6 @@ jobs:
configPath: 'adev/firebase.json'
distDir: 'dist/bin/adev/dist'
- name: Update Algolia synonym record
run: node adev/scripts/synonyms/update-synonyms.mts
run: pnpm tsx adev/scripts/synonyms/update-synonyms.mts
env:
ALGOLIA_KEY: ${{ secrets.ALGOLIA_SYNONYM_MANAGER }}
+2 -2
View File
@@ -24,7 +24,7 @@ jobs:
steps:
- name: Checkout the repository
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1
with:
# Setting `persist-credentials: false` prevents the github-action account from being the
# account that is attempted to be used for authentication, instead the remote is set to
@@ -37,7 +37,7 @@ jobs:
ANGULAR_READONLY_GITHUB_TOKEN: ${{ secrets.READONLY_GITHUB_TOKEN }}
- name: Create a PR (if necessary)
uses: peter-evans/create-pull-request@c0f553fe549906ede9cf27b5156039d195d2ece0 # v8.1.0
uses: peter-evans/create-pull-request@22a9089034f40e5a961c8808d113e2c98fb63676 # v7.0.11
with:
token: ${{ secrets.ANGULAR_ROBOT_ACCESS_TOKEN }}
push-to-fork: 'angular-robot/angular'
+4 -5
View File
@@ -12,15 +12,14 @@ jobs:
labels:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
- uses: angular/dev-infra/github-actions/pull-request-labeling@16c5f6e199e3e1b67ae5a62385d36366bb9a429d
- uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1
- uses: angular/dev-infra/github-actions/pull-request-labeling@87ed54ddedde42b443be7c6fe36cdaf0a907ea39
with:
angular-robot-key: ${{ secrets.ANGULAR_ROBOT_PRIVATE_KEY }}
labels: '{"requires: TGP": ["packages/core/primitives/**/{*,.*}"]}'
post_approval_changes:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
- uses: angular/dev-infra/github-actions/post-approval-changes@16c5f6e199e3e1b67ae5a62385d36366bb9a429d
- uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1
- uses: angular/dev-infra/github-actions/post-approval-changes@87ed54ddedde42b443be7c6fe36cdaf0a907ea39
with:
angular-robot-key: ${{ secrets.ANGULAR_ROBOT_PRIVATE_KEY }}
+2 -2
View File
@@ -13,8 +13,8 @@ jobs:
statuses: write
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
- uses: angular/dev-infra/github-actions/google-internal-tests@16c5f6e199e3e1b67ae5a62385d36366bb9a429d
- uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1
- uses: angular/dev-infra/github-actions/google-internal-tests@87ed54ddedde42b443be7c6fe36cdaf0a907ea39
with:
run-tests-guide-url: http://go/angular-g3sync-start
github-token: ${{ secrets.GITHUB_TOKEN }}
+4 -4
View File
@@ -13,15 +13,15 @@ jobs:
JOBS: 2
steps:
- name: Initialize environment
uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@16c5f6e199e3e1b67ae5a62385d36366bb9a429d
uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@87ed54ddedde42b443be7c6fe36cdaf0a907ea39
- name: Install node modules
run: pnpm install --frozen-lockfile
- name: Setup Bazel
uses: angular/dev-infra/github-actions/bazel/setup@16c5f6e199e3e1b67ae5a62385d36366bb9a429d
uses: angular/dev-infra/github-actions/bazel/setup@87ed54ddedde42b443be7c6fe36cdaf0a907ea39
- name: Setup Bazel Remote Caching
uses: angular/dev-infra/github-actions/bazel/configure-remote@16c5f6e199e3e1b67ae5a62385d36366bb9a429d
uses: angular/dev-infra/github-actions/bazel/configure-remote@87ed54ddedde42b443be7c6fe36cdaf0a907ea39
- name: Setup Saucelabs Variables
uses: angular/dev-infra/github-actions/saucelabs@16c5f6e199e3e1b67ae5a62385d36366bb9a429d
uses: angular/dev-infra/github-actions/saucelabs@87ed54ddedde42b443be7c6fe36cdaf0a907ea39
- name: Set up Sauce Tunnel Daemon
run: pnpm bazel run //tools/saucelabs-daemon/background-service -- $JOBS &
env:
+1 -1
View File
@@ -9,6 +9,6 @@ jobs:
status:
runs-on: ubuntu-latest
steps:
- uses: angular/dev-infra/github-actions/unified-status-check@16c5f6e199e3e1b67ae5a62385d36366bb9a429d
- uses: angular/dev-infra/github-actions/unified-status-check@87ed54ddedde42b443be7c6fe36cdaf0a907ea39
with:
angular-robot-key: ${{ secrets.ANGULAR_ROBOT_PRIVATE_KEY }}
+3 -3
View File
@@ -21,7 +21,7 @@ jobs:
workflows: ${{ steps.workflows.outputs.workflows }}
steps:
- name: Initialize environment
uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@16c5f6e199e3e1b67ae5a62385d36366bb9a429d
uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@87ed54ddedde42b443be7c6fe36cdaf0a907ea39
- name: Install node modules
run: pnpm install --frozen-lockfile
- id: workflows
@@ -36,9 +36,9 @@ jobs:
workflow: ${{ fromJSON(needs.list.outputs.workflows) }}
steps:
- name: Initialize environment
uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@16c5f6e199e3e1b67ae5a62385d36366bb9a429d
uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@87ed54ddedde42b443be7c6fe36cdaf0a907ea39
- name: Setup Bazel
uses: angular/dev-infra/github-actions/bazel/setup@16c5f6e199e3e1b67ae5a62385d36366bb9a429d
uses: angular/dev-infra/github-actions/bazel/setup@87ed54ddedde42b443be7c6fe36cdaf0a907ea39
- name: Install node modules
run: pnpm install --frozen-lockfile
# We utilize the google-github-actions/auth action to allow us to get an active credential using workflow
+22 -22
View File
@@ -19,7 +19,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Initialize environment
uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@16c5f6e199e3e1b67ae5a62385d36366bb9a429d
uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@87ed54ddedde42b443be7c6fe36cdaf0a907ea39
- name: Install node modules
run: pnpm install --frozen-lockfile
- name: Check code lint
@@ -37,7 +37,7 @@ jobs:
- name: Check code format
run: pnpm ng-dev format changed --check ${{ github.event.pull_request.base.sha }}
- name: Check Package Licenses
uses: angular/dev-infra/github-actions/linting/licenses@16c5f6e199e3e1b67ae5a62385d36366bb9a429d
uses: angular/dev-infra/github-actions/linting/licenses@87ed54ddedde42b443be7c6fe36cdaf0a907ea39
with:
allow-dependencies-licenses: 'pkg:npm/google-protobuf@'
@@ -45,13 +45,13 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Initialize environment
uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@16c5f6e199e3e1b67ae5a62385d36366bb9a429d
uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@87ed54ddedde42b443be7c6fe36cdaf0a907ea39
with:
disable-package-manager-cache: true
- name: Setup Bazel
uses: angular/dev-infra/github-actions/bazel/setup@16c5f6e199e3e1b67ae5a62385d36366bb9a429d
uses: angular/dev-infra/github-actions/bazel/setup@87ed54ddedde42b443be7c6fe36cdaf0a907ea39
- name: Setup Bazel RBE
uses: angular/dev-infra/github-actions/bazel/configure-remote@16c5f6e199e3e1b67ae5a62385d36366bb9a429d
uses: angular/dev-infra/github-actions/bazel/configure-remote@87ed54ddedde42b443be7c6fe36cdaf0a907ea39
- name: Install node modules
run: pnpm install --frozen-lockfile
- name: Run unit tests
@@ -59,7 +59,7 @@ jobs:
- name: Test build
run: pnpm devtools:build:chrome
- name: Cypress run
uses: cypress-io/github-action@e44ee0fa67251ab7e2d854d85b3a466577f47d14 # v7.1.3
uses: cypress-io/github-action@2ad32e649e4db26c07674ebae31a297601dbcbaf # v6.10.8
with:
command: pnpm devtools:test:e2e
start: pnpm bazel run //devtools/src:devserver
@@ -71,11 +71,11 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Initialize environment
uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@16c5f6e199e3e1b67ae5a62385d36366bb9a429d
uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@87ed54ddedde42b443be7c6fe36cdaf0a907ea39
- name: Setup Bazel
uses: angular/dev-infra/github-actions/bazel/setup@16c5f6e199e3e1b67ae5a62385d36366bb9a429d
uses: angular/dev-infra/github-actions/bazel/setup@87ed54ddedde42b443be7c6fe36cdaf0a907ea39
- name: Setup Bazel Remote Caching
uses: angular/dev-infra/github-actions/bazel/configure-remote@16c5f6e199e3e1b67ae5a62385d36366bb9a429d
uses: angular/dev-infra/github-actions/bazel/configure-remote@87ed54ddedde42b443be7c6fe36cdaf0a907ea39
- name: Install node modules
run: pnpm install --frozen-lockfile
- name: Run CI tests for framework
@@ -86,7 +86,7 @@ jobs:
ASPECT_RULES_JS_FROZEN_PNPM_LOCK: '1'
- name: Upload GRPC logs (for debugging of RBE issues)
if: always()
uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4
with:
path: /tmp/rbe-grpc.log
retention-days: 1
@@ -95,11 +95,11 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Initialize environment
uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@16c5f6e199e3e1b67ae5a62385d36366bb9a429d
uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@87ed54ddedde42b443be7c6fe36cdaf0a907ea39
- name: Setup Bazel
uses: angular/dev-infra/github-actions/bazel/setup@16c5f6e199e3e1b67ae5a62385d36366bb9a429d
uses: angular/dev-infra/github-actions/bazel/setup@87ed54ddedde42b443be7c6fe36cdaf0a907ea39
- name: Setup Bazel Remote Caching
uses: angular/dev-infra/github-actions/bazel/configure-remote@16c5f6e199e3e1b67ae5a62385d36366bb9a429d
uses: angular/dev-infra/github-actions/bazel/configure-remote@87ed54ddedde42b443be7c6fe36cdaf0a907ea39
- name: Install node modules
run: pnpm install --frozen-lockfile
- name: Run integration CI tests for framework
@@ -110,11 +110,11 @@ jobs:
labels: ubuntu-latest
steps:
- name: Initialize environment
uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@16c5f6e199e3e1b67ae5a62385d36366bb9a429d
uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@87ed54ddedde42b443be7c6fe36cdaf0a907ea39
- name: Setup Bazel
uses: angular/dev-infra/github-actions/bazel/setup@16c5f6e199e3e1b67ae5a62385d36366bb9a429d
uses: angular/dev-infra/github-actions/bazel/setup@87ed54ddedde42b443be7c6fe36cdaf0a907ea39
- name: Setup Bazel RBE
uses: angular/dev-infra/github-actions/bazel/configure-remote@16c5f6e199e3e1b67ae5a62385d36366bb9a429d
uses: angular/dev-infra/github-actions/bazel/configure-remote@87ed54ddedde42b443be7c6fe36cdaf0a907ea39
- name: Install node modules
run: pnpm install --frozen-lockfile
- name: Run tests
@@ -127,11 +127,11 @@ jobs:
labels: ubuntu-latest
steps:
- name: Initialize environment
uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@16c5f6e199e3e1b67ae5a62385d36366bb9a429d
uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@87ed54ddedde42b443be7c6fe36cdaf0a907ea39
- name: Setup Bazel
uses: angular/dev-infra/github-actions/bazel/setup@16c5f6e199e3e1b67ae5a62385d36366bb9a429d
uses: angular/dev-infra/github-actions/bazel/setup@87ed54ddedde42b443be7c6fe36cdaf0a907ea39
- name: Setup Bazel RBE
uses: angular/dev-infra/github-actions/bazel/configure-remote@16c5f6e199e3e1b67ae5a62385d36366bb9a429d
uses: angular/dev-infra/github-actions/bazel/configure-remote@87ed54ddedde42b443be7c6fe36cdaf0a907ea39
- name: Install node modules
run: pnpm install --frozen-lockfile
- name: Run tests
@@ -142,11 +142,11 @@ jobs:
labels: ubuntu-latest
steps:
- name: Initialize environment
uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@16c5f6e199e3e1b67ae5a62385d36366bb9a429d
uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@87ed54ddedde42b443be7c6fe36cdaf0a907ea39
- name: Setup Bazel
uses: angular/dev-infra/github-actions/bazel/setup@16c5f6e199e3e1b67ae5a62385d36366bb9a429d
uses: angular/dev-infra/github-actions/bazel/setup@87ed54ddedde42b443be7c6fe36cdaf0a907ea39
- name: Setup Bazel RBE
uses: angular/dev-infra/github-actions/bazel/configure-remote@16c5f6e199e3e1b67ae5a62385d36366bb9a429d
uses: angular/dev-infra/github-actions/bazel/configure-remote@87ed54ddedde42b443be7c6fe36cdaf0a907ea39
- name: Install node modules
run: pnpm install --frozen-lockfile
- run: |
+3 -3
View File
@@ -25,7 +25,7 @@ jobs:
steps:
- name: 'Checkout code'
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1
with:
persist-credentials: false
@@ -39,7 +39,7 @@ jobs:
# Upload the results as artifacts.
- name: 'Upload artifact'
uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6.0.0
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
with:
name: SARIF file
path: results.sarif
@@ -47,6 +47,6 @@ jobs:
# Upload the results to GitHub's code scanning dashboard.
- name: 'Upload to code-scanning'
uses: github/codeql-action/upload-sarif@9e907b5e64f6b83e7804b09294d44122997950d6 # v4.32.3
uses: github/codeql-action/upload-sarif@5d4e8d1aca955e8d8589aabd499c5cae939e33c7 # v4.31.9
with:
sarif_file: results.sarif
-3
View File
@@ -54,6 +54,3 @@ baseline.json
# Ignore cache created with the Angular CLI.
.angular/
# pnpm store
.pnpm-store
-1
View File
@@ -9,5 +9,4 @@ export const github = {
name: 'angular',
mainBranchName: 'main',
mergeMode: 'caretaker-only',
requireReleaseModeForRelease: true,
};
-1
View File
@@ -16,7 +16,6 @@
"packages/docs/**",
"packages/elements/schematics/**",
"packages/examples/**",
"packages/forms/signals/src/api/rules/validation/standard_schema.ts",
"packages/localize/**",
"packages/private/**",
"packages/service-worker/**",
+1 -1
View File
@@ -27,7 +27,7 @@ export const release = {
buildPackages: async () => {
// The buildTargetPackages function is loaded at runtime as the loading the script
// causes an invocation of Bazel.
const {performNpmReleaseBuild} = await import('../scripts/build/package-builder.mts');
const {performNpmReleaseBuild} = await import('../scripts/build/package-builder.mjs');
return performNpmReleaseBuild();
},
releaseNotes: {
+1 -1
View File
@@ -1 +1 @@
22.22.0
22.21.1
+8 -17
View File
@@ -1,5 +1,5 @@
// TODO: Define these packages in a single common location.
const localAngularPackages = new Set([
const localAngularPackages = [
'@angular/animations',
'@angular/common',
'@angular/compiler',
@@ -15,9 +15,7 @@ const localAngularPackages = new Set([
'@angular/router',
'@angular/service-worker',
'@angular/upgrade',
]);
const peerDepsToChange = new Set(['zone.js', 'rxjs']);
];
function readPackage(pkg, context) {
// TODO(devversion): This allows us to make compiler/TS a production dependency of compiler-cli
@@ -27,38 +25,31 @@ function readPackage(pkg, context) {
pkg.dependencies = {
...pkg.dependencies,
'@angular/compiler': 'workspace:*',
'typescript': pkg.devDependencies['typescript'],
'typescript': '5.9.3',
};
delete pkg.devDependencies['typescript'];
}
for (const [key, version] of Object.entries(pkg.peerDependencies)) {
Object.entries(pkg.peerDependencies).forEach(([key, version]) => {
// Any package that has a peerDependency on rxjs or zone.js, should instead treat the peerDependency as a
// regular dependency.
if (peerDepsToChange.has(key)) {
if (['rxjs', 'zone.js'].includes(key)) {
pkg.dependencies = {
...pkg.dependencies,
[key]: pkg.devDependencies[key] ?? version,
[key]: version,
};
delete pkg.devDependencies[key];
continue;
}
// Change all locally generated packages to directly depend on the other local packages, instead
// of expecting them as peerDependencies automatically as we do not auto install peer deps. The
// package is also removed from peerDependencies as it was moved over and will just cause errors.
if (pkg.version === '0.0.0-PLACEHOLDER' && localAngularPackages.has(key)) {
if (localAngularPackages.includes(key) && pkg.version === '0.0.0-PLACEHOLDER') {
pkg.dependencies = {
...pkg.dependencies,
[key]: 'workspace: *',
};
delete pkg.peerDependencies[key];
}
}
});
return pkg;
}
+1 -8
View File
@@ -25,21 +25,14 @@ packages/compiler-cli/test/compliance/test_cases/**/*.ts
# Ignore testing data files for language service
vscode-ng-language-service/syntaxes/test/data/*.ts
vscode-ng-language-service/syntaxes/test/data/*.html
# Ignore goldens MD files
goldens/**/*.api.md
# Ignore golden symbol json files
packages/**/*.golden_symbols.json
# adev generated files
adev/src/content/aria/**/*.json
adev/src/content/cli/**/*.json
adev/src/content/cdk/**/*.json
# Antigravity rules
.agent/rules/agents.md
CHANGELOG.md
CHANGELOG_ARCHIVE.md
CHANGELOG_ARCHIVE.md
+23 -29
View File
@@ -106,6 +106,7 @@ groups:
- thePunderWoman
- kirjs
- JoostK
- mmalerba
- ~amishne
- ~leonsenft
- ~mattrbeck
@@ -120,7 +121,6 @@ groups:
- >
contains_any_globs(files.exclude('packages/core/primitives/*'), [
'contributing-docs/public-api-surface.md',
'dev-app/**/{*,.*}',
'integration/**/{*,.*}',
'modules/**/{*,.*}',
'packages/animations/**/{*,.*}',
@@ -150,8 +150,10 @@ groups:
- crisbeto
- devversion
- kirjs
- ~jelbourn
- thePunderWoman
- ~pkozlowski-opensource
- mmalerba
- JeanMeche
- ~amishne
- ~leonsenft
@@ -178,9 +180,9 @@ groups:
reviewers:
users:
- ~alxhub
- jelbourn
- josephperrott
- ~pkozlowski-opensource
- alan-agius4
reviews:
request: -1 # request reviews from everyone
required: 2 # require at least 2 approvals
@@ -199,6 +201,7 @@ groups:
reviewers:
users:
- ~JiaLiPassion
- ~jelbourn
- ~alxhub
- AndrewKushnir
- atscott
@@ -207,6 +210,7 @@ groups:
- kirjs
- thePunderWoman
- ~pkozlowski-opensource
- mmalerba
- ~amishne
- ~leonsenft
- ~mattrbeck
@@ -243,8 +247,6 @@ groups:
- >
contains_any_globs(files, [
'adev/**/{*,.*}',
'tools/manual_api_docs/blocks/**/*.md',
'tools/manual_api_docs/elements/**/*.md',
])
reviewers:
users:
@@ -256,12 +258,14 @@ groups:
- crisbeto
- kirjs
- JeanMeche
- jelbourn
- thePunderWoman
- devversion
- josephperrott
- ~pkozlowski-opensource
- ~mgechev
- MarkTechson
- mmalerba
- ~hawkgs
- ~amishne
- ~leonsenft
@@ -297,13 +301,8 @@ groups:
<<: *defaults
conditions:
- >
contains_any_globs(files
.exclude('.pullapprove.yml')
.exclude('tools/manual_api_docs/blocks/**/*.md')
.exclude('tools/manual_api_docs/elements/**/*.md'),
[
contains_any_globs(files.exclude('.pullapprove.yml'), [
'{*,.*}',
'.agent/**/{*,.*}',
'.devcontainer/**/{*,.*}',
'.github/**/{*,.*}',
'.husky/**/{*,.*}',
@@ -340,7 +339,6 @@ groups:
- author not in ["angular-robot"]
reviewers:
users:
- alan-agius4
- devversion
- josephperrott
@@ -375,9 +373,11 @@ groups:
- AndrewKushnir
- ~alxhub
- atscott
- ~jelbourn
- thePunderWoman
- ~pkozlowski-opensource
- kirjs
- mmalerba
- crisbeto
- devversion
- JeanMeche
@@ -411,8 +411,10 @@ groups:
- AndrewKushnir
- atscott
- kirjs
- ~jelbourn
- thePunderWoman
- ~pkozlowski-opensource
- mmalerba
- ~amishne
- ~leonsenft
- ~mattrbeck
@@ -421,24 +423,6 @@ groups:
required: 1 # Require that 1 person approve
reviewed_for: required
# =========================================================
# Agent Skills
# =========================================================
agent-skills:
<<: *defaults
conditions:
- >
contains_any_globs(files, [
'skills/{*,.*}',
'skills/**/{*,.*}',
])
reviewers:
users:
- marktechson
- kirjs
- ~JeanMeche
- ~dgp1130
####################################################################################
# Special Cases
####################################################################################
@@ -459,6 +443,7 @@ groups:
- AndrewKushnir
- andrewseguin
- dgp1130
- ~jelbourn
- thePunderWoman
- josephperrott
@@ -481,6 +466,10 @@ groups:
- thePunderWoman # Jessica Janiuk
- AndrewKushnir # Andrew Kushnir
- atscott # Andrew Scott
labels:
pending: 'requires: TGP'
approved: 'requires: TGP'
rejected: 'requires: TGP'
# External team required reviews
primitives-shared:
@@ -498,6 +487,10 @@ groups:
- tbondwilkinson # Tom Wilkinson
- rahatarmanahmed # Rahat Ahmed
- ENAML # Ethan Cline
labels:
pending: 'requires: TGP'
approved: 'requires: TGP'
rejected: 'requires: TGP'
####################################################################################
# Override managed result groups
@@ -520,6 +513,7 @@ groups:
reviewers:
users:
- alxhub
- jelbourn
- josephperrott
reviews:
request: 0
-34
View File
@@ -1,34 +0,0 @@
---
trigger: always_on
---
This is the source code for the Angular framework. This guide outlines standard practices for AI agents working in this repository.
## Environment
- Use `pnpm` for package management.
- Use `pnpm bazel test //target` to run tests.
## Key Documentation
- [Building and Testing](contributing-docs/building-and-testing-angular.md): definitive guide for running targets.
- [Coding Standards](contributing-docs/coding-standards.md): style guide for TypeScript and other files.
- [Commit Guidelines](contributing-docs/commit-message-guidelines.md): format for commit messages and PR titles.
## Testing
- **Zoneless & Async-First:** Assume a zoneless environment where state changes schedule updates asynchronously.
- **Do NOT** use `fixture.detectChanges()` to manually trigger updates.
- **ALWAYS** use the "Act, Wait, Assert" pattern:
1. **Act:** Update state or perform an action.
2. **Wait:** `await fixture.whenStable()` to allow the framework to process the scheduled update.
3. **Assert:** Verify the output.
- To keep tests fast, minimize the need for waiting:
- Use `useAutoTick()` (from `packages/private/testing/src/utils.ts`) to fast-forward time via the mock clock.
- When waiting is necessary, use real async tests (`it('...', async () => { ... })`) along with:
- `await timeout(ms)` (from `packages/private/testing/src/utils.ts`) to wait a specific number of milliseconds.
- `await fixture.whenStable()` to wait for framework stability.
## Pull Requests
- Use the `gh` CLI (GitHub CLI) for creating and managing pull requests.
-367
View File
@@ -1,259 +1,3 @@
<a name="21.2.0"></a>
# 21.2.0 (2026-02-25)
### common
| Commit | Type | Description |
| -- | -- | -- |
| [18003a33bb](https://github.com/angular/angular/commit/18003a33bb0d6bb09def8a0e5939fa24069696eb) | feat | add an 'outlet' injector option for ngTemplateOutlet |
| [8bbe6dc46c](https://github.com/angular/angular/commit/8bbe6dc46c9dc13bafa81a60c7613b84b5ca3761) | feat | Add Location strategies to manage trailing slash on write |
| [51cc914807](https://github.com/angular/angular/commit/51cc91480761b7275c15b5600381207f8ca00ee5) | feat | support height in ImageLoaderConfig and built-in loaders |
### compiler
| Commit | Type | Description |
| -- | -- | -- |
| [72534e2a34](https://github.com/angular/angular/commit/72534e2a3458df4e1bb097973872f00bbb92be42) | feat | Add support for the `instanceof` binary operator |
| [95b3f37d4a](https://github.com/angular/angular/commit/95b3f37d4a7d9a38f616d56df746dfcda3c2139b) | feat | Exhaustive checks for switch blocks |
| [04ba09a8d9](https://github.com/angular/angular/commit/04ba09a8d9454013bebdd643eacb737642161952) | feat | support `AstVisitor.visitEmptyExpr()` |
| [ce80136e7b](https://github.com/angular/angular/commit/ce80136e7b9f0024d49fce835cffa024c4505855) | fix | optimize away unnecessary restore/reset view calls |
| [3242a61bae](https://github.com/angular/angular/commit/3242a61bae02253d13abb510b666376c665e61ac) | fix | variable counter visiting some expressions twice |
### compiler-cli
| Commit | Type | Description |
| -- | -- | -- |
| [473dd3e1cb](https://github.com/angular/angular/commit/473dd3e1cbd4fe3fa88ae4d5358eee35c11acb1b) | fix | attach source spans to object literal keys in TCB |
| [a904d9f77b](https://github.com/angular/angular/commit/a904d9f77b56feab407f75f8d0527fa512d5dafb) | fix | support nested component declaration |
| [2ea6dfc6c9](https://github.com/angular/angular/commit/2ea6dfc6c9ca11e96a2654510c980419899f8d04) | fix | update diagnostic to flag no-op arrow functions in listeners |
### core
| Commit | Type | Description |
| -- | -- | -- |
| [8d5210c9fe](https://github.com/angular/angular/commit/8d5210c9fedd8abdd810d7a89ec7ee9a1234f5c1) | feat | add ChangeDetectionStrategy.Eager alias for Default |
| [92d2498910](https://github.com/angular/angular/commit/92d2498910caed06c182b67e39726e1441418698) | feat | add host node to DeferBlockData ([#66546](https://github.com/angular/angular/pull/66546)) |
| [ea2016a6dc](https://github.com/angular/angular/commit/ea2016a6dce58f95ecab7c773d5dcde274354e1a) | feat | add support for nested animations |
| [81cabc1477](https://github.com/angular/angular/commit/81cabc14777a3b4966c29d60e1505aca8c29b71c) | feat | add support for TypeScript 6 |
| [1ba9b7ac50](https://github.com/angular/angular/commit/1ba9b7ac5001b315cc9df78c518964dbf479d647) | feat | resource composition via snapshots |
| [d9923b72a2](https://github.com/angular/angular/commit/d9923b72a20972ba6bf728d78f1afac6936ade18) | feat | support arrow functions in expressions |
| [a7e8abbb7e](https://github.com/angular/angular/commit/a7e8abbb7e738ba338c3f50c76934c99925954e5) | fix | correctly handle SkipSelf when resolving from embedded view injector |
| [0806ee3826](https://github.com/angular/angular/commit/0806ee38269b664f535e10d4d501b88370d3b44c) | fix | prevent animated element duplication with dynamic components in zoneless mode |
| [ed78fa05c7](https://github.com/angular/angular/commit/ed78fa05c710ebafb355ae00a85b190a118b6cc4) | fix | Remove note to skip arrow functions in best practices |
### forms
| Commit | Type | Description |
| -- | -- | -- |
| [f56bb07d83](https://github.com/angular/angular/commit/f56bb07d83a015b0ac12e74fdb0cf1550ff36b97) | feat | add field param to submit action and onInvalid |
| [ba009b6031](https://github.com/angular/angular/commit/ba009b603119299a03f9d844f93882d42d47d150) | feat | add form directive |
| [22afbb2f36](https://github.com/angular/angular/commit/22afbb2f36be89c2ae575df343571a918dec5985) | feat | add parsing support to native inputs ([#66917](https://github.com/angular/angular/pull/66917)) |
| [95c386469c](https://github.com/angular/angular/commit/95c386469c7a2f09dd731601c2061bdb10d25717) | feat | Add passing focus options to form field |
| [95ecce8334](https://github.com/angular/angular/commit/95ecce8334299defe55fb2b74264e5258ffd137c) | feat | allow setting submit options at form-level |
| [ebae211add](https://github.com/angular/angular/commit/ebae211add37700858adeb8fc5d87bf503a59721) | feat | introduce parse errors in signal forms |
| [3937afc316](https://github.com/angular/angular/commit/3937afc3167ce409eebb06d91d5fb122eea4e33d) | feat | introduce SignalFormControl for Reactive Forms compatibility |
| [30f0914754](https://github.com/angular/angular/commit/30f09147545b67185f93efb9796e37c1db76733a) | feat | support binding null to number input ([#66917](https://github.com/angular/angular/pull/66917)) |
| [dd208ca259](https://github.com/angular/angular/commit/dd208ca2595258fcd1e289374f812ce0b56c7011) | feat | update submit function to accept options object |
| [27397b3f4f](https://github.com/angular/angular/commit/27397b3f4f3182ce00d6e2f8690285c316e2a274) | fix | clear parse errors when model updates ([#66917](https://github.com/angular/angular/pull/66917)) |
| [63d8005703](https://github.com/angular/angular/commit/63d80057039928b3e878b59c1fe6b93ef1c6b701) | fix | preserve custom-control focus context in signal forms |
| [631f60d1f9](https://github.com/angular/angular/commit/631f60d1f9be72cb68330308a6ff18cc195babb8) | fix | preserve parse errors when parse returns value |
| [adfb83146b](https://github.com/angular/angular/commit/adfb83146b0c149734f43961563b389e00cc1d85) | fix | simplify design of parse errors |
| [fb05fc86d0](https://github.com/angular/angular/commit/fb05fc86d0f12ffafd94c7c1420118d8a79f7e59) | fix | sort error summary by DOM order |
| [567f292e8e](https://github.com/angular/angular/commit/567f292e8e0f9d2b5ddebadfa1c6d6dd6c456f39) | fix | support custom controls as host directives |
| [bdfb60f3e3](https://github.com/angular/angular/commit/bdfb60f3e33065e047183dc1890c36e527e2b304) | fix | use consistent error format returned from parse |
| [d75046bc09](https://github.com/angular/angular/commit/d75046bc091699bbadcb5f2032be627e983ee6fa) | fix | warn when showing hidden field state |
### language-server
| Commit | Type | Description |
| -- | -- | -- |
| [ebc90c26f5](https://github.com/angular/angular/commit/ebc90c26f5ff1ba1e0ca9b775a44e301ebfb9473) | feat | Add completions and hover info for inline styles |
| [26fd0839c3](https://github.com/angular/angular/commit/26fd0839c32d2ebeaa5e3ecc10ed70ab9ca17749) | feat | Add folding range support for inline styles |
| [573aadef7e](https://github.com/angular/angular/commit/573aadef7eb8b6b5e83b82a16f95d2a556f27c01) | feat | Add quick info for inline styles |
| [6fb39d9b62](https://github.com/angular/angular/commit/6fb39d9b62cbb634e95ec00fe5ef85d84da3bdbd) | feat | Support client-side file watching via `onDidChangeWatchedFiles` |
### language-service
| Commit | Type | Description |
| -- | -- | -- |
| [496967e7b1](https://github.com/angular/angular/commit/496967e7b13dfe1ebdde69724cd62880914beb60) | feat | add JSON schema for angularCompilerOptions |
| [8c21866f49](https://github.com/angular/angular/commit/8c21866f49ff74344551395ae0a5df1841d54c0d) | feat | add linked editing ranges for HTML tag synchronization |
| [d2137928e8](https://github.com/angular/angular/commit/d2137928e8f075527016a3c011dd8efc4d4e1ebd) | perf | use lightweight project warmup for Angular analysis |
### router
| Commit | Type | Description |
| -- | -- | -- |
| [b51bab583d](https://github.com/angular/angular/commit/b51bab583d84e38f16dea489e4119edc34e2a491) | feat | Add partial ActivatedRouteSnapshot information to `canMatch` params |
| [cf9620f7d0](https://github.com/angular/angular/commit/cf9620f7d072897f13b7f281b7bca6f51f69cfd0) | feat | Make match options optional in isActive |
| [907a94dcec](https://github.com/angular/angular/commit/907a94dcec2926a5c7d0c4d36249bd62e31a2ae3) | feat | Update `IsActiveMatchOptions` APIs to accept a Partial |
<!-- CHANGELOG SPLIT MARKER -->
<a name="21.1.5"></a>
# 21.1.5 (2026-02-18)
No user facing changes in this release
<!-- CHANGELOG SPLIT MARKER -->
<a name="21.1.4"></a>
# 21.1.4 (2026-02-11)
### compiler
| Commit | Type | Description |
| -- | -- | -- |
| [caab23dfe6](https://github.com/angular/angular/commit/caab23dfe6acf06c3b859af091f5e078b08f1c4c) | fix | add geolocation element to schema |
### core
| Commit | Type | Description |
| -- | -- | -- |
| [2b99eaa019](https://github.com/angular/angular/commit/2b99eaa019b5551a2e2fcf9ff8cd0a796e1e857b) | fix | capture animation dependencies eagerly to avoid destroyed injector |
| [d6aeac504c](https://github.com/angular/angular/commit/d6aeac504c6181f15e5d8afdca3d9c3e3b32652c) | fix | Fix flakey test due to document injection |
### forms
| Commit | Type | Description |
| -- | -- | -- |
| [0d1acd0165](https://github.com/angular/angular/commit/0d1acd0165511b57ce853f29486d9b92d0215959) | feat | support signal-based schemas in validateStandardSchema |
### http
| Commit | Type | Description |
| -- | -- | -- |
| [3905015ccc](https://github.com/angular/angular/commit/3905015ccc53399a606dd8e4f3c4d0cce628a08e) | fix | correctly parse ArrayBuffer and Blob in transfer cache |
<!-- CHANGELOG SPLIT MARKER -->
<a name="21.1.3"></a>
# 21.1.3 (2026-02-04)
### core
| Commit | Type | Description |
| -- | -- | -- |
| [2b254bc050](https://github.com/angular/angular/commit/2b254bc0508b73aab8991c3b1a9a703c339cb735) | fix | `linkedSignal.update` should propagate errors |
| [e5110b4fa1](https://github.com/angular/angular/commit/e5110b4fa155e4669ed507f3460d2d29026a28ab) | fix | export DirectiveWithBindings |
| [2cf4da0ea1](https://github.com/angular/angular/commit/2cf4da0ea11f5746eb7ae4dfd775f757576e4d98) | fix | hold constructors weakly in DepsTracker cache |
| [70a5b651be](https://github.com/angular/angular/commit/70a5b651be29f1421eb25150b560bfe154aad6bc) | fix | prevent element duplication with dynamic components |
### forms
| Commit | Type | Description |
| -- | -- | -- |
| [6f75b6e3f6](https://github.com/angular/angular/commit/6f75b6e3f60dc2a4f33e13562649931dc95eb52b) | fix | Resolves debounce promise on abort in debounceForDuration |
### localize
| Commit | Type | Description |
| -- | -- | -- |
| [4c7126d23b](https://github.com/angular/angular/commit/4c7126d23be3e43b1d5bd6f2fb13119d185c3682) | fix | add support for unit-test builder in ng-add schematic |
### router
| Commit | Type | Description |
| -- | -- | -- |
| [d6268c0bbb](https://github.com/angular/angular/commit/d6268c0bbbdc92abaaaeb8eebee3bc45decab9c9) | fix | limit UrlParser recursion depth to prevent stack overflow |
| [49a36f4cc7](https://github.com/angular/angular/commit/49a36f4cc7254420bc34fff4e0f0242e00970280) | perf | Use .bind to avoid holding other closures in memory |
<!-- CHANGELOG SPLIT MARKER -->
<a name="21.1.2"></a>
# 21.1.2 (2026-01-28)
### forms
| Commit | Type | Description |
| -- | -- | -- |
| [9f99b14882](https://github.com/angular/angular/commit/9f99b14882bc4f883aa33295856010a8bca900fa) | fix | only touch visible, interactive fields on submit |
### language-service
| Commit | Type | Description |
| -- | -- | -- |
| [c57b0355b5](https://github.com/angular/angular/commit/c57b0355b51f5aee5abd822f203fc3bcc3e85acd) | fix | Detect local project version on creation |
### router
| Commit | Type | Description |
| -- | -- | -- |
| [21ecdc036a](https://github.com/angular/angular/commit/21ecdc036a46c487d6c5b6bd25c2bbc3e53a60f9) | fix | Do not intercept reload events with Navigation integration |
<!-- CHANGELOG SPLIT MARKER -->
<a name="21.1.1"></a>
# 21.1.1 (2026-01-21)
### compiler-cli
| Commit | Type | Description |
| -- | -- | -- |
| [0e1f1ed573](https://github.com/angular/angular/commit/0e1f1ed5732f3bb4d5dfbd1f0ee5a5be840594e4) | fix | drop .tsx extension for generated relative imports |
### core
| Commit | Type | Description |
| -- | -- | -- |
| [05adfcf8f2](https://github.com/angular/angular/commit/05adfcf8f26013ac20c38f2b08847b5142e4fd85) | fix | handle Set in class bindings |
### forms
| Commit | Type | Description |
| -- | -- | -- |
| [d89a80a970](https://github.com/angular/angular/commit/d89a80a970d9590df0509d8b94090904a99b7aca) | feat | Ability to manually register a form field binding in signal forms |
| [cb75f9ce85](https://github.com/angular/angular/commit/cb75f9ce85160b2e4359610c06294929ac1169c0) | fix | fix control value syncing on touch |
<!-- CHANGELOG SPLIT MARKER -->
<a name="21.1.0"></a>
# 21.1.0 (2026-01-14)
## Deprecations
### upgrade
- `VERSION` from `@angular/upgrade` is deprecated. Please use the entry from `@angular/upgrade/static` instead.
### common
| Commit | Type | Description |
| -- | -- | -- |
| [d8790972be](https://github.com/angular/angular/commit/d8790972bea4c59a208219dd36d158b5d7e4fdde) | feat | Add custom transformations for Cloudflare and Cloudinary image loaders |
| [a6b8cb68af](https://github.com/angular/angular/commit/a6b8cb68afaded6999ee68f495512be1a9932ae4) | feat | support custom transformations in ImageKit and Imgix loaders |
### compiler
| Commit | Type | Description |
| -- | -- | -- |
| [640693da8e](https://github.com/angular/angular/commit/640693da8e667c015662246152236585d9b24e7f) | feat | Add support for multiple swich cases matching |
| [0ad3adc7c6](https://github.com/angular/angular/commit/0ad3adc7c6d4094f1e3432a3f2e3bdc9862cb4fa) | fix | Support empty cases |
### core
| Commit | Type | Description |
| -- | -- | -- |
| [99ad18a4ee](https://github.com/angular/angular/commit/99ad18a4ee82ecc5524106d1d403ccfa9bae2304) | feat | Add stability debugging utility |
| [a0dfa5fa86](https://github.com/angular/angular/commit/a0dfa5fa86f40520b0e368a021b3c72009a45e8e) | feat | support rest arguments in function calls |
| [6e18fa8bc9](https://github.com/angular/angular/commit/6e18fa8bc9d7e6801e2e89e635c2f759dc422317) | feat | support spread elements in array literals |
| [e407280ab5](https://github.com/angular/angular/commit/e407280ab53cde5f93c3a643457c848845c6ec8b) | feat | support spread expressions in object literals |
| [06be8034bb](https://github.com/angular/angular/commit/06be8034bb9b9adfc07ab0d40cd87c6ae5de02de) | fix | Microtask scheduling should be used after any application synchronization |
| [b4f584cf42](https://github.com/angular/angular/commit/b4f584cf42235c94bb8389fa55bc634e23d7b010) | fix | return `StaticProvider` for `providePlatformInitializer` |
### forms
| Commit | Type | Description |
| -- | -- | -- |
| [1ea5c97703](https://github.com/angular/angular/commit/1ea5c97703ad3c6d8e4cb1b4297eec57629ce117) | feat | allow focusing bound control from field state |
### platform-browser
| Commit | Type | Description |
| -- | -- | -- |
| [ec9dc94cee](https://github.com/angular/angular/commit/ec9dc94ceeb3c026c64e01c6889b7f5c6fd25a66) | feat | add `context` to `createApplication` |
| [ab67988d2e](https://github.com/angular/angular/commit/ab67988d2e5242eff0034483f984428d684acd02) | feat | resolve JIT resources in `createApplication` |
### router
| Commit | Type | Description |
| -- | -- | -- |
| [5edceffd04](https://github.com/angular/angular/commit/5edceffd0431f5a25e111a731db521e966b91f86) | feat | add controls for route cleanup |
| [a03c82564d](https://github.com/angular/angular/commit/a03c82564da6824e199ff48d5249ea8708040951) | feat | Add scroll behavior controls on router navigation |
| [e44839b016](https://github.com/angular/angular/commit/e44839b01640505e554fff16f24e08f282a557c0) | feat | Add standalone function to create a comptued for isActive |
| [c25d749d85](https://github.com/angular/angular/commit/c25d749d85374fff7745980cd9bb2673c661105a) | feat | Execute RunGuardsAndResolvers function in injection context |
| [1c00ab42f8](https://github.com/angular/angular/commit/1c00ab42f8714f2775ed75bbf3cdf0fd44ee32c3) | feat | extend paramters of RedirectFunction to include paramMap and queryParamMap |
| [7003e8d241](https://github.com/angular/angular/commit/7003e8d2417660f71b3a2a017aff3e650c8d9646) | feat | Publish Router's integration with platform Navigation API as experimental |
| [c84d372778](https://github.com/angular/angular/commit/c84d37277874cf7cbd7582a295d796ff113b9cc1) | feat | Support wildcard params with segments trailing ([#64737](https://github.com/angular/angular/pull/64737)) |
### upgrade
| Commit | Type | Description |
| -- | -- | -- |
| [75fe8f8af9](https://github.com/angular/angular/commit/75fe8f8af9488bae6f7068b64d44500643c5d63f) | refactor | deprecate `VERSION` export |
<!-- CHANGELOG SPLIT MARKER -->
<a name="21.0.9"></a>
# 21.0.9 (2026-01-14)
### forms
| Commit | Type | Description |
| -- | -- | -- |
| [82d556a8fb](https://github.com/angular/angular/commit/82d556a8fb38cd2024e3d098c55254305ba12b6b) | fix | Ensure the control instruction comes after the other bindings |
| [0055f3cc79](https://github.com/angular/angular/commit/0055f3cc79f387b8dec6ce5e1a33fad5486f9341) | fix | Rename signal form [field] to [formField] |
### migrations
| Commit | Type | Description |
| -- | -- | -- |
| [e4bfa5c9e7](https://github.com/angular/angular/commit/e4bfa5c9e7feec48d3c4e9425a21a2ccf6532bdb) | fix | prevent duplicate imports in common-to-standalone migration |
<!-- CHANGELOG SPLIT MARKER -->
<a name="21.0.8"></a>
# 21.0.8 (2026-01-08)
### core
| Commit | Type | Description |
| -- | -- | -- |
| [a6a2621bf9](https://github.com/angular/angular/commit/a6a2621bf9df02584e4079f4a804278fc2060a9c) | fix | fix memory leak with event replay |
| [5239e471a1](https://github.com/angular/angular/commit/5239e471a1f887574c6703c0497e5854304cce4e) | fix | handle cancelled traversals in fake navigation |
<!-- CHANGELOG SPLIT MARKER -->
<a name="20.3.16"></a>
# 20.3.16 (2026-01-07)
### core
| Commit | Type | Description |
| -- | -- | -- |
| [c2c2b4aaa8](https://github.com/angular/angular/commit/c2c2b4aaa84c67d2eccd4ef4f94b5ea444a7f73a) | fix | sanitize sensitive attributes on SVG script elements |
<!-- CHANGELOG SPLIT MARKER -->
<a name="19.2.18"></a>
# 19.2.18 (2026-01-07)
### core
| Commit | Type | Description |
| -- | -- | -- |
| [26cdc53d9c](https://github.com/angular/angular/commit/26cdc53d9cf99ec41ffc0c71f58f8a14efc828d9) | fix | sanitize sensitive attributes on SVG script elements |
<!-- CHANGELOG SPLIT MARKER -->
<a name="21.0.7"></a>
# 21.0.7 (2026-01-07)
### compiler
@@ -439,54 +183,6 @@ No user facing changes in this release
<!-- CHANGELOG SPLIT MARKER -->
<a name="20.3.15"></a>
# 20.3.15 (2025-12-01)
### compiler
| Commit | Type | Description |
| ------------------------------------------------------------------------------------------------ | ---- | ----------------------------------------------------------------- |
| [d1ca8ae043](https://github.com/angular/angular/commit/d1ca8ae04390f050039fdb653a6147d75d48f81e) | fix | prevent XSS via SVG animation `attributeName` and MathML/SVG URLs |
<!-- CHANGELOG SPLIT MARKER -->
<a name="19.2.17"></a>
# 19.2.17 (2025-12-01)
### compiler
| Commit | Type | Description |
| ------------------------------------------------------------------------------------------------ | ---- | ----------------------------------------------------------------- |
| [7c42e2ebeb](https://github.com/angular/angular/commit/7c42e2ebebc135e9949a9e9a0295ef3ccf261b82) | fix | prevent XSS via SVG animation `attributeName` and MathML/SVG URLs |
<!-- CHANGELOG SPLIT MARKER -->
<a name="19.2.16"></a>
# 19.2.16 (2025-11-26)
### http
| Commit | Type | Description |
| ------------------------------------------------------------------------------------------------ | ---- | ---------------------------------------------------- |
| [05fe6686a9](https://github.com/angular/angular/commit/05fe6686a97fa0bcd3cf157805b3612033f975bc) | fix | prevent XSRF token leakage to protocol-relative URLs |
<!-- CHANGELOG SPLIT MARKER -->
<a name="20.3.14"></a>
# 20.3.14 (2025-11-25)
### http
| Commit | Type | Description |
| ------------------------------------------------------------------------------------------------ | ---- | ---------------------------------------------------- |
| [0276479e7d](https://github.com/angular/angular/commit/0276479e7d0e280e0f8d26fa567d3b7aa97a516f) | fix | prevent XSRF token leakage to protocol-relative URLs |
<!-- CHANGELOG SPLIT MARKER -->
<a name="21.0.1"></a>
# 21.0.1 (2025-11-25)
@@ -808,69 +504,6 @@ No user facing changes in this release
<!-- CHANGELOG SPLIT MARKER -->
<a name="20.3.13"></a>
# 20.3.13 (2025-11-19)
<!-- CHANGELOG SPLIT MARKER -->
<a name="20.3.12"></a>
# 20.3.12 (2025-11-14)
<!-- CHANGELOG SPLIT MARKER -->
<a name="20.3.11"></a>
# 20.3.11 (2025-11-12)
### common
| Commit | Type | Description |
| ------------------------------------------------------------------------------------------------ | ---- | ------------------------------------------------------- |
| [5047849a4a](https://github.com/angular/angular/commit/5047849a4a1857471b78b7ba874f39ecd6175a6b) | fix | remove placeholder image listeners once view is removed |
### compiler
| Commit | Type | Description |
| ------------------------------------------------------------------------------------------------ | ---- | -------------------------------------------------- |
| [f9d0818087](https://github.com/angular/angular/commit/f9d08180876eb0aee5e5c489be734b07a7cc664e) | fix | support arbitrary nesting in :host-context() |
| [106b9040df](https://github.com/angular/angular/commit/106b9040dfe03bd8deb0eabccc29e07f734b6ab5) | fix | support commas in :host() argument |
| [9419ea348a](https://github.com/angular/angular/commit/9419ea348a296b50f13ac2e23ea9a00b336989b8) | fix | support complex selectors in :nth-child() |
| [036c5d2a07](https://github.com/angular/angular/commit/036c5d2a073f8e48704ec0d405ca997eedb721e9) | fix | support one additional level of nesting in :host() |
### core
| Commit | Type | Description |
| ------------------------------------------------------------------------------------------------ | ---- | ----------------------------------- |
| [dcdd1bcdbb](https://github.com/angular/angular/commit/dcdd1bcdbbd2a2fb4bd1fc4330259824d0bc8cb9) | fix | skip leave animations on view swaps |
<!-- CHANGELOG SPLIT MARKER -->
<a name="20.3.10"></a>
# 20.3.10 (2025-11-05)
### compiler-cli
| Commit | Type | Description |
| ------------------------------------------------------------------------------------------------ | ---- | ------------------------------------------ |
| [840db59dc1](https://github.com/angular/angular/commit/840db59dc1a9beb0b4e63799b5d56c2f096a1bab) | fix | make required inputs diagnostic less noisy |
### migrations
| Commit | Type | Description |
| ------------------------------------------------------------------------------------------------ | ---- | ---------------------------------------------------------------------------- |
| [a45e6b2b66](https://github.com/angular/angular/commit/a45e6b2b66f669c532d6bffbab65058edabcacd9) | fix | Prevent removal of templates referenced with preceding whitespace characters |
<!-- CHANGELOG SPLIT MARKER -->
<a name="20.3.9"></a>
# 20.3.9 (2025-10-29)
<!-- CHANGELOG SPLIT MARKER -->
<a name="20.3.7"></a>
# 20.3.7 (2025-10-22)
+1 -1
View File
@@ -1,6 +1,6 @@
The MIT License
Copyright (c) 2010-2026 Google LLC. https://angular.dev/license
Copyright (c) 2010-2025 Google LLC. https://angular.dev/license
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
+17 -27
View File
@@ -5,27 +5,27 @@ module(
)
bazel_dep(name = "rules_pkg", version = "1.2.0")
bazel_dep(name = "rules_nodejs", version = "6.7.3")
bazel_dep(name = "aspect_rules_ts", version = "3.8.5")
bazel_dep(name = "aspect_rules_js", version = "2.9.2")
bazel_dep(name = "rules_nodejs", version = "6.6.2")
bazel_dep(name = "aspect_rules_ts", version = "3.8.1")
bazel_dep(name = "aspect_rules_js", version = "2.8.3")
bazel_dep(name = "aspect_rules_esbuild", version = "0.25.0")
bazel_dep(name = "aspect_rules_jasmine", version = "2.0.3")
bazel_dep(name = "aspect_rules_jasmine", version = "2.0.2")
bazel_dep(name = "aspect_rules_rollup", version = "2.0.1")
bazel_dep(name = "bazel_skylib", version = "1.9.0")
bazel_dep(name = "aspect_bazel_lib", version = "2.22.5")
bazel_dep(name = "tar.bzl", version = "0.8.1")
bazel_dep(name = "yq.bzl", version = "0.3.5")
bazel_dep(name = "aspect_bazel_lib", version = "2.22.2")
bazel_dep(name = "tar.bzl", version = "0.7.0")
bazel_dep(name = "yq.bzl", version = "0.3.4")
bazel_dep(name = "rules_angular")
git_override(
module_name = "rules_angular",
commit = "d746c4f75e42cffe389d1ab077f4639be2bc78d1",
commit = "7133b97252508f8528e5c5818a9a73cacc2e2a0e",
remote = "https://github.com/devversion/rules_angular.git",
)
bazel_dep(name = "devinfra")
git_override(
module_name = "devinfra",
commit = "16c5f6e199e3e1b67ae5a62385d36366bb9a429d",
commit = "87ed54ddedde42b443be7c6fe36cdaf0a907ea39",
remote = "https://github.com/angular/dev-infra.git",
)
@@ -39,7 +39,7 @@ git_override(
bazel_dep(name = "rules_browsers")
git_override(
module_name = "rules_browsers",
commit = "ceb52751831f3e6249aba83f688a612e57a8d14a",
commit = "5f0e50d17d15c70e6ab5546f1659338ae94c4072",
remote = "https://github.com/devversion/rules_browsers.git",
)
@@ -47,18 +47,7 @@ yq = use_extension("@yq.bzl//yq:extensions.bzl", "yq")
use_repo(yq, "yq_toolchains")
node = use_extension("@rules_nodejs//nodejs:extensions.bzl", "node")
node.toolchain(
node_repositories = {
"22.22.0-darwin_arm64": ("node-v22.22.0-darwin-arm64.tar.gz", "node-v22.22.0-darwin-arm64", "5ed4db0fcf1eaf84d91ad12462631d73bf4576c1377e192d222e48026a902640"),
"22.22.0-darwin_amd64": ("node-v22.22.0-darwin-x64.tar.gz", "node-v22.22.0-darwin-x64", "5ea50c9d6dea3dfa3abb66b2656f7a4e1c8cef23432b558d45fb538c7b5dedce"),
"22.22.0-linux_arm64": ("node-v22.22.0-linux-arm64.tar.xz", "node-v22.22.0-linux-arm64", "1bf1eb9ee63ffc4e5d324c0b9b62cf4a289f44332dfef9607cea1a0d9596ba6f"),
"22.22.0-linux_ppc64le": ("node-v22.22.0-linux-ppc64le.tar.xz", "node-v22.22.0-linux-ppc64le", "d83b9957431cc18e1fc143a4b99f89cde7b8a18f53ef392231b4336afd058865"),
"22.22.0-linux_s390x": ("node-v22.22.0-linux-s390x.tar.xz", "node-v22.22.0-linux-s390x", "5aa0e520689448c4233e8d73f284e8e0634fdcd32b479735698494be5641f3e4"),
"22.22.0-linux_amd64": ("node-v22.22.0-linux-x64.tar.xz", "node-v22.22.0-linux-x64", "9aa8e9d2298ab68c600bd6fb86a6c13bce11a4eca1ba9b39d79fa021755d7c37"),
"22.22.0-windows_amd64": ("node-v22.22.0-win-x64.zip", "node-v22.22.0-win-x64", "c97fa376d2becdc8863fcd3ca2dd9a83a9f3468ee7ccf7a6d076ec66a645c77a"),
},
node_version = "22.22.0",
)
node.toolchain(node_version_from_nvmrc = "//:.nvmrc")
use_repo(node, "nodejs_toolchains")
use_repo(node, "nodejs_darwin_amd64")
use_repo(node, "nodejs_darwin_arm64")
@@ -71,8 +60,7 @@ use_repo(node, "nodejs_windows_amd64")
pnpm = use_extension("@aspect_rules_js//npm:extensions.bzl", "pnpm")
pnpm.pnpm(
name = "pnpm",
pnpm_version = "10.30.2",
pnpm_version_integrity = "sha512-Ns3HB+e3lAqYjJwez4jQhPhRS1w/CF9TouJEwpIdOyVFvCDdTr4fwkX+7EY7spiuzqemPtH3aAuHfcY3nY0MtA==",
pnpm_version = "10.16.1",
)
use_repo(pnpm, "pnpm")
@@ -83,6 +71,7 @@ npm.npm_translate_lock(
"//:.pnpmfile.cjs",
"//:package.json",
"//:pnpm-workspace.yaml",
"//:tools/pnpm-patches/dagre-d3-es+7.0.11.patch",
"//adev:package.json",
"//adev/shared-docs:package.json",
"//adev/shared-docs/pipeline/api-gen:package.json",
@@ -107,6 +96,7 @@ npm.npm_translate_lock(
"//packages/service-worker:package.json",
"//packages/upgrade:package.json",
"//tools/bazel/rules_angular_store:package.json",
"//vscode-ng-language-service/integration/pre_standalone_project:package.json",
"//vscode-ng-language-service/integration/project:package.json",
],
npmrc = "//:.npmrc",
@@ -117,9 +107,9 @@ use_repo(npm, "npm")
rules_ts_ext = use_extension("@aspect_rules_ts//ts:extensions.bzl", "ext")
rules_ts_ext.deps(
name = "angular_npm_typescript",
# Obtained by: curl --silent https://registry.npmjs.org/typescript/6.0.0-beta | jq -r '.dist.integrity'
ts_integrity = "sha512-CldZdztDpQRLM1HC6WDQjQkQN5Ub5zRau737a1diGh3lPmb9oRsaWHk1y5iqK0o7+1bNJ0oXfEGRkAogFZBL+Q==",
ts_version = "6.0.0-beta",
# Obtained by: curl --silent https://registry.npmjs.org/typescript/5.9.3 | jq -r '.dist.integrity'
ts_integrity = "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==",
ts_version = "5.9.3",
)
use_repo(rules_ts_ext, **{"npm_typescript": "angular_npm_typescript"})
+88 -375
View File
@@ -13,28 +13,28 @@
"https://bcr.bazel.build/modules/aspect_bazel_lib/2.0.0/MODULE.bazel": "e118477db5c49419a88d78ebc7a2c2cea9d49600fe0f490c1903324a2c16ecd9",
"https://bcr.bazel.build/modules/aspect_bazel_lib/2.11.0/MODULE.bazel": "cb1ba9f9999ed0bc08600c221f532c1ddd8d217686b32ba7d45b0713b5131452",
"https://bcr.bazel.build/modules/aspect_bazel_lib/2.14.0/MODULE.bazel": "2b31ffcc9bdc8295b2167e07a757dbbc9ac8906e7028e5170a3708cecaac119f",
"https://bcr.bazel.build/modules/aspect_bazel_lib/2.19.2/MODULE.bazel": "30dfabbfae0139b1f0036e01c201dd4c0167da3017f0b7ef3820d78e07622989",
"https://bcr.bazel.build/modules/aspect_bazel_lib/2.17.1/MODULE.bazel": "9b027af55f619c7c444cead71061578fab6587e5e1303fa4ed61d49d2b1a7262",
"https://bcr.bazel.build/modules/aspect_bazel_lib/2.19.3/MODULE.bazel": "253d739ba126f62a5767d832765b12b59e9f8d2bc88cc1572f4a73e46eb298ca",
"https://bcr.bazel.build/modules/aspect_bazel_lib/2.22.5/MODULE.bazel": "004ba890363d05372a97248c37205ae64b6fa31047629cd2c0895a9d0c7779e8",
"https://bcr.bazel.build/modules/aspect_bazel_lib/2.22.5/source.json": "ac2c3213df8f985785f1d0aeb7f0f73d5324e6e67d593d9b9470fb74a25d4a9b",
"https://bcr.bazel.build/modules/aspect_bazel_lib/2.22.2/MODULE.bazel": "6b735f3fdd64978e217c9725f4ff0d84bf606554c8e77d20e90977841d7ff2ed",
"https://bcr.bazel.build/modules/aspect_bazel_lib/2.22.2/source.json": "58fffa2d722cff47cb8d921c8bbed7701c53f233009d9ca82beb4a0fb8fb9418",
"https://bcr.bazel.build/modules/aspect_bazel_lib/2.7.7/MODULE.bazel": "491f8681205e31bb57892d67442ce448cda4f472a8e6b3dc062865e29a64f89c",
"https://bcr.bazel.build/modules/aspect_bazel_lib/2.8.1/MODULE.bazel": "812d2dd42f65dca362152101fbec418029cc8fd34cbad1a2fde905383d705838",
"https://bcr.bazel.build/modules/aspect_bazel_lib/2.9.3/MODULE.bazel": "66baf724dbae7aff4787bf2245cc188d50cb08e07789769730151c0943587c14",
"https://bcr.bazel.build/modules/aspect_rules_esbuild/0.25.0/MODULE.bazel": "5fef5ec709c837312823f9bcf0f276661e2cb48ad52f17c4e01176bbf1e9bf58",
"https://bcr.bazel.build/modules/aspect_rules_esbuild/0.25.0/source.json": "5e42968c6d23ab8bd95c02634b16864d866334347827cb6a8425b86c11cc4363",
"https://bcr.bazel.build/modules/aspect_rules_jasmine/2.0.3/MODULE.bazel": "1c2e7a2908dbf6640dce9b242369cf48b7018af666485cbae1470b49a9672591",
"https://bcr.bazel.build/modules/aspect_rules_jasmine/2.0.3/source.json": "5619d28f3e99eca53a0ae077cff6c66966d2da2ee8621bc0542af3fb85df128f",
"https://bcr.bazel.build/modules/aspect_rules_jasmine/2.0.2/MODULE.bazel": "45f054400ff242c4433f6d7f20f6123a9a72739cb7a1f44247d738db1644f46c",
"https://bcr.bazel.build/modules/aspect_rules_jasmine/2.0.2/source.json": "3ed399a5654259a822448f9cdbf21f6c738f16ccd7f89249c7507e374cbdd1e3",
"https://bcr.bazel.build/modules/aspect_rules_js/2.0.0/MODULE.bazel": "b45b507574aa60a92796e3e13c195cd5744b3b8aff516a9c0cb5ae6a048161c5",
"https://bcr.bazel.build/modules/aspect_rules_js/2.4.2/MODULE.bazel": "0d01db38b96d25df7ed952a5e96eac4b3802723d146961974bf020f6dd07591d",
"https://bcr.bazel.build/modules/aspect_rules_js/2.6.2/MODULE.bazel": "ed2a871f4ab8fbde0cab67c425745069d84ea64b64313fa1a2954017326511f5",
"https://bcr.bazel.build/modules/aspect_rules_js/2.9.2/MODULE.bazel": "93fd5b85e6e912fb0712cbab453c43271d4ea33a093f84fd587638fbc9f8c145",
"https://bcr.bazel.build/modules/aspect_rules_js/2.9.2/source.json": "4bff7c03ab387b60deb15649ba575688e62f2a71a7544cbc7a660b19ec473808",
"https://bcr.bazel.build/modules/aspect_rules_js/2.8.3/MODULE.bazel": "807ce5f624124a8bc586c743394d174e85f0f9c6c4e0e2410b4088aebe790ac8",
"https://bcr.bazel.build/modules/aspect_rules_js/2.8.3/source.json": "c35cb4e04f61a09c17f8c569894b80de884b1e3dee2d33829704786e3f778037",
"https://bcr.bazel.build/modules/aspect_rules_rollup/2.0.1/MODULE.bazel": "296e3a053658c2af989ba9bd62a205e6d1fa84bdd6dd5249196546e6b84770ec",
"https://bcr.bazel.build/modules/aspect_rules_rollup/2.0.1/source.json": "2fe8ac1ccb4de74bf884761e070010280b272d94e3997205b361b91c75409726",
"https://bcr.bazel.build/modules/aspect_rules_ts/3.6.3/MODULE.bazel": "d09db394970f076176ce7bab5b5fa7f0d560fd4f30b8432ea5e2c2570505b130",
"https://bcr.bazel.build/modules/aspect_rules_ts/3.7.0/MODULE.bazel": "5aace216caf88638950ef061245d23c36f57c8359e56e97f02a36f70bb09c50f",
"https://bcr.bazel.build/modules/aspect_rules_ts/3.8.5/MODULE.bazel": "bcf8f0b6b9375f0f74451e2f70671efae9bb366acef8fdc04675305eaf137f06",
"https://bcr.bazel.build/modules/aspect_rules_ts/3.8.5/source.json": "fa35e43f6359f654e4b70ce55efdf280d0b06c0b3ef9fc0b06ba52327a0e6311",
"https://bcr.bazel.build/modules/aspect_rules_ts/3.8.1/MODULE.bazel": "796622c65ae3008374fc2d77c32ddb4ef6da9fe891826ce648f70033a48b3667",
"https://bcr.bazel.build/modules/aspect_rules_ts/3.8.1/source.json": "a7c4f332f5c21f4e63d073f8dda40bf278d5307499fb307b35058dba558f417a",
"https://bcr.bazel.build/modules/aspect_tools_telemetry/0.2.3/MODULE.bazel": "20f53b145f40957a51077ae90b37b7ce83582a1daf9350349f0f86179e19dd0d",
"https://bcr.bazel.build/modules/aspect_tools_telemetry/0.2.6/MODULE.bazel": "cafb8781ad591bc57cc765dca5fefab08cf9f65af363d162b79d49205c7f8af7",
"https://bcr.bazel.build/modules/aspect_tools_telemetry/0.2.8/MODULE.bazel": "aa975a83e72bcaac62ee61ab12b788ea324a1d05c4aab28aadb202f647881679",
@@ -47,11 +47,9 @@
"https://bcr.bazel.build/modules/bazel_features/1.18.0/MODULE.bazel": "1be0ae2557ab3a72a57aeb31b29be347bcdc5d2b1eb1e70f39e3851a7e97041a",
"https://bcr.bazel.build/modules/bazel_features/1.19.0/MODULE.bazel": "59adcdf28230d220f0067b1f435b8537dd033bfff8db21335ef9217919c7fb58",
"https://bcr.bazel.build/modules/bazel_features/1.21.0/MODULE.bazel": "675642261665d8eea09989aa3b8afb5c37627f1be178382c320d1b46afba5e3b",
"https://bcr.bazel.build/modules/bazel_features/1.28.0/MODULE.bazel": "4b4200e6cbf8fa335b2c3f43e1d6ef3e240319c33d43d60cc0fbd4b87ece299d",
"https://bcr.bazel.build/modules/bazel_features/1.30.0/MODULE.bazel": "a14b62d05969a293b80257e72e597c2da7f717e1e69fa8b339703ed6731bec87",
"https://bcr.bazel.build/modules/bazel_features/1.34.0/MODULE.bazel": "e8475ad7c8965542e0c7aac8af68eb48c4af904be3d614b6aa6274c092c2ea1e",
"https://bcr.bazel.build/modules/bazel_features/1.39.0/MODULE.bazel": "28739425c1fc283c91931619749c832b555e60bcd1010b40d8441ce0a5cf726d",
"https://bcr.bazel.build/modules/bazel_features/1.39.0/source.json": "f63cbeb4c602098484d57001e5a07d31cb02bbccde9b5e2c9bf0b29d05283e93",
"https://bcr.bazel.build/modules/bazel_features/1.34.0/source.json": "dfa5c4b01110313153b484a735764d247fee5624bbab63d25289e43b151a657a",
"https://bcr.bazel.build/modules/bazel_features/1.4.1/MODULE.bazel": "e45b6bb2350aff3e442ae1111c555e27eac1d915e77775f6fdc4b351b758b5d7",
"https://bcr.bazel.build/modules/bazel_features/1.9.0/MODULE.bazel": "885151d58d90d8d9c811eb75e3288c11f850e1d6b481a8c9f766adee4712358b",
"https://bcr.bazel.build/modules/bazel_features/1.9.1/MODULE.bazel": "8f679097876a9b609ad1f60249c49d68bfab783dd9be012faf9d82547b14815a",
@@ -77,8 +75,7 @@
"https://bcr.bazel.build/modules/buildozer/7.1.2/MODULE.bazel": "2e8dd40ede9c454042645fd8d8d0cd1527966aa5c919de86661e62953cd73d84",
"https://bcr.bazel.build/modules/buildozer/7.1.2/source.json": "c9028a501d2db85793a6996205c8de120944f50a0d570438fcae0457a5f9d1f8",
"https://bcr.bazel.build/modules/gawk/5.3.2.bcr.1/MODULE.bazel": "cdf8cbe5ee750db04b78878c9633cc76e80dcf4416cbe982ac3a9222f80713c8",
"https://bcr.bazel.build/modules/gawk/5.3.2.bcr.3/MODULE.bazel": "f1b7bb2dd53e8f2ef984b39485ec8a44e9076dda5c4b8efd2fb4c6a6e856a31d",
"https://bcr.bazel.build/modules/gawk/5.3.2.bcr.3/source.json": "ebe931bfe362e4b41e59ee00a528db6074157ff2ced92eb9e970acab2e1089c9",
"https://bcr.bazel.build/modules/gawk/5.3.2.bcr.1/source.json": "fa7b512dfcb5eafd90ce3959cf42a2a6fe96144ebbb4b3b3928054895f2afac2",
"https://bcr.bazel.build/modules/google_benchmark/1.8.2/MODULE.bazel": "a70cf1bba851000ba93b58ae2f6d76490a9feb74192e57ab8e8ff13c34ec50cb",
"https://bcr.bazel.build/modules/googletest/1.11.0/MODULE.bazel": "3a83f095183f66345ca86aa13c58b59f9f94a2f81999c093d4eeaa2d262d12f4",
"https://bcr.bazel.build/modules/googletest/1.14.0.bcr.1/MODULE.bazel": "22c31a561553727960057361aa33bf20fb2e98584bc4fec007906e27053f80c6",
@@ -125,9 +122,7 @@
"https://bcr.bazel.build/modules/rules_cc/0.0.8/MODULE.bazel": "964c85c82cfeb6f3855e6a07054fdb159aced38e99a5eecf7bce9d53990afa3e",
"https://bcr.bazel.build/modules/rules_cc/0.0.9/MODULE.bazel": "836e76439f354b89afe6a911a7adf59a6b2518fafb174483ad78a2a2fde7b1c5",
"https://bcr.bazel.build/modules/rules_cc/0.1.1/MODULE.bazel": "2f0222a6f229f0bf44cd711dc13c858dad98c62d52bd51d8fc3a764a83125513",
"https://bcr.bazel.build/modules/rules_cc/0.2.16/MODULE.bazel": "9242fa89f950c6ef7702801ab53922e99c69b02310c39fb6e62b2bd30df2a1d4",
"https://bcr.bazel.build/modules/rules_cc/0.2.16/source.json": "d03d5cde49376d87e14ec14b666c56075e5e3926930327fd5d0484a1ff2ac1cc",
"https://bcr.bazel.build/modules/rules_cc/0.2.4/MODULE.bazel": "1ff1223dfd24f3ecf8f028446d4a27608aa43c3f41e346d22838a4223980b8cc",
"https://bcr.bazel.build/modules/rules_cc/0.1.1/source.json": "d61627377bd7dd1da4652063e368d9366fc9a73920bfa396798ad92172cf645c",
"https://bcr.bazel.build/modules/rules_foreign_cc/0.9.0/MODULE.bazel": "c9e8c682bf75b0e7c704166d79b599f93b72cfca5ad7477df596947891feeef6",
"https://bcr.bazel.build/modules/rules_fuzzing/0.5.2/MODULE.bazel": "40c97d1144356f52905566c55811f13b299453a14ac7769dfba2ac38192337a8",
"https://bcr.bazel.build/modules/rules_fuzzing/0.5.2/source.json": "c8b1e2c717646f1702290959a3302a178fb639d987ab61d548105019f11e527e",
@@ -162,11 +157,10 @@
"https://bcr.bazel.build/modules/rules_license/1.0.0/source.json": "a52c89e54cc311196e478f8382df91c15f7a2bfdf4c6cd0e2675cc2ff0b56efb",
"https://bcr.bazel.build/modules/rules_nodejs/6.2.0/MODULE.bazel": "ec27907f55eb34705adb4e8257952162a2d4c3ed0f0b3b4c3c1aad1fac7be35e",
"https://bcr.bazel.build/modules/rules_nodejs/6.3.0/MODULE.bazel": "45345e4aba35dd6e4701c1eebf5a4e67af4ed708def9ebcdc6027585b34ee52d",
"https://bcr.bazel.build/modules/rules_nodejs/6.3.3/MODULE.bazel": "b66eadebd10f1f1b25f52f95ab5213a57e82c37c3f656fcd9a57ad04d2264ce7",
"https://bcr.bazel.build/modules/rules_nodejs/6.5.0/MODULE.bazel": "546d0cf79f36f9f6e080816045f97234b071c205f4542e3351bd4424282a8810",
"https://bcr.bazel.build/modules/rules_nodejs/6.5.2/MODULE.bazel": "7f9ea68a0ce6d82905ce9f74e76ab8a8b4531ed4c747018c9d76424ad0b3370d",
"https://bcr.bazel.build/modules/rules_nodejs/6.7.3/MODULE.bazel": "c22a48b2a0dbf05a9dc5f83837bbc24c226c1f6e618de3c3a610044c9f336056",
"https://bcr.bazel.build/modules/rules_nodejs/6.7.3/source.json": "a3f966f4415a8a6545e560ee5449eac95cc633f96429d08e87c87775c72f5e09",
"https://bcr.bazel.build/modules/rules_nodejs/6.6.2/MODULE.bazel": "9fdb5e1d50246a25761f150fcc820dc47e4052330a8408451e628804f9ca64a6",
"https://bcr.bazel.build/modules/rules_nodejs/6.6.2/source.json": "6e8c1ecc64ff8da147c1620f862ad77d7b19c5d1b52b3aa5e847d5b3d0de4cc3",
"https://bcr.bazel.build/modules/rules_pkg/0.7.0/MODULE.bazel": "df99f03fc7934a4737122518bb87e667e62d780b610910f0447665a7e2be62dc",
"https://bcr.bazel.build/modules/rules_pkg/1.0.1/MODULE.bazel": "5b1df97dbc29623bccdf2b0dcd0f5cb08e2f2c9050aab1092fd39a41e82686ff",
"https://bcr.bazel.build/modules/rules_pkg/1.2.0/MODULE.bazel": "c7db3c2b407e673c7a39e3625dc05dc9f12d6682cbd82a3a5924a13b491eda7e",
@@ -200,15 +194,14 @@
"https://bcr.bazel.build/modules/stardoc/0.7.2/source.json": "58b029e5e901d6802967754adf0a9056747e8176f017cfe3607c0851f4d42216",
"https://bcr.bazel.build/modules/tar.bzl/0.2.1/MODULE.bazel": "52d1c00a80a8cc67acbd01649e83d8dd6a9dc426a6c0b754a04fe8c219c76468",
"https://bcr.bazel.build/modules/tar.bzl/0.5.1/MODULE.bazel": "7c2eb3dcfc53b0f3d6f9acdfd911ca803eaf92aadf54f8ca6e4c1f3aee288351",
"https://bcr.bazel.build/modules/tar.bzl/0.8.1/MODULE.bazel": "6ffe8907ed4c555bc94bd35a5a01411cc4470c6dace84f9cf487815409e077d1",
"https://bcr.bazel.build/modules/tar.bzl/0.9.0/MODULE.bazel": "452a22d7f02b1c9d7a22ab25edf20f46f3e1101f0f67dc4bfbf9a474ddf02445",
"https://bcr.bazel.build/modules/tar.bzl/0.9.0/source.json": "c732760a374831a2cf5b08839e4be75017196b4d796a5aa55235272ee17cd839",
"https://bcr.bazel.build/modules/tar.bzl/0.7.0/MODULE.bazel": "cc1acd85da33c80e430b65219a620d54d114628df24a618c3a5fa0b65e988da9",
"https://bcr.bazel.build/modules/tar.bzl/0.7.0/source.json": "9becb80306f42d4810bfa16379fb48aad0b01ce5342bc12fe47dcd6af3ac4d7a",
"https://bcr.bazel.build/modules/upb/0.0.0-20220923-a547704/MODULE.bazel": "7298990c00040a0e2f121f6c32544bab27d4452f80d9ce51349b1a28f3005c43",
"https://bcr.bazel.build/modules/yq.bzl/0.1.1/MODULE.bazel": "9039681f9bcb8958ee2c87ffc74bdafba9f4369096a2b5634b88abc0eaefa072",
"https://bcr.bazel.build/modules/yq.bzl/0.2.0/MODULE.bazel": "6f3a675677db8885be4d607fde14cc51829715e3a879fb016eb9bf336786ce6d",
"https://bcr.bazel.build/modules/yq.bzl/0.3.2/MODULE.bazel": "0384efa70e8033d842ea73aa4b7199fa099709e236a7264345c03937166670b6",
"https://bcr.bazel.build/modules/yq.bzl/0.3.5/MODULE.bazel": "130c603e54be717bdf84100210f06598a0d2b4b4e01888fb01b70f50f41767ec",
"https://bcr.bazel.build/modules/yq.bzl/0.3.5/source.json": "1ae7bdc03cb26aaa8bd2bceadf65e90d90f0b2d03008ba9a0564da2e21396c39",
"https://bcr.bazel.build/modules/yq.bzl/0.3.4/MODULE.bazel": "d3a270662f5d766cd7229732d65a5a5bc485240c3007343dd279edfb60c9ae27",
"https://bcr.bazel.build/modules/yq.bzl/0.3.4/source.json": "786dafdc2843722da3416e4343ee1a05237227f068590779a6e8496a2064c0f9",
"https://bcr.bazel.build/modules/zlib/1.2.11/MODULE.bazel": "07b389abc85fdbca459b69e2ec656ae5622873af3f845e1c9d80fe179f3effa0",
"https://bcr.bazel.build/modules/zlib/1.3.1.bcr.5/MODULE.bazel": "eec517b5bbe5492629466e11dae908d043364302283de25581e3eb944326c4ca",
"https://bcr.bazel.build/modules/zlib/1.3.1.bcr.5/source.json": "22bc55c47af97246cfc093d0acf683a7869377de362b5d1c552c2c2e16b7a806",
@@ -218,7 +211,7 @@
"moduleExtensions": {
"@@aspect_rules_esbuild+//esbuild:extensions.bzl%esbuild": {
"general": {
"bzlTransitiveDigest": "c4i5gawrp4Au9UMb55EzQCePYwkrFqD9tFBN7GdHG5g=",
"bzlTransitiveDigest": "9odiC0alKLq5PUYv/CZiw2yiMHsGpxvEhPsqt//fRRk=",
"usagesDigest": "ToTaCONCN/E05krnHXLM1kpV1zrHNxHrGpUip973II4=",
"recordedFileInputs": {},
"recordedDirentsInputs": {},
@@ -419,8 +412,8 @@
},
"@@aspect_rules_js+//npm:extensions.bzl%pnpm": {
"general": {
"bzlTransitiveDigest": "HC+l+mTivq1p/KbcVQ+iV5QwYR+oKESJh827FY68SH8=",
"usagesDigest": "ky8l7fS37yDgo35S6hNi24Kw+zsJxBL0pNof77FH304=",
"bzlTransitiveDigest": "zVV86HvMwDBJ8IsFt27k/Sjq0vCMPr8b8X9OAuprQ6w=",
"usagesDigest": "3ECQVM1bdy/C4w7vxglaG1gt0S98v0T14gP5wNiDgwY=",
"recordedFileInputs": {},
"recordedDirentsInputs": {},
"envVariables": {},
@@ -429,11 +422,11 @@
"repoRuleId": "@@aspect_rules_js+//npm/private:npm_import.bzl%npm_import_rule",
"attributes": {
"package": "pnpm",
"version": "10.30.2",
"version": "10.16.1",
"root_package": "",
"link_workspace": "",
"link_packages": {},
"integrity": "sha512-Ns3HB+e3lAqYjJwez4jQhPhRS1w/CF9TouJEwpIdOyVFvCDdTr4fwkX+7EY7spiuzqemPtH3aAuHfcY3nY0MtA==",
"integrity": "sha512-DhVaomKduGcrSehHXaYiaqS96oX9zf3BU1CHSUbU88kfqvZMvcSl0auAAvRz1cP87c0ZeYnPA5D5ut08BGeHBg==",
"url": "",
"commit": "",
"patch_args": [
@@ -456,7 +449,7 @@
"repoRuleId": "@@aspect_rules_js+//npm/private:npm_import.bzl%npm_import_links",
"attributes": {
"package": "pnpm",
"version": "10.30.2",
"version": "10.16.1",
"dev": false,
"root_package": "",
"link_packages": {},
@@ -573,10 +566,10 @@
},
"@@aspect_rules_ts+//ts:extensions.bzl%ext": {
"general": {
"bzlTransitiveDigest": "jrh/WHprsSSVvWjNLpDRdUl48LnV4xm2+ZssEvasHxQ=",
"usagesDigest": "5Mj1S/yyTIvnEsdYZuALQNxC6YMobxr4Fp6KXO8UzDo=",
"bzlTransitiveDigest": "7k3bewVApw4Kc6Rpho1Rrs1nrW/5jphUA5Mh1iHE2U4=",
"usagesDigest": "BIPOUwqzuuYqLOw/0p3h5GwHIDeBVXvNcxNoG5YlsHQ=",
"recordedFileInputs": {
"@@rules_browsers+//package.json": "772d873d450a539e2133635aeb5e63744cf1cec86e6b37aeecd9267a147fb0d7"
"@@rules_browsers+//package.json": "84dc1ba9b1c667a25894e97218bd8f247d54f24bb694efb397a881be3c06a4c5"
},
"recordedDirentsInputs": {},
"envVariables": {},
@@ -584,8 +577,8 @@
"angular_npm_typescript": {
"repoRuleId": "@@aspect_rules_ts+//ts/private:npm_repositories.bzl%http_archive_version",
"attributes": {
"version": "6.0.0-beta",
"integrity": "sha512-CldZdztDpQRLM1HC6WDQjQkQN5Ub5zRau737a1diGh3lPmb9oRsaWHk1y5iqK0o7+1bNJ0oXfEGRkAogFZBL+Q==",
"version": "5.9.3",
"integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==",
"urls": [
"https://registry.npmjs.org/typescript/-/typescript-{}.tgz"
]
@@ -640,7 +633,7 @@
"@@aspect_tools_telemetry+//:extension.bzl%telemetry": {
"general": {
"bzlTransitiveDigest": "cl5A2O84vDL6Tt+Qga8FCj1DUDGqn+e7ly5rZ+4xvcc=",
"usagesDigest": "iTRB8NybCoL/vRnkXtaHqavLwH75S1+FK8oR8PdUBIY=",
"usagesDigest": "c8kIEi+rX5/1OpfMZW0mHrM7sAvw+nu7pOep2xSjFb4=",
"recordedFileInputs": {},
"recordedDirentsInputs": {},
"envVariables": {},
@@ -649,10 +642,10 @@
"repoRuleId": "@@aspect_tools_telemetry+//:extension.bzl%tel_repository",
"attributes": {
"deps": {
"aspect_rules_ts": "3.8.5",
"aspect_rules_js": "2.9.2",
"aspect_rules_ts": "3.8.1",
"aspect_rules_js": "2.8.3",
"aspect_rules_esbuild": "0.25.0",
"aspect_rules_jasmine": "2.0.3",
"aspect_rules_jasmine": "2.0.2",
"aspect_tools_telemetry": "0.3.3"
}
}
@@ -734,8 +727,8 @@
},
"@@rules_browsers+//browsers:extensions.bzl%browsers": {
"general": {
"bzlTransitiveDigest": "Bm6fiKpWy96aLohOlLCP36ARVxRLZm/R+smhsb2HzmI=",
"usagesDigest": "FmXYJVoVJlnfUU8x8gObSvu4qWcco/9Faw61aC/wBF0=",
"bzlTransitiveDigest": "agkaLQ8wE1r/5IX6pkERzFxI/z0M42Em+ICNO6TXsVo=",
"usagesDigest": "FS7q5WaIwg3KirS3njhuPFkTIBYvDaTInVGrlzu0XL8=",
"recordedFileInputs": {},
"recordedDirentsInputs": {},
"envVariables": {},
@@ -743,9 +736,9 @@
"rules_browsers_chrome_linux": {
"repoRuleId": "@@rules_browsers+//browsers/private:browser_repo.bzl%browser_repo",
"attributes": {
"sha256": "1ac33f89306327af43be159c03ca4a26486de0858f42fe52394acdef50364143",
"sha256": "0a2ff0fc9eb5958b7b420f20e3968f424be7423fef89739e71565a48aa073a57",
"urls": [
"https://storage.googleapis.com/chrome-for-testing-public/147.0.7687.0/linux64/chrome-headless-shell-linux64.zip"
"https://storage.googleapis.com/chrome-for-testing-public/145.0.7586.0/linux64/chrome-headless-shell-linux64.zip"
],
"named_files": {
"CHROME-HEADLESS-SHELL": "chrome-headless-shell-linux64/chrome-headless-shell"
@@ -761,9 +754,9 @@
"rules_browsers_chrome_mac": {
"repoRuleId": "@@rules_browsers+//browsers/private:browser_repo.bzl%browser_repo",
"attributes": {
"sha256": "169ff49c465cfda52931395e61861e146dfc5013e92c01ca792db5acea858d0b",
"sha256": "e6076b1201d86f74c5eab982a239d5af83e66b1aa4d780bcb792698790e01d87",
"urls": [
"https://storage.googleapis.com/chrome-for-testing-public/147.0.7687.0/mac-x64/chrome-headless-shell-mac-x64.zip"
"https://storage.googleapis.com/chrome-for-testing-public/145.0.7586.0/mac-x64/chrome-headless-shell-mac-x64.zip"
],
"named_files": {
"CHROME-HEADLESS-SHELL": "chrome-headless-shell-mac-x64/chrome-headless-shell"
@@ -779,9 +772,9 @@
"rules_browsers_chrome_mac_arm": {
"repoRuleId": "@@rules_browsers+//browsers/private:browser_repo.bzl%browser_repo",
"attributes": {
"sha256": "aeaaaaa4d68193a21bed04c44ddeb1230232707b4ea1d845a92925787509cd8e",
"sha256": "b74dbcf5543d916b02d0a133e2e7c6a4de251f06733f72c2c15ea8c42213f63b",
"urls": [
"https://storage.googleapis.com/chrome-for-testing-public/147.0.7687.0/mac-arm64/chrome-headless-shell-mac-arm64.zip"
"https://storage.googleapis.com/chrome-for-testing-public/145.0.7586.0/mac-arm64/chrome-headless-shell-mac-arm64.zip"
],
"named_files": {
"CHROME-HEADLESS-SHELL": "chrome-headless-shell-mac-arm64/chrome-headless-shell"
@@ -797,9 +790,9 @@
"rules_browsers_chrome_win64": {
"repoRuleId": "@@rules_browsers+//browsers/private:browser_repo.bzl%browser_repo",
"attributes": {
"sha256": "4d6d79bcbcb22084df6e3a3d3a2caff67d6c0fa488d63f0c7ec1526f9553db8c",
"sha256": "df1e612dc3b1615e182a1f11821052995913c39df37caa52699de21a68d030d2",
"urls": [
"https://storage.googleapis.com/chrome-for-testing-public/147.0.7687.0/win64/chrome-headless-shell-win64.zip"
"https://storage.googleapis.com/chrome-for-testing-public/145.0.7586.0/win64/chrome-headless-shell-win64.zip"
],
"named_files": {
"CHROME-HEADLESS-SHELL": "chrome-headless-shell-win64/chrome-headless-shell.exe"
@@ -815,9 +808,9 @@
"rules_browsers_chromedriver_linux": {
"repoRuleId": "@@rules_browsers+//browsers/private:browser_repo.bzl%browser_repo",
"attributes": {
"sha256": "0607ccf6810a07ae08cac6443beac8b23f88dd53c7f1e0299e22d65f7cd2d020",
"sha256": "69c504306399d979a2766fea603c3fb9d3d87d46c75bddc9f2a049b4f636d57c",
"urls": [
"https://storage.googleapis.com/chrome-for-testing-public/147.0.7687.0/linux64/chromedriver-linux64.zip"
"https://storage.googleapis.com/chrome-for-testing-public/145.0.7586.0/linux64/chromedriver-linux64.zip"
],
"named_files": {
"CHROMEDRIVER": "chromedriver-linux64/chromedriver"
@@ -831,9 +824,9 @@
"rules_browsers_chromedriver_mac": {
"repoRuleId": "@@rules_browsers+//browsers/private:browser_repo.bzl%browser_repo",
"attributes": {
"sha256": "0f512a9dd683ed4c41e609d8d02c07807497dbad3ab2f95f0d583486be7b8cff",
"sha256": "5fc9d6f594fc5f2568a15145f25116dd8e9c9a60baa8da4bb21a17650fb00e7e",
"urls": [
"https://storage.googleapis.com/chrome-for-testing-public/147.0.7687.0/mac-x64/chromedriver-mac-x64.zip"
"https://storage.googleapis.com/chrome-for-testing-public/145.0.7586.0/mac-x64/chromedriver-mac-x64.zip"
],
"named_files": {
"CHROMEDRIVER": "chromedriver-mac-x64/chromedriver"
@@ -847,9 +840,9 @@
"rules_browsers_chromedriver_mac_arm": {
"repoRuleId": "@@rules_browsers+//browsers/private:browser_repo.bzl%browser_repo",
"attributes": {
"sha256": "7d6fc6d17de1733eb6739d1ea16d085c8df1568bcf9fa0d130c2784b27f38268",
"sha256": "14e92294c2c3639ca4e7d27e850588b619d698e2f8905cee368f07db2e1bf1e9",
"urls": [
"https://storage.googleapis.com/chrome-for-testing-public/147.0.7687.0/mac-arm64/chromedriver-mac-arm64.zip"
"https://storage.googleapis.com/chrome-for-testing-public/145.0.7586.0/mac-arm64/chromedriver-mac-arm64.zip"
],
"named_files": {
"CHROMEDRIVER": "chromedriver-mac-arm64/chromedriver"
@@ -863,9 +856,9 @@
"rules_browsers_chromedriver_win64": {
"repoRuleId": "@@rules_browsers+//browsers/private:browser_repo.bzl%browser_repo",
"attributes": {
"sha256": "f4e9fb7bbf692fde7979b24e8d737b3cef4baafbc7a370e5d0abc4a8450fd830",
"sha256": "cf641d2e176db95bcc158cd90eafd347ad4928fa0458a5f3bfd56c6d983e70db",
"urls": [
"https://storage.googleapis.com/chrome-for-testing-public/147.0.7687.0/win64/chromedriver-win64.zip"
"https://storage.googleapis.com/chrome-for-testing-public/145.0.7586.0/win64/chromedriver-win64.zip"
],
"named_files": {
"CHROMEDRIVER": "chromedriver-win64/chromedriver.exe"
@@ -879,9 +872,9 @@
"rules_browsers_firefox_linux": {
"repoRuleId": "@@rules_browsers+//browsers/private:browser_repo.bzl%browser_repo",
"attributes": {
"sha256": "f055b9c0d7346a10d22edc7f10e08679af2ea495367381ab2be9cab3ec6add97",
"sha256": "8d56f479cc398a537a60a3fa20dca92d8a41925113d3a67f534881a4e4d7e344",
"urls": [
"https://archive.mozilla.org/pub/firefox/releases/147.0/linux-x86_64/en-US/firefox-147.0.tar.xz"
"https://archive.mozilla.org/pub/firefox/releases/146.0/linux-x86_64/en-US/firefox-146.0.tar.xz"
],
"named_files": {
"FIREFOX": "firefox/firefox"
@@ -895,9 +888,9 @@
"rules_browsers_firefox_mac": {
"repoRuleId": "@@rules_browsers+//browsers/private:browser_repo.bzl%browser_repo",
"attributes": {
"sha256": "48485e2068bc726e2f30cf5855fc2da1fc75c1272bc243a5394f428ffae3ba35",
"sha256": "4b1645313887972d466cd82166ea571485c2c40a167f84624e3f3ca739993cc9",
"urls": [
"https://archive.mozilla.org/pub/firefox/releases/147.0/mac/en-US/Firefox%20147.0.dmg"
"https://archive.mozilla.org/pub/firefox/releases/146.0/mac/en-US/Firefox%20146.0.dmg"
],
"named_files": {
"FIREFOX": "Firefox.app/Contents/MacOS/firefox"
@@ -911,9 +904,9 @@
"rules_browsers_firefox_mac_arm": {
"repoRuleId": "@@rules_browsers+//browsers/private:browser_repo.bzl%browser_repo",
"attributes": {
"sha256": "48485e2068bc726e2f30cf5855fc2da1fc75c1272bc243a5394f428ffae3ba35",
"sha256": "4b1645313887972d466cd82166ea571485c2c40a167f84624e3f3ca739993cc9",
"urls": [
"https://archive.mozilla.org/pub/firefox/releases/147.0/mac/en-US/Firefox%20147.0.dmg"
"https://archive.mozilla.org/pub/firefox/releases/146.0/mac/en-US/Firefox%20146.0.dmg"
],
"named_files": {
"FIREFOX": "Firefox.app/Contents/MacOS/firefox"
@@ -927,9 +920,9 @@
"rules_browsers_firefox_win64": {
"repoRuleId": "@@rules_browsers+//browsers/private:browser_repo.bzl%browser_repo",
"attributes": {
"sha256": "36ff9e150875aa48a0af9eec3eb67f66dddd8efac5c743265371a72ae3e796c4",
"sha256": "216870c89648f32450cfefb5cec417fcd66d480d5dc83f894bf99f5fd7f38dbb",
"urls": [
"https://archive.mozilla.org/pub/firefox/releases/147.0/win64/en-US/Firefox%20Setup%20147.0.exe"
"https://archive.mozilla.org/pub/firefox/releases/146.0/win64/en-US/Firefox%20Setup%20146.0.exe"
],
"named_files": {
"FIREFOX": "core/firefox.exe"
@@ -1093,8 +1086,8 @@
},
"@@rules_nodejs+//nodejs:extensions.bzl%node": {
"general": {
"bzlTransitiveDigest": "4pUxCNc22K4I+6+4Nxu52Hur12tFRfa1JMsN5mdDv60=",
"usagesDigest": "SFGq+zUCbdSXGEjZH5ptl7y0cVwcw+BXOKjCi8YN22E=",
"bzlTransitiveDigest": "NwcLXHrbh2hoorA/Ybmcpjxsn/6avQmewDglodkDrgo=",
"usagesDigest": "QbHTNODxV2P0w/Zs/oELuqv6ovXgi81f6SUYmX7dNhc=",
"recordedFileInputs": {},
"recordedDirentsInputs": {},
"envVariables": {},
@@ -1103,47 +1096,12 @@
"repoRuleId": "@@rules_nodejs+//nodejs:repositories.bzl%_nodejs_repositories",
"attributes": {
"node_download_auth": {},
"node_repositories": {
"22.22.0-darwin_arm64": [
"node-v22.22.0-darwin-arm64.tar.gz",
"node-v22.22.0-darwin-arm64",
"5ed4db0fcf1eaf84d91ad12462631d73bf4576c1377e192d222e48026a902640"
],
"22.22.0-darwin_amd64": [
"node-v22.22.0-darwin-x64.tar.gz",
"node-v22.22.0-darwin-x64",
"5ea50c9d6dea3dfa3abb66b2656f7a4e1c8cef23432b558d45fb538c7b5dedce"
],
"22.22.0-linux_arm64": [
"node-v22.22.0-linux-arm64.tar.xz",
"node-v22.22.0-linux-arm64",
"1bf1eb9ee63ffc4e5d324c0b9b62cf4a289f44332dfef9607cea1a0d9596ba6f"
],
"22.22.0-linux_ppc64le": [
"node-v22.22.0-linux-ppc64le.tar.xz",
"node-v22.22.0-linux-ppc64le",
"d83b9957431cc18e1fc143a4b99f89cde7b8a18f53ef392231b4336afd058865"
],
"22.22.0-linux_s390x": [
"node-v22.22.0-linux-s390x.tar.xz",
"node-v22.22.0-linux-s390x",
"5aa0e520689448c4233e8d73f284e8e0634fdcd32b479735698494be5641f3e4"
],
"22.22.0-linux_amd64": [
"node-v22.22.0-linux-x64.tar.xz",
"node-v22.22.0-linux-x64",
"9aa8e9d2298ab68c600bd6fb86a6c13bce11a4eca1ba9b39d79fa021755d7c37"
],
"22.22.0-windows_amd64": [
"node-v22.22.0-win-x64.zip",
"node-v22.22.0-win-x64",
"c97fa376d2becdc8863fcd3ca2dd9a83a9f3468ee7ccf7a6d076ec66a645c77a"
]
},
"node_repositories": {},
"node_urls": [
"https://nodejs.org/dist/v{version}/{filename}"
],
"node_version": "22.22.0",
"node_version": "20.19.5",
"node_version_from_nvmrc": "@@//:.nvmrc",
"include_headers": false,
"platform": "linux_amd64"
}
@@ -1152,47 +1110,12 @@
"repoRuleId": "@@rules_nodejs+//nodejs:repositories.bzl%_nodejs_repositories",
"attributes": {
"node_download_auth": {},
"node_repositories": {
"22.22.0-darwin_arm64": [
"node-v22.22.0-darwin-arm64.tar.gz",
"node-v22.22.0-darwin-arm64",
"5ed4db0fcf1eaf84d91ad12462631d73bf4576c1377e192d222e48026a902640"
],
"22.22.0-darwin_amd64": [
"node-v22.22.0-darwin-x64.tar.gz",
"node-v22.22.0-darwin-x64",
"5ea50c9d6dea3dfa3abb66b2656f7a4e1c8cef23432b558d45fb538c7b5dedce"
],
"22.22.0-linux_arm64": [
"node-v22.22.0-linux-arm64.tar.xz",
"node-v22.22.0-linux-arm64",
"1bf1eb9ee63ffc4e5d324c0b9b62cf4a289f44332dfef9607cea1a0d9596ba6f"
],
"22.22.0-linux_ppc64le": [
"node-v22.22.0-linux-ppc64le.tar.xz",
"node-v22.22.0-linux-ppc64le",
"d83b9957431cc18e1fc143a4b99f89cde7b8a18f53ef392231b4336afd058865"
],
"22.22.0-linux_s390x": [
"node-v22.22.0-linux-s390x.tar.xz",
"node-v22.22.0-linux-s390x",
"5aa0e520689448c4233e8d73f284e8e0634fdcd32b479735698494be5641f3e4"
],
"22.22.0-linux_amd64": [
"node-v22.22.0-linux-x64.tar.xz",
"node-v22.22.0-linux-x64",
"9aa8e9d2298ab68c600bd6fb86a6c13bce11a4eca1ba9b39d79fa021755d7c37"
],
"22.22.0-windows_amd64": [
"node-v22.22.0-win-x64.zip",
"node-v22.22.0-win-x64",
"c97fa376d2becdc8863fcd3ca2dd9a83a9f3468ee7ccf7a6d076ec66a645c77a"
]
},
"node_repositories": {},
"node_urls": [
"https://nodejs.org/dist/v{version}/{filename}"
],
"node_version": "22.22.0",
"node_version": "20.19.5",
"node_version_from_nvmrc": "@@//:.nvmrc",
"include_headers": false,
"platform": "linux_arm64"
}
@@ -1201,47 +1124,12 @@
"repoRuleId": "@@rules_nodejs+//nodejs:repositories.bzl%_nodejs_repositories",
"attributes": {
"node_download_auth": {},
"node_repositories": {
"22.22.0-darwin_arm64": [
"node-v22.22.0-darwin-arm64.tar.gz",
"node-v22.22.0-darwin-arm64",
"5ed4db0fcf1eaf84d91ad12462631d73bf4576c1377e192d222e48026a902640"
],
"22.22.0-darwin_amd64": [
"node-v22.22.0-darwin-x64.tar.gz",
"node-v22.22.0-darwin-x64",
"5ea50c9d6dea3dfa3abb66b2656f7a4e1c8cef23432b558d45fb538c7b5dedce"
],
"22.22.0-linux_arm64": [
"node-v22.22.0-linux-arm64.tar.xz",
"node-v22.22.0-linux-arm64",
"1bf1eb9ee63ffc4e5d324c0b9b62cf4a289f44332dfef9607cea1a0d9596ba6f"
],
"22.22.0-linux_ppc64le": [
"node-v22.22.0-linux-ppc64le.tar.xz",
"node-v22.22.0-linux-ppc64le",
"d83b9957431cc18e1fc143a4b99f89cde7b8a18f53ef392231b4336afd058865"
],
"22.22.0-linux_s390x": [
"node-v22.22.0-linux-s390x.tar.xz",
"node-v22.22.0-linux-s390x",
"5aa0e520689448c4233e8d73f284e8e0634fdcd32b479735698494be5641f3e4"
],
"22.22.0-linux_amd64": [
"node-v22.22.0-linux-x64.tar.xz",
"node-v22.22.0-linux-x64",
"9aa8e9d2298ab68c600bd6fb86a6c13bce11a4eca1ba9b39d79fa021755d7c37"
],
"22.22.0-windows_amd64": [
"node-v22.22.0-win-x64.zip",
"node-v22.22.0-win-x64",
"c97fa376d2becdc8863fcd3ca2dd9a83a9f3468ee7ccf7a6d076ec66a645c77a"
]
},
"node_repositories": {},
"node_urls": [
"https://nodejs.org/dist/v{version}/{filename}"
],
"node_version": "22.22.0",
"node_version": "20.19.5",
"node_version_from_nvmrc": "@@//:.nvmrc",
"include_headers": false,
"platform": "linux_s390x"
}
@@ -1250,47 +1138,12 @@
"repoRuleId": "@@rules_nodejs+//nodejs:repositories.bzl%_nodejs_repositories",
"attributes": {
"node_download_auth": {},
"node_repositories": {
"22.22.0-darwin_arm64": [
"node-v22.22.0-darwin-arm64.tar.gz",
"node-v22.22.0-darwin-arm64",
"5ed4db0fcf1eaf84d91ad12462631d73bf4576c1377e192d222e48026a902640"
],
"22.22.0-darwin_amd64": [
"node-v22.22.0-darwin-x64.tar.gz",
"node-v22.22.0-darwin-x64",
"5ea50c9d6dea3dfa3abb66b2656f7a4e1c8cef23432b558d45fb538c7b5dedce"
],
"22.22.0-linux_arm64": [
"node-v22.22.0-linux-arm64.tar.xz",
"node-v22.22.0-linux-arm64",
"1bf1eb9ee63ffc4e5d324c0b9b62cf4a289f44332dfef9607cea1a0d9596ba6f"
],
"22.22.0-linux_ppc64le": [
"node-v22.22.0-linux-ppc64le.tar.xz",
"node-v22.22.0-linux-ppc64le",
"d83b9957431cc18e1fc143a4b99f89cde7b8a18f53ef392231b4336afd058865"
],
"22.22.0-linux_s390x": [
"node-v22.22.0-linux-s390x.tar.xz",
"node-v22.22.0-linux-s390x",
"5aa0e520689448c4233e8d73f284e8e0634fdcd32b479735698494be5641f3e4"
],
"22.22.0-linux_amd64": [
"node-v22.22.0-linux-x64.tar.xz",
"node-v22.22.0-linux-x64",
"9aa8e9d2298ab68c600bd6fb86a6c13bce11a4eca1ba9b39d79fa021755d7c37"
],
"22.22.0-windows_amd64": [
"node-v22.22.0-win-x64.zip",
"node-v22.22.0-win-x64",
"c97fa376d2becdc8863fcd3ca2dd9a83a9f3468ee7ccf7a6d076ec66a645c77a"
]
},
"node_repositories": {},
"node_urls": [
"https://nodejs.org/dist/v{version}/{filename}"
],
"node_version": "22.22.0",
"node_version": "20.19.5",
"node_version_from_nvmrc": "@@//:.nvmrc",
"include_headers": false,
"platform": "linux_ppc64le"
}
@@ -1299,47 +1152,12 @@
"repoRuleId": "@@rules_nodejs+//nodejs:repositories.bzl%_nodejs_repositories",
"attributes": {
"node_download_auth": {},
"node_repositories": {
"22.22.0-darwin_arm64": [
"node-v22.22.0-darwin-arm64.tar.gz",
"node-v22.22.0-darwin-arm64",
"5ed4db0fcf1eaf84d91ad12462631d73bf4576c1377e192d222e48026a902640"
],
"22.22.0-darwin_amd64": [
"node-v22.22.0-darwin-x64.tar.gz",
"node-v22.22.0-darwin-x64",
"5ea50c9d6dea3dfa3abb66b2656f7a4e1c8cef23432b558d45fb538c7b5dedce"
],
"22.22.0-linux_arm64": [
"node-v22.22.0-linux-arm64.tar.xz",
"node-v22.22.0-linux-arm64",
"1bf1eb9ee63ffc4e5d324c0b9b62cf4a289f44332dfef9607cea1a0d9596ba6f"
],
"22.22.0-linux_ppc64le": [
"node-v22.22.0-linux-ppc64le.tar.xz",
"node-v22.22.0-linux-ppc64le",
"d83b9957431cc18e1fc143a4b99f89cde7b8a18f53ef392231b4336afd058865"
],
"22.22.0-linux_s390x": [
"node-v22.22.0-linux-s390x.tar.xz",
"node-v22.22.0-linux-s390x",
"5aa0e520689448c4233e8d73f284e8e0634fdcd32b479735698494be5641f3e4"
],
"22.22.0-linux_amd64": [
"node-v22.22.0-linux-x64.tar.xz",
"node-v22.22.0-linux-x64",
"9aa8e9d2298ab68c600bd6fb86a6c13bce11a4eca1ba9b39d79fa021755d7c37"
],
"22.22.0-windows_amd64": [
"node-v22.22.0-win-x64.zip",
"node-v22.22.0-win-x64",
"c97fa376d2becdc8863fcd3ca2dd9a83a9f3468ee7ccf7a6d076ec66a645c77a"
]
},
"node_repositories": {},
"node_urls": [
"https://nodejs.org/dist/v{version}/{filename}"
],
"node_version": "22.22.0",
"node_version": "20.19.5",
"node_version_from_nvmrc": "@@//:.nvmrc",
"include_headers": false,
"platform": "darwin_amd64"
}
@@ -1348,47 +1166,12 @@
"repoRuleId": "@@rules_nodejs+//nodejs:repositories.bzl%_nodejs_repositories",
"attributes": {
"node_download_auth": {},
"node_repositories": {
"22.22.0-darwin_arm64": [
"node-v22.22.0-darwin-arm64.tar.gz",
"node-v22.22.0-darwin-arm64",
"5ed4db0fcf1eaf84d91ad12462631d73bf4576c1377e192d222e48026a902640"
],
"22.22.0-darwin_amd64": [
"node-v22.22.0-darwin-x64.tar.gz",
"node-v22.22.0-darwin-x64",
"5ea50c9d6dea3dfa3abb66b2656f7a4e1c8cef23432b558d45fb538c7b5dedce"
],
"22.22.0-linux_arm64": [
"node-v22.22.0-linux-arm64.tar.xz",
"node-v22.22.0-linux-arm64",
"1bf1eb9ee63ffc4e5d324c0b9b62cf4a289f44332dfef9607cea1a0d9596ba6f"
],
"22.22.0-linux_ppc64le": [
"node-v22.22.0-linux-ppc64le.tar.xz",
"node-v22.22.0-linux-ppc64le",
"d83b9957431cc18e1fc143a4b99f89cde7b8a18f53ef392231b4336afd058865"
],
"22.22.0-linux_s390x": [
"node-v22.22.0-linux-s390x.tar.xz",
"node-v22.22.0-linux-s390x",
"5aa0e520689448c4233e8d73f284e8e0634fdcd32b479735698494be5641f3e4"
],
"22.22.0-linux_amd64": [
"node-v22.22.0-linux-x64.tar.xz",
"node-v22.22.0-linux-x64",
"9aa8e9d2298ab68c600bd6fb86a6c13bce11a4eca1ba9b39d79fa021755d7c37"
],
"22.22.0-windows_amd64": [
"node-v22.22.0-win-x64.zip",
"node-v22.22.0-win-x64",
"c97fa376d2becdc8863fcd3ca2dd9a83a9f3468ee7ccf7a6d076ec66a645c77a"
]
},
"node_repositories": {},
"node_urls": [
"https://nodejs.org/dist/v{version}/{filename}"
],
"node_version": "22.22.0",
"node_version": "20.19.5",
"node_version_from_nvmrc": "@@//:.nvmrc",
"include_headers": false,
"platform": "darwin_arm64"
}
@@ -1397,47 +1180,12 @@
"repoRuleId": "@@rules_nodejs+//nodejs:repositories.bzl%_nodejs_repositories",
"attributes": {
"node_download_auth": {},
"node_repositories": {
"22.22.0-darwin_arm64": [
"node-v22.22.0-darwin-arm64.tar.gz",
"node-v22.22.0-darwin-arm64",
"5ed4db0fcf1eaf84d91ad12462631d73bf4576c1377e192d222e48026a902640"
],
"22.22.0-darwin_amd64": [
"node-v22.22.0-darwin-x64.tar.gz",
"node-v22.22.0-darwin-x64",
"5ea50c9d6dea3dfa3abb66b2656f7a4e1c8cef23432b558d45fb538c7b5dedce"
],
"22.22.0-linux_arm64": [
"node-v22.22.0-linux-arm64.tar.xz",
"node-v22.22.0-linux-arm64",
"1bf1eb9ee63ffc4e5d324c0b9b62cf4a289f44332dfef9607cea1a0d9596ba6f"
],
"22.22.0-linux_ppc64le": [
"node-v22.22.0-linux-ppc64le.tar.xz",
"node-v22.22.0-linux-ppc64le",
"d83b9957431cc18e1fc143a4b99f89cde7b8a18f53ef392231b4336afd058865"
],
"22.22.0-linux_s390x": [
"node-v22.22.0-linux-s390x.tar.xz",
"node-v22.22.0-linux-s390x",
"5aa0e520689448c4233e8d73f284e8e0634fdcd32b479735698494be5641f3e4"
],
"22.22.0-linux_amd64": [
"node-v22.22.0-linux-x64.tar.xz",
"node-v22.22.0-linux-x64",
"9aa8e9d2298ab68c600bd6fb86a6c13bce11a4eca1ba9b39d79fa021755d7c37"
],
"22.22.0-windows_amd64": [
"node-v22.22.0-win-x64.zip",
"node-v22.22.0-win-x64",
"c97fa376d2becdc8863fcd3ca2dd9a83a9f3468ee7ccf7a6d076ec66a645c77a"
]
},
"node_repositories": {},
"node_urls": [
"https://nodejs.org/dist/v{version}/{filename}"
],
"node_version": "22.22.0",
"node_version": "20.19.5",
"node_version_from_nvmrc": "@@//:.nvmrc",
"include_headers": false,
"platform": "windows_amd64"
}
@@ -1446,47 +1194,12 @@
"repoRuleId": "@@rules_nodejs+//nodejs:repositories.bzl%_nodejs_repositories",
"attributes": {
"node_download_auth": {},
"node_repositories": {
"22.22.0-darwin_arm64": [
"node-v22.22.0-darwin-arm64.tar.gz",
"node-v22.22.0-darwin-arm64",
"5ed4db0fcf1eaf84d91ad12462631d73bf4576c1377e192d222e48026a902640"
],
"22.22.0-darwin_amd64": [
"node-v22.22.0-darwin-x64.tar.gz",
"node-v22.22.0-darwin-x64",
"5ea50c9d6dea3dfa3abb66b2656f7a4e1c8cef23432b558d45fb538c7b5dedce"
],
"22.22.0-linux_arm64": [
"node-v22.22.0-linux-arm64.tar.xz",
"node-v22.22.0-linux-arm64",
"1bf1eb9ee63ffc4e5d324c0b9b62cf4a289f44332dfef9607cea1a0d9596ba6f"
],
"22.22.0-linux_ppc64le": [
"node-v22.22.0-linux-ppc64le.tar.xz",
"node-v22.22.0-linux-ppc64le",
"d83b9957431cc18e1fc143a4b99f89cde7b8a18f53ef392231b4336afd058865"
],
"22.22.0-linux_s390x": [
"node-v22.22.0-linux-s390x.tar.xz",
"node-v22.22.0-linux-s390x",
"5aa0e520689448c4233e8d73f284e8e0634fdcd32b479735698494be5641f3e4"
],
"22.22.0-linux_amd64": [
"node-v22.22.0-linux-x64.tar.xz",
"node-v22.22.0-linux-x64",
"9aa8e9d2298ab68c600bd6fb86a6c13bce11a4eca1ba9b39d79fa021755d7c37"
],
"22.22.0-windows_amd64": [
"node-v22.22.0-win-x64.zip",
"node-v22.22.0-win-x64",
"c97fa376d2becdc8863fcd3ca2dd9a83a9f3468ee7ccf7a6d076ec66a645c77a"
]
},
"node_repositories": {},
"node_urls": [
"https://nodejs.org/dist/v{version}/{filename}"
],
"node_version": "22.22.0",
"node_version": "20.19.5",
"node_version_from_nvmrc": "@@//:.nvmrc",
"include_headers": false,
"platform": "windows_arm64"
}
@@ -1515,7 +1228,7 @@
},
"@@rules_python+//python/extensions:pip.bzl%pip": {
"general": {
"bzlTransitiveDigest": "d3ENjFH8qMwmOrkcb3c9JYqQ5hJ6owjfbSr24KY0Ugg=",
"bzlTransitiveDigest": "39J6fxZx6VyebAMZs6LDsQSGw91SROMECqQx77bSJqE=",
"usagesDigest": "/9NP3RV6/DWuNdYAsIU/8UCgCX0TdPUJr0X6O+0lrtk=",
"recordedFileInputs": {
"@@protobuf+//python/requirements.txt": "983be60d3cec4b319dcab6d48aeb3f5b2f7c3350f26b3a9e97486c37967c73c5",
@@ -4309,8 +4022,8 @@
},
"@@yq.bzl+//yq:extensions.bzl%yq": {
"general": {
"bzlTransitiveDigest": "UfFMy8CWK4/dVo/tfaSAIYUiDGNAPes5eRllx9O9Q9Q=",
"usagesDigest": "LPHUB1lzZAsPKLeNh6HnzS3+5eXDr8A5CKmoD+VBOA4=",
"bzlTransitiveDigest": "tDqk+ntWTdxNAWPDjRY1uITgHbti2jcXR5ZdinltBs0=",
"usagesDigest": "fKeGl7m4X6ZwRQS4Up/5Bzx+9laXzZyKEn6s9ODJQTc=",
"recordedFileInputs": {},
"recordedDirentsInputs": {},
"envVariables": {},
+2 -38
View File
@@ -25,19 +25,6 @@ APPLICATION_FILES = [
"//adev/src/assets:context",
"//adev/src/content/examples:embeddable",
"tailwind.config.js",
# For the routes that are generated at build time
"//adev/src/assets:docs_api_manifest",
"//adev/scripts/routes:generate_route",
"//adev/src/app/routing/navigation-entries",
"//adev/src/app/routing/navigation-entries:navigation_types",
"//adev/src/content/reference/errors:route-nav-items",
"//adev/src/content/reference/extended-diagnostics:route-nav-items",
"//adev/src/content/tutorials/deferrable-views",
"//adev/src/content/tutorials/first-app",
"//adev/src/content/tutorials/learn-angular",
"//adev/src/content/tutorials/signal-forms",
"//adev/src/content/tutorials/signals",
] + glob(
["src/**/*"],
exclude = ["src/**/*.spec.ts"],
@@ -60,7 +47,6 @@ APPLICATION_DEPS = [
":node_modules/@lezer/highlight",
":node_modules/@lezer/javascript",
":node_modules/@stackblitz/sdk",
":node_modules/shiki",
":node_modules/@typescript/vfs",
":node_modules/@webcontainer/api",
":node_modules/@xterm/addon-fit",
@@ -92,30 +78,6 @@ APPLICATION_DEPS = [
":node_modules/crelt",
":node_modules/style-mod",
":node_modules/w3c-keyname",
#
":node_modules/@shikijs/themes",
":node_modules/@shikijs/langs",
":node_modules/@shikijs/engine-oniguruma",
":node_modules/@shikijs/core",
":node_modules/@shikijs/engine-javascript",
":node_modules/@shikijs/types",
":node_modules/@shikijs/vscode-textmate",
":node_modules/hast-util-to-html",
# ":node_modules/oniguruma-to-es",
":node_modules/ccount",
":node_modules/comma-separated-tokens",
":node_modules/hast-util-whitespace",
":node_modules/html-void-elements",
# ":node_modules/oniguruma-parser",
":node_modules/property-information",
# ":node_modules/regex-recursion",
# ":node_modules/regex",
":node_modules/space-separated-tokens",
":node_modules/stringify-entities",
":node_modules/zwitch",
":node_modules/character-entities-html4",
":node_modules/character-entities-legacy",
# ":node_modules/regex-utilities",
]
TEST_FILES = APPLICATION_FILES + glob(["src/app/**/*.spec.ts"])
@@ -142,6 +104,7 @@ ng_application(
],
env = {
"NG_BUILD_PARTIAL_SSR": "1",
"NG_FORCE_TTY": "0",
},
ng_config = ":ng_config",
node_modules = ":node_modules",
@@ -168,6 +131,7 @@ ng_application(
],
env = {
"NG_BUILD_OPTIMIZE_CHUNKS": "1",
"NG_FORCE_TTY": "0",
},
ng_config = ":ng_config",
node_modules = ":node_modules",
+41 -59
View File
@@ -1,104 +1,86 @@
{
"dependencies": {
"@algolia/client-common": "5.48.0",
"@algolia/client-search": "5.48.0",
"@algolia/requester-browser-xhr": "5.48.0",
"@algolia/requester-node-http": "5.48.0",
"@algolia/client-common": "5.41.0",
"@algolia/client-search": "5.41.0",
"@algolia/requester-browser-xhr": "5.41.0",
"@algolia/requester-node-http": "5.41.0",
"@angular/animations": "workspace:*",
"@angular/aria": "21.2.0-rc.0",
"@angular/build": "21.2.0-rc.2",
"@angular/cdk": "21.2.0-rc.0",
"@angular/cli": "21.2.0-rc.2",
"@angular/aria": "21.0.5",
"@angular/build": "21.0.4",
"@angular/cdk": "21.0.5",
"@angular/cli": "21.0.4",
"@angular/common": "workspace:*",
"@angular/compiler": "workspace:*",
"@angular/compiler-cli": "workspace:*",
"@angular/core": "workspace:*",
"@angular/docs": "workspace:*",
"@angular/forms": "workspace:*",
"@angular/material": "21.2.0-rc.0",
"@angular/material": "21.0.5",
"@angular/platform-browser": "workspace:*",
"@angular/platform-server": "workspace:*",
"@angular/router": "workspace:*",
"@angular/ssr": "21.2.0-rc.2",
"@codemirror/autocomplete": "6.20.0",
"@codemirror/commands": "6.10.1",
"@angular/ssr": "21.0.4",
"@codemirror/autocomplete": "6.19.1",
"@codemirror/commands": "6.10.0",
"@codemirror/lang-angular": "0.1.4",
"@codemirror/lang-css": "6.3.1",
"@codemirror/lang-html": "6.4.11",
"@codemirror/lang-javascript": "6.2.4",
"@codemirror/lang-sass": "6.0.2",
"@codemirror/language": "6.12.1",
"@codemirror/lint": "6.9.3",
"@codemirror/search": "6.6.0",
"@codemirror/state": "6.5.4",
"@codemirror/view": "6.39.12",
"@lezer/common": "1.5.1",
"@codemirror/language": "6.11.3",
"@codemirror/lint": "6.9.1",
"@codemirror/search": "6.5.11",
"@codemirror/state": "6.5.2",
"@codemirror/view": "6.38.6",
"@lezer/common": "1.3.0",
"@lezer/css": "1.3.0",
"@lezer/highlight": "1.2.3",
"@lezer/html": "1.3.13",
"@lezer/highlight": "1.2.2",
"@lezer/html": "1.3.12",
"@lezer/javascript": "1.5.4",
"@lezer/lr": "1.4.8",
"@lezer/lr": "1.4.2",
"@lezer/sass": "1.1.0",
"@marijn/find-cluster-break": "1.0.2",
"@shikijs/core": "^3.21.0",
"@shikijs/engine-javascript": "^3.21.0",
"@shikijs/engine-oniguruma": "^3.21.0",
"@shikijs/langs": "^3.21.0",
"@shikijs/themes": "^3.21.0",
"@shikijs/types": "^3.21.0",
"@shikijs/vscode-textmate": "^10.0.2",
"@stackblitz/sdk": "1.11.0",
"@types/dom-navigation": "1.0.6",
"@types/jasmine": "6.0.0",
"@types/jasmine": "5.1.12",
"@types/jsdom": "27.0.0",
"@types/node": "24.10.11",
"@types/node": "24.9.1",
"@typescript/vfs": "1.6.2",
"@webcontainer/api": "1.6.1",
"@xterm/addon-fit": "0.11.0",
"@xterm/xterm": "6.0.0",
"algoliasearch": "5.48.0",
"@xterm/addon-fit": "0.10.0",
"@xterm/xterm": "5.5.0",
"algoliasearch": "5.41.0",
"angular-split": "20.0.0",
"ccount": "^2.0.1",
"character-entities-html4": "^2.1.0",
"character-entities-legacy": "^3.0.0",
"comma-separated-tokens": "^2.0.3",
"crelt": "1.0.6",
"diff": "8.0.3",
"diff": "8.0.2",
"emoji-regex": "10.6.0",
"fflate": "0.8.2",
"hast-util-to-html": "^9.0.5",
"hast-util-whitespace": "^3.0.0",
"html-void-elements": "^3.0.0",
"jsdom": "28.0.0",
"jasmine-core": "6.1.0",
"jasmine-core": "5.12.0",
"jsdom": "27.0.1",
"karma-chrome-launcher": "3.2.0",
"karma-coverage": "2.2.1",
"karma-jasmine": "5.1.0",
"karma-jasmine-html-reporter": "2.2.0",
"marked": "17.0.1",
"mermaid": "11.12.2",
"karma-jasmine-html-reporter": "2.1.0",
"marked": "16.4.1",
"mermaid": "11.12.0",
"ngx-progressbar": "14.0.0",
"open-in-idx": "0.1.1",
"playwright-core": "1.58.1",
"preact": "10.28.3",
"preact-render-to-string": "6.6.5",
"prettier": "3.8.1",
"property-information": "^7.1.0",
"playwright-core": "1.56.1",
"preact": "10.27.2",
"preact-render-to-string": "6.6.3",
"prettier": "3.6.2",
"rxjs": "7.8.2",
"shiki": "3.22.0",
"space-separated-tokens": "^2.0.2",
"stringify-entities": "^4.0.4",
"shiki": "3.14.0",
"style-mod": "4.1.3",
"tinyglobby": "0.2.15",
"tslib": "2.8.1",
"typescript": "6.0.0-beta",
"w3c-keyname": "2.2.8",
"zwitch": "^2.0.4"
"typescript": "5.9.3",
"w3c-keyname": "2.2.8"
},
"devDependencies": {
"autoprefixer": "10.4.24",
"autoprefixer": "10.4.21",
"karma": "~6.4.4",
"postcss": "8.5.6",
"tailwindcss": "3.4.19"
"tailwindcss": "3.4.18"
}
}
-54
View File
@@ -1,54 +0,0 @@
load("@aspect_rules_ts//ts:defs.bzl", "ts_project")
load("//adev/shared-docs:defaults.bzl", "js_binary", "js_run_binary")
package(default_visibility = ["//adev:__subpackages__"])
ts_project(
name = "generate_routes_lib",
srcs = [
"generate-routes.mts",
],
data = [
"//adev/src/assets:docs_api_manifest",
"//adev/src/content/tutorials/deferrable-views",
"//adev/src/content/tutorials/first-app",
"//adev/src/content/tutorials/learn-angular",
"//adev/src/content/tutorials/signal-forms",
"//adev/src/content/tutorials/signals",
],
tsconfig = {
"compilerOptions": {
"target": "ES2022",
"module": "nodenext",
"moduleResolution": "nodenext",
"types": ["node"],
"rootDir": ".",
"skipLibCheck": True,
},
},
deps = [
"//adev:node_modules/@angular/docs",
"//adev:node_modules/@types/node",
"//adev/shared-docs/pipeline/shared:heading",
"//adev/src/app/routing/navigation-entries",
"//adev/src/content/reference/errors:route-nav-items",
"//adev/src/content/reference/extended-diagnostics:route-nav-items",
],
)
js_binary(
name = "generate_route",
data = [
"generate-routes.mjs",
":generate_routes_lib",
"//adev/src/content:guide_files",
],
entry_point = ":generate-routes.mjs",
)
js_run_binary(
name = "run_generate_route",
outs = ["defined-routes.json"],
chdir = package_name(),
tool = ":generate_route",
)
-75
View File
@@ -1,75 +0,0 @@
/*!
* @license
* Copyright Google LLC All Rights Reserved.
*
* Use of this source code is governed by an MIT-style license that can be
* found in the LICENSE file at https://angular.dev/license
*/
import {ALL_ITEMS} from '../../src/app/routing/navigation-entries/index.js';
import {getIdFromHeading} from '../../shared-docs/pipeline/shared/heading.mjs';
import {NavigationItem} from '@angular/docs';
import {writeFileSync, readFileSync} from 'fs';
import {join, resolve} from 'path';
const outputFile = 'defined-routes.json';
const contentRoot = resolve(process.cwd(), '../../src/content');
/**
* The scripts generates a list of all defined routes in the guides section and stores them
* in a JSON file. This file then used by other bazel targets to know which routes are valid.
*/
function extractRoutes(items: NavigationItem[]): string[] {
const routes: string[] = [];
for (const item of items) {
if (item.path && !item.path.startsWith('http')) {
routes.push(item.path);
if (item.contentPath) {
const content = readFileSync(join(contentRoot, `${item.contentPath}.md`), {
encoding: 'utf-8',
});
const headings = extractHeadings(content);
routes.push(
...headings.map(
(heading) => `${item.path}#${heading.toLowerCase().replace(/\s+/g, '-')}`,
),
);
}
}
if (item.children) {
routes.push(...extractRoutes(item.children));
}
}
return routes;
}
function extractHeadings(content: string): string[] {
const headings = content
.split('\n')
// Top level heading (H1) are used for the page title only
// and yes, headings can have leading spaces
.filter((line) => line.trim().startsWith('##'))
.map((line) => line.replace(/^#+\s*/, '').trim());
const stepRegex = /<docs-step[^>]*title="([^"]*)"/g;
let match;
while ((match = stepRegex.exec(content)) !== null) {
headings.push(match[1]);
}
return headings.map((heading: string) => getIdFromHeading(heading));
}
function main() {
const allRoutes: string[] = [];
allRoutes.push(...extractRoutes(ALL_ITEMS));
const uniqueRoutes = Array.from(new Set(allRoutes.filter((r) => !!r)));
console.warn('Generated routes:', JSON.stringify(uniqueRoutes, null, 2));
writeFileSync(outputFile, JSON.stringify(uniqueRoutes, null, 2));
}
main();
+1 -1
View File
@@ -6,7 +6,7 @@
* found in the LICENSE file at https://angular.dev/license
*/
import {type SynonymHit} from 'algoliasearch';
import {SynonymHit} from 'algoliasearch';
/**
* List of synonyms to upload to algolia.
-22
View File
@@ -1,22 +0,0 @@
{
"compileOnSave": false,
"compilerOptions": {
"forceConsistentCasingInFileNames": true,
"strict": true,
"noImplicitOverride": true,
"noPropertyAccessFromIndexSignature": true,
"noImplicitReturns": true,
"noFallthroughCasesInSwitch": true,
"sourceMap": true,
"declaration": false,
"moduleResolution": "bundler",
"preserveSymlinks": true,
"importHelpers": true,
"target": "ES2022",
"module": "ES2022",
"allowImportingTsExtensions": true,
"lib": ["ES2022"],
"types": [],
"skipLibCheck": true
}
}
+1 -1
View File
@@ -7,7 +7,7 @@
*/
import {algoliasearch} from 'algoliasearch';
import synonyms from './algolia-synonyms.mts';
import synonyms from './algolia-synonyms.mjs';
/** The name of the index being updated. */
const INDEX_NAME = 'angular_v17';
@@ -8,7 +8,7 @@
import {NgTemplateOutlet} from '@angular/common';
import {ChangeDetectionStrategy, Component, inject, input, output} from '@angular/core';
import {MatTooltip} from '@angular/material/tooltip';
import {MatTooltipModule} from '@angular/material/tooltip';
import {RouterLink, RouterLinkActive} from '@angular/router';
import {NavigationItem} from '../../interfaces/index';
import {IsActiveNavigationItem} from '../../pipes';
@@ -23,7 +23,7 @@ import {IconComponent} from '../icon/icon.component';
IconComponent,
IsActiveNavigationItem,
NgTemplateOutlet,
MatTooltip,
MatTooltipModule,
],
templateUrl: './navigation-list.component.html',
styleUrls: ['./navigation-list.component.scss'],
@@ -3,7 +3,7 @@
<docs-text-field
[autofocus]="true"
[hideIcon]="true"
[formField]="searchForm"
[field]="searchForm"
[resetLabel]="'Clear the search'"
class="docs-search-input"
placeholder="Search docs"
@@ -137,14 +137,14 @@ dialog {
.docs-search-results__start-typing,
.docs-search-results__no-results {
padding: 0.75rem;
color: var(--quaternary-contrast);
color: var(--gray-400);
}
.docs-search-footer {
display: flex;
align-items: center;
justify-content: space-between;
color: var(--quaternary-contrast);
color: var(--gray-400);
padding: 1rem;
font-size: 0.75rem;
font-weight: 500;
@@ -7,14 +7,14 @@
*/
import {
afterNextRender,
ChangeDetectionStrategy,
Component,
DestroyRef,
effect,
ElementRef,
inject,
Injector,
afterNextRender,
effect,
inject,
output,
viewChild,
viewChildren,
@@ -26,7 +26,7 @@ import {Search, SearchHistory} from '../../services';
import {ActiveDescendantKeyManager} from '@angular/cdk/a11y';
import {takeUntilDestroyed} from '@angular/core/rxjs-interop';
import {form, FormField} from '@angular/forms/signals';
import {Field, form} from '@angular/forms/signals';
import {Router, RouterLink} from '@angular/router';
import {fromEvent} from 'rxjs';
import {RelativeLink} from '../../pipes';
@@ -40,7 +40,7 @@ import {TextField} from '../text-field/text-field.component';
imports: [
ClickOutside,
TextField,
FormField,
Field,
SearchItem,
AlgoliaIcon,
RelativeLink,
@@ -54,6 +54,7 @@ export class SearchDialog {
readonly onClose = output();
readonly dialog = viewChild.required<ElementRef<HTMLDialogElement>>('searchDialog');
readonly items = viewChildren(SearchItem);
readonly textField = viewChild(TextField);
readonly history = inject(SearchHistory);
private readonly search = inject(Search);
@@ -95,6 +96,9 @@ export class SearchDialog {
if (!this.dialog().nativeElement.open) {
this.dialog().nativeElement.showModal?.();
}
// We want to select the pre-existing text on opening
// In order to change the search input with minimal user interaction.
this.textField()?.input().nativeElement.select();
},
});
@@ -15,7 +15,6 @@ ng_project(
"//adev/shared-docs/components:__pkg__",
],
deps = [
"//adev:node_modules/@angular/aria",
"//adev:node_modules/@angular/common",
"//adev:node_modules/@angular/core",
"//adev:node_modules/@angular/forms",
@@ -1,61 +1,10 @@
<div ngCombobox #outerCombobox="ngCombobox" [readonly]="true" [disabled]="disabled()">
<div class="docs-select-input-container">
<input
ngComboboxInput
[attr.id]="id()"
[attr.name]="name()"
[value]="displayValue()"
placeholder="Select an option..."
readonly
/>
<span class="material-symbols-outlined docs-select-arrow" translate="no" aria-hidden="true"
>arrow_drop_down</span
>
</div>
<ng-template ngComboboxPopupContainer>
<dialog ngComboboxDialog class="docs-select-dialog">
<div ngCombobox #innerCombobox="ngCombobox" filterMode="manual" [alwaysExpanded]="true">
<div class="docs-select-search-container">
<span
class="material-symbols-outlined docs-select-search-icon"
translate="no"
aria-hidden="true"
>search</span
>
<input
ngComboboxInput
class="docs-select-search-input"
placeholder="Search..."
[(value)]="searchString"
/>
</div>
<ng-template ngComboboxPopupContainer>
@if (filteredOptions().length === 0) {
<div class="docs-select-no-results">No results found</div>
}
<div ngListbox [(values)]="selectedValues" class="docs-select-listbox">
@for (option of filteredOptions(); track option.value) {
<div
ngOption
[value]="option.value"
[label]="option.label"
class="docs-select-option"
>
<span class="docs-select-option-label">{{ option.label }}</span>
<span
class="material-symbols-outlined docs-select-check-icon"
translate="no"
aria-hidden="true"
>check</span
>
</div>
}
</div>
</ng-template>
</div>
</dialog>
</ng-template>
</div>
<select
[attr.id]="id()"
[attr.name]="name()"
[value]="value()"
(change)="setOption($any($event.target).value)"
>
@for (item of options(); track item) {
<option [value]="item.value" [selected]="value() === item.value">{{ item.label }}</option>
}
</select>
@@ -1,186 +0,0 @@
:host {
--border-color: color-mix(in srgb, var(--full-contrast) 20%, var(--page-background));
}
[ngCombobox] {
position: relative;
width: 100%;
display: flex;
flex-direction: column;
border: 1px solid var(--border-color);
border-radius: 0.25rem;
}
.docs-select-input-container {
display: flex;
position: relative;
align-items: center;
border-radius: 0.25rem;
}
[ngComboboxInput] {
border-radius: 0.25rem;
}
[ngComboboxInput][readonly='true'] {
cursor: pointer;
padding: 0.7rem 1rem;
}
[ngCombobox]:focus-within [ngComboboxInput]:not(.docs-select-search-input) {
outline: 1.5px solid var(--vivid-pink);
box-shadow: 0 0 0 4px color-mix(in srgb, var(--vivid-pink) 25%, transparent);
}
.docs-select-arrow {
width: 24px;
height: 24px;
font-size: 20px;
display: grid;
place-items: center;
pointer-events: none;
padding: 0 0.5rem;
position: absolute;
right: 0;
opacity: 0.8;
transition: transform 0.2s ease;
}
[ngComboboxInput][aria-expanded='true'] + .docs-select-arrow {
transform: rotate(180deg);
}
[ngComboboxInput] {
width: 100%;
border: none;
outline: none;
font-size: 1rem;
padding: 0.7rem 1rem 0.7rem 2.5rem;
background-color: var(--septenary-contrast);
color: var(--primary-contrast);
}
.docs-select-dialog {
position: absolute;
left: auto;
right: auto;
top: auto;
bottom: auto;
padding: 0;
border: 1px solid var(--border-color);
border-radius: 0.25rem;
background-color: var(--septenary-contrast);
color: inherit;
.docs-select-input-container {
border-radius: 0;
}
[ngCombobox],
.docs-select-input-container {
border: none;
}
[ngComboboxInput] {
border-bottom-left-radius: 0;
border-bottom-right-radius: 0;
}
[ngCombobox]:focus-within [ngComboboxInput] {
outline: none;
box-shadow: none;
}
.docs-select-search-input:focus {
outline: none;
box-shadow: none;
}
.docs-select-search-container {
border-bottom: 1px solid var(--border-color);
}
&::backdrop {
opacity: 0;
}
}
.docs-select-search-container {
position: relative;
display: flex;
align-items: center;
border-radius: 0;
}
.docs-select-search-icon {
width: 24px;
height: 24px;
font-size: 20px;
display: grid;
place-items: center;
pointer-events: none;
position: absolute;
padding: 0 0.5rem;
opacity: 0.8;
}
.docs-select-search-input {
width: 100%;
border: none;
outline: none;
font-size: 0.875rem;
padding: 0.5rem 0.75rem 0.5rem 2rem;
background-color: var(--septenary-contrast);
color: var(--primary-contrast);
}
.docs-select-no-results {
padding: 0.75rem;
text-align: center;
font-size: 0.875rem;
color: var(--primary-contrast);
opacity: 0.7;
}
.docs-select-listbox {
display: flex;
flex-direction: column;
max-height: 12rem;
overflow: auto;
padding: 0.25rem;
}
.docs-select-option {
display: flex;
cursor: pointer;
align-items: center;
padding: 0.5rem 0.75rem;
font-size: 0.875rem;
border-radius: 0.25rem;
&:hover {
background-color: color-mix(in srgb, var(--primary-contrast) 5%, transparent);
}
&[data-active='true'] {
outline-offset: -2px;
outline: 2px solid var(--vivid-pink);
}
&[aria-selected='true'] {
color: var(--vivid-pink);
background-color: color-mix(in srgb, var(--vivid-pink) 5%, transparent);
}
&:not([aria-selected='true']) .docs-select-check-icon {
display: none;
}
}
.docs-select-option-label {
flex: 1;
}
.docs-select-check-icon {
font-size: 0.9rem;
}
@@ -6,26 +6,8 @@
* found in the LICENSE file at https://angular.dev/license
*/
import {
Combobox,
ComboboxDialog,
ComboboxInput,
ComboboxPopupContainer,
} from '@angular/aria/combobox';
import {Listbox, Option} from '@angular/aria/listbox';
import {
afterRenderEffect,
ChangeDetectionStrategy,
Component,
computed,
input,
model,
signal,
untracked,
viewChild,
} from '@angular/core';
import {ChangeDetectionStrategy, Component, input, model} from '@angular/core';
import {FormValueControl} from '@angular/forms/signals';
import {FormsModule} from '@angular/forms';
type SelectOptionValue = string | number | boolean;
@@ -37,17 +19,11 @@ export interface SelectOption {
@Component({
selector: 'docs-select',
changeDetection: ChangeDetectionStrategy.OnPush,
imports: [
Combobox,
ComboboxDialog,
ComboboxInput,
ComboboxPopupContainer,
FormsModule,
Listbox,
Option,
],
templateUrl: './select.component.html',
styleUrls: ['./select.component.scss'],
host: {
class: 'docs-form-element',
},
})
export class Select implements FormValueControl<string | null> {
readonly value = model<string | null>(null);
@@ -57,66 +33,11 @@ export class Select implements FormValueControl<string | null> {
readonly options = input.required<SelectOption[]>();
readonly disabled = input(false);
readonly dialog = viewChild(ComboboxDialog);
readonly listbox = viewChild<Listbox<SelectOptionValue>>(Listbox);
readonly combobox = viewChild<Combobox<SelectOptionValue>>(Combobox);
readonly searchString = signal('');
readonly filteredOptions = computed(() => {
const search = this.searchString().toLowerCase();
if (!search) {
return this.options();
}
return this.options().filter((option) => option.label.toLowerCase().includes(search));
});
readonly displayValue = computed(() => {
const currentValue = this.value();
if (currentValue === null) {
return '';
}
const option = this.options().find((opt) => opt.value === currentValue);
return option ? option.label : '';
});
readonly selectedValues = signal<SelectOptionValue[]>([]);
constructor() {
afterRenderEffect(() => {
if (this.dialog() && this.combobox()?.expanded()) {
untracked(() => this.listbox()?.gotoFirst());
this.positionDialog();
}
});
afterRenderEffect(() => {
const selected = this.selectedValues();
if (selected.length > 0) {
untracked(() => this.dialog()?.close());
this.value.set(selected[0] as string);
this.searchString.set('');
}
});
afterRenderEffect(() => this.listbox()?.scrollActiveItemIntoView());
}
// TODO: Improve once CDK overlay is fixed https://github.com/angular/components/issues/32504
private positionDialog(): void {
const dialog = this.dialog();
const combobox = this.combobox();
if (!dialog || !combobox) {
setOption($event: SelectOptionValue): void {
if (this.disabled()) {
return;
}
const comboboxRect = combobox.inputElement()?.getBoundingClientRect();
const scrollY = window.scrollY;
if (comboboxRect) {
dialog.element.style.width = `${comboboxRect.width}px`;
dialog.element.style.top = `${comboboxRect.bottom + scrollY + 4}px`;
dialog.element.style.left = `${comboboxRect.left}px`;
}
this.value.set($event as string);
}
}
@@ -32,32 +32,4 @@ describe('TabGroup', () => {
expect(tabs[0].textContent.trim()).toBe('tab 1');
expect(tabpanels[0].textContent.trim()).toBe('panel 1');
});
it('should generate unique ids for tabs and tabpanels', async () => {
const testPanel1 = document.createElement('div');
testPanel1.textContent = 'panel 1';
const testPanel2 = document.createElement('div');
testPanel2.textContent = 'panel 2';
fixture.componentRef.setInput('tabs', [
{label: 'tab 1', panel: testPanel1},
{label: 'tab 2', panel: testPanel2},
]);
await fixture.whenStable();
const tabs = fixture.nativeElement.querySelectorAll('.docs-tab');
const tabpanels = fixture.nativeElement.querySelectorAll('.docs-tab-panel');
expect(tabs[0].id).not.toBe(tabs[1].id);
expect(tabpanels[0].id).not.toBe(tabpanels[1].id);
const fixture2 = TestBed.createComponent(TabGroup);
fixture2.componentRef.setInput('tabs', [
{label: 'tab 1', panel: testPanel1},
{label: 'tab 2', panel: testPanel2},
]);
await fixture2.whenStable();
const tabs2 = fixture2.nativeElement.querySelectorAll('.docs-tab');
const tabpanels2 = fixture2.nativeElement.querySelectorAll('.docs-tab-panel');
expect(tabs[0].id).not.toBe(tabs2[0].id);
expect(tabpanels[0].id).not.toBe(tabpanels2[0].id);
});
});
@@ -7,19 +7,18 @@
*/
import {
afterRenderEffect,
ChangeDetectionStrategy,
Component,
computed,
ElementRef,
inject,
input,
inject,
computed,
linkedSignal,
Renderer2,
viewChildren,
afterRenderEffect,
Renderer2,
ElementRef,
ChangeDetectionStrategy,
} from '@angular/core';
let idCounter = 0;
import {_IdGenerator} from '@angular/cdk/a11y';
/**
* A simple tabs implementation with proper aria roles.
@@ -37,24 +36,20 @@ let idCounter = 0;
})
export class TabGroup {
private readonly _renderer = inject(Renderer2);
private readonly _idGenerator = inject(_IdGenerator);
private readonly _tabpanels = viewChildren<ElementRef<HTMLDivElement>>('tabpanel');
readonly tabs = input<{label: string; panel: HTMLElement}[]>();
readonly computedTabs = computed(() => {
return (
this.tabs()?.map((tab) => {
const id = idCounter++;
return {
tabId: `docs-tab-${id}`,
tabPanelId: `docs-tab-panel-${id}`,
label: tab.label,
panel: tab.panel,
};
}) ?? []
);
});
readonly computedTabs = computed(
() =>
this.tabs()?.map((tab) => ({
tabId: this._idGenerator.getId('docs-tab-'),
tabPanelId: this._idGenerator.getId('docs-tab-panel-'),
label: tab.label,
panel: tab.panel,
})) ?? [],
);
readonly selectedTab = linkedSignal(() => this.computedTabs()[0]?.tabId);
@@ -8,19 +8,11 @@
top: 0;
height: fit-content;
width: 14rem;
padding-right: 1rem;
padding-right: 2rem;
max-height: 100vh;
overflow-y: scroll;
box-sizing: border-box;
@include mq.for-large-desktop-up {
width: 16rem;
}
@include mq.for-extra-large-desktop-up {
width: 25rem;
}
aside {
margin-bottom: 2rem;
}
@@ -28,10 +28,10 @@ import {IconComponent} from '../icon/icon.component';
class: 'docs-form-element',
},
})
export class TextField implements FormValueControl<string> {
export class TextField implements FormValueControl<string | null> {
readonly input = viewChild.required<ElementRef<HTMLInputElement>>('inputRef');
readonly name = input<string>('');
readonly value = model<string>('');
readonly value = model<string | null>(null);
readonly placeholder = input<string | null>(null);
readonly disabled = model<boolean>(false);
readonly hideIcon = input<boolean>(false);
@@ -143,7 +143,7 @@
height: fit-content;
docs-icon {
color: var(--quaternary-contrast);
color: var(--gray-400);
transition: color 0.3s ease;
}
@@ -87,7 +87,7 @@
fill="none"
>
<path
fill="var(--quaternary-contrast)"
fill="var(--gray-400)"
d="M3.4 22 2 20.6 8.6 14H4v-2h8v8h-2v-4.6L3.4 22ZM12 12V4h2v4.6L20.6 2 22 3.4 15.4 10H20v2h-8Z"
/>
</svg>
@@ -2,11 +2,11 @@
.docs-example-viewer-preview {
.docs-dark-mode & {
color: var(--primary-contrast);
background: var(--primary-constrast);
background: var(--gray-900);
}
@media screen and (prefers-color-scheme: dark) {
color: var(--primary-contrast);
background: var(--primary-constrast);
background: var(--gray-900);
}
.docs-light-mode & {
background: var(--page-background);
@@ -70,7 +70,7 @@
cursor: pointer;
height: 24px;
width: 24px;
color: var(--quaternary-contrast);
color: var(--gray-400);
path {
transition: fill 0.3s ease;
@@ -9,6 +9,7 @@
import {
afterNextRender,
ChangeDetectionStrategy,
ChangeDetectorRef,
Component,
computed,
ElementRef,
@@ -19,13 +20,13 @@ import {
Type,
} from '@angular/core';
import {DOCUMENT, NgComponentOutlet, NgTemplateOutlet} from '@angular/common';
import {MatTab, MatTabGroup} from '@angular/material/tabs';
import {MatTabsModule} from '@angular/material/tabs';
import {Clipboard} from '@angular/cdk/clipboard';
import {CopySourceCodeButton} from '../../copy-source-code-button/copy-source-code-button.component';
import {IconComponent} from '../../icon/icon.component';
import {ExampleMetadata, Snippet} from '../../../interfaces/index';
import {EXAMPLE_VIEWER_CONTENT_LOADER} from '../../../providers/index';
import {MatTooltip} from '@angular/material/tooltip';
import {MatTooltipModule} from '@angular/material/tooltip';
export const CODE_LINE_NUMBER_CLASS_NAME = 'shiki-ln-number';
export const CODE_LINE_CLASS_NAME = 'line';
@@ -36,9 +37,8 @@ export const HIDDEN_CLASS_NAME = 'hidden';
selector: 'docs-example-viewer',
imports: [
CopySourceCodeButton,
MatTabGroup,
MatTab,
MatTooltip,
MatTabsModule,
MatTooltipModule,
IconComponent,
NgTemplateOutlet,
NgComponentOutlet,
+1 -7
View File
@@ -5,15 +5,9 @@ load("//adev/shared-docs/pipeline:_previews.bzl", _generate_previews = "generate
load("//adev/shared-docs/pipeline:_stackblitz.bzl", _generate_stackblitz = "generate_stackblitz")
load("//adev/shared-docs/pipeline:_tutorial.bzl", _generate_tutorial = "generate_tutorial")
generate_guides = _generate_guides
generate_stackblitz = _generate_stackblitz
generate_previews = _generate_previews
generate_playground = _generate_playground
generate_tutorial = _generate_tutorial
generate_nav_items = _generate_nav_items
def generate_guides(**kwargs):
_generate_guides(
api_manifest = "//adev/src/assets:docs_api_manifest",
defined_routes = "//adev/scripts/routes:defined-routes.json",
**kwargs
)
+10 -10
View File
@@ -2,14 +2,14 @@
"name": "@angular/docs",
"version": "0.0.0-PLACEHOLDER",
"peerDependencies": {
"@angular/cdk": "^21.2.0-next",
"@angular/common": "^21.2.0-next",
"@angular/core": "^21.2.0-next",
"@angular/forms": "^21.2.0-next",
"@angular/material": "^21.2.0-next",
"@angular/platform-browser": "^21.2.0-next",
"@angular/router": "^21.2.0-next",
"@angular/ssr": "^21.2.0-next",
"@angular/cdk": "^21.0.0",
"@angular/common": "^21.0.0",
"@angular/core": "^21.0.0",
"@angular/forms": "^21.0.0",
"@angular/material": "^21.0.0",
"@angular/platform-browser": "^21.0.0",
"@angular/router": "^21.0.0",
"@angular/ssr": "^21.0.0",
"algoliasearch": "^5.0.0",
"rxjs": "^7.8.1"
},
@@ -18,8 +18,8 @@
"diff": "~8.0.0",
"emoji-regex": "~10.6.0",
"fflate": "^0.8.2",
"jsdom": "~28.0.0",
"marked": "~17.0.0",
"jsdom": "~27.0.0",
"marked": "~16.4.0",
"mermaid": "^11.0.0",
"shiki": "^3.0.0",
"tinyglobby": "^0.2.12"
-2
View File
@@ -47,7 +47,6 @@ js_binary(
"//adev:node_modules/jsdom",
"//adev:node_modules/mermaid",
"//adev:node_modules/playwright-core",
"//adev:node_modules/typescript",
"@rules_browsers//browsers/chromium",
],
entry_point = "//adev/shared-docs/pipeline/guides:guides.mjs",
@@ -62,7 +61,6 @@ js_binary(
name = "markdown_no_mermaid",
data = [
"//adev:node_modules/jsdom",
"//adev:node_modules/typescript",
],
entry_point = "//adev/shared-docs/pipeline/guides:guides-no-mermaid.mjs",
visibility = ["//visibility:public"],
-11
View File
@@ -22,11 +22,6 @@ def _generate_guides(ctx):
else:
args.add("")
if ctx.attr.defined_routes:
args.add(ctx.file.defined_routes.path)
else:
args.add("")
# Determine the set of html output files. For each input markdown file, produce an html
# file with the same name (replacing the markdown extension with `.html`).
html_outputs = []
@@ -44,8 +39,6 @@ def _generate_guides(ctx):
inputs = ctx.files.srcs + ctx.files.data
if ctx.attr.api_manifest:
inputs.append(ctx.file.api_manifest)
if ctx.attr.defined_routes:
inputs.append(ctx.file.defined_routes)
if (ctx.attr.mermaid_blocks):
ctx.actions.run(
@@ -92,10 +85,6 @@ generate_guides = rule(
doc = """A file containing API entries to be used in the markdown.""",
allow_single_file = True,
),
"defined_routes": attr.label(
doc = """List of defined routes.""",
allow_single_file = [".json"],
),
"mermaid_blocks": attr.bool(
doc = """Whether to transform mermaid blocks.""",
default = False,
@@ -7,7 +7,6 @@ esbuild(
entry_point = ":index.mts",
external = [
"@angular/compiler-cli",
"typescript",
],
format = "esm",
output = "bin.mjs",
@@ -8,7 +8,6 @@ esbuild(
external = [
"jsdom",
"playwright-core",
"typescript",
],
format = "esm",
output = "bin.mjs",
@@ -126,11 +126,11 @@ export interface EnumEntry extends DocEntry {
/** Documentation entity for an Angular decorator. */
export interface DecoratorEntry extends DocEntry {
decoratorType: DecoratorType;
members: PropertyEntry[] | null;
signatures?: {
parameters: ParameterEntry[];
jsdocTags: JsDocTagEntry[];
}[];
members: MemberEntry[];
}
/** Documentation entity for an Angular directives and components. */
@@ -161,9 +161,6 @@ export type FunctionEntry = FunctionDefinitionEntry &
implementation: FunctionSignatureMetadata;
};
/** Documentation entity for a block. */
export interface BlockEntry extends DocEntry {}
/** Interface describing a function with overload signatures. */
export interface FunctionDefinitionEntry {
name: string;
@@ -7,7 +7,6 @@
*/
import {
BlockEntry,
ClassEntry,
ConstantEntry,
DecoratorEntry,
@@ -28,7 +27,6 @@ import {
import {CliCommand} from '../cli-entities.mjs';
import {
BlockEntryRenderable,
ClassEntryRenderable,
ConstantEntryRenderable,
DecoratorEntryRenderable,
@@ -109,13 +107,6 @@ export function isFunctionEntry(entry: DocEntry): entry is FunctionEntry {
return entry.entryType === EntryType.Function;
}
/** Gets whether the given entry represents a block */
export function isBlockEntry(entry: DocEntryRenderable): entry is BlockEntryRenderable;
export function isBlockEntry(entry: DocEntry): entry is BlockEntry;
export function isBlockEntry(entry: DocEntry): entry is BlockEntry {
return entry.entryType === EntryType.Block;
}
export function isInitializerApiFunctionEntry(
entry: DocEntryRenderable,
): entry is InitializerApiFunctionRenderable;
@@ -21,7 +21,6 @@ import {
ParameterEntry,
PipeEntry,
TypeAliasEntry,
EntryType,
} from '../entities.mjs';
import {CliCommand, CliOption} from '../cli-entities.mjs';
@@ -76,11 +75,7 @@ export type PipeEntryRenderable = PipeEntry &
members: MemberEntryRenderable[];
};
export type DecoratorEntryRenderable = Omit<DecoratorEntry, 'members'> &
DocEntryRenderable &
HasRenderableToc & {
members: PropertyEntryRenderable[];
};
export type DecoratorEntryRenderable = DecoratorEntry & DocEntryRenderable & HasRenderableToc;
/** Documentation entity for a TypeScript enum augmented transformed content for rendering. */
export type EnumEntryRenderable = EnumEntry &
@@ -107,9 +102,6 @@ export type FunctionSignatureMetadataRenderable = FunctionSignatureMetadata &
params: ParameterEntryRenderable[];
};
/** Documentation entity for a block augmented with transformed content for rendering. */
export type BlockEntryRenderable = DocEntry & DocEntryRenderable;
/** Sub-entry for a single class or enum member augmented with transformed content for rendering. */
export interface MemberEntryRenderable extends MemberEntry {
htmlDescription: string;
@@ -124,10 +116,6 @@ export interface MemberEntryRenderable extends MemberEntry {
experimental: {version: string | undefined} | undefined;
}
export interface PropertyEntryRenderable extends MemberEntryRenderable {
type: string;
}
/** Sub-entry for a class method augmented transformed content for rendering. */
export type MethodEntryRenderable = MemberEntryRenderable &
FunctionEntryRenderable & {
@@ -167,9 +155,11 @@ export type CliCommandRenderable = CliCommand & {
htmlDescription: string;
cards: CliCardRenderable[];
argumentsLabel: string;
optionsLabel: string;
hasOptions: boolean;
subcommands?: CliCommandRenderable[];
};
export interface InitializerApiFunctionRenderable
extends Omit<InitializerApiFunctionEntry, 'jsdocTags'>, DocEntryRenderable, HasRenderableToc {}
extends Omit<InitializerApiFunctionEntry, 'jsdocTags'>,
DocEntryRenderable,
HasRenderableToc {}
@@ -6,7 +6,7 @@
* found in the LICENSE file at https://angular.dev/license
*/
import {JsDocTagEntry, MemberEntry, ParameterEntry, PropertyEntry} from '../entities.mjs';
import {JsDocTagEntry, MemberEntry, ParameterEntry} from '../entities.mjs';
import {
CodeLineRenderable,
@@ -14,7 +14,6 @@ import {
LinkEntryRenderable,
MemberEntryRenderable,
ParameterEntryRenderable,
PropertyEntryRenderable,
} from './renderables.mjs';
/** A doc entry that has jsdoc tags. */
@@ -22,10 +21,6 @@ export interface HasJsDocTags {
jsdocTags: JsDocTagEntry[];
}
export interface MaybeJsDocTags {
jsdocTags?: JsDocTagEntry[];
}
export interface HasAdditionalLinks {
additionalLinks: LinkEntryRenderable[];
}
@@ -61,10 +56,6 @@ export interface HasMembers {
members: MemberEntry[];
}
export interface HasPropertyMembers {
members: PropertyEntry[];
}
/** A doc entry that has members groups transformed for rendering. */
export interface HasRenderableMembersGroups {
membersGroups: Map<string, MemberEntryRenderable[]>;
@@ -75,10 +66,6 @@ export interface HasRenderableMembers {
members: MemberEntryRenderable[];
}
export interface HasRenderablePropertyMembers {
members: PropertyEntryRenderable[];
}
/** A doc entry that has an associated JS module name. */
export interface HasModuleName {
moduleName: string;
@@ -19,7 +19,6 @@ import {
isInitializerApiFunctionEntry,
isInterfaceEntry,
isTypeAliasEntry,
isBlockEntry,
} from './entities/categorization.mjs';
import {CliCommandRenderable, DocEntryRenderable} from './entities/renderables.mjs';
import {getClassRenderable} from './transforms/class-transforms.mjs';
@@ -40,7 +39,6 @@ import {
import {addModuleName} from './transforms/module-name.mjs';
import {addRepo} from './transforms/repo.mjs';
import {getTypeAliasRenderable} from './transforms/type-alias-transforms.mjs';
import {getBlockRenderable} from './transforms/block-transforms.mjs';
export async function getRenderable(
entry: DocEntry | CliCommand,
@@ -75,9 +73,6 @@ export async function getRenderable(
if (isInitializerApiFunctionEntry(entry)) {
return getInitializerApiFunctionRenderable(entry, moduleName, repo);
}
if (isBlockEntry(entry)) {
return getBlockRenderable(entry, moduleName, repo);
}
// Fallback to an uncategorized renderable.
return setEntryFlags(
@@ -18,7 +18,6 @@ import {
isInitializerApiFunctionEntry,
isInterfaceEntry,
isTypeAliasEntry,
isBlockEntry,
} from './entities/categorization.mjs';
import {CliCommandRenderable, DocEntryRenderable} from './entities/renderables.mjs';
import {ClassReference} from './templates/class-reference';
@@ -31,7 +30,6 @@ import {InitializerApiFunction} from './templates/initializer-api-function';
import {TypeAliasReference} from './templates/type-alias-reference';
import {DecoratorReference} from './templates/decorator-reference';
import {setCurrentSymbol} from './symbol-context.mjs';
import {BlockReference} from './templates/block-reference';
/** Given a doc entry, get the transformed version of the entry for rendering. */
export function renderEntry(renderable: DocEntryRenderable | CliCommandRenderable): string {
@@ -61,9 +59,6 @@ export function renderEntry(renderable: DocEntryRenderable | CliCommandRenderabl
if (isInitializerApiFunctionEntry(renderable)) {
return render(InitializerApiFunction(renderable));
}
if (isBlockEntry(renderable)) {
return render(BlockReference(renderable));
}
// Fall back rendering nothing while in development.
return render(DocsReference(renderable));
@@ -1,23 +0,0 @@
/*!
* @license
* Copyright Google LLC All Rights Reserved.
*
* Use of this source code is governed by an MIT-style license that can be
* found in the LICENSE file at https://angular.dev/license
*/
import {h} from 'preact';
import {BlockEntryRenderable} from '../entities/renderables.mjs';
import {HeaderApi} from './header-api';
import {RawHtml} from './raw-html';
import {API_REFERENCE_CONTAINER} from '../styling/css-classes.mjs';
/** Component to render a block API reference document. */
export function BlockReference(entry: BlockEntryRenderable) {
return (
<div className={API_REFERENCE_CONTAINER}>
<HeaderApi entry={entry} hideDescription={true} />
<RawHtml value={entry.htmlDescription} />
</div>
);
}
@@ -12,18 +12,15 @@ import {
ParameterEntryRenderable,
} from '../entities/renderables.mjs';
import {PARAM_KEYWORD_CLASS_NAME, REFERENCE_MEMBER_CARD_ITEM} from '../styling/css-classes.mjs';
import {CodeSymbol} from './code-symbols';
import {DeprecatedLabel} from './deprecated-label';
import {Parameter} from './parameter';
import {RawHtml} from './raw-html';
import {CodeSymbol} from './code-symbols';
/**
* Component to render the method-specific parts of a class's API reference.
*/
export function ClassMethodInfo(props: {
entry: FunctionSignatureMetadataRenderable;
hideUsageNotes?: boolean;
}) {
export function ClassMethodInfo(props: {entry: FunctionSignatureMetadataRenderable}) {
const entry = props.entry;
return (
@@ -46,7 +43,7 @@ export function ClassMethodInfo(props: {
<span className={PARAM_KEYWORD_CLASS_NAME}>@returns</span>
<CodeSymbol code={entry.returnType} />
</div>
{entry.htmlUsageNotes && !props.hideUsageNotes ? (
{entry.htmlUsageNotes ? (
<div className={'docs-usage-notes'}>
<span className={'docs-usage-notes-heading'}>Usage notes</span>
<RawHtml value={entry.htmlUsageNotes} />
@@ -28,7 +28,6 @@ import {RawHtml} from './raw-html';
import {DeprecationWarning} from './deprecation-warning';
import {codeToHtml} from '../../../shared/shiki.mjs';
import {getHighlighterInstance} from '../shiki/shiki.mjs';
import {getSymbolsAsApiEntries} from '../symbol-context.mjs';
/** Component to render a class API reference document. */
export function ClassReference(
@@ -44,7 +43,6 @@ export function ClassReference(
<RawHtml
value={codeToHtml(getHighlighterInstance(), (entry as PipeEntry).usage, {
language: 'angular-html',
apiEntries: getSymbolsAsApiEntries(),
})}
/>
</div>
@@ -26,15 +26,19 @@ export function CliCommandReference(entry: CliCommandRenderable) {
<code>
<div className={'shiki line cli'}>
ng {commandName(entry, command)}
{entry.argumentsLabel && (
{entry.argumentsLabel ? (
<button member-id={'Arguments'} className="shiki-ln-line-argument">
{entry.argumentsLabel}
</button>
) : (
<></>
)}
{entry.optionsLabel && (
{entry.hasOptions ? (
<button member-id={'Options'} className="shiki-ln-line-option">
{entry.optionsLabel}
[options]
</button>
) : (
<></>
)}
</div>
</code>
@@ -7,45 +7,12 @@
*/
import {h} from 'preact';
import {DecoratorEntryRenderable, PropertyEntryRenderable} from '../entities/renderables.mjs';
import {
API_REFERENCE_CONTAINER,
REFERENCE_MEMBER_CARD,
REFERENCE_MEMBER_CARD_BODY,
REFERENCE_MEMBER_CARD_HEADER,
REFERENCE_MEMBER_CARD_ITEM,
REFERENCE_MEMBERS,
} from '../styling/css-classes.mjs';
import {CodeSymbol} from './code-symbols';
import {HeaderApi} from './header-api';
import {RawHtml} from './raw-html';
import {SectionApi} from './section-api';
import {SectionDescription} from './section-description';
import {SectionUsageNotes} from './section-usage-notes';
export const signatureCard = (
name: string,
member: PropertyEntryRenderable,
opts: {id: string},
) => {
return (
<div id={opts.id} class={REFERENCE_MEMBER_CARD}>
<header class={REFERENCE_MEMBER_CARD_HEADER}>
<h3>{name}</h3>
<div>
<CodeSymbol code={member.type} />
</div>
</header>
<div class={REFERENCE_MEMBER_CARD_BODY}>
<div className={`${REFERENCE_MEMBER_CARD_ITEM}`}>
<p>
<RawHtml value={member.htmlDescription} />
</p>
</div>
</div>
</div>
);
};
import {SectionApi} from './section-api';
import {API_REFERENCE_CONTAINER} from '../styling/css-classes.mjs';
import {DecoratorEntryRenderable} from '../entities/renderables.mjs';
/** Component to render a decorator API reference document. */
export function DecoratorReference(entry: DecoratorEntryRenderable) {
@@ -53,13 +20,6 @@ export function DecoratorReference(entry: DecoratorEntryRenderable) {
<div className={API_REFERENCE_CONTAINER}>
<HeaderApi entry={entry} />
<SectionApi entry={entry} />
<div className={REFERENCE_MEMBERS}>
{entry.members.map((member, index) =>
signatureCard(member.name, member, {
id: `${member.name}_${index}`,
}),
)}
</div>
<SectionDescription entry={entry} />
<SectionUsageNotes entry={entry} />
</div>
@@ -22,22 +22,23 @@ import {printInitializerFunctionSignatureLine} from '../transforms/code-transfor
import {getFunctionMetadataRenderable} from '../transforms/function-transforms.mjs';
import {ClassMethodInfo} from './class-method-info';
import {CodeSymbol} from './code-symbols';
import {DeprecationWarning} from './deprecation-warning';
import {HeaderApi} from './header-api';
import {HighlightTypeScript} from './highlight-ts';
import {SectionApi} from './section-api';
import {SectionDescription} from './section-description';
import {SectionUsageNotes} from './section-usage-notes';
import {DeprecationWarning} from './deprecation-warning';
export const signatureCard = (
name: string,
signature: FunctionSignatureMetadataRenderable,
opts: {id: string; printSignaturesAsHeader: boolean; hideUsageNotes?: boolean},
opts: {id: string},
printSignaturesAsHeader: boolean,
) => {
return (
<div id={opts.id} class={REFERENCE_MEMBER_CARD}>
<header class={REFERENCE_MEMBER_CARD_HEADER}>
{opts.printSignaturesAsHeader ? (
{printSignaturesAsHeader ? (
<HighlightTypeScript
code={printInitializerFunctionSignatureLine(
name,
@@ -56,7 +57,7 @@ export const signatureCard = (
)}
</header>
<div class={REFERENCE_MEMBER_CARD_BODY}>
<ClassMethodInfo entry={signature} hideUsageNotes={opts.hideUsageNotes} />
<ClassMethodInfo entry={signature} />
</div>
</div>
);
@@ -73,14 +74,16 @@ export function FunctionReference(entry: FunctionEntryRenderable) {
<DeprecationWarning entry={entry} />
<SectionApi entry={entry} />
<div className={REFERENCE_MEMBERS}>
{entry.signatures.length > 1 &&
entry.signatures.map((s, i) =>
signatureCard(s.name, getFunctionMetadataRenderable(s, entry.moduleName, entry.repo), {
{entry.signatures.map((s, i) =>
signatureCard(
s.name,
getFunctionMetadataRenderable(s, entry.moduleName, entry.repo),
{
id: `${s.name}_${i}`,
printSignaturesAsHeader,
hideUsageNotes: true,
}),
)}
},
printSignaturesAsHeader,
),
)}
</div>
<SectionDescription entry={entry} />
@@ -21,7 +21,6 @@ import {DocsPillRow} from './docs-pill-row';
export function HeaderApi(props: {
entry: DocEntryRenderable | PipeEntryRenderable;
showFullDescription?: boolean;
hideDescription?: boolean;
}) {
const entry = props.entry;
@@ -61,14 +60,12 @@ export function HeaderApi(props: {
)}
</div>
{!props.hideDescription && (
<section
className={'docs-reference-description'}
dangerouslySetInnerHTML={{
__html: props.showFullDescription ? entry.htmlDescription : entry.shortHtmlDescription,
}}
></section>
)}
<section
className={'docs-reference-description'}
dangerouslySetInnerHTML={{
__html: props.showFullDescription ? entry.htmlDescription : entry.shortHtmlDescription,
}}
></section>
<DocsPillRow links={entry.additionalLinks} />
</header>
@@ -10,14 +10,10 @@ import {h} from 'preact';
import {RawHtml} from './raw-html';
import {codeToHtml} from '../../../shared/shiki.mjs';
import {getHighlighterInstance} from '../shiki/shiki.mjs';
import {getSymbolsAsApiEntries} from '../symbol-context.mjs';
/** Component to render a header of the CLI page. */
export function HighlightTypeScript(props: {code: string}) {
const result = codeToHtml(getHighlighterInstance(), props.code, {
language: 'typescript',
apiEntries: getSymbolsAsApiEntries(),
});
const result = codeToHtml(getHighlighterInstance(), props.code, {language: 'typescript'});
const withScrollTrack = result.replace(/^(<pre class="shiki)/, '$1 docs-mini-scroll-track');
return <RawHtml value={withScrollTrack} className="docs-code" />;
@@ -40,10 +40,14 @@ export function InitializerApiFunction(entry: InitializerApiFunctionRenderable)
<div class={REFERENCE_MEMBERS}>
{entry.callFunction.signatures.map((s, i) =>
signatureCard(s.name, getFunctionMetadataRenderable(s, entry.moduleName, entry.repo), {
id: `${s.name}_${i}`,
signatureCard(
s.name,
getFunctionMetadataRenderable(s, entry.moduleName, entry.repo),
{
id: `${s.name}_${i}`,
},
printSignaturesAsHeader,
}),
),
)}
{entry.subFunctions.reduce(
@@ -55,8 +59,8 @@ export function InitializerApiFunction(entry: InitializerApiFunctionRenderable)
getFunctionMetadataRenderable(s, entry.moduleName, entry.repo),
{
id: `${entry.name}_${s.name}_${i}`,
printSignaturesAsHeader,
},
printSignaturesAsHeader,
),
),
],
@@ -40,7 +40,7 @@ describe('CLI docs to html', () => {
const cliTocs = fragment.querySelectorAll('.docs-reference-cli-toc')!;
expect(cliTocs.length).toBe(2);
expect(cliTocs[0].textContent).toContain('ng component [name] [options]');
expect(cliTocs[1].textContent).toContain('ng c [name] [options]');
expect(cliTocs[0].textContent).toContain('ng component[name][options]');
expect(cliTocs[1].textContent).toContain('ng c[name][options]');
});
});
@@ -8,12 +8,12 @@
import {readFile} from 'fs/promises';
import {JSDOM} from 'jsdom';
import {resolve} from 'path';
import {initHighlighter} from '../../../shared/shiki.mjs';
import {getRenderable} from '../processing.mjs';
import {renderEntry} from '../rendering.mjs';
import {setHighlighterInstance} from '../shiki/shiki.mjs';
import {setSymbols} from '../symbol-context.mjs';
import {resolve} from 'path';
import {initHighlighter} from '../../../shared/shiki.mjs';
import {setHighlighterInstance} from '../shiki/shiki.mjs';
// Note: The tests will probably break if the schema of the api extraction changes.
// All entries in the fake-entries are extracted from Angular's api.
@@ -69,7 +69,7 @@ describe('markdown to html', () => {
it('should render multiple {@link} blocks', () => {
const provideClientHydrationEntry = entries.get('provideClientHydration')!;
expect(provideClientHydrationEntry).toBeDefined();
const cardItem = provideClientHydrationEntry.querySelector('.docs-api')!;
const cardItem = provideClientHydrationEntry.querySelector('.docs-reference-card-item')!;
expect(cardItem.innerHTML).not.toContain('@link');
});
@@ -17,207 +17,204 @@ import {
// @ts-ignore This compiles fine, but Webstorm doesn't like the ESM import in a CJS context.
describe('jsdoc transforms', () => {
describe('addHtmlAdditionalLinks', () => {
it('should transform links', () => {
setCurrentSymbol('Router');
setSymbols(
Object.fromEntries([
['Route', 'test'],
['Router', 'test'],
['Router.someMethod', 'test'],
['Router.someMethodWithParenthesis', 'test'],
['FormGroup', 'test'],
['FormGroup.someMethod', 'test'],
]),
);
it('should transform links', () => {
setCurrentSymbol('Router');
setSymbols(
Object.fromEntries([
['Route', 'test'],
['Router', 'test'],
['Router.someMethod', 'test'],
['Router.someMethodWithParenthesis', 'test'],
['FormGroup', 'test'],
['FormGroup.someMethod', 'test'],
]),
);
const entry = addHtmlAdditionalLinks({
jsdocTags: [
{
name: 'see',
comment: '[Angular](https://angular.io)',
},
{
name: 'see',
comment: '[Angular](https://angular.io "Angular")',
},
{
name: 'see',
comment: '{@link Route}',
},
{
name: 'see',
comment: '{@link Route Something else}',
},
{
name: 'see',
comment: '{@link #someMethod}',
},
{
name: 'see',
comment: '{@link #someMethodWithParenthesis()}',
},
{
name: 'see',
comment: '{@link someMethod()}',
},
{
name: 'see',
comment: '{@link FormGroup.someMethod()}',
},
{
name: 'see',
comment: '{@link https://angular.dev/api/core/ApplicationRef}',
},
{
name: 'see',
comment: '{@link https://angular.dev}',
},
{
name: 'see',
comment: '{@link /cli/build ng build}',
},
{
name: 'see',
comment: '{@link /ecosystem/rxjs-interop/output-interop Output Interop}',
},
],
moduleName: 'test',
});
expect(entry.additionalLinks[0]).toEqual({
label: 'Angular',
url: 'https://angular.io',
title: undefined,
});
expect(entry.additionalLinks[1]).toEqual({
label: 'Angular',
url: 'https://angular.io',
title: 'Angular',
});
expect(entry.additionalLinks[2]).toEqual({
label: 'Route',
url: '/api/test/Route',
});
expect(entry.additionalLinks[3]).toEqual({
label: 'Something else',
url: '/api/test/Route',
});
expect(entry.additionalLinks[4]).toEqual({
label: 'someMethod',
url: '/api/test/Router#someMethod',
});
expect(entry.additionalLinks[5]).toEqual({
label: 'someMethodWithParenthesis()',
url: '/api/test/Router#someMethodWithParenthesis',
});
expect(entry.additionalLinks[6]).toEqual({
label: 'someMethod()',
url: '/api/test/Router#someMethod',
});
expect(entry.additionalLinks[7]).toEqual({
label: 'FormGroup.someMethod()',
url: '/api/test/FormGroup#someMethod',
});
expect(entry.additionalLinks[8]).toEqual({
label: 'ApplicationRef',
url: 'https://angular.dev/api/core/ApplicationRef',
});
expect(entry.additionalLinks[9]).toEqual({
label: 'angular.dev',
url: 'https://angular.dev',
});
expect(entry.additionalLinks[10]).toEqual({
label: 'ng build',
url: '/cli/build',
});
expect(entry.additionalLinks[11]).toEqual({
label: 'Output Interop',
url: '/ecosystem/rxjs-interop/output-interop',
});
const entry = addHtmlAdditionalLinks({
jsdocTags: [
{
name: 'see',
comment: '[Angular](https://angular.io)',
},
{
name: 'see',
comment: '[Angular](https://angular.io "Angular")',
},
{
name: 'see',
comment: '{@link Route}',
},
{
name: 'see',
comment: '{@link Route Something else}',
},
{
name: 'see',
comment: '{@link #someMethod}',
},
{
name: 'see',
comment: '{@link #someMethodWithParenthesis()}',
},
{
name: 'see',
comment: '{@link someMethod()}',
},
{
name: 'see',
comment: '{@link FormGroup.someMethod()}',
},
{
name: 'see',
comment: '{@link https://angular.dev/api/core/ApplicationRef}',
},
{
name: 'see',
comment: '{@link https://angular.dev}',
},
{
name: 'see',
comment: '{@link /cli/build ng build}',
},
{
name: 'see',
comment: '{@link /ecosystem/rxjs-interop/output-interop Output Interop}',
},
],
moduleName: 'test',
});
it('should convert backticks to code tags in markdown links', () => {
const entry = addHtmlAdditionalLinks({
jsdocTags: [
{
name: 'see',
comment:
'[Host view using `ViewContainerRef.createComponent`](guide/components/programmatic-rendering#host-view-using-viewcontainerrefcreatecomponent)',
},
{
name: 'see',
comment:
'[Popup attached to `document.body` with `createComponent` + `hostElement`](guide/components/programmatic-rendering#popup-attached-to-documentbody-with-createcomponent--hostelement)',
},
{
name: 'see',
comment: '[Method with `backticks` in title](https://example.com "Title with `code`")',
},
],
moduleName: 'test',
});
expect(entry.additionalLinks[0]).toEqual({
label: 'Host view using <code>ViewContainerRef.createComponent</code>',
url: 'guide/components/programmatic-rendering#host-view-using-viewcontainerrefcreatecomponent',
title: undefined,
});
expect(entry.additionalLinks[1]).toEqual({
label:
'Popup attached to <code>document.body</code> with <code>createComponent</code> + <code>hostElement</code>',
url: 'guide/components/programmatic-rendering#popup-attached-to-documentbody-with-createcomponent--hostelement',
title: undefined,
});
expect(entry.additionalLinks[2]).toEqual({
label: 'Method with <code>backticks</code> in title',
url: 'https://example.com',
title: 'Title with `code`',
});
expect(entry.additionalLinks[0]).toEqual({
label: 'Angular',
url: 'https://angular.io',
title: undefined,
});
it('should throw on invalid relatie @link', () => {
const entryFn = () =>
addHtmlAdditionalLinks({
jsdocTags: [
{
name: 'see',
comment: '{@link cli/build ng build}',
},
],
moduleName: 'test',
});
expect(entry.additionalLinks[1]).toEqual({
label: 'Angular',
url: 'https://angular.io',
title: 'Angular',
});
expect(entryFn).toThrowError(/Forbidden relative link: cli\/build ng build/);
expect(entry.additionalLinks[2]).toEqual({
label: 'Route',
url: '/api/test/Route',
});
expect(entry.additionalLinks[3]).toEqual({
label: 'Something else',
url: '/api/test/Route',
});
expect(entry.additionalLinks[4]).toEqual({
label: 'someMethod',
url: '/api/test/Router#someMethod',
});
expect(entry.additionalLinks[5]).toEqual({
label: 'someMethodWithParenthesis()',
url: '/api/test/Router#someMethodWithParenthesis',
});
expect(entry.additionalLinks[6]).toEqual({
label: 'someMethod()',
url: '/api/test/Router#someMethod',
});
expect(entry.additionalLinks[7]).toEqual({
label: 'FormGroup.someMethod()',
url: '/api/test/FormGroup#someMethod',
});
expect(entry.additionalLinks[8]).toEqual({
label: 'ApplicationRef',
url: 'https://angular.dev/api/core/ApplicationRef',
});
expect(entry.additionalLinks[9]).toEqual({
label: 'angular.dev',
url: 'https://angular.dev',
});
expect(entry.additionalLinks[10]).toEqual({
label: 'ng build',
url: '/cli/build',
});
expect(entry.additionalLinks[11]).toEqual({
label: 'Output Interop',
url: '/ecosystem/rxjs-interop/output-interop',
});
});
describe('addHtmlDescription', () => {
it('should parse markdown in descriptions', async () => {
setHighlighterInstance(await initHighlighter());
it('should convert backticks to code tags in markdown links', () => {
const entry = addHtmlAdditionalLinks({
jsdocTags: [
{
name: 'see',
comment:
'[Host view using `ViewContainerRef.createComponent`](guide/components/programmatic-rendering#host-view-using-viewcontainerrefcreatecomponent)',
},
{
name: 'see',
comment:
'[Popup attached to `document.body` with `createComponent` + `hostElement`](guide/components/programmatic-rendering#popup-attached-to-documentbody-with-createcomponent--hostelement)',
},
{
name: 'see',
comment: '[Method with `backticks` in title](https://example.com "Title with `code`")',
},
],
moduleName: 'test',
});
setSymbols(
Object.fromEntries([
['Route', 'test'],
['Router', 'angular/router'],
['Router.someMethod', 'test'],
['Router.someMethodWithParenthesis', 'test'],
['FormGroup', 'test'],
['FormGroup.someMethod', 'test'],
]),
);
expect(entry.additionalLinks[0]).toEqual({
label: 'Host view using <code>ViewContainerRef.createComponent</code>',
url: 'guide/components/programmatic-rendering#host-view-using-viewcontainerrefcreatecomponent',
title: undefined,
});
const entry = addHtmlDescription({
description: `
expect(entry.additionalLinks[1]).toEqual({
label:
'Popup attached to <code>document.body</code> with <code>createComponent</code> + <code>hostElement</code>',
url: 'guide/components/programmatic-rendering#popup-attached-to-documentbody-with-createcomponent--hostelement',
title: undefined,
});
expect(entry.additionalLinks[2]).toEqual({
label: 'Method with <code>backticks</code> in title',
url: 'https://example.com',
title: 'Title with `code`',
});
});
it('should throw on invalid relatie @link', () => {
const entryFn = () =>
addHtmlAdditionalLinks({
jsdocTags: [
{
name: 'see',
comment: '{@link cli/build ng build}',
},
],
moduleName: 'test',
});
expect(entryFn).toThrowError(/Forbidden relative link: cli\/build ng build/);
});
it('should parse markdown in descriptions', async () => {
setHighlighterInstance(await initHighlighter());
setSymbols(
Object.fromEntries([
['Route', 'test'],
['Router', 'angular/router'],
['Router.someMethod', 'test'],
['Router.someMethodWithParenthesis', 'test'],
['FormGroup', 'test'],
['FormGroup.someMethod', 'test'],
]),
);
const entry = addHtmlDescription({
description: `
\`\`\`angular-ts
import { Router } from '@angular/router';
@@ -226,36 +223,16 @@ function setupRouter() {
}
\`\`\`
`,
moduleName: 'test',
});
// Should have some shiki variables (meaning the description was highlighted).
expect(entry.htmlDescription).toContain('--shiki');
// Having docs-code means that the description was parsed and formatted correctly (by the shared marked renderer)
expect(entry.htmlDescription).toContain('class="docs-code"');
expect(entry.htmlDescription).toContain('/api/angular/router/Router');
moduleName: 'test',
});
it('should transform entry with different description & description tag', () => {
const entry = addHtmlDescription({
'description':
"Enables interop with the browser's `Navigation` API for router navigations.",
'jsdocTags': [
{
'name': 'description',
'comment': 'This feature is _highly_ experimental ...',
},
],
'moduleName': 'platform-browser',
});
// Should have some shiki variables (meaning the description was highlighted).
expect(entry.htmlDescription).toContain('--shiki');
expect(entry.htmlDescription).toBe(`<p>This feature is <em>highly</em> experimental ...</p>`);
expect(entry.shortHtmlDescription).toBe(
`<p>Enables interop with the browser's <code>Navigation</code> API for router navigations.</p>`,
);
});
// Having docs-code means that the description was parsed and formatted correctly (by the shared marked renderer)
expect(entry.htmlDescription).toContain('class="docs-code"');
expect(entry.htmlDescription).toContain('/api/angular/router/Router');
});
it('should only mark as deprecated if all overloads are deprecated', () => {
@@ -1,36 +0,0 @@
/*!
* @license
* Copyright Google LLC All Rights Reserved.
*
* Use of this source code is governed by an MIT-style license that can be
* found in the LICENSE file at https://angular.dev/license
*/
import {DocEntry} from '../entities.mjs';
import {BlockEntryRenderable} from '../entities/renderables.mjs';
import {
addHtmlAdditionalLinks,
addHtmlDescription,
addHtmlJsDocTagComments,
addHtmlUsageNotes,
setEntryFlags,
} from './jsdoc-transforms.mjs';
import {addModuleName} from './module-name.mjs';
import {addRepo} from './repo.mjs';
/** Given an unprocessed block entry, get the fully renderable block entry. */
export function getBlockRenderable(
blockEntry: DocEntry,
moduleName: string,
repo: string,
): BlockEntryRenderable {
return setEntryFlags(
addHtmlAdditionalLinks(
addHtmlDescription(
addHtmlUsageNotes(
addHtmlJsDocTagComments(addRepo(addModuleName(blockEntry, moduleName), repo)),
),
),
),
);
}
@@ -27,7 +27,7 @@ export function getCliRenderable(command: CliCommand): CliCommandRenderable {
}),
cards: getCliCardsRenderable(command),
argumentsLabel: getArgumentsLabel(command),
optionsLabel: getOptionsLabel(command),
hasOptions: getOptions(command).length > 0,
};
}
@@ -66,12 +66,7 @@ function getArgumentsLabel(command: CliCommand): string {
if (args.length === 0) {
return '';
}
const label = command.command.replace(/^ng\s+/, '').replace(`${command.name} `, '');
return ` ${label}`;
}
function getOptionsLabel(command: CliCommand): string {
return getOptions(command).length > 0 ? ' [options]' : '';
return command.command.replace(`${command.name} `, '');
}
function getArgs(command: CliCommand): CliOption[] {
@@ -39,7 +39,7 @@ import {
insertParenthesesForDecoratorInShikiHtml,
replaceKeywordFromShikiHtml,
} from '../shiki/shiki.mjs';
import {getSymbolsAsApiEntries, getSymbolUrl} from '../symbol-context.mjs';
import {getSymbolUrl} from '../symbol-context.mjs';
import {codeToHtml} from '../../../shared/shiki.mjs';
import {formatJs} from './format-code.mjs';
@@ -92,10 +92,7 @@ export async function addRenderableCodeToc<T extends DocEntry & HasModuleName>(
let codeWithSyntaxHighlighting = codeToHtml(
getHighlighterInstance(),
formattedCode ?? metadata?.contents,
{
language: 'typescript',
apiEntries: getSymbolsAsApiEntries(),
},
{language: 'typescript'},
);
if (isDecoratorEntry(entry)) {
@@ -114,6 +111,11 @@ export async function addRenderableCodeToc<T extends DocEntry & HasModuleName>(
// }
}
// Note: Don't expect enum value in signatures to be linked correctly
// as shiki already splits them into separate span blocks.
// Only the enum itself will recieve a link
codeWithSyntaxHighlighting = addApiLinksToHtml(codeWithSyntaxHighlighting);
// shiki returns the lines wrapped by 2 node : 1 pre node, 1 code node.
// As leveraging jsdom isn't trivial here, we rely on a regex to extract the line nodes
const pattern = /(.*?)<code.*?>(.*?)<\/code>(.*)/s;
@@ -16,7 +16,6 @@ import {
addHtmlUsageNotes,
setEntryFlags,
} from './jsdoc-transforms.mjs';
import {addRenderablePropertyMembers} from './member-transforms.mjs';
import {addModuleName} from './module-name.mjs';
import {addRepo} from './repo.mjs';
@@ -26,24 +25,14 @@ export async function getDecoratorRenderable(
moduleName: string,
repo: string,
): Promise<DecoratorEntryRenderable> {
const decoratorEntryWithMembers = {
...decoratorEntry,
members: decoratorEntry.members ?? [],
};
return setEntryFlags(
await addRenderableCodeToc(
await addRenderablePropertyMembers(
addHtmlAdditionalLinks(
addHtmlUsageNotes(
addHtmlJsDocTagComments(
addHtmlDescription(
addRepo(addModuleName(decoratorEntryWithMembers, moduleName), repo),
),
),
addHtmlAdditionalLinks(
addHtmlUsageNotes(
addHtmlJsDocTagComments(
addHtmlDescription(addRepo(addModuleName(decoratorEntry, moduleName), repo)),
),
),
decoratorEntry.name,
),
),
) as DecoratorEntryRenderable;
@@ -22,7 +22,6 @@ import {
HasModuleName,
HasRenderableJsDocTags,
HasStableFlag,
MaybeJsDocTags,
} from '../entities/traits.mjs';
import {parseMarkdown} from '../../../shared/marked/parse.mjs';
@@ -44,7 +43,7 @@ const jsDoclinkRegex = /\{\s*@link\s+([^}]+)\s*\}/;
const jsDoclinkRegexGlobal = new RegExp(jsDoclinkRegex.source, 'g');
/** Given an entity with a description, gets the entity augmented with an `htmlDescription`. */
export function addHtmlDescription<T extends HasDescription & HasModuleName & MaybeJsDocTags>(
export function addHtmlDescription<T extends HasDescription & HasModuleName>(
entry: T,
): T & HasHtmlDescription {
const firstParagraphRule = /(.*?)(?:\n\n|$)/s;
@@ -57,17 +56,10 @@ export function addHtmlDescription<T extends HasDescription & HasModuleName & Ma
?.comment ?? '';
}
let description = entry.description || jsDocDescription;
let shortDescription = description.match(firstParagraphRule)?.[0] ?? '';
// For the cases where the @description tag is after a short description
if (jsDocDescription && description !== jsDocDescription) {
shortDescription = entry.description;
description = jsDocDescription;
}
const description = !!entry.description ? entry.description : jsDocDescription;
const shortTextMatch = description.match(firstParagraphRule);
const htmlDescription = getHtmlForJsDocText(description).trim();
const shortHtmlDescription = getHtmlForJsDocText(shortDescription).trim();
const shortHtmlDescription = getHtmlForJsDocText(shortTextMatch ? shortTextMatch[0] : '').trim();
return {...entry, htmlDescription, shortHtmlDescription};
}
@@ -117,7 +109,6 @@ function getHtmlForJsDocText(text: string): string {
const parsed = parseMarkdown(mdToParse, {
apiEntries: getSymbolsAsApiEntries(),
highlighter: getHighlighterInstance(),
definedRoutes: [],
});
return addApiLinksToHtml(parsed);
}
@@ -145,9 +136,6 @@ function getHtmlAdditionalLinks<T extends HasJsDocTags>(entry: T): LinkEntryRend
.filter((tag) => tag.name === JS_DOC_SEE_TAG)
.map((tag) => tag.comment)
.map((comment) => {
// TODO: Throw when the comment is an absolute link.
// With TS 5.9 this is not possible as the ts api that extracts comments from tags strips the "http" part of links.
const markdownLinkMatch = comment.match(markdownLinkRule);
if (markdownLinkMatch) {
@@ -213,6 +201,10 @@ function convertLinks(text: string) {
}
function parseAtLink(link: string): {label: string; url: string} | undefined {
// Because of microsoft/TypeScript/issues/59679
// getTextOfJSDocComment introduces an extra space between the symbol and a trailing ()
link = link.replace(/ \(\)$/, '');
let [rawSymbol, description] = link.split(/\s(.+)/);
if (rawSymbol.startsWith('#')) {
rawSymbol = rawSymbol.substring(1);
@@ -10,14 +10,7 @@ import {MemberEntry, MemberTags, MemberType, type DocEntry} from '../entities.mj
import {isHiddenEntry} from '../entities/categorization.mjs';
import type {MemberEntryRenderable} from '../entities/renderables.mjs';
import {
HasMembers,
HasModuleName,
HasPropertyMembers,
HasRenderableMembers,
HasRenderablePropertyMembers,
HasRepo,
} from '../entities/traits.mjs';
import {HasMembers, HasModuleName, HasRenderableMembers, HasRepo} from '../entities/traits.mjs';
import {addRenderableCodeToc} from './code-transforms.mjs';
import {
@@ -92,7 +85,8 @@ export async function addRenderableMembers<T extends HasMembers & HasModuleName
): Promise<T & HasRenderableMembers> {
const members = (
await Promise.all(
entry.members
// TODO: remove `?? []` when components repo is updated to include members array on type aliases.
(entry.members ?? [])
.filter((member) => !isHiddenEntry(member))
.map((member) => {
if (member.memberType === MemberType.Interface) {
@@ -118,11 +112,3 @@ export async function addRenderableMembers<T extends HasMembers & HasModuleName
members,
};
}
export async function addRenderablePropertyMembers<
T extends HasPropertyMembers & HasModuleName & HasRepo,
>(entry: T, parentName: string): Promise<T & HasRenderablePropertyMembers> {
return {
...((await addRenderableMembers(entry, parentName)) as T & HasRenderablePropertyMembers),
};
}
@@ -14,7 +14,6 @@ esbuild(
external = [
"jsdom",
"playwright-core",
"typescript",
],
format = "esm",
output = "guides.mjs",
@@ -39,7 +38,6 @@ esbuild(
entry_point = ":index.mts",
external = [
"jsdom",
"typescript",
],
output = "guides-no-mermaid.mjs",
platform = "node",
+12 -24
View File
@@ -8,8 +8,8 @@
import {readFile, writeFile} from 'fs/promises';
import path from 'path';
import {parseMarkdownAsync} from '../shared/marked/parse.mjs';
import {initHighlighter} from '../shared/shiki.mjs';
import {parseMarkdownAsync} from '../shared/marked/parse.mjs';
import {hasUnknownAnchors} from './helpers.mjs';
type ApiManifest = ApiManifestPackage[];
@@ -21,45 +21,33 @@ interface ApiManifestPackage {
async function main() {
const [paramFilePath] = process.argv.slice(2);
const rawParamLines = (await readFile(paramFilePath, {encoding: 'utf8'})).split('\n');
const [srcs, outputFilenameExecRootRelativePath, apiManifestPath, definedRoutesAsStr] =
rawParamLines;
const [srcs, outputFilenameExecRootRelativePath, apiManifestPath] = rawParamLines;
// The highlighter needs to be setup asynchronously
// so we're doing it at the start of the pipeline
const highlighter = await initHighlighter();
let apiManifest: ApiManifest = [];
if (!apiManifestPath) {
throw new Error(
'No API manifest path provided to the markdown parser. Check the failing generate_guides target.',
);
}
const apiManifestStr = await readFile(apiManifestPath, {encoding: 'utf8'});
apiManifest = JSON.parse(apiManifestStr);
let definedRoutes: string[] = [];
if (!definedRoutesAsStr) {
throw new Error(
'No defined routes path provided to the markdown parser. Check the failing generate_guides target.',
);
}
const definedGuideRoutes = await readFile(definedRoutesAsStr, {encoding: 'utf8'});
definedRoutes = JSON.parse(definedGuideRoutes) as string[];
await Promise.all(
srcs.split(',').map(async (filePath) => {
if (!filePath.endsWith('.md')) {
throw new Error(`Input file "${filePath}" does not end in a ".md" file extension.`);
}
let apiManifest: ApiManifest = [];
if (apiManifestPath) {
try {
const apiManifestStr = await readFile(apiManifestPath, {encoding: 'utf8'});
apiManifest = JSON.parse(apiManifestStr);
} catch (error) {
console.warn('Failed to load API entries:', error);
}
}
const markdownContent = await readFile(filePath, {encoding: 'utf8'});
const htmlOutputContent = await parseMarkdownAsync(markdownContent, {
markdownFilePath: filePath,
apiEntries: mapManifestToEntries(apiManifest),
highlighter,
definedRoutes,
});
// The expected file name structure is the [name of the file].md.html.
@@ -10,15 +10,6 @@ ts_project(
],
)
ts_project(
name = "heading",
srcs = ["heading.mts"],
visibility = [
"//adev/scripts/routes:__subpackages__",
"//adev/shared-docs/pipeline:__subpackages__",
],
)
ts_project(
name = "shiki",
srcs = ["shiki.mts"],
@@ -26,9 +17,7 @@ ts_project(
"//adev/shared-docs/pipeline:__subpackages__",
],
deps = [
":linking",
"//adev:node_modules/shiki",
"//adev:node_modules/typescript",
],
)
@@ -45,17 +34,3 @@ zoneless_jasmine_test(
name = "linking_test",
data = [":linking_test_lib"],
)
ts_project(
name = "heading_test_lib",
testonly = True,
srcs = ["test/heading.spec.mts"],
deps = [
":heading",
],
)
zoneless_jasmine_test(
name = "heading_test",
data = [":heading_test_lib"],
)

Some files were not shown because too many files have changed in this diff Show More