@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.
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 +48 -28
  7. package/fesm2022/core.mjs.map +1 -1
  8. package/fesm2022/debug_node.mjs +56 -14
  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 +16 -3
  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-DEMoyu96.cjs → apply_import_manager-DnZuC0qd.cjs} +3 -3
  30. package/schematics/bundles/{checker-CwuJOWZI.cjs → checker-CwUJ2eKt.cjs} +470 -1127
  31. package/schematics/bundles/cleanup-unused-imports.cjs +6 -5
  32. package/schematics/bundles/{compiler_host-B1N_OYoF.cjs → compiler_host-CH53_d32.cjs} +2 -2
  33. package/schematics/bundles/control-flow-migration.cjs +3 -3
  34. package/schematics/bundles/document-core.cjs +6 -5
  35. package/schematics/bundles/imports-CIX-JgAN.cjs +1 -1
  36. package/schematics/bundles/{index-DPxKO2pR.cjs → index-BEVODdVo.cjs} +5 -4
  37. package/schematics/bundles/{index-CmuNlSML.cjs → index-C5Zc9zTo.cjs} +930 -54
  38. package/schematics/bundles/inject-flags.cjs +6 -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-Da3yLjVM.cjs → migrate_ts_type_references-i9f_TsT7.cjs} +6 -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 +7 -6
  45. package/schematics/bundles/{project_paths-86Qe1BQQ.cjs → project_paths-BrdiLiLU.cjs} +39 -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 +5 -4
  50. package/schematics/bundles/signal-input-migration.cjs +9 -8
  51. package/schematics/bundles/signal-queries-migration.cjs +8 -7
  52. package/schematics/bundles/signals.cjs +8 -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 +5 -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.1.0-rc.0
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, 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;
@@ -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 equally named mapping in the template
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.0-rc.0']
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
- // Single provider case: the factory is created and pushed immediately
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),