@angular/core 21.0.0-next.7 → 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 +1 -1
  2. package/fesm2022/_attribute-chunk.mjs.map +1 -1
  3. package/fesm2022/_debug_node-chunk.mjs +265 -155
  4. package/fesm2022/_debug_node-chunk.mjs.map +1 -1
  5. package/fesm2022/_effect-chunk.mjs +1 -1
  6. package/fesm2022/_effect-chunk.mjs.map +1 -1
  7. package/fesm2022/_not_found-chunk.mjs +1 -1
  8. package/fesm2022/_not_found-chunk.mjs.map +1 -1
  9. package/fesm2022/_resource-chunk.mjs +1 -1
  10. package/fesm2022/_resource-chunk.mjs.map +1 -1
  11. package/fesm2022/_root_effect_scheduler-chunk.mjs +7 -2
  12. package/fesm2022/_root_effect_scheduler-chunk.mjs.map +1 -1
  13. package/fesm2022/_signal-chunk.mjs +1 -1
  14. package/fesm2022/_signal-chunk.mjs.map +1 -1
  15. package/fesm2022/_weak_ref-chunk.mjs +1 -1
  16. package/fesm2022/_weak_ref-chunk.mjs.map +1 -1
  17. package/fesm2022/core.mjs +8 -12
  18. package/fesm2022/core.mjs.map +1 -1
  19. package/fesm2022/primitives-di.mjs +1 -1
  20. package/fesm2022/primitives-di.mjs.map +1 -1
  21. package/fesm2022/primitives-event-dispatch.mjs +1 -1
  22. package/fesm2022/primitives-event-dispatch.mjs.map +1 -1
  23. package/fesm2022/primitives-signals.mjs +1 -1
  24. package/fesm2022/primitives-signals.mjs.map +1 -1
  25. package/fesm2022/rxjs-interop.mjs +1 -1
  26. package/fesm2022/rxjs-interop.mjs.map +1 -1
  27. package/fesm2022/testing.mjs +1 -1
  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-D_4NSuRa.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-C1KRWoxv.cjs → compiler_host-T6xncpiw.cjs} +2 -2
  36. package/schematics/bundles/control-flow-migration.cjs +4 -4
  37. package/schematics/bundles/imports-DwPXlGFl.cjs +1 -1
  38. package/schematics/bundles/{index-BFENxhdR.cjs → index-BnmACOsq.cjs} +237 -98
  39. package/schematics/bundles/{index-DYqR8Lpq.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-CemH7A8e.cjs → migrate_ts_type_references-Cu-FR4L5.cjs} +47 -5
  43. package/schematics/bundles/{ng_component_template-AYs8YXuT.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-6-AB4O-A.cjs → parse_html-C97tKKp3.cjs} +2 -2
  50. package/schematics/bundles/{project_paths-EiOrjlNS.cjs → project_paths-C6g3lqjX.cjs} +3 -3
  51. package/schematics/bundles/{project_tsconfig_paths-BbVhi4fG.cjs → project_tsconfig_paths-CdhVNYMk.cjs} +326 -46
  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 +4 -4
  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 +1 -1
  66. package/types/_chrome_dev_tools_performance-chunk.d.ts +3 -1
  67. package/types/_discovery-chunk.d.ts +51 -9
  68. package/types/_effect-chunk.d.ts +1 -1
  69. package/types/_event_dispatcher-chunk.d.ts +1 -1
  70. package/types/_formatter-chunk.d.ts +1 -1
  71. package/types/_weak_ref-chunk.d.ts +1 -1
  72. package/types/core.d.ts +21 -15
  73. package/types/primitives-di.d.ts +1 -1
  74. package/types/primitives-event-dispatch.d.ts +1 -1
  75. package/types/primitives-signals.d.ts +1 -1
  76. package/types/rxjs-interop.d.ts +1 -1
  77. package/types/testing.d.ts +1 -1
@@ -1,10 +1,10 @@
1
1
  /**
2
- * @license Angular v21.0.0-next.7
2
+ * @license Angular v21.0.0-next.8
3
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, 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';
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
  }
@@ -7629,6 +7672,8 @@ function runLeaveAnimationsWithCallback(lView, tNode, injector, callback) {
7629
7672
  animations.skipLeaveAnimations = false;
7630
7673
  return callback(false);
7631
7674
  }
7675
+ if (lView)
7676
+ allLeavingAnimations.add(lView);
7632
7677
  addToAnimationQueue(injector, () => {
7633
7678
  // it's possible that in the time between when the leave animation was
7634
7679
  // and the time it was executed, the data structure changed. So we need
@@ -13771,7 +13816,7 @@ class ComponentFactory extends ComponentFactory$1 {
13771
13816
  }
13772
13817
  function createRootTView(rootSelectorOrNode, componentDef, componentBindings, directives) {
13773
13818
  const tAttributes = rootSelectorOrNode
13774
- ? ['ng-version', '21.0.0-next.7']
13819
+ ? ['ng-version', '21.0.0-next.8']
13775
13820
  : // Extract attributes and classes from the first selector only to match VE behavior.
13776
13821
  extractAttrsAndClassesFromSelector(componentDef.selectors[0]);
13777
13822
  let creationBindings = null;
@@ -16831,9 +16876,9 @@ function trackTriggerForDebugging(tView, tNode, textRepresentation) {
16831
16876
  * @param callback Callback to be invoked when the trigger comes into the viewport.
16832
16877
  * @param injector Injector that can be used by the trigger to resolve DI tokens.
16833
16878
  */
16834
- function onViewportWrapper(trigger, callback, injector) {
16879
+ function onViewportWrapper(trigger, callback, injector, wrapperOptions) {
16835
16880
  const ngZone = injector.get(NgZone);
16836
- return onViewport(trigger, () => ngZone.run(callback), () => ngZone.runOutsideAngular(() => createIntersectionObserver()));
16881
+ return onViewport(trigger, () => ngZone.run(callback), (options) => ngZone.runOutsideAngular(() => createIntersectionObserver(options)), wrapperOptions);
16837
16882
  }
16838
16883
  /**
16839
16884
  * Helper function to get the LView in which a deferred block's trigger is rendered.
@@ -16886,7 +16931,7 @@ function getTriggerElement(triggerLView, triggerIndex) {
16886
16931
  * the deferred block.
16887
16932
  * @param type Trigger type to distinguish between regular and prefetch triggers.
16888
16933
  */
16889
- function registerDomTrigger(initialLView, tNode, triggerIndex, walkUpTimes, registerFn, callback, type) {
16934
+ function registerDomTrigger(initialLView, tNode, triggerIndex, walkUpTimes, registerFn, callback, type, options) {
16890
16935
  const injector = initialLView[INJECTOR];
16891
16936
  const zone = injector.get(NgZone);
16892
16937
  let poll;
@@ -16925,7 +16970,7 @@ function registerDomTrigger(initialLView, tNode, triggerIndex, walkUpTimes, regi
16925
16970
  }
16926
16971
  callback();
16927
16972
  });
16928
- }, injector);
16973
+ }, injector, options);
16929
16974
  // The trigger and deferred block might be in different LViews.
16930
16975
  // For the main LView the cleanup would happen as a part of
16931
16976
  // `storeTriggerCleanupFn` logic. For trigger LView we register
@@ -20652,6 +20697,9 @@ function processAndInitTriggers(injector, blockData, nodes) {
20652
20697
  timerElements.push(elementTrigger);
20653
20698
  }
20654
20699
  if (blockSummary.hydrate.viewport) {
20700
+ if (typeof blockSummary.hydrate.viewport !== 'boolean') {
20701
+ elementTrigger.intersectionObserverOptions = blockSummary.hydrate.viewport;
20702
+ }
20655
20703
  viewportElements.push(elementTrigger);
20656
20704
  }
20657
20705
  }
@@ -20674,7 +20722,7 @@ function setViewportTriggers(injector, elementTriggers) {
20674
20722
  if (elementTriggers.length > 0) {
20675
20723
  const registry = injector.get(DEHYDRATED_BLOCK_REGISTRY);
20676
20724
  for (let elementTrigger of elementTriggers) {
20677
- const cleanupFn = onViewportWrapper(elementTrigger.el, () => triggerHydrationFromBlockName(injector, elementTrigger.blockName), injector);
20725
+ const cleanupFn = onViewportWrapper(elementTrigger.el, () => triggerHydrationFromBlockName(injector, elementTrigger.blockName), injector, elementTrigger.intersectionObserverOptions);
20678
20726
  registry.addCleanupFn(elementTrigger.blockName, cleanupFn);
20679
20727
  }
20680
20728
  }
@@ -20742,14 +20790,15 @@ function ɵɵdefer(index, primaryTmplIndex, dependencyResolverFn, loadingTmplInd
20742
20790
  const adjustedIndex = index + HEADER_OFFSET;
20743
20791
  const tNode = declareNoDirectiveHostTemplate(lView, tView, index, null, 0, 0);
20744
20792
  const injector = lView[INJECTOR];
20793
+ const incrementalHydrationEnabled = isIncrementalHydrationEnabled(injector);
20745
20794
  if (tView.firstCreatePass) {
20746
20795
  performanceMarkFeature('NgDefer');
20747
20796
  if (ngDevMode) {
20748
20797
  if (typeof ngHmrMode !== 'undefined' && ngHmrMode) {
20749
20798
  logHmrWarning(injector);
20750
20799
  }
20751
- if (hasHydrateTriggers(flags)) {
20752
- assertIncrementalHydrationIsConfigured(injector);
20800
+ if (hasHydrateTriggers(flags) && !incrementalHydrationEnabled) {
20801
+ warnIncrementalHydrationNotConfigured();
20753
20802
  }
20754
20803
  }
20755
20804
  const tDetails = {
@@ -20797,7 +20846,7 @@ function ɵɵdefer(index, primaryTmplIndex, dependencyResolverFn, loadingTmplInd
20797
20846
  ];
20798
20847
  setLDeferBlockDetails(lView, adjustedIndex, lDetails);
20799
20848
  let registry = null;
20800
- if (ssrUniqueId !== null) {
20849
+ if (ssrUniqueId !== null && incrementalHydrationEnabled) {
20801
20850
  // Store this defer block in the registry, to have an access to
20802
20851
  // internal data structures from hydration runtime code.
20803
20852
  registry = injector.get(DEHYDRATED_BLOCK_REGISTRY);
@@ -21097,7 +21146,7 @@ function ɵɵdeferHydrateOnTimer(delay) {
21097
21146
  if (!shouldAttachTrigger(2 /* TriggerType.Hydrate */, lView, tNode))
21098
21147
  return;
21099
21148
  const hydrateTriggers = getHydrateTriggers(getTView(), tNode);
21100
- hydrateTriggers.set(5 /* DeferBlockTrigger.Timer */, { delay });
21149
+ hydrateTriggers.set(5 /* DeferBlockTrigger.Timer */, { type: 5 /* DeferBlockTrigger.Timer */, delay });
21101
21150
  if (typeof ngServerMode !== 'undefined' && ngServerMode) {
21102
21151
  // We are on the server and SSR for defer blocks is enabled.
21103
21152
  triggerDeferBlock(2 /* TriggerType.Hydrate */, lView, tNode);
@@ -21234,18 +21283,25 @@ function ɵɵdeferHydrateOnInteraction() {
21234
21283
  * @param walkUpTimes Number of times to walk up/down the tree hierarchy to find the trigger.
21235
21284
  * @codeGenApi
21236
21285
  */
21237
- function ɵɵdeferOnViewport(triggerIndex, walkUpTimes) {
21286
+ function ɵɵdeferOnViewport(triggerIndex, walkUpTimes, options) {
21238
21287
  const lView = getLView();
21239
21288
  const tNode = getCurrentTNode();
21240
21289
  if (ngDevMode) {
21241
- 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(', ')})`}`);
21242
21298
  }
21243
21299
  if (!shouldAttachTrigger(0 /* TriggerType.Regular */, lView, tNode))
21244
21300
  return;
21245
21301
  renderPlaceholder(lView, tNode);
21246
21302
  // Avoid adding event listeners when this instruction is invoked on the server.
21247
21303
  if (!(typeof ngServerMode !== 'undefined' && ngServerMode)) {
21248
- 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);
21249
21305
  }
21250
21306
  }
21251
21307
  /**
@@ -21254,34 +21310,46 @@ function ɵɵdeferOnViewport(triggerIndex, walkUpTimes) {
21254
21310
  * @param walkUpTimes Number of times to walk up/down the tree hierarchy to find the trigger.
21255
21311
  * @codeGenApi
21256
21312
  */
21257
- function ɵɵdeferPrefetchOnViewport(triggerIndex, walkUpTimes) {
21313
+ function ɵɵdeferPrefetchOnViewport(triggerIndex, walkUpTimes, options) {
21258
21314
  const lView = getLView();
21259
21315
  const tNode = getCurrentTNode();
21260
21316
  if (ngDevMode) {
21261
- 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(', ')})`}`);
21262
21325
  }
21263
21326
  if (!shouldAttachTrigger(1 /* TriggerType.Prefetch */, lView, tNode))
21264
21327
  return;
21265
21328
  const tView = lView[TVIEW];
21266
21329
  const tDetails = getTDeferBlockDetails(tView, tNode);
21267
21330
  if (tDetails.loadingState === DeferDependenciesLoadingState.NOT_STARTED) {
21268
- 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);
21269
21332
  }
21270
21333
  }
21271
21334
  /**
21272
21335
  * Creates runtime data structures for the `on viewport` hydrate trigger.
21273
21336
  * @codeGenApi
21274
21337
  */
21275
- function ɵɵdeferHydrateOnViewport() {
21338
+ function ɵɵdeferHydrateOnViewport(options) {
21276
21339
  const lView = getLView();
21277
21340
  const tNode = getCurrentTNode();
21278
21341
  if (ngDevMode) {
21279
- trackTriggerForDebugging(lView[TVIEW], tNode, 'hydrate on viewport');
21342
+ trackTriggerForDebugging(lView[TVIEW], tNode, `hydrate on viewport${options ? `(${JSON.stringify(options)})` : ''}`);
21280
21343
  }
21281
21344
  if (!shouldAttachTrigger(2 /* TriggerType.Hydrate */, lView, tNode))
21282
21345
  return;
21283
21346
  const hydrateTriggers = getHydrateTriggers(getTView(), tNode);
21284
- 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);
21285
21353
  if (typeof ngServerMode !== 'undefined' && ngServerMode) {
21286
21354
  // We are on the server and SSR for defer blocks is enabled.
21287
21355
  triggerDeferBlock(2 /* TriggerType.Hydrate */, lView, tNode);
@@ -21575,6 +21643,11 @@ function clearLViewNodeAnimationResolvers(lView, tNode) {
21575
21643
  if (nodeAnimations)
21576
21644
  nodeAnimations.resolvers = undefined;
21577
21645
  }
21646
+ function leaveAnimationFunctionCleanup(lView, tNode, nativeElement, resolvers, cleanupFns) {
21647
+ clearLeavingNodes(tNode, nativeElement);
21648
+ cleanupAfterLeaveAnimations(resolvers, cleanupFns);
21649
+ clearLViewNodeAnimationResolvers(lView, tNode);
21650
+ }
21578
21651
 
21579
21652
  /**
21580
21653
  * Instruction to handle the `animate.enter` behavior for class bindings.
@@ -21836,36 +21909,36 @@ function runLeaveAnimationFunction(lView, tNode, value) {
21836
21909
  const { promise, resolve } = promiseWithResolvers();
21837
21910
  const nativeElement = getNativeByTNode(tNode, lView);
21838
21911
  ngDevMode && assertElementNodes(nativeElement, 'animate.leave');
21912
+ const cleanupFns = [];
21839
21913
  const renderer = lView[RENDERER];
21840
21914
  const animationsDisabled = areAnimationsDisabled(lView);
21841
21915
  const ngZone = lView[INJECTOR].get(NgZone);
21842
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;
21843
21919
  if (animationsDisabled) {
21844
- resolve();
21920
+ leaveAnimationFunctionCleanup(lView, tNode, nativeElement, resolvers, cleanupFns);
21845
21921
  }
21846
21922
  else {
21847
- const timeoutId = setTimeout(() => {
21848
- clearLeavingNodes(tNode, nativeElement);
21849
- resolve();
21850
- }, maxAnimationTimeout);
21923
+ const timeoutId = setTimeout(() => leaveAnimationFunctionCleanup(lView, tNode, nativeElement, resolvers, cleanupFns), maxAnimationTimeout);
21851
21924
  const event = {
21852
21925
  target: nativeElement,
21853
21926
  animationComplete: () => {
21854
- clearLeavingNodes(tNode, nativeElement);
21927
+ leaveAnimationFunctionCleanup(lView, tNode, nativeElement, resolvers, cleanupFns);
21855
21928
  clearTimeout(timeoutId);
21856
- resolve();
21857
21929
  },
21858
21930
  };
21859
21931
  trackLeavingNodes(tNode, nativeElement);
21860
21932
  ngZone.runOutsideAngular(() => {
21861
- renderer.listen(nativeElement, 'animationend', () => {
21862
- resolve();
21863
- }, { once: true });
21933
+ cleanupFns.push(renderer.listen(nativeElement, 'animationend', () => {
21934
+ leaveAnimationFunctionCleanup(lView, tNode, nativeElement, resolvers, cleanupFns);
21935
+ clearTimeout(timeoutId);
21936
+ }, { once: true }));
21864
21937
  });
21865
21938
  value.call(lView[CONTEXT], event);
21866
21939
  }
21867
21940
  // Ensure cleanup if the LView is destroyed before the animation runs.
21868
- return promise;
21941
+ return { promise, resolve };
21869
21942
  }
21870
21943
  function queueEnterAnimations(lView) {
21871
21944
  enableAnimationQueueScheduler(lView[INJECTOR]);
@@ -21923,44 +21996,35 @@ const ɵCONTROL = Symbol('CONTROL');
21923
21996
  /**
21924
21997
  * Possibly sets up a {@link ɵControl} to manage a native or custom form control.
21925
21998
  *
21926
- * Setup occurs if a `control` input is bound to a {@link ɵControl} directive on the current node,
21927
- * but not to a component. If a `control` input is bound to a component, we assume the component
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
21928
22001
  * will manage the control in its own template.
21929
22002
  *
21930
22003
  * @codeGenApi
21931
22004
  */
21932
22005
  function ɵɵcontrolCreate() {
21933
22006
  const lView = getLView();
22007
+ const tView = getTView();
21934
22008
  const tNode = getCurrentTNode();
21935
- // TODO(https://github.com/orgs/angular/projects/60/views/1?pane=issue&itemId=131712274)
21936
- // * cache the control directive index or instance for reuse.
21937
- const control = getControlDirective(tNode, lView);
22009
+ const control = tView.firstCreatePass
22010
+ ? getControlDirectiveFirstCreatePass(tView, tNode, lView)
22011
+ : getControlDirective(tNode, lView);
21938
22012
  if (!control) {
21939
22013
  return;
21940
22014
  }
21941
- // TODO(https://github.com/orgs/angular/projects/60/views/1?pane=issue&itemId=131712274):
21942
- // * cache the custom control component index or instance for reuse.
21943
- // * cache the control model name for reuse.
21944
- const customControl = getCustomControlComponent(tNode);
21945
- if (customControl) {
21946
- const [componentIndex, modelName] = customControl;
21947
- listenToCustomControl(lView, tNode, control, componentIndex, modelName);
22015
+ if (tNode.flags & 2048 /* TNodeFlags.isFormValueControl */) {
22016
+ listenToCustomControl(lView, tNode, control, 'value');
21948
22017
  }
21949
- else if (isNativeControl(lView, tNode)) {
21950
- listenToNativeControl(lView, tNode, control);
22018
+ else if (tNode.flags & 4096 /* TNodeFlags.isFormCheckboxControl */) {
22019
+ listenToCustomControl(lView, tNode, control, 'checked');
21951
22020
  }
21952
22021
  else {
21953
- // For example, user wrote <div [control]="f">.
21954
- // TODO: https://github.com/orgs/angular/projects/60/views/1?pane=issue&itemId=131860276
21955
- const tagName = tNode.value;
21956
- throw new RuntimeError(318 /* RuntimeErrorCode.INVALID_CONTROL_HOST */, `'<${tagName}>' is an invalid control host. The host must be a native form control (such ` +
21957
- `as <input>', '<select>', or '<textarea>') or a custom form control component with a ` +
21958
- `'value' or 'checked' model.`);
22022
+ listenToNativeControl(lView, tNode, control);
21959
22023
  }
21960
22024
  control.register();
21961
22025
  }
21962
22026
  /**
21963
- * Updates a `control` property, and possibly other form control properties, on the current element.
22027
+ * Updates a `field` property, and possibly other form control properties, on the current element.
21964
22028
  *
21965
22029
  * This is a specialized version of the `ɵɵproperty` instruction that handles updating additional
21966
22030
  * form control properties, if set up to do so by {@link ɵɵcontrolCreate} during creation.
@@ -21972,88 +22036,97 @@ function ɵɵcontrolCreate() {
21972
22036
  */
21973
22037
  function ɵɵcontrol(value, sanitizer) {
21974
22038
  const lView = getLView();
21975
- const bindingIndex = nextBindingIndex();
21976
22039
  const tNode = getSelectedTNode();
22040
+ const bindingIndex = nextBindingIndex();
21977
22041
  if (bindingUpdated(lView, bindingIndex, value)) {
21978
22042
  const tView = getTView();
21979
- setPropertyAndInputs(tNode, lView, 'control', value, lView[RENDERER], sanitizer);
21980
- ngDevMode && storePropertyBindingMetadata(tView.data, tNode, 'control', bindingIndex);
22043
+ setPropertyAndInputs(tNode, lView, 'field', value, lView[RENDERER], sanitizer);
22044
+ ngDevMode && storePropertyBindingMetadata(tView.data, tNode, 'field', bindingIndex);
21981
22045
  }
21982
- // TODO: https://github.com/orgs/angular/projects/60/views/1?pane=issue&itemId=131711472
21983
- // * only run if this is really a control binding determine in the create pass.
21984
22046
  const control = getControlDirective(tNode, lView);
21985
- if (!control) {
21986
- return;
21987
- }
21988
- const customControl = getCustomControlComponent(tNode);
21989
- if (customControl) {
21990
- const [componentIndex, modelName] = customControl;
21991
- updateCustomControl(lView, componentIndex, modelName, control);
21992
- }
21993
- else {
21994
- updateNativeControl(tNode, lView, control);
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
+ }
21995
22057
  }
21996
22058
  }
21997
- /**
21998
- * Returns the {@link ɵControl} directive on the specified node, if one is present and a `control`
21999
- * input is bound to it, but not to a component. If a `control` input is bound to a component, we
22000
- * assume the component will manage the control in its own template and return nothing to indicate
22001
- * that the directive should not be set up.
22002
- *
22003
- * @param tNode The `TNode` of the element to check.
22004
- * @param lView The `LView` that contains the element.
22005
- */
22006
- function getControlDirective(tNode, lView) {
22007
- const directiveIndices = tNode.inputs?.['control'];
22059
+ function getControlDirectiveFirstCreatePass(tView, tNode, lView) {
22060
+ const directiveIndices = tNode.inputs?.['field'];
22008
22061
  if (!directiveIndices) {
22009
- // There are no matching inputs for the `[control]` property binding.
22062
+ // There are no matching inputs for the `[field]` property binding.
22010
22063
  return;
22011
22064
  }
22065
+ let componentIndex;
22012
22066
  if (isComponentHost(tNode)) {
22013
- const componentIndex = tNode.directiveStart + tNode.componentOffset;
22067
+ componentIndex = tNode.directiveStart + tNode.componentOffset;
22014
22068
  if (directiveIndices.includes(componentIndex)) {
22015
- // If component has a `control` input, we assume that it will handle binding the field to the
22069
+ // If component has a `field` input, we assume that it will handle binding the field to the
22016
22070
  // appropriate native/custom control in its template, so we do not attempt to bind any inputs
22017
22071
  // on this component.
22018
22072
  return;
22019
22073
  }
22020
22074
  }
22021
- // Search for the `Control` directive.
22022
- for (let index of directiveIndices) {
22023
- const directive = lView[index];
22024
- if (ɵCONTROL in directive) {
22025
- return directive;
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;
22026
22092
  }
22027
22093
  }
22028
- // The `Control` directive was not imported by this component.
22029
- return;
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.`);
22030
22107
  }
22031
22108
  /**
22032
- * Returns information about the component on the specified node, if it appears to be a custom form
22033
- * control.
22034
- *
22035
- * A component is considered a custom form control if it has a model input named `value` or
22036
- * `checked`.
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.
22037
22113
  *
22038
22114
  * @param tNode The `TNode` of the element to check.
22039
- * @returns an array containing the component index and model input name if it's a custom form
22040
- * control, or undefined.
22115
+ * @param lView The `LView` that contains the element.
22041
22116
  */
22042
- function getCustomControlComponent(tNode) {
22043
- if (!isComponentHost(tNode)) {
22044
- return;
22045
- }
22046
- const tView = getTView();
22047
- const componentIndex = tNode.directiveStart + tNode.componentOffset;
22048
- const componentDef = tView.data[componentIndex];
22049
- if (hasModelInput(componentDef, 'value')) {
22050
- return [componentIndex, 'value'];
22051
- }
22052
- if (hasModelInput(componentDef, 'checked')) {
22053
- return [componentIndex, 'checked'];
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
+ }
22054
22128
  }
22055
- // TODO: https://github.com/orgs/angular/projects/60/views/1?pane=issue&itemId=131861022
22056
- // * should we check that any additional field state inputs are signal based?
22129
+ // The `Field` directive was not imported by this component.
22057
22130
  return;
22058
22131
  }
22059
22132
  /** Returns whether the specified `componentDef` has a model input named `name`. */
@@ -22070,7 +22143,7 @@ function hasOutput(componentDef, name) {
22070
22143
  return name in componentDef.outputs;
22071
22144
  }
22072
22145
  /**
22073
- * Adds event listeners to a custom form control component to notify the `control` of changes.
22146
+ * Adds event listeners to a custom form control component to notify the `field` of changes.
22074
22147
  *
22075
22148
  * @param lView The `LView` that contains the custom form control.
22076
22149
  * @param tNode The `TNode` of the custom form control.
@@ -22078,7 +22151,8 @@ function hasOutput(componentDef, name) {
22078
22151
  * @param componentIndex The index of the custom form control component in the `LView`.
22079
22152
  * @param modelName The name of the model property on the custom form control.
22080
22153
  */
22081
- function listenToCustomControl(lView, tNode, control, componentIndex, modelName) {
22154
+ function listenToCustomControl(lView, tNode, control, modelName) {
22155
+ const componentIndex = tNode.directiveStart + tNode.componentOffset;
22082
22156
  const outputName = modelName + 'Change';
22083
22157
  listenToOutput(tNode, lView, componentIndex, outputName, outputName, wrapListener(tNode, lView, (newValue) => {
22084
22158
  control.state().value.set(newValue);
@@ -22092,14 +22166,15 @@ function listenToCustomControl(lView, tNode, control, componentIndex, modelName)
22092
22166
  }));
22093
22167
  }
22094
22168
  }
22095
- function isNativeControl(lView, tNode) {
22096
- const element = lView[tNode.index];
22097
- return (element instanceof HTMLInputElement ||
22098
- element instanceof HTMLSelectElement ||
22099
- element instanceof HTMLTextAreaElement);
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';
22100
22175
  }
22101
22176
  /**
22102
- * Adds event listeners to a native form control element to notify the `control` of changes.
22177
+ * Adds event listeners to a native form control element to notify the `field` of changes.
22103
22178
  *
22104
22179
  * @param lView The `LView` that contains the native form control.
22105
22180
  * @param tNode The `TNode` of the native form control.
@@ -22121,15 +22196,16 @@ function listenToNativeControl(lView, tNode, control) {
22121
22196
  listenToDomEvent(tNode, tView, lView, undefined, renderer, 'blur', blurListener, wrapListener(tNode, lView, blurListener));
22122
22197
  }
22123
22198
  /**
22124
- * Updates the inputs of a custom form control component with the latest state from the `control`.
22199
+ * Updates the inputs of a custom form control component with the latest state from the `field`.
22125
22200
  *
22126
22201
  * @param lView The `LView` that contains the custom form control.
22127
22202
  * @param componentIndex The index of the custom form control component in the `LView`.
22128
22203
  * @param modelName The name of the model property on the custom form control.
22129
22204
  * @param control The `ɵControl` directive instance.
22130
22205
  */
22131
- function updateCustomControl(lView, componentIndex, modelName, control) {
22206
+ function updateCustomControl(tNode, lView, control, modelName) {
22132
22207
  const tView = getTView();
22208
+ const componentIndex = tNode.directiveStart + tNode.componentOffset;
22133
22209
  const component = lView[componentIndex];
22134
22210
  const componentDef = tView.data[componentIndex];
22135
22211
  const state = control.state();
@@ -22142,11 +22218,11 @@ function updateCustomControl(lView, componentIndex, modelName, control) {
22142
22218
  maybeWriteToDirectiveInput(componentDef, component, 'disabledReasons', state.disabledReasons);
22143
22219
  maybeWriteToDirectiveInput(componentDef, component, 'max', state.max);
22144
22220
  maybeWriteToDirectiveInput(componentDef, component, 'maxLength', state.maxLength);
22145
- maybeWriteToDirectiveInput(componentDef, component, 'min', state.max);
22221
+ maybeWriteToDirectiveInput(componentDef, component, 'min', state.min);
22146
22222
  maybeWriteToDirectiveInput(componentDef, component, 'minLength', state.minLength);
22147
22223
  maybeWriteToDirectiveInput(componentDef, component, 'name', state.name);
22148
22224
  maybeWriteToDirectiveInput(componentDef, component, 'pattern', state.pattern);
22149
- maybeWriteToDirectiveInput(componentDef, component, 'readOnly', state.readonly);
22225
+ maybeWriteToDirectiveInput(componentDef, component, 'readonly', state.readonly);
22150
22226
  maybeWriteToDirectiveInput(componentDef, component, 'required', state.required);
22151
22227
  maybeWriteToDirectiveInput(componentDef, component, 'touched', state.touched);
22152
22228
  }
@@ -22164,7 +22240,7 @@ function maybeWriteToDirectiveInput(componentDef, component, inputName, source)
22164
22240
  }
22165
22241
  }
22166
22242
  /**
22167
- * Updates the properties of a native form control element with the latest state from the `control`.
22243
+ * Updates the properties of a native form control element with the latest state from the `field`.
22168
22244
  *
22169
22245
  * @param tNode The `TNode` of the native form control.
22170
22246
  * @param lView The `LView` that contains the native form control.
@@ -22178,20 +22254,54 @@ function updateNativeControl(tNode, lView, control) {
22178
22254
  // * check if bindings changed before writing.
22179
22255
  setNativeControlValue(input, state.value());
22180
22256
  renderer.setAttribute(input, 'name', state.name());
22181
- setBooleanAttribute(renderer, input, 'disable', state.disabled());
22257
+ setBooleanAttribute(renderer, input, 'disabled', state.disabled());
22182
22258
  setBooleanAttribute(renderer, input, 'readonly', state.readonly());
22183
22259
  setBooleanAttribute(renderer, input, 'required', state.required());
22184
- // TODO: https://github.com/orgs/angular/projects/60/views/1?pane=issue&itemId=131711472
22185
- // * use tag and type attribute to determine which of these properties to bind.
22186
- setOptionalAttribute(renderer, input, 'max', state.max());
22187
- setOptionalAttribute(renderer, input, 'maxLength', state.maxLength());
22188
- setOptionalAttribute(renderer, input, 'min', state.min());
22189
- setOptionalAttribute(renderer, input, 'minLength', state.minLength());
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
+ }
22190
22268
  }
22191
22269
  /** Checks if a given value is a Date or null */
22192
22270
  function isDateOrNull(value) {
22193
22271
  return value === null || value instanceof Date;
22194
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
+ }
22195
22305
  /**
22196
22306
  * Returns the value from a native control element.
22197
22307
  *
@@ -31516,5 +31626,5 @@ function getDebugNode(nativeNode) {
31516
31626
  return null;
31517
31627
  }
31518
31628
 
31519
- 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, ɵ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 };
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 };
31520
31630
  //# sourceMappingURL=_debug_node-chunk.mjs.map