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