@angular/core 20.1.0-rc.0 → 20.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/api.d.d.ts +1 -1
- package/chrome_dev_tools_performance.d.d.ts +1 -1
- package/discovery.d.d.ts +1 -1
- package/event_dispatcher.d.d.ts +1 -1
- package/fesm2022/attribute.mjs +1 -1
- package/fesm2022/core.mjs +48 -28
- package/fesm2022/core.mjs.map +1 -1
- package/fesm2022/debug_node.mjs +56 -14
- package/fesm2022/debug_node.mjs.map +1 -1
- package/fesm2022/not_found.mjs +1 -1
- package/fesm2022/primitives/di.mjs +1 -1
- package/fesm2022/primitives/event-dispatch.mjs +1 -1
- package/fesm2022/primitives/signals.mjs +1 -1
- package/fesm2022/resource.mjs +1 -1
- package/fesm2022/root_effect_scheduler.mjs +112 -53
- package/fesm2022/root_effect_scheduler.mjs.map +1 -1
- package/fesm2022/rxjs-interop.mjs +2 -2
- package/fesm2022/signal.mjs +1 -1
- package/fesm2022/testing.mjs +1 -1
- package/fesm2022/untracked.mjs +1 -1
- package/fesm2022/weak_ref.mjs +1 -1
- package/graph.d.d.ts +1 -1
- package/index.d.ts +16 -3
- package/package.json +2 -2
- package/primitives/di/index.d.ts +1 -1
- package/primitives/event-dispatch/index.d.ts +1 -1
- package/primitives/signals/index.d.ts +1 -1
- package/rxjs-interop/index.d.ts +1 -1
- package/schematics/bundles/{apply_import_manager-DEMoyu96.cjs → apply_import_manager-DnZuC0qd.cjs} +3 -3
- package/schematics/bundles/{checker-CwuJOWZI.cjs → checker-CwUJ2eKt.cjs} +470 -1127
- package/schematics/bundles/cleanup-unused-imports.cjs +6 -5
- package/schematics/bundles/{compiler_host-B1N_OYoF.cjs → compiler_host-CH53_d32.cjs} +2 -2
- package/schematics/bundles/control-flow-migration.cjs +3 -3
- package/schematics/bundles/document-core.cjs +6 -5
- package/schematics/bundles/imports-CIX-JgAN.cjs +1 -1
- package/schematics/bundles/{index-DPxKO2pR.cjs → index-BEVODdVo.cjs} +5 -4
- package/schematics/bundles/{index-CmuNlSML.cjs → index-C5Zc9zTo.cjs} +930 -54
- package/schematics/bundles/inject-flags.cjs +6 -5
- package/schematics/bundles/inject-migration.cjs +3 -3
- package/schematics/bundles/leading_space-D9nQ8UQC.cjs +1 -1
- package/schematics/bundles/{migrate_ts_type_references-Da3yLjVM.cjs → migrate_ts_type_references-i9f_TsT7.cjs} +6 -441
- package/schematics/bundles/ng_decorators-B5HCqr20.cjs +1 -1
- package/schematics/bundles/nodes-B16H9JUd.cjs +1 -1
- package/schematics/bundles/output-migration.cjs +7 -6
- package/schematics/bundles/{project_paths-86Qe1BQQ.cjs → project_paths-BrdiLiLU.cjs} +39 -3
- package/schematics/bundles/project_tsconfig_paths-CDVxT6Ov.cjs +1 -1
- package/schematics/bundles/property_name-BBwFuqMe.cjs +1 -1
- package/schematics/bundles/route-lazy-loading.cjs +3 -3
- package/schematics/bundles/self-closing-tags-migration.cjs +5 -4
- package/schematics/bundles/signal-input-migration.cjs +9 -8
- package/schematics/bundles/signal-queries-migration.cjs +8 -7
- package/schematics/bundles/signals.cjs +8 -7
- package/schematics/bundles/standalone-migration.cjs +4 -4
- package/schematics/bundles/symbol-VPWguRxr.cjs +1 -1
- package/schematics/bundles/test-bed-get.cjs +5 -4
- package/signal.d.d.ts +1 -1
- package/testing/index.d.ts +1 -1
- package/weak_ref.d.d.ts +1 -1
package/fesm2022/debug_node.mjs
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* @license Angular v20.1.
|
|
2
|
+
* @license Angular v20.1.1
|
|
3
3
|
* (c) 2010-2025 Google LLC. https://angular.io/
|
|
4
4
|
* License: MIT
|
|
5
5
|
*/
|
|
6
6
|
|
|
7
|
-
import { attachInjectFlag, _global, ɵɵdefineInjectable as __defineInjectable, ɵɵdefineInjector as __defineInjector, ɵɵinject as __inject, ɵɵinvalidFactoryDep as __invalidFactoryDep, resolveForwardRef, newArray, EMPTY_OBJ, assertString, assertNotEqual, FLAGS, assertEqual, isInCheckNoChangesMode, PREORDER_HOOK_FLAGS, assertFirstCreatePass, assertDefined, throwError, assertNumber, assertGreaterThan, HEADER_OFFSET, DECLARATION_VIEW, NG_FACTORY_DEF, isForwardRef, getFactoryDef, assertIndexInRange, assertTNodeForLView, enterDI, runInInjectorProfilerContext, getCurrentTNode, getLView, emitInjectorToCreateInstanceEvent, emitInstanceCreatedByInjectorEvent, throwProviderNotFoundError, leaveDI, assertNodeInjector,
|
|
7
|
+
import { attachInjectFlag, _global, ɵɵdefineInjectable as __defineInjectable, ɵɵdefineInjector as __defineInjector, ɵɵinject as __inject, ɵɵinvalidFactoryDep as __invalidFactoryDep, resolveForwardRef, newArray, EMPTY_OBJ, assertString, assertNotEqual, FLAGS, assertEqual, isInCheckNoChangesMode, PREORDER_HOOK_FLAGS, assertFirstCreatePass, assertDefined, throwError, assertNumber, assertGreaterThan, HEADER_OFFSET, DECLARATION_VIEW, NG_FACTORY_DEF, isForwardRef, getFactoryDef, assertIndexInRange, assertTNodeForLView, enterDI, runInInjectorProfilerContext, getCurrentTNode, getLView, emitInjectorToCreateInstanceEvent, emitInstanceCreatedByInjectorEvent, throwProviderNotFoundError, leaveDI, assertNodeInjector, stringifyForError, cyclicDependencyErrorWithDetails, cyclicDependencyError, setInjectorProfilerContext, setInjectImplementation, assertDirectiveDef, NG_ELEMENT_ID, convertToBitFlags, isRootView, T_HOST, TVIEW, injectRootLimpMode, isComponentDef, EMBEDDED_VIEW_INJECTOR, INJECTOR$1 as INJECTOR, DECLARATION_COMPONENT_VIEW, isComponentHost, RuntimeError, NG_PROV_DEF, getClosureSafeProperty, getNativeByTNode, flatten, arrayEquals, ID, isLView, assertDomNode, unwrapRNode, getComponentLViewByIndex, CONTEXT, EMPTY_ARRAY, assertLView, HOST, CHILD_HEAD, NEXT, isLContainer, getLViewParent, Injector, CLEANUP, getComponentDef, getDirectiveDef, InjectionToken, inject, isInSkipHydrationBlock as isInSkipHydrationBlock$1, HYDRATION, isContentQueryHost, setCurrentQueryIndex, XSS_SECURITY_URL, renderStringify, ENVIRONMENT, makeEnvironmentProviders, isDirectiveHost, formatRuntimeError, resetPreOrderHookFlags, PARENT, RENDERER, CHILD_TAIL, assertSame, assertFirstUpdatePass, getSelectedIndex, getTView, assertIndexInDeclRange, setSelectedIndex, assertLContainer, MOVED_VIEWS, isDestroyed, REACTIVE_TEMPLATE_CONSUMER, DECLARATION_LCONTAINER, QUERIES, assertNotReactive, ON_DESTROY_HOOKS, assertFunction, EFFECTS, assertProjectionSlots, NATIVE, assertParentView, CONTAINER_HEADER_OFFSET, assertNotSame, setCurrentDirectiveIndex, setCurrentTNode, getElementDepthCount, increaseElementDepthCount, wasLastNodeCreated, isCurrentTNodeParent, setCurrentTNodeAsNotParent, assertHasParent, INTERNAL_APPLICATION_ERROR_HANDLER, stringify, getCurrentDirectiveIndex, unwrapLView, isCreationMode, enterView, leaveView, AFTER_RENDER_SEQUENCES_TO_ADD, markAncestorsForTraversal, markViewForRefresh, setIsRefreshingViews, isExhaustiveCheckNoChanges, requiresRefreshOrTraversal, setIsInCheckNoChangesMode, CheckNoChangesMode, setBindingIndex, EFFECTS_TO_SCHEDULE, viewAttachedToChangeDetector, setBindingRootForHostBindings, isRefreshingViews, removeFromArray, addToArray, updateAncestorTraversalFlagsOnAttach, storeLViewOnDestroy, VIEW_REFS, assertGreaterThanOrEqual, isInI18nBlock, assertTNodeForTView, getCurrentParentTNode, getCurrentTNodePlaceholderOk, assertTNode, assertTIcu, assertNumberInRange, DEHYDRATED_VIEWS, getNgModuleDef, getPipeDef as getPipeDef$1, getNgModuleDefOrThrow, isStandalone, concatStringsWithSpace, assertInjectImplementationNotEqual, emitInjectEvent, getConstant, assertLessThan, getOrCreateTViewCleanup, getOrCreateLViewCleanup, assertNotDefined, nextBindingIndex, getSelectedTNode, getDirectiveDefOrThrow, getTNode, assertComponentType, debugStringifyTypeForError, ChangeDetectionScheduler, EnvironmentInjector, SVG_NAMESPACE, MATH_ML_NAMESPACE, viewAttachedToContainer, storeCleanupWithContext, signal, createInjectorWithoutInjectorInstances, R3Injector, getNullInjector, internalImportProvidersFrom, initNgDevMode, fillProperties, getBindingsEnabled, lastNodeWasCreated, isInInjectionContext, DestroyRef, PendingTasksInternal, noop, ErrorHandler, assertNotInReactiveContext, assertInInjectionContext, ViewContext, removeLViewOnDestroy, walkUpViews, getNativeByIndex, assertElement, arrayInsert2, arraySplice, setInjectorProfiler, NullInjector, ENVIRONMENT_INITIALIZER, INJECTOR_DEF_TYPES, walkProviderTree, getInjectorDef, deepForEach, isTypeProvider, isSignal, runInInjectionContext, ZONELESS_ENABLED, EffectScheduler, PendingTasks, assertTNodeCreationIndex, isSkipHydrationRootTNode, leaveSkipHydrationBlock, decreaseElementDepthCount, getNamespace, enterSkipHydrationBlock, getCurrentDirectiveDef, assertIndexInExpandoRange, getBindingIndex, assertOneOf, setInI18nBlock, nextContextImpl, getCurrentQueryIndex, getContextLView, load, keyValueArrayIndexOf, keyValueArraySet, keyValueArrayGet, incrementBindingIndex, isWritableSignal, store, providerToFactory, emitProviderConfiguredEvent, isClassProvider, getBindingRoot, NG_COMP_DEF, ɵɵresetView as __resetView, ɵɵnamespaceHTML as __namespaceHTML, ɵɵnamespaceMathML as __namespaceMathML, ɵɵnamespaceSVG as __namespaceSVG, ɵɵenableBindings as __enableBindings, ɵɵdisableBindings as __disableBindings, ɵɵrestoreView as __restoreView, forwardRef, NG_MOD_DEF, NG_INJ_DEF, NG_DIR_DEF, NG_PIPE_DEF, ZONELESS_SCHEDULER_DISABLED, SCHEDULE_IN_ROOT_ZONE, PROVIDED_ZONELESS, getNativeByTNodeOrNull } from './root_effect_scheduler.mjs';
|
|
8
8
|
import { setActiveConsumer, SIGNAL, consumerDestroy, REACTIVE_NODE, consumerPollProducersForChange, consumerBeforeComputation, getActiveConsumer, consumerAfterComputation, createComputed, setThrowInvalidWriteToSignalError } from './signal.mjs';
|
|
9
9
|
import { Subject, Subscription } from 'rxjs';
|
|
10
10
|
import { setActiveConsumer as setActiveConsumer$1 } from '@angular/core/primitives/signals';
|
|
@@ -989,6 +989,7 @@ const NO_PARENT_INJECTOR = -1;
|
|
|
989
989
|
*/
|
|
990
990
|
class NodeInjectorFactory {
|
|
991
991
|
factory;
|
|
992
|
+
name;
|
|
992
993
|
/**
|
|
993
994
|
* The inject implementation to be activated when using the factory.
|
|
994
995
|
*/
|
|
@@ -1071,8 +1072,11 @@ class NodeInjectorFactory {
|
|
|
1071
1072
|
/**
|
|
1072
1073
|
* Set to `true` if the token is declared in `viewProviders` (or if it is component).
|
|
1073
1074
|
*/
|
|
1074
|
-
isViewProvider, injectImplementation
|
|
1075
|
+
isViewProvider, injectImplementation,
|
|
1076
|
+
// Expect `null` in devmode
|
|
1077
|
+
name) {
|
|
1075
1078
|
this.factory = factory;
|
|
1079
|
+
this.name = name;
|
|
1076
1080
|
ngDevMode && assertDefined(factory, 'Factory not specified');
|
|
1077
1081
|
ngDevMode && assertEqual(typeof factory, 'function', 'Expected factory function.');
|
|
1078
1082
|
this.canSeeViewProviders = isViewProvider;
|
|
@@ -1936,6 +1940,10 @@ function locateDirectiveOrProvider(tNode, tView, token, canAccessViewProviders,
|
|
|
1936
1940
|
}
|
|
1937
1941
|
return null;
|
|
1938
1942
|
}
|
|
1943
|
+
/**
|
|
1944
|
+
* Used in ngDevMode to keep the injection path in case of cycles in DI.
|
|
1945
|
+
*/
|
|
1946
|
+
let injectionPath = [];
|
|
1939
1947
|
/**
|
|
1940
1948
|
* Retrieve or instantiate the injectable from the `LView` at particular `index`.
|
|
1941
1949
|
*
|
|
@@ -1948,8 +1956,15 @@ function getNodeInjectable(lView, tView, index, tNode, flags) {
|
|
|
1948
1956
|
const tData = tView.data;
|
|
1949
1957
|
if (value instanceof NodeInjectorFactory) {
|
|
1950
1958
|
const factory = value;
|
|
1959
|
+
ngDevMode && injectionPath.push(factory.name ?? 'unknown');
|
|
1951
1960
|
if (factory.resolving) {
|
|
1952
|
-
|
|
1961
|
+
const token = stringifyForError(tData[index]);
|
|
1962
|
+
if (ngDevMode) {
|
|
1963
|
+
throw cyclicDependencyErrorWithDetails(token, injectionPath);
|
|
1964
|
+
}
|
|
1965
|
+
else {
|
|
1966
|
+
throw cyclicDependencyError(token);
|
|
1967
|
+
}
|
|
1953
1968
|
}
|
|
1954
1969
|
const previousIncludeViewProviders = setIncludeViewProviders(factory.canSeeViewProviders);
|
|
1955
1970
|
factory.resolving = true;
|
|
@@ -1991,6 +2006,7 @@ function getNodeInjectable(lView, tView, index, tNode, flags) {
|
|
|
1991
2006
|
setIncludeViewProviders(previousIncludeViewProviders);
|
|
1992
2007
|
factory.resolving = false;
|
|
1993
2008
|
leaveDI();
|
|
2009
|
+
ngDevMode && (injectionPath = []);
|
|
1994
2010
|
}
|
|
1995
2011
|
}
|
|
1996
2012
|
return value;
|
|
@@ -8017,8 +8033,7 @@ function enableApplyRootElementTransformImpl() {
|
|
|
8017
8033
|
* object lookup) for performance reasons - the series of `if` checks seems to be the fastest way of
|
|
8018
8034
|
* mapping property names. Do NOT change without benchmarking.
|
|
8019
8035
|
*
|
|
8020
|
-
* Note: this mapping has to be kept in sync with the
|
|
8021
|
-
* type-checking machinery of ngtsc.
|
|
8036
|
+
* Note: this mapping has to be kept in sync with the equivalent mappings in the compiler.
|
|
8022
8037
|
*/
|
|
8023
8038
|
function mapPropName(name) {
|
|
8024
8039
|
if (name === 'class')
|
|
@@ -8044,6 +8059,10 @@ function setPropertyAndInputs(tNode, lView, propName, value, renderer, sanitizer
|
|
|
8044
8059
|
ngDevMode && setNgReflectProperties(lView, tView, tNode, propName, value);
|
|
8045
8060
|
return; // Stop propcessing if we've matched at least one input.
|
|
8046
8061
|
}
|
|
8062
|
+
// If the property is going to a DOM node, we have to remap it.
|
|
8063
|
+
if (tNode.type & 3 /* TNodeType.AnyRNode */) {
|
|
8064
|
+
propName = mapPropName(propName);
|
|
8065
|
+
}
|
|
8047
8066
|
setDomProperty(tNode, lView, propName, value, renderer, sanitizer);
|
|
8048
8067
|
}
|
|
8049
8068
|
/**
|
|
@@ -8058,7 +8077,6 @@ function setPropertyAndInputs(tNode, lView, propName, value, renderer, sanitizer
|
|
|
8058
8077
|
function setDomProperty(tNode, lView, propName, value, renderer, sanitizer) {
|
|
8059
8078
|
if (tNode.type & 3 /* TNodeType.AnyRNode */) {
|
|
8060
8079
|
const element = getNativeByTNode(tNode, lView);
|
|
8061
|
-
propName = mapPropName(propName);
|
|
8062
8080
|
if (ngDevMode) {
|
|
8063
8081
|
validateAgainstEventProperties(propName);
|
|
8064
8082
|
if (!isPropertyValid(element, propName, tNode.value, lView[TVIEW].schemas)) {
|
|
@@ -12638,7 +12656,7 @@ function configureViewWithDirective(tView, tNode, lView, directiveIndex, def) {
|
|
|
12638
12656
|
// Even though `directiveFactory` will already be using `ɵɵdirectiveInject` in its generated code,
|
|
12639
12657
|
// we also want to support `inject()` directly from the directive constructor context so we set
|
|
12640
12658
|
// `ɵɵdirectiveInject` as the inject implementation here too.
|
|
12641
|
-
const nodeInjectorFactory = new NodeInjectorFactory(directiveFactory, isComponentDef(def), ɵɵdirectiveInject);
|
|
12659
|
+
const nodeInjectorFactory = new NodeInjectorFactory(directiveFactory, isComponentDef(def), ɵɵdirectiveInject, ngDevMode ? def.type.name : null);
|
|
12642
12660
|
tView.blueprint[directiveIndex] = nodeInjectorFactory;
|
|
12643
12661
|
lView[directiveIndex] = nodeInjectorFactory;
|
|
12644
12662
|
registerHostBindingOpCodes(tView, tNode, directiveIndex, allocExpando(tView, lView, def.hostVars, NO_CHANGE), def);
|
|
@@ -13170,6 +13188,8 @@ function inputBindingUpdate(targetDirectiveIdx, publicName, value) {
|
|
|
13170
13188
|
if (bindingUpdated(lView, bindingIndex, value)) {
|
|
13171
13189
|
const tView = lView[TVIEW];
|
|
13172
13190
|
const tNode = getSelectedTNode();
|
|
13191
|
+
const componentLView = getComponentLViewByIndex(tNode.index, lView);
|
|
13192
|
+
markViewDirty(componentLView, 1 /* NotificationSource.SetInput */);
|
|
13173
13193
|
// TODO(pk): don't check on each and every binding, just assert in dev mode
|
|
13174
13194
|
const targetDef = tView.directiveRegistry[targetDirectiveIdx];
|
|
13175
13195
|
if (ngDevMode && !targetDef) {
|
|
@@ -13476,7 +13496,7 @@ class ComponentFactory extends ComponentFactory$1 {
|
|
|
13476
13496
|
}
|
|
13477
13497
|
function createRootTView(rootSelectorOrNode, componentDef, componentBindings, directives) {
|
|
13478
13498
|
const tAttributes = rootSelectorOrNode
|
|
13479
|
-
? ['ng-version', '20.1.
|
|
13499
|
+
? ['ng-version', '20.1.1']
|
|
13480
13500
|
: // Extract attributes and classes from the first selector only to match VE behavior.
|
|
13481
13501
|
extractAttrsAndClassesFromSelector(componentDef.selectors[0]);
|
|
13482
13502
|
let creationBindings = null;
|
|
@@ -27230,8 +27250,7 @@ function resolveProvider(provider, tInjectables, lInjectablesBlueprint, isCompon
|
|
|
27230
27250
|
const endIndex = tNode.directiveStart;
|
|
27231
27251
|
const cptViewProvidersCount = tNode.providerIndexes >> 20 /* TNodeProviderIndexes.CptViewProvidersCountShift */;
|
|
27232
27252
|
if (isTypeProvider(provider) || !provider.multi) {
|
|
27233
|
-
|
|
27234
|
-
const factory = new NodeInjectorFactory(providerFactory, isViewProvider, ɵɵdirectiveInject);
|
|
27253
|
+
const factory = new NodeInjectorFactory(providerFactory, isViewProvider, ɵɵdirectiveInject, ngDevMode ? providerName(provider) : null);
|
|
27235
27254
|
const existingFactoryIndex = indexOf(token, tInjectables, isViewProvider ? beginIndex : beginIndex + cptViewProvidersCount, endIndex);
|
|
27236
27255
|
if (existingFactoryIndex === -1) {
|
|
27237
27256
|
diPublicInInjector(getOrCreateNodeInjectorForNode(tNode, lView), tView, token);
|
|
@@ -27280,7 +27299,7 @@ function resolveProvider(provider, tInjectables, lInjectablesBlueprint, isCompon
|
|
|
27280
27299
|
(!isViewProvider && !doesProvidersFactoryExist)) {
|
|
27281
27300
|
// Cases 1.a and 2.a
|
|
27282
27301
|
diPublicInInjector(getOrCreateNodeInjectorForNode(tNode, lView), tView, token);
|
|
27283
|
-
const factory = multiFactory(isViewProvider ? multiViewProvidersFactoryResolver : multiProvidersFactoryResolver, lInjectablesBlueprint.length, isViewProvider, isComponent, providerFactory);
|
|
27302
|
+
const factory = multiFactory(isViewProvider ? multiViewProvidersFactoryResolver : multiProvidersFactoryResolver, lInjectablesBlueprint.length, isViewProvider, isComponent, providerFactory, provider);
|
|
27284
27303
|
if (!isViewProvider && doesViewProvidersFactoryExist) {
|
|
27285
27304
|
lInjectablesBlueprint[existingViewProvidersFactoryIndex].providerFactory = factory;
|
|
27286
27305
|
}
|
|
@@ -27408,14 +27427,37 @@ function multiResolve(factories, result) {
|
|
|
27408
27427
|
/**
|
|
27409
27428
|
* Creates a multi factory.
|
|
27410
27429
|
*/
|
|
27411
|
-
function multiFactory(factoryFn, index, isViewProvider, isComponent, f) {
|
|
27412
|
-
const factory = new NodeInjectorFactory(factoryFn, isViewProvider, ɵɵdirectiveInject);
|
|
27430
|
+
function multiFactory(factoryFn, index, isViewProvider, isComponent, f, provider) {
|
|
27431
|
+
const factory = new NodeInjectorFactory(factoryFn, isViewProvider, ɵɵdirectiveInject, ngDevMode ? providerName(provider) : null);
|
|
27413
27432
|
factory.multi = [];
|
|
27414
27433
|
factory.index = index;
|
|
27415
27434
|
factory.componentProviders = 0;
|
|
27416
27435
|
multiFactoryAdd(factory, f, isComponent && !isViewProvider);
|
|
27417
27436
|
return factory;
|
|
27418
27437
|
}
|
|
27438
|
+
function providerName(provider) {
|
|
27439
|
+
if (Array.isArray(provider)) {
|
|
27440
|
+
return null;
|
|
27441
|
+
}
|
|
27442
|
+
if (isTypeProvider(provider)) {
|
|
27443
|
+
return provider.name;
|
|
27444
|
+
}
|
|
27445
|
+
else if (isClassProvider(provider)) {
|
|
27446
|
+
if (provider.provide instanceof InjectionToken) {
|
|
27447
|
+
return `('${provider.provide.toString()}':${provider.useClass.name})`;
|
|
27448
|
+
}
|
|
27449
|
+
return provider.useClass.name;
|
|
27450
|
+
}
|
|
27451
|
+
else if (provider.provide instanceof InjectionToken) {
|
|
27452
|
+
return provider.provide.toString();
|
|
27453
|
+
}
|
|
27454
|
+
else if (typeof provider.provide === 'string') {
|
|
27455
|
+
return provider.provide;
|
|
27456
|
+
}
|
|
27457
|
+
else {
|
|
27458
|
+
return null;
|
|
27459
|
+
}
|
|
27460
|
+
}
|
|
27419
27461
|
|
|
27420
27462
|
/**
|
|
27421
27463
|
* This feature resolves the providers of a directive (or component),
|