@angular/core 21.0.0-next.6 → 21.0.0-next.8

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 (77) hide show
  1. package/fesm2022/_attribute-chunk.mjs +2 -2
  2. package/fesm2022/_attribute-chunk.mjs.map +1 -1
  3. package/fesm2022/_debug_node-chunk.mjs +755 -141
  4. package/fesm2022/_debug_node-chunk.mjs.map +1 -1
  5. package/fesm2022/_effect-chunk.mjs +2 -2
  6. package/fesm2022/_effect-chunk.mjs.map +1 -1
  7. package/fesm2022/_not_found-chunk.mjs +2 -2
  8. package/fesm2022/_not_found-chunk.mjs.map +1 -1
  9. package/fesm2022/_resource-chunk.mjs +2 -2
  10. package/fesm2022/_resource-chunk.mjs.map +1 -1
  11. package/fesm2022/_root_effect_scheduler-chunk.mjs +8 -3
  12. package/fesm2022/_root_effect_scheduler-chunk.mjs.map +1 -1
  13. package/fesm2022/_signal-chunk.mjs +2 -2
  14. package/fesm2022/_signal-chunk.mjs.map +1 -1
  15. package/fesm2022/_weak_ref-chunk.mjs +2 -2
  16. package/fesm2022/_weak_ref-chunk.mjs.map +1 -1
  17. package/fesm2022/core.mjs +9 -13
  18. package/fesm2022/core.mjs.map +1 -1
  19. package/fesm2022/primitives-di.mjs +2 -2
  20. package/fesm2022/primitives-di.mjs.map +1 -1
  21. package/fesm2022/primitives-event-dispatch.mjs +2 -2
  22. package/fesm2022/primitives-event-dispatch.mjs.map +1 -1
  23. package/fesm2022/primitives-signals.mjs +2 -2
  24. package/fesm2022/primitives-signals.mjs.map +1 -1
  25. package/fesm2022/rxjs-interop.mjs +2 -2
  26. package/fesm2022/rxjs-interop.mjs.map +1 -1
  27. package/fesm2022/testing.mjs +2 -2
  28. package/fesm2022/testing.mjs.map +1 -1
  29. package/package.json +2 -2
  30. package/schematics/bundles/add-bootstrap-context-to-server-main.cjs +5 -5
  31. package/schematics/bundles/application-config-core.cjs +5 -5
  32. package/schematics/bundles/{apply_import_manager-pLtndDki.cjs → apply_import_manager-CBLmogDD.cjs} +3 -3
  33. package/schematics/bundles/bootstrap-options-migration.cjs +5 -5
  34. package/schematics/bundles/cleanup-unused-imports.cjs +5 -5
  35. package/schematics/bundles/{compiler_host-BJEh7-L1.cjs → compiler_host-T6xncpiw.cjs} +2 -2
  36. package/schematics/bundles/control-flow-migration.cjs +22 -21
  37. package/schematics/bundles/imports-DwPXlGFl.cjs +1 -1
  38. package/schematics/bundles/{index-DCfgOEYE.cjs → index-BnmACOsq.cjs} +237 -98
  39. package/schematics/bundles/{index-bqpULzLD.cjs → index-DWSaRJdz.cjs} +4 -4
  40. package/schematics/bundles/inject-migration.cjs +3 -3
  41. package/schematics/bundles/leading_space-D9nQ8UQC.cjs +1 -1
  42. package/schematics/bundles/{migrate_ts_type_references-COE6BA7E.cjs → migrate_ts_type_references-Cu-FR4L5.cjs} +47 -5
  43. package/schematics/bundles/{ng_component_template-pDoKlgPP.cjs → ng_component_template-BkWiUuGG.cjs} +2 -2
  44. package/schematics/bundles/ng_decorators-BI0uV7KI.cjs +1 -1
  45. package/schematics/bundles/ngclass-to-class-migration.cjs +7 -7
  46. package/schematics/bundles/ngstyle-to-style-migration.cjs +7 -7
  47. package/schematics/bundles/nodes-B16H9JUd.cjs +1 -1
  48. package/schematics/bundles/output-migration.cjs +6 -6
  49. package/schematics/bundles/{parse_html-B6fblY_V.cjs → parse_html-C97tKKp3.cjs} +2 -2
  50. package/schematics/bundles/{project_paths-i0Wjiiq1.cjs → project_paths-C6g3lqjX.cjs} +3 -3
  51. package/schematics/bundles/{project_tsconfig_paths-sFatqIE5.cjs → project_tsconfig_paths-CdhVNYMk.cjs} +401 -41
  52. package/schematics/bundles/property_name-BBwFuqMe.cjs +1 -1
  53. package/schematics/bundles/route-lazy-loading.cjs +3 -3
  54. package/schematics/bundles/router-current-navigation.cjs +4 -4
  55. package/schematics/bundles/router-last-successful-navigation.cjs +4 -4
  56. package/schematics/bundles/router-testing-module-migration.cjs +513 -0
  57. package/schematics/bundles/self-closing-tags-migration.cjs +6 -6
  58. package/schematics/bundles/signal-input-migration.cjs +7 -7
  59. package/schematics/bundles/signal-queries-migration.cjs +7 -7
  60. package/schematics/bundles/signals.cjs +7 -7
  61. package/schematics/bundles/standalone-migration.cjs +50 -10
  62. package/schematics/bundles/symbol-BObKoqes.cjs +1 -1
  63. package/schematics/collection.json +5 -0
  64. package/schematics/migrations/router-testing-module-migration/schema.json +14 -0
  65. package/types/_api-chunk.d.ts +2 -2
  66. package/types/_chrome_dev_tools_performance-chunk.d.ts +4 -2
  67. package/types/_discovery-chunk.d.ts +61 -12
  68. package/types/_effect-chunk.d.ts +2 -2
  69. package/types/_event_dispatcher-chunk.d.ts +2 -2
  70. package/types/_formatter-chunk.d.ts +2 -2
  71. package/types/_weak_ref-chunk.d.ts +2 -2
  72. package/types/core.d.ts +135 -11
  73. package/types/primitives-di.d.ts +2 -2
  74. package/types/primitives-event-dispatch.d.ts +2 -2
  75. package/types/primitives-signals.d.ts +2 -2
  76. package/types/rxjs-interop.d.ts +2 -2
  77. package/types/testing.d.ts +2 -2
@@ -1,10 +1,10 @@
1
1
  /**
2
- * @license Angular v21.0.0-next.6
3
- * (c) 2010-2025 Google LLC. https://angular.io/
2
+ * @license Angular v21.0.0-next.8
3
+ * (c) 2010-2025 Google LLC. https://angular.dev/
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, 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-chunk.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, formatRuntimeError, isInSkipHydrationBlock as isInSkipHydrationBlock$1, HYDRATION, isContentQueryHost, setCurrentQueryIndex, XSS_SECURITY_URL, renderStringify, ENVIRONMENT, makeEnvironmentProviders, isDirectiveHost, 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, ANIMATIONS, 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-chunk.mjs';
8
8
  import { setActiveConsumer, SIGNAL, consumerDestroy, REACTIVE_NODE, consumerPollProducersForChange, consumerBeforeComputation, getActiveConsumer, consumerAfterComputation, createComputed, setThrowInvalidWriteToSignalError } from './_signal-chunk.mjs';
9
9
  import { Subject, Subscription } from 'rxjs';
10
10
  import { setActiveConsumer as setActiveConsumer$1 } from '@angular/core/primitives/signals';
@@ -3880,9 +3880,7 @@ const interactionEventNames = ['click', 'keydown'];
3880
3880
  /** Names of the events considered as hover events. */
3881
3881
  const hoverEventNames = ['mouseenter', 'mouseover', 'focusin'];
3882
3882
  /** `IntersectionObserver` used to observe `viewport` triggers. */
3883
- let intersectionObserver = null;
3884
- /** Number of elements currently observed with `viewport` triggers. */
3885
- let observedViewportElements = 0;
3883
+ const intersectionObservers = new Map();
3886
3884
  /** Object keeping track of registered callbacks for a deferred block trigger. */
3887
3885
  class DeferEventEntry {
3888
3886
  callbacks = new Set();
@@ -3965,14 +3963,15 @@ function onHover(trigger, callback) {
3965
3963
  * Used to create an IntersectionObserver instance.
3966
3964
  * @return IntersectionObserver that is used by onViewport
3967
3965
  */
3968
- function createIntersectionObserver() {
3966
+ function createIntersectionObserver(options) {
3967
+ const key = getIntersectionObserverKey(options);
3969
3968
  return new IntersectionObserver((entries) => {
3970
3969
  for (const current of entries) {
3971
3970
  if (current.isIntersecting && viewportTriggers.has(current.target)) {
3972
- viewportTriggers.get(current.target).listener();
3971
+ viewportTriggers.get(current.target)?.get(key)?.listener();
3973
3972
  }
3974
3973
  }
3975
- });
3974
+ }, options);
3976
3975
  }
3977
3976
  /**
3978
3977
  * Registers a viewport trigger.
@@ -3983,32 +3982,57 @@ function createIntersectionObserver() {
3983
3982
  * and tells the intersection observer to stop observing trigger Element and set
3984
3983
  * intersectionObserver to null if there are no more Elements to observe
3985
3984
  */
3986
- function onViewport(trigger, callback, observerFactoryFn) {
3987
- let entry = viewportTriggers.get(trigger);
3988
- intersectionObserver = intersectionObserver || observerFactoryFn();
3985
+ function onViewport(trigger, callback, observerFactoryFn, options) {
3986
+ const key = getIntersectionObserverKey(options);
3987
+ let entry = viewportTriggers.get(trigger)?.get(key);
3988
+ if (!intersectionObservers.has(key)) {
3989
+ intersectionObservers.set(key, { observer: observerFactoryFn(options), count: 0 });
3990
+ }
3991
+ const config = intersectionObservers.get(key);
3989
3992
  if (!entry) {
3990
3993
  entry = new DeferEventEntry();
3991
- intersectionObserver.observe(trigger);
3992
- viewportTriggers.set(trigger, entry);
3993
- observedViewportElements++;
3994
+ config.observer.observe(trigger);
3995
+ let triggerConfig = viewportTriggers.get(trigger);
3996
+ if (triggerConfig) {
3997
+ triggerConfig.set(key, entry);
3998
+ }
3999
+ else {
4000
+ triggerConfig = new Map();
4001
+ viewportTriggers.set(trigger, triggerConfig);
4002
+ }
4003
+ triggerConfig.set(key, entry);
4004
+ config.count++;
3994
4005
  }
3995
4006
  entry.callbacks.add(callback);
3996
4007
  return () => {
3997
- if (!viewportTriggers.has(trigger)) {
4008
+ if (!viewportTriggers.get(trigger)?.has(key)) {
3998
4009
  return;
3999
4010
  }
4000
4011
  entry.callbacks.delete(callback);
4001
4012
  if (entry.callbacks.size === 0) {
4002
- intersectionObserver?.unobserve(trigger);
4003
- viewportTriggers.delete(trigger);
4004
- observedViewportElements--;
4013
+ config.observer.unobserve(trigger);
4014
+ config.count--;
4015
+ const triggerConfig = viewportTriggers.get(trigger);
4016
+ if (triggerConfig) {
4017
+ triggerConfig.delete(key);
4018
+ if (triggerConfig.size === 0) {
4019
+ viewportTriggers.delete(trigger);
4020
+ }
4021
+ }
4005
4022
  }
4006
- if (observedViewportElements === 0) {
4007
- intersectionObserver?.disconnect();
4008
- intersectionObserver = null;
4023
+ if (config.count === 0) {
4024
+ config.observer.disconnect();
4025
+ intersectionObservers.delete(key);
4009
4026
  }
4010
4027
  };
4011
4028
  }
4029
+ /** Generates a string that can be used to find identical intersection observer option objects. */
4030
+ function getIntersectionObserverKey(options) {
4031
+ if (!options) {
4032
+ return '';
4033
+ }
4034
+ return `${options.rootMargin}/${typeof options.threshold === 'number' ? options.threshold : options.threshold?.join('\n')}`;
4035
+ }
4012
4036
 
4013
4037
  const DEFER_BLOCK_SSR_ID_ATTRIBUTE = 'ngb';
4014
4038
  function setJSActionAttributes(nativeElement, eventTypes, parentDeferBlockId = null) {
@@ -4498,13 +4522,18 @@ function isIncrementalHydrationEnabled(injector) {
4498
4522
  optional: true,
4499
4523
  });
4500
4524
  }
4525
+ let incrementalHydrationEnabledWarned = false;
4526
+ function resetIncrementalHydrationEnabledWarnedForTests() {
4527
+ incrementalHydrationEnabledWarned = false;
4528
+ }
4501
4529
  /** Throws an error if the incremental hydration is not enabled */
4502
- function assertIncrementalHydrationIsConfigured(injector) {
4503
- if (!isIncrementalHydrationEnabled(injector)) {
4504
- throw new RuntimeError(508 /* RuntimeErrorCode.MISCONFIGURED_INCREMENTAL_HYDRATION */, 'Angular has detected that some `@defer` blocks use `hydrate` triggers, ' +
4530
+ function warnIncrementalHydrationNotConfigured() {
4531
+ if (!incrementalHydrationEnabledWarned) {
4532
+ incrementalHydrationEnabledWarned = true;
4533
+ console.warn(formatRuntimeError(508 /* RuntimeErrorCode.MISCONFIGURED_INCREMENTAL_HYDRATION */, 'Angular has detected that some `@defer` blocks use `hydrate` triggers, ' +
4505
4534
  'but incremental hydration was not enabled. Please ensure that the `withIncrementalHydration()` ' +
4506
4535
  'call is added as an argument for the `provideClientHydration()` function call ' +
4507
- 'in your application config.');
4536
+ 'in your application config.'));
4508
4537
  }
4509
4538
  }
4510
4539
  /** Throws an error if the ssrUniqueId on the LDeferBlockDetails is not present */
@@ -4727,6 +4756,20 @@ function getHydrateTimerTrigger(blockData) {
4727
4756
  const trigger = blockData[DEFER_HYDRATE_TRIGGERS]?.find((t) => isTimerTrigger(t));
4728
4757
  return trigger?.delay ?? null;
4729
4758
  }
4759
+ function getHydrateViewportTrigger(blockData) {
4760
+ const details = blockData[DEFER_HYDRATE_TRIGGERS];
4761
+ if (details) {
4762
+ for (const current of details) {
4763
+ if (current === 2 /* DeferBlockTrigger.Viewport */) {
4764
+ return true;
4765
+ }
4766
+ else if (typeof current === 'object' && current.trigger === 2 /* DeferBlockTrigger.Viewport */) {
4767
+ return current.intersectionObserverOptions || true;
4768
+ }
4769
+ }
4770
+ }
4771
+ return null;
4772
+ }
4730
4773
  function hasHydrateTrigger(blockData, trigger) {
4731
4774
  return blockData[DEFER_HYDRATE_TRIGGERS]?.includes(trigger) ?? false;
4732
4775
  }
@@ -4741,7 +4784,7 @@ function createBlockSummary(blockInfo) {
4741
4784
  idle: hasHydrateTrigger(blockInfo, 0 /* DeferBlockTrigger.Idle */),
4742
4785
  immediate: hasHydrateTrigger(blockInfo, 1 /* DeferBlockTrigger.Immediate */),
4743
4786
  timer: getHydrateTimerTrigger(blockInfo),
4744
- viewport: hasHydrateTrigger(blockInfo, 2 /* DeferBlockTrigger.Viewport */),
4787
+ viewport: getHydrateViewportTrigger(blockInfo),
4745
4788
  },
4746
4789
  };
4747
4790
  }
@@ -7225,6 +7268,8 @@ function ensureIcuContainerVisitorLoaded(loader) {
7225
7268
 
7226
7269
  /** Parses a CSS time value to milliseconds. */
7227
7270
  function parseCssTimeUnitsToMs(value) {
7271
+ if (!value)
7272
+ return 0;
7228
7273
  // Some browsers will return it in seconds, whereas others will return milliseconds.
7229
7274
  const multiplier = value.toLowerCase().indexOf('ms') > -1 ? 1 : 1000;
7230
7275
  return parseFloat(value) * multiplier;
@@ -7335,11 +7380,54 @@ function determineLongestAnimationFromElementAnimations(el, animationsMap, anima
7335
7380
  }
7336
7381
  const allLeavingAnimations = new Set();
7337
7382
 
7383
+ /**
7384
+ * A [DI token](api/core/InjectionToken) that enables or disables all enter and leave animations.
7385
+ */
7386
+ const ANIMATIONS_DISABLED = new InjectionToken(typeof ngDevMode !== 'undefined' && ngDevMode ? 'AnimationsDisabled' : '', {
7387
+ providedIn: 'root',
7388
+ factory: () => false,
7389
+ });
7390
+ /**
7391
+ * A [DI token](api/core/InjectionToken) for the queue of all animations.
7392
+ */
7393
+ const ANIMATION_QUEUE = new InjectionToken(typeof ngDevMode !== 'undefined' && ngDevMode ? 'AnimationQueue' : '', {
7394
+ providedIn: 'root',
7395
+ factory: () => {
7396
+ return {
7397
+ queue: new Set(),
7398
+ isScheduled: false,
7399
+ };
7400
+ },
7401
+ });
7402
+ /**
7403
+ * A [DI token](api/core/InjectionToken) that configures the maximum animation timeout
7404
+ * before element removal. The default value mirrors from Chrome's cross document
7405
+ * navigation view transition timeout. It's intended to prevent people from accidentally
7406
+ * forgetting to call the removal function in their callback. Also serves as a delay
7407
+ * for when stylesheets are pruned.
7408
+ *
7409
+ * @publicApi 20.2
7410
+ */
7411
+ const MAX_ANIMATION_TIMEOUT = new InjectionToken(typeof ngDevMode !== 'undefined' && ngDevMode ? 'MaxAnimationTimeout' : '', {
7412
+ providedIn: 'root',
7413
+ factory: () => MAX_ANIMATION_TIMEOUT_DEFAULT,
7414
+ });
7415
+ const MAX_ANIMATION_TIMEOUT_DEFAULT = 4000;
7416
+
7417
+ function maybeQueueEnterAnimation(parentLView, parent, tNode, injector) {
7418
+ const enterAnimations = parentLView?.[ANIMATIONS]?.enter;
7419
+ if (parent !== null && enterAnimations && enterAnimations.has(tNode.index)) {
7420
+ const animationQueue = injector.get(ANIMATION_QUEUE);
7421
+ for (const animateFn of enterAnimations.get(tNode.index).animateFns) {
7422
+ animationQueue.queue.add(animateFn);
7423
+ }
7424
+ }
7425
+ }
7338
7426
  /**
7339
7427
  * NOTE: for performance reasons, the possible actions are inlined within the function instead of
7340
7428
  * being passed as an argument.
7341
7429
  */
7342
- function applyToElementOrContainer(action, renderer, parent, lNodeToHandle, beforeNode, parentLView) {
7430
+ function applyToElementOrContainer(action, renderer, injector, parent, lNodeToHandle, tNode, beforeNode, parentLView) {
7343
7431
  // If this slot was allocated for a text node dynamically created by i18n, the text node itself
7344
7432
  // won't be created until i18nApply() in the update block, so this node should be skipped.
7345
7433
  // For more info, see "ICU expressions should work inside an ngTemplateOutlet inside an ngFor"
@@ -7360,6 +7448,7 @@ function applyToElementOrContainer(action, renderer, parent, lNodeToHandle, befo
7360
7448
  }
7361
7449
  const rNode = unwrapRNode(lNodeToHandle);
7362
7450
  if (action === 0 /* WalkTNodeTreeAction.Create */ && parent !== null) {
7451
+ maybeQueueEnterAnimation(parentLView, parent, tNode, injector);
7363
7452
  if (beforeNode == null) {
7364
7453
  nativeAppendChild(renderer, parent, rNode);
7365
7454
  }
@@ -7368,10 +7457,11 @@ function applyToElementOrContainer(action, renderer, parent, lNodeToHandle, befo
7368
7457
  }
7369
7458
  }
7370
7459
  else if (action === 1 /* WalkTNodeTreeAction.Insert */ && parent !== null) {
7460
+ maybeQueueEnterAnimation(parentLView, parent, tNode, injector);
7371
7461
  nativeInsertBefore(renderer, parent, rNode, beforeNode || null, true);
7372
7462
  }
7373
7463
  else if (action === 2 /* WalkTNodeTreeAction.Detach */) {
7374
- runLeaveAnimationsWithCallback(parentLView, (nodeHasLeaveAnimations) => {
7464
+ runLeaveAnimationsWithCallback(parentLView, tNode, injector, (nodeHasLeaveAnimations) => {
7375
7465
  // the nodeHasLeaveAnimations indicates to the renderer that the element needs to
7376
7466
  // be removed synchronously and sets the requireSynchronousElementRemoval flag in
7377
7467
  // the renderer.
@@ -7379,15 +7469,26 @@ function applyToElementOrContainer(action, renderer, parent, lNodeToHandle, befo
7379
7469
  });
7380
7470
  }
7381
7471
  else if (action === 3 /* WalkTNodeTreeAction.Destroy */) {
7382
- runLeaveAnimationsWithCallback(parentLView, () => {
7472
+ runLeaveAnimationsWithCallback(parentLView, tNode, injector, () => {
7383
7473
  renderer.destroyNode(rNode);
7384
7474
  });
7385
7475
  }
7386
7476
  if (lContainer != null) {
7387
- applyContainer(renderer, action, lContainer, parent, beforeNode);
7477
+ applyContainer(renderer, action, injector, lContainer, tNode, parent, beforeNode);
7388
7478
  }
7389
7479
  }
7390
7480
  }
7481
+ function addToAnimationQueue(injector, animationFns) {
7482
+ const animationQueue = injector.get(ANIMATION_QUEUE);
7483
+ if (Array.isArray(animationFns)) {
7484
+ for (const animateFn of animationFns) {
7485
+ animationQueue.queue.add(animateFn);
7486
+ }
7487
+ }
7488
+ else {
7489
+ animationQueue.queue.add(animationFns);
7490
+ }
7491
+ }
7391
7492
  /**
7392
7493
  * Removes all DOM elements associated with a view.
7393
7494
  *
@@ -7561,30 +7662,48 @@ function cleanUpView(tView, lView) {
7561
7662
  setActiveConsumer(prevConsumer);
7562
7663
  }
7563
7664
  }
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;
7665
+ function runLeaveAnimationsWithCallback(lView, tNode, injector, callback) {
7666
+ const animations = lView?.[ANIMATIONS];
7667
+ if (animations == null || animations.leave == undefined || !animations.leave.has(tNode.index))
7668
+ return callback(false);
7669
+ // this is solely for move operations to prevent leave animations from running
7670
+ // on the moved nodes, which would have deleted the node.
7671
+ if (animations.skipLeaveAnimations) {
7672
+ animations.skipLeaveAnimations = false;
7673
+ return callback(false);
7674
+ }
7675
+ if (lView)
7676
+ allLeavingAnimations.add(lView);
7677
+ addToAnimationQueue(injector, () => {
7678
+ // it's possible that in the time between when the leave animation was
7679
+ // and the time it was executed, the data structure changed. So we need
7680
+ // to be safe here.
7681
+ if (animations.leave && animations.leave.has(tNode.index)) {
7682
+ const leaveAnimationMap = animations.leave;
7683
+ const leaveAnimations = leaveAnimationMap.get(tNode.index);
7571
7684
  const runningAnimations = [];
7572
- for (let index = 0; index < leaveAnimations.length; index++) {
7573
- const animateFn = leaveAnimations[index];
7574
- runningAnimations.push(animateFn());
7685
+ if (leaveAnimations) {
7686
+ for (let index = 0; index < leaveAnimations.animateFns.length; index++) {
7687
+ const animationFn = leaveAnimations.animateFns[index];
7688
+ const { promise } = animationFn();
7689
+ runningAnimations.push(promise);
7690
+ }
7575
7691
  }
7576
- lView[ANIMATIONS].running = Promise.allSettled(runningAnimations);
7577
- lView[ANIMATIONS].leave = undefined;
7692
+ animations.running = Promise.allSettled(runningAnimations);
7693
+ runAfterLeaveAnimations(lView, callback);
7578
7694
  }
7579
- }
7580
- runAfterLeaveAnimations(lView, callback);
7695
+ else {
7696
+ if (lView)
7697
+ allLeavingAnimations.delete(lView);
7698
+ callback(false);
7699
+ }
7700
+ });
7581
7701
  }
7582
7702
  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
- }
7703
+ const runningAnimations = lView[ANIMATIONS]?.running;
7704
+ if (runningAnimations) {
7705
+ runningAnimations.then(() => {
7706
+ lView[ANIMATIONS].running = undefined;
7588
7707
  allLeavingAnimations.delete(lView);
7589
7708
  callback(true);
7590
7709
  });
@@ -7911,6 +8030,7 @@ function getBeforeNodeForView(viewIndexInContainer, lContainer) {
7911
8030
  function applyNodes(renderer, action, tNode, lView, parentRElement, beforeNode, isProjection) {
7912
8031
  while (tNode != null) {
7913
8032
  ngDevMode && assertTNodeForLView(tNode, lView);
8033
+ const injector = lView[INJECTOR];
7914
8034
  // Let declarations don't have corresponding DOM nodes so we skip over them.
7915
8035
  if (tNode.type === 128 /* TNodeType.LetDeclaration */) {
7916
8036
  tNode = tNode.next;
@@ -7929,22 +8049,22 @@ function applyNodes(renderer, action, tNode, lView, parentRElement, beforeNode,
7929
8049
  if (!isDetachedByI18n(tNode)) {
7930
8050
  if (tNodeType & 8 /* TNodeType.ElementContainer */) {
7931
8051
  applyNodes(renderer, action, tNode.child, lView, parentRElement, beforeNode, false);
7932
- applyToElementOrContainer(action, renderer, parentRElement, rawSlotValue, beforeNode, lView);
8052
+ applyToElementOrContainer(action, renderer, injector, parentRElement, rawSlotValue, tNode, beforeNode, lView);
7933
8053
  }
7934
8054
  else if (tNodeType & 32 /* TNodeType.Icu */) {
7935
8055
  const nextRNode = icuContainerIterate(tNode, lView);
7936
8056
  let rNode;
7937
8057
  while ((rNode = nextRNode())) {
7938
- applyToElementOrContainer(action, renderer, parentRElement, rNode, beforeNode, lView);
8058
+ applyToElementOrContainer(action, renderer, injector, parentRElement, rNode, tNode, beforeNode, lView);
7939
8059
  }
7940
- applyToElementOrContainer(action, renderer, parentRElement, rawSlotValue, beforeNode, lView);
8060
+ applyToElementOrContainer(action, renderer, injector, parentRElement, rawSlotValue, tNode, beforeNode, lView);
7941
8061
  }
7942
8062
  else if (tNodeType & 16 /* TNodeType.Projection */) {
7943
8063
  applyProjectionRecursive(renderer, action, lView, tNode, parentRElement, beforeNode);
7944
8064
  }
7945
8065
  else {
7946
8066
  ngDevMode && assertTNodeType(tNode, 3 /* TNodeType.AnyRNode */ | 4 /* TNodeType.Container */);
7947
- applyToElementOrContainer(action, renderer, parentRElement, rawSlotValue, beforeNode, lView);
8067
+ applyToElementOrContainer(action, renderer, injector, parentRElement, rawSlotValue, tNode, beforeNode, lView);
7948
8068
  }
7949
8069
  }
7950
8070
  tNode = isProjection ? tNode.projectionNext : tNode.next;
@@ -7998,7 +8118,7 @@ function applyProjectionRecursive(renderer, action, lView, tProjectionNode, pare
7998
8118
  // This should be refactored and cleaned up.
7999
8119
  for (let i = 0; i < nodeToProjectOrRNodes.length; i++) {
8000
8120
  const rNode = nodeToProjectOrRNodes[i];
8001
- applyToElementOrContainer(action, renderer, parentRElement, rNode, beforeNode, lView);
8121
+ applyToElementOrContainer(action, renderer, lView[INJECTOR], parentRElement, rNode, tProjectionNode, beforeNode, lView);
8002
8122
  }
8003
8123
  }
8004
8124
  else {
@@ -8025,7 +8145,7 @@ function applyProjectionRecursive(renderer, action, lView, tProjectionNode, pare
8025
8145
  * @param parentRElement parent DOM element for insertion/removal.
8026
8146
  * @param beforeNode Before which node the insertions should happen.
8027
8147
  */
8028
- function applyContainer(renderer, action, lContainer, parentRElement, beforeNode) {
8148
+ function applyContainer(renderer, action, injector, lContainer, tNode, parentRElement, beforeNode) {
8029
8149
  ngDevMode && assertLContainer(lContainer);
8030
8150
  const anchor = lContainer[NATIVE]; // LContainer has its own before node.
8031
8151
  const native = unwrapRNode(lContainer);
@@ -8040,7 +8160,7 @@ function applyContainer(renderer, action, lContainer, parentRElement, beforeNode
8040
8160
  // don't see a reason why they should be different, but they are.
8041
8161
  //
8042
8162
  // If they are we need to process the second anchor as well.
8043
- applyToElementOrContainer(action, renderer, parentRElement, anchor, beforeNode);
8163
+ applyToElementOrContainer(action, renderer, injector, parentRElement, anchor, tNode, beforeNode);
8044
8164
  }
8045
8165
  for (let i = CONTAINER_HEADER_OFFSET; i < lContainer.length; i++) {
8046
8166
  const lView = lContainer[i];
@@ -9140,7 +9260,6 @@ function refreshView(tView, lView, templateFn, context) {
9140
9260
  if (templateFn !== null) {
9141
9261
  executeTemplate(tView, lView, templateFn, 2 /* RenderFlags.Update */, context);
9142
9262
  }
9143
- runEnterAnimations(lView);
9144
9263
  const hooksInitPhaseCompleted = (flags & 3 /* LViewFlags.InitPhaseStateMask */) === 3 /* InitPhaseState.InitPhaseCompleted */;
9145
9264
  // execute pre-order hooks (OnInit, OnChanges, DoCheck)
9146
9265
  // PERF WARNING: do NOT extract this to a separate function without running benchmarks
@@ -9268,15 +9387,6 @@ function refreshView(tView, lView, templateFn, context) {
9268
9387
  leaveView();
9269
9388
  }
9270
9389
  }
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
- }
9280
9390
  /**
9281
9391
  * Goes over embedded views (ones created through ViewContainerRef APIs) and refreshes
9282
9392
  * them by executing an associated template function.
@@ -13706,7 +13816,7 @@ class ComponentFactory extends ComponentFactory$1 {
13706
13816
  }
13707
13817
  function createRootTView(rootSelectorOrNode, componentDef, componentBindings, directives) {
13708
13818
  const tAttributes = rootSelectorOrNode
13709
- ? ['ng-version', '21.0.0-next.6']
13819
+ ? ['ng-version', '21.0.0-next.8']
13710
13820
  : // Extract attributes and classes from the first selector only to match VE behavior.
13711
13821
  extractAttrsAndClassesFromSelector(componentDef.selectors[0]);
13712
13822
  let creationBindings = null;
@@ -16766,9 +16876,9 @@ function trackTriggerForDebugging(tView, tNode, textRepresentation) {
16766
16876
  * @param callback Callback to be invoked when the trigger comes into the viewport.
16767
16877
  * @param injector Injector that can be used by the trigger to resolve DI tokens.
16768
16878
  */
16769
- function onViewportWrapper(trigger, callback, injector) {
16879
+ function onViewportWrapper(trigger, callback, injector, wrapperOptions) {
16770
16880
  const ngZone = injector.get(NgZone);
16771
- return onViewport(trigger, () => ngZone.run(callback), () => ngZone.runOutsideAngular(() => createIntersectionObserver()));
16881
+ return onViewport(trigger, () => ngZone.run(callback), (options) => ngZone.runOutsideAngular(() => createIntersectionObserver(options)), wrapperOptions);
16772
16882
  }
16773
16883
  /**
16774
16884
  * Helper function to get the LView in which a deferred block's trigger is rendered.
@@ -16821,7 +16931,7 @@ function getTriggerElement(triggerLView, triggerIndex) {
16821
16931
  * the deferred block.
16822
16932
  * @param type Trigger type to distinguish between regular and prefetch triggers.
16823
16933
  */
16824
- function registerDomTrigger(initialLView, tNode, triggerIndex, walkUpTimes, registerFn, callback, type) {
16934
+ function registerDomTrigger(initialLView, tNode, triggerIndex, walkUpTimes, registerFn, callback, type, options) {
16825
16935
  const injector = initialLView[INJECTOR];
16826
16936
  const zone = injector.get(NgZone);
16827
16937
  let poll;
@@ -16860,7 +16970,7 @@ function registerDomTrigger(initialLView, tNode, triggerIndex, walkUpTimes, regi
16860
16970
  }
16861
16971
  callback();
16862
16972
  });
16863
- }, injector);
16973
+ }, injector, options);
16864
16974
  // The trigger and deferred block might be in different LViews.
16865
16975
  // For the main LView the cleanup would happen as a part of
16866
16976
  // `storeTriggerCleanupFn` logic. For trigger LView we register
@@ -20587,6 +20697,9 @@ function processAndInitTriggers(injector, blockData, nodes) {
20587
20697
  timerElements.push(elementTrigger);
20588
20698
  }
20589
20699
  if (blockSummary.hydrate.viewport) {
20700
+ if (typeof blockSummary.hydrate.viewport !== 'boolean') {
20701
+ elementTrigger.intersectionObserverOptions = blockSummary.hydrate.viewport;
20702
+ }
20590
20703
  viewportElements.push(elementTrigger);
20591
20704
  }
20592
20705
  }
@@ -20609,7 +20722,7 @@ function setViewportTriggers(injector, elementTriggers) {
20609
20722
  if (elementTriggers.length > 0) {
20610
20723
  const registry = injector.get(DEHYDRATED_BLOCK_REGISTRY);
20611
20724
  for (let elementTrigger of elementTriggers) {
20612
- const cleanupFn = onViewportWrapper(elementTrigger.el, () => triggerHydrationFromBlockName(injector, elementTrigger.blockName), injector);
20725
+ const cleanupFn = onViewportWrapper(elementTrigger.el, () => triggerHydrationFromBlockName(injector, elementTrigger.blockName), injector, elementTrigger.intersectionObserverOptions);
20613
20726
  registry.addCleanupFn(elementTrigger.blockName, cleanupFn);
20614
20727
  }
20615
20728
  }
@@ -20677,14 +20790,15 @@ function ɵɵdefer(index, primaryTmplIndex, dependencyResolverFn, loadingTmplInd
20677
20790
  const adjustedIndex = index + HEADER_OFFSET;
20678
20791
  const tNode = declareNoDirectiveHostTemplate(lView, tView, index, null, 0, 0);
20679
20792
  const injector = lView[INJECTOR];
20793
+ const incrementalHydrationEnabled = isIncrementalHydrationEnabled(injector);
20680
20794
  if (tView.firstCreatePass) {
20681
20795
  performanceMarkFeature('NgDefer');
20682
20796
  if (ngDevMode) {
20683
20797
  if (typeof ngHmrMode !== 'undefined' && ngHmrMode) {
20684
20798
  logHmrWarning(injector);
20685
20799
  }
20686
- if (hasHydrateTriggers(flags)) {
20687
- assertIncrementalHydrationIsConfigured(injector);
20800
+ if (hasHydrateTriggers(flags) && !incrementalHydrationEnabled) {
20801
+ warnIncrementalHydrationNotConfigured();
20688
20802
  }
20689
20803
  }
20690
20804
  const tDetails = {
@@ -20732,7 +20846,7 @@ function ɵɵdefer(index, primaryTmplIndex, dependencyResolverFn, loadingTmplInd
20732
20846
  ];
20733
20847
  setLDeferBlockDetails(lView, adjustedIndex, lDetails);
20734
20848
  let registry = null;
20735
- if (ssrUniqueId !== null) {
20849
+ if (ssrUniqueId !== null && incrementalHydrationEnabled) {
20736
20850
  // Store this defer block in the registry, to have an access to
20737
20851
  // internal data structures from hydration runtime code.
20738
20852
  registry = injector.get(DEHYDRATED_BLOCK_REGISTRY);
@@ -21032,7 +21146,7 @@ function ɵɵdeferHydrateOnTimer(delay) {
21032
21146
  if (!shouldAttachTrigger(2 /* TriggerType.Hydrate */, lView, tNode))
21033
21147
  return;
21034
21148
  const hydrateTriggers = getHydrateTriggers(getTView(), tNode);
21035
- hydrateTriggers.set(5 /* DeferBlockTrigger.Timer */, { delay });
21149
+ hydrateTriggers.set(5 /* DeferBlockTrigger.Timer */, { type: 5 /* DeferBlockTrigger.Timer */, delay });
21036
21150
  if (typeof ngServerMode !== 'undefined' && ngServerMode) {
21037
21151
  // We are on the server and SSR for defer blocks is enabled.
21038
21152
  triggerDeferBlock(2 /* TriggerType.Hydrate */, lView, tNode);
@@ -21169,18 +21283,25 @@ function ɵɵdeferHydrateOnInteraction() {
21169
21283
  * @param walkUpTimes Number of times to walk up/down the tree hierarchy to find the trigger.
21170
21284
  * @codeGenApi
21171
21285
  */
21172
- function ɵɵdeferOnViewport(triggerIndex, walkUpTimes) {
21286
+ function ɵɵdeferOnViewport(triggerIndex, walkUpTimes, options) {
21173
21287
  const lView = getLView();
21174
21288
  const tNode = getCurrentTNode();
21175
21289
  if (ngDevMode) {
21176
- trackTriggerForDebugging(lView[TVIEW], tNode, `on viewport${walkUpTimes === -1 ? '' : '(<target>)'}`);
21290
+ const args = [];
21291
+ if (walkUpTimes !== undefined && walkUpTimes !== -1) {
21292
+ args.push('<target>');
21293
+ }
21294
+ if (options) {
21295
+ args.push(JSON.stringify(options));
21296
+ }
21297
+ trackTriggerForDebugging(lView[TVIEW], tNode, `on viewport${args.length === 0 ? '' : `(${args.join(', ')})`}`);
21177
21298
  }
21178
21299
  if (!shouldAttachTrigger(0 /* TriggerType.Regular */, lView, tNode))
21179
21300
  return;
21180
21301
  renderPlaceholder(lView, tNode);
21181
21302
  // Avoid adding event listeners when this instruction is invoked on the server.
21182
21303
  if (!(typeof ngServerMode !== 'undefined' && ngServerMode)) {
21183
- registerDomTrigger(lView, tNode, triggerIndex, walkUpTimes, onViewportWrapper, () => triggerDeferBlock(0 /* TriggerType.Regular */, lView, tNode), 0 /* TriggerType.Regular */);
21304
+ registerDomTrigger(lView, tNode, triggerIndex, walkUpTimes, onViewportWrapper, () => triggerDeferBlock(0 /* TriggerType.Regular */, lView, tNode), 0 /* TriggerType.Regular */, options);
21184
21305
  }
21185
21306
  }
21186
21307
  /**
@@ -21189,34 +21310,46 @@ function ɵɵdeferOnViewport(triggerIndex, walkUpTimes) {
21189
21310
  * @param walkUpTimes Number of times to walk up/down the tree hierarchy to find the trigger.
21190
21311
  * @codeGenApi
21191
21312
  */
21192
- function ɵɵdeferPrefetchOnViewport(triggerIndex, walkUpTimes) {
21313
+ function ɵɵdeferPrefetchOnViewport(triggerIndex, walkUpTimes, options) {
21193
21314
  const lView = getLView();
21194
21315
  const tNode = getCurrentTNode();
21195
21316
  if (ngDevMode) {
21196
- trackTriggerForDebugging(lView[TVIEW], tNode, `prefetch on viewport${walkUpTimes === -1 ? '' : '(<target>)'}`);
21317
+ const args = [];
21318
+ if (walkUpTimes !== undefined && walkUpTimes !== -1) {
21319
+ args.push('<target>');
21320
+ }
21321
+ if (options) {
21322
+ args.push(JSON.stringify(options));
21323
+ }
21324
+ trackTriggerForDebugging(lView[TVIEW], tNode, `prefetch on viewport${args.length === 0 ? '' : `(${args.join(', ')})`}`);
21197
21325
  }
21198
21326
  if (!shouldAttachTrigger(1 /* TriggerType.Prefetch */, lView, tNode))
21199
21327
  return;
21200
21328
  const tView = lView[TVIEW];
21201
21329
  const tDetails = getTDeferBlockDetails(tView, tNode);
21202
21330
  if (tDetails.loadingState === DeferDependenciesLoadingState.NOT_STARTED) {
21203
- registerDomTrigger(lView, tNode, triggerIndex, walkUpTimes, onViewportWrapper, () => triggerPrefetching(tDetails, lView, tNode), 1 /* TriggerType.Prefetch */);
21331
+ registerDomTrigger(lView, tNode, triggerIndex, walkUpTimes, onViewportWrapper, () => triggerPrefetching(tDetails, lView, tNode), 1 /* TriggerType.Prefetch */, options);
21204
21332
  }
21205
21333
  }
21206
21334
  /**
21207
21335
  * Creates runtime data structures for the `on viewport` hydrate trigger.
21208
21336
  * @codeGenApi
21209
21337
  */
21210
- function ɵɵdeferHydrateOnViewport() {
21338
+ function ɵɵdeferHydrateOnViewport(options) {
21211
21339
  const lView = getLView();
21212
21340
  const tNode = getCurrentTNode();
21213
21341
  if (ngDevMode) {
21214
- trackTriggerForDebugging(lView[TVIEW], tNode, 'hydrate on viewport');
21342
+ trackTriggerForDebugging(lView[TVIEW], tNode, `hydrate on viewport${options ? `(${JSON.stringify(options)})` : ''}`);
21215
21343
  }
21216
21344
  if (!shouldAttachTrigger(2 /* TriggerType.Hydrate */, lView, tNode))
21217
21345
  return;
21218
21346
  const hydrateTriggers = getHydrateTriggers(getTView(), tNode);
21219
- hydrateTriggers.set(2 /* DeferBlockTrigger.Viewport */, null);
21347
+ hydrateTriggers.set(2 /* DeferBlockTrigger.Viewport */, options
21348
+ ? {
21349
+ type: 2 /* DeferBlockTrigger.Viewport */,
21350
+ intersectionObserverOptions: options,
21351
+ }
21352
+ : null);
21220
21353
  if (typeof ngServerMode !== 'undefined' && ngServerMode) {
21221
21354
  // We are on the server and SSR for defer blocks is enabled.
21222
21355
  triggerDeferBlock(2 /* TriggerType.Hydrate */, lView, tNode);
@@ -21283,28 +21416,6 @@ function ɵɵattribute(name, value, sanitizer, namespace) {
21283
21416
  return ɵɵattribute;
21284
21417
  }
21285
21418
 
21286
- /**
21287
- * A [DI token](api/core/InjectionToken) that enables or disables all enter and leave animations.
21288
- */
21289
- const ANIMATIONS_DISABLED = new InjectionToken(typeof ngDevMode !== 'undefined' && ngDevMode ? 'AnimationsDisabled' : '', {
21290
- providedIn: 'root',
21291
- factory: () => false,
21292
- });
21293
- /**
21294
- * A [DI token](api/core/InjectionToken) that configures the maximum animation timeout
21295
- * before element removal. The default value mirrors from Chrome's cross document
21296
- * navigation view transition timeout. It's intended to prevent people from accidentally
21297
- * forgetting to call the removal function in their callback. Also serves as a delay
21298
- * for when stylesheets are pruned.
21299
- *
21300
- * @publicApi 20.2
21301
- */
21302
- const MAX_ANIMATION_TIMEOUT = new InjectionToken(typeof ngDevMode !== 'undefined' && ngDevMode ? 'MaxAnimationTimeout' : '', {
21303
- providedIn: 'root',
21304
- factory: () => MAX_ANIMATION_TIMEOUT_DEFAULT,
21305
- });
21306
- const MAX_ANIMATION_TIMEOUT_DEFAULT = 4000;
21307
-
21308
21419
  const DEFAULT_ANIMATIONS_DISABLED = false;
21309
21420
  const areAnimationSupported = (typeof ngServerMode === 'undefined' || !ngServerMode) &&
21310
21421
  typeof document !== 'undefined' &&
@@ -21434,14 +21545,14 @@ function trackLeavingNodes(tNode, el) {
21434
21545
  */
21435
21546
  function getLViewEnterAnimations(lView) {
21436
21547
  const animationData = (lView[ANIMATIONS] ??= {});
21437
- return (animationData.enter ??= []);
21548
+ return (animationData.enter ??= new Map());
21438
21549
  }
21439
21550
  /**
21440
21551
  * Retrieves the list of specified leave animations from the lView
21441
21552
  */
21442
21553
  function getLViewLeaveAnimations(lView) {
21443
21554
  const animationData = (lView[ANIMATIONS] ??= {});
21444
- return (animationData.leave ??= []);
21555
+ return (animationData.leave ??= new Map());
21445
21556
  }
21446
21557
  /**
21447
21558
  * Gets the list of classes from a passed in value
@@ -21495,13 +21606,48 @@ function elementHasClassList(element, classList) {
21495
21606
  */
21496
21607
  function isLongestAnimation(event, nativeElement) {
21497
21608
  const longestAnimation = longestAnimations.get(nativeElement);
21609
+ // If we don't have any record of a longest animation, then we shouldn't
21610
+ // block the animationend/transitionend event from doing its work.
21611
+ if (longestAnimation === undefined)
21612
+ return true;
21498
21613
  return (nativeElement === event.target &&
21499
- longestAnimation !== undefined &&
21500
21614
  ((longestAnimation.animationName !== undefined &&
21501
21615
  event.animationName === longestAnimation.animationName) ||
21502
21616
  (longestAnimation.propertyName !== undefined &&
21503
21617
  event.propertyName === longestAnimation.propertyName)));
21504
21618
  }
21619
+ /**
21620
+ * Stores a given animation function in the LView's animation map for later execution
21621
+ *
21622
+ * @param animations Either the enter or leave animation map from the LView
21623
+ * @param tNode The TNode the animation is associated with
21624
+ * @param fn The animation function to be called later
21625
+ */
21626
+ function addAnimationToLView(animations, tNode, fn) {
21627
+ const nodeAnimations = animations.get(tNode.index) ?? { animateFns: [] };
21628
+ nodeAnimations.animateFns.push(fn);
21629
+ animations.set(tNode.index, nodeAnimations);
21630
+ }
21631
+ function cleanupAfterLeaveAnimations(resolvers, cleanupFns) {
21632
+ if (resolvers) {
21633
+ for (const fn of resolvers) {
21634
+ fn();
21635
+ }
21636
+ }
21637
+ for (const fn of cleanupFns) {
21638
+ fn();
21639
+ }
21640
+ }
21641
+ function clearLViewNodeAnimationResolvers(lView, tNode) {
21642
+ const nodeAnimations = getLViewLeaveAnimations(lView).get(tNode.index);
21643
+ if (nodeAnimations)
21644
+ nodeAnimations.resolvers = undefined;
21645
+ }
21646
+ function leaveAnimationFunctionCleanup(lView, tNode, nativeElement, resolvers, cleanupFns) {
21647
+ clearLeavingNodes(tNode, nativeElement);
21648
+ cleanupAfterLeaveAnimations(resolvers, cleanupFns);
21649
+ clearLViewNodeAnimationResolvers(lView, tNode);
21650
+ }
21505
21651
 
21506
21652
  /**
21507
21653
  * Instruction to handle the `animate.enter` behavior for class bindings.
@@ -21523,7 +21669,8 @@ function ɵɵanimateEnter(value) {
21523
21669
  }
21524
21670
  const tNode = getCurrentTNode();
21525
21671
  cancelLeavingNodes(tNode, lView);
21526
- getLViewEnterAnimations(lView).push(() => runEnterAnimation(lView, tNode, value));
21672
+ addAnimationToLView(getLViewEnterAnimations(lView), tNode, () => runEnterAnimation(lView, tNode, value));
21673
+ queueEnterAnimations(lView);
21527
21674
  return ɵɵanimateEnter; // For chaining
21528
21675
  }
21529
21676
  function runEnterAnimation(lView, tNode, value) {
@@ -21545,7 +21692,7 @@ function runEnterAnimation(lView, tNode, value) {
21545
21692
  return;
21546
21693
  const eventName = event instanceof AnimationEvent ? 'animationend' : 'transitionend';
21547
21694
  ngZone.runOutsideAngular(() => {
21548
- cleanupFns.push(renderer.listen(nativeElement, eventName, handleEnterAnimationEnd));
21695
+ renderer.listen(nativeElement, eventName, handleEnterAnimationEnd);
21549
21696
  });
21550
21697
  };
21551
21698
  // When the longest animation ends, we can remove all the classes
@@ -21619,7 +21766,8 @@ function ɵɵanimateEnterListener(value) {
21619
21766
  }
21620
21767
  const tNode = getCurrentTNode();
21621
21768
  cancelLeavingNodes(tNode, lView);
21622
- getLViewEnterAnimations(lView).push(() => runEnterAnimationFunction(lView, tNode, value));
21769
+ addAnimationToLView(getLViewEnterAnimations(lView), tNode, () => runEnterAnimationFunction(lView, tNode, value));
21770
+ queueEnterAnimations(lView);
21623
21771
  return ɵɵanimateEnterListener;
21624
21772
  }
21625
21773
  /**
@@ -21652,36 +21800,35 @@ function ɵɵanimateLeave(value) {
21652
21800
  return ɵɵanimateLeave;
21653
21801
  }
21654
21802
  const tNode = getCurrentTNode();
21655
- getLViewLeaveAnimations(lView).push(() => runLeaveAnimations(lView, tNode, value, animationsDisabled));
21803
+ addAnimationToLView(getLViewLeaveAnimations(lView), tNode, () => runLeaveAnimations(lView, tNode, value));
21804
+ enableAnimationQueueScheduler(lView[INJECTOR]);
21656
21805
  return ɵɵanimateLeave; // For chaining
21657
21806
  }
21658
- function runLeaveAnimations(lView, tNode, value, animationsDisabled) {
21807
+ function runLeaveAnimations(lView, tNode, value) {
21659
21808
  const { promise, resolve } = promiseWithResolvers();
21660
21809
  const nativeElement = getNativeByTNode(tNode, lView);
21661
21810
  ngDevMode && assertElementNodes(nativeElement, 'animate.leave');
21662
21811
  const renderer = lView[RENDERER];
21663
21812
  const ngZone = lView[INJECTOR].get(NgZone);
21664
21813
  allLeavingAnimations.add(lView);
21814
+ (getLViewLeaveAnimations(lView).get(tNode.index).resolvers ??= []).push(resolve);
21665
21815
  const activeClasses = getClassListFromValue(value);
21666
21816
  if (activeClasses && activeClasses.length > 0) {
21667
- animateLeaveClassRunner(nativeElement, tNode, activeClasses, renderer, animationsDisabled, ngZone, resolve);
21817
+ animateLeaveClassRunner(nativeElement, tNode, lView, activeClasses, renderer, ngZone);
21668
21818
  }
21669
21819
  else {
21670
21820
  resolve();
21671
21821
  }
21672
- return promise;
21822
+ return { promise, resolve };
21673
21823
  }
21674
21824
  /**
21675
21825
  * This function actually adds the classes that animate element that's leaving the DOM.
21676
21826
  * Once it finishes, it calls the remove function that was provided by the DOM renderer.
21677
21827
  */
21678
- function animateLeaveClassRunner(el, tNode, classList, renderer, animationsDisabled, ngZone, resolver) {
21679
- if (animationsDisabled) {
21680
- longestAnimations.delete(el);
21681
- resolver();
21682
- return;
21683
- }
21828
+ function animateLeaveClassRunner(el, tNode, lView, classList, renderer, ngZone) {
21684
21829
  cancelAnimationsIfRunning(el, renderer);
21830
+ const cleanupFns = [];
21831
+ const resolvers = getLViewLeaveAnimations(lView).get(tNode.index)?.resolvers;
21685
21832
  const handleOutAnimationEnd = (event) => {
21686
21833
  // this early exit case is to prevent issues with bubbling events that are from child element animations
21687
21834
  if (event.target !== el)
@@ -21702,12 +21849,13 @@ function animateLeaveClassRunner(el, tNode, classList, renderer, animationsDisab
21702
21849
  renderer.removeClass(el, item);
21703
21850
  }
21704
21851
  }
21852
+ cleanupAfterLeaveAnimations(resolvers, cleanupFns);
21853
+ clearLViewNodeAnimationResolvers(lView, tNode);
21705
21854
  }
21706
- resolver();
21707
21855
  };
21708
21856
  ngZone.runOutsideAngular(() => {
21709
- renderer.listen(el, 'animationend', handleOutAnimationEnd);
21710
- renderer.listen(el, 'transitionend', handleOutAnimationEnd);
21857
+ cleanupFns.push(renderer.listen(el, 'animationend', handleOutAnimationEnd));
21858
+ cleanupFns.push(renderer.listen(el, 'transitionend', handleOutAnimationEnd));
21711
21859
  });
21712
21860
  trackLeavingNodes(tNode, el);
21713
21861
  for (const item of classList) {
@@ -21721,7 +21869,8 @@ function animateLeaveClassRunner(el, tNode, classList, renderer, animationsDisab
21721
21869
  determineLongestAnimation(el, longestAnimations, areAnimationSupported);
21722
21870
  if (!longestAnimations.has(el)) {
21723
21871
  clearLeavingNodes(tNode, el);
21724
- resolver();
21872
+ cleanupAfterLeaveAnimations(resolvers, cleanupFns);
21873
+ clearLViewNodeAnimationResolvers(lView, tNode);
21725
21874
  }
21726
21875
  });
21727
21876
  });
@@ -21749,7 +21898,8 @@ function ɵɵanimateLeaveListener(value) {
21749
21898
  const lView = getLView();
21750
21899
  const tNode = getCurrentTNode();
21751
21900
  allLeavingAnimations.add(lView);
21752
- getLViewLeaveAnimations(lView).push(() => runLeaveAnimationFunction(lView, tNode, value));
21901
+ addAnimationToLView(getLViewLeaveAnimations(lView), tNode, () => runLeaveAnimationFunction(lView, tNode, value));
21902
+ enableAnimationQueueScheduler(lView[INJECTOR]);
21753
21903
  return ɵɵanimateLeaveListener; // For chaining
21754
21904
  }
21755
21905
  /**
@@ -21759,36 +21909,65 @@ function runLeaveAnimationFunction(lView, tNode, value) {
21759
21909
  const { promise, resolve } = promiseWithResolvers();
21760
21910
  const nativeElement = getNativeByTNode(tNode, lView);
21761
21911
  ngDevMode && assertElementNodes(nativeElement, 'animate.leave');
21912
+ const cleanupFns = [];
21762
21913
  const renderer = lView[RENDERER];
21763
21914
  const animationsDisabled = areAnimationsDisabled(lView);
21764
21915
  const ngZone = lView[INJECTOR].get(NgZone);
21765
21916
  const maxAnimationTimeout = lView[INJECTOR].get(MAX_ANIMATION_TIMEOUT);
21917
+ (getLViewLeaveAnimations(lView).get(tNode.index).resolvers ??= []).push(resolve);
21918
+ const resolvers = getLViewLeaveAnimations(lView).get(tNode.index)?.resolvers;
21766
21919
  if (animationsDisabled) {
21767
- resolve();
21920
+ leaveAnimationFunctionCleanup(lView, tNode, nativeElement, resolvers, cleanupFns);
21768
21921
  }
21769
21922
  else {
21770
- const timeoutId = setTimeout(() => {
21771
- clearLeavingNodes(tNode, nativeElement);
21772
- resolve();
21773
- }, maxAnimationTimeout);
21923
+ const timeoutId = setTimeout(() => leaveAnimationFunctionCleanup(lView, tNode, nativeElement, resolvers, cleanupFns), maxAnimationTimeout);
21774
21924
  const event = {
21775
21925
  target: nativeElement,
21776
21926
  animationComplete: () => {
21777
- clearLeavingNodes(tNode, nativeElement);
21927
+ leaveAnimationFunctionCleanup(lView, tNode, nativeElement, resolvers, cleanupFns);
21778
21928
  clearTimeout(timeoutId);
21779
- resolve();
21780
21929
  },
21781
21930
  };
21782
21931
  trackLeavingNodes(tNode, nativeElement);
21783
21932
  ngZone.runOutsideAngular(() => {
21784
- renderer.listen(nativeElement, 'animationend', () => {
21785
- resolve();
21786
- }, { once: true });
21933
+ cleanupFns.push(renderer.listen(nativeElement, 'animationend', () => {
21934
+ leaveAnimationFunctionCleanup(lView, tNode, nativeElement, resolvers, cleanupFns);
21935
+ clearTimeout(timeoutId);
21936
+ }, { once: true }));
21787
21937
  });
21788
21938
  value.call(lView[CONTEXT], event);
21789
21939
  }
21790
21940
  // Ensure cleanup if the LView is destroyed before the animation runs.
21791
- return promise;
21941
+ return { promise, resolve };
21942
+ }
21943
+ function queueEnterAnimations(lView) {
21944
+ enableAnimationQueueScheduler(lView[INJECTOR]);
21945
+ const enterAnimations = lView[ANIMATIONS]?.enter;
21946
+ if (enterAnimations) {
21947
+ const animationQueue = lView[INJECTOR].get(ANIMATION_QUEUE);
21948
+ for (const [_, nodeAnimations] of enterAnimations) {
21949
+ for (const animateFn of nodeAnimations.animateFns) {
21950
+ animationQueue.queue.add(animateFn);
21951
+ }
21952
+ }
21953
+ }
21954
+ }
21955
+ function enableAnimationQueueScheduler(injector) {
21956
+ const animationQueue = injector.get(ANIMATION_QUEUE);
21957
+ // We only need to schedule the animation queue runner once per application.
21958
+ if (!animationQueue.isScheduled) {
21959
+ afterEveryRender(() => {
21960
+ runQueuedAnimations(injector);
21961
+ }, { injector });
21962
+ animationQueue.isScheduled = true;
21963
+ }
21964
+ }
21965
+ function runQueuedAnimations(injector) {
21966
+ const animationQueue = injector.get(ANIMATION_QUEUE);
21967
+ for (let animateFn of animationQueue.queue) {
21968
+ animateFn();
21969
+ }
21970
+ animationQueue.queue.clear();
21792
21971
  }
21793
21972
 
21794
21973
  /*!
@@ -21811,6 +21990,439 @@ function ɵɵcomponentInstance() {
21811
21990
  return instance;
21812
21991
  }
21813
21992
 
21993
+ /** A unique symbol used to identify {@link ɵControl} implementations. */
21994
+ const ɵCONTROL = Symbol('CONTROL');
21995
+
21996
+ /**
21997
+ * Possibly sets up a {@link ɵControl} to manage a native or custom form control.
21998
+ *
21999
+ * Setup occurs if a `field` input is bound to a {@link ɵControl} directive on the current node,
22000
+ * but not to a component. If a `field` input is bound to a component, we assume the component
22001
+ * will manage the control in its own template.
22002
+ *
22003
+ * @codeGenApi
22004
+ */
22005
+ function ɵɵcontrolCreate() {
22006
+ const lView = getLView();
22007
+ const tView = getTView();
22008
+ const tNode = getCurrentTNode();
22009
+ const control = tView.firstCreatePass
22010
+ ? getControlDirectiveFirstCreatePass(tView, tNode, lView)
22011
+ : getControlDirective(tNode, lView);
22012
+ if (!control) {
22013
+ return;
22014
+ }
22015
+ if (tNode.flags & 2048 /* TNodeFlags.isFormValueControl */) {
22016
+ listenToCustomControl(lView, tNode, control, 'value');
22017
+ }
22018
+ else if (tNode.flags & 4096 /* TNodeFlags.isFormCheckboxControl */) {
22019
+ listenToCustomControl(lView, tNode, control, 'checked');
22020
+ }
22021
+ else {
22022
+ listenToNativeControl(lView, tNode, control);
22023
+ }
22024
+ control.register();
22025
+ }
22026
+ /**
22027
+ * Updates a `field` property, and possibly other form control properties, on the current element.
22028
+ *
22029
+ * This is a specialized version of the `ɵɵproperty` instruction that handles updating additional
22030
+ * form control properties, if set up to do so by {@link ɵɵcontrolCreate} during creation.
22031
+ *
22032
+ * @param value New value to write.
22033
+ * @param sanitizer An optional function used to sanitize the value.
22034
+ *
22035
+ * @codeGenApi
22036
+ */
22037
+ function ɵɵcontrol(value, sanitizer) {
22038
+ const lView = getLView();
22039
+ const tNode = getSelectedTNode();
22040
+ const bindingIndex = nextBindingIndex();
22041
+ if (bindingUpdated(lView, bindingIndex, value)) {
22042
+ const tView = getTView();
22043
+ setPropertyAndInputs(tNode, lView, 'field', value, lView[RENDERER], sanitizer);
22044
+ ngDevMode && storePropertyBindingMetadata(tView.data, tNode, 'field', bindingIndex);
22045
+ }
22046
+ const control = getControlDirective(tNode, lView);
22047
+ if (control) {
22048
+ if (tNode.flags & 2048 /* TNodeFlags.isFormValueControl */) {
22049
+ updateCustomControl(tNode, lView, control, 'value');
22050
+ }
22051
+ else if (tNode.flags & 4096 /* TNodeFlags.isFormCheckboxControl */) {
22052
+ updateCustomControl(tNode, lView, control, 'checked');
22053
+ }
22054
+ else {
22055
+ updateNativeControl(tNode, lView, control);
22056
+ }
22057
+ }
22058
+ }
22059
+ function getControlDirectiveFirstCreatePass(tView, tNode, lView) {
22060
+ const directiveIndices = tNode.inputs?.['field'];
22061
+ if (!directiveIndices) {
22062
+ // There are no matching inputs for the `[field]` property binding.
22063
+ return;
22064
+ }
22065
+ let componentIndex;
22066
+ if (isComponentHost(tNode)) {
22067
+ componentIndex = tNode.directiveStart + tNode.componentOffset;
22068
+ if (directiveIndices.includes(componentIndex)) {
22069
+ // If component has a `field` input, we assume that it will handle binding the field to the
22070
+ // appropriate native/custom control in its template, so we do not attempt to bind any inputs
22071
+ // on this component.
22072
+ return;
22073
+ }
22074
+ }
22075
+ // Search for the `ɵControl` directive.
22076
+ const control = findControlDirective(lView, directiveIndices);
22077
+ if (!control) {
22078
+ // The `ɵControl` directive was not imported by this component.
22079
+ return;
22080
+ }
22081
+ tNode.flags |= 1024 /* TNodeFlags.isFormControl */;
22082
+ if (isComponentHost(tNode)) {
22083
+ const componentDef = tView.data[componentIndex];
22084
+ // TODO: should we check that any additional field state inputs are signal based?
22085
+ if (hasModelInput(componentDef, 'value')) {
22086
+ tNode.flags |= 2048 /* TNodeFlags.isFormValueControl */;
22087
+ return control;
22088
+ }
22089
+ else if (hasModelInput(componentDef, 'checked')) {
22090
+ tNode.flags |= 4096 /* TNodeFlags.isFormCheckboxControl */;
22091
+ return control;
22092
+ }
22093
+ }
22094
+ if (isNativeControl(tNode)) {
22095
+ if (isNumericInput(tNode)) {
22096
+ tNode.flags |= 8192 /* TNodeFlags.isNativeNumericControl */;
22097
+ }
22098
+ if (isTextControl(tNode)) {
22099
+ tNode.flags |= 16384 /* TNodeFlags.isNativeTextControl */;
22100
+ }
22101
+ return control;
22102
+ }
22103
+ const tagName = tNode.value;
22104
+ throw new RuntimeError(318 /* RuntimeErrorCode.INVALID_FIELD_DIRECTIVE_HOST */, `'<${tagName}>' is an invalid [field] directive host. The host must be a native form control ` +
22105
+ `(such as <input>', '<select>', or '<textarea>') or a custom form control component with a ` +
22106
+ `'value' or 'checked' model.`);
22107
+ }
22108
+ /**
22109
+ * Returns the {@link ɵControl} directive on the specified node, if one is present and a `field`
22110
+ * input is bound to it, but not to a component. If a `field` input is bound to a component, we
22111
+ * assume the component will manage the control in its own template and return nothing to indicate
22112
+ * that the directive should not be set up.
22113
+ *
22114
+ * @param tNode The `TNode` of the element to check.
22115
+ * @param lView The `LView` that contains the element.
22116
+ */
22117
+ function getControlDirective(tNode, lView) {
22118
+ return tNode.flags & 1024 /* TNodeFlags.isFormControl */
22119
+ ? findControlDirective(lView, tNode.inputs['field'])
22120
+ : undefined;
22121
+ }
22122
+ function findControlDirective(lView, directiveIndices) {
22123
+ for (let index of directiveIndices) {
22124
+ const directive = lView[index];
22125
+ if (ɵCONTROL in directive) {
22126
+ return directive;
22127
+ }
22128
+ }
22129
+ // The `Field` directive was not imported by this component.
22130
+ return;
22131
+ }
22132
+ /** Returns whether the specified `componentDef` has a model input named `name`. */
22133
+ function hasModelInput(componentDef, name) {
22134
+ return hasSignalInput(componentDef, name) && hasOutput(componentDef, name + 'Change');
22135
+ }
22136
+ /** Returns whether the specified `componentDef` has a signal-based input named `name`.*/
22137
+ function hasSignalInput(componentDef, name) {
22138
+ const input = componentDef.inputs[name];
22139
+ return input && (input[1] & InputFlags.SignalBased) !== 0;
22140
+ }
22141
+ /** Returns whether the specified `componentDef` has an output named `name`. */
22142
+ function hasOutput(componentDef, name) {
22143
+ return name in componentDef.outputs;
22144
+ }
22145
+ /**
22146
+ * Adds event listeners to a custom form control component to notify the `field` of changes.
22147
+ *
22148
+ * @param lView The `LView` that contains the custom form control.
22149
+ * @param tNode The `TNode` of the custom form control.
22150
+ * @param control The `ɵControl` directive instance.
22151
+ * @param componentIndex The index of the custom form control component in the `LView`.
22152
+ * @param modelName The name of the model property on the custom form control.
22153
+ */
22154
+ function listenToCustomControl(lView, tNode, control, modelName) {
22155
+ const componentIndex = tNode.directiveStart + tNode.componentOffset;
22156
+ const outputName = modelName + 'Change';
22157
+ listenToOutput(tNode, lView, componentIndex, outputName, outputName, wrapListener(tNode, lView, (newValue) => {
22158
+ control.state().value.set(newValue);
22159
+ }));
22160
+ const tView = getTView();
22161
+ const componentDef = tView.data[componentIndex];
22162
+ const touchedOutputName = 'touchedChange';
22163
+ if (hasOutput(componentDef, touchedOutputName)) {
22164
+ listenToOutput(tNode, lView, componentIndex, touchedOutputName, touchedOutputName, wrapListener(tNode, lView, () => {
22165
+ control.state().markAsTouched();
22166
+ }));
22167
+ }
22168
+ }
22169
+ function isNativeControl(tNode) {
22170
+ if (tNode.type !== 2 /* TNodeType.Element */) {
22171
+ return false;
22172
+ }
22173
+ const tagName = tNode.value;
22174
+ return tagName === 'input' || tagName === 'textarea' || tagName === 'select';
22175
+ }
22176
+ /**
22177
+ * Adds event listeners to a native form control element to notify the `field` of changes.
22178
+ *
22179
+ * @param lView The `LView` that contains the native form control.
22180
+ * @param tNode The `TNode` of the native form control.
22181
+ * @param control The `ɵControl` directive instance.
22182
+ */
22183
+ function listenToNativeControl(lView, tNode, control) {
22184
+ const tView = getTView();
22185
+ const renderer = lView[RENDERER];
22186
+ const inputListener = () => {
22187
+ const element = getNativeByTNode(tNode, lView);
22188
+ const value = control.state().value;
22189
+ value.set(getNativeControlValue(element, value));
22190
+ };
22191
+ listenToDomEvent(tNode, tView, lView, undefined, renderer, 'input', inputListener, wrapListener(tNode, lView, inputListener));
22192
+ const blurListener = () => {
22193
+ // TODO: https://github.com/orgs/angular/projects/60/views/1?pane=issue&itemId=131860538
22194
+ control.state().markAsTouched();
22195
+ };
22196
+ listenToDomEvent(tNode, tView, lView, undefined, renderer, 'blur', blurListener, wrapListener(tNode, lView, blurListener));
22197
+ }
22198
+ /**
22199
+ * Updates the inputs of a custom form control component with the latest state from the `field`.
22200
+ *
22201
+ * @param lView The `LView` that contains the custom form control.
22202
+ * @param componentIndex The index of the custom form control component in the `LView`.
22203
+ * @param modelName The name of the model property on the custom form control.
22204
+ * @param control The `ɵControl` directive instance.
22205
+ */
22206
+ function updateCustomControl(tNode, lView, control, modelName) {
22207
+ const tView = getTView();
22208
+ const componentIndex = tNode.directiveStart + tNode.componentOffset;
22209
+ const component = lView[componentIndex];
22210
+ const componentDef = tView.data[componentIndex];
22211
+ const state = control.state();
22212
+ // TODO: https://github.com/orgs/angular/projects/60/views/1?pane=issue&itemId=131711472
22213
+ // * check if bindings changed before writing.
22214
+ // * cache which inputs exist.
22215
+ writeToDirectiveInput(componentDef, component, modelName, state.value());
22216
+ maybeWriteToDirectiveInput(componentDef, component, 'errors', state.errors);
22217
+ maybeWriteToDirectiveInput(componentDef, component, 'disabled', state.disabled);
22218
+ maybeWriteToDirectiveInput(componentDef, component, 'disabledReasons', state.disabledReasons);
22219
+ maybeWriteToDirectiveInput(componentDef, component, 'max', state.max);
22220
+ maybeWriteToDirectiveInput(componentDef, component, 'maxLength', state.maxLength);
22221
+ maybeWriteToDirectiveInput(componentDef, component, 'min', state.min);
22222
+ maybeWriteToDirectiveInput(componentDef, component, 'minLength', state.minLength);
22223
+ maybeWriteToDirectiveInput(componentDef, component, 'name', state.name);
22224
+ maybeWriteToDirectiveInput(componentDef, component, 'pattern', state.pattern);
22225
+ maybeWriteToDirectiveInput(componentDef, component, 'readonly', state.readonly);
22226
+ maybeWriteToDirectiveInput(componentDef, component, 'required', state.required);
22227
+ maybeWriteToDirectiveInput(componentDef, component, 'touched', state.touched);
22228
+ }
22229
+ /**
22230
+ * Writes the specified value to a directive input if the input exists.
22231
+ *
22232
+ * @param componentDef The definition of the component that owns the input.
22233
+ * @param component The component instance.
22234
+ * @param inputName The name of the input to write to.
22235
+ * @param source A function that returns the value to write.
22236
+ */
22237
+ function maybeWriteToDirectiveInput(componentDef, component, inputName, source) {
22238
+ if (inputName in componentDef.inputs) {
22239
+ writeToDirectiveInput(componentDef, component, inputName, source());
22240
+ }
22241
+ }
22242
+ /**
22243
+ * Updates the properties of a native form control element with the latest state from the `field`.
22244
+ *
22245
+ * @param tNode The `TNode` of the native form control.
22246
+ * @param lView The `LView` that contains the native form control.
22247
+ * @param control The `ɵControl` directive instance.
22248
+ */
22249
+ function updateNativeControl(tNode, lView, control) {
22250
+ const input = getNativeByTNode(tNode, lView);
22251
+ const renderer = lView[RENDERER];
22252
+ const state = control.state();
22253
+ // TODO: https://github.com/orgs/angular/projects/60/views/1?pane=issue&itemId=131711472
22254
+ // * check if bindings changed before writing.
22255
+ setNativeControlValue(input, state.value());
22256
+ renderer.setAttribute(input, 'name', state.name());
22257
+ setBooleanAttribute(renderer, input, 'disabled', state.disabled());
22258
+ setBooleanAttribute(renderer, input, 'readonly', state.readonly());
22259
+ setBooleanAttribute(renderer, input, 'required', state.required());
22260
+ if (tNode.flags & 8192 /* TNodeFlags.isNativeNumericControl */) {
22261
+ setOptionalAttribute(renderer, input, 'max', state.max());
22262
+ setOptionalAttribute(renderer, input, 'min', state.min());
22263
+ }
22264
+ if (tNode.flags & 16384 /* TNodeFlags.isNativeTextControl */) {
22265
+ setOptionalAttribute(renderer, input, 'maxLength', state.maxLength());
22266
+ setOptionalAttribute(renderer, input, 'minLength', state.minLength());
22267
+ }
22268
+ }
22269
+ /** Checks if a given value is a Date or null */
22270
+ function isDateOrNull(value) {
22271
+ return value === null || value instanceof Date;
22272
+ }
22273
+ /** Returns whether `control` has a numeric input type. */
22274
+ function isNumericInput(tNode) {
22275
+ if (!tNode.attrs || tNode.value !== 'input') {
22276
+ return false;
22277
+ }
22278
+ for (let i = 0; i < tNode.attrs.length; i += 2) {
22279
+ const name = tNode.attrs[i];
22280
+ if (isNameOnlyAttributeMarker(name)) {
22281
+ break;
22282
+ }
22283
+ if (name === 'type') {
22284
+ const value = tNode.attrs[i + 1];
22285
+ return (value === 'date' ||
22286
+ value === 'datetime-local' ||
22287
+ value === 'month' ||
22288
+ value === 'number' ||
22289
+ value === 'range' ||
22290
+ value === 'time' ||
22291
+ value === 'week');
22292
+ }
22293
+ }
22294
+ return false;
22295
+ }
22296
+ /**
22297
+ * Returns whether `control` is a text-based input.
22298
+ *
22299
+ * This is not the same as an input with `type="text"`, but rather any input that accepts
22300
+ * text-based input which includes numeric types.
22301
+ */
22302
+ function isTextControl(tNode) {
22303
+ return tNode.value !== 'select';
22304
+ }
22305
+ /**
22306
+ * Returns the value from a native control element.
22307
+ *
22308
+ * @param element The native control element.
22309
+ * @param currentValue A function that returns the current value from the control's corresponding
22310
+ * field state.
22311
+ *
22312
+ * The type of the returned value depends on the `type` property of the control, and will attempt to
22313
+ * match the current value's type. For example, the value of `<input type="number">` can be read as
22314
+ * a `string` or a `number`. If the current value is a `number`, then this will return a `number`.
22315
+ * Otherwise, this will return the value as a `string`.
22316
+ */
22317
+ function getNativeControlValue(element, currentValue) {
22318
+ // Special cases for specific input types.
22319
+ switch (element.type) {
22320
+ case 'checkbox':
22321
+ return element.checked;
22322
+ case 'number':
22323
+ case 'range':
22324
+ case 'datetime-local':
22325
+ // We can read a `number` or a `string` from this input type. Prefer whichever is consistent
22326
+ // with the current type.
22327
+ if (typeof currentValue() === 'number') {
22328
+ return element.valueAsNumber;
22329
+ }
22330
+ break;
22331
+ case 'date':
22332
+ case 'month':
22333
+ case 'time':
22334
+ case 'week':
22335
+ // We can read a `Date | null`, `number`, or `string` from this input type. Prefer whichever
22336
+ // is consistent with the current type.
22337
+ const value = currentValue();
22338
+ if (isDateOrNull(value)) {
22339
+ return element.valueAsDate;
22340
+ }
22341
+ else if (typeof value === 'number') {
22342
+ return element.valueAsNumber;
22343
+ }
22344
+ break;
22345
+ }
22346
+ // Default to reading the value as a string.
22347
+ return element.value;
22348
+ }
22349
+ /**
22350
+ * Sets a native control element's value.
22351
+ *
22352
+ * @param element The native control element.
22353
+ * @param value The new value to set.
22354
+ */
22355
+ function setNativeControlValue(element, value) {
22356
+ // Special cases for specific input types.
22357
+ switch (element.type) {
22358
+ case 'checkbox':
22359
+ element.checked = value;
22360
+ return;
22361
+ case 'radio':
22362
+ // Although HTML behavior is to clear the input already, we do this just in case. It seems
22363
+ // like it might be necessary in certain environments (e.g. Domino).
22364
+ element.checked = value === element.value;
22365
+ return;
22366
+ case 'number':
22367
+ case 'range':
22368
+ case 'datetime-local':
22369
+ // This input type can receive a `number` or a `string`.
22370
+ if (typeof value === 'number') {
22371
+ element.valueAsNumber = value;
22372
+ return;
22373
+ }
22374
+ break;
22375
+ case 'date':
22376
+ case 'month':
22377
+ case 'time':
22378
+ case 'week':
22379
+ // This input type can receive a `Date | null` or a `number` or a `string`.
22380
+ if (isDateOrNull(value)) {
22381
+ element.valueAsDate = value;
22382
+ return;
22383
+ }
22384
+ else if (typeof value === 'number') {
22385
+ element.valueAsNumber = value;
22386
+ return;
22387
+ }
22388
+ }
22389
+ // Default to setting the value as a string.
22390
+ element.value = value;
22391
+ }
22392
+ /**
22393
+ * Sets a boolean attribute on an element.
22394
+ *
22395
+ * @param renderer The `Renderer` instance to use.
22396
+ * @param element The element to set the attribute on.
22397
+ * @param name The name of the attribute.
22398
+ * @param value The boolean value of the attribute. If `true`, the attribute is added. If `false`,
22399
+ * the attribute is removed.
22400
+ */
22401
+ function setBooleanAttribute(renderer, element, name, value) {
22402
+ if (value) {
22403
+ renderer.setAttribute(element, name, '');
22404
+ }
22405
+ else {
22406
+ renderer.removeAttribute(element, name);
22407
+ }
22408
+ }
22409
+ /**
22410
+ * Sets an attribute on an element if the value is not `undefined`.
22411
+ *
22412
+ * @param renderer The `Renderer` instance to use.
22413
+ * @param element The element to set the attribute on.
22414
+ * @param name The name of the attribute.
22415
+ * @param value The value of the attribute. If `undefined`, the attribute is removed.
22416
+ */
22417
+ function setOptionalAttribute(renderer, element, name, value) {
22418
+ if (value !== undefined) {
22419
+ renderer.setAttribute(element, name, value.toString());
22420
+ }
22421
+ else {
22422
+ renderer.removeAttribute(element, name);
22423
+ }
22424
+ }
22425
+
21814
22426
  /**
21815
22427
  * A type representing the live collection to be reconciled with any new (incoming) collection. This
21816
22428
  * is an adapter class that makes it possible to work with different internal data structures,
@@ -28733,6 +29345,8 @@ const angularCoreEnv = (() => ({
28733
29345
  'ɵɵdomProperty': ɵɵdomProperty,
28734
29346
  'ɵɵariaProperty': ɵɵariaProperty,
28735
29347
  'ɵɵproperty': ɵɵproperty,
29348
+ 'ɵɵcontrol': ɵɵcontrol,
29349
+ 'ɵɵcontrolCreate': ɵɵcontrolCreate,
28736
29350
  'ɵɵpipe': ɵɵpipe,
28737
29351
  'ɵɵqueryRefresh': ɵɵqueryRefresh,
28738
29352
  'ɵɵqueryAdvance': ɵɵqueryAdvance,
@@ -31012,5 +31626,5 @@ function getDebugNode(nativeNode) {
31012
31626
  return null;
31013
31627
  }
31014
31628
 
31015
- 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 };
31629
+ 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, resetIncrementalHydrationEnabledWarnedForTests, 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, ɵCONTROL, ɵ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, ɵɵcontrol, ɵɵcontrolCreate, ɵɵ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 };
31016
31630
  //# sourceMappingURL=_debug_node-chunk.mjs.map