@angular/core 17.0.0-next.8 → 17.0.0-rc.0
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_ref.mjs +2 -1
- package/esm2022/src/core_private_export.mjs +4 -3
- package/esm2022/src/core_render3_private_export.mjs +2 -2
- package/esm2022/src/debug/debug_node.mjs +5 -9
- package/esm2022/src/defer/cleanup.mjs +70 -0
- package/esm2022/src/defer/discovery.mjs +47 -0
- package/esm2022/src/defer/dom_triggers.mjs +256 -0
- package/esm2022/src/defer/idle_scheduler.mjs +109 -0
- package/esm2022/src/defer/instructions.mjs +641 -0
- package/esm2022/src/defer/interfaces.mjs +79 -0
- package/esm2022/src/defer/timer_scheduler.mjs +192 -0
- package/esm2022/src/defer/utils.mjs +134 -0
- package/esm2022/src/hydration/api.mjs +1 -2
- package/esm2022/src/hydration/utils.mjs +2 -2
- package/esm2022/src/render/api.mjs +1 -1
- package/esm2022/src/render3/after_render_hooks.mjs +31 -1
- package/esm2022/src/render3/index.mjs +3 -2
- package/esm2022/src/render3/instructions/all.mjs +2 -2
- package/esm2022/src/render3/instructions/control_flow.mjs +25 -15
- package/esm2022/src/render3/interfaces/container.mjs +1 -4
- package/esm2022/src/render3/interfaces/definition.mjs +2 -4
- package/esm2022/src/render3/interfaces/i18n.mjs +1 -4
- package/esm2022/src/render3/interfaces/injector.mjs +1 -4
- package/esm2022/src/render3/interfaces/node.mjs +1 -4
- package/esm2022/src/render3/interfaces/projection.mjs +2 -4
- package/esm2022/src/render3/interfaces/query.mjs +2 -4
- package/esm2022/src/render3/interfaces/renderer.mjs +2 -4
- package/esm2022/src/render3/interfaces/renderer_dom.mjs +2 -4
- package/esm2022/src/render3/interfaces/view.mjs +1 -4
- package/esm2022/src/render3/list_reconciliation.mjs +58 -34
- package/esm2022/src/render3/reactive_lview_consumer.mjs +2 -7
- package/esm2022/src/version.mjs +1 -1
- package/esm2022/testing/src/logger.mjs +3 -3
- package/fesm2022/core.mjs +777 -741
- 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 +1 -1
- package/index.d.ts +43 -6
- 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 +413 -247
- 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 +471 -259
- package/schematics/ng-generate/control-flow-migration/bundle.js.map +4 -4
- package/schematics/ng-generate/standalone-migration/bundle.js +659 -486
- package/schematics/ng-generate/standalone-migration/bundle.js.map +4 -4
- package/testing/index.d.ts +1 -1
- package/esm2022/src/render3/instructions/defer.mjs +0 -1225
- package/esm2022/src/render3/instructions/defer_events.mjs +0 -174
- package/esm2022/src/render3/interfaces/defer.mjs +0 -79
package/fesm2022/core.mjs
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* @license Angular v17.0.0-
|
|
2
|
+
* @license Angular v17.0.0-rc.0
|
|
3
3
|
* (c) 2010-2022 Google LLC. https://angular.io/
|
|
4
4
|
* License: MIT
|
|
5
5
|
*/
|
|
@@ -2107,9 +2107,6 @@ const REACTIVE_HOST_BINDING_CONSUMER = 24;
|
|
|
2107
2107
|
* there should be no need to refer to `HEADER_OFFSET` anywhere else.
|
|
2108
2108
|
*/
|
|
2109
2109
|
const HEADER_OFFSET = 25;
|
|
2110
|
-
// Note: This hack is necessary so we don't erroneously get a circular dependency
|
|
2111
|
-
// failure based on types.
|
|
2112
|
-
const unusedValueExportToPlacateAjd$4 = 1;
|
|
2113
2110
|
|
|
2114
2111
|
/**
|
|
2115
2112
|
* Special location which allows easy identification of type. If we have an array which was
|
|
@@ -2147,9 +2144,6 @@ const DEHYDRATED_VIEWS = 10;
|
|
|
2147
2144
|
* remove views from the DOM when they are no longer required.
|
|
2148
2145
|
*/
|
|
2149
2146
|
const CONTAINER_HEADER_OFFSET = 11;
|
|
2150
|
-
// Note: This hack is necessary so we don't erroneously get a circular dependency
|
|
2151
|
-
// failure based on types.
|
|
2152
|
-
const unusedValueExportToPlacateAjd$3 = 1;
|
|
2153
2147
|
|
|
2154
2148
|
/**
|
|
2155
2149
|
* True if `value` is `LView`.
|
|
@@ -3576,9 +3570,6 @@ class NodeInjectorFactory {
|
|
|
3576
3570
|
function isFactory(obj) {
|
|
3577
3571
|
return obj instanceof NodeInjectorFactory;
|
|
3578
3572
|
}
|
|
3579
|
-
// Note: This hack is necessary so we don't erroneously get a circular dependency
|
|
3580
|
-
// failure based on types.
|
|
3581
|
-
const unusedValueExportToPlacateAjd$2 = 1;
|
|
3582
3573
|
|
|
3583
3574
|
/**
|
|
3584
3575
|
* Converts `TNodeType` into human readable text.
|
|
@@ -3610,9 +3601,6 @@ function isTNodeShape(value) {
|
|
|
3610
3601
|
typeof value.insertBeforeIndex === 'number' ||
|
|
3611
3602
|
Array.isArray(value.insertBeforeIndex));
|
|
3612
3603
|
}
|
|
3613
|
-
// Note: This hack is necessary so we don't erroneously get a circular dependency
|
|
3614
|
-
// failure based on types.
|
|
3615
|
-
const unusedValueExportToPlacateAjd$1 = 1;
|
|
3616
3604
|
/**
|
|
3617
3605
|
* Returns `true` if the `TNode` has a directive which has `@Input()` for `class` binding.
|
|
3618
3606
|
*
|
|
@@ -9997,7 +9985,7 @@ const DISCONNECTED_NODES = 'd';
|
|
|
9997
9985
|
* The name of the key used in the TransferState collection,
|
|
9998
9986
|
* where hydration information is located.
|
|
9999
9987
|
*/
|
|
10000
|
-
const TRANSFER_STATE_TOKEN_ID = '
|
|
9988
|
+
const TRANSFER_STATE_TOKEN_ID = '__nghData__';
|
|
10001
9989
|
/**
|
|
10002
9990
|
* Lookup key used to reference DOM hydration data (ngh) in `TransferState`.
|
|
10003
9991
|
*/
|
|
@@ -10429,7 +10417,7 @@ class Version {
|
|
|
10429
10417
|
/**
|
|
10430
10418
|
* @publicApi
|
|
10431
10419
|
*/
|
|
10432
|
-
const VERSION = new Version('17.0.0-
|
|
10420
|
+
const VERSION = new Version('17.0.0-rc.0');
|
|
10433
10421
|
|
|
10434
10422
|
// This default value is when checking the hierarchy for a token.
|
|
10435
10423
|
//
|
|
@@ -11410,6 +11398,26 @@ var AfterRenderPhase;
|
|
|
11410
11398
|
*/
|
|
11411
11399
|
AfterRenderPhase[AfterRenderPhase["Read"] = 3] = "Read";
|
|
11412
11400
|
})(AfterRenderPhase || (AfterRenderPhase = {}));
|
|
11401
|
+
/**
|
|
11402
|
+
* Register a callback to run once before any userspace `afterRender` or
|
|
11403
|
+
* `afterNextRender` callbacks.
|
|
11404
|
+
*
|
|
11405
|
+
* This function should almost always be used instead of `afterRender` or
|
|
11406
|
+
* `afterNextRender` for implementing framework functionality. Consider:
|
|
11407
|
+
*
|
|
11408
|
+
* 1.) `AfterRenderPhase.EarlyRead` is intended to be used for implementing
|
|
11409
|
+
* custom layout. If the framework itself mutates the DOM after *any*
|
|
11410
|
+
* `AfterRenderPhase.EarlyRead` callbacks are run, the phase can no
|
|
11411
|
+
* longer reliably serve its purpose.
|
|
11412
|
+
*
|
|
11413
|
+
* 2.) Importing `afterRender` in the framework can reduce the ability for it
|
|
11414
|
+
* to be tree-shaken, and the framework shouldn't need much of the behavior.
|
|
11415
|
+
*/
|
|
11416
|
+
function internalAfterNextRender(callback, options) {
|
|
11417
|
+
const injector = options?.injector ?? inject(Injector);
|
|
11418
|
+
const afterRenderEventManager = injector.get(AfterRenderEventManager);
|
|
11419
|
+
afterRenderEventManager.internalCallbacks.push(callback);
|
|
11420
|
+
}
|
|
11413
11421
|
/**
|
|
11414
11422
|
* Register a callback to be invoked each time the application
|
|
11415
11423
|
* finishes rendering.
|
|
@@ -11640,6 +11648,8 @@ class AfterRenderEventManager {
|
|
|
11640
11648
|
this.renderDepth = 0;
|
|
11641
11649
|
/* @internal */
|
|
11642
11650
|
this.handler = null;
|
|
11651
|
+
/* @internal */
|
|
11652
|
+
this.internalCallbacks = [];
|
|
11643
11653
|
}
|
|
11644
11654
|
/**
|
|
11645
11655
|
* Mark the beginning of a render operation (i.e. CD cycle).
|
|
@@ -11657,12 +11667,20 @@ class AfterRenderEventManager {
|
|
|
11657
11667
|
ngDevMode && assertGreaterThan(this.renderDepth, 0, 'renderDepth must be greater than 0');
|
|
11658
11668
|
this.renderDepth--;
|
|
11659
11669
|
if (this.renderDepth === 0) {
|
|
11670
|
+
// Note: internal callbacks power `internalAfterNextRender`. Since internal callbacks
|
|
11671
|
+
// are fairly trivial, they are kept separate so that `AfterRenderCallbackHandlerImpl`
|
|
11672
|
+
// can still be tree-shaken unless used by the application.
|
|
11673
|
+
for (const callback of this.internalCallbacks) {
|
|
11674
|
+
callback();
|
|
11675
|
+
}
|
|
11676
|
+
this.internalCallbacks.length = 0;
|
|
11660
11677
|
this.handler?.execute();
|
|
11661
11678
|
}
|
|
11662
11679
|
}
|
|
11663
11680
|
ngOnDestroy() {
|
|
11664
11681
|
this.handler?.destroy();
|
|
11665
11682
|
this.handler = null;
|
|
11683
|
+
this.internalCallbacks.length = 0;
|
|
11666
11684
|
}
|
|
11667
11685
|
/** @nocollapse */
|
|
11668
11686
|
static { this.ɵprov = ɵɵdefineInjectable({
|
|
@@ -11840,11 +11858,6 @@ function getExpressionChangedErrorDetails(lView, bindingIndex, oldValue, newValu
|
|
|
11840
11858
|
}
|
|
11841
11859
|
|
|
11842
11860
|
let currentConsumer = null;
|
|
11843
|
-
function setLViewForConsumer(node, lView) {
|
|
11844
|
-
(typeof ngDevMode === 'undefined' || ngDevMode) &&
|
|
11845
|
-
assertEqual(node.lView, null, 'Consumer already associated with a view.');
|
|
11846
|
-
node.lView = lView;
|
|
11847
|
-
}
|
|
11848
11861
|
/**
|
|
11849
11862
|
* Create a new template consumer pointing at the specified LView.
|
|
11850
11863
|
* Sometimes, a previously created consumer may be reused, in order to save on allocations. In that
|
|
@@ -18264,6 +18277,17 @@ class LiveCollection {
|
|
|
18264
18277
|
this.attach(newIdx, this.detach(prevIndex));
|
|
18265
18278
|
}
|
|
18266
18279
|
}
|
|
18280
|
+
function valuesMatching(liveIdx, liveValue, newIdx, newValue, trackBy) {
|
|
18281
|
+
if (liveIdx === newIdx && Object.is(liveValue, newValue)) {
|
|
18282
|
+
// matching and no value identity to update
|
|
18283
|
+
return 1;
|
|
18284
|
+
}
|
|
18285
|
+
else if (Object.is(trackBy(liveIdx, liveValue), trackBy(newIdx, newValue))) {
|
|
18286
|
+
// matching but requires value identity update
|
|
18287
|
+
return -1;
|
|
18288
|
+
}
|
|
18289
|
+
return 0;
|
|
18290
|
+
}
|
|
18267
18291
|
/**
|
|
18268
18292
|
* The live collection reconciliation algorithm that perform various in-place operations, so it
|
|
18269
18293
|
* reflects the content of the new (incoming) collection.
|
|
@@ -18296,40 +18320,47 @@ function reconcile(liveCollection, newCollection, trackByFn) {
|
|
|
18296
18320
|
let newEndIdx = newCollection.length - 1;
|
|
18297
18321
|
while (liveStartIdx <= liveEndIdx && liveStartIdx <= newEndIdx) {
|
|
18298
18322
|
// compare from the beginning
|
|
18299
|
-
const
|
|
18323
|
+
const liveStartValue = liveCollection.at(liveStartIdx);
|
|
18300
18324
|
const newStartValue = newCollection[liveStartIdx];
|
|
18301
|
-
const
|
|
18302
|
-
if (
|
|
18303
|
-
|
|
18325
|
+
const isStartMatching = valuesMatching(liveStartIdx, liveStartValue, liveStartIdx, newStartValue, trackByFn);
|
|
18326
|
+
if (isStartMatching !== 0) {
|
|
18327
|
+
if (isStartMatching < 0) {
|
|
18328
|
+
liveCollection.updateValue(liveStartIdx, newStartValue);
|
|
18329
|
+
}
|
|
18304
18330
|
liveStartIdx++;
|
|
18305
18331
|
continue;
|
|
18306
18332
|
}
|
|
18307
18333
|
// compare from the end
|
|
18308
18334
|
// TODO(perf): do _all_ the matching from the end
|
|
18309
|
-
const
|
|
18310
|
-
const
|
|
18311
|
-
const
|
|
18312
|
-
if (
|
|
18313
|
-
|
|
18335
|
+
const liveEndValue = liveCollection.at(liveEndIdx);
|
|
18336
|
+
const newEndValue = newCollection[newEndIdx];
|
|
18337
|
+
const isEndMatching = valuesMatching(liveEndIdx, liveEndValue, newEndIdx, newEndValue, trackByFn);
|
|
18338
|
+
if (isEndMatching !== 0) {
|
|
18339
|
+
if (isEndMatching < 0) {
|
|
18340
|
+
liveCollection.updateValue(liveEndIdx, newEndValue);
|
|
18341
|
+
}
|
|
18314
18342
|
liveEndIdx--;
|
|
18315
18343
|
newEndIdx--;
|
|
18316
18344
|
continue;
|
|
18317
18345
|
}
|
|
18318
|
-
// Detect swap
|
|
18319
|
-
|
|
18320
|
-
|
|
18321
|
-
|
|
18322
|
-
|
|
18323
|
-
|
|
18324
|
-
|
|
18325
|
-
|
|
18326
|
-
|
|
18327
|
-
|
|
18328
|
-
|
|
18329
|
-
|
|
18330
|
-
|
|
18331
|
-
|
|
18332
|
-
|
|
18346
|
+
// Detect swap and moves:
|
|
18347
|
+
const liveStartKey = trackByFn(liveStartIdx, liveStartValue);
|
|
18348
|
+
const liveEndKey = trackByFn(liveEndIdx, liveEndValue);
|
|
18349
|
+
const newStartKey = trackByFn(liveStartIdx, newStartValue);
|
|
18350
|
+
if (Object.is(newStartKey, liveEndKey)) {
|
|
18351
|
+
const newEndKey = trackByFn(newEndIdx, newEndValue);
|
|
18352
|
+
// detect swap on both ends;
|
|
18353
|
+
if (Object.is(newEndKey, liveStartKey)) {
|
|
18354
|
+
liveCollection.swap(liveStartIdx, liveEndIdx);
|
|
18355
|
+
liveCollection.updateValue(liveEndIdx, newEndValue);
|
|
18356
|
+
newEndIdx--;
|
|
18357
|
+
liveEndIdx--;
|
|
18358
|
+
}
|
|
18359
|
+
else {
|
|
18360
|
+
// the new item is the same as the live item with the end pointer - this is a move forward
|
|
18361
|
+
// to an earlier index;
|
|
18362
|
+
liveCollection.move(liveEndIdx, liveStartIdx);
|
|
18363
|
+
}
|
|
18333
18364
|
liveCollection.updateValue(liveStartIdx, newStartValue);
|
|
18334
18365
|
liveStartIdx++;
|
|
18335
18366
|
continue;
|
|
@@ -18337,7 +18368,8 @@ function reconcile(liveCollection, newCollection, trackByFn) {
|
|
|
18337
18368
|
// Fallback to the slow path: we need to learn more about the content of the live and new
|
|
18338
18369
|
// collections.
|
|
18339
18370
|
detachedItems ??= new MultiMap();
|
|
18340
|
-
liveKeysInTheFuture ??=
|
|
18371
|
+
liveKeysInTheFuture ??=
|
|
18372
|
+
initLiveItemsInTheFuture(liveCollection, liveStartIdx, liveEndIdx, trackByFn);
|
|
18341
18373
|
// Check if I'm inserting a previously detached item: if so, attach it here
|
|
18342
18374
|
if (attachPreviouslyDetached(liveCollection, detachedItems, liveStartIdx, newStartKey)) {
|
|
18343
18375
|
liveCollection.updateValue(liveStartIdx, newStartValue);
|
|
@@ -18371,19 +18403,23 @@ function reconcile(liveCollection, newCollection, trackByFn) {
|
|
|
18371
18403
|
const newCollectionIterator = newCollection[Symbol.iterator]();
|
|
18372
18404
|
let newIterationResult = newCollectionIterator.next();
|
|
18373
18405
|
while (!newIterationResult.done && liveStartIdx <= liveEndIdx) {
|
|
18406
|
+
const liveValue = liveCollection.at(liveStartIdx);
|
|
18374
18407
|
const newValue = newIterationResult.value;
|
|
18375
|
-
const
|
|
18376
|
-
|
|
18377
|
-
|
|
18378
|
-
|
|
18379
|
-
|
|
18408
|
+
const isStartMatching = valuesMatching(liveStartIdx, liveValue, liveStartIdx, newValue, trackByFn);
|
|
18409
|
+
if (isStartMatching !== 0) {
|
|
18410
|
+
// found a match - move on, but update value
|
|
18411
|
+
if (isStartMatching < 0) {
|
|
18412
|
+
liveCollection.updateValue(liveStartIdx, newValue);
|
|
18413
|
+
}
|
|
18380
18414
|
liveStartIdx++;
|
|
18381
18415
|
newIterationResult = newCollectionIterator.next();
|
|
18382
18416
|
}
|
|
18383
18417
|
else {
|
|
18384
18418
|
detachedItems ??= new MultiMap();
|
|
18385
|
-
liveKeysInTheFuture ??=
|
|
18419
|
+
liveKeysInTheFuture ??=
|
|
18420
|
+
initLiveItemsInTheFuture(liveCollection, liveStartIdx, liveEndIdx, trackByFn);
|
|
18386
18421
|
// Check if I'm inserting a previously detached item: if so, attach it here
|
|
18422
|
+
const newKey = trackByFn(liveStartIdx, newValue);
|
|
18387
18423
|
if (attachPreviouslyDetached(liveCollection, detachedItems, liveStartIdx, newKey)) {
|
|
18388
18424
|
liveCollection.updateValue(liveStartIdx, newValue);
|
|
18389
18425
|
liveStartIdx++;
|
|
@@ -18398,6 +18434,7 @@ function reconcile(liveCollection, newCollection, trackByFn) {
|
|
|
18398
18434
|
}
|
|
18399
18435
|
else {
|
|
18400
18436
|
// it is a move forward - detach the current item without advancing in collections
|
|
18437
|
+
const liveKey = trackByFn(liveStartIdx, liveValue);
|
|
18401
18438
|
detachedItems.set(liveKey, liveCollection.detach(liveStartIdx));
|
|
18402
18439
|
liveEndIdx--;
|
|
18403
18440
|
}
|
|
@@ -18435,10 +18472,10 @@ function createOrAttach(liveCollection, detachedItems, trackByFn, index, value)
|
|
|
18435
18472
|
liveCollection.updateValue(index, value);
|
|
18436
18473
|
}
|
|
18437
18474
|
}
|
|
18438
|
-
function initLiveItemsInTheFuture(liveCollection, start, end) {
|
|
18475
|
+
function initLiveItemsInTheFuture(liveCollection, start, end, trackByFn) {
|
|
18439
18476
|
const keys = new Set();
|
|
18440
18477
|
for (let i = start; i <= end; i++) {
|
|
18441
|
-
keys.add(liveCollection.
|
|
18478
|
+
keys.add(trackByFn(i, liveCollection.at(i)));
|
|
18442
18479
|
}
|
|
18443
18480
|
return keys;
|
|
18444
18481
|
}
|
|
@@ -19150,9 +19187,10 @@ function ɵɵrepeaterTrackByIdentity(_, value) {
|
|
|
19150
19187
|
return value;
|
|
19151
19188
|
}
|
|
19152
19189
|
class RepeaterMetadata {
|
|
19153
|
-
constructor(hasEmptyBlock, trackByFn) {
|
|
19190
|
+
constructor(hasEmptyBlock, trackByFn, liveCollection) {
|
|
19154
19191
|
this.hasEmptyBlock = hasEmptyBlock;
|
|
19155
19192
|
this.trackByFn = trackByFn;
|
|
19193
|
+
this.liveCollection = liveCollection;
|
|
19156
19194
|
}
|
|
19157
19195
|
}
|
|
19158
19196
|
/**
|
|
@@ -19197,12 +19235,11 @@ function ɵɵrepeaterCreate(index, templateFn, decls, vars, trackByFn, trackByUs
|
|
|
19197
19235
|
}
|
|
19198
19236
|
}
|
|
19199
19237
|
class LiveCollectionLContainerImpl extends LiveCollection {
|
|
19200
|
-
constructor(lContainer, hostLView, templateTNode
|
|
19238
|
+
constructor(lContainer, hostLView, templateTNode) {
|
|
19201
19239
|
super();
|
|
19202
19240
|
this.lContainer = lContainer;
|
|
19203
19241
|
this.hostLView = hostLView;
|
|
19204
19242
|
this.templateTNode = templateTNode;
|
|
19205
|
-
this.trackByFn = trackByFn;
|
|
19206
19243
|
/**
|
|
19207
19244
|
Property indicating if indexes in the repeater context need to be updated following the live
|
|
19208
19245
|
collection changes. Index updates are necessary if and only if views are inserted / removed in
|
|
@@ -19214,10 +19251,7 @@ class LiveCollectionLContainerImpl extends LiveCollection {
|
|
|
19214
19251
|
return this.lContainer.length - CONTAINER_HEADER_OFFSET;
|
|
19215
19252
|
}
|
|
19216
19253
|
at(index) {
|
|
19217
|
-
return
|
|
19218
|
-
}
|
|
19219
|
-
key(index) {
|
|
19220
|
-
return this.trackByFn(index, this.at(index)[CONTEXT].$implicit);
|
|
19254
|
+
return this.getLView(index)[CONTEXT].$implicit;
|
|
19221
19255
|
}
|
|
19222
19256
|
attach(index, lView) {
|
|
19223
19257
|
const dehydratedView = lView[HYDRATION];
|
|
@@ -19237,15 +19271,21 @@ class LiveCollectionLContainerImpl extends LiveCollection {
|
|
|
19237
19271
|
destroyLView(lView[TVIEW], lView);
|
|
19238
19272
|
}
|
|
19239
19273
|
updateValue(index, value) {
|
|
19240
|
-
this.
|
|
19274
|
+
this.getLView(index)[CONTEXT].$implicit = value;
|
|
19275
|
+
}
|
|
19276
|
+
reset() {
|
|
19277
|
+
this.needsIndexUpdate = false;
|
|
19241
19278
|
}
|
|
19242
19279
|
updateIndexes() {
|
|
19243
19280
|
if (this.needsIndexUpdate) {
|
|
19244
19281
|
for (let i = 0; i < this.length; i++) {
|
|
19245
|
-
this.
|
|
19282
|
+
this.getLView(i)[CONTEXT].$index = i;
|
|
19246
19283
|
}
|
|
19247
19284
|
}
|
|
19248
19285
|
}
|
|
19286
|
+
getLView(index) {
|
|
19287
|
+
return getExistingLViewFromLContainer(this.lContainer, index);
|
|
19288
|
+
}
|
|
19249
19289
|
}
|
|
19250
19290
|
/**
|
|
19251
19291
|
* The repeater instruction does update-time diffing of a provided collection (against the
|
|
@@ -19261,17 +19301,24 @@ function ɵɵrepeater(metadataSlotIdx, collection) {
|
|
|
19261
19301
|
const hostLView = getLView();
|
|
19262
19302
|
const hostTView = hostLView[TVIEW];
|
|
19263
19303
|
const metadata = hostLView[HEADER_OFFSET + metadataSlotIdx];
|
|
19264
|
-
|
|
19265
|
-
|
|
19266
|
-
|
|
19267
|
-
|
|
19304
|
+
if (metadata.liveCollection === undefined) {
|
|
19305
|
+
const containerIndex = metadataSlotIdx + 1;
|
|
19306
|
+
const lContainer = getLContainer(hostLView, HEADER_OFFSET + containerIndex);
|
|
19307
|
+
const itemTemplateTNode = getExistingTNode(hostTView, containerIndex);
|
|
19308
|
+
metadata.liveCollection =
|
|
19309
|
+
new LiveCollectionLContainerImpl(lContainer, hostLView, itemTemplateTNode);
|
|
19310
|
+
}
|
|
19311
|
+
else {
|
|
19312
|
+
metadata.liveCollection.reset();
|
|
19313
|
+
}
|
|
19314
|
+
const liveCollection = metadata.liveCollection;
|
|
19268
19315
|
reconcile(liveCollection, collection, metadata.trackByFn);
|
|
19269
19316
|
// moves in the container might caused context's index to get out of order, re-adjust if needed
|
|
19270
19317
|
liveCollection.updateIndexes();
|
|
19271
19318
|
// handle empty blocks
|
|
19272
19319
|
if (metadata.hasEmptyBlock) {
|
|
19273
19320
|
const bindingIndex = nextBindingIndex();
|
|
19274
|
-
const isCollectionEmpty =
|
|
19321
|
+
const isCollectionEmpty = liveCollection.length === 0;
|
|
19275
19322
|
if (bindingUpdated(hostLView, bindingIndex, isCollectionEmpty)) {
|
|
19276
19323
|
const emptyTemplateIndex = metadataSlotIdx + 2;
|
|
19277
19324
|
const lContainerForEmpty = getLContainer(hostLView, HEADER_OFFSET + emptyTemplateIndex);
|
|
@@ -19308,6 +19355,75 @@ function getExistingTNode(tView, index) {
|
|
|
19308
19355
|
return tNode;
|
|
19309
19356
|
}
|
|
19310
19357
|
|
|
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
|
+
|
|
19311
19427
|
/**
|
|
19312
19428
|
* Describes the state of defer block dependency loading.
|
|
19313
19429
|
*/
|
|
@@ -19380,6 +19496,128 @@ var DeferBlockBehavior;
|
|
|
19380
19496
|
DeferBlockBehavior[DeferBlockBehavior["Playthrough"] = 1] = "Playthrough";
|
|
19381
19497
|
})(DeferBlockBehavior || (DeferBlockBehavior = {}));
|
|
19382
19498
|
|
|
19499
|
+
/**
|
|
19500
|
+
* Wraps a given callback into a logic that registers a cleanup function
|
|
19501
|
+
* in the LView cleanup slot, to be invoked when an LView is destroyed.
|
|
19502
|
+
*/
|
|
19503
|
+
function wrapWithLViewCleanup(callback, lView, cleanup) {
|
|
19504
|
+
const wrappedCallback = () => {
|
|
19505
|
+
callback();
|
|
19506
|
+
removeLViewOnDestroy(lView, cleanup);
|
|
19507
|
+
};
|
|
19508
|
+
storeLViewOnDestroy(lView, cleanup);
|
|
19509
|
+
return wrappedCallback;
|
|
19510
|
+
}
|
|
19511
|
+
/**
|
|
19512
|
+
* Calculates a data slot index for defer block info (either static or
|
|
19513
|
+
* instance-specific), given an index of a defer instruction.
|
|
19514
|
+
*/
|
|
19515
|
+
function getDeferBlockDataIndex(deferBlockIndex) {
|
|
19516
|
+
// Instance state is located at the *next* position
|
|
19517
|
+
// after the defer block slot in an LView or TView.data.
|
|
19518
|
+
return deferBlockIndex + 1;
|
|
19519
|
+
}
|
|
19520
|
+
/** Retrieves a defer block state from an LView, given a TNode that represents a block. */
|
|
19521
|
+
function getLDeferBlockDetails(lView, tNode) {
|
|
19522
|
+
const tView = lView[TVIEW];
|
|
19523
|
+
const slotIndex = getDeferBlockDataIndex(tNode.index);
|
|
19524
|
+
ngDevMode && assertIndexInDeclRange(tView, slotIndex);
|
|
19525
|
+
return lView[slotIndex];
|
|
19526
|
+
}
|
|
19527
|
+
/** Stores a defer block instance state in LView. */
|
|
19528
|
+
function setLDeferBlockDetails(lView, deferBlockIndex, lDetails) {
|
|
19529
|
+
const tView = lView[TVIEW];
|
|
19530
|
+
const slotIndex = getDeferBlockDataIndex(deferBlockIndex);
|
|
19531
|
+
ngDevMode && assertIndexInDeclRange(tView, slotIndex);
|
|
19532
|
+
lView[slotIndex] = lDetails;
|
|
19533
|
+
}
|
|
19534
|
+
/** Retrieves static info about a defer block, given a TView and a TNode that represents a block. */
|
|
19535
|
+
function getTDeferBlockDetails(tView, tNode) {
|
|
19536
|
+
const slotIndex = getDeferBlockDataIndex(tNode.index);
|
|
19537
|
+
ngDevMode && assertIndexInDeclRange(tView, slotIndex);
|
|
19538
|
+
return tView.data[slotIndex];
|
|
19539
|
+
}
|
|
19540
|
+
/** Stores a defer block static info in `TView.data`. */
|
|
19541
|
+
function setTDeferBlockDetails(tView, deferBlockIndex, deferBlockConfig) {
|
|
19542
|
+
const slotIndex = getDeferBlockDataIndex(deferBlockIndex);
|
|
19543
|
+
ngDevMode && assertIndexInDeclRange(tView, slotIndex);
|
|
19544
|
+
tView.data[slotIndex] = deferBlockConfig;
|
|
19545
|
+
}
|
|
19546
|
+
function getTemplateIndexForState(newState, hostLView, tNode) {
|
|
19547
|
+
const tView = hostLView[TVIEW];
|
|
19548
|
+
const tDetails = getTDeferBlockDetails(tView, tNode);
|
|
19549
|
+
switch (newState) {
|
|
19550
|
+
case DeferBlockState.Complete:
|
|
19551
|
+
return tDetails.primaryTmplIndex;
|
|
19552
|
+
case DeferBlockState.Loading:
|
|
19553
|
+
return tDetails.loadingTmplIndex;
|
|
19554
|
+
case DeferBlockState.Error:
|
|
19555
|
+
return tDetails.errorTmplIndex;
|
|
19556
|
+
case DeferBlockState.Placeholder:
|
|
19557
|
+
return tDetails.placeholderTmplIndex;
|
|
19558
|
+
default:
|
|
19559
|
+
ngDevMode && throwError(`Unexpected defer block state: ${newState}`);
|
|
19560
|
+
return null;
|
|
19561
|
+
}
|
|
19562
|
+
}
|
|
19563
|
+
/**
|
|
19564
|
+
* Returns a minimum amount of time that a given state should be rendered for,
|
|
19565
|
+
* taking into account `minimum` parameter value. If the `minimum` value is
|
|
19566
|
+
* not specified - returns `null`.
|
|
19567
|
+
*/
|
|
19568
|
+
function getMinimumDurationForState(tDetails, currentState) {
|
|
19569
|
+
if (currentState === DeferBlockState.Placeholder) {
|
|
19570
|
+
return tDetails.placeholderBlockConfig?.[MINIMUM_SLOT] ?? null;
|
|
19571
|
+
}
|
|
19572
|
+
else if (currentState === DeferBlockState.Loading) {
|
|
19573
|
+
return tDetails.loadingBlockConfig?.[MINIMUM_SLOT] ?? null;
|
|
19574
|
+
}
|
|
19575
|
+
return null;
|
|
19576
|
+
}
|
|
19577
|
+
/** Retrieves the value of the `after` parameter on the @loading block. */
|
|
19578
|
+
function getLoadingBlockAfter(tDetails) {
|
|
19579
|
+
return tDetails.loadingBlockConfig?.[LOADING_AFTER_SLOT] ?? null;
|
|
19580
|
+
}
|
|
19581
|
+
/**
|
|
19582
|
+
* Adds downloaded dependencies into a directive or a pipe registry,
|
|
19583
|
+
* making sure that a dependency doesn't yet exist in the registry.
|
|
19584
|
+
*/
|
|
19585
|
+
function addDepsToRegistry(currentDeps, newDeps) {
|
|
19586
|
+
if (!currentDeps || currentDeps.length === 0) {
|
|
19587
|
+
return newDeps;
|
|
19588
|
+
}
|
|
19589
|
+
const currentDepSet = new Set(currentDeps);
|
|
19590
|
+
for (const dep of newDeps) {
|
|
19591
|
+
currentDepSet.add(dep);
|
|
19592
|
+
}
|
|
19593
|
+
// If `currentDeps` is the same length, there were no new deps and can
|
|
19594
|
+
// return the original array.
|
|
19595
|
+
return (currentDeps.length === currentDepSet.size) ? currentDeps : Array.from(currentDepSet);
|
|
19596
|
+
}
|
|
19597
|
+
/** Retrieves a TNode that represents main content of a defer block. */
|
|
19598
|
+
function getPrimaryBlockTNode(tView, tDetails) {
|
|
19599
|
+
const adjustedIndex = tDetails.primaryTmplIndex + HEADER_OFFSET;
|
|
19600
|
+
return getTNode(tView, adjustedIndex);
|
|
19601
|
+
}
|
|
19602
|
+
/**
|
|
19603
|
+
* Asserts whether all dependencies for a defer block are loaded.
|
|
19604
|
+
* Always run this function (in dev mode) before rendering a defer
|
|
19605
|
+
* block in completed state.
|
|
19606
|
+
*/
|
|
19607
|
+
function assertDeferredDependenciesLoaded(tDetails) {
|
|
19608
|
+
assertEqual(tDetails.loadingState, DeferDependenciesLoadingState.COMPLETE, 'Expecting all deferred dependencies to be loaded.');
|
|
19609
|
+
}
|
|
19610
|
+
/**
|
|
19611
|
+
* Determines if a given value matches the expected structure of a defer block
|
|
19612
|
+
*
|
|
19613
|
+
* We can safely rely on the primaryTmplIndex because every defer block requires
|
|
19614
|
+
* that a primary template exists. All the other template options are optional.
|
|
19615
|
+
*/
|
|
19616
|
+
function isTDeferBlockDetails(value) {
|
|
19617
|
+
return (typeof value === 'object') &&
|
|
19618
|
+
(typeof value.primaryTmplIndex === 'number');
|
|
19619
|
+
}
|
|
19620
|
+
|
|
19383
19621
|
/*!
|
|
19384
19622
|
* @license
|
|
19385
19623
|
* Copyright Google LLC All Rights Reserved.
|
|
@@ -19396,10 +19634,16 @@ const eventListenerOptions = {
|
|
|
19396
19634
|
const hoverTriggers = new WeakMap();
|
|
19397
19635
|
/** Keeps track of the currently-registered `on interaction` triggers. */
|
|
19398
19636
|
const interactionTriggers = new WeakMap();
|
|
19637
|
+
/** Currently-registered `viewport` triggers. */
|
|
19638
|
+
const viewportTriggers = new WeakMap();
|
|
19399
19639
|
/** Names of the events considered as interaction events. */
|
|
19400
19640
|
const interactionEventNames = ['click', 'keydown'];
|
|
19401
19641
|
/** Names of the events considered as hover events. */
|
|
19402
19642
|
const hoverEventNames = ['mouseenter', 'focusin'];
|
|
19643
|
+
/** `IntersectionObserver` used to observe `viewport` triggers. */
|
|
19644
|
+
let intersectionObserver = null;
|
|
19645
|
+
/** Number of elements currently observed with `viewport` triggers. */
|
|
19646
|
+
let observedViewportElements = 0;
|
|
19403
19647
|
/** Object keeping track of registered callbacks for a deferred block trigger. */
|
|
19404
19648
|
class DeferEventEntry {
|
|
19405
19649
|
constructor() {
|
|
@@ -19421,7 +19665,7 @@ function onInteraction(trigger, callback, injector) {
|
|
|
19421
19665
|
let entry = interactionTriggers.get(trigger);
|
|
19422
19666
|
// If this is the first entry for this element, add the listeners.
|
|
19423
19667
|
if (!entry) {
|
|
19424
|
-
// Note that
|
|
19668
|
+
// Note that managing events centrally like this lends itself well to using global
|
|
19425
19669
|
// event delegation. It currently does delegation at the element level, rather than the
|
|
19426
19670
|
// document level, because:
|
|
19427
19671
|
// 1. Global delegation is the most effective when there are a lot of events being registered
|
|
@@ -19434,13 +19678,11 @@ function onInteraction(trigger, callback, injector) {
|
|
|
19434
19678
|
// are referencing it.
|
|
19435
19679
|
entry = new DeferEventEntry();
|
|
19436
19680
|
interactionTriggers.set(trigger, entry);
|
|
19437
|
-
// Ensure that the handler runs in the NgZone
|
|
19438
|
-
|
|
19439
|
-
|
|
19440
|
-
|
|
19441
|
-
|
|
19442
|
-
}
|
|
19443
|
-
});
|
|
19681
|
+
// Ensure that the handler runs in the NgZone
|
|
19682
|
+
ngDevMode && NgZone.assertInAngularZone();
|
|
19683
|
+
for (const name of interactionEventNames) {
|
|
19684
|
+
trigger.addEventListener(name, entry.listener, eventListenerOptions);
|
|
19685
|
+
}
|
|
19444
19686
|
}
|
|
19445
19687
|
entry.callbacks.add(callback);
|
|
19446
19688
|
return () => {
|
|
@@ -19466,13 +19708,11 @@ function onHover(trigger, callback, injector) {
|
|
|
19466
19708
|
if (!entry) {
|
|
19467
19709
|
entry = new DeferEventEntry();
|
|
19468
19710
|
hoverTriggers.set(trigger, entry);
|
|
19469
|
-
// Ensure that the handler runs in the NgZone
|
|
19470
|
-
|
|
19471
|
-
|
|
19472
|
-
|
|
19473
|
-
|
|
19474
|
-
}
|
|
19475
|
-
});
|
|
19711
|
+
// Ensure that the handler runs in the NgZone
|
|
19712
|
+
ngDevMode && NgZone.assertInAngularZone();
|
|
19713
|
+
for (const name of hoverEventNames) {
|
|
19714
|
+
trigger.addEventListener(name, entry.listener, eventListenerOptions);
|
|
19715
|
+
}
|
|
19476
19716
|
}
|
|
19477
19717
|
entry.callbacks.add(callback);
|
|
19478
19718
|
return () => {
|
|
@@ -19493,65 +19733,427 @@ function onHover(trigger, callback, injector) {
|
|
|
19493
19733
|
* @param injector Injector that can be used by the trigger to resolve DI tokens.
|
|
19494
19734
|
*/
|
|
19495
19735
|
function onViewport(trigger, callback, injector) {
|
|
19496
|
-
|
|
19736
|
+
const ngZone = injector.get(NgZone);
|
|
19737
|
+
let entry = viewportTriggers.get(trigger);
|
|
19738
|
+
intersectionObserver = intersectionObserver || ngZone.runOutsideAngular(() => {
|
|
19739
|
+
return new IntersectionObserver(entries => {
|
|
19740
|
+
for (const current of entries) {
|
|
19741
|
+
// Only invoke the callbacks if the specific element is intersecting.
|
|
19742
|
+
if (current.isIntersecting && viewportTriggers.has(current.target)) {
|
|
19743
|
+
ngZone.run(viewportTriggers.get(current.target).listener);
|
|
19744
|
+
}
|
|
19745
|
+
}
|
|
19746
|
+
});
|
|
19747
|
+
});
|
|
19748
|
+
if (!entry) {
|
|
19749
|
+
entry = new DeferEventEntry();
|
|
19750
|
+
ngZone.runOutsideAngular(() => intersectionObserver.observe(trigger));
|
|
19751
|
+
viewportTriggers.set(trigger, entry);
|
|
19752
|
+
observedViewportElements++;
|
|
19753
|
+
}
|
|
19754
|
+
entry.callbacks.add(callback);
|
|
19755
|
+
return () => {
|
|
19756
|
+
// It's possible that a different cleanup callback fully removed this element already.
|
|
19757
|
+
if (!viewportTriggers.has(trigger)) {
|
|
19758
|
+
return;
|
|
19759
|
+
}
|
|
19760
|
+
entry.callbacks.delete(callback);
|
|
19761
|
+
if (entry.callbacks.size === 0) {
|
|
19762
|
+
intersectionObserver?.unobserve(trigger);
|
|
19763
|
+
viewportTriggers.delete(trigger);
|
|
19764
|
+
observedViewportElements--;
|
|
19765
|
+
}
|
|
19766
|
+
if (observedViewportElements === 0) {
|
|
19767
|
+
intersectionObserver?.disconnect();
|
|
19768
|
+
intersectionObserver = null;
|
|
19769
|
+
}
|
|
19770
|
+
};
|
|
19771
|
+
}
|
|
19772
|
+
/**
|
|
19773
|
+
* Helper function to get the LView in which a deferred block's trigger is rendered.
|
|
19774
|
+
* @param deferredHostLView LView in which the deferred block is defined.
|
|
19775
|
+
* @param deferredTNode TNode defining the deferred block.
|
|
19776
|
+
* @param walkUpTimes Number of times to go up in the view hierarchy to find the trigger's view.
|
|
19777
|
+
* A negative value means that the trigger is inside the block's placeholder, while an undefined
|
|
19778
|
+
* value means that the trigger is in the same LView as the deferred block.
|
|
19779
|
+
*/
|
|
19780
|
+
function getTriggerLView(deferredHostLView, deferredTNode, walkUpTimes) {
|
|
19781
|
+
// The trigger is in the same view, we don't need to traverse.
|
|
19782
|
+
if (walkUpTimes == null) {
|
|
19783
|
+
return deferredHostLView;
|
|
19784
|
+
}
|
|
19785
|
+
// A positive value or zero means that the trigger is in a parent view.
|
|
19786
|
+
if (walkUpTimes >= 0) {
|
|
19787
|
+
return walkUpViews(walkUpTimes, deferredHostLView);
|
|
19788
|
+
}
|
|
19789
|
+
// If the value is negative, it means that the trigger is inside the placeholder.
|
|
19790
|
+
const deferredContainer = deferredHostLView[deferredTNode.index];
|
|
19791
|
+
ngDevMode && assertLContainer(deferredContainer);
|
|
19792
|
+
const triggerLView = deferredContainer[CONTAINER_HEADER_OFFSET] ?? null;
|
|
19793
|
+
// We need to null check, because the placeholder might not have been rendered yet.
|
|
19794
|
+
if (ngDevMode && triggerLView !== null) {
|
|
19795
|
+
const lDetails = getLDeferBlockDetails(deferredHostLView, deferredTNode);
|
|
19796
|
+
const renderedState = lDetails[DEFER_BLOCK_STATE];
|
|
19797
|
+
assertEqual(renderedState, DeferBlockState.Placeholder, 'Expected a placeholder to be rendered in this defer block.');
|
|
19798
|
+
assertLView(triggerLView);
|
|
19799
|
+
}
|
|
19800
|
+
return triggerLView;
|
|
19801
|
+
}
|
|
19802
|
+
/**
|
|
19803
|
+
* Gets the element that a deferred block's trigger is pointing to.
|
|
19804
|
+
* @param triggerLView LView in which the trigger is defined.
|
|
19805
|
+
* @param triggerIndex Index at which the trigger element should've been rendered.
|
|
19806
|
+
*/
|
|
19807
|
+
function getTriggerElement(triggerLView, triggerIndex) {
|
|
19808
|
+
const element = getNativeByIndex(HEADER_OFFSET + triggerIndex, triggerLView);
|
|
19809
|
+
ngDevMode && assertElement(element);
|
|
19810
|
+
return element;
|
|
19811
|
+
}
|
|
19812
|
+
/**
|
|
19813
|
+
* Registers a DOM-node based trigger.
|
|
19814
|
+
* @param initialLView LView in which the defer block is rendered.
|
|
19815
|
+
* @param tNode TNode representing the defer block.
|
|
19816
|
+
* @param triggerIndex Index at which to find the trigger element.
|
|
19817
|
+
* @param walkUpTimes Number of times to go up/down in the view hierarchy to find the trigger.
|
|
19818
|
+
* @param registerFn Function that will register the DOM events.
|
|
19819
|
+
* @param callback Callback to be invoked when the trigger receives the event that should render
|
|
19820
|
+
* the deferred block.
|
|
19821
|
+
*/
|
|
19822
|
+
function registerDomTrigger(initialLView, tNode, triggerIndex, walkUpTimes, registerFn, callback) {
|
|
19823
|
+
const injector = initialLView[INJECTOR$1];
|
|
19824
|
+
function pollDomTrigger() {
|
|
19825
|
+
// If the initial view was destroyed, we don't need to do anything.
|
|
19826
|
+
if (isDestroyed(initialLView)) {
|
|
19827
|
+
return;
|
|
19828
|
+
}
|
|
19829
|
+
const lDetails = getLDeferBlockDetails(initialLView, tNode);
|
|
19830
|
+
const renderedState = lDetails[DEFER_BLOCK_STATE];
|
|
19831
|
+
// If the block was loaded before the trigger was resolved, we don't need to do anything.
|
|
19832
|
+
if (renderedState !== DeferBlockInternalState.Initial &&
|
|
19833
|
+
renderedState !== DeferBlockState.Placeholder) {
|
|
19834
|
+
return;
|
|
19835
|
+
}
|
|
19836
|
+
const triggerLView = getTriggerLView(initialLView, tNode, walkUpTimes);
|
|
19837
|
+
// Keep polling until we resolve the trigger's LView.
|
|
19838
|
+
if (!triggerLView) {
|
|
19839
|
+
internalAfterNextRender(pollDomTrigger, { injector });
|
|
19840
|
+
return;
|
|
19841
|
+
}
|
|
19842
|
+
// It's possible that the trigger's view was destroyed before we resolved the trigger element.
|
|
19843
|
+
if (isDestroyed(triggerLView)) {
|
|
19844
|
+
return;
|
|
19845
|
+
}
|
|
19846
|
+
// TODO: add integration with `DeferBlockCleanupManager`.
|
|
19847
|
+
const element = getTriggerElement(triggerLView, triggerIndex);
|
|
19848
|
+
const cleanup = registerFn(element, () => {
|
|
19849
|
+
callback();
|
|
19850
|
+
removeLViewOnDestroy(triggerLView, cleanup);
|
|
19851
|
+
if (initialLView !== triggerLView) {
|
|
19852
|
+
removeLViewOnDestroy(initialLView, cleanup);
|
|
19853
|
+
}
|
|
19854
|
+
cleanup();
|
|
19855
|
+
}, injector);
|
|
19856
|
+
storeLViewOnDestroy(triggerLView, cleanup);
|
|
19857
|
+
// Since the trigger and deferred block might be in different
|
|
19858
|
+
// views, we have to register the callback in both locations.
|
|
19859
|
+
if (initialLView !== triggerLView) {
|
|
19860
|
+
storeLViewOnDestroy(initialLView, cleanup);
|
|
19861
|
+
}
|
|
19862
|
+
}
|
|
19863
|
+
// Begin polling for the trigger.
|
|
19864
|
+
internalAfterNextRender(pollDomTrigger, { injector });
|
|
19497
19865
|
}
|
|
19498
|
-
|
|
19499
|
-
|
|
19866
|
+
|
|
19867
|
+
/**
|
|
19868
|
+
* Helper function to schedule a callback to be invoked when a browser becomes idle.
|
|
19869
|
+
*
|
|
19870
|
+
* @param callback A function to be invoked when a browser becomes idle.
|
|
19871
|
+
* @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
|
+
*/
|
|
19876
|
+
function onIdle(callback, lView, withLViewCleanup) {
|
|
19877
|
+
const injector = lView[INJECTOR$1];
|
|
19878
|
+
const scheduler = injector.get(IdleScheduler);
|
|
19879
|
+
const cleanupFn = () => scheduler.remove(callback);
|
|
19880
|
+
const wrappedCallback = withLViewCleanup ? wrapWithLViewCleanup(callback, lView, cleanupFn) : callback;
|
|
19881
|
+
scheduler.add(wrappedCallback);
|
|
19882
|
+
return cleanupFn;
|
|
19883
|
+
}
|
|
19884
|
+
/**
|
|
19885
|
+
* Use shims for the `requestIdleCallback` and `cancelIdleCallback` functions for
|
|
19886
|
+
* environments where those functions are not available (e.g. Node.js and Safari).
|
|
19887
|
+
*
|
|
19888
|
+
* Note: we wrap the `requestIdleCallback` call into a function, so that it can be
|
|
19889
|
+
* overridden/mocked in test environment and picked up by the runtime code.
|
|
19890
|
+
*/
|
|
19891
|
+
const _requestIdleCallback = () => typeof requestIdleCallback !== 'undefined' ? requestIdleCallback : setTimeout;
|
|
19892
|
+
const _cancelIdleCallback = () => typeof requestIdleCallback !== 'undefined' ? cancelIdleCallback : clearTimeout;
|
|
19893
|
+
/**
|
|
19894
|
+
* Helper service to schedule `requestIdleCallback`s for batches of defer blocks,
|
|
19895
|
+
* to avoid calling `requestIdleCallback` for each defer block (e.g. if
|
|
19896
|
+
* defer blocks are defined inside a for loop).
|
|
19897
|
+
*/
|
|
19898
|
+
class IdleScheduler {
|
|
19899
|
+
constructor() {
|
|
19900
|
+
// Indicates whether current callbacks are being invoked.
|
|
19901
|
+
this.executingCallbacks = false;
|
|
19902
|
+
// Currently scheduled idle callback id.
|
|
19903
|
+
this.idleId = null;
|
|
19904
|
+
// Set of callbacks to be invoked next.
|
|
19905
|
+
this.current = new Set();
|
|
19906
|
+
// Set of callbacks collected while invoking current set of callbacks.
|
|
19907
|
+
// Those callbacks are scheduled for the next idle period.
|
|
19908
|
+
this.deferred = new Set();
|
|
19909
|
+
this.ngZone = inject(NgZone);
|
|
19910
|
+
this.requestIdleCallback = _requestIdleCallback().bind(globalThis);
|
|
19911
|
+
this.cancelIdleCallback = _cancelIdleCallback().bind(globalThis);
|
|
19912
|
+
}
|
|
19913
|
+
add(callback) {
|
|
19914
|
+
const target = this.executingCallbacks ? this.deferred : this.current;
|
|
19915
|
+
target.add(callback);
|
|
19916
|
+
if (this.idleId === null) {
|
|
19917
|
+
this.scheduleIdleCallback();
|
|
19918
|
+
}
|
|
19919
|
+
}
|
|
19920
|
+
remove(callback) {
|
|
19921
|
+
this.current.delete(callback);
|
|
19922
|
+
this.deferred.delete(callback);
|
|
19923
|
+
}
|
|
19924
|
+
scheduleIdleCallback() {
|
|
19925
|
+
const callback = () => {
|
|
19926
|
+
this.cancelIdleCallback(this.idleId);
|
|
19927
|
+
this.idleId = null;
|
|
19928
|
+
this.executingCallbacks = true;
|
|
19929
|
+
for (const callback of this.current) {
|
|
19930
|
+
callback();
|
|
19931
|
+
}
|
|
19932
|
+
this.current.clear();
|
|
19933
|
+
this.executingCallbacks = false;
|
|
19934
|
+
// If there are any callbacks added during an invocation
|
|
19935
|
+
// of the current ones - make them "current" and schedule
|
|
19936
|
+
// a new idle callback.
|
|
19937
|
+
if (this.deferred.size > 0) {
|
|
19938
|
+
for (const callback of this.deferred) {
|
|
19939
|
+
this.current.add(callback);
|
|
19940
|
+
}
|
|
19941
|
+
this.deferred.clear();
|
|
19942
|
+
this.scheduleIdleCallback();
|
|
19943
|
+
}
|
|
19944
|
+
};
|
|
19945
|
+
// Ensure that the callback runs in the NgZone since
|
|
19946
|
+
// the `requestIdleCallback` is not currently patched by Zone.js.
|
|
19947
|
+
this.idleId = this.requestIdleCallback(() => this.ngZone.run(callback));
|
|
19948
|
+
}
|
|
19949
|
+
ngOnDestroy() {
|
|
19950
|
+
if (this.idleId !== null) {
|
|
19951
|
+
this.cancelIdleCallback(this.idleId);
|
|
19952
|
+
this.idleId = null;
|
|
19953
|
+
}
|
|
19954
|
+
this.current.clear();
|
|
19955
|
+
this.deferred.clear();
|
|
19956
|
+
}
|
|
19500
19957
|
/** @nocollapse */
|
|
19501
19958
|
static { this.ɵprov = ɵɵdefineInjectable({
|
|
19502
|
-
token:
|
|
19959
|
+
token: IdleScheduler,
|
|
19503
19960
|
providedIn: 'root',
|
|
19504
|
-
factory: () => new
|
|
19961
|
+
factory: () => new IdleScheduler(),
|
|
19505
19962
|
}); }
|
|
19506
|
-
|
|
19507
|
-
|
|
19508
|
-
|
|
19509
|
-
|
|
19510
|
-
|
|
19511
|
-
|
|
19512
|
-
|
|
19513
|
-
|
|
19514
|
-
|
|
19515
|
-
|
|
19516
|
-
|
|
19517
|
-
|
|
19518
|
-
|
|
19519
|
-
|
|
19963
|
+
}
|
|
19964
|
+
|
|
19965
|
+
/**
|
|
19966
|
+
* Returns a function that captures a provided delay.
|
|
19967
|
+
* Invoking the returned function schedules a trigger.
|
|
19968
|
+
*/
|
|
19969
|
+
function onTimer(delay) {
|
|
19970
|
+
return (callback, lView, withLViewCleanup) => scheduleTimerTrigger(delay, callback, lView, withLViewCleanup);
|
|
19971
|
+
}
|
|
19972
|
+
/**
|
|
19973
|
+
* Schedules a callback to be invoked after a given timeout.
|
|
19974
|
+
*
|
|
19975
|
+
* @param delay A number of ms to wait until firing a callback.
|
|
19976
|
+
* @param callback A function to be invoked after a timeout.
|
|
19977
|
+
* @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
|
+
*/
|
|
19982
|
+
function scheduleTimerTrigger(delay, callback, lView, withLViewCleanup) {
|
|
19983
|
+
const injector = lView[INJECTOR$1];
|
|
19984
|
+
const scheduler = injector.get(TimerScheduler);
|
|
19985
|
+
const cleanupFn = () => scheduler.remove(callback);
|
|
19986
|
+
const wrappedCallback = withLViewCleanup ? wrapWithLViewCleanup(callback, lView, cleanupFn) : callback;
|
|
19987
|
+
scheduler.add(delay, wrappedCallback);
|
|
19988
|
+
return cleanupFn;
|
|
19989
|
+
}
|
|
19990
|
+
/**
|
|
19991
|
+
* Helper service to schedule `setTimeout`s for batches of defer blocks,
|
|
19992
|
+
* to avoid calling `setTimeout` for each defer block (e.g. if defer blocks
|
|
19993
|
+
* are created inside a for loop).
|
|
19994
|
+
*/
|
|
19995
|
+
class TimerScheduler {
|
|
19996
|
+
constructor() {
|
|
19997
|
+
// Indicates whether current callbacks are being invoked.
|
|
19998
|
+
this.executingCallbacks = false;
|
|
19999
|
+
// Currently scheduled `setTimeout` id.
|
|
20000
|
+
this.timeoutId = null;
|
|
20001
|
+
// When currently scheduled timer would fire.
|
|
20002
|
+
this.invokeTimerAt = null;
|
|
20003
|
+
// List of callbacks to be invoked.
|
|
20004
|
+
// For each callback we also store a timestamp on when the callback
|
|
20005
|
+
// should be invoked. We store timestamps and callback functions
|
|
20006
|
+
// in a flat array to avoid creating new objects for each entry.
|
|
20007
|
+
// [timestamp1, callback1, timestamp2, callback2, ...]
|
|
20008
|
+
this.current = [];
|
|
20009
|
+
// List of callbacks collected while invoking current set of callbacks.
|
|
20010
|
+
// Those callbacks are added to the "current" queue at the end of
|
|
20011
|
+
// the current callback invocation. The shape of this list is the same
|
|
20012
|
+
// as the shape of the `current` list.
|
|
20013
|
+
this.deferred = [];
|
|
20014
|
+
}
|
|
20015
|
+
add(delay, callback) {
|
|
20016
|
+
const target = this.executingCallbacks ? this.deferred : this.current;
|
|
20017
|
+
this.addToQueue(target, Date.now() + delay, callback);
|
|
20018
|
+
this.scheduleTimer();
|
|
20019
|
+
}
|
|
20020
|
+
remove(callback) {
|
|
20021
|
+
const callbackIndex = this.removeFromQueue(this.current, callback);
|
|
20022
|
+
if (callbackIndex === -1) {
|
|
20023
|
+
// Try cleaning up deferred queue only in case
|
|
20024
|
+
// we didn't find a callback in the "current" queue.
|
|
20025
|
+
this.removeFromQueue(this.deferred, callback);
|
|
20026
|
+
}
|
|
20027
|
+
}
|
|
20028
|
+
addToQueue(target, invokeAt, callback) {
|
|
20029
|
+
let insertAtIndex = target.length;
|
|
20030
|
+
for (let i = 0; i < target.length; i += 2) {
|
|
20031
|
+
const invokeQueuedCallbackAt = target[i];
|
|
20032
|
+
if (invokeQueuedCallbackAt > invokeAt) {
|
|
20033
|
+
// We've reached a first timer that is scheduled
|
|
20034
|
+
// for a later time than what we are trying to insert.
|
|
20035
|
+
// This is the location at which we need to insert,
|
|
20036
|
+
// no need to iterate further.
|
|
20037
|
+
insertAtIndex = i;
|
|
20038
|
+
break;
|
|
19520
20039
|
}
|
|
19521
|
-
}
|
|
20040
|
+
}
|
|
20041
|
+
arrayInsert2(target, insertAtIndex, invokeAt, callback);
|
|
19522
20042
|
}
|
|
19523
|
-
|
|
19524
|
-
let
|
|
19525
|
-
|
|
19526
|
-
|
|
19527
|
-
|
|
20043
|
+
removeFromQueue(target, callback) {
|
|
20044
|
+
let index = -1;
|
|
20045
|
+
for (let i = 0; i < target.length; i += 2) {
|
|
20046
|
+
const queuedCallback = target[i + 1];
|
|
20047
|
+
if (queuedCallback === callback) {
|
|
20048
|
+
index = i;
|
|
20049
|
+
break;
|
|
20050
|
+
}
|
|
19528
20051
|
}
|
|
19529
|
-
if (
|
|
19530
|
-
|
|
19531
|
-
|
|
19532
|
-
|
|
19533
|
-
this.observedViewportElements++;
|
|
20052
|
+
if (index > -1) {
|
|
20053
|
+
// Remove 2 elements: a timestamp slot and
|
|
20054
|
+
// the following slot with a callback function.
|
|
20055
|
+
arraySplice(target, index, 2);
|
|
19534
20056
|
}
|
|
19535
|
-
|
|
19536
|
-
|
|
19537
|
-
|
|
19538
|
-
|
|
19539
|
-
|
|
20057
|
+
return index;
|
|
20058
|
+
}
|
|
20059
|
+
scheduleTimer() {
|
|
20060
|
+
const callback = () => {
|
|
20061
|
+
clearTimeout(this.timeoutId);
|
|
20062
|
+
this.timeoutId = null;
|
|
20063
|
+
this.executingCallbacks = true;
|
|
20064
|
+
// Invoke callbacks that were scheduled to run
|
|
20065
|
+
// before the current time.
|
|
20066
|
+
let now = Date.now();
|
|
20067
|
+
let lastCallbackIndex = null;
|
|
20068
|
+
for (let i = 0; i < this.current.length; i += 2) {
|
|
20069
|
+
const invokeAt = this.current[i];
|
|
20070
|
+
const callback = this.current[i + 1];
|
|
20071
|
+
if (invokeAt <= now) {
|
|
20072
|
+
callback();
|
|
20073
|
+
// Point at the invoked callback function, which is located
|
|
20074
|
+
// after the timestamp.
|
|
20075
|
+
lastCallbackIndex = i + 1;
|
|
20076
|
+
}
|
|
20077
|
+
else {
|
|
20078
|
+
// We've reached a timer that should not be invoked yet.
|
|
20079
|
+
break;
|
|
20080
|
+
}
|
|
19540
20081
|
}
|
|
19541
|
-
|
|
19542
|
-
|
|
19543
|
-
|
|
19544
|
-
|
|
19545
|
-
this.
|
|
20082
|
+
if (lastCallbackIndex !== null) {
|
|
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.
|
|
20086
|
+
arraySplice(this.current, 0, lastCallbackIndex + 1);
|
|
19546
20087
|
}
|
|
19547
|
-
|
|
19548
|
-
|
|
19549
|
-
|
|
20088
|
+
this.executingCallbacks = false;
|
|
20089
|
+
// If there are any callbacks added during an invocation
|
|
20090
|
+
// of the current ones - move them over to the "current"
|
|
20091
|
+
// queue.
|
|
20092
|
+
if (this.deferred.length > 0) {
|
|
20093
|
+
for (let i = 0; i < this.deferred.length; i += 2) {
|
|
20094
|
+
const invokeAt = this.deferred[i];
|
|
20095
|
+
const callback = this.deferred[i + 1];
|
|
20096
|
+
this.addToQueue(this.current, invokeAt, callback);
|
|
20097
|
+
}
|
|
20098
|
+
this.deferred.length = 0;
|
|
19550
20099
|
}
|
|
20100
|
+
this.scheduleTimer();
|
|
19551
20101
|
};
|
|
20102
|
+
// Avoid running timer callbacks more than once per
|
|
20103
|
+
// average frame duration. This is needed for better
|
|
20104
|
+
// batching and to avoid kicking off excessive change
|
|
20105
|
+
// detection cycles.
|
|
20106
|
+
const FRAME_DURATION_MS = 16; // 1000ms / 60fps
|
|
20107
|
+
if (this.current.length > 0) {
|
|
20108
|
+
const now = Date.now();
|
|
20109
|
+
// First element in the queue points at the timestamp
|
|
20110
|
+
// of the first (earliest) event.
|
|
20111
|
+
const invokeAt = this.current[0];
|
|
20112
|
+
if (!this.timeoutId ||
|
|
20113
|
+
// Reschedule a timer in case a queue contains an item with
|
|
20114
|
+
// an earlier timestamp and the delta is more than an average
|
|
20115
|
+
// frame duration.
|
|
20116
|
+
(this.invokeTimerAt && (this.invokeTimerAt - invokeAt > FRAME_DURATION_MS))) {
|
|
20117
|
+
if (this.timeoutId !== null) {
|
|
20118
|
+
// There was a timeout already, but an earlier event was added
|
|
20119
|
+
// into the queue. In this case we drop an old timer and setup
|
|
20120
|
+
// a new one with an updated (smaller) timeout.
|
|
20121
|
+
clearTimeout(this.timeoutId);
|
|
20122
|
+
this.timeoutId = null;
|
|
20123
|
+
}
|
|
20124
|
+
const timeout = Math.max(invokeAt - now, FRAME_DURATION_MS);
|
|
20125
|
+
this.invokeTimerAt = invokeAt;
|
|
20126
|
+
this.timeoutId = setTimeout(callback, timeout);
|
|
20127
|
+
}
|
|
20128
|
+
}
|
|
19552
20129
|
}
|
|
20130
|
+
ngOnDestroy() {
|
|
20131
|
+
if (this.timeoutId !== null) {
|
|
20132
|
+
clearTimeout(this.timeoutId);
|
|
20133
|
+
this.timeoutId = null;
|
|
20134
|
+
}
|
|
20135
|
+
this.current.length = 0;
|
|
20136
|
+
this.deferred.length = 0;
|
|
20137
|
+
}
|
|
20138
|
+
/** @nocollapse */
|
|
20139
|
+
static { this.ɵprov = ɵɵdefineInjectable({
|
|
20140
|
+
token: TimerScheduler,
|
|
20141
|
+
providedIn: 'root',
|
|
20142
|
+
factory: () => new TimerScheduler(),
|
|
20143
|
+
}); }
|
|
19553
20144
|
}
|
|
19554
20145
|
|
|
20146
|
+
/**
|
|
20147
|
+
* **INTERNAL**, avoid referencing it in application code.
|
|
20148
|
+
*
|
|
20149
|
+
* Injector token that allows to provide `DeferBlockDependencyInterceptor` class
|
|
20150
|
+
* implementation.
|
|
20151
|
+
*/
|
|
20152
|
+
const DEFER_BLOCK_DEPENDENCY_INTERCEPTOR = new InjectionToken('DEFER_BLOCK_DEPENDENCY_INTERCEPTOR');
|
|
20153
|
+
/**
|
|
20154
|
+
* **INTERNAL**, token used for configuring defer block behavior.
|
|
20155
|
+
*/
|
|
20156
|
+
const DEFER_BLOCK_CONFIG = new InjectionToken(ngDevMode ? 'DEFER_BLOCK_CONFIG' : '');
|
|
19555
20157
|
/**
|
|
19556
20158
|
* Returns whether defer blocks should be triggered.
|
|
19557
20159
|
*
|
|
@@ -19869,223 +20471,6 @@ function scheduleDelayedPrefetching(scheduleFn, trigger) {
|
|
|
19869
20471
|
}
|
|
19870
20472
|
}
|
|
19871
20473
|
}
|
|
19872
|
-
/**
|
|
19873
|
-
* Helper function to get the LView in which a deferred block's trigger is rendered.
|
|
19874
|
-
* @param deferredHostLView LView in which the deferred block is defined.
|
|
19875
|
-
* @param deferredTNode TNode defining the deferred block.
|
|
19876
|
-
* @param walkUpTimes Number of times to go up in the view hierarchy to find the trigger's view.
|
|
19877
|
-
* A negative value means that the trigger is inside the block's placeholder, while an undefined
|
|
19878
|
-
* value means that the trigger is in the same LView as the deferred block.
|
|
19879
|
-
*/
|
|
19880
|
-
function getTriggerLView(deferredHostLView, deferredTNode, walkUpTimes) {
|
|
19881
|
-
// The trigger is in the same view, we don't need to traverse.
|
|
19882
|
-
if (walkUpTimes == null) {
|
|
19883
|
-
return deferredHostLView;
|
|
19884
|
-
}
|
|
19885
|
-
// A positive value or zero means that the trigger is in a parent view.
|
|
19886
|
-
if (walkUpTimes >= 0) {
|
|
19887
|
-
return walkUpViews(walkUpTimes, deferredHostLView);
|
|
19888
|
-
}
|
|
19889
|
-
// If the value is negative, it means that the trigger is inside the placeholder.
|
|
19890
|
-
const deferredContainer = deferredHostLView[deferredTNode.index];
|
|
19891
|
-
ngDevMode && assertLContainer(deferredContainer);
|
|
19892
|
-
const triggerLView = deferredContainer[CONTAINER_HEADER_OFFSET] ?? null;
|
|
19893
|
-
// We need to null check, because the placeholder might not have been rendered yet.
|
|
19894
|
-
if (ngDevMode && triggerLView !== null) {
|
|
19895
|
-
const lDetails = getLDeferBlockDetails(deferredHostLView, deferredTNode);
|
|
19896
|
-
const renderedState = lDetails[DEFER_BLOCK_STATE];
|
|
19897
|
-
assertEqual(renderedState, DeferBlockState.Placeholder, 'Expected a placeholder to be rendered in this defer block.');
|
|
19898
|
-
assertLView(triggerLView);
|
|
19899
|
-
}
|
|
19900
|
-
return triggerLView;
|
|
19901
|
-
}
|
|
19902
|
-
/**
|
|
19903
|
-
* Gets the element that a deferred block's trigger is pointing to.
|
|
19904
|
-
* @param triggerLView LView in which the trigger is defined.
|
|
19905
|
-
* @param triggerIndex Index at which the trigger element should've been rendered.
|
|
19906
|
-
*/
|
|
19907
|
-
function getTriggerElement(triggerLView, triggerIndex) {
|
|
19908
|
-
const element = getNativeByIndex(HEADER_OFFSET + triggerIndex, triggerLView);
|
|
19909
|
-
ngDevMode && assertElement(element);
|
|
19910
|
-
return element;
|
|
19911
|
-
}
|
|
19912
|
-
/**
|
|
19913
|
-
* Registers a DOM-node based trigger.
|
|
19914
|
-
* @param initialLView LView in which the defer block is rendered.
|
|
19915
|
-
* @param tNode TNode representing the defer block.
|
|
19916
|
-
* @param triggerIndex Index at which to find the trigger element.
|
|
19917
|
-
* @param walkUpTimes Number of times to go up/down in the view hierarchy to find the trigger.
|
|
19918
|
-
* @param registerFn Function that will register the DOM events.
|
|
19919
|
-
* @param callback Callback to be invoked when the trigger receives the event that should render
|
|
19920
|
-
* the deferred block.
|
|
19921
|
-
*/
|
|
19922
|
-
function registerDomTrigger(initialLView, tNode, triggerIndex, walkUpTimes, registerFn, callback) {
|
|
19923
|
-
const injector = initialLView[INJECTOR$1];
|
|
19924
|
-
// Assumption: the `afterRender` reference should be destroyed
|
|
19925
|
-
// automatically so we don't need to keep track of it.
|
|
19926
|
-
const afterRenderRef = afterRender(() => {
|
|
19927
|
-
const lDetails = getLDeferBlockDetails(initialLView, tNode);
|
|
19928
|
-
const renderedState = lDetails[DEFER_BLOCK_STATE];
|
|
19929
|
-
// If the block was loaded before the trigger was resolved, we don't need to do anything.
|
|
19930
|
-
if (renderedState !== DeferBlockInternalState.Initial &&
|
|
19931
|
-
renderedState !== DeferBlockState.Placeholder) {
|
|
19932
|
-
afterRenderRef.destroy();
|
|
19933
|
-
return;
|
|
19934
|
-
}
|
|
19935
|
-
const triggerLView = getTriggerLView(initialLView, tNode, walkUpTimes);
|
|
19936
|
-
// Keep polling until we resolve the trigger's LView.
|
|
19937
|
-
// `afterRender` should stop automatically if the view is destroyed.
|
|
19938
|
-
if (!triggerLView) {
|
|
19939
|
-
return;
|
|
19940
|
-
}
|
|
19941
|
-
// It's possible that the trigger's view was destroyed before we resolved the trigger element.
|
|
19942
|
-
if (triggerLView[FLAGS] & 256 /* LViewFlags.Destroyed */) {
|
|
19943
|
-
afterRenderRef.destroy();
|
|
19944
|
-
return;
|
|
19945
|
-
}
|
|
19946
|
-
// TODO: add integration with `DeferBlockCleanupManager`.
|
|
19947
|
-
const element = getTriggerElement(triggerLView, triggerIndex);
|
|
19948
|
-
const cleanup = registerFn(element, () => {
|
|
19949
|
-
callback();
|
|
19950
|
-
removeLViewOnDestroy(triggerLView, cleanup);
|
|
19951
|
-
if (initialLView !== triggerLView) {
|
|
19952
|
-
removeLViewOnDestroy(initialLView, cleanup);
|
|
19953
|
-
}
|
|
19954
|
-
cleanup();
|
|
19955
|
-
}, injector);
|
|
19956
|
-
afterRenderRef.destroy();
|
|
19957
|
-
storeLViewOnDestroy(triggerLView, cleanup);
|
|
19958
|
-
// Since the trigger and deferred block might be in different
|
|
19959
|
-
// views, we have to register the callback in both locations.
|
|
19960
|
-
if (initialLView !== triggerLView) {
|
|
19961
|
-
storeLViewOnDestroy(initialLView, cleanup);
|
|
19962
|
-
}
|
|
19963
|
-
}, { injector });
|
|
19964
|
-
}
|
|
19965
|
-
/**
|
|
19966
|
-
* Helper function to schedule a callback to be invoked when a browser becomes idle.
|
|
19967
|
-
*
|
|
19968
|
-
* @param callback A function to be invoked when a browser becomes idle.
|
|
19969
|
-
* @param lView LView that hosts an instance of a defer block.
|
|
19970
|
-
* @param withLViewCleanup A flag that indicates whether a scheduled callback
|
|
19971
|
-
* should be cancelled in case an LView is destroyed before a callback
|
|
19972
|
-
* was invoked.
|
|
19973
|
-
*/
|
|
19974
|
-
function onIdle(callback, lView, withLViewCleanup) {
|
|
19975
|
-
const injector = lView[INJECTOR$1];
|
|
19976
|
-
const scheduler = injector.get(OnIdleScheduler);
|
|
19977
|
-
const cleanupFn = () => scheduler.remove(callback);
|
|
19978
|
-
const wrappedCallback = withLViewCleanup ? wrapWithLViewCleanup(callback, lView, cleanupFn) : callback;
|
|
19979
|
-
scheduler.add(wrappedCallback);
|
|
19980
|
-
return cleanupFn;
|
|
19981
|
-
}
|
|
19982
|
-
/**
|
|
19983
|
-
* Returns a function that captures a provided delay.
|
|
19984
|
-
* Invoking the returned function schedules a trigger.
|
|
19985
|
-
*/
|
|
19986
|
-
function onTimer(delay) {
|
|
19987
|
-
return (callback, lView, withLViewCleanup) => scheduleTimerTrigger(delay, callback, lView, withLViewCleanup);
|
|
19988
|
-
}
|
|
19989
|
-
/**
|
|
19990
|
-
* Schedules a callback to be invoked after a given timeout.
|
|
19991
|
-
*
|
|
19992
|
-
* @param delay A number of ms to wait until firing a callback.
|
|
19993
|
-
* @param callback A function to be invoked after a timeout.
|
|
19994
|
-
* @param lView LView that hosts an instance of a defer block.
|
|
19995
|
-
* @param withLViewCleanup A flag that indicates whether a scheduled callback
|
|
19996
|
-
* should be cancelled in case an LView is destroyed before a callback
|
|
19997
|
-
* was invoked.
|
|
19998
|
-
*/
|
|
19999
|
-
function scheduleTimerTrigger(delay, callback, lView, withLViewCleanup) {
|
|
20000
|
-
const injector = lView[INJECTOR$1];
|
|
20001
|
-
const scheduler = injector.get(TimerScheduler);
|
|
20002
|
-
const cleanupFn = () => scheduler.remove(callback);
|
|
20003
|
-
const wrappedCallback = withLViewCleanup ? wrapWithLViewCleanup(callback, lView, cleanupFn) : callback;
|
|
20004
|
-
scheduler.add(delay, wrappedCallback);
|
|
20005
|
-
return cleanupFn;
|
|
20006
|
-
}
|
|
20007
|
-
/**
|
|
20008
|
-
* Wraps a given callback into a logic that registers a cleanup function
|
|
20009
|
-
* in the LView cleanup slot, to be invoked when an LView is destroyed.
|
|
20010
|
-
*/
|
|
20011
|
-
function wrapWithLViewCleanup(callback, lView, cleanup) {
|
|
20012
|
-
const wrappedCallback = () => {
|
|
20013
|
-
callback();
|
|
20014
|
-
removeLViewOnDestroy(lView, cleanup);
|
|
20015
|
-
};
|
|
20016
|
-
storeLViewOnDestroy(lView, cleanup);
|
|
20017
|
-
return wrappedCallback;
|
|
20018
|
-
}
|
|
20019
|
-
/**
|
|
20020
|
-
* Calculates a data slot index for defer block info (either static or
|
|
20021
|
-
* instance-specific), given an index of a defer instruction.
|
|
20022
|
-
*/
|
|
20023
|
-
function getDeferBlockDataIndex(deferBlockIndex) {
|
|
20024
|
-
// Instance state is located at the *next* position
|
|
20025
|
-
// after the defer block slot in an LView or TView.data.
|
|
20026
|
-
return deferBlockIndex + 1;
|
|
20027
|
-
}
|
|
20028
|
-
/** Retrieves a defer block state from an LView, given a TNode that represents a block. */
|
|
20029
|
-
function getLDeferBlockDetails(lView, tNode) {
|
|
20030
|
-
const tView = lView[TVIEW];
|
|
20031
|
-
const slotIndex = getDeferBlockDataIndex(tNode.index);
|
|
20032
|
-
ngDevMode && assertIndexInDeclRange(tView, slotIndex);
|
|
20033
|
-
return lView[slotIndex];
|
|
20034
|
-
}
|
|
20035
|
-
/** Stores a defer block instance state in LView. */
|
|
20036
|
-
function setLDeferBlockDetails(lView, deferBlockIndex, lDetails) {
|
|
20037
|
-
const tView = lView[TVIEW];
|
|
20038
|
-
const slotIndex = getDeferBlockDataIndex(deferBlockIndex);
|
|
20039
|
-
ngDevMode && assertIndexInDeclRange(tView, slotIndex);
|
|
20040
|
-
lView[slotIndex] = lDetails;
|
|
20041
|
-
}
|
|
20042
|
-
/** Retrieves static info about a defer block, given a TView and a TNode that represents a block. */
|
|
20043
|
-
function getTDeferBlockDetails(tView, tNode) {
|
|
20044
|
-
const slotIndex = getDeferBlockDataIndex(tNode.index);
|
|
20045
|
-
ngDevMode && assertIndexInDeclRange(tView, slotIndex);
|
|
20046
|
-
return tView.data[slotIndex];
|
|
20047
|
-
}
|
|
20048
|
-
/** Stores a defer block static info in `TView.data`. */
|
|
20049
|
-
function setTDeferBlockDetails(tView, deferBlockIndex, deferBlockConfig) {
|
|
20050
|
-
const slotIndex = getDeferBlockDataIndex(deferBlockIndex);
|
|
20051
|
-
ngDevMode && assertIndexInDeclRange(tView, slotIndex);
|
|
20052
|
-
tView.data[slotIndex] = deferBlockConfig;
|
|
20053
|
-
}
|
|
20054
|
-
function getTemplateIndexForState(newState, hostLView, tNode) {
|
|
20055
|
-
const tView = hostLView[TVIEW];
|
|
20056
|
-
const tDetails = getTDeferBlockDetails(tView, tNode);
|
|
20057
|
-
switch (newState) {
|
|
20058
|
-
case DeferBlockState.Complete:
|
|
20059
|
-
return tDetails.primaryTmplIndex;
|
|
20060
|
-
case DeferBlockState.Loading:
|
|
20061
|
-
return tDetails.loadingTmplIndex;
|
|
20062
|
-
case DeferBlockState.Error:
|
|
20063
|
-
return tDetails.errorTmplIndex;
|
|
20064
|
-
case DeferBlockState.Placeholder:
|
|
20065
|
-
return tDetails.placeholderTmplIndex;
|
|
20066
|
-
default:
|
|
20067
|
-
ngDevMode && throwError(`Unexpected defer block state: ${newState}`);
|
|
20068
|
-
return null;
|
|
20069
|
-
}
|
|
20070
|
-
}
|
|
20071
|
-
/**
|
|
20072
|
-
* Returns a minimum amount of time that a given state should be rendered for,
|
|
20073
|
-
* taking into account `minimum` parameter value. If the `minimum` value is
|
|
20074
|
-
* not specified - returns `null`.
|
|
20075
|
-
*/
|
|
20076
|
-
function getMinimumDurationForState(tDetails, currentState) {
|
|
20077
|
-
if (currentState === DeferBlockState.Placeholder) {
|
|
20078
|
-
return tDetails.placeholderBlockConfig?.[MINIMUM_SLOT] ?? null;
|
|
20079
|
-
}
|
|
20080
|
-
else if (currentState === DeferBlockState.Loading) {
|
|
20081
|
-
return tDetails.loadingBlockConfig?.[MINIMUM_SLOT] ?? null;
|
|
20082
|
-
}
|
|
20083
|
-
return null;
|
|
20084
|
-
}
|
|
20085
|
-
/** Retrieves the value of the `after` parameter on the @loading block. */
|
|
20086
|
-
function getLoadingBlockAfter(tDetails) {
|
|
20087
|
-
return tDetails.loadingBlockConfig?.[LOADING_AFTER_SLOT] ?? null;
|
|
20088
|
-
}
|
|
20089
20474
|
/**
|
|
20090
20475
|
* Transitions a defer block to the new state. Updates the necessary
|
|
20091
20476
|
* data structures and renders corresponding block.
|
|
@@ -20239,11 +20624,14 @@ function triggerResourceLoading(tDetails, lView) {
|
|
|
20239
20624
|
const primaryBlockTNode = getPrimaryBlockTNode(tView, tDetails);
|
|
20240
20625
|
// Switch from NOT_STARTED -> IN_PROGRESS state.
|
|
20241
20626
|
tDetails.loadingState = DeferDependenciesLoadingState.IN_PROGRESS;
|
|
20242
|
-
|
|
20243
|
-
|
|
20244
|
-
|
|
20245
|
-
deferDependencyInterceptor.
|
|
20246
|
-
|
|
20627
|
+
let dependenciesFn = tDetails.dependencyResolverFn;
|
|
20628
|
+
if (ngDevMode) {
|
|
20629
|
+
// Check if dependency function interceptor is configured.
|
|
20630
|
+
const deferDependencyInterceptor = injector.get(DEFER_BLOCK_DEPENDENCY_INTERCEPTOR, null, { optional: true });
|
|
20631
|
+
if (deferDependencyInterceptor) {
|
|
20632
|
+
dependenciesFn = deferDependencyInterceptor.intercept(dependenciesFn);
|
|
20633
|
+
}
|
|
20634
|
+
}
|
|
20247
20635
|
// The `dependenciesFn` might be `null` when all dependencies within
|
|
20248
20636
|
// a given defer block were eagerly references elsewhere in a file,
|
|
20249
20637
|
// thus no dynamic `import()`s were produced.
|
|
@@ -20300,22 +20688,6 @@ function triggerResourceLoading(tDetails, lView) {
|
|
|
20300
20688
|
}
|
|
20301
20689
|
});
|
|
20302
20690
|
}
|
|
20303
|
-
/**
|
|
20304
|
-
* Adds downloaded dependencies into a directive or a pipe registry,
|
|
20305
|
-
* making sure that a dependency doesn't yet exist in the registry.
|
|
20306
|
-
*/
|
|
20307
|
-
function addDepsToRegistry(currentDeps, newDeps) {
|
|
20308
|
-
if (!currentDeps || currentDeps.length === 0) {
|
|
20309
|
-
return newDeps;
|
|
20310
|
-
}
|
|
20311
|
-
const currentDepSet = new Set(currentDeps);
|
|
20312
|
-
for (const dep of newDeps) {
|
|
20313
|
-
currentDepSet.add(dep);
|
|
20314
|
-
}
|
|
20315
|
-
// If `currentDeps` is the same length, there were no new deps and can
|
|
20316
|
-
// return the original array.
|
|
20317
|
-
return (currentDeps.length === currentDepSet.size) ? currentDeps : Array.from(currentDepSet);
|
|
20318
|
-
}
|
|
20319
20691
|
/** Utility function to render placeholder content (if present) */
|
|
20320
20692
|
function renderPlaceholder(lView, tNode) {
|
|
20321
20693
|
const lContainer = lView[tNode.index];
|
|
@@ -20343,11 +20715,6 @@ function renderDeferStateAfterResourceLoading(tDetails, tNode, lContainer) {
|
|
|
20343
20715
|
}
|
|
20344
20716
|
});
|
|
20345
20717
|
}
|
|
20346
|
-
/** Retrieves a TNode that represents main content of a defer block. */
|
|
20347
|
-
function getPrimaryBlockTNode(tView, tDetails) {
|
|
20348
|
-
const adjustedIndex = tDetails.primaryTmplIndex + HEADER_OFFSET;
|
|
20349
|
-
return getTNode(tView, adjustedIndex);
|
|
20350
|
-
}
|
|
20351
20718
|
/**
|
|
20352
20719
|
* Attempts to trigger loading of defer block dependencies.
|
|
20353
20720
|
* If the block is already in a loading, completed or an error state -
|
|
@@ -20388,366 +20755,6 @@ function triggerDeferBlock(lView, tNode) {
|
|
|
20388
20755
|
}
|
|
20389
20756
|
}
|
|
20390
20757
|
}
|
|
20391
|
-
/**
|
|
20392
|
-
* Asserts whether all dependencies for a defer block are loaded.
|
|
20393
|
-
* Always run this function (in dev mode) before rendering a defer
|
|
20394
|
-
* block in completed state.
|
|
20395
|
-
*/
|
|
20396
|
-
function assertDeferredDependenciesLoaded(tDetails) {
|
|
20397
|
-
assertEqual(tDetails.loadingState, DeferDependenciesLoadingState.COMPLETE, 'Expecting all deferred dependencies to be loaded.');
|
|
20398
|
-
}
|
|
20399
|
-
/**
|
|
20400
|
-
* **INTERNAL**, avoid referencing it in application code.
|
|
20401
|
-
*
|
|
20402
|
-
* Injector token that allows to provide `DeferBlockDependencyInterceptor` class
|
|
20403
|
-
* implementation.
|
|
20404
|
-
*/
|
|
20405
|
-
const DEFER_BLOCK_DEPENDENCY_INTERCEPTOR = new InjectionToken(ngDevMode ? 'DEFER_BLOCK_DEPENDENCY_INTERCEPTOR' : '');
|
|
20406
|
-
/**
|
|
20407
|
-
* Determines if a given value matches the expected structure of a defer block
|
|
20408
|
-
*
|
|
20409
|
-
* We can safely rely on the primaryTmplIndex because every defer block requires
|
|
20410
|
-
* that a primary template exists. All the other template options are optional.
|
|
20411
|
-
*/
|
|
20412
|
-
function isTDeferBlockDetails(value) {
|
|
20413
|
-
return (typeof value === 'object') &&
|
|
20414
|
-
(typeof value.primaryTmplIndex === 'number');
|
|
20415
|
-
}
|
|
20416
|
-
/**
|
|
20417
|
-
* Internal token used for configuring defer block behavior.
|
|
20418
|
-
*/
|
|
20419
|
-
const DEFER_BLOCK_CONFIG = new InjectionToken(ngDevMode ? 'DEFER_BLOCK_CONFIG' : '');
|
|
20420
|
-
/**
|
|
20421
|
-
* Retrieves all defer blocks in a given LView.
|
|
20422
|
-
*
|
|
20423
|
-
* @param lView lView with defer blocks
|
|
20424
|
-
* @param deferBlocks defer block aggregator array
|
|
20425
|
-
*/
|
|
20426
|
-
function getDeferBlocks(lView, deferBlocks) {
|
|
20427
|
-
const tView = lView[TVIEW];
|
|
20428
|
-
for (let i = HEADER_OFFSET; i < tView.bindingStartIndex; i++) {
|
|
20429
|
-
if (isLContainer(lView[i])) {
|
|
20430
|
-
const lContainer = lView[i];
|
|
20431
|
-
// An LContainer may represent an instance of a defer block, in which case
|
|
20432
|
-
// we store it as a result. Otherwise, keep iterating over LContainer views and
|
|
20433
|
-
// look for defer blocks.
|
|
20434
|
-
const isLast = i === tView.bindingStartIndex - 1;
|
|
20435
|
-
if (!isLast) {
|
|
20436
|
-
const tNode = tView.data[i];
|
|
20437
|
-
const tDetails = getTDeferBlockDetails(tView, tNode);
|
|
20438
|
-
if (isTDeferBlockDetails(tDetails)) {
|
|
20439
|
-
deferBlocks.push({ lContainer, lView, tNode, tDetails });
|
|
20440
|
-
// This LContainer represents a defer block, so we exit
|
|
20441
|
-
// this iteration and don't inspect views in this LContainer.
|
|
20442
|
-
continue;
|
|
20443
|
-
}
|
|
20444
|
-
}
|
|
20445
|
-
for (let i = CONTAINER_HEADER_OFFSET; i < lContainer.length; i++) {
|
|
20446
|
-
getDeferBlocks(lContainer[i], deferBlocks);
|
|
20447
|
-
}
|
|
20448
|
-
}
|
|
20449
|
-
else if (isLView(lView[i])) {
|
|
20450
|
-
// This is a component, enter the `getDeferBlocks` recursively.
|
|
20451
|
-
getDeferBlocks(lView[i], deferBlocks);
|
|
20452
|
-
}
|
|
20453
|
-
}
|
|
20454
|
-
}
|
|
20455
|
-
/**
|
|
20456
|
-
* Registers a cleanup function associated with a prefetching trigger
|
|
20457
|
-
* of a given defer block.
|
|
20458
|
-
*/
|
|
20459
|
-
function registerTDetailsCleanup(injector, tDetails, key, cleanupFn) {
|
|
20460
|
-
injector.get(DeferBlockCleanupManager).add(tDetails, key, cleanupFn);
|
|
20461
|
-
}
|
|
20462
|
-
/**
|
|
20463
|
-
* Invokes all registered prefetch cleanup triggers
|
|
20464
|
-
* and removes all cleanup functions afterwards.
|
|
20465
|
-
*/
|
|
20466
|
-
function invokeTDetailsCleanup(injector, tDetails) {
|
|
20467
|
-
injector.get(DeferBlockCleanupManager).cleanup(tDetails);
|
|
20468
|
-
}
|
|
20469
|
-
/**
|
|
20470
|
-
* Internal service to keep track of cleanup functions associated
|
|
20471
|
-
* with defer blocks. This class is used to manage cleanup functions
|
|
20472
|
-
* created for prefetching triggers.
|
|
20473
|
-
*/
|
|
20474
|
-
class DeferBlockCleanupManager {
|
|
20475
|
-
constructor() {
|
|
20476
|
-
this.blocks = new Map();
|
|
20477
|
-
}
|
|
20478
|
-
add(tDetails, key, callback) {
|
|
20479
|
-
if (!this.blocks.has(tDetails)) {
|
|
20480
|
-
this.blocks.set(tDetails, new Map());
|
|
20481
|
-
}
|
|
20482
|
-
const block = this.blocks.get(tDetails);
|
|
20483
|
-
if (!block.has(key)) {
|
|
20484
|
-
block.set(key, []);
|
|
20485
|
-
}
|
|
20486
|
-
const callbacks = block.get(key);
|
|
20487
|
-
callbacks.push(callback);
|
|
20488
|
-
}
|
|
20489
|
-
has(tDetails, key) {
|
|
20490
|
-
return !!this.blocks.get(tDetails)?.has(key);
|
|
20491
|
-
}
|
|
20492
|
-
cleanup(tDetails) {
|
|
20493
|
-
const block = this.blocks.get(tDetails);
|
|
20494
|
-
if (block) {
|
|
20495
|
-
for (const callbacks of Object.values(block)) {
|
|
20496
|
-
for (const callback of callbacks) {
|
|
20497
|
-
callback();
|
|
20498
|
-
}
|
|
20499
|
-
}
|
|
20500
|
-
this.blocks.delete(tDetails);
|
|
20501
|
-
}
|
|
20502
|
-
}
|
|
20503
|
-
ngOnDestroy() {
|
|
20504
|
-
for (const [block] of this.blocks) {
|
|
20505
|
-
this.cleanup(block);
|
|
20506
|
-
}
|
|
20507
|
-
this.blocks.clear();
|
|
20508
|
-
}
|
|
20509
|
-
/** @nocollapse */
|
|
20510
|
-
static { this.ɵprov = ɵɵdefineInjectable({
|
|
20511
|
-
token: DeferBlockCleanupManager,
|
|
20512
|
-
providedIn: 'root',
|
|
20513
|
-
factory: () => new DeferBlockCleanupManager(),
|
|
20514
|
-
}); }
|
|
20515
|
-
}
|
|
20516
|
-
/**
|
|
20517
|
-
* Use shims for the `requestIdleCallback` and `cancelIdleCallback` functions for
|
|
20518
|
-
* environments where those functions are not available (e.g. Node.js and Safari).
|
|
20519
|
-
*
|
|
20520
|
-
* Note: we wrap the `requestIdleCallback` call into a function, so that it can be
|
|
20521
|
-
* overridden/mocked in test environment and picked up by the runtime code.
|
|
20522
|
-
*/
|
|
20523
|
-
const _requestIdleCallback = () => typeof requestIdleCallback !== 'undefined' ? requestIdleCallback : setTimeout;
|
|
20524
|
-
const _cancelIdleCallback = () => typeof requestIdleCallback !== 'undefined' ? cancelIdleCallback : clearTimeout;
|
|
20525
|
-
/**
|
|
20526
|
-
* Helper service to schedule `requestIdleCallback`s for batches of defer blocks,
|
|
20527
|
-
* to avoid calling `requestIdleCallback` for each defer block (e.g. if
|
|
20528
|
-
* defer blocks are defined inside a for loop).
|
|
20529
|
-
*/
|
|
20530
|
-
class OnIdleScheduler {
|
|
20531
|
-
constructor() {
|
|
20532
|
-
// Indicates whether current callbacks are being invoked.
|
|
20533
|
-
this.executingCallbacks = false;
|
|
20534
|
-
// Currently scheduled idle callback id.
|
|
20535
|
-
this.idleId = null;
|
|
20536
|
-
// Set of callbacks to be invoked next.
|
|
20537
|
-
this.current = new Set();
|
|
20538
|
-
// Set of callbacks collected while invoking current set of callbacks.
|
|
20539
|
-
// Those callbacks are scheduled for the next idle period.
|
|
20540
|
-
this.deferred = new Set();
|
|
20541
|
-
this.ngZone = inject(NgZone);
|
|
20542
|
-
this.requestIdleCallback = _requestIdleCallback().bind(globalThis);
|
|
20543
|
-
this.cancelIdleCallback = _cancelIdleCallback().bind(globalThis);
|
|
20544
|
-
}
|
|
20545
|
-
add(callback) {
|
|
20546
|
-
const target = this.executingCallbacks ? this.deferred : this.current;
|
|
20547
|
-
target.add(callback);
|
|
20548
|
-
if (this.idleId === null) {
|
|
20549
|
-
this.scheduleIdleCallback();
|
|
20550
|
-
}
|
|
20551
|
-
}
|
|
20552
|
-
remove(callback) {
|
|
20553
|
-
this.current.delete(callback);
|
|
20554
|
-
this.deferred.delete(callback);
|
|
20555
|
-
}
|
|
20556
|
-
scheduleIdleCallback() {
|
|
20557
|
-
const callback = () => {
|
|
20558
|
-
this.cancelIdleCallback(this.idleId);
|
|
20559
|
-
this.idleId = null;
|
|
20560
|
-
this.executingCallbacks = true;
|
|
20561
|
-
for (const callback of this.current) {
|
|
20562
|
-
callback();
|
|
20563
|
-
}
|
|
20564
|
-
this.current.clear();
|
|
20565
|
-
this.executingCallbacks = false;
|
|
20566
|
-
// If there are any callbacks added during an invocation
|
|
20567
|
-
// of the current ones - make them "current" and schedule
|
|
20568
|
-
// a new idle callback.
|
|
20569
|
-
if (this.deferred.size > 0) {
|
|
20570
|
-
for (const callback of this.deferred) {
|
|
20571
|
-
this.current.add(callback);
|
|
20572
|
-
}
|
|
20573
|
-
this.deferred.clear();
|
|
20574
|
-
this.scheduleIdleCallback();
|
|
20575
|
-
}
|
|
20576
|
-
};
|
|
20577
|
-
// Ensure that the callback runs in the NgZone since
|
|
20578
|
-
// the `requestIdleCallback` is not currently patched by Zone.js.
|
|
20579
|
-
this.idleId = this.requestIdleCallback(() => this.ngZone.run(callback));
|
|
20580
|
-
}
|
|
20581
|
-
ngOnDestroy() {
|
|
20582
|
-
if (this.idleId !== null) {
|
|
20583
|
-
this.cancelIdleCallback(this.idleId);
|
|
20584
|
-
this.idleId = null;
|
|
20585
|
-
}
|
|
20586
|
-
this.current.clear();
|
|
20587
|
-
this.deferred.clear();
|
|
20588
|
-
}
|
|
20589
|
-
/** @nocollapse */
|
|
20590
|
-
static { this.ɵprov = ɵɵdefineInjectable({
|
|
20591
|
-
token: OnIdleScheduler,
|
|
20592
|
-
providedIn: 'root',
|
|
20593
|
-
factory: () => new OnIdleScheduler(),
|
|
20594
|
-
}); }
|
|
20595
|
-
}
|
|
20596
|
-
/**
|
|
20597
|
-
* Helper service to schedule `setTimeout`s for batches of defer blocks,
|
|
20598
|
-
* to avoid calling `setTimeout` for each defer block (e.g. if defer blocks
|
|
20599
|
-
* are created inside a for loop).
|
|
20600
|
-
*/
|
|
20601
|
-
class TimerScheduler {
|
|
20602
|
-
constructor() {
|
|
20603
|
-
// Indicates whether current callbacks are being invoked.
|
|
20604
|
-
this.executingCallbacks = false;
|
|
20605
|
-
// Currently scheduled `setTimeout` id.
|
|
20606
|
-
this.timeoutId = null;
|
|
20607
|
-
// When currently scheduled timer would fire.
|
|
20608
|
-
this.invokeTimerAt = null;
|
|
20609
|
-
// List of callbacks to be invoked.
|
|
20610
|
-
// For each callback we also store a timestamp on when the callback
|
|
20611
|
-
// should be invoked. We store timestamps and callback functions
|
|
20612
|
-
// in a flat array to avoid creating new objects for each entry.
|
|
20613
|
-
// [timestamp1, callback1, timestamp2, callback2, ...]
|
|
20614
|
-
this.current = [];
|
|
20615
|
-
// List of callbacks collected while invoking current set of callbacks.
|
|
20616
|
-
// Those callbacks are added to the "current" queue at the end of
|
|
20617
|
-
// the current callback invocation. The shape of this list is the same
|
|
20618
|
-
// as the shape of the `current` list.
|
|
20619
|
-
this.deferred = [];
|
|
20620
|
-
}
|
|
20621
|
-
add(delay, callback) {
|
|
20622
|
-
const target = this.executingCallbacks ? this.deferred : this.current;
|
|
20623
|
-
this.addToQueue(target, Date.now() + delay, callback);
|
|
20624
|
-
this.scheduleTimer();
|
|
20625
|
-
}
|
|
20626
|
-
remove(callback) {
|
|
20627
|
-
const callbackIndex = this.removeFromQueue(this.current, callback);
|
|
20628
|
-
if (callbackIndex === -1) {
|
|
20629
|
-
// Try cleaning up deferred queue only in case
|
|
20630
|
-
// we didn't find a callback in the "current" queue.
|
|
20631
|
-
this.removeFromQueue(this.deferred, callback);
|
|
20632
|
-
}
|
|
20633
|
-
}
|
|
20634
|
-
addToQueue(target, invokeAt, callback) {
|
|
20635
|
-
let insertAtIndex = target.length;
|
|
20636
|
-
for (let i = 0; i < target.length; i += 2) {
|
|
20637
|
-
const invokeQueuedCallbackAt = target[i];
|
|
20638
|
-
if (invokeQueuedCallbackAt > invokeAt) {
|
|
20639
|
-
// We've reached a first timer that is scheduled
|
|
20640
|
-
// for a later time than what we are trying to insert.
|
|
20641
|
-
// This is the location at which we need to insert,
|
|
20642
|
-
// no need to iterate further.
|
|
20643
|
-
insertAtIndex = i;
|
|
20644
|
-
break;
|
|
20645
|
-
}
|
|
20646
|
-
}
|
|
20647
|
-
arrayInsert2(target, insertAtIndex, invokeAt, callback);
|
|
20648
|
-
}
|
|
20649
|
-
removeFromQueue(target, callback) {
|
|
20650
|
-
let index = -1;
|
|
20651
|
-
for (let i = 0; i < target.length; i += 2) {
|
|
20652
|
-
const queuedCallback = target[i + 1];
|
|
20653
|
-
if (queuedCallback === callback) {
|
|
20654
|
-
index = i;
|
|
20655
|
-
break;
|
|
20656
|
-
}
|
|
20657
|
-
}
|
|
20658
|
-
if (index > -1) {
|
|
20659
|
-
// Remove 2 elements: a timestamp slot and
|
|
20660
|
-
// the following slot with a callback function.
|
|
20661
|
-
arraySplice(target, index, 2);
|
|
20662
|
-
}
|
|
20663
|
-
return index;
|
|
20664
|
-
}
|
|
20665
|
-
scheduleTimer() {
|
|
20666
|
-
const callback = () => {
|
|
20667
|
-
clearTimeout(this.timeoutId);
|
|
20668
|
-
this.timeoutId = null;
|
|
20669
|
-
this.executingCallbacks = true;
|
|
20670
|
-
// Invoke callbacks that were scheduled to run
|
|
20671
|
-
// before the current time.
|
|
20672
|
-
let now = Date.now();
|
|
20673
|
-
let lastCallbackIndex = null;
|
|
20674
|
-
for (let i = 0; i < this.current.length; i += 2) {
|
|
20675
|
-
const invokeAt = this.current[i];
|
|
20676
|
-
const callback = this.current[i + 1];
|
|
20677
|
-
if (invokeAt <= now) {
|
|
20678
|
-
callback();
|
|
20679
|
-
// Point at the invoked callback function, which is located
|
|
20680
|
-
// after the timestamp.
|
|
20681
|
-
lastCallbackIndex = i + 1;
|
|
20682
|
-
}
|
|
20683
|
-
else {
|
|
20684
|
-
// We've reached a timer that should not be invoked yet.
|
|
20685
|
-
break;
|
|
20686
|
-
}
|
|
20687
|
-
}
|
|
20688
|
-
if (lastCallbackIndex !== null) {
|
|
20689
|
-
// If last callback index is `null` - no callbacks were invoked,
|
|
20690
|
-
// so no cleanup is needed. Otherwise, remove invoked callbacks
|
|
20691
|
-
// from the queue.
|
|
20692
|
-
arraySplice(this.current, 0, lastCallbackIndex + 1);
|
|
20693
|
-
}
|
|
20694
|
-
this.executingCallbacks = false;
|
|
20695
|
-
// If there are any callbacks added during an invocation
|
|
20696
|
-
// of the current ones - move them over to the "current"
|
|
20697
|
-
// queue.
|
|
20698
|
-
if (this.deferred.length > 0) {
|
|
20699
|
-
for (let i = 0; i < this.deferred.length; i += 2) {
|
|
20700
|
-
const invokeAt = this.deferred[i];
|
|
20701
|
-
const callback = this.deferred[i + 1];
|
|
20702
|
-
this.addToQueue(this.current, invokeAt, callback);
|
|
20703
|
-
}
|
|
20704
|
-
this.deferred.length = 0;
|
|
20705
|
-
}
|
|
20706
|
-
this.scheduleTimer();
|
|
20707
|
-
};
|
|
20708
|
-
// Avoid running timer callbacks more than once per
|
|
20709
|
-
// average frame duration. This is needed for better
|
|
20710
|
-
// batching and to avoid kicking off excessive change
|
|
20711
|
-
// detection cycles.
|
|
20712
|
-
const FRAME_DURATION_MS = 16; // 1000ms / 60fps
|
|
20713
|
-
if (this.current.length > 0) {
|
|
20714
|
-
const now = Date.now();
|
|
20715
|
-
// First element in the queue points at the timestamp
|
|
20716
|
-
// of the first (earliest) event.
|
|
20717
|
-
const invokeAt = this.current[0];
|
|
20718
|
-
if (!this.timeoutId ||
|
|
20719
|
-
// Reschedule a timer in case a queue contains an item with
|
|
20720
|
-
// an earlier timestamp and the delta is more than an average
|
|
20721
|
-
// frame duration.
|
|
20722
|
-
(this.invokeTimerAt && (this.invokeTimerAt - invokeAt > FRAME_DURATION_MS))) {
|
|
20723
|
-
if (this.timeoutId !== null) {
|
|
20724
|
-
// There was a timeout already, but an earlier event was added
|
|
20725
|
-
// into the queue. In this case we drop an old timer and setup
|
|
20726
|
-
// a new one with an updated (smaller) timeout.
|
|
20727
|
-
clearTimeout(this.timeoutId);
|
|
20728
|
-
this.timeoutId = null;
|
|
20729
|
-
}
|
|
20730
|
-
const timeout = Math.max(invokeAt - now, FRAME_DURATION_MS);
|
|
20731
|
-
this.invokeTimerAt = invokeAt;
|
|
20732
|
-
this.timeoutId = setTimeout(callback, timeout);
|
|
20733
|
-
}
|
|
20734
|
-
}
|
|
20735
|
-
}
|
|
20736
|
-
ngOnDestroy() {
|
|
20737
|
-
if (this.timeoutId !== null) {
|
|
20738
|
-
clearTimeout(this.timeoutId);
|
|
20739
|
-
this.timeoutId = null;
|
|
20740
|
-
}
|
|
20741
|
-
this.current.length = 0;
|
|
20742
|
-
this.deferred.length = 0;
|
|
20743
|
-
}
|
|
20744
|
-
/** @nocollapse */
|
|
20745
|
-
static { this.ɵprov = ɵɵdefineInjectable({
|
|
20746
|
-
token: TimerScheduler,
|
|
20747
|
-
providedIn: 'root',
|
|
20748
|
-
factory: () => new TimerScheduler(),
|
|
20749
|
-
}); }
|
|
20750
|
-
}
|
|
20751
20758
|
|
|
20752
20759
|
function elementStartFirstCreatePass(index, tView, lView, name, attrsIndex, localRefsIndex) {
|
|
20753
20760
|
ngDevMode && assertFirstCreatePass(tView);
|
|
@@ -21346,9 +21353,6 @@ var I18nCreateOpCode;
|
|
|
21346
21353
|
*/
|
|
21347
21354
|
I18nCreateOpCode[I18nCreateOpCode["COMMENT"] = 2] = "COMMENT";
|
|
21348
21355
|
})(I18nCreateOpCode || (I18nCreateOpCode = {}));
|
|
21349
|
-
// Note: This hack is necessary so we don't erroneously get a circular dependency
|
|
21350
|
-
// failure based on types.
|
|
21351
|
-
const unusedValueExportToPlacateAjd = 1;
|
|
21352
21356
|
|
|
21353
21357
|
/**
|
|
21354
21358
|
* The locale id that the application is currently using (for translations and ICU expressions).
|
|
@@ -30528,6 +30532,7 @@ function isBoundToModule(cf) {
|
|
|
30528
30532
|
/**
|
|
30529
30533
|
* A token for third-party components that can register themselves with NgProbe.
|
|
30530
30534
|
*
|
|
30535
|
+
* @deprecated
|
|
30531
30536
|
* @publicApi
|
|
30532
30537
|
*/
|
|
30533
30538
|
class NgProbeToken {
|
|
@@ -31753,6 +31758,7 @@ class DebugElement extends DebugNode {
|
|
|
31753
31758
|
/**
|
|
31754
31759
|
* A map of attribute names to attribute values for an element.
|
|
31755
31760
|
*/
|
|
31761
|
+
// TODO: replace null by undefined in the return type
|
|
31756
31762
|
get attributes() {
|
|
31757
31763
|
const attributes = {};
|
|
31758
31764
|
const element = this.nativeElement;
|
|
@@ -31798,16 +31804,11 @@ class DebugElement extends DebugNode {
|
|
|
31798
31804
|
}
|
|
31799
31805
|
/**
|
|
31800
31806
|
* The inline styles of the DOM element.
|
|
31801
|
-
*
|
|
31802
|
-
* Will be `null` if there is no `style` property on the underlying DOM element.
|
|
31803
|
-
*
|
|
31804
|
-
* @see [ElementCSSInlineStyle](https://developer.mozilla.org/en-US/docs/Web/API/ElementCSSInlineStyle/style)
|
|
31805
31807
|
*/
|
|
31808
|
+
// TODO: replace null by undefined in the return type
|
|
31806
31809
|
get styles() {
|
|
31807
|
-
|
|
31808
|
-
|
|
31809
|
-
}
|
|
31810
|
-
return {};
|
|
31810
|
+
const element = this.nativeElement;
|
|
31811
|
+
return (element?.style ?? {});
|
|
31811
31812
|
}
|
|
31812
31813
|
/**
|
|
31813
31814
|
* A map containing the class names on the element as keys.
|
|
@@ -33783,6 +33784,42 @@ function setAlternateWeakRefImpl(impl) {
|
|
|
33783
33784
|
// TODO: remove this function
|
|
33784
33785
|
}
|
|
33785
33786
|
|
|
33787
|
+
/**
|
|
33788
|
+
* Retrieves all defer blocks in a given LView.
|
|
33789
|
+
*
|
|
33790
|
+
* @param lView lView with defer blocks
|
|
33791
|
+
* @param deferBlocks defer block aggregator array
|
|
33792
|
+
*/
|
|
33793
|
+
function getDeferBlocks(lView, deferBlocks) {
|
|
33794
|
+
const tView = lView[TVIEW];
|
|
33795
|
+
for (let i = HEADER_OFFSET; i < tView.bindingStartIndex; i++) {
|
|
33796
|
+
if (isLContainer(lView[i])) {
|
|
33797
|
+
const lContainer = lView[i];
|
|
33798
|
+
// An LContainer may represent an instance of a defer block, in which case
|
|
33799
|
+
// we store it as a result. Otherwise, keep iterating over LContainer views and
|
|
33800
|
+
// look for defer blocks.
|
|
33801
|
+
const isLast = i === tView.bindingStartIndex - 1;
|
|
33802
|
+
if (!isLast) {
|
|
33803
|
+
const tNode = tView.data[i];
|
|
33804
|
+
const tDetails = getTDeferBlockDetails(tView, tNode);
|
|
33805
|
+
if (isTDeferBlockDetails(tDetails)) {
|
|
33806
|
+
deferBlocks.push({ lContainer, lView, tNode, tDetails });
|
|
33807
|
+
// This LContainer represents a defer block, so we exit
|
|
33808
|
+
// this iteration and don't inspect views in this LContainer.
|
|
33809
|
+
continue;
|
|
33810
|
+
}
|
|
33811
|
+
}
|
|
33812
|
+
for (let i = CONTAINER_HEADER_OFFSET; i < lContainer.length; i++) {
|
|
33813
|
+
getDeferBlocks(lContainer[i], deferBlocks);
|
|
33814
|
+
}
|
|
33815
|
+
}
|
|
33816
|
+
else if (isLView(lView[i])) {
|
|
33817
|
+
// This is a component, enter the `getDeferBlocks` recursively.
|
|
33818
|
+
getDeferBlocks(lView[i], deferBlocks);
|
|
33819
|
+
}
|
|
33820
|
+
}
|
|
33821
|
+
}
|
|
33822
|
+
|
|
33786
33823
|
/**
|
|
33787
33824
|
* A collection that tracks all serialized views (`ngh` DOM annotations)
|
|
33788
33825
|
* to avoid duplication. An attempt to add a duplicate view results in the
|
|
@@ -34319,7 +34356,6 @@ function printHydrationStats(injector) {
|
|
|
34319
34356
|
const message = `Angular hydrated ${ngDevMode.hydratedComponents} component(s) ` +
|
|
34320
34357
|
`and ${ngDevMode.hydratedNodes} node(s), ` +
|
|
34321
34358
|
`${ngDevMode.componentsSkippedHydration} component(s) were skipped. ` +
|
|
34322
|
-
`Note: this feature is in Developer Preview mode. ` +
|
|
34323
34359
|
`Learn more at https://angular.io/guide/hydration.`;
|
|
34324
34360
|
// tslint:disable-next-line:no-console
|
|
34325
34361
|
console.log(message);
|
|
@@ -34790,5 +34826,5 @@ if (typeof ngDevMode !== 'undefined' && ngDevMode) {
|
|
|
34790
34826
|
* Generated bundle index. Do not edit.
|
|
34791
34827
|
*/
|
|
34792
34828
|
|
|
34793
|
-
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, 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 };
|
|
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 };
|
|
34794
34830
|
//# sourceMappingURL=core.mjs.map
|