UNPKG

static-injector

Version:

Angular 依赖注入独立版本;Angular dependency injection standalone version

1,524 lines (1,484 loc) 83.5 kB
"use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); // src/import/index.ts var import_exports = {}; __export(import_exports, { ChangeDetectionScheduler: () => ChangeDetectionScheduler, ChangeDetectionSchedulerImpl: () => ChangeDetectionSchedulerImpl, DecoratorFlags: () => DecoratorFlags, DestroyRef: () => DestroyRef, EffectScheduler: () => EffectScheduler, EnvironmentInjector: () => EnvironmentInjector, ErrorHandler: () => ErrorHandler, INJECTOR_SCOPE: () => INJECTOR_SCOPE, INTERNAL_APPLICATION_ERROR_HANDLER: () => INTERNAL_APPLICATION_ERROR_HANDLER, Inject: () => Inject, Injectable: () => Injectable, InjectionToken: () => InjectionToken, Injector: () => Injector, InternalInjectFlags: () => InternalInjectFlags, NG_INJ_DEF: () => NG_INJ_DEF, NG_PROV_DEF: () => NG_PROV_DEF, NG_TEMP_TOKEN_PATH: () => NG_TEMP_TOKEN_PATH, NotificationSource: () => NotificationSource, NullInjector: () => NullInjector, Optional: () => Optional, PROVIDED_ZONELESS: () => PROVIDED_ZONELESS, PendingTasks: () => PendingTasks, PendingTasksInternal: () => PendingTasksInternal, R3Injector: () => R3Injector, RetrievingInjector: () => RetrievingInjector, RootStaticInjectOptions: () => RootStaticInjectOptions, SCHEDULE_IN_ROOT_ZONE: () => SCHEDULE_IN_ROOT_ZONE, SOURCE: () => SOURCE, Self: () => Self, SkipSelf: () => SkipSelf, StaticInjectOptions: () => StaticInjectOptions, THROW_IF_NOT_FOUND: () => THROW_IF_NOT_FOUND, ZONELESS_ENABLED: () => ZONELESS_ENABLED, ZONELESS_SCHEDULER_DISABLED: () => ZONELESS_SCHEDULER_DISABLED, assertNotDestroyed: () => assertNotDestroyed, assertNotInReactiveContext: () => assertNotInReactiveContext, attachInjectFlag: () => attachInjectFlag, computed: () => computed, convertToBitFlags: () => convertToBitFlags, createInjector: () => createInjector2, createRootInjector: () => createRootInjector, effect: () => effect, formatError: () => formatError, getCurrentInjector: () => getCurrentInjector, getInheritedInjectableDef: () => getInheritedInjectableDef, getInjectFlag: () => getInjectFlag, getInjectableDef: () => getInjectableDef, getInjectorDef: () => getInjectorDef, getNullInjector: () => getNullInjector, inject: () => inject2, injectArgs: () => injectArgs, injectInjectorOnly: () => injectInjectorOnly, isInjectable: () => isInjectable, isSignal: () => isSignal2, linkedSignal: () => linkedSignal, providerToFactory: () => providerToFactory, resource: () => resource, setCurrentInjector: () => setCurrentInjector, signal: () => signal, untracked: () => untracked2, ɵEffectScheduler: () => EffectScheduler, ɵSIGNAL: () => SIGNAL, ɵunwrapWritableSignal: () => ɵunwrapWritableSignal, ɵɵdefineInjectable: () => ɵɵdefineInjectable, ɵɵdefineInjector: () => ɵɵdefineInjector, ɵɵinject: () => ɵɵinject, ɵɵinvalidFactory: () => ɵɵinvalidFactory, ɵɵinvalidFactoryDep: () => ɵɵinvalidFactoryDep }); module.exports = __toCommonJS(import_exports); // script/shim.js var ngDevMode = typeof ngDevMode === "undefined" ? true : ngDevMode; // src/import/di/interface/provider.ts function isEnvironmentProviders(value) { return value && !!value.ɵproviders; } // src/import/errors.ts var RuntimeError = class extends Error { constructor(code, message) { super(formatRuntimeError(code, message)); this.code = code; } }; function formatRuntimeErrorCode(code) { return `NG0${Math.abs(code)}`; } function formatRuntimeError(code, message) { const fullCode = formatRuntimeErrorCode(code); let errorMessage = `${fullCode}${message ? ": " + message : ""}`; if (ngDevMode && code < 0) { const addPeriodSeparator = !errorMessage.match(/[.,;!?\n]$/); const separator = addPeriodSeparator ? "." : ""; errorMessage = `${errorMessage}${separator} Find more at ${"https://v20.angular.dev/errors"}/${fullCode}`; } return errorMessage; } // src/import/util/property.ts function getClosureSafeProperty(objWithPropertyToExtract) { for (const key in objWithPropertyToExtract) { if (objWithPropertyToExtract[key] === getClosureSafeProperty) { return key; } } throw Error(typeof ngDevMode !== "undefined" && ngDevMode ? "Could not find renamed property on target object." : ""); } // src/import/util/stringify.ts function stringify(token) { if (typeof token === "string") { return token; } if (Array.isArray(token)) { return `[${token.map(stringify).join(", ")}]`; } if (token == null) { return "" + token; } const name = token.overriddenName || token.name; if (name) { return `${name}`; } const result = token.toString(); if (result == null) { return "" + result; } const newLineIndex = result.indexOf("\n"); return newLineIndex >= 0 ? result.slice(0, newLineIndex) : result; } // src/import/di/forward_ref.ts var __forward_ref__ = getClosureSafeProperty({ __forward_ref__: getClosureSafeProperty }); function forwardRef(forwardRefFn) { forwardRefFn.__forward_ref__ = forwardRef; forwardRefFn.toString = function() { return stringify(this()); }; return forwardRefFn; } function resolveForwardRef(type) { return isForwardRef(type) ? type() : type; } function isForwardRef(fn) { return typeof fn === "function" && fn.hasOwnProperty(__forward_ref__) && fn.__forward_ref__ === forwardRef; } // src/primitives/signals/src/graph.ts var activeConsumer = null; var inNotificationPhase = false; var epoch = 1; var postProducerCreatedFn = null; var SIGNAL = /* @__PURE__ */ Symbol("SIGNAL"); function setActiveConsumer(consumer) { const prev = activeConsumer; activeConsumer = consumer; return prev; } function getActiveConsumer() { return activeConsumer; } function isInNotificationPhase() { return inNotificationPhase; } var REACTIVE_NODE = { version: 0, lastCleanEpoch: 0, dirty: false, producers: void 0, producersTail: void 0, consumers: void 0, consumersTail: void 0, recomputing: false, consumerAllowSignalWrites: false, consumerIsAlwaysLive: false, kind: "unknown", producerMustRecompute: () => false, producerRecomputeValue: () => { }, consumerMarkedDirty: () => { }, consumerOnSignalRead: () => { } }; function producerAccessed(node) { if (inNotificationPhase) { throw new Error(typeof ngDevMode !== "undefined" && ngDevMode ? `Assertion error: signal read during notification phase` : ""); } if (activeConsumer === null) { return; } activeConsumer.consumerOnSignalRead(node); const prevProducerLink = activeConsumer.producersTail; if (prevProducerLink !== void 0 && prevProducerLink.producer === node) { return; } let nextProducerLink = void 0; const isRecomputing = activeConsumer.recomputing; if (isRecomputing) { nextProducerLink = prevProducerLink !== void 0 ? prevProducerLink.nextProducer : activeConsumer.producers; if (nextProducerLink !== void 0 && nextProducerLink.producer === node) { activeConsumer.producersTail = nextProducerLink; nextProducerLink.lastReadVersion = node.version; return; } } const prevConsumerLink = node.consumersTail; if (prevConsumerLink !== void 0 && prevConsumerLink.consumer === activeConsumer && // However, we have to make sure that the link we've discovered isn't from a node that is incrementally rebuilding its producer list (!isRecomputing || isValidLink(prevConsumerLink, activeConsumer))) { return; } const isLive = consumerIsLive(activeConsumer); const newLink = { producer: node, consumer: activeConsumer, // instead of eagerly destroying the previous link, we delay until we've finished recomputing // the producers list, so that we can destroy all of the old links at once. nextProducer: nextProducerLink, prevConsumer: prevConsumerLink, lastReadVersion: node.version, nextConsumer: void 0 }; activeConsumer.producersTail = newLink; if (prevProducerLink !== void 0) { prevProducerLink.nextProducer = newLink; } else { activeConsumer.producers = newLink; } if (isLive) { producerAddLiveConsumer(node, newLink); } } function producerIncrementEpoch() { epoch++; } function producerUpdateValueVersion(node) { if (consumerIsLive(node) && !node.dirty) { return; } if (!node.dirty && node.lastCleanEpoch === epoch) { return; } if (!node.producerMustRecompute(node) && !consumerPollProducersForChange(node)) { producerMarkClean(node); return; } node.producerRecomputeValue(node); producerMarkClean(node); } function producerNotifyConsumers(node) { if (node.consumers === void 0) { return; } const prev = inNotificationPhase; inNotificationPhase = true; try { for (let link = node.consumers; link !== void 0; link = link.nextConsumer) { const consumer = link.consumer; if (!consumer.dirty) { consumerMarkDirty(consumer); } } } finally { inNotificationPhase = prev; } } function producerUpdatesAllowed() { return activeConsumer?.consumerAllowSignalWrites !== false; } function consumerMarkDirty(node) { node.dirty = true; producerNotifyConsumers(node); node.consumerMarkedDirty?.(node); } function producerMarkClean(node) { node.dirty = false; node.lastCleanEpoch = epoch; } function consumerBeforeComputation(node) { if (node) resetConsumerBeforeComputation(node); return setActiveConsumer(node); } function resetConsumerBeforeComputation(node) { node.producersTail = void 0; node.recomputing = true; } function consumerAfterComputation(node, prevConsumer) { setActiveConsumer(prevConsumer); if (node) finalizeConsumerAfterComputation(node); } function finalizeConsumerAfterComputation(node) { node.recomputing = false; const producersTail = node.producersTail; let toRemove = producersTail !== void 0 ? producersTail.nextProducer : node.producers; if (toRemove !== void 0) { if (consumerIsLive(node)) { do { toRemove = producerRemoveLiveConsumerLink(toRemove); } while (toRemove !== void 0); } if (producersTail !== void 0) { producersTail.nextProducer = void 0; } else { node.producers = void 0; } } } function consumerPollProducersForChange(node) { for (let link = node.producers; link !== void 0; link = link.nextProducer) { const producer = link.producer; const seenVersion = link.lastReadVersion; if (seenVersion !== producer.version) { return true; } producerUpdateValueVersion(producer); if (seenVersion !== producer.version) { return true; } } return false; } function consumerDestroy(node) { if (consumerIsLive(node)) { let link = node.producers; while (link !== void 0) { link = producerRemoveLiveConsumerLink(link); } } node.producers = void 0; node.producersTail = void 0; node.consumers = void 0; node.consumersTail = void 0; } function producerAddLiveConsumer(node, link) { const consumersTail = node.consumersTail; const wasLive = consumerIsLive(node); if (consumersTail !== void 0) { link.nextConsumer = consumersTail.nextConsumer; consumersTail.nextConsumer = link; } else { link.nextConsumer = void 0; node.consumers = link; } link.prevConsumer = consumersTail; node.consumersTail = link; if (!wasLive) { for (let link2 = node.producers; link2 !== void 0; link2 = link2.nextProducer) { producerAddLiveConsumer(link2.producer, link2); } } } function producerRemoveLiveConsumerLink(link) { const producer = link.producer; const nextProducer = link.nextProducer; const nextConsumer = link.nextConsumer; const prevConsumer = link.prevConsumer; link.nextConsumer = void 0; link.prevConsumer = void 0; if (nextConsumer !== void 0) { nextConsumer.prevConsumer = prevConsumer; } else { producer.consumersTail = prevConsumer; } if (prevConsumer !== void 0) { prevConsumer.nextConsumer = nextConsumer; } else { producer.consumers = nextConsumer; if (!consumerIsLive(producer)) { let producerLink = producer.producers; while (producerLink !== void 0) { producerLink = producerRemoveLiveConsumerLink(producerLink); } } } return nextProducer; } function consumerIsLive(node) { return node.consumerIsAlwaysLive || node.consumers !== void 0; } function runPostProducerCreatedFn(node) { postProducerCreatedFn?.(node); } function isValidLink(checkLink, consumer) { const producersTail = consumer.producersTail; if (producersTail !== void 0) { let link = consumer.producers; do { if (link === checkLink) { return true; } if (link === producersTail) { break; } link = link.nextProducer; } while (link !== void 0); } return false; } // src/primitives/signals/src/formatter.ts var formatter = { /** * If the function returns `null`, the formatter is not used for this reference */ header: (sig, config) => { if (!isSignal(sig) || config?.ngSkipFormatting) return null; let value; try { value = sig(); } catch { return ["span", "Signal(⚠️ Error)"]; } const kind = "computation" in sig[SIGNAL] ? "Computed" : "Signal"; const isPrimitive = value === null || !Array.isArray(value) && typeof value !== "object"; return [ "span", {}, ["span", {}, `${kind}(`], (() => { if (isSignal(value)) { return formatter.header(value, config); } else if (isPrimitive && value !== void 0 && typeof value !== "function") { return ["object", { object: value }]; } else { return prettifyPreview(value); } })(), ["span", {}, `)`] ]; }, hasBody: (sig, config) => { if (!isSignal(sig)) return false; try { sig(); } catch { return false; } return !config?.ngSkipFormatting; }, body: (sig, config) => { const color = "var(--sys-color-primary)"; return [ "div", { style: `background: #FFFFFF10; padding-left: 4px; padding-top: 2px; padding-bottom: 2px;` }, ["div", { style: `color: ${color}` }, "Signal value: "], ["div", { style: `padding-left: .5rem;` }, ["object", { object: sig(), config }]], ["div", { style: `color: ${color}` }, "Signal function: "], ["div", { style: `padding-left: .5rem;` }, ["object", { object: sig, config: { ...config, skipFormatting: true } }]] ]; } }; function prettifyPreview(value) { if (value === null) return "null"; if (Array.isArray(value)) return `Array(${value.length})`; if (value instanceof Element) return `<${value.tagName.toLowerCase()}>`; if (value instanceof URL) return `URL`; switch (typeof value) { case "undefined": { return "undefined"; } case "function": { if ("prototype" in value) { return "class"; } else { return "() => {…}"; } } case "object": { if (value.constructor.name === "Object") { return "{…}"; } else { return `${value.constructor.name} {}`; } } default: { return ["object", { object: value, config: { skipFormatting: true } }]; } } } function isSignal(value) { return value[SIGNAL] !== void 0; } function installDevToolsSignalFormatter() { globalThis.devtoolsFormatters ??= []; if (!globalThis.devtoolsFormatters.some((f) => f === formatter)) { globalThis.devtoolsFormatters.push(formatter); } } // src/primitives/signals/src/equality.ts function defaultEquals(a, b) { return Object.is(a, b); } // src/primitives/signals/src/computed.ts function createComputed(computation, equal) { const node = Object.create(COMPUTED_NODE); node.computation = computation; if (equal !== void 0) { node.equal = equal; } const computed2 = () => { producerUpdateValueVersion(node); producerAccessed(node); if (node.value === ERRORED) { throw node.error; } return node.value; }; computed2[SIGNAL] = node; if (typeof ngDevMode !== "undefined" && ngDevMode) { const debugName = node.debugName ? " (" + node.debugName + ")" : ""; computed2.toString = () => `[Computed${debugName}: ${node.value}]`; } runPostProducerCreatedFn(node); return computed2; } var UNSET = /* @__PURE__ */ Symbol("UNSET"); var COMPUTING = /* @__PURE__ */ Symbol("COMPUTING"); var ERRORED = /* @__PURE__ */ Symbol("ERRORED"); var COMPUTED_NODE = /* @__PURE__ */ (() => ({ ...REACTIVE_NODE, value: UNSET, dirty: true, error: null, equal: defaultEquals, kind: "computed", producerMustRecompute(node) { return node.value === UNSET || node.value === COMPUTING; }, producerRecomputeValue(node) { if (node.value === COMPUTING) { throw new Error(typeof ngDevMode !== "undefined" && ngDevMode ? "Detected cycle in computations." : ""); } const oldValue = node.value; node.value = COMPUTING; const prevConsumer = consumerBeforeComputation(node); let newValue; let wasEqual = false; try { newValue = node.computation(); setActiveConsumer(null); wasEqual = oldValue !== UNSET && oldValue !== ERRORED && newValue !== ERRORED && node.equal(oldValue, newValue); } catch (err) { newValue = ERRORED; node.error = err; } finally { consumerAfterComputation(node, prevConsumer); } if (wasEqual) { node.value = oldValue; return; } node.value = newValue; node.version++; } }))(); // src/primitives/signals/src/errors.ts function defaultThrowError() { throw new Error(); } var throwInvalidWriteToSignalErrorFn = defaultThrowError; function throwInvalidWriteToSignalError(node) { throwInvalidWriteToSignalErrorFn(node); } // src/primitives/signals/src/signal.ts var postSignalSetFn = null; function createSignal(initialValue, equal) { const node = Object.create(SIGNAL_NODE); node.value = initialValue; if (equal !== void 0) { node.equal = equal; } const getter = () => signalGetFn(node); getter[SIGNAL] = node; if (typeof ngDevMode !== "undefined" && ngDevMode) { const debugName = node.debugName ? " (" + node.debugName + ")" : ""; getter.toString = () => `[Signal${debugName}: ${node.value}]`; } runPostProducerCreatedFn(node); const set = (newValue) => signalSetFn(node, newValue); const update = (updateFn) => signalUpdateFn(node, updateFn); return [getter, set, update]; } function signalGetFn(node) { producerAccessed(node); return node.value; } function signalSetFn(node, newValue) { if (!producerUpdatesAllowed()) { throwInvalidWriteToSignalError(node); } if (!node.equal(node.value, newValue)) { node.value = newValue; signalValueChanged(node); } } function signalUpdateFn(node, updater) { if (!producerUpdatesAllowed()) { throwInvalidWriteToSignalError(node); } signalSetFn(node, updater(node.value)); } var SIGNAL_NODE = /* @__PURE__ */ (() => ({ ...REACTIVE_NODE, equal: defaultEquals, value: void 0, kind: "signal" }))(); function signalValueChanged(node) { node.version++; producerIncrementEpoch(); producerNotifyConsumers(node); postSignalSetFn?.(node); } // src/primitives/signals/src/linked_signal.ts function createLinkedSignal(sourceFn, computationFn, equalityFn) { const node = Object.create(LINKED_SIGNAL_NODE); node.source = sourceFn; node.computation = computationFn; if (equalityFn != void 0) { node.equal = equalityFn; } const linkedSignalGetter = () => { producerUpdateValueVersion(node); producerAccessed(node); if (node.value === ERRORED) { throw node.error; } return node.value; }; const getter = linkedSignalGetter; getter[SIGNAL] = node; if (typeof ngDevMode !== "undefined" && ngDevMode) { const debugName = node.debugName ? " (" + node.debugName + ")" : ""; getter.toString = () => `[LinkedSignal${debugName}: ${node.value}]`; } runPostProducerCreatedFn(node); return getter; } function linkedSignalSetFn(node, newValue) { producerUpdateValueVersion(node); signalSetFn(node, newValue); producerMarkClean(node); } function linkedSignalUpdateFn(node, updater) { producerUpdateValueVersion(node); signalUpdateFn(node, updater); producerMarkClean(node); } var LINKED_SIGNAL_NODE = /* @__PURE__ */ (() => ({ ...REACTIVE_NODE, value: UNSET, dirty: true, error: null, equal: defaultEquals, kind: "linkedSignal", producerMustRecompute(node) { return node.value === UNSET || node.value === COMPUTING; }, producerRecomputeValue(node) { if (node.value === COMPUTING) { throw new Error(typeof ngDevMode !== "undefined" && ngDevMode ? "Detected cycle in computations." : ""); } const oldValue = node.value; node.value = COMPUTING; const prevConsumer = consumerBeforeComputation(node); let newValue; try { const newSourceValue = node.source(); const prev = oldValue === UNSET || oldValue === ERRORED ? void 0 : { source: node.sourceValue, value: oldValue }; newValue = node.computation(newSourceValue, prev); node.sourceValue = newSourceValue; } catch (err) { newValue = ERRORED; node.error = err; } finally { consumerAfterComputation(node, prevConsumer); } if (oldValue !== UNSET && newValue !== ERRORED && node.equal(oldValue, newValue)) { node.value = oldValue; return; } node.value = newValue; node.version++; } }))(); // src/primitives/signals/src/untracked.ts function untracked(nonReactiveReadsFn) { const prevConsumer = setActiveConsumer(null); try { return nonReactiveReadsFn(); } finally { setActiveConsumer(prevConsumer); } } // src/primitives/signals/src/effect.ts var BASE_EFFECT_NODE = /* @__PURE__ */ (() => ({ ...REACTIVE_NODE, consumerIsAlwaysLive: true, consumerAllowSignalWrites: true, dirty: true, kind: "effect" }))(); function runEffect(node) { node.dirty = false; if (node.version > 0 && !consumerPollProducersForChange(node)) { return; } node.version++; const prevNode = consumerBeforeComputation(node); try { node.cleanup(); node.fn(); } finally { consumerAfterComputation(node, prevNode); } } // src/primitives/signals/index.ts if (typeof ngDevMode !== "undefined" && ngDevMode) { installDevToolsSignalFormatter(); } // src/import/util/assert.ts function assertLessThan(actual, expected, msg) { if (!(actual < expected)) { throwError(msg, actual, expected, "<"); } } function assertDefined(actual, msg) { if (actual == null) { throwError(msg, actual, null, "!="); } } function throwError(msg, actual, expected, comparison) { throw new Error(`ASSERTION ERROR: ${msg}` + (comparison == null ? "" : ` [Expected=> ${expected} ${comparison} ${actual} <=Actual]`)); } // src/import/di/interface/defs.ts function ɵɵdefineInjectable(opts) { return { token: opts.token, providedIn: opts.providedIn || null, factory: opts.factory, value: void 0 }; } function ɵɵdefineInjector(options) { return { providers: options.providers || [], imports: options.imports || [] }; } function getInjectableDef(type) { return getOwnDefinition(type, NG_PROV_DEF) || { token: type, factory: () => new type(), ...type.injectOptions }; } function isInjectable(type) { return getInjectableDef(type) !== null; } function getOwnDefinition(type, field) { return type.hasOwnProperty(field) && type[field] || null; } function getInheritedInjectableDef(type) { const def = type?.[NG_PROV_DEF] ?? null; if (def) { ngDevMode && console.warn( `DEPRECATED: DI is instantiating a token "${type.name}" that inherits its @Injectable decorator but does not provide one itself. This will become an error in a future version of Angular. Please add @Injectable() to the "${type.name}" class.` ); return def; } else { return null; } } function getInjectorDef(type) { return type && type.hasOwnProperty(NG_INJ_DEF) ? type[NG_INJ_DEF] : null; } var NG_PROV_DEF = getClosureSafeProperty({ ɵprov: getClosureSafeProperty }); var NG_INJ_DEF = getClosureSafeProperty({ ɵinj: getClosureSafeProperty }); // src/import/di/injection_token.ts var InjectionToken = class { /** * @param _desc Description for the token, * used only for debugging purposes, * it should but does not need to be unique * @param options Options for the token's usage, as described above */ constructor(_desc, options) { this._desc = _desc; this.ɵprov = void 0; if (typeof options === "number") { (typeof ngDevMode === "undefined" || ngDevMode) && assertLessThan(options, 0, "Only negative numbers are supported here"); } else if (options !== void 0) { this.ɵprov = ɵɵdefineInjectable({ token: this, providedIn: options.providedIn || "root", factory: options.factory }); } } /** @internal */ ngMetadataName = "InjectionToken"; ɵprov; /** * @internal */ get multi() { return this; } toString() { return `InjectionToken ${this._desc}`; } }; // src/import/render3/debug/injector_profiler.ts var _injectorProfilerContext; function getInjectorProfilerContext() { !ngDevMode && throwError("getInjectorProfilerContext should never be called in production mode"); return _injectorProfilerContext; } function setInjectorProfilerContext(context) { !ngDevMode && throwError("setInjectorProfilerContext should never be called in production mode"); const previous = _injectorProfilerContext; _injectorProfilerContext = context; return previous; } var injectorProfilerCallbacks = []; function injectorProfiler(event) { !ngDevMode && throwError("Injector profiler should never be called in production mode"); for (let i = 0; i < injectorProfilerCallbacks.length; i++) { const injectorProfilerCallback = injectorProfilerCallbacks[i]; injectorProfilerCallback(event); } } function emitProviderConfiguredEvent(eventProvider, isViewProvider = false) { !ngDevMode && throwError("Injector profiler should never be called in production mode"); let token; if (typeof eventProvider === "function") { token = eventProvider; } else if (eventProvider instanceof InjectionToken) { token = eventProvider; } else { token = resolveForwardRef(eventProvider.provide); } let provider = eventProvider; if (eventProvider instanceof InjectionToken) { provider = eventProvider.ɵprov || eventProvider; } injectorProfiler({ type: 2 /* ProviderConfigured */, context: getInjectorProfilerContext(), providerRecord: { token, provider, isViewProvider } }); } function emitInjectorToCreateInstanceEvent(token) { !ngDevMode && throwError("Injector profiler should never be called in production mode"); injectorProfiler({ type: 4 /* InjectorToCreateInstanceEvent */, context: getInjectorProfilerContext(), token }); } function emitInstanceCreatedByInjectorEvent(instance) { !ngDevMode && throwError("Injector profiler should never be called in production mode"); injectorProfiler({ type: 1 /* InstanceCreatedByInjector */, context: getInjectorProfilerContext(), instance: { value: instance } }); } function emitInjectEvent(token, value, flags) { !ngDevMode && throwError("Injector profiler should never be called in production mode"); injectorProfiler({ type: 0 /* Inject */, context: getInjectorProfilerContext(), service: { token, value, flags } }); } function emitEffectCreatedEvent(effect2) { !ngDevMode && throwError("Injector profiler should never be called in production mode"); injectorProfiler({ type: 3 /* EffectCreated */, context: getInjectorProfilerContext(), effect: effect2 }); } function runInInjectorProfilerContext(injector, token, callback) { !ngDevMode && throwError("runInInjectorProfilerContext should never be called in production mode"); const prevInjectContext = setInjectorProfilerContext({ injector, token }); try { callback(); } finally { setInjectorProfilerContext(prevInjectContext); } } // src/import/render3/definition_factory.ts function getFactoryDef(type, throwNotFound) { return () => new type(); } // src/import/render3/util/stringify_utils.ts function renderStringify(value) { if (typeof value === "string") return value; if (value == null) return ""; return String(value); } function stringifyForError(value) { if (typeof value === "function") return value.name || value.toString(); if (typeof value === "object" && value != null && typeof value.type === "function") { return value.type.name || value.type.toString(); } return renderStringify(value); } // src/import/render3/errors_di.ts var NG_RUNTIME_ERROR_CODE = getClosureSafeProperty({ ngErrorCode: getClosureSafeProperty }); var NG_RUNTIME_ERROR_MESSAGE = getClosureSafeProperty({ ngErrorMessage: getClosureSafeProperty }); var NG_TOKEN_PATH = getClosureSafeProperty({ ngTokenPath: getClosureSafeProperty }); function cyclicDependencyError(token, path) { const message = ngDevMode ? `Circular dependency detected for \`${token}\`.` : ""; return createRuntimeError(message, -200 /* CYCLIC_DI_DEPENDENCY */, path); } function throwMixedMultiProviderError() { throw new Error(`Cannot mix multi providers and regular providers`); } function throwInvalidProviderError(ngModuleType, providers, provider) { if (ngModuleType && providers) { const providerDetail = providers.map((v) => v == provider ? "?" + provider + "?" : "..."); throw new Error(`Invalid provider for the NgModule '${stringify(ngModuleType)}' - only instances of Provider and Type are allowed, got: [${providerDetail.join(", ")}]`); } else if (isEnvironmentProviders(provider)) { if (provider.ɵfromNgModule) { throw new RuntimeError( 207 /* PROVIDER_IN_WRONG_CONTEXT */, `Invalid providers from 'importProvidersFrom' present in a non-environment injector. 'importProvidersFrom' can't be used for component providers.` ); } else { throw new RuntimeError(207 /* PROVIDER_IN_WRONG_CONTEXT */, `Invalid providers present in a non-environment injector. 'EnvironmentProviders' can't be used for component providers.`); } } else { throw new Error("Invalid provider"); } } function throwProviderNotFoundError(token, injectorName) { const errorMessage = ngDevMode && `No provider for ${stringifyForError(token)} found${injectorName ? ` in ${injectorName}` : ""}`; throw new RuntimeError(-201 /* PROVIDER_NOT_FOUND */, errorMessage); } function prependTokenToDependencyPath(error, token) { error[NG_TOKEN_PATH] ??= []; const currentPath = error[NG_TOKEN_PATH]; let pathStr; if (typeof token === "object" && "multi" in token && token?.multi === true) { assertDefined(token.provide, "Token with multi: true should have a provide property"); pathStr = stringifyForError(token.provide); } else { pathStr = stringifyForError(token); } if (currentPath[0] !== pathStr) { error[NG_TOKEN_PATH].unshift(pathStr); } } function augmentRuntimeError(error, source) { const tokenPath = error[NG_TOKEN_PATH]; const errorCode = error[NG_RUNTIME_ERROR_CODE]; const message = error[NG_RUNTIME_ERROR_MESSAGE] || error.message; error.message = formatErrorMessage(message, errorCode, tokenPath, source); return error; } function createRuntimeError(message, code, path) { const error = new RuntimeError(code, message); error[NG_RUNTIME_ERROR_CODE] = code; error[NG_RUNTIME_ERROR_MESSAGE] = message; if (path) { error[NG_TOKEN_PATH] = path; } return error; } function getRuntimeErrorCode(error) { return error[NG_RUNTIME_ERROR_CODE]; } function formatErrorMessage(text, code, path = [], source = null) { let pathDetails = ""; if (path && path.length > 1) { pathDetails = ` Path: ${path.join(" -> ")}.`; } const sourceDetails = source ? ` Source: ${source}.` : ""; return formatRuntimeError(code, `${text}${sourceDetails}${pathDetails}`); } // src/import/render3/fields.ts var NG_FACTORY_DEF = getClosureSafeProperty({ ɵfac: getClosureSafeProperty }); var NG_ENV_ID = getClosureSafeProperty({ __NG_ENV_ID__: getClosureSafeProperty }); // src/import/util/array_utils.ts function newArray(size, value) { const list = []; for (let i = 0; i < size; i++) { list.push(value); } return list; } // src/import/util/empty.ts var EMPTY_OBJ = {}; var EMPTY_ARRAY = []; if ((typeof ngDevMode === "undefined" || ngDevMode) && true) { Object.freeze(EMPTY_OBJ); Object.freeze(EMPTY_ARRAY); } // src/import/di/initializer_token.ts var ENVIRONMENT_INITIALIZER = new InjectionToken(ngDevMode ? "ENVIRONMENT_INITIALIZER" : ""); // src/import/di/interface/injector.ts var DecoratorFlags = /* @__PURE__ */ ((DecoratorFlags2) => { DecoratorFlags2[DecoratorFlags2["Inject"] = -1] = "Inject"; return DecoratorFlags2; })(DecoratorFlags || {}); var InternalInjectFlags = /* @__PURE__ */ ((InternalInjectFlags2) => { InternalInjectFlags2[InternalInjectFlags2["Default"] = 0] = "Default"; InternalInjectFlags2[InternalInjectFlags2["Host"] = 1] = "Host"; InternalInjectFlags2[InternalInjectFlags2["Self"] = 2] = "Self"; InternalInjectFlags2[InternalInjectFlags2["SkipSelf"] = 4] = "SkipSelf"; InternalInjectFlags2[InternalInjectFlags2["Optional"] = 8] = "Optional"; InternalInjectFlags2[InternalInjectFlags2["ForPipe"] = 16] = "ForPipe"; return InternalInjectFlags2; })(InternalInjectFlags || {}); // src/import/di/inject_switch.ts var _injectImplementation; function getInjectImplementation() { return _injectImplementation; } function setInjectImplementation(impl) { const previous = _injectImplementation; _injectImplementation = impl; return previous; } function injectRootLimpMode(token, notFoundValue, flags) { const injectableDef = getInjectableDef(token); if (injectableDef && injectableDef.providedIn == "root") { return injectableDef.value === void 0 ? injectableDef.value = injectableDef.factory() : injectableDef.value; } if (flags & 8 /* Optional */) return null; if (notFoundValue !== void 0) return notFoundValue; throwProviderNotFoundError(token, "Injector"); } // src/primitives/di/src/injector.ts var _currentInjector = void 0; function getCurrentInjector() { return _currentInjector; } function setCurrentInjector(injector) { const former = _currentInjector; _currentInjector = injector; return former; } // src/primitives/di/src/not_found.ts var NOT_FOUND = Symbol("NotFound"); function isNotFound(e) { return e === NOT_FOUND || e?.name === "ɵNotFound"; } // src/import/di/injector_compatibility.ts var _THROW_IF_NOT_FOUND = {}; var THROW_IF_NOT_FOUND = _THROW_IF_NOT_FOUND; var DI_DECORATOR_FLAG = "__NG_DI_FLAG__"; var RetrievingInjector = class { constructor(injector) { this.injector = injector; } retrieve(token, options) { const flags = convertToBitFlags(options) || 0 /* Default */; try { return this.injector.get( token, // When a dependency is requested with an optional flag, DI returns null as the default value. flags & 8 /* Optional */ ? null : THROW_IF_NOT_FOUND, flags ); } catch (e) { if (isNotFound(e)) { return e; } throw e; } } }; var NG_TEMP_TOKEN_PATH = "ngTempTokenPath"; var NEW_LINE = /\n/gm; var NO_NEW_LINE = "ɵ"; var SOURCE = "__source"; function injectInjectorOnly(token, flags = 0 /* Default */) { const currentInjector = getCurrentInjector(); if (currentInjector === void 0) { throw new RuntimeError( -203 /* MISSING_INJECTION_CONTEXT */, ngDevMode && `The \`${stringify(token)}\` token injection failed. \`inject()\` function must be called from an injection context such as a constructor, a factory function, a field initializer, or a function used with \`runInInjectionContext\`.` ); } else if (currentInjector === null) { return injectRootLimpMode(token, void 0, flags); } else { const options = convertToInjectOptions(flags); const value = currentInjector.retrieve(token, options); ngDevMode && emitInjectEvent(token, value, flags); if (isNotFound(value)) { if (options.optional) { return null; } throw value; } return value; } } function ɵɵinject(token, flags = 0 /* Default */) { return (getInjectImplementation() || injectInjectorOnly)(resolveForwardRef(token), flags); } function ɵɵinvalidFactoryDep(index) { throw new RuntimeError( 202 /* INVALID_FACTORY_DEPENDENCY */, ngDevMode && `This constructor is not compatible with Angular Dependency Injection because its dependency at index ${index} of the parameter list is invalid. This can happen if the dependency type is a primitive like a string or if an ancestor of this class is missing an Angular decorator. Please check that 1) the type for the parameter at index ${index} is correct and 2) the correct Angular decorators are defined for this class and its ancestors.` ); } function inject2(token, options) { return ɵɵinject(token, convertToBitFlags(options)); } function convertToBitFlags(flags) { if (typeof flags === "undefined" || typeof flags === "number") { return flags; } return 0 /* Default */ | // comment to force a line break in the formatter (flags.optional && 8 /* Optional */) | 0 | (flags.self && 2 /* Self */) | (flags.skipSelf && 4 /* SkipSelf */); } function convertToInjectOptions(flags) { return { optional: !!(flags & 8 /* Optional */), host: !!(flags & 1 /* Host */), self: !!(flags & 2 /* Self */), skipSelf: !!(flags & 4 /* SkipSelf */) }; } function injectArgs(types) { const args = []; for (let i = 0; i < types.length; i++) { const arg = resolveForwardRef(types[i]); if (Array.isArray(arg)) { if (arg.length === 0) { throw new RuntimeError(900 /* INVALID_DIFFER_INPUT */, ngDevMode && "Arguments array must have arguments."); } let type = void 0; let flags = 0 /* Default */; for (let j = 0; j < arg.length; j++) { const meta = arg[j]; const flag = getInjectFlag(meta); if (typeof flag === "number") { if (flag === -1 /* Inject */) { type = meta.token; } else { flags |= flag; } } else { type = meta; } } args.push(ɵɵinject(type, flags)); } else { args.push(ɵɵinject(arg)); } } return args; } function attachInjectFlag(decorator, flag) { decorator[DI_DECORATOR_FLAG] = flag; decorator.prototype[DI_DECORATOR_FLAG] = flag; return decorator; } function getInjectFlag(token) { return token[DI_DECORATOR_FLAG]; } function formatError(text, obj, injectorErrorName, source = null) { text = text && text.charAt(0) === "\n" && text.charAt(1) == NO_NEW_LINE ? text.slice(2) : text; let context = stringify(obj); if (Array.isArray(obj)) { context = obj.map(stringify).join(" -> "); } else if (typeof obj === "object") { const parts = []; for (const key in obj) { if (obj.hasOwnProperty(key)) { const value = obj[key]; parts.push(key + ":" + (typeof value === "string" ? JSON.stringify(value) : stringify(value))); } } context = `{${parts.join(", ")}}`; } return `${injectorErrorName}${source ? "(" + source + ")" : ""}[${context}]: ${text.replace(NEW_LINE, "\n ")}`; } // src/import/di/injector_token.ts var INJECTOR = new InjectionToken( ngDevMode ? "INJECTOR" : "", // Disable tslint because this is const enum which gets inlined not top level prop access. // tslint:disable-next-line: no-toplevel-property-access -1 /* Injector */ // Special value used by Ivy to identify `Injector`. ); // src/import/di/internal_tokens.ts var INJECTOR_DEF_TYPES = new InjectionToken(ngDevMode ? "INJECTOR_DEF_TYPES" : ""); // src/import/di/null_injector.ts var NullInjector = class { get(token, notFoundValue = THROW_IF_NOT_FOUND) { if (notFoundValue === THROW_IF_NOT_FOUND) { const message = ngDevMode ? `No provider found for \`${stringify(token)}\`.` : ""; const error = createRuntimeError(message, -201 /* PROVIDER_NOT_FOUND */); error.name = "ɵNotFound"; throw error; } return notFoundValue; } }; // src/import/di/provider_collection.ts var USE_VALUE = getClosureSafeProperty({ provide: String, useValue: getClosureSafeProperty }); function isValueProvider(value) { return value !== null && typeof value === "object" && USE_VALUE in value; } function isExistingProvider(value) { return !!(value && value.useExisting); } function isFactoryProvider(value) { return !!(value && value.useFactory); } function isTypeProvider(value) { return typeof value === "function"; } // src/import/di/scope.ts var INJECTOR_SCOPE = new InjectionToken(ngDevMode ? "Set Injector scope." : ""); // src/import/di/r3_injector.ts var NOT_YET = {}; var CIRCULAR = {}; var NULL_INJECTOR = void 0; function getNullInjector() { if (NULL_INJECTOR === void 0) { NULL_INJECTOR = new NullInjector(); } return NULL_INJECTOR; } var EnvironmentInjector = class { }; var R3Injector = class extends EnvironmentInjector { constructor(providers, parent, source, scopes) { super(); this.parent = parent; this.source = source; this.scopes = scopes; forEachSingleProvider(providers, (provider) => this.processProvider(provider)); this.records.set(INJECTOR, makeRecord(void 0, this)); if (scopes.has("environment")) { this.records.set(EnvironmentInjector, makeRecord(void 0, this)); } const record = this.records.get(INJECTOR_SCOPE); if (record != null && typeof record.value === "string") { this.scopes.add(record.value); } this.injectorDefTypes = new Set(this.get(INJECTOR_DEF_TYPES, EMPTY_ARRAY, { self: true })); } /** * Map of tokens to records which contain the instances of those tokens. * - `null` value implies that we don't have the record. Used by tree-shakable injectors * to prevent further searches. */ records = /* @__PURE__ */ new Map(); /** * Set of values instantiated by this injector which contain `ngOnDestroy` lifecycle hooks. */ _ngOnDestroyHooks = /* @__PURE__ */ new Set(); _onDestroyHooks = []; /** * Flag indicating that this injector was previously destroyed. */ get destroyed() { return this._destroyed; } _destroyed = false; injectorDefTypes; retrieve(token, options) { const flags = convertToBitFlags(options) || 0 /* Default */; try { return this.get( token, // When a dependency is requested with an optional flag, DI returns null as the default value. THROW_IF_NOT_FOUND, flags ); } catch (e) { if (isNotFound(e)) { return e; } throw e; } } /** * Destroy the injector and release references to every instance or provider associated with it. * * Also calls the `OnDestroy` lifecycle hooks of every instance that was created for which a * hook was found. */ destroy() { assertNotDestroyed(this); this._destroyed = true; try { for (const service of this._ngOnDestroyHooks) { service.ngOnDestroy(); } const onDestroyHooks = this._onDestroyHooks; this._onDestroyHooks = []; for (const hook of onDestroyHooks) { hook(); } } finally { this.records.clear(); this._ngOnDestroyHooks.clear(); this.injectorDefTypes.clear(); } } onDestroy(callback) { assertNotDestroyed(this); this._onDestroyHooks.push(callback); return () => this.removeOnDestroy(callback); } runInContext(fn) { assertNotDestroyed(this); const previousInjector = setCurrentInjector(this); const previousInjectImplementation = setInjectImplementation(void 0); let prevInjectContext; if (ngDevMode) { prevInjectContext = setInjectorProfilerContext({ injector: this, token: null }); } try { return fn(); } finally { setCurrentInjector(previousInjector); setInjectImplementation(previousInjectImplementation); ngDevMode && setInjectorProfilerContext(prevInjectContext); } } get(token, notFoundValue = THROW_IF_NOT_FOUND, options) { assertNotDestroyed(this); if (token.hasOwnProperty(NG_ENV_ID)) { return token[NG_ENV_ID](this); } const flags = convertToBitFlags(options); let prevInjectContext; if (ngDevMode) { prevInjectContext = setInjectorProfilerContext({ injector: this, token }); } const previousInjector = setCurrentInjector(this); const previousInjectImplementation = setInjectImplementation(void 0); try { if (!(flags & 4 /* SkipSelf */)) { let record = this.records.get(token); if (record === void 0) { const def = couldBeInjectableType(token) && getInjectableDef(token); if (def && this.injectableDefInScope(def)) { if (ngDevMode) { runInInjectorProfilerContext(this, token, () => { emitProviderConfiguredEvent(token); }); } record = makeRecord(injectableDefOrInjectorDefFactory(token), NOT_YET); } else { record = null; } this.records.set(token, record); } if (record != null) { return this.hydrate(token, record, flags); } } const nextInjector = !(flags & 2 /* Self */) ? this.parent : getNullInjector(); notFoundValue = flags & 8 /* Optional */ && notFoundValue === THROW_IF_NOT_FOUND ? null : notFoundValue; return nextInjector.get(token, notFoundValue); } catch (error) { const errorCode = getRuntimeErrorCode(error); if (errorCode === -200 /* CYCLIC_DI_DEPENDENCY */ || errorCode === -201 /* PROVIDER_NOT_FOUND */) { if (ngDevMode) { prependTokenToDependencyPath(error, token); if (previousInjector) { throw error; } else { throw augmentRuntimeError(error, this.source); } } else { throw new RuntimeError(errorCode, null); } } else { throw error; } } finally { setInjectImplementation(previousInjectImplementation); setCurrentInjector(previousInjector); ngDevMode && setInjectorProfilerContext(prevInjectContext); } } /** @internal */ resolveInjectorInitializers() { const previousInjector = setCurrentInjector(this); const previousInjectImplementation = setInjectImplementation(void 0); let prevInjectContext; if (ngDevMode) { prevInjectContext = setInjectorProfilerContext({ injector: this, token: null }); } try { const initializers = this.get(ENVIRONMENT_INITIALIZER, EMPTY_ARRAY, { self: true }); if (ngDevMode && !Array.isArray(initializers)) { throw new RuntimeError( -209 /* INVALID_MULTI_PROVIDER */, `Unexpected type of the \`ENVIRONMENT_INITIALIZER\` token value (expected an array, but got ${typeof initializers}). Please check that the \`ENVIRONMENT_INITIALIZER\` token is configured as a \`multi: true\` provider.` ); } for (const initializer of initializers) { initializer(); } } finally { setCurrentInjector(previousInjector); setInjectImplementation(previousInjectImplementation); ngDevMode && setInjectorProfilerContext(prevInjectContext); } } toString() { const tokens = []; const records = this.records; for (const token of records.keys()) { tokens.push(stringify(token)); } return `R3Injector[${tokens.join(", ")}]`; } /** * Process a `SingleProvider` and add it. */ processProvider(provider) { provider = resolveForwardRef(provider); let token = isTypeProvider(provider) ? provider : resolveForwardRef(provider && provider.provide); const record = providerToRecord(provider); if (ngDevMode) { runInInjectorProfilerContext(this, token, () => { if (isValueProvider(provider)) { emitInjectorToCreateInstanceEvent(token); emitInstanceCreatedByInjectorEvent(provider.useValue); } emitProviderConfiguredEvent(provider); }); } if (!isTypeProvider(provider) && provider.multi === true) { let multiRecord = this.records.get(token); if (multiRecord) { if (ngDevMode && multiRecord.multi === void 0) { throwMixedMultiProviderError(); } } else { multiRecord = makeRecord(void 0, NOT_YET, true); multiRecord.factory = () => injectArgs(multiRecord.multi); this.records.set(token, multiRecord); } token = provider; multiRecord.multi.push(provider); } else { if (ngDevMode) { const existing = this.records.get(token); if (existing && existing.multi !== void 0) { throwMixedMultiProviderError(); } } } this.records.set(token, record); } hydrate(token, record, flags) { try { if (record.value === CIRCULAR) { throw cyclicDependencyError(stringify(token)); } else if (record.value === NOT_YET) { record.value =