@angular/core 20.1.4 → 20.1.6

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 +1 -1
  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 +2 -2
  8. package/fesm2022/core.mjs.map +1 -1
  9. package/fesm2022/debug_node.mjs +14 -5
  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 +1 -1
  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 +3 -1
  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-BwG_XNz3.cjs → apply_import_manager-BeiseOfz.cjs} +4 -4
  41. package/schematics/bundles/cleanup-unused-imports.cjs +7 -8
  42. package/schematics/bundles/{compiler_host-BouiutKy.cjs → compiler_host-CIkS8EIQ.cjs} +3 -3
  43. package/schematics/bundles/control-flow-migration.cjs +18 -19
  44. package/schematics/bundles/document-core.cjs +6 -7
  45. package/schematics/bundles/imports-CIX-JgAN.cjs +1 -1
  46. package/schematics/bundles/{index-C7alPIzS.cjs → index-CuCkSYir.cjs} +1254 -1246
  47. package/schematics/bundles/{index-C4RI5-xz.cjs → index-Dek52tJB.cjs} +49 -49
  48. package/schematics/bundles/inject-flags.cjs +6 -7
  49. package/schematics/bundles/inject-migration.cjs +6 -7
  50. package/schematics/bundles/leading_space-D9nQ8UQC.cjs +1 -1
  51. package/schematics/bundles/{migrate_ts_type_references-BXdun0jT.cjs → migrate_ts_type_references-MVe5vYII.cjs} +14 -14
  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 +20 -21
  55. package/schematics/bundles/{project_paths-KZ5syi8v.cjs → project_paths-BKtwr3ir.cjs} +16 -17
  56. package/schematics/bundles/{checker-B1MkHERe.cjs → project_tsconfig_paths-DA1eve-D.cjs} +139 -24
  57. package/schematics/bundles/property_name-BBwFuqMe.cjs +1 -1
  58. package/schematics/bundles/route-lazy-loading.cjs +6 -7
  59. package/schematics/bundles/self-closing-tags-migration.cjs +10 -11
  60. package/schematics/bundles/signal-input-migration.cjs +21 -22
  61. package/schematics/bundles/signal-queries-migration.cjs +31 -32
  62. package/schematics/bundles/signals.cjs +8 -9
  63. package/schematics/bundles/standalone-migration.cjs +10 -11
  64. package/schematics/bundles/symbol-VPWguRxr.cjs +1 -1
  65. package/schematics/bundles/test-bed-get.cjs +4 -5
  66. package/signal.d.d.ts +1 -1
  67. package/testing/index.d.ts +1 -1
  68. package/weak_ref.d.d.ts +1 -1
  69. package/schematics/bundles/project_tsconfig_paths-CDVxT6Ov.cjs +0 -90
@@ -1,21 +1,20 @@
1
1
  'use strict';
2
2
  /**
3
- * @license Angular v20.1.4
3
+ * @license Angular v20.1.6
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-C7alPIzS.cjs');
9
+ var index = require('./index-CuCkSYir.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 checker = require('./checker-B1MkHERe.cjs');
15
+ var project_tsconfig_paths = require('./project_tsconfig_paths-DA1eve-D.cjs');
16
16
  require('path');
17
17
  var path = require('node:path');
18
- var project_tsconfig_paths = require('./project_tsconfig_paths-CDVxT6Ov.cjs');
19
18
 
20
19
  function _interopNamespaceDefault(e) {
21
20
  var n = Object.create(null);
@@ -59,7 +58,7 @@ class NgtscCompilerHost {
59
58
  return this.fs.getDefaultLibLocation();
60
59
  }
61
60
  writeFile(fileName, data, writeByteOrderMark, onError, sourceFiles) {
62
- const path = checker.absoluteFrom(fileName);
61
+ const path = project_tsconfig_paths.absoluteFrom(fileName);
63
62
  this.fs.ensureDir(this.fs.dirname(path));
64
63
  this.fs.writeFile(path, data);
65
64
  }
@@ -143,7 +142,7 @@ function createFileSystemTsReadDirectoryFn(fs) {
143
142
  };
144
143
  }
145
144
 
146
- function calcProjectFileAndBasePath(project, host = checker.getFileSystem()) {
145
+ function calcProjectFileAndBasePath(project, host = project_tsconfig_paths.getFileSystem()) {
147
146
  const absProject = host.resolve(project);
148
147
  const projectIsDir = host.lstat(absProject).isDirectory();
149
148
  const projectFile = projectIsDir ? host.join(absProject, 'tsconfig.json') : absProject;
@@ -151,9 +150,9 @@ function calcProjectFileAndBasePath(project, host = checker.getFileSystem()) {
151
150
  const basePath = host.resolve(projectDir);
152
151
  return { projectFile, basePath };
153
152
  }
154
- function readConfiguration(project, existingOptions, host = checker.getFileSystem()) {
153
+ function readConfiguration(project, existingOptions, host = project_tsconfig_paths.getFileSystem()) {
155
154
  try {
156
- const fs = checker.getFileSystem();
155
+ const fs = project_tsconfig_paths.getFileSystem();
157
156
  const readConfigFile = (configFile) => ts.readConfigFile(configFile, (file) => host.readFile(host.resolve(file)));
158
157
  const readAngularCompilerOptions = (configFile, parentOptions = {}) => {
159
158
  const { config, error } = readConfigFile(configFile);
@@ -226,7 +225,7 @@ function readConfiguration(project, existingOptions, host = checker.getFileSyste
226
225
  return { project: '', errors, rootNames: [], options: {}, emitFlags: index.EmitFlags.Default };
227
226
  }
228
227
  }
229
- function createParseConfigHost(host, fs = checker.getFileSystem()) {
228
+ function createParseConfigHost(host, fs = project_tsconfig_paths.getFileSystem()) {
230
229
  return {
231
230
  fileExists: host.exists.bind(host),
232
231
  readDirectory: createFileSystemTsReadDirectoryFn(fs),
@@ -256,7 +255,7 @@ function getExtendedConfigPathWorker(configFile, extendsValue, host, fs) {
256
255
  // Path isn't a rooted or relative path, resolve like a module.
257
256
  const { resolvedModule } = ts.nodeModuleNameResolver(extendsValue, configFile, { moduleResolution: ts.ModuleResolutionKind.Node10, resolveJsonModule: true }, parseConfigHost);
258
257
  if (resolvedModule) {
259
- return checker.absoluteFrom(resolvedModule.resolvedFileName);
258
+ return project_tsconfig_paths.absoluteFrom(resolvedModule.resolvedFileName);
260
259
  }
261
260
  }
262
261
  return null;
@@ -556,7 +555,7 @@ function createBaseProgramInfo(absoluteTsconfigPath, fs, optionOverrides = {}) {
556
555
  // Make sure the FS becomes globally available. Some code paths
557
556
  // of the Angular compiler, or tsconfig parsing aren't leveraging
558
557
  // the specified file system.
559
- checker.setFileSystem(fs);
558
+ project_tsconfig_paths.setFileSystem(fs);
560
559
  const tsconfig = parseTsconfigOrDie(absoluteTsconfigPath, fs);
561
560
  const tsHost = new NgtscCompilerHost(fs, tsconfig.options);
562
561
  // When enabled, use a plain TS program if we are sure it's not
@@ -585,14 +584,14 @@ function getProgramInfoFromBaseInfo(baseInfo) {
585
584
  const fullProgramSourceFiles = [...baseInfo.program.getSourceFiles()];
586
585
  const sourceFiles = fullProgramSourceFiles.filter((f) => !f.isDeclarationFile &&
587
586
  // Note `isShim` will work for the initial program, but for TCB programs, the shims are no longer annotated.
588
- !checker.isShim(f) &&
587
+ !project_tsconfig_paths.isShim(f) &&
589
588
  !f.fileName.endsWith('.ngtypecheck.ts'));
590
589
  // Sort it by length in reverse order (longest first). This speeds up lookups,
591
590
  // since there's no need to keep going through the array once a match is found.
592
- const sortedRootDirs = checker.getRootDirs(baseInfo.host, baseInfo.userOptions).sort((a, b) => b.length - a.length);
591
+ const sortedRootDirs = project_tsconfig_paths.getRootDirs(baseInfo.host, baseInfo.userOptions).sort((a, b) => b.length - a.length);
593
592
  // TODO: Consider also following TS's logic here, finding the common source root.
594
593
  // See: Program#getCommonSourceDirectory.
595
- const primaryRoot = checker.absoluteFrom(baseInfo.userOptions.rootDir ?? sortedRootDirs.at(-1) ?? baseInfo.program.getCurrentDirectory());
594
+ const primaryRoot = project_tsconfig_paths.absoluteFrom(baseInfo.userOptions.rootDir ?? sortedRootDirs.at(-1) ?? baseInfo.program.getCurrentDirectory());
596
595
  return {
597
596
  ...baseInfo,
598
597
  sourceFiles,
@@ -671,7 +670,7 @@ async function runMigrationInDevkit(config) {
671
670
  }
672
671
  const tsconfigPaths = [...buildPaths, ...testPaths];
673
672
  const fs = new DevkitMigrationFilesystem(config.tree);
674
- checker.setFileSystem(fs);
673
+ project_tsconfig_paths.setFileSystem(fs);
675
674
  const migration = config.getMigration(fs);
676
675
  const unitResults = [];
677
676
  const isFunnelMigration = migration instanceof TsurgeFunnelMigration;
@@ -781,7 +780,7 @@ function confirmAsSerializable(data) {
781
780
  * See {@link ProjectFile}.
782
781
  */
783
782
  function projectFile(file, { sortedRootDirs, projectRoot }) {
784
- const fs = checker.getFileSystem();
783
+ const fs = project_tsconfig_paths.getFileSystem();
785
784
  const filePath = fs.resolve(typeof file === 'string' ? file : file.fileName);
786
785
  // Sorted root directories are sorted longest to shortest. First match
787
786
  // is the appropriate root directory for ID computation.
@@ -808,7 +807,7 @@ function projectFile(file, { sortedRootDirs, projectRoot }) {
808
807
  * E.g. `a/b/c` is within `a/b` but not within `a/x`.
809
808
  */
810
809
  function isWithinBasePath(fs, base, path) {
811
- return checker.isLocalRelativePath(fs.relative(base, path));
810
+ return project_tsconfig_paths.isLocalRelativePath(fs.relative(base, path));
812
811
  }
813
812
 
814
813
  exports.Replacement = Replacement;
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
  /**
3
- * @license Angular v20.1.4
3
+ * @license Angular v20.1.6
4
4
  * (c) 2010-2025 Google LLC. https://angular.io/
5
5
  * License: MIT
6
6
  */
@@ -12,6 +12,7 @@ var fs$1 = require('fs');
12
12
  var module$1 = require('module');
13
13
  var p = require('path');
14
14
  var url = require('url');
15
+ var core = require('@angular-devkit/core');
15
16
 
16
17
  var _documentCurrentScript = typeof document !== 'undefined' ? document.currentScript : null;
17
18
  function _interopNamespaceDefault(e) {
@@ -30305,7 +30306,8 @@ class R3TargetBinder {
30305
30306
  // Bind the host element in a separate scope. Note that it only uses the
30306
30307
  // `TemplateBinder` since directives don't apply inside a host context.
30307
30308
  if (target.host) {
30308
- TemplateBinder.applyWithScope(target.host, Scope$1.apply(target.host), expressions, symbols, nestingLevel, usedPipes, eagerPipes, deferBlocks);
30309
+ directives.set(target.host.node, target.host.directives);
30310
+ TemplateBinder.applyWithScope(target.host.node, Scope$1.apply(target.host.node), expressions, symbols, nestingLevel, usedPipes, eagerPipes, deferBlocks);
30309
30311
  }
30310
30312
  return new R3BoundTarget(target, directives, eagerDirectives, missingDirectives, bindings, references, expressions, symbols, nestingLevel, scopedNodeEntities, usedPipes, eagerPipes, deferBlocks);
30311
30313
  }
@@ -31098,7 +31100,8 @@ class R3BoundTarget {
31098
31100
  }
31099
31101
  if (target instanceof Template ||
31100
31102
  target.node instanceof Component$1 ||
31101
- target.node instanceof Directive$1) {
31103
+ target.node instanceof Directive$1 ||
31104
+ target.node instanceof HostElement) {
31102
31105
  return null;
31103
31106
  }
31104
31107
  return this.referenceTargetToElement(target.node);
@@ -32292,7 +32295,7 @@ function isAttrNode(ast) {
32292
32295
  * @description
32293
32296
  * Entry point for all public APIs of the compiler package.
32294
32297
  */
32295
- new Version('20.1.4');
32298
+ new Version('20.1.6');
32296
32299
 
32297
32300
  //////////////////////////////////////
32298
32301
  // THIS FILE HAS GLOBAL SIDE EFFECT //
@@ -33312,7 +33315,7 @@ class NodeJSPathManipulation {
33312
33315
  // G3-ESM-MARKER: G3 uses CommonJS, but externally everything in ESM.
33313
33316
  // CommonJS/ESM interop for determining the current file name and containing dir.
33314
33317
  const isCommonJS = typeof __filename !== 'undefined';
33315
- const currentFileUrl = isCommonJS ? null : (typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('checker-B1MkHERe.cjs', document.baseURI).href));
33318
+ 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-DA1eve-D.cjs', document.baseURI).href));
33316
33319
  // Note, when this code loads in the browser, `url` may be an empty `{}` due to the Closure shims.
33317
33320
  const currentFileName = isCommonJS
33318
33321
  ? __filename
@@ -44609,7 +44612,7 @@ function generateTypeCheckBlock(env, ref, name, meta, domSchemaChecker, oobRecor
44609
44612
  }
44610
44613
  // Add the host bindings type checking code.
44611
44614
  if (tcb.boundTarget.target.host !== undefined) {
44612
- const hostScope = Scope.forNodes(tcb, null, tcb.boundTarget.target.host, null, null);
44615
+ const hostScope = Scope.forNodes(tcb, null, tcb.boundTarget.target.host.node, null, null);
44613
44616
  statements.push(renderBlockStatements(env, hostScope, createHostBindingsBlockGuard()));
44614
44617
  }
44615
44618
  const body = ts.factory.createBlock(statements);
@@ -44980,6 +44983,7 @@ class TcbDirectiveTypeOpBase extends TcbOp {
44980
44983
  const dirRef = this.dir.ref;
44981
44984
  const rawType = this.tcb.env.referenceType(this.dir.ref);
44982
44985
  let type;
44986
+ let span;
44983
44987
  if (this.dir.isGeneric === false || dirRef.node.typeParameters === undefined) {
44984
44988
  type = rawType;
44985
44989
  }
@@ -44990,9 +44994,15 @@ class TcbDirectiveTypeOpBase extends TcbOp {
44990
44994
  const typeArguments = dirRef.node.typeParameters.map(() => ts.factory.createKeywordTypeNode(ts.SyntaxKind.AnyKeyword));
44991
44995
  type = ts.factory.createTypeReferenceNode(rawType.typeName, typeArguments);
44992
44996
  }
44997
+ if (this.node instanceof HostElement) {
44998
+ span = this.node.sourceSpan;
44999
+ }
45000
+ else {
45001
+ span = this.node.startSourceSpan || this.node.sourceSpan;
45002
+ }
44993
45003
  const id = this.tcb.allocateId();
44994
45004
  addExpressionIdentifier(id, ExpressionIdentifier.DIRECTIVE);
44995
- addParseSpanInfo(id, this.node.startSourceSpan || this.node.sourceSpan);
45005
+ addParseSpanInfo(id, span);
44996
45006
  this.scope.addStatement(tsDeclareVariable(id, type));
44997
45007
  return id;
44998
45008
  }
@@ -45674,12 +45684,16 @@ class TcbDirectiveOutputsOp extends TcbOp {
45674
45684
  tcb;
45675
45685
  scope;
45676
45686
  node;
45687
+ inputs;
45688
+ outputs;
45677
45689
  dir;
45678
- constructor(tcb, scope, node, dir) {
45690
+ constructor(tcb, scope, node, inputs, outputs, dir) {
45679
45691
  super();
45680
45692
  this.tcb = tcb;
45681
45693
  this.scope = scope;
45682
45694
  this.node = node;
45695
+ this.inputs = inputs;
45696
+ this.outputs = outputs;
45683
45697
  this.dir = dir;
45684
45698
  }
45685
45699
  get optional() {
@@ -45688,14 +45702,16 @@ class TcbDirectiveOutputsOp extends TcbOp {
45688
45702
  execute() {
45689
45703
  let dirId = null;
45690
45704
  const outputs = this.dir.outputs;
45691
- for (const output of this.node.outputs) {
45705
+ for (const output of this.outputs) {
45692
45706
  if (output.type === exports.ParsedEventType.LegacyAnimation ||
45693
45707
  !outputs.hasBindingPropertyName(output.name)) {
45694
45708
  continue;
45695
45709
  }
45696
- if (this.tcb.env.config.checkTypeOfOutputEvents && output.name.endsWith('Change')) {
45710
+ if (this.tcb.env.config.checkTypeOfOutputEvents &&
45711
+ this.inputs !== null &&
45712
+ output.name.endsWith('Change')) {
45697
45713
  const inputName = output.name.slice(0, -6);
45698
- checkSplitTwoWayBinding(inputName, output, this.node.inputs, this.tcb);
45714
+ checkSplitTwoWayBinding(inputName, output, this.inputs, this.tcb);
45699
45715
  }
45700
45716
  // TODO(alxhub): consider supporting multiple fields with the same property name for outputs.
45701
45717
  const field = outputs.getByBindingPropertyName(output.name)[0].classPropertyName;
@@ -46470,7 +46486,8 @@ class Scope {
46470
46486
  else if ((ref instanceof Element$1 ||
46471
46487
  ref instanceof Template ||
46472
46488
  ref instanceof Component$1 ||
46473
- ref instanceof Directive$1) &&
46489
+ ref instanceof Directive$1 ||
46490
+ ref instanceof HostElement) &&
46474
46491
  directive !== undefined &&
46475
46492
  this.directiveOpMap.has(ref)) {
46476
46493
  // Resolving a directive on an element or sub-template.
@@ -46533,7 +46550,7 @@ class Scope {
46533
46550
  this.appendContentProjectionCheckOp(node);
46534
46551
  }
46535
46552
  this.appendDirectivesAndInputsOfElementLikeNode(node);
46536
- this.appendOutputsOfElementLikeNode(node);
46553
+ this.appendOutputsOfElementLikeNode(node, node.inputs, node.outputs);
46537
46554
  this.appendSelectorlessDirectives(node);
46538
46555
  this.appendChildren(node);
46539
46556
  this.checkAndAppendReferencesOfNode(node);
@@ -46541,7 +46558,7 @@ class Scope {
46541
46558
  else if (node instanceof Template) {
46542
46559
  // Template children are rendered in a child scope.
46543
46560
  this.appendDirectivesAndInputsOfElementLikeNode(node);
46544
- this.appendOutputsOfElementLikeNode(node);
46561
+ this.appendOutputsOfElementLikeNode(node, node.inputs, node.outputs);
46545
46562
  this.appendSelectorlessDirectives(node);
46546
46563
  const ctxIndex = this.opQueue.push(new TcbTemplateContextOp(this.tcb, this)) - 1;
46547
46564
  this.templateCtxOpMap.set(node, ctxIndex);
@@ -46588,9 +46605,7 @@ class Scope {
46588
46605
  }
46589
46606
  }
46590
46607
  else if (node instanceof HostElement) {
46591
- const opIndex = this.opQueue.push(new TcbHostElementOp(this.tcb, this, node)) - 1;
46592
- this.hostElementOpMap.set(node, opIndex);
46593
- this.opQueue.push(new TcbUnclaimedInputsOp(this.tcb, this, node.bindings, node, null), new TcbUnclaimedOutputsOp(this.tcb, this, node, node.listeners, null, null), new TcbDomSchemaCheckerOp(this.tcb, node, false, null));
46608
+ this.appendHostElement(node);
46594
46609
  }
46595
46610
  }
46596
46611
  appendChildren(node) {
@@ -46664,7 +46679,7 @@ class Scope {
46664
46679
  this.opQueue.push(new TcbDomSchemaCheckerOp(this.tcb, node, checkElement, claimedInputs));
46665
46680
  }
46666
46681
  }
46667
- appendOutputsOfElementLikeNode(node) {
46682
+ appendOutputsOfElementLikeNode(node, bindings, events) {
46668
46683
  // Collect all the outputs on the element.
46669
46684
  const claimedOutputs = new Set();
46670
46685
  // Don't resolve directives when selectorless is enabled and treat all the outputs on the
@@ -46675,24 +46690,24 @@ class Scope {
46675
46690
  // If there are no directives, then all outputs are unclaimed outputs, so queue an operation
46676
46691
  // to add them if needed.
46677
46692
  if (node instanceof Element$1) {
46678
- this.opQueue.push(new TcbUnclaimedOutputsOp(this.tcb, this, node, node.outputs, node.inputs, claimedOutputs));
46693
+ this.opQueue.push(new TcbUnclaimedOutputsOp(this.tcb, this, node, events, bindings, claimedOutputs));
46679
46694
  }
46680
46695
  return;
46681
46696
  }
46682
46697
  // Queue operations for all directives to check the relevant outputs for a directive.
46683
46698
  for (const dir of directives) {
46684
- this.opQueue.push(new TcbDirectiveOutputsOp(this.tcb, this, node, dir));
46699
+ this.opQueue.push(new TcbDirectiveOutputsOp(this.tcb, this, node, bindings, events, dir));
46685
46700
  }
46686
46701
  // After expanding the directives, we might need to queue an operation to check any unclaimed
46687
46702
  // outputs.
46688
- if (node instanceof Element$1) {
46703
+ if (node instanceof Element$1 || node instanceof HostElement) {
46689
46704
  // Go through the directives and register any outputs that it claims in `claimedOutputs`.
46690
46705
  for (const dir of directives) {
46691
46706
  for (const outputProperty of dir.outputs.propertyNames) {
46692
46707
  claimedOutputs.add(outputProperty);
46693
46708
  }
46694
46709
  }
46695
- this.opQueue.push(new TcbUnclaimedOutputsOp(this.tcb, this, node, node.outputs, node.inputs, claimedOutputs));
46710
+ this.opQueue.push(new TcbUnclaimedOutputsOp(this.tcb, this, node, events, bindings, claimedOutputs));
46696
46711
  }
46697
46712
  }
46698
46713
  appendInputsOfSelectorlessNode(node) {
@@ -46733,7 +46748,7 @@ class Scope {
46733
46748
  const claimedOutputs = new Set();
46734
46749
  if (directives !== null && directives.length > 0) {
46735
46750
  for (const dir of directives) {
46736
- this.opQueue.push(new TcbDirectiveOutputsOp(this.tcb, this, node, dir));
46751
+ this.opQueue.push(new TcbDirectiveOutputsOp(this.tcb, this, node, node.inputs, node.outputs, dir));
46737
46752
  for (const outputProperty of dir.outputs.propertyNames) {
46738
46753
  claimedOutputs.add(outputProperty);
46739
46754
  }
@@ -46907,6 +46922,21 @@ class Scope {
46907
46922
  this.validateReferenceBasedDeferredTrigger(block, triggers.viewport);
46908
46923
  }
46909
46924
  }
46925
+ appendHostElement(node) {
46926
+ const opIndex = this.opQueue.push(new TcbHostElementOp(this.tcb, this, node)) - 1;
46927
+ const directives = this.tcb.boundTarget.getDirectivesOfNode(node);
46928
+ if (directives !== null && directives.length > 0) {
46929
+ const directiveOpMap = new Map();
46930
+ for (const directive of directives) {
46931
+ const directiveOp = new TcbNonGenericDirectiveTypeOp(this.tcb, this, node, directive);
46932
+ directiveOpMap.set(directive, this.opQueue.push(directiveOp) - 1);
46933
+ }
46934
+ this.directiveOpMap.set(node, directiveOpMap);
46935
+ }
46936
+ this.hostElementOpMap.set(node, opIndex);
46937
+ this.opQueue.push(new TcbUnclaimedInputsOp(this.tcb, this, node.bindings, node, null), new TcbDomSchemaCheckerOp(this.tcb, node, false, null));
46938
+ this.appendOutputsOfElementLikeNode(node, null, node.listeners);
46939
+ }
46910
46940
  validateReferenceBasedDeferredTrigger(block, trigger) {
46911
46941
  if (trigger.reference === null) {
46912
46942
  if (block.placeholder === null) {
@@ -47533,7 +47563,12 @@ class TypeCheckContextImpl {
47533
47563
  }
47534
47564
  const boundTarget = binder.bind({
47535
47565
  template: templateContext?.nodes,
47536
- host: hostBindingContext?.node,
47566
+ host: hostBindingContext === null
47567
+ ? undefined
47568
+ : {
47569
+ node: hostBindingContext.node,
47570
+ directives: hostBindingContext.directives,
47571
+ },
47537
47572
  });
47538
47573
  if (this.inlining === InliningMode.InlineOps) {
47539
47574
  // Get all of the directives used in the template and record inline type constructors when
@@ -49832,6 +49867,85 @@ function getClassDeclFromSymbol(symbol, checker) {
49832
49867
  return null;
49833
49868
  }
49834
49869
 
49870
+ /**
49871
+ * Gets all tsconfig paths from a CLI project by reading the workspace configuration
49872
+ * and looking for common tsconfig locations.
49873
+ */
49874
+ async function getProjectTsConfigPaths(tree) {
49875
+ // Start with some tsconfig paths that are generally used within CLI projects. Note
49876
+ // that we are not interested in IDE-specific tsconfig files (e.g. /tsconfig.json)
49877
+ const buildPaths = new Set();
49878
+ const testPaths = new Set();
49879
+ const workspace = await getWorkspace(tree);
49880
+ for (const [, project] of workspace.projects) {
49881
+ for (const [name, target] of project.targets) {
49882
+ if (name !== 'build' && name !== 'test') {
49883
+ continue;
49884
+ }
49885
+ for (const [, options] of allTargetOptions(target)) {
49886
+ const tsConfig = options['tsConfig'];
49887
+ // Filter out tsconfig files that don't exist in the CLI project.
49888
+ if (typeof tsConfig !== 'string' || !tree.exists(tsConfig)) {
49889
+ continue;
49890
+ }
49891
+ if (name === 'build') {
49892
+ buildPaths.add(core.normalize(tsConfig));
49893
+ }
49894
+ else {
49895
+ testPaths.add(core.normalize(tsConfig));
49896
+ }
49897
+ }
49898
+ }
49899
+ }
49900
+ return {
49901
+ buildPaths: [...buildPaths],
49902
+ testPaths: [...testPaths],
49903
+ };
49904
+ }
49905
+ /** Get options for all configurations for the passed builder target. */
49906
+ function* allTargetOptions(target) {
49907
+ if (target.options) {
49908
+ yield [undefined, target.options];
49909
+ }
49910
+ if (!target.configurations) {
49911
+ return;
49912
+ }
49913
+ for (const [name, options] of Object.entries(target.configurations)) {
49914
+ if (options) {
49915
+ yield [name, options];
49916
+ }
49917
+ }
49918
+ }
49919
+ function createHost(tree) {
49920
+ return {
49921
+ async readFile(path) {
49922
+ const data = tree.read(path);
49923
+ if (!data) {
49924
+ throw new Error('File not found.');
49925
+ }
49926
+ return core.virtualFs.fileBufferToString(data);
49927
+ },
49928
+ async writeFile(path, data) {
49929
+ return tree.overwrite(path, data);
49930
+ },
49931
+ async isDirectory(path) {
49932
+ // Approximate a directory check.
49933
+ // We don't need to consider empty directories and hence this is a good enough approach.
49934
+ // This is also per documentation, see:
49935
+ // https://angular.dev/tools/cli/schematics-for-libraries#get-the-project-configuration
49936
+ return !tree.exists(path) && tree.getDir(path).subfiles.length > 0;
49937
+ },
49938
+ async isFile(path) {
49939
+ return tree.exists(path);
49940
+ },
49941
+ };
49942
+ }
49943
+ async function getWorkspace(tree) {
49944
+ const host = createHost(tree);
49945
+ const { workspace } = await core.workspaces.readWorkspace('/', host);
49946
+ return workspace;
49947
+ }
49948
+
49835
49949
  exports.AST = AST;
49836
49950
  exports.ASTWithSource = ASTWithSource;
49837
49951
  exports.AbsoluteModuleStrategy = AbsoluteModuleStrategy;
@@ -49998,6 +50112,7 @@ exports.getDefaultImportDeclaration = getDefaultImportDeclaration;
49998
50112
  exports.getDirectiveDiagnostics = getDirectiveDiagnostics;
49999
50113
  exports.getFileSystem = getFileSystem;
50000
50114
  exports.getOriginNodeForDiagnostics = getOriginNodeForDiagnostics;
50115
+ exports.getProjectTsConfigPaths = getProjectTsConfigPaths;
50001
50116
  exports.getProviderDiagnostics = getProviderDiagnostics;
50002
50117
  exports.getRootDirs = getRootDirs;
50003
50118
  exports.getSourceFile = getSourceFile;
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
  /**
3
- * @license Angular v20.1.4
3
+ * @license Angular v20.1.6
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.1.4
3
+ * @license Angular v20.1.6
4
4
  * (c) 2010-2025 Google LLC. https://angular.io/
5
5
  * License: MIT
6
6
  */
@@ -9,15 +9,14 @@
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-BouiutKy.cjs');
13
- var project_tsconfig_paths = require('./project_tsconfig_paths-CDVxT6Ov.cjs');
12
+ var compiler_host = require('./compiler_host-CIkS8EIQ.cjs');
13
+ var project_tsconfig_paths = require('./project_tsconfig_paths-DA1eve-D.cjs');
14
14
  var ts = require('typescript');
15
- var checker = require('./checker-B1MkHERe.cjs');
16
15
  var property_name = require('./property_name-BBwFuqMe.cjs');
17
16
  require('os');
18
- require('@angular-devkit/core');
19
17
  require('module');
20
18
  require('url');
19
+ require('@angular-devkit/core');
21
20
 
22
21
  /**
23
22
  * Finds the class declaration that is being referred to by a node.
@@ -48,7 +47,7 @@ function isStandaloneComponent(node, reflector) {
48
47
  if (decorators === null) {
49
48
  return false;
50
49
  }
51
- const decorator = checker.findAngularDecorator(decorators, 'Component', false);
50
+ const decorator = project_tsconfig_paths.findAngularDecorator(decorators, 'Component', false);
52
51
  if (decorator === undefined || decorator.args === null || decorator.args.length !== 1) {
53
52
  return false;
54
53
  }
@@ -154,7 +153,7 @@ function isProvideRoutesCallExpression(node, typeChecker) {
154
153
  */
155
154
  function migrateFileToLazyRoutes(sourceFile, program) {
156
155
  const typeChecker = program.getTypeChecker();
157
- const reflector = new checker.TypeScriptReflectionHost(typeChecker);
156
+ const reflector = new project_tsconfig_paths.TypeScriptReflectionHost(typeChecker);
158
157
  const printer = ts.createPrinter();
159
158
  const tracker = new compiler_host.ChangeTracker(printer);
160
159
  const routeArraysToMigrate = findRoutesArrayToMigrate(sourceFile, typeChecker);
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
  /**
3
- * @license Angular v20.1.4
3
+ * @license Angular v20.1.6
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 checker = require('./checker-B1MkHERe.cjs');
12
- require('./index-C7alPIzS.cjs');
11
+ var project_tsconfig_paths = require('./project_tsconfig_paths-DA1eve-D.cjs');
12
+ require('./index-CuCkSYir.cjs');
13
13
  require('path');
14
14
  require('node:path');
15
- var project_paths = require('./project_paths-KZ5syi8v.cjs');
15
+ var project_paths = require('./project_paths-BKtwr3ir.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');
@@ -21,7 +21,6 @@ require('fs');
21
21
  require('module');
22
22
  require('url');
23
23
  require('@angular-devkit/schematics');
24
- require('./project_tsconfig_paths-CDVxT6Ov.cjs');
25
24
  require('./imports-CIX-JgAN.cjs');
26
25
 
27
26
  /**
@@ -128,7 +127,7 @@ function findClosestLineStartPosition(linesMap, position, low = 0, high = linesM
128
127
  class NgComponentTemplateVisitor {
129
128
  typeChecker;
130
129
  resolvedTemplates = [];
131
- fs = checker.getFileSystem();
130
+ fs = project_tsconfig_paths.getFileSystem();
132
131
  constructor(typeChecker) {
133
132
  this.typeChecker = typeChecker;
134
133
  }
@@ -203,7 +202,7 @@ function parseTemplate(template) {
203
202
  // interpolated text as text nodes containing a mixture of interpolation tokens and text tokens,
204
203
  // rather than turning them into `BoundText` nodes like the Ivy AST does. This allows us to
205
204
  // easily get the text-only ranges without having to reconstruct the original text.
206
- parsed = new checker.HtmlParser().parse(template, '', {
205
+ parsed = new project_tsconfig_paths.HtmlParser().parse(template, '', {
207
206
  // Allows for ICUs to be parsed.
208
207
  tokenizeExpansionForms: true,
209
208
  // Explicitly disable blocks so that their characters are treated as plain text.
@@ -228,7 +227,7 @@ function migrateTemplateToSelfClosingTags(template) {
228
227
  return { migrated: template, changed: false, replacementCount: 0 };
229
228
  }
230
229
  const visitor = new AngularElementCollector();
231
- checker.visitAll$1(visitor, parsed.tree.rootNodes);
230
+ project_tsconfig_paths.visitAll$1(visitor, parsed.tree.rootNodes);
232
231
  let newTemplate = template;
233
232
  let changedOffset = 0;
234
233
  let replacementCount = 0;
@@ -256,8 +255,8 @@ function replaceWithSelfClosingTag(html, tagName) {
256
255
  function replaceTemplate(template, replaceValue, start, end, offset) {
257
256
  return template.slice(0, start + offset) + replaceValue + template.slice(end + offset);
258
257
  }
259
- const ALL_HTML_TAGS = new checker.DomElementSchemaRegistry().allKnownElementNames();
260
- class AngularElementCollector extends checker.RecursiveVisitor$1 {
258
+ const ALL_HTML_TAGS = new project_tsconfig_paths.DomElementSchemaRegistry().allKnownElementNames();
259
+ class AngularElementCollector extends project_tsconfig_paths.RecursiveVisitor$1 {
261
260
  elements = [];
262
261
  constructor() {
263
262
  super();
@@ -280,7 +279,7 @@ class AngularElementCollector extends checker.RecursiveVisitor$1 {
280
279
  }
281
280
  if (element.children.length === 1) {
282
281
  const child = element.children[0];
283
- return child instanceof checker.Text && /^\s*$/.test(child.value);
282
+ return child instanceof project_tsconfig_paths.Text && /^\s*$/.test(child.value);
284
283
  }
285
284
  return false;
286
285
  }