@angular/core 20.0.0-rc.1 → 20.0.0-rc.2

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 (75) hide show
  1. package/{api.d-BcbEQ58q.d.ts → api.d-B0vztftH.d.ts} +15 -15
  2. package/{chrome_dev_tools_performance.d-CARNn07P.d.ts → chrome_dev_tools_performance.d-DvzAxqBc.d.ts} +5 -1
  3. package/{discovery.d-MmZhhuxb.d.ts → discovery.d-Cf_r2Ojk.d.ts} +6 -13
  4. package/event_dispatcher.d-BReQpZfC.d.ts +1 -1
  5. package/fesm2022/attribute-BWp59EjE.mjs +1 -1
  6. package/fesm2022/attribute-BWp59EjE.mjs.map +1 -1
  7. package/fesm2022/core.mjs +15 -9
  8. package/fesm2022/core.mjs.map +1 -1
  9. package/fesm2022/{debug_node-BTSSF0Vj.mjs → debug_node-Nc-zr65s.mjs} +12163 -12293
  10. package/fesm2022/debug_node-Nc-zr65s.mjs.map +1 -0
  11. package/fesm2022/primitives/di.mjs +1 -1
  12. package/fesm2022/primitives/di.mjs.map +1 -1
  13. package/fesm2022/primitives/event-dispatch.mjs +1 -1
  14. package/fesm2022/primitives/event-dispatch.mjs.map +1 -1
  15. package/fesm2022/primitives/signals.mjs +1 -1
  16. package/fesm2022/primitives/signals.mjs.map +1 -1
  17. package/fesm2022/{resource-DdxAP6ca.mjs → resource-DOwetGLU.mjs} +64 -14
  18. package/fesm2022/resource-DOwetGLU.mjs.map +1 -0
  19. package/fesm2022/{root_effect_scheduler-CX0Q-uCT.mjs → root_effect_scheduler-BgGHQ80j.mjs} +26 -16
  20. package/fesm2022/root_effect_scheduler-BgGHQ80j.mjs.map +1 -0
  21. package/fesm2022/rxjs-interop.mjs +27 -12
  22. package/fesm2022/rxjs-interop.mjs.map +1 -1
  23. package/fesm2022/signal-ePSl6jXn.mjs +1 -1
  24. package/fesm2022/signal-ePSl6jXn.mjs.map +1 -1
  25. package/fesm2022/testing.mjs +43 -26
  26. package/fesm2022/testing.mjs.map +1 -1
  27. package/fesm2022/untracked-2ouAFbCz.mjs +1 -1
  28. package/fesm2022/untracked-2ouAFbCz.mjs.map +1 -1
  29. package/fesm2022/weak_ref-BaIq-pgY.mjs +1 -1
  30. package/fesm2022/weak_ref-BaIq-pgY.mjs.map +1 -1
  31. package/graph.d-BcIOep_B.d.ts +1 -1
  32. package/index.d.ts +204 -313
  33. package/package.json +3 -3
  34. package/primitives/di/index.d.ts +1 -1
  35. package/primitives/event-dispatch/index.d.ts +1 -1
  36. package/primitives/signals/index.d.ts +1 -1
  37. package/rxjs-interop/index.d.ts +3 -3
  38. package/schematics/bundles/{apply_import_manager-BdH8vaIZ.js → apply_import_manager-BqwxKJiu.cjs} +3 -3
  39. package/schematics/bundles/{change_tracker-C_neAOvN.js → change_tracker-B1qegJFu.cjs} +3 -3
  40. package/schematics/bundles/{checker-DqG0JVTu.js → checker-DmucNdBi.cjs} +55 -45
  41. package/schematics/bundles/{cleanup-unused-imports.js → cleanup-unused-imports.cjs} +26 -55
  42. package/schematics/bundles/{compiler-CWuG67kz.js → compiler-DPq1iS19.cjs} +92 -86
  43. package/schematics/bundles/{compiler_host-CAfDJO3W.js → compiler_host-CAfDJO3W.cjs} +1 -1
  44. package/schematics/bundles/{control-flow-migration.js → control-flow-migration.cjs} +4 -4
  45. package/schematics/bundles/{document-core.js → document-core.cjs} +8 -8
  46. package/schematics/bundles/{imports-CIX-JgAN.js → imports-CIX-JgAN.cjs} +1 -1
  47. package/schematics/bundles/{index-CGYcUmPq.js → index-1H-qYSW6.cjs} +80 -34
  48. package/schematics/bundles/{index-DWcLBEg_.js → index-CFmTQ_wx.cjs} +29 -20
  49. package/schematics/bundles/{inject-flags.js → inject-flags.cjs} +8 -8
  50. package/schematics/bundles/{inject-migration.js → inject-migration.cjs} +9 -9
  51. package/schematics/bundles/{leading_space-D9nQ8UQC.js → leading_space-D9nQ8UQC.cjs} +1 -1
  52. package/schematics/bundles/{migrate_ts_type_references-DAudyiEk.js → migrate_ts_type_references-B2aJNuIK.cjs} +7 -7
  53. package/schematics/bundles/{ng_decorators-DznZ5jMl.js → ng_decorators-B5HCqr20.cjs} +2 -2
  54. package/schematics/bundles/{nodes-B16H9JUd.js → nodes-B16H9JUd.cjs} +1 -1
  55. package/schematics/bundles/{output-migration.js → output-migration.cjs} +8 -8
  56. package/schematics/bundles/{project_paths-B3YG5aUz.js → project_paths-DmvzlTQL.cjs} +71 -42
  57. package/schematics/bundles/{project_tsconfig_paths-CDVxT6Ov.js → project_tsconfig_paths-CDVxT6Ov.cjs} +1 -1
  58. package/schematics/bundles/{property_name-BBwFuqMe.js → property_name-BBwFuqMe.cjs} +1 -1
  59. package/schematics/bundles/{route-lazy-loading.js → route-lazy-loading.cjs} +7 -7
  60. package/schematics/bundles/{self-closing-tags-migration.js → self-closing-tags-migration.cjs} +12 -26
  61. package/schematics/bundles/{signal-input-migration.js → signal-input-migration.cjs} +20 -16
  62. package/schematics/bundles/{signal-queries-migration.js → signal-queries-migration.cjs} +10 -10
  63. package/schematics/bundles/{signals.js → signals.cjs} +13 -13
  64. package/schematics/bundles/{standalone-migration.js → standalone-migration.cjs} +11 -11
  65. package/schematics/bundles/{symbol-VPWguRxr.js → symbol-VPWguRxr.cjs} +1 -1
  66. package/schematics/bundles/{test-bed-get.js → test-bed-get.cjs} +8 -8
  67. package/schematics/collection.json +9 -9
  68. package/schematics/migrations.json +4 -4
  69. package/signal.d-D6VJ67xi.d.ts +1 -1
  70. package/testing/index.d.ts +18 -4
  71. package/weak_ref.d-eGOEP9S1.d.ts +1 -1
  72. package/fesm2022/debug_node-BTSSF0Vj.mjs.map +0 -1
  73. package/fesm2022/resource-DdxAP6ca.mjs.map +0 -1
  74. package/fesm2022/root_effect_scheduler-CX0Q-uCT.mjs.map +0 -1
  75. package/schematics/package.json +0 -3
package/package.json CHANGED
@@ -1,11 +1,11 @@
1
1
  {
2
2
  "name": "@angular/core",
3
- "version": "20.0.0-rc.1",
3
+ "version": "20.0.0-rc.2",
4
4
  "description": "Angular - the core framework",
5
5
  "author": "angular",
6
6
  "license": "MIT",
7
7
  "engines": {
8
- "node": "^20.11.1 || ^22.11.0 || >=24.0.0"
8
+ "node": "^20.19.0 || ^22.12.0 || >=24.0.0"
9
9
  },
10
10
  "exports": {
11
11
  "./schematics/*": {
@@ -46,7 +46,7 @@
46
46
  "tslib": "^2.3.0"
47
47
  },
48
48
  "peerDependencies": {
49
- "@angular/compiler": "20.0.0-rc.1",
49
+ "@angular/compiler": "20.0.0-rc.2",
50
50
  "rxjs": "^6.5.3 || ^7.4.0",
51
51
  "zone.js": "~0.15.0"
52
52
  },
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @license Angular v20.0.0-rc.1
2
+ * @license Angular v20.0.0-rc.2
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.0.0-rc.1
2
+ * @license Angular v20.0.0-rc.2
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.0.0-rc.1
2
+ * @license Angular v20.0.0-rc.2
3
3
  * (c) 2010-2025 Google LLC. https://angular.io/
4
4
  * License: MIT
5
5
  */
@@ -1,11 +1,11 @@
1
1
  /**
2
- * @license Angular v20.0.0-rc.1
2
+ * @license Angular v20.0.0-rc.2
3
3
  * (c) 2010-2025 Google LLC. https://angular.io/
4
4
  * License: MIT
5
5
  */
6
6
 
7
- import { OutputRef, DestroyRef, Signal, Injector } from '../chrome_dev_tools_performance.d-CARNn07P.js';
8
- import { OutputOptions, BaseResourceOptions, ResourceLoaderParams, ResourceRef } from '../api.d-BcbEQ58q.js';
7
+ import { OutputRef, DestroyRef, Signal, Injector } from '../chrome_dev_tools_performance.d-DvzAxqBc.js';
8
+ import { OutputOptions, BaseResourceOptions, ResourceLoaderParams, ResourceRef } from '../api.d-B0vztftH.js';
9
9
  import '../event_dispatcher.d-BReQpZfC.js';
10
10
  import { Observable, MonoTypeOperatorFunction, Subscribable } from 'rxjs';
11
11
  import { ValueEqualityFn } from '../graph.d-BcIOep_B.js';
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
  /**
3
- * @license Angular v20.0.0-rc.1
3
+ * @license Angular v20.0.0-rc.2
4
4
  * (c) 2010-2025 Google LLC. https://angular.io/
5
5
  * License: MIT
6
6
  */
@@ -8,8 +8,8 @@
8
8
 
9
9
  var ts = require('typescript');
10
10
  require('os');
11
- var checker = require('./checker-DqG0JVTu.js');
12
- var project_paths = require('./project_paths-B3YG5aUz.js');
11
+ var checker = require('./checker-DmucNdBi.cjs');
12
+ var project_paths = require('./project_paths-DmvzlTQL.cjs');
13
13
 
14
14
  /**
15
15
  * Applies import manager changes, and writes them as replacements the
@@ -1,14 +1,14 @@
1
1
  'use strict';
2
2
  /**
3
- * @license Angular v20.0.0-rc.1
3
+ * @license Angular v20.0.0-rc.2
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 ts = require('typescript');
10
- require('./compiler-CWuG67kz.js');
11
- var checker = require('./checker-DqG0JVTu.js');
10
+ require('./compiler-DPq1iS19.cjs');
11
+ var checker = require('./checker-DmucNdBi.cjs');
12
12
  require('os');
13
13
 
14
14
  /** Tracks changes that have to be made for specific files. */
@@ -1,12 +1,12 @@
1
1
  'use strict';
2
2
  /**
3
- * @license Angular v20.0.0-rc.1
3
+ * @license Angular v20.0.0-rc.2
4
4
  * (c) 2010-2025 Google LLC. https://angular.io/
5
5
  * License: MIT
6
6
  */
7
7
  'use strict';
8
8
 
9
- var compiler = require('./compiler-CWuG67kz.js');
9
+ var compiler = require('./compiler-DPq1iS19.cjs');
10
10
  var ts = require('typescript');
11
11
  require('os');
12
12
  var fs$1 = require('fs');
@@ -1000,7 +1000,7 @@ class NodeJSPathManipulation {
1000
1000
  // G3-ESM-MARKER: G3 uses CommonJS, but externally everything in ESM.
1001
1001
  // CommonJS/ESM interop for determining the current file name and containing dir.
1002
1002
  const isCommonJS = typeof __filename !== 'undefined';
1003
- const currentFileUrl = isCommonJS ? null : (typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('checker-DqG0JVTu.js', document.baseURI).href));
1003
+ const currentFileUrl = isCommonJS ? null : (typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('checker-DmucNdBi.cjs', document.baseURI).href));
1004
1004
  const currentFileName = isCommonJS ? __filename : url.fileURLToPath(currentFileUrl);
1005
1005
  /**
1006
1006
  * A wrapper around the Node.js file-system that supports readonly operations and path manipulation.
@@ -1803,14 +1803,14 @@ exports.ClassMemberKind = void 0;
1803
1803
  ClassMemberKind[ClassMemberKind["Method"] = 4] = "Method";
1804
1804
  })(exports.ClassMemberKind || (exports.ClassMemberKind = {}));
1805
1805
  /** Possible access levels of a class member. */
1806
- var ClassMemberAccessLevel;
1806
+ exports.ClassMemberAccessLevel = void 0;
1807
1807
  (function (ClassMemberAccessLevel) {
1808
1808
  ClassMemberAccessLevel[ClassMemberAccessLevel["PublicWritable"] = 0] = "PublicWritable";
1809
1809
  ClassMemberAccessLevel[ClassMemberAccessLevel["PublicReadonly"] = 1] = "PublicReadonly";
1810
1810
  ClassMemberAccessLevel[ClassMemberAccessLevel["Protected"] = 2] = "Protected";
1811
1811
  ClassMemberAccessLevel[ClassMemberAccessLevel["Private"] = 3] = "Private";
1812
1812
  ClassMemberAccessLevel[ClassMemberAccessLevel["EcmaScriptPrivate"] = 4] = "EcmaScriptPrivate";
1813
- })(ClassMemberAccessLevel || (ClassMemberAccessLevel = {}));
1813
+ })(exports.ClassMemberAccessLevel || (exports.ClassMemberAccessLevel = {}));
1814
1814
  /** Indicates that a declaration is referenced through an ambient type. */
1815
1815
  const AmbientImport = {};
1816
1816
 
@@ -2089,15 +2089,15 @@ function isIdentifier(node) {
2089
2089
  */
2090
2090
  function classMemberAccessLevelToString(level) {
2091
2091
  switch (level) {
2092
- case ClassMemberAccessLevel.EcmaScriptPrivate:
2092
+ case exports.ClassMemberAccessLevel.EcmaScriptPrivate:
2093
2093
  return 'ES private';
2094
- case ClassMemberAccessLevel.Private:
2094
+ case exports.ClassMemberAccessLevel.Private:
2095
2095
  return 'private';
2096
- case ClassMemberAccessLevel.Protected:
2096
+ case exports.ClassMemberAccessLevel.Protected:
2097
2097
  return 'protected';
2098
- case ClassMemberAccessLevel.PublicReadonly:
2098
+ case exports.ClassMemberAccessLevel.PublicReadonly:
2099
2099
  return 'public readonly';
2100
- case ClassMemberAccessLevel.PublicWritable:
2100
+ case exports.ClassMemberAccessLevel.PublicWritable:
2101
2101
  default:
2102
2102
  return 'public';
2103
2103
  }
@@ -2601,7 +2601,7 @@ function extractModifiersOfMember(node) {
2601
2601
  const modifiers = ts.getModifiers(node);
2602
2602
  let isStatic = false;
2603
2603
  let isReadonly = false;
2604
- let accessLevel = ClassMemberAccessLevel.PublicWritable;
2604
+ let accessLevel = exports.ClassMemberAccessLevel.PublicWritable;
2605
2605
  if (modifiers !== undefined) {
2606
2606
  for (const modifier of modifiers) {
2607
2607
  switch (modifier.kind) {
@@ -2609,10 +2609,10 @@ function extractModifiersOfMember(node) {
2609
2609
  isStatic = true;
2610
2610
  break;
2611
2611
  case ts.SyntaxKind.PrivateKeyword:
2612
- accessLevel = ClassMemberAccessLevel.Private;
2612
+ accessLevel = exports.ClassMemberAccessLevel.Private;
2613
2613
  break;
2614
2614
  case ts.SyntaxKind.ProtectedKeyword:
2615
- accessLevel = ClassMemberAccessLevel.Protected;
2615
+ accessLevel = exports.ClassMemberAccessLevel.Protected;
2616
2616
  break;
2617
2617
  case ts.SyntaxKind.ReadonlyKeyword:
2618
2618
  isReadonly = true;
@@ -2620,11 +2620,11 @@ function extractModifiersOfMember(node) {
2620
2620
  }
2621
2621
  }
2622
2622
  }
2623
- if (isReadonly && accessLevel === ClassMemberAccessLevel.PublicWritable) {
2624
- accessLevel = ClassMemberAccessLevel.PublicReadonly;
2623
+ if (isReadonly && accessLevel === exports.ClassMemberAccessLevel.PublicWritable) {
2624
+ accessLevel = exports.ClassMemberAccessLevel.PublicReadonly;
2625
2625
  }
2626
2626
  if (node.name !== undefined && ts.isPrivateIdentifier(node.name)) {
2627
- accessLevel = ClassMemberAccessLevel.EcmaScriptPrivate;
2627
+ accessLevel = exports.ClassMemberAccessLevel.EcmaScriptPrivate;
2628
2628
  }
2629
2629
  return { accessLevel, isStatic };
2630
2630
  }
@@ -7464,9 +7464,9 @@ const INPUT_INITIALIZER_FN = {
7464
7464
  // cases where the input is intentionally not part of the public API, programmatically.
7465
7465
  // Note: `private` is omitted intentionally as this would be a conceptual confusion point.
7466
7466
  allowedAccessLevels: [
7467
- ClassMemberAccessLevel.PublicWritable,
7468
- ClassMemberAccessLevel.PublicReadonly,
7469
- ClassMemberAccessLevel.Protected,
7467
+ exports.ClassMemberAccessLevel.PublicWritable,
7468
+ exports.ClassMemberAccessLevel.PublicReadonly,
7469
+ exports.ClassMemberAccessLevel.Protected,
7470
7470
  ],
7471
7471
  };
7472
7472
  /**
@@ -7505,9 +7505,9 @@ const MODEL_INITIALIZER_FN = {
7505
7505
  // accessing `protected` or `private` members works at runtime, so we can allow
7506
7506
  // cases where the input is intentionally not part of the public API, programmatically.
7507
7507
  allowedAccessLevels: [
7508
- ClassMemberAccessLevel.PublicWritable,
7509
- ClassMemberAccessLevel.PublicReadonly,
7510
- ClassMemberAccessLevel.Protected,
7508
+ exports.ClassMemberAccessLevel.PublicWritable,
7509
+ exports.ClassMemberAccessLevel.PublicReadonly,
7510
+ exports.ClassMemberAccessLevel.Protected,
7511
7511
  ],
7512
7512
  };
7513
7513
  /**
@@ -7550,9 +7550,9 @@ function tryParseSignalModelMapping(member, reflector, importTracker) {
7550
7550
  // component API, programmatically.
7551
7551
  // Note: `private` is omitted intentionally as this would be a conceptual confusion point.
7552
7552
  const allowedAccessLevels = [
7553
- ClassMemberAccessLevel.PublicWritable,
7554
- ClassMemberAccessLevel.PublicReadonly,
7555
- ClassMemberAccessLevel.Protected,
7553
+ exports.ClassMemberAccessLevel.PublicWritable,
7554
+ exports.ClassMemberAccessLevel.PublicReadonly,
7555
+ exports.ClassMemberAccessLevel.Protected,
7556
7556
  ];
7557
7557
  /** Possible functions that can declare an output. */
7558
7558
  const OUTPUT_INITIALIZER_FNS = [
@@ -7615,10 +7615,10 @@ const QUERY_INITIALIZER_FNS = queryFunctionNames.map((fnName) => ({
7615
7615
  // Support for ES private fields requires special caution and complexity when partial
7616
7616
  // output is linked— hence not supported. TS private members are allowed in static blocks.
7617
7617
  allowedAccessLevels: [
7618
- ClassMemberAccessLevel.PublicWritable,
7619
- ClassMemberAccessLevel.PublicReadonly,
7620
- ClassMemberAccessLevel.Protected,
7621
- ClassMemberAccessLevel.Private,
7618
+ exports.ClassMemberAccessLevel.PublicWritable,
7619
+ exports.ClassMemberAccessLevel.PublicReadonly,
7620
+ exports.ClassMemberAccessLevel.Protected,
7621
+ exports.ClassMemberAccessLevel.Private,
7622
7622
  ],
7623
7623
  }));
7624
7624
  // The `descendants` option is enabled by default, except for content children.
@@ -17089,6 +17089,7 @@ class TemplateTypeCheckerImpl {
17089
17089
  */
17090
17090
  elementTagCache = new Map();
17091
17091
  isComplete = false;
17092
+ priorResultsAdopted = false;
17092
17093
  constructor(originalProgram, programDriver, typeCheckAdapter, config, refEmitter, reflector, compilerHost, priorBuild, metaReader, localMetaReader, ngModuleIndex, componentScopeReader, typeCheckScopeRegistry, perf) {
17093
17094
  this.originalProgram = originalProgram;
17094
17095
  this.programDriver = programDriver;
@@ -17336,26 +17337,36 @@ class TemplateTypeCheckerImpl {
17336
17337
  this.completionCache.set(component, engine);
17337
17338
  return engine;
17338
17339
  }
17339
- maybeAdoptPriorResultsForFile(sf) {
17340
- const sfPath = absoluteFromSourceFile(sf);
17341
- if (this.state.has(sfPath)) {
17342
- const existingResults = this.state.get(sfPath);
17343
- if (existingResults.isComplete) {
17344
- // All data for this file has already been generated, so no need to adopt anything.
17345
- return;
17346
- }
17347
- }
17348
- const previousResults = this.priorBuild.priorTypeCheckingResultsFor(sf);
17349
- if (previousResults === null || !previousResults.isComplete) {
17340
+ maybeAdoptPriorResults() {
17341
+ if (this.priorResultsAdopted) {
17350
17342
  return;
17351
17343
  }
17352
- this.perf.eventCount(exports.PerfEvent.ReuseTypeCheckFile);
17353
- this.state.set(sfPath, previousResults);
17344
+ for (const sf of this.originalProgram.getSourceFiles()) {
17345
+ if (sf.isDeclarationFile || isShim(sf)) {
17346
+ continue;
17347
+ }
17348
+ const sfPath = absoluteFromSourceFile(sf);
17349
+ if (this.state.has(sfPath)) {
17350
+ const existingResults = this.state.get(sfPath);
17351
+ if (existingResults.isComplete) {
17352
+ // All data for this file has already been generated, so no need to adopt anything.
17353
+ continue;
17354
+ }
17355
+ }
17356
+ const previousResults = this.priorBuild.priorTypeCheckingResultsFor(sf);
17357
+ if (previousResults === null || !previousResults.isComplete) {
17358
+ continue;
17359
+ }
17360
+ this.perf.eventCount(exports.PerfEvent.ReuseTypeCheckFile);
17361
+ this.state.set(sfPath, previousResults);
17362
+ }
17363
+ this.priorResultsAdopted = true;
17354
17364
  }
17355
17365
  ensureAllShimsForAllFiles() {
17356
17366
  if (this.isComplete) {
17357
17367
  return;
17358
17368
  }
17369
+ this.maybeAdoptPriorResults();
17359
17370
  this.perf.inPhase(exports.PerfPhase.TcbGeneration, () => {
17360
17371
  const host = new WholeProgramTypeCheckingHost(this);
17361
17372
  const ctx = this.newContext(host);
@@ -17363,7 +17374,6 @@ class TemplateTypeCheckerImpl {
17363
17374
  if (sf.isDeclarationFile || isShim(sf)) {
17364
17375
  continue;
17365
17376
  }
17366
- this.maybeAdoptPriorResultsForFile(sf);
17367
17377
  const sfPath = absoluteFromSourceFile(sf);
17368
17378
  const fileData = this.getFileData(sfPath);
17369
17379
  if (fileData.isComplete) {
@@ -17377,8 +17387,8 @@ class TemplateTypeCheckerImpl {
17377
17387
  });
17378
17388
  }
17379
17389
  ensureAllShimsForOneFile(sf) {
17390
+ this.maybeAdoptPriorResults();
17380
17391
  this.perf.inPhase(exports.PerfPhase.TcbGeneration, () => {
17381
- this.maybeAdoptPriorResultsForFile(sf);
17382
17392
  const sfPath = absoluteFromSourceFile(sf);
17383
17393
  const fileData = this.getFileData(sfPath);
17384
17394
  if (fileData.isComplete) {
@@ -17393,10 +17403,10 @@ class TemplateTypeCheckerImpl {
17393
17403
  });
17394
17404
  }
17395
17405
  ensureShimForComponent(component) {
17406
+ this.maybeAdoptPriorResults();
17396
17407
  const sf = component.getSourceFile();
17397
17408
  const sfPath = absoluteFromSourceFile(sf);
17398
17409
  const shimPath = TypeCheckShimGenerator.shimFor(sfPath);
17399
- this.maybeAdoptPriorResultsForFile(sf);
17400
17410
  const fileData = this.getFileData(sfPath);
17401
17411
  if (fileData.shimData.has(shimPath)) {
17402
17412
  // All data for this component is available.
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
  /**
3
- * @license Angular v20.0.0-rc.1
3
+ * @license Angular v20.0.0-rc.2
4
4
  * (c) 2010-2025 Google LLC. https://angular.io/
5
5
  * License: MIT
6
6
  */
@@ -8,16 +8,16 @@
8
8
 
9
9
  require('@angular-devkit/core');
10
10
  require('node:path/posix');
11
- var project_paths = require('./project_paths-B3YG5aUz.js');
11
+ var project_paths = require('./project_paths-DmvzlTQL.cjs');
12
12
  var ts = require('typescript');
13
13
  require('os');
14
- var checker = require('./checker-DqG0JVTu.js');
15
- require('./compiler-CWuG67kz.js');
16
- var index = require('./index-CGYcUmPq.js');
14
+ var checker = require('./checker-DmucNdBi.cjs');
15
+ require('./compiler-DPq1iS19.cjs');
16
+ var index = require('./index-1H-qYSW6.cjs');
17
17
  require('path');
18
- var apply_import_manager = require('./apply_import_manager-BdH8vaIZ.js');
18
+ var apply_import_manager = require('./apply_import_manager-BqwxKJiu.cjs');
19
19
  require('@angular-devkit/schematics');
20
- require('./project_tsconfig_paths-CDVxT6Ov.js');
20
+ require('./project_tsconfig_paths-CDVxT6Ov.cjs');
21
21
  require('fs');
22
22
  require('module');
23
23
  require('url');
@@ -38,61 +38,42 @@ class UnusedImportsMigration extends project_paths.TsurgeFunnelMigration {
38
38
  async analyze(info) {
39
39
  const nodePositions = new Map();
40
40
  const replacements = [];
41
- const removedIdentifiers = [];
41
+ let removedImports = 0;
42
42
  let changedFiles = 0;
43
43
  info.ngCompiler?.getDiagnostics().forEach((diag) => {
44
44
  if (diag.file !== undefined &&
45
45
  diag.start !== undefined &&
46
46
  diag.length !== undefined &&
47
47
  diag.code === checker.ngErrorCode(checker.ErrorCode.UNUSED_STANDALONE_IMPORTS)) {
48
+ // Skip files that aren't owned by this compilation unit.
49
+ if (!info.sourceFiles.includes(diag.file)) {
50
+ return;
51
+ }
48
52
  if (!nodePositions.has(diag.file)) {
49
53
  nodePositions.set(diag.file, new Set());
50
54
  }
51
- nodePositions.get(diag.file).add(this.getNodeID(diag.start, diag.length));
55
+ nodePositions.get(diag.file).add(this.getNodeKey(diag.start, diag.length));
52
56
  }
53
57
  });
54
58
  nodePositions.forEach((locations, sourceFile) => {
55
59
  const resolvedLocations = this.resolveRemovalLocations(sourceFile, locations);
56
60
  const usageAnalysis = this.analyzeUsages(sourceFile, resolvedLocations);
57
61
  if (resolvedLocations.allRemovedIdentifiers.size > 0) {
62
+ removedImports += resolvedLocations.allRemovedIdentifiers.size;
58
63
  changedFiles++;
59
- resolvedLocations.allRemovedIdentifiers.forEach((identifier) => {
60
- removedIdentifiers.push(this.getNodeID(identifier.getStart(), identifier.getWidth()));
61
- });
62
64
  }
63
65
  this.generateReplacements(sourceFile, resolvedLocations, usageAnalysis, info, replacements);
64
66
  });
65
- return project_paths.confirmAsSerializable({ replacements, removedIdentifiers, changedFiles });
67
+ return project_paths.confirmAsSerializable({ replacements, removedImports, changedFiles });
66
68
  }
67
69
  async migrate(globalData) {
68
70
  return project_paths.confirmAsSerializable(globalData);
69
71
  }
70
72
  async combine(unitA, unitB) {
71
- const combinedReplacements = [];
72
- const combinedRemovedIdentifiers = [];
73
- const seenReplacements = new Set();
74
- const seenIdentifiers = new Set();
75
- const changedFileIds = new Set();
76
- [unitA, unitB].forEach((unit) => {
77
- for (const replacement of unit.replacements) {
78
- const key = this.getReplacementID(replacement);
79
- changedFileIds.add(replacement.projectFile.id);
80
- if (!seenReplacements.has(key)) {
81
- seenReplacements.add(key);
82
- combinedReplacements.push(replacement);
83
- }
84
- }
85
- for (const identifier of unit.removedIdentifiers) {
86
- if (!seenIdentifiers.has(identifier)) {
87
- seenIdentifiers.add(identifier);
88
- combinedRemovedIdentifiers.push(identifier);
89
- }
90
- }
91
- });
92
73
  return project_paths.confirmAsSerializable({
93
- replacements: combinedReplacements,
94
- removedIdentifiers: combinedRemovedIdentifiers,
95
- changedFiles: changedFileIds.size,
74
+ replacements: [...unitA.replacements, ...unitB.replacements],
75
+ removedImports: unitA.removedImports + unitB.removedImports,
76
+ changedFiles: unitA.changedFiles + unitB.changedFiles,
96
77
  });
97
78
  }
98
79
  async globalMeta(combinedData) {
@@ -100,19 +81,14 @@ class UnusedImportsMigration extends project_paths.TsurgeFunnelMigration {
100
81
  }
101
82
  async stats(globalMetadata) {
102
83
  return project_paths.confirmAsSerializable({
103
- removedImports: globalMetadata.removedIdentifiers.length,
84
+ removedImports: globalMetadata.removedImports,
104
85
  changedFiles: globalMetadata.changedFiles,
105
86
  });
106
87
  }
107
- /** Gets an ID that can be used to look up a node based on its location. */
108
- getNodeID(start, length) {
88
+ /** Gets a key that can be used to look up a node based on its location. */
89
+ getNodeKey(start, length) {
109
90
  return `${start}/${length}`;
110
91
  }
111
- /** Gets a unique ID for a replacement. */
112
- getReplacementID(replacement) {
113
- const { position, end, toInsert } = replacement.update.data;
114
- return replacement.projectFile.id + '/' + position + '/' + end + '/' + toInsert;
115
- }
116
92
  /**
117
93
  * Resolves a set of node locations to the actual AST nodes that need to be migrated.
118
94
  * @param sourceFile File in which to resolve the locations.
@@ -134,7 +110,7 @@ class UnusedImportsMigration extends project_paths.TsurgeFunnelMigration {
134
110
  if (!parent) {
135
111
  return;
136
112
  }
137
- if (locations.has(this.getNodeID(node.getStart(), node.getWidth()))) {
113
+ if (locations.has(this.getNodeKey(node.getStart(), node.getWidth()))) {
138
114
  // When the entire array needs to be cleared, the diagnostic is
139
115
  // reported on the property assignment, rather than an array element.
140
116
  if (ts.isPropertyAssignment(parent) &&
@@ -143,7 +119,7 @@ class UnusedImportsMigration extends project_paths.TsurgeFunnelMigration {
143
119
  result.fullRemovals.add(parent.initializer);
144
120
  parent.initializer.elements.forEach((element) => {
145
121
  if (ts.isIdentifier(element)) {
146
- result.allRemovedIdentifiers.add(element);
122
+ result.allRemovedIdentifiers.add(element.text);
147
123
  }
148
124
  });
149
125
  }
@@ -152,7 +128,7 @@ class UnusedImportsMigration extends project_paths.TsurgeFunnelMigration {
152
128
  result.partialRemovals.set(parent, new Set());
153
129
  }
154
130
  result.partialRemovals.get(parent).add(node);
155
- result.allRemovedIdentifiers.add(node);
131
+ result.allRemovedIdentifiers.add(node.text);
156
132
  }
157
133
  }
158
134
  };
@@ -246,13 +222,8 @@ class UnusedImportsMigration extends project_paths.TsurgeFunnelMigration {
246
222
  names.forEach((symbolName, localName) => {
247
223
  // Note that in the `identifierCounts` lookup both zero and undefined
248
224
  // are valid and mean that the identifiers isn't being used anymore.
249
- if (!identifierCounts.get(localName)) {
250
- for (const identifier of allRemovedIdentifiers) {
251
- if (identifier.text === localName) {
252
- importManager.removeImport(sourceFile, symbolName, moduleName);
253
- break;
254
- }
255
- }
225
+ if (allRemovedIdentifiers.has(localName) && !identifierCounts.get(localName)) {
226
+ importManager.removeImport(sourceFile, symbolName, moduleName);
256
227
  }
257
228
  });
258
229
  });