Commit Graph

12217 Commits

Author SHA1 Message Date
Paul Gschwendtner 6fa1b3859c refactor(migrations): do not fail on templates that are string concatenated (#57735)
This is a pattern sometimes seen in test components. We shouldn't fail
the migration unexpectedly here.

PR Close #57735
2024-09-09 17:16:14 +00:00
Paul Gschwendtner b039aed18f refactor(migrations): gracefully handle resource loading issues (#57735)
This can happen when we manually parse templates and end up with an
invalid URL. We should not fail the migration in those cases.

PR Close #57735
2024-09-09 17:16:14 +00:00
Pawel Kozlowski cbec46a51d feat(migrations): migrate .pipe calls in outputs used in tests (#57691)
This change uses the outputToObservable utility function to
convert migrated outputs to Observables. This happens only
in test files as it is a common practice to use RxJS to listen
to events raised by the component under test.

PR Close #57691
2024-09-09 14:10:37 +00:00
Pawel Kozlowski 3a264db866 fix(migrations): properly handle comments in output migration (#57691)
This change contains a fix that takes into account comments
attached to outputs and preserves / removes those as needed.

PR Close #57691
2024-09-09 14:10:37 +00:00
Kristiyan Kostadinov 40ff18f87a fix(compiler): produce less noisy errors when parsing control flow (#57711)
Currently several parsing errors in the new control flow (e.g. missing `track` expression) produce errors whose span targets the entire block. This can be really noisy in the IDE where the error can span many lines in the template.

These changes switch to highlighting just the start of the block.

PR Close #57711
2024-09-09 14:10:01 +00:00
Paul Gschwendtner 4f52678560 refactor(migrations): avoid flow node traversal limit by optimizing traversal (#57719)
Instead of traversing the same paths multiple times, we should avoid
this extra work and optimize. This solves some issues in super large
files with extremely complex flow graphs. E.g. large `ngOnChanges`
functions in Pantheon.

For an example of a flow graph where it doesn't make sense to re-visit
nodes that have multiple incoming edges, see this internal screenshot:
https://screenshot.googleplex.com/6ub4e5e5gbzJAvH

PR Close #57719
2024-09-08 17:11:51 +00:00
Paul Gschwendtner 2e60eb08f4 refactor(migrations): ensure project paths respect root directories (#57677)
Migrations may resolve files in e.g. `blaze-out` and try to compute a
path for the file that is "recognizable" across workers. E.g. in one
worker, it may be the actual `.ts` file inside the source tree, while in
the other, the file may be inside `blaze-out`.

Tsurge currently expects project relative paths to be passed around.
Those project relative paths are currently only based on the single root
directory. Hence paths inside `blaze-out` would actually not be
recognizable.

The fix idea here is that we introduce a structure for Project files.
This structure will contain two fields:

- an ID of a file. This is similar to a module ID in the project. Those
  are resolved with respect to all root directories. This matches the
  conceptual virtual roots of `tsconfig#rootDirs`. The IDs can be used
  for matching files across workers, assuming those are executing using
  the same root directories, and handle the same overall project (e.g.
  google3).

- a path relative to the primary project root. Multiple roots may be
  configured, but the primary project root, is the directory that
  contains all others. See: `tsconfig.rootDir`. This path is NOT
  necessarily useful for matching files between stages etc, but it's
  useful for writing replacements for a given file to disk.

Note that those two things cannot be combind into one conceptual
"project relative path" because a path relative to the most appropriate
root directory cannot be used for safe replacements. E.g. consider a
replacement matches a file from a root directory like `/sub/`. The path
inside `/sub/` would then omit the `/sub/` and later on when writing
replacements, we wouldn't know which root directory it actually was part
of. Hence the concept of a "project root relative path" and the "ID".

ds

PR Close #57677
2024-09-06 19:44:07 +00:00
Matthieu Riegler 6ea8e1e9aa feat(core): Add a schematics to migrate to standalone: false. (#57643)
With the framework enabling `standalone` by default (making module based an opt-in), the migration will migrate none-standalone existing components and add `standalone: false` to the decorator.

PR Close #57643
2024-09-06 15:08:51 +00:00
Kristiyan Kostadinov fc95a9adff fix(migrations): replace leftover modules with their exports during pruning (#57684)
Currently during the module pruning stage of the standalone migration we assume that any leftover modules which only have `imports` and `exports` can safely be removed. That can be incorrect for the cases where some parts of the app were converted to standalone outside of the migration.

These changes update the logic so that such modules are replaced with the `exports` which are used within the specific component.

Fixes #51420.

PR Close #57684
2024-09-06 14:15:50 +00:00
Matthieu Riegler 1698bd3ed8 refactor(compiler-cli): Do extract symbols from private modules. (#57611)
Modules like `core/primitives` are considered private and their symbols shouldn't be exposed nor linked in the docs.

PR Close #57611
2024-09-06 14:15:18 +00:00
Dylan Hunn f063a75eae refactor(language-service): Allow language service diagnostics to be ignored (#57675)
Add a check to the language service that ignores specified diagnostic codes. This will be useful in g3.

The codes to ignore are exposed as part of the PluginConfig.

Fixes github.com/angular/vscode-ng-language-service/issues/1243

PR Close #57675
2024-09-06 14:14:47 +00:00
Paul Gschwendtner 227d13b86d refactor(migrations): preserve brace spacing when applying imports (#57672)
Currently the import manager always add a space after the import clause
brace. We should only do this if the existing import did the same.

PR Close #57672
2024-09-05 19:33:04 +00:00
Paul Gschwendtner 00852118cc refactor(migrations): preserve multi-line imports if possible when editing imports (#57672)
Currently whenever we apply the import manager changes in migations, we
leave the decision of multi-line or single-line to the TS printer.

This works, but in practice can cause signficiant file jumps/changes if
there are large imports that aren't wrapped for example, or the other
way around. We should try to be minimal here and preserve the existing
formatting, assuming that a multi-line import remains multi-line, while
a single-line import remains single-line if it already had many items in
a single line, intentionally.

PR Close #57672
2024-09-05 19:33:04 +00:00
Paul Gschwendtner 8f40b25635 docs(migrations): clarify usage of shouldMigrateInput config option (#57672)
Clarifies some details of the `shouldMigrateInput` configuration option
of the signal input migration.

PR Close #57672
2024-09-05 19:33:04 +00:00
Paul Gschwendtner b0f5d5549e refactor(migrations): best effort mode should respect ignored inputs (#57672)
Whenever the signal input migration runs in VSCode, other inputs are
marked as incompatible via the config. Best effort mode currently skips
those incompatibilities and still migrates them. This is incorrect as
the config intends to skip those inputs, regardless of best effort mode.

PR Close #57672
2024-09-05 19:33:04 +00:00
Paul Gschwendtner cf88d8a8c1 refactor(language-service): align signal input refactoring messages (#57672)
This ensures they follow the same pattern.

PR Close #57672
2024-09-05 19:33:04 +00:00
Paul Gschwendtner 7e54a944cc refactor(migrations): avoid comments leaking from TCB into input migration (#57672)
The migration took a type from the directive handler metadata, and
inserted it into a synthetic node for the new input() call. This works
perfectly fine, but in some cases, I saw some `T:VAE` comments attached
🤯  These are from the type checker which attached
synthetic comments to the exact same node.

PR Close #57672
2024-09-05 19:33:03 +00:00
Pawel Kozlowski 68e5370a66 feat(migrations): remove complete calls for migrated outputs (#57671)
This change removes superflous .complete calls for the migrated outputs.

PR Close #57671
2024-09-05 14:13:42 +00:00
Pawel Kozlowski f1bbbeab0c test(migrations): add more tests to output migration (#57671)
This change contains an additonal test that captures scenario
of the problematic .pipe usage outside of the directive class.

PR Close #57671
2024-09-05 14:13:42 +00:00
Paul Gschwendtner f6c40f1ba1 refactor(migrations): expose all input migration helpers (#57659)
Instead of encouraging deep imports, we should expose commonly accessed
exports in a `index.ts` barrel file.

PR Close #57659
2024-09-04 20:07:18 +00:00
Paul Gschwendtner c3f2420877 refactor(migrations): use proper suffix for object expansion input variables (#57659)
Whenever we migrate object expansion patterns, we may need a temporary
variable to generate a construct like:

```ts
const {bla: blaValue} = this;
const bla = blaValue();
```

We should instead use `blaInput` as the name for the temporary
variable. For narrowing constants, `blaValue` is correct, but here
it's an actual reference to the input / signal.

PR Close #57659
2024-09-04 20:07:18 +00:00
Paul Gschwendtner aa439662af refactor(migrations): speed up migration for subset of signal inputs (#57659)
With the preparation work from previous commits, we are able to reduce
analysis time of the migration from e.g. whole Material repo 7seconds to
0.1seconds when the migration is invoked via the VSCode extension.

This is possible because we can avoid many expensive type checking
lookups if we know what inputs are actually migrated. We do this by
adding some naive pre-check to see if identifiers are possibly pointing
to a migrated input.

This is possible now because we no longer migrate aliased identifiers
for object expansion, but instead migrate directly at object
expansion declaration. This allows us to assume that all possible
references to inputs must go through identifiers that are named like
the original input class field name.

PR Close #57659
2024-09-04 20:07:18 +00:00
Paul Gschwendtner f694acb587 refactor(language-service): improve error messaging for signal input refactoring (#57659)
Instead of printing the enum name as the reason why migration did not
complete, we should print some human-readable descriptions.

This commit implements this. This logic may also be useful for the
devkit comment generation, or CLI usage.

In addition, we expose another VSCode refactoring to try via best effort
mode. There is no way for prompting, or adding multiple actions for the
same refactoring, so we expose a new refactoring.

PR Close #57659
2024-09-04 20:07:18 +00:00
Paul Gschwendtner 9c31ba95e5 refactor(migrations): properly apply edits in signal input refactoring action (#57659)
The language service expects absolute paths, but Tsurge only deals with
project relative paths. This commit fixes this.

PR Close #57659
2024-09-04 20:07:18 +00:00
Paul Gschwendtner d8338b5f87 refactor(migrations): generate blocks to support narrowing inside arrow function (#57659)
Whenever the signal migration discovers multiple references in the same
control flow container, it assumes narrowing and wants to preserve this
functionality. It does this by introducing temporary variables.

This works fine, but currently there is an edge case with arrow
functions, as those can also turn into blocks, but aren't considered as
such in the current code. This commit fixes this, so that arrow
functions will be converted to be block-based if necessary.

PR Close #57659
2024-09-04 20:07:17 +00:00
Pawel Kozlowski 9da21f798d feat(migrations): replace .next usage on outputs (#57654)
This commits extends the decorator-based output migration
to replace .next usage (not supported with the output function)
with .emit (supported in both decorator-based and function based
outputs).

PR Close #57654
2024-09-04 17:05:56 +00:00
Pawel Kozlowski 71f5ef2aa5 fix(migrations): change imports to be G3 compatible (#57654)
A set of fixes to the import paths - the goal is to make the
output migration compatible with the G3 infrastructure.

PR Close #57654
2024-09-04 17:05:56 +00:00
Kristiyan Kostadinov 8da9fb49b5 feat(language-service): add code fix for unused standalone imports (#57605)
Adds an automatic code fix to the language service that will remove unused standalone imports.

PR Close #57605
2024-09-03 14:30:56 -07:00
Kristiyan Kostadinov a2e4ee0cb3 feat(compiler): add diagnostic for unused standalone imports (#57605)
Adds a new diagnostic that will report cases where a declaration is in the `imports` array, but isn't being used anywhere. The diagnostic is reported as a warning by default and can be controlled using the following option in the tsconfig:

```
{
  "angularCompilerOptions": {
    "extendedDiagnostics": {
      "checks": {
        "unusedStandaloneImports": "suppress"
      }
    }
  }
}
```

**Note:** I'll look into a codefix for the language service in a follow-up.

Fixes #46766.

PR Close #57605
2024-09-03 14:30:56 -07:00
Paul Gschwendtner a777bee3de refactor(migrations): improve element binding migration for input migration (#57645)
Currently we detect element bindings as normal references and inside
usages we simply unwrap its usages. This works, but breaks in situations
like the following:

- When the expressions are narrowed. Narrowing analysis does not support
  aliased inputs. E.g. `const {myInput: alias} = this`. We could add
  this, but it would complexify the logic.

- When binding patterns deeply access value properties directly. E.g.
  `const {myInput: {value}} = this;`

In addition, the current approach requires us to understand that aliases
may point to inputs. This means we need to check all identifiers if they
point to Angular inputs. We could optimize this, but it's much easier if
we can simply assume that we only need to "verify" identifiers that have
names of "known inputs". This would significantly speed up turnaround in
the language service integration.

In addition, it would be more _correct_, semantically to directly access
the value of the input at object expansion, versus later.

PR Close #57645
2024-09-03 14:29:55 -07:00
Paul Gschwendtner 0764981f3a refactor(migrations): add performance logging for input reference lookups (#57645)
Adds logic to capture performance timings when resolving input
references. This is useful for debugging and improving integration in
the VSCode extension.

PR Close #57645
2024-09-03 14:29:55 -07:00
Paul Gschwendtner 61dfb2b03f refactor(migrations): share ts.Printer for signal input migration (#57645)
Instead of re-creating printers everywhere, we should re-use the same
printer throughout the migration.

PR Close #57645
2024-09-03 14:29:54 -07:00
Paul Gschwendtner ec94e1ecb0 refactor(migrations): move reference signal input migration into dedicated file (#57645)
Moves the rather complicated reference migration logic for the input
migration into a separate method. This cleans up the logic and makes way
for an additional complexity with regards to element bindings.

PR Close #57645
2024-09-03 14:29:54 -07:00
Paul Gschwendtner 1251ee0ac6 refactor(migrations): share logic for looking up property access (#57645)
This commit shares the logic for looking up a property access, using
`ts.Type` information. This is helpful in case where no linked TS
symbols are available; e.g. templates in test files without TCB.

This helper will be useful for handling object expansion in the signal
input migration; resolving references like `const {x} = this`.

PR Close #57645
2024-09-03 14:29:54 -07:00
Paul Gschwendtner 108a88ca61 refactor(language-service): support caching in code refactorings (#57645)
Instead of creating instances of refactoring whenever the language
service loads, we should lazily create these upon first "application".

This will speed up loading of the language service, while it also gives
us the ability to implement caching in code refactorings to speed up
subsequent applications; leveraging e.g. the `script versions` from the
TS server project.

PR Close #57645
2024-09-03 14:29:54 -07:00
Alex Rickabaugh be2e49639b feat(core): introduce afterRenderEffect (#57549)
Implement the `afterRenderEffect` primitive, which creates effect(s) that
run as part of Angular's `afterRender` sequence. `afterRenderEffect` is a
useful primitive for expressing DOM operations in a declarative, reactive
way.

The API itself mirrors `afterRender` and `afterNextRender` with one big
difference: values are propagated from phase to phase as signals instead of
as plain values. As a result, later phases may not need to execute if the
values returned by earlier phases do not change.

PR Close #57549
2024-09-03 10:40:45 -07:00
Matthieu Riegler c2892fee58 fix(http): Dynamicaly call the global fetch implementation (#57531)
Instead of using the reference that existing when `FetchBackend` is setup.

fixes #57527

PR Close #57531
2024-09-03 09:10:23 -07:00
Alex Rickabaugh fe5c4e086a fix(elements): support output()-shaped outputs (#57535)
Previously Elements was assuming that every output was an RxJS `Subject` and
supports `.pipe()`. This is not true for `output()`-based outputs which
have `.subscribe()` but not `.pipe()`. This commit fixes such outputs by
using a `new Observable` instead of `map` to forward outputs.

PR Close #57535
2024-09-03 09:08:29 -07:00
Alan Agius 3896f86865 refactor(migrations): switch from esbuild to Rollup for schematics bundling (#57602)
Replaces esbuild with Rollup for bundling schematics to support code splitting, as esbuild does not handle code splitting when targeting CommonJS modules.

**Before:**
```
du -sh dist/bin/packages/core/npm_package/schematics
7.7M    dist/bin/packages/core/npm_package/schematics
```

**After:**
```
du -sh dist/bin/packages/core/npm_package/schematics
3.1M    dist/bin/packages/core/npm_package/schematics
```

PR Close #57602
2024-09-03 09:07:03 -07:00
Andrew Scott 36d8d19dc1 refactor(core): removing a pending task delays stability until the next tick (#57570)
This commit updates the public API for pending tasks to schedule an
application tick, effectively making the stability async when the last
task is removed.

PR Close #57570
2024-09-03 08:50:42 -07:00
Kristiyan Kostadinov aa8eb15ddf build: delete v18 migrations (#57603)
We don't need to ship the migrations for v18 once we're in v19.

PR Close #57603
2024-09-03 07:59:10 -07:00
Pawel Kozlowski e6e5d29e83 feat(core): initial version of the output migration (#57604)
Initial version of the migration that changes decorator-based
outputs to the equivalent form using new authoring functions.

PR Close #57604
2024-09-03 07:58:20 -07:00
Paul Gschwendtner 2679dcfd44 refactor(migrations): simplify signal input migration language-service integration (#57606)
Instead of some special hook that relies on mutation to filter inputs in
the signal input migration, we are now introducing a new configuration
interface where the language-service can pass a filter method.

This makes the code more readable. We also need the filter method to
support filtering based on directories. E.g. when the migration runs
against sub-folders, all inputs outside of the folder should be
considered incompatible; to not migrate incorrectly.

PR Close #57606
2024-09-03 07:57:04 -07:00
Paul Gschwendtner a8e3ba9550 refactor(migrations): properly handle cases of --strict=false in signal input migration (#57629)
Sometimes `--strictPropertyInitialization` is not enabled, while strict
null checks is enabled. In those cases, `undefined` cannot be used as
initial value with `input()`, nor can we expand the type of the input.

We can migrate those instances to `undefined!` to preserve the original
semantics and behavior. In addition, in the future we may leave a TODO
or we may consider skipping migration of such inputs.

PR Close #57629
2024-09-03 07:55:09 -07:00
Paul Gschwendtner a65e87457e refactor(migrations): add explicit test for non-null assertions (#57629)
Adds an explicit test to state the situation about non-null assertions
and that we don't remove the exclamation marks here for now.

PR Close #57629
2024-09-03 07:55:09 -07:00
Matthieu Riegler 39b7be8588 refactor(compiler-cli): Add support for inheritance in API extraction (#57588)
This commit adds the `extends` and `implements` properties to the `ClassEntry` & `InterfaceEntry`

PR Close #57588
2024-09-03 07:47:24 -07:00
Andrew Kushnir 001f319865 Revert "refactor(compiler-cli): extract function overload separatly (#56489)" (#57594)
This reverts commit 37b88a5a98.

PR Close #57594
2024-08-29 16:21:46 -07:00
Paul Gschwendtner 2ad9609a8d refactor(migrations): pass project-relative paths for tsurge replacements (#57584)
This allows for the replacements to be conveniently passed between
migration stages. This is especially relevant in 1P where stages may
have different root directories.

Tsunami attempts to relativize paths in general, similar to how we do
here, but this doesn't work with e.g. Funnel-based migrations where
replacements are serialized in between stages; and where the migration
stage at the end doesn't know about the previous root directory anymore.

PR Close #57584
2024-08-29 14:28:02 -07:00
Matthieu Riegler 01030d58a7 docs(docs-infra): Add support for cross-links on API pages (#57346)
PR Close #57346
2024-08-29 13:39:58 -07:00
Matthieu Riegler ea3d37687b refactor(compiler-cli): Add a map of every symbols used inside a package (#57346)
This commit changes the structure of the API extraction files to include all symbols used inside a package.

The structure is a `Map`, Symbol => package
eg: 'ApplicationRef' => '@angular/core'

PR Close #57346
2024-08-29 13:39:58 -07:00