@angular/core 20.0.0-next.2 → 20.0.0-next.4

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 (56) hide show
  1. package/event_dispatcher.d-pVP0-wST.d.ts +345 -0
  2. package/fesm2022/core.mjs +614 -428
  3. package/fesm2022/core.mjs.map +1 -1
  4. package/fesm2022/injector-BlLwZ2sr.mjs +24 -0
  5. package/fesm2022/injector-BlLwZ2sr.mjs.map +1 -0
  6. package/fesm2022/primitives/di.mjs +5 -18
  7. package/fesm2022/primitives/di.mjs.map +1 -1
  8. package/fesm2022/primitives/event-dispatch.mjs +1 -1
  9. package/fesm2022/primitives/signals.mjs +4 -589
  10. package/fesm2022/primitives/signals.mjs.map +1 -1
  11. package/fesm2022/rxjs-interop.mjs +1 -8
  12. package/fesm2022/rxjs-interop.mjs.map +1 -1
  13. package/fesm2022/testing.mjs +2 -10
  14. package/fesm2022/testing.mjs.map +1 -1
  15. package/fesm2022/untracked-DkcXpNb_.mjs +620 -0
  16. package/fesm2022/untracked-DkcXpNb_.mjs.map +1 -0
  17. package/index.d.ts +7589 -7510
  18. package/{navigation_types.d-u4EOrrdZ.d.ts → navigation_types.d-DgDrF5rp.d.ts} +2 -2
  19. package/package.json +2 -2
  20. package/primitives/di/index.d.ts +25 -10
  21. package/primitives/event-dispatch/index.d.ts +5 -340
  22. package/primitives/signals/index.d.ts +5 -208
  23. package/rxjs-interop/index.d.ts +1 -10
  24. package/schematics/bundles/{apply_import_manager-CyRT0UvU.js → apply_import_manager-CeNv8GIG.js} +6 -6
  25. package/schematics/bundles/{checker-DF8ZaFW5.js → checker-k591b6WQ.js} +856 -180
  26. package/schematics/bundles/cleanup-unused-imports.js +42 -69
  27. package/schematics/bundles/{compiler_host-Da636uJ8.js → compiler_host-DwM3ugW3.js} +2 -2
  28. package/schematics/bundles/control-flow-migration.js +34 -13
  29. package/schematics/bundles/imports-CIX-JgAN.js +1 -1
  30. package/schematics/bundles/{program-BZk27Ndu.js → index-B4OAlHh8.js} +2234 -2097
  31. package/schematics/bundles/{index-DnkWgagp.js → index-BhELUmYx.js} +11 -11
  32. package/schematics/bundles/inject-flags.js +18 -52
  33. package/schematics/bundles/inject-migration.js +3 -3
  34. package/schematics/bundles/leading_space-D9nQ8UQC.js +1 -1
  35. package/schematics/bundles/{migrate_ts_type_references-DtkOnnv0.js → migrate_ts_type_references-Be0TNYen.js} +20 -20
  36. package/schematics/bundles/ng_decorators-DznZ5jMl.js +1 -1
  37. package/schematics/bundles/nodes-B16H9JUd.js +1 -1
  38. package/schematics/bundles/output-migration.js +62 -90
  39. package/schematics/bundles/project_tsconfig_paths-CDVxT6Ov.js +1 -1
  40. package/schematics/bundles/property_name-BBwFuqMe.js +1 -1
  41. package/schematics/bundles/route-lazy-loading.js +3 -3
  42. package/schematics/bundles/{project_paths-Jtbi76Bs.js → run_in_devkit-CkvEksWP.js} +262 -197
  43. package/schematics/bundles/self-closing-tags-migration.js +41 -71
  44. package/schematics/bundles/signal-input-migration.js +69 -97
  45. package/schematics/bundles/signal-queries-migration.js +80 -108
  46. package/schematics/bundles/signals.js +11 -11
  47. package/schematics/bundles/standalone-migration.js +8 -22
  48. package/schematics/bundles/symbol-VPWguRxr.js +25 -0
  49. package/schematics/bundles/test-bed-get.js +98 -0
  50. package/schematics/migrations.json +5 -0
  51. package/testing/index.d.ts +2 -4
  52. package/weak_ref.d-BZ7gyRag.d.ts +216 -0
  53. package/fesm2022/weak_ref-DrMdAIDh.mjs +0 -12
  54. package/fesm2022/weak_ref-DrMdAIDh.mjs.map +0 -1
  55. package/schematics/bundles/index-vGJcp5M7.js +0 -30
  56. package/weak_ref.d-ttyj86RV.d.ts +0 -9
package/fesm2022/core.mjs CHANGED
@@ -1,17 +1,16 @@
1
1
  /**
2
- * @license Angular v20.0.0-next.2
2
+ * @license Angular v20.0.0-next.4
3
3
  * (c) 2010-2025 Google LLC. https://angular.io/
4
4
  * License: MIT
5
5
  */
6
6
 
7
- import { SIGNAL_NODE, signalSetFn, SIGNAL, producerAccessed, getActiveConsumer, setActiveConsumer, createSignal, signalUpdateFn, consumerDestroy, REACTIVE_NODE, consumerPollProducersForChange, consumerBeforeComputation, consumerAfterComputation, createComputed, setThrowInvalidWriteToSignalError, isInNotificationPhase, createLinkedSignal, linkedSignalSetFn, linkedSignalUpdateFn } from '@angular/core/primitives/signals';
8
- export { SIGNAL as ɵSIGNAL } from '@angular/core/primitives/signals';
9
- import { getCurrentInjector, setCurrentInjector } from '@angular/core/primitives/di';
10
- export { setCurrentInjector as ɵsetCurrentInjector } from '@angular/core/primitives/di';
7
+ import { x as SIGNAL_NODE, B as signalSetFn, S as SIGNAL, p as producerAccessed, k as getActiveConsumer, v as setActiveConsumer$1, y as createSignal, C as signalUpdateFn, a as consumerDestroy, R as REACTIVE_NODE, b as consumerPollProducersForChange, d as consumerBeforeComputation, e as consumerAfterComputation, f as createComputed, s as setThrowInvalidWriteToSignalError, E as untracked$1, i as isInNotificationPhase, g as createLinkedSignal, l as linkedSignalSetFn, h as linkedSignalUpdateFn } from './untracked-DkcXpNb_.mjs';
8
+ export { D as ɵsetAlternateWeakRefImpl } from './untracked-DkcXpNb_.mjs';
9
+ import { g as getCurrentInjector, s as setCurrentInjector } from './injector-BlLwZ2sr.mjs';
10
+ import { setActiveConsumer } from '@angular/core/primitives/signals';
11
11
  import { Subject, BehaviorSubject, Subscription } from 'rxjs';
12
- import { Attribute as Attribute$1, clearAppScopedEarlyEventContract, EventContract, EventContractContainer, getAppScopedQueuedEventInfos, EventDispatcher, registerDispatcher, EventPhase, isEarlyEventType, isCaptureEventType } from '@angular/core/primitives/event-dispatch';
12
+ import { Attribute as Attribute$1, clearAppScopedEarlyEventContract, EventContract, EventContractContainer, getAppScopedQueuedEventInfos, EventDispatcher, registerDispatcher, EventPhase, isEarlyEventType, isCaptureEventType } from './primitives/event-dispatch.mjs';
13
13
  import { map } from 'rxjs/operators';
14
- export { s as ɵsetAlternateWeakRefImpl } from './weak_ref-DrMdAIDh.mjs';
15
14
 
16
15
  /**
17
16
  * Base URL for the error details page.
@@ -99,7 +98,12 @@ function createInputSignal(initialValue, options) {
99
98
  // Record that someone looked at this signal.
100
99
  producerAccessed(node);
101
100
  if (node.value === REQUIRED_UNSET_VALUE) {
102
- throw new RuntimeError(-950 /* RuntimeErrorCode.REQUIRED_INPUT_NO_VALUE */, ngDevMode && 'Input is required but no value is available yet.');
101
+ let message = null;
102
+ if (ngDevMode) {
103
+ const name = options?.debugName ?? options?.alias;
104
+ message = `Input${name ? ` "${name}"` : ''} is required but no value is available yet.`;
105
+ }
106
+ throw new RuntimeError(-950 /* RuntimeErrorCode.REQUIRED_INPUT_NO_VALUE */, message);
103
107
  }
104
108
  return node.value;
105
109
  }
@@ -506,6 +510,11 @@ function assertGreaterThanOrEqual(actual, expected, msg) {
506
510
  throwError(msg, actual, expected, '>=');
507
511
  }
508
512
  }
513
+ function assertNotDefined(actual, msg) {
514
+ if (actual != null) {
515
+ throwError(msg, actual, null, '==');
516
+ }
517
+ }
509
518
  function assertDefined(actual, msg) {
510
519
  if (actual == null) {
511
520
  throwError(msg, actual, null, '!=');
@@ -4188,12 +4197,12 @@ function callHooks(currentView, arr, initPhase, currentNodeIndex) {
4188
4197
  */
4189
4198
  function callHookInternal(directive, hook) {
4190
4199
  profiler(4 /* ProfilerEvent.LifecycleHookStart */, directive, hook);
4191
- const prevConsumer = setActiveConsumer(null);
4200
+ const prevConsumer = setActiveConsumer$1(null);
4192
4201
  try {
4193
4202
  hook.call(directive);
4194
4203
  }
4195
4204
  finally {
4196
- setActiveConsumer(prevConsumer);
4205
+ setActiveConsumer$1(prevConsumer);
4197
4206
  profiler(5 /* ProfilerEvent.LifecycleHookEnd */, directive, hook);
4198
4207
  }
4199
4208
  }
@@ -6047,7 +6056,7 @@ class OutputEmitterRef {
6047
6056
  if (this.listeners === null) {
6048
6057
  return;
6049
6058
  }
6050
- const previousConsumer = setActiveConsumer(null);
6059
+ const previousConsumer = setActiveConsumer$1(null);
6051
6060
  try {
6052
6061
  for (const listenerFn of this.listeners) {
6053
6062
  try {
@@ -6059,7 +6068,7 @@ class OutputEmitterRef {
6059
6068
  }
6060
6069
  }
6061
6070
  finally {
6062
- setActiveConsumer(previousConsumer);
6071
+ setActiveConsumer$1(previousConsumer);
6063
6072
  }
6064
6073
  }
6065
6074
  }
@@ -6263,11 +6272,8 @@ function ɵunwrapWritableSignal(value) {
6263
6272
  * Create a `Signal` that can be set or updated directly.
6264
6273
  */
6265
6274
  function signal(initialValue, options) {
6266
- const signalFn = createSignal(initialValue);
6275
+ const signalFn = createSignal(initialValue, options?.equal);
6267
6276
  const node = signalFn[SIGNAL];
6268
- if (options?.equal) {
6269
- node.equal = options.equal;
6270
- }
6271
6277
  signalFn.set = (newValue) => signalSetFn(node, newValue);
6272
6278
  signalFn.update = (updateFn) => signalUpdateFn(node, updateFn);
6273
6279
  signalFn.asReadonly = signalAsReadonlyFn.bind(signalFn);
@@ -7300,7 +7306,7 @@ function sortListeners(a, b) {
7300
7306
  function isDirectiveDefHack(obj) {
7301
7307
  return (obj.type !== undefined &&
7302
7308
  obj.declaredInputs !== undefined &&
7303
- obj.findHostDirectiveDefs !== undefined);
7309
+ obj.resolveHostDirectives !== undefined);
7304
7310
  }
7305
7311
  /** Asserts that a value is a DOM Element. */
7306
7312
  function assertDomElement(value) {
@@ -7950,12 +7956,12 @@ class EventEmitter_ extends Subject {
7950
7956
  }
7951
7957
  }
7952
7958
  emit(value) {
7953
- const prevConsumer = setActiveConsumer(null);
7959
+ const prevConsumer = setActiveConsumer$1(null);
7954
7960
  try {
7955
7961
  super.next(value);
7956
7962
  }
7957
7963
  finally {
7958
- setActiveConsumer(prevConsumer);
7964
+ setActiveConsumer$1(prevConsumer);
7959
7965
  }
7960
7966
  }
7961
7967
  subscribe(observerOrNext, error, complete) {
@@ -9947,12 +9953,62 @@ function processBlockData(injector) {
9947
9953
  }
9948
9954
  return blockDetails;
9949
9955
  }
9956
+ function isSsrContentsIntegrity(node) {
9957
+ return (!!node &&
9958
+ node.nodeType === Node.COMMENT_NODE &&
9959
+ node.textContent?.trim() === SSR_CONTENT_INTEGRITY_MARKER);
9960
+ }
9961
+ function skipTextNodes(node) {
9962
+ // Ignore whitespace. Before the <body>, we shouldn't find text nodes that aren't whitespace.
9963
+ while (node && node.nodeType === Node.TEXT_NODE) {
9964
+ node = node.previousSibling;
9965
+ }
9966
+ return node;
9967
+ }
9968
+ /**
9969
+ * Verifies whether the DOM contains a special marker added during SSR time to make sure
9970
+ * there is no SSR'ed contents transformations happen after SSR is completed. Typically that
9971
+ * happens either by CDN or during the build process as an optimization to remove comment nodes.
9972
+ * Hydration process requires comment nodes produced by Angular to locate correct DOM segments.
9973
+ * When this special marker is *not* present - throw an error and do not proceed with hydration,
9974
+ * since it will not be able to function correctly.
9975
+ *
9976
+ * Note: this function is invoked only on the client, so it's safe to use DOM APIs.
9977
+ */
9978
+ function verifySsrContentsIntegrity(doc) {
9979
+ for (const node of doc.body.childNodes) {
9980
+ if (isSsrContentsIntegrity(node)) {
9981
+ return;
9982
+ }
9983
+ }
9984
+ // Check if the HTML parser may have moved the marker to just before the <body> tag,
9985
+ // e.g. because the body tag was implicit and not present in the markup. An implicit body
9986
+ // tag is unlikely to interfer with whitespace/comments inside of the app's root element.
9987
+ // Case 1: Implicit body. Example:
9988
+ // <!doctype html><head><title>Hi</title></head><!--nghm--><app-root></app-root>
9989
+ const beforeBody = skipTextNodes(doc.body.previousSibling);
9990
+ if (isSsrContentsIntegrity(beforeBody)) {
9991
+ return;
9992
+ }
9993
+ // Case 2: Implicit body & head. Example:
9994
+ // <!doctype html><head><title>Hi</title><!--nghm--><app-root></app-root>
9995
+ let endOfHead = skipTextNodes(doc.head.lastChild);
9996
+ if (isSsrContentsIntegrity(endOfHead)) {
9997
+ return;
9998
+ }
9999
+ throw new RuntimeError(-507 /* RuntimeErrorCode.MISSING_SSR_CONTENT_INTEGRITY_MARKER */, typeof ngDevMode !== 'undefined' &&
10000
+ ngDevMode &&
10001
+ 'Angular hydration logic detected that HTML content of this page was modified after it ' +
10002
+ 'was produced during server side rendering. Make sure that there are no optimizations ' +
10003
+ 'that remove comment nodes from HTML enabled on your CDN. Angular hydration ' +
10004
+ 'relies on HTML produced by the server, including whitespaces and comment nodes.');
10005
+ }
9950
10006
 
9951
10007
  /** Refreshes all content queries declared by directives in a given view */
9952
10008
  function refreshContentQueries(tView, lView) {
9953
10009
  const contentQueries = tView.contentQueries;
9954
10010
  if (contentQueries !== null) {
9955
- const prevConsumer = setActiveConsumer(null);
10011
+ const prevConsumer = setActiveConsumer$1(null);
9956
10012
  try {
9957
10013
  for (let i = 0; i < contentQueries.length; i += 2) {
9958
10014
  const queryStartIdx = contentQueries[i];
@@ -9968,24 +10024,24 @@ function refreshContentQueries(tView, lView) {
9968
10024
  }
9969
10025
  }
9970
10026
  finally {
9971
- setActiveConsumer(prevConsumer);
10027
+ setActiveConsumer$1(prevConsumer);
9972
10028
  }
9973
10029
  }
9974
10030
  }
9975
10031
  function executeViewQueryFn(flags, viewQueryFn, component) {
9976
10032
  ngDevMode && assertDefined(viewQueryFn, 'View queries function to execute must be defined.');
9977
10033
  setCurrentQueryIndex(0);
9978
- const prevConsumer = setActiveConsumer(null);
10034
+ const prevConsumer = setActiveConsumer$1(null);
9979
10035
  try {
9980
10036
  viewQueryFn(flags, component);
9981
10037
  }
9982
10038
  finally {
9983
- setActiveConsumer(prevConsumer);
10039
+ setActiveConsumer$1(prevConsumer);
9984
10040
  }
9985
10041
  }
9986
10042
  function executeContentQueries(tView, tNode, lView) {
9987
10043
  if (isContentQueryHost(tNode)) {
9988
- const prevConsumer = setActiveConsumer(null);
10044
+ const prevConsumer = setActiveConsumer$1(null);
9989
10045
  try {
9990
10046
  const start = tNode.directiveStart;
9991
10047
  const end = tNode.directiveEnd;
@@ -10000,7 +10056,7 @@ function executeContentQueries(tView, tNode, lView) {
10000
10056
  }
10001
10057
  }
10002
10058
  finally {
10003
- setActiveConsumer(prevConsumer);
10059
+ setActiveConsumer$1(prevConsumer);
10004
10060
  }
10005
10061
  }
10006
10062
  }
@@ -12241,7 +12297,7 @@ var InputFlags;
12241
12297
  })(InputFlags || (InputFlags = {}));
12242
12298
 
12243
12299
  function writeToDirectiveInput(def, instance, publicName, value) {
12244
- const prevConsumer = setActiveConsumer(null);
12300
+ const prevConsumer = setActiveConsumer$1(null);
12245
12301
  try {
12246
12302
  if (ngDevMode) {
12247
12303
  if (!def.inputs.hasOwnProperty(publicName)) {
@@ -12281,7 +12337,7 @@ function writeToDirectiveInput(def, instance, publicName, value) {
12281
12337
  }
12282
12338
  }
12283
12339
  finally {
12284
- setActiveConsumer(prevConsumer);
12340
+ setActiveConsumer$1(prevConsumer);
12285
12341
  }
12286
12342
  }
12287
12343
 
@@ -12704,17 +12760,6 @@ function handleUncaughtError(lView, error) {
12704
12760
  const errorHandler = injector.get(INTERNAL_APPLICATION_ERROR_HANDLER, null);
12705
12761
  errorHandler?.(error);
12706
12762
  }
12707
- /**
12708
- * Handles an error thrown in an LView.
12709
- * @deprecated Use handleUncaughtError to report to application error handler
12710
- */
12711
- function handleError(lView, error) {
12712
- const injector = lView[INJECTOR];
12713
- if (!injector) {
12714
- return;
12715
- }
12716
- injector.get(ErrorHandler, null)?.handleError(error);
12717
- }
12718
12763
  /**
12719
12764
  * Set all directive inputs with the specific public name on the node.
12720
12765
  *
@@ -12919,7 +12964,7 @@ function renderChildComponents(hostLView, components) {
12919
12964
  }
12920
12965
 
12921
12966
  function createAndRenderEmbeddedLView(declarationLView, templateTNode, context, options) {
12922
- const prevConsumer = setActiveConsumer(null);
12967
+ const prevConsumer = setActiveConsumer$1(null);
12923
12968
  try {
12924
12969
  const embeddedTView = templateTNode.tView;
12925
12970
  ngDevMode && assertDefined(embeddedTView, 'TView must be defined for a template node.');
@@ -12940,7 +12985,7 @@ function createAndRenderEmbeddedLView(declarationLView, templateTNode, context,
12940
12985
  return embeddedLView;
12941
12986
  }
12942
12987
  finally {
12943
- setActiveConsumer(prevConsumer);
12988
+ setActiveConsumer$1(prevConsumer);
12944
12989
  }
12945
12990
  }
12946
12991
  /**
@@ -13184,7 +13229,7 @@ function cleanUpView(tView, lView) {
13184
13229
  if (isDestroyed(lView)) {
13185
13230
  return;
13186
13231
  }
13187
- const prevConsumer = setActiveConsumer(null);
13232
+ const prevConsumer = setActiveConsumer$1(null);
13188
13233
  try {
13189
13234
  // Usually the Attached flag is removed when the view is detached from its parent, however
13190
13235
  // if it's a root view, the flag won't be unset hence why we're also removing on destroy.
@@ -13219,7 +13264,7 @@ function cleanUpView(tView, lView) {
13219
13264
  unregisterLView(lView);
13220
13265
  }
13221
13266
  finally {
13222
- setActiveConsumer(prevConsumer);
13267
+ setActiveConsumer$1(prevConsumer);
13223
13268
  }
13224
13269
  }
13225
13270
  /** Removes listeners and unsubscribes from output subscriptions */
@@ -16762,6 +16807,17 @@ function locateDehydratedViewsInContainer(currentRNode, serializedViews) {
16762
16807
  * Returns `null` by default, when hydration is not enabled.
16763
16808
  */
16764
16809
  let _findMatchingDehydratedViewImpl = () => null;
16810
+ /**
16811
+ * Reference to a function that searches for a matching dehydrated view
16812
+ * stored on a control flow lContainer and removes the dehydrated content
16813
+ * once found.
16814
+ * Returns `null` by default, when hydration is not enabled.
16815
+ */
16816
+ let _findAndReconcileMatchingDehydratedViewsImpl = () => null;
16817
+ function enableFindMatchingDehydratedViewImpl() {
16818
+ _findMatchingDehydratedViewImpl = findMatchingDehydratedViewImpl;
16819
+ _findAndReconcileMatchingDehydratedViewsImpl = findAndReconcileMatchingDehydratedViewsImpl;
16820
+ }
16765
16821
  /**
16766
16822
  * Retrieves the next dehydrated view from the LContainer and verifies that
16767
16823
  * it matches a given template id (from the TView that was used to create this
@@ -16772,17 +16828,8 @@ let _findMatchingDehydratedViewImpl = () => null;
16772
16828
  * in this container.
16773
16829
  */
16774
16830
  function findMatchingDehydratedViewImpl(lContainer, template) {
16775
- const views = lContainer[DEHYDRATED_VIEWS];
16776
- if (!template || views === null || views.length === 0) {
16777
- return null;
16778
- }
16779
- const view = views[0];
16780
- // Verify whether the first dehydrated view in the container matches
16781
- // the template id passed to this function (that originated from a TView
16782
- // that was used to create an instance of an embedded or component views.
16783
- if (view.data[TEMPLATE_ID] === template) {
16784
- // If the template id matches - extract the first view and return it.
16785
- return views.shift();
16831
+ if (hasMatchingDehydratedView(lContainer, template)) {
16832
+ return lContainer[DEHYDRATED_VIEWS].shift();
16786
16833
  }
16787
16834
  else {
16788
16835
  // Otherwise, we are at the state when reconciliation can not be completed,
@@ -16793,12 +16840,84 @@ function findMatchingDehydratedViewImpl(lContainer, template) {
16793
16840
  return null;
16794
16841
  }
16795
16842
  }
16796
- function enableFindMatchingDehydratedViewImpl() {
16797
- _findMatchingDehydratedViewImpl = findMatchingDehydratedViewImpl;
16798
- }
16799
16843
  function findMatchingDehydratedView(lContainer, template) {
16800
16844
  return _findMatchingDehydratedViewImpl(lContainer, template);
16801
16845
  }
16846
+ function findAndReconcileMatchingDehydratedViewsImpl(lContainer, templateTNode, hostLView) {
16847
+ if (templateTNode.tView.ssrId === null)
16848
+ return null;
16849
+ const dehydratedView = findMatchingDehydratedView(lContainer, templateTNode.tView.ssrId);
16850
+ // we know that an ssrId was generated, but we were unable to match it to
16851
+ // a dehydrated view, which means that we may have changed branches
16852
+ // between server and client. We'll need to find and remove those
16853
+ // stale dehydrated views.
16854
+ if (hostLView[TVIEW].firstUpdatePass && dehydratedView === null) {
16855
+ removeStaleDehydratedBranch(hostLView, templateTNode);
16856
+ }
16857
+ return dehydratedView;
16858
+ }
16859
+ function findAndReconcileMatchingDehydratedViews(lContainer, templateTNode, hostLView) {
16860
+ return _findAndReconcileMatchingDehydratedViewsImpl(lContainer, templateTNode, hostLView);
16861
+ }
16862
+ /**
16863
+ * In the case that we have control flow that changes branches between server and
16864
+ * client, we're left with dehydrated content that will not be used. We need to find
16865
+ * it and clean it up at the right time so that we don't see duplicate content for
16866
+ * a few moments before the application reaches stability. This navigates the
16867
+ * control flow containers by looking at the TNodeFlags to find the matching
16868
+ * dehydrated content for the branch that is now stale from the server and removes it.
16869
+ */
16870
+ function removeStaleDehydratedBranch(hostLView, tNode) {
16871
+ let currentTNode = tNode;
16872
+ while (currentTNode) {
16873
+ // We can return here if we've found the dehydrated view and cleaned it up.
16874
+ // Otherwise we continue on until we either find it or reach the start of
16875
+ // the control flow.
16876
+ if (cleanupMatchingDehydratedViews(hostLView, currentTNode))
16877
+ return;
16878
+ if ((currentTNode.flags & 256 /* TNodeFlags.isControlFlowStart */) === 256 /* TNodeFlags.isControlFlowStart */) {
16879
+ // we've hit the top of the control flow loop
16880
+ break;
16881
+ }
16882
+ currentTNode = currentTNode.prev;
16883
+ }
16884
+ currentTNode = tNode.next; // jump to place we started so we can navigate down from there
16885
+ while (currentTNode) {
16886
+ if ((currentTNode.flags & 512 /* TNodeFlags.isInControlFlow */) !== 512 /* TNodeFlags.isInControlFlow */) {
16887
+ // we've exited control flow and need to exit the loop.
16888
+ break;
16889
+ }
16890
+ // Similar to above, we can return here if we've found the dehydrated view
16891
+ // and cleaned it up. Otherwise we continue on until we either find it or
16892
+ // reach the end of the control flow.
16893
+ if (cleanupMatchingDehydratedViews(hostLView, currentTNode))
16894
+ return;
16895
+ currentTNode = currentTNode.next;
16896
+ }
16897
+ }
16898
+ function hasMatchingDehydratedView(lContainer, template) {
16899
+ const views = lContainer[DEHYDRATED_VIEWS];
16900
+ if (!template || views === null || views.length === 0) {
16901
+ return false;
16902
+ }
16903
+ // Verify whether the first dehydrated view in the container matches
16904
+ // the template id passed to this function (that originated from a TView
16905
+ // that was used to create an instance of an embedded or component views.
16906
+ return views[0].data[TEMPLATE_ID] === template;
16907
+ }
16908
+ function cleanupMatchingDehydratedViews(hostLView, currentTNode) {
16909
+ const ssrId = currentTNode.tView?.ssrId;
16910
+ if (ssrId == null /* check both `null` and `undefined` */)
16911
+ return false;
16912
+ const container = hostLView[currentTNode.index];
16913
+ // if we can find the dehydrated view in this container, we know we've found the stale view
16914
+ // and we can remove it.
16915
+ if (isLContainer(container) && hasMatchingDehydratedView(container, ssrId)) {
16916
+ removeDehydratedViews(container);
16917
+ return true;
16918
+ }
16919
+ return false;
16920
+ }
16802
16921
 
16803
16922
  /**
16804
16923
  * Represents a component created by a `ComponentFactory`.
@@ -17283,15 +17402,15 @@ function resolveDirectives(tView, lView, tNode, localRefs, directiveMatcher) {
17283
17402
  const exportsMap = localRefs === null ? null : { '': -1 };
17284
17403
  const matchedDirectiveDefs = directiveMatcher(tView, tNode);
17285
17404
  if (matchedDirectiveDefs !== null) {
17286
- let directiveDefs;
17405
+ let directiveDefs = matchedDirectiveDefs;
17287
17406
  let hostDirectiveDefs = null;
17288
17407
  let hostDirectiveRanges = null;
17289
- const hostDirectiveResolution = resolveHostDirectives(matchedDirectiveDefs);
17290
- if (hostDirectiveResolution === null) {
17291
- directiveDefs = matchedDirectiveDefs;
17292
- }
17293
- else {
17294
- [directiveDefs, hostDirectiveDefs, hostDirectiveRanges] = hostDirectiveResolution;
17408
+ for (const def of matchedDirectiveDefs) {
17409
+ if (def.resolveHostDirectives !== null) {
17410
+ [directiveDefs, hostDirectiveDefs, hostDirectiveRanges] =
17411
+ def.resolveHostDirectives(matchedDirectiveDefs);
17412
+ break;
17413
+ }
17295
17414
  }
17296
17415
  ngDevMode && assertNoDuplicateDirectives(directiveDefs);
17297
17416
  initializeDirectives(tView, lView, tNode, directiveDefs, exportsMap, hostDirectiveDefs, hostDirectiveRanges);
@@ -17313,67 +17432,6 @@ function cacheMatchingLocalNames(tNode, localRefs, exportsMap) {
17313
17432
  localNames.push(localRefs[i], index);
17314
17433
  }
17315
17434
  }
17316
- function resolveHostDirectives(matches) {
17317
- let componentDef = null;
17318
- let hasHostDirectives = false;
17319
- // Having host directives is the less common scenario. Make an initial
17320
- // validation pass so we don't allocate memory unnecessarily.
17321
- for (let i = 0; i < matches.length; i++) {
17322
- const def = matches[i];
17323
- // Given that we may need this further down, we can resolve it already while validating.
17324
- if (i === 0 && isComponentDef(def)) {
17325
- componentDef = def;
17326
- }
17327
- if (def.findHostDirectiveDefs !== null) {
17328
- hasHostDirectives = true;
17329
- break;
17330
- }
17331
- }
17332
- // If there's at least one def with host directive, we can't bail out of this function.
17333
- if (!hasHostDirectives) {
17334
- return null;
17335
- }
17336
- const allDirectiveDefs = [];
17337
- let hostDirectiveDefs = null;
17338
- let hostDirectiveRanges = null;
17339
- // Components are inserted at the front of the matches array so that their lifecycle
17340
- // hooks run before any directive lifecycle hooks. This appears to be for ViewEngine
17341
- // compatibility. This logic doesn't make sense with host directives, because it
17342
- // would allow the host directives to undo any overrides the host may have made.
17343
- // To handle this case, the host directives of components are inserted at the beginning
17344
- // of the array, followed by the component. As such, the insertion order is as follows:
17345
- // 1. Host directives belonging to the selector-matched component.
17346
- // 2. Selector-matched component.
17347
- // 3. Host directives belonging to selector-matched directives.
17348
- // 4. Selector-matched dir
17349
- for (const def of matches) {
17350
- if (def.findHostDirectiveDefs !== null) {
17351
- hostDirectiveDefs ??= new Map();
17352
- hostDirectiveRanges ??= new Map();
17353
- resolveHostDirectivesForDef(def, allDirectiveDefs, hostDirectiveRanges, hostDirectiveDefs);
17354
- }
17355
- // Component definition needs to be pushed early to maintain the correct ordering.
17356
- if (def === componentDef) {
17357
- allDirectiveDefs.push(def);
17358
- }
17359
- }
17360
- if (componentDef === null) {
17361
- allDirectiveDefs.push(...matches);
17362
- }
17363
- else {
17364
- allDirectiveDefs.push(...matches.slice(1));
17365
- }
17366
- return [allDirectiveDefs, hostDirectiveDefs, hostDirectiveRanges];
17367
- }
17368
- function resolveHostDirectivesForDef(def, allDirectiveDefs, hostDirectiveRanges, hostDirectiveDefs) {
17369
- ngDevMode && assertDefined(def.findHostDirectiveDefs, 'Expected host directive resolve function');
17370
- const start = allDirectiveDefs.length;
17371
- // TODO(pk): probably could return matches instead of taking in an array to fill in?
17372
- def.findHostDirectiveDefs(def, allDirectiveDefs, hostDirectiveDefs);
17373
- // Note that these indexes are within the offset by `directiveStart`. We can't do the
17374
- // offsetting here, because `directiveStart` hasn't been initialized on the TNode yet.
17375
- hostDirectiveRanges.set(def, [start, allDirectiveDefs.length - 1]);
17376
- }
17377
17435
  /**
17378
17436
  * Marks a given TNode as a component's host. This consists of:
17379
17437
  * - setting the component offset on the TNode.
@@ -17887,213 +17945,6 @@ function bindingUpdated4(lView, bindingIndex, exp1, exp2, exp3, exp4) {
17887
17945
  return bindingUpdated2(lView, bindingIndex + 2, exp3, exp4) || different;
17888
17946
  }
17889
17947
 
17890
- /**
17891
- * Contains a reference to a function that disables event replay feature
17892
- * for server-side rendered applications. This function is overridden with
17893
- * an actual implementation when the event replay feature is enabled via
17894
- * `withEventReplay()` call.
17895
- */
17896
- let stashEventListener = (el, eventName, listenerFn) => { };
17897
- function setStashFn(fn) {
17898
- stashEventListener = fn;
17899
- }
17900
- /**
17901
- * Adds an event listener to the current node.
17902
- *
17903
- * If an output exists on one of the node's directives, it also subscribes to the output
17904
- * and saves the subscription for later cleanup.
17905
- *
17906
- * @param eventName Name of the event
17907
- * @param listenerFn The function to be called when event emits
17908
- * @param useCapture Whether or not to use capture in event listener - this argument is a reminder
17909
- * from the Renderer3 infrastructure and should be removed from the instruction arguments
17910
- * @param eventTargetResolver Function that returns global target information in case this listener
17911
- * should be attached to a global object like window, document or body
17912
- *
17913
- * @codeGenApi
17914
- */
17915
- function ɵɵlistener(eventName, listenerFn, useCapture, eventTargetResolver) {
17916
- const lView = getLView();
17917
- const tView = getTView();
17918
- const tNode = getCurrentTNode();
17919
- listenerInternal(tView, lView, lView[RENDERER], tNode, eventName, listenerFn, eventTargetResolver);
17920
- return ɵɵlistener;
17921
- }
17922
- /**
17923
- * Registers a synthetic host listener (e.g. `(@foo.start)`) on a component or directive.
17924
- *
17925
- * This instruction is for compatibility purposes and is designed to ensure that a
17926
- * synthetic host listener (e.g. `@HostListener('@foo.start')`) properly gets rendered
17927
- * in the component's renderer. Normally all host listeners are evaluated with the
17928
- * parent component's renderer, but, in the case of animation @triggers, they need
17929
- * to be evaluated with the sub component's renderer (because that's where the
17930
- * animation triggers are defined).
17931
- *
17932
- * Do not use this instruction as a replacement for `listener`. This instruction
17933
- * only exists to ensure compatibility with the ViewEngine's host binding behavior.
17934
- *
17935
- * @param eventName Name of the event
17936
- * @param listenerFn The function to be called when event emits
17937
- * @param useCapture Whether or not to use capture in event listener
17938
- * @param eventTargetResolver Function that returns global target information in case this listener
17939
- * should be attached to a global object like window, document or body
17940
- *
17941
- * @codeGenApi
17942
- */
17943
- function ɵɵsyntheticHostListener(eventName, listenerFn) {
17944
- const tNode = getCurrentTNode();
17945
- const lView = getLView();
17946
- const tView = getTView();
17947
- const currentDef = getCurrentDirectiveDef(tView.data);
17948
- const renderer = loadComponentRenderer(currentDef, tNode, lView);
17949
- listenerInternal(tView, lView, renderer, tNode, eventName, listenerFn);
17950
- return ɵɵsyntheticHostListener;
17951
- }
17952
- /**
17953
- * A utility function that checks if a given element has already an event handler registered for an
17954
- * event with a specified name. The TView.cleanup data structure is used to find out which events
17955
- * are registered for a given element.
17956
- */
17957
- function findExistingListener(tView, lView, eventName, tNodeIdx) {
17958
- const tCleanup = tView.cleanup;
17959
- if (tCleanup != null) {
17960
- for (let i = 0; i < tCleanup.length - 1; i += 2) {
17961
- const cleanupEventName = tCleanup[i];
17962
- if (cleanupEventName === eventName && tCleanup[i + 1] === tNodeIdx) {
17963
- // We have found a matching event name on the same node but it might not have been
17964
- // registered yet, so we must explicitly verify entries in the LView cleanup data
17965
- // structures.
17966
- const lCleanup = lView[CLEANUP];
17967
- const listenerIdxInLCleanup = tCleanup[i + 2];
17968
- return lCleanup.length > listenerIdxInLCleanup ? lCleanup[listenerIdxInLCleanup] : null;
17969
- }
17970
- // TView.cleanup can have a mix of 4-elements entries (for event handler cleanups) or
17971
- // 2-element entries (for directive and queries destroy hooks). As such we can encounter
17972
- // blocks of 4 or 2 items in the tView.cleanup and this is why we iterate over 2 elements
17973
- // first and jump another 2 elements if we detect listeners cleanup (4 elements). Also check
17974
- // documentation of TView.cleanup for more details of this data structure layout.
17975
- if (typeof cleanupEventName === 'string') {
17976
- i += 2;
17977
- }
17978
- }
17979
- }
17980
- return null;
17981
- }
17982
- function listenerInternal(tView, lView, renderer, tNode, eventName, listenerFn, eventTargetResolver) {
17983
- const isTNodeDirectiveHost = isDirectiveHost(tNode);
17984
- const firstCreatePass = tView.firstCreatePass;
17985
- const tCleanup = firstCreatePass ? getOrCreateTViewCleanup(tView) : null;
17986
- const context = lView[CONTEXT];
17987
- // When the ɵɵlistener instruction was generated and is executed we know that there is either a
17988
- // native listener or a directive output on this element. As such we we know that we will have to
17989
- // register a listener and store its cleanup function on LView.
17990
- const lCleanup = getOrCreateLViewCleanup(lView);
17991
- ngDevMode && assertTNodeType(tNode, 3 /* TNodeType.AnyRNode */ | 12 /* TNodeType.AnyContainer */);
17992
- let processOutputs = true;
17993
- // Adding a native event listener is applicable when:
17994
- // - The corresponding TNode represents a DOM element.
17995
- // - The event target has a resolver (usually resulting in a global object,
17996
- // such as `window` or `document`).
17997
- if (tNode.type & 3 /* TNodeType.AnyRNode */ || eventTargetResolver) {
17998
- const native = getNativeByTNode(tNode, lView);
17999
- const target = eventTargetResolver ? eventTargetResolver(native) : native;
18000
- const lCleanupIndex = lCleanup.length;
18001
- const idxOrTargetGetter = eventTargetResolver
18002
- ? (_lView) => eventTargetResolver(unwrapRNode(_lView[tNode.index]))
18003
- : tNode.index;
18004
- // In order to match current behavior, native DOM event listeners must be added for all
18005
- // events (including outputs).
18006
- // There might be cases where multiple directives on the same element try to register an event
18007
- // handler function for the same event. In this situation we want to avoid registration of
18008
- // several native listeners as each registration would be intercepted by NgZone and
18009
- // trigger change detection. This would mean that a single user action would result in several
18010
- // change detections being invoked. To avoid this situation we want to have only one call to
18011
- // native handler registration (for the same element and same type of event).
18012
- //
18013
- // In order to have just one native event handler in presence of multiple handler functions,
18014
- // we just register a first handler function as a native event listener and then chain
18015
- // (coalesce) other handler functions on top of the first native handler function.
18016
- let existingListener = null;
18017
- // Please note that the coalescing described here doesn't happen for events specifying an
18018
- // alternative target (ex. (document:click)) - this is to keep backward compatibility with the
18019
- // view engine.
18020
- // Also, we don't have to search for existing listeners is there are no directives
18021
- // matching on a given node as we can't register multiple event handlers for the same event in
18022
- // a template (this would mean having duplicate attributes).
18023
- if (!eventTargetResolver && isTNodeDirectiveHost) {
18024
- existingListener = findExistingListener(tView, lView, eventName, tNode.index);
18025
- }
18026
- if (existingListener !== null) {
18027
- // Attach a new listener to coalesced listeners list, maintaining the order in which
18028
- // listeners are registered. For performance reasons, we keep a reference to the last
18029
- // listener in that list (in `__ngLastListenerFn__` field), so we can avoid going through
18030
- // the entire set each time we need to add a new listener.
18031
- const lastListenerFn = existingListener.__ngLastListenerFn__ || existingListener;
18032
- lastListenerFn.__ngNextListenerFn__ = listenerFn;
18033
- existingListener.__ngLastListenerFn__ = listenerFn;
18034
- processOutputs = false;
18035
- }
18036
- else {
18037
- listenerFn = wrapListener(tNode, lView, context, listenerFn);
18038
- stashEventListener(target, eventName, listenerFn);
18039
- const cleanupFn = renderer.listen(target, eventName, listenerFn);
18040
- lCleanup.push(listenerFn, cleanupFn);
18041
- tCleanup && tCleanup.push(eventName, idxOrTargetGetter, lCleanupIndex, lCleanupIndex + 1);
18042
- }
18043
- }
18044
- else {
18045
- // Even if there is no native listener to add, we still need to wrap the listener so that OnPush
18046
- // ancestors are marked dirty when an event occurs.
18047
- listenerFn = wrapListener(tNode, lView, context, listenerFn);
18048
- }
18049
- if (processOutputs) {
18050
- const outputConfig = tNode.outputs?.[eventName];
18051
- const hostDirectiveOutputConfig = tNode.hostDirectiveOutputs?.[eventName];
18052
- if (hostDirectiveOutputConfig && hostDirectiveOutputConfig.length) {
18053
- for (let i = 0; i < hostDirectiveOutputConfig.length; i += 2) {
18054
- const index = hostDirectiveOutputConfig[i];
18055
- const lookupName = hostDirectiveOutputConfig[i + 1];
18056
- listenToOutput(tNode, tView, lView, index, lookupName, eventName, listenerFn, lCleanup, tCleanup);
18057
- }
18058
- }
18059
- if (outputConfig && outputConfig.length) {
18060
- for (const index of outputConfig) {
18061
- listenToOutput(tNode, tView, lView, index, eventName, eventName, listenerFn, lCleanup, tCleanup);
18062
- }
18063
- }
18064
- }
18065
- }
18066
- function listenToOutput(tNode, tView, lView, index, lookupName, eventName, listenerFn, lCleanup, tCleanup) {
18067
- ngDevMode && assertIndexInRange(lView, index);
18068
- const instance = lView[index];
18069
- const def = tView.data[index];
18070
- const propertyName = def.outputs[lookupName];
18071
- const output = instance[propertyName];
18072
- if (ngDevMode && !isOutputSubscribable(output)) {
18073
- throw new Error(`@Output ${propertyName} not initialized in '${instance.constructor.name}'.`);
18074
- }
18075
- const subscription = output.subscribe(listenerFn);
18076
- const idx = lCleanup.length;
18077
- lCleanup.push(listenerFn, subscription);
18078
- tCleanup && tCleanup.push(eventName, tNode.index, idx, -(idx + 1));
18079
- }
18080
- function executeListenerWithErrorHandling(lView, context, listenerFn, e) {
18081
- const prevConsumer = setActiveConsumer(null);
18082
- try {
18083
- profiler(6 /* ProfilerEvent.OutputStart */, context, listenerFn);
18084
- // Only explicitly returning false from a listener should preventDefault
18085
- return listenerFn(e) !== false;
18086
- }
18087
- catch (error) {
18088
- // TODO(atscott): This should report to the application error handler, not the ErrorHandler on LView injector
18089
- handleError(lView, error);
18090
- return false;
18091
- }
18092
- finally {
18093
- profiler(7 /* ProfilerEvent.OutputEnd */, context, listenerFn);
18094
- setActiveConsumer(prevConsumer);
18095
- }
18096
- }
18097
17948
  /**
18098
17949
  * Wraps an event listener with a function that marks ancestors dirty and prevents default behavior,
18099
17950
  * if applicable.
@@ -18104,7 +17955,7 @@ function executeListenerWithErrorHandling(lView, context, listenerFn, e) {
18104
17955
  * @param wrapWithPreventDefault Whether or not to prevent default behavior
18105
17956
  * (the procedural renderer does this already, so in those cases, we should skip)
18106
17957
  */
18107
- function wrapListener(tNode, lView, context, listenerFn) {
17958
+ function wrapListener(tNode, lView, listenerFn) {
18108
17959
  // Note: we are performing most of the work in the listener function itself
18109
17960
  // to optimize listener registration.
18110
17961
  return function wrapListenerIn_markDirtyAndPreventDefault(e) {
@@ -18117,6 +17968,7 @@ function wrapListener(tNode, lView, context, listenerFn) {
18117
17968
  // must also mark the component view itself dirty (i.e. the view that it owns).
18118
17969
  const startView = isComponentHost(tNode) ? getComponentLViewByIndex(tNode.index, lView) : lView;
18119
17970
  markViewDirty(startView, 5 /* NotificationSource.Listener */);
17971
+ const context = lView[CONTEXT];
18120
17972
  let result = executeListenerWithErrorHandling(lView, context, listenerFn, e);
18121
17973
  // A just-invoked listener function might have coalesced listeners so we need to check for
18122
17974
  // their presence and invoke as needed.
@@ -18129,19 +17981,45 @@ function wrapListener(tNode, lView, context, listenerFn) {
18129
17981
  return result;
18130
17982
  };
18131
17983
  }
17984
+ function executeListenerWithErrorHandling(lView, context, listenerFn, e) {
17985
+ const prevConsumer = setActiveConsumer(null);
17986
+ try {
17987
+ profiler(6 /* ProfilerEvent.OutputStart */, context, listenerFn);
17988
+ // Only explicitly returning false from a listener should preventDefault
17989
+ return listenerFn(e) !== false;
17990
+ }
17991
+ catch (error) {
17992
+ // TODO(atscott): This should report to the application error handler, not the ErrorHandler on LView injector
17993
+ handleError(lView, error);
17994
+ return false;
17995
+ }
17996
+ finally {
17997
+ profiler(7 /* ProfilerEvent.OutputEnd */, context, listenerFn);
17998
+ setActiveConsumer(prevConsumer);
17999
+ }
18000
+ }
18132
18001
  /**
18133
- * Whether the given value represents a subscribable output.
18134
- *
18135
- * For example, an `EventEmitter, a `Subject`, an `Observable` or an
18136
- * `OutputEmitter`.
18002
+ * Handles an error thrown in an LView.
18003
+ * @deprecated Use handleUncaughtError to report to application error handler
18137
18004
  */
18138
- function isOutputSubscribable(value) {
18139
- return (value != null && typeof value.subscribe === 'function');
18005
+ function handleError(lView, error) {
18006
+ const injector = lView[INJECTOR];
18007
+ if (!injector) {
18008
+ return;
18009
+ }
18010
+ injector.get(ErrorHandler, null)?.handleError(error);
18011
+ }
18012
+
18013
+ function createOutputListener(tNode, lView, listenerFn, targetDef, eventName) {
18014
+ // TODO(pk): decouple checks from the actual binding
18015
+ const wrappedListener = wrapListener(tNode, lView, listenerFn);
18016
+ const hasBound = listenToDirectiveOutput(tNode, lView, targetDef, eventName, wrappedListener);
18017
+ if (!hasBound && ngDevMode) {
18018
+ throw new RuntimeError(316 /* RuntimeErrorCode.INVALID_BINDING_TARGET */, `${stringifyForError(targetDef.type)} does not have an output with a public name of "${eventName}".`);
18019
+ }
18140
18020
  }
18141
18021
  /** Listens to an output on a specific directive. */
18142
- function listenToDirectiveOutput(tNode, tView, lView, target, eventName, listenerFn) {
18143
- const tCleanup = tView.firstCreatePass ? getOrCreateTViewCleanup(tView) : null;
18144
- const lCleanup = getOrCreateLViewCleanup(lView);
18022
+ function listenToDirectiveOutput(tNode, lView, target, eventName, listenerFn) {
18145
18023
  let hostIndex = null;
18146
18024
  let hostDirectivesStart = null;
18147
18025
  let hostDirectivesEnd = null;
@@ -18165,20 +18043,47 @@ function listenToDirectiveOutput(tNode, tView, lView, target, eventName, listene
18165
18043
  if (index >= hostDirectivesStart && index <= hostDirectivesEnd) {
18166
18044
  ngDevMode && assertIndexInRange(lView, index);
18167
18045
  hasOutput = true;
18168
- listenToOutput(tNode, tView, lView, index, hostDirectiveOutputs[i + 1], eventName, listenerFn, lCleanup, tCleanup);
18046
+ listenToOutput(tNode, lView, index, hostDirectiveOutputs[i + 1], eventName, listenerFn);
18169
18047
  }
18170
18048
  else if (index > hostDirectivesEnd) {
18171
18049
  break;
18172
18050
  }
18173
18051
  }
18174
18052
  }
18175
- if (hostIndex !== null && target.outputs.hasOwnProperty(eventName)) {
18053
+ if (target.outputs.hasOwnProperty(eventName)) {
18176
18054
  ngDevMode && assertIndexInRange(lView, hostIndex);
18177
18055
  hasOutput = true;
18178
- listenToOutput(tNode, tView, lView, hostIndex, eventName, eventName, listenerFn, lCleanup, tCleanup);
18056
+ listenToOutput(tNode, lView, hostIndex, eventName, eventName, listenerFn);
18179
18057
  }
18180
18058
  return hasOutput;
18181
18059
  }
18060
+ function listenToOutput(tNode, lView, directiveIndex, lookupName, eventName, listenerFn) {
18061
+ ngDevMode && assertIndexInRange(lView, directiveIndex);
18062
+ const instance = lView[directiveIndex];
18063
+ const tView = lView[TVIEW];
18064
+ const def = tView.data[directiveIndex];
18065
+ const propertyName = def.outputs[lookupName];
18066
+ const output = instance[propertyName];
18067
+ if (ngDevMode && !isOutputSubscribable(output)) {
18068
+ throw new Error(`@Output ${propertyName} not initialized in '${instance.constructor.name}'.`);
18069
+ }
18070
+ // TODO(pk): introduce utility to store cleanup or find a different way of sharing code with listener
18071
+ const tCleanup = tView.firstCreatePass ? getOrCreateTViewCleanup(tView) : null;
18072
+ const lCleanup = getOrCreateLViewCleanup(lView);
18073
+ const subscription = output.subscribe(listenerFn);
18074
+ const idx = lCleanup.length;
18075
+ lCleanup.push(listenerFn, subscription);
18076
+ tCleanup && tCleanup.push(eventName, tNode.index, idx, -(idx + 1));
18077
+ }
18078
+ /**
18079
+ * Whether the given value represents a subscribable output.
18080
+ *
18081
+ * For example, an `EventEmitter, a `Subject`, an `Observable` or an
18082
+ * `OutputEmitter`.
18083
+ */
18084
+ function isOutputSubscribable(value) {
18085
+ return (value != null && typeof value.subscribe === 'function');
18086
+ }
18182
18087
 
18183
18088
  /*!
18184
18089
  * @license
@@ -18272,18 +18177,53 @@ function outputBinding(eventName, listener) {
18272
18177
  throw new RuntimeError(315 /* RuntimeErrorCode.NO_BINDING_TARGET */, `Output binding to "${eventName}" does not have a target.`);
18273
18178
  }
18274
18179
  const lView = getLView();
18275
- const tView = getTView();
18276
18180
  const tNode = getCurrentTNode();
18277
- const context = lView[CONTEXT];
18278
- const wrappedListener = wrapListener(tNode, lView, context, listener);
18279
- const hasBound = listenToDirectiveOutput(tNode, tView, lView, target, eventName, wrappedListener);
18280
- if (!hasBound && ngDevMode) {
18281
- throw new RuntimeError(316 /* RuntimeErrorCode.INVALID_BINDING_TARGET */, `${stringifyForError(target.type)} does not have an output with a public name of "${eventName}".`);
18282
- }
18181
+ createOutputListener(tNode, lView, listener, target, eventName);
18283
18182
  },
18284
18183
  };
18285
18184
  return binding;
18286
18185
  }
18186
+ /**
18187
+ * Creates a two-way binding.
18188
+ * @param eventName Public name of the two-way compatible input.
18189
+ * @param value Writable signal from which to get the current value and to which to write new
18190
+ * values.
18191
+ *
18192
+ * ### Usage example
18193
+ * In this example we create an instance of the `MyCheckbox` component and bind to its `value`
18194
+ * input using a two-way binding.
18195
+ *
18196
+ * ```
18197
+ * const checkboxValue = signal('');
18198
+ *
18199
+ * createComponent(MyCheckbox, {
18200
+ * bindings: [
18201
+ * twoWayBinding('value', checkboxValue),
18202
+ * ],
18203
+ * });
18204
+ * ```
18205
+ */
18206
+ function twoWayBinding(publicName, value) {
18207
+ const input = inputBinding(publicName, value);
18208
+ const output = outputBinding(publicName + 'Change', (eventValue) => value.set(eventValue));
18209
+ // We take advantage of inputs only having a `create` block and outputs only having an `update`
18210
+ // block by passing them through directly instead of creating dedicated functions here. This
18211
+ // assumption can break down if one of them starts targeting both blocks. These assertions
18212
+ // are here to help us catch it if something changes in the future.
18213
+ ngDevMode && assertNotDefined(input.create, 'Unexpected `create` callback in inputBinding');
18214
+ ngDevMode && assertNotDefined(output.update, 'Unexpected `update` callback in outputBinding');
18215
+ return {
18216
+ [BINDING]: {
18217
+ kind: 'twoWay',
18218
+ requiredVars: input[BINDING].requiredVars + output[BINDING].requiredVars,
18219
+ },
18220
+ set target(target) {
18221
+ input.target = output.target = target;
18222
+ },
18223
+ create: output.create,
18224
+ update: input.update,
18225
+ };
18226
+ }
18287
18227
 
18288
18228
  class ComponentFactoryResolver extends ComponentFactoryResolver$1 {
18289
18229
  ngModule;
@@ -18398,7 +18338,7 @@ class ComponentFactory extends ComponentFactory$1 {
18398
18338
  }
18399
18339
  create(injector, projectableNodes, rootSelectorOrNode, environmentInjector, directives, componentBindings) {
18400
18340
  profiler(22 /* ProfilerEvent.DynamicComponentStart */);
18401
- const prevConsumer = setActiveConsumer(null);
18341
+ const prevConsumer = setActiveConsumer$1(null);
18402
18342
  try {
18403
18343
  const cmpDef = this.componentDef;
18404
18344
  ngDevMode && verifyNotAnOrphanComponent(cmpDef);
@@ -18470,13 +18410,13 @@ class ComponentFactory extends ComponentFactory$1 {
18470
18410
  return new ComponentRef(this.componentType, rootLView, !!hasInputBindings);
18471
18411
  }
18472
18412
  finally {
18473
- setActiveConsumer(prevConsumer);
18413
+ setActiveConsumer$1(prevConsumer);
18474
18414
  }
18475
18415
  }
18476
18416
  }
18477
18417
  function createRootTView(rootSelectorOrNode, componentDef, componentBindings, directives) {
18478
18418
  const tAttributes = rootSelectorOrNode
18479
- ? ['ng-version', '20.0.0-next.2']
18419
+ ? ['ng-version', '20.0.0-next.4']
18480
18420
  : // Extract attributes and classes from the first selector only to match VE behavior.
18481
18421
  extractAttrsAndClassesFromSelector(componentDef.selectors[0]);
18482
18422
  let creationBindings = null;
@@ -18534,7 +18474,8 @@ function getRootTViewTemplate(creationBindings, updateBindings) {
18534
18474
  };
18535
18475
  }
18536
18476
  function isInputBinding(binding) {
18537
- return binding[BINDING].kind === 'input';
18477
+ const kind = binding[BINDING].kind;
18478
+ return kind === 'input' || kind === 'twoWay';
18538
18479
  }
18539
18480
  /**
18540
18481
  * Represents an instance of a Component created via a {@link ComponentFactory}.
@@ -18566,7 +18507,7 @@ class ComponentRef extends ComponentRef$1 {
18566
18507
  }
18567
18508
  setInput(name, value) {
18568
18509
  if (this._hasInputBindings && ngDevMode) {
18569
- throw new RuntimeError(317 /* RuntimeErrorCode.INVALID_SET_INPUT_CALL */, 'Cannot call `setInput` on a component that is using the `inputBinding` function.');
18510
+ throw new RuntimeError(317 /* RuntimeErrorCode.INVALID_SET_INPUT_CALL */, 'Cannot call `setInput` on a component that is using the `inputBinding` or `twoWayBinding` functions.');
18570
18511
  }
18571
18512
  const tNode = this._tNode;
18572
18513
  this.previousInputValues ??= new Map();
@@ -20520,7 +20461,7 @@ function getNgDirectiveDef(directiveDefinition) {
20520
20461
  viewQuery: directiveDefinition.viewQuery || null,
20521
20462
  features: directiveDefinition.features || null,
20522
20463
  setInput: null,
20523
- findHostDirectiveDefs: null,
20464
+ resolveHostDirectives: null,
20524
20465
  hostDirectives: null,
20525
20466
  inputs: parseAndConvertInputsForDefinition(directiveDefinition.inputs, declaredInputs),
20526
20467
  outputs: parseAndConvertOutputsForDefinition(directiveDefinition.outputs),
@@ -20878,7 +20819,7 @@ function ɵɵHostDirectivesFeature(rawHostDirectives) {
20878
20819
  const feature = (definition) => {
20879
20820
  const isEager = Array.isArray(rawHostDirectives);
20880
20821
  if (definition.hostDirectives === null) {
20881
- definition.findHostDirectiveDefs = findHostDirectiveDefs;
20822
+ definition.resolveHostDirectives = resolveHostDirectives;
20882
20823
  definition.hostDirectives = isEager
20883
20824
  ? rawHostDirectives.map(createHostDirectiveDef)
20884
20825
  : [rawHostDirectives];
@@ -20893,6 +20834,50 @@ function ɵɵHostDirectivesFeature(rawHostDirectives) {
20893
20834
  feature.ngInherit = true;
20894
20835
  return feature;
20895
20836
  }
20837
+ /**
20838
+ * Function that will be patched onto a definition to enable host directives. It is intended to
20839
+ * be called once during directive matching and is the same for all definitions.
20840
+ * @param matches Directives resolved through selector matching.
20841
+ */
20842
+ function resolveHostDirectives(matches) {
20843
+ const allDirectiveDefs = [];
20844
+ let hasComponent = false;
20845
+ let hostDirectiveDefs = null;
20846
+ let hostDirectiveRanges = null;
20847
+ // Components are inserted at the front of the matches array so that their lifecycle
20848
+ // hooks run before any directive lifecycle hooks. This appears to be for ViewEngine
20849
+ // compatibility. This logic doesn't make sense with host directives, because it
20850
+ // would allow the host directives to undo any overrides the host may have made.
20851
+ // To handle this case, the host directives of components are inserted at the beginning
20852
+ // of the array, followed by the component. As such, the insertion order is as follows:
20853
+ // 1. Host directives belonging to the selector-matched component.
20854
+ // 2. Selector-matched component.
20855
+ // 3. Host directives belonging to selector-matched directives.
20856
+ // 4. Selector-matched dir
20857
+ for (let i = 0; i < matches.length; i++) {
20858
+ const def = matches[i];
20859
+ if (def.hostDirectives !== null) {
20860
+ const start = allDirectiveDefs.length;
20861
+ hostDirectiveDefs ??= new Map();
20862
+ hostDirectiveRanges ??= new Map();
20863
+ // TODO(pk): probably could return matches instead of taking in an array to fill in?
20864
+ findHostDirectiveDefs(def, allDirectiveDefs, hostDirectiveDefs);
20865
+ // Note that these indexes are within the offset by `directiveStart`. We can't do the
20866
+ // offsetting here, because `directiveStart` hasn't been initialized on the TNode yet.
20867
+ hostDirectiveRanges.set(def, [start, allDirectiveDefs.length - 1]);
20868
+ }
20869
+ // Component definition is always first and needs to be
20870
+ // pushed early to maintain the correct ordering.
20871
+ if (i === 0 && isComponentDef(def)) {
20872
+ hasComponent = true;
20873
+ allDirectiveDefs.push(def);
20874
+ }
20875
+ }
20876
+ for (let i = hasComponent ? 1 : 0; i < matches.length; i++) {
20877
+ allDirectiveDefs.push(matches[i]);
20878
+ }
20879
+ return [allDirectiveDefs, hostDirectiveDefs, hostDirectiveRanges];
20880
+ }
20896
20881
  function findHostDirectiveDefs(currentDef, matchedDefs, hostDirectiveDefs) {
20897
20882
  if (currentDef.hostDirectives !== null) {
20898
20883
  for (const configOrFn of currentDef.hostDirectives) {
@@ -21058,11 +21043,14 @@ function templateFirstCreatePass(index, tView, lView, templateFn, decls, vars, t
21058
21043
  * @param localRefExtractor A function which extracts local-refs values from the template.
21059
21044
  * Defaults to the current element associated with the local-ref.
21060
21045
  */
21061
- function declareTemplate(declarationLView, declarationTView, index, templateFn, decls, vars, tagName, attrs, localRefsIndex, localRefExtractor) {
21046
+ function declareTemplate(declarationLView, declarationTView, index, templateFn, decls, vars, tagName, attrs, flags, localRefsIndex, localRefExtractor) {
21062
21047
  const adjustedIndex = index + HEADER_OFFSET;
21063
21048
  const tNode = declarationTView.firstCreatePass
21064
21049
  ? templateFirstCreatePass(adjustedIndex, declarationTView, declarationLView, templateFn, decls, vars, tagName, attrs, localRefsIndex)
21065
21050
  : declarationTView.data[adjustedIndex];
21051
+ if (flags) {
21052
+ tNode.flags |= flags;
21053
+ }
21066
21054
  setCurrentTNode(tNode, false);
21067
21055
  const comment = _locateOrCreateContainerAnchor(declarationTView, declarationLView, tNode, index);
21068
21056
  if (wasLastNodeCreated()) {
@@ -21107,7 +21095,7 @@ function ɵɵtemplate(index, templateFn, decls, vars, tagName, attrsIndex, local
21107
21095
  const lView = getLView();
21108
21096
  const tView = getTView();
21109
21097
  const attrs = getConstant(tView.consts, attrsIndex);
21110
- declareTemplate(lView, tView, index, templateFn, decls, vars, tagName, attrs, localRefsIndex, localRefExtractor);
21098
+ declareTemplate(lView, tView, index, templateFn, decls, vars, tagName, attrs, undefined, localRefsIndex, localRefExtractor);
21111
21099
  return ɵɵtemplate;
21112
21100
  }
21113
21101
  let _locateOrCreateContainerAnchor = createContainerAnchorImpl;
@@ -21283,8 +21271,9 @@ function onTimer(delay) {
21283
21271
  */
21284
21272
  function scheduleTimerTrigger(delay, callback, injector) {
21285
21273
  const scheduler = injector.get(TimerScheduler);
21274
+ const ngZone = injector.get(NgZone);
21286
21275
  const cleanupFn = () => scheduler.remove(callback);
21287
- scheduler.add(delay, callback);
21276
+ scheduler.add(delay, callback, ngZone);
21288
21277
  return cleanupFn;
21289
21278
  }
21290
21279
  /**
@@ -21310,10 +21299,10 @@ class TimerScheduler {
21310
21299
  // the current callback invocation. The shape of this list is the same
21311
21300
  // as the shape of the `current` list.
21312
21301
  deferred = [];
21313
- add(delay, callback) {
21302
+ add(delay, callback, ngZone) {
21314
21303
  const target = this.executingCallbacks ? this.deferred : this.current;
21315
21304
  this.addToQueue(target, Date.now() + delay, callback);
21316
- this.scheduleTimer();
21305
+ this.scheduleTimer(ngZone);
21317
21306
  }
21318
21307
  remove(callback) {
21319
21308
  const { current, deferred } = this;
@@ -21359,7 +21348,7 @@ class TimerScheduler {
21359
21348
  }
21360
21349
  return index;
21361
21350
  }
21362
- scheduleTimer() {
21351
+ scheduleTimer(ngZone) {
21363
21352
  const callback = () => {
21364
21353
  this.clearTimeout();
21365
21354
  this.executingCallbacks = true;
@@ -21409,7 +21398,7 @@ class TimerScheduler {
21409
21398
  }
21410
21399
  this.deferred.length = 0;
21411
21400
  }
21412
- this.scheduleTimer();
21401
+ this.scheduleTimer(ngZone);
21413
21402
  };
21414
21403
  // Avoid running timer callbacks more than once per
21415
21404
  // average frame duration. This is needed for better
@@ -21432,7 +21421,9 @@ class TimerScheduler {
21432
21421
  this.clearTimeout();
21433
21422
  const timeout = Math.max(invokeAt - now, FRAME_DURATION_MS);
21434
21423
  this.invokeTimerAt = invokeAt;
21435
- this.timeoutId = setTimeout(callback, timeout);
21424
+ this.timeoutId = ngZone.runOutsideAngular(() => {
21425
+ return setTimeout(() => ngZone.run(callback), timeout);
21426
+ });
21436
21427
  }
21437
21428
  }
21438
21429
  }
@@ -23998,7 +23989,7 @@ class ApplicationRef {
23998
23989
  if (this._runningTick) {
23999
23990
  throw new RuntimeError(101 /* RuntimeErrorCode.RECURSIVE_APPLICATION_REF_TICK */, ngDevMode && 'ApplicationRef.tick is called recursively');
24000
23991
  }
24001
- const prevConsumer = setActiveConsumer(null);
23992
+ const prevConsumer = setActiveConsumer$1(null);
24002
23993
  try {
24003
23994
  this._runningTick = true;
24004
23995
  this.synchronize();
@@ -24012,7 +24003,7 @@ class ApplicationRef {
24012
24003
  this._runningTick = false;
24013
24004
  this.tracingSnapshot?.dispose();
24014
24005
  this.tracingSnapshot = null;
24015
- setActiveConsumer(prevConsumer);
24006
+ setActiveConsumer$1(prevConsumer);
24016
24007
  this.afterTick.next();
24017
24008
  profiler(13 /* ProfilerEvent.ChangeDetectionEnd */);
24018
24009
  }
@@ -24860,7 +24851,7 @@ function ɵɵdeferWhen(rawValue) {
24860
24851
  return;
24861
24852
  const bindingIndex = nextBindingIndex();
24862
24853
  if (bindingUpdated(lView, bindingIndex, rawValue)) {
24863
- const prevConsumer = setActiveConsumer(null);
24854
+ const prevConsumer = setActiveConsumer$1(null);
24864
24855
  try {
24865
24856
  const value = Boolean(rawValue); // handle truthy or falsy values
24866
24857
  const lDetails = getLDeferBlockDetails(lView, tNode);
@@ -24876,7 +24867,7 @@ function ɵɵdeferWhen(rawValue) {
24876
24867
  }
24877
24868
  }
24878
24869
  finally {
24879
- setActiveConsumer(prevConsumer);
24870
+ setActiveConsumer$1(prevConsumer);
24880
24871
  }
24881
24872
  }
24882
24873
  }
@@ -24894,7 +24885,7 @@ function ɵɵdeferPrefetchWhen(rawValue) {
24894
24885
  return;
24895
24886
  const bindingIndex = nextBindingIndex();
24896
24887
  if (bindingUpdated(lView, bindingIndex, rawValue)) {
24897
- const prevConsumer = setActiveConsumer(null);
24888
+ const prevConsumer = setActiveConsumer$1(null);
24898
24889
  try {
24899
24890
  const value = Boolean(rawValue); // handle truthy or falsy values
24900
24891
  const tView = lView[TVIEW];
@@ -24906,7 +24897,7 @@ function ɵɵdeferPrefetchWhen(rawValue) {
24906
24897
  }
24907
24898
  }
24908
24899
  finally {
24909
- setActiveConsumer(prevConsumer);
24900
+ setActiveConsumer$1(prevConsumer);
24910
24901
  }
24911
24902
  }
24912
24903
  }
@@ -24935,7 +24926,7 @@ function ɵɵdeferHydrateWhen(rawValue) {
24935
24926
  }
24936
24927
  else {
24937
24928
  const injector = lView[INJECTOR];
24938
- const prevConsumer = setActiveConsumer(null);
24929
+ const prevConsumer = setActiveConsumer$1(null);
24939
24930
  try {
24940
24931
  const value = Boolean(rawValue); // handle truthy or falsy values
24941
24932
  if (value === true) {
@@ -24949,7 +24940,7 @@ function ɵɵdeferHydrateWhen(rawValue) {
24949
24940
  }
24950
24941
  }
24951
24942
  finally {
24952
- setActiveConsumer(prevConsumer);
24943
+ setActiveConsumer$1(prevConsumer);
24953
24944
  }
24954
24945
  }
24955
24946
  }
@@ -27966,6 +27957,58 @@ class UniqueValueMultiKeyMap {
27966
27957
  }
27967
27958
  }
27968
27959
 
27960
+ /**
27961
+ * Creates an LContainer for an ng-template representing a root node
27962
+ * of control flow (@if, @switch). We use this to explicitly set
27963
+ * flags on the TNode created to identify which nodes are in control
27964
+ * flow or starting control flow for hydration identification and
27965
+ * cleanup timing.
27966
+ *
27967
+ * @param index The index of the container in the data array
27968
+ * @param templateFn Inline template
27969
+ * @param decls The number of nodes, local refs, and pipes for this template
27970
+ * @param vars The number of bindings for this template
27971
+ * @param tagName The name of the container element, if applicable
27972
+ * @param attrsIndex Index of template attributes in the `consts` array.
27973
+ * @param localRefs Index of the local references in the `consts` array.
27974
+ * @param localRefExtractor A function which extracts local-refs values from the template.
27975
+ * Defaults to the current element associated with the local-ref.
27976
+ * @codeGenApi
27977
+ */
27978
+ function ɵɵconditionalCreate(index, templateFn, decls, vars, tagName, attrsIndex, localRefsIndex, localRefExtractor) {
27979
+ performanceMarkFeature('NgControlFlow');
27980
+ const lView = getLView();
27981
+ const tView = getTView();
27982
+ const attrs = getConstant(tView.consts, attrsIndex);
27983
+ declareTemplate(lView, tView, index, templateFn, decls, vars, tagName, attrs, 256 /* TNodeFlags.isControlFlowStart */, localRefsIndex, localRefExtractor);
27984
+ return ɵɵconditionalBranchCreate;
27985
+ }
27986
+ /**
27987
+ * Creates an LContainer for an ng-template representing a branch
27988
+ * of control flow (@else, @case, @default). We use this to explicitly
27989
+ * set flags on the TNode created to identify which nodes are in
27990
+ * control flow or starting control flow for hydration identification
27991
+ * and cleanup timing.
27992
+ *
27993
+ * @param index The index of the container in the data array
27994
+ * @param templateFn Inline template
27995
+ * @param decls The number of nodes, local refs, and pipes for this template
27996
+ * @param vars The number of bindings for this template
27997
+ * @param tagName The name of the container element, if applicable
27998
+ * @param attrsIndex Index of template attributes in the `consts` array.
27999
+ * @param localRefs Index of the local references in the `consts` array.
28000
+ * @param localRefExtractor A function which extracts local-refs values from the template.
28001
+ * Defaults to the current element associated with the local-ref.
28002
+ * @codeGenApi
28003
+ */
28004
+ function ɵɵconditionalBranchCreate(index, templateFn, decls, vars, tagName, attrsIndex, localRefsIndex, localRefExtractor) {
28005
+ performanceMarkFeature('NgControlFlow');
28006
+ const lView = getLView();
28007
+ const tView = getTView();
28008
+ const attrs = getConstant(tView.consts, attrsIndex);
28009
+ declareTemplate(lView, tView, index, templateFn, decls, vars, tagName, attrs, 512 /* TNodeFlags.isInControlFlow */, localRefsIndex, localRefExtractor);
28010
+ return ɵɵconditionalBranchCreate;
28011
+ }
27969
28012
  /**
27970
28013
  * The conditional instruction represents the basic building block on the runtime side to support
27971
28014
  * built-in "if" and "switch". On the high level this instruction is responsible for adding and
@@ -27986,7 +28029,7 @@ function ɵɵconditional(matchingTemplateIndex, contextValue) {
27986
28029
  : undefined;
27987
28030
  const viewInContainerIdx = 0;
27988
28031
  if (bindingUpdated(hostLView, bindingIndex, matchingTemplateIndex)) {
27989
- const prevConsumer = setActiveConsumer(null);
28032
+ const prevConsumer = setActiveConsumer$1(null);
27990
28033
  try {
27991
28034
  // The index of the view to show changed - remove the previously displayed one
27992
28035
  // (it is a noop if there are no active views in a container).
@@ -27999,7 +28042,7 @@ function ɵɵconditional(matchingTemplateIndex, contextValue) {
27999
28042
  const nextLContainerIndex = HEADER_OFFSET + matchingTemplateIndex;
28000
28043
  const nextContainer = getLContainer(hostLView, nextLContainerIndex);
28001
28044
  const templateTNode = getExistingTNode(hostLView[TVIEW], nextLContainerIndex);
28002
- const dehydratedView = findMatchingDehydratedView(nextContainer, templateTNode.tView.ssrId);
28045
+ const dehydratedView = findAndReconcileMatchingDehydratedViews(nextContainer, templateTNode, hostLView);
28003
28046
  const embeddedLView = createAndRenderEmbeddedLView(hostLView, templateTNode, contextValue, {
28004
28047
  dehydratedView,
28005
28048
  });
@@ -28007,7 +28050,7 @@ function ɵɵconditional(matchingTemplateIndex, contextValue) {
28007
28050
  }
28008
28051
  }
28009
28052
  finally {
28010
- setActiveConsumer(prevConsumer);
28053
+ setActiveConsumer$1(prevConsumer);
28011
28054
  }
28012
28055
  }
28013
28056
  else if (prevContainer !== undefined) {
@@ -28104,13 +28147,13 @@ function ɵɵrepeaterCreate(index, templateFn, decls, vars, tagName, attrsIndex,
28104
28147
  : trackByFn;
28105
28148
  const metadata = new RepeaterMetadata(hasEmptyBlock, boundTrackBy);
28106
28149
  hostLView[HEADER_OFFSET + index] = metadata;
28107
- declareTemplate(lView, tView, index + 1, templateFn, decls, vars, tagName, getConstant(tView.consts, attrsIndex));
28150
+ declareTemplate(lView, tView, index + 1, templateFn, decls, vars, tagName, getConstant(tView.consts, attrsIndex), 256 /* TNodeFlags.isControlFlowStart */);
28108
28151
  if (hasEmptyBlock) {
28109
28152
  ngDevMode &&
28110
28153
  assertDefined(emptyDecls, 'Missing number of declarations for the empty repeater block.');
28111
28154
  ngDevMode &&
28112
28155
  assertDefined(emptyVars, 'Missing number of bindings for the empty repeater block.');
28113
- declareTemplate(lView, tView, index + 2, emptyTemplateFn, emptyDecls, emptyVars, emptyTagName, getConstant(tView.consts, emptyAttrsIndex));
28156
+ declareTemplate(lView, tView, index + 2, emptyTemplateFn, emptyDecls, emptyVars, emptyTagName, getConstant(tView.consts, emptyAttrsIndex), 512 /* TNodeFlags.isInControlFlow */);
28114
28157
  }
28115
28158
  }
28116
28159
  function isViewExpensiveToRecreate(lView) {
@@ -28209,7 +28252,7 @@ class LiveCollectionLContainerImpl extends LiveCollection {
28209
28252
  * @codeGenApi
28210
28253
  */
28211
28254
  function ɵɵrepeater(collection) {
28212
- const prevConsumer = setActiveConsumer(null);
28255
+ const prevConsumer = setActiveConsumer$1(null);
28213
28256
  const metadataSlotIdx = getSelectedIndex();
28214
28257
  try {
28215
28258
  const hostLView = getLView();
@@ -28250,18 +28293,25 @@ function ɵɵrepeater(collection) {
28250
28293
  const lContainerForEmpty = getLContainer(hostLView, emptyTemplateIndex);
28251
28294
  if (isCollectionEmpty) {
28252
28295
  const emptyTemplateTNode = getExistingTNode(hostTView, emptyTemplateIndex);
28253
- const dehydratedView = findMatchingDehydratedView(lContainerForEmpty, emptyTemplateTNode.tView.ssrId);
28296
+ const dehydratedView = findAndReconcileMatchingDehydratedViews(lContainerForEmpty, emptyTemplateTNode, hostLView);
28254
28297
  const embeddedLView = createAndRenderEmbeddedLView(hostLView, emptyTemplateTNode, undefined, { dehydratedView });
28255
28298
  addLViewToLContainer(lContainerForEmpty, embeddedLView, 0, shouldAddViewToDom(emptyTemplateTNode, dehydratedView));
28256
28299
  }
28257
28300
  else {
28301
+ // we know that an ssrId was generated for the empty template, but
28302
+ // we were unable to match it to a dehydrated view earlier, which
28303
+ // means that we may have changed branches between server and client.
28304
+ // We'll need to find and remove the stale empty template view.
28305
+ if (hostTView.firstUpdatePass) {
28306
+ removeDehydratedViews(lContainerForEmpty);
28307
+ }
28258
28308
  removeLViewFromLContainer(lContainerForEmpty, 0);
28259
28309
  }
28260
28310
  }
28261
28311
  }
28262
28312
  }
28263
28313
  finally {
28264
- setActiveConsumer(prevConsumer);
28314
+ setActiveConsumer$1(prevConsumer);
28265
28315
  }
28266
28316
  }
28267
28317
  function getLContainer(lView, index) {
@@ -30446,6 +30496,180 @@ function ɵɵi18nPostprocess(message, replacements = {}) {
30446
30496
  return i18nPostprocess(message, replacements);
30447
30497
  }
30448
30498
 
30499
+ /**
30500
+ * Contains a reference to a function that disables event replay feature
30501
+ * for server-side rendered applications. This function is overridden with
30502
+ * an actual implementation when the event replay feature is enabled via
30503
+ * `withEventReplay()` call.
30504
+ */
30505
+ let stashEventListener = (el, eventName, listenerFn) => { };
30506
+ function setStashFn(fn) {
30507
+ stashEventListener = fn;
30508
+ }
30509
+ /**
30510
+ * Adds an event listener to the current node.
30511
+ *
30512
+ * If an output exists on one of the node's directives, it also subscribes to the output
30513
+ * and saves the subscription for later cleanup.
30514
+ *
30515
+ * @param eventName Name of the event
30516
+ * @param listenerFn The function to be called when event emits
30517
+ * @param eventTargetResolver Function that returns global target information in case this listener
30518
+ * should be attached to a global object like window, document or body
30519
+ *
30520
+ * @codeGenApi
30521
+ */
30522
+ function ɵɵlistener(eventName, listenerFn, eventTargetResolver) {
30523
+ const lView = getLView();
30524
+ const tView = getTView();
30525
+ const tNode = getCurrentTNode();
30526
+ listenerInternal(tView, lView, lView[RENDERER], tNode, eventName, listenerFn, eventTargetResolver);
30527
+ return ɵɵlistener;
30528
+ }
30529
+ /**
30530
+ * Registers a synthetic host listener (e.g. `(@foo.start)`) on a component or directive.
30531
+ *
30532
+ * This instruction is for compatibility purposes and is designed to ensure that a
30533
+ * synthetic host listener (e.g. `@HostListener('@foo.start')`) properly gets rendered
30534
+ * in the component's renderer. Normally all host listeners are evaluated with the
30535
+ * parent component's renderer, but, in the case of animation @triggers, they need
30536
+ * to be evaluated with the sub component's renderer (because that's where the
30537
+ * animation triggers are defined).
30538
+ *
30539
+ * Do not use this instruction as a replacement for `listener`. This instruction
30540
+ * only exists to ensure compatibility with the ViewEngine's host binding behavior.
30541
+ *
30542
+ * @param eventName Name of the event
30543
+ * @param listenerFn The function to be called when event emits
30544
+ * @param useCapture Whether or not to use capture in event listener
30545
+ * @param eventTargetResolver Function that returns global target information in case this listener
30546
+ * should be attached to a global object like window, document or body
30547
+ *
30548
+ * @codeGenApi
30549
+ */
30550
+ function ɵɵsyntheticHostListener(eventName, listenerFn) {
30551
+ const tNode = getCurrentTNode();
30552
+ const lView = getLView();
30553
+ const tView = getTView();
30554
+ const currentDef = getCurrentDirectiveDef(tView.data);
30555
+ const renderer = loadComponentRenderer(currentDef, tNode, lView);
30556
+ listenerInternal(tView, lView, renderer, tNode, eventName, listenerFn);
30557
+ return ɵɵsyntheticHostListener;
30558
+ }
30559
+ /**
30560
+ * A utility function that checks if a given element has already an event handler registered for an
30561
+ * event with a specified name. The TView.cleanup data structure is used to find out which events
30562
+ * are registered for a given element.
30563
+ */
30564
+ function findExistingListener(tView, lView, eventName, tNodeIdx) {
30565
+ const tCleanup = tView.cleanup;
30566
+ if (tCleanup != null) {
30567
+ for (let i = 0; i < tCleanup.length - 1; i += 2) {
30568
+ const cleanupEventName = tCleanup[i];
30569
+ if (cleanupEventName === eventName && tCleanup[i + 1] === tNodeIdx) {
30570
+ // We have found a matching event name on the same node but it might not have been
30571
+ // registered yet, so we must explicitly verify entries in the LView cleanup data
30572
+ // structures.
30573
+ const lCleanup = lView[CLEANUP];
30574
+ const listenerIdxInLCleanup = tCleanup[i + 2];
30575
+ return lCleanup.length > listenerIdxInLCleanup ? lCleanup[listenerIdxInLCleanup] : null;
30576
+ }
30577
+ // TView.cleanup can have a mix of 4-elements entries (for event handler cleanups) or
30578
+ // 2-element entries (for directive and queries destroy hooks). As such we can encounter
30579
+ // blocks of 4 or 2 items in the tView.cleanup and this is why we iterate over 2 elements
30580
+ // first and jump another 2 elements if we detect listeners cleanup (4 elements). Also check
30581
+ // documentation of TView.cleanup for more details of this data structure layout.
30582
+ if (typeof cleanupEventName === 'string') {
30583
+ i += 2;
30584
+ }
30585
+ }
30586
+ }
30587
+ return null;
30588
+ }
30589
+ function listenerInternal(tView, lView, renderer, tNode, eventName, listenerFn, eventTargetResolver) {
30590
+ const isTNodeDirectiveHost = isDirectiveHost(tNode);
30591
+ const firstCreatePass = tView.firstCreatePass;
30592
+ const tCleanup = firstCreatePass ? getOrCreateTViewCleanup(tView) : null;
30593
+ // When the ɵɵlistener instruction was generated and is executed we know that there is either a
30594
+ // native listener or a directive output on this element. As such we we know that we will have to
30595
+ // register a listener and store its cleanup function on LView.
30596
+ const lCleanup = getOrCreateLViewCleanup(lView);
30597
+ ngDevMode && assertTNodeType(tNode, 3 /* TNodeType.AnyRNode */ | 12 /* TNodeType.AnyContainer */);
30598
+ let processOutputs = true;
30599
+ // Adding a native event listener is applicable when:
30600
+ // - The corresponding TNode represents a DOM element.
30601
+ // - The event target has a resolver (usually resulting in a global object,
30602
+ // such as `window` or `document`).
30603
+ if (tNode.type & 3 /* TNodeType.AnyRNode */ || eventTargetResolver) {
30604
+ const native = getNativeByTNode(tNode, lView);
30605
+ const target = eventTargetResolver ? eventTargetResolver(native) : native;
30606
+ const lCleanupIndex = lCleanup.length;
30607
+ const idxOrTargetGetter = eventTargetResolver
30608
+ ? (_lView) => eventTargetResolver(unwrapRNode(_lView[tNode.index]))
30609
+ : tNode.index;
30610
+ // In order to match current behavior, native DOM event listeners must be added for all
30611
+ // events (including outputs).
30612
+ // There might be cases where multiple directives on the same element try to register an event
30613
+ // handler function for the same event. In this situation we want to avoid registration of
30614
+ // several native listeners as each registration would be intercepted by NgZone and
30615
+ // trigger change detection. This would mean that a single user action would result in several
30616
+ // change detections being invoked. To avoid this situation we want to have only one call to
30617
+ // native handler registration (for the same element and same type of event).
30618
+ //
30619
+ // In order to have just one native event handler in presence of multiple handler functions,
30620
+ // we just register a first handler function as a native event listener and then chain
30621
+ // (coalesce) other handler functions on top of the first native handler function.
30622
+ let existingListener = null;
30623
+ // Please note that the coalescing described here doesn't happen for events specifying an
30624
+ // alternative target (ex. (document:click)) - this is to keep backward compatibility with the
30625
+ // view engine.
30626
+ // Also, we don't have to search for existing listeners is there are no directives
30627
+ // matching on a given node as we can't register multiple event handlers for the same event in
30628
+ // a template (this would mean having duplicate attributes).
30629
+ if (!eventTargetResolver && isTNodeDirectiveHost) {
30630
+ existingListener = findExistingListener(tView, lView, eventName, tNode.index);
30631
+ }
30632
+ if (existingListener !== null) {
30633
+ // Attach a new listener to coalesced listeners list, maintaining the order in which
30634
+ // listeners are registered. For performance reasons, we keep a reference to the last
30635
+ // listener in that list (in `__ngLastListenerFn__` field), so we can avoid going through
30636
+ // the entire set each time we need to add a new listener.
30637
+ const lastListenerFn = existingListener.__ngLastListenerFn__ || existingListener;
30638
+ lastListenerFn.__ngNextListenerFn__ = listenerFn;
30639
+ existingListener.__ngLastListenerFn__ = listenerFn;
30640
+ processOutputs = false;
30641
+ }
30642
+ else {
30643
+ listenerFn = wrapListener(tNode, lView, listenerFn);
30644
+ stashEventListener(target, eventName, listenerFn);
30645
+ const cleanupFn = renderer.listen(target, eventName, listenerFn);
30646
+ lCleanup.push(listenerFn, cleanupFn);
30647
+ tCleanup && tCleanup.push(eventName, idxOrTargetGetter, lCleanupIndex, lCleanupIndex + 1);
30648
+ }
30649
+ }
30650
+ else {
30651
+ // Even if there is no native listener to add, we still need to wrap the listener so that OnPush
30652
+ // ancestors are marked dirty when an event occurs.
30653
+ listenerFn = wrapListener(tNode, lView, listenerFn);
30654
+ }
30655
+ if (processOutputs) {
30656
+ const outputConfig = tNode.outputs?.[eventName];
30657
+ const hostDirectiveOutputConfig = tNode.hostDirectiveOutputs?.[eventName];
30658
+ if (hostDirectiveOutputConfig && hostDirectiveOutputConfig.length) {
30659
+ for (let i = 0; i < hostDirectiveOutputConfig.length; i += 2) {
30660
+ const index = hostDirectiveOutputConfig[i];
30661
+ const lookupName = hostDirectiveOutputConfig[i + 1];
30662
+ listenToOutput(tNode, lView, index, lookupName, eventName, listenerFn);
30663
+ }
30664
+ }
30665
+ if (outputConfig && outputConfig.length) {
30666
+ for (const index of outputConfig) {
30667
+ listenToOutput(tNode, lView, index, eventName, eventName, listenerFn);
30668
+ }
30669
+ }
30670
+ }
30671
+ }
30672
+
30449
30673
  /**
30450
30674
  * Retrieves a context at the level specified and saves it as the global, contextViewData.
30451
30675
  * Will get the next level up if level is not specified.
@@ -33715,6 +33939,8 @@ const angularCoreEnv = (() => ({
33715
33939
  'ɵɵadvance': ɵɵadvance,
33716
33940
  'ɵɵtemplate': ɵɵtemplate,
33717
33941
  'ɵɵconditional': ɵɵconditional,
33942
+ 'ɵɵconditionalCreate': ɵɵconditionalCreate,
33943
+ 'ɵɵconditionalBranchCreate': ɵɵconditionalBranchCreate,
33718
33944
  'ɵɵdefer': ɵɵdefer,
33719
33945
  'ɵɵdeferWhen': ɵɵdeferWhen,
33720
33946
  'ɵɵdeferOnIdle': ɵɵdeferOnIdle,
@@ -34814,7 +35040,7 @@ class Version {
34814
35040
  /**
34815
35041
  * @publicApi
34816
35042
  */
34817
- const VERSION = new Version('20.0.0-next.2');
35043
+ const VERSION = new Version('20.0.0-next.4');
34818
35044
 
34819
35045
  /**
34820
35046
  * Combination of NgModuleFactory and ComponentFactories.
@@ -35070,7 +35296,7 @@ function internalProvideZoneChangeDetection({ ngZoneFactory, ignoreChangesOutsid
35070
35296
  * ```
35071
35297
  *
35072
35298
  * @publicApi
35073
- * @see {@link /api/core/bootstrapApplication bootstrapApplication}
35299
+ * @see {@link /api/platform-browser/bootstrapApplication bootstrapApplication}
35074
35300
  * @see {@link NgZoneOptions}
35075
35301
  */
35076
35302
  function provideZoneChangeDetection(options) {
@@ -39325,7 +39551,7 @@ function withDomHydration() {
39325
39551
  return;
39326
39552
  }
39327
39553
  if (inject(IS_HYDRATION_DOM_REUSE_ENABLED)) {
39328
- verifySsrContentsIntegrity();
39554
+ verifySsrContentsIntegrity(getDocument());
39329
39555
  enableHydrationRuntimeSupport();
39330
39556
  }
39331
39557
  else if (typeof ngDevMode !== 'undefined' && ngDevMode && !isClientRenderModeEnabled()) {
@@ -39467,35 +39693,6 @@ function logWarningOnStableTimedout(time, console) {
39467
39693
  `as a signal to complete hydration process.`;
39468
39694
  console.warn(formatRuntimeError(-506 /* RuntimeErrorCode.HYDRATION_STABLE_TIMEDOUT */, message));
39469
39695
  }
39470
- /**
39471
- * Verifies whether the DOM contains a special marker added during SSR time to make sure
39472
- * there is no SSR'ed contents transformations happen after SSR is completed. Typically that
39473
- * happens either by CDN or during the build process as an optimization to remove comment nodes.
39474
- * Hydration process requires comment nodes produced by Angular to locate correct DOM segments.
39475
- * When this special marker is *not* present - throw an error and do not proceed with hydration,
39476
- * since it will not be able to function correctly.
39477
- *
39478
- * Note: this function is invoked only on the client, so it's safe to use DOM APIs.
39479
- */
39480
- function verifySsrContentsIntegrity() {
39481
- const doc = getDocument();
39482
- let hydrationMarker;
39483
- for (const node of doc.body.childNodes) {
39484
- if (node.nodeType === Node.COMMENT_NODE &&
39485
- node.textContent?.trim() === SSR_CONTENT_INTEGRITY_MARKER) {
39486
- hydrationMarker = node;
39487
- break;
39488
- }
39489
- }
39490
- if (!hydrationMarker) {
39491
- throw new RuntimeError(-507 /* RuntimeErrorCode.MISSING_SSR_CONTENT_INTEGRITY_MARKER */, typeof ngDevMode !== 'undefined' &&
39492
- ngDevMode &&
39493
- 'Angular hydration logic detected that HTML content of this page was modified after it ' +
39494
- 'was produced during server side rendering. Make sure that there are no optimizations ' +
39495
- 'that remove comment nodes from HTML enabled on your CDN. Angular hydration ' +
39496
- 'relies on HTML produced by the server, including whitespaces and comment nodes.');
39497
- }
39498
- }
39499
39696
 
39500
39697
  /**
39501
39698
  * Transforms a value (typically a string) to a boolean.
@@ -39596,25 +39793,14 @@ function disableProfiling() {
39596
39793
  * can, optionally, return a value.
39597
39794
  */
39598
39795
  function untracked(nonReactiveReadsFn) {
39599
- const prevConsumer = setActiveConsumer(null);
39600
- // We are not trying to catch any particular errors here, just making sure that the consumers
39601
- // stack is restored in case of errors.
39602
- try {
39603
- return nonReactiveReadsFn();
39604
- }
39605
- finally {
39606
- setActiveConsumer(prevConsumer);
39607
- }
39796
+ return untracked$1(nonReactiveReadsFn);
39608
39797
  }
39609
39798
 
39610
39799
  /**
39611
39800
  * Create a computed `Signal` which derives a reactive value from an expression.
39612
39801
  */
39613
39802
  function computed(computation, options) {
39614
- const getter = createComputed(computation);
39615
- if (options?.equal) {
39616
- getter[SIGNAL].equal = options.equal;
39617
- }
39803
+ const getter = createComputed(computation, options?.equal);
39618
39804
  if (ngDevMode) {
39619
39805
  getter.toString = () => `[Computed: ${getter()}]`;
39620
39806
  getter[SIGNAL].debugName = options?.debugName;
@@ -40672,5 +40858,5 @@ const REQUEST_CONTEXT = new InjectionToken(typeof ngDevMode === 'undefined' || n
40672
40858
  factory: () => null,
40673
40859
  });
40674
40860
 
40675
- 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_TAG_NAME, Host, HostAttributeToken, HostBinding, HostListener, INJECTOR$1 as INJECTOR, Inject, 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, OutputEmitterRef, PACKAGE_ROOT_URL, PLATFORM_ID, PLATFORM_INITIALIZER, PendingTasks, Pipe, PlatformRef, Query, QueryList, REQUEST, REQUEST_CONTEXT, RESPONSE_INIT, Renderer2, RendererFactory2, RendererStyleFlags2, ResourceStatus, Sanitizer, SecurityContext, Self, SimpleChange, SkipSelf, TRANSLATIONS, TRANSLATIONS_FORMAT, TemplateRef, Testability, TestabilityRegistry, TransferState, Type, VERSION, Version, ViewChild, ViewChildren, ViewContainerRef, ViewEncapsulation, ViewRef, afterNextRender, afterRender, afterRenderEffect, asNativeElements, assertInInjectionContext, assertNotInReactiveContext, assertPlatform, booleanAttribute, computed, contentChild, contentChildren, createComponent, createEnvironmentInjector, createNgModule, createNgModuleRef, createPlatform, createPlatformFactory, defineInjectable, destroyPlatform, effect, enableProdMode, forwardRef, getDebugNode, getModuleFactory, getNgModuleById, getPlatform, importProvidersFrom, inject, input, inputBinding, isDevMode, isSignal, isStandalone, linkedSignal, makeEnvironmentProviders, makeStateKey, mergeApplicationConfig, model, numberAttribute, output, outputBinding, platformCore, provideAppInitializer, provideEnvironmentInitializer, provideExperimentalCheckNoChangesForDebug, provideExperimentalZonelessChangeDetection, providePlatformInitializer, provideZoneChangeDetection, reflectComponentType, resolveForwardRef, resource, runInInjectionContext, setTestabilityGetter, signal, untracked, viewChild, viewChildren, ALLOW_MULTIPLE_PLATFORMS as ɵALLOW_MULTIPLE_PLATFORMS, AfterRenderManager as ɵAfterRenderManager, CONTAINER_HEADER_OFFSET as ɵCONTAINER_HEADER_OFFSET, ChangeDetectionScheduler as ɵChangeDetectionScheduler, ChangeDetectionSchedulerImpl as ɵChangeDetectionSchedulerImpl, 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, ENABLE_ROOT_COMPONENT_BOOTSTRAP as ɵENABLE_ROOT_COMPONENT_BOOTSTRAP, EffectScheduler as ɵEffectScheduler, IMAGE_CONFIG as ɵIMAGE_CONFIG, IMAGE_CONFIG_DEFAULTS as ɵIMAGE_CONFIG_DEFAULTS, INJECTOR_SCOPE as ɵINJECTOR_SCOPE, ɵINPUT_SIGNAL_BRAND_WRITE_TYPE, INTERNAL_APPLICATION_ERROR_HANDLER as ɵINTERNAL_APPLICATION_ERROR_HANDLER, IS_HYDRATION_DOM_REUSE_ENABLED as ɵIS_HYDRATION_DOM_REUSE_ENABLED, IS_INCREMENTAL_HYDRATION_ENABLED as ɵIS_INCREMENTAL_HYDRATION_ENABLED, JSACTION_EVENT_CONTRACT as ɵJSACTION_EVENT_CONTRACT, LContext as ɵLContext, 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, PERFORMANCE_MARK_PREFIX as ɵPERFORMANCE_MARK_PREFIX, PROVIDED_NG_ZONE as ɵPROVIDED_NG_ZONE, PendingTasksInternal as ɵPendingTasksInternal, ReflectionCapabilities as ɵReflectionCapabilities, ComponentFactory as ɵRender3ComponentFactory, ComponentRef as ɵRender3ComponentRef, NgModuleRef as ɵRender3NgModuleRef, ResourceImpl as ɵResourceImpl, RuntimeError as ɵRuntimeError, SSR_CONTENT_INTEGRITY_MARKER as ɵSSR_CONTENT_INTEGRITY_MARKER, TESTABILITY as ɵTESTABILITY, TESTABILITY_GETTER as ɵTESTABILITY_GETTER, TracingAction as ɵTracingAction, TracingService as ɵTracingService, USE_RUNTIME_DEPS_TRACKER_FOR_JIT as ɵUSE_RUNTIME_DEPS_TRACKER_FOR_JIT, ViewRef$1 as ɵViewRef, XSS_SECURITY_URL as ɵXSS_SECURITY_URL, ZONELESS_ENABLED as ɵZONELESS_ENABLED, _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, detectChangesInViewIfRequired as ɵdetectChangesInViewIfRequired, devModeEqual as ɵdevModeEqual, disableProfiling as ɵdisableProfiling, enableProfiling as ɵenableProfiling, findLocaleData as ɵfindLocaleData, flushModuleScopingQueueAsMuchAsPossible as ɵflushModuleScopingQueueAsMuchAsPossible, formatRuntimeError as ɵformatRuntimeError, generateStandaloneInDeclarationsError as ɵgenerateStandaloneInDeclarationsError, getAsyncClassMetadataFn as ɵgetAsyncClassMetadataFn, getClosestComponentName as ɵgetClosestComponentName, getDebugNode as ɵgetDebugNode, getDeferBlocks$1 as ɵgetDeferBlocks, getDirectives as ɵgetDirectives, getHostElement as ɵgetHostElement, getInjectableDef as ɵgetInjectableDef, getLContext as ɵgetLContext, getLocaleCurrencyCode as ɵgetLocaleCurrencyCode, getLocalePluralCase as ɵgetLocalePluralCase, getOutputDestroyRef as ɵgetOutputDestroyRef, getSanitizationBypassType as ɵgetSanitizationBypassType, ɵgetUnknownElementStrictMode, ɵgetUnknownPropertyStrictMode, _global as ɵglobal, injectChangeDetectorRef as ɵinjectChangeDetectorRef, internalCreateApplication as ɵinternalCreateApplication, internalProvideZoneChangeDetection as ɵinternalProvideZoneChangeDetection, isBoundToModule as ɵisBoundToModule, isComponentDefPendingResolution as ɵisComponentDefPendingResolution, isEnvironmentProviders as ɵisEnvironmentProviders, isInjectable as ɵisInjectable, isNgModule as ɵisNgModule, isPromise as ɵisPromise, isSubscribable as ɵisSubscribable, isViewDirty as ɵisViewDirty, markForRefresh as ɵmarkForRefresh, noSideEffects as ɵnoSideEffects, patchComponentDefWithScope as ɵpatchComponentDefWithScope, performanceMarkFeature as ɵperformanceMarkFeature, publishExternalGlobalUtil as ɵpublishExternalGlobalUtil, readHydrationInfo as ɵreadHydrationInfo, registerLocaleData as ɵregisterLocaleData, renderDeferBlockState as ɵrenderDeferBlockState, resetCompiledComponents as ɵresetCompiledComponents, resetJitOptions as ɵresetJitOptions, resolveComponentResources as ɵresolveComponentResources, restoreComponentResolutionQueue as ɵrestoreComponentResolutionQueue, setAllowDuplicateNgModuleIdsForTest as ɵsetAllowDuplicateNgModuleIdsForTest, ɵsetClassDebugInfo, setClassMetadata as ɵsetClassMetadata, setClassMetadataAsync as ɵsetClassMetadataAsync, setDocument as ɵsetDocument, setInjectorProfilerContext as ɵsetInjectorProfilerContext, setLocaleId as ɵsetLocaleId, ɵsetUnknownElementStrictMode, ɵsetUnknownPropertyStrictMode, startMeasuring as ɵstartMeasuring, stopMeasuring as ɵstopMeasuring, store as ɵstore, stringify as ɵstringify, transitiveScopesFor as ɵtransitiveScopesFor, triggerResourceLoading as ɵtriggerResourceLoading, truncateMiddle as ɵtruncateMiddle, unregisterAllLocaleData as ɵunregisterLocaleData, unwrapSafeValue as ɵunwrapSafeValue, ɵunwrapWritableSignal, withDomHydration as ɵwithDomHydration, withEventReplay as ɵwithEventReplay, withI18nSupport as ɵwithI18nSupport, withIncrementalHydration as ɵwithIncrementalHydration, ɵɵCopyDefinitionFeature, ɵɵExternalStylesFeature, FactoryTarget as ɵɵFactoryTarget, ɵɵHostDirectivesFeature, ɵɵInheritDefinitionFeature, ɵɵNgOnChangesFeature, ɵɵProvidersFeature, ɵɵadvance, ɵɵattachSourceLocations, ɵɵattribute, ɵɵattributeInterpolate1, ɵɵattributeInterpolate2, ɵɵattributeInterpolate3, ɵɵattributeInterpolate4, ɵɵattributeInterpolate5, ɵɵattributeInterpolate6, ɵɵattributeInterpolate7, ɵɵattributeInterpolate8, ɵɵattributeInterpolateV, ɵɵclassMap, ɵɵclassMapInterpolate1, ɵɵclassMapInterpolate2, ɵɵclassMapInterpolate3, ɵɵclassMapInterpolate4, ɵɵclassMapInterpolate5, ɵɵclassMapInterpolate6, ɵɵclassMapInterpolate7, ɵɵclassMapInterpolate8, ɵɵclassMapInterpolateV, ɵɵclassProp, ɵɵcomponentInstance, ɵɵconditional, ɵɵcontentQuery, ɵɵcontentQuerySignal, ɵɵdeclareLet, ɵɵdefer, ɵɵdeferEnableTimerScheduling, ɵɵdeferHydrateNever, ɵɵdeferHydrateOnHover, ɵɵdeferHydrateOnIdle, ɵɵdeferHydrateOnImmediate, ɵɵdeferHydrateOnInteraction, ɵɵdeferHydrateOnTimer, ɵɵdeferHydrateOnViewport, ɵɵdeferHydrateWhen, ɵɵdeferOnHover, ɵɵdeferOnIdle, ɵɵdeferOnImmediate, ɵɵdeferOnInteraction, ɵɵdeferOnTimer, ɵɵdeferOnViewport, ɵɵdeferPrefetchOnHover, ɵɵdeferPrefetchOnIdle, ɵɵdeferPrefetchOnImmediate, ɵɵdeferPrefetchOnInteraction, ɵɵdeferPrefetchOnTimer, ɵɵdeferPrefetchOnViewport, ɵɵdeferPrefetchWhen, ɵɵdeferWhen, ɵɵdefineComponent, ɵɵdefineDirective, ɵɵ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, ɵɵngDeclareClassMetadataAsync, ɵɵ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, ɵɵqueryAdvance, ɵɵqueryRefresh, ɵɵreadContextLet, ɵɵreference, registerNgModuleType as ɵɵregisterNgModuleType, ɵɵrepeater, ɵɵrepeaterCreate, ɵɵrepeaterTrackByIdentity, ɵɵrepeaterTrackByIndex, ɵɵreplaceMetadata, ɵɵresetView, ɵɵresolveBody, ɵɵresolveDocument, ɵɵresolveWindow, ɵɵrestoreView, ɵɵsanitizeHtml, ɵɵsanitizeResourceUrl, ɵɵsanitizeScript, ɵɵsanitizeStyle, ɵɵsanitizeUrl, ɵɵsanitizeUrlOrResourceUrl, ɵɵsetComponentScope, ɵɵsetNgModuleScope, ɵɵstoreLet, ɵɵ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, ɵɵtwoWayBindingSet, ɵɵtwoWayListener, ɵɵtwoWayProperty, ɵɵvalidateIframeAttribute, ɵɵviewQuery, ɵɵviewQuerySignal };
40861
+ 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_TAG_NAME, Host, HostAttributeToken, HostBinding, HostListener, INJECTOR$1 as INJECTOR, Inject, 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, OutputEmitterRef, PACKAGE_ROOT_URL, PLATFORM_ID, PLATFORM_INITIALIZER, PendingTasks, Pipe, PlatformRef, Query, QueryList, REQUEST, REQUEST_CONTEXT, RESPONSE_INIT, Renderer2, RendererFactory2, RendererStyleFlags2, ResourceStatus, Sanitizer, SecurityContext, Self, SimpleChange, SkipSelf, TRANSLATIONS, TRANSLATIONS_FORMAT, TemplateRef, Testability, TestabilityRegistry, TransferState, Type, VERSION, Version, ViewChild, ViewChildren, ViewContainerRef, ViewEncapsulation, ViewRef, afterNextRender, afterRender, afterRenderEffect, asNativeElements, assertInInjectionContext, assertNotInReactiveContext, assertPlatform, booleanAttribute, computed, contentChild, contentChildren, createComponent, createEnvironmentInjector, createNgModule, createNgModuleRef, createPlatform, createPlatformFactory, defineInjectable, destroyPlatform, effect, enableProdMode, forwardRef, getDebugNode, getModuleFactory, getNgModuleById, getPlatform, importProvidersFrom, inject, input, inputBinding, isDevMode, isSignal, isStandalone, linkedSignal, makeEnvironmentProviders, makeStateKey, mergeApplicationConfig, model, numberAttribute, output, outputBinding, platformCore, provideAppInitializer, provideEnvironmentInitializer, provideExperimentalCheckNoChangesForDebug, provideExperimentalZonelessChangeDetection, providePlatformInitializer, provideZoneChangeDetection, reflectComponentType, resolveForwardRef, resource, runInInjectionContext, setTestabilityGetter, signal, twoWayBinding, untracked, viewChild, viewChildren, ALLOW_MULTIPLE_PLATFORMS as ɵALLOW_MULTIPLE_PLATFORMS, AfterRenderManager as ɵAfterRenderManager, CONTAINER_HEADER_OFFSET as ɵCONTAINER_HEADER_OFFSET, ChangeDetectionScheduler as ɵChangeDetectionScheduler, ChangeDetectionSchedulerImpl as ɵChangeDetectionSchedulerImpl, 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, ENABLE_ROOT_COMPONENT_BOOTSTRAP as ɵENABLE_ROOT_COMPONENT_BOOTSTRAP, EffectScheduler as ɵEffectScheduler, IMAGE_CONFIG as ɵIMAGE_CONFIG, IMAGE_CONFIG_DEFAULTS as ɵIMAGE_CONFIG_DEFAULTS, INJECTOR_SCOPE as ɵINJECTOR_SCOPE, ɵINPUT_SIGNAL_BRAND_WRITE_TYPE, INTERNAL_APPLICATION_ERROR_HANDLER as ɵINTERNAL_APPLICATION_ERROR_HANDLER, IS_HYDRATION_DOM_REUSE_ENABLED as ɵIS_HYDRATION_DOM_REUSE_ENABLED, IS_INCREMENTAL_HYDRATION_ENABLED as ɵIS_INCREMENTAL_HYDRATION_ENABLED, JSACTION_EVENT_CONTRACT as ɵJSACTION_EVENT_CONTRACT, LContext as ɵLContext, 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, PERFORMANCE_MARK_PREFIX as ɵPERFORMANCE_MARK_PREFIX, PROVIDED_NG_ZONE as ɵPROVIDED_NG_ZONE, PendingTasksInternal as ɵPendingTasksInternal, ReflectionCapabilities as ɵReflectionCapabilities, ComponentFactory as ɵRender3ComponentFactory, ComponentRef as ɵRender3ComponentRef, NgModuleRef as ɵRender3NgModuleRef, ResourceImpl as ɵResourceImpl, RuntimeError as ɵRuntimeError, SIGNAL as ɵSIGNAL, SSR_CONTENT_INTEGRITY_MARKER as ɵSSR_CONTENT_INTEGRITY_MARKER, TESTABILITY as ɵTESTABILITY, TESTABILITY_GETTER as ɵTESTABILITY_GETTER, TracingAction as ɵTracingAction, TracingService as ɵTracingService, USE_RUNTIME_DEPS_TRACKER_FOR_JIT as ɵUSE_RUNTIME_DEPS_TRACKER_FOR_JIT, ViewRef$1 as ɵViewRef, XSS_SECURITY_URL as ɵXSS_SECURITY_URL, ZONELESS_ENABLED as ɵZONELESS_ENABLED, _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, detectChangesInViewIfRequired as ɵdetectChangesInViewIfRequired, devModeEqual as ɵdevModeEqual, disableProfiling as ɵdisableProfiling, enableProfiling as ɵenableProfiling, findLocaleData as ɵfindLocaleData, flushModuleScopingQueueAsMuchAsPossible as ɵflushModuleScopingQueueAsMuchAsPossible, formatRuntimeError as ɵformatRuntimeError, generateStandaloneInDeclarationsError as ɵgenerateStandaloneInDeclarationsError, getAsyncClassMetadataFn as ɵgetAsyncClassMetadataFn, getClosestComponentName as ɵgetClosestComponentName, getDebugNode as ɵgetDebugNode, getDeferBlocks$1 as ɵgetDeferBlocks, getDirectives as ɵgetDirectives, getHostElement as ɵgetHostElement, getInjectableDef as ɵgetInjectableDef, getLContext as ɵgetLContext, getLocaleCurrencyCode as ɵgetLocaleCurrencyCode, getLocalePluralCase as ɵgetLocalePluralCase, getOutputDestroyRef as ɵgetOutputDestroyRef, getSanitizationBypassType as ɵgetSanitizationBypassType, ɵgetUnknownElementStrictMode, ɵgetUnknownPropertyStrictMode, _global as ɵglobal, injectChangeDetectorRef as ɵinjectChangeDetectorRef, internalCreateApplication as ɵinternalCreateApplication, internalProvideZoneChangeDetection as ɵinternalProvideZoneChangeDetection, isBoundToModule as ɵisBoundToModule, isComponentDefPendingResolution as ɵisComponentDefPendingResolution, isEnvironmentProviders as ɵisEnvironmentProviders, isInjectable as ɵisInjectable, isNgModule as ɵisNgModule, isPromise as ɵisPromise, isSubscribable as ɵisSubscribable, isViewDirty as ɵisViewDirty, markForRefresh as ɵmarkForRefresh, noSideEffects as ɵnoSideEffects, patchComponentDefWithScope as ɵpatchComponentDefWithScope, performanceMarkFeature as ɵperformanceMarkFeature, publishExternalGlobalUtil as ɵpublishExternalGlobalUtil, readHydrationInfo as ɵreadHydrationInfo, registerLocaleData as ɵregisterLocaleData, renderDeferBlockState as ɵrenderDeferBlockState, resetCompiledComponents as ɵresetCompiledComponents, resetJitOptions as ɵresetJitOptions, resolveComponentResources as ɵresolveComponentResources, restoreComponentResolutionQueue as ɵrestoreComponentResolutionQueue, setAllowDuplicateNgModuleIdsForTest as ɵsetAllowDuplicateNgModuleIdsForTest, ɵsetClassDebugInfo, setClassMetadata as ɵsetClassMetadata, setClassMetadataAsync as ɵsetClassMetadataAsync, setCurrentInjector as ɵsetCurrentInjector, setDocument as ɵsetDocument, setInjectorProfilerContext as ɵsetInjectorProfilerContext, setLocaleId as ɵsetLocaleId, ɵsetUnknownElementStrictMode, ɵsetUnknownPropertyStrictMode, startMeasuring as ɵstartMeasuring, stopMeasuring as ɵstopMeasuring, store as ɵstore, stringify as ɵstringify, transitiveScopesFor as ɵtransitiveScopesFor, triggerResourceLoading as ɵtriggerResourceLoading, truncateMiddle as ɵtruncateMiddle, unregisterAllLocaleData as ɵunregisterLocaleData, unwrapSafeValue as ɵunwrapSafeValue, ɵunwrapWritableSignal, withDomHydration as ɵwithDomHydration, withEventReplay as ɵwithEventReplay, withI18nSupport as ɵwithI18nSupport, withIncrementalHydration as ɵwithIncrementalHydration, ɵɵCopyDefinitionFeature, ɵɵExternalStylesFeature, FactoryTarget as ɵɵFactoryTarget, ɵɵHostDirectivesFeature, ɵɵInheritDefinitionFeature, ɵɵNgOnChangesFeature, ɵɵProvidersFeature, ɵɵadvance, ɵɵattachSourceLocations, ɵɵattribute, ɵɵattributeInterpolate1, ɵɵattributeInterpolate2, ɵɵattributeInterpolate3, ɵɵattributeInterpolate4, ɵɵattributeInterpolate5, ɵɵattributeInterpolate6, ɵɵattributeInterpolate7, ɵɵattributeInterpolate8, ɵɵattributeInterpolateV, ɵɵclassMap, ɵɵclassMapInterpolate1, ɵɵclassMapInterpolate2, ɵɵclassMapInterpolate3, ɵɵclassMapInterpolate4, ɵɵclassMapInterpolate5, ɵɵclassMapInterpolate6, ɵɵclassMapInterpolate7, ɵɵclassMapInterpolate8, ɵɵclassMapInterpolateV, ɵɵclassProp, ɵɵcomponentInstance, ɵɵconditional, ɵɵconditionalBranchCreate, ɵɵconditionalCreate, ɵɵcontentQuery, ɵɵcontentQuerySignal, ɵɵdeclareLet, ɵɵdefer, ɵɵdeferEnableTimerScheduling, ɵɵdeferHydrateNever, ɵɵdeferHydrateOnHover, ɵɵdeferHydrateOnIdle, ɵɵdeferHydrateOnImmediate, ɵɵdeferHydrateOnInteraction, ɵɵdeferHydrateOnTimer, ɵɵdeferHydrateOnViewport, ɵɵdeferHydrateWhen, ɵɵdeferOnHover, ɵɵdeferOnIdle, ɵɵdeferOnImmediate, ɵɵdeferOnInteraction, ɵɵdeferOnTimer, ɵɵdeferOnViewport, ɵɵdeferPrefetchOnHover, ɵɵdeferPrefetchOnIdle, ɵɵdeferPrefetchOnImmediate, ɵɵdeferPrefetchOnInteraction, ɵɵdeferPrefetchOnTimer, ɵɵdeferPrefetchOnViewport, ɵɵdeferPrefetchWhen, ɵɵdeferWhen, ɵɵdefineComponent, ɵɵdefineDirective, ɵɵ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, ɵɵngDeclareClassMetadataAsync, ɵɵ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, ɵɵqueryAdvance, ɵɵqueryRefresh, ɵɵreadContextLet, ɵɵreference, registerNgModuleType as ɵɵregisterNgModuleType, ɵɵrepeater, ɵɵrepeaterCreate, ɵɵrepeaterTrackByIdentity, ɵɵrepeaterTrackByIndex, ɵɵreplaceMetadata, ɵɵresetView, ɵɵresolveBody, ɵɵresolveDocument, ɵɵresolveWindow, ɵɵrestoreView, ɵɵsanitizeHtml, ɵɵsanitizeResourceUrl, ɵɵsanitizeScript, ɵɵsanitizeStyle, ɵɵsanitizeUrl, ɵɵsanitizeUrlOrResourceUrl, ɵɵsetComponentScope, ɵɵsetNgModuleScope, ɵɵstoreLet, ɵɵ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, ɵɵtwoWayBindingSet, ɵɵtwoWayListener, ɵɵtwoWayProperty, ɵɵvalidateIframeAttribute, ɵɵviewQuery, ɵɵviewQuerySignal };
40676
40862
  //# sourceMappingURL=core.mjs.map