@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.
- package/fesm2022/_attribute-chunk.mjs +2 -2
- package/fesm2022/_attribute-chunk.mjs.map +1 -1
- package/fesm2022/_debug_node-chunk.mjs +755 -141
- package/fesm2022/_debug_node-chunk.mjs.map +1 -1
- package/fesm2022/_effect-chunk.mjs +2 -2
- package/fesm2022/_effect-chunk.mjs.map +1 -1
- package/fesm2022/_not_found-chunk.mjs +2 -2
- package/fesm2022/_not_found-chunk.mjs.map +1 -1
- package/fesm2022/_resource-chunk.mjs +2 -2
- package/fesm2022/_resource-chunk.mjs.map +1 -1
- package/fesm2022/_root_effect_scheduler-chunk.mjs +8 -3
- package/fesm2022/_root_effect_scheduler-chunk.mjs.map +1 -1
- package/fesm2022/_signal-chunk.mjs +2 -2
- package/fesm2022/_signal-chunk.mjs.map +1 -1
- package/fesm2022/_weak_ref-chunk.mjs +2 -2
- package/fesm2022/_weak_ref-chunk.mjs.map +1 -1
- package/fesm2022/core.mjs +9 -13
- package/fesm2022/core.mjs.map +1 -1
- package/fesm2022/primitives-di.mjs +2 -2
- package/fesm2022/primitives-di.mjs.map +1 -1
- package/fesm2022/primitives-event-dispatch.mjs +2 -2
- package/fesm2022/primitives-event-dispatch.mjs.map +1 -1
- package/fesm2022/primitives-signals.mjs +2 -2
- package/fesm2022/primitives-signals.mjs.map +1 -1
- package/fesm2022/rxjs-interop.mjs +2 -2
- package/fesm2022/rxjs-interop.mjs.map +1 -1
- package/fesm2022/testing.mjs +2 -2
- package/fesm2022/testing.mjs.map +1 -1
- package/package.json +2 -2
- package/schematics/bundles/add-bootstrap-context-to-server-main.cjs +5 -5
- package/schematics/bundles/application-config-core.cjs +5 -5
- package/schematics/bundles/{apply_import_manager-pLtndDki.cjs → apply_import_manager-CBLmogDD.cjs} +3 -3
- package/schematics/bundles/bootstrap-options-migration.cjs +5 -5
- package/schematics/bundles/cleanup-unused-imports.cjs +5 -5
- package/schematics/bundles/{compiler_host-BJEh7-L1.cjs → compiler_host-T6xncpiw.cjs} +2 -2
- package/schematics/bundles/control-flow-migration.cjs +22 -21
- package/schematics/bundles/imports-DwPXlGFl.cjs +1 -1
- package/schematics/bundles/{index-DCfgOEYE.cjs → index-BnmACOsq.cjs} +237 -98
- package/schematics/bundles/{index-bqpULzLD.cjs → index-DWSaRJdz.cjs} +4 -4
- package/schematics/bundles/inject-migration.cjs +3 -3
- package/schematics/bundles/leading_space-D9nQ8UQC.cjs +1 -1
- package/schematics/bundles/{migrate_ts_type_references-COE6BA7E.cjs → migrate_ts_type_references-Cu-FR4L5.cjs} +47 -5
- package/schematics/bundles/{ng_component_template-pDoKlgPP.cjs → ng_component_template-BkWiUuGG.cjs} +2 -2
- package/schematics/bundles/ng_decorators-BI0uV7KI.cjs +1 -1
- package/schematics/bundles/ngclass-to-class-migration.cjs +7 -7
- package/schematics/bundles/ngstyle-to-style-migration.cjs +7 -7
- package/schematics/bundles/nodes-B16H9JUd.cjs +1 -1
- package/schematics/bundles/output-migration.cjs +6 -6
- package/schematics/bundles/{parse_html-B6fblY_V.cjs → parse_html-C97tKKp3.cjs} +2 -2
- package/schematics/bundles/{project_paths-i0Wjiiq1.cjs → project_paths-C6g3lqjX.cjs} +3 -3
- package/schematics/bundles/{project_tsconfig_paths-sFatqIE5.cjs → project_tsconfig_paths-CdhVNYMk.cjs} +401 -41
- package/schematics/bundles/property_name-BBwFuqMe.cjs +1 -1
- package/schematics/bundles/route-lazy-loading.cjs +3 -3
- package/schematics/bundles/router-current-navigation.cjs +4 -4
- package/schematics/bundles/router-last-successful-navigation.cjs +4 -4
- package/schematics/bundles/router-testing-module-migration.cjs +513 -0
- package/schematics/bundles/self-closing-tags-migration.cjs +6 -6
- package/schematics/bundles/signal-input-migration.cjs +7 -7
- package/schematics/bundles/signal-queries-migration.cjs +7 -7
- package/schematics/bundles/signals.cjs +7 -7
- package/schematics/bundles/standalone-migration.cjs +50 -10
- package/schematics/bundles/symbol-BObKoqes.cjs +1 -1
- package/schematics/collection.json +5 -0
- package/schematics/migrations/router-testing-module-migration/schema.json +14 -0
- package/types/_api-chunk.d.ts +2 -2
- package/types/_chrome_dev_tools_performance-chunk.d.ts +4 -2
- package/types/_discovery-chunk.d.ts +61 -12
- package/types/_effect-chunk.d.ts +2 -2
- package/types/_event_dispatcher-chunk.d.ts +2 -2
- package/types/_formatter-chunk.d.ts +2 -2
- package/types/_weak_ref-chunk.d.ts +2 -2
- package/types/core.d.ts +135 -11
- package/types/primitives-di.d.ts +2 -2
- package/types/primitives-event-dispatch.d.ts +2 -2
- package/types/primitives-signals.d.ts +2 -2
- package/types/rxjs-interop.d.ts +2 -2
- package/types/testing.d.ts +2 -2
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* @license Angular v21.0.0-next.
|
|
3
|
-
* (c) 2010-2025 Google LLC. https://angular.
|
|
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,
|
|
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
|
-
|
|
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)
|
|
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
|
-
|
|
3988
|
-
|
|
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
|
-
|
|
3992
|
-
viewportTriggers.
|
|
3993
|
-
|
|
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.
|
|
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
|
-
|
|
4003
|
-
|
|
4004
|
-
|
|
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 (
|
|
4007
|
-
|
|
4008
|
-
|
|
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
|
|
4503
|
-
if (!
|
|
4504
|
-
|
|
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:
|
|
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
|
-
|
|
7566
|
-
|
|
7567
|
-
|
|
7568
|
-
|
|
7569
|
-
|
|
7570
|
-
|
|
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
|
-
|
|
7573
|
-
|
|
7574
|
-
|
|
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
|
-
|
|
7577
|
-
lView
|
|
7692
|
+
animations.running = Promise.allSettled(runningAnimations);
|
|
7693
|
+
runAfterLeaveAnimations(lView, callback);
|
|
7578
7694
|
}
|
|
7579
|
-
|
|
7580
|
-
|
|
7695
|
+
else {
|
|
7696
|
+
if (lView)
|
|
7697
|
+
allLeavingAnimations.delete(lView);
|
|
7698
|
+
callback(false);
|
|
7699
|
+
}
|
|
7700
|
+
});
|
|
7581
7701
|
}
|
|
7582
7702
|
function runAfterLeaveAnimations(lView, callback) {
|
|
7583
|
-
|
|
7584
|
-
|
|
7585
|
-
|
|
7586
|
-
|
|
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.
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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,
|
|
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 */,
|
|
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)
|
|
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
|
-
|
|
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)
|
|
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)
|
|
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
|
|
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,
|
|
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,
|
|
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
|
-
|
|
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)
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
21786
|
-
|
|
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
|