@angular/core 20.2.0-rc.0 → 20.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (69) hide show
  1. package/api.d.d.ts +1 -1
  2. package/chrome_dev_tools_performance.d.d.ts +1 -1
  3. package/discovery.d.d.ts +2 -8
  4. package/event_dispatcher.d.d.ts +1 -1
  5. package/fesm2022/attribute.mjs +1 -1
  6. package/fesm2022/attribute.mjs.map +1 -1
  7. package/fesm2022/core.mjs +9 -12
  8. package/fesm2022/core.mjs.map +1 -1
  9. package/fesm2022/debug_node.mjs +144 -93
  10. package/fesm2022/debug_node.mjs.map +1 -1
  11. package/fesm2022/not_found.mjs +1 -1
  12. package/fesm2022/not_found.mjs.map +1 -1
  13. package/fesm2022/primitives/di.mjs +1 -1
  14. package/fesm2022/primitives/di.mjs.map +1 -1
  15. package/fesm2022/primitives/event-dispatch.mjs +1 -1
  16. package/fesm2022/primitives/event-dispatch.mjs.map +1 -1
  17. package/fesm2022/primitives/signals.mjs +1 -1
  18. package/fesm2022/primitives/signals.mjs.map +1 -1
  19. package/fesm2022/resource.mjs +2 -11
  20. package/fesm2022/resource.mjs.map +1 -1
  21. package/fesm2022/root_effect_scheduler.mjs +1 -1
  22. package/fesm2022/root_effect_scheduler.mjs.map +1 -1
  23. package/fesm2022/rxjs-interop.mjs +1 -1
  24. package/fesm2022/rxjs-interop.mjs.map +1 -1
  25. package/fesm2022/signal.mjs +1 -1
  26. package/fesm2022/signal.mjs.map +1 -1
  27. package/fesm2022/testing.mjs +1 -1
  28. package/fesm2022/testing.mjs.map +1 -1
  29. package/fesm2022/untracked.mjs +1 -1
  30. package/fesm2022/untracked.mjs.map +1 -1
  31. package/fesm2022/weak_ref.mjs +1 -1
  32. package/fesm2022/weak_ref.mjs.map +1 -1
  33. package/graph.d.d.ts +1 -1
  34. package/index.d.ts +7 -15
  35. package/package.json +2 -2
  36. package/primitives/di/index.d.ts +1 -1
  37. package/primitives/event-dispatch/index.d.ts +1 -1
  38. package/primitives/signals/index.d.ts +1 -1
  39. package/rxjs-interop/index.d.ts +1 -1
  40. package/schematics/bundles/{apply_import_manager-BDpMzDvN.cjs → apply_import_manager-Ch1hTvRS.cjs} +3 -3
  41. package/schematics/bundles/cleanup-unused-imports.cjs +5 -5
  42. package/schematics/bundles/{compiler_host-GNtX_RDe.cjs → compiler_host-CqB0JPzD.cjs} +2 -2
  43. package/schematics/bundles/control-flow-migration.cjs +3 -3
  44. package/schematics/bundles/document-core.cjs +5 -5
  45. package/schematics/bundles/imports-CIX-JgAN.cjs +1 -1
  46. package/schematics/bundles/{index-czXpbmcu.cjs → index-COhCBz0q.cjs} +4 -4
  47. package/schematics/bundles/{index-BrQFpkJq.cjs → index-DwItZ4Tw.cjs} +20 -21
  48. package/schematics/bundles/inject-flags.cjs +5 -5
  49. package/schematics/bundles/inject-migration.cjs +3 -3
  50. package/schematics/bundles/leading_space-D9nQ8UQC.cjs +1 -1
  51. package/schematics/bundles/{migrate_ts_type_references-DLVVfu8Y.cjs → migrate_ts_type_references-BMhLua30.cjs} +5 -5
  52. package/schematics/bundles/ng_decorators-B5HCqr20.cjs +1 -1
  53. package/schematics/bundles/nodes-B16H9JUd.cjs +1 -1
  54. package/schematics/bundles/output-migration.cjs +6 -6
  55. package/schematics/bundles/{project_paths-pSh0WpBI.cjs → project_paths-OWnyHise.cjs} +3 -3
  56. package/schematics/bundles/{project_tsconfig_paths-Cy7U7awR.cjs → project_tsconfig_paths-BIeidc3E.cjs} +168 -22
  57. package/schematics/bundles/property_name-BBwFuqMe.cjs +1 -1
  58. package/schematics/bundles/route-lazy-loading.cjs +3 -3
  59. package/schematics/bundles/router-current-navigation.cjs +4 -4
  60. package/schematics/bundles/self-closing-tags-migration.cjs +4 -4
  61. package/schematics/bundles/signal-input-migration.cjs +7 -7
  62. package/schematics/bundles/signal-queries-migration.cjs +7 -7
  63. package/schematics/bundles/signals.cjs +7 -7
  64. package/schematics/bundles/standalone-migration.cjs +4 -4
  65. package/schematics/bundles/symbol-VPWguRxr.cjs +1 -1
  66. package/schematics/bundles/test-bed-get.cjs +4 -4
  67. package/signal.d.d.ts +1 -1
  68. package/testing/index.d.ts +2 -2
  69. package/weak_ref.d.d.ts +1 -1
@@ -1,19 +1,19 @@
1
1
  'use strict';
2
2
  /**
3
- * @license Angular v20.2.0-rc.0
3
+ * @license Angular v20.2.0
4
4
  * (c) 2010-2025 Google LLC. https://angular.io/
5
5
  * License: MIT
6
6
  */
7
7
  'use strict';
8
8
 
9
- var project_tsconfig_paths = require('./project_tsconfig_paths-Cy7U7awR.cjs');
9
+ var project_tsconfig_paths = require('./project_tsconfig_paths-BIeidc3E.cjs');
10
10
  var ts = require('typescript');
11
11
  require('os');
12
12
  var assert = require('assert');
13
- var index = require('./index-czXpbmcu.cjs');
14
- var project_paths = require('./project_paths-pSh0WpBI.cjs');
13
+ var index = require('./index-COhCBz0q.cjs');
14
+ var project_paths = require('./project_paths-OWnyHise.cjs');
15
15
  var leading_space = require('./leading_space-D9nQ8UQC.cjs');
16
- require('./index-BrQFpkJq.cjs');
16
+ require('./index-DwItZ4Tw.cjs');
17
17
  require('path');
18
18
  require('node:path');
19
19
 
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
  /**
3
- * @license Angular v20.2.0-rc.0
3
+ * @license Angular v20.2.0
4
4
  * (c) 2010-2025 Google LLC. https://angular.io/
5
5
  * License: MIT
6
6
  */
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
  /**
3
- * @license Angular v20.2.0-rc.0
3
+ * @license Angular v20.2.0
4
4
  * (c) 2010-2025 Google LLC. https://angular.io/
5
5
  * License: MIT
6
6
  */
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
  /**
3
- * @license Angular v20.2.0-rc.0
3
+ * @license Angular v20.2.0
4
4
  * (c) 2010-2025 Google LLC. https://angular.io/
5
5
  * License: MIT
6
6
  */
@@ -8,13 +8,13 @@
8
8
 
9
9
  var ts = require('typescript');
10
10
  require('os');
11
- var project_tsconfig_paths = require('./project_tsconfig_paths-Cy7U7awR.cjs');
12
- var index$1 = require('./index-BrQFpkJq.cjs');
11
+ var project_tsconfig_paths = require('./project_tsconfig_paths-BIeidc3E.cjs');
12
+ var index$1 = require('./index-DwItZ4Tw.cjs');
13
13
  require('path');
14
14
  require('node:path');
15
- var project_paths = require('./project_paths-pSh0WpBI.cjs');
16
- var apply_import_manager = require('./apply_import_manager-BDpMzDvN.cjs');
17
- var index = require('./index-czXpbmcu.cjs');
15
+ var project_paths = require('./project_paths-OWnyHise.cjs');
16
+ var apply_import_manager = require('./apply_import_manager-Ch1hTvRS.cjs');
17
+ var index = require('./index-COhCBz0q.cjs');
18
18
  require('@angular-devkit/core');
19
19
  require('node:path/posix');
20
20
  require('fs');
@@ -1,18 +1,18 @@
1
1
  'use strict';
2
2
  /**
3
- * @license Angular v20.2.0-rc.0
3
+ * @license Angular v20.2.0
4
4
  * (c) 2010-2025 Google LLC. https://angular.io/
5
5
  * License: MIT
6
6
  */
7
7
  'use strict';
8
8
 
9
- var index = require('./index-BrQFpkJq.cjs');
9
+ var index = require('./index-DwItZ4Tw.cjs');
10
10
  var schematics = require('@angular-devkit/schematics');
11
11
  var core = require('@angular-devkit/core');
12
12
  var posixPath = require('node:path/posix');
13
13
  var os = require('os');
14
14
  var ts = require('typescript');
15
- var project_tsconfig_paths = require('./project_tsconfig_paths-Cy7U7awR.cjs');
15
+ var project_tsconfig_paths = require('./project_tsconfig_paths-BIeidc3E.cjs');
16
16
  require('path');
17
17
  var path = require('node:path');
18
18
 
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
  /**
3
- * @license Angular v20.2.0-rc.0
3
+ * @license Angular v20.2.0
4
4
  * (c) 2010-2025 Google LLC. https://angular.io/
5
5
  * License: MIT
6
6
  */
@@ -452,7 +452,6 @@ exports.ViewEncapsulation = void 0;
452
452
  // Historically the 1 value was for `Native` encapsulation which has been removed as of v11.
453
453
  ViewEncapsulation[ViewEncapsulation["None"] = 2] = "None";
454
454
  ViewEncapsulation[ViewEncapsulation["ShadowDom"] = 3] = "ShadowDom";
455
- ViewEncapsulation[ViewEncapsulation["IsolatedShadowDom"] = 4] = "IsolatedShadowDom";
456
455
  })(exports.ViewEncapsulation || (exports.ViewEncapsulation = {}));
457
456
  exports.ChangeDetectionStrategy = void 0;
458
457
  (function (ChangeDetectionStrategy) {
@@ -546,7 +545,6 @@ var ViewEncapsulation;
546
545
  // Historically the 1 value was for `Native` encapsulation which has been removed as of v11.
547
546
  ViewEncapsulation[ViewEncapsulation["None"] = 2] = "None";
548
547
  ViewEncapsulation[ViewEncapsulation["ShadowDom"] = 3] = "ShadowDom";
549
- ViewEncapsulation[ViewEncapsulation["IsolatedShadowDom"] = 4] = "IsolatedShadowDom";
550
548
  })(ViewEncapsulation || (ViewEncapsulation = {}));
551
549
 
552
550
  /**
@@ -23110,6 +23108,11 @@ function propagateI18nBlocksToTemplates(unit, subTemplateIndex) {
23110
23108
  subTemplateIndex = propagateI18nBlocksForView(unit.job.views.get(op.emptyView), i18nBlock, op.emptyI18nPlaceholder, subTemplateIndex);
23111
23109
  }
23112
23110
  break;
23111
+ case OpKind.Projection:
23112
+ if (op.fallbackView !== null) {
23113
+ subTemplateIndex = propagateI18nBlocksForView(unit.job.views.get(op.fallbackView), i18nBlock, op.fallbackViewI18nPlaceholder, subTemplateIndex);
23114
+ }
23115
+ break;
23113
23116
  }
23114
23117
  }
23115
23118
  return subTemplateIndex;
@@ -24693,6 +24696,21 @@ function resolvePlaceholdersForView(job, unit, i18nContexts, elements, pendingSt
24693
24696
  // Clear out the pending structural directive now that its been accounted for.
24694
24697
  pendingStructuralDirective = undefined;
24695
24698
  }
24699
+ if (op.fallbackView !== null) {
24700
+ const view = job.views.get(op.fallbackView);
24701
+ if (op.fallbackViewI18nPlaceholder === undefined) {
24702
+ resolvePlaceholdersForView(job, view, i18nContexts, elements);
24703
+ }
24704
+ else {
24705
+ if (currentOps === null) {
24706
+ throw Error('i18n tag placeholder should only occur inside an i18n block');
24707
+ }
24708
+ recordTemplateStart(job, view, op.handle.slot, op.fallbackViewI18nPlaceholder, currentOps.i18nContext, currentOps.i18nBlock, pendingStructuralDirective);
24709
+ resolvePlaceholdersForView(job, view, i18nContexts, elements);
24710
+ recordTemplateClose(job, view, op.handle.slot, op.fallbackViewI18nPlaceholder, currentOps.i18nContext, currentOps.i18nBlock, pendingStructuralDirective);
24711
+ pendingStructuralDirective = undefined;
24712
+ }
24713
+ }
24696
24714
  break;
24697
24715
  case OpKind.ConditionalCreate:
24698
24716
  case OpKind.ConditionalBranchCreate:
@@ -26542,10 +26560,16 @@ function ingestHostAttribute(job, name, value, securityContexts) {
26542
26560
  job.root.update.push(attrBinding);
26543
26561
  }
26544
26562
  function ingestHostEvent(job, event) {
26545
- const [phase, target] = event.type !== exports.ParsedEventType.LegacyAnimation
26546
- ? [null, event.targetOrPhase]
26547
- : [event.targetOrPhase, null];
26548
- const eventBinding = createListenerOp(job.root.xref, new SlotHandle(), event.name, null, makeListenerHandlerOps(job.root, event.handler, event.handlerSpan), phase, target, true, event.sourceSpan);
26563
+ let eventBinding;
26564
+ if (event.type === exports.ParsedEventType.Animation) {
26565
+ eventBinding = createAnimationListenerOp(job.root.xref, new SlotHandle(), event.name, null, makeListenerHandlerOps(job.root, event.handler, event.handlerSpan), event.name.endsWith('enter') ? "enter" /* ir.AnimationKind.ENTER */ : "leave" /* ir.AnimationKind.LEAVE */, event.targetOrPhase, true, event.sourceSpan);
26566
+ }
26567
+ else {
26568
+ const [phase, target] = event.type !== exports.ParsedEventType.LegacyAnimation
26569
+ ? [null, event.targetOrPhase]
26570
+ : [event.targetOrPhase, null];
26571
+ eventBinding = createListenerOp(job.root.xref, new SlotHandle(), event.name, null, makeListenerHandlerOps(job.root, event.handler, event.handlerSpan), phase, target, true, event.sourceSpan);
26572
+ }
26549
26573
  job.root.create.push(eventBinding);
26550
26574
  }
26551
26575
  /**
@@ -29600,11 +29624,11 @@ class HtmlAstToIvyAst {
29600
29624
  const templateKey = normalizedName.substring(TEMPLATE_ATTR_PREFIX.length);
29601
29625
  const parsedVariables = [];
29602
29626
  const absoluteValueOffset = attribute.valueSpan
29603
- ? attribute.valueSpan.start.offset
29627
+ ? attribute.valueSpan.fullStart.offset
29604
29628
  : // If there is no value span the attribute does not have a value, like `attr` in
29605
29629
  //`<div attr></div>`. In this case, point to one character beyond the last character of
29606
29630
  // the attribute name.
29607
- attribute.sourceSpan.start.offset + attribute.name.length;
29631
+ attribute.sourceSpan.fullStart.offset + attribute.name.length;
29608
29632
  this.bindingParser.parseInlineTemplateBinding(templateKey, templateValue, attribute.sourceSpan, absoluteValueOffset, [], templateParsedProperties, parsedVariables, true /* isIvyAst */);
29609
29633
  templateVariables.push(...parsedVariables.map((v) => new Variable(v.name, v.value, v.sourceSpan, v.keySpan, v.valueSpan)));
29610
29634
  }
@@ -29634,8 +29658,8 @@ class HtmlAstToIvyAst {
29634
29658
  const value = attribute.value;
29635
29659
  const srcSpan = attribute.sourceSpan;
29636
29660
  const absoluteOffset = attribute.valueSpan
29637
- ? attribute.valueSpan.start.offset
29638
- : srcSpan.start.offset;
29661
+ ? attribute.valueSpan.fullStart.offset
29662
+ : srcSpan.fullStart.offset;
29639
29663
  function createKeySpan(srcSpan, prefix, identifier) {
29640
29664
  // We need to adjust the start location for the keySpan to account for the removed 'data-'
29641
29665
  // prefix from `normalizeAttributeName`.
@@ -32791,7 +32815,7 @@ function isAttrNode(ast) {
32791
32815
  * @description
32792
32816
  * Entry point for all public APIs of the compiler package.
32793
32817
  */
32794
- new Version('20.2.0-rc.0');
32818
+ new Version('20.2.0');
32795
32819
 
32796
32820
  //////////////////////////////////////
32797
32821
  // THIS FILE HAS GLOBAL SIDE EFFECT //
@@ -33826,7 +33850,7 @@ class NodeJSPathManipulation {
33826
33850
  // G3-ESM-MARKER: G3 uses CommonJS, but externally everything in ESM.
33827
33851
  // CommonJS/ESM interop for determining the current file name and containing dir.
33828
33852
  const isCommonJS = typeof __filename !== 'undefined';
33829
- const currentFileUrl = isCommonJS ? null : (typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('project_tsconfig_paths-Cy7U7awR.cjs', document.baseURI).href));
33853
+ const currentFileUrl = isCommonJS ? null : (typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('project_tsconfig_paths-BIeidc3E.cjs', document.baseURI).href));
33830
33854
  // Note, when this code loads in the browser, `url` may be an empty `{}` due to the Closure shims.
33831
33855
  const currentFileName = isCommonJS
33832
33856
  ? __filename
@@ -41168,6 +41192,46 @@ function isDirectiveDeclaration(node) {
41168
41192
  ts.isVariableDeclaration(node.parent) &&
41169
41193
  hasExpressionIdentifier(sourceFile, node, ExpressionIdentifier.DIRECTIVE));
41170
41194
  }
41195
+ /**
41196
+ * Check if the lastSymbol is an alias of the firstSymbol. For example:
41197
+ *
41198
+ * The NewBarComponent is an alias of BarComponent.
41199
+ *
41200
+ * But the NotAliasBarComponent is not an alias of BarComponent, because
41201
+ * the NotAliasBarComponent is a new variable.
41202
+ *
41203
+ * This should work for most cases.
41204
+ *
41205
+ * https://github.com/microsoft/TypeScript/blob/9e20e032effad965567d4a1e1c30d5433b0a3332/src/compiler/checker.ts#L3638-L3652
41206
+ *
41207
+ * ```
41208
+ * // a.ts
41209
+ * export class BarComponent {};
41210
+ * // b.ts
41211
+ * export {BarComponent as NewBarComponent} from "./a";
41212
+ * // c.ts
41213
+ * import {BarComponent} from "./a"
41214
+ * const NotAliasBarComponent = BarComponent;
41215
+ * export {NotAliasBarComponent};
41216
+ * ```
41217
+ */
41218
+ function isSymbolAliasOf(firstSymbol, lastSymbol, typeChecker) {
41219
+ let currentSymbol = lastSymbol;
41220
+ const seenSymbol = new Set();
41221
+ while (firstSymbol !== currentSymbol &&
41222
+ currentSymbol !== undefined &&
41223
+ currentSymbol.flags & ts.SymbolFlags.Alias) {
41224
+ if (seenSymbol.has(currentSymbol)) {
41225
+ break;
41226
+ }
41227
+ seenSymbol.add(currentSymbol);
41228
+ currentSymbol = typeChecker.getImmediateAliasedSymbol(currentSymbol);
41229
+ if (currentSymbol === firstSymbol) {
41230
+ return true;
41231
+ }
41232
+ }
41233
+ return false;
41234
+ }
41171
41235
 
41172
41236
  const NgOriginalFile = Symbol('NgOriginalFile');
41173
41237
  exports.UpdateMode = void 0;
@@ -50040,11 +50104,11 @@ class TemplateTypeCheckerImpl {
50040
50104
  }
50041
50105
  for (const directiveDecl of directiveDecls) {
50042
50106
  const cachedCompletionEntryInfos = resultingDirectives.get(directiveDecl.ref.node)?.tsCompletionEntryInfos ?? [];
50043
- cachedCompletionEntryInfos.push({
50107
+ appendOrReplaceTsEntryInfo(cachedCompletionEntryInfos, {
50044
50108
  tsCompletionEntryData: data,
50045
50109
  tsCompletionEntrySymbolFileName: symbolFileName,
50046
50110
  tsCompletionEntrySymbolName: symbolName,
50047
- });
50111
+ }, this.programDriver.getProgram());
50048
50112
  if (resultingDirectives.has(directiveDecl.ref.node)) {
50049
50113
  const directiveInfo = resultingDirectives.get(directiveDecl.ref.node);
50050
50114
  resultingDirectives.set(directiveDecl.ref.node, {
@@ -50218,29 +50282,30 @@ class TemplateTypeCheckerImpl {
50218
50282
  * When providing the code action for the directive. All the imports will show for the developer to choose.
50219
50283
  */
50220
50284
  let highestImportPriority = -1;
50221
- const collectImports = (emit, moduleSpecifier) => {
50285
+ const collectImports = (emit, moduleSpecifierDetail) => {
50222
50286
  if (emit === null) {
50223
50287
  return;
50224
50288
  }
50225
50289
  imports.push({
50226
50290
  ...emit,
50227
- moduleSpecifier: moduleSpecifier ?? emit.moduleSpecifier,
50291
+ moduleSpecifier: moduleSpecifierDetail?.moduleSpecifier ?? emit.moduleSpecifier,
50292
+ symbolName: moduleSpecifierDetail?.exportName ?? emit.symbolName,
50228
50293
  });
50229
- if (moduleSpecifier !== undefined && highestImportPriority === -1) {
50294
+ if (moduleSpecifierDetail !== null && highestImportPriority === -1) {
50230
50295
  highestImportPriority = imports.length - 1;
50231
50296
  }
50232
50297
  };
50233
50298
  if (meta.isStandalone || importMode === exports.PotentialImportMode.ForceDirect) {
50234
50299
  const emitted = this.emit(exports.PotentialImportKind.Standalone, toImport, inContext);
50235
- const moduleSpecifier = potentialDirectiveModuleSpecifierResolver?.resolve(toImport, inContext);
50236
- collectImports(emitted, moduleSpecifier);
50300
+ const moduleSpecifierDetail = potentialDirectiveModuleSpecifierResolver?.resolve(toImport, inContext) ?? null;
50301
+ collectImports(emitted, moduleSpecifierDetail);
50237
50302
  }
50238
50303
  const exportingNgModules = this.ngModuleIndex.getNgModulesExporting(meta.ref.node);
50239
50304
  if (exportingNgModules !== null) {
50240
50305
  for (const exporter of exportingNgModules) {
50241
50306
  const emittedRef = this.emit(exports.PotentialImportKind.NgModule, exporter, inContext);
50242
- const moduleSpecifier = potentialDirectiveModuleSpecifierResolver?.resolve(exporter, inContext);
50243
- collectImports(emittedRef, moduleSpecifier);
50307
+ const moduleSpecifierDetail = potentialDirectiveModuleSpecifierResolver?.resolve(exporter, inContext) ?? null;
50308
+ collectImports(emittedRef, moduleSpecifierDetail);
50244
50309
  }
50245
50310
  }
50246
50311
  // move the import with module specifier from the tsLs to top in the imports array
@@ -50576,6 +50641,87 @@ function getTheElementTagDeprecatedSuggestionDiagnostics(shimPath, program, file
50576
50641
  function isDeprecatedDiagnostics(diag) {
50577
50642
  return diag.reportsDeprecated !== undefined;
50578
50643
  }
50644
+ /**
50645
+ * Append the ts completion entry into the array only when the new entry's directive
50646
+ * doesn't exist in the array.
50647
+ *
50648
+ * If the new entry's directive already exists, and the entry's symbol is the alias of
50649
+ * the existing entry, the new entry will replace the existing entry.
50650
+ *
50651
+ */
50652
+ function appendOrReplaceTsEntryInfo(tsEntryInfos, newTsEntryInfo, program) {
50653
+ const typeChecker = program.getTypeChecker();
50654
+ const newTsEntryInfoSymbol = getSymbolFromTsEntryInfo(newTsEntryInfo, program);
50655
+ if (newTsEntryInfoSymbol === null) {
50656
+ return;
50657
+ }
50658
+ // Find the index of the first entry that has a matching type.
50659
+ const matchedEntryIndex = tsEntryInfos.findIndex((currentTsEntryInfo) => {
50660
+ const currentTsEntrySymbol = getSymbolFromTsEntryInfo(currentTsEntryInfo, program);
50661
+ if (currentTsEntrySymbol === null) {
50662
+ return false;
50663
+ }
50664
+ return isSymbolTypeMatch(currentTsEntrySymbol, newTsEntryInfoSymbol, typeChecker);
50665
+ });
50666
+ if (matchedEntryIndex === -1) {
50667
+ // No entry with a matching type was found, so append the new entry.
50668
+ tsEntryInfos.push(newTsEntryInfo);
50669
+ return;
50670
+ }
50671
+ // An entry with a matching type was found at matchedEntryIndex.
50672
+ const matchedEntry = tsEntryInfos[matchedEntryIndex];
50673
+ const matchedEntrySymbol = getSymbolFromTsEntryInfo(matchedEntry, program);
50674
+ if (matchedEntrySymbol === null) {
50675
+ // Should not happen based on the findIndex condition, but check defensively.
50676
+ return;
50677
+ }
50678
+ // Check if the `matchedEntrySymbol` is an alias of the `newTsEntryInfoSymbol`.
50679
+ if (isSymbolAliasOf(matchedEntrySymbol, newTsEntryInfoSymbol, typeChecker)) {
50680
+ // The first type-matching entry is an alias, so replace it.
50681
+ tsEntryInfos[matchedEntryIndex] = newTsEntryInfo;
50682
+ return;
50683
+ }
50684
+ // The new entry's symbol is an alias of the existing entry's symbol.
50685
+ // In this case, we prefer to keep the existing entry that was found first
50686
+ // and do not replace it.
50687
+ return;
50688
+ }
50689
+ function getSymbolFromTsEntryInfo(tsInfo, program) {
50690
+ const typeChecker = program.getTypeChecker();
50691
+ const sf = program.getSourceFile(tsInfo.tsCompletionEntrySymbolFileName);
50692
+ if (sf === undefined) {
50693
+ return null;
50694
+ }
50695
+ const sfSymbol = typeChecker.getSymbolAtLocation(sf);
50696
+ if (sfSymbol === undefined) {
50697
+ return null;
50698
+ }
50699
+ return (typeChecker.tryGetMemberInModuleExports(tsInfo.tsCompletionEntrySymbolName, sfSymbol) ?? null);
50700
+ }
50701
+ function getFirstTypeDeclarationOfSymbol(symbol, typeChecker) {
50702
+ const type = typeChecker.getTypeOfSymbol(symbol);
50703
+ return type.getSymbol()?.declarations?.[0];
50704
+ }
50705
+ /**
50706
+ * Check if the two symbols come from the same type node. For example:
50707
+ *
50708
+ * The `NewBarComponent`'s type node is the `BarComponent`.
50709
+ *
50710
+ * ```
50711
+ * // a.ts
50712
+ * export class BarComponent
50713
+ *
50714
+ * // b.ts
50715
+ * import {BarComponent} from "./a"
50716
+ * const NewBarComponent = BarComponent;
50717
+ * export {NewBarComponent}
50718
+ * ```
50719
+ */
50720
+ function isSymbolTypeMatch(first, last, typeChecker) {
50721
+ const firstTypeNode = getFirstTypeDeclarationOfSymbol(first, typeChecker);
50722
+ const lastTypeNode = getFirstTypeDeclarationOfSymbol(last, typeChecker);
50723
+ return firstTypeNode === lastTypeNode && firstTypeNode !== undefined;
50724
+ }
50579
50725
 
50580
50726
  /**
50581
50727
  * Gets all tsconfig paths from a CLI project by reading the workspace configuration
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
  /**
3
- * @license Angular v20.2.0-rc.0
3
+ * @license Angular v20.2.0
4
4
  * (c) 2010-2025 Google LLC. https://angular.io/
5
5
  * License: MIT
6
6
  */
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
  /**
3
- * @license Angular v20.2.0-rc.0
3
+ * @license Angular v20.2.0
4
4
  * (c) 2010-2025 Google LLC. https://angular.io/
5
5
  * License: MIT
6
6
  */
@@ -9,8 +9,8 @@
9
9
  var schematics = require('@angular-devkit/schematics');
10
10
  var fs = require('fs');
11
11
  var p = require('path');
12
- var compiler_host = require('./compiler_host-GNtX_RDe.cjs');
13
- var project_tsconfig_paths = require('./project_tsconfig_paths-Cy7U7awR.cjs');
12
+ var compiler_host = require('./compiler_host-CqB0JPzD.cjs');
13
+ var project_tsconfig_paths = require('./project_tsconfig_paths-BIeidc3E.cjs');
14
14
  var ts = require('typescript');
15
15
  var property_name = require('./property_name-BBwFuqMe.cjs');
16
16
  require('os');
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
  /**
3
- * @license Angular v20.2.0-rc.0
3
+ * @license Angular v20.2.0
4
4
  * (c) 2010-2025 Google LLC. https://angular.io/
5
5
  * License: MIT
6
6
  */
@@ -8,11 +8,11 @@
8
8
 
9
9
  var ts = require('typescript');
10
10
  require('os');
11
- require('./project_tsconfig_paths-Cy7U7awR.cjs');
12
- require('./index-BrQFpkJq.cjs');
11
+ require('./project_tsconfig_paths-BIeidc3E.cjs');
12
+ require('./index-DwItZ4Tw.cjs');
13
13
  require('path');
14
14
  require('node:path');
15
- var project_paths = require('./project_paths-pSh0WpBI.cjs');
15
+ var project_paths = require('./project_paths-OWnyHise.cjs');
16
16
  var imports = require('./imports-CIX-JgAN.cjs');
17
17
  var symbol = require('./symbol-VPWguRxr.cjs');
18
18
  require('@angular-devkit/core');
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
  /**
3
- * @license Angular v20.2.0-rc.0
3
+ * @license Angular v20.2.0
4
4
  * (c) 2010-2025 Google LLC. https://angular.io/
5
5
  * License: MIT
6
6
  */
@@ -8,11 +8,11 @@
8
8
 
9
9
  var ts = require('typescript');
10
10
  require('os');
11
- var project_tsconfig_paths = require('./project_tsconfig_paths-Cy7U7awR.cjs');
12
- require('./index-BrQFpkJq.cjs');
11
+ var project_tsconfig_paths = require('./project_tsconfig_paths-BIeidc3E.cjs');
12
+ require('./index-DwItZ4Tw.cjs');
13
13
  require('path');
14
14
  require('node:path');
15
- var project_paths = require('./project_paths-pSh0WpBI.cjs');
15
+ var project_paths = require('./project_paths-OWnyHise.cjs');
16
16
  var ng_decorators = require('./ng_decorators-B5HCqr20.cjs');
17
17
  var property_name = require('./property_name-BBwFuqMe.cjs');
18
18
  require('@angular-devkit/core');
@@ -1,22 +1,22 @@
1
1
  'use strict';
2
2
  /**
3
- * @license Angular v20.2.0-rc.0
3
+ * @license Angular v20.2.0
4
4
  * (c) 2010-2025 Google LLC. https://angular.io/
5
5
  * License: MIT
6
6
  */
7
7
  'use strict';
8
8
 
9
- var migrate_ts_type_references = require('./migrate_ts_type_references-DLVVfu8Y.cjs');
9
+ var migrate_ts_type_references = require('./migrate_ts_type_references-BMhLua30.cjs');
10
10
  var ts = require('typescript');
11
11
  require('os');
12
- var project_tsconfig_paths = require('./project_tsconfig_paths-Cy7U7awR.cjs');
13
- var index$1 = require('./index-BrQFpkJq.cjs');
12
+ var project_tsconfig_paths = require('./project_tsconfig_paths-BIeidc3E.cjs');
13
+ var index$1 = require('./index-DwItZ4Tw.cjs');
14
14
  require('path');
15
15
  require('node:path');
16
- var project_paths = require('./project_paths-pSh0WpBI.cjs');
17
- var index = require('./index-czXpbmcu.cjs');
16
+ var project_paths = require('./project_paths-OWnyHise.cjs');
17
+ var index = require('./index-COhCBz0q.cjs');
18
18
  var assert = require('assert');
19
- var apply_import_manager = require('./apply_import_manager-BDpMzDvN.cjs');
19
+ var apply_import_manager = require('./apply_import_manager-Ch1hTvRS.cjs');
20
20
  require('@angular-devkit/core');
21
21
  require('node:path/posix');
22
22
  require('./leading_space-D9nQ8UQC.cjs');
@@ -1,22 +1,22 @@
1
1
  'use strict';
2
2
  /**
3
- * @license Angular v20.2.0-rc.0
3
+ * @license Angular v20.2.0
4
4
  * (c) 2010-2025 Google LLC. https://angular.io/
5
5
  * License: MIT
6
6
  */
7
7
  'use strict';
8
8
 
9
- var project_tsconfig_paths = require('./project_tsconfig_paths-Cy7U7awR.cjs');
9
+ var project_tsconfig_paths = require('./project_tsconfig_paths-BIeidc3E.cjs');
10
10
  var ts = require('typescript');
11
11
  require('os');
12
- var index$1 = require('./index-BrQFpkJq.cjs');
12
+ var index$1 = require('./index-DwItZ4Tw.cjs');
13
13
  require('path');
14
14
  require('node:path');
15
- var project_paths = require('./project_paths-pSh0WpBI.cjs');
16
- var apply_import_manager = require('./apply_import_manager-BDpMzDvN.cjs');
17
- var migrate_ts_type_references = require('./migrate_ts_type_references-DLVVfu8Y.cjs');
15
+ var project_paths = require('./project_paths-OWnyHise.cjs');
16
+ var apply_import_manager = require('./apply_import_manager-Ch1hTvRS.cjs');
17
+ var migrate_ts_type_references = require('./migrate_ts_type_references-BMhLua30.cjs');
18
18
  var assert = require('assert');
19
- var index = require('./index-czXpbmcu.cjs');
19
+ var index = require('./index-COhCBz0q.cjs');
20
20
  require('@angular-devkit/core');
21
21
  require('node:path/posix');
22
22
  require('fs');
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
  /**
3
- * @license Angular v20.2.0-rc.0
3
+ * @license Angular v20.2.0
4
4
  * (c) 2010-2025 Google LLC. https://angular.io/
5
5
  * License: MIT
6
6
  */
@@ -10,7 +10,7 @@ var schematics = require('@angular-devkit/schematics');
10
10
  var signalQueriesMigration = require('./signal-queries-migration.cjs');
11
11
  var signalInputMigration = require('./signal-input-migration.cjs');
12
12
  var outputMigration = require('./output-migration.cjs');
13
- require('./project_tsconfig_paths-Cy7U7awR.cjs');
13
+ require('./project_tsconfig_paths-BIeidc3E.cjs');
14
14
  require('typescript');
15
15
  require('os');
16
16
  require('fs');
@@ -18,14 +18,14 @@ require('module');
18
18
  require('path');
19
19
  require('url');
20
20
  require('@angular-devkit/core');
21
- require('./index-BrQFpkJq.cjs');
21
+ require('./index-DwItZ4Tw.cjs');
22
22
  require('node:path');
23
- require('./project_paths-pSh0WpBI.cjs');
23
+ require('./project_paths-OWnyHise.cjs');
24
24
  require('node:path/posix');
25
- require('./apply_import_manager-BDpMzDvN.cjs');
26
- require('./migrate_ts_type_references-DLVVfu8Y.cjs');
25
+ require('./apply_import_manager-Ch1hTvRS.cjs');
26
+ require('./migrate_ts_type_references-BMhLua30.cjs');
27
27
  require('assert');
28
- require('./index-czXpbmcu.cjs');
28
+ require('./index-COhCBz0q.cjs');
29
29
  require('./leading_space-D9nQ8UQC.cjs');
30
30
 
31
31
  function migrate(options) {
@@ -1,18 +1,18 @@
1
1
  'use strict';
2
2
  /**
3
- * @license Angular v20.2.0-rc.0
3
+ * @license Angular v20.2.0
4
4
  * (c) 2010-2025 Google LLC. https://angular.io/
5
5
  * License: MIT
6
6
  */
7
7
  'use strict';
8
8
 
9
9
  var schematics = require('@angular-devkit/schematics');
10
- var index = require('./index-BrQFpkJq.cjs');
10
+ var index = require('./index-DwItZ4Tw.cjs');
11
11
  var fs = require('fs');
12
12
  var p = require('path');
13
13
  var ts = require('typescript');
14
- var compiler_host = require('./compiler_host-GNtX_RDe.cjs');
15
- var project_tsconfig_paths = require('./project_tsconfig_paths-Cy7U7awR.cjs');
14
+ var compiler_host = require('./compiler_host-CqB0JPzD.cjs');
15
+ var project_tsconfig_paths = require('./project_tsconfig_paths-BIeidc3E.cjs');
16
16
  var ng_decorators = require('./ng_decorators-B5HCqr20.cjs');
17
17
  var nodes = require('./nodes-B16H9JUd.cjs');
18
18
  var symbol = require('./symbol-VPWguRxr.cjs');
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
  /**
3
- * @license Angular v20.2.0-rc.0
3
+ * @license Angular v20.2.0
4
4
  * (c) 2010-2025 Google LLC. https://angular.io/
5
5
  * License: MIT
6
6
  */
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
  /**
3
- * @license Angular v20.2.0-rc.0
3
+ * @license Angular v20.2.0
4
4
  * (c) 2010-2025 Google LLC. https://angular.io/
5
5
  * License: MIT
6
6
  */
@@ -8,11 +8,11 @@
8
8
 
9
9
  var ts = require('typescript');
10
10
  require('os');
11
- require('./project_tsconfig_paths-Cy7U7awR.cjs');
12
- require('./index-BrQFpkJq.cjs');
11
+ require('./project_tsconfig_paths-BIeidc3E.cjs');
12
+ require('./index-DwItZ4Tw.cjs');
13
13
  require('path');
14
14
  require('node:path');
15
- var project_paths = require('./project_paths-pSh0WpBI.cjs');
15
+ var project_paths = require('./project_paths-OWnyHise.cjs');
16
16
  var imports = require('./imports-CIX-JgAN.cjs');
17
17
  var symbol = require('./symbol-VPWguRxr.cjs');
18
18
  require('@angular-devkit/core');
package/signal.d.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @license Angular v20.2.0-rc.0
2
+ * @license Angular v20.2.0
3
3
  * (c) 2010-2025 Google LLC. https://angular.io/
4
4
  * License: MIT
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @license Angular v20.2.0-rc.0
2
+ * @license Angular v20.2.0
3
3
  * (c) 2010-2025 Google LLC. https://angular.io/
4
4
  * License: MIT
5
5
  */
@@ -348,7 +348,7 @@ interface TestModuleMetadata {
348
348
  inferTagName?: boolean;
349
349
  /**
350
350
  * Whether animate.enter / animate.leave should trigger as normal or be disabled.
351
- * Defaults to `true`.
351
+ * Defaults to `false`.
352
352
  */
353
353
  animationsEnabled?: boolean;
354
354
  }