Compare commits

..

718 Commits

Author SHA1 Message Date
Kristiyan Kostadinov 4755bbd949 release: cut the v20.3.15 release 2025-12-01 12:46:42 +01:00
Alan Agius d1ca8ae043 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.

The fix introduces a runtime validation step:
- A new [ɵɵValidateAttribute](cci:1://file:///usr/local/google/home/alanagius/git/angular/packages/core/src/sanitization/sanitization.ts:276:0-288:1) instruction is used when `attributeName` is bound on SVG animation elements.
- If executed, a `RuntimeError` is thrown, preventing the binding.
- The compiler now identifies `attributeName` on SVG animation elements as security-sensitive and injects this validation.

Additionally, the DOM security schema has been updated to include a comprehensive list of MathML and SVG elements that accept `href` or `xlink:href` attributes, ensuring they are correctly treated as `SecurityContext.URL` and sanitized. This prevents malicious URLs from being bound to these attributes.

http://b/463880509
2025-12-01 10:29:30 +01:00
kirjs 136e9232c4 release: cut the v20.3.14 release 2025-11-25 15:14:26 -05:00
Alan Agius 0276479e7d 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.
2025-11-25 13:54:57 -05:00
Jessica Janiuk edcbe2259b release: cut the v20.3.13 release 2025-11-19 09:41:29 -08:00
kirjs 24c999a56e 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:23 +00:00
Aristeidis Bampakos 96a8d58979 fix(docs-infra): add install in pnpm
Add missing install option in pnpm command.

(cherry picked from commit 0e1ddce1cb)
2025-11-19 16:10:12 +00:00
Matthieu Riegler 330e046f40 docs: fix docs heading alignment
(cherry picked from commit c7424c8f07)
2025-11-19 01:00:27 +00:00
Shuaib Hasan Akib 5aea52ac29 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:27 +00:00
Shuaib Hasan Akib 3686987622 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:44 +00:00
SkyZeroZx 72b19d869d docs: replace @HostListener with host event bindings in attribute directives
(cherry picked from commit c93d02151a)
2025-11-17 23:09:15 +00:00
ljasek efe5d2ebe3 docs: fix JetBrains AI Assistant MCP JSON configuration
(cherry picked from commit 6d35ab8c28)
2025-11-17 23:08:18 +00:00
aparziale 81b6e45b60 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:12 +00:00
Paul Leflon 967e111303 docs: fix markdown table in custom elements guide
(cherry picked from commit f13159f811)
2025-11-17 22:33:35 +00:00
Joey Perrott 5e15553774 ci: remove cache usage from ci.yml
Remove the @actions/cache usages from ci.yml
2025-11-17 10:59:37 -08:00
Jessica Janiuk 85777efe72 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:36:58 +00:00
Jessica Janiuk 820bb3991c Revert "refactor(core): let the profiler handle asymmetric events leniently"
This reverts commit da9911f2b4.

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

(cherry picked from commit adc2a57be0)
2025-11-17 18:10:40 +00:00
JoostK a966ff18d4 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:09 +00:00
JoostK 52cf65892a 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:09 +00:00
Cheng-Hsuan Tsai 4a1a7038c5 docs(docs-infra): set max-height to code example
(cherry picked from commit 138e65356b)
2025-11-17 17:28:17 +00:00
SkyZeroZx daae2636d5 docs: Adds links to relevant guides for APIs in core package
(cherry picked from commit 0432e76171)
2025-11-17 16:47:38 +00:00
SkyZeroZx d10f1107a8 docs: add documentation for HostAttributeToken
(cherry picked from commit d70310896c)
2025-11-17 16:47:02 +00:00
Shuaib Hasan Akib 755b360ed9 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:39 +00:00
Shuaib Hasan Akib 84ceb9ca01 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:25 +00:00
Shuaib Hasan Akib 2e00074c64 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:04 +00:00
Shuaib Hasan Akib 38f7a8fb4c 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:30 +00:00
Shuaib Hasan Akib 3767126376 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:34 +00:00
SkyZeroZx 2c3691dc1a docs: add documentation for DOCUMENT injection token usage in SSR
(cherry picked from commit 846d50ab23)
2025-11-17 16:28:04 +00:00
Angelo Parziale 66de132f8d 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:01 +00:00
Aristeidis Bampakos a8cea2349b docs: use the new format for the X account
(cherry picked from commit 73295b1087)
2025-11-17 16:22:23 +00:00
portneon 68c5556c16 docs(router): update navigation event example to use event.code
(cherry picked from commit 93d548fba4)
2025-11-17 16:08:32 +00:00
Cheng-Hsuan Tsai 5c6583536c docs(docs-infra): make show code button more discoverable when collapsed
(cherry picked from commit 48cff8c128)
2025-11-17 16:07:05 +00:00
hawkgs 9c2dccf01a 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:36 +00:00
Shuaib Hasan Akib f7fcef1439 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:24 +00:00
SkyZeroZx e0a6dadf1b docs: Uses the self-closing tag syntax
(cherry picked from commit 9ec964334e)
2025-11-14 16:32:39 +00:00
KAUSHIK REDDY AWALA 853fd9d4cf 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:11 +00:00
Alan Agius 35e7b9a125 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:04 -08:00
Jessica Janiuk 39f9e239b7 release: cut the v20.3.12 release 2025-11-14 08:13:05 -08:00
Cheng-Hsuan Tsai 01719a59ab docs(docs-infra): hide file tabs when code example is hidden
(cherry picked from commit 6d8c3fc888)
2025-11-13 23:58:13 +00:00
Matthew Beck f689269eca Revert "fix(compiler): support one additional level of nesting in :host()"
This reverts commit 036c5d2a07.
2025-11-13 15:44:25 -08:00
Matthew Beck 7b2e6caaf8 Revert "fix(compiler): support arbitrary nesting in :host-context()"
This reverts commit f9d0818087.
2025-11-13 15:44:25 -08:00
Matthew Beck 6036eef73c Revert "fix(compiler): support commas in :host() argument"
This reverts commit 106b9040df.
2025-11-13 15:44:25 -08:00
Matthew Beck a44658ba3e Revert "fix(compiler): support complex selectors in :nth-child()"
This reverts commit 9419ea348a.
2025-11-13 15:44:25 -08:00
Joey Perrott fdd267a775 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:00:57 -08:00
Alessio Pelliccione 70da36f251 docs(docs-infra): improve theme picker accessibility and add animations
(cherry picked from commit 25320ae1eb)
2025-11-13 22:05:11 +00:00
SkyZeroZx 06bc1467b1 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:23 +00:00
Shuaib Hasan Akib 3a8fb096d6 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:14 +00:00
Matthieu Riegler a02b957b60 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:21 +00:00
Shuaib Hasan Akib ba28305b04 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:24 +00:00
hawkgs a586bd26e7 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:57 +00:00
SkyZeroZx 3c065f76de docs: Fixed mermaid diagram node label contrast in dark mode
(cherry picked from commit b6a91d4c39)
2025-11-12 23:01:39 +00:00
SkyZeroZx 1c4fb90857 docs: update tutorials with self-closing tags, standalone router directives, and fix syntax highlighting
(cherry picked from commit 4544135b1e)
2025-11-12 21:13:26 +00:00
SkyZeroZx 2e7623ca13 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:07 +00:00
SkyZeroZx 3737724504 docs: correct code block language in error handling and signals interop
(cherry picked from commit 05ef2a5ca9)
2025-11-12 19:35:13 +00:00
Andrew Kushnir 3bafe23c34 release: cut the v20.3.11 release 2025-11-12 08:24:17 -08:00
Matthew Beck 9419ea348a 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:36 -08:00
Andrew Scott f00fb46347 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:48 -08:00
SkyZeroZx a8c577d3af docs: add reference to Built-in Pipes in multiple pipe files
(cherry picked from commit d999667b57)
2025-11-11 08:47:11 -08:00
RobinReinecke 0baa28b886 docs: correct mermaid code block formatting
(cherry picked from commit 07703875b5)
2025-11-11 08:33:31 -08:00
SkyZeroZx c59fa8b85a docs: improve discoverability in service worker documentation
(cherry picked from commit dde18c2303)
2025-11-11 08:32:18 -08:00
Devin Chasanoff e0407c0fe3 docs: add links to SDUI example and livestream
(cherry picked from commit 5af33724a4)
2025-11-10 14:16:22 -08:00
Andrew Kushnir 8922cae0f9 Revert "refactor(http): migrate XSRF classes to use inject() function"
This reverts commit 2ad6b729a1.

Revert reason: the change relies on the code that is not available in the `20.3.x` branch (the `HttpXsrfCookieExtractor` class is not marked as `providedIn: "root"`).
2025-11-10 13:56:23 -08:00
arturovt 5047849a4a 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:23 -08:00
arturovt 4c66fe4796 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:08 -08:00
Alan Agius 742122d5a7 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:35 -08:00
SkyZeroZx 2ad6b729a1 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:13 -08:00
Shuaib Hasan Akib b20bf5dc70 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:33 -08:00
Shuaib Hasan Akib 77ca0d7534 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:37 -08:00
Shuaib Hasan Akib c5a41aae34 docs(docs-infra): removed unused import and use self-closing syntax for component
(cherry picked from commit 8c6619a531)
2025-11-10 08:00:10 -08:00
SkyZeroZx 7b1a47866a docs: improve discoverability of forms
(cherry picked from commit e3fc57e8fc)
2025-11-10 07:57:47 -08:00
jnizet fedb0831c5 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:43 -08:00
SkyZeroZx 63f1d94c2f docs: correct import path and self-closing tag in ng-content example
(cherry picked from commit 6a2f4a88de)
2025-11-10 07:52:50 -08:00
Matthew Beck 2531863909 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:20 -08:00
Matthew Beck 106b9040df 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.
2025-11-10 07:49:19 -08:00
Matthew Beck f9d0818087 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
2025-11-10 07:49:19 -08:00
Andrew Kushnir b47054c52e Revert "fix(compiler): support commas in :host() argument"
This reverts commit 1e09bdc114.

Revert reason: the change relies on helper functions that do not exist in `20.3.x` branch (only exist in `main`).
2025-11-07 16:03:07 -08:00
Danny Koppenhagen f04cf2299b docs(core): add a11y considerations related to @defer()
closes #53466

(cherry picked from commit d2b854b37e)
2025-11-07 15:27:13 -08:00
Matthew Beck 1e09bdc114 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:36 -08:00
Shuaib Hasan Akib 143883afe3 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:40 -08:00
SkyZeroZx b8972dad85 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:45 +00:00
khanhkhanhlele 7f8336d9e0 docs: Fix typos in some files
(cherry picked from commit a625f6bb20)
2025-11-07 15:44:07 +00:00
tsc036 41466a7bbf 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:37 +00:00
SkyZeroZx 1dcecdf823 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:49 +00:00
Matthew Berry 036c5d2a07 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:46 +00:00
Alan Agius ee578d3e86 build: format md files
Format all md files
2025-11-06 10:10:22 -08:00
Jessica Janiuk dcdd1bcdbb 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
2025-11-06 09:46:52 -08:00
tsc036 d6ef181f6c 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:57 +00:00
SkyZeroZx feab482684 docs: correct formatting in dependency injection guides
(cherry picked from commit 61066071cf)
2025-11-06 16:34:29 +00:00
Erik Wegner ab94cd2b95 docs: Add the missing function call to use the signal's actual value
(cherry picked from commit e18aac88d4)
2025-11-05 11:47:17 -08:00
Andrew Scott 098ed8cf16 release: cut the v20.3.10 release 2025-11-05 18:36:23 +00:00
Matthieu Riegler 22d190c0b9 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:50 -08:00
SkyZeroZx 744cd5c51c 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:32 -08:00
Lukas Matta a45e6b2b66 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:06 -08:00
SkyZeroZx c374e80655 docs(docs-infra): add missing meta tags for author, keywords, and Twitter
(cherry picked from commit b5e37ffb77)
2025-11-04 14:58:31 -08:00
Joey Perrott 43f7f41d67 fix(docs-infra): properly join url parts
Properly join the url parts in the sitemap as path.join removed one of the slashes in the base url
2025-11-04 22:49:36 +00:00
Joey Perrott ec9b0742a8 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-04 19:18:36 +00:00
Matthieu Riegler 0a0fe44e61 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: Joey Perrott <josephperrott@gmail.com>
2025-11-04 18:41:01 +00:00
Angular Robot dd7cb3d3da docs: update Angular CLI help
Updated Angular CLI help contents.
2025-11-04 18:06:43 +00:00
Gerome Grignon 1b6d0cff40 docs(router): uniformize lazy loading syntax
(cherry picked from commit 8f49af90d0)
2025-11-04 09:39:19 -08:00
SkyZeroZx 7438b9cc26 refactor(core): Removes unused flag for onDestroy
Eliminates an unnecessary configuration flag

(cherry picked from commit 2ad1b5979f)
2025-11-03 20:21:04 -08:00
SkyZeroZx 4f7b97cc21 docs: simplify tutorial signals with self-closing component tags
(cherry picked from commit b61847f877)
2025-11-03 16:34:44 -08:00
SkyZeroZx d0b1dfaf0d docs: Update highlight inputs & code block formatting in component guides
(cherry picked from commit 82a579c7e6)
2025-11-03 16:32:46 -08:00
Shuaib Hasan Akib 3d6a206e9b 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:02 -08:00
Jan Martin 192eb35212 ci: update handle for jkrems/hybrist
The username was changed earlier today and the old username is no
longer in use.
2025-11-04 00:22:15 +00:00
marktechson 65c78055cb 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:28 -08:00
SkyZeroZx a57c03da85 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:06 -08:00
SkyZeroZx 88952b5060 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:19 -08:00
Kristiyan Kostadinov 840db59dc1 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:51 -08:00
Matthieu Riegler 3409fe8e40 docs(docs-infra): ensure all redirections are absolute
fixes #64824

(cherry picked from commit 434ddbcfc9)
2025-11-03 13:01:53 -08:00
Matthieu Riegler 1572bafa45 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:06 -08:00
Matthieu Riegler debc41f038 ci: fix typings on exit
`exit` doesn't accept `null` as argument
2025-10-30 19:42:59 +00:00
SkyZeroZx 136883ab48 docs(devtools): Removes comment about enum deprecation
Removes comment about enum deprecation

(cherry picked from commit a0fe177682)
2025-10-30 12:40:18 -07:00
SkyZeroZx 90884be59f 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:17 -07:00
Ben Hong a832b1c44e docs: update dependency injection guides (part 1) (#63652)
PR Close #63652
2025-10-30 19:22:41 +00:00
Matthieu Riegler a3b08ea0a4 docs(docs-infra): allow cors for json files (#64783)
fixes #64710

PR Close #64783
2025-10-30 17:50:06 +00:00
SkyZeroZx d7f8319704 docs: Standardize route parameter input signal & code block tags in routing docs (#64788)
PR Close #64788
2025-10-30 17:47:59 +00:00
Joey Perrott 040585d222 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:26 +00:00
paszesoft 54ad3f6da2 docs: Rename TodoListItem to UserProfile and fix usage of isValidUserId
(cherry picked from commit 6cc6d93e70)
2025-10-29 18:49:46 +01:00
paszesoft 0bf40c446b 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:45 +01:00
SkyZeroZx a5d9b3ff0e 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:34 +01:00
Shuaib Hasan Akib 16191e7f53 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:04 +01:00
Kristiyan Kostadinov b517c9ca0a release: cut the v20.3.9 release 2025-10-29 18:35:27 +01:00
Kristiyan Kostadinov 77bc6eebee release: cut the v20.3.8 release 2025-10-29 18:12:56 +01:00
Kristiyan Kostadinov 9123e3d445 fix(docs-infra): fix broken adev tests (#64761)
Fixes some adev tests that are broken on main.

PR Close #64761
2025-10-29 14:11:54 +01:00
Lukas Matta 2edc82abe0 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:00 +01:00
Matthieu Riegler adae565cbf docs(docs-infra): allow cors for json files
fixes #64710

(cherry picked from commit f2de963bf3)
2025-10-28 16:55:56 +01:00
Shuaib Hasan Akib 766559e08c 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:28 +01:00
tjshiu 92d189770b docs: align adev best practices with llm-eval
(cherry picked from commit 763db3a70b)
2025-10-28 15:08:16 +01:00
Shuaib Hasan Akib f96df920f9 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:52 +01:00
Matthieu Riegler b03182075e docs: callout for provide function order
(cherry picked from commit be731deb7c)
2025-10-28 10:24:59 +01:00
Shuaib Hasan Akib 385bcbc2c0 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:26 +01:00
Matt Lewis ca3fd7847f 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:21 +01:00
Shuaib Hasan Akib 14b5590f80 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:40 +01:00
idembele70 9b3574b9b9 docs: fix accessibility of @empty block message
(cherry picked from commit 202fceed73)
2025-10-27 09:29:14 +01:00
SkyZeroZx 5ce9d881e3 docs: Adds guide links to HTTP API docs for better discoverability
(cherry picked from commit c5e6b8bdc8)
2025-10-27 09:25:59 +01:00
aparziale 1fd8592d9c refactor: inject an instance of typescript-vfs.worker
Modified tsVfsWorker worker initialization logic

(cherry picked from commit e155a1e9d7)
2025-10-27 09:24:59 +01:00
Alan Agius 6daabb08e6 Revert "build: refactor location of best-practices.md"
This reverts commit 07a51872d5.

(cherry picked from commit 620e2c4926)
2025-10-24 19:02:41 +02:00
Matthieu Riegler 07d91d76de docs(docs-infra): Support linking to individual playground templates
(cherry picked from commit 6e7b3c2aa6)
2025-10-24 18:47:13 +02:00
SkyZeroZx 020f17694b 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:47 +02:00
SkyZeroZx 752986bfc2 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:47 +02:00
Andrew Scott 4b318d0cc0 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:08 +02:00
Alan Agius 18c70315d7 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:35 +02:00
jase88 b97a677730 docs: update workspace configuration link in security documentation
(cherry picked from commit cdfd073448)
2025-10-24 15:25:14 +02:00
Matthieu Riegler b3f2ff1e07 docs(docs-infra): enable strict templates
(cherry picked from commit 57af0d7e1b)
2025-10-24 15:23:30 +02:00
SkyZeroZx 50d2670495 docs: Add router config options (#64529)
PR Close #64529
2025-10-23 12:34:57 +02:00
Andrew Scott bfa53cdd3f 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:58 +02:00
Andrew Scott 2a249b742c 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:24 +00:00
Jessica Janiuk fbb0056563 release: cut the v20.3.7 release 2025-10-22 14:06:13 -07:00
Jessica Janiuk 2fad4d4ab6 fix(core): prevent duplicate nodes from being retained with fast animate.leave` calls (#64592)
We were clearing duplicate nodes when `animate.enter` fired fast, but not when solely `animate.leave` is fired and rapid toggles occur. This ensures that the `cancelLeavingNodes` function is called in all cases instead of just enter animations.

fixes: #64581

PR Close #64592
2025-10-22 19:07:35 +00:00
Angular Robot c85be3b2de build: update cross-repo angular dependencies to v20.2.10 (#64591)
See associated pull request for more information.

PR Close #64591
2025-10-22 18:14:52 +00:00
Angular Robot b05d8d9f09 build: update cross-repo angular dependencies (#64588)
See associated pull request for more information.

PR Close #64588
2025-10-22 15:53:41 +00:00
Angular Robot 4bc69159ca build: update cross-repo angular dependencies (#64586)
See associated pull request for more information.

PR Close #64586
2025-10-22 15:20:59 +00:00
Matthieu Riegler 00842026c4 docs(docs-infra): fix example viewer (#64580)
It was a regression introduced by #63915

PR Close #64580
2025-10-22 14:35:04 +00:00
SkyZeroZx 8244f187de docs(docs-infra): Add OnPush change detection for components (#64570)
Improves Angular's OnPush change detection strategy for main and search history components

PR Close #64570
2025-10-22 14:34:27 +00:00
Jessica Janiuk acadefbba9 docs: update animation guide with compatibility details (#64567)
This adds a section about using legacy animations alongside animate.enter and leave.

PR Close #64567
2025-10-22 14:30:45 +00:00
Angular Robot 24cc18686a build: update cross-repo angular dependencies (#64577)
See associated pull request for more information.

PR Close #64577
2025-10-22 14:28:14 +00:00
Angular Robot e0fb49c75f build: update dependency rules_nodejs to v6.6.0 (#64573)
See associated pull request for more information.

PR Close #64573
2025-10-22 14:26:48 +00:00
Jessica Janiuk 4c89a267c3 fix(core): pass element removal property through in all locations (#64565)
The `requireSynchronousElementRemoval` property was not being passed in all the locations it was needed. This was preventing leave animation timing from behaving properly in some cases.

fixes: #64525

PR Close #64565
2025-10-21 18:08:34 +00:00
Angular Robot e3f1c529f5 build: update cross-repo angular dependencies (#64564)
See associated pull request for more information.

PR Close #64564
2025-10-21 17:37:21 +00:00
JoostK bd38cd45a5 fix(animations): account for Element.animate exceptions (#64506)
In certain scenarios `Element.animate` fails, manifesting in an exception (Firefox)
or a null return value (Chromium). The null value is not conform WebIDL but handled
gracefully in this commit regardless.

Closes #64486

PR Close #64506
2025-10-21 16:49:43 +00:00
Angular Robot 50e2c54a14 build: update rules_browsers digest to 6a699bf (#64559)
See associated pull request for more information.

PR Close #64559
2025-10-21 16:43:34 +00:00
Angular Robot 67e25f6010 build: update dependency node to v22.21.0 (#64560)
See associated pull request for more information.

PR Close #64560
2025-10-21 16:42:17 +00:00
SkyZeroZx e568ddb2d2 docs: Standardizes code example formatting in Angular Tools and fixed highlight (#64554)
PR Close #64554
2025-10-21 15:19:28 +00:00
Jessica Janiuk 139b622957 refactor(core): clarify comments on enter animation queuing (#64550)
This just updates the comments and adds some tests to verify some of the queuing behavior for enter animations.

PR Close #64550
2025-10-21 15:17:14 +00:00
SkyZeroZx b0551419cd refactor(core): Removes unused trigger parameter from scheduleDelayedPrefetching (#64517)
Simplifies delayed prefetching calls by eliminating an unnecessary trigger argument

PR Close #64517
2025-10-21 15:16:40 +00:00
SkyZeroZx b11617dbab docs(docs-infra): Improves navigation list readability by balancing text wrapping (#64512)
Balances text wrapping for navigation items to enhance readability

PR Close #64512
2025-10-21 15:14:36 +00:00
SkyZeroZx 9b494c7de5 docs: Add DestroyRef.destroyed and usage in lifecycle guide (#64422)
PR Close #64422
2025-10-21 15:12:50 +00:00
SkyZeroZx ed99bc96f1 docs: add references to SSR guide for caching options (#64347)
PR Close #64347
2025-10-21 15:12:15 +00:00
Andrew Scott cfd8ed3fff fix(router): Fix outlet serialization and parsing with no primary children (#64505)
this fixes tree creation, serialization, and parsing of trees created with
children outlets and no primary path

fixes #62384

PR Close #64505
2025-10-20 21:18:47 +00:00
Matthieu Riegler de8af17951 docs(docs-infra): Extract multiple extends statements for interfaces (#64539)
fixes #64528

PR Close #64539
2025-10-20 21:18:14 +00:00
Angular Robot b645b64067 build: update cross-repo angular dependencies (#64548)
See associated pull request for more information.

PR Close #64548
2025-10-20 21:17:01 +00:00
Andrew Scott 182fe78f91 fix(router): Surface parse errors in Router.parseUrl (#64503)
logs error in addition to fallback parse

fixes #54937

PR Close #64503
2025-10-20 17:51:30 +00:00
Angular Robot 4063082811 build: update cross-repo angular dependencies (#64545)
See associated pull request for more information.

PR Close #64545
2025-10-20 17:09:55 +00:00
Angular Robot e4e6b92db3 build: lock file maintenance (#64534)
See associated pull request for more information.

PR Close #64534
2025-10-20 16:04:25 +00:00
Angular Robot 4073dc5592 build: update rules_browsers digest to 0e0949d (#64537)
See associated pull request for more information.

PR Close #64537
2025-10-20 14:49:38 +00:00
Matthieu Riegler 3bb4b3d05b docs: add more details on critical inlining. (#64292)
fixes #42682

PR Close #64292
2025-10-20 14:45:38 +00:00
Angular Robot 544ea5322f build: update github/codeql-action action to v3.30.9 (#64521)
See associated pull request for more information.

PR Close #64521
2025-10-20 14:42:26 +00:00
Jessica Janiuk 5fb7c318bd Revert "fix(compiler-cli): missingStructuralDirective diagnostic produces false negatives (#64470)" (#64542)
This reverts commit 371274bfc6.

PR Close #64542
2025-10-20 14:39:52 +00:00
Matt Lewis 371274bfc6 fix(compiler-cli): missingStructuralDirective diagnostic produces false negatives (#64470)
Fixes a bug in the missingStructuralDirective diagnostic where structural directives with missing imports were not reported when the element using the structural directive contained other directives

Fixes #64467

PR Close #64470
2025-10-17 19:58:00 +00:00
SkyZeroZx 891f180262 fix(compiler): correctly compile long numeric HTML entities (#64297)
Fixes an issue where long numeric HTML entities (e.g. &#x1F6C8;) were incorrectly compiled due to the use of 4-digit

PR Close #64297
2025-10-17 18:23:45 +00:00
SkyZeroZx 0f81ef405b docs: Update FormArray.push usage (#64499)
PR Close #64499
2025-10-17 17:40:52 +00:00
Angular Robot 086857c2f8 build: update cross-repo angular dependencies (#64496)
See associated pull request for more information.

PR Close #64496
2025-10-17 16:06:00 +00:00
SkyZeroZx 56afa3d70d docs(docs-infra): Corrects repo name typo in entry parsing logic (#64487)
Ensures the repository reference uses the correct name to prevent confusion and maintain consistency across generated documentation entries.

PR Close #64487
2025-10-17 14:52:25 +00:00
SkyZeroZx ccaa9e5eb3 docs: add matrix parameters docs and examples (#64459)
PR Close #64459
2025-10-17 14:45:57 +00:00
SkyZeroZx e1699006bf docs: Documents sourcesContent option for source maps (#64482)
PR Close #64482
2025-10-17 14:29:52 +00:00
Uaena_Alex_John aeda431ecb docs: Change import statement to use 'inject' function (#64491)
PR Close #64491
2025-10-17 14:29:13 +00:00
Jessica Janiuk e1a6375f67 release: cut the v20.3.6 release 2025-10-16 13:28:31 -07:00
Matthieu Riegler b99d028cb9 refactor(platform-browser): remove unecessary export. (#64469)
The usage has been removed from g3.

PR Close #64469
2025-10-16 18:52:54 +00:00
Angular Robot d342601077 build: update cross-repo angular dependencies (#64475)
See associated pull request for more information.

PR Close #64475
2025-10-16 18:22:36 +00:00
Jessica Janiuk 911d6822cb fix(core): update animation scheduling (#64441)
In some rare cases, it seems the animation queue disappears despite being afterEveryRender. This updates the animation scheduler to be afterNextRender instead and only schedules it when we need to.

fixes: #64423

PR Close #64441
2025-10-16 17:35:51 +00:00
SkyZeroZx 80907b20c1 docs: Fixes DI guide reference missing ')' in see tag (#64457)
PR Close #64457
2025-10-16 17:34:18 +00:00
Angular Robot 957fc0527f build: update cross-repo angular dependencies (#64473)
See associated pull request for more information.

PR Close #64473
2025-10-16 17:29:30 +00:00
SkyZeroZx 2d159afa1b docs: Add docs for EVENT_MANAGER_PLUGINS (#64453)
PR Close #64453
2025-10-16 14:54:48 +00:00
SkyZeroZx 136e3de3aa docs: Add dataurl and base64 in atrribute loader (#64419)
PR Close #64419
2025-10-16 14:38:50 +00:00
Matthieu Riegler 2ece42866d fix(platform-browser): DomEventsPlugin should always be the last plugin to be called for supports(). (#50394)
This fixes the issues when `BrowserModule` is not the first module imported.

Fixes #37149 #37850

PR Close #50394
2025-10-15 21:12:46 +00:00
SkyZeroZx dbcc281b79 docs: Adds documentation for accessing parent resolver data (#64398)
PR Close #64398
2025-10-15 21:10:07 +00:00
Angular Robot 60eba9b0a4 build: update cross-repo angular dependencies (#64447)
See associated pull request for more information.

PR Close #64447
2025-10-15 21:09:30 +00:00
Angular Robot e6c0223a59 docs: update Angular CLI help (#64434)
Updated Angular CLI help contents.

PR Close #64434
2025-10-15 11:47:49 -07:00
Angular Robot 43fe755654 build: update cross-repo angular dependencies (#64439)
See associated pull request for more information.

PR Close #64439
2025-10-15 10:50:39 -07:00
Danny Koppenhagen 684ad17a34 docs: fix closing tag for whitespace examples (#64425)
PR Close #64425
2025-10-15 10:48:46 -07:00
SkyZeroZx 68d1e290d4 docs: update service worker documentation with additional references (#64353)
PR Close #64353
2025-10-15 10:47:49 -07:00
Angular Robot 7b65a49f78 build: update pnpm to v10.18.3 (#64432)
See associated pull request for more information.

PR Close #64432
2025-10-15 10:45:20 -07:00
SkyZeroZx 69dabdba99 docs: Add injection context for lazy route loading (#64412)
PR Close #64412
2025-10-15 10:41:54 -07:00
Matthieu Riegler b3643e5e83 docs(docs-infra): fix mobile banner layout (#64408)
PR Close #64408
2025-10-15 10:41:05 -07:00
aparziale 0bf157c7fb refactor(migrations): unit test signal migration adjustment (#64393)
Move unit test from spec file to golden test

PR Close #64393
2025-10-15 10:38:58 -07:00
Matthieu Riegler 67531d39cb refactor(devtools): remove "changes" entry. (#64338)
This is just the same value as total time spent. Also it is confusing to some users.

fixes #51206

PR Close #64338
2025-10-15 10:38:21 -07:00
Andrew Kushnir 6a7c27eafb release: cut the v20.3.5 release 2025-10-15 10:07:28 -07:00
Angular Robot 07d8c60ca1 build: update cross-repo angular dependencies (#64416)
See associated pull request for more information.

PR Close #64416
2025-10-14 15:43:42 -07:00
Matthieu Riegler 43cb583f70 refactor(devtools): add debug router APIs (#64411)
This is a patch backport of #63081

PR Close #64411
2025-10-14 15:41:11 -07:00
Andrew Kushnir 5f4f624477 Revert "refactor(core): add debug name to resource (#64172)" (#64418)
This reverts commit 63180067aa.

PR Close #64418
2025-10-14 14:28:17 -07:00
Andrew Kushnir 3ae0d1bcf5 Revert "refactor(compiler-cli): add a resource debugName transform (#64172)" (#64418)
This reverts commit e941e6b80f.

PR Close #64418
2025-10-14 14:28:17 -07:00
JoostK c2e817b0ef perf(compiler-cli): fix performance of "interpolated signal not invoked" check (#64410)
This fixes a performance regression from #63754, which is almost a revert of the
prior performance fix in #57291; the latter was provided as quick fix to address
the severe performance overhead this extended diagnostic used to have, with #57337
as follow-up change to address the false negatives that were introduced in #57291.
That follow-up never landed, though, so this commit is re-applying the changes
from #57337 to fix the performance regression.

Fixes #64403

PR Close #64410
2025-10-14 13:47:21 -07:00
Jessica Janiuk f15cfa4cc4 fix(core): fixes regression in animate.leave function bindings (#64413)
When adding and removing items in a `@for` loop, the `animate.leave` event binding instruction was not updated to use the same logic as the class function when the animation queue was added. We were not returning the correct signature for the `animate.leave` function, which caused the animation to not trigger correctly. This updates the event binding instruction to use the same logic as the class function when adding the animation to the queue.

fixes: #64336

PR Close #64413
2025-10-14 13:46:39 -07:00
Angular Robot 285dad4463 build: lock file maintenance (#64377)
See associated pull request for more information.

PR Close #64377
2025-10-14 12:22:10 -07:00
Matthieu Riegler 5b0363c1ee refactor(core): warning when hydration trigger is used without hydration being enabled (#64185)
This replaces the error we were throwing before the change. This allows component with defer triggerrs to be used on both SSR'd and CSR.

fixes #64184

PR Close #64185
2025-10-14 11:55:22 -07:00
hawkgs 11b006ed83 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-10-14 09:31:42 -07:00
hawkgs 623c2847be 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-10-14 09:31:42 -07:00
Jessica Janiuk d54dd674ca fix(core): Prevents early style pruning with leave animations (#64335)
In some cases, the leave animation stylesheets were getting pruned too early due to the renderer removal happening before the animation function was run. This ensures that while queuing a leave animation, we guarantee the lView is referenced in the leaving animations set. This guarantees the style sheet pruning knows about the animations existing and skips the prune step.

fixes: #64326

PR Close #64335
2025-10-14 09:30:33 -07:00
Angular Robot 4f89ec396e build: update cross-repo angular dependencies (#64406)
See associated pull request for more information.

PR Close #64406
2025-10-14 09:28:05 -07:00
Alan Agius 8391d57808 build: remove ANGULAR_PACKAGE file from snapshot builds (#64402)
This was needed for NGCC which has been removed a long time ago.

PR Close #64402
2025-10-14 09:26:20 -07:00
Matthieu Riegler 1cb1fffce3 docs: Add mentions of the autoCsp option (#64290)
And also in the incompatibility of `CSP_NONCE` with `inlineCritical`.

fixes #61037

PR Close #64290
2025-10-14 09:23:21 -07:00
Andrew Kushnir a2773b5ed1 ci: update symbol golden file for @defer test case (#64396)
This commit updates the golden file, which got affected by this change: https://github.com/angular/angular/commit/eb80c3075f546c43f0ed2636bc6323d4b9d0a898

PR Close #64396
2025-10-13 16:49:27 -07:00
SkyZeroZx fdd0856dd1 docs: Removes standalone flag from drag-drop examples (#64395)
PR Close #64395
2025-10-13 15:58:33 -07:00
Angular Robot 0c58b5f5e3 build: update cross-repo angular dependencies (#64391)
See associated pull request for more information.

PR Close #64391
2025-10-13 11:30:38 -07:00
Joey Perrott f23df716a8 build: update symbol extractor tests to stabalize the order of the symbols listed (#64389)
Update to ensure that the symbols in the list of extracted symbols is consistent even when multiple bundle files are extracted from.

PR Close #64389
2025-10-13 11:12:56 -07:00
Oliver Lang e54f41e43a docs: improve clarity of self-closing tag migration example (#64388)
Replaces inline comments with structured Before and After sections
to enhance readability and consistency. This helps developers better
understand the transformation from non-self-closing to self-closing
tags during migration.

PR Close #64388
2025-10-13 10:01:03 -07:00
Alan Agius 51066cc077 ci: remove cache-node-modules from checkout-and-setup-node (#64387)
This option no longer exists and the new default is to cache the PNPM store.

PR Close #64387
2025-10-13 09:29:07 -07:00
Matthieu Riegler b4b19b60af refactor(compiler): Improve pipe in track expression error (#64321)
Throw a parse error for a better context awareness.

fixes #64316

PR Close #64321
2025-10-13 08:59:57 -07:00
Angular Robot 9cbe5b650a build: update pnpm to v10.18.2 (#64359)
See associated pull request for more information.

PR Close #64359
2025-10-13 08:44:03 -07:00
Angular Robot a5a6d3f852 build: update github/codeql-action action to v3.30.8 (#64371)
See associated pull request for more information.

PR Close #64371
2025-10-13 08:41:03 -07:00
aparziale 554573e524 fix(migrations): migrating input with more than 1 usage in a method (#64367)
When the migration command was run for inputs, if the input had more than one reference in a method the migration would generate incorrect code

Fixes #63018

PR Close #64367
2025-10-13 08:37:11 -07:00
Shuaib Hasan Akib 09b37d30c6 docs: update MDN reference links to main documentation pages (#64383)
Replaces old deep-linked MDN tutorial URLs with top-level documentation
links for JavaScript, HTML, and CSS to provide more general and reliable references.

PR Close #64383
2025-10-13 08:34:53 -07:00
Matthieu Riegler bbc0f81aff docs(docs-infra): Add user to the open files (#64380)
fixes #64345

PR Close #64380
2025-10-13 08:33:57 -07:00
SkyZeroZx 897d25cf9c docs: update router behavior to correct syntax highlighting (#64375)
PR Close #64375
2025-10-13 08:33:19 -07:00
SkyZeroZx 56270c36e5 docs: Documents utility functions for narrowing form control types (#64373)
PR Close #64373
2025-10-13 08:32:30 -07:00
aparziale 9f49b2ad24 docs: fix typo in route-guards guide (#64366)
Fix typo in route-guards guide: “useres” → “users”

Fixes #64363

PR Close #64366
2025-10-13 08:31:48 -07:00
Oswin Sutton c55f9b2c3b docs: add missing code formatting around @defer in templates/defer guide (#64357)
PR Close #64357
2025-10-13 08:31:14 -07:00
SkyZeroZx 7cc6af9ae7 docs: Add example Unhandled errors in Angular documentation (#64356)
PR Close #64356
2025-10-13 08:30:26 -07:00
Shuaib Hasan Akib 1502b1bc82 refactor(common): sync examples with Angular style guide (#64167)
Updated examples to align with the latest Angular style:
- Removed `standalone: false` since it is unnecessary.
- Dropped module-based implementation in favor of standalone.

PR Close #64167
2025-10-13 08:29:44 -07:00
SkyZeroZx edbd533de0 docs: refactor popup example to use inject function (#64349)
PR Close #64349
2025-10-13 08:27:51 -07:00
Matthieu Riegler 9437ff3504 docs(docs-infra): Fix animation bug on iPhones (#64342)
PR Close #64342
2025-10-13 08:25:47 -07:00
Matthieu Riegler da5073358e docs: add a callout that adding/removing to formArray doesn't not mark dirty (#64337)
fixes #36788

PR Close #64337
2025-10-10 08:13:56 -07:00
Angular Robot 448ba75579 build: update bazel dependencies (#64332)
See associated pull request for more information.

PR Close #64332
2025-10-10 08:13:16 -07:00
SkyZeroZx da38cd9679 docs: add example for assertInInjectionContext (#64325)
PR Close #64325
2025-10-10 06:51:45 -07:00
Angular Robot c4812fef14 build: update dependency bazel to v7.6.2 (#64331)
See associated pull request for more information.

PR Close #64331
2025-10-10 06:47:31 -07:00
Shuaib Hasan Akib 656715c365 docs: fix rxResource example to return object from params function (#64327)
Previously, the example returned a plain value instead of an object,
causing destructuring in the `stream` function to fail. Updated to
`params: () => ({ userId: this.userId() })` for correctness.

fixes: #64313

Update adev/src/content/ecosystem/rxjs-interop/signals-interop.md

Co-authored-by: Matthieu Riegler <kyro38@gmail.com>

PR Close #64327
2025-10-10 06:45:18 -07:00
SkyZeroZx 5a4f8261b5 docs: Add unified control state change events (#64279)
PR Close #64279
2025-10-10 06:42:36 -07:00
SkyZeroZx 1ca0d05af9 docs: Adds documentation for image decoding attribute (#64261)
Expands the image optimization guide to explain browser image decoding strategies

PR Close #64261
2025-10-10 06:41:32 -07:00
SkyZeroZx 302faa447f docs: Add programmatic component input/output/directive binding (#64240)
Expands the guide to explain how inputs, outputs, and directives can be provided when creating components programmatically

PR Close #64240
2025-10-10 06:39:57 -07:00
Kristiyan Kostadinov 8dec92ff9f fix(compiler-cli): capture metadata for undecorated fields (#63957) (#64317)
Currently if `TestBed.overrideComponent` is used on a class that uses initializer APIs (e.g. `input()`), the initializer metadata will be wiped out, because `overrideComponent` re-compiles the class with the information set by `setClassMetadata`. `setClassMetadata` only captures decorated members at the moment.

These changes introduce some logic to capture the new initializer-based APIs in `setClassMetadata` as well.

Fixes #57944.

PR Close #63957

PR Close #64317
2025-10-09 11:57:57 -07:00
Kristiyan Kostadinov 2342de8fac refactor(compiler): expose member decorator identifiers (#63957) (#64317)
Adds the member decorators to the map of exposed compiler symbols.

PR Close #63957

PR Close #64317
2025-10-09 11:57:57 -07:00
Kristiyan Kostadinov bb241ee28b refactor(compiler-cli): track member metadata using output AST (#63957) (#64317)
Reworks the logic that tracks the decorator metadata for members to do so using the output AST, rather than wrapping the TypeScript AST. This makes it easier to programmatically generate new members that weren't part of the TypeScript AST before.

PR Close #63957

PR Close #64317
2025-10-09 11:57:57 -07:00
Kristiyan Kostadinov 2c79ca0b57 fix(migrations): remove error for no matching files in control flow migration (#64253) (#64314)
Now that the control flow migration is running as a part of `ng update`, we need to be a bit forgiving about there not being any matching files since it can break the entire update process.

These changes switch the error to a warning and it counts the files for the entire workspace, not the individual projects.

PR Close #64253

PR Close #64314
2025-10-09 11:57:24 -07:00
Andrew Scott 6e4bcc7d22 fix(router): Scroll restoration should use instant scroll behavior for traversals (#64299)
When the scroll position is being restored, this change upates the
behavior to use 'instant' rather than the default 'auto', which will
be whatever the browser behavior is for 'window.scrollTo'. The 'smooth'
behavior does not match how browsers behavior when performing a
traversal navigation for MPAs, which is 'instant'.

related to #58258

PR Close #64299
2025-10-09 11:13:46 -07:00
Matthieu Riegler fa25dadae9 refactor(core): use the ValueEqualityFn from core (#64247)
Instead of the non-public primitive one.

PR Close #64247
2025-10-09 05:31:35 -07:00
Shuaib Hasan Akib 19cd52f421 docs(docs-infra): add rel="noopener" to external links with target="_blank" in ExternalLink directive (#64276)
PR Close #64276
2025-10-09 05:29:31 -07:00
Angular Robot 950a05c8e1 build: update cross-repo angular dependencies (#64308)
See associated pull request for more information.

PR Close #64308
2025-10-09 05:28:32 -07:00
Angular Robot 4ea008e683 build: update github/codeql-action action to v3.30.7 (#64286)
See associated pull request for more information.

PR Close #64286
2025-10-09 05:26:50 -07:00
SkyZeroZx e8de1b481c refactor(docs-infra): replace @Input with signal input for ignoredElementsIds in ClickOutside directive (#64302)
replace @Input with signal input for ignoredElementsIds in ClickOutside directive

PR Close #64302
2025-10-09 05:21:03 -07:00
SkyZeroZx 5baaf979db docs: Replace ngIf programmatic rendering to control flow (#64301)
PR Close #64301
2025-10-09 05:20:21 -07:00
Angular Robot fdb2a95929 build: update bazel dependencies (#64196)
See associated pull request for more information.

PR Close #64196
2025-10-09 05:18:36 -07:00
Matthieu Riegler 3658f211f8 docs: update banner with AI RFC (#64107)
PR Close #64107
2025-10-09 05:17:07 -07:00
Matthew Berry 79604819c3 test(compiler): fix a @keyframes style encapsulation test (#64036)
I've updated the test to assert what I believe it was trying to assert
before. Without this change, the CSS is invalid so it's unclear what
behavior we're demonstrating.

PR Close #64036
2025-10-09 05:16:19 -07:00
Miles Malerba 28b0d536e8 release: cut the v20.3.4 release 2025-10-08 10:49:59 -04:00
Angular Robot 11d83d1bb0 build: update cross-repo angular dependencies (#64272)
See associated pull request for more information.

PR Close #64272
2025-10-07 20:41:53 -04:00
Matthieu Riegler b568bc1ef8 docs: add providers caveat on the service (#64269)
fixes #60955

PR Close #64269
2025-10-07 20:40:20 -04:00
Matthieu Riegler 0f7b877412 docs: add mentions host style bindings (#64257)
Also adds a section about css custom properties

fixes #64256

PR Close #64257
2025-10-07 20:39:41 -04:00
utshow-rehman 67bffa264b docs(docs-infra): refactor navigation code based on angular style guide (#64177)
PR Close #64177
2025-10-07 20:29:55 -04:00
Alan Agius 89f5748f6e build: remove empty globs (#64270)
Remove globs that do not match any files.

PR Close #64270
2025-10-07 20:28:12 -04:00
Angular Robot 0d8fe3e4c2 build: update pnpm to v10.18.1 (#64266)
See associated pull request for more information.

PR Close #64266
2025-10-07 20:26:12 -04:00
Jessica Janiuk 3b959105be fix(core): prevent early exit from leave animations when multiple transitions are present (#64225)
Our code ensuring host binding composition for animations was causing the early exit and removal of
elements when multiple transitions were present on the same element. This commit fixes the issue by
ensuring that we properly keep track of all the promise resolvers on the LView and then only
call them once we've properly waited for the longest animation to finish.

fixes: #64209

PR Close #64225
2025-10-06 15:34:28 -04:00
Jessica Janiuk 24906249e6 refactor(core): allow animationend to process if we don't have a longest animation (#64225)
There may be cases where the longest animation info has been cleaned up before the end animation fires. We should still do the end processing in that case.

PR Close #64225
2025-10-06 15:34:28 -04:00
Jessica Janiuk 08b8b13185 refactor(core): fix animations host binding tests (#64225)
These tests were not properly validating against the host binding changes due to the fact that the styles were on the wrong components in some of the host binding cases.

PR Close #64225
2025-10-06 15:34:27 -04:00
Shuaib Hasan Akib 962bac2533 refactor(docs-infra): improve CustomErrorHandler for clarity and best practices (#64237)
Use `implements ErrorHandler` instead of extending the base class to follow Angular
conventions. Marked injected dependencies as `readonly`, made `openErrorSnackBar`
private, and improved overall code consistency.

PR Close #64237
2025-10-06 15:33:43 -04:00
Angular Robot 9be76ad0a4 build: update cross-repo angular dependencies (#64258)
See associated pull request for more information.

PR Close #64258
2025-10-06 15:25:00 -04:00
Jaime Burgos c63de7057b docs: add documentation for routerOutletData input and its usage (#64242)
PR Close #64242
2025-10-06 15:20:06 -04:00
SkyZeroZx 57e375b62b docs: Adds guide for customizing page titles with TitleStrategy (#64238)
Improves documentation by explaining how to implement and configure a custom title strategy for centralized control over page titles

PR Close #64238
2025-10-06 15:17:59 -04:00
Matthieu Riegler 8528bb5e75 docs(docs-infra): fix @example in class members (#64249)
eg: ApplicationRef

PR Close #64249
2025-10-06 15:11:32 -04:00
SkyZeroZx c1cfba0624 docs: add equal option to toSignal for custom value comparison (#64241)
PR Close #64241
2025-10-06 15:09:50 -04:00
Angular Robot 6e5be385b2 build: update pnpm to v10.18.0 (#64233)
See associated pull request for more information.

PR Close #64233
2025-10-06 14:57:56 -04:00
Jessica Janiuk 853ed169a8 fix(core): ensure missing leave animations don't queue leave animations (#64226)
There was a bug in the logic for checking if a leave animation exists for a node. This was affecting timing of nodes with enter animations.

PR Close #64226
2025-10-03 13:28:55 -07:00
Matthieu Riegler 28668a58ec docs: add info about disabling request caching (#64216)
fixes #64210

PR Close #64216
2025-10-03 17:19:00 +00:00
Angular Robot 3fe6416ae3 build: update cross-repo angular dependencies (#64213)
See associated pull request for more information.

PR Close #64213
2025-10-02 14:21:28 -07:00
SkyZeroZx 65884895ff fix(migrations): preserve component imports when pruning NgModules in standalone migration (#64186)
This fix preserves component imports by adding missing  statements and replacing module references with the correct component

PR Close #64186
2025-10-02 13:54:15 -07:00
Shuaib Hasan Akib e2820d1a2d docs(docs-infra): keep file name visible when code block is hidden (#64204)
Ensures that file names remain visible even if the associated code block
is collapsed or hidden, improving readability and context in the docs.

PR Close #64204
2025-10-02 17:30:46 +00:00
Jessica Janiuk 6fed986b7a fix(core): Fixes animations in conjunction with content projection (#63776)
Content Projected nodes are not destroyed and recreated, like every other
situation. Enter and Leave animations were ephemeral and are
expected to run once, and then be cleared. This means that for content projection
cases, the animations would only ever work the first time they were shown / hid.

In order to resolve this, we move to an animation queue that re-runs the animation
functions stored in the LView. In most cases, this animation will run once on creation.
For content projection, the enter and leave animations will fire more than once. Animations
are stored on the LView, but indexed and scheduled by whichever RNode needs to be animated.
So we only run animations for an affected RNode, rather than potentially all in the LView.

This also moves the queue to afterRender, which is safer than right after template
execution in refreshView.

fixes: #63418
fixes: #64065
fixes: #63901

PR Close #63776
2025-10-02 16:56:01 +00:00
Yasin Aslan 76fe5599fe fix(core): handle undefined CSS time values in parseCssTimeUnitsToMs function (#64181)
Improve error handling when `rawDelays` contains fewer items than `transitionedProperties`, preventing a toLowerCase of undefined error in `parseCssTimeUnitsToMs`.

PR Close #64181
2025-10-02 08:13:49 -07:00
Shuaib Hasan Akib 5e6d2860cd docs(docs-infra): update styles to align checkbox with label (#64202)
Removed extra spacing and removed center alignment so that checkboxes and
their labels are visually consistent.

PR Close #64202
2025-10-02 08:12:00 -07:00
Alan Agius b687d9c51a docs: update website URL in license banners (#64183)
Replace angular.io with angular.dev
PR Close #64183
2025-10-02 07:56:59 -07:00
kirjs c314ccba0c release: cut the v20.3.3 release 2025-10-02 08:05:44 -04:00
kirjs a453b1de08 Revert "fix(core): Fixes animations in conjunction with content projection (#63776)" (#64189)
This reverts commit 1cb16fddb5.

PR Close #64189
2025-10-01 22:42:41 +00:00
Angular Robot 952e3b1ead build: update cross-repo angular dependencies to v20.2.7 (#64182)
See associated pull request for more information.

PR Close #64182
2025-10-01 22:21:04 +00:00
Angular Robot 96b35727b0 build: update bazel dependencies (#64149)
See associated pull request for more information.

PR Close #64149
2025-10-01 13:40:04 -04:00
Shuaib Hasan Akib 94c9003093 refactor(common): update NgIf, ngComponentOutlet and ngTemplateOutlet examples and remove redundant standalone flag (#64155)
Removed `standalone: true` since it is now the default
and no longer necessary.

refactor(common): update ngComponentOutlet and ngTemplateOutlet examples and remove redundant standalone flag

Removed `standalone: true` since it is now the default
and no longer necessary.

PR Close #64155
2025-10-01 13:22:44 -04:00
Angular Robot cc8f5e1e00 build: update ossf/scorecard-action action to v2.4.3 (#64166)
See associated pull request for more information.

PR Close #64166
2025-10-01 10:42:04 -04:00
SkyZeroZx 1710cbd7d4 fix(migrations): handle shorthand property declarations in NgModule (#64160)
The migration now correctly detects shorthand declarations in NgModule metadata

PR Close #64160
2025-10-01 10:41:17 -04:00
Jessica Janiuk 0e928fbc4a fix(core): Fixes animations in conjunction with content projection (#63776)
Content Projected nodes are not destroyed and recreated, like every other
situation. Enter and Leave animations were ephemeral and are
expected to run once, and then be cleared. This means that for content projection
cases, the animations would only ever work the first time they were shown / hid.

In order to resolve this, we move to an animation queue that re-runs the animation
functions stored in the LView. In most cases, this animation will run once on creation.
For content projection, the enter and leave animations will fire more than once. Animations
are stored on the LView, but indexed and scheduled by whichever RNode needs to be animated.
So we only run animations for an affected RNode, rather than potentially all in the LView.

This also moves the queue to afterRender, which is safer than right after template
execution in refreshView.

fixes: #63418
fixes: #64065
fixes: #63901

PR Close #63776
2025-10-01 09:07:38 -04:00
Matthieu Riegler 24c979da1f docs: add allowed-host mention (#64145)
and other dev-server options

PR Close #64145
2025-10-01 09:03:08 -04:00
Kristiyan Kostadinov f51ab32fb3 fix(compiler): recover template literals with broken expressions (#64150)
Fixes two issues that were preventing template literals from being recovered properly if one of the interpolated expressions is broken:
1. We weren't updating the expected brace counter when an interpolation starts which in turn was throwing off the recovery logic in `skip`.
2. When producing tokens for template literals, we were treating the closing brace as an operator whereas other places treat it as a character. Even after fixing the first issue, this was preventing the recovery logic from working correctly.

Fixes #63940.

PR Close #64150
2025-09-30 16:01:50 -04:00
aparziale 77b6305a4b fix(migrations): skip migration for inputs with 'this' references (#64142)
Prevents migration of @input() properties that contain references to 'this' in their initializer functions. This ensures that functions accessing class members via 'this' remain unchanged, preventing potential build errors.

PR Close #64142
2025-09-30 15:32:45 -04:00
Shuaib Hasan Akib 479a6f269a refactor(common): update pipe examples and remove redundant standalone flag (#64135)
Updated pipe examples to explicitly import the pipe for clarity and
correctness. Also removed `standalone: true` since it is now the default
and no longer necessary.

PR Close #64135
2025-09-30 15:31:12 -04:00
hawkgs 612ce99457 refactor(compiler-cli): include linkedSignal in the signal debugName transformer (#64106)
Add support for `linkedSignal`s in the signal `debugName` transformer. Continuation of #63346

PR Close #64106
2025-09-30 14:52:16 -04:00
Matthieu Riegler 8e800837ee refactor(core): Add custom formatters for Signals (#64000)
This commit adds a devmode only formatter for Angular signals

Custom formatters must also be enabled in the browser devtools.

PR Close #64000
2025-09-30 13:49:27 -04:00
Matthieu Riegler c1a922a04e docs: add mention of host-context() being spec deprecated but still supported (#64153)
PR Close #64153
2025-09-30 13:36:52 -04:00
Matthieu Riegler 3db8ef004f docs(docs-infra): fix app-scroller offset. (#64144)
Guide heading need different scroll offsets depending on the width of the screen. (The menu position varies).

PR Close #64144
2025-09-30 11:05:27 -04:00
Matthieu Riegler ced186fafb docs(docs-infra): prevent to call section.scrollIntoView on the server side (#64038)
PR Close #64038
2025-09-30 11:00:58 -04:00
Shuaib Hasan Akib 3598855d73 docs(docs-infra): clean up code and use inferred types where possible (#64139)
PR Close #64139
2025-09-29 16:48:13 -04:00
Angular Robot 5c50e0b0ef build: update cross-repo angular dependencies (#64115)
See associated pull request for more information.

PR Close #64115
2025-09-29 13:51:47 -04:00
SkyZeroZx aa28aa274c docs: Adds guide for custom HTTP parameter encoding (#64119)
PR Close #64119
2025-09-29 13:30:57 -04:00
Matthieu Riegler 4b3f7a0e5f refactor(devtools): guard value reads in the serializer (#64096)
Some properties (like gets) might throw when we try to read them.
With this commit we fail gracefuly and show a warning message for the property that can't be read.

fixes #56755

PR Close #64096
2025-09-29 13:08:12 -04:00
Angular Robot 633db24ca2 build: update bazel dependencies (#64100)
See associated pull request for more information.

PR Close #64100
2025-09-29 11:49:19 -04:00
Angular Robot e6c0d7eba1 build: update github/codeql-action action to v3.30.5 (#64121)
See associated pull request for more information.

PR Close #64121
2025-09-29 09:53:02 -04:00
Matthieu Riegler c0bb52829a refactor(devtools): themed devtool tab icons for firefox (#64122)
With this change, Firefox get a different tab icon when the dark theme is enabled

fixes #52980

PR Close #64122
2025-09-29 09:31:04 -04:00
Alan Agius 495211084e docs: remove note about node.js 17+ (#64129)
This note is pretty old and the mentioned behaviour has been the default for a number of major version.

PR Close #64129
2025-09-29 09:25:02 -04:00
Angular Robot c6809273b0 build: update cross-repo angular dependencies (#64108)
See associated pull request for more information.

PR Close #64108
2025-09-26 17:42:20 -04:00
Jessica Janiuk d900dba595 Revert "refactor(compiler): Remove the interpolation config (#64071)" (#64110)
This reverts commit 768a09d3c3.

PR Close #64110
2025-09-26 15:16:54 -04:00
Matthieu Riegler 71cde35f5e refactor(compiler): throw on attribute bindings for ng-container (#64072)
They are never valid on ng-container.
fixes #53760

PR Close #64072
2025-09-26 13:53:01 -04:00
Matthieu Riegler 9dbcff8794 refactor(compiler): Remove the interpolation config (#64071)
After #63474, we don't need that anymore.

PR Close #64071
2025-09-26 12:36:51 -04:00
Angular Robot 8cf95ceb11 build: update cross-repo angular dependencies (#64094)
See associated pull request for more information.

PR Close #64094
2025-09-26 12:02:08 -04:00
Jens Kuehlers e02985ac5b docs: add StateOfJS survey banner (#64083)
PR Close #64083
2025-09-26 09:37:24 -04:00
Ankita Sood ba28b3764c docs: update text (#64095)
replace `above` with `below`
PR Close #64095
2025-09-26 09:34:01 -04:00
Matthieu Riegler b12e5e62f2 docs: add warning to AbstractControl.setErrors (#64063)
fixes #38191

PR Close #64063
2025-09-25 16:29:53 -04:00
Angular Robot 7d720d52ec build: update cross-repo angular dependencies (#64077)
See associated pull request for more information.

PR Close #64077
2025-09-25 15:38:02 -04:00
Jad Chahed bd2b841e39 docs: fix XLIFF 1.2 specification URL in i18n translation files guide (#64075)
PR Close #64075
2025-09-25 15:36:19 -04:00
Jessica Janiuk e5157bd933 fix(core): prevents unintended early termination of leave animations and hoisting (#64088)
The event listeners for animationstart and animationend weren't properly checking whether the animation event fired matched the node we're bound to, since animation events bubble. This resulted in child node animation events bubbling up and causing elements to get prematurely removed.

fixes: #64084

PR Close #64088
2025-09-25 15:33:31 -04:00
Angular Robot 36c4b3f2b1 build: update all github actions (#64082)
See associated pull request for more information.

PR Close #64082
2025-09-25 14:58:33 -04:00
Matthieu Riegler 542cd0019a fix(core): do not rename ARIA property bindings to attributes (#64089)
angular#62630 made it so that all ARIA
property bindings would write to their corresponding attribute instead.
The primary motivation for this change was to ensure that ARIA
attributes were always rendered correctly on the server, where the
emulated DOM may not correctly reflect ARIA properties as attributes.
Furthermore, this change added support for binding to ARIA attributes
using the property binding syntax (e.g. `[aria-label]`).

Unfortunately, angular#62630 relied on
the incorrect assumptions that an ARIA property name could be converted
to its attribute name (without hardcoding the conversion), and that the
value of an ARIA property matched its corresponding attribute. For
example, the `ariaLabelledByElements` property's value is an array of
DOM elements, while the corresponding `aria-labelledby` attribute's
value is a string containing the IDs of the DOM elements.

This partially reverts angular#62630 so
that only property bindings with ARIA attribute names (begin with
`aria-`) are converted to attribute bindings.

* `[ariaLabel]` will revert to binding to the `ariaLabel` property.
* `[aria-label]` will continue binding to the `aria-label` attribute.

Note the only difference between `[aria-label]` and `[attr.aria-label]`
is that the former will attempt to bind to inputs of the same name while
the latter will not.

PR Close #64089
2025-09-25 14:51:13 -04:00
Matthieu Riegler a74d74bfec docs: fix homepage width (#64087)
Long term, we probably need to rework how adev behave on very large screen.

PR Close #64087
2025-09-25 14:28:33 -04:00
Doug Parker 076ccbf7fe refactor(devtools): remove hard newlines from reviewer note (#64062)
These newlines aren't necessary and potentially forced undesired formatting on the reviewer.

PR Close #64062
2025-09-25 10:36:42 -04:00
Doug Parker 0270ed232e refactor(devtools): update release script to use /pull/new endpoint (#64062)
This jumps straight to the "Open a pull request" screen rather than having the user click through the compare screen to start a PR.

PR Close #64062
2025-09-25 10:36:42 -04:00
Doug Parker 46eed6a0fb refactor(devtools): update DevTools release script to resolve origin URL (#64062)
`git config` only lists the configured value, but `git remote get-url` actually resolves the URL and is more stable.

I had a local configuration which aliased `gh:` to the appropriate GitHub URL:

```
[url "git@github.com:"]
    insteadOf = "gh:"
    pushInsteadOf = "git@github.com"
```

In this scenario, `git config` returns `gh:dgp1130/angular`, but `git remote get-url` returns `git@github.com:dgp1130/angular`, which is what the subsequent regex expects.

PR Close #64062
2025-09-25 10:36:42 -04:00
Jessica Janiuk 31f2030320 release: cut the v20.3.2 release 2025-09-24 16:22:22 -07:00
Angular Robot c525a5a890 build: update dependency node to v22.20.0 (#64061)
See associated pull request for more information.

PR Close #64061
2025-09-24 21:23:21 +00:00
Matthieu Riegler f04a78a4fc docs(docs-infra): scroll offset for headings (#64039)
PR Close #64039
2025-09-24 20:23:41 +00:00
Matthieu Riegler ea6c51f355 docs(docs-infra): fix playground layout (#64037)
PR Close #64037
2025-09-24 20:21:06 +00:00
hawkgs ce6c7d94da docs(docs-infra): align docs-step number to the heading (#64035)
Fix misaligned number element.

PR Close #64035
2025-09-24 18:31:42 +00:00
Matthieu Riegler 1fd8d5d446 fix(forms): Emit FormResetEvent when resetting control (#64034)
Prior to this change, the event was emitted by the Form Directive. With the change, it is now emitted at the control level.

fixes #58894

PR Close #64034
2025-09-24 16:49:04 +00:00
aparziale 3ebaeccb46 fix(migrations): handle reused templates in control flow migration (#63996)
The control flow migration was incorrectly removing `ng-template` elements in scenarios where they were referenced by multiple `*ngIf` directives' `else` clauses and also used independently via `ngTemplateOutlet`.

PR Close #63996
2025-09-24 16:01:58 +00:00
Matthieu Riegler 3c14d0523c refactor(compiler-cli): Don't emit optional chain non nullable diagnostics on indexed access. (#64007)
When `noUncheckedIndexedAccess` is not enabled, indexed accesses do not include `undefined` in the type.
This makes the OptionalChainNotNullableCheck inconvenient when wanting to safe guard an indexed access (and when the typings isn't helping you).

Ideally project should enable `noUncheckedIndexedAccess` for better typesafety, but this is often inconveninent (we do not enable it by default) and often not the resort of the developer.

So more better coding convinience,  `OptionalChainNotNullableCheck` will not raise an error/warning on indexed Acessed followed by an optional chaining when `noUncheckedIndexedAccess` is not enabled.

See also #63809 which will detect more cases

PR Close #64007
2025-09-24 15:08:06 +00:00
Joey Perrott 9f0c6bcf24 ci: use release config when deploying adev (#64030)
Use the release config when deploying to adev to ensure that the version stamping is in place and correct

PR Close #64030
2025-09-24 14:50:46 +00:00
Matthieu Riegler 301155b96f docs(docs-infra): tutorial navigation list component (#64027)
fixes #63516

PR Close #64027
2025-09-24 14:30:14 +00:00
Shuaib Hasan Akib 522587d236 docs: not external link (#64025)
PR Close #64025
2025-09-24 14:24:58 +00:00
Angular Robot be55f8d5de build: update cross-repo angular dependencies (#64021)
See associated pull request for more information.

PR Close #64021
2025-09-24 14:22:20 +00:00
Angular Robot 71955dcf7e build: update pnpm to v10.17.1 (#64016)
See associated pull request for more information.

PR Close #64016
2025-09-23 21:41:48 +00:00
Angular Robot bc2b819e1d build: update cross-repo angular dependencies (#64012)
See associated pull request for more information.

PR Close #64012
2025-09-23 19:59:05 +00:00
Avcharov Hryhorii 8d1891a532 refactor(core): improve linkedSignal type definitions, add debugName to options (#63346)
Add debugName for having ability to visualize linkedSignal name in devtools signal graph

PR Close #63346
2025-09-23 18:15:49 +00:00
Joey Perrott 0ebf1afb16 build: update to latest version of rules_browsers (#64009)
Update to latest version to address firefox timeout issues

PR Close #64009
2025-09-23 18:00:41 +00:00
cexbrayat 5d75219102 docs: angular does not support BigInt literal values (#64010)
PR Close #64010
2025-09-23 17:58:12 +00:00
JoostK 9515a70933 fix(core): fix narrowing of Resource.hasValue() (#63994)
This commit changes `Resource.hasValue()` and its derived types to improve narrowing
of resources whose generic type either does not include `undefined` (i.e. when a default
value has been provided) or when the generic type is `unknown`. This fixes the undesirable
behavior where `hasValue()` would cause the `else` branch of an `hasValue()` conditional
to have a narrowed type of `never`, given that the `hasValue()`'s type guard covers the
entire type range already (meaning that the type in the else-branch cannot be inhabited
in the type system, yielding the `never` type).

By making the `hasValue()` method only a type guard when the generic type includes `undefined`
these problems are avoided.

Fixes #60766
Fixes #63545
Fixes #63982

PR Close #63994
2025-09-23 14:20:55 +00:00
hawkgs 388d25e57a docs(docs-infra): fix home page UI issues on Firefox and Safari (#64006)
Fix broken banners and "Learn More" icons.

PR Close #64006
2025-09-23 14:19:03 +00:00
Cheng-Hsuan Tsai 0f85742fe7 docs(docs-infra): fix docs-card padding (#64004)
PR Close #64004
2025-09-23 14:18:31 +00:00
Angular Robot 6fa4ac7681 build: update dependency aspect_bazel_lib to v2.21.2 (#64003)
See associated pull request for more information.

PR Close #64003
2025-09-23 14:17:01 +00:00
Angular Robot 2d0761062c build: update cross-repo angular dependencies (#63999)
See associated pull request for more information.

PR Close #63999
2025-09-22 22:37:21 +00:00
Milo a67d82254f refactor(core): use version>0 instead of hasRun (#62467)
this saves a field for effect and watch nodes

PR Close #62467
2025-09-22 16:51:51 +00:00
SkyZeroZx 1d4f81c8ee fix(compiler-cli): resolve import alias in defer blocks (#63966)
Fixes an error where using an alias in a defer block caused the compiler CLI to fail when parsing. The resolution logic in ComponentDecoratorHandler was updated to correctly handle deferred dependencies with aliased imports.

PR Close #63966
2025-09-22 15:52:17 +00:00
Angular Robot 2d215246c8 build: lock file maintenance (#63985)
See associated pull request for more information.

PR Close #63985
2025-09-22 14:48:56 +00:00
Ezequiel Cicala ca104b32e9 docs: add missing signal function (#63974)
The `buttonClasses` variable should be a signal according to the example, so we added the call.
PR Close #63974
2025-09-22 14:41:18 +00:00
Steven Chim 64a36757e5 docs: fix typo in component bindings jsdoc (#63969)
PR Close #63969
2025-09-22 14:33:07 +00:00
Shuaib Hasan Akib 80962f69fa docs: fix typo "DO" → "Do" (#63988)
PR Close #63988
2025-09-22 14:30:56 +00:00
Shuaib Hasan Akib 12daa0b52f docs(docs-infra): makes property signal (#63976)
PR Close #63976
2025-09-22 14:30:12 +00:00
hawkgs 12b95774bd docs(docs-infra): fix nav menu for tablets (#63990)
Make broken nav menu visible for tablets.

PR Close #63990
2025-09-22 14:25:04 +00:00
hawkgs 78b4ddcfff docs(docs-infra): fix home page sections padding for smaller viewports (#63990)
Fix paddings for smaller viewports.

PR Close #63990
2025-09-22 14:25:04 +00:00
hawkgs 2cd4fb10c0 docs(docs-infra): don't discard favorites in search history when reselected (#63906)
Do not downgrade favorites to recent search results when you reselect them via the search results list.

PR Close #63906
2025-09-22 14:22:19 +00:00
Alan Agius d09ef683b7 build: remove yarn from integration tests, switch to pnpm (#63986)
This commit removes Yarn as a package manager for integration tests and migrates to pnpm. This change aims to standardize package management across the project, leveraging pnpm's efficiency and consistent behavior for dependency resolution and installation.

PR Close #63986
2025-09-22 14:21:11 +00:00
Matthieu Riegler 923c81c4a8 docs: remove api grouping toggle (#63961)
PR Close #63961
2025-09-19 22:13:22 +00:00
Matthieu Riegler dbb8dbc50b docs: callout for HMR+Defer (#63958)
fixes #60846

PR Close #63958
2025-09-19 21:35:37 +00:00
Jessica Janiuk e78451cf8a fix(core): prevent animations renderer from impacting animate.leave (#63921)
This adds an optional flag to the renderer on `removeChild` called `requireSynchronousElementRemoval`, which can tell any downstream renderer that elements need to be removed synchronously. This gets passed down to the legacy animation renderer to ensure that any elements that set this flag aren't impacted by that renderers changes to timing.

fixes: #63893

PR Close #63921
2025-09-19 21:26:20 +00:00
Matthieu Riegler b04e6b1869 refactor(core): drop the usage of PromiseSettledResult<void> (#63955)
`PromiseSettledResult<void>` requires the ES2020 typings. Those might not be provided (or `skipLibCheck` is not enabled).

fixes #63931

PR Close #63955
2025-09-19 20:27:26 +00:00
Matthieu Riegler de18875a4b docs: add mention of the output structure. (#63916)
fixes #57247

PR Close #63916
2025-09-19 19:55:47 +00:00
Jessica Janiuk 8858e3c908 Revert "refactor(compiler-cli): track member metadata using output AST (#63904)" (#63952)
This reverts commit ffe94b3a89.

PR Close #63952
2025-09-19 18:59:43 +00:00
Jessica Janiuk 720f0dbd13 Revert "refactor(compiler): expose member decorator identifiers (#63904)" (#63952)
This reverts commit ef0ff78de2.

PR Close #63952
2025-09-19 18:59:43 +00:00
Jessica Janiuk 172e44bdc2 Revert "fix(compiler-cli): capture metadata for undecorated fields (#63904)" (#63952)
This reverts commit 4c091abba6.

PR Close #63952
2025-09-19 18:59:43 +00:00
Alan Agius 150ed2b569 docs: add documentation for NG0401 error (#63947)
PR Close #63947
2025-09-19 17:01:21 +00:00
Matthieu Riegler d0c7ea8491 refactor(core): fix MockRenderer in unit tests. (#63936)
This allows us to drop a test only check in the runtime.

PR Close #63936
2025-09-19 14:50:08 +00:00
Matt Lewis 16d0d43ad4 fix(migrations): handle import aliases to the same module name (#63934)
Fixes a bug in the standalone migration where 2 imported modules have the same class name but 1 is imported with an alias and would not be added to the component imports array when migrating

Fixes #63913

PR Close #63934
2025-09-19 14:48:33 +00:00
Matthieu Riegler 5d9de59194 docs(docs-infra): use Github theme colors for the code edition (#63944)
fixes #52654

PR Close #63944
2025-09-19 14:46:41 +00:00
Shuaib Hasan Akib e987d94276 docs(docs-infra): removed unused common module (#63915)
PR Close #63915
2025-09-19 14:44:45 +00:00
Matthieu Riegler fe50e3647d docs: Introduce API category sorting (#63914)
PR Close #63914
2025-09-19 14:44:11 +00:00
Angular Robot fcec9a2233 build: update cross-repo angular dependencies (#63930)
See associated pull request for more information.

PR Close #63930
2025-09-19 14:40:55 +00:00
Alan Agius 3c66209e0a ci: optimize adev CI workflows (#63941)
This commit introduces several optimizations to the adev CI workflows:

- The adev preview build now uses a more powerful runner and creates a production build.
- Remote execution is disabled for adev builds to improve performance.

Note: Bazel cache is still being used, and the built times are reduces by about 10mins when the cache is missed.

PR Close #63941
2025-09-19 14:38:12 +00:00
Kristiyan Kostadinov ba40153ac0 fix(compiler-cli): capture metadata for undecorated fields (#63904)
Currently if `TestBed.overrideComponent` is used on a class that uses initializer APIs (e.g. `input()`), the initializer metadata will be wiped out, because `overrideComponent` re-compiles the class with the information set by `setClassMetadata`. `setClassMetadata` only captures decorated members at the moment.

These changes introduce some logic to capture the new initializer-based APIs in `setClassMetadata` as well.

Fixes #57944.

PR Close #63904
2025-09-18 21:30:16 +00:00
Kristiyan Kostadinov a3094f2cb5 refactor(compiler): expose member decorator identifiers (#63904)
Adds the member decorators to the map of exposed compiler symbols.

PR Close #63904
2025-09-18 21:30:16 +00:00
Kristiyan Kostadinov ba00432068 refactor(compiler-cli): track member metadata using output AST (#63904)
Reworks the logic that tracks the decorator metadata for members to do so using the output AST, rather than wrapping the TypeScript AST. This makes it easier to programmatically generate new members that weren't part of the TypeScript AST before.

PR Close #63904
2025-09-18 21:30:16 +00:00
Matthieu Riegler d40867c8d9 docs: re-add ai event banner on homepage (#63922)
PR Close #63922
2025-09-18 20:15:31 +00:00
SkyZeroZx 96a070e9e0 refactor(core): Remove duplicate code getSelectedTNode (#63897)
clean up duplicate functions

PR Close #63897
2025-09-18 16:04:26 +00:00
Damian Sire ccdb340d0d docs: apply grammar fixes to ai/overview.md (#63896)
PR Close #63896
2025-09-18 15:08:20 +00:00
Angular Robot 205d5276b0 build: update cross-repo angular dependencies (#63908)
See associated pull request for more information.

PR Close #63908
2025-09-18 15:00:56 +00:00
Angular Robot efd76c13e7 build: update rules_sass digest to 4a54e0e (#63899)
See associated pull request for more information.

PR Close #63899
2025-09-18 14:59:38 +00:00
Devin Chasanoff ef57d616af docs: add web codegen scorer to docs (#63886)
PR Close #63886
2025-09-17 21:15:42 +00:00
Jessica Janiuk 2a15d7856d release: cut the v20.3.1 release 2025-09-17 13:55:02 -07:00
Angular Robot 669c7c0249 build: update cross-repo angular dependencies (#63880)
See associated pull request for more information.

PR Close #63880
2025-09-17 20:12:03 +00:00
Angular Robot 79a818bd50 build: update cross-repo angular dependencies (#63877)
See associated pull request for more information.

Closes #63873 as a pr takeover

PR Close #63877
2025-09-17 17:37:28 +00:00
JoostK 8843707919 fix(compiler-cli): only bind inputs that are part of microsyntax to a structural directive (#52453)
Prior to this change the template type-check generator would incorrectly apply inputs
and attributes to a structural directive, where only the bindings as present in microsyntax
are actually bound to the directive. This introduced a problem where usages of template
variables could not be resolved, because the template variables are out-of-scope of the
template element itself.

Closes #49931

PR Close #52453
2025-09-17 16:05:05 +00:00
Alan Agius bd2caa4eba build: update pnpm to v10.17.0 (#63870)
pnpm v10.17.0 adds support for wildcards in 'minimumReleaseAgeExclude'. This simplifies the configuration by allowing the use of '@angular-devkit/*' and '@angular/*' instead of listing each package individually.

PR Close #63870
2025-09-17 16:04:19 +00:00
Matthieu Riegler dcdca98f5d refactor(core): remove usages of Promise.withResolvers (#63856)
Promise.withResolvers is Baseline 2024. Our policy is to support browsers in the scope of Basline widely available.

Fixes #63855

PR Close #63856
2025-09-17 15:21:52 +00:00
Matthieu Riegler 423cc17a76 refactor(common): trim undefined from locale data. (#63520)
This is an optimization to shave of unecessary data.

fixes #42315

PR Close #63520
2025-09-17 14:57:17 +00:00
hawkgs 5cc6c42acc docs(docs-infra): store search result fragment in search history (#63866)
Store the search result page fragment/sub-label in the search history and render it in the history items.

PR Close #63866
2025-09-17 14:56:32 +00:00
hawkgs 97969b1c54 docs(docs-infra): always include fragment in search results (#63866)
Always include page fragment/sub-title in the search dialog results.

PR Close #63866
2025-09-17 14:56:32 +00:00
Walter Breakell 1c7106a79c docs: fix pluralization error in templates guide (#63854)
PR Close #63854
2025-09-17 14:52:32 +00:00
Angular Robot 8cd2d8bd4c build: update cross-repo angular dependencies (#63865)
See associated pull request for more information.

PR Close #63865
2025-09-17 14:33:30 +00:00
Matthieu Riegler e3627d38e9 docs: fix homepage typos (#63868)
fixes #63867

PR Close #63868
2025-09-17 14:31:55 +00:00
Paul Gschwendtner b3434302d5 ci: remove myself from unavailability (#63863)
Removes myself from unavailability.

PR Close #63863
2025-09-17 14:27:43 +00:00
Alan Agius 4aef17def4 build: enable minimumReleaseAge to mitigate dependency chain attacks (#63862)
This change configures pnpm's `minimumReleaseAge` setting to 1 day (1440 minutes). This is a security measure to mitigate dependency chain attacks, where malicious actors publish a new version of a dependency with malicious code and then trick users into updating to it before it can be discovered and reported.

By delaying the adoption of new releases, we reduce the window of opportunity for such attacks. The list of excluded packages contains trusted and frequently updated dependencies from the Angular team, which are considered safe to use without this delay.

PR Close #63862
2025-09-17 14:27:11 +00:00
Joey Perrott 4cd56c26a2 build: remove bazel flag usage for adev (#63845)
Previously we used a configuration flag for adev, instead we now separate into two different targets since our flag didn't
need to cause a full reanalysis to run since everything before the final target should be a cache hit.

PR Close #63845
2025-09-16 20:49:04 +00:00
Matthieu Riegler dd6e1c3494 refactor(core): prevent input migration from introducing a breaking change (#63547)
Non-typed `transform` functions were stripped by the migration prior to this commit (while still logging an error).
This behavior will now only happen with `--best-effort`.

#63541

PR Close #63547
2025-09-16 18:53:51 +00:00
Matthieu Riegler f612437075 docs(docs-infra): Show package name for API references (#63831)
PR Close #63831
2025-09-16 17:36:50 +00:00
Matthieu Riegler 4bd20697fa docs(docs-infra): fix colors (#63842)
fixes #63841

PR Close #63842
2025-09-16 17:36:19 +00:00
Angular Robot 83dbf0edfa build: update cross-repo angular dependencies (#63840)
See associated pull request for more information.

PR Close #63840
2025-09-16 16:49:50 +00:00
Matthieu Riegler 049b67246f docs(docs-infra): new home page (#63662)
ADEV is getting a new home page!
This is a first iteration.

PR Close #63662
2025-09-16 16:21:32 +00:00
aparziale 6e54bdfdcb fix(migrations): fix route-lazy-loading migration (#63818)
route-lazy-loading migration now supports routes when exported by default

PR Close #63818
2025-09-16 15:53:48 +00:00
arturovt 0afd9c5632 refactor(core): swap dev/prod error handling order in injector for tree-shaking (#63354)
In production builds, `ngDevMode` is replaced with `false`, so the guard compiles to `return;`. However, bundlers like ESBuild still keep the remaining statements after the return as unreachable code instead of removing them. This leaves behind unnecessary dead code in the output.

Technically, the body is unreachable. But to prove that, the bundler must be 100% certain that:

- `return` cannot be removed by some transform
- there's no later transformation that changes control flow

As thus, it's always conservative.

This also allows dropping `assertDefined`, which was previously
referenced only inside `prependTokenToDependencyPath`. With the
function now fully inlined and dev-only, `assertDefined` is also
eliminated from production builds, further reducing bundle size.

PR Close #63354
2025-09-16 15:53:11 +00:00
Matthieu Riegler 444fd01acc docs(docs-infra): Use port 4201 for adev (#63834)
Having a changing port might be annoying. The best compromise is probably to use a less common port than the default used by the CLI.

PR Close #63834
2025-09-16 15:18:12 +00:00
Matthieu Riegler 9f64d1a1de docs: add alert about routelinkactive being a content query (#63829)
This commit also fixes an issue with alert that we're parse correctly if they were at the end of the markdown string

fixes #52877

PR Close #63829
2025-09-16 15:15:24 +00:00
Rahul Kamat 27b2a4af3a refactor(core): Update async-test.ts to use globalThis polyfill (#57505)
This updates async-test to use globalThis instead of what it was using.

PR Close #57505
2025-09-16 15:10:05 +00:00
Matthieu Riegler c80d9baf81 docs: update doc to clear up difference between toObservable/ outputToObservable (#63836)
TLDR: only `toObservable` emits synchronously on subscription.

fixes #57224

PR Close #63836
2025-09-16 15:00:54 +00:00
Matthieu Riegler 89e6636d18 docs: high level architecture mention in readme (#63828)
fixes #59293

PR Close #63828
2025-09-16 15:00:16 +00:00
Shuaib Hasan Akib 7eb5f9a999 docs: remove leading $ from script examples (#63795)
Copy-pasting commands like `$ pnpm lint` caused errors in shells (e.g. zsh). Updated docs to use `pnpm lint` directly so they run without modification.

PR Close #63795
2025-09-16 14:54:03 +00:00
Angular Robot 881fe73209 build: update dependency aspect_rules_js to v2.6.0 (#63822)
See associated pull request for more information.

PR Close #63822
2025-09-16 14:52:33 +00:00
arturovt 4a23f6e79d refactor(core): wrap checkNoChanges body in if (ngDevMode) for better tree-shaking (#63387)
The `checkNoChanges` method previously used an early-return guard:

  if (!ngDevMode) return;
  // dev-only code ...

In production builds, `ngDevMode` is replaced with `false`, so the
guard compiles to `return;`. However, bundlers like ESBuild
still keep the remaining statements after the return as unreachable
code instead of removing them. This leaves behind unnecessary dead
code in the output.

This commit updates the method to instead wrap the full body:

  if (ngDevMode) {
    // dev-only code ...
  }

With this change, the method collapses to an empty function in
production builds:

  checkNoChanges() {}

This ensures that the dev-only logic and its dependencies
(e.g. `checkNoChangesInternal`, `UseExhaustiveCheckNoChanges`) can be
fully tree-shaken, reducing bundle size.

PR Close #63387
2025-09-15 21:11:40 +00:00
SkyZeroZx 19462fc807 docs(benchpress): Remove TODOs in Statistic (#63534)
Remove TODOs in Statistic

PR Close #63534
2025-09-15 20:36:18 +00:00
hawkgs 636cd0d3ae fix(devtools): router tree legend overflow (#63813)
Set `overflow` to `hidden` so the router tree legend doesn't overflow its parent container.

PR Close #63813
2025-09-15 19:37:20 +00:00
Matthieu Riegler 5fd0082ccf refactor(compiler-cli): Add a diagnostic to detect forbiden invocations of required initializers (#63614)
The diagnostic will raise an error when required initializers (input, model, queries) are invoked the context of property initializers and contructors.

Docs will be provided in a follow-up

fixes #63602

PR Close #63614
2025-09-15 19:34:32 +00:00
Matthieu Riegler 7fb5a8087e fix(compiler): Add support for aria-invalid (#63748)
The `aria-invalid` attribute was supported but the `ariaInvalid` property was unknown by the schema.

fixes #63744

PR Close #63748
2025-09-15 18:41:17 +00:00
Uaena_Alex_John a2ea2ec615 docs: Update outputs.md to demonstrate how to use event data (#63732)
PR Close #63732
2025-09-15 17:09:19 +00:00
Jessica Janiuk cd36189ba7 ci: update pullapprove public-api rules (#63737)
This reduces the required reviews to 1 and requested reviewers to 2 to reduce friction.

PR Close #63737
2025-09-15 17:03:43 +00:00
Kristiyan Kostadinov 38c9921ff3 fix(compiler-cli): signal not invoked diagnostic not raised when input has same name in template (#63754)
The diagnostic that flags signals which haven't been invoked has some logic to skip over inputs, however it was looking at the used directives across the entire template, not the ones on the specific node.

Fixes #63739.

PR Close #63754
2025-09-15 15:50:45 +00:00
Walter Breakell e0b9ecbad4 docs: correct grammar in next steps intro paragraph (#63803)
PR Close #63803
2025-09-15 15:50:10 +00:00
Matthieu Riegler 233094e425 docs: fix detail about linkedSignal's previous value. (#63811)
fixes #63655

PR Close #63811
2025-09-15 15:46:23 +00:00
Damian Sire f4a1572861 docs: update Gemini model version in AI overview (#63800)
This change updates the Gemini model version from 2.0 Flash to 2.5 Flash on the AI overview page to align with the official Genkit documentation.

The source documentation at https://genkit.dev/docs/frameworks/angular/ has been updated, and this commit ensures our documentation reflects that change accurately.

PR Close #63800
2025-09-15 15:45:50 +00:00
SkyZeroZx b05552fc7a docs: add documentation for NG02802 warning about HttpTransferCache headers (#63802)
add documentation for NG02802 warning about HttpTransferCache headers

PR Close #63802
2025-09-15 15:38:24 +00:00
SkyZeroZx 653089d213 test(platform-server): add test for transfer state data in nested defer blocks (#63801)
Add test for transfer state data in nested defer blocks

PR Close #63801
2025-09-15 15:35:00 +00:00
Damian Sire 134c31bd1b docs: clarify usage of docs-infra scope in commit messages (#63799)
The contribution guide is updated to provide clearer instructions on when to use the `docs-infra` scope versus the `docs` type.

This change helps contributors understand that `docs-infra` should only be used for infrastructure-related changes (application code, tooling, configuration) within the `/adev` directory. For simple content modifications, such as editing a `.md` file, `docs` without a scope is the correct choice.

PR Close #63799
2025-09-15 15:33:15 +00:00
Angular Robot 03bf4df6e0 build: lock file maintenance (#63807)
See associated pull request for more information.

PR Close #63807
2025-09-15 15:30:33 +00:00
Oleg Ivanitski 13e4255f9e fix(docs-infra): fix guide content width (#63798)
This commit fixes the width of the content section, specifically the
reactive forms and template-driven forms section

Closes #63798

PR Close #63798
2025-09-15 15:25:41 +00:00
Shuaib Hasan Akib 6178d36a7d docs(docs-infra): add missing type="button" for accessibility and to remove dev tools warning (#63784)
PR Close #63784
2025-09-15 15:25:09 +00:00
Damian Sire c536035cbc docs: correct typos in AI design patterns guide (#63788)
PR Close #63788
2025-09-15 15:03:00 +00:00
Shuaib Hasan Akib 6a616f81f3 docs(docs-infra): code style improvement and component update (#63557)
- Improved code style consistency in docs-infra
- Updated app.component.ts for enhancements

Co-authored-by: Matthieu Riegler <kyro38@gmail.com>

PR Close #63557
2025-09-15 15:02:24 +00:00
Angular Robot d1919262f3 build: update pnpm to v10.16.1 (#63794)
See associated pull request for more information.

PR Close #63794
2025-09-15 14:43:32 +00:00
Angular Robot c8cde0f153 build: update cross-repo angular dependencies (#63786)
See associated pull request for more information.

PR Close #63786
2025-09-15 14:41:23 +00:00
Joey Perrott 2ebdd57eae build: update branches and versioning information (#63772)
Update the branches and versioning guide to include information about the `target: feature` and `target: automation` labels.

PR Close #63772
2025-09-12 21:45:49 +00:00
Jessica Janiuk c8d3439814 refactor(core): Reorganize and cleanup animations code (#63775)
This is a pure re-organization of the animations code. No functionality changes, but it should be easier to navigate now. Utility classes have been moved to a `utils.ts` file. The related functions in the instructions have been grouped closer together.

PR Close #63775
2025-09-12 21:41:52 +00:00
Angular Robot 9def49211a build: update pnpm to v10.16.0 (#63770)
See associated pull request for more information.

PR Close #63770
2025-09-12 17:45:15 +00:00
Angular Robot 15b6e1a8ab build: update cross-repo angular dependencies (#63768)
See associated pull request for more information.

PR Close #63768
2025-09-12 17:22:04 +00:00
martincampagnoli 8449001f8c docs: update signal-queries.md (#63726)
PR Close #63726
2025-09-12 16:48:54 +00:00
Angular Robot f2051e7f72 build: update cross-repo angular dependencies (#63765)
See associated pull request for more information.

PR Close #63765
2025-09-12 16:47:25 +00:00
Alan Agius fc850a5db5 ci: add automation label to update cdk apis and cli help workflow (#63753)
Adds the 'target: automation' label to the 'update-cdk-apis' and 'update-cli-help' jobs in the 'update-cdk-apis-and-cli-help.yml' workflow. This will help to better track and manage automation tasks.

PR Close #63753
2025-09-12 16:45:23 +00:00
Matthieu Riegler 9de50b1e7d docs(docs-infra): move the navigation related files (#63729)
* separate directory
* dedicated file for redirections

PR Close #63729
2025-09-12 16:05:04 +00:00
Shuaib Hasan Akib 895f0fb814 docs: update Creating service with CLI (#63714)
Update adev/src/content/guide/di/creating-injectable-service.md

Co-authored-by: Matthieu Riegler <kyro38@gmail.com>

PR Close #63714
2025-09-12 15:51:18 +00:00
Jessica Janiuk 3ec8a5c753 fix(core): Prevent leave animations on a move operation (#63745)
When a user has `animate.leave` on a list of items in a `@for`, but are only showing a subset using a computed, removing the second to last item results in a move operation on the last item. There's no native atomic move API in the browser. So this results in the element being detached and attached at its new index. The detaching of the node resulted in leave animations firing.
This fix addresses this by adding a flag in the `LView[ANIMATIONS]` `AnimationLViewData` interface to allow for skipping animations. During list reconciliation, we set this flag so that the animations are skipped over. The flag is flipped back after the move operation is complete.

There is one complication that results from this. The index adjustment of elements in the list happens synchronously while the leave animation is asynchronous. This results in the leaving item getting shifted to the end of the list. This is not ideal but likely can be addressed in a future refactor.

fixes: #63544

PR Close #63745
2025-09-12 15:21:25 +00:00
Angular Robot 4ee399388e build: update cross-repo angular dependencies (#63751)
See associated pull request for more information.

PR Close #63751
2025-09-12 15:07:34 +00:00
Shuaib Hasan Akib 8e84429203 docs(docs-infra): replace deprecated big tag (#63738)
Update adev/src/content/introduction/what-is-angular.md

Co-authored-by: Joey Perrott <josephperrott@gmail.com>

PR Close #63738
2025-09-12 15:04:57 +00:00
Jens Kuehlers 185ac24ab6 docs: fix links and remove second banner (#63755)
PR Close #63755
2025-09-12 09:51:16 +02:00
Angular Robot e5de4109e6 build: update cross-repo angular dependencies to v20.2.3 (#63741)
See associated pull request for more information.

PR Close #63741
2025-09-11 21:36:02 +00:00
Joey Perrott 00b87a7c26 build: automatically select a random available port when running adev locally (#63740)
Previously we relied on the default port of 4200, but if it was already in use then we would run into issues where the cli provided a prompt which we were unable to respond to. Instead we now request port 0 which will automatically find an available port.

PR Close #63740
2025-09-11 21:17:59 +00:00
SkyZeroZx 50b3e9f4c4 docs: Adds guide for extending Angular service worker (#63629)
Documents how to create custom service worker scripts to handle push notifications, background sync, and other events by importing and extending Angular's default behavior

PR Close #63629
2025-09-11 17:40:48 +00:00
Jens Kuehlers b62cadbe5d docs: add banner for Angular AI developer event (#63734)
PR Close #63734
2025-09-11 16:50:31 +00:00
Angular Robot a686e34da1 docs: update Angular CLI help (#63736)
Updated Angular CLI help contents.

PR Close #63736
2025-09-11 16:44:54 +00:00
Angular Robot 4c3fda7dc3 docs: update Angular CDK apis (#63735)
Updated Angular CDK api files.

PR Close #63735
2025-09-11 16:44:21 +00:00
Angular Robot b7bc11098d build: update cross-repo angular dependencies (#63722)
See associated pull request for more information.

PR Close #63722
2025-09-11 16:32:28 +00:00
Alan Agius 58ddd8bff6 ci: fallback to last known branch when branch does not exist downstream (#63733)
When a new branch is created for a feature, it may not exist in the downstream repo. For example, during an exceptional minor release. In such scenarios, we fallback to the last known branch. This was previously handled in a catch block, but this change makes the fallback more explicit.

PR Close #63733
2025-09-11 16:31:58 +00:00
Rocky Meza 219462fe0f refactor(core): Split consumerBefore/AfterComputation (#62549)
This makes it possible to batch effects, where we can "reopen" consumers
during initial render and then finalize them after we are finally done
adding all the effects to a batch:

```
function createBatch() {
  const effect = // ... create effect node
  resetConsumerBeforeComputation(effect);
  return effect;
}

// pseudo-code
function appendEffect(effectBatch, updater) {
  if (value is a signal) {
    const prevConsumer = setActiveConsumer(effectBatch.node);
    const output = value();
    setActiveConsumer(prevConsumer);
    effectBatch.push({ signal, updater });
    return output;
  }
}

function finalizeBatch(effectBatch) {
  if (effectBatch.length > 0) {
    finalizeConsumerAfterComputation(effectBatch.node);
  }
}

const effectBatch = createBatchEffectNode();
appendEffect(signal1, (newValue) => /* something */);
appendEffect(signal2, (newValue) => /* something different */);
finalizeBatch(effectBatch);
```

PR Close #62549
2025-09-11 15:47:34 +00:00
Alan Agius c36cd73b78 ci: correctly set branchName for the CDK (#63718)
This was incorrect which is causing the Github Action to fail

PR Close #63718
2025-09-11 15:40:28 +00:00
Alan Agius 32ff9eb566 build: mark pnpapi as external for esbuild (#63723)
In the `deploy-docs-site` GitHub action, esbuild fails to resolve `pnpapi` during the bundling process. This is because `pnpapi` is a dependency that is available in the Node.js environment at runtime and should not be bundled.

This commit marks `pnpapi` as an external dependency for esbuild to prevent it from being bundled and resolve the build failure.

```
✘ [ERROR] Could not resolve "pnpapi" [plugin bazel-sandbox]
```

See: https://github.com/angular/angular/pull/63722#issuecomment-3278922553

PR Close #63723
2025-09-11 15:36:34 +00:00
Alan Agius e539e44c85 build: remove manual release note for Firefox addon (#63731)
The reviewer note for Firefox addons included a message that was intended for manual releases. This is no longer necessary with the automated release process.

PR Close #63731
2025-09-11 15:36:03 +00:00
Alan Agius 1c0cc27e6a build: create release branch from FETCH_HEAD (#63731)
When creating the release branch, it should be based on the latest upstream changes to avoid building a release on a stale commit.

PR Close #63731
2025-09-11 15:36:03 +00:00
Devin Chasanoff c7fd7f9a02 docs: update mcp guide (#63664)
PR Close #63664
2025-09-10 23:07:50 +00:00
Jessica Janiuk 5f5828f60d refactor(core): dispatch enter and leave animations at the right times (#63710)
This updates the enter and leave logic to use the stored LView data to dispatch the enter and leave animations at the right points in the lifecycle. This should fix issues with signals not being available yet, parallel animations, and also eliminate the need for the element registry.

fixes: #63391
fixes: #63388
fixes: #63369

PR Close #63710
2025-09-10 22:24:31 +00:00
Jessica Janiuk e00c5c5b3f refactor(core): track enter and leave animations in LView (#63710)
This tracks the enter and leave functions in the LView to be executed at a safe time for change detection.

PR Close #63710
2025-09-10 22:24:31 +00:00
Matthieu Riegler 10827a41ea refactor(core): Error logs links point to the archived version of the docs (#63512)
In order to point the right context, links in error messages will target the archived version of the online doc site (v*.angular.io).

See #44650

PR Close #63512
2025-09-10 22:21:10 +00:00
Alan Agius e4594ef2d8 ci: add fallback logic for downstream branch resolution in the CLI and CDK update action (#63678)
In some cases, such as when a new exceptional minor branch is created. The branch may not exist in the downstream repo. For example, during an exceptional minor release (e.g. FW 20.3.x and Components: 20.2.x).

This commit introduces a fallback mechanism to handle such scenarios. If the current branch is not found in the downstream repository, the script will now fall back to the last known branch from the build information. This ensures that the files can be updated properly.

PR Close #63678
2025-09-10 22:19:31 +00:00
Angular Robot aaacb15bf1 build: update cross-repo angular dependencies (#63669)
See associated pull request for more information.

PR Close #63669
2025-09-10 22:18:15 +00:00
Matthieu Riegler 1b7f53021f build: add a noDuplicateEnumValue rule (#63483)
It caught several legitimate issues.
In the cases I wasn't sure, I just disabled the rule.

fixes #45843

PR Close #63483
2025-09-10 22:16:11 +00:00
Shuaib Hasan Akib ff6038d72d docs(docs-infra): remove deprecated module and add test cases (#63497)
PR Close #63497
2025-09-10 22:15:39 +00:00
Matthieu Riegler 0495254143 docs: fix hostbinding. (#63509)
HostBindings only work on properties and getters. Not methods.

fixes #57909

PR Close #63509
2025-09-10 22:13:46 +00:00
Alan Agius 7dde1951d0 build: introduce and document pnpm run devtools:release command (#63599)
This commit introduces a new `pnpm run devtools:release` command to streamline the Angular DevTools release process.

The command automates the entire release workflow, including checking for new commits, updating version numbers, creating a release commit, and guiding the user through the publishing steps for both Chrome and Firefox extensions.

The `devtools/docs/release.md` documentation has been updated to reflect the use of this new command, providing a single entry point for the release process.

A new script `devtools/tools/release.mts` has been added to implement the release logic, and `package.json` has been updated to include the new script.

PR Close #63599
2025-09-10 22:11:44 +00:00
Angular Robot 8dc34965e3 build: update github/codeql-action action to v3.30.3 (#63675)
See associated pull request for more information.

PR Close #63675
2025-09-10 22:01:26 +00:00
Alan Agius e027406026 docs: update supported Angular versions to include 20.3.x (#63679)
The versions now include the exceptional minor release.

PR Close #63679
2025-09-10 21:59:52 +00:00
Ashna Wiar 7157099669 docs: typo in signals-interop (#63683)
- typo in reference to @angular/core/rxjs-interop
PR Close #63683
2025-09-10 21:59:22 +00:00
Andrew Scott 69b61cbc24 build: update symbol goldens (#63711)
updates symbol goldens after cross repo updates

PR Close #63711
2025-09-10 14:15:36 -07:00
Alan Agius 8266790fb8 build: update cross-repo angular dependencies (#63707)
See associated pull request for more information.

Closes #63669 as a pr takeover

PR Close #63707
2025-09-10 12:07:55 -07:00
Jessica Janiuk 802dbcc2a0 fix(core): prevent animation events from being cleaned up on destroy (#63414)
This will allow manually subscribed animation events to still fire when using `animate.leave`. Otherwise they were being cleaned up before the animations happened.

fixes: #63391

PR Close #63414
2025-09-10 10:07:20 -07:00
Andrew Scott 9096d45377 release: cut the v20.3.0 release 2025-09-10 08:02:27 -07:00
Andrew Scott 34c5a039d1 release: cut the v20.3.0-rc.0 release 2025-09-10 07:57:03 -07:00
Andrew Scott 7a7725ee4c refactor(core): Update tests for zoneless by default (#63672)
Cherrypick #63668 into patch branch to avoid issues with tests when
merging to patch
2025-09-09 15:07:24 -07:00
Miles Malerba 650cd6b903 docs: add missing component harness docs (#63620)
Add some documentation that's mentioned in the material.angular.dev version of the component hanress docs, but was missing from the adev version.

PR Close #63620
2025-09-09 14:29:28 -07:00
Ben Hong d0f0c0824f docs: add signals tutorial (#62750)
PR Close #62750
2025-09-09 12:57:16 -07:00
Ben Hong b1aa2d016a docs: add dedicated signals tutorial (#62750)
PR Close #62750
2025-09-09 12:57:16 -07:00
Christian Sarnataro 68e69670be docs: fixed typo in output page (#63646)
Change `initiaize` to `initialize`

PR Close #63646
2025-09-09 12:56:01 -07:00
Alan Agius 749a71c7e5 ci: update runs-on to ubuntu-latest (#63656)
This commit updates the `runs-on` configuration in the CI workflows
(`ci.yml`, `manual.yml`, `pr.yml`) from specific `ubuntu-latest-Xcore`
labels to the more general `ubuntu-latest`. This change reduces
resource consumption. This change should not be needed for RBE and remote cache.

PR Close #63656
2025-09-09 12:34:23 -07:00
Miles Malerba 3fb7a12078 docs: add missing drag & drop docs (#63619)
Add some documentation that's mentioned in the material.angular.dev
version of the drag & drop docs, but was missing from the adev version.

PR Close #63619
2025-09-09 12:09:53 -07:00
Alan Agius 6117ccee2e feat(core): introduce BootstrapContext for improved server bootstrapping (#63636)
This commit introduces a number of changes to the server bootstrapping process to make it more robust and less error-prone, especially for concurrent requests.

Previously, the server rendering process relied on a module-level global platform injector. This could lead to issues in server-side rendering environments where multiple requests are processed concurrently, as they could inadvertently share or overwrite the global injector state.

The new approach introduces a `BootstrapContext` that is passed to the `bootstrapApplication` function. This context provides a platform reference that is scoped to the individual request, ensuring that each server-side render has an isolated platform injector. This prevents state leakage between concurrent requests and makes the overall process more reliable.

BREAKING CHANGE:
The server-side bootstrapping process has been changed to eliminate the reliance on a global platform injector.

Before:
```ts
const bootstrap = () => bootstrapApplication(AppComponent, config);
```

After:
```ts
const bootstrap = (context: BootstrapContext) =>
  bootstrapApplication(AppComponent, config, context);
```

A schematic is provided to automatically update `main.server.ts` files to pass the `BootstrapContext` to the `bootstrapApplication` call.

In addition, `getPlatform()` and `destroyPlatform()` will now return `null` and be a no-op respectively when running in a server environment.

(cherry picked from commit 8bf80c9d2314b4f2bcf3df83ae01552a6fc49834)

PR Close #63636
2025-09-09 10:45:02 -07:00
Andrew Scott 90e798b675 build: prepare exceptional minor branch: 20.3.x 2025-09-09 10:32:55 -07:00
Shuaib Hasan Akib c7b84f5a22 docs: Update Language Service IDE list (#63647)
PR Close #63647
2025-09-08 16:31:23 -07:00
Shuaib Hasan Akib a857f72c81 docs: should not conditionally include <ng-content> in IMPORTANT block (#63580)
PR Close #63580
2025-09-08 14:53:12 -07:00
Angular Robot 067a3a5a76 build: update github/codeql-action action to v3.30.1 (#63622)
See associated pull request for more information.

PR Close #63622
2025-09-08 14:52:29 -07:00
Shuaib Hasan Akib ad1f106f6d docs(docs-infra): prevent empty h3 tags when title is empty (#63573)
Conditionally render h3 element only when title attribute has content

PR Close #63573
2025-09-08 14:50:47 -07:00
Matthieu Riegler 9943230f91 docs: remove installation (#63508)
We don't have that section in other parts of the docs, package name is already mentionned.

fixes #62691

PR Close #63508
2025-09-08 14:22:52 -07:00
Matthieu Riegler 35a1d5d7bf refactor(compiler-cli): add support for if/switch to the non-invoked signal diagnostic (#63502)
This commit adds the support to the existing "interpolated_signal_not_invoked" diagnostic (even though it's not really a interpolation)

PR Close #63502
2025-09-08 13:17:05 -07:00
Shuaib Hasan Akib b3d102b475 docs: update template examples to use signal-based viewChild instead of decorator-based @ViewChild (#63630)
Co-authored-by: Matthieu Riegler <kyro38@gmail.com>

Co-authored-by: Matthieu Riegler <kyro38@gmail.com>

PR Close #63630
2025-09-08 12:52:28 -07:00
Joey Perrott a6ed784508 build: properly override the repo for rules_angular (#63584)
Override the repo "rules_angular_configurable_deps" correctly so that the actual compiler and compiler-cli from the local repo is used

PR Close #63584
2025-09-08 12:34:53 -07:00
Shuaib Hasan Akib cf690982de docs: update package link (#63579)
PR Close #63579
2025-09-08 12:33:55 -07:00
Jessica Janiuk f21c7565d7 docs: add CSS transitions note on animate.enter (#63618)
PR Close #63618
2025-09-08 12:32:03 -07:00
Joey Perrott a52f4a1987 build: separate zone.js dependencies into their own directory (#63612)
Separate out zone.js dependencies

PR Close #63612
2025-09-08 12:30:40 -07:00
Matthieu Riegler d124fba6ff docs: improve headings of docs (#63604)
This is an attemp to improve the indexation of those pages by making SSR and i18N important

PR Close #63604
2025-09-08 12:10:26 -07:00
Joey Perrott a6640e3cc5 build: add additional comments explaining deep imports in adev (#63644)
Add additional comment to explain why deep imports are required for building adev using the angular cli

PR Close #63644
2025-09-08 11:15:07 -07:00
Shuaib Hasan Akib f2ec6fbfa7 docs(docs-infra): quote title attributes in links (#63578)
Prevent broken HTML when link titles contain spaces by properly quoting the title attribute

PR Close #63578
2025-09-08 10:14:48 -07:00
Matthieu Riegler f18980c18d docs(docs-infra): fix mini share icon URL. (#63586)
fixes #63569

PR Close #63586
2025-09-05 13:08:16 -07:00
Alan Agius c3303a5f75 test: increase mermaid spec timeout to reduce flakes (#63610)
The mermaid spec test can be flaky due to timeouts. This commit increases the timeout to 25 seconds to make the test more reliable.

PR Close #63610
2025-09-05 12:53:50 -07:00
Cheng-Hsuan Tsai f697995c26 docs(docs-infra): allow collapse code example (#63559)
PR Close #63559
2025-09-04 15:25:24 -07:00
Shuaib Hasan Akib e1dd3b10dd docs: uses signal, implement TODOs, and fix typos (#63603)
PR Close #63603
2025-09-04 15:21:01 -07:00
Avcharov Hryhorii a3f808d7c8 fix: remove refresh button from transfer state tab (#63592)
TransferState is only written into the DOM once during SSR and is not kept in sync with the runtime state on the client. Pressing the refresh button always re-reads the initial serialized script tag, which never changes after bootstrap.

PR Close #63592
2025-09-04 09:23:24 -07:00
Angular Robot 951701dabb build: update cross-repo angular dependencies (#63581)
See associated pull request for more information.

PR Close #63581
2025-09-03 20:56:00 -07:00
Miles Malerba 08d363e2cc release: cut the v20.2.4 release 2025-09-03 12:36:46 -07:00
Angular Robot 320f1d6537 build: update @angular/ng-dev digest to 435c59b (#63571)
See associated pull request for more information.

PR Close #63571
2025-09-03 09:51:59 -07:00
Joey Perrott 991785fc18 build: use common jasmine rule from dev-infra (#63568)
Use the new common jasmine rule from dev-infra which include sourcemap rewriting support and esm file loading

PR Close #63568
2025-09-03 16:34:09 +00:00
Joey Perrott fc80684fa3 build: add zone.js/test/typings to bazelignore (#63568)
Add the zone.js/test/typings node_modules directory to the bazelignore list

PR Close #63568
2025-09-03 16:34:09 +00:00
Angular Robot 452abfc33c build: update cross-repo angular dependencies (#63566)
See associated pull request for more information.

PR Close #63566
2025-09-03 16:33:33 +00:00
Shuaib Hasan Akib 869312ef71 docs: discourage use of ng as a component or directive selector prefix (#63567)
PR Close #63567
2025-09-03 09:31:17 -07:00
Alan Agius 0c2255bde8 refactor(platform-server): simplify transfer state serialization tracking (#63525)
The logic to track if the transfer state has been serialized is simplified by removing the need for `APP_ID`. Instead of maintaining a `Set` of application IDs, a simple boolean flag is used.

PR Close #63525
2025-09-03 09:15:53 -07:00
Alan Agius d1d32db972 fix(platform-server): prevent false warning for duplicate state serialization (#63525)
The `TRANSFER_STATE_SERIALIZED_FOR_APPID` provider was previously configured at the platform level, causing its state to be shared across all concurrent server-side rendering requests. This created a race condition where one request could see the `appId` from a different, concurrent request, leading to false warnings about duplicate state serialization.

This commit changes the provider's scope to ensure that each application instance gets its own unique state. This correctly isolates the serialization check to each individual request, resolving the issue of false warnings in concurrent environments.

Closes #63524

PR Close #63525
2025-09-03 09:15:53 -07:00
Shuaib Hasan Akib f4a2d0abc5 docs: fix #63555 (#63560)
PR Close #63560
2025-09-03 09:01:37 -07:00
Angular Robot 7bbcb54241 build: lock file maintenance (#63523)
See associated pull request for more information.

PR Close #63523
2025-09-02 12:40:04 -07:00
Angular Robot 1e47a87fc6 build: update cross-repo angular dependencies (#63553)
See associated pull request for more information.

PR Close #63553
2025-09-02 11:54:45 -07:00
aparziale dc64f3e478 fix(core): Fixed inject migration schematics for migrate destructured properties (#62832)
Fixes #62626 - Properties used with the destructor are also managed during migration.

PR Close #62832
2025-09-02 10:59:47 -07:00
Angular Robot 957b36798f build: update github/codeql-action action to v3.30.0 (#63540)
See associated pull request for more information.

PR Close #63540
2025-09-02 17:10:21 +00:00
Angular Robot bf74c56fe1 build: update pnpm to v10.15.1 (#63527)
See associated pull request for more information.

PR Close #63527
2025-09-02 17:09:04 +00:00
Matthieu Riegler c664af8dec docs(docs-infra): highlight & parse api descriptions. (#63536)
The prevent future regression of this, this commit introduces additional tests.

PR Close #63536
2025-09-02 16:49:11 +00:00
Shuaib Hasan Akib d6f7f68012 docs(docs-infra): signal property should be readonly (#63166)
PR Close #63166
2025-09-02 16:44:13 +00:00
Shuaib hasan akib 043017871c docs: fix wrong file reference and update Tailwind CSS guide link (#63533)
PR Close #63533
2025-09-02 16:42:07 +00:00
Shuaib hasan akib 3b42314bb5 docs(docs-infra): export class (#63506)
PR Close #63506
2025-09-02 16:36:48 +00:00
Shuaib Hasan Akib 15fa2ce1c4 docs(docs-infra): apply migration script changes (#63514)
PR Close #63514
2025-09-02 09:32:01 -07:00
Shuaib Hasan Akib f204b54f9a docs(docs-infra): marks properties protected used in template (#63513)
PR Close #63513
2025-09-02 09:31:29 -07:00
Duncan Faulkner 3bd3c902ad docs: add full example for multiple content projections with card-title and card-body components (#63515)
PR Close #63515
2025-09-02 09:28:47 -07:00
Miles Malerba dddce8311f ci: add more team members as approvers (#63495)
adds amishne, leonsenft, mattrbeck to approve but not receive review
requests

PR Close #63495
2025-08-29 15:12:13 -07:00
Shuaib Hasan Akib e9096b9aab docs(docs-infra): properties should be readonly (#63492)
PR Close #63492
2025-08-29 14:06:34 -07:00
Sean Bright 6e5647f028 docs: fix up some clunky wording (#63491)
PR Close #63491
2025-08-29 14:06:02 -07:00
Jan Melcher 5bb4b75488 docs: fix rxResource example (#63484)
PR Close #63484
2025-08-29 19:00:16 +00:00
Angular Robot 8dbeac1341 build: update cross-repo angular dependencies (#63478)
See associated pull request for more information.

PR Close #63478
2025-08-29 08:53:44 -07:00
Matthieu Riegler ed50120d4c refactor(animations): remove dependency on @angular/common (#63248)
`DOCUMENT` was move to `@angular/core`, so we don't need to depend on common anymore.

PR Close #63248
2025-08-29 08:51:32 -07:00
Angular Robot 1abf6d5abd build: update cross-repo angular dependencies to 06d3af5 (#63476)
See associated pull request for more information.

PR Close #63476
2025-08-29 13:45:58 +00:00
Shuaib hasan akib c357a03bc6 docs(docs-infra): makes signal readonly (#63449)
PR Close #63449
2025-08-29 13:01:54 +00:00
Maryannah 6a5d12a186 docs: update documentation for Vitest use (#62798)
PR Close #62798
2025-08-29 13:00:53 +00:00
Emiliano González 7f5c1310f3 docs: Correct description of lesson outcome (#62710)
PR Close #62710
2025-08-29 13:00:21 +00:00
Angular Robot 22214593ab build: update cross-repo angular dependencies (#63468)
See associated pull request for more information.

PR Close #63468
2025-08-29 12:59:02 +00:00
Angular Robot 5a989f26f3 build: update dependency node to v22.19.0 (#63464)
See associated pull request for more information.

PR Close #63464
2025-08-29 12:57:34 +00:00
Angular Robot ae2a1faaad build: update google-github-actions/auth digest to c200f36 (#63462)
See associated pull request for more information.

PR Close #63462
2025-08-29 12:55:53 +00:00
Jessica Janiuk 64ddde21af release: cut the v20.2.3 release 2025-08-29 14:33:36 +02:00
Jessica Janiuk 479a919f42 fix(compiler): fixes regression with event parsing and animate prefix (#63470)
The new animations was not correctly looking for the `.` when parsing bindings. This resulted in arbitrary event bindings creating animate.leave instruction calls.

fixes: #63466

PR Close #63470
2025-08-29 11:53:30 +00:00
Angular Robot 98468c0d7a build: update cross-repo angular dependencies (#63444)
See associated pull request for more information.

PR Close #63444
2025-08-28 09:21:54 -07:00
Hongxu Xu b549cd28ae refactor(bazel): reduce build deps (#63348)
clean up deps in bazel build scripts

PR Close #63348
2025-08-28 09:16:10 -07:00
Angular Robot cef1449ac7 docs: update Angular CLI help (#63446)
Updated Angular CLI help contents.

PR Close #63446
2025-08-28 09:11:46 -07:00
Alan Agius 05a9322c75 build: remove rulesJsInteropMode (#63448)
This is no longer needed.

PR Close #63448
2025-08-28 08:49:25 -07:00
Matthieu Riegler df89611bf2 docs(docs-infra): remove unused example (#63426)
PR Close #63426
2025-08-28 08:47:54 -07:00
Milo 35dea23580 build: simplify pnpm scripts in package.json (#63310)
remove unnecessary pnpm prefix for bin scripts from node_modules

PR Close #63310
2025-08-28 08:46:23 -07:00
Vincent 596b545130 fix(core): Prevent an error on cleanup when an rxResource stream threw before returning an Observable (#63342)
Before this commit, it was wrongly assumed that the stream subscription could not be `undefined`.

Fixes #63341

PR Close #63342
2025-08-28 08:44:52 -07:00
arturovt 1e3999ec36 refactor(core): replace Optional/SkipSelf deps with inject() flags (#63386)
This commit updates provider definitions that relied on the `deps` array
with `new Optional()` and `new SkipSelf()` to instead use the modern
`inject(..., { optional: true, skipSelf: true })` API.

Previously:
  deps: [[KeyValueDiffers, new SkipSelf(), new Optional()]]

Now:
  const parent = inject(KeyValueDiffers, { optional: true, skipSelf: true });

**Bundle size reduction**: `Optional` and `SkipSelf` are runtime values
created by `makeParamDecorator()`. Even in production builds, esbuild
and other bundlers must keep their factory code because they are
referenced with `new Optional()` / `new SkipSelf()`. With `inject()`,
those classes are no longer referenced, allowing them and the
`makeParamDecorator` scaffolding to be tree-shaken when unused.

As a result, production bundles can drop both `Optional`, `SkipSelf`, and
their supporting factory code when not used elsewhere, reducing code size
while keeping the same behavior.

PR Close #63386
2025-08-28 08:43:17 -07:00
Jessica Janiuk 114906d2d6 fix(core): Fix cancellation of animation enter classes (#63442)
When toggling visibility on an element over and over, the enter animations were supposed to be cancelled and then the classes removed. There was a race condition happening that resulted in the cancelled animation being the leave animation. Rather than using the animation.cancel functionality, it's safer to just remove the enter classes.

fixes: #63439

PR Close #63442
2025-08-28 14:11:06 +00:00
Alan Agius 2e05deaffb ci: remove old options from workflows (#63441)
The `cache-node-modules` option has been removed as pnpm store cache is enabled by default.

PR Close #63441
2025-08-28 14:05:45 +00:00
Alan Agius 2fb029de04 ci: fix and improve devtools step (#63441)
This commit updates the devtools step by disabling the package manager cache. This change is necessary because Cypress downloads its binary to a cache directory during installation, which requires a post-install script. However, when the cache is hit this is skipped.

This update also disables `pnpm install` in the Cypress action to avoid a redundant installation step. And adds a seperate cache for the downloaded Cypress binary.

See: https://docs.cypress.io/app/get-started/install-cypress#pnpm-configuration

PR Close #63441
2025-08-28 14:05:45 +00:00
SkyZeroZx 690405b253 docs: Add docs service worker to new options (#63436)
Add docs service worker to new options

PR Close #63436
2025-08-28 10:20:52 +00:00
Angular Robot fe533cd244 docs: update Angular CLI help (#63420)
Updated Angular CLI help contents.

PR Close #63420
2025-08-28 10:09:09 +00:00
Matthieu Riegler 421edfe04b build: update @bazel/ibazel to 0.26.10 (#63435)
To fix failing devtools tests

PR Close #63435
2025-08-28 10:02:02 +00:00
Joey Perrott 87bfe164e3 build: define typescript version via string in module.bazel file (#63434)
Within our module.bazel file when describing the version of typescript to use for rules_ts, we use ts_version instead of ts_version_from to prevent our package.json file from being
part of the set of files used to calculate the sha for the lock file.  Any unrelated change to the version of the typescript file would end up causing our lockfile to be out of date.
This amount of churn has proven to be too much for our current setup. We instead now test to validate the versions defined in the package.json and MODULE.bazel files match.

PR Close #63434
2025-08-28 09:55:37 +00:00
Shuaib Hasan Akib a6a46e9839 docs(docs-infra): tooltip on hover and message after copied (#63167)
PR Close #63167
2025-08-27 16:56:45 -07:00
Ben Hong 9de2f078d5 docs: add customizing route behavior guide for router (#63398)
PR Close #63398
2025-08-27 16:18:39 -07:00
Shuaib Hasan Akib 40844876ea docs(docs-infra): mark properties as readonly if they shouldn't change (#63200)
PR Close #63200
2025-08-27 16:16:25 -07:00
Angular Robot ca61366218 build: update cross-repo angular dependencies (#63396)
See associated pull request for more information.

PR Close #63396
2025-08-27 16:14:31 -07:00
Matthieu Riegler cd748aad47 docs: remove the ng-class migration entry (#63430)
That migration is only available in v21 / on the main branch for now.

fixes #63428

PR Close #63430
2025-08-27 16:10:18 -07:00
arturovt fce5602b53 refactor(core): mark VERSION as @__PURE__ for better tree-shaking (#63400)
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.

PR Close #63400
2025-08-27 11:39:07 -07:00
arturovt f87fad3fff fix(core): avoid injecting internal error handler from a destroyed injector (#62275)
This commit prevents lazy injection of the internal `ErrorHandler` from a destroyed injector, which would otherwise result in a secondary "destroyed injector" error.

The `handleUncaughtError` function is used in a wrapped event listener that invokes the `ErrorHandler` if the listener throws. A simple case in a micro-frontend application:

```ts
onNavigationToAnotherApp() {
  this.appRef.destroy();
  do_some_stuff_ie_loggin_that_may_throw();
}
```

If the function throws an error, Angular attempts to inject the `ErrorHandler` from a destroyed injector.

PR Close #62275
2025-08-27 11:35:55 -07:00
Alexander Melde 06c53679ba docs: update to new standalone default behavior (#63329)
When declaring directives, the standalone flag is set to true by default in current Angular versions.

The docs for the directive decorator should correctly explain the default behavior, while still mentioning when to set it to false.

PR Close #63329
2025-08-27 11:26:13 -07:00
Matthieu Riegler e8d9bc5119 refactor(http): rework the HttpEvent union to improve narrowing. (#63267)
Prior to this change, `HttpProgressEvent` could not be narrowed to `HttpDownloadProgressEvent` or `HttpUploadProgressEvent`

PR Close #63267
2025-08-27 11:25:02 -07:00
Joey Perrott 26072bba9c build: move macros/build set up for zone.js into zone.js directories (#63421)
Move the zone_bundle and configurations into zone.js's tool directory

PR Close #63421
2025-08-27 11:23:58 -07:00
Joey Perrott 00bfff52c2 build: remove unused macros (#63421)
Remove unused macro files

PR Close #63421
2025-08-27 11:23:57 -07:00
Joey Perrott 0bc7f154c8 build: remove ts_project_interop file (#63421)
Remove the ts_project_interop.bzl file that no longer does interop work

PR Close #63421
2025-08-27 11:23:57 -07:00
Joey Perrott 705b94bd21 refactor: remove TODOs which have been corrected (#63421)
Remove TODOs which were addressed but the comment was not removed

PR Close #63421
2025-08-27 11:23:57 -07:00
Jessica Janiuk ed6a347109 refactor(core): prevent timeout from applying to non-event animation bindings (#63393)
The 4 second removal timeout was applying in all cases, but it should only actually apply to the situation where the event binding syntax is used for animate.leave. This ensures that's the only case in which it'll apply.

PR Close #63393
2025-08-27 11:17:40 -07:00
Andrew Scott 6d6b0278a8 refactor(core): Reorder resolve/reject in relation to navigate[error/success] (#63377)
Order was changed in https://github.com/whatwg/html/pull/11512 (see that
PR for details as to why).

https://whatpr.org/html/10919/nav-history-apis.html#abort-a-navigateevent

PR Close #63377
2025-08-27 11:16:53 -07:00
Andrew Kushnir 6e0b66d702 release: cut the v20.2.2 release 2025-08-27 10:53:04 -07:00
Matthieu Riegler 47caed9ada ci: pin create-pull-request version to sha (#63409)
This is a new security requirement to prevent dependency compromission.

PR Close #63409
2025-08-27 07:36:12 -07:00
Taygan Caldwell 23d1ace339 refactor(core): Create a base effect interface and prototype to be used by both angular and wiz. (#62931)
Add a common effect interface and prototype to be used to create the wiz and angular effects.

PR Close #62931
2025-08-26 14:48:33 -07:00
Matthieu Riegler e220a615d1 docs(docs-infra): patch port changes from main (#63394)
This sync some of the changes we have on the main branch will allow more upcomming changes to land via a single PR.

PR Close #63394
2025-08-26 09:48:03 -07:00
Jessica Janiuk d7b6045d61 fix(compiler): fixes animations on elements with structural directives (#63390)
The animate instructions were getting applied to the container comment nodes as well as the element nodes. This prevents that on the compiler level.

fixes: #63371

PR Close #63390
2025-08-26 09:47:08 -07:00
Avcharov Hryhorii c9b0f45690 fix(devtools): prevent profiler bars flickering after change detection (#63350)
Without trackBy cdkVirtualFor rerenders full list after in each update

PR Close #63350
2025-08-26 09:41:09 -07:00
Angular Robot 15395a576f build: update cross-repo angular dependencies (#63380)
See associated pull request for more information.

PR Close #63380
2025-08-25 16:29:57 -07:00
Joey Perrott 9a27c5befb build: rename defaults2.bzl to defaults.bzl (#63384)
Use defaults.bzl for the common macros

PR Close #63384
2025-08-25 15:45:46 -07:00
Joey Perrott a26d94d979 build: enable strict deps enforcement for ts_project (#63376)
Enable strict_deps testings for all ts_project and ng_project targets in the repo

PR Close #63376
2025-08-25 15:38:12 -07:00
Angular Robot 328e588bcd build: lock file maintenance (#63360)
See associated pull request for more information.

PR Close #63360
2025-08-25 15:37:25 -07:00
Angular Robot 454a269254 build: update cross-repo angular dependencies (#63339)
See associated pull request for more information.

PR Close #63339
2025-08-25 10:50:36 -07:00
Angular Robot f881082e80 build: update bazel dependencies (#63345)
See associated pull request for more information.

PR Close #63345
2025-08-25 08:36:53 -07:00
Jessica Janiuk c8f07daf8f fix(core): Fixes animate.leave binding to a string with spaces (#63366)
This fixes the rare case that someone uses binding syntax with `animate.leave` providing a value with a string that has spaces in it. For example:

```
<example `[animate.leave]="'class-a class-b"` />
```

fixes: #63365

PR Close #63366
2025-08-25 08:33:31 -07:00
AleksanderBodurri 3f247f1256 fix(devtools): correct path to load fonts for devtools devserver (#63358)
This broke in c35c0c7f2f. This commit changes the path to load the external stylesheet to reflect the new directory path.

PR Close #63358
2025-08-25 08:31:56 -07:00
Jessica Janiuk aabe146c30 docs: update paths and references to animations guides (#63370)
This updates the adev navigation to consider the new enter-and-leave path to be the definitive animations guide.
It also prefixes all the prior animations package docs with legacy and updates all links.

PR Close #63370
2025-08-25 08:22:32 -07:00
Jessica Janiuk 650ad1f7fb docs: add important service worker note (#63364)
This adds an important note about the service worker to indicate we are not accepting new features.

PR Close #63364
2025-08-25 08:18:32 -07:00
Jessica Janiuk 269f344d45 docs: update animations guide important note (#63363)
PR Close #63363
2025-08-25 08:17:44 -07:00
Matthieu Riegler a649d85de1 refactor(docs-infra): ensure we're not creating nested anchor elements. (#63352)
With #63162, we added automatic link creation on API symbols. The side effect was that we created HTML in some specific cases. For example with the docs-card we could have nested anchor elements which is invalid.

This commit prevent creating nested links inside docs-cards.
fixes #63351

PR Close #63352
2025-08-25 08:16:21 -07:00
Matthieu Riegler 020e0f0424 refactor(docs-infra): rename testing into test. (#63352)
We usually name `test` our test directories and `testing` for the testing helpers.

PR Close #63352
2025-08-25 08:16:21 -07:00
Joey Perrott 10b0927e15 refactor: various build and import specificer fixes for strict deps (#63324)
Change direct deps in bazel targets and import specifiers within files to maintain strict deps requirements ahead of enabling strict deps tests in the repo

PR Close #63324
2025-08-22 14:45:34 -07:00
Shuaib Hasan Akib 28c28a0aa4 docs(docs-infra): Replace page enums by constants (#63335)
PR Close #63335
2025-08-22 14:42:52 -07:00
Matthieu Riegler eef93f5a7b docs(docs-infra): auto-links to API entries (#63283)
This is a first step to create links to API entries automatically.
It adds support for
- code spans (`` `symbol` ``)
- code blocks (`` ```some code here``` ``)

Links are generated from on a K/V map of API entries (symbol => package name).
The map is generated from the API manifest that we're already generating for the API docs.

For the moment, entries with identical names are skipped.

This is a backport of #63162

PR Close #63283
2025-08-22 14:42:17 -07:00
Matthieu Riegler e1481d89dc ci: add myself to review fw-general (#63337)
Also adding myself to be assigned some adev PRs

PR Close #63337
2025-08-22 12:27:37 -07:00
Shuaib Hasan Akib e8aa7d3ce3 docs(docs-infra): fix spelling (#63334)
PR Close #63334
2025-08-22 12:01:49 -07:00
Angular Robot b02042301a build: update cross-repo angular dependencies (#63332)
See associated pull request for more information.

PR Close #63332
2025-08-22 11:29:11 -07:00
Angular Robot 551c99fd5f build: update github/codeql-action action to v3.29.11 (#63326)
See associated pull request for more information.

PR Close #63326
2025-08-22 11:28:31 -07:00
Jessica Janiuk 6c421ed65d fix(core): Ensures @for loop animations never get cancelled (#63328)
There's special logic in place to prevent duplicate nodes from showing up in the case when an `@if` toggles a view quickly. This had the unfortunate side effect of causing `@for` leave animations to get cancelled when an add and remove happened simultaneously, even if it was a different index. This fix prevents that from happening in the `@for` loop case.

fixes: #63307

PR Close #63328
2025-08-22 11:23:16 -07:00
Jessica Janiuk 9093e0e132 fix(core): fix memory leak with leaving nodes tracking (#63328)
This ensures the nodes are properly cleaned up from the leaving nodes map.

PR Close #63328
2025-08-22 11:23:16 -07:00
Angular Robot 040cba0b09 build: update cross-repo angular dependencies (#63319)
See associated pull request for more information.

PR Close #63319
2025-08-21 14:12:40 -07:00
Angular Robot 6213c7d998 build: update cross-repo angular dependencies (#63316)
See associated pull request for more information.

PR Close #63316
2025-08-21 11:45:18 -07:00
Matthieu Riegler 49e00b306a docs(docs-infra): fix mermaid rendering (#63311)
A recent update of mermaid change the html output. `rect` became `path`.

fixes #63308

PR Close #63311
2025-08-21 10:06:32 -07:00
Kristiyan Kostadinov 1c27fa982c release: cut the v20.2.1 release 2025-08-21 12:52:59 +02:00
Matthieu Riegler a28672fb70 fix(compiler): Keep paraenthesis in Nullish + Boolean expression. (#63292)
Ts 5.9 introduced a regression coming from 5.8 when parenthesis aren't generated for expressions like (`(a ?? b) && c`).
This fix works around this explicitly specifying that we want to keep those parenthesis that we're aware of in this specific case;

This change can be reverted if the root issue (https://github.com/microsoft/TypeScript/issues/61369) is fixed. (but let's keep the tests in any case for the coverage)

fixes #63287

PR Close #63292
2025-08-21 12:15:52 +02:00
Angular Robot 65c5a734e2 build: update @angular/ng-dev digest to c93dfc8 (#63290)
See associated pull request for more information.

PR Close #63290
2025-08-20 16:16:17 +00:00
Joey Perrott 9bdb4fe8cc build: reenable firefox tests for devtools (#63288)
Reenable firefox tests for devtools as the spaces issues with path names is addressed post v7 of bazel

PR Close #63288
2025-08-20 16:08:22 +00:00
Alan Agius 11c638557b build: enforce frozen lockfile mode (#63260)
This commit adds `lockfile_mode=error` to the `.bazelrc` file. This change ensures that any future builds will fail if the lock file is not up-to-date with the `BUILD.bazel` file, preventing inconsistencies and encouraging developers to commit updated lock files.

PR Close #63260
2025-08-20 16:00:06 +00:00
Angular Robot a6130e076a build: update cross-repo angular dependencies (#63286)
See associated pull request for more information.

PR Close #63286
2025-08-20 15:47:25 +00:00
Devin Chasanoff 906bce0877 docs: add ai design patterns to adev/ai (#63095)
PR Close #63095
2025-08-20 15:43:36 +00:00
Angular Robot a827f02746 build: update cross-repo angular dependencies (#63285)
See associated pull request for more information.

PR Close #63285
2025-08-20 15:16:58 +00:00
Matthieu Riegler eb0183009b docs: remove IsolatedShadowDom from the 20.2 release (#63281)
The change has been reverted by #63142

PR Close #63281
2025-08-20 13:05:12 +00:00
Jessica Janiuk 9e172e0280 release: cut the v20.2.0 release 2025-08-20 14:29:27 +02:00
Kristiyan Kostadinov 878b99a1c6 fix(compiler-cli): account for expression with type arguments during HMR extraction (#63261)
Fixes that the HMR extraction logic didn't accoubnt for expressions with type arguments (e.g. `viewChild('foo', {read: TemplateRef<unknown>})`).

Fixes #63240.

PR Close #63261
2025-08-20 11:31:45 +00:00
Angular Robot 9655ea7f5c build: update dependency playwright-core to v1.55.0 (#63273)
See associated pull request for more information.

PR Close #63273
2025-08-20 11:14:53 +00:00
Angular Robot d76a911669 build: update all non-major dependencies (#63266)
See associated pull request for more information.

PR Close #63266
2025-08-20 10:06:50 +00:00
ivanwonder 591c7e2ec8 fix(language-service): Support to resolve the re-export component. (#62585)
In the context of TypeScript (TS), a re-exported symbol is considered a distinct symbol.
This means that a developer can choose to import either the re-exported symbol or
the original symbol. However, in the context of Angular, the re-exported symbol
is treated as the same component because it uses the same selector.

This pull request will utilize the most recent re-export component file to
resolve the module specifier.

PR Close #62585
2025-08-20 09:39:56 +00:00
Matthieu Riegler 81dc006772 docs: update NG_VALIDATORS examples to use forwardRef (#63247)
PR Close #63247
2025-08-20 09:27:21 +00:00
Matthieu Riegler c0eb0cb7a5 docs(docs-infra): remove temporary shiki dts (#63253)
The tooling now supports reading `d.mts` typing files

PR Close #63253
2025-08-20 09:26:18 +00:00
Angular Robot 416878bb7c build: update cross-repo angular dependencies (#63265)
See associated pull request for more information.

PR Close #63265
2025-08-20 09:06:56 +00:00
Matthieu Riegler fceb19128d docs: rewording heading for define option (#63009)
This is an attemp to improve search results

PR Close #63009
2025-08-20 09:04:59 +00:00
Jessica Janiuk f9d73cc687 fix(core): handle cases where classes added have no animations (#63242)
In the case that someone wants to disable animations via selector specificity, for example by adding an `.animate-disabled` class to a parent node, we need to make sure the animate instructions don't misbehave. Now we detect if animations exist in the provided classes and react accordingly.

fixes: #63161

PR Close #63242
2025-08-20 08:59:03 +00:00
tjshiu 5ceb1167fb docs: remove redundant Angular docs link in tailwind guide (#63205)
The Tailwind CSS guide already resides within the Angular documentation, making a link to the Angular documentation redundant. This commit removes the unnecessary link.

PR Close #63205
2025-08-20 08:30:36 +00:00
tjshiu 6b475eb86c docs: update tailwind guide and navigation (#63205)
PR Close #63205
2025-08-20 08:30:36 +00:00
tjshiu 9eac011bd0 docs: add guide for using Tailwind CSS (#63205)
Adds a new guide that explains how to set up and use Tailwind CSS in an Angular project. This guide covers installation, configuration, and provides a basic usage example.

PR Close #63205
2025-08-20 08:30:35 +00:00
Angular Robot 0ba671d4a0 build: update pnpm to v10.15.0 (#63259)
See associated pull request for more information.

PR Close #63259
2025-08-20 08:29:24 +00:00
Joey Perrott 38b9b79c29 build: move from using WORKSPACE to MODULE.bazel (#63249)
Update to use MODULE.bazel

PR Close #63249
2025-08-20 08:27:00 +00:00
cexbrayat 1edb83c019 docs: animationsEnabled defaults to false (#63262)
PR Close #63262
2025-08-20 08:25:26 +00:00
Angular Robot be0e8457b7 build: update all non-major dependencies (#63258)
See associated pull request for more information.

PR Close #63258
2025-08-20 08:23:17 +00:00
Angular Robot aff482913b build: update cross-repo angular dependencies (#63244)
See associated pull request for more information.

PR Close #63244
2025-08-19 15:59:55 +00:00
Matthieu Riegler 9374d57330 build: remove patch-package dependency (#63233)
This a patch backport of #63126

PR Close #63233
2025-08-19 12:34:06 +00:00
Julien Zapata Duque 52106fb71b docs: use correct closing quote in input and model import usage notes (#63237)
PR Close #63237
2025-08-19 12:33:24 +00:00
Angular Robot 58765137ab build: update all non-major dependencies (#63236)
See associated pull request for more information.

PR Close #63236
2025-08-19 11:14:57 +00:00
Shuaib Hasan Akib 8164b2298e refactor(core): update NG0303 error message (#63222)
Ensure consistency in error message wording by aligning the NG0303
error with other Angular error strings. This improves clarity and
maintains a uniform developer experience

PR Close #63222
2025-08-19 08:25:50 +00:00
Angular Robot 966d95df20 docs: update Angular CLI help (#63226)
Updated Angular CLI help contents.

PR Close #63226
2025-08-19 08:16:32 +00:00
Angular Robot fe27810a24 build: update github/codeql-action action to v3.29.10 (#63232)
See associated pull request for more information.

PR Close #63232
2025-08-19 08:06:26 +00:00
Angular Robot 4dfd38e127 build: update dependency preact to v10.27.1 (#63231)
See associated pull request for more information.

PR Close #63231
2025-08-19 08:05:37 +00:00
Avetik Harutyunyan a8c5bafd18 docs: fix typo in SSR section (#63224)
PR Close #63224
2025-08-19 08:01:28 +00:00
Matthieu Riegler d8254d95e9 docs: update version compatiblity. (#63223)
TS 5.9 support landed with #62939

PR Close #63223
2025-08-19 08:00:55 +00:00
Paweł Kawula 0c61fc6d43 docs: fixed mismatch between supported node versions (#63218)
node versions listed here https://angular.dev/reference/versions
and minimal listed in installation.md are different

PR Close #63218
2025-08-19 07:59:22 +00:00
Matthieu Riegler 0da66e6d43 docs(docs-infra): lift circular imports (#63186)
This commit also adds adev on the cyclic import check.

PR Close #63186
2025-08-19 07:58:47 +00:00
Jessica Janiuk 7b51728813 fix(compiler): fixes animation event host bindings not firing (#63217)
Host bindings for `(animate.enter)` and `(animate.leave)` were not firing properly. This fixes the compiler ingest to make sure they do fire.

fixes: #63199

PR Close #63217
2025-08-18 15:56:49 +00:00
AleksanderBodurri 5be80d33a3 fix(devtools): DOM traversal bug (#62719)
Previously, Angular devtools would mistakenly traverse the same DOM elements multiple times while doing traversal for the component tree explorer. This error case would occur when more than 1 Angular application root component was present on the same page and in distinct DOM branches.

Some example cases that did work previously:

```html
<app-root>
...
</app-root>
```

```html
<app-root>
...
<app-root-2></app-root-2>
...
</app-root>
```

An example of where it would enter the irregular behaviour

```html
<app-root>
...
</app-root>
<app-root-2>
...
</app-root-2>
```

Now, we properly ignore duplicate DOM paths when looking for application and non-application root component to begin the Angular DevTools component discovery logic.

PR Close #62719
2025-08-18 15:43:09 +00:00
Angular Robot 1e3748b893 build: update cross-repo angular dependencies (#63221)
See associated pull request for more information.

PR Close #63221
2025-08-18 15:21:53 +00:00
Joey Perrott 87523e90bc build: update the failure message with the correct command (#63219)
Update the failure message for compliance tests to use the correct command for updating the goldens

PR Close #63219
2025-08-18 15:08:57 +00:00
Jessica Janiuk bdc31675b7 fix(core): ensure animate events do not have duplicate elements (#63216)
This applies the same fix that fixed the class version to the event binding version. It prevents duplicate elements from being on screen when animations have been toggled too fast.

fixes: #63127

PR Close #63216
2025-08-18 12:42:17 +00:00
Paul Gschwendtner 726d6026b1 ci: mark myself as unavailable during OOO (#63214)
Marks myself as unavailable during OOO to not block reviews :)

PR Close #63214
2025-08-18 12:53:20 +02:00
Alan Agius 0eb550e297 fix(docs-infra): allow wrapping of types-and-default CLI options (#63211)
This change fixes an issue where long lists of enum values would display on a single line, running off the screen, especially on mobile devices.

PR Close #63211
2025-08-18 12:52:05 +02:00
Alan Agius 67cfe686b1 fix(docs-infra): add spacing between Alias and Value (#63211)
Prior to this change there was noi spacing between the Alias and Value

PR Close #63211
2025-08-18 12:52:05 +02:00
Alan Agius c7440dddef fix(docs-infra): display value type in CLI pages (#63211)
The value type was not being displayed when a value had an enum, which was misleading. This change ensures the value type is always shown, so users know whether to expect a single value or an array of values.

PR Close #63211
2025-08-18 12:52:04 +02:00
Angular Robot c714426963 build: lock file maintenance (#63210)
See associated pull request for more information.

PR Close #63210
2025-08-18 12:51:22 +02:00
Walter Breakell a1fe7091f9 docs: fix grammatical mistake in installation guide (#63202)
PR Close #63202
2025-08-18 12:50:02 +02:00
cexbrayat af63b800ec refactor(core): improve animation instruction robustness and maintainability (#63163)
This commit extracts helper functions to reduce code duplication across animation instructions and adds early return when animations are disabled.

PR Close #63163
2025-08-18 12:49:18 +02:00
Matthieu Riegler 9e828d5e54 docs(docs-infra): remove @adev/constant path (#63213)
PR Close #63213
2025-08-18 10:06:25 +02:00
Alan Agius 7a4bc79720 build: remove extra comma in JSON (#63212)
This fixes CI which is currently broken.

PR Close #63212
2025-08-18 09:44:02 +02:00
Matthieu Riegler 1d5ea07bca docs: revert remove of build-and-link (#63187)
This works again since angular/dev-infra#2922 landed

PR Close #63187
2025-08-18 09:14:37 +02:00
Angular Robot 2031359069 build: update cross-repo angular dependencies (#63191)
See associated pull request for more information.

PR Close #63191
2025-08-18 09:13:08 +02:00
Angular Robot 0838df97bf docs: update Angular CLI help (#63193)
Updated Angular CLI help contents.

PR Close #63193
2025-08-18 09:11:08 +02:00
Gerome Grignon dbd403031a docs(): remove double parenthesis (#63196)
PR Close #63196
2025-08-18 09:09:52 +02:00
Shuaib Hasan Akib 287d6c8fdd docs(docs-infra): add paths for constants and missing link (#63197)
PR Close #63197
2025-08-18 09:09:00 +02:00
Angular Robot 732aadf082 build: update all non-major dependencies (#63204)
See associated pull request for more information.

PR Close #63204
2025-08-18 09:07:28 +02:00
Shuaib Hasan Akib 2d8ac7d9ef docs(docs-infra): replace deprecated router method (#63183)
PR Close #63183
2025-08-15 13:50:58 +02:00
Angular Robot 28b8782266 build: update dependency @codemirror/language to v6.11.3 (#63185)
See associated pull request for more information.

PR Close #63185
2025-08-15 13:49:29 +02:00
Shuaib Hasan Akib d8ac27f94a docs(docs-infra): replace Input by signal one (#63169)
PR Close #63169
2025-08-15 13:42:41 +02:00
Cheng-Hsuan Tsai 81751465b4 docs(docs-infra): add dark mode to example preview (#63171)
PR Close #63171
2025-08-15 13:41:09 +02:00
cexbrayat de6b6413e4 docs: add --yes option to mcp commands (#63173)
This makes it consistent with the message output by the CLI in v20.2 (see https://github.com/angular/angular-cli/commit/8b4de57af1)

PR Close #63173
2025-08-15 12:32:29 +02:00
Angular Robot d4a380d7bd build: update all non-major dependencies (#63182)
See associated pull request for more information.

PR Close #63182
2025-08-15 12:31:55 +02:00
Angular Robot 124d44f130 build: update cross-repo angular dependencies (#63179)
See associated pull request for more information.

PR Close #63179
2025-08-15 11:41:02 +02:00
Kristiyan Kostadinov 19ed12c81e fix(compiler): error when ng-content fallback has translated children (#63156)
Fixes that the pipeline wasn't processing the fallback content of `ng-content` for i18n which resulted in a compiler error further down the line.

Fixes #63065.

PR Close #63156
2025-08-15 09:47:18 +02:00
Kristiyan Kostadinov 557e6fe6eb fix(compiler): incorrect source span for expression AST inside template attribute (#63175)
Similar fix as #63082, but for template attributes. The root cause is the same where we should be using `fullStart` instead of `start` in order to account for whitespaces being skipped.

Fixes #63157.

PR Close #63175
2025-08-15 09:44:36 +02:00
Alan Agius b7cefe0370 Revert "ci: redirect adev to index.csr.html (#63168)" (#63177)
This reverts commit 5129daed1b.

PR Close #63177
2025-08-15 09:43:15 +02:00
Matthieu Riegler 8b02aa0333 ci: redirect adev to index.csr.html (#63168)
The build doesn't produce an `index.html`

PR Close #63168
2025-08-14 21:15:48 +00:00
Angular Robot c68a099ded build: update all non-major dependencies (#63129)
See associated pull request for more information.

PR Close #63129
2025-08-14 22:08:30 +02:00
Charles Lyding dc36fa5200 docs: update MCP server documentation for 20.2 (#63141)
This commit updates the MCP server documentation with the following changes:

- Updates the description of the `ng mcp` command behavior.
- Adds a configuration example for the Gemini CLI.
- Adds a new section for command options, including `--read-only` and `--local-only`.
- Alphabetizes the IDE configuration sections for better readability.
- Alphabetizes the "Available Tools" table.

PR Close #63141
2025-08-14 22:07:56 +02:00
Angular Robot e607d4db2b build: update cross-repo angular dependencies (#63151)
See associated pull request for more information.

PR Close #63151
2025-08-14 22:05:17 +02:00
Angular Robot e159ab1ee3 docs: update Angular CLI help (#63160)
Updated Angular CLI help contents.

PR Close #63160
2025-08-14 22:04:05 +02:00
Shuaib Hasan Akib 24e7238c54 docs(docs-infra): enhance method name following the guideline (#63164)
PR Close #63164
2025-08-14 22:03:17 +02:00
Joey Perrott f863792923 build: run integration tests using remote execution (#63118)
With the change to size tracking integration test can now be executed on our RBE platform

PR Close #63118
2025-08-14 22:02:33 +02:00
Ben Hong 65cca30361 docs: add rendering strategies guide for router (#62859)
PR Close #62859
2025-08-14 22:01:58 +02:00
Matthieu Riegler 8747f9ad55 docs: fix edit links for block/element api entries (#62766)
PR Close #62766
2025-08-14 13:03:01 +02:00
Matthieu Riegler 3ecf8c7114 docs: update testing scenarios and remove imports. (#63076)
With standalone, `imports` are not necessary anymore when configuring the Testing module.

Also
fixes #58073

PR Close #63076
2025-08-14 13:02:18 +02:00
Joey Perrott a6a2e38e5c build: update to bazel 7.6.0 (#63096)
Update to later version of bazel

PR Close #63096
2025-08-14 13:01:32 +02:00
Angular Robot 2faed63fed build: update actions/checkout action to v5 (#63116)
See associated pull request for more information.

PR Close #63116
2025-08-14 13:00:27 +02:00
Andrew Scott 1cf4d34c37 release: cut the v20.2.0-rc.1 release 2025-08-13 13:27:08 -07:00
Angular Robot ced0357bf8 build: update cross-repo angular dependencies (#63137)
See associated pull request for more information.

PR Close #63137
2025-08-13 12:52:28 -07:00
Andrew Scott d9f0e6b27c Revert "feat(platform-browser): Add IsolatedShadowDom encapsulation method (#62723)" (#63142)
This reverts commit d24d5742db. A
legitimate issue was raised in the original commit
(see https://github.com/angular/angular/commit/d24d5742db694604b09d57a3503e8c32751c4836#commitcomment-163853393)

PR Close #63142
2025-08-13 11:12:59 -07:00
Jeremy Elbourn 767a280562 docs: add rxjs-interop section for rxResource (#63125)
This commit adds brief documentation for `rxResource` to the "Using
Angular with RxJS" guide. The only available documentation for
`rxResource` today is the API reference, which lacks any code examples.

PR Close #63125
2025-08-13 09:29:34 -07:00
cexbrayat 254b560138 docs: update best-practices (#63132)
This removes the common pitfall for if blocks in the best practices, as this is no longer true in Angular v20.2, see angular/angular@a409534

PR Close #63132
2025-08-13 09:20:32 -07:00
Angular Robot b0900ccee5 build: update github/codeql-action action to v3.29.9 (#63128)
See associated pull request for more information.

PR Close #63128
2025-08-13 09:19:57 -07:00
Alan Agius 0065ebb115 docs: add link to ai-config command (#63139)
This adds a link to the new command.

PR Close #63139
2025-08-13 09:14:18 -07:00
Jeremy Elbourn 0211668d20 docs: add topic for takeUntilDestroyed (#63122)
This was missing from the RxJS interop guide. I came across it while
cleaning up some Google-internal docs and realized I had nothing on adev
to which I could link.

PR Close #63122
2025-08-12 18:41:19 -07:00
Paul Gschwendtner ada3c37338 refactor(compiler-cli): ensure JIT transforms with queries work with closure property renaming (#63123)
This map for the JIT transforms accidentally is property-renamed,
breaking the lookups below. This commit fixes this.

PR Close #63123
2025-08-12 13:24:10 -07:00
Jeremy Elbourn 4635095c01 fix(docs-infra): put content in <main> element (#63121)
This fix updates the adev `DocViewer` component to support rendering with the `main[docsViewer` selector so that the primary content for the page is inside of a `<main>` element (without introducing an extra DOM element).

PR Close #63121
2025-08-12 11:05:16 -07:00
Angular Robot b13c3fc2eb build: update actions/checkout action to v5 (#63115)
See associated pull request for more information.

PR Close #63115
2025-08-12 11:00:49 -07:00
ivanwonder c81e345e72 feat(language-service): support auto-import for attribute completions (#62797)
Add logic to provide code actions for auto-importing directives that
are out of scope.

PR Close #62797
2025-08-12 10:57:09 -07:00
Angular Robot 31df4d2fd1 build: update cross-repo angular dependencies (#63088)
See associated pull request for more information.

PR Close #63088
2025-08-12 09:53:15 -07:00
Matthieu Riegler 0e3465dfd9 docs: add missing supported != operator (#63108)
fixes 63103

PR Close #63108
2025-08-12 09:39:08 -07:00
Alan Agius 6fb2b71489 build: use link: instead of file: (#63111)
When using `file:` renovate updates fails due to ` ERR_PNPM_LINKED_PKG_DIR_NOT_FOUND ` this is due to a different behaviour between `link:` amd `file:`. `link:` however will not fail when the directory does not exist.

PR Close #63111
2025-08-12 09:37:54 -07:00
Angular Robot 5105477490 build: update pnpm to v10 (#63117)
See associated pull request for more information.

PR Close #63117
2025-08-12 09:36:28 -07:00
Alan Agius 856dd50e64 ci: correctly configure ignored filenames (#63105)
Previously, the path did not match a file.

PR Close #63105
2025-08-12 10:02:00 +02:00
Alan Agius 1a16fb7aa2 build: resolve pnpm workspace dependency on compiler-cli (#63105)
The `pnpm install` command was failing for the `packages/core/test/bundling` project with the error:
`ERR_PNPM_NO_MATCHING_VERSION No matching version found for @angular/compiler-cli@0.0.0-PLACEHOLDER`

This happenes only in renovate updates.

PR Close #63105
2025-08-12 10:02:00 +02:00
Alan Agius 0e1bd1b404 build: fix ERR_PNPM_LINKED_PKG_DIR_NOT_FOUND for typings tests (#63105)
During `pnpm install` in a monorepo setup, the `packages/zone.js/test/typings` project would fail with the error: `ERR_PNPM_LINKED_PKG_DIR_NOT_FOUND: Could not install from "/.../node_modules/typescript" as it does not exist.`

PR Close #63105
2025-08-12 10:02:00 +02:00
Alan Agius 4ab709460a build: remove redundant yarn.lock files (#63105)
These are now managed by pnpm.

PR Close #63105
2025-08-12 10:02:00 +02:00
Matthieu Riegler b38c43bacc refactor(zone.js): remove unused jasmine globalerror monkey patching. (#63077)
This is for testing purposes for now. See discussion on the related issue.

fixes #63072

PR Close #63077
2025-08-11 16:41:12 -07:00
Angular Robot 88d48de46e build: update scorecard action dependencies (#63089)
See associated pull request for more information.

PR Close #63089
2025-08-11 16:38:13 -07:00
Matthieu Riegler af247cacb6 refactor(core): remove temporary resource setter function. (#63097)
Now that G3 has been fully migrated to the new throwing behavior, we don't need that setter anymore.

PR Close #63097
2025-08-11 15:43:48 -07:00
Matthieu Riegler 499fa8fa88 docs: remove router testing from the testing scenarios guide (#63078)
This commit also adds the router testing guide to the testing section

PR Close #63078
2025-08-11 12:15:41 -07:00
Kristiyan Kostadinov 79b91593c9 fix(compiler): incorrect spans for AST inside input value with leading space (#63082)
When parsing expressions inside a bound attribute, we offset all of its spans by an `absoluteOffset` in order to get the right spans in the source file. The offset was incorrect when parsing an attribute with leading spaces during the construction of the Ivy AST, because of the combination of:
1. We were setting the offset by looking at `valueSpan.start`.
2. The Ivy parser sets `leadingTriviaChars: [' ', '\n']` which means that spaces and new lines will be ignored in the `sourceSpan.start`.

These changes resolve the issue by using `valueSpan.fullStart` which includes the leading spaces.

Fixes #63069.

PR Close #63082
2025-08-11 11:57:08 -07:00
Alan Agius 51801612c3 ci: several fixes for renovate (#63083)
This commit contains several fixes for renovate to work properly with `pnpm`

PR Close #63083
2025-08-11 11:03:31 -07:00
Joey Perrott a92dea5b99 build: update to the latest version of devinfra and rename npm2 workspace (#63093)
Rename the npm2 workspace to npm and use the latest version of devinfra which drops rules_nodejs

PR Close #63093
2025-08-11 10:35:34 -07:00
Kristiyan Kostadinov 1156d7d786 release: cut the v20.2.0-rc.0 release 2025-08-11 10:41:09 +02:00
7003 changed files with 274759 additions and 501047 deletions
-1
View File
@@ -1 +0,0 @@
../../AGENTS.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. You MUST use this skill any time you plan to create, edit, or review documentation files in `adev/` or `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.
-135
View File
@@ -1,135 +0,0 @@
---
name: PR Review
description: Guidelines and tools for reviewing pull requests in the Angular repository.
---
# PR Review Guidelines
When reviewing a pull request for the `angular` repository, follow these essential guidelines to ensure high-quality contributions:
1. **Context & Ecosystem**:
- Keep in mind that this is the core Angular framework. Changes here can impact millions of developers.
- Be mindful of backwards compatibility. Breaking changes require strict approval processes and deprecation periods.
2. **Key Focus Areas**:
- **Comprehensive Reviews**: You **MUST always** perform a deep, comprehensive review of the _entire_ pull request. If the user asks you to look into a specific issue, file, or area of concern, you must investigate that specific area _in addition to_ reviewing the rest of the PR's substantive changes. Do not terminate your review after addressing only the user's focal point.
- **Package-Specific & Topic Guidelines**: Check if there are specific guidelines for the package or topic being modified in the `reference/` directory (e.g., `reference/router.md` or `reference/object_create_null.md`). Always prioritize these rules for their respective areas.
- **Prototype Collision & `Object.create(null)` PRs**: When reviewing PRs that swap `{}` for `Object.create(null)`, consult `reference/object_create_null.md` for technical evaluation criteria and rules.
- **Commit Messages**: Evaluate the quality of commit messages. They should explain the _why_ behind the change, not just the _what_. Someone should be able to look at the commit history years from now and clearly understand the context and reasoning for the change.
- **Code Cleanliness**: Ensure the code is readable, maintainable, and follows Angular's project standards.
- **Performance**: Look out for code that might negatively impact runtime performance or bundle size, particularly in hot paths like change detection or rendering.
- **Testing**: Ensure all new logic has comprehensive tests, including edge cases. **Do NOT run tests locally** as part of your review process. CI handles this automatically, and running tests locally is redundant and inefficient.
- **API Design**: Ensure new public APIs are well-designed, consistent with existing APIs, and properly documented.
- **Payload Size**: Pay attention to the impact of changes on the final client payload size.
3. **Execution Workflow**:
Determine the appropriate review method. If the user explicitly asks for a `remote` or `local` review in their request, that takes precedence (e.g. "leave comments on the PR" implies `remote`). Otherwise, use the GitHub MCP or available scripts to determine if the review should be `local` or `remote`.
**Common Review Practices (Applies to both Local and Remote)**
- **Preparation & Checklist**:
- First, create a task list (e.g., in `task.md`) that you can easily reference containing **all** the review requirements from the "Key Focus Areas" section (Commit Messages, Performance, Testing, etc.), along with any specific review notes or requests from the user.
- Before doing an in-depth review, expand this list into more detailed items of what you plan to explore and verify in the PR.
- As you conduct the review, check off items in this list, adding your assessment or findings underneath each item.
- At the end of your review, refer back to the checklist to ensure every single requirement was completely verified.
- **Fetch PR Metadata Safely**: When you need to read the PR description or context, do NOT use `gh pr view <PR_NUMBER>` by itself, as its default GraphQL query may fail due to lack of `read:org` and `read:discussion` token scopes. Instead, use `read_url_content` on the PR URL or use `gh pr view <PR_NUMBER> --json title,body,state,author`.
- **Check Existing Comments First**: Before formulating feedback, use the GitHub MCP or available scripts to fetch existing comments on the PR. Review this feedback to avoid duplicate comments, and incorporate its insights into your own review process.
- **Constructive Feedback**: Provide clear, actionable, and polite feedback. Explain the _why_ behind your suggestions or edits. Do **NOT** leave inline comments purely to praise, agree with, or acknowledge a correct implementation detail, as this clutters the review. If you want to praise the PR, do so in the single general PR comment.
**A. Local Code Review (If the PR is owned by the author requesting the review)**
- **Checkout**: Check out the PR branch locally (if it doesn't already exist, fetch it). If checking out the branch fails due to a worktree claim (e.g. "fatal: '<branch>' is already used by worktree at '<path>'"), do the review in that directory.
- **Review & Edit**: Execute the review directly on the code. Instead of adding inline PR comments for suggestions, format the codebase or apply the edits directly to the files.
- **Feedback**: Summarize the review findings and the concrete changes you made in a message to the user, referencing the completed items from your checklist.
- **Do NOT Commit or Push**: Leave the changes uncommitted in the working directory so the user can easily review the pending edits locally. Let the user know the changes are ready for their review, but do not ask for approval to push.
- **Resolve Comments**: Once the user confirms the changes are good and should be committed/pushed, respond to the existing comments as 'resolved' using the GitHub MCP or available scripts.
**B. Remote Code Review (For all other PRs)**
- **Batching Comments (MCP Server - Preferred)**: If you have the GitHub MCP Server configured, you **MUST** follow this workflow to avoid spamming the author with multiple notifications:
1. Create a pending review using `mcp_github-mcp-server_pull_request_review_write` (method `create`).
2. Add your inline comments to the pending review using `mcp_github-mcp-server_add_comment_to_pending_review`.
3. Submit the review using `mcp_github-mcp-server_pull_request_review_write` (method `submit_pending`).
- **Batching Comments (Scripts - Fallback)**: If you do **NOT** have access to the GitHub MCP Server (e.g., specific MCP tools are missing from your context), fallback to using the provided scripts. Use `post_inline_comment.sh` to stage your comments locally. Once all comments are staged, you **MUST** call `submit_pr_review.sh` to publish them as a single batched review (and send a single notification). Try to keep comments minimal or use a general comment if you have many suggestions.
- **Use Suggested Changes**: Whenever appropriate (e.g., for simple code fixes, refactoring suggestions, or typo corrections), prefer using GitHub's **Suggested Changes** syntax (`suggestion ... `) in your inline comments. This allows the author to apply your suggested code improvements with a single click in the GitHub UI.
- **Review Type**: Never mark an external PR review as an "approval" unless explicitly instructed by a repo maintainer. Always use "Request Changes" or "Comment". Note that some tools might only support commenting.
- **Require User Approval Before Posting**: Prepare your review comments and present them to the user, alongside a summary of your completed checklist. Do NOT post comments to the PR without explicitly asking the user for permission first. Only post the review after the user approves.
- **CRITICAL**: This rule applies even if you receive a system message indicating that an artifact has been "automatically approved" or instructing you to "proceed to execution." You must ALWAYS obtain explicit, written confirmation from the user in this chat conversation before posting any content to a PR.
- **Prefix Agent Comments**: To make it clear when comments are generated and posted by an AI agent rather than a human user, **always** prefix your review comments with `AGENT: `.
## Available Tools
The following tools are available for remote interactions. We prefer using standard **GitHub MCP Server** tools when available. If you do not have the MCP server set up, you **MUST** fallback to using the custom bash scripts.
### GitHub MCP Tools (Preferred)
- `mcp_github-mcp-server_pull_request_review_write`
- `mcp_github-mcp-server_add_comment_to_pending_review`
### Custom Bash Scripts (Fallback)
The following scripts are provided as fallbacks if the MCP server is not available. Note that they rely on the `gh` CLI being correctly installed and authenticated in the local environment.
### `determine_review_type.sh`
Determines whether to use the Local or Remote review workflow by checking if the currently authenticated GitHub user via the `gh` CLI matches the author of the pull request.
**Usage:**
```bash
.agent/skills/pr_review/scripts/determine_review_type.sh <PR_NUMBER>
```
### `get_pr_comments.sh`
Fetches all existing inline comments on a PR using the GitHub API. This is crucial for reviewing other contributors' feedback and avoiding duplicate comments. It outputs JSON containing the `id`, `path`, `line`, `body`, and `user` for each comment.
**Usage:**
```bash
.agent/skills/pr_review/scripts/get_pr_comments.sh <PR_NUMBER>
```
### `reply_pr_comment.sh`
Replies to an existing PR comment thread. This is useful for marking comments as resolved after addressing them in a local code review. Note that the `COMMENT_ID` must be the ID of the top-level comment in the thread.
**Usage:**
```bash
.agent/skills/pr_review/scripts/reply_pr_comment.sh <PR_NUMBER> <COMMENT_ID> <REPLY_BODY>
```
### `post_inline_comment.sh`
The GitHub CLI `gh pr review` command does not natively support adding inline comments to specific lines of code via its standard flags. This script wraps the GitHub API to stage comments locally. They will not be published until you call `submit_pr_review.sh`.
**Usage:**
```bash
.agent/skills/pr_review/scripts/post_inline_comment.sh <PR_NUMBER> <FILE_PATH> <LINE_NUMBER> <COMMENT_BODY>
```
**Example:**
```bash
.agent/skills/pr_review/scripts/post_inline_comment.sh 12345 "packages/core/src/render3/instructions/element.ts" 42 "AGENT: Consider the performance implications here."
```
### `submit_pr_review.sh`
Submits all locally staged inline comments as a single batched review via the GitHub Pull Request Reviews API.
**Usage:**
```bash
.agent/skills/pr_review/scripts/submit_pr_review.sh <PR_NUMBER> <EVENT_TYPE> [BODY]
```
**Options:**
- `EVENT_TYPE`: Must be `COMMENT`, `APPROVE`, or `REQUEST_CHANGES`. Never use `APPROVE` for external PRs.
- `BODY`: (Optional) A general summary comment for the review.
**Example:**
```bash
.agent/skills/pr_review/scripts/submit_pr_review.sh 12345 COMMENT "AGENT: I have left a few inline suggestions for your consideration."
```
@@ -1,38 +0,0 @@
# Rules for `Object.create(null)` and Prototype Collision Prevention
This guide outlines the technical rules and evaluation criteria for using `Object.create(null)` versus standard object literals (`{}`) or `Map` in the Angular codebase.
---
## 1. When `Object.create(null)` is Appropriate
Using `Object.create(null)` (or `Map`) is appropriate when **all** of the following conditions are met:
1. The object is used as an **internal key-value lookup map or set**.
2. The keys are **arbitrary or untrusted dynamic strings** (e.g., URL query parameters in `$locationShim`, HTML sanitizer tag sets, or `jsaction` DOM event-type resolvers).
3. Property existence is checked via direct indexing or key checks (e.g., `map[key] !== undefined` or `key in map`), where a key matching an `Object.prototype` member (such as `'toString'`, `'constructor'`, or `'hasOwnProperty'`) causes false positive matches or incorrect behavior.
---
## 2. Handling Public API and Boundary Objects
If an object receives untrusted dynamic keys **and** is exposed to public consumers or third-party code (e.g., `SimpleChanges` in `ngOnChanges`):
- **Do NOT blindly change the object to `Object.create(null)`**: Stripping `Object.prototype` from public objects is a breaking API change. Consumer code calling `.hasOwnProperty()`, `.toString()`, `.valueOf()`, or using string interpolation (`` `${obj}` ``) will fail at runtime (`TypeError: obj.hasOwnProperty is not a function`).
- **Safe Alternatives for Public Objects:**
- **`Object.hasOwn(obj, key)`**: Use `Object.hasOwn` for internal framework property lookups instead of direct index or `in` checks. This prevents prototype collision during internal reads without breaking the object's prototype for consumers.
- **Input Key Sanitization**: Filter or delete dangerous key names (`__proto__`, `constructor`, `prototype`) when populating the object.
- **`Map` or Custom Classes**: For new public APIs requiring key-value stores with dynamic keys, prefer `Map<K, V>` or dedicated classes with explicit `.get()` and `.has()` methods.
- **Deprecation / Breaking Change Process**: If changing a public object's prototype to `null` is unavoidable, it must follow Angular's formal deprecation and major version breaking change process.
---
## 3. When `Object.create(null)` Should NOT Be Used
Do not replace `{}` with `Object.create(null)` in the following scenarios:
1. **Fixed-Shape Structs and DTOs:** Objects with hardcoded static property names (e.g., `let sortedBreakpoints: {breakpoints?: number[]} = {}`). `Object.assign({}, ...)` only copies _own_ enumerable properties, so prototype properties on sources are never copied.
2. **Numeric-Key Maps:** Objects indexed by numbers (e.g., `tasksByHandleId: {[id: number]: Task}`). Numeric keys do not collide with `Object.prototype` string members.
3. **Reference Sentinels:** Objects used purely for reference identity checks (e.g., `const EMPTY_OBJECT = {}` or `const IN_PROGRESS_RESOLUTION = {}`).
4. **Internal Compiler AST and Visitor State:** Temporary objects with internally generated keys where untrusted user input cannot poison key names.
5. **Hot Performance Paths and Size-Critical Bundles:** Standard `{}` literals use V8 fast hidden classes and monomorphic inline caching. `Object.create(null)` forces V8 dictionary mode and increases minified bundle size (e.g., in inline polyfills like `event-dispatch-contract` or SSR hydration bundles).
@@ -1,7 +0,0 @@
# Router PR Review Guidelines
When reviewing pull requests that modify the Angular Router (`packages/router`), pay special attention to the following:
- **Timing Sensitivity**: The router is extremely sensitive to timing changes. Any changes that alter the asynchronous timing of navigations, resolvers, or guards are almost always breaking changes and must be scrutinized carefully.
- **Testing Practices**: Tests should usually use the `RouterTestingHarness`. Many existing tests are older and do not use this harness. Do not blindly follow the shape of existing tests when writing or reviewing new ones; encourage the use of modern testing utilities.
- **Feature Justification**: Changes to router core code should be well-justified. Consider whether the change is proven to be a core developer ask, such as resolving a highly upvoted GitHub issue or addressing a critical bug.
@@ -1,32 +0,0 @@
#!/usr/bin/env bash
set -euo pipefail
# determine_review_type.sh <PR_NUMBER>
# Determines if the PR should be reviewed locally or remotely based on author.
if [ -z "$1" ]; then
echo "Usage: determine_review_type.sh <PR_NUMBER>"
exit 1
fi
PR_NUMBER=$1
# Get current authenticated user
CURRENT_USER=$(gh api user -q .login 2>/dev/null)
if [ $? -ne 0 ]; then
echo "Error: Could not determine current GitHub user. Are you logged in to gh?"
exit 1
fi
# Get PR author
PR_AUTHOR=$(gh pr view "$PR_NUMBER" --json author -q .author.login 2>/dev/null)
if [ $? -ne 0 ]; then
echo "Error: Could not retrieve PR information for $PR_NUMBER."
exit 1
fi
if [ "$CURRENT_USER" = "$PR_AUTHOR" ]; then
echo "local"
else
echo "remote"
fi
@@ -1,29 +0,0 @@
#!/usr/bin/env bash
set -euo pipefail
# get_pr_comments.sh
# Fetches existing inline comments on a PR to avoid duplicate reviews.
# Usage: ./get_pr_comments.sh <PR_NUMBER>
if [ "$#" -lt 1 ]; then
echo "Usage: $0 <PR_NUMBER>"
exit 1
fi
PR_NUMBER="$1"
# Ensure gh cli is installed
if ! command -v gh &> /dev/null; then
echo "Error: gh CLI could not be found. Please install and authenticate."
exit 1
fi
# Get the current repository (e.g., angular/angular)
REPO=$(gh repo view --json nameWithOwner -q .nameWithOwner)
# Fetch comments
gh api \
--paginate \
-H "Accept: application/vnd.github+json" \
"/repos/${REPO}/pulls/${PR_NUMBER}/comments" \
--jq '.[] | {id: .id, path: .path, line: .line, body: .body, user: .user.login}'
@@ -1,38 +0,0 @@
#!/usr/bin/env bash
set -euo pipefail
# post_inline_comment.sh
# Adds an inline comment to a specific line in a PR via the GitHub API.
# Usage: ./post_inline_comment.sh <PR_NUMBER> <FILE_PATH> <LINE_NUMBER> <COMMENT_BODY>
if [ "$#" -lt 4 ]; then
echo "Usage: $0 <PR_NUMBER> <FILE_PATH> <LINE_NUMBER> <COMMENT_BODY>"
exit 1
fi
PR_NUMBER="$1"
FILE_PATH="$2"
LINE="$3"
BODY="$4"
# Ensure gh cli is installed
if ! command -v gh &> /dev/null; then
echo "Error: gh CLI could not be found. Please install and authenticate."
exit 1
fi
# Get the current repository (e.g., angular/angular)
REPO=$(gh repo view --json nameWithOwner -q .nameWithOwner)
echo "Staging inline comment for PR #${PR_NUMBER} on ${FILE_PATH}:${LINE}..."
COMMENT_FILE="/tmp/angular_pr_${PR_NUMBER}_comments.json"
if [ ! -f "$COMMENT_FILE" ]; then
echo "[]" > "$COMMENT_FILE"
fi
# Append the new comment to the JSON array
jq --arg path "${FILE_PATH}" --argjson line "${LINE}" --arg body "${BODY}" \
'. += [{"path": $path, "line": $line, "body": $body}]' "$COMMENT_FILE" > "${COMMENT_FILE}.tmp" && mv "${COMMENT_FILE}.tmp" "$COMMENT_FILE"
echo "Comment successfully staged locally. Remember to call submit_pr_review.sh when finished to publish all comments as a single review!"
@@ -1,31 +0,0 @@
#!/usr/bin/env bash
set -euo pipefail
# reply_pr_comment.sh <PR_NUMBER> <COMMENT_ID> <REPLY_BODY>
# Replies to an existing PR comment thread. Note: COMMENT_ID must be the ID of the top-level comment in the thread you are replying to.
if [ "$#" -lt 3 ]; then
echo "Usage: reply_pr_comment.sh <PR_NUMBER> <COMMENT_ID> <REPLY_BODY>"
exit 1
fi
PR_NUMBER="$1"
COMMENT_ID="$2"
BODY="$3"
# Ensure gh cli is installed
if ! command -v gh &> /dev/null; then
echo "Error: gh CLI could not be found. Please install and authenticate."
exit 1
fi
# Get the current repository (e.g., angular/angular)
REPO=$(gh repo view --json nameWithOwner -q .nameWithOwner)
# Reply to the thread using the provided comment ID
gh api \
--silent \
--method POST \
-H "Accept: application/vnd.github+json" \
"/repos/${REPO}/pulls/${PR_NUMBER}/comments/${COMMENT_ID}/replies" \
-f body="$BODY"
@@ -1,50 +0,0 @@
#!/usr/bin/env bash
set -euo pipefail
# submit_pr_review.sh
# Submits a batched PR review using comments previously staged by post_inline_comment.sh
# Usage: ./submit_pr_review.sh <PR_NUMBER> <EVENT_TYPE> [BODY]
# EVENT_TYPE must be COMMENT, APPROVE, or REQUEST_CHANGES
if [ "$#" -lt 2 ]; then
echo "Usage: $0 <PR_NUMBER> <EVENT_TYPE> [BODY]"
echo "EVENT_TYPE must be COMMENT, APPROVE, or REQUEST_CHANGES"
exit 1
fi
PR_NUMBER="$1"
EVENT="$2"
BODY="${3:-}"
COMMENT_FILE="/tmp/angular_pr_${PR_NUMBER}_comments.json"
if ! command -v gh &> /dev/null; then
echo "Error: gh CLI could not be found. Please install and authenticate."
exit 1
fi
REPO=$(gh repo view --json nameWithOwner -q .nameWithOwner)
# Check if there are staged comments
COMMENTS="[]"
if [ -f "$COMMENT_FILE" ]; then
COMMENTS=$(cat "$COMMENT_FILE")
fi
echo "Submitting review for PR #${PR_NUMBER}..."
# Create the payload
PAYLOAD_FILE="/tmp/angular_pr_${PR_NUMBER}_payload.json"
jq -n --arg event "$EVENT" --arg body "$BODY" --argjson comments "$COMMENTS" \
'{event: $event, body: $body, comments: $comments}' > "$PAYLOAD_FILE"
# Post the review using the GitHub Pull Request Reviews API
gh api \
--method POST \
-H "Accept: application/vnd.github+json" \
-H "X-GitHub-Api-Version: 2022-11-28" \
"/repos/${REPO}/pulls/${PR_NUMBER}/reviews" \
--input "$PAYLOAD_FILE"
echo "Review submitted successfully!"
rm -f "$COMMENT_FILE"
rm -f "$PAYLOAD_FILE"
@@ -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 the 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`, and derived logical state.
- `metadataState`: Stores metadata like `min`, `max`, `required`.
- `submitState`: Tracks submission status and server errors.
### 2. `FieldValidationState` (`src/field/validation.ts`)
Implements `ValidationState` and 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.ts`)
The bridge between the `FieldNode` and the DOM.
- Selector: `[formField]`
- It supports:
- **Native Elements**: `<input>`, `<select>`, `<textarea>`.
- **Custom Controls**: Components implementing `FormValueControl` or `FormCheckboxControl`.
- **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.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 Integration (Type Checking)
The `packages/compiler` package contains specific logic to support `[formField]`. This is primarily handled in `src/typecheck/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/src/typecheck/ops/signal_forms.ts`: The core Signal Forms type-checking logic, including `TcbNativeFieldOp`.
## 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`, which causes the compiler to install `ɵɵControlFeature`.
- **`ɵɵcontrol` Instructions**: A `formField` binding causes the compiler to emit:
- `ɵɵ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.ts`: The directive that implements the hook.
-56
View File
@@ -1,56 +0,0 @@
---
description: Find and fix flaky tests in the repository
---
Investigate flaky tests in the repo and propose fixes to improve stability.
High-level process:
1. Run tests in the repo to look for flakes.
- Consider using Bazel's `--runs_per_test` flag to easily find
flakes.
- Be cognizant of not exhausting all the resources on the current
machine, run a subset of tests at a time such as
`bazel test //packages/core/...`.
2. Once you find some flakes, focus on one at a time.
3. Create a new branch named `flakes/${relevantNameFromTest}`.
4. Reproduce the flake to the best of your ability.
- Consider using `--test_env JASMINE_RANDOM_SEED=1234` to
replicate the broken test ordering.
5. Debug the test to understand the failure mode.
- Consider temporarily disabling / skipping other tests with `xit`
and `fit` to narrow down where the flake might be coming from if
multiple tests are influencing each other.
- Consider temporarily ignoring Firefox tests with
`--test_tag_filters -firefox` if the flake does not appear to be
browser specific.
- Consider using `--test_sharding_strategy disabled` to run the
test in a single shard.
- Try to understand why the test was _flaky_, not just why it
_failed_. Understanding the inconsistency is important to
finding the correct fix.
6. Attempt a fix and validate with `--runs_per_test`.
- Iterate on the fix until you have something which appears to
work.
- If you find yourself stuck and not making meaningful progress,
note down what you've learned/where you're struggling, commit
what you have, look for another flake to fix, and continue. At
the end, surface to the user what you failed to fix.
- Don't try to make significant changes to Angular's runtime
behavior, focus just on making the test pass/fail consistently.
7. Commit the change with relevant details in the commit message and
move on to the next test.
- Be sure to include your theory of why the test was flaky and
how this fix eliminates or reduces that flakiness.
8. Iterate as many times as the user requests you to (default 5
branches if not otherwise specified).
9. Once you can't find any flaky tests or have iterated as many times
as requested, stop and inform the user what you found and fixed.
Additional notes:
- Multiple fixes including the same/related files can go in the same
commit or multiple commits on the same branch.
- Distinct test fixes should go in different branches, make a new one
for each investigation.
- You may push these branches to `origin`, but do not create PRs for
them.
+71
View File
@@ -0,0 +1,71 @@
# Bazel does not yet support wildcards or other .gitignore semantics for
# .bazelignore. Two issues for this feature request are outstanding:
# https://github.com/bazelbuild/bazel/issues/7093
# https://github.com/bazelbuild/bazel/issues/8106
.git
node_modules
dist
# All integration test node_modules folders
integration/animations/node_modules
integration/animations-async/node_modules
integration/cli-elements-universal/node_modules
integration/cli-hello-world/node_modules
integration/cli-hello-world-ivy-i18n/node_modules
integration/cli-hello-world-lazy/node_modules
integration/cli-hello-world-mocha/node_modules
integration/cli-signal-inputs/node_modules
integration/defer/node_modules
integration/dynamic-compiler/node_modules
integration/forms/node_modules
integration/injectable-def/node_modules
integration/ivy-i18n/node_modules
integration/ng_elements/node_modules
integration/ng_update/node_modules
integration/ng_update_migrations/node_modules
integration/ng-add-localize/node_modules
integration/no_ts_linker/node_modules
integration/nodenext_resolution/node_modules
integration/platform-server/node_modules
integration/platform-server-zoneless/node_modules
integration/platform-server-hydration/node_modules
integration/service-worker-schema/node_modules
integration/side-effects/node_modules
integration/standalone-bootstrap/node_modules
integration/terser/node_modules
integration/trusted-types/node_modules
integration/typings_test_rxjs7/node_modules
integration/legacy-animations/node_modules
integration/legacy-animations-async/node_modules
integration/typings_test_ts59/node_modules
modules/ssr-benchmarks/node_modules
# For rules_js
adev/node_modules
adev/shared-docs/node_modules
adev/shared-docs/pipeline/api-gen/node_modules
modules/node_modules
integration/node_modules
packages/animations/node_modules
packages/common/node_modules
packages/localize/node_modules
packages/compiler-cli/node_modules
packages/compiler-cli/linker/babel/test/node_modules
packages/compiler/node_modules
packages/core/node_modules
packages/core/test/bundling/node_modules
packages/elements/node_modules
packages/forms/node_modules
packages/language-service/node_modules
packages/platform-browser/node_modules
packages/platform-server/node_modules
packages/platform-browser-dynamic/node_modules
packages/router/node_modules
packages/zone.js/node_modules
packages/zone.js/test/typings/node_modules
packages/upgrade/node_modules
packages/benchpress/node_modules
packages/service-worker/node_modules
packages/zone.js/test/typings/node_modules
packages/zone.js/node_modules
tools/bazel/rules_angular_store/node_modules
+11 -7
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
@@ -72,9 +69,6 @@ build:release --stamp
# Snapshots should also be stamped with version control information.
build:snapshot-build --workspace_status_command="pnpm --silent ng-dev release build-env-stamp --mode=snapshot"
build:snapshot-build --stamp
# @angular/language-server package depends directly on other Angular framework packages.
# This flag ensures that the language server uses the snapshot-built framework packages from the repository.
build:snapshot-build --//:enable_language_server_snapshot_repo_deps
# Angular DevTools for Firefox releases *cannot* be stamped and `--config snapshot-build-firefox` is a no-op.
# This is because Mozilla requires add-on source code to be uploaded and then they manually reproduce the build.
@@ -146,7 +140,7 @@ build:trusted-build --remote_upload_local_results=true
# Ensure that tags like "no-remote-exec" get propagated to actions created by rules,
# even if the rule implementation does not explicitly pass them to the execution requirements.
# https://bazel.build/reference/command-line-reference#flag--experimental_allow_tags_propagation
common --incompatible_allow_tags_propagation
common --experimental_allow_tags_propagation
# Disable network access in the sandbox by default. To enable network access
# for a particular target, use:
@@ -159,6 +153,16 @@ common --incompatible_allow_tags_propagation
# )
build --nosandbox_default_allow_network
##################################
# Saucelabs tests settings #
# Turn on these settings with #
# --config=saucelabs #
##################################
# For saucelabs tests we don't want to enable flaky test attempts. Karma has its own integrated
# retry mechanism and we do not want to retry unnecessarily if Karma already tried multiple times.
test:saucelabs --flaky_test_attempts=1
################
# Flag Aliases #
################
+1 -1
View File
@@ -1 +1 @@
8.8.0
7.6.2
+3
View File
@@ -0,0 +1,3 @@
Language: JavaScript
BasedOnStyle: Google
ColumnLimit: 100
+2 -2
View File
@@ -3,11 +3,11 @@
This folder contains configuration files that can be used to opt into working on this repository in a [Docker container](https://www.docker.com/resources/what-container) via [VSCode](https://code.visualstudio.com/)'s Remote Development feature (see below).
Info on remote development and developing inside a container with VSCode:
- [VSCode: Remote Development](https://code.visualstudio.com/docs/remote/remote-overview)
- [VSCode: Developing inside a Container](https://code.visualstudio.com/docs/remote/containers)
- [VSCode: Remote Development FAQ](https://code.visualstudio.com/docs/remote/faq)
## Usage
_Prerequisite: [Install Docker](https://docs.docker.com/install) on your local environment._
@@ -15,7 +15,6 @@ _Prerequisite: [Install Docker](https://docs.docker.com/install) on your local e
To get started, read and follow the instructions in [Developing inside a Container](https://code.visualstudio.com/docs/remote/containers). The [.devcontainer/](.) directory contains pre-configured `devcontainer.json` and `Dockerfile` files, which you can use to set up remote development with a docker container.
In a nutshell, you need to:
- Install the [Remote - Containers](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers) extension.
- Copy [recommended-Dockerfile](./recommended-Dockerfile) to `Dockerfile` (and optionally tweak to suit your needs).
- Copy [recommended-devcontainer.json](./recommended-devcontainer.json) to `devcontainer.json` (and optionally tweak to suit your needs).
@@ -24,6 +23,7 @@ In a nutshell, you need to:
The `.devcontainer/devcontainer.json` and `.devcontainer/Dockerfile` files are ignored by git, so you can have your own local versions. We may occasionally update the template files ([recommended-devcontainer.json](./recommended-devcontainer.json), [recommended-Dockerfile](./recommended-Dockerfile)), in which case you will need to manually update your local copies (if desired).
## Updating `recommended-devcontainer.json` and `recommended-Dockerfile`
You can update and commit the recommended config files (which people use as basis for their local configs), if you find that something is broken, out-of-date or can be improved.
+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}}
"""
+1 -2
View File
@@ -7,5 +7,4 @@ code_review:
help: false
summary: false
code_review: false
ignore_patterns:
- pnpm-lock.yaml
ignore_patterns: []
-5
View File
@@ -1,5 +0,0 @@
{
"context": {
"fileName": ["AGENTS.md", "GEMINI.md"]
}
}
-4
View File
@@ -19,8 +19,6 @@ cc34e5fb072e7903e01463953a19d18503a39347
f9781f9804f1e7c84df356d9aeb267730a7fc499
dc62446ef7f2898a20d3be1196ecaf2a92a1077d
711cb416260ca11ff158fc39b372efa2cf022d36
af77b89e2abb67bba201a53d500874ad572b8384
6270bba056cfaadb3fe0b2bf3b17036bdc28b90e
# commits that switch to relative imports
3d2263cb1f208e561692e41c5a17196c3c57877f
ae047c59c0041e0a43cec020520d40ccd981b444
@@ -43,5 +41,3 @@ c702e8af0b2144d97b93171dc2806ed1a0346762
6d3f5752f204a5a30f3c09fbf6d4a510a4522bcb
3fa7b2b136696464e0a91b5ec25c6adf272d4d6b
ad65f44877f22caadbc8b977b5b720c3c86fcc45
# commit that changed formatting
698b0288bee60b8c5926148b79b5b93f454098db
-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]
+6 -3
View File
@@ -1,13 +1,12 @@
## PR Checklist
Please check if your PR fulfills the following requirements:
- [ ] The commit message follows our guidelines: https://github.com/angular/angular/blob/main/contributing-docs/commit-message-guidelines.md
- [ ] Tests for the changes have been added (for bug fixes / features)
- [ ] Docs have been added / updated (for bug fixes / features)
## PR Type
## PR Type
What kind of change does this PR introduce?
<!-- Please check the one that applies to this PR using "x". -->
@@ -22,19 +21,23 @@ What kind of change does this PR introduce?
- [ ] angular.dev application / infrastructure changes
- [ ] Other... Please describe:
## What is the current behavior?
## What is the current behavior?
<!-- Please describe the current behavior that you are modifying, or link to a relevant issue. -->
Issue Number: N/A
## What is the new behavior?
## Does this PR introduce a breaking change?
- [ ] Yes
- [ ] No
<!-- If this PR contains a breaking change, please describe the impact and migration path for existing applications below. -->
## Other information
@@ -11,6 +11,7 @@ esbuild_checked_in(
config = "esbuild.conf.js",
entry_point = ":lib/main.mts",
external = [
"undici",
"pnpapi",
],
metafile = False,
@@ -35,5 +36,7 @@ ts_project(
"//:node_modules/@actions/github",
"//:node_modules/@angular/ng-dev",
"//:node_modules/@types/node",
"//:node_modules/@types/tmp",
"//:node_modules/tmp",
],
)
@@ -1,17 +1,15 @@
import {writeFileSync, mkdtempSync} from 'node:fs';
import {join} from 'node:path';
import {tmpdir} from 'node:os';
import {fileSync} from 'tmp';
import {writeSync} from 'node:fs';
import {getInput, setSecret} from '@actions/core';
let credentialFilePath: undefined | string;
export function getCredentialFilePath(): string {
if (credentialFilePath === undefined) {
const tmpDir = mkdtempSync(join(tmpdir(), 'credential-'));
const filePath = join(tmpDir, 'credential.json');
writeFileSync(filePath, getInput('serviceKey', {required: true}));
setSecret(filePath);
credentialFilePath = filePath;
const tmpFile = fileSync({postfix: '.json'});
writeSync(tmpFile.fd, getInput('serviceKey', {required: true}));
setSecret(tmpFile.name);
credentialFilePath = tmpFile.name;
}
return credentialFilePath;
}
@@ -111,6 +111,6 @@ function firebase(cmd: string, cwd?: string) {
});
if (status !== 0) {
console.error('Firebase command failed, see log above for details.');
process.exit(status);
process.exit(status ?? undefined);
}
}
@@ -1,9 +1,6 @@
import {
fetchLongTermSupportBranchesFromNpm,
ActiveReleaseTrains,
AuthenticatedGitClient,
ReleaseConfig,
} from '@angular/ng-dev';
import {fetchLongTermSupportBranchesFromNpm, ActiveReleaseTrains} from '@angular/ng-dev';
import {ReleaseConfig} from '@angular/ng-dev';
import {AuthenticatedGitClient} from '@angular/ng-dev';
export interface Deployment {
branch: string;
@@ -3,7 +3,7 @@ import {context} from '@actions/github';
import {deployToFirebase, setupRedirect} from './deploy.mjs';
import {getDeployments} from './deployments.mjs';
import {generateSitemap} from './sitemap.mjs';
import {assertValidGithubConfig, AuthenticatedGitClient, getConfig} from '@angular/ng-dev';
import {AuthenticatedGitClient, GithubConfig, setConfig} from '@angular/ng-dev';
import {githubReleaseTrainReadToken} from './credential.mjs';
import {spawnSync} from 'child_process';
import {cp, mkdtemp} from 'fs/promises';
@@ -13,7 +13,13 @@ import {join} from 'path';
const refMatcher = /refs\/heads\/(.*)/;
async function deployDocs() {
getConfig([assertValidGithubConfig]);
setConfig({
github: {
mainBranchName: 'main',
name: 'angular',
owner: 'angular',
} as GithubConfig,
});
AuthenticatedGitClient.configure(githubReleaseTrainReadToken);
@@ -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
@@ -5,6 +5,7 @@
"types": ["node"],
"lib": ["es2021"],
"experimentalDecorators": true,
"strict": true,
"skipLibCheck": true,
"noImplicitOverride": true,
"esModuleInterop": true,
@@ -12,4 +13,4 @@
"declaration": true,
"sourceMap": true
}
}
}
@@ -0,0 +1,40 @@
name: 'Saucelabs legacy test job'
description: 'Runs tests against Saucelabs (outside of Bazel)'
runs:
using: 'composite'
steps:
- name: Setup Bazel
uses: angular/dev-infra/github-actions/bazel/setup@4425eed914bab0e311066d4b930c35576b7d200e
- name: Setup Saucelabs Variables
uses: angular/dev-infra/github-actions/saucelabs@4425eed914bab0e311066d4b930c35576b7d200e
- name: Starting Saucelabs tunnel service
shell: bash
run: ./tools/saucelabs/sauce-service.sh run &
# Build test fixtures for a test that rely on Bazel-generated fixtures. Note that disabling
# specific tests which are reliant on such generated fixtures is not an option as SystemJS
# in the Saucelabs legacy job always fetches referenced files, even if the imports would be
# guarded by an check to skip in the Saucelabs legacy job. We should be good running such
# test in all supported browsers on Saucelabs anyway until this job can be removed.
- name: Preparing Bazel-generated fixtures required in legacy tests
shell: bash
run: |
# Locale files are needed for i18n tests running within Saucelabs. These are added
# directly as sources so that the TypeScript compilation of `/packages/tsconfig.json`
# can succeed. Note that the base locale and currencies files are checked-in, so
# we do not need to re-generate those through Bazel.
mkdir -p packages/common/locales/extra
cp dist/bin/packages/common/locales/*.ts packages/common/locales
cp dist/bin/packages/common/locales/extra/*.ts packages/common/locales/extra
- name: Build bundle of tests to run on Saucelabs
shell: bash
run: node tools/legacy-saucelabs/build-saucelabs-test-bundle.mjs
- name: Wait and confirm Saucelabs tunnel has connected
shell: bash
run: ./tools/saucelabs/sauce-service.sh ready-wait
- name: Running tests on Saucelabs.
shell: bash
run: KARMA_WEB_TEST_MODE=SL_REQUIRED pnpm karma start ./karma-js.conf.js --single-run
- name: Stop Saucelabs tunnel service
shell: bash
run: ./tools/saucelabs/sauce-service.sh stop
+5 -6
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@4a09f9588769980eacb41fcc76e2c76d048eac42 # main
uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@4425eed914bab0e311066d4b930c35576b7d200e
- name: Setup Bazel
uses: angular/dev-infra/github-actions/bazel/setup@4a09f9588769980eacb41fcc76e2c76d048eac42 # main
uses: angular/dev-infra/github-actions/bazel/setup@4425eed914bab0e311066d4b930c35576b7d200e
- name: Setup Bazel RBE
uses: angular/dev-infra/github-actions/bazel/configure-remote@4a09f9588769980eacb41fcc76e2c76d048eac42 # main
uses: angular/dev-infra/github-actions/bazel/configure-remote@4425eed914bab0e311066d4b930c35576b7d200e
- 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@4a09f9588769980eacb41fcc76e2c76d048eac42 # main
run: pnpm bazel build //adev:build.production
- uses: angular/dev-infra/github-actions/previews/pack-and-upload-artifact@4425eed914bab0e311066d4b930c35576b7d200e
with:
workflow-artifact-name: 'adev-preview'
pull-number: '${{github.event.pull_request.number}}'
+5 -11
View File
@@ -8,7 +8,6 @@
name: Deploying adev preview to Firebase
on:
# zizmor: ignore[dangerous-triggers] - {Trigger is safe as workflow does not checkout untrusted code}
workflow_run:
workflows: ['Build adev for preview deployment']
types: [completed]
@@ -30,23 +29,18 @@ jobs:
runs-on: ubuntu-latest
if: ${{ github.event.workflow_run.conclusion == 'success' }}
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
- uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5
with:
token: '${{secrets.GITHUB_TOKEN}}'
persist-credentials: false
- uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0
with:
node-version-file: '.nvmrc'
package-manager-cache: false
- name: Configure Firebase deploy target
working-directory: ./
run: |
# We can use `npx` as the Firebase deploy actions uses it too.
# Use stable version release
npx -y firebase-tools@15.15.0 target:clear --config adev/firebase.json --project ${{env.PREVIEW_PROJECT}} hosting angular-docs
npx -y firebase-tools@15.15.0 target:apply --config adev/firebase.json --project ${{env.PREVIEW_PROJECT}} hosting angular-docs ${{env.PREVIEW_SITE}}
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@4a09f9588769980eacb41fcc76e2c76d048eac42 # main
- uses: angular/dev-infra/github-actions/previews/upload-artifacts-to-firebase@4425eed914bab0e311066d4b930c35576b7d200e
with:
github-token: '${{secrets.GITHUB_TOKEN}}'
workflow-artifact-name: 'adev-preview'
@@ -2,7 +2,6 @@ name: DevInfra
on:
push:
# zizmor: ignore[dangerous-triggers] - {Trigger is safe as workflow does not checkout untrusted code}
pull_request_target:
types: [opened, synchronize, reopened, ready_for_review, labeled]
@@ -13,11 +12,10 @@ permissions:
jobs:
assistant_to_the_branch_manager:
runs-on: ubuntu-latest
if: github.event.repository.fork == false
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
- uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
with:
persist-credentials: false
- uses: angular/dev-infra/github-actions/branch-manager@4a09f9588769980eacb41fcc76e2c76d048eac42 # main
- uses: angular/dev-infra/github-actions/branch-manager@4425eed914bab0e311066d4b930c35576b7d200e
with:
angular-robot-key: ${{ secrets.ANGULAR_ROBOT_PRIVATE_KEY }}
+8 -25
View File
@@ -11,7 +11,7 @@ jobs:
runs-on: ubuntu-latest
if: ${{ github.event.issue.pull_request && startsWith(github.event.comment.body, '/benchmark-compare ')}}
steps:
- uses: TheModdingInquisition/actions-team-membership@057d91bb80f2976a1bc6dfab5b4ae1da9aebbd89 # v1.0
- uses: TheModdingInquisition/actions-team-membership@a69636a92bc927f32c3910baac06bacc949c984c # v1.0
with:
team: 'team'
organization: angular
@@ -19,40 +19,26 @@ jobs:
exit: true
# Indicate that the benchmark command was received.
- uses: peter-evans/create-or-update-comment@e8674b075228eee787fea43ef493e45ece1004c9 # v5
- uses: peter-evans/create-or-update-comment@71345be0265236311c031f5c7866368bd1eff043 # v4
with:
comment-id: ${{github.event.comment.id}}
token: '${{secrets.BENCHMARK_POST_RESULTS_GITHUB_TOKEN}}'
reactions: 'rocket'
- uses: alessbell/pull-request-comment-branch@ef3408c9757d05f89cb525036383033a313758a0 # v2.1.0
- uses: alessbell/pull-request-comment-branch@aad01d65d6982b8eacabed5e9a684cd8ceb98da6 # v1.1
id: comment-branch
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
- uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
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}}
# Checkout the pull request and assume it being trusted given we've checked
# that the action was triggered by a team member.
ref: ${{steps.comment-branch.outputs.head_sha}}
# We cannot use `angular/dev-infra/github-actions/npm/checkout-and-setup-node` here
# because it does not support checking out from a fork (as it lacks a `repository` input).
# Thus, we checkout and setup Node/pnpm manually.
- name: Setup Node.js
uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0
with:
node-version-file: '.nvmrc'
- name: Install pnpm
uses: pnpm/action-setup@ea17c68df8912ef543352723c149a84f56e3d413 # v6.1.0
ref: ${{steps.comment-branch.outputs.head_ref}}
- run: pnpm install --frozen-lockfile
- name: Setup Bazel
uses: angular/dev-infra/github-actions/bazel/setup@4a09f9588769980eacb41fcc76e2c76d048eac42 # main
- uses: angular/dev-infra/github-actions/bazel/configure-remote@4a09f9588769980eacb41fcc76e2c76d048eac42 # main
- uses: angular/dev-infra/github-actions/bazel/configure-remote@4425eed914bab0e311066d4b930c35576b7d200e
with:
bazelrc: ./.bazelrc.user
@@ -63,14 +49,11 @@ jobs:
COMMENT_BODY: ${{ github.event.comment.body }}
run: pnpm benchmarks prepare-for-github-action "$COMMENT_BODY"
- env:
COMPARE_SHA: ${{steps.info.outputs.compareSha}}
BENCHMARK_TARGET: ${{steps.info.outputs.benchmarkTarget}}
run: pnpm benchmarks run-compare "$COMPARE_SHA" "$BENCHMARK_TARGET"
- run: pnpm benchmarks run-compare ${{steps.info.outputs.compareSha}} ${{steps.info.outputs.benchmarkTarget}}
id: benchmark
name: Running benchmark
- uses: peter-evans/create-or-update-comment@e8674b075228eee787fea43ef493e45ece1004c9 # v5
- uses: peter-evans/create-or-update-comment@71345be0265236311c031f5c7866368bd1eff043 # v4
with:
issue-number: ${{github.event.issue.number}}
token: '${{secrets.BENCHMARK_POST_RESULTS_GITHUB_TOKEN}}'
+36 -50
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@4a09f9588769980eacb41fcc76e2c76d048eac42 # main
uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@4425eed914bab0e311066d4b930c35576b7d200e
- name: Install node modules
run: pnpm install --frozen-lockfile
- name: Check code lint
@@ -32,8 +32,6 @@ jobs:
run: pnpm ng-dev pullapprove verify
- name: Validate angular robot configuration
run: pnpm ng-dev ngbot verify
- name: Validate agent skills
run: pnpm ng-dev misc validate-skills
- name: Confirm code builds with typescript as expected
run: pnpm check-tooling-setup
@@ -41,13 +39,13 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Initialize environment
uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@4a09f9588769980eacb41fcc76e2c76d048eac42 # main
uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@4425eed914bab0e311066d4b930c35576b7d200e
with:
disable-package-manager-cache: true
- name: Setup Bazel
uses: angular/dev-infra/github-actions/bazel/setup@4a09f9588769980eacb41fcc76e2c76d048eac42 # main
uses: angular/dev-infra/github-actions/bazel/setup@4425eed914bab0e311066d4b930c35576b7d200e
- name: Setup Bazel RBE
uses: angular/dev-infra/github-actions/bazel/configure-remote@4a09f9588769980eacb41fcc76e2c76d048eac42 # main
uses: angular/dev-infra/github-actions/bazel/configure-remote@4425eed914bab0e311066d4b930c35576b7d200e
with:
google_credential: ${{ secrets.RBE_TRUSTED_BUILDS_USER }}
- name: Install node modules
@@ -57,7 +55,7 @@ jobs:
- name: Test build
run: pnpm devtools:build:chrome
- name: Cypress run
uses: cypress-io/github-action@09090944bd8aaa2a517cefb6e38bf1aae336b42b # v7.4.3
uses: cypress-io/github-action@b8ba51a856ba5f4c15cf39007636d4ab04f23e3c # v6.10.2
with:
command: pnpm devtools:test:e2e
start: pnpm bazel run //devtools/src:devserver
@@ -69,11 +67,11 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Initialize environment
uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@4a09f9588769980eacb41fcc76e2c76d048eac42 # main
uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@4425eed914bab0e311066d4b930c35576b7d200e
- name: Setup Bazel
uses: angular/dev-infra/github-actions/bazel/setup@4a09f9588769980eacb41fcc76e2c76d048eac42 # main
uses: angular/dev-infra/github-actions/bazel/setup@4425eed914bab0e311066d4b930c35576b7d200e
- name: Setup Bazel Remote Caching
uses: angular/dev-infra/github-actions/bazel/configure-remote@4a09f9588769980eacb41fcc76e2c76d048eac42 # main
uses: angular/dev-infra/github-actions/bazel/configure-remote@4425eed914bab0e311066d4b930c35576b7d200e
with:
google_credential: ${{ secrets.RBE_TRUSTED_BUILDS_USER }}
- name: Install node modules
@@ -85,11 +83,11 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Initialize environment
uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@4a09f9588769980eacb41fcc76e2c76d048eac42 # main
uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@4425eed914bab0e311066d4b930c35576b7d200e
- name: Setup Bazel
uses: angular/dev-infra/github-actions/bazel/setup@4a09f9588769980eacb41fcc76e2c76d048eac42 # main
uses: angular/dev-infra/github-actions/bazel/setup@4425eed914bab0e311066d4b930c35576b7d200e
- name: Setup Bazel Remote Caching
uses: angular/dev-infra/github-actions/bazel/configure-remote@4a09f9588769980eacb41fcc76e2c76d048eac42 # main
uses: angular/dev-infra/github-actions/bazel/configure-remote@4425eed914bab0e311066d4b930c35576b7d200e
with:
google_credential: ${{ secrets.RBE_TRUSTED_BUILDS_USER }}
- name: Install node modules
@@ -102,11 +100,11 @@ jobs:
labels: ubuntu-latest
steps:
- name: Initialize environment
uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@4a09f9588769980eacb41fcc76e2c76d048eac42 # main
uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@4425eed914bab0e311066d4b930c35576b7d200e
- name: Setup Bazel
uses: angular/dev-infra/github-actions/bazel/setup@4a09f9588769980eacb41fcc76e2c76d048eac42 # main
uses: angular/dev-infra/github-actions/bazel/setup@4425eed914bab0e311066d4b930c35576b7d200e
- name: Setup Bazel RBE
uses: angular/dev-infra/github-actions/bazel/configure-remote@4a09f9588769980eacb41fcc76e2c76d048eac42 # main
uses: angular/dev-infra/github-actions/bazel/configure-remote@4425eed914bab0e311066d4b930c35576b7d200e
with:
google_credential: ${{ secrets.RBE_TRUSTED_BUILDS_USER }}
- name: Install node modules
@@ -116,49 +114,32 @@ jobs:
- name: Build adev in fast mode to ensure it continues to work
run: pnpm bazel build //adev:build
vscode-ng-language-service:
runs-on:
labels: ubuntu-latest
steps:
- name: Initialize environment
uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@4a09f9588769980eacb41fcc76e2c76d048eac42 # main
- name: Setup Bazel
uses: angular/dev-infra/github-actions/bazel/setup@4a09f9588769980eacb41fcc76e2c76d048eac42 # main
- name: Setup Bazel RBE
uses: angular/dev-infra/github-actions/bazel/configure-remote@4a09f9588769980eacb41fcc76e2c76d048eac42 # main
with:
google_credential: ${{ secrets.RBE_TRUSTED_BUILDS_USER }}
- name: Install node modules
run: pnpm install --frozen-lockfile
- name: Run tests
run: pnpm bazel test //vscode-ng-language-service/...
publish-snapshots:
runs-on:
labels: ubuntu-latest
steps:
- name: Initialize environment
uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@4a09f9588769980eacb41fcc76e2c76d048eac42 # main
uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@4425eed914bab0e311066d4b930c35576b7d200e
- name: Setup Bazel
uses: angular/dev-infra/github-actions/bazel/setup@4a09f9588769980eacb41fcc76e2c76d048eac42 # main
uses: angular/dev-infra/github-actions/bazel/setup@4425eed914bab0e311066d4b930c35576b7d200e
- name: Setup Bazel RBE
uses: angular/dev-infra/github-actions/bazel/configure-remote@4a09f9588769980eacb41fcc76e2c76d048eac42 # main
uses: angular/dev-infra/github-actions/bazel/configure-remote@4425eed914bab0e311066d4b930c35576b7d200e
- name: Install node modules
run: pnpm install --frozen-lockfile
- run: echo "https://${{secrets.SNAPSHOT_BUILDS_GITHUB_TOKEN}}:@github.com" > ${HOME}/.git_credentials
- run: pnpm build
- run: ./scripts/ci/publish-snapshot-build-artifacts.sh
- run: ./scripts/ci/publish-build-artifacts.sh
zone-js:
runs-on:
labels: ubuntu-latest
steps:
- name: Initialize environment
uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@4a09f9588769980eacb41fcc76e2c76d048eac42 # main
uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@4425eed914bab0e311066d4b930c35576b7d200e
- name: Setup Bazel
uses: angular/dev-infra/github-actions/bazel/setup@4a09f9588769980eacb41fcc76e2c76d048eac42 # main
uses: angular/dev-infra/github-actions/bazel/setup@4425eed914bab0e311066d4b930c35576b7d200e
- name: Setup Bazel RBE
uses: angular/dev-infra/github-actions/bazel/configure-remote@4a09f9588769980eacb41fcc76e2c76d048eac42 # main
uses: angular/dev-infra/github-actions/bazel/configure-remote@4425eed914bab0e311066d4b930c35576b7d200e
with:
google_credential: ${{ secrets.RBE_TRUSTED_BUILDS_USER }}
- name: Install node modules
@@ -188,26 +169,35 @@ jobs:
- run: pnpm -C packages/zone.js jest:test
- run: pnpm -C packages/zone.js jest:nodetest
- run: pnpm -C packages/zone.js vitest:test
- run: pnpm -C packages/zone.js vitest-globals:test
- run: pnpm -C packages/zone.js electrontest
- run: pnpm -C packages/zone.js/test/typings test
# saucelabs:
# runs-on: ubuntu-latest
# env:
# SAUCE_TUNNEL_IDENTIFIER: angular-framework-${{ github.run_number }}
# steps:
# - name: Initialize environment
# uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@b5a3609f89c06eb4037dce22a93641213a5d1508
# - name: Install node modules
# run: pnpm install --frozen-lockfile
# - uses: ./.github/actions/saucelabs-legacy
adev-deploy:
needs: [adev]
if: needs.adev.result == 'success'
runs-on: ubuntu-latest-8core
steps:
- name: Initialize environment
uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@4a09f9588769980eacb41fcc76e2c76d048eac42 # main
uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@4425eed914bab0e311066d4b930c35576b7d200e
- name: Setup Bazel
uses: angular/dev-infra/github-actions/bazel/setup@4a09f9588769980eacb41fcc76e2c76d048eac42 # main
uses: angular/dev-infra/github-actions/bazel/setup@4425eed914bab0e311066d4b930c35576b7d200e
- name: Setup Bazel RBE
uses: angular/dev-infra/github-actions/bazel/configure-remote@4a09f9588769980eacb41fcc76e2c76d048eac42 # main
uses: angular/dev-infra/github-actions/bazel/configure-remote@4425eed914bab0e311066d4b930c35576b7d200e
- 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
run: pnpm bazel build //adev:build.production --config=release
- name: Deploy to firebase
uses: ./.github/actions/deploy-docs-site
with:
@@ -215,7 +205,3 @@ jobs:
githubReleaseTrainReadToken: ${{ secrets.DOCS_DEPLOY_GITHUB_RELEASE_TRAIN_TOKEN }}
configPath: 'adev/firebase.json'
distDir: 'dist/bin/adev/dist'
- name: Update Algolia synonym record
run: node adev/scripts/synonyms/update-synonyms.mts
env:
ALGOLIA_KEY: ${{ secrets.ALGOLIA_SYNONYM_MANAGER }}
@@ -1,59 +0,0 @@
name: Update ADEV Cross Repo Docs
on:
workflow_dispatch:
inputs: {}
push:
branches:
- 'main'
- '[0-9]+.[0-9]+.x'
# Declare default permissions as read only.
permissions:
contents: read
jobs:
update_adev_cross_repo_docs:
name: Update Cross Repo ADEV Docs
if: github.repository == 'angular/angular'
runs-on: ubuntu-latest
# Prevents multiple concurrent runs of this workflow for the same branch
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true
steps:
- name: Checkout the repository
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.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
# an authenticated URL.
persist-credentials: false
- name: Generate Docs
run: node adev/scripts/update-cross-repo-docs/index.mjs
env:
ANGULAR_READONLY_GITHUB_TOKEN: ${{ secrets.READONLY_GITHUB_TOKEN }}
- name: Create a PR (if necessary)
uses: peter-evans/create-pull-request@5f6978faf089d4d20b00c7766989d076bb2fc7f1 # v8.1.1
with:
token: ${{ secrets.ANGULAR_ROBOT_ACCESS_TOKEN }}
push-to-fork: 'angular-robot/angular'
delete-branch: true
maintainer-can-modify: false
branch: docs-cross-repo-update-${{github.ref_name}}
committer: Angular Robot <angular-robot@google.com>
author: Angular Robot <angular-robot@google.com>
title: 'docs: update cross-repo adev docs [${{github.ref_name}}]'
body: |
Updated Angular adev cross repo docs files.
labels: |
action: merge
area: docs
target: automation
commit-message: |
docs: update cross-repo adev docs
Updated Angular adev cross repo docs files.
+5 -17
View File
@@ -1,37 +1,25 @@
name: DevInfra
on:
# zizmor: ignore[dangerous-triggers] - {Trigger is safe as workflow does not checkout untrusted code}
pull_request_target:
types: [opened, synchronize, reopened]
issues:
types: [opened, reopened]
# Declare default permissions as read only.
permissions:
contents: read
jobs:
pull_request_labels:
if: github.event_name == 'pull_request_target'
labels:
runs-on: ubuntu-latest
steps:
- uses: angular/dev-infra/github-actions/labeling/pull-request@4a09f9588769980eacb41fcc76e2c76d048eac42 # main
- uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
- uses: angular/dev-infra/github-actions/pull-request-labeling@4425eed914bab0e311066d4b930c35576b7d200e
with:
angular-robot-key: ${{ secrets.ANGULAR_ROBOT_PRIVATE_KEY }}
labels: '{"requires: TGP": ["packages/core/primitives/**/{*,.*}"]}'
post_approval_changes:
if: github.event_name == 'pull_request_target'
runs-on: ubuntu-latest
steps:
- uses: angular/dev-infra/github-actions/post-approval-changes@4a09f9588769980eacb41fcc76e2c76d048eac42 # main
- uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
- uses: angular/dev-infra/github-actions/post-approval-changes@4425eed914bab0e311066d4b930c35576b7d200e
with:
angular-robot-key: ${{ secrets.ANGULAR_ROBOT_PRIVATE_KEY }}
issue_labels:
if: github.event_name == 'issues'
runs-on: ubuntu-latest
steps:
- uses: angular/dev-infra/github-actions/labeling/issue@4a09f9588769980eacb41fcc76e2c76d048eac42 # main
with:
angular-robot-key: ${{ secrets.ANGULAR_ROBOT_PRIVATE_KEY }}
google-generative-ai-key: ${{ secrets.GOOGLE_GENERATIVE_AI_KEY }}
+2 -3
View File
@@ -1,7 +1,6 @@
name: Google Internal Tests Enforcement
on:
# zizmor: ignore[dangerous-triggers] - {Trigger is safe as workflow does not checkout untrusted code}
pull_request_target:
types: [opened, reopened, synchronize]
@@ -14,8 +13,8 @@ jobs:
statuses: write
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
- uses: angular/dev-infra/github-actions/google-internal-tests@4a09f9588769980eacb41fcc76e2c76d048eac42 # main
- uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
- uses: angular/dev-infra/github-actions/google-internal-tests@4425eed914bab0e311066d4b930c35576b7d200e
with:
run-tests-guide-url: http://go/angular-g3sync-start
github-token: ${{ secrets.GITHUB_TOKEN }}
+32
View File
@@ -0,0 +1,32 @@
name: Manual jobs
on:
workflow_dispatch:
inputs: {}
jobs:
# Bazel saucelabs job resides in `manual.yml` because it's currently unstable, but
# kept as "runnable" for debugging/stabilization effort purposes.
bazel-saucelabs:
runs-on: ubuntu-latest
env:
JOBS: 2
steps:
- name: Initialize environment
uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@4425eed914bab0e311066d4b930c35576b7d200e
- name: Install node modules
run: pnpm install --frozen-lockfile
- name: Setup Bazel
uses: angular/dev-infra/github-actions/bazel/setup@4425eed914bab0e311066d4b930c35576b7d200e
- name: Setup Bazel Remote Caching
uses: angular/dev-infra/github-actions/bazel/configure-remote@4425eed914bab0e311066d4b930c35576b7d200e
- name: Setup Saucelabs Variables
uses: angular/dev-infra/github-actions/saucelabs@4425eed914bab0e311066d4b930c35576b7d200e
- name: Set up Sauce Tunnel Daemon
run: pnpm bazel run //tools/saucelabs-daemon/background-service -- $JOBS &
env:
SAUCE_TUNNEL_IDENTIFIER: angular-framework-${{ github.run_number }}
- name: Run all saucelabs bazel tests
run: |
TESTS=$(./node_modules/.bin/bazelisk query --output label '(kind(karma_web_test, ...) intersect attr("tags", "saucelabs", ...)) except attr("tags", "fixme-saucelabs", ...)')
pnpm bazel test --config=saucelabs --jobs=$JOBS ${TESTS}
+2 -4
View File
@@ -1,8 +1,6 @@
name: Merge Ready
on:
# zizmor: ignore[dangerous-triggers] - {Trigger is safe as workflow does not checkout untrusted code}
pull_request_target:
on: pull_request_target
# Declare default permissions as read only.
permissions: {}
@@ -11,6 +9,6 @@ jobs:
status:
runs-on: ubuntu-latest
steps:
- uses: angular/dev-infra/github-actions/unified-status-check@4a09f9588769980eacb41fcc76e2c76d048eac42 # main
- uses: angular/dev-infra/github-actions/unified-status-check@4425eed914bab0e311066d4b930c35576b7d200e
with:
angular-robot-key: ${{ secrets.ANGULAR_ROBOT_PRIVATE_KEY }}
+6 -11
View File
@@ -7,6 +7,7 @@ on:
permissions:
contents: 'read'
id-token: 'write'
defaults:
run:
@@ -20,7 +21,7 @@ jobs:
workflows: ${{ steps.workflows.outputs.workflows }}
steps:
- name: Initialize environment
uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@4a09f9588769980eacb41fcc76e2c76d048eac42 # main
uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@4425eed914bab0e311066d4b930c35576b7d200e
- name: Install node modules
run: pnpm install --frozen-lockfile
- id: workflows
@@ -30,29 +31,23 @@ jobs:
timeout-minutes: 30
runs-on: ubuntu-latest
needs: list
permissions:
contents: 'read'
id-token: 'write'
strategy:
matrix:
workflow: ${{ fromJSON(needs.list.outputs.workflows) }}
steps:
- name: Initialize environment
uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@4a09f9588769980eacb41fcc76e2c76d048eac42 # main
uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@4425eed914bab0e311066d4b930c35576b7d200e
- name: Setup Bazel
uses: angular/dev-infra/github-actions/bazel/setup@4a09f9588769980eacb41fcc76e2c76d048eac42 # main
uses: angular/dev-infra/github-actions/bazel/setup@4425eed914bab0e311066d4b930c35576b7d200e
- 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
# identity federation. This allows us to request short lived credentials on demand, rather than storing
# credentials in secrets long term. More information can be found at:
# https://docs.github.com/en/actions/security-for-github-actions/security-hardening-your-deployments/configuring-openid-connect-in-google-cloud-platform
- uses: 'google-github-actions/auth@7c6bc770dae815cd3e89ee6cdf493a5fab2cc093' # v3
- uses: 'google-github-actions/auth@c200f3691d83b41bf9bbd8638997a462592937ed' # v2
with:
project_id: 'internal-200822'
workload_identity_provider: 'projects/823469418460/locations/global/workloadIdentityPools/measurables-tracking/providers/angular'
service_account: 'measures-uploader@internal-200822.iam.gserviceaccount.com'
- run: pnpm ng-dev perf workflows --name "$WORKFLOW" --commit-sha "$COMMIT_SHA"
env:
WORKFLOW: ${{ matrix.workflow }}
COMMIT_SHA: ${{ github.sha }}
- run: pnpm ng-dev perf workflows --name ${{ matrix.workflow }} --commit-sha ${{github.sha}}
+35 -37
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@4a09f9588769980eacb41fcc76e2c76d048eac42 # main
uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@4425eed914bab0e311066d4b930c35576b7d200e
- name: Install node modules
run: pnpm install --frozen-lockfile
- name: Check code lint
@@ -32,14 +32,12 @@ jobs:
run: pnpm ng-dev ngbot verify
- name: Confirm code builds with typescript as expected
run: pnpm check-tooling-setup
- name: Validate agent skills
run: pnpm ng-dev misc validate-skills
- name: Check commit message
run: pnpm ng-dev commit-message validate-range ${{ github.event.pull_request.base.sha }} ${{ github.event.pull_request.head.sha }}
- 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@4a09f9588769980eacb41fcc76e2c76d048eac42 # main
uses: angular/dev-infra/github-actions/linting/licenses@4425eed914bab0e311066d4b930c35576b7d200e
with:
allow-dependencies-licenses: 'pkg:npm/google-protobuf@'
@@ -47,13 +45,18 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Initialize environment
uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@4a09f9588769980eacb41fcc76e2c76d048eac42 # main
uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@4425eed914bab0e311066d4b930c35576b7d200e
with:
disable-package-manager-cache: true
- name: Setup Bazel
uses: angular/dev-infra/github-actions/bazel/setup@4a09f9588769980eacb41fcc76e2c76d048eac42 # main
uses: angular/dev-infra/github-actions/bazel/setup@4425eed914bab0e311066d4b930c35576b7d200e
- name: Setup Bazel RBE
uses: angular/dev-infra/github-actions/bazel/configure-remote@4a09f9588769980eacb41fcc76e2c76d048eac42 # main
uses: angular/dev-infra/github-actions/bazel/configure-remote@4425eed914bab0e311066d4b930c35576b7d200e
- name: Cache downloaded Cypress binary
uses: actions/cache@0057852bfaa89a56745cba8c7296529d2fc39830 # v4.3.0
with:
path: '~/.cache/Cypress'
key: cypress-cache-${{ runner.os }}-${{ hashFiles('**/pnpm-lock.yaml') }}
- name: Install node modules
run: pnpm install --frozen-lockfile
- name: Run unit tests
@@ -61,7 +64,7 @@ jobs:
- name: Test build
run: pnpm devtools:build:chrome
- name: Cypress run
uses: cypress-io/github-action@09090944bd8aaa2a517cefb6e38bf1aae336b42b # v7.4.3
uses: cypress-io/github-action@b8ba51a856ba5f4c15cf39007636d4ab04f23e3c # v6.10.2
with:
command: pnpm devtools:test:e2e
start: pnpm bazel run //devtools/src:devserver
@@ -73,11 +76,11 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Initialize environment
uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@4a09f9588769980eacb41fcc76e2c76d048eac42 # main
uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@4425eed914bab0e311066d4b930c35576b7d200e
- name: Setup Bazel
uses: angular/dev-infra/github-actions/bazel/setup@4a09f9588769980eacb41fcc76e2c76d048eac42 # main
uses: angular/dev-infra/github-actions/bazel/setup@4425eed914bab0e311066d4b930c35576b7d200e
- name: Setup Bazel Remote Caching
uses: angular/dev-infra/github-actions/bazel/configure-remote@4a09f9588769980eacb41fcc76e2c76d048eac42 # main
uses: angular/dev-infra/github-actions/bazel/configure-remote@4425eed914bab0e311066d4b930c35576b7d200e
- name: Install node modules
run: pnpm install --frozen-lockfile
- name: Run CI tests for framework
@@ -88,7 +91,7 @@ jobs:
ASPECT_RULES_JS_FROZEN_PNPM_LOCK: '1'
- name: Upload GRPC logs (for debugging of RBE issues)
if: always()
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4
with:
path: /tmp/rbe-grpc.log
retention-days: 1
@@ -97,11 +100,11 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Initialize environment
uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@4a09f9588769980eacb41fcc76e2c76d048eac42 # main
uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@4425eed914bab0e311066d4b930c35576b7d200e
- name: Setup Bazel
uses: angular/dev-infra/github-actions/bazel/setup@4a09f9588769980eacb41fcc76e2c76d048eac42 # main
uses: angular/dev-infra/github-actions/bazel/setup@4425eed914bab0e311066d4b930c35576b7d200e
- name: Setup Bazel Remote Caching
uses: angular/dev-infra/github-actions/bazel/configure-remote@4a09f9588769980eacb41fcc76e2c76d048eac42 # main
uses: angular/dev-infra/github-actions/bazel/configure-remote@4425eed914bab0e311066d4b930c35576b7d200e
- name: Install node modules
run: pnpm install --frozen-lockfile
- name: Run integration CI tests for framework
@@ -112,11 +115,11 @@ jobs:
labels: ubuntu-latest
steps:
- name: Initialize environment
uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@4a09f9588769980eacb41fcc76e2c76d048eac42 # main
uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@4425eed914bab0e311066d4b930c35576b7d200e
- name: Setup Bazel
uses: angular/dev-infra/github-actions/bazel/setup@4a09f9588769980eacb41fcc76e2c76d048eac42 # main
uses: angular/dev-infra/github-actions/bazel/setup@4425eed914bab0e311066d4b930c35576b7d200e
- name: Setup Bazel RBE
uses: angular/dev-infra/github-actions/bazel/configure-remote@4a09f9588769980eacb41fcc76e2c76d048eac42 # main
uses: angular/dev-infra/github-actions/bazel/configure-remote@4425eed914bab0e311066d4b930c35576b7d200e
- name: Install node modules
run: pnpm install --frozen-lockfile
- name: Run tests
@@ -124,31 +127,16 @@ jobs:
- name: Build adev in fast mode to ensure it continues to work
run: pnpm bazel build //adev:build
vscode-ng-language-service:
runs-on:
labels: ubuntu-latest
steps:
- name: Initialize environment
uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@4a09f9588769980eacb41fcc76e2c76d048eac42 # main
- name: Setup Bazel
uses: angular/dev-infra/github-actions/bazel/setup@4a09f9588769980eacb41fcc76e2c76d048eac42 # main
- name: Setup Bazel RBE
uses: angular/dev-infra/github-actions/bazel/configure-remote@4a09f9588769980eacb41fcc76e2c76d048eac42 # main
- name: Install node modules
run: pnpm install --frozen-lockfile
- name: Run tests
run: pnpm bazel test //vscode-ng-language-service/...
zone-js:
runs-on:
labels: ubuntu-latest
steps:
- name: Initialize environment
uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@4a09f9588769980eacb41fcc76e2c76d048eac42 # main
uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@4425eed914bab0e311066d4b930c35576b7d200e
- name: Setup Bazel
uses: angular/dev-infra/github-actions/bazel/setup@4a09f9588769980eacb41fcc76e2c76d048eac42 # main
uses: angular/dev-infra/github-actions/bazel/setup@4425eed914bab0e311066d4b930c35576b7d200e
- name: Setup Bazel RBE
uses: angular/dev-infra/github-actions/bazel/configure-remote@4a09f9588769980eacb41fcc76e2c76d048eac42 # main
uses: angular/dev-infra/github-actions/bazel/configure-remote@4425eed914bab0e311066d4b930c35576b7d200e
- name: Install node modules
run: pnpm install --frozen-lockfile
- run: |
@@ -174,6 +162,16 @@ jobs:
- run: pnpm -C packages/zone.js jest:test
- run: pnpm -C packages/zone.js jest:nodetest
- run: pnpm -C packages/zone.js vitest:test
- run: pnpm -C packages/zone.js vitest-globals:test
- run: pnpm -C packages/zone.js electrontest
- run: pnpm -C packages/zone.js/test/typings test
# saucelabs:
# runs-on: ubuntu-latest
# env:
# SAUCE_TUNNEL_IDENTIFIER: angular-framework-${{ github.run_number }}
# steps:
# - name: Initialize environment
# uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@b5a3609f89c06eb4037dce22a93641213a5d1508
# - name: Install node modules
# run: pnpm install --frozen-lockfile
# - uses: ./.github/actions/saucelabs-legacy
-24
View File
@@ -1,24 +0,0 @@
name: Publish Release
on:
push:
branches:
- main
- '[0-9]+.[0-9]+.x'
workflow_dispatch: # Allow manual trigger for verification
# Ensure only one release runs at a time PER BRANCH to avoid race conditions.
concurrency:
group: release-${{ github.ref }}
cancel-in-progress: false
permissions:
contents: read # Required to checkout the repository
id-token: write # Required for NPM provenance in reusable workflow
jobs:
release:
uses: angular/dev-infra/.github/workflows/reusable-release.yml@4a09f9588769980eacb41fcc76e2c76d048eac42 # main
secrets:
wombot-token: ${{ secrets.WOMBOT_TOKEN }}
angular-robot-key: ${{ secrets.ANGULAR_ROBOT_PRIVATE_KEY }}
+52
View File
@@ -0,0 +1,52 @@
name: OpenSSF Scorecard
on:
branch_protection_rule:
schedule:
- cron: '0 0 * * 0'
push:
branches: [main]
workflow_dispatch:
# Declare default permissions as read only.
permissions:
contents: read
jobs:
analysis:
name: Scorecards analysis
runs-on: ubuntu-latest
permissions:
# Needed to upload the results to code-scanning dashboard.
security-events: write
# Needed to publish results
id-token: write
actions: read
contents: read
steps:
- name: 'Checkout code'
uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
with:
persist-credentials: false
- name: 'Run analysis'
uses: ossf/scorecard-action@4eaacf0543bb3f2c246792bd56e8cdeffafb205a # v2.4.3
with:
results_file: results.sarif
results_format: sarif
repo_token: ${{ secrets.GITHUB_TOKEN }}
publish_results: true
# Upload the results as artifacts.
- name: 'Upload artifact'
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
with:
name: SARIF file
path: results.sarif
retention-days: 5
# Upload the results to GitHub's code scanning dashboard.
- name: 'Upload to code-scanning'
uses: github/codeql-action/upload-sarif@42213152a85ae7569bdb6bec7bcd74cd691bfe41 # v3.30.9
with:
sarif_file: results.sarif
@@ -0,0 +1,89 @@
name: Update ADEV Angular CDK APIs and CLI Help
on:
workflow_dispatch:
inputs: {}
push:
branches:
- 'main'
- '[0-9]+.[0-9]+.x'
# Declare default permissions as read only.
permissions:
contents: read
jobs:
update_adev_docs:
name: Update Angular CDK APIs and CLI Help (if necessary)
if: github.repository == 'angular/angular'
runs-on: ubuntu-latest
# Prevents multiple concurrent runs of this workflow for the same branch
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true
steps:
- name: Checkout the repository
uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
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
# an authenticated URL.
persist-credentials: false
# Angular CDK
- name: Generate CDK apis
run: node adev/scripts/update-cdk-apis/index.mjs
env:
ANGULAR_CDK_BUILDS_READONLY_GITHUB_TOKEN: ${{ secrets.ANGULAR_CDK_BUILDS_READONLY_GITHUB_TOKEN }}
- name: Create a PR CDK apis (if necessary)
uses: peter-evans/create-pull-request@271a8d0340265f705b14b6d32b9829c1cb33d45e # v7.0.8
with:
token: ${{ secrets.ANGULAR_ROBOT_ACCESS_TOKEN }}
push-to-fork: 'angular-robot/angular'
delete-branch: true
maintainer-can-modify: false
branch: docs-update-cdk-apis-${{github.ref_name}}
committer: Angular Robot <angular-robot@google.com>
author: Angular Robot <angular-robot@google.com>
title: 'docs: update Angular CDK apis [${{github.ref_name}}]'
body: |
Updated Angular CDK api files.
labels: |
action: merge
area: docs
target: automation
commit-message: |
docs: update Angular CDK apis
Updated Angular CDK api files.
# Angular CLI
- name: Reset to current GitHub ref
run: |
git reset --hard ${{ github.ref }}
- name: Generate CLI help
run: node adev/scripts/update-cli-help/index.mjs
env:
ANGULAR_CLI_BUILDS_READONLY_GITHUB_TOKEN: ${{ secrets.ANGULAR_CLI_BUILDS_READONLY_GITHUB_TOKEN }}
- name: Create a PR CLI help (if necessary)
uses: peter-evans/create-pull-request@271a8d0340265f705b14b6d32b9829c1cb33d45e # v7.0.8
with:
token: ${{ secrets.ANGULAR_ROBOT_ACCESS_TOKEN }}
push-to-fork: 'angular-robot/angular'
delete-branch: true
maintainer-can-modify: false
branch: docs-update-cli-help-${{github.ref_name}}
committer: Angular Robot <angular-robot@google.com>
author: Angular Robot <angular-robot@google.com>
title: 'docs: update Angular CLI help [${{github.ref_name}}]'
body: |
Updated Angular CLI help contents.
labels: |
action: merge
area: docs
target: automation
commit-message: |
docs: update Angular CLI help
Updated Angular CLI help contents.
+2 -3
View File
@@ -16,7 +16,9 @@ pubspec.lock
!.devcontainer/recommended-devcontainer.json
!.devcontainer/recommended-Dockerfile
.settings/
.vscode/launch.json
.vscode/settings.json
.vscode/tasks.json
*.swo
*.swp
modules/.settings
@@ -54,6 +56,3 @@ baseline.json
# Ignore cache created with the Angular CLI.
.angular/
# pnpm store
.pnpm-store
-23
View File
@@ -1,23 +0,0 @@
/**
* The configuration for `ng-dev caretaker` commands.
*
* @type { import("@angular/ng-dev").CaretakerConfig }
*/
export const caretaker = {
g3SyncConfigPath: './.ng-dev/google-sync-config.json',
githubQueries: [
{
name: 'Merge Queue',
query: `is:pr is:open label:"action: merge"`,
},
{
name: 'Merge Assistance Queue',
query: `is:pr is:open label:"merge: caretaker note" label:"action: merge"`,
},
{
name: 'Initial Triage Queue',
query: `is:open no:milestone -draft:true`,
},
],
hasEmeaCaretaker: true,
};
+21
View File
@@ -0,0 +1,21 @@
import {CaretakerConfig} from '@angular/ng-dev';
/** The configuration for `ng-dev caretaker` commands. */
export const caretaker: CaretakerConfig = {
g3SyncConfigPath: './.ng-dev/google-sync-config.json',
githubQueries: [
{
name: 'Merge Queue',
query: `is:pr is:open label:"action: merge"`,
},
{
name: 'Merge Assistance Queue',
query: `is:pr is:open label:"merge: caretaker note" label:"action: merge"`,
},
{
name: 'Initial Triage Queue',
query: `is:open no:milestone -draft:true`,
},
],
caretakerGroup: 'angular-caretaker',
};
-38
View File
@@ -1,38 +0,0 @@
/**
* The configuration for `ng-dev commit-message` commands.
*
* @type { import("@angular/ng-dev").CommitMessageConfig }
*/
export const commitMessage = {
maxLineLength: Infinity,
minBodyLength: 20,
minBodyLengthTypeExcludes: ['docs'],
// If you update this, also update the docs.
// https://github.com/angular/angular/blob/main/contributing-docs/commit-message-guidelines.md#scope
scopes: [
'animations',
'benchpress',
'common',
'compiler',
'compiler-cli',
'core',
'dev-infra',
'devtools',
'docs-infra',
'elements',
'forms',
'http',
'language-service',
'language-server',
'localize',
'migrations',
'platform-browser',
'platform-browser-dynamic',
'platform-server',
'router',
'service-worker',
'upgrade',
'vscode-extension',
'zone.js',
],
};
+39
View File
@@ -0,0 +1,39 @@
import {CommitMessageConfig} from '@angular/ng-dev';
/**
* The configuration for `ng-dev commit-message` commands.
*/
export const commitMessage: CommitMessageConfig = {
maxLineLength: Infinity,
minBodyLength: 20,
minBodyLengthTypeExcludes: ['docs'],
// If you update this, also update the docs.
// https://github.com/angular/angular/blob/main/contributing-docs/commit-message-guidelines.md#scope
scopes: [
'animations',
'bazel',
'benchpress',
'changelog',
'common',
'compiler',
'compiler-cli',
'core',
'dev-infra',
'devtools',
'docs-infra',
'elements',
'forms',
'http',
'language-service',
'localize',
'migrations',
'packaging',
'platform-browser',
'platform-browser-dynamic',
'platform-server',
'router',
'service-worker',
'upgrade',
'zone.js',
],
};
-8
View File
@@ -1,8 +0,0 @@
import {caretaker} from './caretaker.mjs';
import {commitMessage} from './commit-message.mjs';
import {format} from './format.mjs';
import {github} from './github.mjs';
import {pullRequest} from './pull-request.mjs';
import {release} from './release.mjs';
export {commitMessage, format, github, pullRequest, caretaker, release};
+15
View File
@@ -0,0 +1,15 @@
import {caretaker} from './caretaker.mjs';
import {commitMessage} from './commit-message.mjs';
import {format} from './format.mjs';
import {github} from './github.mjs';
import {pullRequest} from './pull-request.mjs';
import {release} from './release.mjs';
export {
commitMessage,
format,
github,
pullRequest,
caretaker,
release,
};
-9
View File
@@ -1,9 +0,0 @@
/**
* Configuration for the `ng-dev format` command.
*
* @type { import("@angular/ng-dev").FormatConfig }
*/
export const format = {
'prettier': true,
'buildifier': true,
};
+35
View File
@@ -0,0 +1,35 @@
import {FormatConfig} from '@angular/ng-dev';
/**
* Configuration for the `ng-dev format` command.
*/
export const format: FormatConfig = {
'prettier': {
'matchers': [
'**/*.md',
'**/*.{yaml,yml}',
'**/*.{js,ts,mjs,mts,cjs,cts,tsx}',
'devtools/**/*.{js,ts,mjs,mts,cjs,cts,html,scss}',
'integration/**/size.json',
// Do not format d.ts files as they are generated
'!**/*.d.ts',
// Both third_party and .yarn are directories containing copied code which should
// not be modified.
'!third_party/**',
// Do not format the locale files which are checked-in for Google3, but generated using
// the `generate-locales-tool` from `packages/common/locales`.
'!packages/core/src/i18n/locale_en.ts',
'!packages/common/locales/closure-locale.ts',
'!packages/common/src/i18n/currencies.ts',
// Test cases contain non valid code.
'!packages/compiler-cli/test/compliance/test_cases/**/*.{js,ts,mjs,mts,cjs,cts}',
// Ignore generated javascript file(s)
'!.github/actions/deploy-docs-site/main.js',
// Ignore goldens MD files
'!/goldens/**/*.api.md',
],
},
'buildifier': true,
};
-13
View File
@@ -1,13 +0,0 @@
/**
* Github configuration for the `ng-dev` command. This repository is used as
* remote for the merge script and other utilities like `ng-dev pr rebase`.
*
* @type { import("@angular/ng-dev").GithubConfig }
*/
export const github = {
owner: 'angular',
name: 'angular',
mainBranchName: 'main',
mergeMode: 'caretaker-only',
requireReleaseModeForRelease: false,
};
+12
View File
@@ -0,0 +1,12 @@
import {GithubConfig} from '@angular/ng-dev';
/**
* Github configuration for the `ng-dev` command. This repository is used as
* remote for the merge script and other utilities like `ng-dev pr rebase`.
*/
export const github: GithubConfig = {
owner: 'angular',
name: 'angular',
mainBranchName: 'main',
useNgDevAuthService: true,
};
-3
View File
@@ -10,14 +10,12 @@
"packages/compiler-cli/private/bazel.ts",
"packages/compiler-cli/private/localize.ts",
"packages/compiler-cli/private/tooling.ts",
"packages/compiler-cli/private/hybrid_analysis.ts",
"packages/compiler-cli/private/babel.d.ts",
"packages/compiler-cli/src/bin/**",
"packages/core/schematics/utils/tsurge/helpers/angular_devkit/**",
"packages/docs/**",
"packages/elements/schematics/**",
"packages/examples/**",
"packages/forms/signals/src/api/rules/validation/standard_schema.ts",
"packages/localize/**",
"packages/private/**",
"packages/service-worker/**",
@@ -34,7 +32,6 @@
"**/rollup.config.js",
"**/BUILD.bazel",
"**/*.md",
"**/package.json",
"packages/**/integrationtest/**",
"packages/**/test/**",
"packages/zone.js/*",
-34
View File
@@ -1,34 +0,0 @@
/**
* Configuration for the merge tool in `ng-dev`. This sets up the labels which
* are respected by the merge script (e.g. the target labels).
*
* @type { import("@angular/ng-dev").PullRequestConfig }
*/
export const pullRequest = {
githubApiMerge: {
default: 'auto',
labels: [{pattern: 'merge: squash commits', method: 'squash'}],
},
requiredBaseCommits: {
// PRs that target either `main` or the patch branch, need to be rebased
// on top of the latest commit message validation fix.
// These SHAs are the commits that update the required license text in the header.
'main': '5aeb9a4124922d8ac08eb73b8f322905a32b0b3a',
'10.0.x': '27b95ba64a5d99757f4042073fd1860e20e3ed24',
},
// `docs-infra` are not affecting the public NPM packages.
targetLabelExemptScopes: ['docs-infra'],
// enables specific validations during the pull request merge process
validators: {
assertEnforceTested: true,
assertIsolatedSeparateFiles: true,
},
requiredStatuses: [
{type: 'check', name: 'test'},
{type: 'check', name: 'lint'},
{type: 'check', name: 'adev'},
{type: 'check', name: 'zone-js'},
{type: 'status', name: 'google-internal-tests'},
],
};
+33
View File
@@ -0,0 +1,33 @@
import {PullRequestConfig} from '@angular/ng-dev';
/**
* Configuration for the merge tool in `ng-dev`. This sets up the labels which
* are respected by the merge script (e.g. the target labels).
*/
export const pullRequest: PullRequestConfig = {
githubApiMerge: false,
requiredBaseCommits: {
// PRs that target either `main` or the patch branch, need to be rebased
// on top of the latest commit message validation fix.
// These SHAs are the commits that update the required license text in the header.
'main': '5aeb9a4124922d8ac08eb73b8f322905a32b0b3a',
'10.0.x': '27b95ba64a5d99757f4042073fd1860e20e3ed24',
},
// `dev-infra` and `docs-infra` are not affecting the public NPM packages. Similarly,
// the `bazel` package is not considered part of the public API so that features
// can land in patch branches.
targetLabelExemptScopes: ['dev-infra', 'docs-infra', 'bazel'],
// enables specific validations during the pull request merge process
validators: {
assertEnforceTested: true,
assertIsolatedSeparateFiles: true,
},
requiredStatuses: [
{type: 'check', name: 'test'},
{type: 'check', name: 'lint'},
{type: 'check', name: 'adev'},
{type: 'check', name: 'zone-js'},
{type: 'status', name: 'google-internal-tests'},
],
};
-58
View File
@@ -1,58 +0,0 @@
/**
* Configuration for the `ng-dev release` command.
*
* @type { import("@angular/ng-dev").ReleaseConfig }
*/
export const release = {
publishRegistry: 'https://wombat-dressing-room.appspot.com',
representativeNpmPackage: '@angular/core',
npmPackages: [
{
name: '@angular/animations',
deprecated: {
version: '>=20.2.0-next.3',
message:
'@angular/animations is deprecated. Use `animate.enter` and `animate.leave` instead. For more information see: https://v22.angular.dev/guide/animations.',
},
},
{name: '@angular/common'},
{name: '@angular/compiler-cli'},
{name: '@angular/compiler'},
{name: '@angular/core'},
{name: '@angular/elements'},
{name: '@angular/forms'},
{name: '@angular/language-server'},
{name: '@angular/language-service'},
{name: '@angular/localize'},
{
name: '@angular/platform-browser-dynamic',
deprecated: {
version: '>=20.1.0-next.0',
message:
'@angular/platform-browser-dynamic is deprecated. Use `@angular/platform-browser` instead.',
},
},
{name: '@angular/platform-browser'},
{name: '@angular/platform-server'},
{name: '@angular/router'},
{name: '@angular/service-worker'},
{name: '@angular/upgrade'},
],
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');
return performNpmReleaseBuild();
},
releaseNotes: {
hiddenScopes: [
'dev-infra',
'docs-infra',
'zone.js',
'devtools',
'vscode-extension',
'benchpress',
],
},
releasePrLabels: ['area: build & ci', 'action: merge', 'PullApprove: disable'],
};
+34
View File
@@ -0,0 +1,34 @@
import {ReleaseConfig} from '@angular/ng-dev';
/** Configuration for the `ng-dev release` command. */
export const release: ReleaseConfig = {
publishRegistry: 'https://wombat-dressing-room.appspot.com',
representativeNpmPackage: '@angular/core',
npmPackages: [
{name: '@angular/animations'},
{name: '@angular/common'},
{name: '@angular/compiler'},
{name: '@angular/compiler-cli'},
{name: '@angular/core'},
{name: '@angular/elements'},
{name: '@angular/forms'},
{name: '@angular/language-service'},
{name: '@angular/localize'},
{name: '@angular/platform-browser'},
{name: '@angular/platform-browser-dynamic'},
{name: '@angular/platform-server'},
{name: '@angular/router'},
{name: '@angular/service-worker'},
{name: '@angular/upgrade'},
],
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.mjs');
return performNpmReleaseBuild();
},
releaseNotes: {
hiddenScopes: ['bazel', 'dev-infra', 'docs-infra', 'zone.js', 'devtools'],
},
releasePrLabels: ['area: build & ci', 'action: merge', 'PullApprove: disable'],
};
+2 -1
View File
@@ -1,9 +1,10 @@
{
"compilerOptions": {
"strict": true,
"target": "es2020",
"module": "Node16",
"noEmit": true,
"skipLibCheck": true,
"types": ["node"]
"types": []
}
}
+12
View File
@@ -0,0 +1,12 @@
# Yarn Berry doesn't check engines at all, so pnpm shouldn't either.
engine-strict = false
# Disabling pnpm [hoisting](https://pnpm.io/npmrc#hoist) by setting `hoist=false` is recommended on
# projects using rules_js so that pnpm outside of Bazel lays out a node_modules tree similar to what
# rules_js lays out under Bazel (without a hidden node_modules/.pnpm/node_modules)
hoist=false
# Avoid pnpm auto-installing peer dependencies. We want to be explicit about our versions used
# for peer dependencies, avoiding potential mismatches. In addition, it ensures we can continue
# to rely on peer dependency placeholders substituted via Bazel.
auto-install-peers=false
+1 -1
View File
@@ -1 +1 @@
24.21.0
22.21.0
+9 -18
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.0-beta',
};
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.dependencies = {
...pkg.dependencies,
[key]: 'workspace:*',
[key]: 'workspace: *',
};
delete pkg.peerDependencies[key];
}
}
});
return pkg;
}
+2 -48
View File
@@ -1,49 +1,3 @@
pnpm-lock.yaml
.prettierrc
# Do not format d.ts files as they are generated
**/*.d.ts
# Both third_party and .yarn are directories containing copied code which should
# not be modified.
third_party/**/*.js
third_party/**/*.css
third_party/**/*.md
third_party/**/*.json
# Do not format the locale files which are checked-in for Google3, but generated using
# the `generate-locales-tool` from `packages/common/locales`.
packages/core/src/i18n/locale_en.ts
packages/common/locales/closure-locale.ts
packages/common/src/i18n/currencies.ts
# Test cases contain non valid code.
packages/compiler-cli/test/compliance/test_cases/**/*.js
packages/compiler-cli/test/compliance/test_cases/**/*.ts
# Ignore generated javascript file(s)
.github/actions/deploy-docs-site/main.js
# 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
# Example package.json containing docregion (`// #docregion`) markers, which are
# not valid JSON and cannot be processed by Prettier's json-stringify parser.
adev/src/content/examples/schematics-for-libraries/projects/my-lib/package.json
# Antigravity rules
.agent/rules/agents.md
CHANGELOG.md
CHANGELOG_ARCHIVE.md
pnpm-lock.yaml
+2 -16
View File
@@ -2,24 +2,10 @@
"printWidth": 100,
"tabWidth": 2,
"useTabs": false,
"embeddedLanguageFormatting": "off",
"singleQuote": true,
"semi": true,
"quoteProps": "preserve",
"bracketSpacing": false,
"trailingComma": "all",
"overrides": [
{
"files": ["./.prettierrc"],
"options": {
"parser": "json"
}
},
{
"files": ["*.html"],
"excludeFiles": ["**/test/**"],
"options": {
"parser": "angular"
}
}
]
"trailingComma": "all"
}
+65 -64
View File
@@ -36,9 +36,8 @@
version: 3
availability:
users_unavailable:
- devversion
#availability:
# users_unavailable: []
# Meta field that goes unused by PullApprove to allow for defining aliases to be
# used throughout the config.
@@ -100,17 +99,17 @@ groups:
reviewers:
users:
- ~alxhub
- ~AndrewKushnir
- AndrewKushnir
- atscott
- crisbeto
- devversion
- ~thePunderWoman
- thePunderWoman
- kirjs
- JoostK
- mmalerba
- ~amishne
- ~leonsenft
- ~mattrbeck
- ~JeanMeche
# =========================================================
# Framework: General (most code in our packages)
@@ -120,9 +119,7 @@ groups:
conditions:
- >
contains_any_globs(files.exclude('packages/core/primitives/*'), [
'.agent/skills/**/{*,.*}',
'contributing-docs/public-api-surface.md',
'dev-app/**/{*,.*}',
'integration/**/{*,.*}',
'modules/**/{*,.*}',
'packages/animations/**/{*,.*}',
@@ -138,23 +135,23 @@ groups:
'packages/platform-browser/**/{*,.*}',
'packages/platform-browser-dynamic/**/{*,.*}',
'packages/platform-server/**/{*,.*}',
'packages/private/**/{*,.*}',
'packages/ssr/**/{*,.*}',
'packages/router/**/{*,.*}',
'packages/service-worker/**/{*,.*}',
'packages/upgrade/**/{*,.*}',
'vscode-ng-language-service/**/{*,.*}',
])
reviewers:
users:
- ~alxhub
- ~AndrewKushnir
- AndrewKushnir
- atscott
- crisbeto
- devversion
- kirjs
- ~thePunderWoman
- ~jelbourn
- thePunderWoman
- ~pkozlowski-opensource
- mmalerba
- JeanMeche
- ~amishne
- ~leonsenft
@@ -181,9 +178,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
@@ -202,15 +199,16 @@ groups:
reviewers:
users:
- ~JiaLiPassion
- ~jelbourn
- ~alxhub
- ~AndrewKushnir
- AndrewKushnir
- atscott
- crisbeto
- devversion
- kirjs
- alan-agius4
- ~thePunderWoman
- thePunderWoman
- ~pkozlowski-opensource
- mmalerba
- ~amishne
- ~leonsenft
- ~mattrbeck
@@ -247,31 +245,29 @@ groups:
- >
contains_any_globs(files, [
'adev/**/{*,.*}',
'tools/manual_api_docs/blocks/*.md',
'tools/manual_api_docs/elements/*.md',
])
reviewers:
users:
- alan-agius4
- ~alxhub
- ~AndrewKushnir
- AndrewKushnir
- atscott
- bencodezen
- crisbeto
- kirjs
- JeanMeche
- ~thePunderWoman
- jelbourn
- thePunderWoman
- devversion
- josephperrott
- ~pkozlowski-opensource
- ~mgechev
- mgechev
- MarkTechson
- mmalerba
- ~hawkgs
- ~amishne
- ~leonsenft
- ~mattrbeck
- ~clydin
- ~dgp1130
# =========================================================
# Angular DevTools
@@ -286,14 +282,13 @@ groups:
reviewers:
users:
- AleksanderBodurri
- csmick
- ~devversion
- dgp1130
- eduhmc
- hawkgs
- JeanMeche
- hybrist
- ~josephperrott
- ~milomg
- JeanMeche
- milomg
# =========================================================
# Dev-infra
@@ -302,14 +297,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')
.exclude('.agent/**/*.md'),
[
contains_any_globs(files.exclude('.pullapprove.yml'), [
'{*,.*}',
'.agent/**/{*,.*}',
'.devcontainer/**/{*,.*}',
'.github/**/{*,.*}',
'.husky/**/{*,.*}',
@@ -323,14 +312,18 @@ groups:
'modules/{*,.*}',
'packages/{*,.*}',
'packages/examples/test-utils/**/{*,.*}',
'packages/private/**/{*,.*}',
'packages/examples/{*,.*}',
'scripts/**/{*,.*}',
'third_party/**/{*,.*}',
'tools/contributing-stats/**/{*,.*}',
'tools/gulp-tasks/**/{*,.*}',
'tools/legacy-saucelabs/**/{*,.*}',
'tools/manual_api_docs/**/{*,.*}',
'tools/pnpm-patches/**/{*,.*}',
'tools/rxjs/**/{*,.*}',
'tools/saucelabs-daemon/**/{*,.*}',
'tools/saucelabs/**/{*,.*}',
'tools/symbol-extractor/**/{*,.*}',
'tools/testing/**/{*,.*}',
'tools/tslint/**/{*,.*}',
@@ -342,7 +335,6 @@ groups:
- author not in ["angular-robot"]
reviewers:
users:
- alan-agius4
- devversion
- josephperrott
@@ -374,12 +366,14 @@ groups:
])
reviewers:
users:
- ~AndrewKushnir
- AndrewKushnir
- ~alxhub
- atscott
- ~thePunderWoman
- ~jelbourn
- thePunderWoman
- ~pkozlowski-opensource
- kirjs
- mmalerba
- crisbeto
- devversion
- JeanMeche
@@ -410,12 +404,13 @@ groups:
reviewers:
users:
- ~alxhub
- ~AndrewKushnir
- AndrewKushnir
- atscott
- kirjs
- JeanMeche
- ~thePunderWoman
- ~jelbourn
- thePunderWoman
- ~pkozlowski-opensource
- mmalerba
- ~amishne
- ~leonsenft
- ~mattrbeck
@@ -424,24 +419,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,10 +436,11 @@ groups:
reviewers:
users:
- ~alxhub
- ~AndrewKushnir
- AndrewKushnir
- andrewseguin
- dgp1130
- ~thePunderWoman
- ~jelbourn
- thePunderWoman
- josephperrott
# =========================================================
@@ -481,12 +459,34 @@ groups:
users:
- ~pkozlowski-opensource # Pawel Kozlowski
- ~alxhub # Alex Rickabaugh
- ~thePunderWoman # Jessica Janiuk
- ~AndrewKushnir # Andrew Kushnir
- 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:
<<: *defaults
conditions:
- >
contains_any_globs(files, [
'packages/core/primitives/**/{*,.*}',
])
reviewers:
users:
- csmick # Cameron Smick
- mturco # Matt Turco
- iteriani # Thomas Nguyen
- tbondwilkinson # Tom Wilkinson
- rahatarmanahmed # Rahat Ahmed
- e-cline # Ethan Cline
- rockymeza # Rocky Meza
- ENAML # Ethan Cline
labels:
pending: 'requires: TGP'
approved: 'requires: TGP'
rejected: 'requires: TGP'
####################################################################################
# Override managed result groups
@@ -509,6 +509,7 @@ groups:
reviewers:
users:
- alxhub
- jelbourn
- josephperrott
reviews:
request: 0
+2
View File
@@ -8,6 +8,8 @@ To use the recommended configurations follow the steps below:
- install the recommended extensions in `.vscode/extensions.json`
- copy (or link) `.vscode/recommended-settings.json` to `.vscode/settings.json`
- copy (or link) `.vscode/recommended-launch.json` to `.vscode/launch.json`
- copy (or link) `.vscode/recommended-tasks.json` to `.vscode/tasks.json`
- restart the editor
If you already have your custom workspace settings, you should instead manually merge the file contents.
-84
View File
@@ -1,84 +0,0 @@
// A launch configuration that compiles the extension and then opens it inside a new window
{
"version": "0.2.0",
"configurations": [
{
"type": "extensionHost",
"request": "launch",
"name": "VSCE: Launch Dev Client",
"runtimeExecutable": "${execPath}",
"args": [
"--disable-extensions",
"--extensionDevelopmentPath=${workspaceFolder}/vscode-ng-language-service"
],
"preLaunchTask": "VSCE: watch bundles"
},
{
"type": "extensionHost",
"request": "launch",
"name": "VSCE: Launch Prod Client",
"runtimeExecutable": "${execPath}",
"args": [
"--disable-extensions",
"--extensionDevelopmentPath=${workspaceFolder}/dist/bin/vscode-ng-language-service/development_package"
],
"preLaunchTask": "VSCE: package"
},
{
"name": "VSCE: Attach to Server",
"type": "node",
"request": "attach",
"port": 6009,
"restart": true,
"sourceMaps": true,
"skipFiles": ["<node_internals>/**"],
"sourceMapPathOverrides": {
"?:*/bin/*": "${workspaceFolder}/*"
},
"resolveSourceMapLocations": ["!**/node_modules/**"]
},
{
"name": "DEBUG: Attach to bazel test",
"type": "node",
"request": "attach",
"port": 9229,
"restart": true,
"timeout": 600000,
"sourceMaps": true,
"skipFiles": ["<node_internals>/**"],
"sourceMapPathOverrides": {
"?:*/bin/*": "${workspaceFolder}/*"
},
"resolveSourceMapLocations": ["!**/node_modules/**"]
},
{
"name": "DEBUG: Run bazel test (Custom Target)",
"type": "node",
"request": "launch",
"restart": true,
"timeout": 600000,
"runtimeExecutable": "pnpm",
"runtimeArgs": ["bazel", "test", "${input:bazelTarget}", "--config=debug"],
"console": "integratedTerminal",
"cwd": "${workspaceFolder}"
}
],
"compounds": [
{
"name": "VSCE: Dev Client + Attach to Server",
"configurations": ["VSCE: Launch Dev Client", "VSCE: Attach to Server"]
},
{
"name": "DEBUG: Run bazel test (Custom Target) + Attach",
"configurations": ["DEBUG: Attach to bazel test", "DEBUG: Run bazel test (Custom Target)"]
}
],
"inputs": [
{
"id": "bazelTarget",
"type": "promptString",
"description": "Enter the Bazel test target (e.g., //path/to/my:unit_test)",
"default": "//packages/..."
}
]
}
+75
View File
@@ -0,0 +1,75 @@
{
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "Attach to bazel test ... --config=debug",
"type": "node",
"request": "attach",
"port": 9229,
"address": "localhost",
"restart": false,
"sourceMaps": true,
"localRoot": "${workspaceRoot}",
"remoteRoot": "${workspaceRoot}",
"stopOnEntry": false,
"timeout": 600000,
"outFiles": ["${workspaceFolder}/dist/out/**/packages/**/*.js"]
},
{
"name": "Attach to bazel test ... --config=debug (no source maps)",
"type": "node",
"request": "attach",
"port": 9229,
"address": "localhost",
"restart": false,
"sourceMaps": false,
"localRoot": "${workspaceRoot}",
"remoteRoot": "${workspaceRoot}",
"stopOnEntry": false,
"timeout": 600000,
"outFiles": ["${workspaceFolder}/dist/out/**/packages/**/*.js"]
},
{
"name": "IVY:packages/core/test/acceptance",
"type": "node",
"request": "launch",
"program": "${workspaceFolder}/node_modules/.bin/bazelisk",
"args": ["test", "packages/core/test/acceptance", "--config=debug"],
"port": 9229,
"address": "localhost",
"restart": true,
"sourceMaps": true,
"timeout": 600000,
"outFiles": ["${workspaceFolder}/dist/out/**/packages/**/*.js"]
},
{
"name": "IVY:packages/core/test/render3",
"type": "node",
"request": "launch",
"program": "${workspaceFolder}/node_modules/.bin/bazelisk",
"args": ["test", "packages/core/test/render3", "--config=debug"],
"port": 9229,
"address": "localhost",
"restart": true,
"sourceMaps": true,
"timeout": 600000,
"outFiles": ["${workspaceFolder}/dist/out/**/packages/**/*.js"]
},
{
"name": "IVY:packages/core/test",
"type": "node",
"request": "launch",
"program": "${workspaceFolder}/node_modules/.bin/bazelisk",
"args": ["test", "packages/core/test", "--config=debug"],
"port": 9229,
"address": "localhost",
"restart": true,
"sourceMaps": true,
"timeout": 600000,
"outFiles": ["${workspaceFolder}/dist/out/**/packages/**/*.js"]
}
]
}
+3 -1
View File
@@ -21,5 +21,7 @@
".history": true
},
"git.ignoreLimitWarning": true,
"gitlens.advanced.blame.customArguments": ["--ignore-revs-file .git-blame-ignore-revs"]
"gitlens.advanced.blame.customArguments": [
"--ignore-revs-file .git-blame-ignore-revs"
]
}
+109
View File
@@ -0,0 +1,109 @@
{
// See https://go.microsoft.com/fwlink/?LinkId=733558
// for the documentation about the tasks.json format
"version": "2.0.0",
"tasks": [
{
"label": "IVY:packages/core/test/...",
"type": "shell",
"command": "${workspaceFolder}/node_modules/.bin/bazelisk",
"args": [
"test",
"packages/core/test",
"packages/core/test/acceptance",
"packages/core/test/render3",
],
"group": "test",
"presentation": {
"reveal": "always",
"panel": "dedicated",
},
},
{
"label": "VE:packages/core/test/...",
"type": "shell",
"command": "${workspaceFolder}/node_modules/.bin/bazelisk",
"args": [
"test",
"packages/core/test",
"packages/core/test/acceptance",
"packages/core/test/render3",
],
"group": "test",
"presentation": {
"reveal": "always",
"panel": "dedicated",
},
},
{
"label": "IVY:packages/core/test/acceptance",
"type": "shell",
"command": "${workspaceFolder}/node_modules/.bin/bazelisk",
"args": [
"test",
"packages/core/test/acceptance",
],
"group": "test",
"presentation": {
"reveal": "always",
"panel": "dedicated",
},
},
{
"label": "VE:packages/core/test/acceptance",
"type": "shell",
"command": "${workspaceFolder}/node_modules/.bin/bazelisk",
"args": [
"test",
"packages/core/test/acceptance",
],
"group": "test",
"presentation": {
"reveal": "always",
"panel": "dedicated",
},
},
{
"label": "IVY:packages/core/test",
"type": "shell",
"command": "${workspaceFolder}/node_modules/.bin/bazelisk",
"args": [
"test",
"packages/core/test",
],
"group": "test",
"presentation": {
"reveal": "always",
"panel": "dedicated",
},
},
{
"label": "VE:packages/core/test",
"type": "shell",
"command": "${workspaceFolder}/node_modules/.bin/bazelisk",
"args": [
"test",
"packages/core/test",
],
"group": "test",
"presentation": {
"reveal": "always",
"panel": "dedicated",
},
},
{
"label": "IVY:packages/core/test/render3",
"type": "shell",
"command": "${workspaceFolder}/node_modules/.bin/bazelisk",
"args": [
"test",
"packages/core/test/render3",
],
"group": "test",
"presentation": {
"reveal": "always",
"panel": "dedicated",
},
},
],
}
-32
View File
@@ -1,32 +0,0 @@
{
"version": "2.0.0",
"tasks": [
{
"type": "shell",
"label": "VSCE: watch bundles",
"command": "pnpm --filter=ng-template run watch",
"isBackground": true,
"group": {
"kind": "build",
"isDefault": true
},
"presentation": {
"panel": "dedicated",
"reveal": "never"
},
"problemMatcher": {
"base": "$tsc-watch",
"background": {
"activeOnStart": true,
"beginsPattern": "^iBazel \\[\\d{1,2}:\\d{1,2}(?:AM|PM)\\]: Querying for files to watch.*",
"endsPattern": "^INFO: Build completed successfully, \\d+ total action(s)?"
}
}
},
{
"type": "shell",
"label": "VSCE: package",
"command": "pnpm --filter=ng-template run package"
}
]
}
-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.
+19 -15
View File
@@ -1,4 +1,4 @@
load("@bazel_skylib//rules:common_settings.bzl", "bool_flag")
load("@aspect_rules_js//js:defs.bzl", "js_library")
load("@devinfra//bazel/validation:defs.bzl", "validate_ts_version_matching")
load("@npm//:defs.bzl", "npm_link_all_packages")
load("//tools:defaults.bzl", "copy_to_bin")
@@ -7,6 +7,8 @@ package(default_visibility = ["//visibility:public"])
exports_files([
"LICENSE",
"karma-js.conf.js",
"browser-providers.conf.js",
"package.json",
])
@@ -22,7 +24,7 @@ filegroup(
)
validate_ts_version_matching(
module_bazel = "MODULE.bazel",
module_lock_file = "MODULE.bazel.lock",
package_json = "package.json",
)
@@ -31,6 +33,14 @@ alias(
actual = "//packages:tsconfig-build.json",
)
js_library(
name = "browser-providers",
srcs = [
"browser-providers.conf.d.ts",
"browser-providers.conf.js",
],
)
copy_to_bin(
name = "angularjs_scripts",
srcs = [
@@ -53,17 +63,11 @@ config_setting(
values = {"stamp": "true"},
)
# When enabled, this flag substitutes dependency versions with snapshot repositories
# for all packages in this repository. Note that this does not apply to peer
# dependencies, as they must be installed directly.
bool_flag(
name = "enable_language_server_snapshot_repo_deps",
build_setting_default = False,
)
config_setting(
name = "language_server_package_json_use_snapshot_repo_deps",
flag_values = {
":enable_language_server_snapshot_repo_deps": "true",
},
alias(
name = "sauce_connect",
actual = select({
"@devinfra//bazel/constraints:linux_x64": "@sauce_connect_linux_amd64//:bin/sc",
"@devinfra//bazel/constraints:macos_x64": "@sauce_connect_mac//:bin/sc",
"@devinfra//bazel/constraints:macos_arm64": "@sauce_connect_mac//:bin/sc",
}),
)
+39 -2723
View File
File diff suppressed because it is too large Load Diff
+5 -5
View File
@@ -4967,9 +4967,9 @@ To learn about the release highlights and our CLI-powered automated update workf
- **ivy:** i18n - render legacy message ids in `$localize` if requested ([#32937](https://github.com/angular/angular/issues/32937)) ([bcbf3e4](https://github.com/angular/angular/commit/bcbf3e4))
- **language-service:** module definitions on directive hover ([#32763](https://github.com/angular/angular/issues/32763)) ([0d186dd](https://github.com/angular/angular/commit/0d186dd)), closes [#32565](https://github.com/angular/angular/issues/32565)
- **ngcc:** expose `--create-ivy-entry-points` option on ivy-ngcc ([#33049](https://github.com/angular/angular/issues/33049)) ([b2b917d](https://github.com/angular/angular/commit/b2b917d)), closes [/github.com/angular/angular/pull/32999#issuecomment-539937368](https://github.com/angular/angular/pull/32999/issues/issuecomment-539937368)
- update rxjs peerDependencies minimum requirement to 6.5.3 ([#32812](https://github.com/angular/angular/issues/32812)) ([66658c4](https://github.com/angular/angular/commit/66658c4))
- update rxjs peerDependencies minimum requirment to 6.5.3 ([#32812](https://github.com/angular/angular/issues/32812)) ([66658c4](https://github.com/angular/angular/commit/66658c4))
- **ivy:** support ng-add in localize package ([#32791](https://github.com/angular/angular/issues/32791)) ([e41cbfb](https://github.com/angular/angular/commit/e41cbfb))
- **language-service:** allow retrieving synchronized analyzed NgModules ([#32779](https://github.com/angular/angular/issues/32779)) ([98feee7](https://github.com/angular/angular/commit/98feee7))
- **language-service:** allow retreiving synchronized analyzed NgModules ([#32779](https://github.com/angular/angular/issues/32779)) ([98feee7](https://github.com/angular/angular/commit/98feee7))
- **service-worker:** remove deprecated `versionedFiles` option ([#32862](https://github.com/angular/angular/issues/32862)) ([5d5c94d](https://github.com/angular/angular/commit/5d5c94d))
- **language-service:** expose determining the NgModule of a Directive ([#32710](https://github.com/angular/angular/issues/32710)) ([2846505](https://github.com/angular/angular/commit/2846505)), closes [#32565](https://github.com/angular/angular/issues/32565)
- **bazel:** support ts_library targets as entry-points for ng_package ([#32610](https://github.com/angular/angular/issues/32610)) ([217db9b](https://github.com/angular/angular/commit/217db9b))
@@ -5114,7 +5114,7 @@ To learn about the release highlights and our CLI-powered automated update workf
We assume you will fetch rules_nodejs in your WORKSPACE file, and no other dependencies remain here.
Simply remove any calls to this function and the corresponding load statement.
- typescript 3.4 and 3.5 are no longer supported, please update to typescript 3.6
- We no longer directly have a direct dependency on `tslib`. Instead it is now listed a `peerDependency`.
- We no longer directly have a direct depedency on `tslib`. Instead it is now listed a `peerDependency`.
Users not using the CLI will need to manually install `tslib` via;
@@ -6617,7 +6617,7 @@ For example:
- **forms:** properly handle special properties in FormGroup.get ([#22249](https://github.com/angular/angular/issues/22249)) ([dc3e8aa](https://github.com/angular/angular/commit/dc3e8aa)), closes [#17195](https://github.com/angular/angular/issues/17195)
- **platform-server:** avoid clash between server and client style encapsulation attributes ([#24158](https://github.com/angular/angular/issues/24158)) ([e9f2203](https://github.com/angular/angular/commit/e9f2203))
- **platform-server:** avoid dependency cycle when using http interceptor ([#24229](https://github.com/angular/angular/issues/24229)) ([2991b1b](https://github.com/angular/angular/commit/2991b1b)), closes [#23023](https://github.com/angular/angular/issues/23023)
- **platform-server:** don't reflect innerHTML property to attribute ([#24213](https://github.com/angular/angular/issues/24213)) ([c17098d](https://github.com/angular/angular/commit/c17098d)), closes [#19278](https://github.com/angular/angular/issues/19278)
- **platform-server:** don't reflect innerHTML property to attibute ([#24213](https://github.com/angular/angular/issues/24213)) ([c17098d](https://github.com/angular/angular/commit/c17098d)), closes [#19278](https://github.com/angular/angular/issues/19278)
- **platform-server:** provide Domino DOM types globally ([#24116](https://github.com/angular/angular/issues/24116)) ([906b3ec](https://github.com/angular/angular/commit/906b3ec)), closes [#23280](https://github.com/angular/angular/issues/23280) [#23133](https://github.com/angular/angular/issues/23133)
<!-- CHANGELOG SPLIT MARKER -->
@@ -9193,7 +9193,7 @@ Note: 4.0.0-beta.0 release also contains all the changes present in the 2.3.1 re
- **compiler:** support dotted property binding ([8db184d](https://github.com/angular/angular/commit/8db184d)), closes [angular/flex-layout#34](https://github.com/angular/flex-layout/issues/34)
- **compiler:** update to metadata version 3 ([#13464](https://github.com/angular/angular/issues/13464)) ([b9b557c](https://github.com/angular/angular/commit/b9b557c))
- **core:** detectChanges() doesn't work on detached instance ([4d6ac9d](https://github.com/angular/angular/commit/4d6ac9d)), closes [#13426](https://github.com/angular/angular/issues/13426) [#13472](https://github.com/angular/angular/issues/13472)
- **core:** properly destroy embedded Views attached to ApplicationRef ([#13459](https://github.com/angular/angular/issues/13459)) ([d40bbf4](https://github.com/angular/angular/commit/d40bbf4)), closes [#13062](https://github.com/angular/angular/issues/13062)
- **core:** properly destroy embedded Views attatched to ApplicationRef ([#13459](https://github.com/angular/angular/issues/13459)) ([d40bbf4](https://github.com/angular/angular/commit/d40bbf4)), closes [#13062](https://github.com/angular/angular/issues/13062)
- **core:** remove logError from logGroup ([#12925](https://github.com/angular/angular/issues/12925)) ([5fab871](https://github.com/angular/angular/commit/5fab871))
- **forms:** ensure `select[multiple]` retains selections ([b3dcff0](https://github.com/angular/angular/commit/b3dcff0)), closes [#12527](https://github.com/angular/angular/issues/12527) [#12654](https://github.com/angular/angular/issues/12654)
- **forms:** fix Validators.min/maxLength with FormArray ([#13095](https://github.com/angular/angular/issues/13095)) ([7383e4a](https://github.com/angular/angular/commit/7383e4a)), closes [#13089](https://github.com/angular/angular/issues/13089)
+19 -36
View File
@@ -69,52 +69,35 @@ Unfortunately, we are not able to investigate / fix bugs without a minimal repro
You can file new issues by selecting from our [new issue templates](https://github.com/angular/angular/issues/new/choose) and filling out the issue template.
### <a name="pr-quality"></a> Contribution Quality
We strongly value open source contribution and pull requests from community contributors. Please note that every pull request is reviewed and merged by an actual person on the team, which does take time and effort. That is time and effort that does take away from other valuable work. With that in mind we have a minimum set of expectations that are required of any community contribution pull request that is opened.
1. Search [GitHub](https://github.com/angular/angular/pulls) for an open or closed PR that relates to your submission.
- You don't want to duplicate existing efforts.
2. Be sure that an issue or pull request clearly describes the problem you're fixing, or documents the design for the feature you'd like to add. Issues require a _minimal_ reproduction.
3. Discussing the design in an issue upfront helps to ensure that we're ready to accept your work. Pull requests are not the right place to do design work.
- When in doubt, open an issue first before doing any sort of speculative implementation work
4. Ideally the PR should be tied to an issue, but this is not required
5. The change should improve code quality (i.e. addressing a TODO) or should impact / improve a feature
6. Micro optimizations will only be accepted if they are validated by an actual benchmark
7. Do not open pull requests that are addressing feature requests that are not labeled as "help wanted" as they usually need additional design work before we could accept pull requests
8. The change should be well tested
If your pull request does not meet these minimum expectations, we may close your PR. Also, if your PR introduces a breaking change, it's possible the level of churn this breaking change causes may block our ability to move forward with it. We may close your PR in that situation, as well. Otherwise, we're excited to see your contributions and enthusiasm for Angular!
### <a name="submit-pr"></a> Submitting a Pull Request (PR)
Before you submit your Pull Request (PR) consider the following guidelines:
1. Please sign our [Contributor License Agreement (CLA)](#cla) before sending PRs.
1. Search [GitHub](https://github.com/angular/angular/pulls) for an open or closed PR that relates to your submission.
You don't want to duplicate existing efforts.
2. Be sure that an issue describes the problem you're fixing, or documents the design for the feature you'd like to add.
Discussing the design upfront helps to ensure that we're ready to accept your work.
3. Please sign our [Contributor License Agreement (CLA)](#cla) before sending PRs.
We cannot accept code without a signed CLA.
Make sure you author all contributed Git commits with email address associated with your CLA signature.
2. [Fork](https://docs.github.com/en/github/getting-started-with-github/fork-a-repo) the [angular/angular](https://github.com/angular/angular/fork) repo.
4. [Fork](https://docs.github.com/en/github/getting-started-with-github/fork-a-repo) the [angular/angular](https://github.com/angular/angular/fork) repo.
3. In your forked repository, make your changes in a new git branch:
5. In your forked repository, make your changes in a new git branch:
```shell
git checkout -b my-fix-branch main
```
4. Create your patch, **including appropriate test cases**.
6. Create your patch, **including appropriate test cases**.
5. Follow our [Coding Rules](#rules).
7. Follow our [Coding Rules](#rules).
6. Run the full Angular test suite, as described in the [developer documentation][dev-doc], and ensure that all tests pass.
8. Run the full Angular test suite, as described in the [developer documentation][dev-doc], and ensure that all tests pass.
7. Commit your changes using a descriptive commit message that follows our [commit message conventions][commit-message-guidelines].
9. Commit your changes using a descriptive commit message that follows our [commit message conventions][commit-message-guidelines].
Adherence to these conventions is necessary because release notes are automatically generated from these messages.
```shell
@@ -123,13 +106,13 @@ Before you submit your Pull Request (PR) consider the following guidelines:
Note: the optional commit `--all` command line option will automatically "add" and "rm" edited files.
8. Push your branch to GitHub:
10. Push your branch to GitHub:
```shell
git push origin my-fix-branch
```
```shell
git push origin my-fix-branch
```
9. In GitHub, send a pull request to `angular:main`.
11. In GitHub, send a pull request to `angular:main`.
### Reviewing a Pull Request
@@ -238,7 +221,7 @@ changes to be accepted, the CLA must be signed. It's a quick process, we promise
- For corporations, we'll need you to
[print, sign and one of scan+email, fax or mail the form][corporate-cla].
If you have more than one GitHub account, or multiple email addresses associated with a single GitHub account, you must sign the CLA using the primary email address of the GitHub account used to author Git commits and send pull requests.
If you have more than one GitHub accounts, or multiple email addresses associated with a single GitHub account, you must sign the CLA using the primary email address of the GitHub account used to author Git commits and send pull requests.
The following documents can help you sort out issues with GitHub accounts and multiple email addresses:
+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
+54 -49
View File
@@ -4,61 +4,50 @@ module(
name = "angular",
)
bazel_dep(name = "rules_pkg", version = "1.3.0")
bazel_dep(name = "rules_nodejs", version = "6.7.5")
bazel_dep(name = "aspect_rules_ts", version = "3.10.1")
bazel_dep(name = "aspect_rules_js", version = "3.4.1")
bazel_dep(name = "aspect_rules_esbuild", version = "0.27.0")
bazel_dep(name = "aspect_rules_jasmine", version = "2.0.4")
bazel_dep(name = "rules_pkg", version = "1.1.0")
bazel_dep(name = "rules_nodejs", version = "6.6.0")
bazel_dep(name = "aspect_rules_ts", version = "3.7.0")
bazel_dep(name = "aspect_rules_js", version = "2.6.2")
bazel_dep(name = "aspect_rules_esbuild", version = "0.23.0")
bazel_dep(name = "aspect_rules_jasmine", version = "2.0.0")
bazel_dep(name = "aspect_rules_rollup", version = "2.0.1")
bazel_dep(name = "bazel_skylib", version = "1.9.2")
bazel_dep(name = "bazel_lib", version = "3.7.2")
bazel_dep(name = "tar.bzl", version = "0.10.8")
bazel_dep(name = "yq.bzl", version = "0.4.0")
bazel_dep(name = "bazel_skylib", version = "1.8.2")
bazel_dep(name = "aspect_bazel_lib", version = "2.21.2")
bazel_dep(name = "tar.bzl", version = "0.6.0")
bazel_dep(name = "yq.bzl", version = "0.3.1")
bazel_dep(name = "rules_angular")
git_override(
module_name = "rules_angular",
commit = "5fa856469c642490a6e381a05d7f58f60fad1913",
remote = "https://github.com/angular/rules_angular.git",
commit = "4010ef96de0c46db7764adc2f262258c9de3d718",
remote = "https://github.com/devversion/rules_angular.git",
)
bazel_dep(name = "devinfra")
git_override(
module_name = "devinfra",
commit = "4a09f9588769980eacb41fcc76e2c76d048eac42",
commit = "4425eed914bab0e311066d4b930c35576b7d200e",
remote = "https://github.com/angular/dev-infra.git",
)
bazel_dep(name = "rules_sass")
git_override(
module_name = "rules_sass",
commit = "bf9d6564f57b4df94b4915086ad0e7ad49a95f37",
remote = "https://github.com/angular/rules_sass.git",
commit = "1184a80751a21af8348f308abc5b38a41f26850e",
remote = "https://github.com/devversion/rules_sass.git",
)
bazel_dep(name = "rules_browsers")
git_override(
module_name = "rules_browsers",
commit = "c37398d63f5e990d618d02f4c6fb2fefe40f1a79",
remote = "https://github.com/angular/rules_browsers.git",
commit = "6a699bf3e896690e2923cf3ade29fbd4e492e366",
remote = "https://github.com/devversion/rules_browsers.git",
)
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 = {
"24.21.0-darwin_arm64": ("node-v24.21.0-darwin-arm64.tar.gz", "node-v24.21.0-darwin-arm64", "bed7eea5325e1108f32ce5228ddd6a5f0f08a499ee42aa7442aea583702f6057"),
"24.21.0-darwin_amd64": ("node-v24.21.0-darwin-x64.tar.gz", "node-v24.21.0-darwin-x64", "1462cb3b3046b815cf8ea436d3da450ec1a9f11dac7e5a46b0ada5305d7e8097"),
"24.21.0-linux_arm64": ("node-v24.21.0-linux-arm64.tar.xz", "node-v24.21.0-linux-arm64", "6ad1325edbdb5649c379b75a237147a666c95d4f9ae8d340fef2d1575d289ad2"),
"24.21.0-linux_ppc64le": ("node-v24.21.0-linux-ppc64le.tar.xz", "node-v24.21.0-linux-ppc64le", "1936fd64623a2f98d1fb31b456686d10c30e92639899cfefdefa8835d22adccd"),
"24.21.0-linux_s390x": ("node-v24.21.0-linux-s390x.tar.xz", "node-v24.21.0-linux-s390x", "2ef7e2ecbf7a6c2f3d08d106f6b2f279419c6dac89fe91b8cad193af7890082c"),
"24.21.0-linux_amd64": ("node-v24.21.0-linux-x64.tar.xz", "node-v24.21.0-linux-x64", "fd8e59d5a511510f6a298afb548f18c7d2b1be404d8b4a27d94fbe49f56cb2d6"),
"24.21.0-windows_amd64": ("node-v24.21.0-win-x64.zip", "node-v24.21.0-win-x64", "158f7685b44de51f6c0df1d153526cbcd3e1bc739a8dfc607721cef75de9e541"),
},
node_version = "24.21.0",
)
node.toolchain(node_version = "20.19.0")
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 = "11.24.0",
pnpm_version_integrity = "sha512-vSfjRel23LC+C3oSKCF7BJqBfiGx81XJDb59xGZxiVqLwebQbCRVRQXqk+oLRfSJon7Bv7yN5qlln8oPFvoAAA==",
pnpm_version = "10.16.1",
)
use_repo(pnpm, "pnpm")
@@ -83,10 +71,10 @@ 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",
"//devtools:package.json",
"//integration:package.json",
"//modules:package.json",
"//packages/animations:package.json",
@@ -108,34 +96,32 @@ 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/project:package.json",
],
lifecycle_hooks = {
# sleep requires node-gyp rebuild but the native module is not needed in Bazel;
# disable the install hook to avoid failing builds when node-gyp is unavailable.
"sleep": [],
},
npmrc = "//:.npmrc",
pnpm_lock = "//:pnpm-lock.yaml",
verify_node_modules_ignored = "//:.bazelignore",
)
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.2 | jq -r '.dist.integrity'
ts_integrity = "sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw==",
ts_version = "6.0.3",
# Obtained by: curl --silent https://registry.npmjs.org/typescript/5.9.2 | jq -r '.dist.integrity'
ts_integrity = "sha512-CWBzXQrc/qOkhidw1OzBTQuYRbfyxDXJMVJ1XNwUHGROVmuaeiEm3OslpZ1RV96d7SKKjZKrSJu3+t/xlw3R9A==",
ts_version = "5.9.2",
)
use_repo(rules_ts_ext, **{"npm_typescript": "angular_npm_typescript"})
# TODO: Figure out how to make ng_project update whenever the packages/core::pkg target changes.
rules_angular = use_extension("@rules_angular//setup:extensions.bzl", "rules_angular")
rules_angular.setup(
name = "angular_rules_angular_configurable_deps",
angular_compiler_cli = "//:node_modules/@angular/compiler-cli",
typescript = "//:node_modules/typescript",
use_repo_rule("@rules_angular//setup:repositories.bzl", "configurable_deps_repo")(
name = "rules_angular_configurable_deps",
angular_compiler_cli = "@angular//:node_modules/@angular/compiler-cli",
typescript = "@angular//:node_modules/typescript",
)
use_repo(rules_angular, rules_angular_configurable_deps = "angular_rules_angular_configurable_deps")
override_repo(rules_angular, "rules_angular_configurable_deps")
register_toolchains(
"@devinfra//bazel/git-toolchain:git_linux_toolchain",
@@ -144,14 +130,14 @@ register_toolchains(
"@devinfra//bazel/git-toolchain:git_windows_toolchain",
)
CLDR_VERSION = "47"
CLDR_VERSION = "41"
cldr_json_data = use_repo_rule("//packages/common/locales/generate-locales-tool:cldr-data.bzl", "cldr_json_data_repository")
cldr_json_data(
name = "cldr_json_data",
urls = {
"https://github.com/unicode-org/cldr-json/releases/download/%s.0.0/cldr-%s.0.0-json-full.zip" % (CLDR_VERSION, CLDR_VERSION): "bbb9a9aac2dfc534bd18288678a5984023d11d22f712f3c33425f3214bd1def6",
"https://github.com/unicode-org/cldr-json/releases/download/%s.0.0/cldr-%s.0.0-json-full.zip" % (CLDR_VERSION, CLDR_VERSION): "649b76647269e32b1b0a5f7b6eed52e9e63a1581f1afdcf4f6771e49c9713614",
},
)
@@ -160,6 +146,25 @@ cldr_xml_data = use_repo_rule("//packages/common/locales/generate-locales-tool:c
cldr_xml_data(
name = "cldr_xml_data",
urls = {
"https://github.com/unicode-org/cldr/releases/download/release-%s/core.zip" % CLDR_VERSION: "d5ee2abac64158c04884a722f8ef4830ea22b6c74aac20185be2838db8eda788",
"https://github.com/unicode-org/cldr/releases/download/release-%s/cldr-common-%s.0.zip" % (CLDR_VERSION, CLDR_VERSION): "823c6170c41e2de2c229574e8a436332d25f1c9723409867fe721e00bc92d853",
},
)
http_archive = use_repo_rule("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")
# Fetch sauce connect (tool to open Saucelabs tunnel for Saucelabs browser tests)
http_archive(
name = "sauce_connect_linux_amd64",
build_file_content = """exports_files(["bin/sc"], visibility = ["//visibility:public"])""",
sha256 = "26b9c3630f441b47854b6032f7eca6f1d88d3f62e50ee44c27015d71a5155c36",
strip_prefix = "sc-4.8.2-linux",
url = "https://saucelabs.com/downloads/sc-4.8.2-linux.tar.gz",
)
http_archive(
name = "sauce_connect_mac",
build_file_content = """exports_files(["bin/sc"], visibility = ["//visibility:public"])""",
sha256 = "28277ce81ef9ab84f5b87b526258920a8ead44789a5034346e872629bbf38089",
strip_prefix = "sc-4.8.2-osx",
url = "https://saucelabs.com/downloads/sc-4.8.2-osx.zip",
)
+3616 -476
View File
File diff suppressed because it is too large Load Diff
+2 -2
View File
@@ -67,7 +67,7 @@ Install the Angular CLI globally:
npm install -g @angular/cli
```
Create a workspace:
Create workspace:
```
ng new [PROJECT NAME]
@@ -146,7 +146,7 @@ Join the conversation and help the community.
[angularelements]: https://angular.dev/guide/elements
[ssr]: https://angular.dev/guide/ssr
[schematics]: https://angular.dev/tools/cli/schematics
[lazyloading]: https://angular.dev/guide/routing/define-routes#lazily-loaded-components
[lazyloading]: https://angular.dev/guide/ngmodules/lazy-loading
[node.js]: https://nodejs.org/
[npm]: https://www.npmjs.com/get-npm
[codeofconduct]: CODE_OF_CONDUCT.md
-5
View File
@@ -1,5 +0,0 @@
ignore_directories([
".git",
"dist",
"**/node_modules/**",
])
+58 -94
View File
@@ -14,9 +14,8 @@ exports_files([
])
APPLICATION_FILES = [
"//adev/src/context:llms_full",
"//adev/src/assets/images",
"//adev/src/assets/images/v21-event:v21-event-images",
"//adev/src/assets/images/v22-event:v22-event-images",
"//adev/src/assets/others",
"//adev/src/assets/previews",
"//adev/src/assets:tutorials",
@@ -25,55 +24,43 @@ APPLICATION_FILES = [
"//adev/src/assets:content",
"//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"],
)
APPLICATION_DEPS = [
":node_modules/@codemirror/autocomplete",
":node_modules/@codemirror/commands",
":node_modules/@codemirror/lang-angular",
":node_modules/@codemirror/lang-css",
":node_modules/@codemirror/lang-html",
":node_modules/@codemirror/lang-javascript",
":node_modules/@codemirror/lang-sass",
":node_modules/@codemirror/language",
":node_modules/@codemirror/lint",
":node_modules/@codemirror/search",
":node_modules/@codemirror/state",
":node_modules/@codemirror/view",
":node_modules/@lezer/common",
":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",
":node_modules/@xterm/xterm",
":node_modules/algoliasearch",
":node_modules/angular-split",
":node_modules/fflate",
":node_modules/marked",
":node_modules/ngx-progressbar",
":node_modules/tailwindcss",
":node_modules/typescript",
":node_modules/@types/dom-navigation",
"//adev:node_modules/@angular-devkit/build-angular",
"//adev:node_modules/@codemirror/autocomplete",
"//adev:node_modules/@codemirror/commands",
"//adev:node_modules/@codemirror/lang-angular",
"//adev:node_modules/@codemirror/lang-css",
"//adev:node_modules/@codemirror/lang-html",
"//adev:node_modules/@codemirror/lang-javascript",
"//adev:node_modules/@codemirror/lang-sass",
"//adev:node_modules/@codemirror/language",
"//adev:node_modules/@codemirror/lint",
"//adev:node_modules/@codemirror/search",
"//adev:node_modules/@codemirror/state",
"//adev:node_modules/@codemirror/view",
"//adev:node_modules/@lezer/common",
"//adev:node_modules/@lezer/highlight",
"//adev:node_modules/@lezer/javascript",
"//adev:node_modules/@stackblitz/sdk",
"//adev:node_modules/@typescript/vfs",
"//adev:node_modules/@webcontainer/api",
"//adev:node_modules/@xterm/addon-fit",
"//adev:node_modules/@xterm/xterm",
"//adev:node_modules/algoliasearch",
"//adev:node_modules/angular-split",
"//adev:node_modules/fflate",
"//adev:node_modules/marked",
"//adev:node_modules/ngx-progressbar",
"//adev:node_modules/open-in-idx",
"//adev:node_modules/typescript",
"//adev:node_modules/xhr2",
"//adev:node_modules/@types/node",
"//adev:node_modules/@types/dom-navigation",
# The imports below are packages that our code does not directly import, but our upstream deps import from
# these locations directly. By design, rather than hoisting these packages into the "root" node_modules the
@@ -81,56 +68,32 @@ APPLICATION_DEPS = [
# a "hoisted" location within the `.aspect_rules_js/` directories in the node_modules directory. This prevents
# the bundler from being able to find it as expected. We instead specifically provide it as a dep within bazel
# as a mechanism of "hoisting" the package for our usage by this target.
":node_modules/@algolia/client-common",
":node_modules/@algolia/requester-browser-xhr",
":node_modules/@algolia/requester-node-http",
":node_modules/beasties",
":node_modules/@lezer/css",
":node_modules/@lezer/html",
":node_modules/@lezer/lr",
":node_modules/@lezer/sass",
":node_modules/@marijn/find-cluster-break",
":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/primitive",
":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",
"//adev:node_modules/@algolia/client-common",
"//adev:node_modules/@algolia/requester-browser-xhr",
"//adev:node_modules/@algolia/requester-node-http",
"//adev:node_modules/@lezer/css",
"//adev:node_modules/@lezer/html",
"//adev:node_modules/@lezer/lr",
"//adev:node_modules/@lezer/sass",
"//adev:node_modules/@marijn/find-cluster-break",
"//adev:node_modules/crelt",
"//adev:node_modules/style-mod",
"//adev:node_modules/w3c-keyname",
]
TEST_FILES = APPLICATION_FILES + glob(["src/app/**/*.spec.ts"])
TEST_FILES = APPLICATION_FILES + [
"karma.conf.js",
"test-main.ts",
] + glob(["src/**/*.spec.ts"])
TEST_DEPS = APPLICATION_DEPS + [
":node_modules/@types/jasmine",
":node_modules/karma",
":node_modules/karma-chrome-launcher",
":node_modules/karma-jasmine",
":node_modules/karma-coverage",
":node_modules/karma-jasmine-html-reporter",
":node_modules/jasmine-core",
TEST_DEPS = [
dep
for dep in APPLICATION_DEPS
if dep != "//adev:node_modules/@types/node"
] + [
"@rules_browsers//browsers/chromium",
"@rules_browsers//browsers/firefox",
"//adev/tools:windows-chromium-path",
]
ng_config(name = "ng_config")
@@ -146,7 +109,7 @@ ng_application(
"NG_BUILD_PARTIAL_SSR": "1",
},
ng_config = ":ng_config",
node_modules = ":node_modules",
node_modules = "//adev:node_modules",
project_name = "angular-dev",
serve_args = [
"--port",
@@ -172,7 +135,7 @@ ng_application(
"NG_BUILD_OPTIMIZE_CHUNKS": "1",
},
ng_config = ":ng_config",
node_modules = ":node_modules",
node_modules = "//adev:node_modules",
project_name = "angular-dev",
serve_args = [
"--port",
@@ -196,9 +159,10 @@ ng_test(
"CHROMEDRIVER_BIN": "../" + "$(CHROMEDRIVER)",
},
ng_config = ":ng_config",
node_modules = ":node_modules",
node_modules = "//adev:node_modules",
project_name = "angular-dev",
toolchains = [
"@rules_browsers//browsers/chromium:toolchain_alias",
"@rules_browsers//browsers/firefox:toolchain_alias",
],
)
+25 -12
View File
@@ -7,7 +7,9 @@
"projectType": "application",
"schematics": {
"@schematics/angular:component": {
"style": "scss"
"style": "scss",
"standalone": true,
"changeDetection": "OnPush"
}
},
"root": ".",
@@ -17,7 +19,7 @@
"build": {
"builder": "@angular/build:application",
"options": {
"externalDependencies": ["path", "xhr2"],
"externalDependencies": ["path"],
"outputMode": "static",
"outputPath": "dist",
"index": "src/index.html",
@@ -29,10 +31,9 @@
"assets": [
"src/favicon.ico",
"src/robots.txt",
"src/llms.txt",
"src/assets",
"src/assets/images/v21-event",
"src/assets/images/v22-event"
"src/context",
"src/llms.txt"
],
"styles": ["@angular/docs/styles/global-styles.scss", "./src/local-styles.scss"],
"scripts": [],
@@ -56,7 +57,7 @@
"defaultConfiguration": "production"
},
"serve": {
"builder": "@angular/build:dev-server",
"builder": "@angular-devkit/build-angular:dev-server",
"configurations": {
"production": {
"buildTarget": "angular-dev:build:production"
@@ -70,16 +71,28 @@
"buildTarget": "web-ui:build",
"headers": {
"Cross-Origin-Opener-Policy": "same-origin",
"Cross-Origin-Embedder-Policy": "credentialless"
"Cross-Origin-Embedder-Policy": "require-corp"
}
}
},
"test": {
"builder": "@angular/build:unit-test",
"extract-i18n": {
"builder": "@angular-devkit/build-angular:extract-i18n",
"options": {
"runner": "karma",
"browsers": ["ChromeHeadlessNoSandbox"],
"include": ["src/app/**/*.spec.ts"]
"buildTarget": "angular-dev:build"
}
},
"test": {
"builder": "@angular/build:karma",
"options": {
"tsConfig": "tsconfig.spec.json",
"include": ["src/app"],
"karmaConfig": "karma.conf.js",
"main": "test-main.ts",
"inlineStyleLanguage": "scss",
"assets": ["src/favicon.ico", "src/assets"],
"styles": ["@angular/docs/styles/global-styles.scss"],
"scripts": [],
"webWorkerTsConfig": "tsconfig.worker.json"
}
}
}
+2 -2
View File
@@ -49,7 +49,7 @@
"headers": [
{
"key": "Cross-Origin-Embedder-Policy",
"value": "credentialless"
"value": "require-corp"
}
]
},
@@ -71,7 +71,7 @@
},
{
"key": "Cross-Origin-Embedder-Policy",
"value": "credentialless"
"value": "require-corp"
}
]
}
+85
View File
@@ -0,0 +1,85 @@
/**
* @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
*/
// Karma configuration file, see link for more information
// https://karma-runner.github.io/1.0/config/configuration-file.html
const {getAdjustedChromeBinPathForWindows} = require('./tools/windows-chromium-path');
process.env.CHROME_BIN = getAdjustedChromeBinPathForWindows();
module.exports = function (config) {
config.set({
basePath: '',
frameworks: ['jasmine'],
plugins: [
require('karma-jasmine'),
require('karma-chrome-launcher'),
require('karma-jasmine-html-reporter'),
require('karma-coverage'),
{'reporter:jasmine-seed': ['type', JasmineSeedReporter]},
],
proxies: {
'/dummy/image': 'src/assets/images/logos/angular/angular.png',
},
client: {
clearContext: false, // leave Jasmine Spec Runner output visible in browser
jasmine: {
// you can add configuration options for Jasmine here
// the possible options are listed at https://jasmine.github.io/api/edge/Configuration.html
// for example, you can disable the random execution with `random: false`
// or set a specific seed with `seed: 4321`
random: true,
seed: '',
},
},
jasmineHtmlReporter: {
suppressAll: true, // removes the duplicated traces
},
coverageReporter: {
dir: require('path').join(__dirname, './coverage/site'),
subdir: '.',
reporters: [{type: 'html'}, {type: 'text-summary'}],
},
reporters: ['progress', 'kjhtml', 'jasmine-seed'],
port: 9876,
colors: true,
logLevel: config.LOG_INFO,
autoWatch: true,
customLaunchers: {
ChromeHeadlessNoSandbox: {
base: 'ChromeHeadless',
// See /integration/README.md#browser-tests for more info on these args
flags: [
'--no-sandbox',
'--headless',
'--disable-gpu',
'--disable-dev-shm-usage',
'--hide-scrollbars',
'--mute-audio',
],
},
},
browsers: ['ChromeHeadlessNoSandbox'],
browserNoActivityTimeout: 60000,
singleRun: false,
restartOnFileChange: true,
});
};
// Helpers
function JasmineSeedReporter(baseReporterDecorator) {
baseReporterDecorator(this);
this.onBrowserComplete = (browser, result) => {
const seed = result.order && result.order.random && result.order.seed;
if (seed) this.write(`${browser}: Randomized with seed ${seed}.\n`);
};
this.onRunComplete = () => undefined;
}
+59 -82
View File
@@ -1,105 +1,82 @@
{
"dependencies": {
"@algolia/client-common": "5.57.0",
"@algolia/client-search": "5.57.0",
"@algolia/requester-browser-xhr": "5.57.0",
"@algolia/requester-node-http": "5.57.0",
"@angular-devkit/build-angular": "20.3.6",
"@angular/animations": "workspace:*",
"@angular/aria": "22.2.0-next.5",
"@angular/build": "22.2.0-next.7",
"@angular/cdk": "22.2.0-next.5",
"@angular/cli": "22.2.0-next.7",
"@angular/build": "20.3.6",
"@angular/cdk": "20.2.10",
"@angular/cli": "20.3.6",
"@angular/common": "workspace:*",
"@angular/compiler": "workspace:*",
"@angular/compiler-cli": "workspace:*",
"@angular/compiler": "workspace:*",
"@angular/core": "workspace:*",
"@angular/docs": "workspace:*",
"@angular/forms": "workspace:*",
"@angular/material": "22.2.0-next.5",
"@angular/material": "20.2.10",
"@angular/platform-browser": "workspace:*",
"@angular/platform-server": "workspace:*",
"@angular/router": "workspace:*",
"@angular/ssr": "22.2.0-next.7",
"@codemirror/autocomplete": "6.20.3",
"@codemirror/commands": "6.11.0",
"@angular/ssr": "20.3.6",
"@codemirror/autocomplete": "6.18.6",
"@codemirror/commands": "6.8.1",
"@codemirror/lang-angular": "0.1.4",
"@codemirror/lang-css": "6.3.1",
"@codemirror/lang-html": "6.4.12",
"@codemirror/lang-javascript": "6.2.5",
"@codemirror/lang-html": "6.4.9",
"@codemirror/lang-javascript": "6.2.4",
"@codemirror/lang-sass": "6.0.2",
"@codemirror/language": "6.12.4",
"@codemirror/lint": "6.9.7",
"@codemirror/search": "6.7.1",
"@codemirror/state": "6.7.1",
"@codemirror/view": "6.43.9",
"@lezer/common": "1.5.2",
"@lezer/css": "1.3.6",
"@lezer/highlight": "1.2.3",
"@lezer/html": "1.3.13",
"@lezer/javascript": "1.5.4",
"@lezer/lr": "1.4.10",
"@lezer/sass": "1.1.0",
"@marijn/find-cluster-break": "1.0.4",
"@shikijs/core": "^4.0.0",
"@shikijs/engine-javascript": "^4.0.0",
"@shikijs/engine-oniguruma": "^4.0.0",
"@shikijs/langs": "^4.0.0",
"@shikijs/primitive": "^4.0.0",
"@shikijs/themes": "^4.0.0",
"@shikijs/types": "^4.0.0",
"@shikijs/vscode-textmate": "^10.0.2",
"@stackblitz/sdk": "1.11.1",
"@types/dom-navigation": "1.0.7",
"@types/jasmine": "6.0.0",
"@types/jsdom": "30.0.0",
"@types/node": "24.13.3",
"@typescript/vfs": "1.6.4",
"@webcontainer/api": "1.6.4",
"@xterm/addon-fit": "0.11.0",
"@xterm/xterm": "6.0.0",
"algoliasearch": "5.57.0",
"@codemirror/language": "6.11.3",
"@codemirror/lint": "6.8.5",
"@codemirror/search": "6.5.11",
"@codemirror/state": "6.5.2",
"@codemirror/view": "6.38.1",
"@lezer/common": "1.2.3",
"@lezer/highlight": "1.2.1",
"@lezer/javascript": "1.5.1",
"@stackblitz/sdk": "1.11.0",
"@types/dom-navigation": "1.0.6",
"@types/jasmine": "5.1.9",
"@types/jsdom": "21.1.7",
"@types/node": "24.3.0",
"@typescript/vfs": "1.6.1",
"@webcontainer/api": "1.6.1",
"@xterm/addon-fit": "0.10.0",
"@xterm/xterm": "5.5.0",
"algoliasearch": "5.35.0",
"angular-split": "20.0.0",
"beasties": "0.5.4",
"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.7",
"diff": "9.0.0",
"emoji-regex": "10.6.0",
"fflate": "0.8.3",
"hast-util-to-html": "^9.0.5",
"hast-util-whitespace": "^3.0.0",
"html-void-elements": "^3.0.0",
"jasmine-core": "6.3.0",
"jsdom": "30.0.1",
"diff": "8.0.2",
"emoji-regex": "10.4.0",
"fflate": "0.8.2",
"html-entities": "2.6.0",
"jasmine-core": "5.9.0",
"jsdom": "26.1.0",
"karma-chrome-launcher": "3.2.0",
"karma-coverage": "2.2.1",
"karma-jasmine-html-reporter": "2.1.0",
"karma-jasmine": "5.1.0",
"karma-jasmine-html-reporter": "2.3.0",
"marked": "18.0.11",
"mermaid": "11.17.2",
"marked": "16.2.0",
"mermaid": "11.10.0",
"ngx-progressbar": "14.0.0",
"playwright-core": "1.62.1",
"preact": "10.29.8",
"preact-render-to-string": "6.7.0",
"prettier": "3.9.6",
"property-information": "^7.1.0",
"open-in-idx": "0.1.1",
"playwright-core": "1.55.0",
"preact-render-to-string": "6.6.1",
"preact": "10.27.1",
"prettier": "3.6.2",
"rxjs": "7.8.2",
"shiki": "4.4.3",
"space-separated-tokens": "^2.0.2",
"stringify-entities": "^4.0.4",
"style-mod": "4.1.3",
"tinyglobby": "0.2.17",
"shiki": "3.11.0",
"tinyglobby": "0.2.14",
"tslib": "2.8.1",
"typescript": "6.0.3",
"w3c-keyname": "2.2.8",
"zwitch": "^2.0.4"
},
"devDependencies": {
"autoprefixer": "10.5.4",
"karma": "~6.4.4",
"postcss": "8.5.26",
"tailwindcss": "3.4.19"
"typescript": "5.9.2",
"xhr2": "0.2.1",
"zone.js": "0.15.1",
"@algolia/client-common": "5.35.0",
"@algolia/requester-browser-xhr": "5.35.0",
"@algolia/requester-node-http": "5.35.0",
"@lezer/css": "1.3.0",
"@lezer/html": "1.3.10",
"@lezer/lr": "1.4.2",
"@lezer/sass": "1.1.0",
"@marijn/find-cluster-break": "1.0.2",
"crelt": "1.0.6",
"style-mod": "4.1.2",
"w3c-keyname": "2.2.8"
}
}
-61
View File
@@ -1,61 +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",
# Public so the api-gen rendering pipeline (used from //packages/...) can validate guide
# links against the same set of routes defined for the live site.
visibility = [
"//adev:__subpackages__",
"//packages:__subpackages__",
"//tools:__subpackages__",
],
)
-74
View File
@@ -1,74 +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 {extractHeadingIds, findDuplicateIds} 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[], duplicatesByPage: Map<string, string[]>): 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 = extractHeadingIds(content);
const duplicates = findDuplicateIds(headings);
if (duplicates.length > 0) {
duplicatesByPage.set(`${item.contentPath}.md`, duplicates);
}
routes.push(
...headings.map(
(heading) => `${item.path}#${heading.toLowerCase().replace(/\s+/g, '-')}`,
),
);
}
}
if (item.children) {
routes.push(...extractRoutes(item.children, duplicatesByPage));
}
}
return routes;
}
function main() {
const allRoutes: string[] = [];
const duplicatesByPage = new Map<string, string[]>();
allRoutes.push(...extractRoutes(ALL_ITEMS, duplicatesByPage));
if (duplicatesByPage.size > 0) {
const details = Array.from(duplicatesByPage)
.map(([page, ids]) => ` ${page}: ${ids.map((id) => `#${id}`).join(', ')}`)
.join('\n');
throw new Error(
`Headings must produce a unique anchor id within a page, otherwise every link to the ` +
`anchor resolves to the first heading that claims it. Give the later heading its own ` +
`id with the \`{#custom-id}\` syntax.\n${details}`,
);
}
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();
+112
View File
@@ -0,0 +1,112 @@
/**
* @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
*/
//tslint:disable:no-console
import assert from 'node:assert';
import {execSync} from 'node:child_process';
import {existsSync, constants as fsConstants} from 'node:fs';
import {copyFile, mkdtemp, readdir, readFile, realpath, unlink, writeFile} from 'node:fs/promises';
import {tmpdir} from 'node:os';
import {join} from 'node:path';
export async function copyJsonAssets({repo, githubApi, assetsPath, destPath}) {
const buildInfoPath = join(destPath, '_build-info.json');
if (!existsSync(buildInfoPath)) {
throw new Error(`${buildInfoPath} does not exist.`);
}
assert(process.env.GITHUB_REF);
const currentBranch = process.env.GITHUB_REF;
const {sha: storedSha, branchName: storedBranch} = JSON.parse(
await readFile(buildInfoPath, 'utf-8'),
);
let downstreamBranch = currentBranch;
let latestSha = await githubApi.getShaForBranch(currentBranch);
if (
latestSha.includes('No commit') &&
currentBranch !== 'refs/heads/main' &&
currentBranch !== storedBranch
) {
// In some cases, such as when a new branch is created for a feature,
// the branch may not exist in the downstream repo. For example, during an
// exceptional minor release (e.g. FW 20.3.x and Components: 20.2.x).
// In such scenarios, we fallback to the last known branch.
latestSha = await githubApi.getShaForBranch(storedBranch);
downstreamBranch = storedBranch;
}
console.log(`Comparing ${storedSha}...${latestSha}.`);
const affectedFiles = await githubApi.getAffectedFiles(storedSha, latestSha);
const changedFiles = affectedFiles.filter((file) => file.startsWith(`${assetsPath}/`));
let shaWhenFilesChanged;
if (changedFiles.length > 0) {
console.log(
`The below files changed between ${storedSha} and ${latestSha}:\n` +
changedFiles.map((f) => '* ' + f).join('\n'),
);
const temporaryDir = await realpath(await mkdtemp(join(tmpdir(), 'copy-json-assets-')));
const execOptions = {cwd: temporaryDir, stdio: 'inherit'};
execSync('git init', execOptions);
execSync(`git remote add origin https://github.com/${repo}.git`, execOptions);
// fetch a commit
execSync(`git fetch origin ${latestSha}`, execOptions);
// reset this repository's main branch to the commit of interest
execSync('git reset --hard FETCH_HEAD', execOptions);
// get sha when files where changed
shaWhenFilesChanged = execSync(`git rev-list -1 ${latestSha} "${assetsPath}/"`, {
encoding: 'utf8',
cwd: temporaryDir,
stdio: ['ignore', 'pipe', 'ignore'],
}).trim();
// Delete existing asset files.
const apiFilesUnlink = (await readdir(destPath))
.filter((f) => f.endsWith('.json'))
.map((f) => unlink(join(destPath, f)));
await Promise.allSettled(apiFilesUnlink);
// Copy new asset files
const tempAssetsDir = join(temporaryDir, assetsPath);
const assetFilesCopy = (await readdir(tempAssetsDir)).map((f) => {
const src = join(tempAssetsDir, f);
const dest = join(destPath, f);
return copyFile(src, dest, fsConstants.COPYFILE_FICLONE);
});
await Promise.allSettled(assetFilesCopy);
console.log(`Successfully updated asset files in '${destPath}'.\n`);
} else {
console.log(`No '${assetsPath}/**' files changed between ${storedSha} and ${latestSha}.`);
}
// Write SHA to file.
await writeFile(
buildInfoPath,
JSON.stringify(
{
branchName: downstreamBranch,
sha: shaWhenFilesChanged ?? storedSha,
},
undefined,
2,
),
);
// The below command will show uncommitted changes.
// This is expected because the framework repo and component/cli might have different minors
// (e.g. during exceptional minor releases), leading to changes that need to be committed.
console.log('\nChanges: ');
execSync(`git status --porcelain`, {stdio: 'inherit'});
}
+77
View File
@@ -0,0 +1,77 @@
/**
* @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 {get} from 'node:https';
import {posix} from 'node:path';
const GITHUB_API = 'https://api.github.com/repos/';
export class GithubClient {
#token;
#ua;
#api;
constructor(repo, token, ua) {
this.#token = token;
this.#ua = ua;
this.#api = posix.join(GITHUB_API, repo);
}
/**
* Get the affected files.
*
* @param {string} baseSha
* @param {string} headSha
* @returns Promise<string[]>
*/
async getAffectedFiles(baseSha, headSha) {
const {files} = JSON.parse(await this.#httpGet(`${this.#api}/compare/${baseSha}...${headSha}`));
return files.map((f) => f.filename);
}
/**
* Get SHA of a branch.
*
* @param {string} branch
* @returns Promise<string>
*/
async getShaForBranch(branch) {
const sha = await this.#httpGet(`${this.#api}/commits/${branch}`, {
headers: {Accept: 'application/vnd.github.VERSION.sha'},
});
if (!sha) {
throw new Error(`Unable to extract the SHA for '${branch}'.`);
}
return sha;
}
#httpGet(url, options = {}) {
options.headers ??= {};
options.headers['Authorization'] = `token ${this.#token}`;
// User agent is required
// https://docs.github.com/en/rest/overview/resources-in-the-rest-api?apiVersion=2022-11-28#user-agent-required
options.headers['User-Agent'] = this.#ua;
return new Promise((resolve, reject) => {
get(url, options, (res) => {
let data = '';
res
.on('data', (chunk) => {
data += chunk;
})
.on('end', () => {
resolve(data);
});
}).on('error', (e) => {
reject(e);
});
});
}
}

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