static-injector
Version:
Angular 依赖注入独立版本;Angular dependency injection standalone version
1,524 lines (1,484 loc) • 83.5 kB
JavaScript
"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 =