@angular/core 20.3.0 → 20.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/api.d.d.ts +1 -1
- package/chrome_dev_tools_performance.d.d.ts +1 -1
- package/discovery.d.d.ts +43 -3
- package/effect.d.d.ts +1 -1
- package/event_dispatcher.d.d.ts +1 -1
- package/fesm2022/attribute.mjs +1 -1
- package/fesm2022/attribute.mjs.map +1 -1
- package/fesm2022/core.mjs +4 -27
- package/fesm2022/core.mjs.map +1 -1
- package/fesm2022/debug_node.mjs +505 -483
- package/fesm2022/debug_node.mjs.map +1 -1
- package/fesm2022/effect.mjs +1 -1
- package/fesm2022/effect.mjs.map +1 -1
- package/fesm2022/not_found.mjs +1 -1
- package/fesm2022/not_found.mjs.map +1 -1
- package/fesm2022/primitives/di.mjs +1 -1
- package/fesm2022/primitives/di.mjs.map +1 -1
- package/fesm2022/primitives/event-dispatch.mjs +1 -1
- 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/resource.mjs +1 -1
- package/fesm2022/resource.mjs.map +1 -1
- package/fesm2022/root_effect_scheduler.mjs +47 -27
- package/fesm2022/root_effect_scheduler.mjs.map +1 -1
- package/fesm2022/rxjs-interop.mjs +3 -1
- package/fesm2022/rxjs-interop.mjs.map +1 -1
- package/fesm2022/signal.mjs +32 -11
- package/fesm2022/signal.mjs.map +1 -1
- package/fesm2022/testing.mjs +1 -1
- package/fesm2022/testing.mjs.map +1 -1
- package/fesm2022/weak_ref.mjs +1 -1
- package/fesm2022/weak_ref.mjs.map +1 -1
- package/graph.d.d.ts +24 -4
- package/index.d.ts +10 -94
- package/package.json +2 -2
- package/primitives/di/index.d.ts +1 -1
- package/primitives/event-dispatch/index.d.ts +1 -1
- package/primitives/signals/index.d.ts +2 -2
- package/rxjs-interop/index.d.ts +3 -1
- package/schematics/bundles/add-bootstrap-context-to-server-main.cjs +5 -5
- package/schematics/bundles/{apply_import_manager-CeOmw2t5.cjs → apply_import_manager-C8vgfoJx.cjs} +3 -3
- package/schematics/bundles/cleanup-unused-imports.cjs +5 -5
- package/schematics/bundles/{compiler_host-CXabxf2P.cjs → compiler_host-DC7Yquzy.cjs} +2 -2
- package/schematics/bundles/control-flow-migration.cjs +3 -3
- package/schematics/bundles/document-core.cjs +5 -5
- package/schematics/bundles/imports-CIX-JgAN.cjs +1 -1
- package/schematics/bundles/{index-CLpTl6rd.cjs → index-B5lv9x1v.cjs} +101 -29
- package/schematics/bundles/{index-CKtFJ_6n.cjs → index-Bufm9_1r.cjs} +4 -4
- package/schematics/bundles/inject-flags.cjs +5 -5
- package/schematics/bundles/inject-migration.cjs +3 -3
- package/schematics/bundles/leading_space-D9nQ8UQC.cjs +1 -1
- package/schematics/bundles/{migrate_ts_type_references-CjIN7lkE.cjs → migrate_ts_type_references-Ctl6-8qO.cjs} +5 -5
- package/schematics/bundles/ng_decorators-B5HCqr20.cjs +1 -1
- package/schematics/bundles/nodes-B16H9JUd.cjs +1 -1
- package/schematics/bundles/output-migration.cjs +6 -6
- package/schematics/bundles/{project_paths-CGqaSutM.cjs → project_paths-CIUSEdn4.cjs} +3 -3
- package/schematics/bundles/{project_tsconfig_paths-RAvhwg8f.cjs → project_tsconfig_paths-crm5NKE7.cjs} +168 -198
- package/schematics/bundles/property_name-BBwFuqMe.cjs +1 -1
- package/schematics/bundles/route-lazy-loading.cjs +48 -4
- package/schematics/bundles/router-current-navigation.cjs +4 -4
- package/schematics/bundles/self-closing-tags-migration.cjs +4 -4
- package/schematics/bundles/signal-input-migration.cjs +17 -9
- package/schematics/bundles/signal-queries-migration.cjs +7 -7
- package/schematics/bundles/signals.cjs +7 -7
- package/schematics/bundles/standalone-migration.cjs +4 -4
- package/schematics/bundles/symbol-VPWguRxr.cjs +1 -1
- package/schematics/bundles/test-bed-get.cjs +4 -4
- package/testing/index.d.ts +1 -1
- package/weak_ref.d.d.ts +1 -1
package/fesm2022/debug_node.mjs
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* @license Angular v20.3.
|
|
2
|
+
* @license Angular v20.3.1
|
|
3
3
|
* (c) 2010-2025 Google LLC. https://angular.io/
|
|
4
4
|
* License: MIT
|
|
5
5
|
*/
|
|
6
6
|
|
|
7
|
-
import { attachInjectFlag, _global, ɵɵdefineInjectable as __defineInjectable, ɵɵdefineInjector as __defineInjector, ɵɵinject as __inject, ɵɵinvalidFactoryDep as __invalidFactoryDep, resolveForwardRef, newArray, EMPTY_OBJ, assertString, assertNotEqual, FLAGS, assertEqual, isInCheckNoChangesMode, PREORDER_HOOK_FLAGS, assertFirstCreatePass, assertDefined, throwError, assertNumber, assertGreaterThan, HEADER_OFFSET, DECLARATION_VIEW, NG_FACTORY_DEF, isForwardRef, getFactoryDef, assertIndexInRange, assertTNodeForLView, enterDI, runInInjectorProfilerContext, getCurrentTNode, getLView, emitInjectorToCreateInstanceEvent, emitInstanceCreatedByInjectorEvent, throwProviderNotFoundError, leaveDI, assertNodeInjector, stringifyForError, cyclicDependencyErrorWithDetails, cyclicDependencyError, setInjectorProfilerContext, setInjectImplementation, assertDirectiveDef, NG_ELEMENT_ID, convertToBitFlags, isRootView, T_HOST, TVIEW, injectRootLimpMode, isComponentDef, EMBEDDED_VIEW_INJECTOR, INJECTOR$1 as INJECTOR, DECLARATION_COMPONENT_VIEW, isComponentHost, RuntimeError, NG_PROV_DEF, getClosureSafeProperty, getNativeByTNode, flatten, arrayEquals, ID, isLView, assertDomNode, unwrapRNode, getComponentLViewByIndex, CONTEXT, EMPTY_ARRAY, assertLView, HOST, CHILD_HEAD, NEXT, isLContainer, getLViewParent, Injector, CLEANUP, getComponentDef, getDirectiveDef, InjectionToken, inject, isInSkipHydrationBlock as isInSkipHydrationBlock$1, HYDRATION, isContentQueryHost, setCurrentQueryIndex, XSS_SECURITY_URL, renderStringify, ENVIRONMENT, makeEnvironmentProviders, isDirectiveHost, formatRuntimeError, resetPreOrderHookFlags, PARENT, RENDERER, CHILD_TAIL, assertSame, assertFirstUpdatePass, getSelectedIndex, getTView, assertIndexInDeclRange, setSelectedIndex, assertLContainer, MOVED_VIEWS, isDestroyed, REACTIVE_TEMPLATE_CONSUMER, DECLARATION_LCONTAINER, QUERIES, assertNotReactive, ON_DESTROY_HOOKS, assertFunction, EFFECTS, assertProjectionSlots, NATIVE, assertParentView, CONTAINER_HEADER_OFFSET, assertNotSame, setCurrentDirectiveIndex, setCurrentTNode, getElementDepthCount, increaseElementDepthCount, wasLastNodeCreated, isCurrentTNodeParent, setCurrentTNodeAsNotParent, assertHasParent, INTERNAL_APPLICATION_ERROR_HANDLER, stringify, getCurrentDirectiveIndex, unwrapLView, isCreationMode, enterView, leaveView, AFTER_RENDER_SEQUENCES_TO_ADD, markAncestorsForTraversal, markViewForRefresh, setIsRefreshingViews, isExhaustiveCheckNoChanges, requiresRefreshOrTraversal, setIsInCheckNoChangesMode, CheckNoChangesMode, setBindingIndex, EFFECTS_TO_SCHEDULE, viewAttachedToChangeDetector, setBindingRootForHostBindings, isRefreshingViews, removeFromArray, addToArray, updateAncestorTraversalFlagsOnAttach, storeLViewOnDestroy, VIEW_REFS, assertGreaterThanOrEqual, isInI18nBlock, assertTNodeForTView, getCurrentParentTNode, getCurrentTNodePlaceholderOk, assertTNode, assertTIcu, assertNumberInRange, DEHYDRATED_VIEWS, getNgModuleDef, getPipeDef as getPipeDef$1, getNgModuleDefOrThrow, isStandalone, concatStringsWithSpace, assertInjectImplementationNotEqual, emitInjectEvent, getConstant, assertLessThan, getOrCreateTViewCleanup, getOrCreateLViewCleanup, assertNotDefined, nextBindingIndex, getSelectedTNode, getDirectiveDefOrThrow, getTNode, assertComponentType, debugStringifyTypeForError, ChangeDetectionScheduler, EnvironmentInjector, SVG_NAMESPACE, MATH_ML_NAMESPACE, viewAttachedToContainer, storeCleanupWithContext, signal, createInjectorWithoutInjectorInstances, R3Injector, getNullInjector, internalImportProvidersFrom, initNgDevMode, fillProperties, getBindingsEnabled, lastNodeWasCreated, isInInjectionContext, DestroyRef, PendingTasksInternal, noop, ErrorHandler, assertNotInReactiveContext, assertInInjectionContext, ViewContext, removeLViewOnDestroy, walkUpViews, getNativeByIndex, assertElement, arrayInsert2, arraySplice, setInjectorProfiler, NullInjector, ENVIRONMENT_INITIALIZER, INJECTOR_DEF_TYPES, walkProviderTree, getInjectorDef, deepForEach, isTypeProvider, isSignal, runInInjectionContext, ZONELESS_ENABLED, EffectScheduler, PendingTasks,
|
|
7
|
+
import { attachInjectFlag, _global, ɵɵdefineInjectable as __defineInjectable, ɵɵdefineInjector as __defineInjector, ɵɵinject as __inject, ɵɵinvalidFactoryDep as __invalidFactoryDep, resolveForwardRef, newArray, EMPTY_OBJ, assertString, assertNotEqual, FLAGS, assertEqual, isInCheckNoChangesMode, PREORDER_HOOK_FLAGS, assertFirstCreatePass, assertDefined, throwError, assertNumber, assertGreaterThan, HEADER_OFFSET, DECLARATION_VIEW, NG_FACTORY_DEF, isForwardRef, getFactoryDef, assertIndexInRange, assertTNodeForLView, enterDI, runInInjectorProfilerContext, getCurrentTNode, getLView, emitInjectorToCreateInstanceEvent, emitInstanceCreatedByInjectorEvent, throwProviderNotFoundError, leaveDI, assertNodeInjector, stringifyForError, cyclicDependencyErrorWithDetails, cyclicDependencyError, setInjectorProfilerContext, setInjectImplementation, assertDirectiveDef, NG_ELEMENT_ID, convertToBitFlags, isRootView, T_HOST, TVIEW, injectRootLimpMode, isComponentDef, EMBEDDED_VIEW_INJECTOR, INJECTOR$1 as INJECTOR, DECLARATION_COMPONENT_VIEW, isComponentHost, RuntimeError, NG_PROV_DEF, getClosureSafeProperty, getNativeByTNode, flatten, arrayEquals, ID, isLView, assertDomNode, unwrapRNode, getComponentLViewByIndex, CONTEXT, EMPTY_ARRAY, assertLView, HOST, CHILD_HEAD, NEXT, isLContainer, getLViewParent, Injector, CLEANUP, getComponentDef, getDirectiveDef, InjectionToken, inject, isInSkipHydrationBlock as isInSkipHydrationBlock$1, HYDRATION, isContentQueryHost, setCurrentQueryIndex, XSS_SECURITY_URL, renderStringify, ENVIRONMENT, makeEnvironmentProviders, isDirectiveHost, formatRuntimeError, resetPreOrderHookFlags, PARENT, RENDERER, CHILD_TAIL, assertSame, assertFirstUpdatePass, getSelectedIndex, getTView, assertIndexInDeclRange, setSelectedIndex, assertLContainer, MOVED_VIEWS, isDestroyed, REACTIVE_TEMPLATE_CONSUMER, DECLARATION_LCONTAINER, QUERIES, assertNotReactive, ON_DESTROY_HOOKS, assertFunction, EFFECTS, assertProjectionSlots, NATIVE, ANIMATIONS, assertParentView, CONTAINER_HEADER_OFFSET, assertNotSame, setCurrentDirectiveIndex, setCurrentTNode, getElementDepthCount, increaseElementDepthCount, wasLastNodeCreated, isCurrentTNodeParent, setCurrentTNodeAsNotParent, assertHasParent, INTERNAL_APPLICATION_ERROR_HANDLER, stringify, getCurrentDirectiveIndex, unwrapLView, isCreationMode, enterView, leaveView, AFTER_RENDER_SEQUENCES_TO_ADD, markAncestorsForTraversal, markViewForRefresh, setIsRefreshingViews, isExhaustiveCheckNoChanges, requiresRefreshOrTraversal, setIsInCheckNoChangesMode, CheckNoChangesMode, setBindingIndex, EFFECTS_TO_SCHEDULE, viewAttachedToChangeDetector, setBindingRootForHostBindings, isRefreshingViews, removeFromArray, addToArray, updateAncestorTraversalFlagsOnAttach, storeLViewOnDestroy, VIEW_REFS, assertGreaterThanOrEqual, isInI18nBlock, assertTNodeForTView, getCurrentParentTNode, getCurrentTNodePlaceholderOk, assertTNode, assertTIcu, assertNumberInRange, DEHYDRATED_VIEWS, getNgModuleDef, getPipeDef as getPipeDef$1, getNgModuleDefOrThrow, isStandalone, concatStringsWithSpace, assertInjectImplementationNotEqual, emitInjectEvent, getConstant, assertLessThan, getOrCreateTViewCleanup, getOrCreateLViewCleanup, assertNotDefined, nextBindingIndex, getSelectedTNode, getDirectiveDefOrThrow, getTNode, assertComponentType, debugStringifyTypeForError, ChangeDetectionScheduler, EnvironmentInjector, SVG_NAMESPACE, MATH_ML_NAMESPACE, viewAttachedToContainer, storeCleanupWithContext, signal, createInjectorWithoutInjectorInstances, R3Injector, getNullInjector, internalImportProvidersFrom, initNgDevMode, fillProperties, getBindingsEnabled, lastNodeWasCreated, isInInjectionContext, DestroyRef, PendingTasksInternal, noop, ErrorHandler, assertNotInReactiveContext, assertInInjectionContext, ViewContext, removeLViewOnDestroy, walkUpViews, getNativeByIndex, assertElement, arrayInsert2, arraySplice, setInjectorProfiler, NullInjector, ENVIRONMENT_INITIALIZER, INJECTOR_DEF_TYPES, walkProviderTree, getInjectorDef, deepForEach, isTypeProvider, isSignal, runInInjectionContext, ZONELESS_ENABLED, EffectScheduler, PendingTasks, assertTNodeCreationIndex, isSkipHydrationRootTNode, leaveSkipHydrationBlock, decreaseElementDepthCount, getNamespace, enterSkipHydrationBlock, getCurrentDirectiveDef, assertIndexInExpandoRange, getBindingIndex, assertOneOf, setInI18nBlock, nextContextImpl, getCurrentQueryIndex, getContextLView, load, keyValueArrayIndexOf, keyValueArraySet, keyValueArrayGet, incrementBindingIndex, isWritableSignal, store, providerToFactory, emitProviderConfiguredEvent, isClassProvider, getBindingRoot, NG_COMP_DEF, ɵɵresetView as __resetView, ɵɵnamespaceHTML as __namespaceHTML, ɵɵnamespaceMathML as __namespaceMathML, ɵɵnamespaceSVG as __namespaceSVG, ɵɵenableBindings as __enableBindings, ɵɵdisableBindings as __disableBindings, ɵɵrestoreView as __restoreView, forwardRef, NG_MOD_DEF, NG_INJ_DEF, NG_DIR_DEF, NG_PIPE_DEF, ZONELESS_SCHEDULER_DISABLED, SCHEDULE_IN_ROOT_ZONE, PROVIDED_ZONELESS, getNativeByTNodeOrNull } from './root_effect_scheduler.mjs';
|
|
8
8
|
import { setActiveConsumer, SIGNAL, consumerDestroy, REACTIVE_NODE, consumerPollProducersForChange, consumerBeforeComputation, getActiveConsumer, consumerAfterComputation, createComputed, setThrowInvalidWriteToSignalError } from './signal.mjs';
|
|
9
9
|
import { Subject, Subscription } from 'rxjs';
|
|
10
10
|
import { setActiveConsumer as setActiveConsumer$1 } from '@angular/core/primitives/signals';
|
|
@@ -7209,11 +7209,123 @@ function ensureIcuContainerVisitorLoaded(loader) {
|
|
|
7209
7209
|
}
|
|
7210
7210
|
}
|
|
7211
7211
|
|
|
7212
|
+
/** Parses a CSS time value to milliseconds. */
|
|
7213
|
+
function parseCssTimeUnitsToMs(value) {
|
|
7214
|
+
// Some browsers will return it in seconds, whereas others will return milliseconds.
|
|
7215
|
+
const multiplier = value.toLowerCase().indexOf('ms') > -1 ? 1 : 1000;
|
|
7216
|
+
return parseFloat(value) * multiplier;
|
|
7217
|
+
}
|
|
7218
|
+
/** Parses out multiple values from a computed style into an array. */
|
|
7219
|
+
function parseCssPropertyValue(computedStyle, name) {
|
|
7220
|
+
const value = computedStyle.getPropertyValue(name);
|
|
7221
|
+
return value.split(',').map((part) => part.trim());
|
|
7222
|
+
}
|
|
7223
|
+
/** Gets the transform transition duration, including the delay, of an element in milliseconds. */
|
|
7224
|
+
function getLongestComputedTransition(computedStyle) {
|
|
7225
|
+
const transitionedProperties = parseCssPropertyValue(computedStyle, 'transition-property');
|
|
7226
|
+
const rawDurations = parseCssPropertyValue(computedStyle, 'transition-duration');
|
|
7227
|
+
const rawDelays = parseCssPropertyValue(computedStyle, 'transition-delay');
|
|
7228
|
+
const longest = { propertyName: '', duration: 0, animationName: undefined };
|
|
7229
|
+
for (let i = 0; i < transitionedProperties.length; i++) {
|
|
7230
|
+
const duration = parseCssTimeUnitsToMs(rawDelays[i]) + parseCssTimeUnitsToMs(rawDurations[i]);
|
|
7231
|
+
if (duration > longest.duration) {
|
|
7232
|
+
longest.propertyName = transitionedProperties[i];
|
|
7233
|
+
longest.duration = duration;
|
|
7234
|
+
}
|
|
7235
|
+
}
|
|
7236
|
+
return longest;
|
|
7237
|
+
}
|
|
7238
|
+
function getLongestComputedAnimation(computedStyle) {
|
|
7239
|
+
const rawNames = parseCssPropertyValue(computedStyle, 'animation-name');
|
|
7240
|
+
const rawDelays = parseCssPropertyValue(computedStyle, 'animation-delay');
|
|
7241
|
+
const rawDurations = parseCssPropertyValue(computedStyle, 'animation-duration');
|
|
7242
|
+
const longest = { animationName: '', propertyName: undefined, duration: 0 };
|
|
7243
|
+
for (let i = 0; i < rawNames.length; i++) {
|
|
7244
|
+
const duration = parseCssTimeUnitsToMs(rawDelays[i]) + parseCssTimeUnitsToMs(rawDurations[i]);
|
|
7245
|
+
if (duration > longest.duration) {
|
|
7246
|
+
longest.animationName = rawNames[i];
|
|
7247
|
+
longest.duration = duration;
|
|
7248
|
+
}
|
|
7249
|
+
}
|
|
7250
|
+
return longest;
|
|
7251
|
+
}
|
|
7252
|
+
function isShorterThanExistingAnimation(existing, longest) {
|
|
7253
|
+
return existing !== undefined && existing.duration > longest.duration;
|
|
7254
|
+
}
|
|
7255
|
+
function longestExists(longest) {
|
|
7256
|
+
return ((longest.animationName != undefined || longest.propertyName != undefined) &&
|
|
7257
|
+
longest.duration > 0);
|
|
7258
|
+
}
|
|
7259
|
+
/**
|
|
7260
|
+
* Determines the longest animation, but with `getComputedStyles` instead of `getAnimations`. This
|
|
7261
|
+
* is ultimately safer than getAnimations because it can be used when recalculations are in
|
|
7262
|
+
* progress. `getAnimations()` will be empty in that case.
|
|
7263
|
+
*/
|
|
7264
|
+
function determineLongestAnimationFromComputedStyles(el, animationsMap) {
|
|
7265
|
+
const computedStyle = getComputedStyle(el);
|
|
7266
|
+
const longestAnimation = getLongestComputedAnimation(computedStyle);
|
|
7267
|
+
const longestTransition = getLongestComputedTransition(computedStyle);
|
|
7268
|
+
const longest = longestAnimation.duration > longestTransition.duration ? longestAnimation : longestTransition;
|
|
7269
|
+
if (isShorterThanExistingAnimation(animationsMap.get(el), longest))
|
|
7270
|
+
return;
|
|
7271
|
+
if (longestExists(longest)) {
|
|
7272
|
+
animationsMap.set(el, longest);
|
|
7273
|
+
}
|
|
7274
|
+
}
|
|
7275
|
+
/**
|
|
7276
|
+
* Multiple animations can be set on an element. This grabs an element and
|
|
7277
|
+
* determines which of those will be the longest duration. If we didn't do
|
|
7278
|
+
* this, elements would be removed whenever the first animation completes.
|
|
7279
|
+
* This ensures we get the longest running animation and only remove when
|
|
7280
|
+
* that animation completes.
|
|
7281
|
+
*/
|
|
7282
|
+
function determineLongestAnimation(el, animationsMap, areAnimationSupported) {
|
|
7283
|
+
if (!areAnimationSupported)
|
|
7284
|
+
return;
|
|
7285
|
+
const animations = el.getAnimations();
|
|
7286
|
+
return animations.length === 0
|
|
7287
|
+
? // fallback to computed styles if getAnimations is empty. This would happen if styles are
|
|
7288
|
+
// currently recalculating due to a reflow happening elsewhere.
|
|
7289
|
+
determineLongestAnimationFromComputedStyles(el, animationsMap)
|
|
7290
|
+
: determineLongestAnimationFromElementAnimations(el, animationsMap, animations);
|
|
7291
|
+
}
|
|
7292
|
+
function determineLongestAnimationFromElementAnimations(el, animationsMap, animations) {
|
|
7293
|
+
let longest = {
|
|
7294
|
+
animationName: undefined,
|
|
7295
|
+
propertyName: undefined,
|
|
7296
|
+
duration: 0,
|
|
7297
|
+
};
|
|
7298
|
+
for (const animation of animations) {
|
|
7299
|
+
const timing = animation.effect?.getTiming();
|
|
7300
|
+
// duration can be a string 'auto' or a number.
|
|
7301
|
+
const animDuration = typeof timing?.duration === 'number' ? timing.duration : 0;
|
|
7302
|
+
let duration = (timing?.delay ?? 0) + animDuration;
|
|
7303
|
+
let propertyName;
|
|
7304
|
+
let animationName;
|
|
7305
|
+
if (animation.animationName) {
|
|
7306
|
+
animationName = animation.animationName;
|
|
7307
|
+
}
|
|
7308
|
+
else {
|
|
7309
|
+
// Check for CSSTransition specific property
|
|
7310
|
+
propertyName = animation.transitionProperty;
|
|
7311
|
+
}
|
|
7312
|
+
if (duration >= longest.duration) {
|
|
7313
|
+
longest = { animationName, propertyName, duration };
|
|
7314
|
+
}
|
|
7315
|
+
}
|
|
7316
|
+
if (isShorterThanExistingAnimation(animationsMap.get(el), longest))
|
|
7317
|
+
return;
|
|
7318
|
+
if (longestExists(longest)) {
|
|
7319
|
+
animationsMap.set(el, longest);
|
|
7320
|
+
}
|
|
7321
|
+
}
|
|
7322
|
+
const allLeavingAnimations = new Set();
|
|
7323
|
+
|
|
7212
7324
|
/**
|
|
7213
7325
|
* NOTE: for performance reasons, the possible actions are inlined within the function instead of
|
|
7214
7326
|
* being passed as an argument.
|
|
7215
7327
|
*/
|
|
7216
|
-
function applyToElementOrContainer(action, renderer, parent, lNodeToHandle, beforeNode) {
|
|
7328
|
+
function applyToElementOrContainer(action, renderer, parent, lNodeToHandle, beforeNode, parentLView) {
|
|
7217
7329
|
// If this slot was allocated for a text node dynamically created by i18n, the text node itself
|
|
7218
7330
|
// won't be created until i18nApply() in the update block, so this node should be skipped.
|
|
7219
7331
|
// For more info, see "ICU expressions should work inside an ngTemplateOutlet inside an ngFor"
|
|
@@ -7245,10 +7357,14 @@ function applyToElementOrContainer(action, renderer, parent, lNodeToHandle, befo
|
|
|
7245
7357
|
nativeInsertBefore(renderer, parent, rNode, beforeNode || null, true);
|
|
7246
7358
|
}
|
|
7247
7359
|
else if (action === 2 /* WalkTNodeTreeAction.Detach */) {
|
|
7248
|
-
|
|
7360
|
+
runLeaveAnimationsWithCallback(parentLView, () => {
|
|
7361
|
+
nativeRemoveNode(renderer, rNode, isComponent);
|
|
7362
|
+
});
|
|
7249
7363
|
}
|
|
7250
7364
|
else if (action === 3 /* WalkTNodeTreeAction.Destroy */) {
|
|
7251
|
-
|
|
7365
|
+
runLeaveAnimationsWithCallback(parentLView, () => {
|
|
7366
|
+
renderer.destroyNode(rNode);
|
|
7367
|
+
});
|
|
7252
7368
|
}
|
|
7253
7369
|
if (lContainer != null) {
|
|
7254
7370
|
applyContainer(renderer, action, lContainer, parent, beforeNode);
|
|
@@ -7428,6 +7544,37 @@ function cleanUpView(tView, lView) {
|
|
|
7428
7544
|
setActiveConsumer(prevConsumer);
|
|
7429
7545
|
}
|
|
7430
7546
|
}
|
|
7547
|
+
function runLeaveAnimationsWithCallback(lView, callback) {
|
|
7548
|
+
if (lView && lView[ANIMATIONS] && lView[ANIMATIONS].leave) {
|
|
7549
|
+
if (lView[ANIMATIONS].skipLeaveAnimations) {
|
|
7550
|
+
lView[ANIMATIONS].skipLeaveAnimations = false;
|
|
7551
|
+
}
|
|
7552
|
+
else {
|
|
7553
|
+
const leaveAnimations = lView[ANIMATIONS].leave;
|
|
7554
|
+
const runningAnimations = [];
|
|
7555
|
+
for (let index = 0; index < leaveAnimations.length; index++) {
|
|
7556
|
+
const animateFn = leaveAnimations[index];
|
|
7557
|
+
runningAnimations.push(animateFn());
|
|
7558
|
+
}
|
|
7559
|
+
lView[ANIMATIONS].running = Promise.allSettled(runningAnimations);
|
|
7560
|
+
lView[ANIMATIONS].leave = undefined;
|
|
7561
|
+
}
|
|
7562
|
+
}
|
|
7563
|
+
runAfterLeaveAnimations(lView, callback);
|
|
7564
|
+
}
|
|
7565
|
+
function runAfterLeaveAnimations(lView, callback) {
|
|
7566
|
+
if (lView && lView[ANIMATIONS] && lView[ANIMATIONS].running) {
|
|
7567
|
+
lView[ANIMATIONS].running.then(() => {
|
|
7568
|
+
if (lView[ANIMATIONS] && lView[ANIMATIONS].running) {
|
|
7569
|
+
lView[ANIMATIONS].running = undefined;
|
|
7570
|
+
}
|
|
7571
|
+
allLeavingAnimations.delete(lView);
|
|
7572
|
+
callback();
|
|
7573
|
+
});
|
|
7574
|
+
return;
|
|
7575
|
+
}
|
|
7576
|
+
callback();
|
|
7577
|
+
}
|
|
7431
7578
|
/** Removes listeners and unsubscribes from output subscriptions */
|
|
7432
7579
|
function processCleanups(tView, lView) {
|
|
7433
7580
|
ngDevMode && assertNotReactive(processCleanups.name);
|
|
@@ -7765,22 +7912,22 @@ function applyNodes(renderer, action, tNode, lView, parentRElement, beforeNode,
|
|
|
7765
7912
|
if (!isDetachedByI18n(tNode)) {
|
|
7766
7913
|
if (tNodeType & 8 /* TNodeType.ElementContainer */) {
|
|
7767
7914
|
applyNodes(renderer, action, tNode.child, lView, parentRElement, beforeNode, false);
|
|
7768
|
-
applyToElementOrContainer(action, renderer, parentRElement, rawSlotValue, beforeNode);
|
|
7915
|
+
applyToElementOrContainer(action, renderer, parentRElement, rawSlotValue, beforeNode, lView);
|
|
7769
7916
|
}
|
|
7770
7917
|
else if (tNodeType & 32 /* TNodeType.Icu */) {
|
|
7771
7918
|
const nextRNode = icuContainerIterate(tNode, lView);
|
|
7772
7919
|
let rNode;
|
|
7773
7920
|
while ((rNode = nextRNode())) {
|
|
7774
|
-
applyToElementOrContainer(action, renderer, parentRElement, rNode, beforeNode);
|
|
7921
|
+
applyToElementOrContainer(action, renderer, parentRElement, rNode, beforeNode, lView);
|
|
7775
7922
|
}
|
|
7776
|
-
applyToElementOrContainer(action, renderer, parentRElement, rawSlotValue, beforeNode);
|
|
7923
|
+
applyToElementOrContainer(action, renderer, parentRElement, rawSlotValue, beforeNode, lView);
|
|
7777
7924
|
}
|
|
7778
7925
|
else if (tNodeType & 16 /* TNodeType.Projection */) {
|
|
7779
7926
|
applyProjectionRecursive(renderer, action, lView, tNode, parentRElement, beforeNode);
|
|
7780
7927
|
}
|
|
7781
7928
|
else {
|
|
7782
7929
|
ngDevMode && assertTNodeType(tNode, 3 /* TNodeType.AnyRNode */ | 4 /* TNodeType.Container */);
|
|
7783
|
-
applyToElementOrContainer(action, renderer, parentRElement, rawSlotValue, beforeNode);
|
|
7930
|
+
applyToElementOrContainer(action, renderer, parentRElement, rawSlotValue, beforeNode, lView);
|
|
7784
7931
|
}
|
|
7785
7932
|
}
|
|
7786
7933
|
tNode = isProjection ? tNode.projectionNext : tNode.next;
|
|
@@ -7834,7 +7981,7 @@ function applyProjectionRecursive(renderer, action, lView, tProjectionNode, pare
|
|
|
7834
7981
|
// This should be refactored and cleaned up.
|
|
7835
7982
|
for (let i = 0; i < nodeToProjectOrRNodes.length; i++) {
|
|
7836
7983
|
const rNode = nodeToProjectOrRNodes[i];
|
|
7837
|
-
applyToElementOrContainer(action, renderer, parentRElement, rNode, beforeNode);
|
|
7984
|
+
applyToElementOrContainer(action, renderer, parentRElement, rNode, beforeNode, lView);
|
|
7838
7985
|
}
|
|
7839
7986
|
}
|
|
7840
7987
|
else {
|
|
@@ -8974,6 +9121,7 @@ function refreshView(tView, lView, templateFn, context) {
|
|
|
8974
9121
|
if (templateFn !== null) {
|
|
8975
9122
|
executeTemplate(tView, lView, templateFn, 2 /* RenderFlags.Update */, context);
|
|
8976
9123
|
}
|
|
9124
|
+
runEnterAnimations(lView);
|
|
8977
9125
|
const hooksInitPhaseCompleted = (flags & 3 /* LViewFlags.InitPhaseStateMask */) === 3 /* InitPhaseState.InitPhaseCompleted */;
|
|
8978
9126
|
// execute pre-order hooks (OnInit, OnChanges, DoCheck)
|
|
8979
9127
|
// PERF WARNING: do NOT extract this to a separate function without running benchmarks
|
|
@@ -9101,6 +9249,15 @@ function refreshView(tView, lView, templateFn, context) {
|
|
|
9101
9249
|
leaveView();
|
|
9102
9250
|
}
|
|
9103
9251
|
}
|
|
9252
|
+
function runEnterAnimations(lView) {
|
|
9253
|
+
const animationData = lView[ANIMATIONS];
|
|
9254
|
+
if (animationData?.enter) {
|
|
9255
|
+
for (const animateFn of animationData.enter) {
|
|
9256
|
+
animateFn();
|
|
9257
|
+
}
|
|
9258
|
+
animationData.enter = undefined;
|
|
9259
|
+
}
|
|
9260
|
+
}
|
|
9104
9261
|
/**
|
|
9105
9262
|
* Goes over embedded views (ones created through ViewContainerRef APIs) and refreshes
|
|
9106
9263
|
* them by executing an associated template function.
|
|
@@ -9740,15 +9897,20 @@ class ViewRef {
|
|
|
9740
9897
|
* introduce other changes.
|
|
9741
9898
|
*/
|
|
9742
9899
|
checkNoChanges() {
|
|
9743
|
-
if (
|
|
9744
|
-
|
|
9745
|
-
|
|
9746
|
-
|
|
9747
|
-
|
|
9748
|
-
|
|
9749
|
-
|
|
9900
|
+
// Note: we use `if (ngDevMode) { ... }` instead of an early return.
|
|
9901
|
+
// ESBuild is conservative about removing dead code that follows `return;`
|
|
9902
|
+
// inside a function body, so the block may remain in the bundle.
|
|
9903
|
+
// Using a conditional ensures the dev-only logic is reliably tree-shaken
|
|
9904
|
+
// in production builds.
|
|
9905
|
+
if (ngDevMode) {
|
|
9906
|
+
try {
|
|
9907
|
+
this.exhaustive ??= this._lView[INJECTOR].get(UseExhaustiveCheckNoChanges, USE_EXHAUSTIVE_CHECK_NO_CHANGES_DEFAULT);
|
|
9908
|
+
}
|
|
9909
|
+
catch {
|
|
9910
|
+
this.exhaustive = USE_EXHAUSTIVE_CHECK_NO_CHANGES_DEFAULT;
|
|
9911
|
+
}
|
|
9912
|
+
checkNoChangesInternal(this._lView, this.exhaustive);
|
|
9750
9913
|
}
|
|
9751
|
-
checkNoChangesInternal(this._lView, this.exhaustive);
|
|
9752
9914
|
}
|
|
9753
9915
|
attachToViewContainerRef() {
|
|
9754
9916
|
if (this._appRef) {
|
|
@@ -13053,13 +13215,21 @@ function listenToDomEvent(tNode, tView, lView, eventTargetResolver, renderer, ev
|
|
|
13053
13215
|
const target = eventTargetResolver ? eventTargetResolver(native) : native;
|
|
13054
13216
|
stashEventListenerImpl(lView, target, eventName, wrappedListener);
|
|
13055
13217
|
const cleanupFn = renderer.listen(target, eventName, wrappedListener);
|
|
13056
|
-
|
|
13057
|
-
|
|
13058
|
-
|
|
13059
|
-
|
|
13218
|
+
// We skip cleaning up animation event types to ensure leaving animation events can be used.
|
|
13219
|
+
// These events should be automatically garbage collected anyway after the element is
|
|
13220
|
+
// removed from the DOM.
|
|
13221
|
+
if (!isAnimationEventType(eventName)) {
|
|
13222
|
+
const idxOrTargetGetter = eventTargetResolver
|
|
13223
|
+
? (_lView) => eventTargetResolver(unwrapRNode(_lView[tNode.index]))
|
|
13224
|
+
: tNode.index;
|
|
13225
|
+
storeListenerCleanup(idxOrTargetGetter, tView, lView, eventName, wrappedListener, cleanupFn, false);
|
|
13226
|
+
}
|
|
13060
13227
|
}
|
|
13061
13228
|
return hasCoalesced;
|
|
13062
13229
|
}
|
|
13230
|
+
function isAnimationEventType(eventName) {
|
|
13231
|
+
return eventName.startsWith('animation') || eventName.startsWith('transition');
|
|
13232
|
+
}
|
|
13063
13233
|
/**
|
|
13064
13234
|
* A utility function that checks if a given element has already an event handler registered for an
|
|
13065
13235
|
* event with a specified name. The TView.cleanup data structure is used to find out which events
|
|
@@ -13521,7 +13691,7 @@ class ComponentFactory extends ComponentFactory$1 {
|
|
|
13521
13691
|
}
|
|
13522
13692
|
function createRootTView(rootSelectorOrNode, componentDef, componentBindings, directives) {
|
|
13523
13693
|
const tAttributes = rootSelectorOrNode
|
|
13524
|
-
? ['ng-version', '20.3.
|
|
13694
|
+
? ['ng-version', '20.3.1']
|
|
13525
13695
|
: // Extract attributes and classes from the first selector only to match VE behavior.
|
|
13526
13696
|
extractAttrsAndClassesFromSelector(componentDef.selectors[0]);
|
|
13527
13697
|
let creationBindings = null;
|
|
@@ -20528,6 +20698,22 @@ function remove(list, el) {
|
|
|
20528
20698
|
}
|
|
20529
20699
|
}
|
|
20530
20700
|
|
|
20701
|
+
/**
|
|
20702
|
+
* Replace with `Promise.withResolvers()` once it's available.
|
|
20703
|
+
* NET September 2026
|
|
20704
|
+
*
|
|
20705
|
+
* See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/withResolvers.
|
|
20706
|
+
*/
|
|
20707
|
+
function promiseWithResolvers() {
|
|
20708
|
+
let resolve;
|
|
20709
|
+
let reject;
|
|
20710
|
+
const promise = new Promise((res, rej) => {
|
|
20711
|
+
resolve = res;
|
|
20712
|
+
reject = rej;
|
|
20713
|
+
});
|
|
20714
|
+
return { promise, resolve, reject };
|
|
20715
|
+
}
|
|
20716
|
+
|
|
20531
20717
|
/**
|
|
20532
20718
|
* Schedules triggering of a defer block for `on idle` and `on timer` conditions.
|
|
20533
20719
|
*/
|
|
@@ -20897,7 +21083,7 @@ function cleanupRemainingHydrationQueue(hydrationQueue, dehydratedBlockRegistry)
|
|
|
20897
21083
|
*/
|
|
20898
21084
|
function populateHydratingStateForQueue(registry, queue) {
|
|
20899
21085
|
for (let blockId of queue) {
|
|
20900
|
-
registry.hydrating.set(blockId,
|
|
21086
|
+
registry.hydrating.set(blockId, promiseWithResolvers());
|
|
20901
21087
|
}
|
|
20902
21088
|
}
|
|
20903
21089
|
// Waits for the next render cycle to complete
|
|
@@ -21745,278 +21931,88 @@ const MAX_ANIMATION_TIMEOUT = new InjectionToken(typeof ngDevMode !== 'undefined
|
|
|
21745
21931
|
});
|
|
21746
21932
|
const MAX_ANIMATION_TIMEOUT_DEFAULT = 4000;
|
|
21747
21933
|
|
|
21934
|
+
const DEFAULT_ANIMATIONS_DISABLED = false;
|
|
21935
|
+
const areAnimationSupported = (typeof ngServerMode === 'undefined' || !ngServerMode) &&
|
|
21936
|
+
typeof document !== 'undefined' &&
|
|
21937
|
+
// tslint:disable-next-line:no-toplevel-property-access
|
|
21938
|
+
typeof document?.documentElement?.getAnimations === 'function';
|
|
21748
21939
|
/**
|
|
21749
|
-
*
|
|
21750
|
-
|
|
21751
|
-
|
|
21752
|
-
|
|
21753
|
-
|
|
21754
|
-
|
|
21755
|
-
|
|
21756
|
-
|
|
21757
|
-
|
|
21758
|
-
|
|
21759
|
-
|
|
21760
|
-
|
|
21761
|
-
/** Used when animate.leave is only applying classes */
|
|
21762
|
-
trackClasses(details, classes) {
|
|
21763
|
-
const classList = getClassListFromValue(classes);
|
|
21764
|
-
if (!classList)
|
|
21765
|
-
return;
|
|
21766
|
-
for (let klass of classList) {
|
|
21767
|
-
details.classes?.add(klass);
|
|
21768
|
-
}
|
|
21940
|
+
* Helper function to check if animations are disabled via injection token
|
|
21941
|
+
*/
|
|
21942
|
+
function areAnimationsDisabled(lView) {
|
|
21943
|
+
const injector = lView[INJECTOR];
|
|
21944
|
+
return injector.get(ANIMATIONS_DISABLED, DEFAULT_ANIMATIONS_DISABLED);
|
|
21945
|
+
}
|
|
21946
|
+
/**
|
|
21947
|
+
* Asserts a value passed in is actually an animation type and not something else
|
|
21948
|
+
*/
|
|
21949
|
+
function assertAnimationTypes(value, instruction) {
|
|
21950
|
+
if (value == null || (typeof value !== 'string' && typeof value !== 'function')) {
|
|
21951
|
+
throw new RuntimeError(650 /* RuntimeErrorCode.ANIMATE_INVALID_VALUE */, `'${instruction}' value must be a string of CSS classes or an animation function, got ${stringify(value)}`);
|
|
21769
21952
|
}
|
|
21770
|
-
|
|
21771
|
-
|
|
21772
|
-
|
|
21773
|
-
|
|
21774
|
-
|
|
21775
|
-
|
|
21776
|
-
|
|
21777
|
-
details.classFns = [resolver];
|
|
21778
|
-
}
|
|
21779
|
-
else {
|
|
21780
|
-
details.classFns.push(resolver);
|
|
21781
|
-
}
|
|
21953
|
+
}
|
|
21954
|
+
/**
|
|
21955
|
+
* Asserts a given native element is an actual Element node and not something like a comment node.
|
|
21956
|
+
*/
|
|
21957
|
+
function assertElementNodes(nativeElement, instruction) {
|
|
21958
|
+
if (nativeElement.nodeType !== Node.ELEMENT_NODE) {
|
|
21959
|
+
throw new RuntimeError(650 /* RuntimeErrorCode.ANIMATE_INVALID_VALUE */, `'${instruction}' can only be used on an element node, got ${stringify(nativeElement.nodeType)}`);
|
|
21782
21960
|
}
|
|
21783
|
-
|
|
21784
|
-
|
|
21785
|
-
|
|
21786
|
-
|
|
21787
|
-
|
|
21788
|
-
|
|
21789
|
-
|
|
21790
|
-
|
|
21791
|
-
|
|
21792
|
-
|
|
21793
|
-
|
|
21794
|
-
|
|
21795
|
-
/** Used when `animate.leave` is using classes. */
|
|
21796
|
-
add(el, value, animateWrapperFn) {
|
|
21797
|
-
const details = this.outElements.get(el) ?? {
|
|
21798
|
-
classes: new Set(),
|
|
21799
|
-
animateFn: () => { },
|
|
21800
|
-
isEventBinding: false,
|
|
21801
|
-
};
|
|
21802
|
-
if (typeof value === 'function') {
|
|
21803
|
-
this.trackResolver(details, value);
|
|
21961
|
+
}
|
|
21962
|
+
/**
|
|
21963
|
+
* trackEnterClasses is necessary in the case of composition where animate.enter
|
|
21964
|
+
* is used on the same element in multiple places, like on the element and in a
|
|
21965
|
+
* host binding. When removing classes, we need the entire list of animation classes
|
|
21966
|
+
* added to properly remove them when the longest animation fires.
|
|
21967
|
+
*/
|
|
21968
|
+
function trackEnterClasses(el, classList, cleanupFns) {
|
|
21969
|
+
const elementData = enterClassMap.get(el);
|
|
21970
|
+
if (elementData) {
|
|
21971
|
+
for (const klass of classList) {
|
|
21972
|
+
elementData.classList.push(klass);
|
|
21804
21973
|
}
|
|
21805
|
-
|
|
21806
|
-
|
|
21974
|
+
for (const fn of cleanupFns) {
|
|
21975
|
+
elementData.cleanupFns.push(fn);
|
|
21807
21976
|
}
|
|
21808
|
-
details.animateFn = animateWrapperFn(el, details.classes, details.classFns);
|
|
21809
|
-
this.outElements.set(el, details);
|
|
21810
21977
|
}
|
|
21811
|
-
|
|
21812
|
-
|
|
21978
|
+
else {
|
|
21979
|
+
enterClassMap.set(el, { classList, cleanupFns });
|
|
21813
21980
|
}
|
|
21814
|
-
|
|
21815
|
-
|
|
21816
|
-
|
|
21817
|
-
|
|
21818
|
-
|
|
21819
|
-
|
|
21820
|
-
|
|
21821
|
-
const
|
|
21822
|
-
|
|
21823
|
-
let called = false;
|
|
21824
|
-
const remove = () => {
|
|
21825
|
-
// This called check is to prevent a rare race condition where the timing of removal
|
|
21826
|
-
// might result in the removal function being called twice.
|
|
21827
|
-
if (called)
|
|
21828
|
-
return;
|
|
21829
|
-
called = true;
|
|
21830
|
-
clearTimeout(timeoutId);
|
|
21831
|
-
this.remove(el);
|
|
21832
|
-
removeFn();
|
|
21833
|
-
};
|
|
21834
|
-
// this timeout is used to ensure elements actually get removed in the case
|
|
21835
|
-
// that the user forgot to call the remove callback. The timeout is cleared
|
|
21836
|
-
// in the DOM renderer during the remove child process. It only applies
|
|
21837
|
-
// to the event binding use case.
|
|
21838
|
-
if (details.isEventBinding) {
|
|
21839
|
-
timeoutId = setTimeout(remove, maxAnimationTimeout);
|
|
21981
|
+
}
|
|
21982
|
+
/**
|
|
21983
|
+
* Helper function to cleanup enterClassMap data safely
|
|
21984
|
+
*/
|
|
21985
|
+
function cleanupEnterClassData(element) {
|
|
21986
|
+
const elementData = enterClassMap.get(element);
|
|
21987
|
+
if (elementData) {
|
|
21988
|
+
for (const fn of elementData.cleanupFns) {
|
|
21989
|
+
fn();
|
|
21840
21990
|
}
|
|
21841
|
-
|
|
21991
|
+
enterClassMap.delete(element);
|
|
21842
21992
|
}
|
|
21993
|
+
longestAnimations.delete(element);
|
|
21843
21994
|
}
|
|
21844
|
-
|
|
21845
|
-
|
|
21846
|
-
|
|
21847
|
-
|
|
21848
|
-
|
|
21849
|
-
|
|
21850
|
-
|
|
21851
|
-
|
|
21852
|
-
|
|
21853
|
-
|
|
21854
|
-
|
|
21855
|
-
|
|
21856
|
-
|
|
21857
|
-
|
|
21858
|
-
|
|
21859
|
-
|
|
21860
|
-
|
|
21861
|
-
|
|
21862
|
-
|
|
21863
|
-
|
|
21864
|
-
|
|
21865
|
-
return value.split(',').map((part) => part.trim());
|
|
21866
|
-
}
|
|
21867
|
-
/** Gets the transform transition duration, including the delay, of an element in milliseconds. */
|
|
21868
|
-
function getLongestComputedTransition(computedStyle) {
|
|
21869
|
-
const transitionedProperties = parseCssPropertyValue(computedStyle, 'transition-property');
|
|
21870
|
-
const rawDurations = parseCssPropertyValue(computedStyle, 'transition-duration');
|
|
21871
|
-
const rawDelays = parseCssPropertyValue(computedStyle, 'transition-delay');
|
|
21872
|
-
const longest = { propertyName: '', duration: 0, animationName: undefined };
|
|
21873
|
-
for (let i = 0; i < transitionedProperties.length; i++) {
|
|
21874
|
-
const duration = parseCssTimeUnitsToMs(rawDelays[i]) + parseCssTimeUnitsToMs(rawDurations[i]);
|
|
21875
|
-
if (duration > longest.duration) {
|
|
21876
|
-
longest.propertyName = transitionedProperties[i];
|
|
21877
|
-
longest.duration = duration;
|
|
21878
|
-
}
|
|
21879
|
-
}
|
|
21880
|
-
return longest;
|
|
21881
|
-
}
|
|
21882
|
-
function getLongestComputedAnimation(computedStyle) {
|
|
21883
|
-
const rawNames = parseCssPropertyValue(computedStyle, 'animation-name');
|
|
21884
|
-
const rawDelays = parseCssPropertyValue(computedStyle, 'animation-delay');
|
|
21885
|
-
const rawDurations = parseCssPropertyValue(computedStyle, 'animation-duration');
|
|
21886
|
-
const longest = { animationName: '', propertyName: undefined, duration: 0 };
|
|
21887
|
-
for (let i = 0; i < rawNames.length; i++) {
|
|
21888
|
-
const duration = parseCssTimeUnitsToMs(rawDelays[i]) + parseCssTimeUnitsToMs(rawDurations[i]);
|
|
21889
|
-
if (duration > longest.duration) {
|
|
21890
|
-
longest.animationName = rawNames[i];
|
|
21891
|
-
longest.duration = duration;
|
|
21892
|
-
}
|
|
21893
|
-
}
|
|
21894
|
-
return longest;
|
|
21895
|
-
}
|
|
21896
|
-
function isShorterThanExistingAnimation(existing, longest) {
|
|
21897
|
-
return existing !== undefined && existing.duration > longest.duration;
|
|
21898
|
-
}
|
|
21899
|
-
function longestExists(longest) {
|
|
21900
|
-
return ((longest.animationName != undefined || longest.propertyName != undefined) &&
|
|
21901
|
-
longest.duration > 0);
|
|
21902
|
-
}
|
|
21903
|
-
/**
|
|
21904
|
-
* Determines the longest animation, but with `getComputedStyles` instead of `getAnimations`. This
|
|
21905
|
-
* is ultimately safer than getAnimations because it can be used when recalculations are in
|
|
21906
|
-
* progress. `getAnimations()` will be empty in that case.
|
|
21907
|
-
*/
|
|
21908
|
-
function determineLongestAnimationFromComputedStyles(el, animationsMap) {
|
|
21909
|
-
const computedStyle = getComputedStyle(el);
|
|
21910
|
-
const longestAnimation = getLongestComputedAnimation(computedStyle);
|
|
21911
|
-
const longestTransition = getLongestComputedTransition(computedStyle);
|
|
21912
|
-
const longest = longestAnimation.duration > longestTransition.duration ? longestAnimation : longestTransition;
|
|
21913
|
-
if (isShorterThanExistingAnimation(animationsMap.get(el), longest))
|
|
21914
|
-
return;
|
|
21915
|
-
if (longestExists(longest)) {
|
|
21916
|
-
animationsMap.set(el, longest);
|
|
21917
|
-
}
|
|
21918
|
-
}
|
|
21919
|
-
/**
|
|
21920
|
-
* Multiple animations can be set on an element. This grabs an element and
|
|
21921
|
-
* determines which of those will be the longest duration. If we didn't do
|
|
21922
|
-
* this, elements would be removed whenever the first animation completes.
|
|
21923
|
-
* This ensures we get the longest running animation and only remove when
|
|
21924
|
-
* that animation completes.
|
|
21925
|
-
*/
|
|
21926
|
-
function determineLongestAnimation(el, animationsMap, areAnimationSupported) {
|
|
21927
|
-
if (!areAnimationSupported)
|
|
21928
|
-
return;
|
|
21929
|
-
const animations = el.getAnimations();
|
|
21930
|
-
return animations.length === 0
|
|
21931
|
-
? // fallback to computed styles if getAnimations is empty. This would happen if styles are
|
|
21932
|
-
// currently recalculating due to a reflow happening elsewhere.
|
|
21933
|
-
determineLongestAnimationFromComputedStyles(el, animationsMap)
|
|
21934
|
-
: determineLongestAnimationFromElementAnimations(el, animationsMap, animations);
|
|
21935
|
-
}
|
|
21936
|
-
function determineLongestAnimationFromElementAnimations(el, animationsMap, animations) {
|
|
21937
|
-
let longest = {
|
|
21938
|
-
animationName: undefined,
|
|
21939
|
-
propertyName: undefined,
|
|
21940
|
-
duration: 0,
|
|
21941
|
-
};
|
|
21942
|
-
for (const animation of animations) {
|
|
21943
|
-
const timing = animation.effect?.getTiming();
|
|
21944
|
-
// duration can be a string 'auto' or a number.
|
|
21945
|
-
const animDuration = typeof timing?.duration === 'number' ? timing.duration : 0;
|
|
21946
|
-
let duration = (timing?.delay ?? 0) + animDuration;
|
|
21947
|
-
let propertyName;
|
|
21948
|
-
let animationName;
|
|
21949
|
-
if (animation.animationName) {
|
|
21950
|
-
animationName = animation.animationName;
|
|
21951
|
-
}
|
|
21952
|
-
else {
|
|
21953
|
-
// Check for CSSTransition specific property
|
|
21954
|
-
propertyName = animation.transitionProperty;
|
|
21955
|
-
}
|
|
21956
|
-
if (duration >= longest.duration) {
|
|
21957
|
-
longest = { animationName, propertyName, duration };
|
|
21958
|
-
}
|
|
21959
|
-
}
|
|
21960
|
-
if (isShorterThanExistingAnimation(animationsMap.get(el), longest))
|
|
21961
|
-
return;
|
|
21962
|
-
if (longestExists(longest)) {
|
|
21963
|
-
animationsMap.set(el, longest);
|
|
21964
|
-
}
|
|
21965
|
-
}
|
|
21966
|
-
|
|
21967
|
-
const DEFAULT_ANIMATIONS_DISABLED = false;
|
|
21968
|
-
const areAnimationSupported = (typeof ngServerMode === 'undefined' || !ngServerMode) &&
|
|
21969
|
-
typeof document !== 'undefined' &&
|
|
21970
|
-
// tslint:disable-next-line:no-toplevel-property-access
|
|
21971
|
-
typeof document?.documentElement?.getAnimations === 'function';
|
|
21972
|
-
/**
|
|
21973
|
-
* Helper function to check if animations are disabled via injection token
|
|
21974
|
-
*/
|
|
21975
|
-
function areAnimationsDisabled(lView) {
|
|
21976
|
-
const injector = lView[INJECTOR];
|
|
21977
|
-
return injector.get(ANIMATIONS_DISABLED, DEFAULT_ANIMATIONS_DISABLED);
|
|
21978
|
-
}
|
|
21979
|
-
/**
|
|
21980
|
-
* Helper function to setup element registry cleanup when LView is destroyed
|
|
21981
|
-
*/
|
|
21982
|
-
function setupElementRegistryCleanup(elementRegistry, lView, tView, nativeElement) {
|
|
21983
|
-
if (lView[FLAGS] & 8 /* LViewFlags.FirstLViewPass */) {
|
|
21984
|
-
storeCleanupWithContext(tView, lView, nativeElement, (elToClean) => {
|
|
21985
|
-
elementRegistry.elements.remove(elToClean);
|
|
21986
|
-
});
|
|
21987
|
-
}
|
|
21988
|
-
}
|
|
21989
|
-
/**
|
|
21990
|
-
* Helper function to cleanup enterClassMap data safely
|
|
21991
|
-
*/
|
|
21992
|
-
function cleanupEnterClassData(element) {
|
|
21993
|
-
const elementData = enterClassMap.get(element);
|
|
21994
|
-
if (elementData) {
|
|
21995
|
-
for (const fn of elementData.cleanupFns) {
|
|
21996
|
-
fn();
|
|
21997
|
-
}
|
|
21998
|
-
enterClassMap.delete(element);
|
|
21999
|
-
}
|
|
22000
|
-
longestAnimations.delete(element);
|
|
22001
|
-
}
|
|
22002
|
-
const noOpAnimationComplete = () => { };
|
|
22003
|
-
// Tracks the list of classes added to a DOM node from `animate.enter` calls to ensure
|
|
22004
|
-
// we remove all of the classes in the case of animation composition via host bindings.
|
|
22005
|
-
const enterClassMap = new WeakMap();
|
|
22006
|
-
const longestAnimations = new WeakMap();
|
|
22007
|
-
// Tracks nodes that are animating away for the duration of the animation. This is
|
|
22008
|
-
// used to prevent duplicate nodes from showing up when nodes have been toggled quickly
|
|
22009
|
-
// from an `@if` or `@for`.
|
|
22010
|
-
const leavingNodes = new WeakMap();
|
|
22011
|
-
function clearLeavingNodes(tNode, el) {
|
|
22012
|
-
const nodes = leavingNodes.get(tNode);
|
|
22013
|
-
if (nodes && nodes.length > 0) {
|
|
22014
|
-
const ix = nodes.findIndex((node) => node === el);
|
|
22015
|
-
if (ix > -1)
|
|
22016
|
-
nodes.splice(ix, 1);
|
|
22017
|
-
}
|
|
22018
|
-
if (nodes?.length === 0) {
|
|
22019
|
-
leavingNodes.delete(tNode);
|
|
21995
|
+
const noOpAnimationComplete = () => { };
|
|
21996
|
+
// Tracks the list of classes added to a DOM node from `animate.enter` calls to ensure
|
|
21997
|
+
// we remove all of the classes in the case of animation composition via host bindings.
|
|
21998
|
+
const enterClassMap = new WeakMap();
|
|
21999
|
+
const longestAnimations = new WeakMap();
|
|
22000
|
+
// Tracks nodes that are animating away for the duration of the animation. This is
|
|
22001
|
+
// used to prevent duplicate nodes from showing up when nodes have been toggled quickly
|
|
22002
|
+
// from an `@if` or `@for`.
|
|
22003
|
+
const leavingNodes = new WeakMap();
|
|
22004
|
+
/**
|
|
22005
|
+
* This actually removes the leaving HTML Element in the TNode
|
|
22006
|
+
*/
|
|
22007
|
+
function clearLeavingNodes(tNode, el) {
|
|
22008
|
+
const nodes = leavingNodes.get(tNode);
|
|
22009
|
+
if (nodes && nodes.length > 0) {
|
|
22010
|
+
const ix = nodes.findIndex((node) => node === el);
|
|
22011
|
+
if (ix > -1)
|
|
22012
|
+
nodes.splice(ix, 1);
|
|
22013
|
+
}
|
|
22014
|
+
if (nodes?.length === 0) {
|
|
22015
|
+
leavingNodes.delete(tNode);
|
|
22020
22016
|
}
|
|
22021
22017
|
}
|
|
22022
22018
|
/**
|
|
@@ -22031,7 +22027,9 @@ function cancelLeavingNodes(tNode, lView) {
|
|
|
22031
22027
|
// this is the insertion point for the new TNode element.
|
|
22032
22028
|
// it will be inserted before the declaring containers anchor.
|
|
22033
22029
|
const beforeNode = getBeforeNodeForView(tNode.index, lContainer);
|
|
22034
|
-
// here we need to check the previous sibling of that anchor
|
|
22030
|
+
// here we need to check the previous sibling of that anchor. The first
|
|
22031
|
+
// previousSibling node will be the new element added. The second
|
|
22032
|
+
// previousSibling will be the one that's being removed.
|
|
22035
22033
|
const previousNode = beforeNode?.previousSibling;
|
|
22036
22034
|
// We really only want to cancel animations if the leaving node is the
|
|
22037
22035
|
// same as the node before where the new node will be inserted. This is
|
|
@@ -22041,6 +22039,11 @@ function cancelLeavingNodes(tNode, lView) {
|
|
|
22041
22039
|
}
|
|
22042
22040
|
}
|
|
22043
22041
|
}
|
|
22042
|
+
/**
|
|
22043
|
+
* Tracks the nodes list of nodes that are leaving the DOM so we can cancel any leave animations
|
|
22044
|
+
* and remove the node before adding a new entering instance of the DOM node. This prevents
|
|
22045
|
+
* duplicates from showing up on screen mid-animation.
|
|
22046
|
+
*/
|
|
22044
22047
|
function trackLeavingNodes(tNode, el) {
|
|
22045
22048
|
// We need to track this tNode's element just to be sure we don't add
|
|
22046
22049
|
// a new RNode for this TNode while this one is still animating away.
|
|
@@ -22052,6 +22055,80 @@ function trackLeavingNodes(tNode, el) {
|
|
|
22052
22055
|
leavingNodes.set(tNode, [el]);
|
|
22053
22056
|
}
|
|
22054
22057
|
}
|
|
22058
|
+
/**
|
|
22059
|
+
* Retrieves the list of specified enter animations from the lView
|
|
22060
|
+
*/
|
|
22061
|
+
function getLViewEnterAnimations(lView) {
|
|
22062
|
+
const animationData = (lView[ANIMATIONS] ??= {});
|
|
22063
|
+
return (animationData.enter ??= []);
|
|
22064
|
+
}
|
|
22065
|
+
/**
|
|
22066
|
+
* Retrieves the list of specified leave animations from the lView
|
|
22067
|
+
*/
|
|
22068
|
+
function getLViewLeaveAnimations(lView) {
|
|
22069
|
+
const animationData = (lView[ANIMATIONS] ??= {});
|
|
22070
|
+
return (animationData.leave ??= []);
|
|
22071
|
+
}
|
|
22072
|
+
/**
|
|
22073
|
+
* Gets the list of classes from a passed in value
|
|
22074
|
+
*/
|
|
22075
|
+
function getClassListFromValue(value) {
|
|
22076
|
+
const classes = typeof value === 'function' ? value() : value;
|
|
22077
|
+
let classList = Array.isArray(classes) ? classes : null;
|
|
22078
|
+
if (typeof classes === 'string') {
|
|
22079
|
+
classList = classes
|
|
22080
|
+
.trim()
|
|
22081
|
+
.split(/\s+/)
|
|
22082
|
+
.filter((k) => k);
|
|
22083
|
+
}
|
|
22084
|
+
return classList;
|
|
22085
|
+
}
|
|
22086
|
+
/**
|
|
22087
|
+
* Cancels any running enter animations on a given element to prevent them from interfering
|
|
22088
|
+
* with leave animations.
|
|
22089
|
+
*/
|
|
22090
|
+
function cancelAnimationsIfRunning(element, renderer) {
|
|
22091
|
+
if (!areAnimationSupported)
|
|
22092
|
+
return;
|
|
22093
|
+
const elementData = enterClassMap.get(element);
|
|
22094
|
+
if (elementData &&
|
|
22095
|
+
elementData.classList.length > 0 &&
|
|
22096
|
+
elementHasClassList(element, elementData.classList)) {
|
|
22097
|
+
for (const klass of elementData.classList) {
|
|
22098
|
+
renderer.removeClass(element, klass);
|
|
22099
|
+
}
|
|
22100
|
+
}
|
|
22101
|
+
// We need to prevent any enter animation listeners from firing if they exist.
|
|
22102
|
+
cleanupEnterClassData(element);
|
|
22103
|
+
}
|
|
22104
|
+
/**
|
|
22105
|
+
* Checks if a given element contains the classes is a provided list
|
|
22106
|
+
*/
|
|
22107
|
+
function elementHasClassList(element, classList) {
|
|
22108
|
+
for (const className of classList) {
|
|
22109
|
+
if (element.classList.contains(className))
|
|
22110
|
+
return true;
|
|
22111
|
+
}
|
|
22112
|
+
return false;
|
|
22113
|
+
}
|
|
22114
|
+
/**
|
|
22115
|
+
* Determines if the animation or transition event is currently the expected longest animation
|
|
22116
|
+
* based on earlier determined data in `longestAnimations`
|
|
22117
|
+
*
|
|
22118
|
+
* @param event
|
|
22119
|
+
* @param nativeElement
|
|
22120
|
+
* @returns
|
|
22121
|
+
*/
|
|
22122
|
+
function isLongestAnimation(event, nativeElement) {
|
|
22123
|
+
const longestAnimation = longestAnimations.get(nativeElement);
|
|
22124
|
+
return (nativeElement === event.target &&
|
|
22125
|
+
longestAnimation !== undefined &&
|
|
22126
|
+
((longestAnimation.animationName !== undefined &&
|
|
22127
|
+
event.animationName === longestAnimation.animationName) ||
|
|
22128
|
+
(longestAnimation.propertyName !== undefined &&
|
|
22129
|
+
event.propertyName === longestAnimation.propertyName)));
|
|
22130
|
+
}
|
|
22131
|
+
|
|
22055
22132
|
/**
|
|
22056
22133
|
* Instruction to handle the `animate.enter` behavior for class bindings.
|
|
22057
22134
|
*
|
|
@@ -22071,6 +22148,11 @@ function ɵɵanimateEnter(value) {
|
|
|
22071
22148
|
return ɵɵanimateEnter;
|
|
22072
22149
|
}
|
|
22073
22150
|
const tNode = getCurrentTNode();
|
|
22151
|
+
cancelLeavingNodes(tNode, lView);
|
|
22152
|
+
getLViewEnterAnimations(lView).push(() => runEnterAnimation(lView, tNode, value));
|
|
22153
|
+
return ɵɵanimateEnter; // For chaining
|
|
22154
|
+
}
|
|
22155
|
+
function runEnterAnimation(lView, tNode, value) {
|
|
22074
22156
|
const nativeElement = getNativeByTNode(tNode, lView);
|
|
22075
22157
|
ngDevMode && assertElementNodes(nativeElement, 'animate.enter');
|
|
22076
22158
|
const renderer = lView[RENDERER];
|
|
@@ -22083,23 +22165,22 @@ function ɵɵanimateEnter(value) {
|
|
|
22083
22165
|
// to get the longest animation to ensure we don't complete animations early.
|
|
22084
22166
|
// This also allows us to setup cancellation of animations in progress if the
|
|
22085
22167
|
// gets removed early.
|
|
22086
|
-
const
|
|
22168
|
+
const handleEnterAnimationStart = (event) => {
|
|
22087
22169
|
const eventName = event instanceof AnimationEvent ? 'animationend' : 'transitionend';
|
|
22088
22170
|
ngZone.runOutsideAngular(() => {
|
|
22089
|
-
cleanupFns.push(renderer.listen(nativeElement, eventName,
|
|
22171
|
+
cleanupFns.push(renderer.listen(nativeElement, eventName, handleEnterAnimationEnd));
|
|
22090
22172
|
});
|
|
22091
22173
|
};
|
|
22092
22174
|
// When the longest animation ends, we can remove all the classes
|
|
22093
|
-
const
|
|
22094
|
-
|
|
22175
|
+
const handleEnterAnimationEnd = (event) => {
|
|
22176
|
+
enterAnimationEnd(event, nativeElement, renderer);
|
|
22095
22177
|
};
|
|
22096
22178
|
// We only need to add these event listeners if there are actual classes to apply
|
|
22097
22179
|
if (activeClasses && activeClasses.length > 0) {
|
|
22098
22180
|
ngZone.runOutsideAngular(() => {
|
|
22099
|
-
cleanupFns.push(renderer.listen(nativeElement, 'animationstart',
|
|
22100
|
-
cleanupFns.push(renderer.listen(nativeElement, 'transitionstart',
|
|
22181
|
+
cleanupFns.push(renderer.listen(nativeElement, 'animationstart', handleEnterAnimationStart));
|
|
22182
|
+
cleanupFns.push(renderer.listen(nativeElement, 'transitionstart', handleEnterAnimationStart));
|
|
22101
22183
|
});
|
|
22102
|
-
cancelLeavingNodes(tNode, lView);
|
|
22103
22184
|
trackEnterClasses(nativeElement, activeClasses, cleanupFns);
|
|
22104
22185
|
for (const klass of activeClasses) {
|
|
22105
22186
|
renderer.addClass(nativeElement, klass);
|
|
@@ -22119,26 +22200,21 @@ function ɵɵanimateEnter(value) {
|
|
|
22119
22200
|
});
|
|
22120
22201
|
});
|
|
22121
22202
|
}
|
|
22122
|
-
return ɵɵanimateEnter; // For chaining
|
|
22123
22203
|
}
|
|
22124
|
-
|
|
22125
|
-
|
|
22126
|
-
|
|
22127
|
-
|
|
22128
|
-
|
|
22129
|
-
|
|
22130
|
-
|
|
22131
|
-
|
|
22132
|
-
|
|
22133
|
-
|
|
22134
|
-
|
|
22135
|
-
|
|
22136
|
-
for (const fn of cleanupFns) {
|
|
22137
|
-
elementData.cleanupFns.push(fn);
|
|
22204
|
+
function enterAnimationEnd(event, nativeElement, renderer) {
|
|
22205
|
+
const elementData = enterClassMap.get(nativeElement);
|
|
22206
|
+
if (!elementData)
|
|
22207
|
+
return;
|
|
22208
|
+
if (isLongestAnimation(event, nativeElement)) {
|
|
22209
|
+
// Now that we've found the longest animation, there's no need
|
|
22210
|
+
// to keep bubbling up this event as it's not going to apply to
|
|
22211
|
+
// other elements further up. We don't want it to inadvertently
|
|
22212
|
+
// affect any other animations on the page.
|
|
22213
|
+
event.stopImmediatePropagation();
|
|
22214
|
+
for (const klass of elementData.classList) {
|
|
22215
|
+
renderer.removeClass(nativeElement, klass);
|
|
22138
22216
|
}
|
|
22139
|
-
|
|
22140
|
-
else {
|
|
22141
|
-
enterClassMap.set(el, { classList, cleanupFns });
|
|
22217
|
+
cleanupEnterClassData(nativeElement);
|
|
22142
22218
|
}
|
|
22143
22219
|
}
|
|
22144
22220
|
/**
|
|
@@ -22161,16 +22237,22 @@ function ɵɵanimateEnterListener(value) {
|
|
|
22161
22237
|
return ɵɵanimateEnterListener;
|
|
22162
22238
|
}
|
|
22163
22239
|
const tNode = getCurrentTNode();
|
|
22240
|
+
cancelLeavingNodes(tNode, lView);
|
|
22241
|
+
getLViewEnterAnimations(lView).push(() => runEnterAnimationFunction(lView, tNode, value));
|
|
22242
|
+
return ɵɵanimateEnterListener;
|
|
22243
|
+
}
|
|
22244
|
+
/**
|
|
22245
|
+
* runs enter animations when a custom function is provided
|
|
22246
|
+
*/
|
|
22247
|
+
function runEnterAnimationFunction(lView, tNode, value) {
|
|
22164
22248
|
const nativeElement = getNativeByTNode(tNode, lView);
|
|
22165
22249
|
ngDevMode && assertElementNodes(nativeElement, 'animate.enter');
|
|
22166
|
-
cancelLeavingNodes(tNode, lView);
|
|
22167
22250
|
value.call(lView[CONTEXT], { target: nativeElement, animationComplete: noOpAnimationComplete });
|
|
22168
|
-
return ɵɵanimateEnterListener;
|
|
22169
22251
|
}
|
|
22170
22252
|
/**
|
|
22171
22253
|
* Instruction to handle the `animate.leave` behavior for class animations.
|
|
22172
|
-
* It
|
|
22173
|
-
*
|
|
22254
|
+
* It creates a leave animation function that's tracked in the LView to
|
|
22255
|
+
* be run before DOM node removal and cleanup.
|
|
22174
22256
|
*
|
|
22175
22257
|
* @param value The value bound to `animate.leave`, which can be a string or a function.
|
|
22176
22258
|
* @returns This function returns itself so that it may be chained.
|
|
@@ -22188,170 +22270,34 @@ function ɵɵanimateLeave(value) {
|
|
|
22188
22270
|
if (animationsDisabled) {
|
|
22189
22271
|
return ɵɵanimateLeave;
|
|
22190
22272
|
}
|
|
22191
|
-
const tView = getTView();
|
|
22192
22273
|
const tNode = getCurrentTNode();
|
|
22193
|
-
|
|
22194
|
-
ngDevMode && assertElementNodes(nativeElement, 'animate.leave');
|
|
22195
|
-
// This instruction is called in the update pass.
|
|
22196
|
-
const renderer = lView[RENDERER];
|
|
22197
|
-
const elementRegistry = getAnimationElementRemovalRegistry();
|
|
22198
|
-
ngDevMode &&
|
|
22199
|
-
assertDefined(elementRegistry.elements, 'Expected `ElementRegistry` to be present in animations subsystem');
|
|
22200
|
-
const ngZone = lView[INJECTOR].get(NgZone);
|
|
22201
|
-
// This function gets stashed in the registry to be used once the element removal process
|
|
22202
|
-
// begins. We pass in the values and resolvers so as to evaluate the resolved classes
|
|
22203
|
-
// at the latest possible time, meaning we evaluate them right before the animation
|
|
22204
|
-
// begins.
|
|
22205
|
-
const animate = (el, value, resolvers) => {
|
|
22206
|
-
return (removalFn) => {
|
|
22207
|
-
animateLeaveClassRunner(el, tNode, getClassList(value, resolvers), removalFn, renderer, animationsDisabled, ngZone);
|
|
22208
|
-
};
|
|
22209
|
-
};
|
|
22210
|
-
// Ensure cleanup if the LView is destroyed before the animation runs.
|
|
22211
|
-
setupElementRegistryCleanup(elementRegistry, lView, tView, nativeElement);
|
|
22212
|
-
elementRegistry.elements.add(nativeElement, value, animate);
|
|
22274
|
+
getLViewLeaveAnimations(lView).push(() => runLeaveAnimations(lView, tNode, value, animationsDisabled));
|
|
22213
22275
|
return ɵɵanimateLeave; // For chaining
|
|
22214
22276
|
}
|
|
22215
|
-
|
|
22216
|
-
|
|
22217
|
-
* a user wants to use a custom animation function rather than a class. It registers
|
|
22218
|
-
* an animation with the ElementRegistry to be run when the element is scheduled for
|
|
22219
|
-
* removal from the DOM.
|
|
22220
|
-
*
|
|
22221
|
-
* @param value The value bound to `(animate.leave)`, an AnimationFunction.
|
|
22222
|
-
* @returns This function returns itself so that it may be chained.
|
|
22223
|
-
*
|
|
22224
|
-
* @codeGenApi
|
|
22225
|
-
*/
|
|
22226
|
-
function ɵɵanimateLeaveListener(value) {
|
|
22227
|
-
performanceMarkFeature('NgAnimateLeave');
|
|
22228
|
-
if ((typeof ngServerMode !== 'undefined' && ngServerMode) || !areAnimationSupported) {
|
|
22229
|
-
return ɵɵanimateLeaveListener;
|
|
22230
|
-
}
|
|
22231
|
-
ngDevMode && assertAnimationTypes(value, 'animate.leave');
|
|
22232
|
-
// Even when animations are disabled, we still need to register the element for removal
|
|
22233
|
-
// to ensure proper cleanup and allow developers to handle element removal in tests
|
|
22234
|
-
// So we don't have an early return here.
|
|
22235
|
-
const lView = getLView();
|
|
22236
|
-
const tNode = getCurrentTNode();
|
|
22237
|
-
const tView = getTView();
|
|
22277
|
+
function runLeaveAnimations(lView, tNode, value, animationsDisabled) {
|
|
22278
|
+
const { promise, resolve } = promiseWithResolvers();
|
|
22238
22279
|
const nativeElement = getNativeByTNode(tNode, lView);
|
|
22239
22280
|
ngDevMode && assertElementNodes(nativeElement, 'animate.leave');
|
|
22240
|
-
const elementRegistry = getAnimationElementRemovalRegistry();
|
|
22241
|
-
ngDevMode &&
|
|
22242
|
-
assertDefined(elementRegistry.elements, 'Expected `ElementRegistry` to be present in animations subsystem');
|
|
22243
22281
|
const renderer = lView[RENDERER];
|
|
22244
|
-
const animationsDisabled = areAnimationsDisabled(lView);
|
|
22245
22282
|
const ngZone = lView[INJECTOR].get(NgZone);
|
|
22246
|
-
|
|
22247
|
-
|
|
22248
|
-
|
|
22249
|
-
|
|
22250
|
-
}
|
|
22251
|
-
else {
|
|
22252
|
-
const event = {
|
|
22253
|
-
target: nativeElement,
|
|
22254
|
-
animationComplete: () => {
|
|
22255
|
-
clearLeavingNodes(tNode, _el);
|
|
22256
|
-
removeFn();
|
|
22257
|
-
},
|
|
22258
|
-
};
|
|
22259
|
-
trackLeavingNodes(tNode, _el);
|
|
22260
|
-
ngZone.runOutsideAngular(() => {
|
|
22261
|
-
renderer.listen(_el, 'animationend', () => removeFn(), { once: true });
|
|
22262
|
-
});
|
|
22263
|
-
value.call(lView[CONTEXT], event);
|
|
22264
|
-
}
|
|
22265
|
-
};
|
|
22266
|
-
};
|
|
22267
|
-
// Ensure cleanup if the LView is destroyed before the animation runs.
|
|
22268
|
-
setupElementRegistryCleanup(elementRegistry, lView, tView, nativeElement);
|
|
22269
|
-
elementRegistry.elements.addCallback(nativeElement, value, animate);
|
|
22270
|
-
return ɵɵanimateLeaveListener; // For chaining
|
|
22271
|
-
}
|
|
22272
|
-
/**
|
|
22273
|
-
* Builds the list of classes to apply to an element based on either the passed in list of strings
|
|
22274
|
-
* or the set of resolver functions that are coming from bindings. Those resolver functions should
|
|
22275
|
-
* resolve into either a string or a string array. There may be multiple to support composition.
|
|
22276
|
-
*/
|
|
22277
|
-
function getClassList(value, resolvers) {
|
|
22278
|
-
const classList = new Set(value);
|
|
22279
|
-
if (resolvers && resolvers.length) {
|
|
22280
|
-
for (const resolverFn of resolvers) {
|
|
22281
|
-
const resolvedValue = getClassListFromValue(resolverFn);
|
|
22282
|
-
if (resolvedValue) {
|
|
22283
|
-
for (const rv of resolvedValue) {
|
|
22284
|
-
classList.add(rv);
|
|
22285
|
-
}
|
|
22286
|
-
}
|
|
22287
|
-
}
|
|
22288
|
-
}
|
|
22289
|
-
return classList;
|
|
22290
|
-
}
|
|
22291
|
-
function cancelAnimationsIfRunning(element, renderer) {
|
|
22292
|
-
if (!areAnimationSupported)
|
|
22293
|
-
return;
|
|
22294
|
-
const elementData = enterClassMap.get(element);
|
|
22295
|
-
if (elementData &&
|
|
22296
|
-
elementData.classList.length > 0 &&
|
|
22297
|
-
elementHasClassList(element, elementData.classList)) {
|
|
22298
|
-
for (const klass of elementData.classList) {
|
|
22299
|
-
renderer.removeClass(element, klass);
|
|
22300
|
-
}
|
|
22301
|
-
}
|
|
22302
|
-
// We need to prevent any enter animation listeners from firing if they exist.
|
|
22303
|
-
cleanupEnterClassData(element);
|
|
22304
|
-
}
|
|
22305
|
-
function elementHasClassList(element, classList) {
|
|
22306
|
-
for (const className of classList) {
|
|
22307
|
-
if (element.classList.contains(className))
|
|
22308
|
-
return true;
|
|
22309
|
-
}
|
|
22310
|
-
return false;
|
|
22311
|
-
}
|
|
22312
|
-
function isLongestAnimation(event, nativeElement) {
|
|
22313
|
-
const longestAnimation = longestAnimations.get(nativeElement);
|
|
22314
|
-
return (nativeElement === event.target &&
|
|
22315
|
-
longestAnimation !== undefined &&
|
|
22316
|
-
((longestAnimation.animationName !== undefined &&
|
|
22317
|
-
event.animationName === longestAnimation.animationName) ||
|
|
22318
|
-
(longestAnimation.propertyName !== undefined &&
|
|
22319
|
-
event.propertyName === longestAnimation.propertyName)));
|
|
22320
|
-
}
|
|
22321
|
-
function animationEnd(event, nativeElement, renderer) {
|
|
22322
|
-
const elementData = enterClassMap.get(nativeElement);
|
|
22323
|
-
if (!elementData)
|
|
22324
|
-
return;
|
|
22325
|
-
if (isLongestAnimation(event, nativeElement)) {
|
|
22326
|
-
// Now that we've found the longest animation, there's no need
|
|
22327
|
-
// to keep bubbling up this event as it's not going to apply to
|
|
22328
|
-
// other elements further up. We don't want it to inadvertently
|
|
22329
|
-
// affect any other animations on the page.
|
|
22330
|
-
event.stopImmediatePropagation();
|
|
22331
|
-
for (const klass of elementData.classList) {
|
|
22332
|
-
renderer.removeClass(nativeElement, klass);
|
|
22333
|
-
}
|
|
22334
|
-
cleanupEnterClassData(nativeElement);
|
|
22335
|
-
}
|
|
22336
|
-
}
|
|
22337
|
-
function assertAnimationTypes(value, instruction) {
|
|
22338
|
-
if (value == null || (typeof value !== 'string' && typeof value !== 'function')) {
|
|
22339
|
-
throw new RuntimeError(650 /* RuntimeErrorCode.ANIMATE_INVALID_VALUE */, `'${instruction}' value must be a string of CSS classes or an animation function, got ${stringify(value)}`);
|
|
22283
|
+
allLeavingAnimations.add(lView);
|
|
22284
|
+
const activeClasses = getClassListFromValue(value);
|
|
22285
|
+
if (activeClasses && activeClasses.length > 0) {
|
|
22286
|
+
animateLeaveClassRunner(nativeElement, tNode, activeClasses, renderer, animationsDisabled, ngZone, resolve);
|
|
22340
22287
|
}
|
|
22341
|
-
|
|
22342
|
-
|
|
22343
|
-
if (nativeElement.nodeType !== Node.ELEMENT_NODE) {
|
|
22344
|
-
throw new RuntimeError(650 /* RuntimeErrorCode.ANIMATE_INVALID_VALUE */, `'${instruction}' can only be used on an element node, got ${stringify(nativeElement.nodeType)}`);
|
|
22288
|
+
else {
|
|
22289
|
+
resolve();
|
|
22345
22290
|
}
|
|
22291
|
+
return promise;
|
|
22346
22292
|
}
|
|
22347
22293
|
/**
|
|
22348
22294
|
* This function actually adds the classes that animate element that's leaving the DOM.
|
|
22349
22295
|
* Once it finishes, it calls the remove function that was provided by the DOM renderer.
|
|
22350
22296
|
*/
|
|
22351
|
-
function animateLeaveClassRunner(el, tNode, classList,
|
|
22297
|
+
function animateLeaveClassRunner(el, tNode, classList, renderer, animationsDisabled, ngZone, resolver) {
|
|
22352
22298
|
if (animationsDisabled) {
|
|
22353
22299
|
longestAnimations.delete(el);
|
|
22354
|
-
|
|
22300
|
+
resolver();
|
|
22355
22301
|
return;
|
|
22356
22302
|
}
|
|
22357
22303
|
cancelAnimationsIfRunning(el, renderer);
|
|
@@ -22364,8 +22310,16 @@ function animateLeaveClassRunner(el, tNode, classList, finalRemoveFn, renderer,
|
|
|
22364
22310
|
event.stopImmediatePropagation();
|
|
22365
22311
|
longestAnimations.delete(el);
|
|
22366
22312
|
clearLeavingNodes(tNode, el);
|
|
22367
|
-
|
|
22313
|
+
if (Array.isArray(tNode.projection)) {
|
|
22314
|
+
// in the content projection case, the element is not destroyed.
|
|
22315
|
+
// So we need to remove the class at the end so that it isn't left
|
|
22316
|
+
// behind for whenever the item shows up again.
|
|
22317
|
+
for (const item of classList) {
|
|
22318
|
+
renderer.removeClass(el, item);
|
|
22319
|
+
}
|
|
22320
|
+
}
|
|
22368
22321
|
}
|
|
22322
|
+
resolver();
|
|
22369
22323
|
};
|
|
22370
22324
|
ngZone.runOutsideAngular(() => {
|
|
22371
22325
|
renderer.listen(el, 'animationend', handleOutAnimationEnd);
|
|
@@ -22383,11 +22337,75 @@ function animateLeaveClassRunner(el, tNode, classList, finalRemoveFn, renderer,
|
|
|
22383
22337
|
determineLongestAnimation(el, longestAnimations, areAnimationSupported);
|
|
22384
22338
|
if (!longestAnimations.has(el)) {
|
|
22385
22339
|
clearLeavingNodes(tNode, el);
|
|
22386
|
-
|
|
22340
|
+
resolver();
|
|
22387
22341
|
}
|
|
22388
22342
|
});
|
|
22389
22343
|
});
|
|
22390
22344
|
}
|
|
22345
|
+
/**
|
|
22346
|
+
* Instruction to handle the `(animate.leave)` behavior for event bindings, aka when
|
|
22347
|
+
* a user wants to use a custom animation function rather than a class. It registers
|
|
22348
|
+
* a leave animation function in the LView to be run at right before removal from the
|
|
22349
|
+
* DOM.
|
|
22350
|
+
*
|
|
22351
|
+
* @param value The value bound to `(animate.leave)`, an AnimationFunction.
|
|
22352
|
+
* @returns This function returns itself so that it may be chained.
|
|
22353
|
+
*
|
|
22354
|
+
* @codeGenApi
|
|
22355
|
+
*/
|
|
22356
|
+
function ɵɵanimateLeaveListener(value) {
|
|
22357
|
+
performanceMarkFeature('NgAnimateLeave');
|
|
22358
|
+
if ((typeof ngServerMode !== 'undefined' && ngServerMode) || !areAnimationSupported) {
|
|
22359
|
+
return ɵɵanimateLeaveListener;
|
|
22360
|
+
}
|
|
22361
|
+
ngDevMode && assertAnimationTypes(value, 'animate.leave');
|
|
22362
|
+
// Even when animations are disabled, we still need to register the element for removal
|
|
22363
|
+
// to ensure proper cleanup and allow developers to handle element removal in tests
|
|
22364
|
+
// So we don't have an early return here.
|
|
22365
|
+
const lView = getLView();
|
|
22366
|
+
const tNode = getCurrentTNode();
|
|
22367
|
+
allLeavingAnimations.add(lView);
|
|
22368
|
+
getLViewLeaveAnimations(lView).push(() => runLeaveAnimationFunction(lView, tNode, value));
|
|
22369
|
+
return ɵɵanimateLeaveListener; // For chaining
|
|
22370
|
+
}
|
|
22371
|
+
/**
|
|
22372
|
+
* runs leave animations when a custom function is provided
|
|
22373
|
+
*/
|
|
22374
|
+
function runLeaveAnimationFunction(lView, tNode, value) {
|
|
22375
|
+
const { promise, resolve } = promiseWithResolvers();
|
|
22376
|
+
const nativeElement = getNativeByTNode(tNode, lView);
|
|
22377
|
+
ngDevMode && assertElementNodes(nativeElement, 'animate.leave');
|
|
22378
|
+
const renderer = lView[RENDERER];
|
|
22379
|
+
const animationsDisabled = areAnimationsDisabled(lView);
|
|
22380
|
+
const ngZone = lView[INJECTOR].get(NgZone);
|
|
22381
|
+
const maxAnimationTimeout = lView[INJECTOR].get(MAX_ANIMATION_TIMEOUT);
|
|
22382
|
+
if (animationsDisabled) {
|
|
22383
|
+
resolve();
|
|
22384
|
+
}
|
|
22385
|
+
else {
|
|
22386
|
+
const timeoutId = setTimeout(() => {
|
|
22387
|
+
clearLeavingNodes(tNode, nativeElement);
|
|
22388
|
+
resolve();
|
|
22389
|
+
}, maxAnimationTimeout);
|
|
22390
|
+
const event = {
|
|
22391
|
+
target: nativeElement,
|
|
22392
|
+
animationComplete: () => {
|
|
22393
|
+
clearLeavingNodes(tNode, nativeElement);
|
|
22394
|
+
clearTimeout(timeoutId);
|
|
22395
|
+
resolve();
|
|
22396
|
+
},
|
|
22397
|
+
};
|
|
22398
|
+
trackLeavingNodes(tNode, nativeElement);
|
|
22399
|
+
ngZone.runOutsideAngular(() => {
|
|
22400
|
+
renderer.listen(nativeElement, 'animationend', () => {
|
|
22401
|
+
resolve();
|
|
22402
|
+
}, { once: true });
|
|
22403
|
+
});
|
|
22404
|
+
value.call(lView[CONTEXT], event);
|
|
22405
|
+
}
|
|
22406
|
+
// Ensure cleanup if the LView is destroyed before the animation runs.
|
|
22407
|
+
return promise;
|
|
22408
|
+
}
|
|
22391
22409
|
|
|
22392
22410
|
/*!
|
|
22393
22411
|
* @license
|
|
@@ -22438,7 +22456,11 @@ class LiveCollection {
|
|
|
22438
22456
|
}
|
|
22439
22457
|
}
|
|
22440
22458
|
move(prevIndex, newIdx) {
|
|
22441
|
-
|
|
22459
|
+
// For move operations, the detach code path is the same one used for removing
|
|
22460
|
+
// DOM nodes, which would trigger `animate.leave` bindings. We need to skip
|
|
22461
|
+
// those animations in the case of a move operation so the moving elements don't
|
|
22462
|
+
// unexpectedly disappear.
|
|
22463
|
+
this.attach(newIdx, this.detach(prevIndex, true /* skipLeaveAnimations */));
|
|
22442
22464
|
}
|
|
22443
22465
|
}
|
|
22444
22466
|
function valuesMatching(liveIdx, liveValue, newIdx, newValue, trackBy) {
|
|
@@ -23010,8 +23032,10 @@ class LiveCollectionLContainerImpl extends LiveCollection {
|
|
|
23010
23032
|
this.needsIndexUpdate ||= index !== this.length;
|
|
23011
23033
|
addLViewToLContainer(this.lContainer, lView, index, shouldAddViewToDom(this.templateTNode, dehydratedView));
|
|
23012
23034
|
}
|
|
23013
|
-
detach(index) {
|
|
23035
|
+
detach(index, skipLeaveAnimations) {
|
|
23014
23036
|
this.needsIndexUpdate ||= index !== this.length - 1;
|
|
23037
|
+
if (skipLeaveAnimations)
|
|
23038
|
+
setSkipLeaveAnimations(this.lContainer, index);
|
|
23015
23039
|
return detachExistingView(this.lContainer, index);
|
|
23016
23040
|
}
|
|
23017
23041
|
create(index, value) {
|
|
@@ -23117,6 +23141,15 @@ function getLContainer(lView, index) {
|
|
|
23117
23141
|
ngDevMode && assertLContainer(lContainer);
|
|
23118
23142
|
return lContainer;
|
|
23119
23143
|
}
|
|
23144
|
+
function setSkipLeaveAnimations(lContainer, index) {
|
|
23145
|
+
if (lContainer.length <= CONTAINER_HEADER_OFFSET)
|
|
23146
|
+
return;
|
|
23147
|
+
const indexInContainer = CONTAINER_HEADER_OFFSET + index;
|
|
23148
|
+
const viewToDetach = lContainer[indexInContainer];
|
|
23149
|
+
if (viewToDetach && viewToDetach[ANIMATIONS]) {
|
|
23150
|
+
viewToDetach[ANIMATIONS].skipLeaveAnimations = true;
|
|
23151
|
+
}
|
|
23152
|
+
}
|
|
23120
23153
|
function detachExistingView(lContainer, index) {
|
|
23121
23154
|
const existingLView = detachView(lContainer, index);
|
|
23122
23155
|
ngDevMode && assertLView(existingLView);
|
|
@@ -23604,7 +23637,7 @@ function plural(val) {
|
|
|
23604
23637
|
return 1;
|
|
23605
23638
|
return 5;
|
|
23606
23639
|
}
|
|
23607
|
-
var localeEn = ["en", [["a", "p"], ["AM", "PM"]
|
|
23640
|
+
var localeEn = ["en", [["a", "p"], ["AM", "PM"]], [["AM", "PM"]], [["S", "M", "T", "W", "T", "F", "S"], ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"], ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"], ["Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"]], u, [["J", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"], ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"], ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"]], u, [["B", "A"], ["BC", "AD"], ["Before Christ", "Anno Domini"]], 0, [6, 0], ["M/d/yy", "MMM d, y", "MMMM d, y", "EEEE, MMMM d, y"], ["h:mm a", "h:mm:ss a", "h:mm:ss a z", "h:mm:ss a zzzz"], ["{1}, {0}", u, "{1} 'at' {0}", u], [".", ",", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "¤#,##0.00", "#E0"], "USD", "$", "US Dollar", {}, "ltr", plural];
|
|
23608
23641
|
|
|
23609
23642
|
/**
|
|
23610
23643
|
* This const is used to store the locale data registered with `registerLocaleData`
|
|
@@ -23772,6 +23805,7 @@ const ICU_MARKER = {
|
|
|
23772
23805
|
*/
|
|
23773
23806
|
var I18nCreateOpCode;
|
|
23774
23807
|
(function (I18nCreateOpCode) {
|
|
23808
|
+
/* tslint:disable:no-duplicate-enum-values */
|
|
23775
23809
|
/**
|
|
23776
23810
|
* Number of bits to shift index so that it can be combined with the `APPEND_EAGERLY` and
|
|
23777
23811
|
* `COMMENT`.
|
|
@@ -23785,6 +23819,7 @@ var I18nCreateOpCode;
|
|
|
23785
23819
|
* If set the node should be comment (rather than a text) node.
|
|
23786
23820
|
*/
|
|
23787
23821
|
I18nCreateOpCode[I18nCreateOpCode["COMMENT"] = 2] = "COMMENT";
|
|
23822
|
+
/* tslint:enable:no-duplicate-enum-values */
|
|
23788
23823
|
})(I18nCreateOpCode || (I18nCreateOpCode = {}));
|
|
23789
23824
|
|
|
23790
23825
|
/**
|
|
@@ -28310,18 +28345,6 @@ function ɵɵExternalStylesFeature(styleUrls) {
|
|
|
28310
28345
|
};
|
|
28311
28346
|
}
|
|
28312
28347
|
|
|
28313
|
-
/**
|
|
28314
|
-
* This feature adds the element registry for delayed element removal when animate.leave
|
|
28315
|
-
* is utilized.
|
|
28316
|
-
*
|
|
28317
|
-
* @codeGenApi
|
|
28318
|
-
*/
|
|
28319
|
-
function ɵɵAnimationsFeature() {
|
|
28320
|
-
return () => {
|
|
28321
|
-
setAnimationElementRemovalRegistry(new ElementRegistry());
|
|
28322
|
-
};
|
|
28323
|
-
}
|
|
28324
|
-
|
|
28325
28348
|
/**
|
|
28326
28349
|
* Generated next to NgModules to monkey-patch directive and pipe references onto a component's
|
|
28327
28350
|
* definition, when generating a direct reference in the component file would otherwise create an
|
|
@@ -29280,7 +29303,6 @@ const angularCoreEnv = (() => ({
|
|
|
29280
29303
|
'ɵɵCopyDefinitionFeature': ɵɵCopyDefinitionFeature,
|
|
29281
29304
|
'ɵɵInheritDefinitionFeature': ɵɵInheritDefinitionFeature,
|
|
29282
29305
|
'ɵɵExternalStylesFeature': ɵɵExternalStylesFeature,
|
|
29283
|
-
'ɵɵAnimationsFeature': ɵɵAnimationsFeature,
|
|
29284
29306
|
'ɵɵnextContext': ɵɵnextContext,
|
|
29285
29307
|
'ɵɵnamespaceHTML': __namespaceHTML,
|
|
29286
29308
|
'ɵɵnamespaceMathML': __namespaceMathML,
|
|
@@ -31827,5 +31849,5 @@ function getDebugNode(nativeNode) {
|
|
|
31827
31849
|
return null;
|
|
31828
31850
|
}
|
|
31829
31851
|
|
|
31830
|
-
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,
|
|
31852
|
+
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, EventEmitter, 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, NgProbeToken, NgZone, NoopNgZone, Optional, Output, PACKAGE_ROOT_URL, PLATFORM_ID, PLATFORM_INITIALIZER, PRESERVE_HOST_CONTENT, PROVIDED_NG_ZONE, Pipe, QueryList, ReflectionCapabilities, Renderer2, RendererFactory2, RendererStyleFlags2, SKIP_HYDRATION_ATTR_NAME, SSR_CONTENT_INTEGRITY_MARKER, Sanitizer, SecurityContext, Self, SimpleChange, SkipSelf, TEMPLATES, TEMPLATE_ID, TESTABILITY, TESTABILITY_GETTER, TRANSLATIONS, TRANSLATIONS_FORMAT, TemplateRef, Testability, TestabilityRegistry, TimerScheduler, TracingAction, TracingService, TransferState, Type, UseExhaustiveCheckNoChanges, ViewContainerRef, ViewEncapsulation, ViewRef, _sanitizeHtml, _sanitizeUrl, afterEveryRender, afterNextRender, 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, getNgZone, getNgZoneOptions, getOrComputeI18nChildren, getRegisteredNgModuleType, getSanitizationBypassType, getTDeferBlockDetails, getTransferState, inferTagNameFromDefinition, inputBinding, internalProvideZoneChangeDetection, invokeListeners, isBoundToModule, isComponentDefPendingResolution, isComponentResourceResolutionQueueEmpty, isDeferBlock, isDetachedByI18n, isDisconnectedNode, isI18nHydrationEnabled, isI18nHydrationSupportEnabled, isInSkipHydrationBlock, isIncrementalHydrationEnabled, isJsObject, isLetDeclaration, isListLikeIterable, isNgModule, isPromise, isSubscribable, isTNodeShape, isViewDirty, iterateListLike, makePropDecorator, makeStateKey, markForRefresh, noSideEffects, optionsReducer, outputBinding, patchComponentDefWithScope, performanceMarkFeature, processAndInitTriggers, processBlockData, processTextNodeBeforeSerialization, profiler, provideAppInitializer, provideNgReflectAttributes, provideZoneChangeDetection, provideZonelessChangeDetection, publishDefaultGlobalUtils, publishExternalGlobalUtil, publishSignalConfiguration, readHydrationInfo, readPatchedLView, registerLocaleData, registerNgModuleType, remove, removeListeners, renderDeferBlockState, resetCompiledComponents, resetJitOptions, resolveComponentResources, restoreComponentResolutionQueue, setAllowDuplicateNgModuleIdsForTest, setClassMetadata, setClassMetadataAsync, setDocument, setIsI18nHydrationSupportEnabled, setJSActionAttributes, setJitOptions, setLocaleId, setStashFn, setTestabilityGetter, sharedMapFunction, sharedStashFunction, transitiveScopesFor, triggerHydrationFromBlockName, triggerResourceLoading, trySerializeI18nBlock, twoWayBinding, unregisterAllLocaleData, unsupportedProjectionOfDomNodes, unwrapSafeValue, validateMatchingNode, validateNodeExists, verifySsrContentsIntegrity, ɵgetUnknownElementStrictMode, ɵgetUnknownPropertyStrictMode, ɵsetClassDebugInfo, ɵsetUnknownElementStrictMode, ɵsetUnknownPropertyStrictMode, ɵɵ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 };
|
|
31831
31853
|
//# sourceMappingURL=debug_node.mjs.map
|