@angular/core 21.0.0-next.8 → 21.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 (74) hide show
  1. package/fesm2022/_attribute-chunk.mjs +1 -1
  2. package/fesm2022/_debug_node-chunk.mjs +481 -438
  3. package/fesm2022/_debug_node-chunk.mjs.map +1 -1
  4. package/fesm2022/_effect-chunk.mjs +512 -48
  5. package/fesm2022/_effect-chunk.mjs.map +1 -1
  6. package/fesm2022/{_root_effect_scheduler-chunk.mjs → _effect-chunk2.mjs} +197 -19
  7. package/fesm2022/_effect-chunk2.mjs.map +1 -0
  8. package/fesm2022/_not_found-chunk.mjs +1 -1
  9. package/fesm2022/_resource-chunk.mjs +5 -173
  10. package/fesm2022/_resource-chunk.mjs.map +1 -1
  11. package/fesm2022/_untracked-chunk.mjs +117 -0
  12. package/fesm2022/_untracked-chunk.mjs.map +1 -0
  13. package/fesm2022/_weak_ref-chunk.mjs +1 -1
  14. package/fesm2022/core.mjs +8 -7
  15. package/fesm2022/core.mjs.map +1 -1
  16. package/fesm2022/primitives-di.mjs +1 -1
  17. package/fesm2022/primitives-event-dispatch.mjs +1 -1
  18. package/fesm2022/primitives-signals.mjs +4 -4
  19. package/fesm2022/primitives-signals.mjs.map +1 -1
  20. package/fesm2022/rxjs-interop.mjs +5 -5
  21. package/fesm2022/testing.mjs +3 -3
  22. package/package.json +2 -2
  23. package/schematics/bundles/add-bootstrap-context-to-server-main.cjs +5 -5
  24. package/schematics/bundles/application-config-core.cjs +5 -5
  25. package/schematics/bundles/{apply_import_manager-CBLmogDD.cjs → apply_import_manager-CoeTX_Ob.cjs} +3 -3
  26. package/schematics/bundles/bootstrap-options-migration.cjs +5 -5
  27. package/schematics/bundles/cleanup-unused-imports.cjs +5 -5
  28. package/schematics/bundles/common-to-standalone-migration.cjs +385 -0
  29. package/schematics/bundles/{compiler_host-T6xncpiw.cjs → compiler_host-emLDwK2U.cjs} +2 -2
  30. package/schematics/bundles/control-flow-migration.cjs +4 -4
  31. package/schematics/bundles/imports-DwPXlGFl.cjs +1 -1
  32. package/schematics/bundles/{index-DWSaRJdz.cjs → index-CLxYZ09c.cjs} +4 -4
  33. package/schematics/bundles/{index-BnmACOsq.cjs → index-Dvqnp6JS.cjs} +166 -66
  34. package/schematics/bundles/inject-migration.cjs +3 -3
  35. package/schematics/bundles/leading_space-D9nQ8UQC.cjs +1 -1
  36. package/schematics/bundles/{migrate_ts_type_references-Cu-FR4L5.cjs → migrate_ts_type_references-CpM5FPGa.cjs} +5 -5
  37. package/schematics/bundles/{ng_component_template-BkWiUuGG.cjs → ng_component_template-BRbBIAUX.cjs} +2 -2
  38. package/schematics/bundles/ng_decorators-BI0uV7KI.cjs +1 -1
  39. package/schematics/bundles/ngclass-to-class-migration.cjs +7 -7
  40. package/schematics/bundles/ngstyle-to-style-migration.cjs +7 -7
  41. package/schematics/bundles/nodes-B16H9JUd.cjs +1 -1
  42. package/schematics/bundles/output-migration.cjs +6 -6
  43. package/schematics/bundles/{parse_html-C97tKKp3.cjs → parse_html-CPWfkfhR.cjs} +2 -2
  44. package/schematics/bundles/{project_paths-C6g3lqjX.cjs → project_paths-C8H7KDJ3.cjs} +3 -3
  45. package/schematics/bundles/{project_tsconfig_paths-CdhVNYMk.cjs → project_tsconfig_paths-CiBzGSIa.cjs} +12 -4
  46. package/schematics/bundles/property_name-BBwFuqMe.cjs +1 -1
  47. package/schematics/bundles/route-lazy-loading.cjs +3 -3
  48. package/schematics/bundles/router-current-navigation.cjs +4 -4
  49. package/schematics/bundles/router-last-successful-navigation.cjs +4 -4
  50. package/schematics/bundles/router-testing-module-migration.cjs +5 -5
  51. package/schematics/bundles/self-closing-tags-migration.cjs +6 -6
  52. package/schematics/bundles/signal-input-migration.cjs +7 -7
  53. package/schematics/bundles/signal-queries-migration.cjs +7 -7
  54. package/schematics/bundles/signals.cjs +7 -7
  55. package/schematics/bundles/standalone-migration.cjs +4 -4
  56. package/schematics/bundles/symbol-BObKoqes.cjs +1 -1
  57. package/schematics/collection.json +6 -0
  58. package/schematics/migrations/common-to-standalone-migration/schema.json +14 -0
  59. package/types/_api-chunk.d.ts +1 -1
  60. package/types/_chrome_dev_tools_performance-chunk.d.ts +20 -12
  61. package/types/_discovery-chunk.d.ts +12 -6
  62. package/types/_effect-chunk.d.ts +1 -1
  63. package/types/_event_dispatcher-chunk.d.ts +1 -1
  64. package/types/_formatter-chunk.d.ts +4 -3
  65. package/types/_weak_ref-chunk.d.ts +1 -1
  66. package/types/core.d.ts +49 -20
  67. package/types/primitives-di.d.ts +1 -1
  68. package/types/primitives-event-dispatch.d.ts +1 -1
  69. package/types/primitives-signals.d.ts +2 -2
  70. package/types/rxjs-interop.d.ts +1 -1
  71. package/types/testing.d.ts +1 -1
  72. package/fesm2022/_root_effect_scheduler-chunk.mjs.map +0 -1
  73. package/fesm2022/_signal-chunk.mjs +0 -581
  74. package/fesm2022/_signal-chunk.mjs.map +0 -1
@@ -1,12 +1,12 @@
1
1
  'use strict';
2
2
  /**
3
- * @license Angular v21.0.0-next.8
3
+ * @license Angular v21.0.0-next.9
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-CdhVNYMk.cjs');
9
+ var project_tsconfig_paths = require('./project_tsconfig_paths-CiBzGSIa.cjs');
10
10
  var ts = require('typescript');
11
11
  var p = require('path');
12
12
  require('os');
@@ -888,7 +888,7 @@ const MINIMUM_PARTIAL_LINKER_DEFER_SUPPORT_VERSION = '18.0.0';
888
888
  function compileDeclareClassMetadata(metadata) {
889
889
  const definitionMap = new project_tsconfig_paths.DefinitionMap();
890
890
  definitionMap.set('minVersion', project_tsconfig_paths.literal(MINIMUM_PARTIAL_LINKER_VERSION$5));
891
- definitionMap.set('version', project_tsconfig_paths.literal('21.0.0-next.8'));
891
+ definitionMap.set('version', project_tsconfig_paths.literal('21.0.0-next.9'));
892
892
  definitionMap.set('ngImport', project_tsconfig_paths.importExpr(project_tsconfig_paths.Identifiers.core));
893
893
  definitionMap.set('type', metadata.type);
894
894
  definitionMap.set('decorators', metadata.decorators);
@@ -906,7 +906,7 @@ function compileComponentDeclareClassMetadata(metadata, dependencies) {
906
906
  callbackReturnDefinitionMap.set('ctorParameters', metadata.ctorParameters ?? project_tsconfig_paths.literal(null));
907
907
  callbackReturnDefinitionMap.set('propDecorators', metadata.propDecorators ?? project_tsconfig_paths.literal(null));
908
908
  definitionMap.set('minVersion', project_tsconfig_paths.literal(MINIMUM_PARTIAL_LINKER_DEFER_SUPPORT_VERSION));
909
- definitionMap.set('version', project_tsconfig_paths.literal('21.0.0-next.8'));
909
+ definitionMap.set('version', project_tsconfig_paths.literal('21.0.0-next.9'));
910
910
  definitionMap.set('ngImport', project_tsconfig_paths.importExpr(project_tsconfig_paths.Identifiers.core));
911
911
  definitionMap.set('type', metadata.type);
912
912
  definitionMap.set('resolveDeferredDeps', compileComponentMetadataAsyncResolver(dependencies));
@@ -1001,7 +1001,7 @@ function createDirectiveDefinitionMap(meta) {
1001
1001
  const definitionMap = new project_tsconfig_paths.DefinitionMap();
1002
1002
  const minVersion = getMinimumVersionForPartialOutput(meta);
1003
1003
  definitionMap.set('minVersion', project_tsconfig_paths.literal(minVersion));
1004
- definitionMap.set('version', project_tsconfig_paths.literal('21.0.0-next.8'));
1004
+ definitionMap.set('version', project_tsconfig_paths.literal('21.0.0-next.9'));
1005
1005
  // e.g. `type: MyDirective`
1006
1006
  definitionMap.set('type', meta.type.value);
1007
1007
  if (meta.isStandalone !== undefined) {
@@ -1414,7 +1414,7 @@ const MINIMUM_PARTIAL_LINKER_VERSION$4 = '12.0.0';
1414
1414
  function compileDeclareFactoryFunction(meta) {
1415
1415
  const definitionMap = new project_tsconfig_paths.DefinitionMap();
1416
1416
  definitionMap.set('minVersion', project_tsconfig_paths.literal(MINIMUM_PARTIAL_LINKER_VERSION$4));
1417
- definitionMap.set('version', project_tsconfig_paths.literal('21.0.0-next.8'));
1417
+ definitionMap.set('version', project_tsconfig_paths.literal('21.0.0-next.9'));
1418
1418
  definitionMap.set('ngImport', project_tsconfig_paths.importExpr(project_tsconfig_paths.Identifiers.core));
1419
1419
  definitionMap.set('type', meta.type.value);
1420
1420
  definitionMap.set('deps', compileDependencies(meta.deps));
@@ -1449,7 +1449,7 @@ function compileDeclareInjectableFromMetadata(meta) {
1449
1449
  function createInjectableDefinitionMap(meta) {
1450
1450
  const definitionMap = new project_tsconfig_paths.DefinitionMap();
1451
1451
  definitionMap.set('minVersion', project_tsconfig_paths.literal(MINIMUM_PARTIAL_LINKER_VERSION$3));
1452
- definitionMap.set('version', project_tsconfig_paths.literal('21.0.0-next.8'));
1452
+ definitionMap.set('version', project_tsconfig_paths.literal('21.0.0-next.9'));
1453
1453
  definitionMap.set('ngImport', project_tsconfig_paths.importExpr(project_tsconfig_paths.Identifiers.core));
1454
1454
  definitionMap.set('type', meta.type.value);
1455
1455
  // Only generate providedIn property if it has a non-null value
@@ -1500,7 +1500,7 @@ function compileDeclareInjectorFromMetadata(meta) {
1500
1500
  function createInjectorDefinitionMap(meta) {
1501
1501
  const definitionMap = new project_tsconfig_paths.DefinitionMap();
1502
1502
  definitionMap.set('minVersion', project_tsconfig_paths.literal(MINIMUM_PARTIAL_LINKER_VERSION$2));
1503
- definitionMap.set('version', project_tsconfig_paths.literal('21.0.0-next.8'));
1503
+ definitionMap.set('version', project_tsconfig_paths.literal('21.0.0-next.9'));
1504
1504
  definitionMap.set('ngImport', project_tsconfig_paths.importExpr(project_tsconfig_paths.Identifiers.core));
1505
1505
  definitionMap.set('type', meta.type.value);
1506
1506
  definitionMap.set('providers', meta.providers);
@@ -1533,7 +1533,7 @@ function createNgModuleDefinitionMap(meta) {
1533
1533
  throw new Error('Invalid path! Local compilation mode should not get into the partial compilation path');
1534
1534
  }
1535
1535
  definitionMap.set('minVersion', project_tsconfig_paths.literal(MINIMUM_PARTIAL_LINKER_VERSION$1));
1536
- definitionMap.set('version', project_tsconfig_paths.literal('21.0.0-next.8'));
1536
+ definitionMap.set('version', project_tsconfig_paths.literal('21.0.0-next.9'));
1537
1537
  definitionMap.set('ngImport', project_tsconfig_paths.importExpr(project_tsconfig_paths.Identifiers.core));
1538
1538
  definitionMap.set('type', meta.type.value);
1539
1539
  // We only generate the keys in the metadata if the arrays contain values.
@@ -1584,7 +1584,7 @@ function compileDeclarePipeFromMetadata(meta) {
1584
1584
  function createPipeDefinitionMap(meta) {
1585
1585
  const definitionMap = new project_tsconfig_paths.DefinitionMap();
1586
1586
  definitionMap.set('minVersion', project_tsconfig_paths.literal(MINIMUM_PARTIAL_LINKER_VERSION));
1587
- definitionMap.set('version', project_tsconfig_paths.literal('21.0.0-next.8'));
1587
+ definitionMap.set('version', project_tsconfig_paths.literal('21.0.0-next.9'));
1588
1588
  definitionMap.set('ngImport', project_tsconfig_paths.importExpr(project_tsconfig_paths.Identifiers.core));
1589
1589
  // e.g. `type: MyPipe`
1590
1590
  definitionMap.set('type', meta.type.value);
@@ -10183,6 +10183,45 @@ class SelectorlessDirectivesAnalyzer extends project_tsconfig_paths.CombinedRecu
10183
10183
  }
10184
10184
  }
10185
10185
 
10186
+ /*!
10187
+ * @license
10188
+ * Copyright Google LLC All Rights Reserved.
10189
+ *
10190
+ * Use of this source code is governed by an MIT-style license that can be
10191
+ * found in the LICENSE file at https://angular.dev/license
10192
+ */
10193
+ const ANIMATE_ENTER = 'animate.enter';
10194
+ const ANIMATE_LEAVE = `animate.leave`;
10195
+ /**
10196
+ * Analyzes a component's template to determine if it's using animate.enter
10197
+ * or animate.leave syntax.
10198
+ */
10199
+ function analyzeTemplateForAnimations(template) {
10200
+ const analyzer = new AnimationsAnalyzer();
10201
+ project_tsconfig_paths.visitAll(analyzer, template);
10202
+ return { hasAnimations: analyzer.hasAnimations };
10203
+ }
10204
+ /**
10205
+ * Visitor that traverses all the template nodes and
10206
+ * expressions to look for animation references.
10207
+ */
10208
+ class AnimationsAnalyzer extends project_tsconfig_paths.CombinedRecursiveAstVisitor {
10209
+ hasAnimations = false;
10210
+ visitElement(element) {
10211
+ for (const attr of element.attributes) {
10212
+ if (attr.name === ANIMATE_LEAVE || attr.name === ANIMATE_ENTER) {
10213
+ this.hasAnimations = true;
10214
+ }
10215
+ }
10216
+ for (const input of element.inputs) {
10217
+ if (input.name === ANIMATE_LEAVE || input.name === ANIMATE_ENTER) {
10218
+ this.hasAnimations = true;
10219
+ }
10220
+ }
10221
+ super.visitElement(element);
10222
+ }
10223
+ }
10224
+
10186
10225
  const EMPTY_ARRAY = [];
10187
10226
  const isUsedDirective = (decl) => decl.kind === project_tsconfig_paths.R3TemplateDependencyKind.Directive;
10188
10227
  const isUsedPipe = (decl) => decl.kind === project_tsconfig_paths.R3TemplateDependencyKind.Pipe;
@@ -10595,6 +10634,16 @@ class ComponentDecoratorHandler {
10595
10634
  }
10596
10635
  }
10597
10636
  }
10637
+ if (component.has('animations')) {
10638
+ const { hasAnimations } = analyzeTemplateForAnimations(template.nodes);
10639
+ if (hasAnimations) {
10640
+ if (diagnostics === undefined) {
10641
+ diagnostics = [];
10642
+ }
10643
+ diagnostics.push(project_tsconfig_paths.makeDiagnostic(project_tsconfig_paths.ErrorCode.COMPONENT_ANIMATIONS_CONFLICT, component.get('animations'), `A component cannot have both the '@Component.animations' property (legacy animations) and use 'animate.enter' or 'animate.leave' in the template.`));
10644
+ isPoisoned = true;
10645
+ }
10646
+ }
10598
10647
  const templateResource = template.declaration.isInline
10599
10648
  ? { path: null, node: component.get('template') }
10600
10649
  : {
@@ -12350,7 +12399,7 @@ class PipeDecoratorHandler {
12350
12399
  * @description
12351
12400
  * Entry point for all public APIs of the compiler-cli package.
12352
12401
  */
12353
- new project_tsconfig_paths.Version('21.0.0-next.8');
12402
+ new project_tsconfig_paths.Version('21.0.0-next.9');
12354
12403
 
12355
12404
  /**
12356
12405
  * Whether a given decorator should be treated as an Angular decorator.
@@ -13540,21 +13589,6 @@ var MemberTags;
13540
13589
  MemberTags["Inherited"] = "override";
13541
13590
  })(MemberTags || (MemberTags = {}));
13542
13591
 
13543
- /** Gets whether a symbol's name indicates it is an Angular-private API. */
13544
- function isAngularPrivateName(name) {
13545
- const firstChar = name[0] ?? '';
13546
- return firstChar === 'ɵ' || firstChar === '_';
13547
- }
13548
-
13549
- /** Gets a list of all the generic type parameters for a declaration. */
13550
- function extractGenerics(declaration) {
13551
- return (declaration.typeParameters?.map((typeParam) => ({
13552
- name: typeParam.name.getText(),
13553
- constraint: typeParam.constraint?.getText(),
13554
- default: typeParam.default?.getText(),
13555
- })) ?? []);
13556
- }
13557
-
13558
13592
  /**
13559
13593
  * RegExp to match the `@` character follow by any Angular decorator, used to escape Angular
13560
13594
  * decorators in JsDoc blocks so that they're not parsed as JsDoc tags.
@@ -13621,6 +13655,21 @@ function unescapeAngularDecorators(comment) {
13621
13655
  return comment.replace(/_NG_AT_/g, '@');
13622
13656
  }
13623
13657
 
13658
+ /** Gets whether a symbol's name indicates it is an Angular-private API. */
13659
+ function isAngularPrivateName(name) {
13660
+ const firstChar = name[0] ?? '';
13661
+ return firstChar === 'ɵ' || firstChar === '_';
13662
+ }
13663
+
13664
+ /** Gets a list of all the generic type parameters for a declaration. */
13665
+ function extractGenerics(declaration) {
13666
+ return (declaration.typeParameters?.map((typeParam) => ({
13667
+ name: typeParam.name.getText(),
13668
+ constraint: typeParam.constraint?.getText(),
13669
+ default: typeParam.default?.getText(),
13670
+ })) ?? []);
13671
+ }
13672
+
13624
13673
  /** Gets the string representation of a node's resolved type. */
13625
13674
  function extractResolvedTypeString(node, checker) {
13626
13675
  return checker.typeToString(checker.getTypeAtLocation(node), undefined, ts.TypeFormatFlags.NoTruncation);
@@ -13765,7 +13814,7 @@ function hasLeadingInternalComment(member) {
13765
13814
  }
13766
13815
 
13767
13816
  /** Extractor to pull info for API reference documentation for a TypeScript class or interface. */
13768
- class ClassExtractor {
13817
+ class PropertiesExtractor {
13769
13818
  declaration;
13770
13819
  typeChecker;
13771
13820
  constructor(declaration, typeChecker) {
@@ -13775,18 +13824,8 @@ class ClassExtractor {
13775
13824
  /** Extract docs info specific to classes. */
13776
13825
  extract() {
13777
13826
  return {
13778
- name: this.declaration.name.text,
13779
- isAbstract: this.isAbstract(),
13780
- entryType: ts.isInterfaceDeclaration(this.declaration)
13781
- ? EntryType.Interface
13782
- : EntryType.UndecoratedClass,
13783
13827
  members: this.extractSignatures().concat(this.extractAllClassMembers()),
13784
13828
  generics: extractGenerics(this.declaration),
13785
- description: extractJsDocDescription(this.declaration),
13786
- jsdocTags: extractJsDocTags(this.declaration),
13787
- rawComment: extractRawJsDoc(this.declaration),
13788
- extends: this.extractInheritance(this.declaration),
13789
- implements: this.extractInterfaceConformance(this.declaration),
13790
13829
  };
13791
13830
  }
13792
13831
  /** Extracts doc info for a class's members. */
@@ -13873,22 +13912,6 @@ class ClassExtractor {
13873
13912
  memberTags: this.getMemberTags(constructorDeclaration),
13874
13913
  };
13875
13914
  }
13876
- extractInheritance(declaration) {
13877
- if (!declaration.heritageClauses) {
13878
- return undefined;
13879
- }
13880
- for (const clause of declaration.heritageClauses) {
13881
- if (clause.token === ts.SyntaxKind.ExtendsKeyword) {
13882
- // We are assuming a single class can only extend one class.
13883
- const types = clause.types;
13884
- if (types.length > 0) {
13885
- const baseClass = types[0];
13886
- return baseClass.getText();
13887
- }
13888
- }
13889
- }
13890
- return undefined;
13891
- }
13892
13915
  extractInterfaceConformance(declaration) {
13893
13916
  const implementClause = declaration.heritageClauses?.find((clause) => clause.token === ts.SyntaxKind.ImplementsKeyword);
13894
13917
  return implementClause?.types.map((m) => m.getText()) ?? [];
@@ -14042,11 +14065,6 @@ class ClassExtractor {
14042
14065
  isDocumentableSignature(signature) {
14043
14066
  return (ts.isConstructSignatureDeclaration(signature) || ts.isCallSignatureDeclaration(signature));
14044
14067
  }
14045
- /** Gets whether the declaration for this extractor is abstract. */
14046
- isAbstract() {
14047
- const modifiers = this.declaration.modifiers ?? [];
14048
- return modifiers.some((mod) => mod.kind === ts.SyntaxKind.AbstractKeyword);
14049
- }
14050
14068
  /**
14051
14069
  * Check wether a member has a private computed property name like [ɵWRITABLE_SIGNAL]
14052
14070
  *
@@ -14056,6 +14074,48 @@ class ClassExtractor {
14056
14074
  return (ts.isComputedPropertyName(property.name) && property.name.expression.getText().startsWith('ɵ'));
14057
14075
  }
14058
14076
  }
14077
+
14078
+ /** Extractor to pull info for API reference documentation for a TypeScript class or interface. */
14079
+ class ClassExtractor extends PropertiesExtractor {
14080
+ constructor(declaration, typeChecker) {
14081
+ super(declaration, typeChecker);
14082
+ }
14083
+ /** Extract docs info specific to classes. */
14084
+ extract() {
14085
+ return {
14086
+ name: this.declaration.name.text,
14087
+ isAbstract: this.isAbstract(),
14088
+ entryType: EntryType.UndecoratedClass,
14089
+ ...super.extract(),
14090
+ description: extractJsDocDescription(this.declaration),
14091
+ jsdocTags: extractJsDocTags(this.declaration),
14092
+ rawComment: extractRawJsDoc(this.declaration),
14093
+ extends: this.extractInheritance(this.declaration),
14094
+ implements: this.extractInterfaceConformance(this.declaration),
14095
+ };
14096
+ }
14097
+ /** Gets whether the declaration for this extractor is abstract. */
14098
+ isAbstract() {
14099
+ const modifiers = this.declaration.modifiers ?? [];
14100
+ return modifiers.some((mod) => mod.kind === ts.SyntaxKind.AbstractKeyword);
14101
+ }
14102
+ extractInheritance(declaration) {
14103
+ if (!declaration.heritageClauses) {
14104
+ return undefined;
14105
+ }
14106
+ for (const clause of declaration.heritageClauses) {
14107
+ if (clause.token === ts.SyntaxKind.ExtendsKeyword) {
14108
+ // We are assuming a single class can only extend one class.
14109
+ const types = clause.types;
14110
+ if (types.length > 0) {
14111
+ const baseClass = types[0];
14112
+ return baseClass.getText();
14113
+ }
14114
+ }
14115
+ }
14116
+ return undefined;
14117
+ }
14118
+ }
14059
14119
  /** Extractor to pull info for API reference documentation for an Angular directive. */
14060
14120
  class DirectiveExtractor extends ClassExtractor {
14061
14121
  reference;
@@ -14159,11 +14219,6 @@ function extractClass(classDeclaration, metadataReader, typeChecker) {
14159
14219
  }
14160
14220
  return extractor.extract();
14161
14221
  }
14162
- /** Extracts documentation info for an interface. */
14163
- function extractInterface(declaration, typeChecker) {
14164
- const extractor = new ClassExtractor(declaration, typeChecker);
14165
- return extractor.extract();
14166
- }
14167
14222
  function extractPipeSyntax(metadata, classDeclaration) {
14168
14223
  const transformParams = classDeclaration.members.find((member) => {
14169
14224
  return (ts.isMethodDeclaration(member) &&
@@ -14255,6 +14310,46 @@ function extractLiteralPropertiesAsEnumMembers(declaration) {
14255
14310
  });
14256
14311
  }
14257
14312
 
14313
+ /** Extractor to pull info for API reference documentation for a TypeScript class or interface. */
14314
+ class InterfaceExtractor extends PropertiesExtractor {
14315
+ constructor(declaration, typeChecker) {
14316
+ super(declaration, typeChecker);
14317
+ }
14318
+ /** Extract docs info specific to classes. */
14319
+ extract() {
14320
+ return {
14321
+ name: this.declaration.name.text,
14322
+ entryType: EntryType.Interface,
14323
+ ...super.extract(),
14324
+ description: extractJsDocDescription(this.declaration),
14325
+ jsdocTags: extractJsDocTags(this.declaration),
14326
+ rawComment: extractRawJsDoc(this.declaration),
14327
+ extends: this.extractInheritance(this.declaration),
14328
+ implements: this.extractInterfaceConformance(this.declaration),
14329
+ };
14330
+ }
14331
+ extractInheritance(declaration) {
14332
+ if (!declaration.heritageClauses) {
14333
+ return [];
14334
+ }
14335
+ for (const clause of declaration.heritageClauses) {
14336
+ if (clause.token === ts.SyntaxKind.ExtendsKeyword) {
14337
+ // We are assuming a single class can only extend one class.
14338
+ const types = clause.types;
14339
+ if (types.length > 0) {
14340
+ return types.map((t) => t.getText());
14341
+ }
14342
+ }
14343
+ }
14344
+ return [];
14345
+ }
14346
+ }
14347
+ /** Extracts documentation info for an interface. */
14348
+ function extractInterface(declaration, typeChecker) {
14349
+ const extractor = new InterfaceExtractor(declaration, typeChecker);
14350
+ return extractor.extract();
14351
+ }
14352
+
14258
14353
  /** Extracts an API documentation entry for an Angular decorator. */
14259
14354
  function extractorDecorator(declaration, typeChecker) {
14260
14355
  const documentedNode = getDecoratorJsDocNode(declaration, typeChecker);
@@ -16710,6 +16805,8 @@ const KNOWN_CONTROL_FLOW_DIRECTIVES = new Set([
16710
16805
  'ngForTrackBy',
16711
16806
  'ngSwitchCase',
16712
16807
  'ngSwitchDefault',
16808
+ 'ngIfThen',
16809
+ 'ngIfElse',
16713
16810
  ]);
16714
16811
  /**
16715
16812
  * Ensures that there are no structural directives (something like *select or *featureFlag)
@@ -16737,9 +16834,12 @@ class MissingStructuralDirectiveCheck extends TemplateCheckWithVisitor {
16737
16834
  if (!customStructuralDirective)
16738
16835
  return [];
16739
16836
  const symbol = ctx.templateTypeChecker.getSymbolOfNode(node, component);
16740
- if (symbol?.directives.length) {
16837
+ // Check if there's a directive that matches the structural directive we're checking.
16838
+ // The structural directive *foo desugars to [foo], so we need to check if any
16839
+ // directive's selector would match the attribute [foo].
16840
+ const hasStructuralDirective = symbol?.directives.some((dir) => dir.selector?.includes(`[${customStructuralDirective.name}]`));
16841
+ if (hasStructuralDirective)
16741
16842
  return [];
16742
- }
16743
16843
  const sourceSpan = customStructuralDirective.keySpan || customStructuralDirective.sourceSpan;
16744
16844
  const errorMessage = `A structural directive \`${customStructuralDirective.name}\` was used in the template ` +
16745
16845
  `without a corresponding import in the component. ` +
@@ -20564,7 +20664,7 @@ var semver = /*@__PURE__*/getDefaultExportFromCjs(semverExports);
20564
20664
  * @param minVersion Minimum required version for the feature.
20565
20665
  */
20566
20666
  function coreVersionSupportsFeature(coreVersion, minVersion) {
20567
- // A version of `21.0.0-next.8` usually means that core is at head so it supports
20667
+ // A version of `21.0.0-next.9` usually means that core is at head so it supports
20568
20668
  // all features. Use string interpolation prevent the placeholder from being replaced
20569
20669
  // with the current version during build time.
20570
20670
  if (coreVersion === `0.0.0-${'PLACEHOLDER'}`) {
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
  /**
3
- * @license Angular v21.0.0-next.8
3
+ * @license Angular v21.0.0-next.9
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 schematics = require('@angular-devkit/schematics');
10
10
  var p = require('path');
11
- var compiler_host = require('./compiler_host-T6xncpiw.cjs');
11
+ var compiler_host = require('./compiler_host-emLDwK2U.cjs');
12
12
  var ts = require('typescript');
13
13
  var ng_decorators = require('./ng_decorators-BI0uV7KI.cjs');
14
14
  var imports = require('./imports-DwPXlGFl.cjs');
15
15
  var nodes = require('./nodes-B16H9JUd.cjs');
16
16
  var leading_space = require('./leading_space-D9nQ8UQC.cjs');
17
- var project_tsconfig_paths = require('./project_tsconfig_paths-CdhVNYMk.cjs');
17
+ var project_tsconfig_paths = require('./project_tsconfig_paths-CiBzGSIa.cjs');
18
18
  require('os');
19
19
  require('fs');
20
20
  require('module');
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
  /**
3
- * @license Angular v21.0.0-next.8
3
+ * @license Angular v21.0.0-next.9
4
4
  * (c) 2010-2025 Google LLC. https://angular.io/
5
5
  * License: MIT
6
6
  */
@@ -1,19 +1,19 @@
1
1
  'use strict';
2
2
  /**
3
- * @license Angular v21.0.0-next.8
3
+ * @license Angular v21.0.0-next.9
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-CdhVNYMk.cjs');
9
+ var project_tsconfig_paths = require('./project_tsconfig_paths-CiBzGSIa.cjs');
10
10
  var ts = require('typescript');
11
11
  require('os');
12
12
  var assert = require('assert');
13
- var index = require('./index-DWSaRJdz.cjs');
14
- var project_paths = require('./project_paths-C6g3lqjX.cjs');
13
+ var index = require('./index-CLxYZ09c.cjs');
14
+ var project_paths = require('./project_paths-C8H7KDJ3.cjs');
15
15
  var leading_space = require('./leading_space-D9nQ8UQC.cjs');
16
- require('./index-BnmACOsq.cjs');
16
+ require('./index-Dvqnp6JS.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 v21.0.0-next.8
3
+ * @license Angular v21.0.0-next.9
4
4
  * (c) 2010-2025 Google LLC. https://angular.io/
5
5
  * License: MIT
6
6
  */
@@ -10,7 +10,7 @@ var ts = require('typescript');
10
10
  var ng_decorators = require('./ng_decorators-BI0uV7KI.cjs');
11
11
  var property_name = require('./property_name-BBwFuqMe.cjs');
12
12
  require('os');
13
- var project_tsconfig_paths = require('./project_tsconfig_paths-CdhVNYMk.cjs');
13
+ var project_tsconfig_paths = require('./project_tsconfig_paths-CiBzGSIa.cjs');
14
14
 
15
15
  /**
16
16
  * Unwraps a given expression TypeScript node. Expressions can be wrapped within multiple
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
  /**
3
- * @license Angular v21.0.0-next.8
3
+ * @license Angular v21.0.0-next.9
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 v21.0.0-next.8
3
+ * @license Angular v21.0.0-next.9
4
4
  * (c) 2010-2025 Google LLC. https://angular.io/
5
5
  * License: MIT
6
6
  */
@@ -8,15 +8,15 @@
8
8
 
9
9
  var ts = require('typescript');
10
10
  require('os');
11
- var project_tsconfig_paths = require('./project_tsconfig_paths-CdhVNYMk.cjs');
12
- var index = require('./index-BnmACOsq.cjs');
11
+ var project_tsconfig_paths = require('./project_tsconfig_paths-CiBzGSIa.cjs');
12
+ var index = require('./index-Dvqnp6JS.cjs');
13
13
  require('path');
14
14
  require('node:path');
15
- var project_paths = require('./project_paths-C6g3lqjX.cjs');
16
- var apply_import_manager = require('./apply_import_manager-CBLmogDD.cjs');
15
+ var project_paths = require('./project_paths-C8H7KDJ3.cjs');
16
+ var apply_import_manager = require('./apply_import_manager-CoeTX_Ob.cjs');
17
17
  var imports = require('./imports-DwPXlGFl.cjs');
18
- var parse_html = require('./parse_html-C97tKKp3.cjs');
19
- var ng_component_template = require('./ng_component_template-BkWiUuGG.cjs');
18
+ var parse_html = require('./parse_html-CPWfkfhR.cjs');
19
+ var ng_component_template = require('./ng_component_template-BRbBIAUX.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 v21.0.0-next.8
3
+ * @license Angular v21.0.0-next.9
4
4
  * (c) 2010-2025 Google LLC. https://angular.io/
5
5
  * License: MIT
6
6
  */
@@ -8,15 +8,15 @@
8
8
 
9
9
  var ts = require('typescript');
10
10
  require('os');
11
- var project_tsconfig_paths = require('./project_tsconfig_paths-CdhVNYMk.cjs');
12
- require('./index-BnmACOsq.cjs');
11
+ var project_tsconfig_paths = require('./project_tsconfig_paths-CiBzGSIa.cjs');
12
+ require('./index-Dvqnp6JS.cjs');
13
13
  require('path');
14
14
  require('node:path');
15
- var project_paths = require('./project_paths-C6g3lqjX.cjs');
16
- var apply_import_manager = require('./apply_import_manager-CBLmogDD.cjs');
15
+ var project_paths = require('./project_paths-C8H7KDJ3.cjs');
16
+ var apply_import_manager = require('./apply_import_manager-CoeTX_Ob.cjs');
17
17
  var imports = require('./imports-DwPXlGFl.cjs');
18
- var parse_html = require('./parse_html-C97tKKp3.cjs');
19
- var ng_component_template = require('./ng_component_template-BkWiUuGG.cjs');
18
+ var parse_html = require('./parse_html-CPWfkfhR.cjs');
19
+ var ng_component_template = require('./ng_component_template-BRbBIAUX.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 v21.0.0-next.8
3
+ * @license Angular v21.0.0-next.9
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 v21.0.0-next.8
3
+ * @license Angular v21.0.0-next.9
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-CdhVNYMk.cjs');
12
- var index$1 = require('./index-BnmACOsq.cjs');
11
+ var project_tsconfig_paths = require('./project_tsconfig_paths-CiBzGSIa.cjs');
12
+ var index$1 = require('./index-Dvqnp6JS.cjs');
13
13
  require('path');
14
14
  require('node:path');
15
- var project_paths = require('./project_paths-C6g3lqjX.cjs');
16
- var apply_import_manager = require('./apply_import_manager-CBLmogDD.cjs');
17
- var index = require('./index-DWSaRJdz.cjs');
15
+ var project_paths = require('./project_paths-C8H7KDJ3.cjs');
16
+ var apply_import_manager = require('./apply_import_manager-CoeTX_Ob.cjs');
17
+ var index = require('./index-CLxYZ09c.cjs');
18
18
  require('@angular-devkit/core');
19
19
  require('node:path/posix');
20
20
  require('fs');
@@ -1,12 +1,12 @@
1
1
  'use strict';
2
2
  /**
3
- * @license Angular v21.0.0-next.8
3
+ * @license Angular v21.0.0-next.9
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-CdhVNYMk.cjs');
9
+ var project_tsconfig_paths = require('./project_tsconfig_paths-CiBzGSIa.cjs');
10
10
 
11
11
  /**
12
12
  * parses the template string into the Html AST
@@ -1,18 +1,18 @@
1
1
  'use strict';
2
2
  /**
3
- * @license Angular v21.0.0-next.8
3
+ * @license Angular v21.0.0-next.9
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-BnmACOsq.cjs');
9
+ var index = require('./index-Dvqnp6JS.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-CdhVNYMk.cjs');
15
+ var project_tsconfig_paths = require('./project_tsconfig_paths-CiBzGSIa.cjs');
16
16
  require('path');
17
17
  var path = require('node:path');
18
18