@angular/core 20.2.0-next.0 → 20.2.0-next.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.
Files changed (58) hide show
  1. package/api.d.d.ts +1 -1
  2. package/chrome_dev_tools_performance.d.d.ts +1 -1
  3. package/discovery.d.d.ts +1 -1
  4. package/event_dispatcher.d.d.ts +1 -1
  5. package/fesm2022/attribute.mjs +1 -1
  6. package/fesm2022/core.mjs +47 -27
  7. package/fesm2022/core.mjs.map +1 -1
  8. package/fesm2022/debug_node.mjs +51 -11
  9. package/fesm2022/debug_node.mjs.map +1 -1
  10. package/fesm2022/not_found.mjs +1 -1
  11. package/fesm2022/primitives/di.mjs +1 -1
  12. package/fesm2022/primitives/event-dispatch.mjs +1 -1
  13. package/fesm2022/primitives/signals.mjs +1 -1
  14. package/fesm2022/resource.mjs +1 -1
  15. package/fesm2022/root_effect_scheduler.mjs +112 -53
  16. package/fesm2022/root_effect_scheduler.mjs.map +1 -1
  17. package/fesm2022/rxjs-interop.mjs +2 -2
  18. package/fesm2022/signal.mjs +1 -1
  19. package/fesm2022/testing.mjs +1 -1
  20. package/fesm2022/untracked.mjs +1 -1
  21. package/fesm2022/weak_ref.mjs +1 -1
  22. package/graph.d.d.ts +1 -1
  23. package/index.d.ts +15 -2
  24. package/package.json +2 -2
  25. package/primitives/di/index.d.ts +1 -1
  26. package/primitives/event-dispatch/index.d.ts +1 -1
  27. package/primitives/signals/index.d.ts +1 -1
  28. package/rxjs-interop/index.d.ts +1 -1
  29. package/schematics/bundles/{apply_import_manager-B0fYYMpr.cjs → apply_import_manager-ceekZYTK.cjs} +3 -3
  30. package/schematics/bundles/{checker-DLInMAS3.cjs → checker-BVY3FNBy.cjs} +604 -344
  31. package/schematics/bundles/cleanup-unused-imports.cjs +5 -5
  32. package/schematics/bundles/{compiler_host-Doj9KVJf.cjs → compiler_host-DRAgYPzr.cjs} +2 -2
  33. package/schematics/bundles/control-flow-migration.cjs +3 -3
  34. package/schematics/bundles/document-core.cjs +5 -5
  35. package/schematics/bundles/imports-CIX-JgAN.cjs +1 -1
  36. package/schematics/bundles/{index-BmuUS1AB.cjs → index-B7rvD9dh.cjs} +13 -13
  37. package/schematics/bundles/{index-Bp8sCiq1.cjs → index-DkKydW5H.cjs} +4 -4
  38. package/schematics/bundles/inject-flags.cjs +5 -5
  39. package/schematics/bundles/inject-migration.cjs +3 -3
  40. package/schematics/bundles/leading_space-D9nQ8UQC.cjs +1 -1
  41. package/schematics/bundles/{migrate_ts_type_references-CmZ0155c.cjs → migrate_ts_type_references-BRFh6uWT.cjs} +5 -441
  42. package/schematics/bundles/ng_decorators-B5HCqr20.cjs +1 -1
  43. package/schematics/bundles/nodes-B16H9JUd.cjs +1 -1
  44. package/schematics/bundles/output-migration.cjs +6 -6
  45. package/schematics/bundles/{project_paths-D2SJWT7x.cjs → project_paths-zgvnBQD8.cjs} +3 -3
  46. package/schematics/bundles/project_tsconfig_paths-CDVxT6Ov.cjs +1 -1
  47. package/schematics/bundles/property_name-BBwFuqMe.cjs +1 -1
  48. package/schematics/bundles/route-lazy-loading.cjs +3 -3
  49. package/schematics/bundles/self-closing-tags-migration.cjs +4 -4
  50. package/schematics/bundles/signal-input-migration.cjs +8 -8
  51. package/schematics/bundles/signal-queries-migration.cjs +7 -7
  52. package/schematics/bundles/signals.cjs +7 -7
  53. package/schematics/bundles/standalone-migration.cjs +4 -4
  54. package/schematics/bundles/symbol-VPWguRxr.cjs +1 -1
  55. package/schematics/bundles/test-bed-get.cjs +4 -4
  56. package/signal.d.d.ts +1 -1
  57. package/testing/index.d.ts +1 -1
  58. package/weak_ref.d.d.ts +1 -1
@@ -1,10 +1,10 @@
1
1
  /**
2
- * @license Angular v20.2.0-next.0
2
+ * @license Angular v20.2.0-next.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, throwCyclicDependencyError, stringifyForError, 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';
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
- throwCyclicDependencyError(stringifyForError(tData[index]));
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;
@@ -12640,7 +12656,7 @@ function configureViewWithDirective(tView, tNode, lView, directiveIndex, def) {
12640
12656
  // Even though `directiveFactory` will already be using `ɵɵdirectiveInject` in its generated code,
12641
12657
  // we also want to support `inject()` directly from the directive constructor context so we set
12642
12658
  // `ɵɵdirectiveInject` as the inject implementation here too.
12643
- const nodeInjectorFactory = new NodeInjectorFactory(directiveFactory, isComponentDef(def), ɵɵdirectiveInject);
12659
+ const nodeInjectorFactory = new NodeInjectorFactory(directiveFactory, isComponentDef(def), ɵɵdirectiveInject, ngDevMode ? def.type.name : null);
12644
12660
  tView.blueprint[directiveIndex] = nodeInjectorFactory;
12645
12661
  lView[directiveIndex] = nodeInjectorFactory;
12646
12662
  registerHostBindingOpCodes(tView, tNode, directiveIndex, allocExpando(tView, lView, def.hostVars, NO_CHANGE), def);
@@ -13172,6 +13188,8 @@ function inputBindingUpdate(targetDirectiveIdx, publicName, value) {
13172
13188
  if (bindingUpdated(lView, bindingIndex, value)) {
13173
13189
  const tView = lView[TVIEW];
13174
13190
  const tNode = getSelectedTNode();
13191
+ const componentLView = getComponentLViewByIndex(tNode.index, lView);
13192
+ markViewDirty(componentLView, 1 /* NotificationSource.SetInput */);
13175
13193
  // TODO(pk): don't check on each and every binding, just assert in dev mode
13176
13194
  const targetDef = tView.directiveRegistry[targetDirectiveIdx];
13177
13195
  if (ngDevMode && !targetDef) {
@@ -13478,7 +13496,7 @@ class ComponentFactory extends ComponentFactory$1 {
13478
13496
  }
13479
13497
  function createRootTView(rootSelectorOrNode, componentDef, componentBindings, directives) {
13480
13498
  const tAttributes = rootSelectorOrNode
13481
- ? ['ng-version', '20.2.0-next.0']
13499
+ ? ['ng-version', '20.2.0-next.1']
13482
13500
  : // Extract attributes and classes from the first selector only to match VE behavior.
13483
13501
  extractAttrsAndClassesFromSelector(componentDef.selectors[0]);
13484
13502
  let creationBindings = null;
@@ -27232,8 +27250,7 @@ function resolveProvider(provider, tInjectables, lInjectablesBlueprint, isCompon
27232
27250
  const endIndex = tNode.directiveStart;
27233
27251
  const cptViewProvidersCount = tNode.providerIndexes >> 20 /* TNodeProviderIndexes.CptViewProvidersCountShift */;
27234
27252
  if (isTypeProvider(provider) || !provider.multi) {
27235
- // Single provider case: the factory is created and pushed immediately
27236
- const factory = new NodeInjectorFactory(providerFactory, isViewProvider, ɵɵdirectiveInject);
27253
+ const factory = new NodeInjectorFactory(providerFactory, isViewProvider, ɵɵdirectiveInject, ngDevMode ? providerName(provider) : null);
27237
27254
  const existingFactoryIndex = indexOf(token, tInjectables, isViewProvider ? beginIndex : beginIndex + cptViewProvidersCount, endIndex);
27238
27255
  if (existingFactoryIndex === -1) {
27239
27256
  diPublicInInjector(getOrCreateNodeInjectorForNode(tNode, lView), tView, token);
@@ -27282,7 +27299,7 @@ function resolveProvider(provider, tInjectables, lInjectablesBlueprint, isCompon
27282
27299
  (!isViewProvider && !doesProvidersFactoryExist)) {
27283
27300
  // Cases 1.a and 2.a
27284
27301
  diPublicInInjector(getOrCreateNodeInjectorForNode(tNode, lView), tView, token);
27285
- const factory = multiFactory(isViewProvider ? multiViewProvidersFactoryResolver : multiProvidersFactoryResolver, lInjectablesBlueprint.length, isViewProvider, isComponent, providerFactory);
27302
+ const factory = multiFactory(isViewProvider ? multiViewProvidersFactoryResolver : multiProvidersFactoryResolver, lInjectablesBlueprint.length, isViewProvider, isComponent, providerFactory, provider);
27286
27303
  if (!isViewProvider && doesViewProvidersFactoryExist) {
27287
27304
  lInjectablesBlueprint[existingViewProvidersFactoryIndex].providerFactory = factory;
27288
27305
  }
@@ -27410,14 +27427,37 @@ function multiResolve(factories, result) {
27410
27427
  /**
27411
27428
  * Creates a multi factory.
27412
27429
  */
27413
- function multiFactory(factoryFn, index, isViewProvider, isComponent, f) {
27414
- 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);
27415
27432
  factory.multi = [];
27416
27433
  factory.index = index;
27417
27434
  factory.componentProviders = 0;
27418
27435
  multiFactoryAdd(factory, f, isComponent && !isViewProvider);
27419
27436
  return factory;
27420
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
+ }
27421
27461
 
27422
27462
  /**
27423
27463
  * This feature resolves the providers of a directive (or component),