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

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 (49) hide show
  1. package/fesm2022/core.mjs +413 -365
  2. package/fesm2022/core.mjs.map +1 -1
  3. package/fesm2022/primitives/di.mjs +3 -2
  4. package/fesm2022/primitives/di.mjs.map +1 -1
  5. package/fesm2022/primitives/event-dispatch.mjs +1 -1
  6. package/fesm2022/primitives/signals.mjs +28 -7
  7. package/fesm2022/primitives/signals.mjs.map +1 -1
  8. package/fesm2022/rxjs-interop.mjs +1 -8
  9. package/fesm2022/rxjs-interop.mjs.map +1 -1
  10. package/fesm2022/testing.mjs +2 -10
  11. package/fesm2022/testing.mjs.map +1 -1
  12. package/fesm2022/weak_ref-DrMdAIDh.mjs +1 -1
  13. package/index.d.ts +7523 -7489
  14. package/navigation_types.d-u4EOrrdZ.d.ts +1 -1
  15. package/package.json +2 -2
  16. package/primitives/di/index.d.ts +25 -10
  17. package/primitives/event-dispatch/index.d.ts +1 -1
  18. package/primitives/signals/index.d.ts +9 -6
  19. package/rxjs-interop/index.d.ts +1 -10
  20. package/schematics/bundles/{apply_import_manager-CyRT0UvU.js → apply_import_manager-BXQEjo09.js} +6 -6
  21. package/schematics/bundles/{checker-DF8ZaFW5.js → checker-BHb19MHt.js} +629 -71
  22. package/schematics/bundles/cleanup-unused-imports.js +42 -69
  23. package/schematics/bundles/{compiler_host-Da636uJ8.js → compiler_host-Bk3repE2.js} +2 -2
  24. package/schematics/bundles/control-flow-migration.js +3 -3
  25. package/schematics/bundles/imports-CIX-JgAN.js +1 -1
  26. package/schematics/bundles/{index-DnkWgagp.js → index-BL9kAIe5.js} +11 -11
  27. package/schematics/bundles/{program-BZk27Ndu.js → index-I8VbxQcO.js} +2234 -2097
  28. package/schematics/bundles/inject-flags.js +18 -52
  29. package/schematics/bundles/inject-migration.js +3 -3
  30. package/schematics/bundles/leading_space-D9nQ8UQC.js +1 -1
  31. package/schematics/bundles/{migrate_ts_type_references-DtkOnnv0.js → migrate_ts_type_references-KlOTWeDl.js} +20 -20
  32. package/schematics/bundles/ng_decorators-DznZ5jMl.js +1 -1
  33. package/schematics/bundles/nodes-B16H9JUd.js +1 -1
  34. package/schematics/bundles/output-migration.js +62 -90
  35. package/schematics/bundles/project_tsconfig_paths-CDVxT6Ov.js +1 -1
  36. package/schematics/bundles/property_name-BBwFuqMe.js +1 -1
  37. package/schematics/bundles/route-lazy-loading.js +3 -3
  38. package/schematics/bundles/{project_paths-Jtbi76Bs.js → run_in_devkit-C0JPtK2u.js} +262 -197
  39. package/schematics/bundles/self-closing-tags-migration.js +41 -71
  40. package/schematics/bundles/signal-input-migration.js +69 -97
  41. package/schematics/bundles/signal-queries-migration.js +80 -108
  42. package/schematics/bundles/signals.js +11 -11
  43. package/schematics/bundles/standalone-migration.js +8 -22
  44. package/schematics/bundles/symbol-VPWguRxr.js +25 -0
  45. package/schematics/bundles/test-bed-get.js +98 -0
  46. package/schematics/migrations.json +5 -0
  47. package/testing/index.d.ts +1 -3
  48. package/weak_ref.d-ttyj86RV.d.ts +1 -1
  49. package/schematics/bundles/index-vGJcp5M7.js +0 -30
package/fesm2022/core.mjs CHANGED
@@ -1,10 +1,10 @@
1
1
  /**
2
- * @license Angular v20.0.0-next.2
2
+ * @license Angular v20.0.0-next.3
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';
7
+ import { SIGNAL_NODE, signalSetFn, SIGNAL, producerAccessed, getActiveConsumer, setActiveConsumer, createSignal, signalUpdateFn, consumerDestroy, REACTIVE_NODE, consumerPollProducersForChange, consumerBeforeComputation, consumerAfterComputation, createComputed, setThrowInvalidWriteToSignalError, untracked as untracked$1, isInNotificationPhase, createLinkedSignal, linkedSignalSetFn, linkedSignalUpdateFn } from '@angular/core/primitives/signals';
8
8
  export { SIGNAL as ɵSIGNAL } from '@angular/core/primitives/signals';
9
9
  import { getCurrentInjector, setCurrentInjector } from '@angular/core/primitives/di';
10
10
  export { setCurrentInjector as ɵsetCurrentInjector } from '@angular/core/primitives/di';
@@ -99,7 +99,12 @@ function createInputSignal(initialValue, options) {
99
99
  // Record that someone looked at this signal.
100
100
  producerAccessed(node);
101
101
  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.');
102
+ let message = null;
103
+ if (ngDevMode) {
104
+ const name = options?.debugName ?? options?.alias;
105
+ message = `Input${name ? ` "${name}"` : ''} is required but no value is available yet.`;
106
+ }
107
+ throw new RuntimeError(-950 /* RuntimeErrorCode.REQUIRED_INPUT_NO_VALUE */, message);
103
108
  }
104
109
  return node.value;
105
110
  }
@@ -506,6 +511,11 @@ function assertGreaterThanOrEqual(actual, expected, msg) {
506
511
  throwError(msg, actual, expected, '>=');
507
512
  }
508
513
  }
514
+ function assertNotDefined(actual, msg) {
515
+ if (actual != null) {
516
+ throwError(msg, actual, null, '==');
517
+ }
518
+ }
509
519
  function assertDefined(actual, msg) {
510
520
  if (actual == null) {
511
521
  throwError(msg, actual, null, '!=');
@@ -6263,11 +6273,8 @@ function ɵunwrapWritableSignal(value) {
6263
6273
  * Create a `Signal` that can be set or updated directly.
6264
6274
  */
6265
6275
  function signal(initialValue, options) {
6266
- const signalFn = createSignal(initialValue);
6276
+ const signalFn = createSignal(initialValue, options?.equal);
6267
6277
  const node = signalFn[SIGNAL];
6268
- if (options?.equal) {
6269
- node.equal = options.equal;
6270
- }
6271
6278
  signalFn.set = (newValue) => signalSetFn(node, newValue);
6272
6279
  signalFn.update = (updateFn) => signalUpdateFn(node, updateFn);
6273
6280
  signalFn.asReadonly = signalAsReadonlyFn.bind(signalFn);
@@ -7300,7 +7307,7 @@ function sortListeners(a, b) {
7300
7307
  function isDirectiveDefHack(obj) {
7301
7308
  return (obj.type !== undefined &&
7302
7309
  obj.declaredInputs !== undefined &&
7303
- obj.findHostDirectiveDefs !== undefined);
7310
+ obj.resolveHostDirectives !== undefined);
7304
7311
  }
7305
7312
  /** Asserts that a value is a DOM Element. */
7306
7313
  function assertDomElement(value) {
@@ -9947,6 +9954,56 @@ function processBlockData(injector) {
9947
9954
  }
9948
9955
  return blockDetails;
9949
9956
  }
9957
+ function isSsrContentsIntegrity(node) {
9958
+ return (!!node &&
9959
+ node.nodeType === Node.COMMENT_NODE &&
9960
+ node.textContent?.trim() === SSR_CONTENT_INTEGRITY_MARKER);
9961
+ }
9962
+ function skipTextNodes(node) {
9963
+ // Ignore whitespace. Before the <body>, we shouldn't find text nodes that aren't whitespace.
9964
+ while (node && node.nodeType === Node.TEXT_NODE) {
9965
+ node = node.previousSibling;
9966
+ }
9967
+ return node;
9968
+ }
9969
+ /**
9970
+ * Verifies whether the DOM contains a special marker added during SSR time to make sure
9971
+ * there is no SSR'ed contents transformations happen after SSR is completed. Typically that
9972
+ * happens either by CDN or during the build process as an optimization to remove comment nodes.
9973
+ * Hydration process requires comment nodes produced by Angular to locate correct DOM segments.
9974
+ * When this special marker is *not* present - throw an error and do not proceed with hydration,
9975
+ * since it will not be able to function correctly.
9976
+ *
9977
+ * Note: this function is invoked only on the client, so it's safe to use DOM APIs.
9978
+ */
9979
+ function verifySsrContentsIntegrity(doc) {
9980
+ for (const node of doc.body.childNodes) {
9981
+ if (isSsrContentsIntegrity(node)) {
9982
+ return;
9983
+ }
9984
+ }
9985
+ // Check if the HTML parser may have moved the marker to just before the <body> tag,
9986
+ // e.g. because the body tag was implicit and not present in the markup. An implicit body
9987
+ // tag is unlikely to interfer with whitespace/comments inside of the app's root element.
9988
+ // Case 1: Implicit body. Example:
9989
+ // <!doctype html><head><title>Hi</title></head><!--nghm--><app-root></app-root>
9990
+ const beforeBody = skipTextNodes(doc.body.previousSibling);
9991
+ if (isSsrContentsIntegrity(beforeBody)) {
9992
+ return;
9993
+ }
9994
+ // Case 2: Implicit body & head. Example:
9995
+ // <!doctype html><head><title>Hi</title><!--nghm--><app-root></app-root>
9996
+ let endOfHead = skipTextNodes(doc.head.lastChild);
9997
+ if (isSsrContentsIntegrity(endOfHead)) {
9998
+ return;
9999
+ }
10000
+ throw new RuntimeError(-507 /* RuntimeErrorCode.MISSING_SSR_CONTENT_INTEGRITY_MARKER */, typeof ngDevMode !== 'undefined' &&
10001
+ ngDevMode &&
10002
+ 'Angular hydration logic detected that HTML content of this page was modified after it ' +
10003
+ 'was produced during server side rendering. Make sure that there are no optimizations ' +
10004
+ 'that remove comment nodes from HTML enabled on your CDN. Angular hydration ' +
10005
+ 'relies on HTML produced by the server, including whitespaces and comment nodes.');
10006
+ }
9950
10007
 
9951
10008
  /** Refreshes all content queries declared by directives in a given view */
9952
10009
  function refreshContentQueries(tView, lView) {
@@ -12704,17 +12761,6 @@ function handleUncaughtError(lView, error) {
12704
12761
  const errorHandler = injector.get(INTERNAL_APPLICATION_ERROR_HANDLER, null);
12705
12762
  errorHandler?.(error);
12706
12763
  }
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
12764
  /**
12719
12765
  * Set all directive inputs with the specific public name on the node.
12720
12766
  *
@@ -17283,15 +17329,15 @@ function resolveDirectives(tView, lView, tNode, localRefs, directiveMatcher) {
17283
17329
  const exportsMap = localRefs === null ? null : { '': -1 };
17284
17330
  const matchedDirectiveDefs = directiveMatcher(tView, tNode);
17285
17331
  if (matchedDirectiveDefs !== null) {
17286
- let directiveDefs;
17332
+ let directiveDefs = matchedDirectiveDefs;
17287
17333
  let hostDirectiveDefs = null;
17288
17334
  let hostDirectiveRanges = null;
17289
- const hostDirectiveResolution = resolveHostDirectives(matchedDirectiveDefs);
17290
- if (hostDirectiveResolution === null) {
17291
- directiveDefs = matchedDirectiveDefs;
17292
- }
17293
- else {
17294
- [directiveDefs, hostDirectiveDefs, hostDirectiveRanges] = hostDirectiveResolution;
17335
+ for (const def of matchedDirectiveDefs) {
17336
+ if (def.resolveHostDirectives !== null) {
17337
+ [directiveDefs, hostDirectiveDefs, hostDirectiveRanges] =
17338
+ def.resolveHostDirectives(matchedDirectiveDefs);
17339
+ break;
17340
+ }
17295
17341
  }
17296
17342
  ngDevMode && assertNoDuplicateDirectives(directiveDefs);
17297
17343
  initializeDirectives(tView, lView, tNode, directiveDefs, exportsMap, hostDirectiveDefs, hostDirectiveRanges);
@@ -17313,67 +17359,6 @@ function cacheMatchingLocalNames(tNode, localRefs, exportsMap) {
17313
17359
  localNames.push(localRefs[i], index);
17314
17360
  }
17315
17361
  }
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
17362
  /**
17378
17363
  * Marks a given TNode as a component's host. This consists of:
17379
17364
  * - setting the component offset on the TNode.
@@ -17887,213 +17872,6 @@ function bindingUpdated4(lView, bindingIndex, exp1, exp2, exp3, exp4) {
17887
17872
  return bindingUpdated2(lView, bindingIndex + 2, exp3, exp4) || different;
17888
17873
  }
17889
17874
 
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
17875
  /**
18098
17876
  * Wraps an event listener with a function that marks ancestors dirty and prevents default behavior,
18099
17877
  * if applicable.
@@ -18129,14 +17907,43 @@ function wrapListener(tNode, lView, context, listenerFn) {
18129
17907
  return result;
18130
17908
  };
18131
17909
  }
17910
+ function executeListenerWithErrorHandling(lView, context, listenerFn, e) {
17911
+ const prevConsumer = setActiveConsumer(null);
17912
+ try {
17913
+ profiler(6 /* ProfilerEvent.OutputStart */, context, listenerFn);
17914
+ // Only explicitly returning false from a listener should preventDefault
17915
+ return listenerFn(e) !== false;
17916
+ }
17917
+ catch (error) {
17918
+ // TODO(atscott): This should report to the application error handler, not the ErrorHandler on LView injector
17919
+ handleError(lView, error);
17920
+ return false;
17921
+ }
17922
+ finally {
17923
+ profiler(7 /* ProfilerEvent.OutputEnd */, context, listenerFn);
17924
+ setActiveConsumer(prevConsumer);
17925
+ }
17926
+ }
18132
17927
  /**
18133
- * Whether the given value represents a subscribable output.
18134
- *
18135
- * For example, an `EventEmitter, a `Subject`, an `Observable` or an
18136
- * `OutputEmitter`.
17928
+ * Handles an error thrown in an LView.
17929
+ * @deprecated Use handleUncaughtError to report to application error handler
18137
17930
  */
18138
- function isOutputSubscribable(value) {
18139
- return (value != null && typeof value.subscribe === 'function');
17931
+ function handleError(lView, error) {
17932
+ const injector = lView[INJECTOR];
17933
+ if (!injector) {
17934
+ return;
17935
+ }
17936
+ injector.get(ErrorHandler, null)?.handleError(error);
17937
+ }
17938
+
17939
+ function createOutputListener(tNode, lView, listenerFn, targetDef, eventName) {
17940
+ // TODO(pk): decouple checks from the actual binding
17941
+ const wrappedListener = wrapListener(tNode, lView, lView[CONTEXT], listenerFn);
17942
+ // TODO(pk): simplify signature of listenToDirectiveOutput
17943
+ const hasBound = listenToDirectiveOutput(tNode, lView[TVIEW], lView, targetDef, eventName, wrappedListener);
17944
+ if (!hasBound && ngDevMode) {
17945
+ throw new RuntimeError(316 /* RuntimeErrorCode.INVALID_BINDING_TARGET */, `${stringifyForError(targetDef.type)} does not have an output with a public name of "${eventName}".`);
17946
+ }
18140
17947
  }
18141
17948
  /** Listens to an output on a specific directive. */
18142
17949
  function listenToDirectiveOutput(tNode, tView, lView, target, eventName, listenerFn) {
@@ -18172,13 +17979,36 @@ function listenToDirectiveOutput(tNode, tView, lView, target, eventName, listene
18172
17979
  }
18173
17980
  }
18174
17981
  }
18175
- if (hostIndex !== null && target.outputs.hasOwnProperty(eventName)) {
17982
+ if (target.outputs.hasOwnProperty(eventName)) {
18176
17983
  ngDevMode && assertIndexInRange(lView, hostIndex);
18177
17984
  hasOutput = true;
18178
17985
  listenToOutput(tNode, tView, lView, hostIndex, eventName, eventName, listenerFn, lCleanup, tCleanup);
18179
17986
  }
18180
17987
  return hasOutput;
18181
17988
  }
17989
+ function listenToOutput(tNode, tView, lView, index, lookupName, eventName, listenerFn, lCleanup, tCleanup) {
17990
+ ngDevMode && assertIndexInRange(lView, index);
17991
+ const instance = lView[index];
17992
+ const def = tView.data[index];
17993
+ const propertyName = def.outputs[lookupName];
17994
+ const output = instance[propertyName];
17995
+ if (ngDevMode && !isOutputSubscribable(output)) {
17996
+ throw new Error(`@Output ${propertyName} not initialized in '${instance.constructor.name}'.`);
17997
+ }
17998
+ const subscription = output.subscribe(listenerFn);
17999
+ const idx = lCleanup.length;
18000
+ lCleanup.push(listenerFn, subscription);
18001
+ tCleanup && tCleanup.push(eventName, tNode.index, idx, -(idx + 1));
18002
+ }
18003
+ /**
18004
+ * Whether the given value represents a subscribable output.
18005
+ *
18006
+ * For example, an `EventEmitter, a `Subject`, an `Observable` or an
18007
+ * `OutputEmitter`.
18008
+ */
18009
+ function isOutputSubscribable(value) {
18010
+ return (value != null && typeof value.subscribe === 'function');
18011
+ }
18182
18012
 
18183
18013
  /*!
18184
18014
  * @license
@@ -18272,18 +18102,53 @@ function outputBinding(eventName, listener) {
18272
18102
  throw new RuntimeError(315 /* RuntimeErrorCode.NO_BINDING_TARGET */, `Output binding to "${eventName}" does not have a target.`);
18273
18103
  }
18274
18104
  const lView = getLView();
18275
- const tView = getTView();
18276
18105
  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
- }
18106
+ createOutputListener(tNode, lView, listener, target, eventName);
18283
18107
  },
18284
18108
  };
18285
18109
  return binding;
18286
18110
  }
18111
+ /**
18112
+ * Creates a two-way binding.
18113
+ * @param eventName Public name of the two-way compatible input.
18114
+ * @param value Writable signal from which to get the current value and to which to write new
18115
+ * values.
18116
+ *
18117
+ * ### Usage example
18118
+ * In this example we create an instance of the `MyCheckbox` component and bind to its `value`
18119
+ * input using a two-way binding.
18120
+ *
18121
+ * ```
18122
+ * const checkboxValue = signal('');
18123
+ *
18124
+ * createComponent(MyCheckbox, {
18125
+ * bindings: [
18126
+ * twoWayBinding('value', checkboxValue),
18127
+ * ],
18128
+ * });
18129
+ * ```
18130
+ */
18131
+ function twoWayBinding(publicName, value) {
18132
+ const input = inputBinding(publicName, value);
18133
+ const output = outputBinding(publicName + 'Change', (eventValue) => value.set(eventValue));
18134
+ // We take advantage of inputs only having a `create` block and outputs only having an `update`
18135
+ // block by passing them through directly instead of creating dedicated functions here. This
18136
+ // assumption can break down if one of them starts targeting both blocks. These assertions
18137
+ // are here to help us catch it if something changes in the future.
18138
+ ngDevMode && assertNotDefined(input.create, 'Unexpected `create` callback in inputBinding');
18139
+ ngDevMode && assertNotDefined(output.update, 'Unexpected `update` callback in outputBinding');
18140
+ return {
18141
+ [BINDING]: {
18142
+ kind: 'twoWay',
18143
+ requiredVars: input[BINDING].requiredVars + output[BINDING].requiredVars,
18144
+ },
18145
+ set target(target) {
18146
+ input.target = output.target = target;
18147
+ },
18148
+ create: output.create,
18149
+ update: input.update,
18150
+ };
18151
+ }
18287
18152
 
18288
18153
  class ComponentFactoryResolver extends ComponentFactoryResolver$1 {
18289
18154
  ngModule;
@@ -18476,7 +18341,7 @@ class ComponentFactory extends ComponentFactory$1 {
18476
18341
  }
18477
18342
  function createRootTView(rootSelectorOrNode, componentDef, componentBindings, directives) {
18478
18343
  const tAttributes = rootSelectorOrNode
18479
- ? ['ng-version', '20.0.0-next.2']
18344
+ ? ['ng-version', '20.0.0-next.3']
18480
18345
  : // Extract attributes and classes from the first selector only to match VE behavior.
18481
18346
  extractAttrsAndClassesFromSelector(componentDef.selectors[0]);
18482
18347
  let creationBindings = null;
@@ -18534,7 +18399,8 @@ function getRootTViewTemplate(creationBindings, updateBindings) {
18534
18399
  };
18535
18400
  }
18536
18401
  function isInputBinding(binding) {
18537
- return binding[BINDING].kind === 'input';
18402
+ const kind = binding[BINDING].kind;
18403
+ return kind === 'input' || kind === 'twoWay';
18538
18404
  }
18539
18405
  /**
18540
18406
  * Represents an instance of a Component created via a {@link ComponentFactory}.
@@ -18566,7 +18432,7 @@ class ComponentRef extends ComponentRef$1 {
18566
18432
  }
18567
18433
  setInput(name, value) {
18568
18434
  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.');
18435
+ throw new RuntimeError(317 /* RuntimeErrorCode.INVALID_SET_INPUT_CALL */, 'Cannot call `setInput` on a component that is using the `inputBinding` or `twoWayBinding` functions.');
18570
18436
  }
18571
18437
  const tNode = this._tNode;
18572
18438
  this.previousInputValues ??= new Map();
@@ -20520,7 +20386,7 @@ function getNgDirectiveDef(directiveDefinition) {
20520
20386
  viewQuery: directiveDefinition.viewQuery || null,
20521
20387
  features: directiveDefinition.features || null,
20522
20388
  setInput: null,
20523
- findHostDirectiveDefs: null,
20389
+ resolveHostDirectives: null,
20524
20390
  hostDirectives: null,
20525
20391
  inputs: parseAndConvertInputsForDefinition(directiveDefinition.inputs, declaredInputs),
20526
20392
  outputs: parseAndConvertOutputsForDefinition(directiveDefinition.outputs),
@@ -20878,7 +20744,7 @@ function ɵɵHostDirectivesFeature(rawHostDirectives) {
20878
20744
  const feature = (definition) => {
20879
20745
  const isEager = Array.isArray(rawHostDirectives);
20880
20746
  if (definition.hostDirectives === null) {
20881
- definition.findHostDirectiveDefs = findHostDirectiveDefs;
20747
+ definition.resolveHostDirectives = resolveHostDirectives;
20882
20748
  definition.hostDirectives = isEager
20883
20749
  ? rawHostDirectives.map(createHostDirectiveDef)
20884
20750
  : [rawHostDirectives];
@@ -20893,6 +20759,50 @@ function ɵɵHostDirectivesFeature(rawHostDirectives) {
20893
20759
  feature.ngInherit = true;
20894
20760
  return feature;
20895
20761
  }
20762
+ /**
20763
+ * Function that will be patched onto a definition to enable host directives. It is intended to
20764
+ * be called once during directive matching and is the same for all definitions.
20765
+ * @param matches Directives resolved through selector matching.
20766
+ */
20767
+ function resolveHostDirectives(matches) {
20768
+ const allDirectiveDefs = [];
20769
+ let hasComponent = false;
20770
+ let hostDirectiveDefs = null;
20771
+ let hostDirectiveRanges = null;
20772
+ // Components are inserted at the front of the matches array so that their lifecycle
20773
+ // hooks run before any directive lifecycle hooks. This appears to be for ViewEngine
20774
+ // compatibility. This logic doesn't make sense with host directives, because it
20775
+ // would allow the host directives to undo any overrides the host may have made.
20776
+ // To handle this case, the host directives of components are inserted at the beginning
20777
+ // of the array, followed by the component. As such, the insertion order is as follows:
20778
+ // 1. Host directives belonging to the selector-matched component.
20779
+ // 2. Selector-matched component.
20780
+ // 3. Host directives belonging to selector-matched directives.
20781
+ // 4. Selector-matched dir
20782
+ for (let i = 0; i < matches.length; i++) {
20783
+ const def = matches[i];
20784
+ if (def.hostDirectives !== null) {
20785
+ const start = allDirectiveDefs.length;
20786
+ hostDirectiveDefs ??= new Map();
20787
+ hostDirectiveRanges ??= new Map();
20788
+ // TODO(pk): probably could return matches instead of taking in an array to fill in?
20789
+ findHostDirectiveDefs(def, allDirectiveDefs, hostDirectiveDefs);
20790
+ // Note that these indexes are within the offset by `directiveStart`. We can't do the
20791
+ // offsetting here, because `directiveStart` hasn't been initialized on the TNode yet.
20792
+ hostDirectiveRanges.set(def, [start, allDirectiveDefs.length - 1]);
20793
+ }
20794
+ // Component definition is always first and needs to be
20795
+ // pushed early to maintain the correct ordering.
20796
+ if (i === 0 && isComponentDef(def)) {
20797
+ hasComponent = true;
20798
+ allDirectiveDefs.push(def);
20799
+ }
20800
+ }
20801
+ for (let i = hasComponent ? 1 : 0; i < matches.length; i++) {
20802
+ allDirectiveDefs.push(matches[i]);
20803
+ }
20804
+ return [allDirectiveDefs, hostDirectiveDefs, hostDirectiveRanges];
20805
+ }
20896
20806
  function findHostDirectiveDefs(currentDef, matchedDefs, hostDirectiveDefs) {
20897
20807
  if (currentDef.hostDirectives !== null) {
20898
20808
  for (const configOrFn of currentDef.hostDirectives) {
@@ -21283,8 +21193,9 @@ function onTimer(delay) {
21283
21193
  */
21284
21194
  function scheduleTimerTrigger(delay, callback, injector) {
21285
21195
  const scheduler = injector.get(TimerScheduler);
21196
+ const ngZone = injector.get(NgZone);
21286
21197
  const cleanupFn = () => scheduler.remove(callback);
21287
- scheduler.add(delay, callback);
21198
+ scheduler.add(delay, callback, ngZone);
21288
21199
  return cleanupFn;
21289
21200
  }
21290
21201
  /**
@@ -21310,10 +21221,10 @@ class TimerScheduler {
21310
21221
  // the current callback invocation. The shape of this list is the same
21311
21222
  // as the shape of the `current` list.
21312
21223
  deferred = [];
21313
- add(delay, callback) {
21224
+ add(delay, callback, ngZone) {
21314
21225
  const target = this.executingCallbacks ? this.deferred : this.current;
21315
21226
  this.addToQueue(target, Date.now() + delay, callback);
21316
- this.scheduleTimer();
21227
+ this.scheduleTimer(ngZone);
21317
21228
  }
21318
21229
  remove(callback) {
21319
21230
  const { current, deferred } = this;
@@ -21359,7 +21270,7 @@ class TimerScheduler {
21359
21270
  }
21360
21271
  return index;
21361
21272
  }
21362
- scheduleTimer() {
21273
+ scheduleTimer(ngZone) {
21363
21274
  const callback = () => {
21364
21275
  this.clearTimeout();
21365
21276
  this.executingCallbacks = true;
@@ -21409,7 +21320,7 @@ class TimerScheduler {
21409
21320
  }
21410
21321
  this.deferred.length = 0;
21411
21322
  }
21412
- this.scheduleTimer();
21323
+ this.scheduleTimer(ngZone);
21413
21324
  };
21414
21325
  // Avoid running timer callbacks more than once per
21415
21326
  // average frame duration. This is needed for better
@@ -21432,7 +21343,9 @@ class TimerScheduler {
21432
21343
  this.clearTimeout();
21433
21344
  const timeout = Math.max(invokeAt - now, FRAME_DURATION_MS);
21434
21345
  this.invokeTimerAt = invokeAt;
21435
- this.timeoutId = setTimeout(callback, timeout);
21346
+ this.timeoutId = ngZone.runOutsideAngular(() => {
21347
+ return setTimeout(() => ngZone.run(callback), timeout);
21348
+ });
21436
21349
  }
21437
21350
  }
21438
21351
  }
@@ -30446,6 +30359,181 @@ function ɵɵi18nPostprocess(message, replacements = {}) {
30446
30359
  return i18nPostprocess(message, replacements);
30447
30360
  }
30448
30361
 
30362
+ /**
30363
+ * Contains a reference to a function that disables event replay feature
30364
+ * for server-side rendered applications. This function is overridden with
30365
+ * an actual implementation when the event replay feature is enabled via
30366
+ * `withEventReplay()` call.
30367
+ */
30368
+ let stashEventListener = (el, eventName, listenerFn) => { };
30369
+ function setStashFn(fn) {
30370
+ stashEventListener = fn;
30371
+ }
30372
+ /**
30373
+ * Adds an event listener to the current node.
30374
+ *
30375
+ * If an output exists on one of the node's directives, it also subscribes to the output
30376
+ * and saves the subscription for later cleanup.
30377
+ *
30378
+ * @param eventName Name of the event
30379
+ * @param listenerFn The function to be called when event emits
30380
+ * @param eventTargetResolver Function that returns global target information in case this listener
30381
+ * should be attached to a global object like window, document or body
30382
+ *
30383
+ * @codeGenApi
30384
+ */
30385
+ function ɵɵlistener(eventName, listenerFn, eventTargetResolver) {
30386
+ const lView = getLView();
30387
+ const tView = getTView();
30388
+ const tNode = getCurrentTNode();
30389
+ listenerInternal(tView, lView, lView[RENDERER], tNode, eventName, listenerFn, eventTargetResolver);
30390
+ return ɵɵlistener;
30391
+ }
30392
+ /**
30393
+ * Registers a synthetic host listener (e.g. `(@foo.start)`) on a component or directive.
30394
+ *
30395
+ * This instruction is for compatibility purposes and is designed to ensure that a
30396
+ * synthetic host listener (e.g. `@HostListener('@foo.start')`) properly gets rendered
30397
+ * in the component's renderer. Normally all host listeners are evaluated with the
30398
+ * parent component's renderer, but, in the case of animation @triggers, they need
30399
+ * to be evaluated with the sub component's renderer (because that's where the
30400
+ * animation triggers are defined).
30401
+ *
30402
+ * Do not use this instruction as a replacement for `listener`. This instruction
30403
+ * only exists to ensure compatibility with the ViewEngine's host binding behavior.
30404
+ *
30405
+ * @param eventName Name of the event
30406
+ * @param listenerFn The function to be called when event emits
30407
+ * @param useCapture Whether or not to use capture in event listener
30408
+ * @param eventTargetResolver Function that returns global target information in case this listener
30409
+ * should be attached to a global object like window, document or body
30410
+ *
30411
+ * @codeGenApi
30412
+ */
30413
+ function ɵɵsyntheticHostListener(eventName, listenerFn) {
30414
+ const tNode = getCurrentTNode();
30415
+ const lView = getLView();
30416
+ const tView = getTView();
30417
+ const currentDef = getCurrentDirectiveDef(tView.data);
30418
+ const renderer = loadComponentRenderer(currentDef, tNode, lView);
30419
+ listenerInternal(tView, lView, renderer, tNode, eventName, listenerFn);
30420
+ return ɵɵsyntheticHostListener;
30421
+ }
30422
+ /**
30423
+ * A utility function that checks if a given element has already an event handler registered for an
30424
+ * event with a specified name. The TView.cleanup data structure is used to find out which events
30425
+ * are registered for a given element.
30426
+ */
30427
+ function findExistingListener(tView, lView, eventName, tNodeIdx) {
30428
+ const tCleanup = tView.cleanup;
30429
+ if (tCleanup != null) {
30430
+ for (let i = 0; i < tCleanup.length - 1; i += 2) {
30431
+ const cleanupEventName = tCleanup[i];
30432
+ if (cleanupEventName === eventName && tCleanup[i + 1] === tNodeIdx) {
30433
+ // We have found a matching event name on the same node but it might not have been
30434
+ // registered yet, so we must explicitly verify entries in the LView cleanup data
30435
+ // structures.
30436
+ const lCleanup = lView[CLEANUP];
30437
+ const listenerIdxInLCleanup = tCleanup[i + 2];
30438
+ return lCleanup.length > listenerIdxInLCleanup ? lCleanup[listenerIdxInLCleanup] : null;
30439
+ }
30440
+ // TView.cleanup can have a mix of 4-elements entries (for event handler cleanups) or
30441
+ // 2-element entries (for directive and queries destroy hooks). As such we can encounter
30442
+ // blocks of 4 or 2 items in the tView.cleanup and this is why we iterate over 2 elements
30443
+ // first and jump another 2 elements if we detect listeners cleanup (4 elements). Also check
30444
+ // documentation of TView.cleanup for more details of this data structure layout.
30445
+ if (typeof cleanupEventName === 'string') {
30446
+ i += 2;
30447
+ }
30448
+ }
30449
+ }
30450
+ return null;
30451
+ }
30452
+ function listenerInternal(tView, lView, renderer, tNode, eventName, listenerFn, eventTargetResolver) {
30453
+ const isTNodeDirectiveHost = isDirectiveHost(tNode);
30454
+ const firstCreatePass = tView.firstCreatePass;
30455
+ const tCleanup = firstCreatePass ? getOrCreateTViewCleanup(tView) : null;
30456
+ const context = lView[CONTEXT];
30457
+ // When the ɵɵlistener instruction was generated and is executed we know that there is either a
30458
+ // native listener or a directive output on this element. As such we we know that we will have to
30459
+ // register a listener and store its cleanup function on LView.
30460
+ const lCleanup = getOrCreateLViewCleanup(lView);
30461
+ ngDevMode && assertTNodeType(tNode, 3 /* TNodeType.AnyRNode */ | 12 /* TNodeType.AnyContainer */);
30462
+ let processOutputs = true;
30463
+ // Adding a native event listener is applicable when:
30464
+ // - The corresponding TNode represents a DOM element.
30465
+ // - The event target has a resolver (usually resulting in a global object,
30466
+ // such as `window` or `document`).
30467
+ if (tNode.type & 3 /* TNodeType.AnyRNode */ || eventTargetResolver) {
30468
+ const native = getNativeByTNode(tNode, lView);
30469
+ const target = eventTargetResolver ? eventTargetResolver(native) : native;
30470
+ const lCleanupIndex = lCleanup.length;
30471
+ const idxOrTargetGetter = eventTargetResolver
30472
+ ? (_lView) => eventTargetResolver(unwrapRNode(_lView[tNode.index]))
30473
+ : tNode.index;
30474
+ // In order to match current behavior, native DOM event listeners must be added for all
30475
+ // events (including outputs).
30476
+ // There might be cases where multiple directives on the same element try to register an event
30477
+ // handler function for the same event. In this situation we want to avoid registration of
30478
+ // several native listeners as each registration would be intercepted by NgZone and
30479
+ // trigger change detection. This would mean that a single user action would result in several
30480
+ // change detections being invoked. To avoid this situation we want to have only one call to
30481
+ // native handler registration (for the same element and same type of event).
30482
+ //
30483
+ // In order to have just one native event handler in presence of multiple handler functions,
30484
+ // we just register a first handler function as a native event listener and then chain
30485
+ // (coalesce) other handler functions on top of the first native handler function.
30486
+ let existingListener = null;
30487
+ // Please note that the coalescing described here doesn't happen for events specifying an
30488
+ // alternative target (ex. (document:click)) - this is to keep backward compatibility with the
30489
+ // view engine.
30490
+ // Also, we don't have to search for existing listeners is there are no directives
30491
+ // matching on a given node as we can't register multiple event handlers for the same event in
30492
+ // a template (this would mean having duplicate attributes).
30493
+ if (!eventTargetResolver && isTNodeDirectiveHost) {
30494
+ existingListener = findExistingListener(tView, lView, eventName, tNode.index);
30495
+ }
30496
+ if (existingListener !== null) {
30497
+ // Attach a new listener to coalesced listeners list, maintaining the order in which
30498
+ // listeners are registered. For performance reasons, we keep a reference to the last
30499
+ // listener in that list (in `__ngLastListenerFn__` field), so we can avoid going through
30500
+ // the entire set each time we need to add a new listener.
30501
+ const lastListenerFn = existingListener.__ngLastListenerFn__ || existingListener;
30502
+ lastListenerFn.__ngNextListenerFn__ = listenerFn;
30503
+ existingListener.__ngLastListenerFn__ = listenerFn;
30504
+ processOutputs = false;
30505
+ }
30506
+ else {
30507
+ listenerFn = wrapListener(tNode, lView, context, listenerFn);
30508
+ stashEventListener(target, eventName, listenerFn);
30509
+ const cleanupFn = renderer.listen(target, eventName, listenerFn);
30510
+ lCleanup.push(listenerFn, cleanupFn);
30511
+ tCleanup && tCleanup.push(eventName, idxOrTargetGetter, lCleanupIndex, lCleanupIndex + 1);
30512
+ }
30513
+ }
30514
+ else {
30515
+ // Even if there is no native listener to add, we still need to wrap the listener so that OnPush
30516
+ // ancestors are marked dirty when an event occurs.
30517
+ listenerFn = wrapListener(tNode, lView, context, listenerFn);
30518
+ }
30519
+ if (processOutputs) {
30520
+ const outputConfig = tNode.outputs?.[eventName];
30521
+ const hostDirectiveOutputConfig = tNode.hostDirectiveOutputs?.[eventName];
30522
+ if (hostDirectiveOutputConfig && hostDirectiveOutputConfig.length) {
30523
+ for (let i = 0; i < hostDirectiveOutputConfig.length; i += 2) {
30524
+ const index = hostDirectiveOutputConfig[i];
30525
+ const lookupName = hostDirectiveOutputConfig[i + 1];
30526
+ listenToOutput(tNode, tView, lView, index, lookupName, eventName, listenerFn, lCleanup, tCleanup);
30527
+ }
30528
+ }
30529
+ if (outputConfig && outputConfig.length) {
30530
+ for (const index of outputConfig) {
30531
+ listenToOutput(tNode, tView, lView, index, eventName, eventName, listenerFn, lCleanup, tCleanup);
30532
+ }
30533
+ }
30534
+ }
30535
+ }
30536
+
30449
30537
  /**
30450
30538
  * Retrieves a context at the level specified and saves it as the global, contextViewData.
30451
30539
  * Will get the next level up if level is not specified.
@@ -34814,7 +34902,7 @@ class Version {
34814
34902
  /**
34815
34903
  * @publicApi
34816
34904
  */
34817
- const VERSION = new Version('20.0.0-next.2');
34905
+ const VERSION = new Version('20.0.0-next.3');
34818
34906
 
34819
34907
  /**
34820
34908
  * Combination of NgModuleFactory and ComponentFactories.
@@ -35070,7 +35158,7 @@ function internalProvideZoneChangeDetection({ ngZoneFactory, ignoreChangesOutsid
35070
35158
  * ```
35071
35159
  *
35072
35160
  * @publicApi
35073
- * @see {@link /api/core/bootstrapApplication bootstrapApplication}
35161
+ * @see {@link /api/platform-browser/bootstrapApplication bootstrapApplication}
35074
35162
  * @see {@link NgZoneOptions}
35075
35163
  */
35076
35164
  function provideZoneChangeDetection(options) {
@@ -39325,7 +39413,7 @@ function withDomHydration() {
39325
39413
  return;
39326
39414
  }
39327
39415
  if (inject(IS_HYDRATION_DOM_REUSE_ENABLED)) {
39328
- verifySsrContentsIntegrity();
39416
+ verifySsrContentsIntegrity(getDocument());
39329
39417
  enableHydrationRuntimeSupport();
39330
39418
  }
39331
39419
  else if (typeof ngDevMode !== 'undefined' && ngDevMode && !isClientRenderModeEnabled()) {
@@ -39467,35 +39555,6 @@ function logWarningOnStableTimedout(time, console) {
39467
39555
  `as a signal to complete hydration process.`;
39468
39556
  console.warn(formatRuntimeError(-506 /* RuntimeErrorCode.HYDRATION_STABLE_TIMEDOUT */, message));
39469
39557
  }
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
39558
 
39500
39559
  /**
39501
39560
  * Transforms a value (typically a string) to a boolean.
@@ -39596,25 +39655,14 @@ function disableProfiling() {
39596
39655
  * can, optionally, return a value.
39597
39656
  */
39598
39657
  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
- }
39658
+ return untracked$1(nonReactiveReadsFn);
39608
39659
  }
39609
39660
 
39610
39661
  /**
39611
39662
  * Create a computed `Signal` which derives a reactive value from an expression.
39612
39663
  */
39613
39664
  function computed(computation, options) {
39614
- const getter = createComputed(computation);
39615
- if (options?.equal) {
39616
- getter[SIGNAL].equal = options.equal;
39617
- }
39665
+ const getter = createComputed(computation, options?.equal);
39618
39666
  if (ngDevMode) {
39619
39667
  getter.toString = () => `[Computed: ${getter()}]`;
39620
39668
  getter[SIGNAL].debugName = options?.debugName;
@@ -40672,5 +40720,5 @@ const REQUEST_CONTEXT = new InjectionToken(typeof ngDevMode === 'undefined' || n
40672
40720
  factory: () => null,
40673
40721
  });
40674
40722
 
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 };
40723
+ 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, 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 };
40676
40724
  //# sourceMappingURL=core.mjs.map