30825 Commits

Author SHA1 Message Date
Angular Robot 314d732dce build: update dependency @babel/generator to v7.25.0 (#57152)
See associated pull request for more information.

PR Close #57152
2024-07-29 13:50:15 -07:00
Andrew Scott 3a63c9ebbe fix(core): errors during ApplicationRef.tick should be rethrown for zoneless tests (#56993)
The behavior of `ComponentFixture` for zoneless tests was decided somewhat through guesswork, trial, and error. In addition, working on the zoneless fixture revealed oddities in the behavior of the zone-based fixture, or behaviors that we felt were counterintuitive. The most consequential difference is how change detection works: `detectChanges` goes through ApplicationRef.tick in zoneless while it is `changeDetectorRef.detectChanges` in the zone fixture.

We felt that running change detection through `ApplicationRef.tick` was important for several reasons:
* Aligning application behavior more closely with the test behavior (almost all views are attached to application ref in reality)
* Ensuring that afterRender* hooks are executed when calling `fixture.detectChanges`
* Ensuring that the change detection runs again if render hooks update state

This change, however, has some noticeable consequences that will break some tests, mostly around how errors are handled. `ApplicationRef.tick` catches errors that happen during change detection and reports them to the ErrorHandler from DI. The default error handler only logs the error to the console. This will break tests which have `expect(() => fixture.detectChanges()).toThrow()`. In addition, it allows tests to pass when there are real errors encountered during change detection.

This change ensures that errors from `ApplicationRef.tick` are rethrown
and will fail the test. We should also do a follow-up investigation to
determine whether we can/should also do this for the zone-based
`ComponentFixture`.

fixes #56977

PR Close #56993
2024-07-29 13:49:00 -07:00
Aristeidis Bampakos b3b9bd8925 docs: use new blog in links of new documentation (#56052)
PR Close #56052
2024-07-29 13:48:37 -07:00
Tyler Hendrickson 2eb2d445db docs: improve spelling and grammar for error NG0956 (#57164)
PR Close #57164
2024-07-29 13:48:06 -07:00
Matthieu Riegler f1c8f9765e docs(docs-infra): fix visual glitch, (#57172)
When on a certain width, the tab-bar width glitch back-and-forth and forcing the 2 other buttons to reduce their width. This glitches appeared when we introduced that 2nd button.

fixes #57143

PR Close #57172
2024-07-29 13:47:38 -07:00
Kristiyan Kostadinov ba0df30ef6 fix(migrations): remove unused imports in inject migration (#57179)
The `inject` migration can leave some unused imports behind when it removes decorators like `@Inject`. These changes add some logic to remove them.

PR Close #57179
2024-07-29 13:47:14 -07:00
Kristiyan Kostadinov 7a40234fb7 refactor(migrations): optimize some of the import utilities (#57179)
Makes a few optimizations in the utilities we use for dealing with imports in migrations. I didn't end up using these in the inject migration, but they should still come in handy. Includes:
1. Exiting `isReferenceToImport` early when the node being checked is an identifier and it doesn't match the identifier of the import. This saves us some type checker calls.
2. Adds the ability to pass a single string to `getImportSpecifiers`. This saves us unnecessary arrays and for loops.

PR Close #57179
2024-07-29 13:47:14 -07:00
Kristiyan Kostadinov 2ffa417665 refactor(migrations): add the ability to remove imports in the change tracker (#57179)
Updates the `ChangeTracker` to integrate the changes from #57110.

PR Close #57179
2024-07-29 13:47:14 -07:00
Kristiyan Kostadinov 67e09404db fix(compiler): reduce chance of conflicts between generated factory and local variables (#57181)
Currently we use some short variable names like `t` and `r` in the generated factory functions. They can conflict with local symbols with the same names, if they're used for DI.

These changes add a `ɵ` to the generated variables to reduce the chance of conflicts.

Fixes #57168.

PR Close #57181
2024-07-29 13:46:48 -07:00
Alan Agius d108320ea3 ci: replace matchDepPatterns with matchPackageNames (#57175)
Dev-infra recently upgraded to Renovate version 38. This update causes `matchDepPatterns` to only accept RegExp. Since we require a glob pattern, we will now use `matchPackageNames`, which supports glob patterns and is already used in the configuration.
2024-07-29 10:50:45 +02:00
marktechson ca8bd5be99 docs: add open in IDX support (#57099)
This change adds a menu to the in-browser code editor on adev and adds the option for open in IDX.

PR Close #57099
2024-07-26 10:02:57 -07:00
cexbrayat 56816bbdb2 refactor(compiler-cli): typo in compilePoisonedComponents option name (#57126)
The recently introduced option (in a22f1428) has a typo in its name

PR Close #57126
2024-07-26 10:02:34 -07:00
Kristiyan Kostadinov 2158b8dafb refactor(compiler-cli): add the ability to remove imports from the import manager (#57110)
Extends the `ImportManager` to allow for imports to be removed. This will be useful in automated migrations.

PR Close #57110
2024-07-26 10:01:18 -07:00
Andrew Scott be45346f2d fix(docs-infra): only run matchMedia on client (#57121)
Use afterNextRender to avoid running matchMedia on the server

PR Close #57121
2024-07-26 10:00:55 -07:00
Kristiyan Kostadinov aae9646a1b fix(migrations): unwrap injected forwardRef (#57127)
Updates the inject migration to unwrap the `forwardRef` call in cases like `constructor(@Inject(forwardRef(() => Foo)) foo: Foo);`, because the `forwardRef` will type the initializer to `any` and it shouldn't be necessary.

PR Close #57127
2024-07-26 10:00:32 -07:00
Kristiyan Kostadinov cb442a0ce7 fix(migrations): account for parameters with union types (#57127)
This can up in Material where we had a `constructor(@Optiona() foo: Foo | null)` which ended up producing incorrect code, because the union type was preserved.

These changes resolve the issue by picking out the first non-literal type from the union for the `inject` call.

PR Close #57127
2024-07-26 10:00:32 -07:00
Kristiyan Kostadinov 1cf616f671 fix(migrations): remove generic arguments from the injected type reference (#57127)
Currently if an injected type has type arguments, we copy it over together with the type arguments to inject, because `inject()` isn't able to infer the generic properly otherwise. E.g. if there's `constructor(el: ElementRef<HTMLElement>)` we produce `inject<ElementRef<HTMLElement>>(ElementRef<HTMLElement>);`.

These changes drop the generics from the `inject()` parameter since we're overwriting the type anyway. The example from above would become `inject<ElementRef<HTMLElement>>(ElementRef);`.

PR Close #57127
2024-07-26 10:00:32 -07:00
Kristiyan Kostadinov 166166d79e fix(migrations): add alias to inject migration (#57127)
Adds a shorter alias to the inject migration.

PR Close #57127
2024-07-26 10:00:32 -07:00
Kristiyan Kostadinov 0f0a1f2836 fix(compiler-cli): emitting references to ngtypecheck files (#57138)
Follow-up to #56961 which doesn't appear to have caught all the cases. This change moves the pre-emit untagging to `NgCompiler.prepareEmit` which seems to cover a bit more comared to `NgtscProgram.emit`.

Fixes #57135.

PR Close #57138
2024-07-26 10:00:05 -07:00
cexbrayat ca89ef9141 fix(core): handle shorthand assignment in the inject migration (#57134)
Currently the migration updates:

```ts
constructor(@Inject(LOCALE_ID) locale: string) {
  console.log({ locale });
}
```

to:

```ts
constructor() {
  console.log({ locale });
}
```

This fixes the migration, and results in:

```
constructor() {
  const locale = inject(LOCALE_ID);
  console.log({ locale });
}
```

PR Close #57134
2024-07-25 18:43:45 -07:00
Andrew Scott 6609a94733 release: cut the v18.2.0-next.2 release 18.2.0-next.2 2024-07-24 11:34:08 -07:00
Andrew Scott c2779eb9f1 docs: release notes for the v18.1.2 release 2024-07-24 10:57:01 -07:00
Matthieu Riegler a7b973eac5 docs(docs-infra): Use shiki for code highlighting (#57059)
PR Close #57059
2024-07-24 10:24:51 -07:00
Matthieu Riegler d5fbe11e40 docs(docs-infra): disable experimental decorators (#56257)
Also enable useDefineForClassFields and disable downlevelIteration

PR Close #56257
2024-07-24 10:18:21 -07:00
Andrew Scott 0e439d78c2 Revert "fix(router): Scroller should scroll as soon as change detection completes (#55105)" (#57115)
This reverts commit 66ffeca2de.

It looks like nuxt encountered the same issue with scrolling when
waiting for Vue's `nextTick`, which is a microtask. This would have
similar timing to ZoneJS's rendering in the microtask queue. This
reverts to a `setTimeout` alone, though recreates the problem in #53985.
This was also mentioned in one of the comments in the Nuxt issue and the
solution would be `rAF`.

In order to address #53985, we'd likely want to use the `race(rAF, setTimeout)`
that we use in the zoneless and coalescing schedulers. This would have effectively the same timing as
the `afterNextRender` implementation here with zoneless, but quite
different timing to `afterNextRender` with ZoneJS.

fixes #57109

PR Close #57115
2024-07-24 10:04:38 -07:00
Tom Wilkinson 83117f1a0d refactor(core): Switch to using concat rather than spread operator for events. (#57103)
Internally, the JSCompiler does not dead code eliminate this code when its using spread.

PR Close #57103
2024-07-23 15:54:23 -07:00
Andrew Scott 43515a38d0 test(docs-infra): fix test with slight adjustment to error handling (#57104)
The test was broken because multiple errors happen and the last error would be the displayed message.
However, in this case, those errors happen because the initial one already terminated the container
so the follow-up errors are a result of the service being in an unexpected state

PR Close #57104
2024-07-23 15:45:54 -07:00
Andrew Scott c578239d6c test(docs-infra): update adev tests to be zoneless (#57100)
Updates adev tests to use zoneless and remove
fakeAsync/waitForAsync/tick

PR Close #57100
2024-07-23 14:50:32 -07:00
Angular Robot d7860a5a13 build: update all non-major dependencies (#57092)
See associated pull request for more information.

PR Close #57092
2024-07-23 12:18:33 -07:00
Kristiyan Kostadinov bb977e0ba9 refactor(migrations): use common import manager for schematics (#57096)
Updates the schematics to reuse the common `ImportManager`, instead of having to maintain a separate one.

PR Close #57096
2024-07-23 12:17:41 -07:00
Kristiyan Kostadinov b464c3d786 refactor(compiler-cli): import manager not picking up some options (#57096)
Fixes that the `ImportManager` wasn't picking up some of its configuration options.

PR Close #57096
2024-07-23 12:17:41 -07:00
Kristiyan Kostadinov 6cbcef237e refactor(compiler-cli): add alias option to the import manager (#57096)
Updates the import manager to allow for a specific alias to be passed in. This is a prerequisite for switching schematics to the new import manager.

Note that passing in an alias disables identifier conflict resolution in order to avoid rewriting the alias that was passed in explicitly. For now this is fine since we have a very narrow use case for it, but we may want to revisit it in the future.

PR Close #57096
2024-07-23 12:17:41 -07:00
Angular Robot a50a81cb1a build: update github/codeql-action action to v3.25.13 (#57091)
See associated pull request for more information.

PR Close #57091
2024-07-23 10:29:16 -07:00
Paul Gschwendtner ad230630d6 test(migrations): adds golden tests for the signal input migration (#57082)
This commit adds golden tests for the signal input migration, along with
a tool to execute and automatically test the migration via the batch
mode, treating a single file as compilation unit.

PR Close #57082
2024-07-23 10:28:11 -07:00
Paul Gschwendtner e0ff4f5386 refactor(migrations): add batching helper for signal migration (#57082)
This commit adds the batching logic helpers for running the signal
migration as a sharded/parallel action in Google3 and potentially
externally. The helpers are the main entry points for go/tsunami.

PR Close #57082
2024-07-23 10:28:11 -07:00
Paul Gschwendtner 03b4c3b622 refactor(migrations): add main entry points for signal migration (#57082)
Adds the main entrypoint for the signal migration. These invoke the
individual phases and expose helpers.

PR Close #57082
2024-07-23 10:28:11 -07:00
Paul Gschwendtner f1ad9f9893 refactor(migrations): add phase for migrating inputs and references (#57082)
Adds the migration phase for migrating inputs and references. Thise
phase may execute as the third step when batching.

The migration is intentionally split into three phases:

1. Extract and analyze
2. Inheritance merge / merge of metadata
3. Migrate

This allows us to batch the migration in Google3, or for large projects,
merge metadata, and then batch-execute migration for computation of
replacements. This is compatible with Google's LSC tsunami tool.

PR Close #57082
2024-07-23 10:28:11 -07:00
Paul Gschwendtner 4c5081182f refactor(migrations): add advisors for problematic patterns (#57082)
E.g. detects `spyOn(myComp, 'input')`. This is problematic
as `input` no longer provides access to the raw value via property
access, but via a getter. The `spyOn` would be effictively a noop,
causing tests to fail. We skip such inputs for safety right now.

Similarly, we have an advisor for correcting type safety loss
with `.componentInstance` in unit tests. This is a common pattern
but is typed in Angular core as `any`. This breaks resolution of
references and we accidentally miss those. This advisor mitigates that.

PR Close #57082
2024-07-23 10:28:11 -07:00
Paul Gschwendtner 466b647917 refactor(migrations): check for incompatible input patterns and inheritance (#57082)
Adds logic to the signal input migration for checking incompatible
patterns and inheritance.

PR Close #57082
2024-07-23 10:28:11 -07:00
Paul Gschwendtner ed4f43cf64 refactor(migrations): logic for detecting and capturing references to inputs (#57082)
This commit adds the logic for detecting and capturing references to
Angular `@Input`s. Those references may be migrated to unwrap signals
as part of the migration; or are refactored into temporary variables.

This commit detects and captures:

- host bindings references
- template references
- TypeScript references

PR Close #57082
2024-07-23 10:28:11 -07:00
Paul Gschwendtner 95ef7f4146 refactor(migrations): add AST traversal for detecting references in templates and host bindings (#57082)
This commit adds logic for AST traversing Angular HTML templates and
detecting references to Angular `@Input`s that may be migrated.

In addition, the expression visitor logic is built in a generic way so
that it can also be used for finding references in host binding
expressions— where no type check block information is available.

PR Close #57082
2024-07-23 10:28:11 -07:00
Paul Gschwendtner 9bda2c3fa3 refactor(migrations): initial logic for converting @Input() to input (#57082)
This commit includes the initial logic for converting `@Input()` to
`input`. The logic is not fully polished in terms of what use-cases
and patterns we want to generate, but it's working pretty stable
with testing in Angular Material and some g3 targets.

We may improve this and e.g. generate the `input()` shorthand in a
couple of cases.

The commit also includes some related helpers/parts that are needed
for the migration phases.

Notably the conversion phase is split up into preparation and migration.
That is necessary because as part of analysing we already try to
prepare to see if it's "possible". This is necessary for the global
metadata analysis, so that we can know that certain references are
incompatible across compilation units (e.g. when running as a batch).

PR Close #57082
2024-07-23 10:28:11 -07:00
Paul Gschwendtner b5d610062b refactor(migrations): phase for recognizing inputs in program (#57082)
This introduces the phase for recognizing inputs the migration
target program, extracting input metadata.

PR Close #57082
2024-07-23 10:28:11 -07:00
Paul Gschwendtner a196c8d8db refactor(migrations): add initial helpers and registry for tracking inputs (#57082)
This commit adds the initial set of helpers and registries for tracking
inputs discovered in the signal input migration.

A few short summary notes:

- Every input has an unique key. This key is used for global analysis
  that may be performed when the migration is executed on a per
  individual unit basis in Google3 via e.g. go/tsunami — The keys allow
  us to build a combined global metadata for e.g. references or figuring
  out which inputs are incompatible or not.

- A known input may be _any_ input in an compilation unit/ the program.
  E.g. even inputs from `d.ts`. We keep track of these inputs so that we
  can later figure out if a reference `ts.Identifier` points to any of
  those. In addition it allows us to attach incompatibility metadata to
  those. I.e. incompatible for migration because "something writes to
  the input".

PR Close #57082
2024-07-23 10:28:11 -07:00
Paul Gschwendtner 521a8d287b refactor(migrations): initial flow analysis logic for input migration (#57082)
This commit introduces the initial flow analysis logic for the input
migration. The flow analysis will allow us to determine which references
inside a flow container participate potentially in narrowing.

We can then use this information and the proposed restructred accesses
to refactor the accesses to use temporary variables where needed. E.g.

```
if (this.input) {
  this.input.charAt(0);
}
```

```
const input_1 = this.input();
if (input_1) {
  input_1.charAt(0);
}
```

Notably we could easily, naively figure out similar references in a flow
container and always use temporary variables, but this approach allows
us to minimally introduce such variables and this commonly leaves code
very readable when no narrowing was involved (noticable in g3 tests)

E.g. simple cases like:

```
this.input.bla();
this.input.bla();
```

would otherwise result in refactored expressions, leveraging a temporary
variable.

PR Close #57082
2024-07-23 10:28:11 -07:00
Paul Gschwendtner a22f1428b7 refactor(compiler): support use of poisoned data as private compiler option (#57082)
This allows use of poisoned data for migrations. Right now, migrations
often enable this flag by creating some deeper structures of the
Angular compiler, but with this change it's easier to enable as a
private compiler option.

This is helpful for migrations, specifically the signal input migration
as it allows us to generate as much TCB code as possible, for reference
resolution.

PR Close #57082
2024-07-23 10:28:10 -07:00
Paul Gschwendtner bf853b7c67 refactor(compiler): expose information about inputs from inputs field (#57082)
This commit exposes metadata about inputs that are defined inside
the `inputs` field of `@Directive` or `@Component` class decorators

This is useful and necessary information for migrations, like the
signal inputs migration.

PR Close #57082
2024-07-23 10:28:10 -07:00
Andrew Scott 8718abce90 fix(core): Deprecate ignoreChangesOutsideZone option (#57029)
This option was introduced out of caution as a way for developers to opt out of the new behavior in v18 which schedule change detection for the above events when they occur outside the Zone. After monitoring the results post-release, we have determined that this feature is working as desired and do not believe it should ever be disabled by setting this option to `true`.

PR Close #57029
2024-07-23 10:10:48 -07:00
Kristiyan Kostadinov d4ff6bc0b2 fix(compiler-cli): add warning for unused let declarations (#57033)
Adds a new extended diagnostic that will flag `@let` declarations that aren't used within the template. The diagnostic can be turned off through the `extendedDiagnostics` compiler option.

PR Close #57033
2024-07-23 08:27:17 -07:00
Kristiyan Kostadinov 6c2fbda694 fix(compiler-cli): extended diagnostic visitor not visiting template attributes (#57033)
Fixes that the visitor which is used to implement template diagnostics isn't visiting the template attributes of structural directives.

PR Close #57033
2024-07-23 08:27:17 -07:00