@angular/core 17.0.0-rc.0 → 17.0.0-rc.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2022/src/application_init.mjs +3 -2
- package/esm2022/src/application_ref.mjs +3 -3
- package/esm2022/src/application_tokens.mjs +1 -11
- package/esm2022/src/core.mjs +2 -2
- package/esm2022/src/core_private_export.mjs +2 -2
- package/esm2022/src/defer/cleanup.mjs +23 -53
- package/esm2022/src/defer/dom_triggers.mjs +15 -15
- package/esm2022/src/defer/idle_scheduler.mjs +20 -17
- package/esm2022/src/defer/instructions.mjs +66 -45
- package/esm2022/src/defer/interfaces.mjs +3 -1
- package/esm2022/src/defer/timer_scheduler.mjs +43 -34
- package/esm2022/src/defer/utils.mjs +2 -14
- package/esm2022/src/di/r3_injector.mjs +6 -1
- package/esm2022/src/errors.mjs +1 -1
- package/esm2022/src/hydration/api.mjs +2 -3
- package/esm2022/src/hydration/skip_hydration.mjs +7 -7
- package/esm2022/src/linker/view_container_ref.mjs +4 -6
- package/esm2022/src/metadata/directives.mjs +1 -1
- package/esm2022/src/render3/after_render_hooks.mjs +25 -21
- package/esm2022/src/render3/debug/injector_profiler.mjs +26 -8
- package/esm2022/src/render3/instructions/change_detection.mjs +24 -3
- package/esm2022/src/render3/util/injector_discovery_utils.mjs +26 -2
- package/esm2022/src/render3/util/view_utils.mjs +1 -4
- package/esm2022/src/version.mjs +1 -1
- package/esm2022/testing/src/defer.mjs +6 -3
- package/esm2022/testing/src/logger.mjs +3 -3
- package/fesm2022/core.mjs +376 -329
- package/fesm2022/core.mjs.map +1 -1
- package/fesm2022/primitives/signals.mjs +1 -1
- package/fesm2022/rxjs-interop.mjs +1 -1
- package/fesm2022/testing.mjs +6 -3
- package/fesm2022/testing.mjs.map +1 -1
- package/index.d.ts +12 -13
- package/package.json +1 -1
- package/primitives/signals/index.d.ts +1 -1
- package/rxjs-interop/index.d.ts +1 -1
- package/schematics/migrations/block-template-entities/bundle.js +788 -370
- package/schematics/migrations/block-template-entities/bundle.js.map +4 -4
- package/schematics/migrations/compiler-options/bundle.js +13 -13
- package/schematics/migrations/transfer-state/bundle.js +13 -13
- package/schematics/ng-generate/control-flow-migration/bundle.js +988 -528
- package/schematics/ng-generate/control-flow-migration/bundle.js.map +4 -4
- package/schematics/ng-generate/standalone-migration/bundle.js +1047 -628
- package/schematics/ng-generate/standalone-migration/bundle.js.map +4 -4
- package/testing/index.d.ts +1 -1
package/fesm2022/core.mjs
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* @license Angular v17.0.0-rc.
|
|
2
|
+
* @license Angular v17.0.0-rc.1
|
|
3
3
|
* (c) 2010-2022 Google LLC. https://angular.io/
|
|
4
4
|
* License: MIT
|
|
5
5
|
*/
|
|
@@ -673,6 +673,93 @@ function initNgDevMode() {
|
|
|
673
673
|
return false;
|
|
674
674
|
}
|
|
675
675
|
|
|
676
|
+
/**
|
|
677
|
+
* Creates a token that can be used in a DI Provider.
|
|
678
|
+
*
|
|
679
|
+
* Use an `InjectionToken` whenever the type you are injecting is not reified (does not have a
|
|
680
|
+
* runtime representation) such as when injecting an interface, callable type, array or
|
|
681
|
+
* parameterized type.
|
|
682
|
+
*
|
|
683
|
+
* `InjectionToken` is parameterized on `T` which is the type of object which will be returned by
|
|
684
|
+
* the `Injector`. This provides an additional level of type safety.
|
|
685
|
+
*
|
|
686
|
+
* <div class="alert is-helpful">
|
|
687
|
+
*
|
|
688
|
+
* **Important Note**: Ensure that you use the same instance of the `InjectionToken` in both the
|
|
689
|
+
* provider and the injection call. Creating a new instance of `InjectionToken` in different places,
|
|
690
|
+
* even with the same description, will be treated as different tokens by Angular's DI system,
|
|
691
|
+
* leading to a `NullInjectorError`.
|
|
692
|
+
*
|
|
693
|
+
* </div>
|
|
694
|
+
*
|
|
695
|
+
* <code-example format="typescript" language="typescript" path="injection-token/src/main.ts"
|
|
696
|
+
* region="InjectionToken"></code-example>
|
|
697
|
+
*
|
|
698
|
+
* When creating an `InjectionToken`, you can optionally specify a factory function which returns
|
|
699
|
+
* (possibly by creating) a default value of the parameterized type `T`. This sets up the
|
|
700
|
+
* `InjectionToken` using this factory as a provider as if it was defined explicitly in the
|
|
701
|
+
* application's root injector. If the factory function, which takes zero arguments, needs to inject
|
|
702
|
+
* dependencies, it can do so using the [`inject`](api/core/inject) function.
|
|
703
|
+
* As you can see in the Tree-shakable InjectionToken example below.
|
|
704
|
+
*
|
|
705
|
+
* Additionally, if a `factory` is specified you can also specify the `providedIn` option, which
|
|
706
|
+
* overrides the above behavior and marks the token as belonging to a particular `@NgModule` (note:
|
|
707
|
+
* this option is now deprecated). As mentioned above, `'root'` is the default value for
|
|
708
|
+
* `providedIn`.
|
|
709
|
+
*
|
|
710
|
+
* The `providedIn: NgModule` and `providedIn: 'any'` options are deprecated.
|
|
711
|
+
*
|
|
712
|
+
* @usageNotes
|
|
713
|
+
* ### Basic Examples
|
|
714
|
+
*
|
|
715
|
+
* ### Plain InjectionToken
|
|
716
|
+
*
|
|
717
|
+
* {@example core/di/ts/injector_spec.ts region='InjectionToken'}
|
|
718
|
+
*
|
|
719
|
+
* ### Tree-shakable InjectionToken
|
|
720
|
+
*
|
|
721
|
+
* {@example core/di/ts/injector_spec.ts region='ShakableInjectionToken'}
|
|
722
|
+
*
|
|
723
|
+
* @publicApi
|
|
724
|
+
*/
|
|
725
|
+
class InjectionToken {
|
|
726
|
+
/**
|
|
727
|
+
* @param _desc Description for the token,
|
|
728
|
+
* used only for debugging purposes,
|
|
729
|
+
* it should but does not need to be unique
|
|
730
|
+
* @param options Options for the token's usage, as described above
|
|
731
|
+
*/
|
|
732
|
+
constructor(_desc, options) {
|
|
733
|
+
this._desc = _desc;
|
|
734
|
+
/** @internal */
|
|
735
|
+
this.ngMetadataName = 'InjectionToken';
|
|
736
|
+
this.ɵprov = undefined;
|
|
737
|
+
if (typeof options == 'number') {
|
|
738
|
+
(typeof ngDevMode === 'undefined' || ngDevMode) &&
|
|
739
|
+
assertLessThan(options, 0, 'Only negative numbers are supported here');
|
|
740
|
+
// This is a special hack to assign __NG_ELEMENT_ID__ to this instance.
|
|
741
|
+
// See `InjectorMarkers`
|
|
742
|
+
this.__NG_ELEMENT_ID__ = options;
|
|
743
|
+
}
|
|
744
|
+
else if (options !== undefined) {
|
|
745
|
+
this.ɵprov = ɵɵdefineInjectable({
|
|
746
|
+
token: this,
|
|
747
|
+
providedIn: options.providedIn || 'root',
|
|
748
|
+
factory: options.factory,
|
|
749
|
+
});
|
|
750
|
+
}
|
|
751
|
+
}
|
|
752
|
+
/**
|
|
753
|
+
* @internal
|
|
754
|
+
*/
|
|
755
|
+
get multi() {
|
|
756
|
+
return this;
|
|
757
|
+
}
|
|
758
|
+
toString() {
|
|
759
|
+
return `InjectionToken ${this._desc}`;
|
|
760
|
+
}
|
|
761
|
+
}
|
|
762
|
+
|
|
676
763
|
let _injectorProfilerContext;
|
|
677
764
|
function getInjectorProfilerContext() {
|
|
678
765
|
!ngDevMode && throwError('getInjectorProfilerContext should never be called in production mode');
|
|
@@ -714,18 +801,35 @@ function injectorProfiler(event) {
|
|
|
714
801
|
* Emits an InjectorProfilerEventType.ProviderConfigured to the injector profiler. The data in the
|
|
715
802
|
* emitted event includes the raw provider, as well as the token that provider is providing.
|
|
716
803
|
*
|
|
717
|
-
* @param
|
|
804
|
+
* @param eventProvider A provider object
|
|
718
805
|
*/
|
|
719
|
-
function emitProviderConfiguredEvent(
|
|
806
|
+
function emitProviderConfiguredEvent(eventProvider, isViewProvider = false) {
|
|
720
807
|
!ngDevMode && throwError('Injector profiler should never be called in production mode');
|
|
808
|
+
let token;
|
|
809
|
+
// if the provider is a TypeProvider (typeof provider is function) then the token is the
|
|
810
|
+
// provider itself
|
|
811
|
+
if (typeof eventProvider === 'function') {
|
|
812
|
+
token = eventProvider;
|
|
813
|
+
}
|
|
814
|
+
// if the provider is an injection token, then the token is the injection token.
|
|
815
|
+
else if (eventProvider instanceof InjectionToken) {
|
|
816
|
+
token = eventProvider;
|
|
817
|
+
}
|
|
818
|
+
// in all other cases we can access the token via the `provide` property of the provider
|
|
819
|
+
else {
|
|
820
|
+
token = resolveForwardRef(eventProvider.provide);
|
|
821
|
+
}
|
|
822
|
+
let provider = eventProvider;
|
|
823
|
+
// Injection tokens may define their own default provider which gets attached to the token itself
|
|
824
|
+
// as `ɵprov`. In this case, we want to emit the provider that is attached to the token, not the
|
|
825
|
+
// token itself.
|
|
826
|
+
if (eventProvider instanceof InjectionToken) {
|
|
827
|
+
provider = eventProvider.ɵprov || eventProvider;
|
|
828
|
+
}
|
|
721
829
|
injectorProfiler({
|
|
722
830
|
type: 2 /* InjectorProfilerEventType.ProviderConfigured */,
|
|
723
831
|
context: getInjectorProfilerContext(),
|
|
724
|
-
providerRecord: {
|
|
725
|
-
token: typeof provider === 'function' ? provider : resolveForwardRef(provider.provide),
|
|
726
|
-
provider,
|
|
727
|
-
isViewProvider
|
|
728
|
-
}
|
|
832
|
+
providerRecord: { token, provider, isViewProvider }
|
|
729
833
|
});
|
|
730
834
|
}
|
|
731
835
|
/**
|
|
@@ -2637,9 +2741,6 @@ function updateAncestorTraversalFlagsOnAttach(lView) {
|
|
|
2637
2741
|
*/
|
|
2638
2742
|
function markAncestorsForTraversal(lView) {
|
|
2639
2743
|
let parent = lView[PARENT];
|
|
2640
|
-
if (parent === null) {
|
|
2641
|
-
return;
|
|
2642
|
-
}
|
|
2643
2744
|
while (parent !== null) {
|
|
2644
2745
|
// We stop adding markers to the ancestors once we reach one that already has the marker. This
|
|
2645
2746
|
// is to avoid needlessly traversing all the way to the root when the marker already exists.
|
|
@@ -5471,93 +5572,6 @@ function componentDefResolved(type) {
|
|
|
5471
5572
|
componentDefPendingResolution.delete(type);
|
|
5472
5573
|
}
|
|
5473
5574
|
|
|
5474
|
-
/**
|
|
5475
|
-
* Creates a token that can be used in a DI Provider.
|
|
5476
|
-
*
|
|
5477
|
-
* Use an `InjectionToken` whenever the type you are injecting is not reified (does not have a
|
|
5478
|
-
* runtime representation) such as when injecting an interface, callable type, array or
|
|
5479
|
-
* parameterized type.
|
|
5480
|
-
*
|
|
5481
|
-
* `InjectionToken` is parameterized on `T` which is the type of object which will be returned by
|
|
5482
|
-
* the `Injector`. This provides an additional level of type safety.
|
|
5483
|
-
*
|
|
5484
|
-
* <div class="alert is-helpful">
|
|
5485
|
-
*
|
|
5486
|
-
* **Important Note**: Ensure that you use the same instance of the `InjectionToken` in both the
|
|
5487
|
-
* provider and the injection call. Creating a new instance of `InjectionToken` in different places,
|
|
5488
|
-
* even with the same description, will be treated as different tokens by Angular's DI system,
|
|
5489
|
-
* leading to a `NullInjectorError`.
|
|
5490
|
-
*
|
|
5491
|
-
* </div>
|
|
5492
|
-
*
|
|
5493
|
-
* <code-example format="typescript" language="typescript" path="injection-token/src/main.ts"
|
|
5494
|
-
* region="InjectionToken"></code-example>
|
|
5495
|
-
*
|
|
5496
|
-
* When creating an `InjectionToken`, you can optionally specify a factory function which returns
|
|
5497
|
-
* (possibly by creating) a default value of the parameterized type `T`. This sets up the
|
|
5498
|
-
* `InjectionToken` using this factory as a provider as if it was defined explicitly in the
|
|
5499
|
-
* application's root injector. If the factory function, which takes zero arguments, needs to inject
|
|
5500
|
-
* dependencies, it can do so using the [`inject`](api/core/inject) function.
|
|
5501
|
-
* As you can see in the Tree-shakable InjectionToken example below.
|
|
5502
|
-
*
|
|
5503
|
-
* Additionally, if a `factory` is specified you can also specify the `providedIn` option, which
|
|
5504
|
-
* overrides the above behavior and marks the token as belonging to a particular `@NgModule` (note:
|
|
5505
|
-
* this option is now deprecated). As mentioned above, `'root'` is the default value for
|
|
5506
|
-
* `providedIn`.
|
|
5507
|
-
*
|
|
5508
|
-
* The `providedIn: NgModule` and `providedIn: 'any'` options are deprecated.
|
|
5509
|
-
*
|
|
5510
|
-
* @usageNotes
|
|
5511
|
-
* ### Basic Examples
|
|
5512
|
-
*
|
|
5513
|
-
* ### Plain InjectionToken
|
|
5514
|
-
*
|
|
5515
|
-
* {@example core/di/ts/injector_spec.ts region='InjectionToken'}
|
|
5516
|
-
*
|
|
5517
|
-
* ### Tree-shakable InjectionToken
|
|
5518
|
-
*
|
|
5519
|
-
* {@example core/di/ts/injector_spec.ts region='ShakableInjectionToken'}
|
|
5520
|
-
*
|
|
5521
|
-
* @publicApi
|
|
5522
|
-
*/
|
|
5523
|
-
class InjectionToken {
|
|
5524
|
-
/**
|
|
5525
|
-
* @param _desc Description for the token,
|
|
5526
|
-
* used only for debugging purposes,
|
|
5527
|
-
* it should but does not need to be unique
|
|
5528
|
-
* @param options Options for the token's usage, as described above
|
|
5529
|
-
*/
|
|
5530
|
-
constructor(_desc, options) {
|
|
5531
|
-
this._desc = _desc;
|
|
5532
|
-
/** @internal */
|
|
5533
|
-
this.ngMetadataName = 'InjectionToken';
|
|
5534
|
-
this.ɵprov = undefined;
|
|
5535
|
-
if (typeof options == 'number') {
|
|
5536
|
-
(typeof ngDevMode === 'undefined' || ngDevMode) &&
|
|
5537
|
-
assertLessThan(options, 0, 'Only negative numbers are supported here');
|
|
5538
|
-
// This is a special hack to assign __NG_ELEMENT_ID__ to this instance.
|
|
5539
|
-
// See `InjectorMarkers`
|
|
5540
|
-
this.__NG_ELEMENT_ID__ = options;
|
|
5541
|
-
}
|
|
5542
|
-
else if (options !== undefined) {
|
|
5543
|
-
this.ɵprov = ɵɵdefineInjectable({
|
|
5544
|
-
token: this,
|
|
5545
|
-
providedIn: options.providedIn || 'root',
|
|
5546
|
-
factory: options.factory,
|
|
5547
|
-
});
|
|
5548
|
-
}
|
|
5549
|
-
}
|
|
5550
|
-
/**
|
|
5551
|
-
* @internal
|
|
5552
|
-
*/
|
|
5553
|
-
get multi() {
|
|
5554
|
-
return this;
|
|
5555
|
-
}
|
|
5556
|
-
toString() {
|
|
5557
|
-
return `InjectionToken ${this._desc}`;
|
|
5558
|
-
}
|
|
5559
|
-
}
|
|
5560
|
-
|
|
5561
5575
|
/**
|
|
5562
5576
|
* A multi-provider token for initialization functions that will run upon construction of an
|
|
5563
5577
|
* environment injector.
|
|
@@ -6002,6 +6016,11 @@ class R3Injector extends EnvironmentInjector {
|
|
|
6002
6016
|
if (def && this.injectableDefInScope(def)) {
|
|
6003
6017
|
// Found an injectable def and it's scoped to this injector. Pretend as if it was here
|
|
6004
6018
|
// all along.
|
|
6019
|
+
if (ngDevMode) {
|
|
6020
|
+
runInInjectorProfilerContext(this, token, () => {
|
|
6021
|
+
emitProviderConfiguredEvent(token);
|
|
6022
|
+
});
|
|
6023
|
+
}
|
|
6005
6024
|
record = makeRecord(injectableDefOrInjectorDefFactory(token), NOT_YET);
|
|
6006
6025
|
}
|
|
6007
6026
|
else {
|
|
@@ -6737,16 +6756,6 @@ const CSP_NONCE = new InjectionToken('CSP nonce', {
|
|
|
6737
6756
|
return getDocument().body?.querySelector('[ngCspNonce]')?.getAttribute('ngCspNonce') || null;
|
|
6738
6757
|
},
|
|
6739
6758
|
});
|
|
6740
|
-
/**
|
|
6741
|
-
* Internal token to collect all SSR-related features enabled for this application.
|
|
6742
|
-
*
|
|
6743
|
-
* Note: the token is in `core` to let other packages register features (the `core`
|
|
6744
|
-
* package is imported in other packages).
|
|
6745
|
-
*/
|
|
6746
|
-
const ENABLED_SSR_FEATURES = new InjectionToken((typeof ngDevMode === 'undefined' || ngDevMode) ? 'ENABLED_SSR_FEATURES' : '', {
|
|
6747
|
-
providedIn: 'root',
|
|
6748
|
-
factory: () => new Set(),
|
|
6749
|
-
});
|
|
6750
6759
|
const IMAGE_CONFIG_DEFAULTS = {
|
|
6751
6760
|
breakpoints: [16, 32, 48, 64, 96, 128, 256, 384, 640, 750, 828, 1080, 1200, 1920, 2048, 3840],
|
|
6752
6761
|
disableImageSizeWarning: false,
|
|
@@ -7407,11 +7416,12 @@ function matchingSchemas(schemas, tagName) {
|
|
|
7407
7416
|
* (component host node) to disable hydration for the content within that boundary.
|
|
7408
7417
|
*/
|
|
7409
7418
|
const SKIP_HYDRATION_ATTR_NAME = 'ngSkipHydration';
|
|
7419
|
+
/** Lowercase name of the `ngSkipHydration` attribute used for case-insensitive comparisons. */
|
|
7420
|
+
const SKIP_HYDRATION_ATTR_NAME_LOWER_CASE = 'ngskiphydration';
|
|
7410
7421
|
/**
|
|
7411
7422
|
* Helper function to check if a given TNode has the 'ngSkipHydration' attribute.
|
|
7412
7423
|
*/
|
|
7413
7424
|
function hasSkipHydrationAttrOnTNode(tNode) {
|
|
7414
|
-
const SKIP_HYDRATION_ATTR_NAME_LOWER_CASE = SKIP_HYDRATION_ATTR_NAME.toLowerCase();
|
|
7415
7425
|
const attrs = tNode.mergedAttrs;
|
|
7416
7426
|
if (attrs === null)
|
|
7417
7427
|
return false;
|
|
@@ -7445,15 +7455,14 @@ function hasInSkipHydrationBlockFlag(tNode) {
|
|
|
7445
7455
|
* Helper function that determines if a given node is within a skip hydration block
|
|
7446
7456
|
* by navigating up the TNode tree to see if any parent nodes have skip hydration
|
|
7447
7457
|
* attribute.
|
|
7448
|
-
*
|
|
7449
|
-
* TODO(akushnir): this function should contain the logic of `hasInSkipHydrationBlockFlag`,
|
|
7450
|
-
* there is no need to traverse parent nodes when we have a TNode flag (which would also
|
|
7451
|
-
* make this lookup O(1)).
|
|
7452
7458
|
*/
|
|
7453
7459
|
function isInSkipHydrationBlock(tNode) {
|
|
7460
|
+
if (hasInSkipHydrationBlockFlag(tNode)) {
|
|
7461
|
+
return true;
|
|
7462
|
+
}
|
|
7454
7463
|
let currentTNode = tNode.parent;
|
|
7455
7464
|
while (currentTNode) {
|
|
7456
|
-
if (hasSkipHydrationAttrOnTNode(currentTNode)) {
|
|
7465
|
+
if (hasInSkipHydrationBlockFlag(tNode) || hasSkipHydrationAttrOnTNode(currentTNode)) {
|
|
7457
7466
|
return true;
|
|
7458
7467
|
}
|
|
7459
7468
|
currentTNode = currentTNode.parent;
|
|
@@ -10417,7 +10426,7 @@ class Version {
|
|
|
10417
10426
|
/**
|
|
10418
10427
|
* @publicApi
|
|
10419
10428
|
*/
|
|
10420
|
-
const VERSION = new Version('17.0.0-rc.
|
|
10429
|
+
const VERSION = new Version('17.0.0-rc.1');
|
|
10421
10430
|
|
|
10422
10431
|
// This default value is when checking the hierarchy for a token.
|
|
10423
10432
|
//
|
|
@@ -11398,6 +11407,10 @@ var AfterRenderPhase;
|
|
|
11398
11407
|
*/
|
|
11399
11408
|
AfterRenderPhase[AfterRenderPhase["Read"] = 3] = "Read";
|
|
11400
11409
|
})(AfterRenderPhase || (AfterRenderPhase = {}));
|
|
11410
|
+
/** `AfterRenderRef` that does nothing. */
|
|
11411
|
+
const NOOP_AFTER_RENDER_REF = {
|
|
11412
|
+
destroy() { }
|
|
11413
|
+
};
|
|
11401
11414
|
/**
|
|
11402
11415
|
* Register a callback to run once before any userspace `afterRender` or
|
|
11403
11416
|
* `afterNextRender` callbacks.
|
|
@@ -11415,6 +11428,10 @@ var AfterRenderPhase;
|
|
|
11415
11428
|
*/
|
|
11416
11429
|
function internalAfterNextRender(callback, options) {
|
|
11417
11430
|
const injector = options?.injector ?? inject(Injector);
|
|
11431
|
+
// Similarly to the public `afterNextRender` function, an internal one
|
|
11432
|
+
// is only invoked in a browser.
|
|
11433
|
+
if (!isPlatformBrowser(injector))
|
|
11434
|
+
return;
|
|
11418
11435
|
const afterRenderEventManager = injector.get(AfterRenderEventManager);
|
|
11419
11436
|
afterRenderEventManager.internalCallbacks.push(callback);
|
|
11420
11437
|
}
|
|
@@ -11473,22 +11490,20 @@ function afterRender(callback, options) {
|
|
|
11473
11490
|
!options && assertInInjectionContext(afterRender);
|
|
11474
11491
|
const injector = options?.injector ?? inject(Injector);
|
|
11475
11492
|
if (!isPlatformBrowser(injector)) {
|
|
11476
|
-
return
|
|
11493
|
+
return NOOP_AFTER_RENDER_REF;
|
|
11477
11494
|
}
|
|
11478
|
-
|
|
11479
|
-
const unregisterFn = injector.get(DestroyRef).onDestroy(() => destroy?.());
|
|
11495
|
+
performance.mark('mark_use_counter', { detail: { feature: 'NgAfterRender' } });
|
|
11480
11496
|
const afterRenderEventManager = injector.get(AfterRenderEventManager);
|
|
11481
11497
|
// Lazily initialize the handler implementation, if necessary. This is so that it can be
|
|
11482
11498
|
// tree-shaken if `afterRender` and `afterNextRender` aren't used.
|
|
11483
11499
|
const callbackHandler = afterRenderEventManager.handler ??= new AfterRenderCallbackHandlerImpl();
|
|
11484
|
-
const ngZone = injector.get(NgZone);
|
|
11485
|
-
const errorHandler = injector.get(ErrorHandler, null, { optional: true });
|
|
11486
11500
|
const phase = options?.phase ?? AfterRenderPhase.MixedReadWrite;
|
|
11487
|
-
const
|
|
11488
|
-
destroy = () => {
|
|
11501
|
+
const destroy = () => {
|
|
11489
11502
|
callbackHandler.unregister(instance);
|
|
11490
11503
|
unregisterFn();
|
|
11491
11504
|
};
|
|
11505
|
+
const unregisterFn = injector.get(DestroyRef).onDestroy(destroy);
|
|
11506
|
+
const instance = new AfterRenderCallback(injector, phase, callback);
|
|
11492
11507
|
callbackHandler.register(instance);
|
|
11493
11508
|
return { destroy };
|
|
11494
11509
|
}
|
|
@@ -11545,25 +11560,23 @@ function afterNextRender(callback, options) {
|
|
|
11545
11560
|
!options && assertInInjectionContext(afterNextRender);
|
|
11546
11561
|
const injector = options?.injector ?? inject(Injector);
|
|
11547
11562
|
if (!isPlatformBrowser(injector)) {
|
|
11548
|
-
return
|
|
11563
|
+
return NOOP_AFTER_RENDER_REF;
|
|
11549
11564
|
}
|
|
11550
|
-
|
|
11551
|
-
const unregisterFn = injector.get(DestroyRef).onDestroy(() => destroy?.());
|
|
11565
|
+
performance.mark('mark_use_counter', { detail: { feature: 'NgAfterNextRender' } });
|
|
11552
11566
|
const afterRenderEventManager = injector.get(AfterRenderEventManager);
|
|
11553
11567
|
// Lazily initialize the handler implementation, if necessary. This is so that it can be
|
|
11554
11568
|
// tree-shaken if `afterRender` and `afterNextRender` aren't used.
|
|
11555
11569
|
const callbackHandler = afterRenderEventManager.handler ??= new AfterRenderCallbackHandlerImpl();
|
|
11556
|
-
const ngZone = injector.get(NgZone);
|
|
11557
|
-
const errorHandler = injector.get(ErrorHandler, null, { optional: true });
|
|
11558
11570
|
const phase = options?.phase ?? AfterRenderPhase.MixedReadWrite;
|
|
11559
|
-
const
|
|
11560
|
-
destroy?.();
|
|
11561
|
-
callback();
|
|
11562
|
-
});
|
|
11563
|
-
destroy = () => {
|
|
11571
|
+
const destroy = () => {
|
|
11564
11572
|
callbackHandler.unregister(instance);
|
|
11565
11573
|
unregisterFn();
|
|
11566
11574
|
};
|
|
11575
|
+
const unregisterFn = injector.get(DestroyRef).onDestroy(destroy);
|
|
11576
|
+
const instance = new AfterRenderCallback(injector, phase, () => {
|
|
11577
|
+
destroy();
|
|
11578
|
+
callback();
|
|
11579
|
+
});
|
|
11567
11580
|
callbackHandler.register(instance);
|
|
11568
11581
|
return { destroy };
|
|
11569
11582
|
}
|
|
@@ -11571,11 +11584,11 @@ function afterNextRender(callback, options) {
|
|
|
11571
11584
|
* A wrapper around a function to be used as an after render callback.
|
|
11572
11585
|
*/
|
|
11573
11586
|
class AfterRenderCallback {
|
|
11574
|
-
constructor(
|
|
11575
|
-
this.zone = zone;
|
|
11576
|
-
this.errorHandler = errorHandler;
|
|
11587
|
+
constructor(injector, phase, callbackFn) {
|
|
11577
11588
|
this.phase = phase;
|
|
11578
11589
|
this.callbackFn = callbackFn;
|
|
11590
|
+
this.zone = injector.get(NgZone);
|
|
11591
|
+
this.errorHandler = injector.get(ErrorHandler, null, { optional: true });
|
|
11579
11592
|
}
|
|
11580
11593
|
invoke() {
|
|
11581
11594
|
try {
|
|
@@ -13525,6 +13538,10 @@ function collectNativeNodesInLContainer(lContainer, result) {
|
|
|
13525
13538
|
}
|
|
13526
13539
|
}
|
|
13527
13540
|
|
|
13541
|
+
/**
|
|
13542
|
+
* The maximum number of times the change detection traversal will rerun before throwing an error.
|
|
13543
|
+
*/
|
|
13544
|
+
const MAXIMUM_REFRESH_RERUNS = 100;
|
|
13528
13545
|
function detectChangesInternal(tView, lView, context, notifyErrorHandler = true) {
|
|
13529
13546
|
const environment = lView[ENVIRONMENT];
|
|
13530
13547
|
const rendererFactory = environment.rendererFactory;
|
|
@@ -13539,6 +13556,23 @@ function detectChangesInternal(tView, lView, context, notifyErrorHandler = true)
|
|
|
13539
13556
|
}
|
|
13540
13557
|
try {
|
|
13541
13558
|
refreshView(tView, lView, tView.template, context);
|
|
13559
|
+
let retries = 0;
|
|
13560
|
+
// If after running change detection, this view still needs to be refreshed or there are
|
|
13561
|
+
// descendants views that need to be refreshed due to re-dirtying during the change detection
|
|
13562
|
+
// run, detect changes on the view again. We run change detection in `Targeted` mode to only
|
|
13563
|
+
// refresh views with the `RefreshView` flag.
|
|
13564
|
+
while (lView[FLAGS] & (1024 /* LViewFlags.RefreshView */ | 8192 /* LViewFlags.HasChildViewsToRefresh */)) {
|
|
13565
|
+
if (retries === MAXIMUM_REFRESH_RERUNS) {
|
|
13566
|
+
throw new RuntimeError(103 /* RuntimeErrorCode.INFINITE_CHANGE_DETECTION */, ngDevMode &&
|
|
13567
|
+
'Infinite change detection while trying to refresh views. ' +
|
|
13568
|
+
'There may be components which each cause the other to require a refresh, ' +
|
|
13569
|
+
'causing an infinite loop.');
|
|
13570
|
+
}
|
|
13571
|
+
retries++;
|
|
13572
|
+
// Even if this view is detached, we still detect changes in targeted mode because this was
|
|
13573
|
+
// the root of the change detection run.
|
|
13574
|
+
detectChangesInView(lView, 1 /* ChangeDetectionMode.Targeted */);
|
|
13575
|
+
}
|
|
13542
13576
|
}
|
|
13543
13577
|
catch (error) {
|
|
13544
13578
|
if (notifyErrorHandler) {
|
|
@@ -13693,7 +13727,6 @@ function refreshView(tView, lView, templateFn, context) {
|
|
|
13693
13727
|
if (!isInCheckNoChangesPass) {
|
|
13694
13728
|
lView[FLAGS] &= ~(64 /* LViewFlags.Dirty */ | 8 /* LViewFlags.FirstLViewPass */);
|
|
13695
13729
|
}
|
|
13696
|
-
lView[FLAGS] &= ~1024 /* LViewFlags.RefreshView */;
|
|
13697
13730
|
}
|
|
13698
13731
|
catch (e) {
|
|
13699
13732
|
// If refreshing a view causes an error, we need to remark the ancestors as needing traversal
|
|
@@ -13776,7 +13809,7 @@ function detectChangesInView(lView, mode) {
|
|
|
13776
13809
|
const flags = lView[FLAGS];
|
|
13777
13810
|
// Flag cleared before change detection runs so that the view can be re-marked for traversal if
|
|
13778
13811
|
// necessary.
|
|
13779
|
-
lView[FLAGS] &= ~8192 /* LViewFlags.HasChildViewsToRefresh
|
|
13812
|
+
lView[FLAGS] &= ~(8192 /* LViewFlags.HasChildViewsToRefresh */ | 1024 /* LViewFlags.RefreshView */);
|
|
13780
13813
|
if ((flags & (16 /* LViewFlags.CheckAlways */ | 64 /* LViewFlags.Dirty */) &&
|
|
13781
13814
|
mode === 0 /* ChangeDetectionMode.Global */) ||
|
|
13782
13815
|
flags & 1024 /* LViewFlags.RefreshView */) {
|
|
@@ -18960,10 +18993,8 @@ function populateDehydratedViewsInLContainerImpl(lContainer, tNode, hostLView) {
|
|
|
18960
18993
|
}
|
|
18961
18994
|
const hydrationInfo = hostLView[HYDRATION];
|
|
18962
18995
|
const noOffsetIndex = tNode.index - HEADER_OFFSET;
|
|
18963
|
-
|
|
18964
|
-
|
|
18965
|
-
const skipHydration = isInSkipHydrationBlock(tNode) || hasInSkipHydrationBlockFlag(tNode);
|
|
18966
|
-
const isNodeCreationMode = !hydrationInfo || skipHydration || isDisconnectedNode$1(hydrationInfo, noOffsetIndex);
|
|
18996
|
+
const isNodeCreationMode = !hydrationInfo || isInSkipHydrationBlock(tNode) ||
|
|
18997
|
+
isDisconnectedNode$1(hydrationInfo, noOffsetIndex);
|
|
18967
18998
|
// Regular creation mode.
|
|
18968
18999
|
if (isNodeCreationMode) {
|
|
18969
19000
|
return false;
|
|
@@ -19355,75 +19386,6 @@ function getExistingTNode(tView, index) {
|
|
|
19355
19386
|
return tNode;
|
|
19356
19387
|
}
|
|
19357
19388
|
|
|
19358
|
-
/*!
|
|
19359
|
-
* @license
|
|
19360
|
-
* Copyright Google LLC All Rights Reserved.
|
|
19361
|
-
*
|
|
19362
|
-
* Use of this source code is governed by an MIT-style license that can be
|
|
19363
|
-
* found in the LICENSE file at https://angular.io/license
|
|
19364
|
-
*/
|
|
19365
|
-
/**
|
|
19366
|
-
* Registers a cleanup function associated with a prefetching trigger
|
|
19367
|
-
* of a given defer block.
|
|
19368
|
-
*/
|
|
19369
|
-
function registerTDetailsCleanup(injector, tDetails, key, cleanupFn) {
|
|
19370
|
-
injector.get(DeferBlockCleanupManager).add(tDetails, key, cleanupFn);
|
|
19371
|
-
}
|
|
19372
|
-
/**
|
|
19373
|
-
* Invokes all registered prefetch cleanup triggers
|
|
19374
|
-
* and removes all cleanup functions afterwards.
|
|
19375
|
-
*/
|
|
19376
|
-
function invokeTDetailsCleanup(injector, tDetails) {
|
|
19377
|
-
injector.get(DeferBlockCleanupManager).cleanup(tDetails);
|
|
19378
|
-
}
|
|
19379
|
-
/**
|
|
19380
|
-
* Internal service to keep track of cleanup functions associated
|
|
19381
|
-
* with defer blocks. This class is used to manage cleanup functions
|
|
19382
|
-
* created for prefetching triggers.
|
|
19383
|
-
*/
|
|
19384
|
-
class DeferBlockCleanupManager {
|
|
19385
|
-
constructor() {
|
|
19386
|
-
this.blocks = new Map();
|
|
19387
|
-
}
|
|
19388
|
-
add(tDetails, key, callback) {
|
|
19389
|
-
if (!this.blocks.has(tDetails)) {
|
|
19390
|
-
this.blocks.set(tDetails, new Map());
|
|
19391
|
-
}
|
|
19392
|
-
const block = this.blocks.get(tDetails);
|
|
19393
|
-
if (!block.has(key)) {
|
|
19394
|
-
block.set(key, []);
|
|
19395
|
-
}
|
|
19396
|
-
const callbacks = block.get(key);
|
|
19397
|
-
callbacks.push(callback);
|
|
19398
|
-
}
|
|
19399
|
-
has(tDetails, key) {
|
|
19400
|
-
return !!this.blocks.get(tDetails)?.has(key);
|
|
19401
|
-
}
|
|
19402
|
-
cleanup(tDetails) {
|
|
19403
|
-
const block = this.blocks.get(tDetails);
|
|
19404
|
-
if (block) {
|
|
19405
|
-
for (const callbacks of Object.values(block)) {
|
|
19406
|
-
for (const callback of callbacks) {
|
|
19407
|
-
callback();
|
|
19408
|
-
}
|
|
19409
|
-
}
|
|
19410
|
-
this.blocks.delete(tDetails);
|
|
19411
|
-
}
|
|
19412
|
-
}
|
|
19413
|
-
ngOnDestroy() {
|
|
19414
|
-
for (const [block] of this.blocks) {
|
|
19415
|
-
this.cleanup(block);
|
|
19416
|
-
}
|
|
19417
|
-
this.blocks.clear();
|
|
19418
|
-
}
|
|
19419
|
-
/** @nocollapse */
|
|
19420
|
-
static { this.ɵprov = ɵɵdefineInjectable({
|
|
19421
|
-
token: DeferBlockCleanupManager,
|
|
19422
|
-
providedIn: 'root',
|
|
19423
|
-
factory: () => new DeferBlockCleanupManager(),
|
|
19424
|
-
}); }
|
|
19425
|
-
}
|
|
19426
|
-
|
|
19427
19389
|
/**
|
|
19428
19390
|
* Describes the state of defer block dependency loading.
|
|
19429
19391
|
*/
|
|
@@ -19478,6 +19440,8 @@ const NEXT_DEFER_BLOCK_STATE = 0;
|
|
|
19478
19440
|
const DEFER_BLOCK_STATE = 1;
|
|
19479
19441
|
const STATE_IS_FROZEN_UNTIL = 2;
|
|
19480
19442
|
const LOADING_AFTER_CLEANUP_FN = 3;
|
|
19443
|
+
const TRIGGER_CLEANUP_FNS = 4;
|
|
19444
|
+
const PREFETCH_TRIGGER_CLEANUP_FNS = 5;
|
|
19481
19445
|
/**
|
|
19482
19446
|
* Options for configuring defer blocks behavior.
|
|
19483
19447
|
* @publicApi
|
|
@@ -19496,18 +19460,45 @@ var DeferBlockBehavior;
|
|
|
19496
19460
|
DeferBlockBehavior[DeferBlockBehavior["Playthrough"] = 1] = "Playthrough";
|
|
19497
19461
|
})(DeferBlockBehavior || (DeferBlockBehavior = {}));
|
|
19498
19462
|
|
|
19463
|
+
/*!
|
|
19464
|
+
* @license
|
|
19465
|
+
* Copyright Google LLC All Rights Reserved.
|
|
19466
|
+
*
|
|
19467
|
+
* Use of this source code is governed by an MIT-style license that can be
|
|
19468
|
+
* found in the LICENSE file at https://angular.io/license
|
|
19469
|
+
*/
|
|
19499
19470
|
/**
|
|
19500
|
-
*
|
|
19501
|
-
*
|
|
19471
|
+
* Registers a cleanup function associated with a prefetching trigger
|
|
19472
|
+
* or a regular trigger of a defer block.
|
|
19502
19473
|
*/
|
|
19503
|
-
function
|
|
19504
|
-
const
|
|
19505
|
-
|
|
19506
|
-
|
|
19507
|
-
}
|
|
19508
|
-
|
|
19509
|
-
return wrappedCallback;
|
|
19474
|
+
function storeTriggerCleanupFn(type, lDetails, cleanupFn) {
|
|
19475
|
+
const key = type === 1 /* TriggerType.Prefetch */ ? PREFETCH_TRIGGER_CLEANUP_FNS : TRIGGER_CLEANUP_FNS;
|
|
19476
|
+
if (lDetails[key] === null) {
|
|
19477
|
+
lDetails[key] = [];
|
|
19478
|
+
}
|
|
19479
|
+
lDetails[key].push(cleanupFn);
|
|
19510
19480
|
}
|
|
19481
|
+
/**
|
|
19482
|
+
* Invokes registered cleanup functions either for prefetch or for regular triggers.
|
|
19483
|
+
*/
|
|
19484
|
+
function invokeTriggerCleanupFns(type, lDetails) {
|
|
19485
|
+
const key = type === 1 /* TriggerType.Prefetch */ ? PREFETCH_TRIGGER_CLEANUP_FNS : TRIGGER_CLEANUP_FNS;
|
|
19486
|
+
const cleanupFns = lDetails[key];
|
|
19487
|
+
if (cleanupFns !== null) {
|
|
19488
|
+
for (const cleanupFn of cleanupFns) {
|
|
19489
|
+
cleanupFn();
|
|
19490
|
+
}
|
|
19491
|
+
lDetails[key] = null;
|
|
19492
|
+
}
|
|
19493
|
+
}
|
|
19494
|
+
/**
|
|
19495
|
+
* Invokes registered cleanup functions for both prefetch and regular triggers.
|
|
19496
|
+
*/
|
|
19497
|
+
function invokeAllTriggerCleanupFns(lDetails) {
|
|
19498
|
+
invokeTriggerCleanupFns(1 /* TriggerType.Prefetch */, lDetails);
|
|
19499
|
+
invokeTriggerCleanupFns(0 /* TriggerType.Regular */, lDetails);
|
|
19500
|
+
}
|
|
19501
|
+
|
|
19511
19502
|
/**
|
|
19512
19503
|
* Calculates a data slot index for defer block info (either static or
|
|
19513
19504
|
* instance-specific), given an index of a defer instruction.
|
|
@@ -19659,9 +19650,8 @@ class DeferEventEntry {
|
|
|
19659
19650
|
* Registers an interaction trigger.
|
|
19660
19651
|
* @param trigger Element that is the trigger.
|
|
19661
19652
|
* @param callback Callback to be invoked when the trigger is interacted with.
|
|
19662
|
-
* @param injector Injector that can be used by the trigger to resolve DI tokens.
|
|
19663
19653
|
*/
|
|
19664
|
-
function onInteraction(trigger, callback
|
|
19654
|
+
function onInteraction(trigger, callback) {
|
|
19665
19655
|
let entry = interactionTriggers.get(trigger);
|
|
19666
19656
|
// If this is the first entry for this element, add the listeners.
|
|
19667
19657
|
if (!entry) {
|
|
@@ -19700,9 +19690,8 @@ function onInteraction(trigger, callback, injector) {
|
|
|
19700
19690
|
* Registers a hover trigger.
|
|
19701
19691
|
* @param trigger Element that is the trigger.
|
|
19702
19692
|
* @param callback Callback to be invoked when the trigger is hovered over.
|
|
19703
|
-
* @param injector Injector that can be used by the trigger to resolve DI tokens.
|
|
19704
19693
|
*/
|
|
19705
|
-
function onHover(trigger, callback
|
|
19694
|
+
function onHover(trigger, callback) {
|
|
19706
19695
|
let entry = hoverTriggers.get(trigger);
|
|
19707
19696
|
// If this is the first entry for this element, add the listener.
|
|
19708
19697
|
if (!entry) {
|
|
@@ -19818,8 +19807,9 @@ function getTriggerElement(triggerLView, triggerIndex) {
|
|
|
19818
19807
|
* @param registerFn Function that will register the DOM events.
|
|
19819
19808
|
* @param callback Callback to be invoked when the trigger receives the event that should render
|
|
19820
19809
|
* the deferred block.
|
|
19810
|
+
* @param type Trigger type to distinguish between regular and prefetch triggers.
|
|
19821
19811
|
*/
|
|
19822
|
-
function registerDomTrigger(initialLView, tNode, triggerIndex, walkUpTimes, registerFn, callback) {
|
|
19812
|
+
function registerDomTrigger(initialLView, tNode, triggerIndex, walkUpTimes, registerFn, callback, type) {
|
|
19823
19813
|
const injector = initialLView[INJECTOR$1];
|
|
19824
19814
|
function pollDomTrigger() {
|
|
19825
19815
|
// If the initial view was destroyed, we don't need to do anything.
|
|
@@ -19843,22 +19833,22 @@ function registerDomTrigger(initialLView, tNode, triggerIndex, walkUpTimes, regi
|
|
|
19843
19833
|
if (isDestroyed(triggerLView)) {
|
|
19844
19834
|
return;
|
|
19845
19835
|
}
|
|
19846
|
-
// TODO: add integration with `DeferBlockCleanupManager`.
|
|
19847
19836
|
const element = getTriggerElement(triggerLView, triggerIndex);
|
|
19848
19837
|
const cleanup = registerFn(element, () => {
|
|
19849
|
-
callback();
|
|
19850
|
-
removeLViewOnDestroy(triggerLView, cleanup);
|
|
19851
19838
|
if (initialLView !== triggerLView) {
|
|
19852
|
-
removeLViewOnDestroy(
|
|
19839
|
+
removeLViewOnDestroy(triggerLView, cleanup);
|
|
19853
19840
|
}
|
|
19854
|
-
|
|
19841
|
+
callback();
|
|
19855
19842
|
}, injector);
|
|
19856
|
-
|
|
19857
|
-
//
|
|
19858
|
-
//
|
|
19843
|
+
// The trigger and deferred block might be in different LViews.
|
|
19844
|
+
// For the main LView the cleanup would happen as a part of
|
|
19845
|
+
// `storeTriggerCleanupFn` logic. For trigger LView we register
|
|
19846
|
+
// a cleanup function there to remove event handlers in case an
|
|
19847
|
+
// LView gets destroyed before a trigger is invoked.
|
|
19859
19848
|
if (initialLView !== triggerLView) {
|
|
19860
|
-
storeLViewOnDestroy(
|
|
19849
|
+
storeLViewOnDestroy(triggerLView, cleanup);
|
|
19861
19850
|
}
|
|
19851
|
+
storeTriggerCleanupFn(type, lDetails, cleanup);
|
|
19862
19852
|
}
|
|
19863
19853
|
// Begin polling for the trigger.
|
|
19864
19854
|
internalAfterNextRender(pollDomTrigger, { injector });
|
|
@@ -19869,16 +19859,12 @@ function registerDomTrigger(initialLView, tNode, triggerIndex, walkUpTimes, regi
|
|
|
19869
19859
|
*
|
|
19870
19860
|
* @param callback A function to be invoked when a browser becomes idle.
|
|
19871
19861
|
* @param lView LView that hosts an instance of a defer block.
|
|
19872
|
-
* @param withLViewCleanup A flag that indicates whether a scheduled callback
|
|
19873
|
-
* should be cancelled in case an LView is destroyed before a callback
|
|
19874
|
-
* was invoked.
|
|
19875
19862
|
*/
|
|
19876
|
-
function onIdle(callback, lView
|
|
19863
|
+
function onIdle(callback, lView) {
|
|
19877
19864
|
const injector = lView[INJECTOR$1];
|
|
19878
19865
|
const scheduler = injector.get(IdleScheduler);
|
|
19879
19866
|
const cleanupFn = () => scheduler.remove(callback);
|
|
19880
|
-
|
|
19881
|
-
scheduler.add(wrappedCallback);
|
|
19867
|
+
scheduler.add(callback);
|
|
19882
19868
|
return cleanupFn;
|
|
19883
19869
|
}
|
|
19884
19870
|
/**
|
|
@@ -19907,8 +19893,8 @@ class IdleScheduler {
|
|
|
19907
19893
|
// Those callbacks are scheduled for the next idle period.
|
|
19908
19894
|
this.deferred = new Set();
|
|
19909
19895
|
this.ngZone = inject(NgZone);
|
|
19910
|
-
this.
|
|
19911
|
-
this.
|
|
19896
|
+
this.requestIdleCallbackFn = _requestIdleCallback().bind(globalThis);
|
|
19897
|
+
this.cancelIdleCallbackFn = _cancelIdleCallback().bind(globalThis);
|
|
19912
19898
|
}
|
|
19913
19899
|
add(callback) {
|
|
19914
19900
|
const target = this.executingCallbacks ? this.deferred : this.current;
|
|
@@ -19918,13 +19904,18 @@ class IdleScheduler {
|
|
|
19918
19904
|
}
|
|
19919
19905
|
}
|
|
19920
19906
|
remove(callback) {
|
|
19921
|
-
this
|
|
19922
|
-
|
|
19907
|
+
const { current, deferred } = this;
|
|
19908
|
+
current.delete(callback);
|
|
19909
|
+
deferred.delete(callback);
|
|
19910
|
+
// If the last callback was removed and there is a pending
|
|
19911
|
+
// idle callback - cancel it.
|
|
19912
|
+
if (current.size === 0 && deferred.size === 0) {
|
|
19913
|
+
this.cancelIdleCallback();
|
|
19914
|
+
}
|
|
19923
19915
|
}
|
|
19924
19916
|
scheduleIdleCallback() {
|
|
19925
19917
|
const callback = () => {
|
|
19926
|
-
this.cancelIdleCallback(
|
|
19927
|
-
this.idleId = null;
|
|
19918
|
+
this.cancelIdleCallback();
|
|
19928
19919
|
this.executingCallbacks = true;
|
|
19929
19920
|
for (const callback of this.current) {
|
|
19930
19921
|
callback();
|
|
@@ -19944,13 +19935,16 @@ class IdleScheduler {
|
|
|
19944
19935
|
};
|
|
19945
19936
|
// Ensure that the callback runs in the NgZone since
|
|
19946
19937
|
// the `requestIdleCallback` is not currently patched by Zone.js.
|
|
19947
|
-
this.idleId = this.
|
|
19938
|
+
this.idleId = this.requestIdleCallbackFn(() => this.ngZone.run(callback));
|
|
19948
19939
|
}
|
|
19949
|
-
|
|
19940
|
+
cancelIdleCallback() {
|
|
19950
19941
|
if (this.idleId !== null) {
|
|
19951
|
-
this.
|
|
19942
|
+
this.cancelIdleCallbackFn(this.idleId);
|
|
19952
19943
|
this.idleId = null;
|
|
19953
19944
|
}
|
|
19945
|
+
}
|
|
19946
|
+
ngOnDestroy() {
|
|
19947
|
+
this.cancelIdleCallback();
|
|
19954
19948
|
this.current.clear();
|
|
19955
19949
|
this.deferred.clear();
|
|
19956
19950
|
}
|
|
@@ -19967,7 +19961,7 @@ class IdleScheduler {
|
|
|
19967
19961
|
* Invoking the returned function schedules a trigger.
|
|
19968
19962
|
*/
|
|
19969
19963
|
function onTimer(delay) {
|
|
19970
|
-
return (callback, lView
|
|
19964
|
+
return (callback, lView) => scheduleTimerTrigger(delay, callback, lView);
|
|
19971
19965
|
}
|
|
19972
19966
|
/**
|
|
19973
19967
|
* Schedules a callback to be invoked after a given timeout.
|
|
@@ -19975,16 +19969,12 @@ function onTimer(delay) {
|
|
|
19975
19969
|
* @param delay A number of ms to wait until firing a callback.
|
|
19976
19970
|
* @param callback A function to be invoked after a timeout.
|
|
19977
19971
|
* @param lView LView that hosts an instance of a defer block.
|
|
19978
|
-
* @param withLViewCleanup A flag that indicates whether a scheduled callback
|
|
19979
|
-
* should be cancelled in case an LView is destroyed before a callback
|
|
19980
|
-
* was invoked.
|
|
19981
19972
|
*/
|
|
19982
|
-
function scheduleTimerTrigger(delay, callback, lView
|
|
19973
|
+
function scheduleTimerTrigger(delay, callback, lView) {
|
|
19983
19974
|
const injector = lView[INJECTOR$1];
|
|
19984
19975
|
const scheduler = injector.get(TimerScheduler);
|
|
19985
19976
|
const cleanupFn = () => scheduler.remove(callback);
|
|
19986
|
-
|
|
19987
|
-
scheduler.add(delay, wrappedCallback);
|
|
19977
|
+
scheduler.add(delay, callback);
|
|
19988
19978
|
return cleanupFn;
|
|
19989
19979
|
}
|
|
19990
19980
|
/**
|
|
@@ -20018,11 +20008,16 @@ class TimerScheduler {
|
|
|
20018
20008
|
this.scheduleTimer();
|
|
20019
20009
|
}
|
|
20020
20010
|
remove(callback) {
|
|
20021
|
-
const
|
|
20011
|
+
const { current, deferred } = this;
|
|
20012
|
+
const callbackIndex = this.removeFromQueue(current, callback);
|
|
20022
20013
|
if (callbackIndex === -1) {
|
|
20023
20014
|
// Try cleaning up deferred queue only in case
|
|
20024
20015
|
// we didn't find a callback in the "current" queue.
|
|
20025
|
-
this.removeFromQueue(
|
|
20016
|
+
this.removeFromQueue(deferred, callback);
|
|
20017
|
+
}
|
|
20018
|
+
// If the last callback was removed and there is a pending timeout - cancel it.
|
|
20019
|
+
if (current.length === 0 && deferred.length === 0) {
|
|
20020
|
+
this.clearTimeout();
|
|
20026
20021
|
}
|
|
20027
20022
|
}
|
|
20028
20023
|
addToQueue(target, invokeAt, callback) {
|
|
@@ -20058,20 +20053,32 @@ class TimerScheduler {
|
|
|
20058
20053
|
}
|
|
20059
20054
|
scheduleTimer() {
|
|
20060
20055
|
const callback = () => {
|
|
20061
|
-
clearTimeout(
|
|
20062
|
-
this.timeoutId = null;
|
|
20056
|
+
this.clearTimeout();
|
|
20063
20057
|
this.executingCallbacks = true;
|
|
20064
|
-
//
|
|
20065
|
-
//
|
|
20066
|
-
|
|
20067
|
-
|
|
20058
|
+
// Clone the current state of the queue, since it might be altered
|
|
20059
|
+
// as we invoke callbacks.
|
|
20060
|
+
const current = [...this.current];
|
|
20061
|
+
// Invoke callbacks that were scheduled to run before the current time.
|
|
20062
|
+
const now = Date.now();
|
|
20063
|
+
for (let i = 0; i < current.length; i += 2) {
|
|
20064
|
+
const invokeAt = current[i];
|
|
20065
|
+
const callback = current[i + 1];
|
|
20066
|
+
if (invokeAt <= now) {
|
|
20067
|
+
callback();
|
|
20068
|
+
}
|
|
20069
|
+
else {
|
|
20070
|
+
// We've reached a timer that should not be invoked yet.
|
|
20071
|
+
break;
|
|
20072
|
+
}
|
|
20073
|
+
}
|
|
20074
|
+
// The state of the queue might've changed after callbacks invocation,
|
|
20075
|
+
// run the cleanup logic based on the *current* state of the queue.
|
|
20076
|
+
let lastCallbackIndex = -1;
|
|
20068
20077
|
for (let i = 0; i < this.current.length; i += 2) {
|
|
20069
20078
|
const invokeAt = this.current[i];
|
|
20070
|
-
const callback = this.current[i + 1];
|
|
20071
20079
|
if (invokeAt <= now) {
|
|
20072
|
-
callback
|
|
20073
|
-
//
|
|
20074
|
-
// after the timestamp.
|
|
20080
|
+
// Add +1 to account for a callback function that
|
|
20081
|
+
// goes after the timestamp in events array.
|
|
20075
20082
|
lastCallbackIndex = i + 1;
|
|
20076
20083
|
}
|
|
20077
20084
|
else {
|
|
@@ -20079,10 +20086,7 @@ class TimerScheduler {
|
|
|
20079
20086
|
break;
|
|
20080
20087
|
}
|
|
20081
20088
|
}
|
|
20082
|
-
if (lastCallbackIndex
|
|
20083
|
-
// If last callback index is `null` - no callbacks were invoked,
|
|
20084
|
-
// so no cleanup is needed. Otherwise, remove invoked callbacks
|
|
20085
|
-
// from the queue.
|
|
20089
|
+
if (lastCallbackIndex >= 0) {
|
|
20086
20090
|
arraySplice(this.current, 0, lastCallbackIndex + 1);
|
|
20087
20091
|
}
|
|
20088
20092
|
this.executingCallbacks = false;
|
|
@@ -20109,29 +20113,29 @@ class TimerScheduler {
|
|
|
20109
20113
|
// First element in the queue points at the timestamp
|
|
20110
20114
|
// of the first (earliest) event.
|
|
20111
20115
|
const invokeAt = this.current[0];
|
|
20112
|
-
if (
|
|
20116
|
+
if (this.timeoutId === null ||
|
|
20113
20117
|
// Reschedule a timer in case a queue contains an item with
|
|
20114
20118
|
// an earlier timestamp and the delta is more than an average
|
|
20115
20119
|
// frame duration.
|
|
20116
20120
|
(this.invokeTimerAt && (this.invokeTimerAt - invokeAt > FRAME_DURATION_MS))) {
|
|
20117
|
-
|
|
20118
|
-
|
|
20119
|
-
|
|
20120
|
-
|
|
20121
|
-
clearTimeout(this.timeoutId);
|
|
20122
|
-
this.timeoutId = null;
|
|
20123
|
-
}
|
|
20121
|
+
// There was a timeout already, but an earlier event was added
|
|
20122
|
+
// into the queue. In this case we drop an old timer and setup
|
|
20123
|
+
// a new one with an updated (smaller) timeout.
|
|
20124
|
+
this.clearTimeout();
|
|
20124
20125
|
const timeout = Math.max(invokeAt - now, FRAME_DURATION_MS);
|
|
20125
20126
|
this.invokeTimerAt = invokeAt;
|
|
20126
20127
|
this.timeoutId = setTimeout(callback, timeout);
|
|
20127
20128
|
}
|
|
20128
20129
|
}
|
|
20129
20130
|
}
|
|
20130
|
-
|
|
20131
|
+
clearTimeout() {
|
|
20131
20132
|
if (this.timeoutId !== null) {
|
|
20132
20133
|
clearTimeout(this.timeoutId);
|
|
20133
20134
|
this.timeoutId = null;
|
|
20134
20135
|
}
|
|
20136
|
+
}
|
|
20137
|
+
ngOnDestroy() {
|
|
20138
|
+
this.clearTimeout();
|
|
20135
20139
|
this.current.length = 0;
|
|
20136
20140
|
this.deferred.length = 0;
|
|
20137
20141
|
}
|
|
@@ -20218,6 +20222,7 @@ function ɵɵdefer(index, primaryTmplIndex, dependencyResolverFn, loadingTmplInd
|
|
|
20218
20222
|
const adjustedIndex = index + HEADER_OFFSET;
|
|
20219
20223
|
ɵɵtemplate(index, null, 0, 0);
|
|
20220
20224
|
if (tView.firstCreatePass) {
|
|
20225
|
+
performance.mark('mark_use_counter', { detail: { feature: 'NgDefer' } });
|
|
20221
20226
|
const tDetails = {
|
|
20222
20227
|
primaryTmplIndex,
|
|
20223
20228
|
loadingTmplIndex: loadingTmplIndex ?? null,
|
|
@@ -20243,9 +20248,15 @@ function ɵɵdefer(index, primaryTmplIndex, dependencyResolverFn, loadingTmplInd
|
|
|
20243
20248
|
null,
|
|
20244
20249
|
DeferBlockInternalState.Initial,
|
|
20245
20250
|
null,
|
|
20246
|
-
null
|
|
20251
|
+
null,
|
|
20252
|
+
null,
|
|
20253
|
+
null // PREFETCH_TRIGGER_CLEANUP_FNS
|
|
20247
20254
|
];
|
|
20248
20255
|
setLDeferBlockDetails(lView, adjustedIndex, lDetails);
|
|
20256
|
+
const cleanupTriggersFn = () => invokeAllTriggerCleanupFns(lDetails);
|
|
20257
|
+
// When defer block is triggered - unsubscribe from LView destroy cleanup.
|
|
20258
|
+
storeTriggerCleanupFn(0 /* TriggerType.Regular */, lDetails, () => removeLViewOnDestroy(lView, cleanupTriggersFn));
|
|
20259
|
+
storeLViewOnDestroy(lView, cleanupTriggersFn);
|
|
20249
20260
|
}
|
|
20250
20261
|
/**
|
|
20251
20262
|
* Loads defer block dependencies when a trigger value becomes truthy.
|
|
@@ -20287,7 +20298,7 @@ function ɵɵdeferPrefetchWhen(rawValue) {
|
|
|
20287
20298
|
const tDetails = getTDeferBlockDetails(tView, tNode);
|
|
20288
20299
|
if (value === true && tDetails.loadingState === DeferDependenciesLoadingState.NOT_STARTED) {
|
|
20289
20300
|
// If loading has not been started yet, trigger it now.
|
|
20290
|
-
triggerPrefetching(tDetails, lView);
|
|
20301
|
+
triggerPrefetching(tDetails, lView, tNode);
|
|
20291
20302
|
}
|
|
20292
20303
|
}
|
|
20293
20304
|
}
|
|
@@ -20303,7 +20314,7 @@ function ɵɵdeferOnIdle() {
|
|
|
20303
20314
|
* @codeGenApi
|
|
20304
20315
|
*/
|
|
20305
20316
|
function ɵɵdeferPrefetchOnIdle() {
|
|
20306
|
-
scheduleDelayedPrefetching(onIdle
|
|
20317
|
+
scheduleDelayedPrefetching(onIdle);
|
|
20307
20318
|
}
|
|
20308
20319
|
/**
|
|
20309
20320
|
* Sets up logic to handle the `on immediate` deferred trigger.
|
|
@@ -20332,7 +20343,7 @@ function ɵɵdeferPrefetchOnImmediate() {
|
|
|
20332
20343
|
const tView = lView[TVIEW];
|
|
20333
20344
|
const tDetails = getTDeferBlockDetails(tView, tNode);
|
|
20334
20345
|
if (tDetails.loadingState === DeferDependenciesLoadingState.NOT_STARTED) {
|
|
20335
|
-
triggerResourceLoading(tDetails, lView);
|
|
20346
|
+
triggerResourceLoading(tDetails, lView, tNode);
|
|
20336
20347
|
}
|
|
20337
20348
|
}
|
|
20338
20349
|
/**
|
|
@@ -20349,7 +20360,7 @@ function ɵɵdeferOnTimer(delay) {
|
|
|
20349
20360
|
* @codeGenApi
|
|
20350
20361
|
*/
|
|
20351
20362
|
function ɵɵdeferPrefetchOnTimer(delay) {
|
|
20352
|
-
scheduleDelayedPrefetching(onTimer(delay)
|
|
20363
|
+
scheduleDelayedPrefetching(onTimer(delay));
|
|
20353
20364
|
}
|
|
20354
20365
|
/**
|
|
20355
20366
|
* Creates runtime data structures for the `on hover` deferred trigger.
|
|
@@ -20361,7 +20372,7 @@ function ɵɵdeferOnHover(triggerIndex, walkUpTimes) {
|
|
|
20361
20372
|
const lView = getLView();
|
|
20362
20373
|
const tNode = getCurrentTNode();
|
|
20363
20374
|
renderPlaceholder(lView, tNode);
|
|
20364
|
-
registerDomTrigger(lView, tNode, triggerIndex, walkUpTimes, onHover, () => triggerDeferBlock(lView, tNode));
|
|
20375
|
+
registerDomTrigger(lView, tNode, triggerIndex, walkUpTimes, onHover, () => triggerDeferBlock(lView, tNode), 0 /* TriggerType.Regular */);
|
|
20365
20376
|
}
|
|
20366
20377
|
/**
|
|
20367
20378
|
* Creates runtime data structures for the `prefetch on hover` deferred trigger.
|
|
@@ -20375,7 +20386,7 @@ function ɵɵdeferPrefetchOnHover(triggerIndex, walkUpTimes) {
|
|
|
20375
20386
|
const tView = lView[TVIEW];
|
|
20376
20387
|
const tDetails = getTDeferBlockDetails(tView, tNode);
|
|
20377
20388
|
if (tDetails.loadingState === DeferDependenciesLoadingState.NOT_STARTED) {
|
|
20378
|
-
registerDomTrigger(lView, tNode, triggerIndex, walkUpTimes, onHover, () => triggerPrefetching(tDetails, lView));
|
|
20389
|
+
registerDomTrigger(lView, tNode, triggerIndex, walkUpTimes, onHover, () => triggerPrefetching(tDetails, lView, tNode), 1 /* TriggerType.Prefetch */);
|
|
20379
20390
|
}
|
|
20380
20391
|
}
|
|
20381
20392
|
/**
|
|
@@ -20388,7 +20399,7 @@ function ɵɵdeferOnInteraction(triggerIndex, walkUpTimes) {
|
|
|
20388
20399
|
const lView = getLView();
|
|
20389
20400
|
const tNode = getCurrentTNode();
|
|
20390
20401
|
renderPlaceholder(lView, tNode);
|
|
20391
|
-
registerDomTrigger(lView, tNode, triggerIndex, walkUpTimes, onInteraction, () => triggerDeferBlock(lView, tNode));
|
|
20402
|
+
registerDomTrigger(lView, tNode, triggerIndex, walkUpTimes, onInteraction, () => triggerDeferBlock(lView, tNode), 0 /* TriggerType.Regular */);
|
|
20392
20403
|
}
|
|
20393
20404
|
/**
|
|
20394
20405
|
* Creates runtime data structures for the `prefetch on interaction` deferred trigger.
|
|
@@ -20402,7 +20413,7 @@ function ɵɵdeferPrefetchOnInteraction(triggerIndex, walkUpTimes) {
|
|
|
20402
20413
|
const tView = lView[TVIEW];
|
|
20403
20414
|
const tDetails = getTDeferBlockDetails(tView, tNode);
|
|
20404
20415
|
if (tDetails.loadingState === DeferDependenciesLoadingState.NOT_STARTED) {
|
|
20405
|
-
registerDomTrigger(lView, tNode, triggerIndex, walkUpTimes, onInteraction, () => triggerPrefetching(tDetails, lView));
|
|
20416
|
+
registerDomTrigger(lView, tNode, triggerIndex, walkUpTimes, onInteraction, () => triggerPrefetching(tDetails, lView, tNode), 1 /* TriggerType.Prefetch */);
|
|
20406
20417
|
}
|
|
20407
20418
|
}
|
|
20408
20419
|
/**
|
|
@@ -20415,7 +20426,7 @@ function ɵɵdeferOnViewport(triggerIndex, walkUpTimes) {
|
|
|
20415
20426
|
const lView = getLView();
|
|
20416
20427
|
const tNode = getCurrentTNode();
|
|
20417
20428
|
renderPlaceholder(lView, tNode);
|
|
20418
|
-
registerDomTrigger(lView, tNode, triggerIndex, walkUpTimes, onViewport, () => triggerDeferBlock(lView, tNode));
|
|
20429
|
+
registerDomTrigger(lView, tNode, triggerIndex, walkUpTimes, onViewport, () => triggerDeferBlock(lView, tNode), 0 /* TriggerType.Regular */);
|
|
20419
20430
|
}
|
|
20420
20431
|
/**
|
|
20421
20432
|
* Creates runtime data structures for the `prefetch on viewport` deferred trigger.
|
|
@@ -20429,7 +20440,7 @@ function ɵɵdeferPrefetchOnViewport(triggerIndex, walkUpTimes) {
|
|
|
20429
20440
|
const tView = lView[TVIEW];
|
|
20430
20441
|
const tDetails = getTDeferBlockDetails(tView, tNode);
|
|
20431
20442
|
if (tDetails.loadingState === DeferDependenciesLoadingState.NOT_STARTED) {
|
|
20432
|
-
registerDomTrigger(lView, tNode, triggerIndex, walkUpTimes, onViewport, () => triggerPrefetching(tDetails, lView));
|
|
20443
|
+
registerDomTrigger(lView, tNode, triggerIndex, walkUpTimes, onViewport, () => triggerPrefetching(tDetails, lView, tNode), 1 /* TriggerType.Prefetch */);
|
|
20433
20444
|
}
|
|
20434
20445
|
}
|
|
20435
20446
|
/********** Helper functions **********/
|
|
@@ -20440,35 +20451,25 @@ function scheduleDelayedTrigger(scheduleFn) {
|
|
|
20440
20451
|
const lView = getLView();
|
|
20441
20452
|
const tNode = getCurrentTNode();
|
|
20442
20453
|
renderPlaceholder(lView, tNode);
|
|
20443
|
-
scheduleFn(() => triggerDeferBlock(lView, tNode), lView
|
|
20454
|
+
const cleanupFn = scheduleFn(() => triggerDeferBlock(lView, tNode), lView);
|
|
20455
|
+
const lDetails = getLDeferBlockDetails(lView, tNode);
|
|
20456
|
+
storeTriggerCleanupFn(0 /* TriggerType.Regular */, lDetails, cleanupFn);
|
|
20444
20457
|
}
|
|
20445
20458
|
/**
|
|
20446
20459
|
* Schedules prefetching for `on idle` and `on timer` triggers.
|
|
20447
20460
|
*
|
|
20448
20461
|
* @param scheduleFn A function that does the scheduling.
|
|
20449
|
-
* @param trigger A trigger that initiated scheduling.
|
|
20450
20462
|
*/
|
|
20451
|
-
function scheduleDelayedPrefetching(scheduleFn
|
|
20463
|
+
function scheduleDelayedPrefetching(scheduleFn) {
|
|
20452
20464
|
const lView = getLView();
|
|
20453
20465
|
const tNode = getCurrentTNode();
|
|
20454
20466
|
const tView = lView[TVIEW];
|
|
20455
20467
|
const tDetails = getTDeferBlockDetails(tView, tNode);
|
|
20456
20468
|
if (tDetails.loadingState === DeferDependenciesLoadingState.NOT_STARTED) {
|
|
20457
|
-
|
|
20458
|
-
|
|
20459
|
-
|
|
20460
|
-
|
|
20461
|
-
const injector = lView[INJECTOR$1];
|
|
20462
|
-
const manager = injector.get(DeferBlockCleanupManager);
|
|
20463
|
-
if (!manager.has(tDetails, key)) {
|
|
20464
|
-
// In case of prefetching, we intentionally avoid cancelling resource loading if
|
|
20465
|
-
// an underlying LView get destroyed (thus passing `null` as a second argument),
|
|
20466
|
-
// because there might be other LViews (that represent embedded views) that
|
|
20467
|
-
// depend on resource loading.
|
|
20468
|
-
const prefetch = () => triggerPrefetching(tDetails, lView);
|
|
20469
|
-
const cleanupFn = scheduleFn(prefetch, lView, false /* withLViewCleanup */);
|
|
20470
|
-
registerTDetailsCleanup(injector, tDetails, key, cleanupFn);
|
|
20471
|
-
}
|
|
20469
|
+
const lDetails = getLDeferBlockDetails(lView, tNode);
|
|
20470
|
+
const prefetch = () => triggerPrefetching(tDetails, lView, tNode);
|
|
20471
|
+
const cleanupFn = scheduleFn(prefetch, lView);
|
|
20472
|
+
storeTriggerCleanupFn(1 /* TriggerType.Prefetch */, lDetails, cleanupFn);
|
|
20472
20473
|
}
|
|
20473
20474
|
}
|
|
20474
20475
|
/**
|
|
@@ -20478,8 +20479,12 @@ function scheduleDelayedPrefetching(scheduleFn, trigger) {
|
|
|
20478
20479
|
* @param newState New state that should be applied to the defer block.
|
|
20479
20480
|
* @param tNode TNode that represents a defer block.
|
|
20480
20481
|
* @param lContainer Represents an instance of a defer block.
|
|
20482
|
+
* @param skipTimerScheduling Indicates that `@loading` and `@placeholder` block
|
|
20483
|
+
* should be rendered immediately, even if they have `after` or `minimum` config
|
|
20484
|
+
* options setup. This flag to needed for testing APIs to transition defer block
|
|
20485
|
+
* between states via `DeferFixture.render` method.
|
|
20481
20486
|
*/
|
|
20482
|
-
function renderDeferBlockState(newState, tNode, lContainer) {
|
|
20487
|
+
function renderDeferBlockState(newState, tNode, lContainer, skipTimerScheduling = false) {
|
|
20483
20488
|
const hostLView = lContainer[PARENT];
|
|
20484
20489
|
const hostTView = hostLView[TVIEW];
|
|
20485
20490
|
// Check if this view is not destroyed. Since the loading process was async,
|
|
@@ -20494,14 +20499,20 @@ function renderDeferBlockState(newState, tNode, lContainer) {
|
|
|
20494
20499
|
if (isValidStateChange(currentState, newState) &&
|
|
20495
20500
|
isValidStateChange(lDetails[NEXT_DEFER_BLOCK_STATE] ?? -1, newState)) {
|
|
20496
20501
|
const tDetails = getTDeferBlockDetails(hostTView, tNode);
|
|
20497
|
-
const needsScheduling =
|
|
20498
|
-
|
|
20499
|
-
|
|
20502
|
+
const needsScheduling = !skipTimerScheduling &&
|
|
20503
|
+
(getLoadingBlockAfter(tDetails) !== null ||
|
|
20504
|
+
getMinimumDurationForState(tDetails, DeferBlockState.Loading) !== null ||
|
|
20505
|
+
getMinimumDurationForState(tDetails, DeferBlockState.Placeholder));
|
|
20500
20506
|
if (ngDevMode && needsScheduling) {
|
|
20501
20507
|
assertDefined(applyDeferBlockStateWithSchedulingImpl, 'Expected scheduling function to be defined');
|
|
20502
20508
|
}
|
|
20503
20509
|
const applyStateFn = needsScheduling ? applyDeferBlockStateWithSchedulingImpl : applyDeferBlockState;
|
|
20504
|
-
|
|
20510
|
+
try {
|
|
20511
|
+
applyStateFn(newState, lDetails, lContainer, tNode, hostLView);
|
|
20512
|
+
}
|
|
20513
|
+
catch (error) {
|
|
20514
|
+
handleError(hostLView, error);
|
|
20515
|
+
}
|
|
20505
20516
|
}
|
|
20506
20517
|
}
|
|
20507
20518
|
/**
|
|
@@ -20581,7 +20592,7 @@ function scheduleDeferBlockUpdate(timeout, lDetails, tNode, lContainer, hostLVie
|
|
|
20581
20592
|
renderDeferBlockState(nextState, tNode, lContainer);
|
|
20582
20593
|
}
|
|
20583
20594
|
};
|
|
20584
|
-
return scheduleTimerTrigger(timeout, callback, hostLView
|
|
20595
|
+
return scheduleTimerTrigger(timeout, callback, hostLView);
|
|
20585
20596
|
}
|
|
20586
20597
|
/**
|
|
20587
20598
|
* Checks whether we can transition to the next state.
|
|
@@ -20601,9 +20612,9 @@ function isValidStateChange(currentState, newState) {
|
|
|
20601
20612
|
* @param tDetails Static information about this defer block.
|
|
20602
20613
|
* @param lView LView of a host view.
|
|
20603
20614
|
*/
|
|
20604
|
-
function triggerPrefetching(tDetails, lView) {
|
|
20615
|
+
function triggerPrefetching(tDetails, lView, tNode) {
|
|
20605
20616
|
if (lView[INJECTOR$1] && shouldTriggerDeferBlock(lView[INJECTOR$1])) {
|
|
20606
|
-
triggerResourceLoading(tDetails, lView);
|
|
20617
|
+
triggerResourceLoading(tDetails, lView, tNode);
|
|
20607
20618
|
}
|
|
20608
20619
|
}
|
|
20609
20620
|
/**
|
|
@@ -20612,7 +20623,7 @@ function triggerPrefetching(tDetails, lView) {
|
|
|
20612
20623
|
* @param tDetails Static information about this defer block.
|
|
20613
20624
|
* @param lView LView of a host view.
|
|
20614
20625
|
*/
|
|
20615
|
-
function triggerResourceLoading(tDetails, lView) {
|
|
20626
|
+
function triggerResourceLoading(tDetails, lView, tNode) {
|
|
20616
20627
|
const injector = lView[INJECTOR$1];
|
|
20617
20628
|
const tView = lView[TVIEW];
|
|
20618
20629
|
if (tDetails.loadingState !== DeferDependenciesLoadingState.NOT_STARTED) {
|
|
@@ -20621,9 +20632,12 @@ function triggerResourceLoading(tDetails, lView) {
|
|
|
20621
20632
|
// in this function. All details can be obtained from the `tDetails` object.
|
|
20622
20633
|
return;
|
|
20623
20634
|
}
|
|
20635
|
+
const lDetails = getLDeferBlockDetails(lView, tNode);
|
|
20624
20636
|
const primaryBlockTNode = getPrimaryBlockTNode(tView, tDetails);
|
|
20625
20637
|
// Switch from NOT_STARTED -> IN_PROGRESS state.
|
|
20626
20638
|
tDetails.loadingState = DeferDependenciesLoadingState.IN_PROGRESS;
|
|
20639
|
+
// Prefetching is triggered, cleanup all registered prefetch triggers.
|
|
20640
|
+
invokeTriggerCleanupFns(1 /* TriggerType.Prefetch */, lDetails);
|
|
20627
20641
|
let dependenciesFn = tDetails.dependencyResolverFn;
|
|
20628
20642
|
if (ngDevMode) {
|
|
20629
20643
|
// Check if dependency function interceptor is configured.
|
|
@@ -20641,9 +20655,6 @@ function triggerResourceLoading(tDetails, lView) {
|
|
|
20641
20655
|
});
|
|
20642
20656
|
return;
|
|
20643
20657
|
}
|
|
20644
|
-
// Defer block may have multiple prefetch triggers. Once the loading
|
|
20645
|
-
// starts, invoke all clean functions, since they are no longer needed.
|
|
20646
|
-
invokeTDetailsCleanup(injector, tDetails);
|
|
20647
20658
|
// Start downloading of defer block dependencies.
|
|
20648
20659
|
tDetails.loadingPromise = Promise.allSettled(dependenciesFn()).then(results => {
|
|
20649
20660
|
let failed = false;
|
|
@@ -20672,6 +20683,14 @@ function triggerResourceLoading(tDetails, lView) {
|
|
|
20672
20683
|
tDetails.loadingPromise = null;
|
|
20673
20684
|
if (failed) {
|
|
20674
20685
|
tDetails.loadingState = DeferDependenciesLoadingState.FAILED;
|
|
20686
|
+
if (tDetails.errorTmplIndex === null) {
|
|
20687
|
+
const templateLocation = getTemplateLocationDetails(lView);
|
|
20688
|
+
const error = new RuntimeError(750 /* RuntimeErrorCode.DEFER_LOADING_FAILED */, ngDevMode &&
|
|
20689
|
+
'Loading dependencies for `@defer` block failed, ' +
|
|
20690
|
+
`but no \`@error\` block was configured${templateLocation}. ` +
|
|
20691
|
+
'Consider using the `@error` block to render an error state.');
|
|
20692
|
+
handleError(lView, error);
|
|
20693
|
+
}
|
|
20675
20694
|
}
|
|
20676
20695
|
else {
|
|
20677
20696
|
tDetails.loadingState = DeferDependenciesLoadingState.COMPLETE;
|
|
@@ -20727,11 +20746,14 @@ function triggerDeferBlock(lView, tNode) {
|
|
|
20727
20746
|
ngDevMode && assertLContainer(lContainer);
|
|
20728
20747
|
if (!shouldTriggerDeferBlock(injector))
|
|
20729
20748
|
return;
|
|
20749
|
+
const lDetails = getLDeferBlockDetails(lView, tNode);
|
|
20730
20750
|
const tDetails = getTDeferBlockDetails(tView, tNode);
|
|
20751
|
+
// Defer block is triggered, cleanup all registered trigger functions.
|
|
20752
|
+
invokeAllTriggerCleanupFns(lDetails);
|
|
20731
20753
|
switch (tDetails.loadingState) {
|
|
20732
20754
|
case DeferDependenciesLoadingState.NOT_STARTED:
|
|
20733
20755
|
renderDeferBlockState(DeferBlockState.Loading, tNode, lContainer);
|
|
20734
|
-
triggerResourceLoading(tDetails, lView);
|
|
20756
|
+
triggerResourceLoading(tDetails, lView, tNode);
|
|
20735
20757
|
// The `loadingState` might have changed to "loading".
|
|
20736
20758
|
if (tDetails.loadingState ===
|
|
20737
20759
|
DeferDependenciesLoadingState.IN_PROGRESS) {
|
|
@@ -28779,7 +28801,7 @@ const ITS_JUST_ANGULAR = true;
|
|
|
28779
28801
|
* ```
|
|
28780
28802
|
*
|
|
28781
28803
|
* ### Example with standalone application
|
|
28782
|
-
*
|
|
28804
|
+
* ```
|
|
28783
28805
|
* function initializeAppFactory(httpClient: HttpClient): () => Observable<any> {
|
|
28784
28806
|
* return () => httpClient.get("https://someUrl.com/api/user")
|
|
28785
28807
|
* .pipe(
|
|
@@ -28798,6 +28820,7 @@ const ITS_JUST_ANGULAR = true;
|
|
|
28798
28820
|
* },
|
|
28799
28821
|
* ],
|
|
28800
28822
|
* });
|
|
28823
|
+
* ```
|
|
28801
28824
|
*
|
|
28802
28825
|
* @publicApi
|
|
28803
28826
|
*/
|
|
@@ -29712,6 +29735,11 @@ function getProviderImportsContainer(injector) {
|
|
|
29712
29735
|
if (defTypeRef === null) {
|
|
29713
29736
|
return null;
|
|
29714
29737
|
}
|
|
29738
|
+
// In standalone applications, the root environment injector created by bootstrapApplication
|
|
29739
|
+
// may have no associated "instance".
|
|
29740
|
+
if (defTypeRef.instance === null) {
|
|
29741
|
+
return null;
|
|
29742
|
+
}
|
|
29715
29743
|
return defTypeRef.instance.constructor;
|
|
29716
29744
|
}
|
|
29717
29745
|
/**
|
|
@@ -29893,12 +29921,25 @@ function walkProviderTreeToDiscoverImportPaths(providerToPath, visitedContainers
|
|
|
29893
29921
|
* @returns an array of objects representing the providers of the given injector
|
|
29894
29922
|
*/
|
|
29895
29923
|
function getEnvironmentInjectorProviders(injector) {
|
|
29924
|
+
const providerRecords = getFrameworkDIDebugData().resolverToProviders.get(injector) ?? [];
|
|
29925
|
+
// platform injector has no provider imports container so can we skip trying to
|
|
29926
|
+
// find import paths
|
|
29927
|
+
if (isPlatformInjector(injector)) {
|
|
29928
|
+
return providerRecords;
|
|
29929
|
+
}
|
|
29896
29930
|
const providerImportsContainer = getProviderImportsContainer(injector);
|
|
29897
29931
|
if (providerImportsContainer === null) {
|
|
29932
|
+
// There is a special case where the bootstrapped component does not
|
|
29933
|
+
// import any NgModules. In this case the environment injector connected to
|
|
29934
|
+
// that component is the root injector, which does not have a provider imports
|
|
29935
|
+
// container (and thus no concept of module import paths). Therefore we simply
|
|
29936
|
+
// return the provider records as is.
|
|
29937
|
+
if (isRootInjector(injector)) {
|
|
29938
|
+
return providerRecords;
|
|
29939
|
+
}
|
|
29898
29940
|
throwError('Could not determine where injector providers were configured.');
|
|
29899
29941
|
}
|
|
29900
29942
|
const providerToPath = getProviderImportPaths(providerImportsContainer);
|
|
29901
|
-
const providerRecords = getFrameworkDIDebugData().resolverToProviders.get(injector) ?? [];
|
|
29902
29943
|
return providerRecords.map(providerRecord => {
|
|
29903
29944
|
let importPath = providerToPath.get(providerRecord.provider) ?? [providerImportsContainer];
|
|
29904
29945
|
const def = getComponentDef(providerImportsContainer);
|
|
@@ -29911,6 +29952,12 @@ function getEnvironmentInjectorProviders(injector) {
|
|
|
29911
29952
|
return { ...providerRecord, importPath };
|
|
29912
29953
|
});
|
|
29913
29954
|
}
|
|
29955
|
+
function isPlatformInjector(injector) {
|
|
29956
|
+
return injector instanceof R3Injector && injector.scopes.has('platform');
|
|
29957
|
+
}
|
|
29958
|
+
function isRootInjector(injector) {
|
|
29959
|
+
return injector instanceof R3Injector && injector.scopes.has('root');
|
|
29960
|
+
}
|
|
29914
29961
|
/**
|
|
29915
29962
|
* Gets the providers configured on an injector.
|
|
29916
29963
|
*
|
|
@@ -30569,10 +30616,10 @@ function createOrReusePlatformInjector(providers = []) {
|
|
|
30569
30616
|
// is already bootstrapped and no additional actions are required.
|
|
30570
30617
|
if (_platformInjector)
|
|
30571
30618
|
return _platformInjector;
|
|
30619
|
+
publishDefaultGlobalUtils();
|
|
30572
30620
|
// Otherwise, setup a new platform injector and run platform initializers.
|
|
30573
30621
|
const injector = createPlatformInjector(providers);
|
|
30574
30622
|
_platformInjector = injector;
|
|
30575
|
-
publishDefaultGlobalUtils();
|
|
30576
30623
|
publishSignalConfiguration();
|
|
30577
30624
|
runPlatformInitializers(injector);
|
|
30578
30625
|
return injector;
|
|
@@ -31367,7 +31414,7 @@ function internalProvideZoneChangeDetection(ngZoneFactory) {
|
|
|
31367
31414
|
* `BootstrapOptions` instead.
|
|
31368
31415
|
*
|
|
31369
31416
|
* @usageNotes
|
|
31370
|
-
* ```typescript
|
|
31417
|
+
* ```typescript
|
|
31371
31418
|
* bootstrapApplication(MyApp, {providers: [
|
|
31372
31419
|
* provideZoneChangeDetection({eventCoalescing: true}),
|
|
31373
31420
|
* ]});
|
|
@@ -34412,7 +34459,7 @@ function withDomHydration() {
|
|
|
34412
34459
|
}
|
|
34413
34460
|
}
|
|
34414
34461
|
if (isEnabled) {
|
|
34415
|
-
|
|
34462
|
+
performance.mark('mark_use_counter', { detail: { feature: 'NgHydration' } });
|
|
34416
34463
|
}
|
|
34417
34464
|
return isEnabled;
|
|
34418
34465
|
},
|
|
@@ -34800,7 +34847,7 @@ if (typeof ngDevMode !== 'undefined' && ngDevMode) {
|
|
|
34800
34847
|
// This helper is to give a reasonable error message to people upgrading to v9 that have not yet
|
|
34801
34848
|
// installed `@angular/localize` in their app.
|
|
34802
34849
|
// tslint:disable-next-line: no-toplevel-property-access
|
|
34803
|
-
_global.$localize
|
|
34850
|
+
_global.$localize ??= function () {
|
|
34804
34851
|
throw new Error('It looks like your application or one of its dependencies is using i18n.\n' +
|
|
34805
34852
|
'Angular 9 introduced a global `$localize()` function that needs to be loaded.\n' +
|
|
34806
34853
|
'Please run `ng add @angular/localize` from the Angular CLI.\n' +
|
|
@@ -34826,5 +34873,5 @@ if (typeof ngDevMode !== 'undefined' && ngDevMode) {
|
|
|
34826
34873
|
* Generated bundle index. Do not edit.
|
|
34827
34874
|
*/
|
|
34828
34875
|
|
|
34829
|
-
export { ANIMATION_MODULE_TYPE, APP_BOOTSTRAP_LISTENER, APP_ID, APP_INITIALIZER, AfterRenderPhase, ApplicationInitStatus, ApplicationModule, ApplicationRef, Attribute, COMPILER_OPTIONS, CSP_NONCE, CUSTOM_ELEMENTS_SCHEMA, ChangeDetectionStrategy, ChangeDetectorRef, Compiler, CompilerFactory, Component, ComponentFactory$1 as ComponentFactory, ComponentFactoryResolver$1 as ComponentFactoryResolver, ComponentRef$1 as ComponentRef, ContentChild, ContentChildren, DEFAULT_CURRENCY_CODE, DebugElement, DebugEventListener, DebugNode, DefaultIterableDiffer, DestroyRef, Directive, ENVIRONMENT_INITIALIZER, ElementRef, EmbeddedViewRef, EnvironmentInjector, ErrorHandler, EventEmitter, Host, HostBinding, HostListener, INJECTOR, Inject, InjectFlags, Injectable, InjectionToken, Injector, Input, IterableDiffers, KeyValueDiffers, LOCALE_ID, MissingTranslationStrategy, ModuleWithComponentFactories, NO_ERRORS_SCHEMA, NgModule, NgModuleFactory$1 as NgModuleFactory, NgModuleRef$1 as NgModuleRef, NgProbeToken, NgZone, Optional, Output, PACKAGE_ROOT_URL, PLATFORM_ID, PLATFORM_INITIALIZER, Pipe, PlatformRef, Query, QueryList, Renderer2, RendererFactory2, RendererStyleFlags2, Sanitizer, SecurityContext, Self, SimpleChange, SkipSelf, TRANSLATIONS, TRANSLATIONS_FORMAT, TemplateRef, Testability, TestabilityRegistry, TransferState, Type, VERSION, Version, ViewChild, ViewChildren, ViewContainerRef, ViewEncapsulation$1 as ViewEncapsulation, ViewRef, afterNextRender, afterRender, asNativeElements, assertInInjectionContext, assertNotInReactiveContext, assertPlatform, booleanAttribute, computed, createComponent, createEnvironmentInjector, createNgModule, createNgModuleRef, createPlatform, createPlatformFactory, defineInjectable, destroyPlatform, effect, enableProdMode, forwardRef, getDebugNode, getModuleFactory, getNgModuleById, getPlatform, importProvidersFrom, inject, isDevMode, isSignal, isStandalone, makeEnvironmentProviders, makeStateKey, mergeApplicationConfig, numberAttribute, platformCore, provideZoneChangeDetection, reflectComponentType, resolveForwardRef, runInInjectionContext, setTestabilityGetter, signal, untracked, ALLOW_MULTIPLE_PLATFORMS as ɵALLOW_MULTIPLE_PLATFORMS, AfterRenderEventManager as ɵAfterRenderEventManager, CONTAINER_HEADER_OFFSET as ɵCONTAINER_HEADER_OFFSET, ComponentFactory$1 as ɵComponentFactory, Console as ɵConsole, DEFAULT_LOCALE_ID as ɵDEFAULT_LOCALE_ID, DEFER_BLOCK_CONFIG as ɵDEFER_BLOCK_CONFIG, DEFER_BLOCK_DEPENDENCY_INTERCEPTOR as ɵDEFER_BLOCK_DEPENDENCY_INTERCEPTOR, DeferBlockBehavior as ɵDeferBlockBehavior, DeferBlockState as ɵDeferBlockState, ENABLED_SSR_FEATURES as ɵENABLED_SSR_FEATURES, EffectScheduler as ɵEffectScheduler, IMAGE_CONFIG as ɵIMAGE_CONFIG, IMAGE_CONFIG_DEFAULTS as ɵIMAGE_CONFIG_DEFAULTS, INJECTOR_SCOPE as ɵINJECTOR_SCOPE, IS_HYDRATION_DOM_REUSE_ENABLED as ɵIS_HYDRATION_DOM_REUSE_ENABLED, InitialRenderPendingTasks as ɵInitialRenderPendingTasks, LContext as ɵLContext, LifecycleHooksFeature as ɵLifecycleHooksFeature, LocaleDataIndex as ɵLocaleDataIndex, NG_COMP_DEF as ɵNG_COMP_DEF, NG_DIR_DEF as ɵNG_DIR_DEF, NG_ELEMENT_ID as ɵNG_ELEMENT_ID, NG_INJ_DEF as ɵNG_INJ_DEF, NG_MOD_DEF as ɵNG_MOD_DEF, NG_PIPE_DEF as ɵNG_PIPE_DEF, NG_PROV_DEF as ɵNG_PROV_DEF, NOT_FOUND_CHECK_ONLY_ELEMENT_INJECTOR as ɵNOT_FOUND_CHECK_ONLY_ELEMENT_INJECTOR, NO_CHANGE as ɵNO_CHANGE, NgModuleFactory as ɵNgModuleFactory, NoopNgZone as ɵNoopNgZone, ReflectionCapabilities as ɵReflectionCapabilities, ComponentFactory as ɵRender3ComponentFactory, ComponentRef as ɵRender3ComponentRef, NgModuleRef as ɵRender3NgModuleRef, RuntimeError as ɵRuntimeError, SSR_CONTENT_INTEGRITY_MARKER as ɵSSR_CONTENT_INTEGRITY_MARKER, TESTABILITY as ɵTESTABILITY, TESTABILITY_GETTER as ɵTESTABILITY_GETTER, USE_RUNTIME_DEPS_TRACKER_FOR_JIT as ɵUSE_RUNTIME_DEPS_TRACKER_FOR_JIT, ViewRef$1 as ɵViewRef, XSS_SECURITY_URL as ɵXSS_SECURITY_URL, ZoneAwareQueueingScheduler as ɵZoneAwareQueueingScheduler, _sanitizeHtml as ɵ_sanitizeHtml, _sanitizeUrl as ɵ_sanitizeUrl, allowSanitizationBypassAndThrow as ɵallowSanitizationBypassAndThrow, annotateForHydration as ɵannotateForHydration, bypassSanitizationTrustHtml as ɵbypassSanitizationTrustHtml, bypassSanitizationTrustResourceUrl as ɵbypassSanitizationTrustResourceUrl, bypassSanitizationTrustScript as ɵbypassSanitizationTrustScript, bypassSanitizationTrustStyle as ɵbypassSanitizationTrustStyle, bypassSanitizationTrustUrl as ɵbypassSanitizationTrustUrl, clearResolutionOfComponentResourcesQueue as ɵclearResolutionOfComponentResourcesQueue, compileComponent as ɵcompileComponent, compileDirective as ɵcompileDirective, compileNgModule as ɵcompileNgModule, compileNgModuleDefs as ɵcompileNgModuleDefs, compileNgModuleFactory as ɵcompileNgModuleFactory, compilePipe as ɵcompilePipe, convertToBitFlags as ɵconvertToBitFlags, createInjector as ɵcreateInjector, defaultIterableDiffers as ɵdefaultIterableDiffers, defaultKeyValueDiffers as ɵdefaultKeyValueDiffers, depsTracker as ɵdepsTracker, detectChanges as ɵdetectChanges, devModeEqual as ɵdevModeEqual, findLocaleData as ɵfindLocaleData, flushModuleScopingQueueAsMuchAsPossible as ɵflushModuleScopingQueueAsMuchAsPossible, formatRuntimeError as ɵformatRuntimeError, generateStandaloneInDeclarationsError as ɵgenerateStandaloneInDeclarationsError, getAsyncClassMetadata as ɵgetAsyncClassMetadata, getDebugNode as ɵgetDebugNode, getDeferBlocks as ɵgetDeferBlocks, getDirectives as ɵgetDirectives, getHostElement as ɵgetHostElement, getInjectableDef as ɵgetInjectableDef, getLContext as ɵgetLContext, getLocaleCurrencyCode as ɵgetLocaleCurrencyCode, getLocalePluralCase as ɵgetLocalePluralCase, getSanitizationBypassType as ɵgetSanitizationBypassType, ɵgetUnknownElementStrictMode, ɵgetUnknownPropertyStrictMode, _global as ɵglobal, injectChangeDetectorRef as ɵinjectChangeDetectorRef, internalAfterNextRender as ɵinternalAfterNextRender, internalCreateApplication as ɵinternalCreateApplication, isBoundToModule as ɵisBoundToModule, isComponentDefPendingResolution as ɵisComponentDefPendingResolution, isEnvironmentProviders as ɵisEnvironmentProviders, isInjectable as ɵisInjectable, isNgModule as ɵisNgModule, isPromise as ɵisPromise, isSubscribable as ɵisSubscribable, noSideEffects as ɵnoSideEffects, patchComponentDefWithScope as ɵpatchComponentDefWithScope, publishDefaultGlobalUtils$1 as ɵpublishDefaultGlobalUtils, publishGlobalUtil as ɵpublishGlobalUtil, registerLocaleData as ɵregisterLocaleData, renderDeferBlockState as ɵrenderDeferBlockState, resetCompiledComponents as ɵresetCompiledComponents, resetJitOptions as ɵresetJitOptions, resolveComponentResources as ɵresolveComponentResources, restoreComponentResolutionQueue as ɵrestoreComponentResolutionQueue, setAllowDuplicateNgModuleIdsForTest as ɵsetAllowDuplicateNgModuleIdsForTest, setAlternateWeakRefImpl as ɵsetAlternateWeakRefImpl, ɵsetClassDebugInfo, setClassMetadata as ɵsetClassMetadata, setClassMetadataAsync as ɵsetClassMetadataAsync, setCurrentInjector as ɵsetCurrentInjector, setDocument as ɵsetDocument, setInjectorProfilerContext as ɵsetInjectorProfilerContext, setLocaleId as ɵsetLocaleId, ɵsetUnknownElementStrictMode, ɵsetUnknownPropertyStrictMode, store as ɵstore, stringify as ɵstringify, transitiveScopesFor as ɵtransitiveScopesFor, triggerResourceLoading as ɵtriggerResourceLoading, truncateMiddle as ɵtruncateMiddle, unregisterAllLocaleData as ɵunregisterLocaleData, unwrapSafeValue as ɵunwrapSafeValue, whenStable as ɵwhenStable, withDomHydration as ɵwithDomHydration, ɵɵCopyDefinitionFeature, FactoryTarget as ɵɵFactoryTarget, ɵɵHostDirectivesFeature, ɵɵInheritDefinitionFeature, ɵɵInputTransformsFeature, ɵɵNgOnChangesFeature, ɵɵProvidersFeature, ɵɵStandaloneFeature, ɵɵadvance, ɵɵattribute, ɵɵattributeInterpolate1, ɵɵattributeInterpolate2, ɵɵattributeInterpolate3, ɵɵattributeInterpolate4, ɵɵattributeInterpolate5, ɵɵattributeInterpolate6, ɵɵattributeInterpolate7, ɵɵattributeInterpolate8, ɵɵattributeInterpolateV, ɵɵclassMap, ɵɵclassMapInterpolate1, ɵɵclassMapInterpolate2, ɵɵclassMapInterpolate3, ɵɵclassMapInterpolate4, ɵɵclassMapInterpolate5, ɵɵclassMapInterpolate6, ɵɵclassMapInterpolate7, ɵɵclassMapInterpolate8, ɵɵclassMapInterpolateV, ɵɵclassProp, ɵɵcomponentInstance, ɵɵconditional, ɵɵcontentQuery, ɵɵdefer, ɵɵdeferEnableTimerScheduling, ɵɵdeferOnHover, ɵɵdeferOnIdle, ɵɵdeferOnImmediate, ɵɵdeferOnInteraction, ɵɵdeferOnTimer, ɵɵdeferOnViewport, ɵɵdeferPrefetchOnHover, ɵɵdeferPrefetchOnIdle, ɵɵdeferPrefetchOnImmediate, ɵɵdeferPrefetchOnInteraction, ɵɵdeferPrefetchOnTimer, ɵɵdeferPrefetchOnViewport, ɵɵdeferPrefetchWhen, ɵɵdeferWhen, ɵɵdefineComponent, ɵɵdefineDirective, ɵɵdefineInjectable, ɵɵdefineInjector, ɵɵdefineNgModule, ɵɵdefinePipe, ɵɵdirectiveInject, ɵɵdisableBindings, ɵɵelement, ɵɵelementContainer, ɵɵelementContainerEnd, ɵɵelementContainerStart, ɵɵelementEnd, ɵɵelementStart, ɵɵenableBindings, ɵɵgetComponentDepsFactory, ɵɵgetCurrentView, ɵɵgetInheritedFactory, ɵɵhostProperty, ɵɵi18n, ɵɵi18nApply, ɵɵi18nAttributes, ɵɵi18nEnd, ɵɵi18nExp, ɵɵi18nPostprocess, ɵɵi18nStart, ɵɵinject, ɵɵinjectAttribute, ɵɵinvalidFactory, ɵɵinvalidFactoryDep, ɵɵlistener, ɵɵloadQuery, ɵɵnamespaceHTML, ɵɵnamespaceMathML, ɵɵnamespaceSVG, ɵɵnextContext, ɵɵngDeclareClassMetadata, ɵɵngDeclareComponent, ɵɵngDeclareDirective, ɵɵngDeclareFactory, ɵɵngDeclareInjectable, ɵɵngDeclareInjector, ɵɵngDeclareNgModule, ɵɵngDeclarePipe, ɵɵpipe, ɵɵpipeBind1, ɵɵpipeBind2, ɵɵpipeBind3, ɵɵpipeBind4, ɵɵpipeBindV, ɵɵprojection, ɵɵprojectionDef, ɵɵproperty, ɵɵpropertyInterpolate, ɵɵpropertyInterpolate1, ɵɵpropertyInterpolate2, ɵɵpropertyInterpolate3, ɵɵpropertyInterpolate4, ɵɵpropertyInterpolate5, ɵɵpropertyInterpolate6, ɵɵpropertyInterpolate7, ɵɵpropertyInterpolate8, ɵɵpropertyInterpolateV, ɵɵpureFunction0, ɵɵpureFunction1, ɵɵpureFunction2, ɵɵpureFunction3, ɵɵpureFunction4, ɵɵpureFunction5, ɵɵpureFunction6, ɵɵpureFunction7, ɵɵpureFunction8, ɵɵpureFunctionV, ɵɵqueryRefresh, ɵɵreference, registerNgModuleType as ɵɵregisterNgModuleType, ɵɵrepeater, ɵɵrepeaterCreate, ɵɵrepeaterTrackByIdentity, ɵɵrepeaterTrackByIndex, ɵɵresetView, ɵɵresolveBody, ɵɵresolveDocument, ɵɵresolveWindow, ɵɵrestoreView, ɵɵsanitizeHtml, ɵɵsanitizeResourceUrl, ɵɵsanitizeScript, ɵɵsanitizeStyle, ɵɵsanitizeUrl, ɵɵsanitizeUrlOrResourceUrl, ɵɵsetComponentScope, ɵɵsetNgModuleScope, ɵɵstyleMap, ɵɵstyleMapInterpolate1, ɵɵstyleMapInterpolate2, ɵɵstyleMapInterpolate3, ɵɵstyleMapInterpolate4, ɵɵstyleMapInterpolate5, ɵɵstyleMapInterpolate6, ɵɵstyleMapInterpolate7, ɵɵstyleMapInterpolate8, ɵɵstyleMapInterpolateV, ɵɵstyleProp, ɵɵstylePropInterpolate1, ɵɵstylePropInterpolate2, ɵɵstylePropInterpolate3, ɵɵstylePropInterpolate4, ɵɵstylePropInterpolate5, ɵɵstylePropInterpolate6, ɵɵstylePropInterpolate7, ɵɵstylePropInterpolate8, ɵɵstylePropInterpolateV, ɵɵsyntheticHostListener, ɵɵsyntheticHostProperty, ɵɵtemplate, ɵɵtemplateRefExtractor, ɵɵtext, ɵɵtextInterpolate, ɵɵtextInterpolate1, ɵɵtextInterpolate2, ɵɵtextInterpolate3, ɵɵtextInterpolate4, ɵɵtextInterpolate5, ɵɵtextInterpolate6, ɵɵtextInterpolate7, ɵɵtextInterpolate8, ɵɵtextInterpolateV, ɵɵtrustConstantHtml, ɵɵtrustConstantResourceUrl, ɵɵvalidateIframeAttribute, ɵɵviewQuery };
|
|
34876
|
+
export { ANIMATION_MODULE_TYPE, APP_BOOTSTRAP_LISTENER, APP_ID, APP_INITIALIZER, AfterRenderPhase, ApplicationInitStatus, ApplicationModule, ApplicationRef, Attribute, COMPILER_OPTIONS, CSP_NONCE, CUSTOM_ELEMENTS_SCHEMA, ChangeDetectionStrategy, ChangeDetectorRef, Compiler, CompilerFactory, Component, ComponentFactory$1 as ComponentFactory, ComponentFactoryResolver$1 as ComponentFactoryResolver, ComponentRef$1 as ComponentRef, ContentChild, ContentChildren, DEFAULT_CURRENCY_CODE, DebugElement, DebugEventListener, DebugNode, DefaultIterableDiffer, DestroyRef, Directive, ENVIRONMENT_INITIALIZER, ElementRef, EmbeddedViewRef, EnvironmentInjector, ErrorHandler, EventEmitter, Host, HostBinding, HostListener, INJECTOR, Inject, InjectFlags, Injectable, InjectionToken, Injector, Input, IterableDiffers, KeyValueDiffers, LOCALE_ID, MissingTranslationStrategy, ModuleWithComponentFactories, NO_ERRORS_SCHEMA, NgModule, NgModuleFactory$1 as NgModuleFactory, NgModuleRef$1 as NgModuleRef, NgProbeToken, NgZone, Optional, Output, PACKAGE_ROOT_URL, PLATFORM_ID, PLATFORM_INITIALIZER, Pipe, PlatformRef, Query, QueryList, Renderer2, RendererFactory2, RendererStyleFlags2, Sanitizer, SecurityContext, Self, SimpleChange, SkipSelf, TRANSLATIONS, TRANSLATIONS_FORMAT, TemplateRef, Testability, TestabilityRegistry, TransferState, Type, VERSION, Version, ViewChild, ViewChildren, ViewContainerRef, ViewEncapsulation$1 as ViewEncapsulation, ViewRef, afterNextRender, afterRender, asNativeElements, assertInInjectionContext, assertNotInReactiveContext, assertPlatform, booleanAttribute, computed, createComponent, createEnvironmentInjector, createNgModule, createNgModuleRef, createPlatform, createPlatformFactory, defineInjectable, destroyPlatform, effect, enableProdMode, forwardRef, getDebugNode, getModuleFactory, getNgModuleById, getPlatform, importProvidersFrom, inject, isDevMode, isSignal, isStandalone, makeEnvironmentProviders, makeStateKey, mergeApplicationConfig, numberAttribute, platformCore, provideZoneChangeDetection, reflectComponentType, resolveForwardRef, runInInjectionContext, setTestabilityGetter, signal, untracked, ALLOW_MULTIPLE_PLATFORMS as ɵALLOW_MULTIPLE_PLATFORMS, AfterRenderEventManager as ɵAfterRenderEventManager, CONTAINER_HEADER_OFFSET as ɵCONTAINER_HEADER_OFFSET, ComponentFactory$1 as ɵComponentFactory, Console as ɵConsole, DEFAULT_LOCALE_ID as ɵDEFAULT_LOCALE_ID, DEFER_BLOCK_CONFIG as ɵDEFER_BLOCK_CONFIG, DEFER_BLOCK_DEPENDENCY_INTERCEPTOR as ɵDEFER_BLOCK_DEPENDENCY_INTERCEPTOR, DeferBlockBehavior as ɵDeferBlockBehavior, DeferBlockState as ɵDeferBlockState, EffectScheduler as ɵEffectScheduler, IMAGE_CONFIG as ɵIMAGE_CONFIG, IMAGE_CONFIG_DEFAULTS as ɵIMAGE_CONFIG_DEFAULTS, INJECTOR_SCOPE as ɵINJECTOR_SCOPE, IS_HYDRATION_DOM_REUSE_ENABLED as ɵIS_HYDRATION_DOM_REUSE_ENABLED, InitialRenderPendingTasks as ɵInitialRenderPendingTasks, LContext as ɵLContext, LifecycleHooksFeature as ɵLifecycleHooksFeature, LocaleDataIndex as ɵLocaleDataIndex, NG_COMP_DEF as ɵNG_COMP_DEF, NG_DIR_DEF as ɵNG_DIR_DEF, NG_ELEMENT_ID as ɵNG_ELEMENT_ID, NG_INJ_DEF as ɵNG_INJ_DEF, NG_MOD_DEF as ɵNG_MOD_DEF, NG_PIPE_DEF as ɵNG_PIPE_DEF, NG_PROV_DEF as ɵNG_PROV_DEF, NOT_FOUND_CHECK_ONLY_ELEMENT_INJECTOR as ɵNOT_FOUND_CHECK_ONLY_ELEMENT_INJECTOR, NO_CHANGE as ɵNO_CHANGE, NgModuleFactory as ɵNgModuleFactory, NoopNgZone as ɵNoopNgZone, ReflectionCapabilities as ɵReflectionCapabilities, ComponentFactory as ɵRender3ComponentFactory, ComponentRef as ɵRender3ComponentRef, NgModuleRef as ɵRender3NgModuleRef, RuntimeError as ɵRuntimeError, SSR_CONTENT_INTEGRITY_MARKER as ɵSSR_CONTENT_INTEGRITY_MARKER, TESTABILITY as ɵTESTABILITY, TESTABILITY_GETTER as ɵTESTABILITY_GETTER, USE_RUNTIME_DEPS_TRACKER_FOR_JIT as ɵUSE_RUNTIME_DEPS_TRACKER_FOR_JIT, ViewRef$1 as ɵViewRef, XSS_SECURITY_URL as ɵXSS_SECURITY_URL, ZoneAwareQueueingScheduler as ɵZoneAwareQueueingScheduler, _sanitizeHtml as ɵ_sanitizeHtml, _sanitizeUrl as ɵ_sanitizeUrl, allowSanitizationBypassAndThrow as ɵallowSanitizationBypassAndThrow, annotateForHydration as ɵannotateForHydration, bypassSanitizationTrustHtml as ɵbypassSanitizationTrustHtml, bypassSanitizationTrustResourceUrl as ɵbypassSanitizationTrustResourceUrl, bypassSanitizationTrustScript as ɵbypassSanitizationTrustScript, bypassSanitizationTrustStyle as ɵbypassSanitizationTrustStyle, bypassSanitizationTrustUrl as ɵbypassSanitizationTrustUrl, clearResolutionOfComponentResourcesQueue as ɵclearResolutionOfComponentResourcesQueue, compileComponent as ɵcompileComponent, compileDirective as ɵcompileDirective, compileNgModule as ɵcompileNgModule, compileNgModuleDefs as ɵcompileNgModuleDefs, compileNgModuleFactory as ɵcompileNgModuleFactory, compilePipe as ɵcompilePipe, convertToBitFlags as ɵconvertToBitFlags, createInjector as ɵcreateInjector, defaultIterableDiffers as ɵdefaultIterableDiffers, defaultKeyValueDiffers as ɵdefaultKeyValueDiffers, depsTracker as ɵdepsTracker, detectChanges as ɵdetectChanges, devModeEqual as ɵdevModeEqual, findLocaleData as ɵfindLocaleData, flushModuleScopingQueueAsMuchAsPossible as ɵflushModuleScopingQueueAsMuchAsPossible, formatRuntimeError as ɵformatRuntimeError, generateStandaloneInDeclarationsError as ɵgenerateStandaloneInDeclarationsError, getAsyncClassMetadata as ɵgetAsyncClassMetadata, getDebugNode as ɵgetDebugNode, getDeferBlocks as ɵgetDeferBlocks, getDirectives as ɵgetDirectives, getHostElement as ɵgetHostElement, getInjectableDef as ɵgetInjectableDef, getLContext as ɵgetLContext, getLocaleCurrencyCode as ɵgetLocaleCurrencyCode, getLocalePluralCase as ɵgetLocalePluralCase, getSanitizationBypassType as ɵgetSanitizationBypassType, ɵgetUnknownElementStrictMode, ɵgetUnknownPropertyStrictMode, _global as ɵglobal, injectChangeDetectorRef as ɵinjectChangeDetectorRef, internalAfterNextRender as ɵinternalAfterNextRender, internalCreateApplication as ɵinternalCreateApplication, isBoundToModule as ɵisBoundToModule, isComponentDefPendingResolution as ɵisComponentDefPendingResolution, isEnvironmentProviders as ɵisEnvironmentProviders, isInjectable as ɵisInjectable, isNgModule as ɵisNgModule, isPromise as ɵisPromise, isSubscribable as ɵisSubscribable, noSideEffects as ɵnoSideEffects, patchComponentDefWithScope as ɵpatchComponentDefWithScope, publishDefaultGlobalUtils$1 as ɵpublishDefaultGlobalUtils, publishGlobalUtil as ɵpublishGlobalUtil, registerLocaleData as ɵregisterLocaleData, renderDeferBlockState as ɵrenderDeferBlockState, resetCompiledComponents as ɵresetCompiledComponents, resetJitOptions as ɵresetJitOptions, resolveComponentResources as ɵresolveComponentResources, restoreComponentResolutionQueue as ɵrestoreComponentResolutionQueue, setAllowDuplicateNgModuleIdsForTest as ɵsetAllowDuplicateNgModuleIdsForTest, setAlternateWeakRefImpl as ɵsetAlternateWeakRefImpl, ɵsetClassDebugInfo, setClassMetadata as ɵsetClassMetadata, setClassMetadataAsync as ɵsetClassMetadataAsync, setCurrentInjector as ɵsetCurrentInjector, setDocument as ɵsetDocument, setInjectorProfilerContext as ɵsetInjectorProfilerContext, setLocaleId as ɵsetLocaleId, ɵsetUnknownElementStrictMode, ɵsetUnknownPropertyStrictMode, store as ɵstore, stringify as ɵstringify, transitiveScopesFor as ɵtransitiveScopesFor, triggerResourceLoading as ɵtriggerResourceLoading, truncateMiddle as ɵtruncateMiddle, unregisterAllLocaleData as ɵunregisterLocaleData, unwrapSafeValue as ɵunwrapSafeValue, whenStable as ɵwhenStable, withDomHydration as ɵwithDomHydration, ɵɵCopyDefinitionFeature, FactoryTarget as ɵɵFactoryTarget, ɵɵHostDirectivesFeature, ɵɵInheritDefinitionFeature, ɵɵInputTransformsFeature, ɵɵNgOnChangesFeature, ɵɵProvidersFeature, ɵɵStandaloneFeature, ɵɵadvance, ɵɵattribute, ɵɵattributeInterpolate1, ɵɵattributeInterpolate2, ɵɵattributeInterpolate3, ɵɵattributeInterpolate4, ɵɵattributeInterpolate5, ɵɵattributeInterpolate6, ɵɵattributeInterpolate7, ɵɵattributeInterpolate8, ɵɵattributeInterpolateV, ɵɵclassMap, ɵɵclassMapInterpolate1, ɵɵclassMapInterpolate2, ɵɵclassMapInterpolate3, ɵɵclassMapInterpolate4, ɵɵclassMapInterpolate5, ɵɵclassMapInterpolate6, ɵɵclassMapInterpolate7, ɵɵclassMapInterpolate8, ɵɵclassMapInterpolateV, ɵɵclassProp, ɵɵcomponentInstance, ɵɵconditional, ɵɵcontentQuery, ɵɵdefer, ɵɵdeferEnableTimerScheduling, ɵɵdeferOnHover, ɵɵdeferOnIdle, ɵɵdeferOnImmediate, ɵɵdeferOnInteraction, ɵɵdeferOnTimer, ɵɵdeferOnViewport, ɵɵdeferPrefetchOnHover, ɵɵdeferPrefetchOnIdle, ɵɵdeferPrefetchOnImmediate, ɵɵdeferPrefetchOnInteraction, ɵɵdeferPrefetchOnTimer, ɵɵdeferPrefetchOnViewport, ɵɵdeferPrefetchWhen, ɵɵdeferWhen, ɵɵdefineComponent, ɵɵdefineDirective, ɵɵdefineInjectable, ɵɵdefineInjector, ɵɵdefineNgModule, ɵɵdefinePipe, ɵɵdirectiveInject, ɵɵdisableBindings, ɵɵelement, ɵɵelementContainer, ɵɵelementContainerEnd, ɵɵelementContainerStart, ɵɵelementEnd, ɵɵelementStart, ɵɵenableBindings, ɵɵgetComponentDepsFactory, ɵɵgetCurrentView, ɵɵgetInheritedFactory, ɵɵhostProperty, ɵɵi18n, ɵɵi18nApply, ɵɵi18nAttributes, ɵɵi18nEnd, ɵɵi18nExp, ɵɵi18nPostprocess, ɵɵi18nStart, ɵɵinject, ɵɵinjectAttribute, ɵɵinvalidFactory, ɵɵinvalidFactoryDep, ɵɵlistener, ɵɵloadQuery, ɵɵnamespaceHTML, ɵɵnamespaceMathML, ɵɵnamespaceSVG, ɵɵnextContext, ɵɵngDeclareClassMetadata, ɵɵngDeclareComponent, ɵɵngDeclareDirective, ɵɵngDeclareFactory, ɵɵngDeclareInjectable, ɵɵngDeclareInjector, ɵɵngDeclareNgModule, ɵɵngDeclarePipe, ɵɵpipe, ɵɵpipeBind1, ɵɵpipeBind2, ɵɵpipeBind3, ɵɵpipeBind4, ɵɵpipeBindV, ɵɵprojection, ɵɵprojectionDef, ɵɵproperty, ɵɵpropertyInterpolate, ɵɵpropertyInterpolate1, ɵɵpropertyInterpolate2, ɵɵpropertyInterpolate3, ɵɵpropertyInterpolate4, ɵɵpropertyInterpolate5, ɵɵpropertyInterpolate6, ɵɵpropertyInterpolate7, ɵɵpropertyInterpolate8, ɵɵpropertyInterpolateV, ɵɵpureFunction0, ɵɵpureFunction1, ɵɵpureFunction2, ɵɵpureFunction3, ɵɵpureFunction4, ɵɵpureFunction5, ɵɵpureFunction6, ɵɵpureFunction7, ɵɵpureFunction8, ɵɵpureFunctionV, ɵɵqueryRefresh, ɵɵreference, registerNgModuleType as ɵɵregisterNgModuleType, ɵɵrepeater, ɵɵrepeaterCreate, ɵɵrepeaterTrackByIdentity, ɵɵrepeaterTrackByIndex, ɵɵresetView, ɵɵresolveBody, ɵɵresolveDocument, ɵɵresolveWindow, ɵɵrestoreView, ɵɵsanitizeHtml, ɵɵsanitizeResourceUrl, ɵɵsanitizeScript, ɵɵsanitizeStyle, ɵɵsanitizeUrl, ɵɵsanitizeUrlOrResourceUrl, ɵɵsetComponentScope, ɵɵsetNgModuleScope, ɵɵstyleMap, ɵɵstyleMapInterpolate1, ɵɵstyleMapInterpolate2, ɵɵstyleMapInterpolate3, ɵɵstyleMapInterpolate4, ɵɵstyleMapInterpolate5, ɵɵstyleMapInterpolate6, ɵɵstyleMapInterpolate7, ɵɵstyleMapInterpolate8, ɵɵstyleMapInterpolateV, ɵɵstyleProp, ɵɵstylePropInterpolate1, ɵɵstylePropInterpolate2, ɵɵstylePropInterpolate3, ɵɵstylePropInterpolate4, ɵɵstylePropInterpolate5, ɵɵstylePropInterpolate6, ɵɵstylePropInterpolate7, ɵɵstylePropInterpolate8, ɵɵstylePropInterpolateV, ɵɵsyntheticHostListener, ɵɵsyntheticHostProperty, ɵɵtemplate, ɵɵtemplateRefExtractor, ɵɵtext, ɵɵtextInterpolate, ɵɵtextInterpolate1, ɵɵtextInterpolate2, ɵɵtextInterpolate3, ɵɵtextInterpolate4, ɵɵtextInterpolate5, ɵɵtextInterpolate6, ɵɵtextInterpolate7, ɵɵtextInterpolate8, ɵɵtextInterpolateV, ɵɵtrustConstantHtml, ɵɵtrustConstantResourceUrl, ɵɵvalidateIframeAttribute, ɵɵviewQuery };
|
|
34830
34877
|
//# sourceMappingURL=core.mjs.map
|