@angular/core 19.0.0-next.8 → 19.0.0-next.9

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 (30) hide show
  1. package/fesm2022/core.mjs +93 -13
  2. package/fesm2022/core.mjs.map +1 -1
  3. package/fesm2022/primitives/event-dispatch.mjs +1 -1
  4. package/fesm2022/primitives/signals.mjs +1 -1
  5. package/fesm2022/primitives/signals.mjs.map +1 -1
  6. package/fesm2022/rxjs-interop.mjs +1 -1
  7. package/fesm2022/testing.mjs +6 -4
  8. package/fesm2022/testing.mjs.map +1 -1
  9. package/index.d.ts +41 -18
  10. package/package.json +1 -1
  11. package/primitives/event-dispatch/index.d.ts +1 -1
  12. package/primitives/signals/index.d.ts +5 -1
  13. package/rxjs-interop/index.d.ts +1 -1
  14. package/schematics/bundles/{checker-e68dd7ce.js → checker-3b2ea20f.js} +124 -76
  15. package/schematics/bundles/{compiler_host-9a4d0c2b.js → compiler_host-b4ba5a28.js} +2 -2
  16. package/schematics/bundles/control-flow-migration.js +3 -3
  17. package/schematics/bundles/explicit-standalone-flag.js +3 -3
  18. package/schematics/bundles/{group_replacements-472b2387.js → group_replacements-e1b5cbf8.js} +234 -108
  19. package/schematics/bundles/imports-4ac08251.js +1 -1
  20. package/schematics/bundles/inject-migration.js +3 -3
  21. package/schematics/bundles/leading_space-d190b83b.js +1 -1
  22. package/schematics/bundles/nodes-0e7d45ca.js +1 -1
  23. package/schematics/bundles/pending-tasks.js +3 -3
  24. package/schematics/bundles/{program-105283c5.js → program-6534a30a.js} +67 -21
  25. package/schematics/bundles/project_tsconfig_paths-e9ccccbf.js +1 -1
  26. package/schematics/bundles/route-lazy-loading.js +3 -3
  27. package/schematics/bundles/signal-input-migration.js +147 -171
  28. package/schematics/bundles/signal-queries-migration.js +93 -74
  29. package/schematics/bundles/standalone-migration.js +5 -5
  30. package/testing/index.d.ts +3 -1
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
  /**
3
- * @license Angular v19.0.0-next.8
3
+ * @license Angular v19.0.0-next.9
4
4
  * (c) 2010-2024 Google LLC. https://angular.io/
5
5
  * License: MIT
6
6
  */
@@ -10,15 +10,15 @@ Object.defineProperty(exports, '__esModule', { value: true });
10
10
 
11
11
  var schematics = require('@angular-devkit/schematics');
12
12
  var project_tsconfig_paths = require('./project_tsconfig_paths-e9ccccbf.js');
13
- var group_replacements = require('./group_replacements-472b2387.js');
13
+ var group_replacements = require('./group_replacements-e1b5cbf8.js');
14
14
  require('os');
15
15
  var ts = require('typescript');
16
- var checker = require('./checker-e68dd7ce.js');
17
- var program = require('./program-105283c5.js');
16
+ var checker = require('./checker-3b2ea20f.js');
17
+ var program = require('./program-6534a30a.js');
18
18
  require('path');
19
19
  var assert = require('assert');
20
20
  require('@angular-devkit/core');
21
- require('node:path');
21
+ require('node:path/posix');
22
22
  require('fs');
23
23
  require('module');
24
24
  require('url');
@@ -97,48 +97,6 @@ function migrateTemplateReferences(host, references) {
97
97
  }
98
98
  }
99
99
 
100
- /**
101
- * Migrates TypeScript "ts.Type" references. E.g.
102
-
103
- * - `Partial<MyComp>` will be converted to `UnwrapSignalInputs<Partial<MyComp>>`.
104
- in Catalyst test files.
105
- */
106
- function migrateTypeScriptTypeReferences(host, references, importManager, info) {
107
- const seenTypeNodes = new WeakSet();
108
- for (const reference of references) {
109
- // This pass only deals with TS input class type references.
110
- if (!group_replacements.isTsClassTypeReference(reference)) {
111
- continue;
112
- }
113
- // Skip references to classes that are not fully migrated.
114
- if (!host.shouldMigrateReferencesToClass(reference.target)) {
115
- continue;
116
- }
117
- // Skip duplicate references. E.g. in batching.
118
- if (seenTypeNodes.has(reference.from.node)) {
119
- continue;
120
- }
121
- seenTypeNodes.add(reference.from.node);
122
- if (reference.isPartialReference && reference.isPartOfCatalystFile) {
123
- assert__default["default"](reference.from.node.typeArguments, 'Expected type arguments for partial reference.');
124
- assert__default["default"](reference.from.node.typeArguments.length === 1, 'Expected an argument for reference.');
125
- const firstArg = reference.from.node.typeArguments[0];
126
- const sf = firstArg.getSourceFile();
127
- const unwrapImportExpr = importManager.addImport({
128
- exportModuleSpecifier: 'google3/javascript/angular2/testing/catalyst',
129
- exportSymbolName: 'UnwrapSignalInputs',
130
- requestedFile: sf,
131
- });
132
- host.replacements.push(new group_replacements.Replacement(group_replacements.projectFile(sf, info), new group_replacements.TextUpdate({
133
- position: firstArg.getStart(),
134
- end: firstArg.getStart(),
135
- toInsert: `${host.printer.printNode(ts__default["default"].EmitHint.Unspecified, unwrapImportExpr, sf)}<`,
136
- })));
137
- host.replacements.push(new group_replacements.Replacement(group_replacements.projectFile(sf, info), new group_replacements.TextUpdate({ position: firstArg.getEnd(), end: firstArg.getEnd(), toInsert: '>' })));
138
- }
139
- }
140
- }
141
-
142
100
  /**
143
101
  * Extracts the type `T` of expressions referencing `QueryList<T>`.
144
102
  */
@@ -240,7 +198,7 @@ function computeReplacementsToMigrateQuery(node, metadata, importManager, info,
240
198
  type = undefined;
241
199
  }
242
200
  const call = ts__default["default"].factory.createCallExpression(newQueryFn, type ? [type] : undefined, args);
243
- const updated = ts__default["default"].factory.updatePropertyDeclaration(node, [ts__default["default"].factory.createModifier(ts__default["default"].SyntaxKind.ReadonlyKeyword)], node.name, undefined, undefined, call);
201
+ const updated = ts__default["default"].factory.createPropertyDeclaration([ts__default["default"].factory.createModifier(ts__default["default"].SyntaxKind.ReadonlyKeyword)], node.name, undefined, undefined, call);
244
202
  return [
245
203
  new group_replacements.Replacement(group_replacements.projectFile(node.getSourceFile(), info), new group_replacements.TextUpdate({
246
204
  position: node.getStart(),
@@ -341,7 +299,7 @@ class KnownQueries {
341
299
  this.info = info;
342
300
  this.globalMetadata = globalMetadata;
343
301
  this.classToQueryFields = new Map();
344
- this.knownQueryIDs = new Set();
302
+ this.knownQueryIDs = new Map();
345
303
  }
346
304
  isFieldIncompatible(descriptor) {
347
305
  return this.globalMetadata.problematicQueries[descriptor.key] !== undefined;
@@ -362,7 +320,7 @@ class KnownQueries {
362
320
  key: id,
363
321
  node: queryField,
364
322
  });
365
- this.knownQueryIDs.add(id);
323
+ this.knownQueryIDs.set(id, { key: id, node: queryField });
366
324
  }
367
325
  attemptRetrieveDescriptorFromSymbol(symbol) {
368
326
  const descriptor = getClassFieldDescriptorForSymbol(symbol, this.info);
@@ -630,8 +588,6 @@ class SignalQueriesMigration extends group_replacements.TsurgeComplexMigration {
630
588
  }
631
589
  async analyze(info) {
632
590
  assert__default["default"](info.ngCompiler !== null, 'Expected queries migration to have an Angular program.');
633
- // TODO: This stage for this migration doesn't necessarily need a full
634
- // compilation unit program.
635
591
  // Pre-Analyze the program and get access to the template type checker.
636
592
  const { templateTypeChecker } = info.ngCompiler['ensureAnalyzed']();
637
593
  const { sourceFiles, program: program$1 } = info;
@@ -642,12 +598,27 @@ class SignalQueriesMigration extends group_replacements.TsurgeComplexMigration {
642
598
  knownQueryFields: {},
643
599
  potentialProblematicQueries: {},
644
600
  potentialProblematicReferenceForMultiQueries: {},
601
+ reusableAnalysisReferences: null,
645
602
  };
646
603
  const groupedAstVisitor = new group_replacements.GroupedTsAstVisitor(sourceFiles);
647
604
  const referenceResult = { references: [] };
605
+ const classesWithFilteredQueries = new WeakSet();
606
+ const filteredQueriesForCompilationUnit = new Map();
648
607
  const findQueryDefinitionsVisitor = (node) => {
649
608
  const extractedQuery = extractSourceQueryDefinition(node, reflector, evaluator, info);
650
609
  if (extractedQuery !== null) {
610
+ const descriptor = {
611
+ key: extractedQuery.id,
612
+ node: extractedQuery.node,
613
+ };
614
+ const containingFile = group_replacements.projectFile(descriptor.node.getSourceFile(), info);
615
+ if (this.config.shouldMigrateQuery === undefined ||
616
+ this.config.shouldMigrateQuery(descriptor, containingFile)) {
617
+ classesWithFilteredQueries.add(extractedQuery.node.parent);
618
+ filteredQueriesForCompilationUnit.set(extractedQuery.id, {
619
+ fieldName: extractedQuery.queryInfo.propertyName,
620
+ });
621
+ }
651
622
  res.knownQueryFields[extractedQuery.id] = {
652
623
  fieldName: extractedQuery.queryInfo.propertyName,
653
624
  isMulti: extractedQuery.queryInfo.first === false,
@@ -655,17 +626,45 @@ class SignalQueriesMigration extends group_replacements.TsurgeComplexMigration {
655
626
  }
656
627
  };
657
628
  groupedAstVisitor.register(findQueryDefinitionsVisitor);
658
- groupedAstVisitor.register(group_replacements.createFindAllSourceFileReferencesVisitor(info, checker$1, reflector, info.ngCompiler['resourceManager'], evaluator, templateTypeChecker,
659
- // Eager, rather expensive tracking of all references.
660
- // We don't know yet if something refers to a different query or not, so we
661
- // eagerly detect such and later filter those problematic references that
662
- // turned out to refer to queries.
663
- // TODO: Consider skipping this extra work when running in non-batch mode.
664
- // TODO: Also consider skipping if we know this query cannot be part.
665
- {
666
- shouldTrackClassReference: (_class) => false,
667
- attemptRetrieveDescriptorFromSymbol: (s) => getClassFieldDescriptorForSymbol(s, info),
668
- }, null, referenceResult).visitor);
629
+ if (this.config.assumeNonBatch) {
630
+ // In non-batch, we need to find queries before, so we can perform
631
+ // improved reference resolution.
632
+ this.config.reportProgressFn?.(20, 'Scanning for queries..');
633
+ groupedAstVisitor.execute();
634
+ this.config.reportProgressFn?.(30, 'Scanning for references..');
635
+ }
636
+ else {
637
+ this.config.reportProgressFn?.(20, 'Scanning for queries and references..');
638
+ }
639
+ groupedAstVisitor.register(group_replacements.createFindAllSourceFileReferencesVisitor(info, checker$1, reflector, info.ngCompiler['resourceManager'], evaluator, templateTypeChecker, {
640
+ // Note: We don't support cross-target migration of `Partial<T>` usages.
641
+ // This is an acceptable limitation for performance reasons.
642
+ shouldTrackClassReference: (node) => classesWithFilteredQueries.has(node),
643
+ attemptRetrieveDescriptorFromSymbol: (s) => {
644
+ const descriptor = getClassFieldDescriptorForSymbol(s, info);
645
+ // If we are executing in upgraded analysis phase mode, we know all
646
+ // of the queries since there aren't any other compilation units.
647
+ // Ignore references to non-query class fields.
648
+ if (this.config.assumeNonBatch &&
649
+ descriptor !== null &&
650
+ !filteredQueriesForCompilationUnit.has(descriptor.key)) {
651
+ return null;
652
+ }
653
+ // TODO: Also consider skipping if we know this cannot be a query.
654
+ // e.g. missing class decorators or some other checks.
655
+ // In batch mode, we eagerly, rather expensively, track all references.
656
+ // We don't know yet if something refers to a different query or not, so we
657
+ // eagerly detect such and later filter those problematic references that
658
+ // turned out to refer to queries (once we have the global metadata).
659
+ return descriptor;
660
+ },
661
+ },
662
+ // In non-batch mode, we know what inputs exist and can optimize the reference
663
+ // resolution significantly (for e.g. VSCode integration)— as we know what
664
+ // field names may be used to reference potential queries.
665
+ this.config.assumeNonBatch
666
+ ? new Set(Array.from(filteredQueriesForCompilationUnit.values()).map((f) => f.fieldName))
667
+ : null, referenceResult).visitor);
669
668
  groupedAstVisitor.execute();
670
669
  // Determine incompatible queries based on problematic references
671
670
  // we saw in TS code, templates or host bindings.
@@ -684,12 +683,16 @@ class SignalQueriesMigration extends group_replacements.TsurgeComplexMigration {
684
683
  // Check for other incompatible query list accesses.
685
684
  checkForIncompatibleQueryListAccesses(ref, res);
686
685
  }
686
+ if (this.config.assumeNonBatch) {
687
+ res.reusableAnalysisReferences = referenceResult.references;
688
+ }
687
689
  return group_replacements.confirmAsSerializable(res);
688
690
  }
689
691
  async merge(units) {
690
692
  const merged = {
691
693
  knownQueryFields: {},
692
694
  problematicQueries: {},
695
+ reusableAnalysisReferences: null,
693
696
  };
694
697
  for (const unit of units) {
695
698
  for (const [id, value] of Object.entries(unit.knownQueryFields)) {
@@ -698,6 +701,10 @@ class SignalQueriesMigration extends group_replacements.TsurgeComplexMigration {
698
701
  for (const id of Object.keys(unit.potentialProblematicQueries)) {
699
702
  merged.problematicQueries[id] = true;
700
703
  }
704
+ if (unit.reusableAnalysisReferences !== null) {
705
+ assert__default["default"](units.length === 1, 'Expected migration to not run in batch mode');
706
+ merged.reusableAnalysisReferences = unit.reusableAnalysisReferences;
707
+ }
701
708
  }
702
709
  for (const unit of units) {
703
710
  for (const id of Object.keys(unit.potentialProblematicReferenceForMultiQueries)) {
@@ -711,7 +718,7 @@ class SignalQueriesMigration extends group_replacements.TsurgeComplexMigration {
711
718
  async migrate(globalMetadata, info) {
712
719
  assert__default["default"](info.ngCompiler !== null, 'Expected queries migration to have an Angular program.');
713
720
  // Pre-Analyze the program and get access to the template type checker.
714
- const { templateTypeChecker, metaReader } = await info.ngCompiler['ensureAnalyzed']();
721
+ const { templateTypeChecker, metaReader } = info.ngCompiler['ensureAnalyzed']();
715
722
  const { program: program$1, sourceFiles } = info;
716
723
  const checker$1 = program$1.getTypeChecker();
717
724
  const reflector = new checker.TypeScriptReflectionHost(checker$1);
@@ -719,9 +726,9 @@ class SignalQueriesMigration extends group_replacements.TsurgeComplexMigration {
719
726
  const replacements = [];
720
727
  const importManager = new checker.ImportManager();
721
728
  const printer = ts__default["default"].createPrinter();
722
- const filesWithMigratedQueries = new Map();
729
+ const filesWithSourceQueries = new Map();
723
730
  const filesWithIncompleteMigration = new Map();
724
- const filesWithUnrelatedQueryListImports = new WeakSet();
731
+ const filesWithQueryListOutsideOfDeclarations = new WeakSet();
725
732
  const knownQueries = new KnownQueries(info, globalMetadata);
726
733
  const referenceResult = { references: [] };
727
734
  const sourceQueries = [];
@@ -751,10 +758,11 @@ class SignalQueriesMigration extends group_replacements.TsurgeComplexMigration {
751
758
  if (ts__default["default"].isIdentifier(node) &&
752
759
  node.text === 'QueryList' &&
753
760
  ts__default["default"].findAncestor(node, ts__default["default"].isImportDeclaration) === undefined) {
754
- filesWithUnrelatedQueryListImports.add(node.getSourceFile());
761
+ filesWithQueryListOutsideOfDeclarations.add(node.getSourceFile());
755
762
  }
756
763
  ts__default["default"].forEachChild(node, queryWholeProgramVisitor);
757
764
  };
765
+ this.config.reportProgressFn?.(40, 'Tracking query declarations..');
758
766
  for (const sf of info.fullProgramSourceFiles) {
759
767
  ts__default["default"].forEachChild(sf, queryWholeProgramVisitor);
760
768
  }
@@ -763,25 +771,36 @@ class SignalQueriesMigration extends group_replacements.TsurgeComplexMigration {
763
771
  const fieldNamesToConsiderForReferenceLookup = new Set(Object.values(globalMetadata.knownQueryFields).map((f) => f.fieldName));
764
772
  // Find all references.
765
773
  const groupedAstVisitor = new group_replacements.GroupedTsAstVisitor(sourceFiles);
766
- groupedAstVisitor.register(group_replacements.createFindAllSourceFileReferencesVisitor(info, checker$1, reflector, info.ngCompiler['resourceManager'], evaluator, templateTypeChecker, knownQueries, fieldNamesToConsiderForReferenceLookup, referenceResult).visitor);
774
+ // Re-use previous reference result if available, instead of
775
+ // looking for references which is quite expensive.
776
+ if (globalMetadata.reusableAnalysisReferences !== null) {
777
+ referenceResult.references = globalMetadata.reusableAnalysisReferences;
778
+ }
779
+ else {
780
+ groupedAstVisitor.register(group_replacements.createFindAllSourceFileReferencesVisitor(info, checker$1, reflector, info.ngCompiler['resourceManager'], evaluator, templateTypeChecker, knownQueries, fieldNamesToConsiderForReferenceLookup, referenceResult).visitor);
781
+ }
767
782
  const inheritanceGraph = new group_replacements.InheritanceGraph(checker$1).expensivePopulate(info.sourceFiles);
768
783
  group_replacements.checkIncompatiblePatterns(inheritanceGraph, checker$1, groupedAstVisitor, knownQueries, () => knownQueries.getAllClassesWithQueries());
784
+ this.config.reportProgressFn?.(60, 'Checking for problematic patterns..');
769
785
  groupedAstVisitor.execute();
770
786
  // Check inheritance.
787
+ this.config.reportProgressFn?.(70, 'Checking for inheritance patterns..');
771
788
  group_replacements.checkInheritanceOfKnownFields(inheritanceGraph, metaReader, knownQueries, {
772
789
  getFieldsForClass: (n) => knownQueries.getQueryFieldsOfClass(n) ?? [],
773
790
  isClassWithKnownFields: (clazz) => knownQueries.getQueryFieldsOfClass(clazz) !== undefined,
774
791
  });
792
+ this.config.reportProgressFn?.(80, 'Migrating queries..');
775
793
  // Migrate declarations.
776
794
  for (const extractedQuery of sourceQueries) {
777
795
  const node = extractedQuery.node;
778
796
  const sf = node.getSourceFile();
779
797
  const descriptor = { key: extractedQuery.id, node: extractedQuery.node };
780
798
  if (!isMigratedQuery(descriptor)) {
799
+ updateFileState(filesWithSourceQueries, sf, extractedQuery.kind);
781
800
  updateFileState(filesWithIncompleteMigration, sf, extractedQuery.kind);
782
801
  continue;
783
802
  }
784
- updateFileState(filesWithMigratedQueries, sf, extractedQuery.kind);
803
+ updateFileState(filesWithSourceQueries, sf, extractedQuery.kind);
785
804
  replacements.push(...computeReplacementsToMigrateQuery(node, extractedQuery, importManager, info, printer));
786
805
  }
787
806
  // Migrate references.
@@ -794,7 +813,7 @@ class SignalQueriesMigration extends group_replacements.TsurgeComplexMigration {
794
813
  group_replacements.migrateTypeScriptReferences(referenceMigrationHost, referenceResult.references, checker$1, info);
795
814
  migrateTemplateReferences(referenceMigrationHost, referenceResult.references);
796
815
  migrateHostBindings(referenceMigrationHost, referenceResult.references, info);
797
- migrateTypeScriptTypeReferences(referenceMigrationHost, referenceResult.references, importManager, info);
816
+ group_replacements.migrateTypeScriptTypeReferences(referenceMigrationHost, referenceResult.references, importManager, info);
798
817
  // Fix problematic calls, like `QueryList#toArray`, or `QueryList#get`.
799
818
  for (const ref of referenceResult.references) {
800
819
  removeQueryListToArrayCall(ref, info, globalMetadata, replacements);
@@ -802,7 +821,7 @@ class SignalQueriesMigration extends group_replacements.TsurgeComplexMigration {
802
821
  replaceQueryListFirstAndLastReferences(ref, info, globalMetadata, replacements);
803
822
  }
804
823
  // Remove imports if possible.
805
- for (const [file, types] of filesWithMigratedQueries) {
824
+ for (const [file, types] of filesWithSourceQueries) {
806
825
  let seenIncompatibleMultiQuery = false;
807
826
  for (const type of types) {
808
827
  const incompatibleQueryTypesForFile = filesWithIncompleteMigration.get(file);
@@ -814,12 +833,12 @@ class SignalQueriesMigration extends group_replacements.TsurgeComplexMigration {
814
833
  seenIncompatibleMultiQuery = true;
815
834
  }
816
835
  }
817
- if (!seenIncompatibleMultiQuery && !filesWithUnrelatedQueryListImports.has(file)) {
836
+ if (!seenIncompatibleMultiQuery && !filesWithQueryListOutsideOfDeclarations.has(file)) {
818
837
  importManager.removeImport(file, 'QueryList', '@angular/core');
819
838
  }
820
839
  }
821
840
  group_replacements.applyImportManagerChanges(importManager, replacements, sourceFiles, info);
822
- return replacements;
841
+ return { replacements, knownQueries };
823
842
  }
824
843
  async stats(globalMetadata) {
825
844
  // TODO: Add statistics.
@@ -879,7 +898,7 @@ function migrate(options) {
879
898
  const replacementsPerFile = new Map();
880
899
  for (const { info, tsconfigPath } of programInfos) {
881
900
  context.logger.info(`Migrating: ${tsconfigPath}..`);
882
- const replacements = await migration.migrate(merged, info);
901
+ const { replacements } = await migration.migrate(merged, info);
883
902
  const changesPerFile = group_replacements.groupReplacementsByFile(replacements);
884
903
  for (const [file, changes] of changesPerFile) {
885
904
  if (!replacementsPerFile.has(file)) {
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
  /**
3
- * @license Angular v19.0.0-next.8
3
+ * @license Angular v19.0.0-next.9
4
4
  * (c) 2010-2024 Google LLC. https://angular.io/
5
5
  * License: MIT
6
6
  */
@@ -11,11 +11,11 @@ Object.defineProperty(exports, '__esModule', { value: true });
11
11
  var schematics = require('@angular-devkit/schematics');
12
12
  require('os');
13
13
  var ts = require('typescript');
14
- var checker = require('./checker-e68dd7ce.js');
14
+ var checker = require('./checker-3b2ea20f.js');
15
15
  var p = require('path');
16
- var program = require('./program-105283c5.js');
16
+ var program = require('./program-6534a30a.js');
17
17
  var fs = require('fs');
18
- var compiler_host = require('./compiler_host-9a4d0c2b.js');
18
+ var compiler_host = require('./compiler_host-b4ba5a28.js');
19
19
  var project_tsconfig_paths = require('./project_tsconfig_paths-e9ccccbf.js');
20
20
  var nodes = require('./nodes-0e7d45ca.js');
21
21
  var imports = require('./imports-4ac08251.js');
@@ -32,7 +32,7 @@ var ts__default = /*#__PURE__*/_interopDefaultLegacy(ts);
32
32
  * @description
33
33
  * Entry point for all public APIs of the compiler-cli package.
34
34
  */
35
- new checker.Version('19.0.0-next.8');
35
+ new checker.Version('19.0.0-next.9');
36
36
 
37
37
  function createProgram({ rootNames, options, host, oldProgram, }) {
38
38
  return new program.NgtscProgram(rootNames, options, host, oldProgram);
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @license Angular v19.0.0-next.8
2
+ * @license Angular v19.0.0-next.9
3
3
  * (c) 2010-2024 Google LLC. https://angular.io/
4
4
  * License: MIT
5
5
  */
@@ -89,6 +89,8 @@ export declare class ComponentFixture<T> {
89
89
  * Set whether the fixture should autodetect changes.
90
90
  *
91
91
  * Also runs detectChanges once so that any existing change is detected.
92
+ *
93
+ * @param autoDetect Whether to autodetect changes. By default, `true`.
92
94
  */
93
95
  autoDetectChanges(autoDetect?: boolean): void;
94
96
  /**