@angular/core 18.0.0-rc.1 → 18.0.0-rc.2

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 (59) hide show
  1. package/esm2022/primitives/event-dispatch/contract_binary.mjs +3 -3
  2. package/esm2022/primitives/event-dispatch/index.mjs +2 -2
  3. package/esm2022/primitives/event-dispatch/src/action_resolver.mjs +5 -18
  4. package/esm2022/primitives/event-dispatch/src/attribute.mjs +63 -65
  5. package/esm2022/primitives/event-dispatch/src/cache.mjs +10 -10
  6. package/esm2022/primitives/event-dispatch/src/dispatcher.mjs +50 -181
  7. package/esm2022/primitives/event-dispatch/src/earlyeventcontract.mjs +4 -4
  8. package/esm2022/primitives/event-dispatch/src/event_contract_defines.mjs +1 -6
  9. package/esm2022/primitives/event-dispatch/src/eventcontract.mjs +13 -30
  10. package/esm2022/primitives/event-dispatch/src/key_code.mjs +11 -13
  11. package/esm2022/primitives/event-dispatch/src/legacy_dispatcher.mjs +252 -2
  12. package/esm2022/primitives/event-dispatch/src/property.mjs +30 -27
  13. package/esm2022/primitives/event-dispatch/src/register_events.mjs +5 -25
  14. package/esm2022/primitives/event-dispatch/src/restriction.mjs +2 -2
  15. package/esm2022/src/application/create_application.mjs +11 -4
  16. package/esm2022/src/change_detection/scheduling/ng_zone_scheduling.mjs +4 -16
  17. package/esm2022/src/change_detection/scheduling/zoneless_scheduling.mjs +3 -1
  18. package/esm2022/src/change_detection/scheduling/zoneless_scheduling_impl.mjs +5 -2
  19. package/esm2022/src/core_reactivity_export_internal.mjs +1 -3
  20. package/esm2022/src/core_render3_private_export.mjs +1 -3
  21. package/esm2022/src/hydration/event_replay.mjs +51 -83
  22. package/esm2022/src/hydration/utils.mjs +1 -2
  23. package/esm2022/src/metadata/directives.mjs +1 -1
  24. package/esm2022/src/platform/platform_ref.mjs +9 -10
  25. package/esm2022/src/render3/component_ref.mjs +1 -1
  26. package/esm2022/src/render3/index.mjs +1 -3
  27. package/esm2022/src/render3/instructions/listener.mjs +3 -3
  28. package/esm2022/src/render3/interfaces/public_definitions.mjs +1 -1
  29. package/esm2022/src/version.mjs +1 -1
  30. package/esm2022/testing/src/component_fixture.mjs +2 -2
  31. package/esm2022/testing/src/logger.mjs +3 -3
  32. package/esm2022/testing/src/test_bed.mjs +1 -3
  33. package/esm2022/testing/src/test_bed_compiler.mjs +1 -3
  34. package/event-dispatch-contract.min.js +1 -1
  35. package/fesm2022/core.mjs +79 -117
  36. package/fesm2022/core.mjs.map +1 -1
  37. package/fesm2022/primitives/event-dispatch.mjs +246 -515
  38. package/fesm2022/primitives/event-dispatch.mjs.map +1 -1
  39. package/fesm2022/primitives/signals.mjs +1 -1
  40. package/fesm2022/rxjs-interop.mjs +1 -1
  41. package/fesm2022/testing.mjs +2 -4
  42. package/fesm2022/testing.mjs.map +1 -1
  43. package/index.d.ts +3 -1
  44. package/package.json +1 -1
  45. package/primitives/event-dispatch/index.d.ts +83 -131
  46. package/primitives/signals/index.d.ts +1 -1
  47. package/rxjs-interop/index.d.ts +1 -1
  48. package/schematics/migrations/http-providers/bundle.js +46 -29
  49. package/schematics/migrations/http-providers/bundle.js.map +3 -3
  50. package/schematics/migrations/invalid-two-way-bindings/bundle.js +159 -159
  51. package/schematics/migrations/invalid-two-way-bindings/bundle.js.map +2 -2
  52. package/schematics/ng-generate/control-flow-migration/bundle.js +167 -167
  53. package/schematics/ng-generate/control-flow-migration/bundle.js.map +2 -2
  54. package/schematics/ng-generate/standalone-migration/bundle.js +443 -443
  55. package/schematics/ng-generate/standalone-migration/bundle.js.map +2 -2
  56. package/testing/index.d.ts +1 -1
  57. package/esm2022/primitives/event-dispatch/src/base_dispatcher.mjs +0 -94
  58. package/esm2022/primitives/event-dispatch/src/custom_events.mjs +0 -102
  59. package/esm2022/primitives/event-dispatch/src/replay.mjs +0 -389
package/fesm2022/core.mjs CHANGED
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @license Angular v18.0.0-rc.1
2
+ * @license Angular v18.0.0-rc.2
3
3
  * (c) 2010-2024 Google LLC. https://angular.io/
4
4
  * License: MIT
5
5
  */
@@ -7,7 +7,7 @@
7
7
  import { SIGNAL_NODE as SIGNAL_NODE$1, signalSetFn as signalSetFn$1, producerAccessed as producerAccessed$1, SIGNAL as SIGNAL$1, getActiveConsumer as getActiveConsumer$1, setActiveConsumer as setActiveConsumer$1, consumerDestroy as consumerDestroy$1, REACTIVE_NODE as REACTIVE_NODE$1, consumerBeforeComputation as consumerBeforeComputation$1, consumerAfterComputation as consumerAfterComputation$1, consumerPollProducersForChange as consumerPollProducersForChange$1, createSignal as createSignal$1, signalUpdateFn as signalUpdateFn$1, createComputed as createComputed$1, setThrowInvalidWriteToSignalError as setThrowInvalidWriteToSignalError$1, createWatch as createWatch$1 } from '@angular/core/primitives/signals';
8
8
  import { Subject, Subscription, BehaviorSubject } from 'rxjs';
9
9
  import { map, first } from 'rxjs/operators';
10
- import { Dispatcher, registerDispatcher } from '@angular/core/primitives/event-dispatch';
10
+ import { EventContract, EventContractContainer, Dispatcher, registerDispatcher } from '@angular/core/primitives/event-dispatch';
11
11
 
12
12
  /**
13
13
  * Base URL for the error details page.
@@ -8528,7 +8528,6 @@ var HydrationStatus;
8528
8528
  HydrationStatus["Skipped"] = "skipped";
8529
8529
  HydrationStatus["Mismatched"] = "mismatched";
8530
8530
  })(HydrationStatus || (HydrationStatus = {}));
8531
- // clang-format on
8532
8531
  const HYDRATION_INFO_KEY = '__ngDebugHydrationInfo__';
8533
8532
  function patchHydrationInfo(node, info) {
8534
8533
  node[HYDRATION_INFO_KEY] = info;
@@ -15167,6 +15166,8 @@ class ChangeDetectionScheduler {
15167
15166
  }
15168
15167
  /** Token used to indicate if zoneless was enabled via provideZonelessChangeDetection(). */
15169
15168
  const ZONELESS_ENABLED = new InjectionToken(typeof ngDevMode === 'undefined' || ngDevMode ? 'Zoneless enabled' : '', { providedIn: 'root', factory: () => false });
15169
+ /** Token used to indicate `provideExperimentalZonelessChangeDetection` was used. */
15170
+ const PROVIDED_ZONELESS = new InjectionToken(typeof ngDevMode === 'undefined' || ngDevMode ? 'Zoneless provided' : '', { providedIn: 'root', factory: () => false });
15170
15171
  const ZONELESS_SCHEDULER_DISABLED = new InjectionToken(typeof ngDevMode === 'undefined' || ngDevMode ? 'scheduler disabled' : '');
15171
15172
 
15172
15173
  /**
@@ -16888,7 +16889,7 @@ function createRootComponent(componentView, rootComponentDef, rootDirectives, ho
16888
16889
  function setRootNodeAttributes(hostRenderer, componentDef, hostRNode, rootSelectorOrNode) {
16889
16890
  if (rootSelectorOrNode) {
16890
16891
  // The placeholder will be replaced with the actual version at build time.
16891
- setUpAttributes(hostRenderer, hostRNode, ['ng-version', '18.0.0-rc.1']);
16892
+ setUpAttributes(hostRenderer, hostRNode, ['ng-version', '18.0.0-rc.2']);
16892
16893
  }
16893
16894
  else {
16894
16895
  // If host element is created as a part of this function call (i.e. `rootSelectorOrNode`
@@ -26372,7 +26373,7 @@ function ɵɵi18nPostprocess(message, replacements = {}) {
26372
26373
  * an actual implementation when the event replay feature is enabled via
26373
26374
  * `withEventReplay()` call.
26374
26375
  */
26375
- let disableEventReplayFn = (el) => { };
26376
+ let disableEventReplayFn = (el, eventName, listenerFn) => { };
26376
26377
  function setDisableEventReplayImpl(fn) {
26377
26378
  disableEventReplayFn = fn;
26378
26379
  }
@@ -26480,7 +26481,7 @@ function listenerInternal(tView, lView, renderer, tNode, eventName, listenerFn,
26480
26481
  const idxOrTargetGetter = eventTargetResolver
26481
26482
  ? (_lView) => eventTargetResolver(unwrapRNode(_lView[tNode.index]))
26482
26483
  : tNode.index;
26483
- disableEventReplayFn(native);
26484
+ disableEventReplayFn(native, eventName, listenerFn);
26484
26485
  // In order to match current behavior, native DOM event listeners must be added for all
26485
26486
  // events (including outputs).
26486
26487
  // There might be cases where multiple directives on the same element try to register an event
@@ -30800,7 +30801,7 @@ class Version {
30800
30801
  /**
30801
30802
  * @publicApi
30802
30803
  */
30803
- const VERSION = new Version('18.0.0-rc.1');
30804
+ const VERSION = new Version('18.0.0-rc.2');
30804
30805
 
30805
30806
  class Console {
30806
30807
  log(message) {
@@ -33052,6 +33053,9 @@ function provideExperimentalZonelessChangeDetection() {
33052
33053
  { provide: ChangeDetectionScheduler, useExisting: ChangeDetectionSchedulerImpl },
33053
33054
  { provide: NgZone, useClass: NoopNgZone },
33054
33055
  { provide: ZONELESS_ENABLED, useValue: true },
33056
+ typeof ngDevMode === 'undefined' || ngDevMode
33057
+ ? [{ provide: PROVIDED_ZONELESS, useValue: true }]
33058
+ : [],
33055
33059
  ]);
33056
33060
  }
33057
33061
 
@@ -33060,7 +33064,6 @@ class NgZoneChangeDetectionScheduler {
33060
33064
  this.zone = inject(NgZone);
33061
33065
  this.changeDetectionScheduler = inject(ChangeDetectionScheduler, { optional: true });
33062
33066
  this.applicationRef = inject(ApplicationRef);
33063
- this.zonelessEnabled = inject(ZONELESS_ENABLED);
33064
33067
  }
33065
33068
  initialize() {
33066
33069
  if (this._onMicrotaskEmptySubscription) {
@@ -33094,7 +33097,7 @@ class NgZoneChangeDetectionScheduler {
33094
33097
  * Internal token used to verify that `provideZoneChangeDetection` is not used
33095
33098
  * with the bootstrapModule API.
33096
33099
  */
33097
- const PROVIDED_NG_ZONE = new InjectionToken(typeof ngDevMode === 'undefined' || ngDevMode ? 'provideZoneChangeDetection token' : '');
33100
+ const PROVIDED_NG_ZONE = new InjectionToken(typeof ngDevMode === 'undefined' || ngDevMode ? 'provideZoneChangeDetection token' : '', { factory: () => false });
33098
33101
  function internalProvideZoneChangeDetection({ ngZoneFactory, ignoreChangesOutsideZone, }) {
33099
33102
  ngZoneFactory ??= () => new NgZone(getNgZoneOptions());
33100
33103
  return [
@@ -33174,8 +33177,9 @@ function provideZoneChangeDetection(options) {
33174
33177
  });
33175
33178
  return makeEnvironmentProviders([
33176
33179
  typeof ngDevMode === 'undefined' || ngDevMode
33177
- ? [{ provide: PROVIDED_NG_ZONE, useValue: true }, bothZoneAndZonelessErrorCheckProvider]
33180
+ ? [{ provide: PROVIDED_NG_ZONE, useValue: true }]
33178
33181
  : [],
33182
+ { provide: ZONELESS_ENABLED, useValue: false },
33179
33183
  zoneProviders,
33180
33184
  ]);
33181
33185
  }
@@ -33235,18 +33239,6 @@ class ZoneStablePendingTask {
33235
33239
  type: Injectable,
33236
33240
  args: [{ providedIn: 'root' }]
33237
33241
  }], null, null); })();
33238
- const bothZoneAndZonelessErrorCheckProvider = {
33239
- provide: ENVIRONMENT_INITIALIZER,
33240
- multi: true,
33241
- useFactory: () => {
33242
- const providedZoneless = inject(ZONELESS_ENABLED, { optional: true });
33243
- if (providedZoneless) {
33244
- throw new RuntimeError(408 /* RuntimeErrorCode.PROVIDED_BOTH_ZONE_AND_ZONELESS */, 'Invalid change detection configuration: ' +
33245
- 'provideZoneChangeDetection and provideExperimentalZonelessChangeDetection cannot be used together.');
33246
- }
33247
- return () => { };
33248
- },
33249
- };
33250
33242
 
33251
33243
  /**
33252
33244
  * Work out the locale from the potential global properties.
@@ -33468,15 +33460,14 @@ class PlatformRef {
33468
33460
  return ngZone.run(() => {
33469
33461
  const ignoreChangesOutsideZone = options?.ignoreChangesOutsideZone;
33470
33462
  const moduleRef = createNgModuleRefWithProviders(moduleFactory.moduleType, this.injector, internalProvideZoneChangeDetection({ ngZoneFactory: () => ngZone, ignoreChangesOutsideZone }));
33471
- if ((typeof ngDevMode === 'undefined' || ngDevMode) &&
33472
- moduleRef.injector.get(PROVIDED_NG_ZONE, null) !== null) {
33473
- throw new RuntimeError(207 /* RuntimeErrorCode.PROVIDER_IN_WRONG_CONTEXT */, '`bootstrapModule` does not support `provideZoneChangeDetection`. Use `BootstrapOptions` instead.');
33474
- }
33475
- if ((typeof ngDevMode === 'undefined' || ngDevMode) &&
33476
- moduleRef.injector.get(ZONELESS_ENABLED, null) &&
33477
- options?.ngZone !== 'noop') {
33478
- throw new RuntimeError(408 /* RuntimeErrorCode.PROVIDED_BOTH_ZONE_AND_ZONELESS */, 'Invalid change detection configuration: ' +
33479
- "`ngZone: 'noop'` must be set in `BootstrapOptions` with provideExperimentalZonelessChangeDetection.");
33463
+ if (typeof ngDevMode === 'undefined' || ngDevMode) {
33464
+ if (moduleRef.injector.get(PROVIDED_NG_ZONE)) {
33465
+ throw new RuntimeError(207 /* RuntimeErrorCode.PROVIDER_IN_WRONG_CONTEXT */, '`bootstrapModule` does not support `provideZoneChangeDetection`. Use `BootstrapOptions` instead.');
33466
+ }
33467
+ if (moduleRef.injector.get(ZONELESS_ENABLED) && options?.ngZone !== 'noop') {
33468
+ throw new RuntimeError(408 /* RuntimeErrorCode.PROVIDED_BOTH_ZONE_AND_ZONELESS */, 'Invalid change detection configuration: ' +
33469
+ "`ngZone: 'noop'` must be set in `BootstrapOptions` with provideExperimentalZonelessChangeDetection.");
33470
+ }
33480
33471
  }
33481
33472
  const exceptionHandler = moduleRef.injector.get(ErrorHandler, null);
33482
33473
  if ((typeof ngDevMode === 'undefined' || ngDevMode) && exceptionHandler === null) {
@@ -36452,8 +36443,14 @@ function internalCreateApplication(config) {
36452
36443
  return ngZone.run(() => {
36453
36444
  envInjector.resolveInjectorInitializers();
36454
36445
  const exceptionHandler = envInjector.get(ErrorHandler, null);
36455
- if ((typeof ngDevMode === 'undefined' || ngDevMode) && !exceptionHandler) {
36456
- throw new RuntimeError(402 /* RuntimeErrorCode.MISSING_REQUIRED_INJECTABLE_IN_BOOTSTRAP */, 'No `ErrorHandler` found in the Dependency Injection tree.');
36446
+ if (typeof ngDevMode === 'undefined' || ngDevMode) {
36447
+ if (!exceptionHandler) {
36448
+ throw new RuntimeError(402 /* RuntimeErrorCode.MISSING_REQUIRED_INJECTABLE_IN_BOOTSTRAP */, 'No `ErrorHandler` found in the Dependency Injection tree.');
36449
+ }
36450
+ if (envInjector.get(PROVIDED_ZONELESS) && envInjector.get(PROVIDED_NG_ZONE)) {
36451
+ throw new RuntimeError(408 /* RuntimeErrorCode.PROVIDED_BOTH_ZONE_AND_ZONELESS */, 'Invalid change detection configuration: ' +
36452
+ 'provideZoneChangeDetection and provideExperimentalZonelessChangeDetection cannot be used together.');
36453
+ }
36457
36454
  }
36458
36455
  let onErrorSubscription;
36459
36456
  ngZone.runOutsideAngular(() => {
@@ -36534,8 +36531,12 @@ function getDeferBlocks(lView, deferBlocks) {
36534
36531
 
36535
36532
  const EVENT_REPLAY_ENABLED_DEFAULT = false;
36536
36533
  const CONTRACT_PROPERTY = 'ngContracts';
36534
+ // TODO: Upstream this back into event-dispatch.
36535
+ function getJsactionData(container) {
36536
+ return container._ejsa;
36537
+ }
36537
36538
  const JSACTION_ATTRIBUTE = 'jsaction';
36538
- const removeJsactionQueue = [];
36539
+ const jsactionMap = new Map();
36539
36540
  /**
36540
36541
  * Returns a set of providers required to setup support for event replay.
36541
36542
  * Requires hydration to be enabled separately.
@@ -36549,11 +36550,18 @@ function withEventReplay() {
36549
36550
  {
36550
36551
  provide: ENVIRONMENT_INITIALIZER,
36551
36552
  useValue: () => {
36552
- setDisableEventReplayImpl((el) => {
36553
- if (el.hasAttribute(JSACTION_ATTRIBUTE)) {
36553
+ setDisableEventReplayImpl((rEl, eventName, listenerFn) => {
36554
+ if (rEl.hasAttribute(JSACTION_ATTRIBUTE)) {
36555
+ const el = unwrapRNode(rEl);
36554
36556
  // We don't immediately remove the attribute here because
36555
36557
  // we need it for replay that happens after hydration.
36556
- removeJsactionQueue.push(el);
36558
+ if (!jsactionMap.has(el)) {
36559
+ jsactionMap.set(el, new Map());
36560
+ }
36561
+ if (!jsactionMap.get(el).has(eventName)) {
36562
+ jsactionMap.get(el).set(eventName, []);
36563
+ }
36564
+ jsactionMap.get(el).get(eventName).push(listenerFn);
36557
36565
  }
36558
36566
  });
36559
36567
  },
@@ -36574,16 +36582,30 @@ function withEventReplay() {
36574
36582
  // This is set in packages/platform-server/src/utils.ts
36575
36583
  // Note: globalThis[CONTRACT_PROPERTY] may be undefined in case Event Replay feature
36576
36584
  // is enabled, but there are no events configured in an application.
36577
- const eventContract = globalThis[CONTRACT_PROPERTY]?.[appId];
36578
- if (eventContract) {
36579
- const dispatcher = new Dispatcher();
36580
- setEventReplayer(dispatcher);
36581
- // Event replay is kicked off as a side-effect of executing this function.
36585
+ const container = globalThis[CONTRACT_PROPERTY]?.[appId];
36586
+ const earlyJsactionData = getJsactionData(container);
36587
+ if (earlyJsactionData) {
36588
+ const eventContract = new EventContract(new EventContractContainer(earlyJsactionData.c));
36589
+ for (const et of earlyJsactionData.et) {
36590
+ eventContract.addEvent(et);
36591
+ }
36592
+ for (const et of earlyJsactionData.etc) {
36593
+ eventContract.addEvent(et);
36594
+ }
36595
+ eventContract.replayEarlyEvents(container);
36596
+ const dispatcher = new Dispatcher(() => { }, {
36597
+ eventReplayer: (queue) => {
36598
+ for (const event of queue) {
36599
+ handleEvent(event);
36600
+ }
36601
+ jsactionMap.clear();
36602
+ queue.length = 0;
36603
+ },
36604
+ });
36582
36605
  registerDispatcher(eventContract, dispatcher);
36583
- for (const el of removeJsactionQueue) {
36606
+ for (const el of jsactionMap.keys()) {
36584
36607
  el.removeAttribute(JSACTION_ATTRIBUTE);
36585
36608
  }
36586
- removeJsactionQueue.length = 0;
36587
36609
  }
36588
36610
  });
36589
36611
  };
@@ -36612,6 +36634,12 @@ function collectDomEventsInfo(tView, lView, eventTypesToReplay) {
36612
36634
  continue;
36613
36635
  }
36614
36636
  const name = firstParam;
36637
+ if (name === 'mouseenter' ||
36638
+ name === 'mouseleave' ||
36639
+ name === 'pointerenter' ||
36640
+ name === 'pointerleave') {
36641
+ continue;
36642
+ }
36615
36643
  eventTypesToReplay.add(name);
36616
36644
  const listenerElement = unwrapRNode(lView[secondParam]);
36617
36645
  i++; // move the cursor to the next position (location of the listener idx)
@@ -36642,77 +36670,15 @@ function setJSActionAttribute(tNode, rNode, nativeElementToEvents) {
36642
36670
  }
36643
36671
  }
36644
36672
  }
36645
- /**
36646
- * Registers a function that should be invoked to replay events.
36647
- */
36648
- function setEventReplayer(dispatcher) {
36649
- dispatcher.setEventReplayer((queue) => {
36650
- for (const event of queue) {
36651
- handleEvent(event);
36652
- }
36653
- });
36654
- }
36655
- /**
36656
- * Finds an LView that a given DOM element belongs to.
36657
- */
36658
- function getLViewByElement(target) {
36659
- let lView = readLView(target);
36660
- if (lView) {
36661
- return lView;
36662
- }
36663
- else {
36664
- // If this node doesn't have LView info attached, then we need to
36665
- // traverse upwards up the DOM to find the nearest element that
36666
- // has already been monkey patched with data.
36667
- let parent = target;
36668
- while ((parent = parent.parentNode)) {
36669
- lView = readLView(parent);
36670
- if (lView) {
36671
- // To prevent additional lookups, monkey-patch LView id onto this DOM node.
36672
- // TODO: consider patching all parent nodes that didn't have LView id, so that
36673
- // we can avoid lookups for more nodes.
36674
- attachLViewId(target, lView);
36675
- return lView;
36676
- }
36677
- }
36678
- }
36679
- return null;
36680
- }
36681
36673
  function handleEvent(event) {
36682
- const nativeElement = event.getAction().element;
36683
- // Dispatch event via Angular's logic
36684
- if (nativeElement) {
36685
- const lView = getLViewByElement(nativeElement);
36686
- if (lView !== null) {
36687
- const tView = lView[TVIEW];
36688
- const eventName = event.getEventType();
36689
- const origEvent = event.getEvent();
36690
- const listeners = getEventListeners(tView, lView, nativeElement, eventName);
36691
- for (const listener of listeners) {
36692
- listener(origEvent);
36693
- }
36694
- }
36674
+ const nativeElement = unwrapRNode(event.getAction().element);
36675
+ const handlerFns = jsactionMap.get(nativeElement)?.get(event.getEventType());
36676
+ if (!handlerFns) {
36677
+ return;
36695
36678
  }
36696
- }
36697
- function getEventListeners(tView, lView, nativeElement, eventName) {
36698
- const listeners = [];
36699
- const lCleanup = lView[CLEANUP];
36700
- const tCleanup = tView.cleanup;
36701
- if (tCleanup && lCleanup) {
36702
- for (let i = 0; i < tCleanup.length;) {
36703
- const storedEventName = tCleanup[i++];
36704
- const nativeElementIndex = tCleanup[i++];
36705
- if (typeof storedEventName === 'string') {
36706
- const listenerElement = unwrapRNode(lView[nativeElementIndex]);
36707
- const listener = lCleanup[tCleanup[i++]];
36708
- i++; // increment to the next position;
36709
- if (listenerElement === nativeElement && eventName === storedEventName) {
36710
- listeners.push(listener);
36711
- }
36712
- }
36713
- }
36679
+ for (const handler of handlerFns) {
36680
+ handler(event.getEvent());
36714
36681
  }
36715
- return listeners;
36716
36682
  }
36717
36683
 
36718
36684
  /**
@@ -37651,8 +37617,7 @@ function ɵɵngDeclarePipe(decl) {
37651
37617
  return compiler.compilePipeDeclaration(angularCoreEnv, `ng:///${decl.type.name}/ɵpipe.js`, decl);
37652
37618
  }
37653
37619
 
37654
- // clang-format off
37655
- // clang-format on
37620
+ // we reexport these symbols just so that they are retained during the dead code elimination
37656
37621
 
37657
37622
  /**
37658
37623
  * Create a computed `Signal` which derives a reactive value from an expression.
@@ -37842,9 +37807,6 @@ function effect(effectFn, options) {
37842
37807
  return handle;
37843
37808
  }
37844
37809
 
37845
- // clang-format off
37846
- // clang-format on
37847
-
37848
37810
  // This file exists to allow the set of reactivity exports to be modified in g3, as these APIs are
37849
37811
 
37850
37812
  /**