@angular/core 21.0.0-next.3 → 21.0.0-next.5

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 (78) hide show
  1. package/api.d.d.ts +7 -4
  2. package/chrome_dev_tools_performance.d.d.ts +1 -1
  3. package/discovery.d.d.ts +48 -21
  4. package/effect.d.d.ts +1 -2
  5. package/event_dispatcher.d.d.ts +1 -1
  6. package/fesm2022/attribute.mjs +1 -1
  7. package/fesm2022/attribute.mjs.map +1 -1
  8. package/fesm2022/core.mjs +228 -72
  9. package/fesm2022/core.mjs.map +1 -1
  10. package/fesm2022/debug_node.mjs +564 -747
  11. package/fesm2022/debug_node.mjs.map +1 -1
  12. package/fesm2022/effect.mjs +3 -4
  13. package/fesm2022/effect.mjs.map +1 -1
  14. package/fesm2022/not_found.mjs +1 -1
  15. package/fesm2022/not_found.mjs.map +1 -1
  16. package/fesm2022/primitives/di.mjs +1 -1
  17. package/fesm2022/primitives/di.mjs.map +1 -1
  18. package/fesm2022/primitives/event-dispatch.mjs +1 -1
  19. package/fesm2022/primitives/event-dispatch.mjs.map +1 -1
  20. package/fesm2022/primitives/signals.mjs +4 -5
  21. package/fesm2022/primitives/signals.mjs.map +1 -1
  22. package/fesm2022/resource.mjs +5 -4
  23. package/fesm2022/resource.mjs.map +1 -1
  24. package/fesm2022/root_effect_scheduler.mjs +61 -45
  25. package/fesm2022/root_effect_scheduler.mjs.map +1 -1
  26. package/fesm2022/rxjs-interop.mjs +3 -1
  27. package/fesm2022/rxjs-interop.mjs.map +1 -1
  28. package/fesm2022/signal.mjs +32 -11
  29. package/fesm2022/signal.mjs.map +1 -1
  30. package/fesm2022/testing.mjs +4 -4
  31. package/fesm2022/testing.mjs.map +1 -1
  32. package/fesm2022/weak_ref.mjs +1 -1
  33. package/fesm2022/weak_ref.mjs.map +1 -1
  34. package/graph.d.d.ts +24 -4
  35. package/index.d.ts +19 -140
  36. package/package.json +2 -2
  37. package/primitives/di/index.d.ts +1 -1
  38. package/primitives/event-dispatch/index.d.ts +1 -1
  39. package/primitives/signals/index.d.ts +2 -3
  40. package/rxjs-interop/index.d.ts +3 -1
  41. package/schematics/bundles/add-bootstrap-context-to-server-main.cjs +5 -5
  42. package/schematics/bundles/application-config-core.cjs +6 -6
  43. package/schematics/bundles/{apply_import_manager-tNexl58m.cjs → apply_import_manager-Bx60Uquz.cjs} +3 -3
  44. package/schematics/bundles/bootstrap-options-migration.cjs +637 -0
  45. package/schematics/bundles/cleanup-unused-imports.cjs +5 -5
  46. package/schematics/bundles/{compiler_host-Df7s6Riz.cjs → compiler_host-Aouk-n4F.cjs} +2 -2
  47. package/schematics/bundles/control-flow-migration.cjs +71 -39
  48. package/schematics/bundles/{imports-26VeX8i-.cjs → imports-DwPXlGFl.cjs} +27 -1
  49. package/schematics/bundles/{index-Clvp4COX.cjs → index-BZQb51Qf.cjs} +4 -4
  50. package/schematics/bundles/{index-CBaykQBv.cjs → index-Bb6iejCd.cjs} +130 -41
  51. package/schematics/bundles/inject-migration.cjs +5 -5
  52. package/schematics/bundles/leading_space-D9nQ8UQC.cjs +1 -1
  53. package/schematics/bundles/{migrate_ts_type_references-C_gTvDtH.cjs → migrate_ts_type_references-By2ZtKls.cjs} +5 -5
  54. package/schematics/bundles/{ng_component_template-HYGPuVhy.cjs → ng_component_template-B4M8mTyv.cjs} +3 -3
  55. package/schematics/bundles/{ng_decorators-CtYwz9Lw.cjs → ng_decorators-BI0uV7KI.cjs} +2 -2
  56. package/schematics/bundles/ngclass-to-class-migration.cjs +110 -98
  57. package/schematics/bundles/ngstyle-to-style-migration.cjs +490 -0
  58. package/schematics/bundles/nodes-B16H9JUd.cjs +1 -1
  59. package/schematics/bundles/output-migration.cjs +6 -6
  60. package/schematics/bundles/parse_html-7Wl_HDnw.cjs +132 -0
  61. package/schematics/bundles/{project_paths-BJTqcWvC.cjs → project_paths-Dr2s3Pq3.cjs} +3 -3
  62. package/schematics/bundles/{project_tsconfig_paths-bRwOJEk9.cjs → project_tsconfig_paths-DX9KHLn9.cjs} +423 -236
  63. package/schematics/bundles/property_name-BBwFuqMe.cjs +1 -1
  64. package/schematics/bundles/route-lazy-loading.cjs +48 -4
  65. package/schematics/bundles/router-current-navigation.cjs +6 -6
  66. package/schematics/bundles/router-last-successful-navigation.cjs +6 -6
  67. package/schematics/bundles/self-closing-tags-migration.cjs +8 -8
  68. package/schematics/bundles/signal-input-migration.cjs +17 -9
  69. package/schematics/bundles/signal-queries-migration.cjs +7 -7
  70. package/schematics/bundles/signals.cjs +7 -7
  71. package/schematics/bundles/standalone-migration.cjs +17 -10
  72. package/schematics/bundles/{symbol-VPWguRxr.cjs → symbol-BObKoqes.cjs} +3 -2
  73. package/schematics/collection.json +6 -0
  74. package/schematics/migrations/ngstyle-to-style-migration/schema.json +20 -0
  75. package/schematics/migrations.json +5 -0
  76. package/testing/index.d.ts +1 -1
  77. package/weak_ref.d.d.ts +1 -1
  78. package/schematics/bundles/parse_html-CLFKoiOK.cjs +0 -41
@@ -1,10 +1,10 @@
1
1
  /**
2
- * @license Angular v21.0.0-next.3
2
+ * @license Angular v21.0.0-next.5
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, 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, NgZone, ErrorHandler, assertNotInReactiveContext, assertInInjectionContext, DestroyRef, ViewContext, removeLViewOnDestroy, walkUpViews, getNativeByIndex, assertElement, arrayInsert2, arraySplice, setInjectorProfiler, NullInjector, ENVIRONMENT_INITIALIZER, INJECTOR_DEF_TYPES, walkProviderTree, getInjectorDef, deepForEach, isTypeProvider, isSignal, isInInjectionContext, runInInjectionContext, ZONELESS_ENABLED, EffectScheduler, PendingTasksInternal, PendingTasks, getAnimationElementRemovalRegistry, assertTNodeCreationIndex, isSkipHydrationRootTNode, leaveSkipHydrationBlock, decreaseElementDepthCount, getNamespace, enterSkipHydrationBlock, getCurrentDirectiveDef, assertIndexInExpandoRange, getBindingIndex, assertOneOf, setInI18nBlock, nextContextImpl, getCurrentQueryIndex, getContextLView, load, keyValueArrayIndexOf, keyValueArraySet, keyValueArrayGet, incrementBindingIndex, isWritableSignal, store, providerToFactory, emitProviderConfiguredEvent, isClassProvider, setAnimationElementRemovalRegistry, 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, SCHEDULE_IN_ROOT_ZONE, SCHEDULE_IN_ROOT_ZONE_DEFAULT, ZONELESS_SCHEDULER_DISABLED, angularZoneInstanceIdProperty, NoopNgZone, scheduleCallbackWithMicrotask, PROVIDED_ZONELESS, scheduleCallbackWithRafRace, 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, ENVIRONMENT_INITIALIZER, 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, ANIMATIONS, 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, NgZone, ErrorHandler, assertNotInReactiveContext, assertInInjectionContext, DestroyRef, ViewContext, removeLViewOnDestroy, walkUpViews, getNativeByIndex, assertElement, arrayInsert2, arraySplice, setInjectorProfiler, NullInjector, INJECTOR_DEF_TYPES, walkProviderTree, getInjectorDef, deepForEach, isTypeProvider, isSignal, isInInjectionContext, runInInjectionContext, ZONELESS_ENABLED, EffectScheduler, PendingTasksInternal, 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, angularZoneInstanceIdProperty, SCHEDULE_IN_ROOT_ZONE, scheduleCallbackWithMicrotask, PROVIDED_ZONELESS, NoopNgZone, scheduleCallbackWithRafRace, 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';
@@ -3569,12 +3569,25 @@ function getDocument() {
3569
3569
  *
3570
3570
  * @publicApi
3571
3571
  */
3572
- const APP_ID = new InjectionToken(ngDevMode ? 'AppId' : '', {
3572
+ const APP_ID = new InjectionToken(typeof ngDevMode !== undefined && ngDevMode ? 'AppId' : '', {
3573
3573
  providedIn: 'root',
3574
3574
  factory: () => DEFAULT_APP_ID,
3575
3575
  });
3576
3576
  /** Default value of the `APP_ID` token. */
3577
3577
  const DEFAULT_APP_ID = 'ng';
3578
+ /** Initializer check for the validity of the APP_ID */
3579
+ const validAppIdInitializer = {
3580
+ provide: ENVIRONMENT_INITIALIZER,
3581
+ multi: true,
3582
+ useValue: () => {
3583
+ const appId = inject(APP_ID);
3584
+ const isAlphanumeric = /^[a-zA-Z0-9\-_]+$/.test(appId);
3585
+ if (!isAlphanumeric) {
3586
+ throw new RuntimeError(211 /* RuntimeErrorCode.INVALID_APP_ID */, `APP_ID value "${appId}" is not alphanumeric. ` +
3587
+ `The APP_ID must be a string of alphanumeric characters. (a-zA-Z0-9), hyphens (-) and underscores (_) are allowed.`);
3588
+ }
3589
+ },
3590
+ };
3578
3591
  /**
3579
3592
  * A function that is executed when a platform is initialized.
3580
3593
  *
@@ -3584,12 +3597,12 @@ const DEFAULT_APP_ID = 'ng';
3584
3597
  *
3585
3598
  * @publicApi
3586
3599
  */
3587
- const PLATFORM_INITIALIZER = new InjectionToken(ngDevMode ? 'Platform Initializer' : '');
3600
+ const PLATFORM_INITIALIZER = new InjectionToken(typeof ngDevMode !== undefined && ngDevMode ? 'Platform Initializer' : '');
3588
3601
  /**
3589
3602
  * A token that indicates an opaque platform ID.
3590
3603
  * @publicApi
3591
3604
  */
3592
- const PLATFORM_ID = new InjectionToken(ngDevMode ? 'Platform ID' : '', {
3605
+ const PLATFORM_ID = new InjectionToken(typeof ngDevMode !== undefined && ngDevMode ? 'Platform ID' : '', {
3593
3606
  providedIn: 'platform',
3594
3607
  factory: () => 'unknown', // set a default platform name, when none set explicitly
3595
3608
  });
@@ -3601,7 +3614,7 @@ const PLATFORM_ID = new InjectionToken(ngDevMode ? 'Platform ID' : '', {
3601
3614
  * module has been loaded.
3602
3615
  * @publicApi
3603
3616
  */
3604
- const ANIMATION_MODULE_TYPE = new InjectionToken(ngDevMode ? 'AnimationModuleType' : '');
3617
+ const ANIMATION_MODULE_TYPE = new InjectionToken(typeof ngDevMode !== undefined && ngDevMode ? 'AnimationModuleType' : '');
3605
3618
  // TODO(crisbeto): link to CSP guide here.
3606
3619
  /**
3607
3620
  * Token used to configure the [Content Security Policy](https://web.dev/strict-csp/) nonce that
@@ -3610,7 +3623,7 @@ const ANIMATION_MODULE_TYPE = new InjectionToken(ngDevMode ? 'AnimationModuleTyp
3610
3623
  *
3611
3624
  * @publicApi
3612
3625
  */
3613
- const CSP_NONCE = new InjectionToken(ngDevMode ? 'CSP nonce' : '', {
3626
+ const CSP_NONCE = new InjectionToken(typeof ngDevMode !== undefined && ngDevMode ? 'CSP nonce' : '', {
3614
3627
  providedIn: 'root',
3615
3628
  factory: () => {
3616
3629
  // Ideally we wouldn't have to use `querySelector` here since we know that the nonce will be on
@@ -3648,7 +3661,7 @@ const IMAGE_CONFIG_DEFAULTS = {
3648
3661
  * @see {@link ImageConfig}
3649
3662
  * @publicApi
3650
3663
  */
3651
- const IMAGE_CONFIG = new InjectionToken(ngDevMode ? 'ImageConfig' : '', {
3664
+ const IMAGE_CONFIG = new InjectionToken(typeof ngDevMode !== undefined && ngDevMode ? 'ImageConfig' : '', {
3652
3665
  providedIn: 'root',
3653
3666
  factory: () => IMAGE_CONFIG_DEFAULTS,
3654
3667
  });
@@ -3835,7 +3848,7 @@ const IS_INCREMENTAL_HYDRATION_ENABLED = new InjectionToken(typeof ngDevMode ===
3835
3848
  /**
3836
3849
  * A map of DOM elements with `jsaction` attributes grouped by action names.
3837
3850
  */
3838
- const JSACTION_BLOCK_ELEMENT_MAP = new InjectionToken(ngDevMode ? 'JSACTION_BLOCK_ELEMENT_MAP' : '', {
3851
+ const JSACTION_BLOCK_ELEMENT_MAP = new InjectionToken(typeof ngDevMode !== undefined && ngDevMode ? 'JSACTION_BLOCK_ELEMENT_MAP' : '', {
3839
3852
  providedIn: 'root',
3840
3853
  factory: () => new Map(),
3841
3854
  });
@@ -4053,7 +4066,7 @@ const removeListeners = (el) => {
4053
4066
  el.removeAttribute(DEFER_BLOCK_SSR_ID_ATTRIBUTE);
4054
4067
  el.__jsaction_fns = undefined;
4055
4068
  };
4056
- const JSACTION_EVENT_CONTRACT = new InjectionToken(ngDevMode ? 'EVENT_CONTRACT_DETAILS' : '', {
4069
+ const JSACTION_EVENT_CONTRACT = new InjectionToken(typeof ngDevMode !== undefined && ngDevMode ? 'EVENT_CONTRACT_DETAILS' : '', {
4057
4070
  providedIn: 'root',
4058
4071
  factory: () => ({}),
4059
4072
  });
@@ -4121,7 +4134,7 @@ function enableStashEventListenerImpl() {
4121
4134
  * An internal injection token to reference `DehydratedBlockRegistry` implementation
4122
4135
  * in a tree-shakable way.
4123
4136
  */
4124
- const DEHYDRATED_BLOCK_REGISTRY = new InjectionToken(ngDevMode ? 'DEHYDRATED_BLOCK_REGISTRY' : '');
4137
+ const DEHYDRATED_BLOCK_REGISTRY = new InjectionToken(typeof ngDevMode !== undefined && ngDevMode ? 'DEHYDRATED_BLOCK_REGISTRY' : '');
4125
4138
  /**
4126
4139
  * The DehydratedBlockRegistry is used for incremental hydration purposes. It keeps
4127
4140
  * track of the Defer Blocks that need hydration so we can effectively
@@ -6223,8 +6236,8 @@ function assertStandaloneComponentType(type) {
6223
6236
  if (!componentDef.standalone) {
6224
6237
  throw new RuntimeError(907 /* RuntimeErrorCode.TYPE_IS_NOT_STANDALONE */, `The ${stringifyForError(type)} component is not marked as standalone, ` +
6225
6238
  `but Angular expects to have a standalone component here. ` +
6226
- `Please make sure the ${stringifyForError(type)} component has ` +
6227
- `the \`standalone: true\` flag in the decorator.`);
6239
+ `Please make sure the ${stringifyForError(type)} component does not have ` +
6240
+ `the \`standalone: false\` flag in the decorator.`);
6228
6241
  }
6229
6242
  }
6230
6243
  /** Verifies whether a given type is a component */
@@ -6803,9 +6816,11 @@ function nativeAppendOrInsertBefore(renderer, parent, child, beforeNode, isMove)
6803
6816
  * @param renderer A renderer to be used
6804
6817
  * @param rNode The native node that should be removed
6805
6818
  * @param isHostElement A flag indicating if a node to be removed is a host of a component.
6819
+ * @param requireSynchronousElementRemoval A flag indicating if a node requires synchronous
6820
+ * removal from the DOM.
6806
6821
  */
6807
- function nativeRemoveNode(renderer, rNode, isHostElement) {
6808
- renderer.removeChild(null, rNode, isHostElement);
6822
+ function nativeRemoveNode(renderer, rNode, isHostElement, requireSynchronousElementRemoval) {
6823
+ renderer.removeChild(null, rNode, isHostElement, requireSynchronousElementRemoval);
6809
6824
  }
6810
6825
  /**
6811
6826
  * Clears the contents of a given RElement.
@@ -7208,11 +7223,123 @@ function ensureIcuContainerVisitorLoaded(loader) {
7208
7223
  }
7209
7224
  }
7210
7225
 
7226
+ /** Parses a CSS time value to milliseconds. */
7227
+ function parseCssTimeUnitsToMs(value) {
7228
+ // Some browsers will return it in seconds, whereas others will return milliseconds.
7229
+ const multiplier = value.toLowerCase().indexOf('ms') > -1 ? 1 : 1000;
7230
+ return parseFloat(value) * multiplier;
7231
+ }
7232
+ /** Parses out multiple values from a computed style into an array. */
7233
+ function parseCssPropertyValue(computedStyle, name) {
7234
+ const value = computedStyle.getPropertyValue(name);
7235
+ return value.split(',').map((part) => part.trim());
7236
+ }
7237
+ /** Gets the transform transition duration, including the delay, of an element in milliseconds. */
7238
+ function getLongestComputedTransition(computedStyle) {
7239
+ const transitionedProperties = parseCssPropertyValue(computedStyle, 'transition-property');
7240
+ const rawDurations = parseCssPropertyValue(computedStyle, 'transition-duration');
7241
+ const rawDelays = parseCssPropertyValue(computedStyle, 'transition-delay');
7242
+ const longest = { propertyName: '', duration: 0, animationName: undefined };
7243
+ for (let i = 0; i < transitionedProperties.length; i++) {
7244
+ const duration = parseCssTimeUnitsToMs(rawDelays[i]) + parseCssTimeUnitsToMs(rawDurations[i]);
7245
+ if (duration > longest.duration) {
7246
+ longest.propertyName = transitionedProperties[i];
7247
+ longest.duration = duration;
7248
+ }
7249
+ }
7250
+ return longest;
7251
+ }
7252
+ function getLongestComputedAnimation(computedStyle) {
7253
+ const rawNames = parseCssPropertyValue(computedStyle, 'animation-name');
7254
+ const rawDelays = parseCssPropertyValue(computedStyle, 'animation-delay');
7255
+ const rawDurations = parseCssPropertyValue(computedStyle, 'animation-duration');
7256
+ const longest = { animationName: '', propertyName: undefined, duration: 0 };
7257
+ for (let i = 0; i < rawNames.length; i++) {
7258
+ const duration = parseCssTimeUnitsToMs(rawDelays[i]) + parseCssTimeUnitsToMs(rawDurations[i]);
7259
+ if (duration > longest.duration) {
7260
+ longest.animationName = rawNames[i];
7261
+ longest.duration = duration;
7262
+ }
7263
+ }
7264
+ return longest;
7265
+ }
7266
+ function isShorterThanExistingAnimation(existing, longest) {
7267
+ return existing !== undefined && existing.duration > longest.duration;
7268
+ }
7269
+ function longestExists(longest) {
7270
+ return ((longest.animationName != undefined || longest.propertyName != undefined) &&
7271
+ longest.duration > 0);
7272
+ }
7273
+ /**
7274
+ * Determines the longest animation, but with `getComputedStyles` instead of `getAnimations`. This
7275
+ * is ultimately safer than getAnimations because it can be used when recalculations are in
7276
+ * progress. `getAnimations()` will be empty in that case.
7277
+ */
7278
+ function determineLongestAnimationFromComputedStyles(el, animationsMap) {
7279
+ const computedStyle = getComputedStyle(el);
7280
+ const longestAnimation = getLongestComputedAnimation(computedStyle);
7281
+ const longestTransition = getLongestComputedTransition(computedStyle);
7282
+ const longest = longestAnimation.duration > longestTransition.duration ? longestAnimation : longestTransition;
7283
+ if (isShorterThanExistingAnimation(animationsMap.get(el), longest))
7284
+ return;
7285
+ if (longestExists(longest)) {
7286
+ animationsMap.set(el, longest);
7287
+ }
7288
+ }
7289
+ /**
7290
+ * Multiple animations can be set on an element. This grabs an element and
7291
+ * determines which of those will be the longest duration. If we didn't do
7292
+ * this, elements would be removed whenever the first animation completes.
7293
+ * This ensures we get the longest running animation and only remove when
7294
+ * that animation completes.
7295
+ */
7296
+ function determineLongestAnimation(el, animationsMap, areAnimationSupported) {
7297
+ if (!areAnimationSupported)
7298
+ return;
7299
+ const animations = el.getAnimations();
7300
+ return animations.length === 0
7301
+ ? // fallback to computed styles if getAnimations is empty. This would happen if styles are
7302
+ // currently recalculating due to a reflow happening elsewhere.
7303
+ determineLongestAnimationFromComputedStyles(el, animationsMap)
7304
+ : determineLongestAnimationFromElementAnimations(el, animationsMap, animations);
7305
+ }
7306
+ function determineLongestAnimationFromElementAnimations(el, animationsMap, animations) {
7307
+ let longest = {
7308
+ animationName: undefined,
7309
+ propertyName: undefined,
7310
+ duration: 0,
7311
+ };
7312
+ for (const animation of animations) {
7313
+ const timing = animation.effect?.getTiming();
7314
+ // duration can be a string 'auto' or a number.
7315
+ const animDuration = typeof timing?.duration === 'number' ? timing.duration : 0;
7316
+ let duration = (timing?.delay ?? 0) + animDuration;
7317
+ let propertyName;
7318
+ let animationName;
7319
+ if (animation.animationName) {
7320
+ animationName = animation.animationName;
7321
+ }
7322
+ else {
7323
+ // Check for CSSTransition specific property
7324
+ propertyName = animation.transitionProperty;
7325
+ }
7326
+ if (duration >= longest.duration) {
7327
+ longest = { animationName, propertyName, duration };
7328
+ }
7329
+ }
7330
+ if (isShorterThanExistingAnimation(animationsMap.get(el), longest))
7331
+ return;
7332
+ if (longestExists(longest)) {
7333
+ animationsMap.set(el, longest);
7334
+ }
7335
+ }
7336
+ const allLeavingAnimations = new Set();
7337
+
7211
7338
  /**
7212
7339
  * NOTE: for performance reasons, the possible actions are inlined within the function instead of
7213
7340
  * being passed as an argument.
7214
7341
  */
7215
- function applyToElementOrContainer(action, renderer, parent, lNodeToHandle, beforeNode) {
7342
+ function applyToElementOrContainer(action, renderer, parent, lNodeToHandle, beforeNode, parentLView) {
7216
7343
  // If this slot was allocated for a text node dynamically created by i18n, the text node itself
7217
7344
  // won't be created until i18nApply() in the update block, so this node should be skipped.
7218
7345
  // For more info, see "ICU expressions should work inside an ngTemplateOutlet inside an ngFor"
@@ -7244,10 +7371,17 @@ function applyToElementOrContainer(action, renderer, parent, lNodeToHandle, befo
7244
7371
  nativeInsertBefore(renderer, parent, rNode, beforeNode || null, true);
7245
7372
  }
7246
7373
  else if (action === 2 /* WalkTNodeTreeAction.Detach */) {
7247
- nativeRemoveNode(renderer, rNode, isComponent);
7374
+ runLeaveAnimationsWithCallback(parentLView, (nodeHasLeaveAnimations) => {
7375
+ // the nodeHasLeaveAnimations indicates to the renderer that the element needs to
7376
+ // be removed synchronously and sets the requireSynchronousElementRemoval flag in
7377
+ // the renderer.
7378
+ nativeRemoveNode(renderer, rNode, isComponent, nodeHasLeaveAnimations);
7379
+ });
7248
7380
  }
7249
7381
  else if (action === 3 /* WalkTNodeTreeAction.Destroy */) {
7250
- renderer.destroyNode(rNode);
7382
+ runLeaveAnimationsWithCallback(parentLView, () => {
7383
+ renderer.destroyNode(rNode);
7384
+ });
7251
7385
  }
7252
7386
  if (lContainer != null) {
7253
7387
  applyContainer(renderer, action, lContainer, parent, beforeNode);
@@ -7427,6 +7561,37 @@ function cleanUpView(tView, lView) {
7427
7561
  setActiveConsumer(prevConsumer);
7428
7562
  }
7429
7563
  }
7564
+ function runLeaveAnimationsWithCallback(lView, callback) {
7565
+ if (lView && lView[ANIMATIONS] && lView[ANIMATIONS].leave) {
7566
+ if (lView[ANIMATIONS].skipLeaveAnimations) {
7567
+ lView[ANIMATIONS].skipLeaveAnimations = false;
7568
+ }
7569
+ else {
7570
+ const leaveAnimations = lView[ANIMATIONS].leave;
7571
+ const runningAnimations = [];
7572
+ for (let index = 0; index < leaveAnimations.length; index++) {
7573
+ const animateFn = leaveAnimations[index];
7574
+ runningAnimations.push(animateFn());
7575
+ }
7576
+ lView[ANIMATIONS].running = Promise.allSettled(runningAnimations);
7577
+ lView[ANIMATIONS].leave = undefined;
7578
+ }
7579
+ }
7580
+ runAfterLeaveAnimations(lView, callback);
7581
+ }
7582
+ function runAfterLeaveAnimations(lView, callback) {
7583
+ if (lView && lView[ANIMATIONS] && lView[ANIMATIONS].running) {
7584
+ lView[ANIMATIONS].running.then(() => {
7585
+ if (lView[ANIMATIONS] && lView[ANIMATIONS].running) {
7586
+ lView[ANIMATIONS].running = undefined;
7587
+ }
7588
+ allLeavingAnimations.delete(lView);
7589
+ callback(true);
7590
+ });
7591
+ return;
7592
+ }
7593
+ callback(false);
7594
+ }
7430
7595
  /** Removes listeners and unsubscribes from output subscriptions */
7431
7596
  function processCleanups(tView, lView) {
7432
7597
  ngDevMode && assertNotReactive(processCleanups.name);
@@ -7764,22 +7929,22 @@ function applyNodes(renderer, action, tNode, lView, parentRElement, beforeNode,
7764
7929
  if (!isDetachedByI18n(tNode)) {
7765
7930
  if (tNodeType & 8 /* TNodeType.ElementContainer */) {
7766
7931
  applyNodes(renderer, action, tNode.child, lView, parentRElement, beforeNode, false);
7767
- applyToElementOrContainer(action, renderer, parentRElement, rawSlotValue, beforeNode);
7932
+ applyToElementOrContainer(action, renderer, parentRElement, rawSlotValue, beforeNode, lView);
7768
7933
  }
7769
7934
  else if (tNodeType & 32 /* TNodeType.Icu */) {
7770
7935
  const nextRNode = icuContainerIterate(tNode, lView);
7771
7936
  let rNode;
7772
7937
  while ((rNode = nextRNode())) {
7773
- applyToElementOrContainer(action, renderer, parentRElement, rNode, beforeNode);
7938
+ applyToElementOrContainer(action, renderer, parentRElement, rNode, beforeNode, lView);
7774
7939
  }
7775
- applyToElementOrContainer(action, renderer, parentRElement, rawSlotValue, beforeNode);
7940
+ applyToElementOrContainer(action, renderer, parentRElement, rawSlotValue, beforeNode, lView);
7776
7941
  }
7777
7942
  else if (tNodeType & 16 /* TNodeType.Projection */) {
7778
7943
  applyProjectionRecursive(renderer, action, lView, tNode, parentRElement, beforeNode);
7779
7944
  }
7780
7945
  else {
7781
7946
  ngDevMode && assertTNodeType(tNode, 3 /* TNodeType.AnyRNode */ | 4 /* TNodeType.Container */);
7782
- applyToElementOrContainer(action, renderer, parentRElement, rawSlotValue, beforeNode);
7947
+ applyToElementOrContainer(action, renderer, parentRElement, rawSlotValue, beforeNode, lView);
7783
7948
  }
7784
7949
  }
7785
7950
  tNode = isProjection ? tNode.projectionNext : tNode.next;
@@ -7833,7 +7998,7 @@ function applyProjectionRecursive(renderer, action, lView, tProjectionNode, pare
7833
7998
  // This should be refactored and cleaned up.
7834
7999
  for (let i = 0; i < nodeToProjectOrRNodes.length; i++) {
7835
8000
  const rNode = nodeToProjectOrRNodes[i];
7836
- applyToElementOrContainer(action, renderer, parentRElement, rNode, beforeNode);
8001
+ applyToElementOrContainer(action, renderer, parentRElement, rNode, beforeNode, lView);
7837
8002
  }
7838
8003
  }
7839
8004
  else {
@@ -8648,7 +8813,7 @@ function shouldAddViewToDom(tNode, dehydratedView) {
8648
8813
  }
8649
8814
 
8650
8815
  const USE_EXHAUSTIVE_CHECK_NO_CHANGES_DEFAULT = false;
8651
- const UseExhaustiveCheckNoChanges = new InjectionToken(ngDevMode ? 'exhaustive checkNoChanges' : '');
8816
+ const UseExhaustiveCheckNoChanges = new InjectionToken(typeof ngDevMode !== undefined && ngDevMode ? 'exhaustive checkNoChanges' : '');
8652
8817
 
8653
8818
  function collectNativeNodes(tView, lView, tNode, result, isProjection = false) {
8654
8819
  while (tNode !== null) {
@@ -8975,6 +9140,7 @@ function refreshView(tView, lView, templateFn, context) {
8975
9140
  if (templateFn !== null) {
8976
9141
  executeTemplate(tView, lView, templateFn, 2 /* RenderFlags.Update */, context);
8977
9142
  }
9143
+ runEnterAnimations(lView);
8978
9144
  const hooksInitPhaseCompleted = (flags & 3 /* LViewFlags.InitPhaseStateMask */) === 3 /* InitPhaseState.InitPhaseCompleted */;
8979
9145
  // execute pre-order hooks (OnInit, OnChanges, DoCheck)
8980
9146
  // PERF WARNING: do NOT extract this to a separate function without running benchmarks
@@ -9102,6 +9268,15 @@ function refreshView(tView, lView, templateFn, context) {
9102
9268
  leaveView();
9103
9269
  }
9104
9270
  }
9271
+ function runEnterAnimations(lView) {
9272
+ const animationData = lView[ANIMATIONS];
9273
+ if (animationData?.enter) {
9274
+ for (const animateFn of animationData.enter) {
9275
+ animateFn();
9276
+ }
9277
+ animationData.enter = undefined;
9278
+ }
9279
+ }
9105
9280
  /**
9106
9281
  * Goes over embedded views (ones created through ViewContainerRef APIs) and refreshes
9107
9282
  * them by executing an associated template function.
@@ -9741,15 +9916,20 @@ class ViewRef {
9741
9916
  * introduce other changes.
9742
9917
  */
9743
9918
  checkNoChanges() {
9744
- if (!ngDevMode)
9745
- return;
9746
- try {
9747
- this.exhaustive ??= this._lView[INJECTOR].get(UseExhaustiveCheckNoChanges, USE_EXHAUSTIVE_CHECK_NO_CHANGES_DEFAULT);
9748
- }
9749
- catch {
9750
- this.exhaustive = USE_EXHAUSTIVE_CHECK_NO_CHANGES_DEFAULT;
9919
+ // Note: we use `if (ngDevMode) { ... }` instead of an early return.
9920
+ // ESBuild is conservative about removing dead code that follows `return;`
9921
+ // inside a function body, so the block may remain in the bundle.
9922
+ // Using a conditional ensures the dev-only logic is reliably tree-shaken
9923
+ // in production builds.
9924
+ if (ngDevMode) {
9925
+ try {
9926
+ this.exhaustive ??= this._lView[INJECTOR].get(UseExhaustiveCheckNoChanges, USE_EXHAUSTIVE_CHECK_NO_CHANGES_DEFAULT);
9927
+ }
9928
+ catch {
9929
+ this.exhaustive = USE_EXHAUSTIVE_CHECK_NO_CHANGES_DEFAULT;
9930
+ }
9931
+ checkNoChangesInternal(this._lView, this.exhaustive);
9751
9932
  }
9752
- checkNoChangesInternal(this._lView, this.exhaustive);
9753
9933
  }
9754
9934
  attachToViewContainerRef() {
9755
9935
  if (this._appRef) {
@@ -11999,7 +12179,8 @@ function verifyStandaloneImport(depType, importingType) {
11999
12179
  if (def != null) {
12000
12180
  // if a component, directive or pipe is imported make sure that it is standalone
12001
12181
  if (!def.standalone) {
12002
- throw new Error(`The "${stringifyForError(depType)}" ${getDependencyTypeForError(depType)}, imported from "${stringifyForError(importingType)}", is not standalone. Did you forget to add the standalone: true flag?`);
12182
+ const type = getDependencyTypeForError(depType);
12183
+ throw new Error(`The "${stringifyForError(depType)}" ${type}, imported from "${stringifyForError(importingType)}", is not standalone. Does the ${type} have the standalone: false flag?`);
12003
12184
  }
12004
12185
  }
12005
12186
  else {
@@ -13054,13 +13235,21 @@ function listenToDomEvent(tNode, tView, lView, eventTargetResolver, renderer, ev
13054
13235
  const target = eventTargetResolver ? eventTargetResolver(native) : native;
13055
13236
  stashEventListenerImpl(lView, target, eventName, wrappedListener);
13056
13237
  const cleanupFn = renderer.listen(target, eventName, wrappedListener);
13057
- const idxOrTargetGetter = eventTargetResolver
13058
- ? (_lView) => eventTargetResolver(unwrapRNode(_lView[tNode.index]))
13059
- : tNode.index;
13060
- storeListenerCleanup(idxOrTargetGetter, tView, lView, eventName, wrappedListener, cleanupFn, false);
13238
+ // We skip cleaning up animation event types to ensure leaving animation events can be used.
13239
+ // These events should be automatically garbage collected anyway after the element is
13240
+ // removed from the DOM.
13241
+ if (!isAnimationEventType(eventName)) {
13242
+ const idxOrTargetGetter = eventTargetResolver
13243
+ ? (_lView) => eventTargetResolver(unwrapRNode(_lView[tNode.index]))
13244
+ : tNode.index;
13245
+ storeListenerCleanup(idxOrTargetGetter, tView, lView, eventName, wrappedListener, cleanupFn, false);
13246
+ }
13061
13247
  }
13062
13248
  return hasCoalesced;
13063
13249
  }
13250
+ function isAnimationEventType(eventName) {
13251
+ return eventName.startsWith('animation') || eventName.startsWith('transition');
13252
+ }
13064
13253
  /**
13065
13254
  * A utility function that checks if a given element has already an event handler registered for an
13066
13255
  * event with a specified name. The TView.cleanup data structure is used to find out which events
@@ -13481,13 +13670,8 @@ class ComponentFactory extends ComponentFactory$1 {
13481
13670
  try {
13482
13671
  const hostTNode = directiveHostFirstCreatePass(HEADER_OFFSET, rootLView, 2 /* TNodeType.Element */, '#host', () => rootTView.directiveRegistry, true, 0);
13483
13672
  // ---- element instruction
13484
- // TODO(crisbeto): in practice `hostElement` should always be defined, but there are some
13485
- // tests where the renderer is mocked out and `undefined` is returned. We should update the
13486
- // tests so that this check can be removed.
13487
- if (hostElement) {
13488
- setupStaticAttributes(hostRenderer, hostElement, hostTNode);
13489
- attachPatchData(hostElement, rootLView);
13490
- }
13673
+ setupStaticAttributes(hostRenderer, hostElement, hostTNode);
13674
+ attachPatchData(hostElement, rootLView);
13491
13675
  // TODO(pk): this logic is similar to the instruction code where a node can have directives
13492
13676
  createDirectivesInstances(rootTView, rootLView, hostTNode);
13493
13677
  executeContentQueries(rootTView, hostTNode, rootLView);
@@ -13522,7 +13706,7 @@ class ComponentFactory extends ComponentFactory$1 {
13522
13706
  }
13523
13707
  function createRootTView(rootSelectorOrNode, componentDef, componentBindings, directives) {
13524
13708
  const tAttributes = rootSelectorOrNode
13525
- ? ['ng-version', '21.0.0-next.3']
13709
+ ? ['ng-version', '21.0.0-next.5']
13526
13710
  : // Extract attributes and classes from the first selector only to match VE behavior.
13527
13711
  extractAttrsAndClassesFromSelector(componentDef.selectors[0]);
13528
13712
  let creationBindings = null;
@@ -13695,7 +13879,6 @@ function projectNodes(tNode, ngContentSelectors, projectableNodes) {
13695
13879
  *
13696
13880
  * ```angular-ts
13697
13881
  * @Component({
13698
- * standalone: true,
13699
13882
  * selector: 'dynamic',
13700
13883
  * template: `<span>This is a content of a dynamic component.</span>`,
13701
13884
  * })
@@ -13704,7 +13887,6 @@ function projectNodes(tNode, ngContentSelectors, projectableNodes) {
13704
13887
  * }
13705
13888
  *
13706
13889
  * @Component({
13707
- * standalone: true,
13708
13890
  * selector: 'app',
13709
13891
  * template: `<main>Hi! This is the main content.</main>`,
13710
13892
  * })
@@ -16198,7 +16380,7 @@ var TracingAction;
16198
16380
  /**
16199
16381
  * Injection token for a `TracingService`, optionally provided.
16200
16382
  */
16201
- const TracingService = new InjectionToken(ngDevMode ? 'TracingService' : '');
16383
+ const TracingService = new InjectionToken(typeof ngDevMode !== undefined && ngDevMode ? 'TracingService' : '');
16202
16384
 
16203
16385
  class AfterRenderManager {
16204
16386
  impl = null;
@@ -17034,7 +17216,7 @@ const DEFER_BLOCK_DEPENDENCY_INTERCEPTOR =
17034
17216
  /**
17035
17217
  * **INTERNAL**, token used for configuring defer block behavior.
17036
17218
  */
17037
- const DEFER_BLOCK_CONFIG = new InjectionToken(ngDevMode ? 'DEFER_BLOCK_CONFIG' : '');
17219
+ const DEFER_BLOCK_CONFIG = new InjectionToken(typeof ngDevMode !== undefined && ngDevMode ? 'DEFER_BLOCK_CONFIG' : '');
17038
17220
  /**
17039
17221
  * Checks whether there is a cached injector associated with a given defer block
17040
17222
  * declaration and returns if it exists. If there is no cached injector present -
@@ -19911,6 +20093,22 @@ function remove(list, el) {
19911
20093
  }
19912
20094
  }
19913
20095
 
20096
+ /**
20097
+ * Replace with `Promise.withResolvers()` once it's available.
20098
+ * NET September 2026
20099
+ *
20100
+ * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/withResolvers.
20101
+ */
20102
+ function promiseWithResolvers() {
20103
+ let resolve;
20104
+ let reject;
20105
+ const promise = new Promise((res, rej) => {
20106
+ resolve = res;
20107
+ reject = rej;
20108
+ });
20109
+ return { promise, resolve, reject };
20110
+ }
20111
+
19914
20112
  /**
19915
20113
  * Schedules triggering of a defer block for `on idle` and `on timer` conditions.
19916
20114
  */
@@ -20280,7 +20478,7 @@ function cleanupRemainingHydrationQueue(hydrationQueue, dehydratedBlockRegistry)
20280
20478
  */
20281
20479
  function populateHydratingStateForQueue(registry, queue) {
20282
20480
  for (let blockId of queue) {
20283
- registry.hydrating.set(blockId, Promise.withResolvers());
20481
+ registry.hydrating.set(blockId, promiseWithResolvers());
20284
20482
  }
20285
20483
  }
20286
20484
  // Waits for the next render cycle to complete
@@ -20602,7 +20800,6 @@ function ɵɵdeferPrefetchWhen(rawValue) {
20602
20800
  try {
20603
20801
  const value = Boolean(rawValue); // handle truthy or falsy values
20604
20802
  const tView = lView[TVIEW];
20605
- const tNode = getSelectedTNode();
20606
20803
  const tDetails = getTDeferBlockDetails(tView, tNode);
20607
20804
  if (value === true && tDetails.loadingState === DeferDependenciesLoadingState.NOT_STARTED) {
20608
20805
  // If loading has not been started yet, trigger it now.
@@ -21028,14 +21225,13 @@ function ɵɵdeferHydrateOnViewport() {
21028
21225
  // since these instructions won't exist for dehydrated content.
21029
21226
  }
21030
21227
 
21031
- const ARIA_PREFIX = 'aria';
21032
21228
  /**
21033
- * Update an ARIA attribute by either its attribute or property name on a selected element.
21229
+ * Update an ARIA attribute on a selected element.
21034
21230
  *
21035
- * If the property name also exists as an input property on any of the element's directives, those
21036
- * inputs will be set instead of the element property.
21231
+ * If the attribute name also exists as an input property on any of the element's directives, those
21232
+ * inputs will be set instead of the element attribute.
21037
21233
  *
21038
- * @param name Name of the ARIA attribute or property (beginning with `aria`).
21234
+ * @param name Name of the ARIA attribute (beginning with `aria-`).
21039
21235
  * @param value New value to write.
21040
21236
  * @returns This function returns itself so that it may be chained.
21041
21237
  *
@@ -21055,31 +21251,12 @@ function ɵɵariaProperty(name, value) {
21055
21251
  else {
21056
21252
  ngDevMode && assertTNodeType(tNode, 2 /* TNodeType.Element */);
21057
21253
  const element = getNativeByTNode(tNode, lView);
21058
- const attributeName = ariaAttrName(name);
21059
- setElementAttribute(lView[RENDERER], element, null, tNode.value, attributeName, value, null);
21254
+ setElementAttribute(lView[RENDERER], element, null, tNode.value, name, value, null);
21060
21255
  }
21061
21256
  ngDevMode && storePropertyBindingMetadata(tView.data, tNode, name, bindingIndex);
21062
21257
  }
21063
21258
  return ɵɵariaProperty;
21064
21259
  }
21065
- /**
21066
- * Converts an ARIA property name to its corresponding attribute name, if necessary.
21067
- *
21068
- * For example, converts `ariaLabel` to `aria-label`.
21069
- *
21070
- * https://www.w3.org/TR/wai-aria-1.2/#accessibilityroleandproperties-correspondence
21071
- *
21072
- * This must be kept in sync with the the function of the same name in
21073
- * packages/compiler/src/template/pipeline/src/phases/reify.ts
21074
- *
21075
- * @param name A property name that starts with `aria`.
21076
- * @returns The corresponding attribute name.
21077
- */
21078
- function ariaAttrName(name) {
21079
- return name.charAt(ARIA_PREFIX.length) !== '-'
21080
- ? ARIA_PREFIX + '-' + name.slice(ARIA_PREFIX.length).toLowerCase()
21081
- : name; // Property already has attribute name.
21082
- }
21083
21260
 
21084
21261
  /**
21085
21262
  * Updates the value of or removes a bound attribute on an Element.
@@ -21128,278 +21305,88 @@ const MAX_ANIMATION_TIMEOUT = new InjectionToken(typeof ngDevMode !== 'undefined
21128
21305
  });
21129
21306
  const MAX_ANIMATION_TIMEOUT_DEFAULT = 4000;
21130
21307
 
21308
+ const DEFAULT_ANIMATIONS_DISABLED = false;
21309
+ const areAnimationSupported = (typeof ngServerMode === 'undefined' || !ngServerMode) &&
21310
+ typeof document !== 'undefined' &&
21311
+ // tslint:disable-next-line:no-toplevel-property-access
21312
+ typeof document?.documentElement?.getAnimations === 'function';
21131
21313
  /**
21132
- * Registers elements for delayed removal action for animation in the case
21133
- * that `animate.leave` is used. This stores the target element and any
21134
- * classes, class resolvers, and callback functions that may be needed
21135
- * to apply the removal animation, and then stashes the actual element
21136
- * removal function from the dom renderer to be called after the
21137
- * animation is finished.
21138
- */
21139
- class ElementRegistry {
21140
- outElements = new WeakMap();
21141
- remove(el) {
21142
- this.outElements.delete(el);
21143
- }
21144
- /** Used when animate.leave is only applying classes */
21145
- trackClasses(details, classes) {
21146
- const classList = getClassListFromValue(classes);
21147
- if (!classList)
21148
- return;
21149
- for (let klass of classList) {
21150
- details.classes?.add(klass);
21151
- }
21314
+ * Helper function to check if animations are disabled via injection token
21315
+ */
21316
+ function areAnimationsDisabled(lView) {
21317
+ const injector = lView[INJECTOR];
21318
+ return injector.get(ANIMATIONS_DISABLED, DEFAULT_ANIMATIONS_DISABLED);
21319
+ }
21320
+ /**
21321
+ * Asserts a value passed in is actually an animation type and not something else
21322
+ */
21323
+ function assertAnimationTypes(value, instruction) {
21324
+ if (value == null || (typeof value !== 'string' && typeof value !== 'function')) {
21325
+ throw new RuntimeError(650 /* RuntimeErrorCode.ANIMATE_INVALID_VALUE */, `'${instruction}' value must be a string of CSS classes or an animation function, got ${stringify(value)}`);
21152
21326
  }
21153
- /** Used when animate.leave is applying classes via a bound attribute
21154
- * which requires resolving the binding function at the right time
21155
- * to get the proper class list. There may be multiple resolvers due
21156
- * to composition via host bindings.
21157
- */
21158
- trackResolver(details, resolver) {
21159
- if (!details.classFns) {
21160
- details.classFns = [resolver];
21161
- }
21162
- else {
21163
- details.classFns.push(resolver);
21164
- }
21327
+ }
21328
+ /**
21329
+ * Asserts a given native element is an actual Element node and not something like a comment node.
21330
+ */
21331
+ function assertElementNodes(nativeElement, instruction) {
21332
+ if (nativeElement.nodeType !== Node.ELEMENT_NODE) {
21333
+ throw new RuntimeError(650 /* RuntimeErrorCode.ANIMATE_INVALID_VALUE */, `'${instruction}' can only be used on an element node, got ${stringify(nativeElement.nodeType)}`);
21165
21334
  }
21166
- /** Used when `animate.leave` is using the function signature and will have a
21167
- * callback function, rather than a list of classes.
21168
- */
21169
- addCallback(el, value, animateWrapperFn) {
21170
- const details = this.outElements.get(el) ?? {
21171
- classes: null,
21172
- animateFn: () => { },
21173
- isEventBinding: true,
21174
- };
21175
- details.animateFn = animateWrapperFn(el, value);
21176
- this.outElements.set(el, details);
21177
- }
21178
- /** Used when `animate.leave` is using classes. */
21179
- add(el, value, animateWrapperFn) {
21180
- const details = this.outElements.get(el) ?? {
21181
- classes: new Set(),
21182
- animateFn: () => { },
21183
- isEventBinding: false,
21184
- };
21185
- if (typeof value === 'function') {
21186
- this.trackResolver(details, value);
21335
+ }
21336
+ /**
21337
+ * trackEnterClasses is necessary in the case of composition where animate.enter
21338
+ * is used on the same element in multiple places, like on the element and in a
21339
+ * host binding. When removing classes, we need the entire list of animation classes
21340
+ * added to properly remove them when the longest animation fires.
21341
+ */
21342
+ function trackEnterClasses(el, classList, cleanupFns) {
21343
+ const elementData = enterClassMap.get(el);
21344
+ if (elementData) {
21345
+ for (const klass of classList) {
21346
+ elementData.classList.push(klass);
21187
21347
  }
21188
- else {
21189
- this.trackClasses(details, value);
21348
+ for (const fn of cleanupFns) {
21349
+ elementData.cleanupFns.push(fn);
21190
21350
  }
21191
- details.animateFn = animateWrapperFn(el, details.classes, details.classFns);
21192
- this.outElements.set(el, details);
21193
21351
  }
21194
- has(el) {
21195
- return this.outElements.has(el);
21352
+ else {
21353
+ enterClassMap.set(el, { classList, cleanupFns });
21196
21354
  }
21197
- /** This is called by the dom renderer to actually initiate the animation
21198
- * using the animateFn stored in the registry. The DOM renderer passes in
21199
- * the removal function to be fired off when the animation finishes.
21200
- */
21201
- animate(el, removeFn, maxAnimationTimeout) {
21202
- if (!this.outElements.has(el))
21203
- return removeFn();
21204
- const details = this.outElements.get(el);
21205
- let timeoutId;
21206
- let called = false;
21207
- const remove = () => {
21208
- // This called check is to prevent a rare race condition where the timing of removal
21209
- // might result in the removal function being called twice.
21210
- if (called)
21211
- return;
21212
- called = true;
21213
- clearTimeout(timeoutId);
21214
- this.remove(el);
21215
- removeFn();
21216
- };
21217
- // this timeout is used to ensure elements actually get removed in the case
21218
- // that the user forgot to call the remove callback. The timeout is cleared
21219
- // in the DOM renderer during the remove child process. It only applies
21220
- // to the event binding use case.
21221
- if (details.isEventBinding) {
21222
- timeoutId = setTimeout(remove, maxAnimationTimeout);
21355
+ }
21356
+ /**
21357
+ * Helper function to cleanup enterClassMap data safely
21358
+ */
21359
+ function cleanupEnterClassData(element) {
21360
+ const elementData = enterClassMap.get(element);
21361
+ if (elementData) {
21362
+ for (const fn of elementData.cleanupFns) {
21363
+ fn();
21223
21364
  }
21224
- details.animateFn(remove);
21365
+ enterClassMap.delete(element);
21225
21366
  }
21367
+ longestAnimations.delete(element);
21226
21368
  }
21227
- function getClassListFromValue(value) {
21228
- const classes = typeof value === 'function' ? value() : value;
21229
- let classList = Array.isArray(classes) ? classes : null;
21230
- if (typeof classes === 'string') {
21231
- classList = classes
21232
- .trim()
21233
- .split(/\s+/)
21234
- .filter((k) => k);
21235
- }
21236
- return classList;
21237
- }
21238
-
21239
- /** Parses a CSS time value to milliseconds. */
21240
- function parseCssTimeUnitsToMs(value) {
21241
- // Some browsers will return it in seconds, whereas others will return milliseconds.
21242
- const multiplier = value.toLowerCase().indexOf('ms') > -1 ? 1 : 1000;
21243
- return parseFloat(value) * multiplier;
21244
- }
21245
- /** Parses out multiple values from a computed style into an array. */
21246
- function parseCssPropertyValue(computedStyle, name) {
21247
- const value = computedStyle.getPropertyValue(name);
21248
- return value.split(',').map((part) => part.trim());
21249
- }
21250
- /** Gets the transform transition duration, including the delay, of an element in milliseconds. */
21251
- function getLongestComputedTransition(computedStyle) {
21252
- const transitionedProperties = parseCssPropertyValue(computedStyle, 'transition-property');
21253
- const rawDurations = parseCssPropertyValue(computedStyle, 'transition-duration');
21254
- const rawDelays = parseCssPropertyValue(computedStyle, 'transition-delay');
21255
- const longest = { propertyName: '', duration: 0, animationName: undefined };
21256
- for (let i = 0; i < transitionedProperties.length; i++) {
21257
- const duration = parseCssTimeUnitsToMs(rawDelays[i]) + parseCssTimeUnitsToMs(rawDurations[i]);
21258
- if (duration > longest.duration) {
21259
- longest.propertyName = transitionedProperties[i];
21260
- longest.duration = duration;
21261
- }
21262
- }
21263
- return longest;
21264
- }
21265
- function getLongestComputedAnimation(computedStyle) {
21266
- const rawNames = parseCssPropertyValue(computedStyle, 'animation-name');
21267
- const rawDelays = parseCssPropertyValue(computedStyle, 'animation-delay');
21268
- const rawDurations = parseCssPropertyValue(computedStyle, 'animation-duration');
21269
- const longest = { animationName: '', propertyName: undefined, duration: 0 };
21270
- for (let i = 0; i < rawNames.length; i++) {
21271
- const duration = parseCssTimeUnitsToMs(rawDelays[i]) + parseCssTimeUnitsToMs(rawDurations[i]);
21272
- if (duration > longest.duration) {
21273
- longest.animationName = rawNames[i];
21274
- longest.duration = duration;
21275
- }
21276
- }
21277
- return longest;
21278
- }
21279
- function isShorterThanExistingAnimation(existing, longest) {
21280
- return existing !== undefined && existing.duration > longest.duration;
21281
- }
21282
- function longestExists(longest) {
21283
- return ((longest.animationName != undefined || longest.propertyName != undefined) &&
21284
- longest.duration > 0);
21285
- }
21286
- /**
21287
- * Determines the longest animation, but with `getComputedStyles` instead of `getAnimations`. This
21288
- * is ultimately safer than getAnimations because it can be used when recalculations are in
21289
- * progress. `getAnimations()` will be empty in that case.
21290
- */
21291
- function determineLongestAnimationFromComputedStyles(el, animationsMap) {
21292
- const computedStyle = getComputedStyle(el);
21293
- const longestAnimation = getLongestComputedAnimation(computedStyle);
21294
- const longestTransition = getLongestComputedTransition(computedStyle);
21295
- const longest = longestAnimation.duration > longestTransition.duration ? longestAnimation : longestTransition;
21296
- if (isShorterThanExistingAnimation(animationsMap.get(el), longest))
21297
- return;
21298
- if (longestExists(longest)) {
21299
- animationsMap.set(el, longest);
21300
- }
21301
- }
21302
- /**
21303
- * Multiple animations can be set on an element. This grabs an element and
21304
- * determines which of those will be the longest duration. If we didn't do
21305
- * this, elements would be removed whenever the first animation completes.
21306
- * This ensures we get the longest running animation and only remove when
21307
- * that animation completes.
21308
- */
21309
- function determineLongestAnimation(el, animationsMap, areAnimationSupported) {
21310
- if (!areAnimationSupported)
21311
- return;
21312
- const animations = el.getAnimations();
21313
- return animations.length === 0
21314
- ? // fallback to computed styles if getAnimations is empty. This would happen if styles are
21315
- // currently recalculating due to a reflow happening elsewhere.
21316
- determineLongestAnimationFromComputedStyles(el, animationsMap)
21317
- : determineLongestAnimationFromElementAnimations(el, animationsMap, animations);
21318
- }
21319
- function determineLongestAnimationFromElementAnimations(el, animationsMap, animations) {
21320
- let longest = {
21321
- animationName: undefined,
21322
- propertyName: undefined,
21323
- duration: 0,
21324
- };
21325
- for (const animation of animations) {
21326
- const timing = animation.effect?.getTiming();
21327
- // duration can be a string 'auto' or a number.
21328
- const animDuration = typeof timing?.duration === 'number' ? timing.duration : 0;
21329
- let duration = (timing?.delay ?? 0) + animDuration;
21330
- let propertyName;
21331
- let animationName;
21332
- if (animation.animationName) {
21333
- animationName = animation.animationName;
21334
- }
21335
- else {
21336
- // Check for CSSTransition specific property
21337
- propertyName = animation.transitionProperty;
21338
- }
21339
- if (duration >= longest.duration) {
21340
- longest = { animationName, propertyName, duration };
21341
- }
21342
- }
21343
- if (isShorterThanExistingAnimation(animationsMap.get(el), longest))
21344
- return;
21345
- if (longestExists(longest)) {
21346
- animationsMap.set(el, longest);
21347
- }
21348
- }
21349
-
21350
- const DEFAULT_ANIMATIONS_DISABLED = false;
21351
- const areAnimationSupported = (typeof ngServerMode === 'undefined' || !ngServerMode) &&
21352
- typeof document !== 'undefined' &&
21353
- // tslint:disable-next-line:no-toplevel-property-access
21354
- typeof document?.documentElement?.getAnimations === 'function';
21355
- /**
21356
- * Helper function to check if animations are disabled via injection token
21357
- */
21358
- function areAnimationsDisabled(lView) {
21359
- const injector = lView[INJECTOR];
21360
- return injector.get(ANIMATIONS_DISABLED, DEFAULT_ANIMATIONS_DISABLED);
21361
- }
21362
- /**
21363
- * Helper function to setup element registry cleanup when LView is destroyed
21364
- */
21365
- function setupElementRegistryCleanup(elementRegistry, lView, tView, nativeElement) {
21366
- if (lView[FLAGS] & 8 /* LViewFlags.FirstLViewPass */) {
21367
- storeCleanupWithContext(tView, lView, nativeElement, (elToClean) => {
21368
- elementRegistry.elements.remove(elToClean);
21369
- });
21370
- }
21371
- }
21372
- /**
21373
- * Helper function to cleanup enterClassMap data safely
21374
- */
21375
- function cleanupEnterClassData(element) {
21376
- const elementData = enterClassMap.get(element);
21377
- if (elementData) {
21378
- for (const fn of elementData.cleanupFns) {
21379
- fn();
21380
- }
21381
- enterClassMap.delete(element);
21382
- }
21383
- longestAnimations.delete(element);
21384
- }
21385
- const noOpAnimationComplete = () => { };
21386
- // Tracks the list of classes added to a DOM node from `animate.enter` calls to ensure
21387
- // we remove all of the classes in the case of animation composition via host bindings.
21388
- const enterClassMap = new WeakMap();
21389
- const longestAnimations = new WeakMap();
21390
- // Tracks nodes that are animating away for the duration of the animation. This is
21391
- // used to prevent duplicate nodes from showing up when nodes have been toggled quickly
21392
- // from an `@if` or `@for`.
21393
- const leavingNodes = new WeakMap();
21394
- function clearLeavingNodes(tNode, el) {
21395
- const nodes = leavingNodes.get(tNode);
21396
- if (nodes && nodes.length > 0) {
21397
- const ix = nodes.findIndex((node) => node === el);
21398
- if (ix > -1)
21399
- nodes.splice(ix, 1);
21400
- }
21401
- if (nodes?.length === 0) {
21402
- leavingNodes.delete(tNode);
21369
+ const noOpAnimationComplete = () => { };
21370
+ // Tracks the list of classes added to a DOM node from `animate.enter` calls to ensure
21371
+ // we remove all of the classes in the case of animation composition via host bindings.
21372
+ const enterClassMap = new WeakMap();
21373
+ const longestAnimations = new WeakMap();
21374
+ // Tracks nodes that are animating away for the duration of the animation. This is
21375
+ // used to prevent duplicate nodes from showing up when nodes have been toggled quickly
21376
+ // from an `@if` or `@for`.
21377
+ const leavingNodes = new WeakMap();
21378
+ /**
21379
+ * This actually removes the leaving HTML Element in the TNode
21380
+ */
21381
+ function clearLeavingNodes(tNode, el) {
21382
+ const nodes = leavingNodes.get(tNode);
21383
+ if (nodes && nodes.length > 0) {
21384
+ const ix = nodes.findIndex((node) => node === el);
21385
+ if (ix > -1)
21386
+ nodes.splice(ix, 1);
21387
+ }
21388
+ if (nodes?.length === 0) {
21389
+ leavingNodes.delete(tNode);
21403
21390
  }
21404
21391
  }
21405
21392
  /**
@@ -21414,7 +21401,9 @@ function cancelLeavingNodes(tNode, lView) {
21414
21401
  // this is the insertion point for the new TNode element.
21415
21402
  // it will be inserted before the declaring containers anchor.
21416
21403
  const beforeNode = getBeforeNodeForView(tNode.index, lContainer);
21417
- // here we need to check the previous sibling of that anchor
21404
+ // here we need to check the previous sibling of that anchor. The first
21405
+ // previousSibling node will be the new element added. The second
21406
+ // previousSibling will be the one that's being removed.
21418
21407
  const previousNode = beforeNode?.previousSibling;
21419
21408
  // We really only want to cancel animations if the leaving node is the
21420
21409
  // same as the node before where the new node will be inserted. This is
@@ -21424,6 +21413,11 @@ function cancelLeavingNodes(tNode, lView) {
21424
21413
  }
21425
21414
  }
21426
21415
  }
21416
+ /**
21417
+ * Tracks the nodes list of nodes that are leaving the DOM so we can cancel any leave animations
21418
+ * and remove the node before adding a new entering instance of the DOM node. This prevents
21419
+ * duplicates from showing up on screen mid-animation.
21420
+ */
21427
21421
  function trackLeavingNodes(tNode, el) {
21428
21422
  // We need to track this tNode's element just to be sure we don't add
21429
21423
  // a new RNode for this TNode while this one is still animating away.
@@ -21435,6 +21429,80 @@ function trackLeavingNodes(tNode, el) {
21435
21429
  leavingNodes.set(tNode, [el]);
21436
21430
  }
21437
21431
  }
21432
+ /**
21433
+ * Retrieves the list of specified enter animations from the lView
21434
+ */
21435
+ function getLViewEnterAnimations(lView) {
21436
+ const animationData = (lView[ANIMATIONS] ??= {});
21437
+ return (animationData.enter ??= []);
21438
+ }
21439
+ /**
21440
+ * Retrieves the list of specified leave animations from the lView
21441
+ */
21442
+ function getLViewLeaveAnimations(lView) {
21443
+ const animationData = (lView[ANIMATIONS] ??= {});
21444
+ return (animationData.leave ??= []);
21445
+ }
21446
+ /**
21447
+ * Gets the list of classes from a passed in value
21448
+ */
21449
+ function getClassListFromValue(value) {
21450
+ const classes = typeof value === 'function' ? value() : value;
21451
+ let classList = Array.isArray(classes) ? classes : null;
21452
+ if (typeof classes === 'string') {
21453
+ classList = classes
21454
+ .trim()
21455
+ .split(/\s+/)
21456
+ .filter((k) => k);
21457
+ }
21458
+ return classList;
21459
+ }
21460
+ /**
21461
+ * Cancels any running enter animations on a given element to prevent them from interfering
21462
+ * with leave animations.
21463
+ */
21464
+ function cancelAnimationsIfRunning(element, renderer) {
21465
+ if (!areAnimationSupported)
21466
+ return;
21467
+ const elementData = enterClassMap.get(element);
21468
+ if (elementData &&
21469
+ elementData.classList.length > 0 &&
21470
+ elementHasClassList(element, elementData.classList)) {
21471
+ for (const klass of elementData.classList) {
21472
+ renderer.removeClass(element, klass);
21473
+ }
21474
+ }
21475
+ // We need to prevent any enter animation listeners from firing if they exist.
21476
+ cleanupEnterClassData(element);
21477
+ }
21478
+ /**
21479
+ * Checks if a given element contains the classes is a provided list
21480
+ */
21481
+ function elementHasClassList(element, classList) {
21482
+ for (const className of classList) {
21483
+ if (element.classList.contains(className))
21484
+ return true;
21485
+ }
21486
+ return false;
21487
+ }
21488
+ /**
21489
+ * Determines if the animation or transition event is currently the expected longest animation
21490
+ * based on earlier determined data in `longestAnimations`
21491
+ *
21492
+ * @param event
21493
+ * @param nativeElement
21494
+ * @returns
21495
+ */
21496
+ function isLongestAnimation(event, nativeElement) {
21497
+ const longestAnimation = longestAnimations.get(nativeElement);
21498
+ return (nativeElement === event.target &&
21499
+ longestAnimation !== undefined &&
21500
+ ((longestAnimation.animationName !== undefined &&
21501
+ event.animationName === longestAnimation.animationName) ||
21502
+ (longestAnimation.propertyName !== undefined &&
21503
+ event.propertyName === longestAnimation.propertyName)));
21504
+ }
21505
+
21438
21506
  /**
21439
21507
  * Instruction to handle the `animate.enter` behavior for class bindings.
21440
21508
  *
@@ -21454,6 +21522,11 @@ function ɵɵanimateEnter(value) {
21454
21522
  return ɵɵanimateEnter;
21455
21523
  }
21456
21524
  const tNode = getCurrentTNode();
21525
+ cancelLeavingNodes(tNode, lView);
21526
+ getLViewEnterAnimations(lView).push(() => runEnterAnimation(lView, tNode, value));
21527
+ return ɵɵanimateEnter; // For chaining
21528
+ }
21529
+ function runEnterAnimation(lView, tNode, value) {
21457
21530
  const nativeElement = getNativeByTNode(tNode, lView);
21458
21531
  ngDevMode && assertElementNodes(nativeElement, 'animate.enter');
21459
21532
  const renderer = lView[RENDERER];
@@ -21466,23 +21539,22 @@ function ɵɵanimateEnter(value) {
21466
21539
  // to get the longest animation to ensure we don't complete animations early.
21467
21540
  // This also allows us to setup cancellation of animations in progress if the
21468
21541
  // gets removed early.
21469
- const handleAnimationStart = (event) => {
21542
+ const handleEnterAnimationStart = (event) => {
21470
21543
  const eventName = event instanceof AnimationEvent ? 'animationend' : 'transitionend';
21471
21544
  ngZone.runOutsideAngular(() => {
21472
- cleanupFns.push(renderer.listen(nativeElement, eventName, handleInAnimationEnd));
21545
+ cleanupFns.push(renderer.listen(nativeElement, eventName, handleEnterAnimationEnd));
21473
21546
  });
21474
21547
  };
21475
21548
  // When the longest animation ends, we can remove all the classes
21476
- const handleInAnimationEnd = (event) => {
21477
- animationEnd(event, nativeElement, renderer);
21549
+ const handleEnterAnimationEnd = (event) => {
21550
+ enterAnimationEnd(event, nativeElement, renderer);
21478
21551
  };
21479
21552
  // We only need to add these event listeners if there are actual classes to apply
21480
21553
  if (activeClasses && activeClasses.length > 0) {
21481
21554
  ngZone.runOutsideAngular(() => {
21482
- cleanupFns.push(renderer.listen(nativeElement, 'animationstart', handleAnimationStart));
21483
- cleanupFns.push(renderer.listen(nativeElement, 'transitionstart', handleAnimationStart));
21555
+ cleanupFns.push(renderer.listen(nativeElement, 'animationstart', handleEnterAnimationStart));
21556
+ cleanupFns.push(renderer.listen(nativeElement, 'transitionstart', handleEnterAnimationStart));
21484
21557
  });
21485
- cancelLeavingNodes(tNode, lView);
21486
21558
  trackEnterClasses(nativeElement, activeClasses, cleanupFns);
21487
21559
  for (const klass of activeClasses) {
21488
21560
  renderer.addClass(nativeElement, klass);
@@ -21502,26 +21574,21 @@ function ɵɵanimateEnter(value) {
21502
21574
  });
21503
21575
  });
21504
21576
  }
21505
- return ɵɵanimateEnter; // For chaining
21506
21577
  }
21507
- /**
21508
- * trackEnterClasses is necessary in the case of composition where animate.enter
21509
- * is used on the same element in multiple places, like on the element and in a
21510
- * host binding. When removing classes, we need the entire list of animation classes
21511
- * added to properly remove them when the longest animation fires.
21512
- */
21513
- function trackEnterClasses(el, classList, cleanupFns) {
21514
- const elementData = enterClassMap.get(el);
21515
- if (elementData) {
21516
- for (const klass of classList) {
21517
- elementData.classList.push(klass);
21518
- }
21519
- for (const fn of cleanupFns) {
21520
- elementData.cleanupFns.push(fn);
21578
+ function enterAnimationEnd(event, nativeElement, renderer) {
21579
+ const elementData = enterClassMap.get(nativeElement);
21580
+ if (!elementData)
21581
+ return;
21582
+ if (isLongestAnimation(event, nativeElement)) {
21583
+ // Now that we've found the longest animation, there's no need
21584
+ // to keep bubbling up this event as it's not going to apply to
21585
+ // other elements further up. We don't want it to inadvertently
21586
+ // affect any other animations on the page.
21587
+ event.stopImmediatePropagation();
21588
+ for (const klass of elementData.classList) {
21589
+ renderer.removeClass(nativeElement, klass);
21521
21590
  }
21522
- }
21523
- else {
21524
- enterClassMap.set(el, { classList, cleanupFns });
21591
+ cleanupEnterClassData(nativeElement);
21525
21592
  }
21526
21593
  }
21527
21594
  /**
@@ -21544,16 +21611,22 @@ function ɵɵanimateEnterListener(value) {
21544
21611
  return ɵɵanimateEnterListener;
21545
21612
  }
21546
21613
  const tNode = getCurrentTNode();
21614
+ cancelLeavingNodes(tNode, lView);
21615
+ getLViewEnterAnimations(lView).push(() => runEnterAnimationFunction(lView, tNode, value));
21616
+ return ɵɵanimateEnterListener;
21617
+ }
21618
+ /**
21619
+ * runs enter animations when a custom function is provided
21620
+ */
21621
+ function runEnterAnimationFunction(lView, tNode, value) {
21547
21622
  const nativeElement = getNativeByTNode(tNode, lView);
21548
21623
  ngDevMode && assertElementNodes(nativeElement, 'animate.enter');
21549
- cancelLeavingNodes(tNode, lView);
21550
21624
  value.call(lView[CONTEXT], { target: nativeElement, animationComplete: noOpAnimationComplete });
21551
- return ɵɵanimateEnterListener;
21552
21625
  }
21553
21626
  /**
21554
21627
  * Instruction to handle the `animate.leave` behavior for class animations.
21555
- * It registers an animation with the ElementRegistry to be run when the element
21556
- * is scheduled for removal from the DOM.
21628
+ * It creates a leave animation function that's tracked in the LView to
21629
+ * be run before DOM node removal and cleanup.
21557
21630
  *
21558
21631
  * @param value The value bound to `animate.leave`, which can be a string or a function.
21559
21632
  * @returns This function returns itself so that it may be chained.
@@ -21571,170 +21644,34 @@ function ɵɵanimateLeave(value) {
21571
21644
  if (animationsDisabled) {
21572
21645
  return ɵɵanimateLeave;
21573
21646
  }
21574
- const tView = getTView();
21575
21647
  const tNode = getCurrentTNode();
21576
- const nativeElement = getNativeByTNode(tNode, lView);
21577
- ngDevMode && assertElementNodes(nativeElement, 'animate.leave');
21578
- // This instruction is called in the update pass.
21579
- const renderer = lView[RENDERER];
21580
- const elementRegistry = getAnimationElementRemovalRegistry();
21581
- ngDevMode &&
21582
- assertDefined(elementRegistry.elements, 'Expected `ElementRegistry` to be present in animations subsystem');
21583
- const ngZone = lView[INJECTOR].get(NgZone);
21584
- // This function gets stashed in the registry to be used once the element removal process
21585
- // begins. We pass in the values and resolvers so as to evaluate the resolved classes
21586
- // at the latest possible time, meaning we evaluate them right before the animation
21587
- // begins.
21588
- const animate = (el, value, resolvers) => {
21589
- return (removalFn) => {
21590
- animateLeaveClassRunner(el, tNode, getClassList(value, resolvers), removalFn, renderer, animationsDisabled, ngZone);
21591
- };
21592
- };
21593
- // Ensure cleanup if the LView is destroyed before the animation runs.
21594
- setupElementRegistryCleanup(elementRegistry, lView, tView, nativeElement);
21595
- elementRegistry.elements.add(nativeElement, value, animate);
21648
+ getLViewLeaveAnimations(lView).push(() => runLeaveAnimations(lView, tNode, value, animationsDisabled));
21596
21649
  return ɵɵanimateLeave; // For chaining
21597
21650
  }
21598
- /**
21599
- * Instruction to handle the `(animate.leave)` behavior for event bindings, aka when
21600
- * a user wants to use a custom animation function rather than a class. It registers
21601
- * an animation with the ElementRegistry to be run when the element is scheduled for
21602
- * removal from the DOM.
21603
- *
21604
- * @param value The value bound to `(animate.leave)`, an AnimationFunction.
21605
- * @returns This function returns itself so that it may be chained.
21606
- *
21607
- * @codeGenApi
21608
- */
21609
- function ɵɵanimateLeaveListener(value) {
21610
- performanceMarkFeature('NgAnimateLeave');
21611
- if ((typeof ngServerMode !== 'undefined' && ngServerMode) || !areAnimationSupported) {
21612
- return ɵɵanimateLeaveListener;
21613
- }
21614
- ngDevMode && assertAnimationTypes(value, 'animate.leave');
21615
- // Even when animations are disabled, we still need to register the element for removal
21616
- // to ensure proper cleanup and allow developers to handle element removal in tests
21617
- // So we don't have an early return here.
21618
- const lView = getLView();
21619
- const tNode = getCurrentTNode();
21620
- const tView = getTView();
21651
+ function runLeaveAnimations(lView, tNode, value, animationsDisabled) {
21652
+ const { promise, resolve } = promiseWithResolvers();
21621
21653
  const nativeElement = getNativeByTNode(tNode, lView);
21622
21654
  ngDevMode && assertElementNodes(nativeElement, 'animate.leave');
21623
- const elementRegistry = getAnimationElementRemovalRegistry();
21624
- ngDevMode &&
21625
- assertDefined(elementRegistry.elements, 'Expected `ElementRegistry` to be present in animations subsystem');
21626
21655
  const renderer = lView[RENDERER];
21627
- const animationsDisabled = areAnimationsDisabled(lView);
21628
21656
  const ngZone = lView[INJECTOR].get(NgZone);
21629
- const animate = (_el, value) => {
21630
- return (removeFn) => {
21631
- if (animationsDisabled) {
21632
- removeFn();
21633
- }
21634
- else {
21635
- const event = {
21636
- target: nativeElement,
21637
- animationComplete: () => {
21638
- clearLeavingNodes(tNode, _el);
21639
- removeFn();
21640
- },
21641
- };
21642
- trackLeavingNodes(tNode, _el);
21643
- ngZone.runOutsideAngular(() => {
21644
- renderer.listen(_el, 'animationend', () => removeFn(), { once: true });
21645
- });
21646
- value.call(lView[CONTEXT], event);
21647
- }
21648
- };
21649
- };
21650
- // Ensure cleanup if the LView is destroyed before the animation runs.
21651
- setupElementRegistryCleanup(elementRegistry, lView, tView, nativeElement);
21652
- elementRegistry.elements.addCallback(nativeElement, value, animate);
21653
- return ɵɵanimateLeaveListener; // For chaining
21654
- }
21655
- /**
21656
- * Builds the list of classes to apply to an element based on either the passed in list of strings
21657
- * or the set of resolver functions that are coming from bindings. Those resolver functions should
21658
- * resolve into either a string or a string array. There may be multiple to support composition.
21659
- */
21660
- function getClassList(value, resolvers) {
21661
- const classList = new Set(value);
21662
- if (resolvers && resolvers.length) {
21663
- for (const resolverFn of resolvers) {
21664
- const resolvedValue = getClassListFromValue(resolverFn);
21665
- if (resolvedValue) {
21666
- for (const rv of resolvedValue) {
21667
- classList.add(rv);
21668
- }
21669
- }
21670
- }
21671
- }
21672
- return classList;
21673
- }
21674
- function cancelAnimationsIfRunning(element, renderer) {
21675
- if (!areAnimationSupported)
21676
- return;
21677
- const elementData = enterClassMap.get(element);
21678
- if (elementData &&
21679
- elementData.classList.length > 0 &&
21680
- elementHasClassList(element, elementData.classList)) {
21681
- for (const klass of elementData.classList) {
21682
- renderer.removeClass(element, klass);
21683
- }
21684
- }
21685
- // We need to prevent any enter animation listeners from firing if they exist.
21686
- cleanupEnterClassData(element);
21687
- }
21688
- function elementHasClassList(element, classList) {
21689
- for (const className of classList) {
21690
- if (element.classList.contains(className))
21691
- return true;
21692
- }
21693
- return false;
21694
- }
21695
- function isLongestAnimation(event, nativeElement) {
21696
- const longestAnimation = longestAnimations.get(nativeElement);
21697
- return (nativeElement === event.target &&
21698
- longestAnimation !== undefined &&
21699
- ((longestAnimation.animationName !== undefined &&
21700
- event.animationName === longestAnimation.animationName) ||
21701
- (longestAnimation.propertyName !== undefined &&
21702
- event.propertyName === longestAnimation.propertyName)));
21703
- }
21704
- function animationEnd(event, nativeElement, renderer) {
21705
- const elementData = enterClassMap.get(nativeElement);
21706
- if (!elementData)
21707
- return;
21708
- if (isLongestAnimation(event, nativeElement)) {
21709
- // Now that we've found the longest animation, there's no need
21710
- // to keep bubbling up this event as it's not going to apply to
21711
- // other elements further up. We don't want it to inadvertently
21712
- // affect any other animations on the page.
21713
- event.stopImmediatePropagation();
21714
- for (const klass of elementData.classList) {
21715
- renderer.removeClass(nativeElement, klass);
21716
- }
21717
- cleanupEnterClassData(nativeElement);
21718
- }
21719
- }
21720
- function assertAnimationTypes(value, instruction) {
21721
- if (value == null || (typeof value !== 'string' && typeof value !== 'function')) {
21722
- throw new RuntimeError(650 /* RuntimeErrorCode.ANIMATE_INVALID_VALUE */, `'${instruction}' value must be a string of CSS classes or an animation function, got ${stringify(value)}`);
21657
+ allLeavingAnimations.add(lView);
21658
+ const activeClasses = getClassListFromValue(value);
21659
+ if (activeClasses && activeClasses.length > 0) {
21660
+ animateLeaveClassRunner(nativeElement, tNode, activeClasses, renderer, animationsDisabled, ngZone, resolve);
21723
21661
  }
21724
- }
21725
- function assertElementNodes(nativeElement, instruction) {
21726
- if (nativeElement.nodeType !== Node.ELEMENT_NODE) {
21727
- throw new RuntimeError(650 /* RuntimeErrorCode.ANIMATE_INVALID_VALUE */, `'${instruction}' can only be used on an element node, got ${stringify(nativeElement.nodeType)}`);
21662
+ else {
21663
+ resolve();
21728
21664
  }
21665
+ return promise;
21729
21666
  }
21730
21667
  /**
21731
21668
  * This function actually adds the classes that animate element that's leaving the DOM.
21732
21669
  * Once it finishes, it calls the remove function that was provided by the DOM renderer.
21733
21670
  */
21734
- function animateLeaveClassRunner(el, tNode, classList, finalRemoveFn, renderer, animationsDisabled, ngZone) {
21671
+ function animateLeaveClassRunner(el, tNode, classList, renderer, animationsDisabled, ngZone, resolver) {
21735
21672
  if (animationsDisabled) {
21736
21673
  longestAnimations.delete(el);
21737
- finalRemoveFn();
21674
+ resolver();
21738
21675
  return;
21739
21676
  }
21740
21677
  cancelAnimationsIfRunning(el, renderer);
@@ -21747,8 +21684,16 @@ function animateLeaveClassRunner(el, tNode, classList, finalRemoveFn, renderer,
21747
21684
  event.stopImmediatePropagation();
21748
21685
  longestAnimations.delete(el);
21749
21686
  clearLeavingNodes(tNode, el);
21750
- finalRemoveFn();
21687
+ if (Array.isArray(tNode.projection)) {
21688
+ // in the content projection case, the element is not destroyed.
21689
+ // So we need to remove the class at the end so that it isn't left
21690
+ // behind for whenever the item shows up again.
21691
+ for (const item of classList) {
21692
+ renderer.removeClass(el, item);
21693
+ }
21694
+ }
21751
21695
  }
21696
+ resolver();
21752
21697
  };
21753
21698
  ngZone.runOutsideAngular(() => {
21754
21699
  renderer.listen(el, 'animationend', handleOutAnimationEnd);
@@ -21766,11 +21711,75 @@ function animateLeaveClassRunner(el, tNode, classList, finalRemoveFn, renderer,
21766
21711
  determineLongestAnimation(el, longestAnimations, areAnimationSupported);
21767
21712
  if (!longestAnimations.has(el)) {
21768
21713
  clearLeavingNodes(tNode, el);
21769
- finalRemoveFn();
21714
+ resolver();
21770
21715
  }
21771
21716
  });
21772
21717
  });
21773
21718
  }
21719
+ /**
21720
+ * Instruction to handle the `(animate.leave)` behavior for event bindings, aka when
21721
+ * a user wants to use a custom animation function rather than a class. It registers
21722
+ * a leave animation function in the LView to be run at right before removal from the
21723
+ * DOM.
21724
+ *
21725
+ * @param value The value bound to `(animate.leave)`, an AnimationFunction.
21726
+ * @returns This function returns itself so that it may be chained.
21727
+ *
21728
+ * @codeGenApi
21729
+ */
21730
+ function ɵɵanimateLeaveListener(value) {
21731
+ performanceMarkFeature('NgAnimateLeave');
21732
+ if ((typeof ngServerMode !== 'undefined' && ngServerMode) || !areAnimationSupported) {
21733
+ return ɵɵanimateLeaveListener;
21734
+ }
21735
+ ngDevMode && assertAnimationTypes(value, 'animate.leave');
21736
+ // Even when animations are disabled, we still need to register the element for removal
21737
+ // to ensure proper cleanup and allow developers to handle element removal in tests
21738
+ // So we don't have an early return here.
21739
+ const lView = getLView();
21740
+ const tNode = getCurrentTNode();
21741
+ allLeavingAnimations.add(lView);
21742
+ getLViewLeaveAnimations(lView).push(() => runLeaveAnimationFunction(lView, tNode, value));
21743
+ return ɵɵanimateLeaveListener; // For chaining
21744
+ }
21745
+ /**
21746
+ * runs leave animations when a custom function is provided
21747
+ */
21748
+ function runLeaveAnimationFunction(lView, tNode, value) {
21749
+ const { promise, resolve } = promiseWithResolvers();
21750
+ const nativeElement = getNativeByTNode(tNode, lView);
21751
+ ngDevMode && assertElementNodes(nativeElement, 'animate.leave');
21752
+ const renderer = lView[RENDERER];
21753
+ const animationsDisabled = areAnimationsDisabled(lView);
21754
+ const ngZone = lView[INJECTOR].get(NgZone);
21755
+ const maxAnimationTimeout = lView[INJECTOR].get(MAX_ANIMATION_TIMEOUT);
21756
+ if (animationsDisabled) {
21757
+ resolve();
21758
+ }
21759
+ else {
21760
+ const timeoutId = setTimeout(() => {
21761
+ clearLeavingNodes(tNode, nativeElement);
21762
+ resolve();
21763
+ }, maxAnimationTimeout);
21764
+ const event = {
21765
+ target: nativeElement,
21766
+ animationComplete: () => {
21767
+ clearLeavingNodes(tNode, nativeElement);
21768
+ clearTimeout(timeoutId);
21769
+ resolve();
21770
+ },
21771
+ };
21772
+ trackLeavingNodes(tNode, nativeElement);
21773
+ ngZone.runOutsideAngular(() => {
21774
+ renderer.listen(nativeElement, 'animationend', () => {
21775
+ resolve();
21776
+ }, { once: true });
21777
+ });
21778
+ value.call(lView[CONTEXT], event);
21779
+ }
21780
+ // Ensure cleanup if the LView is destroyed before the animation runs.
21781
+ return promise;
21782
+ }
21774
21783
 
21775
21784
  /*!
21776
21785
  * @license
@@ -21821,7 +21830,11 @@ class LiveCollection {
21821
21830
  }
21822
21831
  }
21823
21832
  move(prevIndex, newIdx) {
21824
- this.attach(newIdx, this.detach(prevIndex));
21833
+ // For move operations, the detach code path is the same one used for removing
21834
+ // DOM nodes, which would trigger `animate.leave` bindings. We need to skip
21835
+ // those animations in the case of a move operation so the moving elements don't
21836
+ // unexpectedly disappear.
21837
+ this.attach(newIdx, this.detach(prevIndex, true /* skipLeaveAnimations */));
21825
21838
  }
21826
21839
  }
21827
21840
  function valuesMatching(liveIdx, liveValue, newIdx, newValue, trackBy) {
@@ -22393,8 +22406,10 @@ class LiveCollectionLContainerImpl extends LiveCollection {
22393
22406
  this.needsIndexUpdate ||= index !== this.length;
22394
22407
  addLViewToLContainer(this.lContainer, lView, index, shouldAddViewToDom(this.templateTNode, dehydratedView));
22395
22408
  }
22396
- detach(index) {
22409
+ detach(index, skipLeaveAnimations) {
22397
22410
  this.needsIndexUpdate ||= index !== this.length - 1;
22411
+ if (skipLeaveAnimations)
22412
+ setSkipLeaveAnimations(this.lContainer, index);
22398
22413
  return detachExistingView(this.lContainer, index);
22399
22414
  }
22400
22415
  create(index, value) {
@@ -22500,6 +22515,15 @@ function getLContainer(lView, index) {
22500
22515
  ngDevMode && assertLContainer(lContainer);
22501
22516
  return lContainer;
22502
22517
  }
22518
+ function setSkipLeaveAnimations(lContainer, index) {
22519
+ if (lContainer.length <= CONTAINER_HEADER_OFFSET)
22520
+ return;
22521
+ const indexInContainer = CONTAINER_HEADER_OFFSET + index;
22522
+ const viewToDetach = lContainer[indexInContainer];
22523
+ if (viewToDetach && viewToDetach[ANIMATIONS]) {
22524
+ viewToDetach[ANIMATIONS].skipLeaveAnimations = true;
22525
+ }
22526
+ }
22503
22527
  function detachExistingView(lContainer, index) {
22504
22528
  const existingLView = detachView(lContainer, index);
22505
22529
  ngDevMode && assertLView(existingLView);
@@ -22987,7 +23011,7 @@ function plural(val) {
22987
23011
  return 1;
22988
23012
  return 5;
22989
23013
  }
22990
- var localeEn = ["en", [["a", "p"], ["AM", "PM"], u], [["AM", "PM"], u, u], [["S", "M", "T", "W", "T", "F", "S"], ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"], ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"], ["Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"]], u, [["J", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"], ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"], ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"]], u, [["B", "A"], ["BC", "AD"], ["Before Christ", "Anno Domini"]], 0, [6, 0], ["M/d/yy", "MMM d, y", "MMMM d, y", "EEEE, MMMM d, y"], ["h:mm a", "h:mm:ss a", "h:mm:ss a z", "h:mm:ss a zzzz"], ["{1}, {0}", u, "{1} 'at' {0}", u], [".", ",", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "¤#,##0.00", "#E0"], "USD", "$", "US Dollar", {}, "ltr", plural];
23014
+ var localeEn = ["en", [["a", "p"], ["AM", "PM"]], [["AM", "PM"]], [["S", "M", "T", "W", "T", "F", "S"], ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"], ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"], ["Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"]], u, [["J", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"], ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"], ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"]], u, [["B", "A"], ["BC", "AD"], ["Before Christ", "Anno Domini"]], 0, [6, 0], ["M/d/yy", "MMM d, y", "MMMM d, y", "EEEE, MMMM d, y"], ["h:mm a", "h:mm:ss a", "h:mm:ss a z", "h:mm:ss a zzzz"], ["{1}, {0}", u, "{1} 'at' {0}", u], [".", ",", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "¤#,##0.00", "#E0"], "USD", "$", "US Dollar", {}, "ltr", plural];
22991
23015
 
22992
23016
  /**
22993
23017
  * This const is used to store the locale data registered with `registerLocaleData`
@@ -23155,6 +23179,7 @@ const ICU_MARKER = {
23155
23179
  */
23156
23180
  var I18nCreateOpCode;
23157
23181
  (function (I18nCreateOpCode) {
23182
+ /* tslint:disable:no-duplicate-enum-values */
23158
23183
  /**
23159
23184
  * Number of bits to shift index so that it can be combined with the `APPEND_EAGERLY` and
23160
23185
  * `COMMENT`.
@@ -23168,6 +23193,7 @@ var I18nCreateOpCode;
23168
23193
  * If set the node should be comment (rather than a text) node.
23169
23194
  */
23170
23195
  I18nCreateOpCode[I18nCreateOpCode["COMMENT"] = 2] = "COMMENT";
23196
+ /* tslint:enable:no-duplicate-enum-values */
23171
23197
  })(I18nCreateOpCode || (I18nCreateOpCode = {}));
23172
23198
 
23173
23199
  /**
@@ -27693,18 +27719,6 @@ function ɵɵExternalStylesFeature(styleUrls) {
27693
27719
  };
27694
27720
  }
27695
27721
 
27696
- /**
27697
- * This feature adds the element registry for delayed element removal when animate.leave
27698
- * is utilized.
27699
- *
27700
- * @codeGenApi
27701
- */
27702
- function ɵɵAnimationsFeature() {
27703
- return () => {
27704
- setAnimationElementRemovalRegistry(new ElementRegistry());
27705
- };
27706
- }
27707
-
27708
27722
  /**
27709
27723
  * Generated next to NgModules to monkey-patch directive and pipe references onto a component's
27710
27724
  * definition, when generating a direct reference in the component file would otherwise create an
@@ -28664,7 +28678,6 @@ const angularCoreEnv = (() => ({
28664
28678
  'ɵɵCopyDefinitionFeature': ɵɵCopyDefinitionFeature,
28665
28679
  'ɵɵInheritDefinitionFeature': ɵɵInheritDefinitionFeature,
28666
28680
  'ɵɵExternalStylesFeature': ɵɵExternalStylesFeature,
28667
- 'ɵɵAnimationsFeature': ɵɵAnimationsFeature,
28668
28681
  'ɵɵnextContext': ɵɵnextContext,
28669
28682
  'ɵɵnamespaceHTML': __namespaceHTML,
28670
28683
  'ɵɵnamespaceMathML': __namespaceMathML,
@@ -29395,7 +29408,6 @@ function compileComponent(type, metadata) {
29395
29408
  declarations: [],
29396
29409
  changeDetection: metadata.changeDetection,
29397
29410
  encapsulation,
29398
- interpolation: metadata.interpolation,
29399
29411
  viewProviders: metadata.viewProviders || null,
29400
29412
  // We can't inspect whether any of the dependencies are actually directives, because they
29401
29413
  // get patched on after compilation. That's why in JIT mode we consider that any
@@ -29905,7 +29917,7 @@ class Compiler {
29905
29917
  *
29906
29918
  * @publicApi
29907
29919
  */
29908
- const COMPILER_OPTIONS = new InjectionToken(ngDevMode ? 'compilerOptions' : '');
29920
+ const COMPILER_OPTIONS = new InjectionToken(typeof ngDevMode !== undefined && ngDevMode ? 'compilerOptions' : '');
29909
29921
  /**
29910
29922
  * A factory for creating a Compiler
29911
29923
  *
@@ -29917,180 +29929,6 @@ const COMPILER_OPTIONS = new InjectionToken(ngDevMode ? 'compilerOptions' : '');
29917
29929
  class CompilerFactory {
29918
29930
  }
29919
29931
 
29920
- class NgZoneChangeDetectionScheduler {
29921
- zone = inject(NgZone);
29922
- changeDetectionScheduler = inject(ChangeDetectionScheduler);
29923
- applicationRef = inject(ApplicationRef);
29924
- applicationErrorHandler = inject(INTERNAL_APPLICATION_ERROR_HANDLER);
29925
- _onMicrotaskEmptySubscription;
29926
- initialize() {
29927
- if (this._onMicrotaskEmptySubscription) {
29928
- return;
29929
- }
29930
- this._onMicrotaskEmptySubscription = this.zone.onMicrotaskEmpty.subscribe({
29931
- next: () => {
29932
- // `onMicroTaskEmpty` can happen _during_ the zoneless scheduler change detection because
29933
- // zone.run(() => {}) will result in `checkStable` at the end of the `zone.run` closure
29934
- // and emit `onMicrotaskEmpty` synchronously if run coalsecing is false.
29935
- if (this.changeDetectionScheduler.runningTick) {
29936
- return;
29937
- }
29938
- this.zone.run(() => {
29939
- try {
29940
- this.applicationRef.dirtyFlags |= 1 /* ApplicationRefDirtyFlags.ViewTreeGlobal */;
29941
- this.applicationRef._tick();
29942
- }
29943
- catch (e) {
29944
- this.applicationErrorHandler(e);
29945
- }
29946
- });
29947
- },
29948
- });
29949
- }
29950
- ngOnDestroy() {
29951
- this._onMicrotaskEmptySubscription?.unsubscribe();
29952
- }
29953
- static ɵfac = function NgZoneChangeDetectionScheduler_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || NgZoneChangeDetectionScheduler)(); };
29954
- static ɵprov = /*@__PURE__*/ __defineInjectable({ token: NgZoneChangeDetectionScheduler, factory: NgZoneChangeDetectionScheduler.ɵfac, providedIn: 'root' });
29955
- }
29956
- (() => { (typeof ngDevMode === "undefined" || ngDevMode) && setClassMetadata(NgZoneChangeDetectionScheduler, [{
29957
- type: Injectable,
29958
- args: [{ providedIn: 'root' }]
29959
- }], null, null); })();
29960
- /**
29961
- * Internal token used to verify that `provideZoneChangeDetection` is not used
29962
- * with the bootstrapModule API.
29963
- */
29964
- const PROVIDED_NG_ZONE = new InjectionToken(typeof ngDevMode === 'undefined' || ngDevMode ? 'provideZoneChangeDetection token' : '', { factory: () => false });
29965
- function internalProvideZoneChangeDetection({ ngZoneFactory, scheduleInRootZone, }) {
29966
- ngZoneFactory ??= () => new NgZone({ ...getNgZoneOptions(), scheduleInRootZone });
29967
- return [
29968
- { provide: NgZone, useFactory: ngZoneFactory },
29969
- {
29970
- provide: ENVIRONMENT_INITIALIZER,
29971
- multi: true,
29972
- useFactory: () => {
29973
- const ngZoneChangeDetectionScheduler = inject(NgZoneChangeDetectionScheduler, {
29974
- optional: true,
29975
- });
29976
- if ((typeof ngDevMode === 'undefined' || ngDevMode) &&
29977
- ngZoneChangeDetectionScheduler === null) {
29978
- throw new RuntimeError(402 /* RuntimeErrorCode.MISSING_REQUIRED_INJECTABLE_IN_BOOTSTRAP */, `A required Injectable was not found in the dependency injection tree. ` +
29979
- 'If you are bootstrapping an NgModule, make sure that the `BrowserModule` is imported.');
29980
- }
29981
- return () => ngZoneChangeDetectionScheduler.initialize();
29982
- },
29983
- },
29984
- {
29985
- provide: ENVIRONMENT_INITIALIZER,
29986
- multi: true,
29987
- useFactory: () => {
29988
- const service = inject(ZoneStablePendingTask);
29989
- return () => {
29990
- service.initialize();
29991
- };
29992
- },
29993
- },
29994
- {
29995
- provide: SCHEDULE_IN_ROOT_ZONE,
29996
- useValue: scheduleInRootZone ?? SCHEDULE_IN_ROOT_ZONE_DEFAULT,
29997
- },
29998
- ];
29999
- }
30000
- /**
30001
- * Provides `NgZone`-based change detection for the application bootstrapped using
30002
- * `bootstrapApplication`.
30003
- *
30004
- * `NgZone` is already provided in applications by default. This provider allows you to configure
30005
- * options like `eventCoalescing` in the `NgZone`.
30006
- * This provider is not available for `platformBrowser().bootstrapModule`, which uses
30007
- * `BootstrapOptions` instead.
30008
- *
30009
- * @usageNotes
30010
- * ```ts
30011
- * bootstrapApplication(MyApp, {providers: [
30012
- * provideZoneChangeDetection({eventCoalescing: true}),
30013
- * ]});
30014
- * ```
30015
- *
30016
- * @publicApi
30017
- * @see {@link /api/platform-browser/bootstrapApplication bootstrapApplication}
30018
- * @see {@link NgZoneOptions}
30019
- */
30020
- function provideZoneChangeDetection(options) {
30021
- const scheduleInRootZone = options?.scheduleInRootZone;
30022
- const zoneProviders = internalProvideZoneChangeDetection({
30023
- ngZoneFactory: () => {
30024
- const ngZoneOptions = getNgZoneOptions(options);
30025
- ngZoneOptions.scheduleInRootZone = scheduleInRootZone;
30026
- if (ngZoneOptions.shouldCoalesceEventChangeDetection) {
30027
- performanceMarkFeature('NgZone_CoalesceEvent');
30028
- }
30029
- return new NgZone(ngZoneOptions);
30030
- },
30031
- scheduleInRootZone,
30032
- });
30033
- return makeEnvironmentProviders([
30034
- { provide: PROVIDED_NG_ZONE, useValue: true },
30035
- { provide: ZONELESS_ENABLED, useValue: false },
30036
- zoneProviders,
30037
- ]);
30038
- }
30039
- // Transforms a set of `BootstrapOptions` (supported by the NgModule-based bootstrap APIs) ->
30040
- // `NgZoneOptions` that are recognized by the NgZone constructor. Passing no options will result in
30041
- // a set of default options returned.
30042
- function getNgZoneOptions(options) {
30043
- return {
30044
- enableLongStackTrace: typeof ngDevMode === 'undefined' ? false : !!ngDevMode,
30045
- shouldCoalesceEventChangeDetection: options?.eventCoalescing ?? false,
30046
- shouldCoalesceRunChangeDetection: options?.runCoalescing ?? false,
30047
- };
30048
- }
30049
- class ZoneStablePendingTask {
30050
- subscription = new Subscription();
30051
- initialized = false;
30052
- zone = inject(NgZone);
30053
- pendingTasks = inject(PendingTasksInternal);
30054
- initialize() {
30055
- if (this.initialized) {
30056
- return;
30057
- }
30058
- this.initialized = true;
30059
- let task = null;
30060
- if (!this.zone.isStable && !this.zone.hasPendingMacrotasks && !this.zone.hasPendingMicrotasks) {
30061
- task = this.pendingTasks.add();
30062
- }
30063
- this.zone.runOutsideAngular(() => {
30064
- this.subscription.add(this.zone.onStable.subscribe(() => {
30065
- NgZone.assertNotInAngularZone();
30066
- // Check whether there are no pending macro/micro tasks in the next tick
30067
- // to allow for NgZone to update the state.
30068
- queueMicrotask(() => {
30069
- if (task !== null &&
30070
- !this.zone.hasPendingMacrotasks &&
30071
- !this.zone.hasPendingMicrotasks) {
30072
- this.pendingTasks.remove(task);
30073
- task = null;
30074
- }
30075
- });
30076
- }));
30077
- });
30078
- this.subscription.add(this.zone.onUnstable.subscribe(() => {
30079
- NgZone.assertInAngularZone();
30080
- task ??= this.pendingTasks.add();
30081
- }));
30082
- }
30083
- ngOnDestroy() {
30084
- this.subscription.unsubscribe();
30085
- }
30086
- static ɵfac = function ZoneStablePendingTask_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || ZoneStablePendingTask)(); };
30087
- static ɵprov = /*@__PURE__*/ __defineInjectable({ token: ZoneStablePendingTask, factory: ZoneStablePendingTask.ɵfac, providedIn: 'root' });
30088
- }
30089
- (() => { (typeof ngDevMode === "undefined" || ngDevMode) && setClassMetadata(ZoneStablePendingTask, [{
30090
- type: Injectable,
30091
- args: [{ providedIn: 'root' }]
30092
- }], null, null); })();
30093
-
30094
29932
  const CONSECUTIVE_MICROTASK_NOTIFICATION_LIMIT = 100;
30095
29933
  let consecutiveMicrotaskNotifications = 0;
30096
29934
  let stackFromLastFewNotifications = [];
@@ -30115,7 +29953,6 @@ class ChangeDetectionSchedulerImpl {
30115
29953
  ngZone = inject(NgZone);
30116
29954
  zonelessEnabled = inject(ZONELESS_ENABLED);
30117
29955
  tracing = inject(TracingService, { optional: true });
30118
- disableScheduling = inject(ZONELESS_SCHEDULER_DISABLED, { optional: true }) ?? false;
30119
29956
  zoneIsDefined = typeof Zone !== 'undefined' && !!Zone.root.run;
30120
29957
  schedulerTickApplyArgs = [{ data: { '__scheduler_tick__': true } }];
30121
29958
  subscriptions = new Subscription();
@@ -30146,14 +29983,6 @@ class ChangeDetectionSchedulerImpl {
30146
29983
  this.cleanup();
30147
29984
  }
30148
29985
  }));
30149
- // TODO(atscott): These conditions will need to change when zoneless is the default
30150
- // Instead, they should flip to checking if ZoneJS scheduling is provided
30151
- this.disableScheduling ||=
30152
- !this.zonelessEnabled &&
30153
- // NoopNgZone without enabling zoneless means no scheduling whatsoever
30154
- (this.ngZone instanceof NoopNgZone ||
30155
- // The same goes for the lack of Zone without enabling zoneless scheduling
30156
- !this.zoneIsDefined);
30157
29986
  }
30158
29987
  notify(source) {
30159
29988
  if (!this.zonelessEnabled && source === 5 /* NotificationSource.Listener */) {
@@ -30167,7 +29996,6 @@ class ChangeDetectionSchedulerImpl {
30167
29996
  // to make listener callbacks work correctly with `OnPush` components.
30168
29997
  return;
30169
29998
  }
30170
- let force = false;
30171
29999
  switch (source) {
30172
30000
  case 0 /* NotificationSource.MarkAncestorsForTraversal */: {
30173
30001
  this.appRef.dirtyFlags |= 2 /* ApplicationRefDirtyFlags.ViewTreeTraversal */;
@@ -30186,34 +30014,19 @@ class ChangeDetectionSchedulerImpl {
30186
30014
  // during CD. In practice this is a no-op since the elements code also calls via a
30187
30015
  // `markForRefresh()` API which sends `NotificationSource.MarkAncestorsForTraversal` anyway.
30188
30016
  this.appRef.dirtyFlags |= 2 /* ApplicationRefDirtyFlags.ViewTreeTraversal */;
30189
- force = true;
30190
30017
  break;
30191
30018
  }
30192
30019
  case 12 /* NotificationSource.RootEffect */: {
30193
30020
  this.appRef.dirtyFlags |= 16 /* ApplicationRefDirtyFlags.RootEffects */;
30194
- // Root effects still force a CD, even if the scheduler is disabled. This ensures that
30195
- // effects always run, even when triggered from outside the zone when the scheduler is
30196
- // otherwise disabled.
30197
- force = true;
30198
30021
  break;
30199
30022
  }
30200
30023
  case 13 /* NotificationSource.ViewEffect */: {
30201
30024
  // This is technically a no-op, since view effects will also send a
30202
30025
  // `MarkAncestorsForTraversal` notification. Still, we set this for logical consistency.
30203
30026
  this.appRef.dirtyFlags |= 2 /* ApplicationRefDirtyFlags.ViewTreeTraversal */;
30204
- // View effects still force a CD, even if the scheduler is disabled. This ensures that
30205
- // effects always run, even when triggered from outside the zone when the scheduler is
30206
- // otherwise disabled.
30207
- force = true;
30208
30027
  break;
30209
30028
  }
30210
30029
  case 11 /* NotificationSource.PendingTaskRemoved */: {
30211
- // Removing a pending task via the public API forces a scheduled tick, ensuring that
30212
- // stability is async and delayed until there was at least an opportunity to run
30213
- // application synchronization. This prevents some footguns when working with the
30214
- // public API for pending tasks where developers attempt to update application state
30215
- // immediately after removing the last task.
30216
- force = true;
30217
30030
  break;
30218
30031
  }
30219
30032
  case 9 /* NotificationSource.ViewDetachedFromDOM */:
@@ -30231,7 +30044,7 @@ class ChangeDetectionSchedulerImpl {
30231
30044
  // notification so that the resulting CD run can be attributed to the
30232
30045
  // context which produced the notification.
30233
30046
  this.appRef.tracingSnapshot = this.tracing?.snapshot(this.appRef.tracingSnapshot) ?? null;
30234
- if (!this.shouldScheduleTick(force)) {
30047
+ if (!this.shouldScheduleTick()) {
30235
30048
  return;
30236
30049
  }
30237
30050
  if (typeof ngDevMode === 'undefined' || ngDevMode) {
@@ -30254,8 +30067,8 @@ class ChangeDetectionSchedulerImpl {
30254
30067
  this.cancelScheduledCallback = this.ngZone.runOutsideAngular(() => scheduleCallback(() => this.tick()));
30255
30068
  }
30256
30069
  }
30257
- shouldScheduleTick(force) {
30258
- if ((this.disableScheduling && !force) || this.appRef.destroyed) {
30070
+ shouldScheduleTick() {
30071
+ if (this.appRef.destroyed) {
30259
30072
  return false;
30260
30073
  }
30261
30074
  // already scheduled or running
@@ -30406,15 +30219,19 @@ function provideZonelessChangeDetection() {
30406
30219
  console.warn(message);
30407
30220
  }
30408
30221
  return makeEnvironmentProviders([
30409
- { provide: ChangeDetectionScheduler, useExisting: ChangeDetectionSchedulerImpl },
30410
- { provide: NgZone, useClass: NoopNgZone },
30411
- { provide: ZONELESS_ENABLED, useValue: true },
30412
- { provide: SCHEDULE_IN_ROOT_ZONE, useValue: false },
30222
+ ...provideZonelessChangeDetectionInternal(),
30413
30223
  typeof ngDevMode === 'undefined' || ngDevMode
30414
30224
  ? [{ provide: PROVIDED_ZONELESS, useValue: true }]
30415
30225
  : [],
30416
30226
  ]);
30417
30227
  }
30228
+ function provideZonelessChangeDetectionInternal() {
30229
+ return [
30230
+ { provide: ChangeDetectionScheduler, useExisting: ChangeDetectionSchedulerImpl },
30231
+ { provide: NgZone, useClass: NoopNgZone },
30232
+ { provide: ZONELESS_ENABLED, useValue: true },
30233
+ ];
30234
+ }
30418
30235
 
30419
30236
  /// <reference path="../../../goog.d.ts" />
30420
30237
  /**
@@ -30478,7 +30295,7 @@ function getGlobalLocale() {
30478
30295
  *
30479
30296
  * @publicApi
30480
30297
  */
30481
- const LOCALE_ID = new InjectionToken(ngDevMode ? 'LocaleId' : '', {
30298
+ const LOCALE_ID = new InjectionToken(typeof ngDevMode !== undefined && ngDevMode ? 'LocaleId' : '', {
30482
30299
  providedIn: 'root',
30483
30300
  factory: () => inject(LOCALE_ID, { optional: true, skipSelf: true }) || getGlobalLocale(),
30484
30301
  });
@@ -30525,7 +30342,7 @@ const LOCALE_ID = new InjectionToken(ngDevMode ? 'LocaleId' : '', {
30525
30342
  *
30526
30343
  * @publicApi
30527
30344
  */
30528
- const DEFAULT_CURRENCY_CODE = new InjectionToken(ngDevMode ? 'DefaultCurrencyCode' : '', {
30345
+ const DEFAULT_CURRENCY_CODE = new InjectionToken(typeof ngDevMode !== undefined && ngDevMode ? 'DefaultCurrencyCode' : '', {
30529
30346
  providedIn: 'root',
30530
30347
  factory: () => USD_CURRENCY_CODE,
30531
30348
  });
@@ -30562,7 +30379,7 @@ const DEFAULT_CURRENCY_CODE = new InjectionToken(ngDevMode ? 'DefaultCurrencyCod
30562
30379
  *
30563
30380
  * @publicApi
30564
30381
  */
30565
- const TRANSLATIONS = new InjectionToken(ngDevMode ? 'Translations' : '');
30382
+ const TRANSLATIONS = new InjectionToken(typeof ngDevMode !== undefined && ngDevMode ? 'Translations' : '');
30566
30383
  /**
30567
30384
  * Provide this token at bootstrap to set the format of your {@link TRANSLATIONS}: `xtb`,
30568
30385
  * `xlf` or `xlf2`.
@@ -30593,7 +30410,7 @@ const TRANSLATIONS = new InjectionToken(ngDevMode ? 'Translations' : '');
30593
30410
  *
30594
30411
  * @publicApi
30595
30412
  */
30596
- const TRANSLATIONS_FORMAT = new InjectionToken(ngDevMode ? 'TranslationsFormat' : '');
30413
+ const TRANSLATIONS_FORMAT = new InjectionToken(typeof ngDevMode !== undefined && ngDevMode ? 'TranslationsFormat' : '');
30597
30414
  /**
30598
30415
  * Use this enum at bootstrap as an option of `bootstrapModule` to define the strategy
30599
30416
  * that the compiler should use in case of missing translations:
@@ -31185,5 +31002,5 @@ function getDebugNode(nativeNode) {
31185
31002
  return null;
31186
31003
  }
31187
31004
 
31188
- export { AFTER_RENDER_PHASES, ANIMATIONS_DISABLED, ANIMATION_MODULE_TYPE, APP_BOOTSTRAP_LISTENER, APP_ID, APP_INITIALIZER, AcxChangeDetectionStrategy, AcxViewEncapsulation, AfterRenderImpl, AfterRenderManager, AfterRenderSequence, ApplicationInitStatus, ApplicationRef, Attribute, COMPILER_OPTIONS, CONTAINERS, CSP_NONCE, CUSTOM_ELEMENTS_SCHEMA, ChangeDetectionSchedulerImpl, ChangeDetectionStrategy, Compiler, CompilerFactory, Component, ComponentFactory, ComponentFactory$1, ComponentFactoryResolver$1 as ComponentFactoryResolver, ComponentRef$1 as ComponentRef, ComponentRef as ComponentRef$1, Console, DEFAULT_CURRENCY_CODE, DEFAULT_LOCALE_ID, DEFER_BLOCK_CONFIG, DEFER_BLOCK_DEPENDENCY_INTERCEPTOR, DEFER_BLOCK_ID, DEFER_BLOCK_SSR_ID_ATTRIBUTE, DEFER_BLOCK_STATE$1 as DEFER_BLOCK_STATE, DEFER_BLOCK_STATE as DEFER_BLOCK_STATE$1, DEFER_HYDRATE_TRIGGERS, DEFER_PARENT_BLOCK_ID, DEHYDRATED_BLOCK_REGISTRY, DISCONNECTED_NODES, DebugElement, DebugEventListener, DebugNode, DeferBlockBehavior, DeferBlockState, DehydratedBlockRegistry, Directive, ELEMENT_CONTAINERS, EVENT_REPLAY_ENABLED_DEFAULT, ElementRef, ElementRegistry, EnvironmentNgModuleRefAdapter, Framework, Host, HostBinding, HostListener, HydrationStatus, I18N_DATA, IMAGE_CONFIG, IMAGE_CONFIG_DEFAULTS, IS_ENABLED_BLOCKING_INITIAL_NAVIGATION, IS_EVENT_REPLAY_ENABLED, IS_HYDRATION_DOM_REUSE_ENABLED, IS_I18N_HYDRATION_ENABLED, IS_INCREMENTAL_HYDRATION_ENABLED, Inject, Injectable, Input, JSACTION_BLOCK_ELEMENT_MAP, JSACTION_EVENT_CONTRACT, LContext, LOCALE_ID, LocaleDataIndex, MAX_ANIMATION_TIMEOUT, MULTIPLIER, MissingTranslationStrategy, ModuleWithComponentFactories, NGH_ATTR_NAME, NGH_DATA_KEY, NGH_DEFER_BLOCKS_KEY, NODES, NOOP_AFTER_RENDER_REF, NOT_FOUND_CHECK_ONLY_ELEMENT_INJECTOR, NO_CHANGE, NO_ERRORS_SCHEMA, NUM_ROOT_NODES, NgModule, NgModuleFactory, NgModuleFactory$1, NgModuleRef, NgModuleRef$1, Optional, Output, PLATFORM_ID, PLATFORM_INITIALIZER, PRESERVE_HOST_CONTENT, PROVIDED_NG_ZONE, Pipe, QueryList, ReflectionCapabilities, Renderer2, RendererFactory2, RendererStyleFlags2, SKIP_HYDRATION_ATTR_NAME, SSR_CONTENT_INTEGRITY_MARKER, Sanitizer, SecurityContext, Self, SimpleChange, SkipSelf, TEMPLATES, TEMPLATE_ID, TESTABILITY, TESTABILITY_GETTER, TRANSLATIONS, TRANSLATIONS_FORMAT, TemplateRef, Testability, TestabilityRegistry, TimerScheduler, TracingAction, TracingService, TransferState, Type, UseExhaustiveCheckNoChanges, ViewContainerRef, ViewEncapsulation, ViewRef, _sanitizeHtml, _sanitizeUrl, afterEveryRender, afterNextRender, allowSanitizationBypassAndThrow, angularCoreEnv, appendDeferBlocksToJSActionMap, asNativeElements, assertComponentDef, assertStandaloneComponentType, bypassSanitizationTrustHtml, bypassSanitizationTrustResourceUrl, bypassSanitizationTrustScript, bypassSanitizationTrustStyle, bypassSanitizationTrustUrl, calcPathForNode, checkNoChangesInternal, cleanupDehydratedViews, clearResolutionOfComponentResourcesQueue, collectNativeNodes, collectNativeNodesInLContainer, compileComponent, compileDirective, compileNgModule, compileNgModuleDefs, compilePipe, convertHydrateTriggersToJsAction, countBlocksSkippedByHydration, createEnvironmentInjector, createMultiResultQuerySignalFn, createNgModule, createNgModuleRef, createNgModuleRefWithProviders, createSingleResultOptionalQuerySignalFn, createSingleResultRequiredQuerySignalFn, depsTracker, devModeEqual, enableApplyRootElementTransformImpl, enableClaimDehydratedIcuCaseImpl, enableFindMatchingDehydratedViewImpl, enableLocateOrCreateContainerAnchorImpl, enableLocateOrCreateContainerRefImpl, enableLocateOrCreateElementContainerNodeImpl, enableLocateOrCreateElementNodeImpl, enableLocateOrCreateI18nNodeImpl, enableLocateOrCreateTextNodeImpl, enablePrepareI18nBlockForHydrationImpl, enableProfiling, enableRetrieveDeferBlockDataImpl, enableRetrieveHydrationInfoImpl, enableStashEventListenerImpl, findLocaleData, flushModuleScopingQueueAsMuchAsPossible, gatherDeferBlocksCommentNodes, generateStandaloneInDeclarationsError, getAsyncClassMetadataFn, getCompilerFacade, getDebugNode, getDeferBlocks$1 as getDeferBlocks, getDirectives, getDocument, getHostElement, getLContext, getLDeferBlockDetails, getLNodeForHydration, getLocaleCurrencyCode, getLocalePluralCase, getNgZoneOptions, getOrComputeI18nChildren, getRegisteredNgModuleType, getSanitizationBypassType, getTDeferBlockDetails, getTransferState, inferTagNameFromDefinition, inputBinding, internalProvideZoneChangeDetection, invokeListeners, isBoundToModule, isComponentDefPendingResolution, isComponentResourceResolutionQueueEmpty, isDeferBlock, isDetachedByI18n, isDisconnectedNode, isI18nHydrationEnabled, isI18nHydrationSupportEnabled, isInSkipHydrationBlock, isIncrementalHydrationEnabled, isJsObject, isLetDeclaration, isListLikeIterable, isNgModule, isPromise, isSubscribable, isTNodeShape, isViewDirty, iterateListLike, makePropDecorator, makeStateKey, markForRefresh, noSideEffects, optionsReducer, outputBinding, patchComponentDefWithScope, performanceMarkFeature, processAndInitTriggers, processBlockData, processTextNodeBeforeSerialization, profiler, provideAppInitializer, provideNgReflectAttributes, provideZoneChangeDetection, provideZonelessChangeDetection, publishDefaultGlobalUtils, publishExternalGlobalUtil, publishSignalConfiguration, readHydrationInfo, readPatchedLView, registerLocaleData, registerNgModuleType, remove, removeListeners, renderDeferBlockState, resetCompiledComponents, resetJitOptions, resolveComponentResources, restoreComponentResolutionQueue, setAllowDuplicateNgModuleIdsForTest, setClassMetadata, setClassMetadataAsync, setDocument, setIsI18nHydrationSupportEnabled, setJSActionAttributes, setJitOptions, setLocaleId, setStashFn, setTestabilityGetter, sharedMapFunction, sharedStashFunction, transitiveScopesFor, triggerHydrationFromBlockName, triggerResourceLoading, trySerializeI18nBlock, twoWayBinding, unregisterAllLocaleData, unsupportedProjectionOfDomNodes, unwrapSafeValue, validateMatchingNode, validateNodeExists, verifySsrContentsIntegrity, ɵgetUnknownElementStrictMode, ɵgetUnknownPropertyStrictMode, ɵsetClassDebugInfo, ɵsetUnknownElementStrictMode, ɵsetUnknownPropertyStrictMode, ɵɵAnimationsFeature, ɵɵCopyDefinitionFeature, ɵɵExternalStylesFeature, ɵɵHostDirectivesFeature, ɵɵInheritDefinitionFeature, ɵɵNgOnChangesFeature, ɵɵProvidersFeature, ɵɵadvance, ɵɵanimateEnter, ɵɵanimateEnterListener, ɵɵanimateLeave, ɵɵanimateLeaveListener, ɵɵariaProperty, ɵɵattachSourceLocations, ɵɵattribute, ɵɵclassMap, ɵɵclassProp, ɵɵcomponentInstance, ɵɵconditional, ɵɵconditionalBranchCreate, ɵɵconditionalCreate, ɵɵcontentQuery, ɵɵcontentQuerySignal, ɵɵdeclareLet, ɵɵdefer, ɵɵdeferEnableTimerScheduling, ɵɵdeferHydrateNever, ɵɵdeferHydrateOnHover, ɵɵdeferHydrateOnIdle, ɵɵdeferHydrateOnImmediate, ɵɵdeferHydrateOnInteraction, ɵɵdeferHydrateOnTimer, ɵɵdeferHydrateOnViewport, ɵɵdeferHydrateWhen, ɵɵdeferOnHover, ɵɵdeferOnIdle, ɵɵdeferOnImmediate, ɵɵdeferOnInteraction, ɵɵdeferOnTimer, ɵɵdeferOnViewport, ɵɵdeferPrefetchOnHover, ɵɵdeferPrefetchOnIdle, ɵɵdeferPrefetchOnImmediate, ɵɵdeferPrefetchOnInteraction, ɵɵdeferPrefetchOnTimer, ɵɵdeferPrefetchOnViewport, ɵɵdeferPrefetchWhen, ɵɵdeferWhen, ɵɵdefineComponent, ɵɵdefineDirective, ɵɵdefineNgModule, ɵɵdefinePipe, ɵɵdirectiveInject, ɵɵdomElement, ɵɵdomElementContainer, ɵɵdomElementContainerEnd, ɵɵdomElementContainerStart, ɵɵdomElementEnd, ɵɵdomElementStart, ɵɵdomListener, ɵɵdomProperty, ɵɵdomTemplate, ɵɵelement, ɵɵelementContainer, ɵɵelementContainerEnd, ɵɵelementContainerStart, ɵɵelementEnd, ɵɵelementStart, ɵɵgetComponentDepsFactory, ɵɵgetCurrentView, ɵɵgetInheritedFactory, ɵɵgetReplaceMetadataURL, ɵɵi18n, ɵɵi18nApply, ɵɵi18nAttributes, ɵɵi18nEnd, ɵɵi18nExp, ɵɵi18nPostprocess, ɵɵi18nStart, ɵɵinjectAttribute, ɵɵinterpolate, ɵɵinterpolate1, ɵɵinterpolate2, ɵɵinterpolate3, ɵɵinterpolate4, ɵɵinterpolate5, ɵɵinterpolate6, ɵɵinterpolate7, ɵɵinterpolate8, ɵɵinterpolateV, ɵɵinvalidFactory, ɵɵlistener, ɵɵloadQuery, ɵɵnextContext, ɵɵpipe, ɵɵpipeBind1, ɵɵpipeBind2, ɵɵpipeBind3, ɵɵpipeBind4, ɵɵpipeBindV, ɵɵprojection, ɵɵprojectionDef, ɵɵproperty, ɵɵpureFunction0, ɵɵpureFunction1, ɵɵpureFunction2, ɵɵpureFunction3, ɵɵpureFunction4, ɵɵpureFunction5, ɵɵpureFunction6, ɵɵpureFunction7, ɵɵpureFunction8, ɵɵpureFunctionV, ɵɵqueryAdvance, ɵɵqueryRefresh, ɵɵreadContextLet, ɵɵreference, ɵɵrepeater, ɵɵrepeaterCreate, ɵɵrepeaterTrackByIdentity, ɵɵrepeaterTrackByIndex, ɵɵreplaceMetadata, ɵɵresolveBody, ɵɵresolveDocument, ɵɵresolveWindow, ɵɵsanitizeHtml, ɵɵsanitizeResourceUrl, ɵɵsanitizeScript, ɵɵsanitizeStyle, ɵɵsanitizeUrl, ɵɵsanitizeUrlOrResourceUrl, ɵɵsetComponentScope, ɵɵsetNgModuleScope, ɵɵstoreLet, ɵɵstyleMap, ɵɵstyleProp, ɵɵsyntheticHostListener, ɵɵsyntheticHostProperty, ɵɵtemplate, ɵɵtemplateRefExtractor, ɵɵtext, ɵɵtextInterpolate, ɵɵtextInterpolate1, ɵɵtextInterpolate2, ɵɵtextInterpolate3, ɵɵtextInterpolate4, ɵɵtextInterpolate5, ɵɵtextInterpolate6, ɵɵtextInterpolate7, ɵɵtextInterpolate8, ɵɵtextInterpolateV, ɵɵtrustConstantHtml, ɵɵtrustConstantResourceUrl, ɵɵtwoWayBindingSet, ɵɵtwoWayListener, ɵɵtwoWayProperty, ɵɵvalidateIframeAttribute, ɵɵviewQuery, ɵɵviewQuerySignal };
31005
+ export { AFTER_RENDER_PHASES, ANIMATIONS_DISABLED, ANIMATION_MODULE_TYPE, APP_BOOTSTRAP_LISTENER, APP_ID, APP_INITIALIZER, AcxChangeDetectionStrategy, AcxViewEncapsulation, AfterRenderImpl, AfterRenderManager, AfterRenderSequence, ApplicationInitStatus, ApplicationRef, Attribute, COMPILER_OPTIONS, CONTAINERS, CSP_NONCE, CUSTOM_ELEMENTS_SCHEMA, ChangeDetectionSchedulerImpl, ChangeDetectionStrategy, Compiler, CompilerFactory, Component, ComponentFactory, ComponentFactory$1, ComponentFactoryResolver$1 as ComponentFactoryResolver, ComponentRef$1 as ComponentRef, ComponentRef as ComponentRef$1, Console, DEFAULT_CURRENCY_CODE, DEFAULT_LOCALE_ID, DEFER_BLOCK_CONFIG, DEFER_BLOCK_DEPENDENCY_INTERCEPTOR, DEFER_BLOCK_ID, DEFER_BLOCK_SSR_ID_ATTRIBUTE, DEFER_BLOCK_STATE$1 as DEFER_BLOCK_STATE, DEFER_BLOCK_STATE as DEFER_BLOCK_STATE$1, DEFER_HYDRATE_TRIGGERS, DEFER_PARENT_BLOCK_ID, DEHYDRATED_BLOCK_REGISTRY, DISCONNECTED_NODES, DebugElement, DebugEventListener, DebugNode, DeferBlockBehavior, DeferBlockState, DehydratedBlockRegistry, Directive, ELEMENT_CONTAINERS, EVENT_REPLAY_ENABLED_DEFAULT, ElementRef, EnvironmentNgModuleRefAdapter, Framework, Host, HostBinding, HostListener, HydrationStatus, I18N_DATA, IMAGE_CONFIG, IMAGE_CONFIG_DEFAULTS, IS_ENABLED_BLOCKING_INITIAL_NAVIGATION, IS_EVENT_REPLAY_ENABLED, IS_HYDRATION_DOM_REUSE_ENABLED, IS_I18N_HYDRATION_ENABLED, IS_INCREMENTAL_HYDRATION_ENABLED, Inject, Injectable, Input, JSACTION_BLOCK_ELEMENT_MAP, JSACTION_EVENT_CONTRACT, LContext, LOCALE_ID, LocaleDataIndex, MAX_ANIMATION_TIMEOUT, MULTIPLIER, MissingTranslationStrategy, ModuleWithComponentFactories, NGH_ATTR_NAME, NGH_DATA_KEY, NGH_DEFER_BLOCKS_KEY, NODES, NOOP_AFTER_RENDER_REF, NOT_FOUND_CHECK_ONLY_ELEMENT_INJECTOR, NO_CHANGE, NO_ERRORS_SCHEMA, NUM_ROOT_NODES, NgModule, NgModuleFactory, NgModuleFactory$1, NgModuleRef, NgModuleRef$1, Optional, Output, PLATFORM_ID, PLATFORM_INITIALIZER, PRESERVE_HOST_CONTENT, Pipe, QueryList, ReflectionCapabilities, Renderer2, RendererFactory2, RendererStyleFlags2, SKIP_HYDRATION_ATTR_NAME, SSR_CONTENT_INTEGRITY_MARKER, Sanitizer, SecurityContext, Self, SimpleChange, SkipSelf, TEMPLATES, TEMPLATE_ID, TESTABILITY, TESTABILITY_GETTER, TRANSLATIONS, TRANSLATIONS_FORMAT, TemplateRef, Testability, TestabilityRegistry, TimerScheduler, TracingAction, TracingService, TransferState, Type, UseExhaustiveCheckNoChanges, ViewContainerRef, ViewEncapsulation, ViewRef, _sanitizeHtml, _sanitizeUrl, afterEveryRender, afterNextRender, allLeavingAnimations, allowSanitizationBypassAndThrow, angularCoreEnv, appendDeferBlocksToJSActionMap, asNativeElements, assertComponentDef, assertStandaloneComponentType, bypassSanitizationTrustHtml, bypassSanitizationTrustResourceUrl, bypassSanitizationTrustScript, bypassSanitizationTrustStyle, bypassSanitizationTrustUrl, calcPathForNode, checkNoChangesInternal, cleanupDehydratedViews, clearResolutionOfComponentResourcesQueue, collectNativeNodes, collectNativeNodesInLContainer, compileComponent, compileDirective, compileNgModule, compileNgModuleDefs, compilePipe, convertHydrateTriggersToJsAction, countBlocksSkippedByHydration, createEnvironmentInjector, createMultiResultQuerySignalFn, createNgModule, createNgModuleRef, createNgModuleRefWithProviders, createSingleResultOptionalQuerySignalFn, createSingleResultRequiredQuerySignalFn, depsTracker, devModeEqual, enableApplyRootElementTransformImpl, enableClaimDehydratedIcuCaseImpl, enableFindMatchingDehydratedViewImpl, enableLocateOrCreateContainerAnchorImpl, enableLocateOrCreateContainerRefImpl, enableLocateOrCreateElementContainerNodeImpl, enableLocateOrCreateElementNodeImpl, enableLocateOrCreateI18nNodeImpl, enableLocateOrCreateTextNodeImpl, enablePrepareI18nBlockForHydrationImpl, enableProfiling, enableRetrieveDeferBlockDataImpl, enableRetrieveHydrationInfoImpl, enableStashEventListenerImpl, findLocaleData, flushModuleScopingQueueAsMuchAsPossible, gatherDeferBlocksCommentNodes, generateStandaloneInDeclarationsError, getAsyncClassMetadataFn, getCompilerFacade, getDebugNode, getDeferBlocks$1 as getDeferBlocks, getDirectives, getDocument, getHostElement, getLContext, getLDeferBlockDetails, getLNodeForHydration, getLocaleCurrencyCode, getLocalePluralCase, getOrComputeI18nChildren, getRegisteredNgModuleType, getSanitizationBypassType, getTDeferBlockDetails, getTransferState, inferTagNameFromDefinition, inputBinding, invokeListeners, isBoundToModule, isComponentDefPendingResolution, isComponentResourceResolutionQueueEmpty, isDeferBlock, isDetachedByI18n, isDisconnectedNode, isI18nHydrationEnabled, isI18nHydrationSupportEnabled, isInSkipHydrationBlock, isIncrementalHydrationEnabled, isJsObject, isLetDeclaration, isListLikeIterable, isNgModule, isPromise, isSubscribable, isTNodeShape, isViewDirty, iterateListLike, makePropDecorator, makeStateKey, markForRefresh, noSideEffects, optionsReducer, outputBinding, patchComponentDefWithScope, performanceMarkFeature, processAndInitTriggers, processBlockData, processTextNodeBeforeSerialization, profiler, provideAppInitializer, provideNgReflectAttributes, provideZonelessChangeDetection, provideZonelessChangeDetectionInternal, publishDefaultGlobalUtils, publishExternalGlobalUtil, publishSignalConfiguration, readHydrationInfo, readPatchedLView, registerLocaleData, registerNgModuleType, remove, removeListeners, renderDeferBlockState, resetCompiledComponents, resetJitOptions, resolveComponentResources, restoreComponentResolutionQueue, setAllowDuplicateNgModuleIdsForTest, setClassMetadata, setClassMetadataAsync, setDocument, setIsI18nHydrationSupportEnabled, setJSActionAttributes, setJitOptions, setLocaleId, setStashFn, setTestabilityGetter, sharedMapFunction, sharedStashFunction, transitiveScopesFor, triggerHydrationFromBlockName, triggerResourceLoading, trySerializeI18nBlock, twoWayBinding, unregisterAllLocaleData, unsupportedProjectionOfDomNodes, unwrapSafeValue, validAppIdInitializer, validateMatchingNode, validateNodeExists, verifySsrContentsIntegrity, ɵgetUnknownElementStrictMode, ɵgetUnknownPropertyStrictMode, ɵsetClassDebugInfo, ɵsetUnknownElementStrictMode, ɵsetUnknownPropertyStrictMode, ɵɵCopyDefinitionFeature, ɵɵExternalStylesFeature, ɵɵHostDirectivesFeature, ɵɵInheritDefinitionFeature, ɵɵNgOnChangesFeature, ɵɵProvidersFeature, ɵɵadvance, ɵɵanimateEnter, ɵɵanimateEnterListener, ɵɵanimateLeave, ɵɵanimateLeaveListener, ɵɵariaProperty, ɵɵattachSourceLocations, ɵɵattribute, ɵɵclassMap, ɵɵclassProp, ɵɵcomponentInstance, ɵɵconditional, ɵɵconditionalBranchCreate, ɵɵconditionalCreate, ɵɵcontentQuery, ɵɵcontentQuerySignal, ɵɵdeclareLet, ɵɵdefer, ɵɵdeferEnableTimerScheduling, ɵɵdeferHydrateNever, ɵɵdeferHydrateOnHover, ɵɵdeferHydrateOnIdle, ɵɵdeferHydrateOnImmediate, ɵɵdeferHydrateOnInteraction, ɵɵdeferHydrateOnTimer, ɵɵdeferHydrateOnViewport, ɵɵdeferHydrateWhen, ɵɵdeferOnHover, ɵɵdeferOnIdle, ɵɵdeferOnImmediate, ɵɵdeferOnInteraction, ɵɵdeferOnTimer, ɵɵdeferOnViewport, ɵɵdeferPrefetchOnHover, ɵɵdeferPrefetchOnIdle, ɵɵdeferPrefetchOnImmediate, ɵɵdeferPrefetchOnInteraction, ɵɵdeferPrefetchOnTimer, ɵɵdeferPrefetchOnViewport, ɵɵdeferPrefetchWhen, ɵɵdeferWhen, ɵɵdefineComponent, ɵɵdefineDirective, ɵɵdefineNgModule, ɵɵdefinePipe, ɵɵdirectiveInject, ɵɵdomElement, ɵɵdomElementContainer, ɵɵdomElementContainerEnd, ɵɵdomElementContainerStart, ɵɵdomElementEnd, ɵɵdomElementStart, ɵɵdomListener, ɵɵdomProperty, ɵɵdomTemplate, ɵɵelement, ɵɵelementContainer, ɵɵelementContainerEnd, ɵɵelementContainerStart, ɵɵelementEnd, ɵɵelementStart, ɵɵgetComponentDepsFactory, ɵɵgetCurrentView, ɵɵgetInheritedFactory, ɵɵgetReplaceMetadataURL, ɵɵi18n, ɵɵi18nApply, ɵɵi18nAttributes, ɵɵi18nEnd, ɵɵi18nExp, ɵɵi18nPostprocess, ɵɵi18nStart, ɵɵinjectAttribute, ɵɵinterpolate, ɵɵinterpolate1, ɵɵinterpolate2, ɵɵinterpolate3, ɵɵinterpolate4, ɵɵinterpolate5, ɵɵinterpolate6, ɵɵinterpolate7, ɵɵinterpolate8, ɵɵinterpolateV, ɵɵinvalidFactory, ɵɵlistener, ɵɵloadQuery, ɵɵnextContext, ɵɵpipe, ɵɵpipeBind1, ɵɵpipeBind2, ɵɵpipeBind3, ɵɵpipeBind4, ɵɵpipeBindV, ɵɵprojection, ɵɵprojectionDef, ɵɵproperty, ɵɵpureFunction0, ɵɵpureFunction1, ɵɵpureFunction2, ɵɵpureFunction3, ɵɵpureFunction4, ɵɵpureFunction5, ɵɵpureFunction6, ɵɵpureFunction7, ɵɵpureFunction8, ɵɵpureFunctionV, ɵɵqueryAdvance, ɵɵqueryRefresh, ɵɵreadContextLet, ɵɵreference, ɵɵrepeater, ɵɵrepeaterCreate, ɵɵrepeaterTrackByIdentity, ɵɵrepeaterTrackByIndex, ɵɵreplaceMetadata, ɵɵresolveBody, ɵɵresolveDocument, ɵɵresolveWindow, ɵɵsanitizeHtml, ɵɵsanitizeResourceUrl, ɵɵsanitizeScript, ɵɵsanitizeStyle, ɵɵsanitizeUrl, ɵɵsanitizeUrlOrResourceUrl, ɵɵsetComponentScope, ɵɵsetNgModuleScope, ɵɵstoreLet, ɵɵstyleMap, ɵɵstyleProp, ɵɵsyntheticHostListener, ɵɵsyntheticHostProperty, ɵɵtemplate, ɵɵtemplateRefExtractor, ɵɵtext, ɵɵtextInterpolate, ɵɵtextInterpolate1, ɵɵtextInterpolate2, ɵɵtextInterpolate3, ɵɵtextInterpolate4, ɵɵtextInterpolate5, ɵɵtextInterpolate6, ɵɵtextInterpolate7, ɵɵtextInterpolate8, ɵɵtextInterpolateV, ɵɵtrustConstantHtml, ɵɵtrustConstantResourceUrl, ɵɵtwoWayBindingSet, ɵɵtwoWayListener, ɵɵtwoWayProperty, ɵɵvalidateIframeAttribute, ɵɵviewQuery, ɵɵviewQuerySignal };
31189
31006
  //# sourceMappingURL=debug_node.mjs.map