@angular/core 17.0.0-next.4 → 17.0.0-next.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (42) hide show
  1. package/esm2022/src/core.mjs +2 -2
  2. package/esm2022/src/core_private_export.mjs +3 -1
  3. package/esm2022/src/core_render3_private_export.mjs +3 -2
  4. package/esm2022/src/errors.mjs +1 -1
  5. package/esm2022/src/metadata/ng_module_def.mjs +1 -1
  6. package/esm2022/src/render3/after_render_hooks.mjs +100 -13
  7. package/esm2022/src/render3/deps_tracker/api.mjs +1 -1
  8. package/esm2022/src/render3/deps_tracker/deps_tracker.mjs +13 -3
  9. package/esm2022/src/render3/index.mjs +2 -2
  10. package/esm2022/src/render3/instructions/defer.mjs +121 -40
  11. package/esm2022/src/render3/interfaces/defer.mjs +66 -1
  12. package/esm2022/src/render3/interfaces/definition.mjs +1 -1
  13. package/esm2022/src/render3/local_compilation.mjs +8 -2
  14. package/esm2022/src/render3/reactive_lview_consumer.mjs +1 -1
  15. package/esm2022/src/render3/reactivity/effect.mjs +3 -15
  16. package/esm2022/src/render3/scope.mjs +10 -4
  17. package/esm2022/src/signals/src/api.mjs +2 -2
  18. package/esm2022/src/signals/src/computed.mjs +50 -45
  19. package/esm2022/src/signals/src/graph.mjs +7 -2
  20. package/esm2022/src/signals/src/signal.mjs +11 -6
  21. package/esm2022/src/signals/src/watch.mjs +40 -12
  22. package/esm2022/src/version.mjs +1 -1
  23. package/esm2022/testing/src/component_fixture.mjs +17 -2
  24. package/esm2022/testing/src/defer.mjs +84 -0
  25. package/esm2022/testing/src/logger.mjs +3 -3
  26. package/esm2022/testing/src/test_bed.mjs +12 -2
  27. package/esm2022/testing/src/test_bed_common.mjs +1 -1
  28. package/esm2022/testing/src/test_bed_compiler.mjs +5 -2
  29. package/esm2022/testing/src/testing.mjs +3 -1
  30. package/fesm2022/core.mjs +415 -132
  31. package/fesm2022/core.mjs.map +1 -1
  32. package/fesm2022/rxjs-interop.mjs +1 -1
  33. package/fesm2022/testing.mjs +107 -3
  34. package/fesm2022/testing.mjs.map +1 -1
  35. package/index.d.ts +202 -8
  36. package/package.json +3 -3
  37. package/rxjs-interop/index.d.ts +1 -1
  38. package/schematics/migrations/guard-and-resolve-interfaces/bundle.js +13 -13
  39. package/schematics/migrations/remove-module-id/bundle.js +14 -14
  40. package/schematics/ng-generate/standalone-migration/bundle.js +1890 -1155
  41. package/schematics/ng-generate/standalone-migration/bundle.js.map +4 -4
  42. package/testing/index.d.ts +41 -1
package/fesm2022/core.mjs CHANGED
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @license Angular v17.0.0-next.4
2
+ * @license Angular v17.0.0-next.5
3
3
  * (c) 2010-2022 Google LLC. https://angular.io/
4
4
  * License: MIT
5
5
  */
@@ -2264,7 +2264,7 @@ function getFactoryDef(type, throwNotFound) {
2264
2264
  *
2265
2265
  * This can be used to auto-unwrap signals in various cases, or to auto-wrap non-signal values.
2266
2266
  */
2267
- const SIGNAL = Symbol('SIGNAL');
2267
+ const SIGNAL = /* @__PURE__ */ Symbol('SIGNAL');
2268
2268
  /**
2269
2269
  * Checks if the given `value` is a reactive `Signal`.
2270
2270
  *
@@ -2445,7 +2445,9 @@ function consumerAfterComputation(node, prevConsumer) {
2445
2445
  }
2446
2446
  }
2447
2447
  // Truncate the producer tracking arrays.
2448
- for (let i = node.nextProducerIndex; i < node.producerNode.length; i++) {
2448
+ // Perf note: this is essentially truncating the length to `node.nextProducerIndex`, but
2449
+ // benchmarking has shown that individual pop operations are faster.
2450
+ while (node.producerNode.length > node.nextProducerIndex) {
2449
2451
  node.producerNode.pop();
2450
2452
  node.producerLastReadVersion.pop();
2451
2453
  node.producerIndexOfThis.pop();
@@ -2519,6 +2521,9 @@ function producerAddLiveConsumer(node, consumer, indexOfThis) {
2519
2521
  function producerRemoveLiveConsumerAtIndex(node, idx) {
2520
2522
  assertProducerNode(node);
2521
2523
  assertConsumerNode(node);
2524
+ if (typeof ngDevMode !== 'undefined' && ngDevMode && idx >= node.liveConsumerNode.length) {
2525
+ throw new Error(`Assertion error: active consumer index ${idx} is out of bounds of ${node.liveConsumerNode.length} consumers)`);
2526
+ }
2522
2527
  if (node.liveConsumerNode.length === 1) {
2523
2528
  // When removing the last live consumer, we will no longer be live. We need to remove
2524
2529
  // ourselves from our producers' tracking (which may cause consumer-producers to lose
@@ -2583,60 +2588,65 @@ function computed(computation, options) {
2583
2588
  * A dedicated symbol used before a computed value has been calculated for the first time.
2584
2589
  * Explicitly typed as `any` so we can use it as signal's value.
2585
2590
  */
2586
- const UNSET = Symbol('UNSET');
2591
+ const UNSET = /* @__PURE__ */ Symbol('UNSET');
2587
2592
  /**
2588
2593
  * A dedicated symbol used in place of a computed signal value to indicate that a given computation
2589
2594
  * is in progress. Used to detect cycles in computation chains.
2590
2595
  * Explicitly typed as `any` so we can use it as signal's value.
2591
2596
  */
2592
- const COMPUTING = Symbol('COMPUTING');
2597
+ const COMPUTING = /* @__PURE__ */ Symbol('COMPUTING');
2593
2598
  /**
2594
2599
  * A dedicated symbol used in place of a computed signal value to indicate that a given computation
2595
2600
  * failed. The thrown error is cached until the computation gets dirty again.
2596
2601
  * Explicitly typed as `any` so we can use it as signal's value.
2597
2602
  */
2598
- const ERRORED = Symbol('ERRORED');
2599
- const COMPUTED_NODE = {
2600
- ...REACTIVE_NODE,
2601
- value: UNSET,
2602
- dirty: true,
2603
- error: null,
2604
- equal: defaultEquals,
2605
- producerMustRecompute(node) {
2606
- // Force a recomputation if there's no current value, or if the current value is in the process
2607
- // of being calculated (which should throw an error).
2608
- return node.value === UNSET || node.value === COMPUTING;
2609
- },
2610
- producerRecomputeValue(node) {
2611
- if (node.value === COMPUTING) {
2612
- // Our computation somehow led to a cyclic read of itself.
2613
- throw new Error('Detected cycle in computations.');
2614
- }
2615
- const oldValue = node.value;
2616
- node.value = COMPUTING;
2617
- const prevConsumer = consumerBeforeComputation(node);
2618
- let newValue;
2619
- try {
2620
- newValue = node.computation();
2621
- }
2622
- catch (err) {
2623
- newValue = ERRORED;
2624
- node.error = err;
2625
- }
2626
- finally {
2627
- consumerAfterComputation(node, prevConsumer);
2628
- }
2629
- if (oldValue !== UNSET && oldValue !== ERRORED && newValue !== ERRORED &&
2630
- node.equal(oldValue, newValue)) {
2631
- // No change to `valueVersion` - old and new values are
2632
- // semantically equivalent.
2633
- node.value = oldValue;
2634
- return;
2635
- }
2636
- node.value = newValue;
2637
- node.version++;
2638
- },
2639
- };
2603
+ const ERRORED = /* @__PURE__ */ Symbol('ERRORED');
2604
+ // Note: Using an IIFE here to ensure that the spread assignment is not considered
2605
+ // a side-effect, ending up preserving `COMPUTED_NODE` and `REACTIVE_NODE`.
2606
+ // TODO: remove when https://github.com/evanw/esbuild/issues/3392 is resolved.
2607
+ const COMPUTED_NODE = /* @__PURE__ */ (() => {
2608
+ return {
2609
+ ...REACTIVE_NODE,
2610
+ value: UNSET,
2611
+ dirty: true,
2612
+ error: null,
2613
+ equal: defaultEquals,
2614
+ producerMustRecompute(node) {
2615
+ // Force a recomputation if there's no current value, or if the current value is in the
2616
+ // process of being calculated (which should throw an error).
2617
+ return node.value === UNSET || node.value === COMPUTING;
2618
+ },
2619
+ producerRecomputeValue(node) {
2620
+ if (node.value === COMPUTING) {
2621
+ // Our computation somehow led to a cyclic read of itself.
2622
+ throw new Error('Detected cycle in computations.');
2623
+ }
2624
+ const oldValue = node.value;
2625
+ node.value = COMPUTING;
2626
+ const prevConsumer = consumerBeforeComputation(node);
2627
+ let newValue;
2628
+ try {
2629
+ newValue = node.computation();
2630
+ }
2631
+ catch (err) {
2632
+ newValue = ERRORED;
2633
+ node.error = err;
2634
+ }
2635
+ finally {
2636
+ consumerAfterComputation(node, prevConsumer);
2637
+ }
2638
+ if (oldValue !== UNSET && oldValue !== ERRORED && newValue !== ERRORED &&
2639
+ node.equal(oldValue, newValue)) {
2640
+ // No change to `valueVersion` - old and new values are
2641
+ // semantically equivalent.
2642
+ node.value = oldValue;
2643
+ return;
2644
+ }
2645
+ node.value = newValue;
2646
+ node.version++;
2647
+ },
2648
+ };
2649
+ })();
2640
2650
 
2641
2651
  function defaultThrowError() {
2642
2652
  throw new Error();
@@ -2681,11 +2691,16 @@ function setPostSignalSetFn(fn) {
2681
2691
  postSignalSetFn = fn;
2682
2692
  return prev;
2683
2693
  }
2684
- const SIGNAL_NODE = {
2685
- ...REACTIVE_NODE,
2686
- equal: defaultEquals,
2687
- readonlyFn: undefined,
2688
- };
2694
+ // Note: Using an IIFE here to ensure that the spread assignment is not considered
2695
+ // a side-effect, ending up preserving `COMPUTED_NODE` and `REACTIVE_NODE`.
2696
+ // TODO: remove when https://github.com/evanw/esbuild/issues/3392 is resolved.
2697
+ const SIGNAL_NODE = /* @__PURE__ */ (() => {
2698
+ return {
2699
+ ...REACTIVE_NODE,
2700
+ equal: defaultEquals,
2701
+ readonlyFn: undefined,
2702
+ };
2703
+ })();
2689
2704
  function signalValueChanged(node) {
2690
2705
  node.version++;
2691
2706
  producerNotifyConsumers(node);
@@ -2754,7 +2769,27 @@ function watch(fn, schedule, allowSignalWrites) {
2754
2769
  const registerOnCleanup = (cleanupFn) => {
2755
2770
  node.cleanupFn = cleanupFn;
2756
2771
  };
2772
+ function isWatchNodeDestroyed(node) {
2773
+ return node.fn === null && node.schedule === null;
2774
+ }
2775
+ function destroyWatchNode(node) {
2776
+ if (!isWatchNodeDestroyed(node)) {
2777
+ consumerDestroy(node); // disconnect watcher from the reactive graph
2778
+ node.cleanupFn();
2779
+ // nullify references to the integration functions to mark node as destroyed
2780
+ node.fn = null;
2781
+ node.schedule = null;
2782
+ node.cleanupFn = NOOP_CLEANUP_FN;
2783
+ }
2784
+ }
2757
2785
  const run = () => {
2786
+ if (node.fn === null) {
2787
+ // trying to run a destroyed watch is noop
2788
+ return;
2789
+ }
2790
+ if (isInNotificationPhase()) {
2791
+ throw new Error(`Schedulers cannot synchronously execute watches while scheduling.`);
2792
+ }
2758
2793
  node.dirty = false;
2759
2794
  if (node.hasRun && !consumerPollProducersForChange(node)) {
2760
2795
  return;
@@ -2774,20 +2809,28 @@ function watch(fn, schedule, allowSignalWrites) {
2774
2809
  notify: () => consumerMarkDirty(node),
2775
2810
  run,
2776
2811
  cleanup: () => node.cleanupFn(),
2812
+ destroy: () => destroyWatchNode(node),
2777
2813
  };
2778
2814
  return node.ref;
2779
2815
  }
2780
2816
  const NOOP_CLEANUP_FN = () => { };
2781
- const WATCH_NODE = {
2782
- ...REACTIVE_NODE,
2783
- consumerIsAlwaysLive: true,
2784
- consumerAllowSignalWrites: false,
2785
- consumerMarkedDirty: (node) => {
2786
- node.schedule(node.ref);
2787
- },
2788
- hasRun: false,
2789
- cleanupFn: NOOP_CLEANUP_FN,
2790
- };
2817
+ // Note: Using an IIFE here to ensure that the spread assignment is not considered
2818
+ // a side-effect, ending up preserving `COMPUTED_NODE` and `REACTIVE_NODE`.
2819
+ // TODO: remove when https://github.com/evanw/esbuild/issues/3392 is resolved.
2820
+ const WATCH_NODE = /* @__PURE__ */ (() => {
2821
+ return {
2822
+ ...REACTIVE_NODE,
2823
+ consumerIsAlwaysLive: true,
2824
+ consumerAllowSignalWrites: false,
2825
+ consumerMarkedDirty: (node) => {
2826
+ if (node.schedule !== null) {
2827
+ node.schedule(node.ref);
2828
+ }
2829
+ },
2830
+ hasRun: false,
2831
+ cleanupFn: NOOP_CLEANUP_FN,
2832
+ };
2833
+ })();
2791
2834
 
2792
2835
  function setAlternateWeakRefImpl(impl) {
2793
2836
  // TODO: remove this function
@@ -7320,12 +7363,13 @@ class DepsTracker {
7320
7363
  dependencies: [
7321
7364
  ...scope.compilation.directives,
7322
7365
  ...scope.compilation.pipes,
7366
+ ...scope.compilation.ngModules,
7323
7367
  ]
7324
7368
  };
7325
7369
  }
7326
7370
  else {
7327
7371
  if (!this.ownerNgModule.has(type)) {
7328
- return { dependencies: [] };
7372
+ throw new RuntimeError(1001 /* RuntimeErrorCode.RUNTIME_DEPS_ORPHAN_COMPONENT */, `Orphan component found! Trying to render the component ${type.name} without first loading the NgModule that declares it. Make sure that you import the component's NgModule in the NgModule or the standalone component in which you are trying to render this component. Also make sure the way the app is bundled and served always includes the component's NgModule before the component.`);
7329
7373
  }
7330
7374
  const scope = this.getNgModuleScope(this.ownerNgModule.get(type));
7331
7375
  if (scope.compilation.isPoisoned) {
@@ -7432,6 +7476,12 @@ class DepsTracker {
7432
7476
  // check for it.
7433
7477
  addSet(exportedScope.exported.directives, scope.exported.directives);
7434
7478
  addSet(exportedScope.exported.pipes, scope.exported.pipes);
7479
+ // Some test toolings which run in JIT mode depend on this behavior that the exported scope
7480
+ // should also be present in the compilation scope, even though AoT does not support this
7481
+ // and it is also in odds with NgModule metadata definitions. Without this some tests in
7482
+ // Google will fail.
7483
+ addSet(exportedScope.exported.directives, scope.compilation.directives);
7484
+ addSet(exportedScope.exported.pipes, scope.compilation.pipes);
7435
7485
  }
7436
7486
  else if (isPipe(exported)) {
7437
7487
  scope.exported.pipes.add(exported);
@@ -7457,9 +7507,10 @@ class DepsTracker {
7457
7507
  // Standalone components are always able to self-reference.
7458
7508
  directives: new Set([type]),
7459
7509
  pipes: new Set(),
7510
+ ngModules: new Set(),
7460
7511
  },
7461
7512
  };
7462
- for (const rawImport of rawImports ?? []) {
7513
+ for (const rawImport of flatten(rawImports ?? [])) {
7463
7514
  const imported = resolveForwardRef(rawImport);
7464
7515
  try {
7465
7516
  verifyStandaloneImport(imported, type);
@@ -7470,6 +7521,7 @@ class DepsTracker {
7470
7521
  return ans;
7471
7522
  }
7472
7523
  if (isNgModule(imported)) {
7524
+ ans.compilation.ngModules.add(imported);
7473
7525
  const importedScope = this.getNgModuleScope(imported);
7474
7526
  // Short-circuit if an imported NgModule has corrupted exported scope.
7475
7527
  if (importedScope.exported.isPoisoned) {
@@ -10849,7 +10901,7 @@ class Version {
10849
10901
  /**
10850
10902
  * @publicApi
10851
10903
  */
10852
- const VERSION = new Version('17.0.0-next.4');
10904
+ const VERSION = new Version('17.0.0-next.5');
10853
10905
 
10854
10906
  // This default value is when checking the hierarchy for a token.
10855
10907
  //
@@ -11535,10 +11587,77 @@ function shouldBeIgnoredByZone(applyArgs) {
11535
11587
 
11536
11588
  // Public API for Zone
11537
11589
 
11590
+ /**
11591
+ * The phase to run an `afterRender` or `afterNextRender` callback in.
11592
+ *
11593
+ * Callbacks in the same phase run in the order they are registered. Phases run in the
11594
+ * following order after each render:
11595
+ *
11596
+ * 1. `AfterRenderPhase.EarlyRead`
11597
+ * 2. `AfterRenderPhase.Write`
11598
+ * 3. `AfterRenderPhase.MixedReadWrite`
11599
+ * 4. `AfterRenderPhase.Read`
11600
+ *
11601
+ * Angular is unable to verify or enforce that phases are used correctly, and instead
11602
+ * relies on each developer to follow the guidelines documented for each value and
11603
+ * carefully choose the appropriate one, refactoring their code if necessary. By doing
11604
+ * so, Angular is better able to minimize the performance degradation associated with
11605
+ * manual DOM access, ensuring the best experience for the end users of your application
11606
+ * or library.
11607
+ *
11608
+ * @developerPreview
11609
+ */
11610
+ var AfterRenderPhase;
11611
+ (function (AfterRenderPhase) {
11612
+ /**
11613
+ * Use `AfterRenderPhase.EarlyRead` for callbacks that only need to **read** from the
11614
+ * DOM before a subsequent `AfterRenderPhase.Write` callback, for example to perform
11615
+ * custom layout that the browser doesn't natively support. **Never** use this phase
11616
+ * for callbacks that can write to the DOM or when `AfterRenderPhase.Read` is adequate.
11617
+ *
11618
+ * <div class="alert is-important">
11619
+ *
11620
+ * Using this value can degrade performance.
11621
+ * Instead, prefer using built-in browser functionality when possible.
11622
+ *
11623
+ * </div>
11624
+ */
11625
+ AfterRenderPhase[AfterRenderPhase["EarlyRead"] = 0] = "EarlyRead";
11626
+ /**
11627
+ * Use `AfterRenderPhase.Write` for callbacks that only **write** to the DOM. **Never**
11628
+ * use this phase for callbacks that can read from the DOM.
11629
+ */
11630
+ AfterRenderPhase[AfterRenderPhase["Write"] = 1] = "Write";
11631
+ /**
11632
+ * Use `AfterRenderPhase.MixedReadWrite` for callbacks that read from or write to the
11633
+ * DOM, that haven't been refactored to use a different phase. **Never** use this phase
11634
+ * for callbacks that can use a different phase instead.
11635
+ *
11636
+ * <div class="alert is-critical">
11637
+ *
11638
+ * Using this value can **significantly** degrade performance.
11639
+ * Instead, prefer refactoring into multiple callbacks using a more specific phase.
11640
+ *
11641
+ * </div>
11642
+ */
11643
+ AfterRenderPhase[AfterRenderPhase["MixedReadWrite"] = 2] = "MixedReadWrite";
11644
+ /**
11645
+ * Use `AfterRenderPhase.Read` for callbacks that only **read** from the DOM. **Never**
11646
+ * use this phase for callbacks that can write to the DOM.
11647
+ */
11648
+ AfterRenderPhase[AfterRenderPhase["Read"] = 3] = "Read";
11649
+ })(AfterRenderPhase || (AfterRenderPhase = {}));
11538
11650
  /**
11539
11651
  * Register a callback to be invoked each time the application
11540
11652
  * finishes rendering.
11541
11653
  *
11654
+ * <div class="alert is-critical">
11655
+ *
11656
+ * You should always explicitly specify a non-default [phase](api/core/AfterRenderPhase), or you
11657
+ * risk significant performance degradation.
11658
+ *
11659
+ * </div>
11660
+ *
11542
11661
  * Note that the callback will run
11543
11662
  * - in the order it was registered
11544
11663
  * - once per render
@@ -11569,7 +11688,7 @@ function shouldBeIgnoredByZone(applyArgs) {
11569
11688
  * constructor() {
11570
11689
  * afterRender(() => {
11571
11690
  * console.log('content height: ' + this.contentRef.nativeElement.scrollHeight);
11572
- * });
11691
+ * }, {phase: AfterRenderPhase.Read});
11573
11692
  * }
11574
11693
  * }
11575
11694
  * ```
@@ -11590,7 +11709,8 @@ function afterRender(callback, options) {
11590
11709
  const callbackHandler = afterRenderEventManager.handler ??= new AfterRenderCallbackHandlerImpl();
11591
11710
  const ngZone = injector.get(NgZone);
11592
11711
  const errorHandler = injector.get(ErrorHandler, null, { optional: true });
11593
- const instance = new AfterRenderCallback(ngZone, errorHandler, callback);
11712
+ const phase = options?.phase ?? AfterRenderPhase.MixedReadWrite;
11713
+ const instance = new AfterRenderCallback(ngZone, errorHandler, phase, callback);
11594
11714
  destroy = () => {
11595
11715
  callbackHandler.unregister(instance);
11596
11716
  unregisterFn();
@@ -11602,6 +11722,13 @@ function afterRender(callback, options) {
11602
11722
  * Register a callback to be invoked the next time the application
11603
11723
  * finishes rendering.
11604
11724
  *
11725
+ * <div class="alert is-critical">
11726
+ *
11727
+ * You should always explicitly specify a non-default [phase](api/core/AfterRenderPhase), or you
11728
+ * risk significant performance degradation.
11729
+ *
11730
+ * </div>
11731
+ *
11605
11732
  * Note that the callback will run
11606
11733
  * - in the order it was registered
11607
11734
  * - on browser platforms only
@@ -11633,7 +11760,7 @@ function afterRender(callback, options) {
11633
11760
  * constructor() {
11634
11761
  * afterNextRender(() => {
11635
11762
  * this.chart = new MyChart(this.chartRef.nativeElement);
11636
- * });
11763
+ * }, {phase: AfterRenderPhase.Write});
11637
11764
  * }
11638
11765
  * }
11639
11766
  * ```
@@ -11654,7 +11781,8 @@ function afterNextRender(callback, options) {
11654
11781
  const callbackHandler = afterRenderEventManager.handler ??= new AfterRenderCallbackHandlerImpl();
11655
11782
  const ngZone = injector.get(NgZone);
11656
11783
  const errorHandler = injector.get(ErrorHandler, null, { optional: true });
11657
- const instance = new AfterRenderCallback(ngZone, errorHandler, () => {
11784
+ const phase = options?.phase ?? AfterRenderPhase.MixedReadWrite;
11785
+ const instance = new AfterRenderCallback(ngZone, errorHandler, phase, () => {
11658
11786
  destroy?.();
11659
11787
  callback();
11660
11788
  });
@@ -11669,9 +11797,10 @@ function afterNextRender(callback, options) {
11669
11797
  * A wrapper around a function to be used as an after render callback.
11670
11798
  */
11671
11799
  class AfterRenderCallback {
11672
- constructor(zone, errorHandler, callbackFn) {
11800
+ constructor(zone, errorHandler, phase, callbackFn) {
11673
11801
  this.zone = zone;
11674
11802
  this.errorHandler = errorHandler;
11803
+ this.phase = phase;
11675
11804
  this.callbackFn = callbackFn;
11676
11805
  }
11677
11806
  invoke() {
@@ -11690,7 +11819,13 @@ class AfterRenderCallback {
11690
11819
  class AfterRenderCallbackHandlerImpl {
11691
11820
  constructor() {
11692
11821
  this.executingCallbacks = false;
11693
- this.callbacks = new Set();
11822
+ this.buckets = {
11823
+ // Note: the order of these keys controls the order the phases are run.
11824
+ [AfterRenderPhase.EarlyRead]: new Set(),
11825
+ [AfterRenderPhase.Write]: new Set(),
11826
+ [AfterRenderPhase.MixedReadWrite]: new Set(),
11827
+ [AfterRenderPhase.Read]: new Set(),
11828
+ };
11694
11829
  this.deferredCallbacks = new Set();
11695
11830
  }
11696
11831
  validateBegin() {
@@ -11703,26 +11838,30 @@ class AfterRenderCallbackHandlerImpl {
11703
11838
  register(callback) {
11704
11839
  // If we're currently running callbacks, new callbacks should be deferred
11705
11840
  // until the next render operation.
11706
- const target = this.executingCallbacks ? this.deferredCallbacks : this.callbacks;
11841
+ const target = this.executingCallbacks ? this.deferredCallbacks : this.buckets[callback.phase];
11707
11842
  target.add(callback);
11708
11843
  }
11709
11844
  unregister(callback) {
11710
- this.callbacks.delete(callback);
11845
+ this.buckets[callback.phase].delete(callback);
11711
11846
  this.deferredCallbacks.delete(callback);
11712
11847
  }
11713
11848
  execute() {
11714
11849
  this.executingCallbacks = true;
11715
- for (const callback of this.callbacks) {
11716
- callback.invoke();
11850
+ for (const bucket of Object.values(this.buckets)) {
11851
+ for (const callback of bucket) {
11852
+ callback.invoke();
11853
+ }
11717
11854
  }
11718
11855
  this.executingCallbacks = false;
11719
11856
  for (const callback of this.deferredCallbacks) {
11720
- this.callbacks.add(callback);
11857
+ this.buckets[callback.phase].add(callback);
11721
11858
  }
11722
11859
  this.deferredCallbacks.clear();
11723
11860
  }
11724
11861
  destroy() {
11725
- this.callbacks.clear();
11862
+ for (const bucket of Object.values(this.buckets)) {
11863
+ bucket.clear();
11864
+ }
11726
11865
  this.deferredCallbacks.clear();
11727
11866
  }
11728
11867
  }
@@ -20233,7 +20372,72 @@ function enableLocateOrCreateContainerRefImpl() {
20233
20372
  _populateDehydratedViewsInContainer = populateDehydratedViewsInContainerImpl;
20234
20373
  }
20235
20374
 
20375
+ /**
20376
+ * Describes the state of defer block dependency loading.
20377
+ */
20378
+ var DeferDependenciesLoadingState;
20379
+ (function (DeferDependenciesLoadingState) {
20380
+ /** Initial state, dependency loading is not yet triggered */
20381
+ DeferDependenciesLoadingState[DeferDependenciesLoadingState["NOT_STARTED"] = 0] = "NOT_STARTED";
20382
+ /** Dependency loading was scheduled (e.g. `on idle`), but has not started yet */
20383
+ DeferDependenciesLoadingState[DeferDependenciesLoadingState["SCHEDULED"] = 1] = "SCHEDULED";
20384
+ /** Dependency loading is in progress */
20385
+ DeferDependenciesLoadingState[DeferDependenciesLoadingState["IN_PROGRESS"] = 2] = "IN_PROGRESS";
20386
+ /** Dependency loading has completed successfully */
20387
+ DeferDependenciesLoadingState[DeferDependenciesLoadingState["COMPLETE"] = 3] = "COMPLETE";
20388
+ /** Dependency loading has failed */
20389
+ DeferDependenciesLoadingState[DeferDependenciesLoadingState["FAILED"] = 4] = "FAILED";
20390
+ })(DeferDependenciesLoadingState || (DeferDependenciesLoadingState = {}));
20391
+ /**
20392
+ * Describes the current state of this {#defer} block instance.
20393
+ *
20394
+ * @publicApi
20395
+ * @developerPreview
20396
+ */
20397
+ var DeferBlockState;
20398
+ (function (DeferBlockState) {
20399
+ /** The {:placeholder} block content is rendered */
20400
+ DeferBlockState[DeferBlockState["Placeholder"] = 0] = "Placeholder";
20401
+ /** The {:loading} block content is rendered */
20402
+ DeferBlockState[DeferBlockState["Loading"] = 1] = "Loading";
20403
+ /** The main content block content is rendered */
20404
+ DeferBlockState[DeferBlockState["Complete"] = 2] = "Complete";
20405
+ /** The {:error} block content is rendered */
20406
+ DeferBlockState[DeferBlockState["Error"] = 3] = "Error";
20407
+ })(DeferBlockState || (DeferBlockState = {}));
20408
+ /**
20409
+ * Describes the initial state of this {#defer} block instance.
20410
+ *
20411
+ * Note: this state is internal only and *must* be represented
20412
+ * with a number lower than any value in the `DeferBlockState` enum.
20413
+ */
20414
+ var DeferBlockInternalState;
20415
+ (function (DeferBlockInternalState) {
20416
+ /** Initial state. Nothing is rendered yet. */
20417
+ DeferBlockInternalState[DeferBlockInternalState["Initial"] = -1] = "Initial";
20418
+ })(DeferBlockInternalState || (DeferBlockInternalState = {}));
20419
+ /**
20420
+ * A slot in the `LDeferBlockDetails` array that contains a number
20421
+ * that represent a current block state that is being rendered.
20422
+ */
20236
20423
  const DEFER_BLOCK_STATE = 0;
20424
+ /**
20425
+ * Options for configuring defer blocks behavior.
20426
+ * @publicApi
20427
+ * @developerPreview
20428
+ */
20429
+ var DeferBlockBehavior;
20430
+ (function (DeferBlockBehavior) {
20431
+ /**
20432
+ * Manual triggering mode for defer blocks. Provides control over when defer blocks render
20433
+ * and which state they render. This is the default behavior in test environments.
20434
+ */
20435
+ DeferBlockBehavior[DeferBlockBehavior["Manual"] = 0] = "Manual";
20436
+ /**
20437
+ * Playthrough mode for defer blocks. This mode behaves like defer blocks would in a browser.
20438
+ */
20439
+ DeferBlockBehavior[DeferBlockBehavior["Playthrough"] = 1] = "Playthrough";
20440
+ })(DeferBlockBehavior || (DeferBlockBehavior = {}));
20237
20441
 
20238
20442
  /**
20239
20443
  * Returns whether defer blocks should be triggered.
@@ -20242,6 +20446,10 @@ const DEFER_BLOCK_STATE = 0;
20242
20446
  * only placeholder content is rendered (if provided).
20243
20447
  */
20244
20448
  function shouldTriggerDeferBlock(injector) {
20449
+ const config = injector.get(DEFER_BLOCK_CONFIG, { optional: true });
20450
+ if (config?.behavior === DeferBlockBehavior.Manual) {
20451
+ return false;
20452
+ }
20245
20453
  return isPlatformBrowser(injector);
20246
20454
  }
20247
20455
  /**
@@ -20285,7 +20493,7 @@ function ɵɵdefer(index, primaryTmplIndex, dependencyResolverFn, loadingTmplInd
20285
20493
  getConstant(tViewConsts, loadingConfigIndex) :
20286
20494
  null,
20287
20495
  dependencyResolverFn: dependencyResolverFn ?? null,
20288
- loadingState: 0 /* DeferDependenciesLoadingState.NOT_STARTED */,
20496
+ loadingState: DeferDependenciesLoadingState.NOT_STARTED,
20289
20497
  loadingPromise: null,
20290
20498
  };
20291
20499
  setTDeferBlockDetails(tView, adjustedIndex, deferBlockConfig);
@@ -20296,7 +20504,7 @@ function ɵɵdefer(index, primaryTmplIndex, dependencyResolverFn, loadingTmplInd
20296
20504
  populateDehydratedViewsInContainer(lContainer);
20297
20505
  // Init instance-specific defer details and store it.
20298
20506
  const lDetails = [];
20299
- lDetails[DEFER_BLOCK_STATE] = 0 /* DeferBlockInstanceState.INITIAL */;
20507
+ lDetails[DEFER_BLOCK_STATE] = DeferBlockInternalState.Initial;
20300
20508
  setLDeferBlockDetails(lView, adjustedIndex, lDetails);
20301
20509
  }
20302
20510
  /**
@@ -20311,13 +20519,13 @@ function ɵɵdeferWhen(rawValue) {
20311
20519
  const tNode = getSelectedTNode();
20312
20520
  const lDetails = getLDeferBlockDetails(lView, tNode);
20313
20521
  const renderedState = lDetails[DEFER_BLOCK_STATE];
20314
- if (value === false && renderedState === 0 /* DeferBlockInstanceState.INITIAL */) {
20522
+ if (value === false && renderedState === DeferBlockInternalState.Initial) {
20315
20523
  // If nothing is rendered yet, render a placeholder (if defined).
20316
20524
  renderPlaceholder(lView, tNode);
20317
20525
  }
20318
20526
  else if (value === true &&
20319
- (renderedState === 0 /* DeferBlockInstanceState.INITIAL */ ||
20320
- renderedState === 1 /* DeferBlockInstanceState.PLACEHOLDER */)) {
20527
+ (renderedState === DeferBlockInternalState.Initial ||
20528
+ renderedState === DeferBlockState.Placeholder)) {
20321
20529
  // The `when` condition has changed to `true`, trigger defer block loading
20322
20530
  // if the block is either in initial (nothing is rendered) or a placeholder
20323
20531
  // state.
@@ -20337,9 +20545,9 @@ function ɵɵdeferPrefetchWhen(rawValue) {
20337
20545
  const tView = lView[TVIEW];
20338
20546
  const tNode = getSelectedTNode();
20339
20547
  const tDetails = getTDeferBlockDetails(tView, tNode);
20340
- if (value === true && tDetails.loadingState === 0 /* DeferDependenciesLoadingState.NOT_STARTED */) {
20548
+ if (value === true && tDetails.loadingState === DeferDependenciesLoadingState.NOT_STARTED) {
20341
20549
  // If loading has not been started yet, trigger it now.
20342
- triggerResourceLoading(tDetails, tView, lView);
20550
+ triggerPrefetching(tDetails, lView);
20343
20551
  }
20344
20552
  }
20345
20553
  }
@@ -20365,14 +20573,14 @@ function ɵɵdeferPrefetchOnIdle() {
20365
20573
  const tNode = getCurrentTNode();
20366
20574
  const tView = lView[TVIEW];
20367
20575
  const tDetails = getTDeferBlockDetails(tView, tNode);
20368
- if (tDetails.loadingState === 0 /* DeferDependenciesLoadingState.NOT_STARTED */) {
20576
+ if (tDetails.loadingState === DeferDependenciesLoadingState.NOT_STARTED) {
20369
20577
  // Set loading to the scheduled state, so that we don't register it again.
20370
- tDetails.loadingState = 1 /* DeferDependenciesLoadingState.SCHEDULED */;
20578
+ tDetails.loadingState = DeferDependenciesLoadingState.SCHEDULED;
20371
20579
  // In case of prefetching, we intentionally avoid cancelling prefetching if
20372
20580
  // an underlying LView get destroyed (thus passing `null` as a second argument),
20373
20581
  // because there might be other LViews (that represent embedded views) that
20374
20582
  // depend on resource loading.
20375
- onIdle(() => triggerResourceLoading(tDetails, tView, lView), null /* LView */);
20583
+ onIdle(() => triggerPrefetching(tDetails, lView), null /* LView */);
20376
20584
  }
20377
20585
  }
20378
20586
  /**
@@ -20496,6 +20704,23 @@ function setTDeferBlockDetails(tView, deferBlockIndex, deferBlockConfig) {
20496
20704
  ngDevMode && assertIndexInDeclRange(tView, slotIndex);
20497
20705
  tView.data[slotIndex] = deferBlockConfig;
20498
20706
  }
20707
+ function getTemplateIndexForState(newState, hostLView, tNode) {
20708
+ const tView = hostLView[TVIEW];
20709
+ const tDetails = getTDeferBlockDetails(tView, tNode);
20710
+ switch (newState) {
20711
+ case DeferBlockState.Complete:
20712
+ return tDetails.primaryTmplIndex;
20713
+ case DeferBlockState.Loading:
20714
+ return tDetails.loadingTmplIndex;
20715
+ case DeferBlockState.Error:
20716
+ return tDetails.errorTmplIndex;
20717
+ case DeferBlockState.Placeholder:
20718
+ return tDetails.placeholderTmplIndex;
20719
+ default:
20720
+ ngDevMode && throwError(`Unexpected defer block state: ${newState}`);
20721
+ return null;
20722
+ }
20723
+ }
20499
20724
  /**
20500
20725
  * Transitions a defer block to the new state. Updates the necessary
20501
20726
  * data structures and renders corresponding block.
@@ -20503,9 +20728,8 @@ function setTDeferBlockDetails(tView, deferBlockIndex, deferBlockConfig) {
20503
20728
  * @param newState New state that should be applied to the defer block.
20504
20729
  * @param tNode TNode that represents a defer block.
20505
20730
  * @param lContainer Represents an instance of a defer block.
20506
- * @param stateTmplIndex Index of a template that should be rendered.
20507
20731
  */
20508
- function renderDeferBlockState(newState, tNode, lContainer, stateTmplIndex) {
20732
+ function renderDeferBlockState(newState, tNode, lContainer) {
20509
20733
  const hostLView = lContainer[PARENT];
20510
20734
  // Check if this view is not destroyed. Since the loading process was async,
20511
20735
  // the view might end up being destroyed by the time rendering happens.
@@ -20515,6 +20739,7 @@ function renderDeferBlockState(newState, tNode, lContainer, stateTmplIndex) {
20515
20739
  ngDevMode && assertTNodeForLView(tNode, hostLView);
20516
20740
  const lDetails = getLDeferBlockDetails(hostLView, tNode);
20517
20741
  ngDevMode && assertDefined(lDetails, 'Expected a defer block state defined');
20742
+ const stateTmplIndex = getTemplateIndexForState(newState, hostLView, tNode);
20518
20743
  // Note: we transition to the next state if the previous state was represented
20519
20744
  // with a number that is less than the next state. For example, if the current
20520
20745
  // state is "loading" (represented as `2`), we should not show a placeholder
@@ -20533,18 +20758,28 @@ function renderDeferBlockState(newState, tNode, lContainer, stateTmplIndex) {
20533
20758
  addLViewToLContainer(lContainer, embeddedLView, viewIndex, shouldAddViewToDom(tNode, dehydratedView));
20534
20759
  }
20535
20760
  }
20761
+ /**
20762
+ * Trigger prefetching of dependencies for a defer block.
20763
+ *
20764
+ * @param tDetails Static information about this defer block.
20765
+ * @param lView LView of a host view.
20766
+ */
20767
+ function triggerPrefetching(tDetails, lView) {
20768
+ if (lView[INJECTOR$1] && shouldTriggerDeferBlock(lView[INJECTOR$1])) {
20769
+ triggerResourceLoading(tDetails, lView);
20770
+ }
20771
+ }
20536
20772
  /**
20537
20773
  * Trigger loading of defer block dependencies if the process hasn't started yet.
20538
20774
  *
20539
20775
  * @param tDetails Static information about this defer block.
20540
- * @param tView TView of a host view.
20541
20776
  * @param lView LView of a host view.
20542
20777
  */
20543
- function triggerResourceLoading(tDetails, tView, lView) {
20778
+ function triggerResourceLoading(tDetails, lView) {
20544
20779
  const injector = lView[INJECTOR$1];
20545
- if (!shouldTriggerDeferBlock(injector) ||
20546
- (tDetails.loadingState !== 0 /* DeferDependenciesLoadingState.NOT_STARTED */ &&
20547
- tDetails.loadingState !== 1 /* DeferDependenciesLoadingState.SCHEDULED */)) {
20780
+ const tView = lView[TVIEW];
20781
+ if (tDetails.loadingState !== DeferDependenciesLoadingState.NOT_STARTED &&
20782
+ tDetails.loadingState !== DeferDependenciesLoadingState.SCHEDULED) {
20548
20783
  // If the loading status is different from initial one, it means that
20549
20784
  // the loading of dependencies is in progress and there is nothing to do
20550
20785
  // in this function. All details can be obtained from the `tDetails` object.
@@ -20552,7 +20787,7 @@ function triggerResourceLoading(tDetails, tView, lView) {
20552
20787
  }
20553
20788
  const primaryBlockTNode = getPrimaryBlockTNode(tView, tDetails);
20554
20789
  // Switch from NOT_STARTED -> IN_PROGRESS state.
20555
- tDetails.loadingState = 2 /* DeferDependenciesLoadingState.IN_PROGRESS */;
20790
+ tDetails.loadingState = DeferDependenciesLoadingState.IN_PROGRESS;
20556
20791
  // Check if dependency function interceptor is configured.
20557
20792
  const deferDependencyInterceptor = injector.get(DEFER_BLOCK_DEPENDENCY_INTERCEPTOR, null, { optional: true });
20558
20793
  const dependenciesFn = deferDependencyInterceptor ?
@@ -20563,7 +20798,7 @@ function triggerResourceLoading(tDetails, tView, lView) {
20563
20798
  // thus no dynamic `import()`s were produced.
20564
20799
  if (!dependenciesFn) {
20565
20800
  tDetails.loadingPromise = Promise.resolve().then(() => {
20566
- tDetails.loadingState = 3 /* DeferDependenciesLoadingState.COMPLETE */;
20801
+ tDetails.loadingState = DeferDependenciesLoadingState.COMPLETE;
20567
20802
  });
20568
20803
  return;
20569
20804
  }
@@ -20594,10 +20829,10 @@ function triggerResourceLoading(tDetails, tView, lView) {
20594
20829
  // Loading is completed, we no longer need this Promise.
20595
20830
  tDetails.loadingPromise = null;
20596
20831
  if (failed) {
20597
- tDetails.loadingState = 4 /* DeferDependenciesLoadingState.FAILED */;
20832
+ tDetails.loadingState = DeferDependenciesLoadingState.FAILED;
20598
20833
  }
20599
20834
  else {
20600
- tDetails.loadingState = 3 /* DeferDependenciesLoadingState.COMPLETE */;
20835
+ tDetails.loadingState = DeferDependenciesLoadingState.COMPLETE;
20601
20836
  // Update directive and pipe registries to add newly downloaded dependencies.
20602
20837
  const primaryBlockTView = primaryBlockTNode.tView;
20603
20838
  if (directiveDefs.length > 0) {
@@ -20619,7 +20854,7 @@ function renderPlaceholder(lView, tNode) {
20619
20854
  const lContainer = lView[tNode.index];
20620
20855
  ngDevMode && assertLContainer(lContainer);
20621
20856
  const tDetails = getTDeferBlockDetails(tView, tNode);
20622
- renderDeferBlockState(1 /* DeferBlockInstanceState.PLACEHOLDER */, tNode, lContainer, tDetails.placeholderTmplIndex);
20857
+ renderDeferBlockState(DeferBlockState.Placeholder, tNode, lContainer);
20623
20858
  }
20624
20859
  /**
20625
20860
  * Subscribes to the "loading" Promise and renders corresponding defer sub-block,
@@ -20632,13 +20867,13 @@ function renderDeferStateAfterResourceLoading(tDetails, tNode, lContainer) {
20632
20867
  ngDevMode &&
20633
20868
  assertDefined(tDetails.loadingPromise, 'Expected loading Promise to exist on this defer block');
20634
20869
  tDetails.loadingPromise.then(() => {
20635
- if (tDetails.loadingState === 3 /* DeferDependenciesLoadingState.COMPLETE */) {
20870
+ if (tDetails.loadingState === DeferDependenciesLoadingState.COMPLETE) {
20636
20871
  ngDevMode && assertDeferredDependenciesLoaded(tDetails);
20637
20872
  // Everything is loaded, show the primary block content
20638
- renderDeferBlockState(3 /* DeferBlockInstanceState.COMPLETE */, tNode, lContainer, tDetails.primaryTmplIndex);
20873
+ renderDeferBlockState(DeferBlockState.Complete, tNode, lContainer);
20639
20874
  }
20640
- else if (tDetails.loadingState === 4 /* DeferDependenciesLoadingState.FAILED */) {
20641
- renderDeferBlockState(4 /* DeferBlockInstanceState.ERROR */, tNode, lContainer, tDetails.errorTmplIndex);
20875
+ else if (tDetails.loadingState === DeferDependenciesLoadingState.FAILED) {
20876
+ renderDeferBlockState(DeferBlockState.Error, tNode, lContainer);
20642
20877
  }
20643
20878
  });
20644
20879
  }
@@ -20662,26 +20897,26 @@ function triggerDeferBlock(lView, tNode) {
20662
20897
  const tDetails = getTDeferBlockDetails(tView, tNode);
20663
20898
  // Condition is triggered, try to render loading state and start downloading.
20664
20899
  // Note: if a block is in a loading, completed or an error state, this call would be a noop.
20665
- renderDeferBlockState(2 /* DeferBlockInstanceState.LOADING */, tNode, lContainer, tDetails.loadingTmplIndex);
20900
+ renderDeferBlockState(DeferBlockState.Loading, tNode, lContainer);
20666
20901
  switch (tDetails.loadingState) {
20667
- case 0 /* DeferDependenciesLoadingState.NOT_STARTED */:
20668
- case 1 /* DeferDependenciesLoadingState.SCHEDULED */:
20669
- triggerResourceLoading(tDetails, lView[TVIEW], lView);
20902
+ case DeferDependenciesLoadingState.NOT_STARTED:
20903
+ case DeferDependenciesLoadingState.SCHEDULED:
20904
+ triggerResourceLoading(tDetails, lView);
20670
20905
  // The `loadingState` might have changed to "loading".
20671
20906
  if (tDetails.loadingState ===
20672
- 2 /* DeferDependenciesLoadingState.IN_PROGRESS */) {
20907
+ DeferDependenciesLoadingState.IN_PROGRESS) {
20673
20908
  renderDeferStateAfterResourceLoading(tDetails, tNode, lContainer);
20674
20909
  }
20675
20910
  break;
20676
- case 2 /* DeferDependenciesLoadingState.IN_PROGRESS */:
20911
+ case DeferDependenciesLoadingState.IN_PROGRESS:
20677
20912
  renderDeferStateAfterResourceLoading(tDetails, tNode, lContainer);
20678
20913
  break;
20679
- case 3 /* DeferDependenciesLoadingState.COMPLETE */:
20914
+ case DeferDependenciesLoadingState.COMPLETE:
20680
20915
  ngDevMode && assertDeferredDependenciesLoaded(tDetails);
20681
- renderDeferBlockState(3 /* DeferBlockInstanceState.COMPLETE */, tNode, lContainer, tDetails.primaryTmplIndex);
20916
+ renderDeferBlockState(DeferBlockState.Complete, tNode, lContainer);
20682
20917
  break;
20683
- case 4 /* DeferDependenciesLoadingState.FAILED */:
20684
- renderDeferBlockState(4 /* DeferBlockInstanceState.ERROR */, tNode, lContainer, tDetails.errorTmplIndex);
20918
+ case DeferDependenciesLoadingState.FAILED:
20919
+ renderDeferBlockState(DeferBlockState.Error, tNode, lContainer);
20685
20920
  break;
20686
20921
  default:
20687
20922
  if (ngDevMode) {
@@ -20695,7 +20930,7 @@ function triggerDeferBlock(lView, tNode) {
20695
20930
  * block in completed state.
20696
20931
  */
20697
20932
  function assertDeferredDependenciesLoaded(tDetails) {
20698
- assertEqual(tDetails.loadingState, 3 /* DeferDependenciesLoadingState.COMPLETE */, 'Expecting all deferred dependencies to be loaded.');
20933
+ assertEqual(tDetails.loadingState, DeferDependenciesLoadingState.COMPLETE, 'Expecting all deferred dependencies to be loaded.');
20699
20934
  }
20700
20935
  /**
20701
20936
  * **INTERNAL**, avoid referencing it in application code.
@@ -20704,6 +20939,55 @@ function assertDeferredDependenciesLoaded(tDetails) {
20704
20939
  * implementation.
20705
20940
  */
20706
20941
  const DEFER_BLOCK_DEPENDENCY_INTERCEPTOR = new InjectionToken(ngDevMode ? 'DEFER_BLOCK_DEPENDENCY_INTERCEPTOR' : '');
20942
+ /**
20943
+ * Determines if a given value matches the expected structure of a defer block
20944
+ *
20945
+ * We can safely rely on the primaryTmplIndex because every defer block requires
20946
+ * that a primary template exists. All the other template options are optional.
20947
+ */
20948
+ function isTDeferBlockDetails(value) {
20949
+ return (typeof value === 'object') &&
20950
+ (typeof value.primaryTmplIndex === 'number');
20951
+ }
20952
+ /**
20953
+ * Internal token used for configuring defer block behavior.
20954
+ */
20955
+ const DEFER_BLOCK_CONFIG = new InjectionToken(ngDevMode ? 'DEFER_BLOCK_CONFIG' : '');
20956
+ /**
20957
+ * Retrieves all defer blocks in a given LView.
20958
+ *
20959
+ * @param lView lView with defer blocks
20960
+ * @param deferBlocks defer block aggregator array
20961
+ */
20962
+ function getDeferBlocks(lView, deferBlocks) {
20963
+ const tView = lView[TVIEW];
20964
+ for (let i = HEADER_OFFSET; i < tView.bindingStartIndex; i++) {
20965
+ if (isLContainer(lView[i])) {
20966
+ const lContainer = lView[i];
20967
+ // An LContainer may represent an instance of a defer block, in which case
20968
+ // we store it as a result. Otherwise, keep iterating over LContainer views and
20969
+ // look for defer blocks.
20970
+ const isLast = i === tView.bindingStartIndex - 1;
20971
+ if (!isLast) {
20972
+ const tNode = tView.data[i];
20973
+ const tDetails = getTDeferBlockDetails(tView, tNode);
20974
+ if (isTDeferBlockDetails(tDetails)) {
20975
+ deferBlocks.push({ lContainer, lView, tNode, tDetails });
20976
+ // This LContainer represents a defer block, so we exit
20977
+ // this iteration and don't inspect views in this LContainer.
20978
+ continue;
20979
+ }
20980
+ }
20981
+ for (let i = CONTAINER_HEADER_OFFSET; i < lContainer.length; i++) {
20982
+ getDeferBlocks(lContainer[i], deferBlocks);
20983
+ }
20984
+ }
20985
+ else if (isLView(lView[i])) {
20986
+ // This is a component, enter the `getDeferBlocks` recursively.
20987
+ getDeferBlocks(lView[i], deferBlocks);
20988
+ }
20989
+ }
20990
+ }
20707
20991
 
20708
20992
  function elementStartFirstCreatePass(index, tView, lView, name, attrsIndex, localRefsIndex) {
20709
20993
  ngDevMode && assertFirstCreatePass(tView);
@@ -25507,6 +25791,10 @@ function ɵɵsetNgModuleScope(type, scope) {
25507
25791
  ngModuleDef.declarations = convertToTypeArray(scope.declarations || EMPTY_ARRAY);
25508
25792
  ngModuleDef.imports = convertToTypeArray(scope.imports || EMPTY_ARRAY);
25509
25793
  ngModuleDef.exports = convertToTypeArray(scope.exports || EMPTY_ARRAY);
25794
+ if (scope.bootstrap) {
25795
+ // This only happens in local compilation mode.
25796
+ ngModuleDef.bootstrap = convertToTypeArray(scope.bootstrap);
25797
+ }
25510
25798
  depsTracker.registerNgModule(type, scope);
25511
25799
  });
25512
25800
  }
@@ -25514,11 +25802,12 @@ function convertToTypeArray(values) {
25514
25802
  if (typeof values === 'function') {
25515
25803
  return values;
25516
25804
  }
25517
- if (values.some(isForwardRef)) {
25518
- return () => values.map(resolveForwardRef).map(maybeUnwrapModuleWithProviders);
25805
+ const flattenValues = flatten(values);
25806
+ if (flattenValues.some(isForwardRef)) {
25807
+ return () => flattenValues.map(resolveForwardRef).map(maybeUnwrapModuleWithProviders);
25519
25808
  }
25520
25809
  else {
25521
- return values.map(maybeUnwrapModuleWithProviders);
25810
+ return flattenValues.map(maybeUnwrapModuleWithProviders);
25522
25811
  }
25523
25812
  }
25524
25813
  function maybeUnwrapModuleWithProviders(value) {
@@ -27244,7 +27533,13 @@ function ɵɵtemplateRefExtractor(tNode, lView) {
27244
27533
 
27245
27534
  function ɵɵgetComponentDepsFactory(type, rawImports) {
27246
27535
  return () => {
27247
- return depsTracker.getComponentDependencies(type, rawImports).dependencies;
27536
+ try {
27537
+ return depsTracker.getComponentDependencies(type, rawImports).dependencies;
27538
+ }
27539
+ catch (e) {
27540
+ console.error(`Computing dependencies in local compilation mode for the component "${type.name}" failed with the exception:`, e);
27541
+ throw e;
27542
+ }
27248
27543
  };
27249
27544
  }
27250
27545
 
@@ -32689,19 +32984,11 @@ class EffectHandle {
32689
32984
  this.effectFn = effectFn;
32690
32985
  this.creationZone = creationZone;
32691
32986
  this.errorHandler = errorHandler;
32692
- this.alive = true;
32693
32987
  this.watcher =
32694
32988
  watch((onCleanup) => this.runEffect(onCleanup), () => this.schedule(), allowSignalWrites);
32695
32989
  this.unregisterOnDestroy = destroyRef?.onDestroy(() => this.destroy());
32696
32990
  }
32697
32991
  runEffect(onCleanup) {
32698
- if (!this.alive) {
32699
- // Running a destroyed effect is a no-op.
32700
- return;
32701
- }
32702
- if (ngDevMode && isInNotificationPhase()) {
32703
- throw new Error(`Schedulers cannot synchronously execute effects while scheduling.`);
32704
- }
32705
32992
  try {
32706
32993
  this.effectFn(onCleanup);
32707
32994
  }
@@ -32713,17 +33000,13 @@ class EffectHandle {
32713
33000
  this.watcher.run();
32714
33001
  }
32715
33002
  schedule() {
32716
- if (!this.alive) {
32717
- return;
32718
- }
32719
33003
  this.scheduler.scheduleEffect(this);
32720
33004
  }
32721
33005
  notify() {
32722
33006
  this.watcher.notify();
32723
33007
  }
32724
33008
  destroy() {
32725
- this.alive = false;
32726
- this.watcher.cleanup();
33009
+ this.watcher.destroy();
32727
33010
  this.unregisterOnDestroy?.();
32728
33011
  // Note: if the effect is currently scheduled, it's not un-scheduled, and so the scheduler will
32729
33012
  // retain a reference to it. Attempting to execute it will be a no-op.
@@ -32935,5 +33218,5 @@ if (typeof ngDevMode !== 'undefined' && ngDevMode) {
32935
33218
  * Generated bundle index. Do not edit.
32936
33219
  */
32937
33220
 
32938
- export { ANIMATION_MODULE_TYPE, APP_BOOTSTRAP_LISTENER, APP_ID, APP_INITIALIZER, 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, 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, ComponentFactory$1 as ɵComponentFactory, Console as ɵConsole, DEFAULT_LOCALE_ID as ɵDEFAULT_LOCALE_ID, DEFER_BLOCK_DEPENDENCY_INTERCEPTOR as ɵDEFER_BLOCK_DEPENDENCY_INTERCEPTOR, ENABLED_SSR_FEATURES as ɵENABLED_SSR_FEATURES, EffectScheduler as ɵEffectScheduler, 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, 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, resetCompiledComponents as ɵresetCompiledComponents, resetJitOptions as ɵresetJitOptions, resolveComponentResources as ɵresolveComponentResources, restoreComponentResolutionQueue as ɵrestoreComponentResolutionQueue, setAllowDuplicateNgModuleIdsForTest as ɵsetAllowDuplicateNgModuleIdsForTest, setAlternateWeakRefImpl as ɵsetAlternateWeakRefImpl, 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, unregisterAllLocaleData as ɵunregisterLocaleData, unwrapSafeValue as ɵunwrapSafeValue, 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, ɵɵ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 };
33221
+ 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, 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, 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, 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, unregisterAllLocaleData as ɵunregisterLocaleData, unwrapSafeValue as ɵunwrapSafeValue, 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, ɵɵ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 };
32939
33222
  //# sourceMappingURL=core.mjs.map