@angular/core 20.1.3 → 20.1.5

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 (60) hide show
  1. package/api.d.d.ts +2 -2
  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/core.mjs +3 -3
  7. package/fesm2022/core.mjs.map +1 -1
  8. package/fesm2022/debug_node.mjs +19 -6
  9. package/fesm2022/debug_node.mjs.map +1 -1
  10. package/fesm2022/not_found.mjs +1 -1
  11. package/fesm2022/primitives/di.mjs +1 -1
  12. package/fesm2022/primitives/event-dispatch.mjs +1 -1
  13. package/fesm2022/primitives/signals.mjs +1 -1
  14. package/fesm2022/resource.mjs +12 -3
  15. package/fesm2022/resource.mjs.map +1 -1
  16. package/fesm2022/root_effect_scheduler.mjs +1 -1
  17. package/fesm2022/root_effect_scheduler.mjs.map +1 -1
  18. package/fesm2022/rxjs-interop.mjs +1 -1
  19. package/fesm2022/signal.mjs +154 -118
  20. package/fesm2022/signal.mjs.map +1 -1
  21. package/fesm2022/testing.mjs +1 -1
  22. package/fesm2022/untracked.mjs +1 -1
  23. package/fesm2022/weak_ref.mjs +1 -1
  24. package/graph.d.d.ts +20 -33
  25. package/index.d.ts +11 -2
  26. package/package.json +2 -2
  27. package/primitives/di/index.d.ts +1 -1
  28. package/primitives/event-dispatch/index.d.ts +1 -1
  29. package/primitives/signals/index.d.ts +1 -1
  30. package/rxjs-interop/index.d.ts +1 -1
  31. package/schematics/bundles/{apply_import_manager-4lhgojXS.cjs → apply_import_manager-BeiseOfz.cjs} +4 -4
  32. package/schematics/bundles/cleanup-unused-imports.cjs +7 -8
  33. package/schematics/bundles/{compiler_host-D9M-RwqC.cjs → compiler_host-CIkS8EIQ.cjs} +3 -3
  34. package/schematics/bundles/control-flow-migration.cjs +18 -19
  35. package/schematics/bundles/document-core.cjs +6 -7
  36. package/schematics/bundles/imports-CIX-JgAN.cjs +1 -1
  37. package/schematics/bundles/{index-BIFHM-Gi.cjs → index-CuCkSYir.cjs} +1254 -1246
  38. package/schematics/bundles/{index-B1wVLvRR.cjs → index-Dek52tJB.cjs} +49 -49
  39. package/schematics/bundles/inject-flags.cjs +6 -7
  40. package/schematics/bundles/inject-migration.cjs +6 -7
  41. package/schematics/bundles/leading_space-D9nQ8UQC.cjs +1 -1
  42. package/schematics/bundles/{migrate_ts_type_references-DEjd_J_s.cjs → migrate_ts_type_references-MVe5vYII.cjs} +14 -14
  43. package/schematics/bundles/ng_decorators-B5HCqr20.cjs +1 -1
  44. package/schematics/bundles/nodes-B16H9JUd.cjs +1 -1
  45. package/schematics/bundles/output-migration.cjs +20 -21
  46. package/schematics/bundles/{project_paths-B-mniue6.cjs → project_paths-BKtwr3ir.cjs} +16 -17
  47. package/schematics/bundles/{checker-B0RMVBjs.cjs → project_tsconfig_paths-DA1eve-D.cjs} +166 -30
  48. package/schematics/bundles/property_name-BBwFuqMe.cjs +1 -1
  49. package/schematics/bundles/route-lazy-loading.cjs +6 -7
  50. package/schematics/bundles/self-closing-tags-migration.cjs +10 -11
  51. package/schematics/bundles/signal-input-migration.cjs +21 -22
  52. package/schematics/bundles/signal-queries-migration.cjs +31 -32
  53. package/schematics/bundles/signals.cjs +8 -9
  54. package/schematics/bundles/standalone-migration.cjs +10 -11
  55. package/schematics/bundles/symbol-VPWguRxr.cjs +1 -1
  56. package/schematics/bundles/test-bed-get.cjs +4 -5
  57. package/signal.d.d.ts +1 -1
  58. package/testing/index.d.ts +1 -1
  59. package/weak_ref.d.d.ts +1 -1
  60. 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.3
3
+ * @license Angular v20.1.5
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-BIFHM-Gi.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-B0RMVBjs.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.3
3
+ * @license Angular v20.1.5
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) {
@@ -18504,7 +18505,7 @@ class Parser {
18504
18505
  parseAction(input, parseSourceSpan, absoluteOffset, interpolationConfig = DEFAULT_INTERPOLATION_CONFIG) {
18505
18506
  const errors = [];
18506
18507
  this._checkNoInterpolation(errors, input, parseSourceSpan, interpolationConfig);
18507
- const sourceToLex = this._stripComments(input);
18508
+ const { stripped: sourceToLex } = this._stripComments(input);
18508
18509
  const tokens = this._lexer.tokenize(sourceToLex);
18509
18510
  const ast = new _ParseAST(input, parseSourceSpan, absoluteOffset, tokens, 1 /* ParseFlags.Action */, errors, 0, this._supportsDirectPipeReferences).parseChain();
18510
18511
  return new ASTWithSource(ast, input, getLocation(parseSourceSpan), absoluteOffset, errors);
@@ -18531,7 +18532,7 @@ class Parser {
18531
18532
  }
18532
18533
  _parseBindingAst(input, parseSourceSpan, absoluteOffset, interpolationConfig, errors) {
18533
18534
  this._checkNoInterpolation(errors, input, parseSourceSpan, interpolationConfig);
18534
- const sourceToLex = this._stripComments(input);
18535
+ const { stripped: sourceToLex } = this._stripComments(input);
18535
18536
  const tokens = this._lexer.tokenize(sourceToLex);
18536
18537
  return new _ParseAST(input, parseSourceSpan, absoluteOffset, tokens, 0 /* ParseFlags.None */, errors, 0, this._supportsDirectPipeReferences).parseChain();
18537
18538
  }
@@ -18582,8 +18583,13 @@ class Parser {
18582
18583
  // indexes inside the tokens.
18583
18584
  const expressionSpan = interpolatedTokens?.[i * 2 + 1]?.sourceSpan;
18584
18585
  const expressionText = expressions[i].text;
18585
- const sourceToLex = this._stripComments(expressionText);
18586
+ const { stripped: sourceToLex, hasComments } = this._stripComments(expressionText);
18586
18587
  const tokens = this._lexer.tokenize(sourceToLex);
18588
+ if (hasComments && sourceToLex.trim().length === 0 && tokens.length === 0) {
18589
+ // Empty expressions error are handled futher down, here we only take care of the comment case
18590
+ errors.push(getParseError('Interpolation expression cannot only contain a comment', input, `at column ${expressions[i].start} in`, parseSourceSpan));
18591
+ continue;
18592
+ }
18587
18593
  const ast = new _ParseAST(expressionSpan ? expressionText : input, expressionSpan || parseSourceSpan, absoluteOffset, tokens, 0 /* ParseFlags.None */, errors, offsets[i], this._supportsDirectPipeReferences).parseChain();
18588
18594
  expressionNodes.push(ast);
18589
18595
  }
@@ -18595,7 +18601,7 @@ class Parser {
18595
18601
  * This is used for parsing the switch expression in ICUs.
18596
18602
  */
18597
18603
  parseInterpolationExpression(expression, parseSourceSpan, absoluteOffset) {
18598
- const sourceToLex = this._stripComments(expression);
18604
+ const { stripped: sourceToLex } = this._stripComments(expression);
18599
18605
  const tokens = this._lexer.tokenize(sourceToLex);
18600
18606
  const errors = [];
18601
18607
  const ast = new _ParseAST(expression, parseSourceSpan, absoluteOffset, tokens, 0 /* ParseFlags.None */, errors, 0, this._supportsDirectPipeReferences).parseChain();
@@ -18683,7 +18689,9 @@ class Parser {
18683
18689
  }
18684
18690
  _stripComments(input) {
18685
18691
  const i = this._commentStart(input);
18686
- return i != null ? input.substring(0, i) : input;
18692
+ return i != null
18693
+ ? { stripped: input.substring(0, i), hasComments: true }
18694
+ : { stripped: input, hasComments: false };
18687
18695
  }
18688
18696
  _commentStart(input) {
18689
18697
  let outerQuote = null;
@@ -27707,11 +27715,25 @@ class BindingParser {
27707
27715
  return this._isAllowedAssignmentEvent(ast.args[0]);
27708
27716
  }
27709
27717
  if (ast instanceof PropertyRead || ast instanceof KeyedRead) {
27710
- return true;
27718
+ if (!hasRecursiveSafeReceiver(ast)) {
27719
+ return true;
27720
+ }
27711
27721
  }
27712
27722
  return false;
27713
27723
  }
27714
27724
  }
27725
+ function hasRecursiveSafeReceiver(ast) {
27726
+ if (ast instanceof SafePropertyRead || ast instanceof SafeKeyedRead) {
27727
+ return true;
27728
+ }
27729
+ if (ast instanceof ParenthesizedExpression) {
27730
+ return hasRecursiveSafeReceiver(ast.expression);
27731
+ }
27732
+ if (ast instanceof PropertyRead || ast instanceof KeyedRead || ast instanceof Call) {
27733
+ return hasRecursiveSafeReceiver(ast.receiver);
27734
+ }
27735
+ return false;
27736
+ }
27715
27737
  function isLegacyAnimationLabel(name) {
27716
27738
  return name[0] == '@';
27717
27739
  }
@@ -30284,7 +30306,8 @@ class R3TargetBinder {
30284
30306
  // Bind the host element in a separate scope. Note that it only uses the
30285
30307
  // `TemplateBinder` since directives don't apply inside a host context.
30286
30308
  if (target.host) {
30287
- 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);
30288
30311
  }
30289
30312
  return new R3BoundTarget(target, directives, eagerDirectives, missingDirectives, bindings, references, expressions, symbols, nestingLevel, scopedNodeEntities, usedPipes, eagerPipes, deferBlocks);
30290
30313
  }
@@ -31077,7 +31100,8 @@ class R3BoundTarget {
31077
31100
  }
31078
31101
  if (target instanceof Template ||
31079
31102
  target.node instanceof Component$1 ||
31080
- target.node instanceof Directive$1) {
31103
+ target.node instanceof Directive$1 ||
31104
+ target.node instanceof HostElement) {
31081
31105
  return null;
31082
31106
  }
31083
31107
  return this.referenceTargetToElement(target.node);
@@ -32271,7 +32295,7 @@ function isAttrNode(ast) {
32271
32295
  * @description
32272
32296
  * Entry point for all public APIs of the compiler package.
32273
32297
  */
32274
- new Version('20.1.3');
32298
+ new Version('20.1.5');
32275
32299
 
32276
32300
  //////////////////////////////////////
32277
32301
  // THIS FILE HAS GLOBAL SIDE EFFECT //
@@ -33291,7 +33315,7 @@ class NodeJSPathManipulation {
33291
33315
  // G3-ESM-MARKER: G3 uses CommonJS, but externally everything in ESM.
33292
33316
  // CommonJS/ESM interop for determining the current file name and containing dir.
33293
33317
  const isCommonJS = typeof __filename !== 'undefined';
33294
- const currentFileUrl = isCommonJS ? null : (typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('checker-B0RMVBjs.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));
33295
33319
  // Note, when this code loads in the browser, `url` may be an empty `{}` due to the Closure shims.
33296
33320
  const currentFileName = isCommonJS
33297
33321
  ? __filename
@@ -44588,7 +44612,7 @@ function generateTypeCheckBlock(env, ref, name, meta, domSchemaChecker, oobRecor
44588
44612
  }
44589
44613
  // Add the host bindings type checking code.
44590
44614
  if (tcb.boundTarget.target.host !== undefined) {
44591
- 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);
44592
44616
  statements.push(renderBlockStatements(env, hostScope, createHostBindingsBlockGuard()));
44593
44617
  }
44594
44618
  const body = ts.factory.createBlock(statements);
@@ -44959,6 +44983,7 @@ class TcbDirectiveTypeOpBase extends TcbOp {
44959
44983
  const dirRef = this.dir.ref;
44960
44984
  const rawType = this.tcb.env.referenceType(this.dir.ref);
44961
44985
  let type;
44986
+ let span;
44962
44987
  if (this.dir.isGeneric === false || dirRef.node.typeParameters === undefined) {
44963
44988
  type = rawType;
44964
44989
  }
@@ -44969,9 +44994,15 @@ class TcbDirectiveTypeOpBase extends TcbOp {
44969
44994
  const typeArguments = dirRef.node.typeParameters.map(() => ts.factory.createKeywordTypeNode(ts.SyntaxKind.AnyKeyword));
44970
44995
  type = ts.factory.createTypeReferenceNode(rawType.typeName, typeArguments);
44971
44996
  }
44997
+ if (this.node instanceof HostElement) {
44998
+ span = this.node.sourceSpan;
44999
+ }
45000
+ else {
45001
+ span = this.node.startSourceSpan || this.node.sourceSpan;
45002
+ }
44972
45003
  const id = this.tcb.allocateId();
44973
45004
  addExpressionIdentifier(id, ExpressionIdentifier.DIRECTIVE);
44974
- addParseSpanInfo(id, this.node.startSourceSpan || this.node.sourceSpan);
45005
+ addParseSpanInfo(id, span);
44975
45006
  this.scope.addStatement(tsDeclareVariable(id, type));
44976
45007
  return id;
44977
45008
  }
@@ -45653,12 +45684,16 @@ class TcbDirectiveOutputsOp extends TcbOp {
45653
45684
  tcb;
45654
45685
  scope;
45655
45686
  node;
45687
+ inputs;
45688
+ outputs;
45656
45689
  dir;
45657
- constructor(tcb, scope, node, dir) {
45690
+ constructor(tcb, scope, node, inputs, outputs, dir) {
45658
45691
  super();
45659
45692
  this.tcb = tcb;
45660
45693
  this.scope = scope;
45661
45694
  this.node = node;
45695
+ this.inputs = inputs;
45696
+ this.outputs = outputs;
45662
45697
  this.dir = dir;
45663
45698
  }
45664
45699
  get optional() {
@@ -45667,14 +45702,16 @@ class TcbDirectiveOutputsOp extends TcbOp {
45667
45702
  execute() {
45668
45703
  let dirId = null;
45669
45704
  const outputs = this.dir.outputs;
45670
- for (const output of this.node.outputs) {
45705
+ for (const output of this.outputs) {
45671
45706
  if (output.type === exports.ParsedEventType.LegacyAnimation ||
45672
45707
  !outputs.hasBindingPropertyName(output.name)) {
45673
45708
  continue;
45674
45709
  }
45675
- 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')) {
45676
45713
  const inputName = output.name.slice(0, -6);
45677
- checkSplitTwoWayBinding(inputName, output, this.node.inputs, this.tcb);
45714
+ checkSplitTwoWayBinding(inputName, output, this.inputs, this.tcb);
45678
45715
  }
45679
45716
  // TODO(alxhub): consider supporting multiple fields with the same property name for outputs.
45680
45717
  const field = outputs.getByBindingPropertyName(output.name)[0].classPropertyName;
@@ -46449,7 +46486,8 @@ class Scope {
46449
46486
  else if ((ref instanceof Element$1 ||
46450
46487
  ref instanceof Template ||
46451
46488
  ref instanceof Component$1 ||
46452
- ref instanceof Directive$1) &&
46489
+ ref instanceof Directive$1 ||
46490
+ ref instanceof HostElement) &&
46453
46491
  directive !== undefined &&
46454
46492
  this.directiveOpMap.has(ref)) {
46455
46493
  // Resolving a directive on an element or sub-template.
@@ -46512,7 +46550,7 @@ class Scope {
46512
46550
  this.appendContentProjectionCheckOp(node);
46513
46551
  }
46514
46552
  this.appendDirectivesAndInputsOfElementLikeNode(node);
46515
- this.appendOutputsOfElementLikeNode(node);
46553
+ this.appendOutputsOfElementLikeNode(node, node.inputs, node.outputs);
46516
46554
  this.appendSelectorlessDirectives(node);
46517
46555
  this.appendChildren(node);
46518
46556
  this.checkAndAppendReferencesOfNode(node);
@@ -46520,7 +46558,7 @@ class Scope {
46520
46558
  else if (node instanceof Template) {
46521
46559
  // Template children are rendered in a child scope.
46522
46560
  this.appendDirectivesAndInputsOfElementLikeNode(node);
46523
- this.appendOutputsOfElementLikeNode(node);
46561
+ this.appendOutputsOfElementLikeNode(node, node.inputs, node.outputs);
46524
46562
  this.appendSelectorlessDirectives(node);
46525
46563
  const ctxIndex = this.opQueue.push(new TcbTemplateContextOp(this.tcb, this)) - 1;
46526
46564
  this.templateCtxOpMap.set(node, ctxIndex);
@@ -46567,9 +46605,7 @@ class Scope {
46567
46605
  }
46568
46606
  }
46569
46607
  else if (node instanceof HostElement) {
46570
- const opIndex = this.opQueue.push(new TcbHostElementOp(this.tcb, this, node)) - 1;
46571
- this.hostElementOpMap.set(node, opIndex);
46572
- 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);
46573
46609
  }
46574
46610
  }
46575
46611
  appendChildren(node) {
@@ -46643,7 +46679,7 @@ class Scope {
46643
46679
  this.opQueue.push(new TcbDomSchemaCheckerOp(this.tcb, node, checkElement, claimedInputs));
46644
46680
  }
46645
46681
  }
46646
- appendOutputsOfElementLikeNode(node) {
46682
+ appendOutputsOfElementLikeNode(node, bindings, events) {
46647
46683
  // Collect all the outputs on the element.
46648
46684
  const claimedOutputs = new Set();
46649
46685
  // Don't resolve directives when selectorless is enabled and treat all the outputs on the
@@ -46654,24 +46690,24 @@ class Scope {
46654
46690
  // If there are no directives, then all outputs are unclaimed outputs, so queue an operation
46655
46691
  // to add them if needed.
46656
46692
  if (node instanceof Element$1) {
46657
- 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));
46658
46694
  }
46659
46695
  return;
46660
46696
  }
46661
46697
  // Queue operations for all directives to check the relevant outputs for a directive.
46662
46698
  for (const dir of directives) {
46663
- this.opQueue.push(new TcbDirectiveOutputsOp(this.tcb, this, node, dir));
46699
+ this.opQueue.push(new TcbDirectiveOutputsOp(this.tcb, this, node, bindings, events, dir));
46664
46700
  }
46665
46701
  // After expanding the directives, we might need to queue an operation to check any unclaimed
46666
46702
  // outputs.
46667
- if (node instanceof Element$1) {
46703
+ if (node instanceof Element$1 || node instanceof HostElement) {
46668
46704
  // Go through the directives and register any outputs that it claims in `claimedOutputs`.
46669
46705
  for (const dir of directives) {
46670
46706
  for (const outputProperty of dir.outputs.propertyNames) {
46671
46707
  claimedOutputs.add(outputProperty);
46672
46708
  }
46673
46709
  }
46674
- 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));
46675
46711
  }
46676
46712
  }
46677
46713
  appendInputsOfSelectorlessNode(node) {
@@ -46712,7 +46748,7 @@ class Scope {
46712
46748
  const claimedOutputs = new Set();
46713
46749
  if (directives !== null && directives.length > 0) {
46714
46750
  for (const dir of directives) {
46715
- 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));
46716
46752
  for (const outputProperty of dir.outputs.propertyNames) {
46717
46753
  claimedOutputs.add(outputProperty);
46718
46754
  }
@@ -46886,6 +46922,21 @@ class Scope {
46886
46922
  this.validateReferenceBasedDeferredTrigger(block, triggers.viewport);
46887
46923
  }
46888
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
+ }
46889
46940
  validateReferenceBasedDeferredTrigger(block, trigger) {
46890
46941
  if (trigger.reference === null) {
46891
46942
  if (block.placeholder === null) {
@@ -47512,7 +47563,12 @@ class TypeCheckContextImpl {
47512
47563
  }
47513
47564
  const boundTarget = binder.bind({
47514
47565
  template: templateContext?.nodes,
47515
- host: hostBindingContext?.node,
47566
+ host: hostBindingContext === null
47567
+ ? undefined
47568
+ : {
47569
+ node: hostBindingContext.node,
47570
+ directives: hostBindingContext.directives,
47571
+ },
47516
47572
  });
47517
47573
  if (this.inlining === InliningMode.InlineOps) {
47518
47574
  // Get all of the directives used in the template and record inline type constructors when
@@ -49811,6 +49867,85 @@ function getClassDeclFromSymbol(symbol, checker) {
49811
49867
  return null;
49812
49868
  }
49813
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
+
49814
49949
  exports.AST = AST;
49815
49950
  exports.ASTWithSource = ASTWithSource;
49816
49951
  exports.AbsoluteModuleStrategy = AbsoluteModuleStrategy;
@@ -49977,6 +50112,7 @@ exports.getDefaultImportDeclaration = getDefaultImportDeclaration;
49977
50112
  exports.getDirectiveDiagnostics = getDirectiveDiagnostics;
49978
50113
  exports.getFileSystem = getFileSystem;
49979
50114
  exports.getOriginNodeForDiagnostics = getOriginNodeForDiagnostics;
50115
+ exports.getProjectTsConfigPaths = getProjectTsConfigPaths;
49980
50116
  exports.getProviderDiagnostics = getProviderDiagnostics;
49981
50117
  exports.getRootDirs = getRootDirs;
49982
50118
  exports.getSourceFile = getSourceFile;
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
  /**
3
- * @license Angular v20.1.3
3
+ * @license Angular v20.1.5
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.3
3
+ * @license Angular v20.1.5
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-D9M-RwqC.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-B0RMVBjs.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.3
3
+ * @license Angular v20.1.5
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-B0RMVBjs.cjs');
12
- require('./index-BIFHM-Gi.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-B-mniue6.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
  }