Big News: Socket raises $60M Series C at a $1B valuation to secure software supply chains for AI-driven development.Announcement
Sign In

@angular/core

Package Overview
Dependencies
Maintainers
2
Versions
1068
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@angular/core - npm Package Compare versions

Comparing version
22.0.1
to
22.1.0-next.0
+318
schematics/bundles/change_tracker-BzE4pgz5.cjs
'use strict';
/**
* @license Angular v22.1.0-next.0
* (c) 2010-2026 Google LLC. https://angular.dev/
* License: MIT
*/
'use strict';
var path = require('path');
var ts = require('typescript');
var migrations = require('@angular/compiler-cli/private/migrations');
function _interopNamespaceDefault(e) {
var n = Object.create(null);
if (e) {
Object.keys(e).forEach(function (k) {
if (k !== 'default') {
var d = Object.getOwnPropertyDescriptor(e, k);
Object.defineProperty(n, k, d.get ? d : {
enumerable: true,
get: function () { return e[k]; }
});
}
});
}
n.default = e;
return Object.freeze(n);
}
var path__namespace = /*#__PURE__*/_interopNamespaceDefault(path);
function parseTsconfigFile(tsconfigPath, basePath) {
const { config } = ts.readConfigFile(tsconfigPath, ts.sys.readFile);
const parseConfigHost = {
useCaseSensitiveFileNames: ts.sys.useCaseSensitiveFileNames,
fileExists: ts.sys.fileExists,
readDirectory: ts.sys.readDirectory,
readFile: ts.sys.readFile,
};
// Throw if incorrect arguments are passed to this function. Passing relative base paths
// results in root directories not being resolved and in later type checking runtime errors.
// More details can be found here: https://github.com/microsoft/TypeScript/issues/37731.
if (!path__namespace.isAbsolute(basePath)) {
throw Error('Unexpected relative base path has been specified.');
}
return ts.parseJsonConfigFileContent(config, parseConfigHost, basePath, {});
}
/**
* Creates a TypeScript program instance for a TypeScript project within
* the virtual file system tree.
* @param tree Virtual file system tree that contains the source files.
* @param tsconfigPath Virtual file system path that resolves to the TypeScript project.
* @param basePath Base path for the virtual file system tree.
* @param fakeFileRead Optional file reader function. Can be used to overwrite files in
* the TypeScript program, or to add in-memory files (e.g. to add global types).
* @param additionalFiles Additional file paths that should be added to the program.
*/
function createMigrationProgram(tree, tsconfigPath, basePath, fakeFileRead, additionalFiles) {
const { rootNames, options, host } = createProgramOptions(tree, tsconfigPath, basePath, fakeFileRead);
return ts.createProgram(rootNames, options, host);
}
/**
* Creates the options necessary to instantiate a TypeScript program.
* @param tree Virtual file system tree that contains the source files.
* @param tsconfigPath Virtual file system path that resolves to the TypeScript project.
* @param basePath Base path for the virtual file system tree.
* @param fakeFileRead Optional file reader function. Can be used to overwrite files in
* the TypeScript program, or to add in-memory files (e.g. to add global types).
* @param additionalFiles Additional file paths that should be added to the program.
* @param optionOverrides Overrides of the parsed compiler options.
*/
function createProgramOptions(tree, tsconfigPath, basePath, fakeFileRead, additionalFiles, optionOverrides) {
// Resolve the tsconfig path to an absolute path. This is needed as TypeScript otherwise
// is not able to resolve root directories in the given tsconfig. More details can be found
// in the following issue: https://github.com/microsoft/TypeScript/issues/37731.
tsconfigPath = path.resolve(basePath, tsconfigPath);
const parsed = parseTsconfigFile(tsconfigPath, path.dirname(tsconfigPath));
const options = optionOverrides ? { ...parsed.options, ...optionOverrides } : parsed.options;
const host = createMigrationCompilerHost(tree, options, basePath, fakeFileRead);
return { rootNames: parsed.fileNames.concat([]), options, host };
}
function createMigrationCompilerHost(tree, options, basePath, fakeRead) {
const host = ts.createCompilerHost(options, true);
const defaultReadFile = host.readFile;
// We need to overwrite the host "readFile" method, as we want the TypeScript
// program to be based on the file contents in the virtual file tree. Otherwise
// if we run multiple migrations we might have intersecting changes and
// source files.
host.readFile = (fileName) => {
const treeRelativePath = path.relative(basePath, fileName);
let result = fakeRead?.(treeRelativePath);
if (typeof result !== 'string') {
// If the relative path resolved to somewhere outside of the tree, fall back to
// TypeScript's default file reading function since the `tree` will throw an error.
result = treeRelativePath.startsWith('..')
? defaultReadFile.call(host, fileName)
: tree.read(treeRelativePath)?.toString();
}
// Strip BOM as otherwise TSC methods (Ex: getWidth) will return an offset,
// which breaks the CLI UpdateRecorder.
// See: https://github.com/angular/angular/pull/30719
return typeof result === 'string' ? result.replace(/^\uFEFF/, '') : undefined;
};
return host;
}
/**
* Checks whether a file can be migrate by our automated migrations.
* @param basePath Absolute path to the project.
* @param sourceFile File being checked.
* @param program Program that includes the source file.
*/
function canMigrateFile(basePath, sourceFile, program) {
// We shouldn't migrate .d.ts files, files from an external library or type checking files.
if (sourceFile.fileName.endsWith('.ngtypecheck.ts') ||
sourceFile.isDeclarationFile ||
program.isSourceFileFromExternalLibrary(sourceFile)) {
return false;
}
// Our migrations are set up to create a `Program` from the project's tsconfig and to migrate all
// the files within the program. This can include files that are outside of the Angular CLI
// project. We can't migrate files outside of the project, because our file system interactions
// go through the CLI's `Tree` which assumes that all files are within the project. See:
// https://github.com/angular/angular-cli/blob/0b0961c9c233a825b6e4bb59ab7f0790f9b14676/packages/angular_devkit/schematics/src/tree/host-tree.ts#L131
return !path.relative(basePath, sourceFile.fileName).startsWith('..');
}
/** Tracks changes that have to be made for specific files. */
class ChangeTracker {
_printer;
_importRemapper;
_changes = new Map();
_importManager;
_quotesCache = new WeakMap();
constructor(_printer, _importRemapper) {
this._printer = _printer;
this._importRemapper = _importRemapper;
this._importManager = new migrations.ImportManager({
shouldUseSingleQuotes: (file) => this._getQuoteKind(file) === 0 /* QuoteKind.SINGLE */,
});
}
/**
* Tracks the insertion of some text.
* @param sourceFile File in which the text is being inserted.
* @param start Index at which the text is insert.
* @param text Text to be inserted.
*/
insertText(sourceFile, index, text) {
this._trackChange(sourceFile, { start: index, text });
}
/**
* Replaces text within a file.
* @param sourceFile File in which to replace the text.
* @param start Index from which to replace the text.
* @param removeLength Length of the text being replaced.
* @param text Text to be inserted instead of the old one.
*/
replaceText(sourceFile, start, removeLength, text) {
this._trackChange(sourceFile, { start, removeLength, text });
}
/**
* Replaces the text of an AST node with a new one.
* @param oldNode Node to be replaced.
* @param newNode New node to be inserted.
* @param emitHint Hint when formatting the text of the new node.
* @param sourceFileWhenPrinting File to use when printing out the new node. This is important
* when copying nodes from one file to another, because TypeScript might not output literal nodes
* without it.
*/
replaceNode(oldNode, newNode, emitHint = ts.EmitHint.Unspecified, sourceFileWhenPrinting) {
const sourceFile = oldNode.getSourceFile();
this.replaceText(sourceFile, oldNode.getStart(), oldNode.getWidth(), this._printer.printNode(emitHint, newNode, sourceFileWhenPrinting || sourceFile));
}
/**
* Removes the text of an AST node from a file.
* @param node Node whose text should be removed.
* @param useFullOffsets Whether to remove the node using its full offset (e.g. `getFullStart`
* rather than `fullStart`). This has the advantage of removing any comments that may be tied
* to the node, but can lead to too much code being deleted.
*/
removeNode(node, useFullOffsets = false) {
this._trackChange(node.getSourceFile(), {
start: useFullOffsets ? node.getFullStart() : node.getStart(),
removeLength: useFullOffsets ? node.getFullWidth() : node.getWidth(),
text: '',
});
}
/**
* Adds an import to a file.
* @param sourceFile File to which to add the import.
* @param symbolName Symbol being imported.
* @param moduleName Module from which the symbol is imported.
* @param alias Alias to use for the import.
*/
addImport(sourceFile, symbolName, moduleName, alias) {
if (this._importRemapper) {
moduleName = this._importRemapper(moduleName, sourceFile.fileName);
}
// It's common for paths to be manipulated with Node's `path` utilties which
// can yield a path with back slashes. Normalize them since outputting such
// paths will also cause TS to escape the forward slashes.
moduleName = normalizePath(moduleName);
if (!this._changes.has(sourceFile)) {
this._changes.set(sourceFile, []);
}
return this._importManager.addImport({
requestedFile: sourceFile,
exportSymbolName: symbolName,
exportModuleSpecifier: moduleName,
unsafeAliasOverride: alias,
});
}
/**
* Removes an import from a file.
* @param sourceFile File from which to remove the import.
* @param symbolName Original name of the symbol to be removed. Used even if the import is aliased.
* @param moduleName Module from which the symbol is imported.
*/
removeImport(sourceFile, symbolName, moduleName) {
// It's common for paths to be manipulated with Node's `path` utilties which
// can yield a path with back slashes. Normalize them since outputting such
// paths will also cause TS to escape the forward slashes.
moduleName = normalizePath(moduleName);
if (!this._changes.has(sourceFile)) {
this._changes.set(sourceFile, []);
}
this._importManager.removeImport(sourceFile, symbolName, moduleName);
}
/**
* Gets the changes that should be applied to all the files in the migration.
* The changes are sorted in the order in which they should be applied.
*/
recordChanges() {
this._recordImports();
return this._changes;
}
/**
* Clear the tracked changes
*/
clearChanges() {
this._changes.clear();
}
/**
* Adds a change to a `ChangesByFile` map.
* @param file File that the change is associated with.
* @param change Change to be added.
*/
_trackChange(file, change) {
const changes = this._changes.get(file);
if (changes) {
// Insert the changes in reverse so that they're applied in reverse order.
// This ensures that the offsets of subsequent changes aren't affected by
// previous changes changing the file's text.
const insertIndex = changes.findIndex((current) => current.start <= change.start);
if (insertIndex === -1) {
changes.push(change);
}
else {
changes.splice(insertIndex, 0, change);
}
}
else {
this._changes.set(file, [change]);
}
}
/** Determines what kind of quotes to use for a specific file. */
_getQuoteKind(sourceFile) {
if (this._quotesCache.has(sourceFile)) {
return this._quotesCache.get(sourceFile);
}
let kind = 0 /* QuoteKind.SINGLE */;
for (const statement of sourceFile.statements) {
if (ts.isImportDeclaration(statement) && ts.isStringLiteral(statement.moduleSpecifier)) {
kind = statement.moduleSpecifier.getText()[0] === '"' ? 1 /* QuoteKind.DOUBLE */ : 0 /* QuoteKind.SINGLE */;
this._quotesCache.set(sourceFile, kind);
break;
}
}
return kind;
}
/** Records the pending import changes from the import manager. */
_recordImports() {
const { newImports, updatedImports, deletedImports } = this._importManager.finalize();
for (const [original, replacement] of updatedImports) {
this.replaceNode(original, replacement);
}
for (const node of deletedImports) {
this.removeNode(node);
}
for (const [sourceFile] of this._changes) {
const importsToAdd = newImports.get(sourceFile.fileName);
if (!importsToAdd) {
continue;
}
const importLines = [];
let lastImport = null;
for (const statement of sourceFile.statements) {
if (ts.isImportDeclaration(statement)) {
lastImport = statement;
}
}
for (const decl of importsToAdd) {
importLines.push(this._printer.printNode(ts.EmitHint.Unspecified, decl, sourceFile));
}
this.insertText(sourceFile, lastImport ? lastImport.getEnd() : 0, (lastImport ? '\n' : '') + importLines.join('\n'));
}
}
}
/** Normalizes a path to use posix separators. */
function normalizePath(path) {
return path.replace(/\\/g, '/');
}
exports.ChangeTracker = ChangeTracker;
exports.canMigrateFile = canMigrateFile;
exports.createMigrationProgram = createMigrationProgram;
exports.createProgramOptions = createProgramOptions;
exports.normalizePath = normalizePath;
+1
-1
/**
* @license Angular v22.0.1
* @license Angular v22.1.0-next.0
* (c) 2010-2026 Google LLC. https://angular.dev/

@@ -4,0 +4,0 @@ * License: MIT

/**
* @license Angular v22.0.1
* @license Angular v22.1.0-next.0
* (c) 2010-2026 Google LLC. https://angular.dev/

@@ -4,0 +4,0 @@ * License: MIT

/**
* @license Angular v22.0.1
* @license Angular v22.1.0-next.0
* (c) 2010-2026 Google LLC. https://angular.dev/

@@ -4,0 +4,0 @@ * License: MIT

/**
* @license Angular v22.0.1
* @license Angular v22.1.0-next.0
* (c) 2010-2026 Google LLC. https://angular.dev/

@@ -103,9 +103,9 @@ * License: MIT

const getter = createLinkedSignal(optionsOrComputation, identityFn, options?.equal);
return upgradeLinkedSignalGetter(getter, options?.debugName);
return upgradeLinkedSignalGetter(getter, options?.debugName, options?.set);
} else {
const getter = createLinkedSignal(optionsOrComputation.source, optionsOrComputation.computation, optionsOrComputation.equal);
return upgradeLinkedSignalGetter(getter, optionsOrComputation.debugName);
return upgradeLinkedSignalGetter(getter, optionsOrComputation.debugName, optionsOrComputation.set);
}
}
function upgradeLinkedSignalGetter(getter, debugName) {
function upgradeLinkedSignalGetter(getter, debugName, customSet) {
if (typeof ngDevMode !== 'undefined' && ngDevMode) {

@@ -117,4 +117,10 @@ getter[SIGNAL].debugName = debugName;

const upgradedGetter = getter;
upgradedGetter.set = newValue => linkedSignalSetFn(node, newValue);
upgradedGetter.update = updateFn => linkedSignalUpdateFn(node, updateFn);
if (customSet !== undefined) {
const rawSet = newValue => linkedSignalSetFn(node, newValue);
upgradedGetter.set = newValue => customSet(newValue, rawSet);
upgradedGetter.update = updateFn => customSet(updateFn(untracked(getter)), rawSet);
} else {
upgradedGetter.set = newValue => linkedSignalSetFn(node, newValue);
upgradedGetter.update = updateFn => linkedSignalUpdateFn(node, updateFn);
}
upgradedGetter.asReadonly = signalAsReadonlyFn.bind(getter);

@@ -121,0 +127,0 @@ return upgradedGetter;

@@ -1,1 +0,1 @@

{"version":3,"file":"_resource-chunk.mjs","sources":["../../../../../k8-fastbuild-ST-fdfa778d11ba/bin/packages/core/src/authoring/output/output_emitter_ref.ts","../../../../../k8-fastbuild-ST-fdfa778d11ba/bin/packages/core/src/hydration/cache.ts","../../../../../k8-fastbuild-ST-fdfa778d11ba/bin/packages/core/src/render3/reactivity/computed.ts","../../../../../k8-fastbuild-ST-fdfa778d11ba/bin/packages/core/src/render3/reactivity/untracked.ts","../../../../../k8-fastbuild-ST-fdfa778d11ba/bin/packages/core/src/resource/api.ts","../../../../../k8-fastbuild-ST-fdfa778d11ba/bin/packages/core/src/render3/reactivity/linked_signal.ts","../../../../../k8-fastbuild-ST-fdfa778d11ba/bin/packages/core/src/resource/resource.ts"],"sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {setActiveConsumer} from '../../../primitives/signals';\n\nimport {inject} from '../../di/injector_compatibility';\nimport {ErrorHandler} from '../../error_handler';\nimport {formatRuntimeError, RuntimeError, RuntimeErrorCode} from '../../errors';\nimport {DestroyRef} from '../../linker/destroy_ref';\n\nimport {OutputRef, OutputRefSubscription} from './output_ref';\n\n/**\n * An `OutputEmitterRef` is created by the `output()` function and can be\n * used to emit values to consumers of your directive or component.\n *\n * Consumers of your directive/component can bind to the output and\n * subscribe to changes via the bound event syntax. For example:\n *\n * ```html\n * <my-comp (valueChange)=\"processNewValue($event)\" />\n * ```\n *\n * @see [Custom events with outputs](guide/components/outputs)\n *\n * @publicAPI\n */\nexport class OutputEmitterRef<T> implements OutputRef<T> {\n private destroyed = false;\n private listeners: Array<(value: T) => void> | null = null;\n private errorHandler = inject(ErrorHandler, {optional: true});\n\n /** @internal */\n destroyRef: DestroyRef = inject(DestroyRef);\n\n constructor() {\n // Clean-up all listeners and mark as destroyed upon destroy.\n this.destroyRef.onDestroy(() => {\n this.destroyed = true;\n this.listeners = null;\n });\n }\n\n subscribe(callback: (value: T) => void): OutputRefSubscription {\n if (this.destroyed) {\n throw new RuntimeError(\n RuntimeErrorCode.OUTPUT_REF_DESTROYED,\n ngDevMode &&\n 'Unexpected subscription to destroyed `OutputRef`. ' +\n 'The owning directive/component is destroyed.',\n );\n }\n\n (this.listeners ??= []).push(callback);\n\n return {\n unsubscribe: () => {\n const idx = this.listeners?.indexOf(callback);\n if (idx !== undefined && idx !== -1) {\n this.listeners?.splice(idx, 1);\n }\n },\n };\n }\n\n /** Emits a new value to the output. */\n emit(value: T): void {\n if (this.destroyed) {\n console.warn(\n formatRuntimeError(\n RuntimeErrorCode.OUTPUT_REF_DESTROYED,\n ngDevMode &&\n 'Unexpected emit for destroyed `OutputRef`. ' +\n 'The owning directive/component is destroyed.',\n ),\n );\n return;\n }\n\n if (this.listeners === null) {\n return;\n }\n\n const previousConsumer = setActiveConsumer(null);\n try {\n for (const listenerFn of this.listeners) {\n try {\n listenerFn(value);\n } catch (err: unknown) {\n this.errorHandler?.handleError(err);\n }\n }\n } finally {\n setActiveConsumer(previousConsumer);\n }\n }\n}\n\n/** Gets the owning `DestroyRef` for the given output. */\nexport function getOutputDestroyRef(ref: OutputRef<unknown>): DestroyRef | undefined {\n return ref.destroyRef;\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {InjectionToken} from '../di';\n\n/**\n * Token used to the determine if the transfer cache should be used, for example for resources.\n */\nexport const CACHE_ACTIVE = new InjectionToken<{isActive: boolean}>(\n typeof ngDevMode !== 'undefined' && ngDevMode ? 'STATE_CACHE_ACTIVE' : '',\n);\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {createComputed, SIGNAL} from '../../../primitives/signals';\n\nimport {Signal, ValueEqualityFn} from './api';\n\n/**\n * Options passed to the `computed` creation function.\n */\nexport interface CreateComputedOptions<T> {\n /**\n * A comparison function which defines equality for computed values.\n */\n equal?: ValueEqualityFn<T>;\n\n /**\n * A debug name for the computed signal. Used in Angular DevTools to identify the signal.\n */\n debugName?: string;\n}\n\n/**\n * Create a computed `Signal` which derives a reactive value from an expression.\n * @see [Computed signals](guide/signals#computed-signals)\n */\nexport function computed<T>(computation: () => T, options?: CreateComputedOptions<T>): Signal<T> {\n const getter = createComputed(computation, options?.equal);\n\n if (typeof ngDevMode !== 'undefined' && ngDevMode) {\n const debugName = options?.debugName;\n getter[SIGNAL].debugName = debugName;\n getter.toString = () => `[Computed${debugName ? ' (' + debugName + ')' : ''}: ${getter()}]`;\n }\n\n return getter;\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {untracked as untrackedPrimitive} from '../../../primitives/signals';\n\n/**\n * Execute an arbitrary function in a non-reactive (non-tracking) context. The executed function\n * can, optionally, return a value.\n * @see [Reading without tracking dependencies](guide/signals#reading-without-tracking-dependencies)\n */\nexport function untracked<T>(nonReactiveReadsFn: () => T): T {\n return untrackedPrimitive(nonReactiveReadsFn);\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {Injector} from '../di/injector';\nimport {Signal, ValueEqualityFn} from '../render3/reactivity/api';\nimport {WritableSignal} from '../render3/reactivity/signal';\n\n/** Error thrown when a `Resource` dependency of another resource errors. */\nexport class ResourceDependencyError extends Error {\n /** The dependency that errored. */\n readonly dependency: Resource<unknown>;\n\n constructor(dependency: Resource<unknown>) {\n super('Dependency error', {cause: dependency.error()});\n this.name = 'ResourceDependencyError';\n this.dependency = dependency;\n }\n}\n\n/**\n * Special status codes that can be thrown from a resource's `params` or `request` function to\n * indicate that the resource should transition to that status.\n */\nexport class ResourceParamsStatus extends Error {\n private readonly _brand: undefined;\n private constructor(msg: string) {\n super(msg);\n }\n\n /** Status code that transitions the resource to `idle` status. */\n static readonly IDLE = new ResourceParamsStatus('IDLE');\n\n /** Status code that transitions the resource to `loading` status. */\n static readonly LOADING = new ResourceParamsStatus('LOADING');\n}\n\n/** Context received by a resource's `params` or `request` function. */\nexport interface ResourceParamsContext {\n /**\n * Chains the current params off of the value of another resource, returning the value\n * of the other resource if it is available, or propagating the status to the current resource by\n * throwing the appropriate status code if the value is not available.\n */\n readonly chain: <T>(resource: Resource<T>) => T;\n}\n\n/**\n * String value capturing the status of a `Resource`.\n *\n * Possible statuses are:\n *\n * `idle` - The resource has no valid request and will not perform any loading. `value()` will be\n * `undefined`.\n *\n * `loading` - The resource is currently loading a new value as a result of a change in its reactive\n * dependencies. `value()` will be `undefined`.\n *\n * `reloading` - The resource is currently reloading a fresh value for the same reactive\n * dependencies. `value()` will continue to return the previously fetched value during the reloading\n * operation.\n *\n * `error` - Loading failed with an error. `value()` will be `undefined`.\n *\n * `resolved` - Loading has completed and the resource has the value returned from the loader.\n *\n * `local` - The resource's value was set locally via `.set()` or `.update()`.\n *\n * @publicApi 22.0\n */\nexport type ResourceStatus = 'idle' | 'error' | 'loading' | 'reloading' | 'resolved' | 'local';\n\n/**\n * A Resource is an asynchronous dependency (for example, the results of an API call) that is\n * managed and delivered through signals.\n *\n * The usual way of creating a `Resource` is through the `resource` function, but various other APIs\n * may present `Resource` instances to describe their own concepts.\n *\n * @publicApi 22.0\n */\nexport interface Resource<T> {\n /**\n * The current value of the `Resource`, or throws an error if the resource is in an error state.\n */\n readonly value: Signal<T>;\n\n /**\n * The current status of the `Resource`, which describes what the resource is currently doing and\n * what can be expected of its `value`.\n */\n readonly status: Signal<ResourceStatus>;\n\n /**\n * When in the `error` state, this returns the last known error from the `Resource`.\n */\n readonly error: Signal<Error | undefined>;\n\n /**\n * Whether this resource is loading a new value (or reloading the existing one).\n */\n readonly isLoading: Signal<boolean>;\n\n /**\n * The current state of this resource, represented as a `ResourceSnapshot`.\n */\n readonly snapshot: Signal<ResourceSnapshot<T>>;\n\n /**\n * Whether this resource has a valid current value.\n *\n * This function is reactive.\n */\n hasValue(this: T extends undefined ? this : never): this is Resource<Exclude<T, undefined>>;\n\n hasValue(): boolean;\n}\n\n/**\n * A `Resource` with a mutable value.\n *\n * Overwriting the value of a resource sets it to the 'local' state.\n *\n * @publicApi 22.0\n */\nexport interface WritableResource<T> extends Resource<T> {\n readonly value: WritableSignal<T>;\n hasValue(\n this: T extends undefined ? this : never,\n ): this is WritableResource<Exclude<T, undefined>>;\n\n hasValue(): boolean;\n\n /**\n * Convenience wrapper for `value.set`.\n */\n set(value: T): void;\n\n /**\n * Convenience wrapper for `value.update`.\n */\n update(updater: (value: T) => T): void;\n asReadonly(): Resource<T>;\n\n /**\n * Instructs the resource to re-load any asynchronous dependency it may have.\n *\n * Note that the resource will not enter its reloading state until the actual backend request is\n * made.\n *\n * @returns true if a reload was initiated, false if a reload was unnecessary or unsupported\n */\n reload(): boolean;\n}\n\n/**\n * A `WritableResource` created through the `resource` function.\n *\n * @publicApi 22.0\n */\nexport interface ResourceRef<T> extends WritableResource<T> {\n hasValue(this: T extends undefined ? this : never): this is ResourceRef<Exclude<T, undefined>>;\n\n hasValue(): boolean;\n /**\n * Manually destroy the resource, which cancels pending requests and returns it to `idle` state.\n */\n destroy(): void;\n}\n\n/**\n * Parameter to a `ResourceLoader` which gives the request and other options for the current loading\n * operation.\n *\n * @publicApi 22.0\n */\nexport interface ResourceLoaderParams<R> {\n params: NoInfer<Exclude<R, undefined>>;\n abortSignal: AbortSignal;\n previous: {\n status: ResourceStatus;\n };\n}\n\n/**\n * Loading function for a `Resource`.\n *\n * @publicApi 22.0\n */\nexport type ResourceLoader<T, R> = (param: ResourceLoaderParams<R>) => PromiseLike<T>;\n\n/**\n * Streaming loader for a `Resource`.\n *\n * @publicApi 22.0\n */\nexport type ResourceStreamingLoader<T, R> = (\n param: ResourceLoaderParams<R>,\n) => Signal<ResourceStreamItem<T>> | PromiseLike<Signal<ResourceStreamItem<T>>> | undefined;\n\n/**\n * Options to the `resource` function, for creating a resource.\n *\n * @publicApi 22.0\n */\nexport interface BaseResourceOptions<T, R> {\n /**\n * A reactive function which determines the request to be made. Whenever the request changes, the\n * loader will be triggered to fetch a new value for the resource.\n *\n * If a params function isn't provided, the loader won't rerun unless the resource is reloaded.\n */\n params?: (ctx: ResourceParamsContext) => R;\n\n /**\n * The value which will be returned from the resource when a server value is unavailable, such as\n * when the resource is still loading.\n */\n defaultValue?: NoInfer<T>;\n\n /**\n * Equality function used to compare the return value of the loader.\n */\n equal?: ValueEqualityFn<T>;\n\n /**\n * Overrides the `Injector` used by `resource`.\n */\n injector?: Injector;\n\n /**\n * Identifier used to cache the resource data in the `TransferState` during server-side rendering and to retrieve it on the client side.\n * This value value needs to be identical for both the client and server.\n */\n id?: string;\n}\n\n/**\n * Options to the `resource` function, for creating a resource.\n *\n * @publicApi 22.0\n */\nexport interface PromiseResourceOptions<T, R> extends BaseResourceOptions<T, R> {\n /**\n * Loading function which returns a `Promise` of the resource's value for a given request.\n */\n loader: ResourceLoader<T, R>;\n\n /**\n * Cannot specify `stream` and `loader` at the same time.\n */\n stream?: never;\n}\n\n/**\n * Options to the `resource` function, for creating a resource.\n *\n * @publicApi 22.0\n */\nexport interface StreamingResourceOptions<T, R> extends BaseResourceOptions<T, R> {\n /**\n * Loading function which returns a `Promise` of a signal of the resource's value for a given\n * request, which can change over time as new values are received from a stream.\n */\n stream: ResourceStreamingLoader<T, R>;\n\n /**\n * Cannot specify `stream` and `loader` at the same time.\n */\n loader?: never;\n}\n\n/**\n * @publicApi 22.0\n */\nexport type ResourceOptions<T, R> = (\n | PromiseResourceOptions<T, R>\n | StreamingResourceOptions<T, R>\n) & {\n /**\n * A debug name for the reactive node. Used in Angular DevTools to identify the node.\n */\n debugName?: string;\n};\n\n/**\n * @publicApi 22.0\n */\nexport type ResourceStreamItem<T> = {value: T} | {error: Error};\n\n/**\n * An explicit representation of a resource's state.\n *\n * @publicApi 22.0\n * @see [Resource composition with snapshots](guide/signals/resource#resource-composition-with-snapshots)\n */\nexport type ResourceSnapshot<T> =\n | {readonly status: 'idle'; readonly value: T}\n | {readonly status: 'loading' | 'reloading'; readonly value: T}\n | {readonly status: 'resolved' | 'local'; readonly value: T}\n | {readonly status: 'error'; readonly error: Error};\n\n/**\n * Options for `debounced`.\n *\n * @see [Debouncing signals with `debounced`](guide/signals/debounced)\n *\n * @experimental 22.0\n */\nexport interface DebouncedOptions<T> {\n /** The `Injector` to use for the debounced resource. */\n injector?: Injector;\n /** The equality function to use for comparing values. */\n equal?: ValueEqualityFn<T>;\n}\n\n/**\n * Represents the wait condition for item debouncing.\n * Can be a number of milliseconds or a function that returns a Promise.\n *\n * @see [Debouncing signals with `debounced`](guide/signals/debounced)\n *\n * @experimental 22.0\n */\nexport type DebounceTimer<T> =\n | number\n | ((value: T, lastValue: ResourceSnapshot<T>) => Promise<void> | void);\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {\n ComputationFn,\n createLinkedSignal,\n LinkedSignalGetter,\n LinkedSignalNode,\n linkedSignalSetFn,\n linkedSignalUpdateFn,\n SIGNAL,\n} from '../../../primitives/signals';\nimport {Signal, ValueEqualityFn} from './api';\nimport {signalAsReadonlyFn, WritableSignal} from './signal';\n\nconst identityFn = <T>(v: T) => v;\n\n/**\n * Creates a writable signal whose value is initialized and reset by the linked, reactive computation.\n *\n * @publicApi 20.0\n */\nexport function linkedSignal<D>(\n computation: () => D,\n options?: {equal?: ValueEqualityFn<NoInfer<D>>; debugName?: string},\n): WritableSignal<D>;\n\n/**\n * Creates a writable signal whose value is initialized and reset by the linked, reactive computation.\n * This is an advanced API form where the computation has access to the previous value of the signal and the computation result.\n *\n * Note: The computation is reactive, meaning the linked signal will automatically update whenever any of the signals used within the computation change.\n *\n * @publicApi 20.0\n * @see [Dependent state with linkedSignal](guide/signals/linked-signal)\n */\nexport function linkedSignal<S, D>(options: {\n source: () => S;\n computation: (source: NoInfer<S>, previous?: {source: NoInfer<S>; value: NoInfer<D>}) => D;\n equal?: ValueEqualityFn<NoInfer<D>>;\n debugName?: string;\n}): WritableSignal<D>;\n\nexport function linkedSignal<S, D>(\n optionsOrComputation:\n | {\n source: () => S;\n computation: ComputationFn<S, D>;\n equal?: ValueEqualityFn<D>;\n debugName?: string;\n }\n | (() => D),\n options?: {equal?: ValueEqualityFn<D>; debugName?: string},\n): WritableSignal<D> {\n if (typeof optionsOrComputation === 'function') {\n const getter = createLinkedSignal<D, D>(\n optionsOrComputation,\n identityFn<D>,\n options?.equal,\n ) as LinkedSignalGetter<D, D> & WritableSignal<D>;\n return upgradeLinkedSignalGetter(getter, options?.debugName);\n } else {\n const getter = createLinkedSignal<S, D>(\n optionsOrComputation.source,\n optionsOrComputation.computation,\n optionsOrComputation.equal,\n );\n return upgradeLinkedSignalGetter(getter, optionsOrComputation.debugName);\n }\n}\n\nfunction upgradeLinkedSignalGetter<S, D>(\n getter: LinkedSignalGetter<S, D>,\n debugName?: string,\n): WritableSignal<D> {\n if (typeof ngDevMode !== 'undefined' && ngDevMode) {\n getter[SIGNAL].debugName = debugName;\n getter.toString = () => `[LinkedSignal${debugName ? ' (' + debugName + ')' : ''}: ${getter()}]`;\n }\n\n const node = getter[SIGNAL] as LinkedSignalNode<S, D>;\n const upgradedGetter = getter as LinkedSignalGetter<S, D> & WritableSignal<D>;\n\n upgradedGetter.set = (newValue: D) => linkedSignalSetFn(node, newValue);\n upgradedGetter.update = (updateFn: (value: D) => D) => linkedSignalUpdateFn(node, updateFn);\n upgradedGetter.asReadonly = signalAsReadonlyFn.bind(getter as any) as () => Signal<D>;\n\n return upgradedGetter;\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {isSignal, Signal, ValueEqualityFn} from '../render3/reactivity/api';\nimport {computed} from '../render3/reactivity/computed';\nimport {effect, EffectRef} from '../render3/reactivity/effect';\nimport {signal, signalAsReadonlyFn, WritableSignal} from '../render3/reactivity/signal';\nimport {untracked} from '../render3/reactivity/untracked';\nimport {\n Resource,\n ResourceDependencyError,\n ResourceOptions,\n ResourceParamsStatus,\n ResourceSnapshot,\n ResourceStatus,\n ResourceStreamingLoader,\n ResourceStreamItem,\n StreamingResourceOptions,\n type ResourceParamsContext,\n type ResourceRef,\n type WritableResource,\n} from './api';\n\nimport {assertInInjectionContext} from '../di/contextual';\nimport {Injector} from '../di/injector';\nimport {inject} from '../di/injector_compatibility';\nimport {RuntimeError, RuntimeErrorCode} from '../errors';\nimport {CACHE_ACTIVE} from '../hydration/cache';\nimport {DestroyRef} from '../linker/destroy_ref';\nimport {PendingTasks} from '../pending_tasks';\nimport {linkedSignal} from '../render3/reactivity/linked_signal';\nimport {StateKey, TransferState} from '../transfer_state';\n\n/**\n * Constructs a `Resource` that projects a reactive request to an asynchronous operation defined by\n * a loader function, which exposes the result of the loading operation via signals.\n *\n * Note that `resource` is intended for _read_ operations, not operations which perform mutations.\n * `resource` will cancel in-progress loads via the `AbortSignal` when destroyed or when a new\n * request object becomes available, which could prematurely abort mutations.\n *\n * @see [Async reactivity with resources](guide/signals/resource)\n *\n * @publicApi 22.0\n */\nexport function resource<T, R>(\n options: ResourceOptions<T, R> & {defaultValue: NoInfer<T>},\n): ResourceRef<T>;\n\n/**\n * Constructs a `Resource` that projects a reactive request to an asynchronous operation defined by\n * a loader function, which exposes the result of the loading operation via signals.\n *\n * Note that `resource` is intended for _read_ operations, not operations which perform mutations.\n * `resource` will cancel in-progress loads via the `AbortSignal` when destroyed or when a new\n * request object becomes available, which could prematurely abort mutations.\n *\n * @publicApi 22.0\n * @see [Async reactivity with resources](guide/signals/resource)\n */\nexport function resource<T, R>(options: ResourceOptions<T, R>): ResourceRef<T | undefined>;\nexport function resource<T, R>(options: ResourceOptions<T, R>): ResourceRef<T | undefined> {\n if (ngDevMode && !options?.injector) {\n assertInInjectionContext(resource);\n }\n\n const oldNameForParams = (\n options as ResourceOptions<T, R> & {request: ResourceOptions<T, R>['params']}\n ).request;\n const params = options.params ?? oldNameForParams ?? (() => null!);\n return new ResourceImpl<T | undefined, R>(\n params,\n getLoader(options),\n options.defaultValue,\n options.equal ? wrapEqualityFn(options.equal) : undefined,\n options.debugName,\n options.injector ?? inject(Injector),\n options.id as StateKey<T>,\n );\n}\n\ntype ResourceInternalStatus = 'idle' | 'loading' | 'resolved' | 'local';\n\n/**\n * Internal state of a resource.\n */\ninterface ResourceProtoState<T> {\n extRequest: WrappedRequest;\n\n // For simplicity, status is internally tracked as a subset of the public status enum.\n // Reloading and Error statuses are projected from Loading and Resolved based on other state.\n status: ResourceInternalStatus;\n}\n\ninterface ResourceState<T> extends ResourceProtoState<T> {\n previousStatus: ResourceStatus;\n stream: Signal<ResourceStreamItem<T>> | undefined;\n}\n\ntype WrappedRequest = {\n request?: unknown;\n reload: number;\n status?: ResourceInternalStatus;\n error?: Error;\n};\n\n/**\n * Base class which implements `.value` as a `WritableSignal` by delegating `.set` and `.update`.\n */\nabstract class BaseWritableResource<T> implements WritableResource<T> {\n readonly value: WritableSignal<T>;\n abstract readonly status: Signal<ResourceStatus>;\n abstract readonly error: Signal<Error | undefined>;\n\n abstract reload(): boolean;\n\n readonly isLoading: Signal<boolean>;\n\n constructor(value: Signal<T>, debugName: string | undefined) {\n this.value = value as WritableSignal<T>;\n this.value.set = this.set.bind(this);\n this.value.update = this.update.bind(this);\n this.value.asReadonly = signalAsReadonlyFn;\n\n this.isLoading = computed(\n () => this.status() === 'loading' || this.status() === 'reloading',\n ngDevMode ? createDebugNameObject(debugName, 'isLoading') : undefined,\n );\n }\n\n abstract set(value: T): void;\n\n private readonly isError = computed(() => this.status() === 'error');\n\n update(updateFn: (value: T) => T): void {\n this.set(updateFn(untracked(this.value)));\n }\n\n // Use a computed here to avoid triggering reactive consumers if the value changes while staying\n // either defined or undefined.\n private readonly isValueDefined = computed(() => {\n // Check if it's in an error state first to prevent the error from bubbling up.\n if (this.isError()) {\n return false;\n }\n\n return this.value() !== undefined;\n });\n\n private _snapshot: Signal<ResourceSnapshot<T>> | undefined;\n get snapshot(): Signal<ResourceSnapshot<T>> {\n return (this._snapshot ??= computed(() => {\n const status = this.status();\n if (status === 'error') {\n return {status: 'error', error: this.error()!};\n } else {\n return {status, value: this.value()};\n }\n }));\n }\n\n hasValue(): this is ResourceRef<Exclude<T, undefined>> {\n return this.isValueDefined();\n }\n\n asReadonly(): Resource<T> {\n return this;\n }\n}\n\n/**\n * Implementation for `resource()` which uses a `linkedSignal` to manage the resource's state.\n */\nexport class ResourceImpl<T, R> extends BaseWritableResource<T> implements ResourceRef<T> {\n private readonly pendingTasks: PendingTasks;\n\n /**\n * The current state of the resource. Status, value, and error are derived from this.\n */\n private readonly state: WritableSignal<ResourceState<T>>;\n\n /**\n * Combines the current request with a reload counter which allows the resource to be reloaded on\n * imperative command.\n */\n protected readonly extRequest: WritableSignal<WrappedRequest>;\n private readonly effectRef: EffectRef;\n\n private pendingController: AbortController | undefined;\n private resolvePendingTask: (() => void) | undefined = undefined;\n private destroyed = false;\n private unregisterOnDestroy: () => void;\n\n override readonly status: Signal<ResourceStatus>;\n override readonly error: Signal<Error | undefined>;\n private readonly transferState: TransferState | undefined;\n\n constructor(\n request: (ctx: ResourceParamsContext) => R,\n private readonly loaderFn: ResourceStreamingLoader<T, R>,\n defaultValue: T,\n private readonly equal: ValueEqualityFn<T> | undefined,\n private readonly debugName: string | undefined,\n injector: Injector,\n private transferCacheKey: StateKey<T> | undefined,\n getInitialStream?: (request: R) => Signal<ResourceStreamItem<T>> | undefined,\n ) {\n if (isInParamsFunction()) {\n throw invalidResourceCreationInParams();\n }\n\n super(\n // Feed a computed signal for the value to `BaseWritableResource`, which will upgrade it to a\n // `WritableSignal` that delegates to `ResourceImpl.set`.\n computed(\n () => {\n const streamValue = this.state().stream?.();\n\n if (!streamValue) {\n return defaultValue;\n }\n\n // Prevents `hasValue()` from throwing an error when a reload happened in the error state\n if (this.state().status === 'loading' && this.error()) {\n return defaultValue;\n }\n\n if (!isResolved(streamValue)) {\n throw new ResourceValueError(this.error()!);\n }\n\n return streamValue.value;\n },\n {equal, ...(ngDevMode ? createDebugNameObject(debugName, 'value') : undefined)},\n ),\n debugName,\n );\n\n const cacheState = injector.get(CACHE_ACTIVE, undefined, {optional: true}) ?? {isActive: false};\n\n this.transferState = injector.get(TransferState, undefined, {optional: true}) ?? undefined;\n\n this.extRequest = linkedSignal<WrappedRequest>(\n () => {\n try {\n setInParamsFunction(true);\n return {request: request(paramsContext), reload: 0};\n } catch (error) {\n rethrowFatalErrors(error);\n if (error === ResourceParamsStatus.IDLE) {\n return {status: 'idle', reload: 0};\n } else if (error === ResourceParamsStatus.LOADING) {\n return {status: 'loading', reload: 0};\n }\n return {error: error as Error, reload: 0};\n } finally {\n setInParamsFunction(false);\n }\n },\n ngDevMode ? createDebugNameObject(debugName, 'extRequest') : undefined,\n );\n\n // The main resource state is managed in a `linkedSignal`, which allows the resource to change\n // state instantaneously when the request signal changes.\n this.state = linkedSignal<WrappedRequest, ResourceState<T>>({\n // Whenever the request changes,\n source: this.extRequest,\n // Compute the state of the resource given a change in status.\n computation: (extRequest, previous) => {\n let {request, status, error} = extRequest;\n let stream: Signal<ResourceStreamItem<T>> | undefined;\n\n if (error) {\n status = 'resolved';\n stream = signal(\n {error: encapsulateResourceError(error)},\n ngDevMode ? createDebugNameObject(this.debugName, 'stream') : undefined,\n );\n } else if (!status) {\n if (!previous) {\n const transferState = this.transferState;\n const cacheKey = this.transferCacheKey;\n if (cacheState.isActive && cacheKey && transferState && request !== undefined) {\n const key = this.transferCacheKey;\n if (transferState.hasKey(cacheKey)) {\n stream = signal(\n {value: transferState.get(cacheKey, defaultValue)},\n ngDevMode ? createDebugNameObject(this.debugName, 'stream') : undefined,\n );\n }\n }\n\n if (!stream) {\n stream = getInitialStream?.(extRequest.request as R);\n }\n // Clear getInitialStream so it doesn't hold onto memory\n getInitialStream = undefined;\n status = request === undefined ? 'idle' : stream ? 'resolved' : 'loading';\n } else {\n status = request === undefined ? 'idle' : 'loading';\n if (previous.value.extRequest.request === request) {\n stream = previous.value.stream;\n }\n }\n }\n\n return {\n extRequest,\n status,\n previousStatus: previous ? projectStatusOfState(previous.value) : 'idle',\n stream,\n };\n },\n ...(ngDevMode ? createDebugNameObject(debugName, 'state') : undefined),\n });\n\n this.effectRef = effect(this.loadEffect.bind(this), {\n injector,\n manualCleanup: true,\n ...(ngDevMode ? createDebugNameObject(debugName, 'loadEffect') : undefined),\n });\n\n this.pendingTasks = injector.get(PendingTasks);\n\n // Cancel any pending request when the resource itself is destroyed.\n this.unregisterOnDestroy = injector.get(DestroyRef).onDestroy(() => this.destroy());\n\n this.status = computed(\n () => projectStatusOfState(this.state()),\n ngDevMode ? createDebugNameObject(debugName, 'status') : undefined,\n );\n\n this.error = computed(\n () => {\n const stream = this.state().stream?.();\n return stream && !isResolved(stream) ? stream.error : undefined;\n },\n ngDevMode ? createDebugNameObject(debugName, 'error') : undefined,\n );\n }\n\n /**\n * Called either directly via `WritableResource.set` or via `.value.set()`.\n */\n override set(value: T): void {\n if (this.destroyed) {\n return;\n }\n\n const error = untracked(this.error);\n const state = untracked(this.state);\n\n if (!error) {\n const current = untracked(this.value);\n if (\n state.status === 'local' &&\n (this.equal ? this.equal(current, value) : current === value)\n ) {\n return;\n }\n }\n\n // Enter Local state with the user-defined value.\n this.state.set({\n extRequest: state.extRequest,\n status: 'local',\n previousStatus: 'local',\n stream: signal(\n {value},\n ngDevMode ? createDebugNameObject(this.debugName, 'stream') : undefined,\n ),\n });\n\n // We're departing from whatever state the resource was in previously, so cancel any in-progress\n // loading operations.\n this.abortInProgressLoad();\n }\n\n override reload(): boolean {\n // We don't want to restart in-progress loads.\n const {status} = untracked(this.state);\n if (status === 'idle' || status === 'loading') {\n return false;\n }\n\n // Increment the request reload to trigger the `state` linked signal to switch us to `Reload`\n this.extRequest.update(({request, reload}) => ({request, reload: reload + 1}));\n return true;\n }\n\n destroy(): void {\n this.destroyed = true;\n this.unregisterOnDestroy();\n this.effectRef.destroy();\n this.abortInProgressLoad();\n\n // Destroyed resources enter Idle state.\n this.state.set({\n extRequest: {request: undefined, reload: 0},\n status: 'idle',\n previousStatus: 'idle',\n stream: undefined,\n });\n }\n\n private async loadEffect(): Promise<void> {\n const extRequest = this.extRequest();\n\n // Capture the previous status before any state transitions. Note that this is `untracked` since\n // we do not want the effect to depend on the state of the resource, only on the request.\n const {status: currentStatus, previousStatus} = untracked(this.state);\n\n if (extRequest.request === undefined) {\n // Nothing to load (and we should already be in a non-loading state).\n return;\n } else if (currentStatus !== 'loading') {\n // We're not in a loading or reloading state, so this loading request is stale.\n return;\n }\n\n // Cancel any previous loading attempts.\n this.abortInProgressLoad();\n\n // Capturing _this_ load's pending task in a local variable is important here. We may attempt to\n // resolve it twice:\n //\n // 1. when the loading function promise resolves/rejects\n // 2. when cancelling the loading operation\n //\n // After the loading operation is cancelled, `this.resolvePendingTask` no longer represents this\n // particular task, but this `await` may eventually resolve/reject. Thus, when we cancel in\n // response to (1) below, we need to cancel the locally saved task.\n let resolvePendingTask: (() => void) | undefined = (this.resolvePendingTask =\n this.pendingTasks.add());\n\n const {signal: abortSignal} = (this.pendingController = new AbortController());\n\n try {\n // The actual loading is run through `untracked` - only the request side of `resource` is\n // reactive. This avoids any confusion with signals tracking or not tracking depending on\n // which side of the `await` they are.\n const stream = untracked(() => {\n return this.loaderFn({\n params: extRequest.request as Exclude<R, undefined>,\n abortSignal,\n previous: {\n status: previousStatus,\n },\n });\n });\n\n // If this request has been aborted, or the current request no longer\n // matches this load, then we should ignore this resolution.\n const shouldDiscard = () => abortSignal.aborted || untracked(this.extRequest) !== extRequest;\n\n if (isSignal(stream)) {\n if (shouldDiscard()) {\n return;\n }\n\n this.state.set({\n extRequest,\n status: 'resolved',\n previousStatus: 'resolved',\n stream,\n });\n\n const result = untracked(stream);\n if (typeof ngServerMode !== 'undefined' && ngServerMode) {\n saveToTransferState(result, this.transferCacheKey, this.transferState);\n }\n } else {\n const resolvedStream = await stream;\n if (shouldDiscard()) {\n return;\n }\n\n this.state.set({\n extRequest,\n status: 'resolved',\n previousStatus: 'resolved',\n stream: resolvedStream,\n });\n\n // Use a local variable for the result so TypeScript can narrow `resolvedStream` correctly.\n const result = resolvedStream ? untracked(resolvedStream) : undefined;\n if (typeof ngServerMode !== 'undefined' && ngServerMode) {\n saveToTransferState(result, this.transferCacheKey, this.transferState);\n }\n }\n } catch (err) {\n rethrowFatalErrors(err);\n if (abortSignal.aborted || untracked(this.extRequest) !== extRequest) {\n return;\n }\n\n this.state.set({\n extRequest,\n status: 'resolved',\n previousStatus: 'error',\n stream: signal(\n {error: encapsulateResourceError(err)},\n ngDevMode ? createDebugNameObject(this.debugName, 'stream') : undefined,\n ),\n });\n } finally {\n // Resolve the pending task now that the resource has a value.\n resolvePendingTask?.();\n resolvePendingTask = undefined;\n }\n }\n\n private abortInProgressLoad(): void {\n untracked(() => this.pendingController?.abort());\n this.pendingController = undefined;\n\n // Once the load is aborted, we no longer want to block stability on its resolution.\n this.resolvePendingTask?.();\n this.resolvePendingTask = undefined;\n }\n}\n\nfunction saveToTransferState<R, T>(\n result: ResourceStreamItem<T> | undefined,\n transferCacheKey: StateKey<T> | undefined,\n transferState: TransferState | undefined,\n): void {\n if (transferCacheKey && transferState && result && isResolved(result)) {\n transferState.set(transferCacheKey, result.value);\n }\n}\n\n/**\n * Wraps an equality function to handle either value being `undefined`.\n */\nfunction wrapEqualityFn<T>(equal: ValueEqualityFn<T>): ValueEqualityFn<T | undefined> {\n return (a, b) => (a === undefined || b === undefined ? a === b : equal(a, b));\n}\n\nfunction getLoader<T, R>(options: ResourceOptions<T, R>): ResourceStreamingLoader<T, R> {\n if (isStreamingResourceOptions(options)) {\n return options.stream;\n }\n\n return async (params) => {\n try {\n return signal(\n {value: await options.loader(params)},\n ngDevMode ? createDebugNameObject(options.debugName, 'stream') : undefined,\n );\n } catch (err) {\n return signal(\n {error: encapsulateResourceError(err)},\n ngDevMode ? createDebugNameObject(options.debugName, 'stream') : undefined,\n );\n }\n };\n}\n\nfunction isStreamingResourceOptions<T, R>(\n options: ResourceOptions<T, R>,\n): options is StreamingResourceOptions<T, R> {\n return !!(options as StreamingResourceOptions<T, R>).stream;\n}\n\n/**\n * Project from a state with `ResourceInternalStatus` to the user-facing `ResourceStatus`\n */\nfunction projectStatusOfState(state: ResourceState<unknown>): ResourceStatus {\n switch (state.status) {\n case 'loading':\n return state.extRequest.reload === 0 ? 'loading' : 'reloading';\n case 'resolved':\n return isResolved(state.stream!()) ? 'resolved' : 'error';\n default:\n return state.status;\n }\n}\n\nfunction isResolved<T>(state: ResourceStreamItem<T>): state is {value: T} {\n return (state as {error: unknown}).error === undefined;\n}\n\n/**\n * Creates a debug name object for an internal signal.\n */\nfunction createDebugNameObject(\n resourceDebugName: string | undefined,\n internalSignalDebugName: string,\n): {debugName?: string} {\n return {\n debugName: `Resource${resourceDebugName ? '#' + resourceDebugName : ''}.${internalSignalDebugName}`,\n };\n}\n\nexport function encapsulateResourceError(error: unknown): Error {\n if (isErrorLike(error)) {\n return error;\n }\n\n return new ResourceWrappedError(error);\n}\n\nexport function isErrorLike(error: unknown): error is Error {\n return (\n error instanceof Error ||\n (typeof error === 'object' &&\n typeof (error as Error).name === 'string' &&\n typeof (error as Error).message === 'string')\n );\n}\n\nexport class ResourceValueError extends Error {\n constructor(error: Error) {\n super(\n ngDevMode\n ? `Resource is currently in an error state (see Error.cause for details): ${error.message}`\n : error.message,\n {cause: error},\n );\n }\n}\n\nclass ResourceWrappedError extends Error {\n constructor(error: unknown) {\n super(\n ngDevMode\n ? `Resource returned an error that's not an Error instance: ${String(error)}. Check this error's .cause for the actual error.`\n : String(error),\n {cause: error},\n );\n }\n}\n\n/**\n * Chains the value of another resource into the params of the current resource, returning the value\n * of the other resource if it is available, or propagating the status to the current resource if it\n * is not.\n */\nexport function chain<T>(resource: Resource<T>): T {\n switch (resource.status()) {\n case 'idle':\n throw ResourceParamsStatus.IDLE;\n case 'error':\n throw new ResourceDependencyError(resource);\n case 'loading':\n case 'reloading':\n throw ResourceParamsStatus.LOADING;\n }\n return resource.value();\n}\n\nexport const paramsContext: ResourceParamsContext = {\n chain,\n};\n\nlet inParamsFunction = false;\n\nexport function isInParamsFunction() {\n return inParamsFunction;\n}\n\nexport function setInParamsFunction(value: boolean) {\n inParamsFunction = value;\n}\n\nexport function invalidResourceCreationInParams(): Error {\n return new RuntimeError(\n RuntimeErrorCode.INVALID_RESOURCE_CREATION_IN_PARAMS,\n ngDevMode && `Cannot create a resource inside the \\`params\\` of another resource`,\n );\n}\n\nexport function rethrowFatalErrors(error: unknown) {\n if (\n error instanceof RuntimeError &&\n error.code === RuntimeErrorCode.INVALID_RESOURCE_CREATION_IN_PARAMS\n ) {\n throw error;\n }\n}\n"],"names":["OutputEmitterRef","destroyed","listeners","errorHandler","inject","ErrorHandler","optional","destroyRef","DestroyRef","constructor","onDestroy","subscribe","callback","RuntimeError","ngDevMode","push","unsubscribe","idx","indexOf","undefined","splice","emit","value","console","warn","formatRuntimeError","previousConsumer","setActiveConsumer","listenerFn","err","handleError","getOutputDestroyRef","ref","CACHE_ACTIVE","InjectionToken","computed","computation","options","getter","createComputed","equal","debugName","SIGNAL","toString","untracked","nonReactiveReadsFn","untrackedPrimitive","ResourceDependencyError","Error","dependency","cause","error","name","ResourceParamsStatus","_brand","msg","IDLE","LOADING","identityFn","v","linkedSignal","optionsOrComputation","createLinkedSignal","upgradeLinkedSignalGetter","source","node","upgradedGetter","set","newValue","linkedSignalSetFn","update","updateFn","linkedSignalUpdateFn","asReadonly","signalAsReadonlyFn","bind","resource","injector","assertInInjectionContext","oldNameForParams","request","params","ResourceImpl","getLoader","defaultValue","wrapEqualityFn","Injector","id","BaseWritableResource","isLoading","status","createDebugNameObject","isError","isValueDefined","_snapshot","snapshot","hasValue","loaderFn","transferCacheKey","pendingTasks","state","extRequest","effectRef","pendingController","resolvePendingTask","unregisterOnDestroy","transferState","getInitialStream","isInParamsFunction","invalidResourceCreationInParams","streamValue","stream","isResolved","ResourceValueError","cacheState","get","isActive","TransferState","setInParamsFunction","paramsContext","reload","rethrowFatalErrors","previous","signal","encapsulateResourceError","cacheKey","hasKey","previousStatus","projectStatusOfState","effect","loadEffect","manualCleanup","PendingTasks","destroy","current","abortInProgressLoad","currentStatus","add","abortSignal","AbortController","shouldDiscard","aborted","isSignal","result","ngServerMode","saveToTransferState","resolvedStream","abort","a","b","isStreamingResourceOptions","loader","resourceDebugName","internalSignalDebugName","isErrorLike","ResourceWrappedError","message","String","chain","inParamsFunction","code"],"mappings":"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"}
{"version":3,"file":"_resource-chunk.mjs","sources":["../../../../../k8-fastbuild-ST-fdfa778d11ba/bin/packages/core/src/authoring/output/output_emitter_ref.ts","../../../../../k8-fastbuild-ST-fdfa778d11ba/bin/packages/core/src/hydration/cache.ts","../../../../../k8-fastbuild-ST-fdfa778d11ba/bin/packages/core/src/render3/reactivity/computed.ts","../../../../../k8-fastbuild-ST-fdfa778d11ba/bin/packages/core/src/render3/reactivity/untracked.ts","../../../../../k8-fastbuild-ST-fdfa778d11ba/bin/packages/core/src/resource/api.ts","../../../../../k8-fastbuild-ST-fdfa778d11ba/bin/packages/core/src/render3/reactivity/linked_signal.ts","../../../../../k8-fastbuild-ST-fdfa778d11ba/bin/packages/core/src/resource/resource.ts"],"sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {setActiveConsumer} from '../../../primitives/signals';\n\nimport {inject} from '../../di/injector_compatibility';\nimport {ErrorHandler} from '../../error_handler';\nimport {formatRuntimeError, RuntimeError, RuntimeErrorCode} from '../../errors';\nimport {DestroyRef} from '../../linker/destroy_ref';\n\nimport {OutputRef, OutputRefSubscription} from './output_ref';\n\n/**\n * An `OutputEmitterRef` is created by the `output()` function and can be\n * used to emit values to consumers of your directive or component.\n *\n * Consumers of your directive/component can bind to the output and\n * subscribe to changes via the bound event syntax. For example:\n *\n * ```html\n * <my-comp (valueChange)=\"processNewValue($event)\" />\n * ```\n *\n * @see [Custom events with outputs](guide/components/outputs)\n *\n * @publicAPI\n */\nexport class OutputEmitterRef<T> implements OutputRef<T> {\n private destroyed = false;\n private listeners: Array<(value: T) => void> | null = null;\n private errorHandler = inject(ErrorHandler, {optional: true});\n\n /** @internal */\n destroyRef: DestroyRef = inject(DestroyRef);\n\n constructor() {\n // Clean-up all listeners and mark as destroyed upon destroy.\n this.destroyRef.onDestroy(() => {\n this.destroyed = true;\n this.listeners = null;\n });\n }\n\n subscribe(callback: (value: T) => void): OutputRefSubscription {\n if (this.destroyed) {\n throw new RuntimeError(\n RuntimeErrorCode.OUTPUT_REF_DESTROYED,\n ngDevMode &&\n 'Unexpected subscription to destroyed `OutputRef`. ' +\n 'The owning directive/component is destroyed.',\n );\n }\n\n (this.listeners ??= []).push(callback);\n\n return {\n unsubscribe: () => {\n const idx = this.listeners?.indexOf(callback);\n if (idx !== undefined && idx !== -1) {\n this.listeners?.splice(idx, 1);\n }\n },\n };\n }\n\n /** Emits a new value to the output. */\n emit(value: T): void {\n if (this.destroyed) {\n console.warn(\n formatRuntimeError(\n RuntimeErrorCode.OUTPUT_REF_DESTROYED,\n ngDevMode &&\n 'Unexpected emit for destroyed `OutputRef`. ' +\n 'The owning directive/component is destroyed.',\n ),\n );\n return;\n }\n\n if (this.listeners === null) {\n return;\n }\n\n const previousConsumer = setActiveConsumer(null);\n try {\n for (const listenerFn of this.listeners) {\n try {\n listenerFn(value);\n } catch (err: unknown) {\n this.errorHandler?.handleError(err);\n }\n }\n } finally {\n setActiveConsumer(previousConsumer);\n }\n }\n}\n\n/** Gets the owning `DestroyRef` for the given output. */\nexport function getOutputDestroyRef(ref: OutputRef<unknown>): DestroyRef | undefined {\n return ref.destroyRef;\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {InjectionToken} from '../di';\n\n/**\n * Token used to the determine if the transfer cache should be used, for example for resources.\n */\nexport const CACHE_ACTIVE = new InjectionToken<{isActive: boolean}>(\n typeof ngDevMode !== 'undefined' && ngDevMode ? 'STATE_CACHE_ACTIVE' : '',\n);\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {createComputed, SIGNAL} from '../../../primitives/signals';\n\nimport {Signal, ValueEqualityFn} from './api';\n\n/**\n * Options passed to the `computed` creation function.\n */\nexport interface CreateComputedOptions<T> {\n /**\n * A comparison function which defines equality for computed values.\n */\n equal?: ValueEqualityFn<T>;\n\n /**\n * A debug name for the computed signal. Used in Angular DevTools to identify the signal.\n */\n debugName?: string;\n}\n\n/**\n * Create a computed `Signal` which derives a reactive value from an expression.\n * @see [Computed signals](guide/signals#computed-signals)\n */\nexport function computed<T>(computation: () => T, options?: CreateComputedOptions<T>): Signal<T> {\n const getter = createComputed(computation, options?.equal);\n\n if (typeof ngDevMode !== 'undefined' && ngDevMode) {\n const debugName = options?.debugName;\n getter[SIGNAL].debugName = debugName;\n getter.toString = () => `[Computed${debugName ? ' (' + debugName + ')' : ''}: ${getter()}]`;\n }\n\n return getter;\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {untracked as untrackedPrimitive} from '../../../primitives/signals';\n\n/**\n * Execute an arbitrary function in a non-reactive (non-tracking) context. The executed function\n * can, optionally, return a value.\n * @see [Reading without tracking dependencies](guide/signals#reading-without-tracking-dependencies)\n */\nexport function untracked<T>(nonReactiveReadsFn: () => T): T {\n return untrackedPrimitive(nonReactiveReadsFn);\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {Injector} from '../di/injector';\nimport {Signal, ValueEqualityFn} from '../render3/reactivity/api';\nimport {WritableSignal} from '../render3/reactivity/signal';\n\n/** Error thrown when a `Resource` dependency of another resource errors. */\nexport class ResourceDependencyError extends Error {\n /** The dependency that errored. */\n readonly dependency: Resource<unknown>;\n\n constructor(dependency: Resource<unknown>) {\n super('Dependency error', {cause: dependency.error()});\n this.name = 'ResourceDependencyError';\n this.dependency = dependency;\n }\n}\n\n/**\n * Special status codes that can be thrown from a resource's `params` or `request` function to\n * indicate that the resource should transition to that status.\n */\nexport class ResourceParamsStatus extends Error {\n private readonly _brand: undefined;\n private constructor(msg: string) {\n super(msg);\n }\n\n /** Status code that transitions the resource to `idle` status. */\n static readonly IDLE = new ResourceParamsStatus('IDLE');\n\n /** Status code that transitions the resource to `loading` status. */\n static readonly LOADING = new ResourceParamsStatus('LOADING');\n}\n\n/** Context received by a resource's `params` or `request` function. */\nexport interface ResourceParamsContext {\n /**\n * Chains the current params off of the value of another resource, returning the value\n * of the other resource if it is available, or propagating the status to the current resource by\n * throwing the appropriate status code if the value is not available.\n */\n readonly chain: <T>(resource: Resource<T>) => T;\n}\n\n/**\n * String value capturing the status of a `Resource`.\n *\n * Possible statuses are:\n *\n * `idle` - The resource has no valid request and will not perform any loading. `value()` will be\n * `undefined`.\n *\n * `loading` - The resource is currently loading a new value as a result of a change in its reactive\n * dependencies. `value()` will be `undefined`.\n *\n * `reloading` - The resource is currently reloading a fresh value for the same reactive\n * dependencies. `value()` will continue to return the previously fetched value during the reloading\n * operation.\n *\n * `error` - Loading failed with an error. `value()` will be `undefined`.\n *\n * `resolved` - Loading has completed and the resource has the value returned from the loader.\n *\n * `local` - The resource's value was set locally via `.set()` or `.update()`.\n *\n * @publicApi 22.0\n */\nexport type ResourceStatus = 'idle' | 'error' | 'loading' | 'reloading' | 'resolved' | 'local';\n\n/**\n * A Resource is an asynchronous dependency (for example, the results of an API call) that is\n * managed and delivered through signals.\n *\n * The usual way of creating a `Resource` is through the `resource` function, but various other APIs\n * may present `Resource` instances to describe their own concepts.\n *\n * @publicApi 22.0\n */\nexport interface Resource<T> {\n /**\n * The current value of the `Resource`, or throws an error if the resource is in an error state.\n */\n readonly value: Signal<T>;\n\n /**\n * The current status of the `Resource`, which describes what the resource is currently doing and\n * what can be expected of its `value`.\n */\n readonly status: Signal<ResourceStatus>;\n\n /**\n * When in the `error` state, this returns the last known error from the `Resource`.\n */\n readonly error: Signal<Error | undefined>;\n\n /**\n * Whether this resource is loading a new value (or reloading the existing one).\n */\n readonly isLoading: Signal<boolean>;\n\n /**\n * The current state of this resource, represented as a `ResourceSnapshot`.\n */\n readonly snapshot: Signal<ResourceSnapshot<T>>;\n\n /**\n * Whether this resource has a valid current value.\n *\n * This function is reactive.\n */\n hasValue(this: T extends undefined ? this : never): this is Resource<Exclude<T, undefined>>;\n\n hasValue(): boolean;\n}\n\n/**\n * A `Resource` with a mutable value.\n *\n * Overwriting the value of a resource sets it to the 'local' state.\n *\n * @publicApi 22.0\n */\nexport interface WritableResource<T> extends Resource<T> {\n readonly value: WritableSignal<T>;\n hasValue(\n this: T extends undefined ? this : never,\n ): this is WritableResource<Exclude<T, undefined>>;\n\n hasValue(): boolean;\n\n /**\n * Convenience wrapper for `value.set`.\n */\n set(value: T): void;\n\n /**\n * Convenience wrapper for `value.update`.\n */\n update(updater: (value: T) => T): void;\n asReadonly(): Resource<T>;\n\n /**\n * Instructs the resource to re-load any asynchronous dependency it may have.\n *\n * Note that the resource will not enter its reloading state until the actual backend request is\n * made.\n *\n * @returns true if a reload was initiated, false if a reload was unnecessary or unsupported\n */\n reload(): boolean;\n}\n\n/**\n * A `WritableResource` created through the `resource` function.\n *\n * @publicApi 22.0\n */\nexport interface ResourceRef<T> extends WritableResource<T> {\n hasValue(this: T extends undefined ? this : never): this is ResourceRef<Exclude<T, undefined>>;\n\n hasValue(): boolean;\n /**\n * Manually destroy the resource, which cancels pending requests and returns it to `idle` state.\n */\n destroy(): void;\n}\n\n/**\n * Parameter to a `ResourceLoader` which gives the request and other options for the current loading\n * operation.\n *\n * @publicApi 22.0\n */\nexport interface ResourceLoaderParams<R> {\n params: NoInfer<Exclude<R, undefined>>;\n abortSignal: AbortSignal;\n previous: {\n status: ResourceStatus;\n };\n}\n\n/**\n * Loading function for a `Resource`.\n *\n * @publicApi 22.0\n */\nexport type ResourceLoader<T, R> = (param: ResourceLoaderParams<R>) => PromiseLike<T>;\n\n/**\n * Streaming loader for a `Resource`.\n *\n * @publicApi 22.0\n */\nexport type ResourceStreamingLoader<T, R> = (\n param: ResourceLoaderParams<R>,\n) => Signal<ResourceStreamItem<T>> | PromiseLike<Signal<ResourceStreamItem<T>>> | undefined;\n\n/**\n * Options to the `resource` function, for creating a resource.\n *\n * @publicApi 22.0\n */\nexport interface BaseResourceOptions<T, R> {\n /**\n * A reactive function which determines the request to be made. Whenever the request changes, the\n * loader will be triggered to fetch a new value for the resource.\n *\n * If a params function isn't provided, the loader won't rerun unless the resource is reloaded.\n */\n params?: (ctx: ResourceParamsContext) => R;\n\n /**\n * The value which will be returned from the resource when a server value is unavailable, such as\n * when the resource is still loading.\n */\n defaultValue?: NoInfer<T>;\n\n /**\n * Equality function used to compare the return value of the loader.\n */\n equal?: ValueEqualityFn<T>;\n\n /**\n * Overrides the `Injector` used by `resource`.\n */\n injector?: Injector;\n\n /**\n * Identifier used to cache the resource data in the `TransferState` during server-side rendering and to retrieve it on the client side.\n * This value value needs to be identical for both the client and server.\n */\n id?: string;\n}\n\n/**\n * Options to the `resource` function, for creating a resource.\n *\n * @publicApi 22.0\n */\nexport interface PromiseResourceOptions<T, R> extends BaseResourceOptions<T, R> {\n /**\n * Loading function which returns a `Promise` of the resource's value for a given request.\n */\n loader: ResourceLoader<T, R>;\n\n /**\n * Cannot specify `stream` and `loader` at the same time.\n */\n stream?: never;\n}\n\n/**\n * Options to the `resource` function, for creating a resource.\n *\n * @publicApi 22.0\n */\nexport interface StreamingResourceOptions<T, R> extends BaseResourceOptions<T, R> {\n /**\n * Loading function which returns a `Promise` of a signal of the resource's value for a given\n * request, which can change over time as new values are received from a stream.\n */\n stream: ResourceStreamingLoader<T, R>;\n\n /**\n * Cannot specify `stream` and `loader` at the same time.\n */\n loader?: never;\n}\n\n/**\n * @publicApi 22.0\n */\nexport type ResourceOptions<T, R> = (\n | PromiseResourceOptions<T, R>\n | StreamingResourceOptions<T, R>\n) & {\n /**\n * A debug name for the reactive node. Used in Angular DevTools to identify the node.\n */\n debugName?: string;\n};\n\n/**\n * @publicApi 22.0\n */\nexport type ResourceStreamItem<T> = {value: T} | {error: Error};\n\n/**\n * An explicit representation of a resource's state.\n *\n * @publicApi 22.0\n * @see [Resource composition with snapshots](guide/signals/resource#resource-composition-with-snapshots)\n */\nexport type ResourceSnapshot<T> =\n | {readonly status: 'idle'; readonly value: T}\n | {readonly status: 'loading' | 'reloading'; readonly value: T}\n | {readonly status: 'resolved' | 'local'; readonly value: T}\n | {readonly status: 'error'; readonly error: Error};\n\n/**\n * Options for `debounced`.\n *\n * @see [Debouncing signals with `debounced`](guide/signals/debounced)\n *\n * @experimental 22.0\n */\nexport interface DebouncedOptions<T> {\n /** The `Injector` to use for the debounced resource. */\n injector?: Injector;\n /** The equality function to use for comparing values. */\n equal?: ValueEqualityFn<T>;\n}\n\n/**\n * Represents the wait condition for item debouncing.\n * Can be a number of milliseconds or a function that returns a Promise.\n *\n * @see [Debouncing signals with `debounced`](guide/signals/debounced)\n *\n * @experimental 22.0\n */\nexport type DebounceTimer<T> =\n | number\n | ((value: T, lastValue: ResourceSnapshot<T>) => Promise<void> | void);\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {\n ComputationFn,\n createLinkedSignal,\n LinkedSignalGetter,\n LinkedSignalNode,\n linkedSignalSetFn,\n linkedSignalUpdateFn,\n SIGNAL,\n} from '../../../primitives/signals';\nimport {Signal, ValueEqualityFn} from './api';\nimport {signalAsReadonlyFn, WritableSignal} from './signal';\nimport {untracked} from './untracked';\n\nconst identityFn = <T>(v: T) => v;\n\n/**\n * Creates a writable signal whose value is initialized and reset by the linked, reactive computation.\n *\n * @publicApi 20.0\n */\nexport function linkedSignal<D>(\n computation: () => D,\n options?: {\n equal?: ValueEqualityFn<NoInfer<D>>;\n debugName?: string;\n set?: (value: NoInfer<D>, rawSet: (value: NoInfer<D>) => void) => void;\n },\n): WritableSignal<D>;\n\n/**\n * Creates a writable signal whose value is initialized and reset by the linked, reactive computation.\n * This is an advanced API form where the computation has access to the previous value of the signal and the computation result.\n *\n * Note: The computation is reactive, meaning the linked signal will automatically update whenever any of the signals used within the computation change.\n *\n * @publicApi 20.0\n * @see [Dependent state with linkedSignal](guide/signals/linked-signal)\n */\nexport function linkedSignal<S, D>(options: {\n source: () => S;\n computation: (source: NoInfer<S>, previous?: {source: NoInfer<S>; value: NoInfer<D>}) => D;\n equal?: ValueEqualityFn<NoInfer<D>>;\n debugName?: string;\n set?: (value: NoInfer<D>, rawSet: (value: NoInfer<D>) => void) => void;\n}): WritableSignal<D>;\n\nexport function linkedSignal<S, D>(\n optionsOrComputation:\n | {\n source: () => S;\n computation: ComputationFn<S, D>;\n equal?: ValueEqualityFn<D>;\n debugName?: string;\n set?: (value: D, rawSet: (value: D) => void) => void;\n }\n | (() => D),\n options?: {\n equal?: ValueEqualityFn<D>;\n debugName?: string;\n set?: (value: D, rawSet: (value: D) => void) => void;\n },\n): WritableSignal<D> {\n if (typeof optionsOrComputation === 'function') {\n const getter = createLinkedSignal<D, D>(\n optionsOrComputation,\n identityFn<D>,\n options?.equal,\n ) as LinkedSignalGetter<D, D> & WritableSignal<D>;\n return upgradeLinkedSignalGetter(getter, options?.debugName, options?.set);\n } else {\n const getter = createLinkedSignal<S, D>(\n optionsOrComputation.source,\n optionsOrComputation.computation,\n optionsOrComputation.equal,\n );\n return upgradeLinkedSignalGetter(\n getter,\n optionsOrComputation.debugName,\n optionsOrComputation.set,\n );\n }\n}\n\nfunction upgradeLinkedSignalGetter<S, D>(\n getter: LinkedSignalGetter<S, D>,\n debugName?: string,\n customSet?: (value: D, rawSet: (value: D) => void) => void,\n): WritableSignal<D> {\n if (typeof ngDevMode !== 'undefined' && ngDevMode) {\n getter[SIGNAL].debugName = debugName;\n getter.toString = () => `[LinkedSignal${debugName ? ' (' + debugName + ')' : ''}: ${getter()}]`;\n }\n\n const node = getter[SIGNAL] as LinkedSignalNode<S, D>;\n const upgradedGetter = getter as LinkedSignalGetter<S, D> & WritableSignal<D>;\n\n if (customSet !== undefined) {\n const rawSet = (newValue: D) => linkedSignalSetFn(node, newValue);\n upgradedGetter.set = (newValue: D) => customSet(newValue, rawSet);\n upgradedGetter.update = (updateFn: (value: D) => D) =>\n customSet(updateFn(untracked(getter)), rawSet);\n } else {\n upgradedGetter.set = (newValue: D) => linkedSignalSetFn(node, newValue);\n upgradedGetter.update = (updateFn: (value: D) => D) => linkedSignalUpdateFn(node, updateFn);\n }\n upgradedGetter.asReadonly = signalAsReadonlyFn.bind(getter as any) as () => Signal<D>;\n\n return upgradedGetter;\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {isSignal, Signal, ValueEqualityFn} from '../render3/reactivity/api';\nimport {computed} from '../render3/reactivity/computed';\nimport {effect, EffectRef} from '../render3/reactivity/effect';\nimport {signal, signalAsReadonlyFn, WritableSignal} from '../render3/reactivity/signal';\nimport {untracked} from '../render3/reactivity/untracked';\nimport {\n Resource,\n ResourceDependencyError,\n ResourceOptions,\n ResourceParamsStatus,\n ResourceSnapshot,\n ResourceStatus,\n ResourceStreamingLoader,\n ResourceStreamItem,\n StreamingResourceOptions,\n type ResourceParamsContext,\n type ResourceRef,\n type WritableResource,\n} from './api';\n\nimport {assertInInjectionContext} from '../di/contextual';\nimport {Injector} from '../di/injector';\nimport {inject} from '../di/injector_compatibility';\nimport {RuntimeError, RuntimeErrorCode} from '../errors';\nimport {CACHE_ACTIVE} from '../hydration/cache';\nimport {DestroyRef} from '../linker/destroy_ref';\nimport {PendingTasks} from '../pending_tasks';\nimport {linkedSignal} from '../render3/reactivity/linked_signal';\nimport {StateKey, TransferState} from '../transfer_state';\n\n/**\n * Constructs a `Resource` that projects a reactive request to an asynchronous operation defined by\n * a loader function, which exposes the result of the loading operation via signals.\n *\n * Note that `resource` is intended for _read_ operations, not operations which perform mutations.\n * `resource` will cancel in-progress loads via the `AbortSignal` when destroyed or when a new\n * request object becomes available, which could prematurely abort mutations.\n *\n * @see [Async reactivity with resources](guide/signals/resource)\n *\n * @publicApi 22.0\n */\nexport function resource<T, R>(\n options: ResourceOptions<T, R> & {defaultValue: NoInfer<T>},\n): ResourceRef<T>;\n\n/**\n * Constructs a `Resource` that projects a reactive request to an asynchronous operation defined by\n * a loader function, which exposes the result of the loading operation via signals.\n *\n * Note that `resource` is intended for _read_ operations, not operations which perform mutations.\n * `resource` will cancel in-progress loads via the `AbortSignal` when destroyed or when a new\n * request object becomes available, which could prematurely abort mutations.\n *\n * @publicApi 22.0\n * @see [Async reactivity with resources](guide/signals/resource)\n */\nexport function resource<T, R>(options: ResourceOptions<T, R>): ResourceRef<T | undefined>;\nexport function resource<T, R>(options: ResourceOptions<T, R>): ResourceRef<T | undefined> {\n if (ngDevMode && !options?.injector) {\n assertInInjectionContext(resource);\n }\n\n const oldNameForParams = (\n options as ResourceOptions<T, R> & {request: ResourceOptions<T, R>['params']}\n ).request;\n const params = options.params ?? oldNameForParams ?? (() => null!);\n return new ResourceImpl<T | undefined, R>(\n params,\n getLoader(options),\n options.defaultValue,\n options.equal ? wrapEqualityFn(options.equal) : undefined,\n options.debugName,\n options.injector ?? inject(Injector),\n options.id as StateKey<T>,\n );\n}\n\ntype ResourceInternalStatus = 'idle' | 'loading' | 'resolved' | 'local';\n\n/**\n * Internal state of a resource.\n */\ninterface ResourceProtoState<T> {\n extRequest: WrappedRequest;\n\n // For simplicity, status is internally tracked as a subset of the public status enum.\n // Reloading and Error statuses are projected from Loading and Resolved based on other state.\n status: ResourceInternalStatus;\n}\n\ninterface ResourceState<T> extends ResourceProtoState<T> {\n previousStatus: ResourceStatus;\n stream: Signal<ResourceStreamItem<T>> | undefined;\n}\n\ntype WrappedRequest = {\n request?: unknown;\n reload: number;\n status?: ResourceInternalStatus;\n error?: Error;\n};\n\n/**\n * Base class which implements `.value` as a `WritableSignal` by delegating `.set` and `.update`.\n */\nabstract class BaseWritableResource<T> implements WritableResource<T> {\n readonly value: WritableSignal<T>;\n abstract readonly status: Signal<ResourceStatus>;\n abstract readonly error: Signal<Error | undefined>;\n\n abstract reload(): boolean;\n\n readonly isLoading: Signal<boolean>;\n\n constructor(value: Signal<T>, debugName: string | undefined) {\n this.value = value as WritableSignal<T>;\n this.value.set = this.set.bind(this);\n this.value.update = this.update.bind(this);\n this.value.asReadonly = signalAsReadonlyFn;\n\n this.isLoading = computed(\n () => this.status() === 'loading' || this.status() === 'reloading',\n ngDevMode ? createDebugNameObject(debugName, 'isLoading') : undefined,\n );\n }\n\n abstract set(value: T): void;\n\n private readonly isError = computed(() => this.status() === 'error');\n\n update(updateFn: (value: T) => T): void {\n this.set(updateFn(untracked(this.value)));\n }\n\n // Use a computed here to avoid triggering reactive consumers if the value changes while staying\n // either defined or undefined.\n private readonly isValueDefined = computed(() => {\n // Check if it's in an error state first to prevent the error from bubbling up.\n if (this.isError()) {\n return false;\n }\n\n return this.value() !== undefined;\n });\n\n private _snapshot: Signal<ResourceSnapshot<T>> | undefined;\n get snapshot(): Signal<ResourceSnapshot<T>> {\n return (this._snapshot ??= computed(() => {\n const status = this.status();\n if (status === 'error') {\n return {status: 'error', error: this.error()!};\n } else {\n return {status, value: this.value()};\n }\n }));\n }\n\n hasValue(): this is ResourceRef<Exclude<T, undefined>> {\n return this.isValueDefined();\n }\n\n asReadonly(): Resource<T> {\n return this;\n }\n}\n\n/**\n * Implementation for `resource()` which uses a `linkedSignal` to manage the resource's state.\n */\nexport class ResourceImpl<T, R> extends BaseWritableResource<T> implements ResourceRef<T> {\n private readonly pendingTasks: PendingTasks;\n\n /**\n * The current state of the resource. Status, value, and error are derived from this.\n */\n private readonly state: WritableSignal<ResourceState<T>>;\n\n /**\n * Combines the current request with a reload counter which allows the resource to be reloaded on\n * imperative command.\n */\n protected readonly extRequest: WritableSignal<WrappedRequest>;\n private readonly effectRef: EffectRef;\n\n private pendingController: AbortController | undefined;\n private resolvePendingTask: (() => void) | undefined = undefined;\n private destroyed = false;\n private unregisterOnDestroy: () => void;\n\n override readonly status: Signal<ResourceStatus>;\n override readonly error: Signal<Error | undefined>;\n private readonly transferState: TransferState | undefined;\n\n constructor(\n request: (ctx: ResourceParamsContext) => R,\n private readonly loaderFn: ResourceStreamingLoader<T, R>,\n defaultValue: T,\n private readonly equal: ValueEqualityFn<T> | undefined,\n private readonly debugName: string | undefined,\n injector: Injector,\n private transferCacheKey: StateKey<T> | undefined,\n getInitialStream?: (request: R) => Signal<ResourceStreamItem<T>> | undefined,\n ) {\n if (isInParamsFunction()) {\n throw invalidResourceCreationInParams();\n }\n\n super(\n // Feed a computed signal for the value to `BaseWritableResource`, which will upgrade it to a\n // `WritableSignal` that delegates to `ResourceImpl.set`.\n computed(\n () => {\n const streamValue = this.state().stream?.();\n\n if (!streamValue) {\n return defaultValue;\n }\n\n // Prevents `hasValue()` from throwing an error when a reload happened in the error state\n if (this.state().status === 'loading' && this.error()) {\n return defaultValue;\n }\n\n if (!isResolved(streamValue)) {\n throw new ResourceValueError(this.error()!);\n }\n\n return streamValue.value;\n },\n {equal, ...(ngDevMode ? createDebugNameObject(debugName, 'value') : undefined)},\n ),\n debugName,\n );\n\n const cacheState = injector.get(CACHE_ACTIVE, undefined, {optional: true}) ?? {isActive: false};\n\n this.transferState = injector.get(TransferState, undefined, {optional: true}) ?? undefined;\n\n this.extRequest = linkedSignal<WrappedRequest>(\n () => {\n try {\n setInParamsFunction(true);\n return {request: request(paramsContext), reload: 0};\n } catch (error) {\n rethrowFatalErrors(error);\n if (error === ResourceParamsStatus.IDLE) {\n return {status: 'idle', reload: 0};\n } else if (error === ResourceParamsStatus.LOADING) {\n return {status: 'loading', reload: 0};\n }\n return {error: error as Error, reload: 0};\n } finally {\n setInParamsFunction(false);\n }\n },\n ngDevMode ? createDebugNameObject(debugName, 'extRequest') : undefined,\n );\n\n // The main resource state is managed in a `linkedSignal`, which allows the resource to change\n // state instantaneously when the request signal changes.\n this.state = linkedSignal<WrappedRequest, ResourceState<T>>({\n // Whenever the request changes,\n source: this.extRequest,\n // Compute the state of the resource given a change in status.\n computation: (extRequest, previous) => {\n let {request, status, error} = extRequest;\n let stream: Signal<ResourceStreamItem<T>> | undefined;\n\n if (error) {\n status = 'resolved';\n stream = signal(\n {error: encapsulateResourceError(error)},\n ngDevMode ? createDebugNameObject(this.debugName, 'stream') : undefined,\n );\n } else if (!status) {\n if (!previous) {\n const transferState = this.transferState;\n const cacheKey = this.transferCacheKey;\n if (cacheState.isActive && cacheKey && transferState && request !== undefined) {\n const key = this.transferCacheKey;\n if (transferState.hasKey(cacheKey)) {\n stream = signal(\n {value: transferState.get(cacheKey, defaultValue)},\n ngDevMode ? createDebugNameObject(this.debugName, 'stream') : undefined,\n );\n }\n }\n\n if (!stream) {\n stream = getInitialStream?.(extRequest.request as R);\n }\n // Clear getInitialStream so it doesn't hold onto memory\n getInitialStream = undefined;\n status = request === undefined ? 'idle' : stream ? 'resolved' : 'loading';\n } else {\n status = request === undefined ? 'idle' : 'loading';\n if (previous.value.extRequest.request === request) {\n stream = previous.value.stream;\n }\n }\n }\n\n return {\n extRequest,\n status,\n previousStatus: previous ? projectStatusOfState(previous.value) : 'idle',\n stream,\n };\n },\n ...(ngDevMode ? createDebugNameObject(debugName, 'state') : undefined),\n });\n\n this.effectRef = effect(this.loadEffect.bind(this), {\n injector,\n manualCleanup: true,\n ...(ngDevMode ? createDebugNameObject(debugName, 'loadEffect') : undefined),\n });\n\n this.pendingTasks = injector.get(PendingTasks);\n\n // Cancel any pending request when the resource itself is destroyed.\n this.unregisterOnDestroy = injector.get(DestroyRef).onDestroy(() => this.destroy());\n\n this.status = computed(\n () => projectStatusOfState(this.state()),\n ngDevMode ? createDebugNameObject(debugName, 'status') : undefined,\n );\n\n this.error = computed(\n () => {\n const stream = this.state().stream?.();\n return stream && !isResolved(stream) ? stream.error : undefined;\n },\n ngDevMode ? createDebugNameObject(debugName, 'error') : undefined,\n );\n }\n\n /**\n * Called either directly via `WritableResource.set` or via `.value.set()`.\n */\n override set(value: T): void {\n if (this.destroyed) {\n return;\n }\n\n const error = untracked(this.error);\n const state = untracked(this.state);\n\n if (!error) {\n const current = untracked(this.value);\n if (\n state.status === 'local' &&\n (this.equal ? this.equal(current, value) : current === value)\n ) {\n return;\n }\n }\n\n // Enter Local state with the user-defined value.\n this.state.set({\n extRequest: state.extRequest,\n status: 'local',\n previousStatus: 'local',\n stream: signal(\n {value},\n ngDevMode ? createDebugNameObject(this.debugName, 'stream') : undefined,\n ),\n });\n\n // We're departing from whatever state the resource was in previously, so cancel any in-progress\n // loading operations.\n this.abortInProgressLoad();\n }\n\n override reload(): boolean {\n // We don't want to restart in-progress loads.\n const {status} = untracked(this.state);\n if (status === 'idle' || status === 'loading') {\n return false;\n }\n\n // Increment the request reload to trigger the `state` linked signal to switch us to `Reload`\n this.extRequest.update(({request, reload}) => ({request, reload: reload + 1}));\n return true;\n }\n\n destroy(): void {\n this.destroyed = true;\n this.unregisterOnDestroy();\n this.effectRef.destroy();\n this.abortInProgressLoad();\n\n // Destroyed resources enter Idle state.\n this.state.set({\n extRequest: {request: undefined, reload: 0},\n status: 'idle',\n previousStatus: 'idle',\n stream: undefined,\n });\n }\n\n private async loadEffect(): Promise<void> {\n const extRequest = this.extRequest();\n\n // Capture the previous status before any state transitions. Note that this is `untracked` since\n // we do not want the effect to depend on the state of the resource, only on the request.\n const {status: currentStatus, previousStatus} = untracked(this.state);\n\n if (extRequest.request === undefined) {\n // Nothing to load (and we should already be in a non-loading state).\n return;\n } else if (currentStatus !== 'loading') {\n // We're not in a loading or reloading state, so this loading request is stale.\n return;\n }\n\n // Cancel any previous loading attempts.\n this.abortInProgressLoad();\n\n // Capturing _this_ load's pending task in a local variable is important here. We may attempt to\n // resolve it twice:\n //\n // 1. when the loading function promise resolves/rejects\n // 2. when cancelling the loading operation\n //\n // After the loading operation is cancelled, `this.resolvePendingTask` no longer represents this\n // particular task, but this `await` may eventually resolve/reject. Thus, when we cancel in\n // response to (1) below, we need to cancel the locally saved task.\n let resolvePendingTask: (() => void) | undefined = (this.resolvePendingTask =\n this.pendingTasks.add());\n\n const {signal: abortSignal} = (this.pendingController = new AbortController());\n\n try {\n // The actual loading is run through `untracked` - only the request side of `resource` is\n // reactive. This avoids any confusion with signals tracking or not tracking depending on\n // which side of the `await` they are.\n const stream = untracked(() => {\n return this.loaderFn({\n params: extRequest.request as Exclude<R, undefined>,\n abortSignal,\n previous: {\n status: previousStatus,\n },\n });\n });\n\n // If this request has been aborted, or the current request no longer\n // matches this load, then we should ignore this resolution.\n const shouldDiscard = () => abortSignal.aborted || untracked(this.extRequest) !== extRequest;\n\n if (isSignal(stream)) {\n if (shouldDiscard()) {\n return;\n }\n\n this.state.set({\n extRequest,\n status: 'resolved',\n previousStatus: 'resolved',\n stream,\n });\n\n const result = untracked(stream);\n if (typeof ngServerMode !== 'undefined' && ngServerMode) {\n saveToTransferState(result, this.transferCacheKey, this.transferState);\n }\n } else {\n const resolvedStream = await stream;\n if (shouldDiscard()) {\n return;\n }\n\n this.state.set({\n extRequest,\n status: 'resolved',\n previousStatus: 'resolved',\n stream: resolvedStream,\n });\n\n // Use a local variable for the result so TypeScript can narrow `resolvedStream` correctly.\n const result = resolvedStream ? untracked(resolvedStream) : undefined;\n if (typeof ngServerMode !== 'undefined' && ngServerMode) {\n saveToTransferState(result, this.transferCacheKey, this.transferState);\n }\n }\n } catch (err) {\n rethrowFatalErrors(err);\n if (abortSignal.aborted || untracked(this.extRequest) !== extRequest) {\n return;\n }\n\n this.state.set({\n extRequest,\n status: 'resolved',\n previousStatus: 'error',\n stream: signal(\n {error: encapsulateResourceError(err)},\n ngDevMode ? createDebugNameObject(this.debugName, 'stream') : undefined,\n ),\n });\n } finally {\n // Resolve the pending task now that the resource has a value.\n resolvePendingTask?.();\n resolvePendingTask = undefined;\n }\n }\n\n private abortInProgressLoad(): void {\n untracked(() => this.pendingController?.abort());\n this.pendingController = undefined;\n\n // Once the load is aborted, we no longer want to block stability on its resolution.\n this.resolvePendingTask?.();\n this.resolvePendingTask = undefined;\n }\n}\n\nfunction saveToTransferState<R, T>(\n result: ResourceStreamItem<T> | undefined,\n transferCacheKey: StateKey<T> | undefined,\n transferState: TransferState | undefined,\n): void {\n if (transferCacheKey && transferState && result && isResolved(result)) {\n transferState.set(transferCacheKey, result.value);\n }\n}\n\n/**\n * Wraps an equality function to handle either value being `undefined`.\n */\nfunction wrapEqualityFn<T>(equal: ValueEqualityFn<T>): ValueEqualityFn<T | undefined> {\n return (a, b) => (a === undefined || b === undefined ? a === b : equal(a, b));\n}\n\nfunction getLoader<T, R>(options: ResourceOptions<T, R>): ResourceStreamingLoader<T, R> {\n if (isStreamingResourceOptions(options)) {\n return options.stream;\n }\n\n return async (params) => {\n try {\n return signal(\n {value: await options.loader(params)},\n ngDevMode ? createDebugNameObject(options.debugName, 'stream') : undefined,\n );\n } catch (err) {\n return signal(\n {error: encapsulateResourceError(err)},\n ngDevMode ? createDebugNameObject(options.debugName, 'stream') : undefined,\n );\n }\n };\n}\n\nfunction isStreamingResourceOptions<T, R>(\n options: ResourceOptions<T, R>,\n): options is StreamingResourceOptions<T, R> {\n return !!(options as StreamingResourceOptions<T, R>).stream;\n}\n\n/**\n * Project from a state with `ResourceInternalStatus` to the user-facing `ResourceStatus`\n */\nfunction projectStatusOfState(state: ResourceState<unknown>): ResourceStatus {\n switch (state.status) {\n case 'loading':\n return state.extRequest.reload === 0 ? 'loading' : 'reloading';\n case 'resolved':\n return isResolved(state.stream!()) ? 'resolved' : 'error';\n default:\n return state.status;\n }\n}\n\nfunction isResolved<T>(state: ResourceStreamItem<T>): state is {value: T} {\n return (state as {error: unknown}).error === undefined;\n}\n\n/**\n * Creates a debug name object for an internal signal.\n */\nfunction createDebugNameObject(\n resourceDebugName: string | undefined,\n internalSignalDebugName: string,\n): {debugName?: string} {\n return {\n debugName: `Resource${resourceDebugName ? '#' + resourceDebugName : ''}.${internalSignalDebugName}`,\n };\n}\n\nexport function encapsulateResourceError(error: unknown): Error {\n if (isErrorLike(error)) {\n return error;\n }\n\n return new ResourceWrappedError(error);\n}\n\nexport function isErrorLike(error: unknown): error is Error {\n return (\n error instanceof Error ||\n (typeof error === 'object' &&\n typeof (error as Error).name === 'string' &&\n typeof (error as Error).message === 'string')\n );\n}\n\nexport class ResourceValueError extends Error {\n constructor(error: Error) {\n super(\n ngDevMode\n ? `Resource is currently in an error state (see Error.cause for details): ${error.message}`\n : error.message,\n {cause: error},\n );\n }\n}\n\nclass ResourceWrappedError extends Error {\n constructor(error: unknown) {\n super(\n ngDevMode\n ? `Resource returned an error that's not an Error instance: ${String(error)}. Check this error's .cause for the actual error.`\n : String(error),\n {cause: error},\n );\n }\n}\n\n/**\n * Chains the value of another resource into the params of the current resource, returning the value\n * of the other resource if it is available, or propagating the status to the current resource if it\n * is not.\n */\nexport function chain<T>(resource: Resource<T>): T {\n switch (resource.status()) {\n case 'idle':\n throw ResourceParamsStatus.IDLE;\n case 'error':\n throw new ResourceDependencyError(resource);\n case 'loading':\n case 'reloading':\n throw ResourceParamsStatus.LOADING;\n }\n return resource.value();\n}\n\nexport const paramsContext: ResourceParamsContext = {\n chain,\n};\n\nlet inParamsFunction = false;\n\nexport function isInParamsFunction() {\n return inParamsFunction;\n}\n\nexport function setInParamsFunction(value: boolean) {\n inParamsFunction = value;\n}\n\nexport function invalidResourceCreationInParams(): Error {\n return new RuntimeError(\n RuntimeErrorCode.INVALID_RESOURCE_CREATION_IN_PARAMS,\n ngDevMode && `Cannot create a resource inside the \\`params\\` of another resource`,\n );\n}\n\nexport function rethrowFatalErrors(error: unknown) {\n if (\n error instanceof RuntimeError &&\n error.code === RuntimeErrorCode.INVALID_RESOURCE_CREATION_IN_PARAMS\n ) {\n throw error;\n }\n}\n"],"names":["OutputEmitterRef","destroyed","listeners","errorHandler","inject","ErrorHandler","optional","destroyRef","DestroyRef","constructor","onDestroy","subscribe","callback","RuntimeError","ngDevMode","push","unsubscribe","idx","indexOf","undefined","splice","emit","value","console","warn","formatRuntimeError","previousConsumer","setActiveConsumer","listenerFn","err","handleError","getOutputDestroyRef","ref","CACHE_ACTIVE","InjectionToken","computed","computation","options","getter","createComputed","equal","debugName","SIGNAL","toString","untracked","nonReactiveReadsFn","untrackedPrimitive","ResourceDependencyError","Error","dependency","cause","error","name","ResourceParamsStatus","_brand","msg","IDLE","LOADING","identityFn","v","linkedSignal","optionsOrComputation","createLinkedSignal","upgradeLinkedSignalGetter","set","source","customSet","node","upgradedGetter","rawSet","newValue","linkedSignalSetFn","update","updateFn","linkedSignalUpdateFn","asReadonly","signalAsReadonlyFn","bind","resource","injector","assertInInjectionContext","oldNameForParams","request","params","ResourceImpl","getLoader","defaultValue","wrapEqualityFn","Injector","id","BaseWritableResource","isLoading","status","createDebugNameObject","isError","isValueDefined","_snapshot","snapshot","hasValue","loaderFn","transferCacheKey","pendingTasks","state","extRequest","effectRef","pendingController","resolvePendingTask","unregisterOnDestroy","transferState","getInitialStream","isInParamsFunction","invalidResourceCreationInParams","streamValue","stream","isResolved","ResourceValueError","cacheState","get","isActive","TransferState","setInParamsFunction","paramsContext","reload","rethrowFatalErrors","previous","signal","encapsulateResourceError","cacheKey","hasKey","previousStatus","projectStatusOfState","effect","loadEffect","manualCleanup","PendingTasks","destroy","current","abortInProgressLoad","currentStatus","add","abortSignal","AbortController","shouldDiscard","aborted","isSignal","result","ngServerMode","saveToTransferState","resolvedStream","abort","a","b","isStreamingResourceOptions","loader","resourceDebugName","internalSignalDebugName","isErrorLike","ResourceWrappedError","message","String","chain","inParamsFunction","code"],"mappings":"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"}
/**
* @license Angular v22.0.1
* @license Angular v22.1.0-next.0
* (c) 2010-2026 Google LLC. https://angular.dev/

@@ -4,0 +4,0 @@ * License: MIT

/**
* @license Angular v22.0.1
* @license Angular v22.1.0-next.0
* (c) 2010-2026 Google LLC. https://angular.dev/

@@ -4,0 +4,0 @@ * License: MIT

/**
* @license Angular v22.0.1
* @license Angular v22.1.0-next.0
* (c) 2010-2026 Google LLC. https://angular.dev/

@@ -4,0 +4,0 @@ * License: MIT

/**
* @license Angular v22.0.1
* @license Angular v22.1.0-next.0
* (c) 2010-2026 Google LLC. https://angular.dev/

@@ -4,0 +4,0 @@ * License: MIT

/**
* @license Angular v22.0.1
* @license Angular v22.1.0-next.0
* (c) 2010-2026 Google LLC. https://angular.dev/

@@ -4,0 +4,0 @@ * License: MIT

/**
* @license Angular v22.0.1
* @license Angular v22.1.0-next.0
* (c) 2010-2026 Google LLC. https://angular.dev/

@@ -4,0 +4,0 @@ * License: MIT

{
"name": "@angular/core",
"version": "22.0.1",
"version": "22.1.0-next.0",
"description": "Angular - the core framework",

@@ -49,7 +49,7 @@ "author": "angular",

"devDependencies": {
"@mcp-b/webmcp-polyfill": "^2.2.0",
"@mcp-b/webmcp-types": "^2.2.0"
"@mcp-b/webmcp-polyfill": "^3.0.0",
"@mcp-b/webmcp-types": "^3.0.0"
},
"peerDependencies": {
"@angular/compiler": "22.0.1",
"@angular/compiler": "22.1.0-next.0",
"rxjs": "^6.5.3 || ^7.4.0",

@@ -56,0 +56,0 @@ "zone.js": "~0.15.0 || ~0.16.0"

@@ -29,3 +29,5 @@ You are an expert in TypeScript, Angular, and scalable web application development. You write functional, maintainable, performant, and accessible code following Angular and TypeScript best practices.

- Use `input()` and `output()` functions instead of decorators
- Use `model()` for two-way bound properties with `[(prop)]` syntax instead of pairing `input()` with `output()`
- Use `computed()` for derived state
- Use `linkedSignal()` for state derived from multiple reactive sources that must stay synchronized
- Prefer inline templates for small components

@@ -32,0 +34,0 @@ - Prefer Signal Forms (`@angular/forms/signals`) for new forms. They are stable in Angular v22+ and provide signal-based state, type-safe field access, and schema-based validation

'use strict';
/**
* @license Angular v22.0.1
* @license Angular v22.1.0-next.0
* (c) 2010-2026 Google LLC. https://angular.dev/

@@ -5,0 +5,0 @@ * License: MIT

'use strict';
/**
* @license Angular v22.0.1
* @license Angular v22.1.0-next.0
* (c) 2010-2026 Google LLC. https://angular.dev/

@@ -5,0 +5,0 @@ * License: MIT

'use strict';
/**
* @license Angular v22.0.1
* @license Angular v22.1.0-next.0
* (c) 2010-2026 Google LLC. https://angular.dev/

@@ -5,0 +5,0 @@ * License: MIT

'use strict';
/**
* @license Angular v22.0.1
* @license Angular v22.1.0-next.0
* (c) 2010-2026 Google LLC. https://angular.dev/

@@ -5,0 +5,0 @@ * License: MIT

'use strict';
/**
* @license Angular v22.0.1
* @license Angular v22.1.0-next.0
* (c) 2010-2026 Google LLC. https://angular.dev/

@@ -5,0 +5,0 @@ * License: MIT

'use strict';
/**
* @license Angular v22.0.1
* @license Angular v22.1.0-next.0
* (c) 2010-2026 Google LLC. https://angular.dev/

@@ -5,0 +5,0 @@ * License: MIT

'use strict';
/**
* @license Angular v22.0.1
* @license Angular v22.1.0-next.0
* (c) 2010-2026 Google LLC. https://angular.dev/

@@ -5,0 +5,0 @@ * License: MIT

'use strict';
/**
* @license Angular v22.0.1
* @license Angular v22.1.0-next.0
* (c) 2010-2026 Google LLC. https://angular.dev/

@@ -5,0 +5,0 @@ * License: MIT

'use strict';
/**
* @license Angular v22.0.1
* @license Angular v22.1.0-next.0
* (c) 2010-2026 Google LLC. https://angular.dev/

@@ -5,0 +5,0 @@ * License: MIT

'use strict';
/**
* @license Angular v22.0.1
* @license Angular v22.1.0-next.0
* (c) 2010-2026 Google LLC. https://angular.dev/

@@ -11,3 +11,3 @@ * License: MIT

var path = require('path');
var compiler_host = require('./compiler_host-CY14HvaP.cjs');
var change_tracker = require('./change_tracker-BzE4pgz5.cjs');
var ts = require('typescript');

@@ -667,3 +667,3 @@ var ng_decorators = require('./ng_decorators-IVztR9rk.cjs');

const printer = ts.createPrinter();
const tracker = new compiler_host.ChangeTracker(printer);
const tracker = new change_tracker.ChangeTracker(printer);
analysis.classes.forEach(({ node, constructor, superCall }) => {

@@ -1333,3 +1333,3 @@ const memberIndentation = leading_space.getLeadingLineWhitespaceOfNode(node.members[0]);

}
pathToMigrate = compiler_host.normalizePath(path.join(basePath, options.path));
pathToMigrate = change_tracker.normalizePath(path.join(basePath, options.path));
}

@@ -1344,7 +1344,7 @@ const { buildPaths, testPaths } = await project_tsconfig_paths.getProjectTsConfigPaths(tree);

for (const tsconfigPath of allPaths) {
const program = compiler_host.createMigrationProgram(tree, tsconfigPath, basePath);
const program = change_tracker.createMigrationProgram(tree, tsconfigPath, basePath);
const sourceFiles = program
.getSourceFiles()
.filter((sourceFile) => (pathToMigrate ? sourceFile.fileName.startsWith(pathToMigrate) : true) &&
compiler_host.canMigrateFile(basePath, sourceFile, program));
change_tracker.canMigrateFile(basePath, sourceFile, program));
sourceFilesCount += runInjectMigration(tree, sourceFiles, basePath, options);

@@ -1351,0 +1351,0 @@ }

'use strict';
/**
* @license Angular v22.0.1
* @license Angular v22.1.0-next.0
* (c) 2010-2026 Google LLC. https://angular.dev/

@@ -5,0 +5,0 @@ * License: MIT

'use strict';
/**
* @license Angular v22.0.1
* @license Angular v22.1.0-next.0
* (c) 2010-2026 Google LLC. https://angular.dev/

@@ -5,0 +5,0 @@ * License: MIT

'use strict';
/**
* @license Angular v22.0.1
* @license Angular v22.1.0-next.0
* (c) 2010-2026 Google LLC. https://angular.dev/

@@ -5,0 +5,0 @@ * License: MIT

'use strict';
/**
* @license Angular v22.0.1
* @license Angular v22.1.0-next.0
* (c) 2010-2026 Google LLC. https://angular.dev/

@@ -5,0 +5,0 @@ * License: MIT

'use strict';
/**
* @license Angular v22.0.1
* @license Angular v22.1.0-next.0
* (c) 2010-2026 Google LLC. https://angular.dev/

@@ -5,0 +5,0 @@ * License: MIT

'use strict';
/**
* @license Angular v22.0.1
* @license Angular v22.1.0-next.0
* (c) 2010-2026 Google LLC. https://angular.dev/

@@ -5,0 +5,0 @@ * License: MIT

'use strict';
/**
* @license Angular v22.0.1
* @license Angular v22.1.0-next.0
* (c) 2010-2026 Google LLC. https://angular.dev/

@@ -5,0 +5,0 @@ * License: MIT

'use strict';
/**
* @license Angular v22.0.1
* @license Angular v22.1.0-next.0
* (c) 2010-2026 Google LLC. https://angular.dev/

@@ -5,0 +5,0 @@ * License: MIT

'use strict';
/**
* @license Angular v22.0.1
* @license Angular v22.1.0-next.0
* (c) 2010-2026 Google LLC. https://angular.dev/

@@ -5,0 +5,0 @@ * License: MIT

'use strict';
/**
* @license Angular v22.0.1
* @license Angular v22.1.0-next.0
* (c) 2010-2026 Google LLC. https://angular.dev/

@@ -5,0 +5,0 @@ * License: MIT

'use strict';
/**
* @license Angular v22.0.1
* @license Angular v22.1.0-next.0
* (c) 2010-2026 Google LLC. https://angular.dev/

@@ -5,0 +5,0 @@ * License: MIT

'use strict';
/**
* @license Angular v22.0.1
* @license Angular v22.1.0-next.0
* (c) 2010-2026 Google LLC. https://angular.dev/

@@ -5,0 +5,0 @@ * License: MIT

'use strict';
/**
* @license Angular v22.0.1
* @license Angular v22.1.0-next.0
* (c) 2010-2026 Google LLC. https://angular.dev/

@@ -12,3 +12,3 @@ * License: MIT

var path = require('path');
var compiler_host = require('./compiler_host-CY14HvaP.cjs');
var change_tracker = require('./change_tracker-BzE4pgz5.cjs');
var project_tsconfig_paths = require('./project_tsconfig_paths-DkkMibv-.cjs');

@@ -132,3 +132,3 @@ var ts = require('typescript');

const printer = ts.createPrinter();
const tracker = new compiler_host.ChangeTracker(printer);
const tracker = new change_tracker.ChangeTracker(printer);
const routeArraysToMigrate = findRoutesArrayToMigrate(sourceFile, typeChecker);

@@ -387,3 +387,3 @@ if (routeArraysToMigrate.length === 0) {

// string matching such as `sourceFile.fileName.startsWith(pathToMigrate)` might not work.
const pathToMigrate = compiler_host.normalizePath(path.join(basePath, options.path));
const pathToMigrate = change_tracker.normalizePath(path.join(basePath, options.path));
if (!buildPaths.length) {

@@ -423,7 +423,7 @@ throw new schematics.SchematicsException('Could not find any tsconfig file. Cannot run the route lazy loading migration.');

}
const program = compiler_host.createMigrationProgram(tree, tsconfigPath, basePath);
const program = change_tracker.createMigrationProgram(tree, tsconfigPath, basePath);
const sourceFiles = program
.getSourceFiles()
.filter((sourceFile) => sourceFile.fileName.startsWith(pathToMigrate) &&
compiler_host.canMigrateFile(basePath, sourceFile, program));
change_tracker.canMigrateFile(basePath, sourceFile, program));
const migratedRoutes = [];

@@ -430,0 +430,0 @@ const skippedRoutes = [];

'use strict';
/**
* @license Angular v22.0.1
* @license Angular v22.1.0-next.0
* (c) 2010-2026 Google LLC. https://angular.dev/

@@ -5,0 +5,0 @@ * License: MIT

'use strict';
/**
* @license Angular v22.0.1
* @license Angular v22.1.0-next.0
* (c) 2010-2026 Google LLC. https://angular.dev/

@@ -5,0 +5,0 @@ * License: MIT

'use strict';
/**
* @license Angular v22.0.1
* @license Angular v22.1.0-next.0
* (c) 2010-2026 Google LLC. https://angular.dev/

@@ -5,0 +5,0 @@ * License: MIT

'use strict';
/**
* @license Angular v22.0.1
* @license Angular v22.1.0-next.0
* (c) 2010-2026 Google LLC. https://angular.dev/

@@ -5,0 +5,0 @@ * License: MIT

'use strict';
/**
* @license Angular v22.0.1
* @license Angular v22.1.0-next.0
* (c) 2010-2026 Google LLC. https://angular.dev/

@@ -5,0 +5,0 @@ * License: MIT

'use strict';
/**
* @license Angular v22.0.1
* @license Angular v22.1.0-next.0
* (c) 2010-2026 Google LLC. https://angular.dev/

@@ -5,0 +5,0 @@ * License: MIT

'use strict';
/**
* @license Angular v22.0.1
* @license Angular v22.1.0-next.0
* (c) 2010-2026 Google LLC. https://angular.dev/

@@ -5,0 +5,0 @@ * License: MIT

/**
* @license Angular v22.0.1
* @license Angular v22.1.0-next.0
* (c) 2010-2026 Google LLC. https://angular.dev/

@@ -4,0 +4,0 @@ * License: MIT

/**
* @license Angular v22.0.1
* @license Angular v22.1.0-next.0
* (c) 2010-2026 Google LLC. https://angular.dev/

@@ -4,0 +4,0 @@ * License: MIT

/**
* @license Angular v22.0.1
* @license Angular v22.1.0-next.0
* (c) 2010-2026 Google LLC. https://angular.dev/

@@ -4,0 +4,0 @@ * License: MIT

/**
* @license Angular v22.0.1
* @license Angular v22.1.0-next.0
* (c) 2010-2026 Google LLC. https://angular.dev/

@@ -4,0 +4,0 @@ * License: MIT

/**
* @license Angular v22.0.1
* @license Angular v22.1.0-next.0
* (c) 2010-2026 Google LLC. https://angular.dev/

@@ -4,0 +4,0 @@ * License: MIT

/**
* @license Angular v22.0.1
* @license Angular v22.1.0-next.0
* (c) 2010-2026 Google LLC. https://angular.dev/

@@ -4,0 +4,0 @@ * License: MIT

/**
* @license Angular v22.0.1
* @license Angular v22.1.0-next.0
* (c) 2010-2026 Google LLC. https://angular.dev/

@@ -4,0 +4,0 @@ * License: MIT

/**
* @license Angular v22.0.1
* @license Angular v22.1.0-next.0
* (c) 2010-2026 Google LLC. https://angular.dev/

@@ -4,0 +4,0 @@ * License: MIT

/**
* @license Angular v22.0.1
* @license Angular v22.1.0-next.0
* (c) 2010-2026 Google LLC. https://angular.dev/

@@ -4,0 +4,0 @@ * License: MIT

/**
* @license Angular v22.0.1
* @license Angular v22.1.0-next.0
* (c) 2010-2026 Google LLC. https://angular.dev/

@@ -4,0 +4,0 @@ * License: MIT

/**
* @license Angular v22.0.1
* @license Angular v22.1.0-next.0
* (c) 2010-2026 Google LLC. https://angular.dev/

@@ -4,0 +4,0 @@ * License: MIT

'use strict';
/**
* @license Angular v22.0.1
* (c) 2010-2026 Google LLC. https://angular.dev/
* License: MIT
*/
'use strict';
var ts = require('typescript');
var migrations = require('@angular/compiler-cli/private/migrations');
var path = require('path');
function _interopNamespaceDefault(e) {
var n = Object.create(null);
if (e) {
Object.keys(e).forEach(function (k) {
if (k !== 'default') {
var d = Object.getOwnPropertyDescriptor(e, k);
Object.defineProperty(n, k, d.get ? d : {
enumerable: true,
get: function () { return e[k]; }
});
}
});
}
n.default = e;
return Object.freeze(n);
}
var path__namespace = /*#__PURE__*/_interopNamespaceDefault(path);
/** Tracks changes that have to be made for specific files. */
class ChangeTracker {
_printer;
_importRemapper;
_changes = new Map();
_importManager;
_quotesCache = new WeakMap();
constructor(_printer, _importRemapper) {
this._printer = _printer;
this._importRemapper = _importRemapper;
this._importManager = new migrations.ImportManager({
shouldUseSingleQuotes: (file) => this._getQuoteKind(file) === 0 /* QuoteKind.SINGLE */,
});
}
/**
* Tracks the insertion of some text.
* @param sourceFile File in which the text is being inserted.
* @param start Index at which the text is insert.
* @param text Text to be inserted.
*/
insertText(sourceFile, index, text) {
this._trackChange(sourceFile, { start: index, text });
}
/**
* Replaces text within a file.
* @param sourceFile File in which to replace the text.
* @param start Index from which to replace the text.
* @param removeLength Length of the text being replaced.
* @param text Text to be inserted instead of the old one.
*/
replaceText(sourceFile, start, removeLength, text) {
this._trackChange(sourceFile, { start, removeLength, text });
}
/**
* Replaces the text of an AST node with a new one.
* @param oldNode Node to be replaced.
* @param newNode New node to be inserted.
* @param emitHint Hint when formatting the text of the new node.
* @param sourceFileWhenPrinting File to use when printing out the new node. This is important
* when copying nodes from one file to another, because TypeScript might not output literal nodes
* without it.
*/
replaceNode(oldNode, newNode, emitHint = ts.EmitHint.Unspecified, sourceFileWhenPrinting) {
const sourceFile = oldNode.getSourceFile();
this.replaceText(sourceFile, oldNode.getStart(), oldNode.getWidth(), this._printer.printNode(emitHint, newNode, sourceFileWhenPrinting || sourceFile));
}
/**
* Removes the text of an AST node from a file.
* @param node Node whose text should be removed.
* @param useFullOffsets Whether to remove the node using its full offset (e.g. `getFullStart`
* rather than `fullStart`). This has the advantage of removing any comments that may be tied
* to the node, but can lead to too much code being deleted.
*/
removeNode(node, useFullOffsets = false) {
this._trackChange(node.getSourceFile(), {
start: useFullOffsets ? node.getFullStart() : node.getStart(),
removeLength: useFullOffsets ? node.getFullWidth() : node.getWidth(),
text: '',
});
}
/**
* Adds an import to a file.
* @param sourceFile File to which to add the import.
* @param symbolName Symbol being imported.
* @param moduleName Module from which the symbol is imported.
* @param alias Alias to use for the import.
*/
addImport(sourceFile, symbolName, moduleName, alias) {
if (this._importRemapper) {
moduleName = this._importRemapper(moduleName, sourceFile.fileName);
}
// It's common for paths to be manipulated with Node's `path` utilties which
// can yield a path with back slashes. Normalize them since outputting such
// paths will also cause TS to escape the forward slashes.
moduleName = normalizePath(moduleName);
if (!this._changes.has(sourceFile)) {
this._changes.set(sourceFile, []);
}
return this._importManager.addImport({
requestedFile: sourceFile,
exportSymbolName: symbolName,
exportModuleSpecifier: moduleName,
unsafeAliasOverride: alias,
});
}
/**
* Removes an import from a file.
* @param sourceFile File from which to remove the import.
* @param symbolName Original name of the symbol to be removed. Used even if the import is aliased.
* @param moduleName Module from which the symbol is imported.
*/
removeImport(sourceFile, symbolName, moduleName) {
// It's common for paths to be manipulated with Node's `path` utilties which
// can yield a path with back slashes. Normalize them since outputting such
// paths will also cause TS to escape the forward slashes.
moduleName = normalizePath(moduleName);
if (!this._changes.has(sourceFile)) {
this._changes.set(sourceFile, []);
}
this._importManager.removeImport(sourceFile, symbolName, moduleName);
}
/**
* Gets the changes that should be applied to all the files in the migration.
* The changes are sorted in the order in which they should be applied.
*/
recordChanges() {
this._recordImports();
return this._changes;
}
/**
* Clear the tracked changes
*/
clearChanges() {
this._changes.clear();
}
/**
* Adds a change to a `ChangesByFile` map.
* @param file File that the change is associated with.
* @param change Change to be added.
*/
_trackChange(file, change) {
const changes = this._changes.get(file);
if (changes) {
// Insert the changes in reverse so that they're applied in reverse order.
// This ensures that the offsets of subsequent changes aren't affected by
// previous changes changing the file's text.
const insertIndex = changes.findIndex((current) => current.start <= change.start);
if (insertIndex === -1) {
changes.push(change);
}
else {
changes.splice(insertIndex, 0, change);
}
}
else {
this._changes.set(file, [change]);
}
}
/** Determines what kind of quotes to use for a specific file. */
_getQuoteKind(sourceFile) {
if (this._quotesCache.has(sourceFile)) {
return this._quotesCache.get(sourceFile);
}
let kind = 0 /* QuoteKind.SINGLE */;
for (const statement of sourceFile.statements) {
if (ts.isImportDeclaration(statement) && ts.isStringLiteral(statement.moduleSpecifier)) {
kind = statement.moduleSpecifier.getText()[0] === '"' ? 1 /* QuoteKind.DOUBLE */ : 0 /* QuoteKind.SINGLE */;
this._quotesCache.set(sourceFile, kind);
break;
}
}
return kind;
}
/** Records the pending import changes from the import manager. */
_recordImports() {
const { newImports, updatedImports, deletedImports } = this._importManager.finalize();
for (const [original, replacement] of updatedImports) {
this.replaceNode(original, replacement);
}
for (const node of deletedImports) {
this.removeNode(node);
}
for (const [sourceFile] of this._changes) {
const importsToAdd = newImports.get(sourceFile.fileName);
if (!importsToAdd) {
continue;
}
const importLines = [];
let lastImport = null;
for (const statement of sourceFile.statements) {
if (ts.isImportDeclaration(statement)) {
lastImport = statement;
}
}
for (const decl of importsToAdd) {
importLines.push(this._printer.printNode(ts.EmitHint.Unspecified, decl, sourceFile));
}
this.insertText(sourceFile, lastImport ? lastImport.getEnd() : 0, (lastImport ? '\n' : '') + importLines.join('\n'));
}
}
}
/** Normalizes a path to use posix separators. */
function normalizePath(path) {
return path.replace(/\\/g, '/');
}
function parseTsconfigFile(tsconfigPath, basePath) {
const { config } = ts.readConfigFile(tsconfigPath, ts.sys.readFile);
const parseConfigHost = {
useCaseSensitiveFileNames: ts.sys.useCaseSensitiveFileNames,
fileExists: ts.sys.fileExists,
readDirectory: ts.sys.readDirectory,
readFile: ts.sys.readFile,
};
// Throw if incorrect arguments are passed to this function. Passing relative base paths
// results in root directories not being resolved and in later type checking runtime errors.
// More details can be found here: https://github.com/microsoft/TypeScript/issues/37731.
if (!path__namespace.isAbsolute(basePath)) {
throw Error('Unexpected relative base path has been specified.');
}
return ts.parseJsonConfigFileContent(config, parseConfigHost, basePath, {});
}
/**
* Creates a TypeScript program instance for a TypeScript project within
* the virtual file system tree.
* @param tree Virtual file system tree that contains the source files.
* @param tsconfigPath Virtual file system path that resolves to the TypeScript project.
* @param basePath Base path for the virtual file system tree.
* @param fakeFileRead Optional file reader function. Can be used to overwrite files in
* the TypeScript program, or to add in-memory files (e.g. to add global types).
* @param additionalFiles Additional file paths that should be added to the program.
*/
function createMigrationProgram(tree, tsconfigPath, basePath, fakeFileRead, additionalFiles) {
const { rootNames, options, host } = createProgramOptions(tree, tsconfigPath, basePath, fakeFileRead);
return ts.createProgram(rootNames, options, host);
}
/**
* Creates the options necessary to instantiate a TypeScript program.
* @param tree Virtual file system tree that contains the source files.
* @param tsconfigPath Virtual file system path that resolves to the TypeScript project.
* @param basePath Base path for the virtual file system tree.
* @param fakeFileRead Optional file reader function. Can be used to overwrite files in
* the TypeScript program, or to add in-memory files (e.g. to add global types).
* @param additionalFiles Additional file paths that should be added to the program.
* @param optionOverrides Overrides of the parsed compiler options.
*/
function createProgramOptions(tree, tsconfigPath, basePath, fakeFileRead, additionalFiles, optionOverrides) {
// Resolve the tsconfig path to an absolute path. This is needed as TypeScript otherwise
// is not able to resolve root directories in the given tsconfig. More details can be found
// in the following issue: https://github.com/microsoft/TypeScript/issues/37731.
tsconfigPath = path.resolve(basePath, tsconfigPath);
const parsed = parseTsconfigFile(tsconfigPath, path.dirname(tsconfigPath));
const options = optionOverrides ? { ...parsed.options, ...optionOverrides } : parsed.options;
const host = createMigrationCompilerHost(tree, options, basePath, fakeFileRead);
return { rootNames: parsed.fileNames.concat([]), options, host };
}
function createMigrationCompilerHost(tree, options, basePath, fakeRead) {
const host = ts.createCompilerHost(options, true);
const defaultReadFile = host.readFile;
// We need to overwrite the host "readFile" method, as we want the TypeScript
// program to be based on the file contents in the virtual file tree. Otherwise
// if we run multiple migrations we might have intersecting changes and
// source files.
host.readFile = (fileName) => {
const treeRelativePath = path.relative(basePath, fileName);
let result = fakeRead?.(treeRelativePath);
if (typeof result !== 'string') {
// If the relative path resolved to somewhere outside of the tree, fall back to
// TypeScript's default file reading function since the `tree` will throw an error.
result = treeRelativePath.startsWith('..')
? defaultReadFile.call(host, fileName)
: tree.read(treeRelativePath)?.toString();
}
// Strip BOM as otherwise TSC methods (Ex: getWidth) will return an offset,
// which breaks the CLI UpdateRecorder.
// See: https://github.com/angular/angular/pull/30719
return typeof result === 'string' ? result.replace(/^\uFEFF/, '') : undefined;
};
return host;
}
/**
* Checks whether a file can be migrate by our automated migrations.
* @param basePath Absolute path to the project.
* @param sourceFile File being checked.
* @param program Program that includes the source file.
*/
function canMigrateFile(basePath, sourceFile, program) {
// We shouldn't migrate .d.ts files, files from an external library or type checking files.
if (sourceFile.fileName.endsWith('.ngtypecheck.ts') ||
sourceFile.isDeclarationFile ||
program.isSourceFileFromExternalLibrary(sourceFile)) {
return false;
}
// Our migrations are set up to create a `Program` from the project's tsconfig and to migrate all
// the files within the program. This can include files that are outside of the Angular CLI
// project. We can't migrate files outside of the project, because our file system interactions
// go through the CLI's `Tree` which assumes that all files are within the project. See:
// https://github.com/angular/angular-cli/blob/0b0961c9c233a825b6e4bb59ab7f0790f9b14676/packages/angular_devkit/schematics/src/tree/host-tree.ts#L131
return !path.relative(basePath, sourceFile.fileName).startsWith('..');
}
exports.ChangeTracker = ChangeTracker;
exports.canMigrateFile = canMigrateFile;
exports.createMigrationProgram = createMigrationProgram;
exports.createProgramOptions = createProgramOptions;
exports.normalizePath = normalizePath;

Sorry, the diff of this file is too big to display

Sorry, the diff of this file is too big to display

Sorry, the diff of this file is too big to display

Sorry, the diff of this file is too big to display

Sorry, the diff of this file is too big to display

Sorry, the diff of this file is too big to display

Sorry, the diff of this file is too big to display

Sorry, the diff of this file is too big to display

Sorry, the diff of this file is too big to display

Sorry, the diff of this file is too big to display

Sorry, the diff of this file is too big to display

Sorry, the diff of this file is too big to display

Sorry, the diff of this file is too big to display

Sorry, the diff of this file is too big to display

Sorry, the diff of this file is too big to display

Sorry, the diff of this file is too big to display