@angular/core 19.2.0-next.3 → 19.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (43) hide show
  1. package/fesm2022/core.mjs +1410 -1233
  2. package/fesm2022/core.mjs.map +1 -1
  3. package/fesm2022/primitives/event-dispatch.mjs +1 -1
  4. package/fesm2022/primitives/signals.mjs +5 -5
  5. package/fesm2022/primitives/signals.mjs.map +1 -1
  6. package/fesm2022/rxjs-interop.mjs +1 -1
  7. package/fesm2022/testing.mjs +696 -5
  8. package/fesm2022/testing.mjs.map +1 -1
  9. package/index.d.ts +260 -51
  10. package/package.json +1 -1
  11. package/primitives/event-dispatch/index.d.ts +1 -1
  12. package/primitives/signals/index.d.ts +2 -2
  13. package/rxjs-interop/index.d.ts +1 -1
  14. package/schematics/bundles/apply_import_manager-a4e62ded.js +71 -0
  15. package/schematics/bundles/{checker-32db85a6.js → checker-2eecc677.js} +17 -16
  16. package/schematics/bundles/cleanup-unused-imports.js +17 -16
  17. package/schematics/bundles/{compiler_host-540e221c.js → compiler_host-f313eac9.js} +2 -2
  18. package/schematics/bundles/control-flow-migration.js +3 -3
  19. package/schematics/bundles/explicit-standalone-flag.js +5 -5
  20. package/schematics/bundles/{imports-abe29092.js → imports-31a38653.js} +1 -1
  21. package/schematics/bundles/{index-7ee8967e.js → index-3891dd55.js} +4 -4
  22. package/schematics/bundles/{index-d5020c9c.js → index-afc3f749.js} +9 -9
  23. package/schematics/bundles/inject-migration.js +10 -9
  24. package/schematics/bundles/{leading_space-d190b83b.js → leading_space-6e7a8ec6.js} +1 -1
  25. package/schematics/bundles/{migrate_ts_type_references-26986908.js → migrate_ts_type_references-1abf1f5f.js} +21 -21
  26. package/schematics/bundles/{nodes-a9f0b985.js → ng_decorators-6878e227.js} +2 -15
  27. package/schematics/bundles/nodes-ffdce442.js +27 -0
  28. package/schematics/bundles/output-migration.js +22 -21
  29. package/schematics/bundles/pending-tasks.js +5 -5
  30. package/schematics/bundles/{program-507de2f1.js → program-24da9092.js} +90 -45
  31. package/schematics/bundles/{apply_import_manager-f4d044b2.js → project_paths-64bc3947.js} +3 -57
  32. package/schematics/bundles/{project_tsconfig_paths-e9ccccbf.js → project_tsconfig_paths-6c9cde78.js} +1 -1
  33. package/schematics/bundles/property_name-42030525.js +31 -0
  34. package/schematics/bundles/provide-initializer.js +5 -5
  35. package/schematics/bundles/route-lazy-loading.js +9 -13
  36. package/schematics/bundles/self-closing-tags-migration.js +448 -0
  37. package/schematics/bundles/signal-input-migration.js +22 -21
  38. package/schematics/bundles/signal-queries-migration.js +28 -27
  39. package/schematics/bundles/signals.js +9 -8
  40. package/schematics/bundles/standalone-migration.js +14 -13
  41. package/schematics/collection.json +6 -0
  42. package/schematics/ng-generate/self-closing-tags-migration/schema.json +14 -0
  43. package/testing/index.d.ts +297 -1
package/fesm2022/core.mjs CHANGED
@@ -1,10 +1,10 @@
1
1
  /**
2
- * @license Angular v19.2.0-next.3
2
+ * @license Angular v19.2.0
3
3
  * (c) 2010-2024 Google LLC. https://angular.io/
4
4
  * License: MIT
5
5
  */
6
6
 
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, createSignal as createSignal$1, signalUpdateFn as signalUpdateFn$1, consumerDestroy as consumerDestroy$1, REACTIVE_NODE as REACTIVE_NODE$1, consumerBeforeComputation as consumerBeforeComputation$1, consumerAfterComputation as consumerAfterComputation$1, consumerPollProducersForChange as consumerPollProducersForChange$1, createComputed as createComputed$1, setThrowInvalidWriteToSignalError as setThrowInvalidWriteToSignalError$1, createLinkedSignal as createLinkedSignal$1, linkedSignalSetFn as linkedSignalSetFn$1, linkedSignalUpdateFn as linkedSignalUpdateFn$1, createWatch as createWatch$1, isInNotificationPhase as isInNotificationPhase$1 } from '@angular/core/primitives/signals';
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, createSignal as createSignal$1, signalUpdateFn as signalUpdateFn$1, consumerDestroy as consumerDestroy$1, REACTIVE_NODE as REACTIVE_NODE$1, consumerBeforeComputation as consumerBeforeComputation$1, consumerAfterComputation as consumerAfterComputation$1, consumerPollProducersForChange as consumerPollProducersForChange$1, createComputed as createComputed$1, setThrowInvalidWriteToSignalError as setThrowInvalidWriteToSignalError$1, createWatch as createWatch$1, isInNotificationPhase as isInNotificationPhase$1, createLinkedSignal as createLinkedSignal$1, linkedSignalSetFn as linkedSignalSetFn$1, linkedSignalUpdateFn as linkedSignalUpdateFn$1 } from '@angular/core/primitives/signals';
8
8
  export { SIGNAL as ɵSIGNAL } from '@angular/core/primitives/signals';
9
9
  import { BehaviorSubject, Subject, Subscription } from 'rxjs';
10
10
  import { Attribute as Attribute$1, clearAppScopedEarlyEventContract, EventContract, EventContractContainer, getAppScopedQueuedEventInfos, EventDispatcher, registerDispatcher, isEarlyEventType, isCaptureEventType, EventPhase } from '@angular/core/primitives/event-dispatch';
@@ -350,23 +350,21 @@ function stringify(token) {
350
350
  return token;
351
351
  }
352
352
  if (Array.isArray(token)) {
353
- return '[' + token.map(stringify).join(', ') + ']';
353
+ return `[${token.map(stringify).join(', ')}]`;
354
354
  }
355
355
  if (token == null) {
356
356
  return '' + token;
357
357
  }
358
- if (token.overriddenName) {
359
- return `${token.overriddenName}`;
358
+ const name = token.overriddenName || token.name;
359
+ if (name) {
360
+ return `${name}`;
360
361
  }
361
- if (token.name) {
362
- return `${token.name}`;
362
+ const result = token.toString();
363
+ if (result == null) {
364
+ return '' + result;
363
365
  }
364
- const res = token.toString();
365
- if (res == null) {
366
- return '' + res;
367
- }
368
- const newLineIndex = res.indexOf('\n');
369
- return newLineIndex === -1 ? res : res.substring(0, newLineIndex);
366
+ const newLineIndex = result.indexOf('\n');
367
+ return newLineIndex >= 0 ? result.slice(0, newLineIndex) : result;
370
368
  }
371
369
  /**
372
370
  * Concatenates two strings with separator, allocating new strings only when necessary.
@@ -969,8 +967,9 @@ function stringifyTypeFromDebugInfo(debugInfo) {
969
967
 
970
968
  /** Called when directives inject each other (creating a circular dependency) */
971
969
  function throwCyclicDependencyError(token, path) {
972
- const depPath = path ? `. Dependency path: ${path.join(' > ')} > ${token}` : '';
973
- throw new RuntimeError(-200 /* RuntimeErrorCode.CYCLIC_DI_DEPENDENCY */, ngDevMode ? `Circular dependency in DI detected for ${token}${depPath}` : token);
970
+ throw new RuntimeError(-200 /* RuntimeErrorCode.CYCLIC_DI_DEPENDENCY */, ngDevMode
971
+ ? `Circular dependency in DI detected for ${token}${path ? `. Dependency path: ${path.join(' > ')} > ${token}` : ''}`
972
+ : token);
974
973
  }
975
974
  function throwMixedMultiProviderError() {
976
975
  throw new Error(`Cannot mix multi providers and regular providers`);
@@ -7108,23 +7107,6 @@ function unwrapElementRef(value) {
7108
7107
  return value instanceof ElementRef ? value.nativeElement : value;
7109
7108
  }
7110
7109
 
7111
- const markedFeatures = new Set();
7112
- // tslint:disable:ban
7113
- /**
7114
- * A guarded `performance.mark` for feature marking.
7115
- *
7116
- * This method exists because while all supported browser and node.js version supported by Angular
7117
- * support performance.mark API. This is not the case for other environments such as JSDOM and
7118
- * Cloudflare workers.
7119
- */
7120
- function performanceMarkFeature(feature) {
7121
- if (markedFeatures.has(feature)) {
7122
- return;
7123
- }
7124
- markedFeatures.add(feature);
7125
- performance?.mark?.('mark_feature_usage', { detail: { feature } });
7126
- }
7127
-
7128
7110
  /**
7129
7111
  * Checks if the given `value` is a reactive `Signal`.
7130
7112
  */
@@ -7147,7 +7129,6 @@ function ɵunwrapWritableSignal(value) {
7147
7129
  * Create a `Signal` that can be set or updated directly.
7148
7130
  */
7149
7131
  function signal(initialValue, options) {
7150
- performanceMarkFeature('NgSignals');
7151
7132
  const signalFn = createSignal$1(initialValue);
7152
7133
  const node = signalFn[SIGNAL$1];
7153
7134
  if (options?.equal) {
@@ -8248,23 +8229,12 @@ function assertDomElement(value) {
8248
8229
  function extractInputDebugMetadata(inputs) {
8249
8230
  const res = {};
8250
8231
  for (const key in inputs) {
8251
- if (!inputs.hasOwnProperty(key)) {
8252
- continue;
8253
- }
8254
- const value = inputs[key];
8255
- if (value === undefined) {
8256
- continue;
8257
- }
8258
- let minifiedName;
8259
- if (Array.isArray(value)) {
8260
- minifiedName = value[0];
8261
- // flags are not used for now.
8262
- // TODO: Consider exposing flag information in discovery.
8263
- }
8264
- else {
8265
- minifiedName = value;
8232
+ if (inputs.hasOwnProperty(key)) {
8233
+ const value = inputs[key];
8234
+ if (value !== undefined) {
8235
+ res[key] = value[0];
8236
+ }
8266
8237
  }
8267
- res[key] = minifiedName;
8268
8238
  }
8269
8239
  return res;
8270
8240
  }
@@ -8638,6 +8608,23 @@ var TracingAction;
8638
8608
  */
8639
8609
  const TracingService = new InjectionToken(ngDevMode ? 'TracingService' : '');
8640
8610
 
8611
+ const markedFeatures = new Set();
8612
+ // tslint:disable:ban
8613
+ /**
8614
+ * A guarded `performance.mark` for feature marking.
8615
+ *
8616
+ * This method exists because while all supported browser and node.js version supported by Angular
8617
+ * support performance.mark API. This is not the case for other environments such as JSDOM and
8618
+ * Cloudflare workers.
8619
+ */
8620
+ function performanceMarkFeature(feature) {
8621
+ if (markedFeatures.has(feature)) {
8622
+ return;
8623
+ }
8624
+ markedFeatures.add(feature);
8625
+ performance?.mark?.('mark_feature_usage', { detail: { feature } });
8626
+ }
8627
+
8641
8628
  /**
8642
8629
  * Asserts that the current stack frame is not within a reactive context. Useful
8643
8630
  * to disallow certain code from running inside a reactive context (see {@link toSignal}).
@@ -12242,6 +12229,206 @@ function setupStaticAttributes(renderer, element, tNode) {
12242
12229
  }
12243
12230
  }
12244
12231
 
12232
+ /**
12233
+ * Creates a TView instance
12234
+ *
12235
+ * @param type Type of `TView`.
12236
+ * @param declTNode Declaration location of this `TView`.
12237
+ * @param templateFn Template function
12238
+ * @param decls The number of nodes, local refs, and pipes in this template
12239
+ * @param directives Registry of directives for this view
12240
+ * @param pipes Registry of pipes for this view
12241
+ * @param viewQuery View queries for this view
12242
+ * @param schemas Schemas for this view
12243
+ * @param consts Constants for this view
12244
+ */
12245
+ function createTView(type, declTNode, templateFn, decls, vars, directives, pipes, viewQuery, schemas, constsOrFactory, ssrId) {
12246
+ ngDevMode && ngDevMode.tView++;
12247
+ const bindingStartIndex = HEADER_OFFSET + decls;
12248
+ // This length does not yet contain host bindings from child directives because at this point,
12249
+ // we don't know which directives are active on this template. As soon as a directive is matched
12250
+ // that has a host binding, we will update the blueprint with that def's hostVars count.
12251
+ const initialViewLength = bindingStartIndex + vars;
12252
+ const blueprint = createViewBlueprint(bindingStartIndex, initialViewLength);
12253
+ const consts = typeof constsOrFactory === 'function' ? constsOrFactory() : constsOrFactory;
12254
+ const tView = (blueprint[TVIEW] = {
12255
+ type: type,
12256
+ blueprint: blueprint,
12257
+ template: templateFn,
12258
+ queries: null,
12259
+ viewQuery: viewQuery,
12260
+ declTNode: declTNode,
12261
+ data: blueprint.slice().fill(null, bindingStartIndex),
12262
+ bindingStartIndex: bindingStartIndex,
12263
+ expandoStartIndex: initialViewLength,
12264
+ hostBindingOpCodes: null,
12265
+ firstCreatePass: true,
12266
+ firstUpdatePass: true,
12267
+ staticViewQueries: false,
12268
+ staticContentQueries: false,
12269
+ preOrderHooks: null,
12270
+ preOrderCheckHooks: null,
12271
+ contentHooks: null,
12272
+ contentCheckHooks: null,
12273
+ viewHooks: null,
12274
+ viewCheckHooks: null,
12275
+ destroyHooks: null,
12276
+ cleanup: null,
12277
+ contentQueries: null,
12278
+ components: null,
12279
+ directiveRegistry: typeof directives === 'function' ? directives() : directives,
12280
+ pipeRegistry: typeof pipes === 'function' ? pipes() : pipes,
12281
+ firstChild: null,
12282
+ schemas: schemas,
12283
+ consts: consts,
12284
+ incompleteFirstPass: false,
12285
+ ssrId,
12286
+ });
12287
+ if (ngDevMode) {
12288
+ // For performance reasons it is important that the tView retains the same shape during runtime.
12289
+ // (To make sure that all of the code is monomorphic.) For this reason we seal the object to
12290
+ // prevent class transitions.
12291
+ Object.seal(tView);
12292
+ }
12293
+ return tView;
12294
+ }
12295
+ function createViewBlueprint(bindingStartIndex, initialViewLength) {
12296
+ const blueprint = [];
12297
+ for (let i = 0; i < initialViewLength; i++) {
12298
+ blueprint.push(i < bindingStartIndex ? null : NO_CHANGE);
12299
+ }
12300
+ return blueprint;
12301
+ }
12302
+ /**
12303
+ * Gets TView from a template function or creates a new TView
12304
+ * if it doesn't already exist.
12305
+ *
12306
+ * @param def ComponentDef
12307
+ * @returns TView
12308
+ */
12309
+ function getOrCreateComponentTView(def) {
12310
+ const tView = def.tView;
12311
+ // Create a TView if there isn't one, or recreate it if the first create pass didn't
12312
+ // complete successfully since we can't know for sure whether it's in a usable shape.
12313
+ if (tView === null || tView.incompleteFirstPass) {
12314
+ // Declaration node here is null since this function is called when we dynamically create a
12315
+ // component and hence there is no declaration.
12316
+ const declTNode = null;
12317
+ return (def.tView = createTView(1 /* TViewType.Component */, declTNode, def.template, def.decls, def.vars, def.directiveDefs, def.pipeDefs, def.viewQuery, def.schemas, def.consts, def.id));
12318
+ }
12319
+ return tView;
12320
+ }
12321
+ function createLView(parentLView, tView, context, flags, host, tHostNode, environment, renderer, injector, embeddedViewInjector, hydrationInfo) {
12322
+ const lView = tView.blueprint.slice();
12323
+ lView[HOST] = host;
12324
+ lView[FLAGS] =
12325
+ flags |
12326
+ 4 /* LViewFlags.CreationMode */ |
12327
+ 128 /* LViewFlags.Attached */ |
12328
+ 8 /* LViewFlags.FirstLViewPass */ |
12329
+ 64 /* LViewFlags.Dirty */ |
12330
+ 1024 /* LViewFlags.RefreshView */;
12331
+ if (embeddedViewInjector !== null ||
12332
+ (parentLView && parentLView[FLAGS] & 2048 /* LViewFlags.HasEmbeddedViewInjector */)) {
12333
+ lView[FLAGS] |= 2048 /* LViewFlags.HasEmbeddedViewInjector */;
12334
+ }
12335
+ resetPreOrderHookFlags(lView);
12336
+ ngDevMode && tView.declTNode && parentLView && assertTNodeForLView(tView.declTNode, parentLView);
12337
+ lView[PARENT] = lView[DECLARATION_VIEW] = parentLView;
12338
+ lView[CONTEXT] = context;
12339
+ lView[ENVIRONMENT] = (environment || (parentLView && parentLView[ENVIRONMENT]));
12340
+ ngDevMode && assertDefined(lView[ENVIRONMENT], 'LViewEnvironment is required');
12341
+ lView[RENDERER] = (renderer || (parentLView && parentLView[RENDERER]));
12342
+ ngDevMode && assertDefined(lView[RENDERER], 'Renderer is required');
12343
+ lView[INJECTOR] = injector || (parentLView && parentLView[INJECTOR]) || null;
12344
+ lView[T_HOST] = tHostNode;
12345
+ lView[ID] = getUniqueLViewId();
12346
+ lView[HYDRATION] = hydrationInfo;
12347
+ lView[EMBEDDED_VIEW_INJECTOR] = embeddedViewInjector;
12348
+ ngDevMode &&
12349
+ assertEqual(tView.type == 2 /* TViewType.Embedded */ ? parentLView !== null : true, true, 'Embedded views must have parentLView');
12350
+ lView[DECLARATION_COMPONENT_VIEW] =
12351
+ tView.type == 2 /* TViewType.Embedded */ ? parentLView[DECLARATION_COMPONENT_VIEW] : lView;
12352
+ return lView;
12353
+ }
12354
+ function createComponentLView(lView, hostTNode, def) {
12355
+ const native = getNativeByTNode(hostTNode, lView);
12356
+ const tView = getOrCreateComponentTView(def);
12357
+ // Only component views should be added to the view tree directly. Embedded views are
12358
+ // accessed through their containers because they may be removed / re-added later.
12359
+ const rendererFactory = lView[ENVIRONMENT].rendererFactory;
12360
+ const componentView = addToEndOfViewTree(lView, createLView(lView, tView, null, getInitialLViewFlagsFromDef(def), native, hostTNode, null, rendererFactory.createRenderer(native, def), null, null, null));
12361
+ // Component view will always be created before any injected LContainers,
12362
+ // so this is a regular element, wrap it with the component view
12363
+ return (lView[hostTNode.index] = componentView);
12364
+ }
12365
+ /**
12366
+ * Gets the initial set of LView flags based on the component definition that the LView represents.
12367
+ * @param def Component definition from which to determine the flags.
12368
+ */
12369
+ function getInitialLViewFlagsFromDef(def) {
12370
+ let flags = 16 /* LViewFlags.CheckAlways */;
12371
+ if (def.signals) {
12372
+ flags = 4096 /* LViewFlags.SignalView */;
12373
+ }
12374
+ else if (def.onPush) {
12375
+ flags = 64 /* LViewFlags.Dirty */;
12376
+ }
12377
+ return flags;
12378
+ }
12379
+ /**
12380
+ * When elements are created dynamically after a view blueprint is created (e.g. through
12381
+ * i18nApply()), we need to adjust the blueprint for future template passes.
12382
+ *
12383
+ * @param tView `TView` associated with `LView`
12384
+ * @param lView The `LView` containing the blueprint to adjust
12385
+ * @param numSlotsToAlloc The number of slots to alloc in the LView, should be >0
12386
+ * @param initialValue Initial value to store in blueprint
12387
+ */
12388
+ function allocExpando(tView, lView, numSlotsToAlloc, initialValue) {
12389
+ if (numSlotsToAlloc === 0)
12390
+ return -1;
12391
+ if (ngDevMode) {
12392
+ assertFirstCreatePass(tView);
12393
+ assertSame(tView, lView[TVIEW], '`LView` must be associated with `TView`!');
12394
+ assertEqual(tView.data.length, lView.length, 'Expecting LView to be same size as TView');
12395
+ assertEqual(tView.data.length, tView.blueprint.length, 'Expecting Blueprint to be same size as TView');
12396
+ assertFirstUpdatePass(tView);
12397
+ }
12398
+ const allocIdx = lView.length;
12399
+ for (let i = 0; i < numSlotsToAlloc; i++) {
12400
+ lView.push(initialValue);
12401
+ tView.blueprint.push(initialValue);
12402
+ tView.data.push(null);
12403
+ }
12404
+ return allocIdx;
12405
+ }
12406
+ /**
12407
+ * Adds LView or LContainer to the end of the current view tree.
12408
+ *
12409
+ * This structure will be used to traverse through nested views to remove listeners
12410
+ * and call onDestroy callbacks.
12411
+ *
12412
+ * @param lView The view where LView or LContainer should be added
12413
+ * @param adjustedHostIndex Index of the view's host node in LView[], adjusted for header
12414
+ * @param lViewOrLContainer The LView or LContainer to add to the view tree
12415
+ * @returns The state passed in
12416
+ */
12417
+ function addToEndOfViewTree(lView, lViewOrLContainer) {
12418
+ // TODO(benlesh/misko): This implementation is incorrect, because it always adds the LContainer
12419
+ // to the end of the queue, which means if the developer retrieves the LContainers from RNodes out
12420
+ // of order, the change detection will run out of order, as the act of retrieving the the
12421
+ // LContainer from the RNode is what adds it to the queue.
12422
+ if (lView[CHILD_HEAD]) {
12423
+ lView[CHILD_TAIL][NEXT] = lViewOrLContainer;
12424
+ }
12425
+ else {
12426
+ lView[CHILD_HEAD] = lViewOrLContainer;
12427
+ }
12428
+ lView[CHILD_TAIL] = lViewOrLContainer;
12429
+ return lViewOrLContainer;
12430
+ }
12431
+
12245
12432
  /**
12246
12433
  * Advances to an element for later binding instructions.
12247
12434
  *
@@ -12303,9 +12490,21 @@ var InputFlags;
12303
12490
  InputFlags[InputFlags["HasDecoratorInputTransform"] = 2] = "HasDecoratorInputTransform";
12304
12491
  })(InputFlags || (InputFlags = {}));
12305
12492
 
12306
- function writeToDirectiveInput(def, instance, publicName, privateName, flags, value) {
12493
+ function writeToDirectiveInput(def, instance, publicName, value) {
12307
12494
  const prevConsumer = setActiveConsumer$1(null);
12308
12495
  try {
12496
+ if (ngDevMode) {
12497
+ if (!def.inputs.hasOwnProperty(publicName)) {
12498
+ throw new Error(`ASSERTION ERROR: Directive ${def.type.name} does not have an input with a public name of "${publicName}"`);
12499
+ }
12500
+ // Usually we resolve the directive instance using `LView[someIndex]` before writing to an
12501
+ // input, however if the read happens to early, the `LView[someIndex]` might actually be a
12502
+ // `NodeInjectorFactory`. Check for this specific case here since it can break in subtle ways.
12503
+ if (isFactory(instance)) {
12504
+ throw new Error(`ASSERTION ERROR: Cannot write input to factory for type ${def.type.name}. Directive has not been created yet.`);
12505
+ }
12506
+ }
12507
+ const [privateName, flags, transform] = def.inputs[publicName];
12309
12508
  // If we know we are dealing with a signal input, we cache its reference
12310
12509
  // in a tree-shakable way. The input signal node can then be used for
12311
12510
  // value transform execution or actual value updates without introducing
@@ -12320,9 +12519,9 @@ function writeToDirectiveInput(def, instance, publicName, privateName, flags, va
12320
12519
  if (inputSignalNode !== null && inputSignalNode.transformFn !== undefined) {
12321
12520
  value = inputSignalNode.transformFn(value);
12322
12521
  }
12323
- // If there is a decorator input transform, run it.
12324
- if ((flags & InputFlags.HasDecoratorInputTransform) !== 0) {
12325
- value = def.inputTransforms[privateName].call(instance, value);
12522
+ else if (transform !== null) {
12523
+ // If there is a decorator input transform, run it.
12524
+ value = transform.call(instance, value);
12326
12525
  }
12327
12526
  if (def.setInput !== null) {
12328
12527
  def.setInput(instance, inputSignalNode, value, publicName, privateName);
@@ -12336,39 +12535,6 @@ function writeToDirectiveInput(def, instance, publicName, privateName, flags, va
12336
12535
  }
12337
12536
  }
12338
12537
 
12339
- function createLView(parentLView, tView, context, flags, host, tHostNode, environment, renderer, injector, embeddedViewInjector, hydrationInfo) {
12340
- const lView = tView.blueprint.slice();
12341
- lView[HOST] = host;
12342
- lView[FLAGS] =
12343
- flags |
12344
- 4 /* LViewFlags.CreationMode */ |
12345
- 128 /* LViewFlags.Attached */ |
12346
- 8 /* LViewFlags.FirstLViewPass */ |
12347
- 64 /* LViewFlags.Dirty */ |
12348
- 1024 /* LViewFlags.RefreshView */;
12349
- if (embeddedViewInjector !== null ||
12350
- (parentLView && parentLView[FLAGS] & 2048 /* LViewFlags.HasEmbeddedViewInjector */)) {
12351
- lView[FLAGS] |= 2048 /* LViewFlags.HasEmbeddedViewInjector */;
12352
- }
12353
- resetPreOrderHookFlags(lView);
12354
- ngDevMode && tView.declTNode && parentLView && assertTNodeForLView(tView.declTNode, parentLView);
12355
- lView[PARENT] = lView[DECLARATION_VIEW] = parentLView;
12356
- lView[CONTEXT] = context;
12357
- lView[ENVIRONMENT] = (environment || (parentLView && parentLView[ENVIRONMENT]));
12358
- ngDevMode && assertDefined(lView[ENVIRONMENT], 'LViewEnvironment is required');
12359
- lView[RENDERER] = (renderer || (parentLView && parentLView[RENDERER]));
12360
- ngDevMode && assertDefined(lView[RENDERER], 'Renderer is required');
12361
- lView[INJECTOR] = injector || (parentLView && parentLView[INJECTOR]) || null;
12362
- lView[T_HOST] = tHostNode;
12363
- lView[ID] = getUniqueLViewId();
12364
- lView[HYDRATION] = hydrationInfo;
12365
- lView[EMBEDDED_VIEW_INJECTOR] = embeddedViewInjector;
12366
- ngDevMode &&
12367
- assertEqual(tView.type == 2 /* TViewType.Embedded */ ? parentLView !== null : true, true, 'Embedded views must have parentLView');
12368
- lView[DECLARATION_COMPONENT_VIEW] =
12369
- tView.type == 2 /* TViewType.Embedded */ ? parentLView[DECLARATION_COMPONENT_VIEW] : lView;
12370
- return lView;
12371
- }
12372
12538
  function executeTemplate(tView, lView, templateFn, rf, context) {
12373
12539
  const prevSelectedIndex = getSelectedIndex();
12374
12540
  const isUpdatePhase = rf & 2 /* RenderFlags.Update */;
@@ -12393,15 +12559,6 @@ function executeTemplate(tView, lView, templateFn, rf, context) {
12393
12559
  profiler(postHookType, context);
12394
12560
  }
12395
12561
  }
12396
- /**
12397
- * Creates directive instances.
12398
- */
12399
- function createDirectivesInstancesInInstruction(tView, lView, tNode) {
12400
- if (!getBindingsEnabled())
12401
- return;
12402
- attachPatchData(getNativeByTNode(tNode, lView), lView);
12403
- createDirectivesInstances(tView, lView, tNode);
12404
- }
12405
12562
  /**
12406
12563
  * Creates directive instances.
12407
12564
  */
@@ -12428,95 +12585,6 @@ function saveResolvedLocalsInData(viewData, tNode, localRefExtractor = getNative
12428
12585
  }
12429
12586
  }
12430
12587
  }
12431
- /**
12432
- * Gets TView from a template function or creates a new TView
12433
- * if it doesn't already exist.
12434
- *
12435
- * @param def ComponentDef
12436
- * @returns TView
12437
- */
12438
- function getOrCreateComponentTView(def) {
12439
- const tView = def.tView;
12440
- // Create a TView if there isn't one, or recreate it if the first create pass didn't
12441
- // complete successfully since we can't know for sure whether it's in a usable shape.
12442
- if (tView === null || tView.incompleteFirstPass) {
12443
- // Declaration node here is null since this function is called when we dynamically create a
12444
- // component and hence there is no declaration.
12445
- const declTNode = null;
12446
- return (def.tView = createTView(1 /* TViewType.Component */, declTNode, def.template, def.decls, def.vars, def.directiveDefs, def.pipeDefs, def.viewQuery, def.schemas, def.consts, def.id));
12447
- }
12448
- return tView;
12449
- }
12450
- /**
12451
- * Creates a TView instance
12452
- *
12453
- * @param type Type of `TView`.
12454
- * @param declTNode Declaration location of this `TView`.
12455
- * @param templateFn Template function
12456
- * @param decls The number of nodes, local refs, and pipes in this template
12457
- * @param directives Registry of directives for this view
12458
- * @param pipes Registry of pipes for this view
12459
- * @param viewQuery View queries for this view
12460
- * @param schemas Schemas for this view
12461
- * @param consts Constants for this view
12462
- */
12463
- function createTView(type, declTNode, templateFn, decls, vars, directives, pipes, viewQuery, schemas, constsOrFactory, ssrId) {
12464
- ngDevMode && ngDevMode.tView++;
12465
- const bindingStartIndex = HEADER_OFFSET + decls;
12466
- // This length does not yet contain host bindings from child directives because at this point,
12467
- // we don't know which directives are active on this template. As soon as a directive is matched
12468
- // that has a host binding, we will update the blueprint with that def's hostVars count.
12469
- const initialViewLength = bindingStartIndex + vars;
12470
- const blueprint = createViewBlueprint(bindingStartIndex, initialViewLength);
12471
- const consts = typeof constsOrFactory === 'function' ? constsOrFactory() : constsOrFactory;
12472
- const tView = (blueprint[TVIEW] = {
12473
- type: type,
12474
- blueprint: blueprint,
12475
- template: templateFn,
12476
- queries: null,
12477
- viewQuery: viewQuery,
12478
- declTNode: declTNode,
12479
- data: blueprint.slice().fill(null, bindingStartIndex),
12480
- bindingStartIndex: bindingStartIndex,
12481
- expandoStartIndex: initialViewLength,
12482
- hostBindingOpCodes: null,
12483
- firstCreatePass: true,
12484
- firstUpdatePass: true,
12485
- staticViewQueries: false,
12486
- staticContentQueries: false,
12487
- preOrderHooks: null,
12488
- preOrderCheckHooks: null,
12489
- contentHooks: null,
12490
- contentCheckHooks: null,
12491
- viewHooks: null,
12492
- viewCheckHooks: null,
12493
- destroyHooks: null,
12494
- cleanup: null,
12495
- contentQueries: null,
12496
- components: null,
12497
- directiveRegistry: typeof directives === 'function' ? directives() : directives,
12498
- pipeRegistry: typeof pipes === 'function' ? pipes() : pipes,
12499
- firstChild: null,
12500
- schemas: schemas,
12501
- consts: consts,
12502
- incompleteFirstPass: false,
12503
- ssrId,
12504
- });
12505
- if (ngDevMode) {
12506
- // For performance reasons it is important that the tView retains the same shape during runtime.
12507
- // (To make sure that all of the code is monomorphic.) For this reason we seal the object to
12508
- // prevent class transitions.
12509
- Object.seal(tView);
12510
- }
12511
- return tView;
12512
- }
12513
- function createViewBlueprint(bindingStartIndex, initialViewLength) {
12514
- const blueprint = [];
12515
- for (let i = 0; i < initialViewLength; i++) {
12516
- blueprint.push(i < bindingStartIndex ? null : NO_CHANGE);
12517
- }
12518
- return blueprint;
12519
- }
12520
12588
  /**
12521
12589
  * Locates the host native element, used for bootstrapping existing nodes into rendering pipeline.
12522
12590
  *
@@ -12608,18 +12676,16 @@ function mapPropName(name) {
12608
12676
  }
12609
12677
  function elementPropertyInternal(tView, tNode, lView, propName, value, renderer, sanitizer, nativeOnly) {
12610
12678
  ngDevMode && assertNotSame(value, NO_CHANGE, 'Incoming value should never be NO_CHANGE.');
12611
- const element = getNativeByTNode(tNode, lView);
12612
- let inputData = tNode.inputs;
12613
- let dataValue;
12614
- if (!nativeOnly && inputData != null && (dataValue = inputData[propName])) {
12615
- setInputsForProperty(tView, lView, dataValue, propName, value);
12616
- if (isComponentHost(tNode))
12617
- markDirtyIfOnPush(lView, tNode.index);
12618
- if (ngDevMode) {
12619
- setNgReflectProperties(lView, element, tNode.type, dataValue, value);
12679
+ if (!nativeOnly) {
12680
+ const hasSetInput = setAllInputsForProperty(tNode, tView, lView, propName, value);
12681
+ if (hasSetInput) {
12682
+ isComponentHost(tNode) && markDirtyIfOnPush(lView, tNode.index);
12683
+ ngDevMode && setNgReflectProperties(lView, tView, tNode, propName, value);
12684
+ return; // Stop propcessing if we've matched at least one input.
12620
12685
  }
12621
12686
  }
12622
- else if (tNode.type & 3 /* TNodeType.AnyRNode */) {
12687
+ if (tNode.type & 3 /* TNodeType.AnyRNode */) {
12688
+ const element = getNativeByTNode(tNode, lView);
12623
12689
  propName = mapPropName(propName);
12624
12690
  if (ngDevMode) {
12625
12691
  validateAgainstEventProperties(propName);
@@ -12649,11 +12715,12 @@ function markDirtyIfOnPush(lView, viewIndex) {
12649
12715
  childComponentLView[FLAGS] |= 64 /* LViewFlags.Dirty */;
12650
12716
  }
12651
12717
  }
12652
- function setNgReflectProperty(lView, element, type, attrName, value) {
12718
+ function setNgReflectProperty(lView, tNode, attrName, value) {
12719
+ const element = getNativeByTNode(tNode, lView);
12653
12720
  const renderer = lView[RENDERER];
12654
12721
  attrName = normalizeDebugBindingName(attrName);
12655
12722
  const debugValue = normalizeDebugBindingValue(value);
12656
- if (type & 3 /* TNodeType.AnyRNode */) {
12723
+ if (tNode.type & 3 /* TNodeType.AnyRNode */) {
12657
12724
  if (value == null) {
12658
12725
  renderer.removeAttribute(element, attrName);
12659
12726
  }
@@ -12666,18 +12733,25 @@ function setNgReflectProperty(lView, element, type, attrName, value) {
12666
12733
  renderer.setValue(element, textContent);
12667
12734
  }
12668
12735
  }
12669
- function setNgReflectProperties(lView, element, type, dataValue, value) {
12670
- if (type & (3 /* TNodeType.AnyRNode */ | 4 /* TNodeType.Container */)) {
12671
- /**
12672
- * dataValue is an array containing runtime input or output names for the directives:
12673
- * i+0: directive instance index
12674
- * i+1: privateName
12675
- *
12676
- * e.g. [0, 'change', 'change-minified']
12677
- * we want to set the reflected property with the privateName: dataValue[i+1]
12678
- */
12679
- for (let i = 0; i < dataValue.length; i += 3) {
12680
- setNgReflectProperty(lView, element, type, dataValue[i + 1], value);
12736
+ function setNgReflectProperties(lView, tView, tNode, publicName, value) {
12737
+ if (!(tNode.type & (3 /* TNodeType.AnyRNode */ | 4 /* TNodeType.Container */))) {
12738
+ return;
12739
+ }
12740
+ const inputConfig = tNode.inputs?.[publicName];
12741
+ const hostInputConfig = tNode.hostDirectiveInputs?.[publicName];
12742
+ if (hostInputConfig) {
12743
+ for (let i = 0; i < hostInputConfig.length; i += 2) {
12744
+ const index = hostInputConfig[i];
12745
+ const publicName = hostInputConfig[i + 1];
12746
+ const def = tView.data[index];
12747
+ setNgReflectProperty(lView, tNode, def.inputs[publicName][0], value);
12748
+ }
12749
+ }
12750
+ // Note: we set the private name of the input as the reflected property, not the public one.
12751
+ if (inputConfig) {
12752
+ for (const index of inputConfig) {
12753
+ const def = tView.data[index];
12754
+ setNgReflectProperty(lView, tNode, def.inputs[publicName][0], value);
12681
12755
  }
12682
12756
  }
12683
12757
  }
@@ -12774,31 +12848,6 @@ function findDirectiveDefMatches(tView, tNode) {
12774
12848
  }
12775
12849
  return matches;
12776
12850
  }
12777
- /**
12778
- * Gets the initial set of LView flags based on the component definition that the LView represents.
12779
- * @param def Component definition from which to determine the flags.
12780
- */
12781
- function getInitialLViewFlagsFromDef(def) {
12782
- let flags = 16 /* LViewFlags.CheckAlways */;
12783
- if (def.signals) {
12784
- flags = 4096 /* LViewFlags.SignalView */;
12785
- }
12786
- else if (def.onPush) {
12787
- flags = 64 /* LViewFlags.Dirty */;
12788
- }
12789
- return flags;
12790
- }
12791
- function createComponentLView(lView, hostTNode, def) {
12792
- const native = getNativeByTNode(hostTNode, lView);
12793
- const tView = getOrCreateComponentTView(def);
12794
- // Only component views should be added to the view tree directly. Embedded views are
12795
- // accessed through their containers because they may be removed / re-added later.
12796
- const rendererFactory = lView[ENVIRONMENT].rendererFactory;
12797
- const componentView = addToEndOfViewTree(lView, createLView(lView, tView, null, getInitialLViewFlagsFromDef(def), native, hostTNode, null, rendererFactory.createRenderer(native, def), null, null, null));
12798
- // Component view will always be created before any injected LContainers,
12799
- // so this is a regular element, wrap it with the component view
12800
- return (lView[hostTNode.index] = componentView);
12801
- }
12802
12851
  function elementAttributeInternal(tNode, lView, name, value, sanitizer, namespace) {
12803
12852
  if (ngDevMode) {
12804
12853
  assertNotSame(value, NO_CHANGE, 'Incoming value should never be NO_CHANGE.');
@@ -12832,75 +12881,16 @@ function setElementAttribute(renderer, element, namespace, tagName, name, value,
12832
12881
  function setInputsFromAttrs(lView, directiveIndex, instance, def, tNode, initialInputData) {
12833
12882
  const initialInputs = initialInputData[directiveIndex];
12834
12883
  if (initialInputs !== null) {
12835
- for (let i = 0; i < initialInputs.length;) {
12836
- const publicName = initialInputs[i++];
12837
- const privateName = initialInputs[i++];
12838
- const flags = initialInputs[i++];
12839
- const value = initialInputs[i++];
12840
- writeToDirectiveInput(def, instance, publicName, privateName, flags, value);
12884
+ for (let i = 0; i < initialInputs.length; i += 2) {
12885
+ const lookupName = initialInputs[i];
12886
+ const value = initialInputs[i + 1];
12887
+ writeToDirectiveInput(def, instance, lookupName, value);
12841
12888
  if (ngDevMode) {
12842
- const nativeElement = getNativeByTNode(tNode, lView);
12843
- setNgReflectProperty(lView, nativeElement, tNode.type, privateName, value);
12889
+ setNgReflectProperty(lView, tNode, def.inputs[lookupName][0], value);
12844
12890
  }
12845
12891
  }
12846
12892
  }
12847
12893
  }
12848
- //////////////////////////
12849
- //// ViewContainer & View
12850
- //////////////////////////
12851
- /**
12852
- * Creates a LContainer, either from a container instruction, or for a ViewContainerRef.
12853
- *
12854
- * @param hostNative The host element for the LContainer
12855
- * @param hostTNode The host TNode for the LContainer
12856
- * @param currentView The parent view of the LContainer
12857
- * @param native The native comment element
12858
- * @param isForViewContainerRef Optional a flag indicating the ViewContainerRef case
12859
- * @returns LContainer
12860
- */
12861
- function createLContainer(hostNative, currentView, native, tNode) {
12862
- ngDevMode && assertLView(currentView);
12863
- const lContainer = [
12864
- hostNative, // host native
12865
- true, // Boolean `true` in this position signifies that this is an `LContainer`
12866
- 0, // flags
12867
- currentView, // parent
12868
- null, // next
12869
- tNode, // t_host
12870
- null, // dehydrated views
12871
- native, // native,
12872
- null, // view refs
12873
- null, // moved views
12874
- ];
12875
- ngDevMode &&
12876
- assertEqual(lContainer.length, CONTAINER_HEADER_OFFSET, 'Should allocate correct number of slots for LContainer header.');
12877
- return lContainer;
12878
- }
12879
- /**
12880
- * Adds LView or LContainer to the end of the current view tree.
12881
- *
12882
- * This structure will be used to traverse through nested views to remove listeners
12883
- * and call onDestroy callbacks.
12884
- *
12885
- * @param lView The view where LView or LContainer should be added
12886
- * @param adjustedHostIndex Index of the view's host node in LView[], adjusted for header
12887
- * @param lViewOrLContainer The LView or LContainer to add to the view tree
12888
- * @returns The state passed in
12889
- */
12890
- function addToEndOfViewTree(lView, lViewOrLContainer) {
12891
- // TODO(benlesh/misko): This implementation is incorrect, because it always adds the LContainer
12892
- // to the end of the queue, which means if the developer retrieves the LContainers from RNodes out
12893
- // of order, the change detection will run out of order, as the act of retrieving the the
12894
- // LContainer from the RNode is what adds it to the queue.
12895
- if (lView[CHILD_HEAD]) {
12896
- lView[CHILD_TAIL][NEXT] = lViewOrLContainer;
12897
- }
12898
- else {
12899
- lView[CHILD_HEAD] = lViewOrLContainer;
12900
- }
12901
- lView[CHILD_TAIL] = lViewOrLContainer;
12902
- return lViewOrLContainer;
12903
- }
12904
12894
  ///////////////////////////////
12905
12895
  //// Bindings & interpolations
12906
12896
  ///////////////////////////////
@@ -12930,7 +12920,7 @@ function storePropertyBindingMetadata(tData, tNode, propertyName, bindingIndex,
12930
12920
  // Since we don't have a concept of the "first update pass" we need to check for presence of the
12931
12921
  // binding meta-data to decide if one should be stored (or if was stored already).
12932
12922
  if (tData[bindingIndex] === null) {
12933
- if (tNode.inputs == null || !tNode.inputs[propertyName]) {
12923
+ if (!tNode.inputs?.[propertyName] && !tNode.hostDirectiveInputs?.[propertyName]) {
12934
12924
  const propBindingIdxs = tNode.propertyBindings || (tNode.propertyBindings = []);
12935
12925
  propBindingIdxs.push(bindingIndex);
12936
12926
  let bindingMetadata = propertyName;
@@ -12965,24 +12955,88 @@ function handleError(lView, error) {
12965
12955
  errorHandler && errorHandler.handleError(error);
12966
12956
  }
12967
12957
  /**
12968
- * Set the inputs of directives at the current node to corresponding value.
12958
+ * Set all directive inputs with the specific public name on the node.
12969
12959
  *
12970
- * @param tView The current TView
12971
- * @param lView the `LView` which contains the directives.
12972
- * @param inputs mapping between the public "input" name and privately-known,
12973
- * possibly minified, property names to write to.
12960
+ * @param tNode TNode on which the input is being set.
12961
+ * @param tView Current TView
12962
+ * @param lView `LView` which contains the directives.
12963
+ * @param publicName Public name of the input being set.
12964
+ * @param value Value to set.
12965
+ */
12966
+ function setAllInputsForProperty(tNode, tView, lView, publicName, value) {
12967
+ const inputs = tNode.inputs?.[publicName];
12968
+ const hostDirectiveInputs = tNode.hostDirectiveInputs?.[publicName];
12969
+ let hasMatch = false;
12970
+ if (hostDirectiveInputs) {
12971
+ for (let i = 0; i < hostDirectiveInputs.length; i += 2) {
12972
+ const index = hostDirectiveInputs[i];
12973
+ ngDevMode && assertIndexInRange(lView, index);
12974
+ const publicName = hostDirectiveInputs[i + 1];
12975
+ const def = tView.data[index];
12976
+ writeToDirectiveInput(def, lView[index], publicName, value);
12977
+ hasMatch = true;
12978
+ }
12979
+ }
12980
+ if (inputs) {
12981
+ for (const index of inputs) {
12982
+ ngDevMode && assertIndexInRange(lView, index);
12983
+ const instance = lView[index];
12984
+ const def = tView.data[index];
12985
+ writeToDirectiveInput(def, instance, publicName, value);
12986
+ hasMatch = true;
12987
+ }
12988
+ }
12989
+ return hasMatch;
12990
+ }
12991
+ /**
12992
+ * Sets an input value only on a specific directive and its host directives.
12993
+ * @param tNode TNode on which the input is being set.
12994
+ * @param tView Current TView
12995
+ * @param lView `LView` which contains the directives.
12996
+ * @param target Directive on which to set the input.
12997
+ * @param publicName Public name of the input being set.
12974
12998
  * @param value Value to set.
12975
12999
  */
12976
- function setInputsForProperty(tView, lView, inputs, publicName, value) {
12977
- for (let i = 0; i < inputs.length;) {
12978
- const index = inputs[i++];
12979
- const privateName = inputs[i++];
12980
- const flags = inputs[i++];
12981
- const instance = lView[index];
12982
- ngDevMode && assertIndexInRange(lView, index);
12983
- const def = tView.data[index];
12984
- writeToDirectiveInput(def, instance, publicName, privateName, flags, value);
13000
+ function setDirectiveInput(tNode, tView, lView, target, publicName, value) {
13001
+ let hostIndex = null;
13002
+ let hostDirectivesStart = null;
13003
+ let hostDirectivesEnd = null;
13004
+ let hasSet = false;
13005
+ if (ngDevMode && !tNode.directiveToIndex?.has(target.type)) {
13006
+ throw new Error(`Node does not have a directive with type ${target.type.name}`);
13007
+ }
13008
+ const data = tNode.directiveToIndex.get(target.type);
13009
+ if (typeof data === 'number') {
13010
+ hostIndex = data;
13011
+ }
13012
+ else {
13013
+ [hostIndex, hostDirectivesStart, hostDirectivesEnd] = data;
13014
+ }
13015
+ if (hostDirectivesStart !== null &&
13016
+ hostDirectivesEnd !== null &&
13017
+ tNode.hostDirectiveInputs?.hasOwnProperty(publicName)) {
13018
+ const hostDirectiveInputs = tNode.hostDirectiveInputs[publicName];
13019
+ for (let i = 0; i < hostDirectiveInputs.length; i += 2) {
13020
+ const index = hostDirectiveInputs[i];
13021
+ if (index >= hostDirectivesStart && index <= hostDirectivesEnd) {
13022
+ ngDevMode && assertIndexInRange(lView, index);
13023
+ const def = tView.data[index];
13024
+ const hostDirectivePublicName = hostDirectiveInputs[i + 1];
13025
+ writeToDirectiveInput(def, lView[index], hostDirectivePublicName, value);
13026
+ hasSet = true;
13027
+ }
13028
+ else if (index > hostDirectivesEnd) {
13029
+ // Directives here are in ascending order so we can stop looking once we're past the range.
13030
+ break;
13031
+ }
13032
+ }
13033
+ }
13034
+ if (hostIndex !== null) {
13035
+ ngDevMode && assertIndexInRange(lView, hostIndex);
13036
+ writeToDirectiveInput(target, lView[hostIndex], publicName, value);
13037
+ hasSet = true;
12985
13038
  }
13039
+ return hasSet;
12986
13040
  }
12987
13041
 
12988
13042
  function renderComponent(hostLView, componentHostIdx) {
@@ -13103,24 +13157,41 @@ function renderChildComponents(hostLView, components) {
13103
13157
  }
13104
13158
  }
13105
13159
 
13160
+ function createAndRenderEmbeddedLView(declarationLView, templateTNode, context, options) {
13161
+ const prevConsumer = setActiveConsumer$1(null);
13162
+ try {
13163
+ const embeddedTView = templateTNode.tView;
13164
+ ngDevMode && assertDefined(embeddedTView, 'TView must be defined for a template node.');
13165
+ ngDevMode && assertTNodeForLView(templateTNode, declarationLView);
13166
+ // Embedded views follow the change detection strategy of the view they're declared in.
13167
+ const isSignalView = declarationLView[FLAGS] & 4096 /* LViewFlags.SignalView */;
13168
+ const viewFlags = isSignalView ? 4096 /* LViewFlags.SignalView */ : 16 /* LViewFlags.CheckAlways */;
13169
+ const embeddedLView = createLView(declarationLView, embeddedTView, context, viewFlags, null, templateTNode, null, null, options?.injector ?? null, options?.embeddedViewInjector ?? null, options?.dehydratedView ?? null);
13170
+ const declarationLContainer = declarationLView[templateTNode.index];
13171
+ ngDevMode && assertLContainer(declarationLContainer);
13172
+ embeddedLView[DECLARATION_LCONTAINER] = declarationLContainer;
13173
+ const declarationViewLQueries = declarationLView[QUERIES];
13174
+ if (declarationViewLQueries !== null) {
13175
+ embeddedLView[QUERIES] = declarationViewLQueries.createEmbeddedView(embeddedTView);
13176
+ }
13177
+ // execute creation mode of a view
13178
+ renderView(embeddedTView, embeddedLView, context);
13179
+ return embeddedLView;
13180
+ }
13181
+ finally {
13182
+ setActiveConsumer$1(prevConsumer);
13183
+ }
13184
+ }
13106
13185
  /**
13107
- * Flags for renderer-specific style modifiers.
13108
- * @publicApi
13186
+ * Returns whether an elements that belong to a view should be
13187
+ * inserted into the DOM. For client-only cases, DOM elements are
13188
+ * always inserted. For hydration cases, we check whether serialized
13189
+ * info is available for a view and the view is not in a "skip hydration"
13190
+ * block (in which case view contents was re-created, thus needing insertion).
13109
13191
  */
13110
- var RendererStyleFlags2;
13111
- (function (RendererStyleFlags2) {
13112
- // TODO(misko): This needs to be refactored into a separate file so that it can be imported from
13113
- // `node_manipulation.ts` Currently doing the import cause resolution order to change and fails
13114
- // the tests. The work around is to have hard coded value in `node_manipulation.ts` for now.
13115
- /**
13116
- * Marks a style as important.
13117
- */
13118
- RendererStyleFlags2[RendererStyleFlags2["Important"] = 1] = "Important";
13119
- /**
13120
- * Marks a style as using dash case naming (this-is-dash-case).
13121
- */
13122
- RendererStyleFlags2[RendererStyleFlags2["DashCase"] = 2] = "DashCase";
13123
- })(RendererStyleFlags2 || (RendererStyleFlags2 = {}));
13192
+ function shouldAddViewToDom(tNode, dehydratedView) {
13193
+ return (!dehydratedView || dehydratedView.firstChild === null || hasInSkipHydrationBlockFlag(tNode));
13194
+ }
13124
13195
 
13125
13196
  let _icuContainerIterate;
13126
13197
  /**
@@ -13143,6 +13214,25 @@ function ensureIcuContainerVisitorLoaded(loader) {
13143
13214
  }
13144
13215
  }
13145
13216
 
13217
+ /**
13218
+ * Flags for renderer-specific style modifiers.
13219
+ * @publicApi
13220
+ */
13221
+ var RendererStyleFlags2;
13222
+ (function (RendererStyleFlags2) {
13223
+ // TODO(misko): This needs to be refactored into a separate file so that it can be imported from
13224
+ // `node_manipulation.ts` Currently doing the import cause resolution order to change and fails
13225
+ // the tests. The work around is to have hard coded value in `node_manipulation.ts` for now.
13226
+ /**
13227
+ * Marks a style as important.
13228
+ */
13229
+ RendererStyleFlags2[RendererStyleFlags2["Important"] = 1] = "Important";
13230
+ /**
13231
+ * Marks a style as using dash case naming (this-is-dash-case).
13232
+ */
13233
+ RendererStyleFlags2[RendererStyleFlags2["DashCase"] = 2] = "DashCase";
13234
+ })(RendererStyleFlags2 || (RendererStyleFlags2 = {}));
13235
+
13146
13236
  /**
13147
13237
  * Checks whether a TNode is considered detached, i.e. not present in the
13148
13238
  * translated i18n template. We should not attempt hydration for such nodes
@@ -13297,83 +13387,6 @@ function destroyViewTree(rootView) {
13297
13387
  lViewOrLContainer = next;
13298
13388
  }
13299
13389
  }
13300
- /**
13301
- * Inserts a view into a container.
13302
- *
13303
- * This adds the view to the container's array of active views in the correct
13304
- * position. It also adds the view's elements to the DOM if the container isn't a
13305
- * root node of another view (in that case, the view's elements will be added when
13306
- * the container's parent view is added later).
13307
- *
13308
- * @param tView The `TView' of the `LView` to insert
13309
- * @param lView The view to insert
13310
- * @param lContainer The container into which the view should be inserted
13311
- * @param index Which index in the container to insert the child view into
13312
- */
13313
- function insertView(tView, lView, lContainer, index) {
13314
- ngDevMode && assertLView(lView);
13315
- ngDevMode && assertLContainer(lContainer);
13316
- const indexInContainer = CONTAINER_HEADER_OFFSET + index;
13317
- const containerLength = lContainer.length;
13318
- if (index > 0) {
13319
- // This is a new view, we need to add it to the children.
13320
- lContainer[indexInContainer - 1][NEXT] = lView;
13321
- }
13322
- if (index < containerLength - CONTAINER_HEADER_OFFSET) {
13323
- lView[NEXT] = lContainer[indexInContainer];
13324
- addToArray(lContainer, CONTAINER_HEADER_OFFSET + index, lView);
13325
- }
13326
- else {
13327
- lContainer.push(lView);
13328
- lView[NEXT] = null;
13329
- }
13330
- lView[PARENT] = lContainer;
13331
- // track views where declaration and insertion points are different
13332
- const declarationLContainer = lView[DECLARATION_LCONTAINER];
13333
- if (declarationLContainer !== null && lContainer !== declarationLContainer) {
13334
- trackMovedView(declarationLContainer, lView);
13335
- }
13336
- // notify query that a new view has been added
13337
- const lQueries = lView[QUERIES];
13338
- if (lQueries !== null) {
13339
- lQueries.insertView(tView);
13340
- }
13341
- updateAncestorTraversalFlagsOnAttach(lView);
13342
- // Sets the attached flag
13343
- lView[FLAGS] |= 128 /* LViewFlags.Attached */;
13344
- }
13345
- /**
13346
- * Track views created from the declaration container (TemplateRef) and inserted into a
13347
- * different LContainer or attached directly to ApplicationRef.
13348
- */
13349
- function trackMovedView(declarationContainer, lView) {
13350
- ngDevMode && assertDefined(lView, 'LView required');
13351
- ngDevMode && assertLContainer(declarationContainer);
13352
- const movedViews = declarationContainer[MOVED_VIEWS];
13353
- const parent = lView[PARENT];
13354
- ngDevMode && assertDefined(parent, 'missing parent');
13355
- if (isLView(parent)) {
13356
- declarationContainer[FLAGS] |= 2 /* LContainerFlags.HasTransplantedViews */;
13357
- }
13358
- else {
13359
- const insertedComponentLView = parent[PARENT][DECLARATION_COMPONENT_VIEW];
13360
- ngDevMode && assertDefined(insertedComponentLView, 'Missing insertedComponentLView');
13361
- const declaredComponentLView = lView[DECLARATION_COMPONENT_VIEW];
13362
- ngDevMode && assertDefined(declaredComponentLView, 'Missing declaredComponentLView');
13363
- if (declaredComponentLView !== insertedComponentLView) {
13364
- // At this point the declaration-component is not same as insertion-component; this means that
13365
- // this is a transplanted view. Mark the declared lView as having transplanted views so that
13366
- // those views can participate in CD.
13367
- declarationContainer[FLAGS] |= 2 /* LContainerFlags.HasTransplantedViews */;
13368
- }
13369
- }
13370
- if (movedViews === null) {
13371
- declarationContainer[MOVED_VIEWS] = [lView];
13372
- }
13373
- else {
13374
- movedViews.push(lView);
13375
- }
13376
- }
13377
13390
  function detachMovedView(declarationContainer, lView) {
13378
13391
  ngDevMode && assertLContainer(declarationContainer);
13379
13392
  ngDevMode &&
@@ -13382,43 +13395,6 @@ function detachMovedView(declarationContainer, lView) {
13382
13395
  const declarationViewIndex = movedViews.indexOf(lView);
13383
13396
  movedViews.splice(declarationViewIndex, 1);
13384
13397
  }
13385
- /**
13386
- * Detaches a view from a container.
13387
- *
13388
- * This method removes the view from the container's array of active views. It also
13389
- * removes the view's elements from the DOM.
13390
- *
13391
- * @param lContainer The container from which to detach a view
13392
- * @param removeIndex The index of the view to detach
13393
- * @returns Detached LView instance.
13394
- */
13395
- function detachView(lContainer, removeIndex) {
13396
- if (lContainer.length <= CONTAINER_HEADER_OFFSET)
13397
- return;
13398
- const indexInContainer = CONTAINER_HEADER_OFFSET + removeIndex;
13399
- const viewToDetach = lContainer[indexInContainer];
13400
- if (viewToDetach) {
13401
- const declarationLContainer = viewToDetach[DECLARATION_LCONTAINER];
13402
- if (declarationLContainer !== null && declarationLContainer !== lContainer) {
13403
- detachMovedView(declarationLContainer, viewToDetach);
13404
- }
13405
- if (removeIndex > 0) {
13406
- lContainer[indexInContainer - 1][NEXT] = viewToDetach[NEXT];
13407
- }
13408
- const removedLView = removeFromArray(lContainer, CONTAINER_HEADER_OFFSET + removeIndex);
13409
- removeViewFromDOM(viewToDetach[TVIEW], viewToDetach);
13410
- // notify query that a view has been removed
13411
- const lQueries = removedLView[QUERIES];
13412
- if (lQueries !== null) {
13413
- lQueries.detachView(removedLView[TVIEW]);
13414
- }
13415
- viewToDetach[PARENT] = null;
13416
- viewToDetach[NEXT] = null;
13417
- // Unsets the attached flag
13418
- viewToDetach[FLAGS] &= ~128 /* LViewFlags.Attached */;
13419
- }
13420
- return viewToDetach;
13421
- }
13422
13398
  /**
13423
13399
  * A standalone function which destroys an LView,
13424
13400
  * conducting clean up (e.g. removing listeners, calling onDestroys).
@@ -13985,80 +13961,6 @@ function applyStyling(renderer, isClassBased, rNode, prop, value) {
13985
13961
  }
13986
13962
  }
13987
13963
 
13988
- function createAndRenderEmbeddedLView(declarationLView, templateTNode, context, options) {
13989
- const prevConsumer = setActiveConsumer$1(null);
13990
- try {
13991
- const embeddedTView = templateTNode.tView;
13992
- ngDevMode && assertDefined(embeddedTView, 'TView must be defined for a template node.');
13993
- ngDevMode && assertTNodeForLView(templateTNode, declarationLView);
13994
- // Embedded views follow the change detection strategy of the view they're declared in.
13995
- const isSignalView = declarationLView[FLAGS] & 4096 /* LViewFlags.SignalView */;
13996
- const viewFlags = isSignalView ? 4096 /* LViewFlags.SignalView */ : 16 /* LViewFlags.CheckAlways */;
13997
- const embeddedLView = createLView(declarationLView, embeddedTView, context, viewFlags, null, templateTNode, null, null, options?.injector ?? null, options?.embeddedViewInjector ?? null, options?.dehydratedView ?? null);
13998
- const declarationLContainer = declarationLView[templateTNode.index];
13999
- ngDevMode && assertLContainer(declarationLContainer);
14000
- embeddedLView[DECLARATION_LCONTAINER] = declarationLContainer;
14001
- const declarationViewLQueries = declarationLView[QUERIES];
14002
- if (declarationViewLQueries !== null) {
14003
- embeddedLView[QUERIES] = declarationViewLQueries.createEmbeddedView(embeddedTView);
14004
- }
14005
- // execute creation mode of a view
14006
- renderView(embeddedTView, embeddedLView, context);
14007
- return embeddedLView;
14008
- }
14009
- finally {
14010
- setActiveConsumer$1(prevConsumer);
14011
- }
14012
- }
14013
- function getLViewFromLContainer(lContainer, index) {
14014
- const adjustedIndex = CONTAINER_HEADER_OFFSET + index;
14015
- // avoid reading past the array boundaries
14016
- if (adjustedIndex < lContainer.length) {
14017
- const lView = lContainer[adjustedIndex];
14018
- ngDevMode && assertLView(lView);
14019
- return lView;
14020
- }
14021
- return undefined;
14022
- }
14023
- /**
14024
- * Returns whether an elements that belong to a view should be
14025
- * inserted into the DOM. For client-only cases, DOM elements are
14026
- * always inserted. For hydration cases, we check whether serialized
14027
- * info is available for a view and the view is not in a "skip hydration"
14028
- * block (in which case view contents was re-created, thus needing insertion).
14029
- */
14030
- function shouldAddViewToDom(tNode, dehydratedView) {
14031
- return (!dehydratedView || dehydratedView.firstChild === null || hasInSkipHydrationBlockFlag(tNode));
14032
- }
14033
- function addLViewToLContainer(lContainer, lView, index, addToDOM = true) {
14034
- const tView = lView[TVIEW];
14035
- // Insert into the view tree so the new view can be change-detected
14036
- insertView(tView, lView, lContainer, index);
14037
- // Insert elements that belong to this view into the DOM tree
14038
- if (addToDOM) {
14039
- const beforeNode = getBeforeNodeForView(index, lContainer);
14040
- const renderer = lView[RENDERER];
14041
- const parentRNode = renderer.parentNode(lContainer[NATIVE]);
14042
- if (parentRNode !== null) {
14043
- addViewToDOM(tView, lContainer[T_HOST], renderer, lView, parentRNode, beforeNode);
14044
- }
14045
- }
14046
- // When in hydration mode, reset the pointer to the first child in
14047
- // the dehydrated view. This indicates that the view was hydrated and
14048
- // further attaching/detaching should work with this view as normal.
14049
- const hydrationInfo = lView[HYDRATION];
14050
- if (hydrationInfo !== null && hydrationInfo.firstChild !== null) {
14051
- hydrationInfo.firstChild = null;
14052
- }
14053
- }
14054
- function removeLViewFromLContainer(lContainer, index) {
14055
- const lView = detachView(lContainer, index);
14056
- if (lView !== undefined) {
14057
- destroyLView(lView[TVIEW], lView);
14058
- }
14059
- return lView;
14060
- }
14061
-
14062
13964
  function collectNativeNodes(tView, lView, tNode, result, isProjection = false) {
14063
13965
  while (tNode !== null) {
14064
13966
  // Let declarations don't have corresponding DOM nodes so we skip over them.
@@ -14697,6 +14599,187 @@ function markViewDirty(lView, source) {
14697
14599
  return null;
14698
14600
  }
14699
14601
 
14602
+ /**
14603
+ * Creates a LContainer, either from a container instruction, or for a ViewContainerRef.
14604
+ *
14605
+ * @param hostNative The host element for the LContainer
14606
+ * @param hostTNode The host TNode for the LContainer
14607
+ * @param currentView The parent view of the LContainer
14608
+ * @param native The native comment element
14609
+ * @param isForViewContainerRef Optional a flag indicating the ViewContainerRef case
14610
+ * @returns LContainer
14611
+ */
14612
+ function createLContainer(hostNative, currentView, native, tNode) {
14613
+ ngDevMode && assertLView(currentView);
14614
+ const lContainer = [
14615
+ hostNative, // host native
14616
+ true, // Boolean `true` in this position signifies that this is an `LContainer`
14617
+ 0, // flags
14618
+ currentView, // parent
14619
+ null, // next
14620
+ tNode, // t_host
14621
+ null, // dehydrated views
14622
+ native, // native,
14623
+ null, // view refs
14624
+ null, // moved views
14625
+ ];
14626
+ ngDevMode &&
14627
+ assertEqual(lContainer.length, CONTAINER_HEADER_OFFSET, 'Should allocate correct number of slots for LContainer header.');
14628
+ return lContainer;
14629
+ }
14630
+ function getLViewFromLContainer(lContainer, index) {
14631
+ const adjustedIndex = CONTAINER_HEADER_OFFSET + index;
14632
+ // avoid reading past the array boundaries
14633
+ if (adjustedIndex < lContainer.length) {
14634
+ const lView = lContainer[adjustedIndex];
14635
+ ngDevMode && assertLView(lView);
14636
+ return lView;
14637
+ }
14638
+ return undefined;
14639
+ }
14640
+ function addLViewToLContainer(lContainer, lView, index, addToDOM = true) {
14641
+ const tView = lView[TVIEW];
14642
+ // Insert into the view tree so the new view can be change-detected
14643
+ insertView(tView, lView, lContainer, index);
14644
+ // Insert elements that belong to this view into the DOM tree
14645
+ if (addToDOM) {
14646
+ const beforeNode = getBeforeNodeForView(index, lContainer);
14647
+ const renderer = lView[RENDERER];
14648
+ const parentRNode = renderer.parentNode(lContainer[NATIVE]);
14649
+ if (parentRNode !== null) {
14650
+ addViewToDOM(tView, lContainer[T_HOST], renderer, lView, parentRNode, beforeNode);
14651
+ }
14652
+ }
14653
+ // When in hydration mode, reset the pointer to the first child in
14654
+ // the dehydrated view. This indicates that the view was hydrated and
14655
+ // further attaching/detaching should work with this view as normal.
14656
+ const hydrationInfo = lView[HYDRATION];
14657
+ if (hydrationInfo !== null && hydrationInfo.firstChild !== null) {
14658
+ hydrationInfo.firstChild = null;
14659
+ }
14660
+ }
14661
+ function removeLViewFromLContainer(lContainer, index) {
14662
+ const lView = detachView(lContainer, index);
14663
+ if (lView !== undefined) {
14664
+ destroyLView(lView[TVIEW], lView);
14665
+ }
14666
+ return lView;
14667
+ }
14668
+ /**
14669
+ * Detaches a view from a container.
14670
+ *
14671
+ * This method removes the view from the container's array of active views. It also
14672
+ * removes the view's elements from the DOM.
14673
+ *
14674
+ * @param lContainer The container from which to detach a view
14675
+ * @param removeIndex The index of the view to detach
14676
+ * @returns Detached LView instance.
14677
+ */
14678
+ function detachView(lContainer, removeIndex) {
14679
+ if (lContainer.length <= CONTAINER_HEADER_OFFSET)
14680
+ return;
14681
+ const indexInContainer = CONTAINER_HEADER_OFFSET + removeIndex;
14682
+ const viewToDetach = lContainer[indexInContainer];
14683
+ if (viewToDetach) {
14684
+ const declarationLContainer = viewToDetach[DECLARATION_LCONTAINER];
14685
+ if (declarationLContainer !== null && declarationLContainer !== lContainer) {
14686
+ detachMovedView(declarationLContainer, viewToDetach);
14687
+ }
14688
+ if (removeIndex > 0) {
14689
+ lContainer[indexInContainer - 1][NEXT] = viewToDetach[NEXT];
14690
+ }
14691
+ const removedLView = removeFromArray(lContainer, CONTAINER_HEADER_OFFSET + removeIndex);
14692
+ removeViewFromDOM(viewToDetach[TVIEW], viewToDetach);
14693
+ // notify query that a view has been removed
14694
+ const lQueries = removedLView[QUERIES];
14695
+ if (lQueries !== null) {
14696
+ lQueries.detachView(removedLView[TVIEW]);
14697
+ }
14698
+ viewToDetach[PARENT] = null;
14699
+ viewToDetach[NEXT] = null;
14700
+ // Unsets the attached flag
14701
+ viewToDetach[FLAGS] &= ~128 /* LViewFlags.Attached */;
14702
+ }
14703
+ return viewToDetach;
14704
+ }
14705
+ /**
14706
+ * Inserts a view into a container.
14707
+ *
14708
+ * This adds the view to the container's array of active views in the correct
14709
+ * position. It also adds the view's elements to the DOM if the container isn't a
14710
+ * root node of another view (in that case, the view's elements will be added when
14711
+ * the container's parent view is added later).
14712
+ *
14713
+ * @param tView The `TView' of the `LView` to insert
14714
+ * @param lView The view to insert
14715
+ * @param lContainer The container into which the view should be inserted
14716
+ * @param index Which index in the container to insert the child view into
14717
+ */
14718
+ function insertView(tView, lView, lContainer, index) {
14719
+ ngDevMode && assertLView(lView);
14720
+ ngDevMode && assertLContainer(lContainer);
14721
+ const indexInContainer = CONTAINER_HEADER_OFFSET + index;
14722
+ const containerLength = lContainer.length;
14723
+ if (index > 0) {
14724
+ // This is a new view, we need to add it to the children.
14725
+ lContainer[indexInContainer - 1][NEXT] = lView;
14726
+ }
14727
+ if (index < containerLength - CONTAINER_HEADER_OFFSET) {
14728
+ lView[NEXT] = lContainer[indexInContainer];
14729
+ addToArray(lContainer, CONTAINER_HEADER_OFFSET + index, lView);
14730
+ }
14731
+ else {
14732
+ lContainer.push(lView);
14733
+ lView[NEXT] = null;
14734
+ }
14735
+ lView[PARENT] = lContainer;
14736
+ // track views where declaration and insertion points are different
14737
+ const declarationLContainer = lView[DECLARATION_LCONTAINER];
14738
+ if (declarationLContainer !== null && lContainer !== declarationLContainer) {
14739
+ trackMovedView(declarationLContainer, lView);
14740
+ }
14741
+ // notify query that a new view has been added
14742
+ const lQueries = lView[QUERIES];
14743
+ if (lQueries !== null) {
14744
+ lQueries.insertView(tView);
14745
+ }
14746
+ updateAncestorTraversalFlagsOnAttach(lView);
14747
+ // Sets the attached flag
14748
+ lView[FLAGS] |= 128 /* LViewFlags.Attached */;
14749
+ }
14750
+ /**
14751
+ * Track views created from the declaration container (TemplateRef) and inserted into a
14752
+ * different LContainer or attached directly to ApplicationRef.
14753
+ */
14754
+ function trackMovedView(declarationContainer, lView) {
14755
+ ngDevMode && assertDefined(lView, 'LView required');
14756
+ ngDevMode && assertLContainer(declarationContainer);
14757
+ const movedViews = declarationContainer[MOVED_VIEWS];
14758
+ const parent = lView[PARENT];
14759
+ ngDevMode && assertDefined(parent, 'missing parent');
14760
+ if (isLView(parent)) {
14761
+ declarationContainer[FLAGS] |= 2 /* LContainerFlags.HasTransplantedViews */;
14762
+ }
14763
+ else {
14764
+ const insertedComponentLView = parent[PARENT][DECLARATION_COMPONENT_VIEW];
14765
+ ngDevMode && assertDefined(insertedComponentLView, 'Missing insertedComponentLView');
14766
+ const declaredComponentLView = lView[DECLARATION_COMPONENT_VIEW];
14767
+ ngDevMode && assertDefined(declaredComponentLView, 'Missing declaredComponentLView');
14768
+ if (declaredComponentLView !== insertedComponentLView) {
14769
+ // At this point the declaration-component is not same as insertion-component; this means that
14770
+ // this is a transplanted view. Mark the declared lView as having transplanted views so that
14771
+ // those views can participate in CD.
14772
+ declarationContainer[FLAGS] |= 2 /* LContainerFlags.HasTransplantedViews */;
14773
+ }
14774
+ }
14775
+ if (movedViews === null) {
14776
+ declarationContainer[MOVED_VIEWS] = [lView];
14777
+ }
14778
+ else {
14779
+ movedViews.push(lView);
14780
+ }
14781
+ }
14782
+
14700
14783
  class ViewRef$1 {
14701
14784
  _lView;
14702
14785
  _cdRefInjectingView;
@@ -15606,9 +15689,12 @@ function createTNode(tView, tParent, type, index, value, attrs) {
15606
15689
  attrs: attrs,
15607
15690
  mergedAttrs: null,
15608
15691
  localNames: null,
15609
- initialInputs: undefined,
15692
+ initialInputs: null,
15610
15693
  inputs: null,
15694
+ hostDirectiveInputs: null,
15611
15695
  outputs: null,
15696
+ hostDirectiveOutputs: null,
15697
+ directiveToIndex: null,
15612
15698
  tView: null,
15613
15699
  next: null,
15614
15700
  prev: null,
@@ -15916,7 +16002,7 @@ function createIcuIterator(tIcu, lView) {
15916
16002
  * - the `b` char which indicates that the lookup should start from the `document.body`
15917
16003
  * - the `h` char to start lookup from the component host node (`lView[HOST]`)
15918
16004
  */
15919
- const REF_EXTRACTOR_REGEXP = new RegExp(`^(\\d+)*(${REFERENCE_NODE_BODY}|${REFERENCE_NODE_HOST})*(.*)`);
16005
+ const REF_EXTRACTOR_REGEXP = /* @__PURE__ */ new RegExp(`^(\\d+)*(${REFERENCE_NODE_BODY}|${REFERENCE_NODE_HOST})*(.*)`);
15920
16006
  /**
15921
16007
  * Helper function that takes a reference node location and a set of navigation steps
15922
16008
  * (from the reference node) to a target node and outputs a string that represents
@@ -16796,6 +16882,18 @@ function removeDehydratedViews(lContainer) {
16796
16882
  // once again in case a `ViewContainerRef` is created later).
16797
16883
  lContainer[DEHYDRATED_VIEWS] = retainedViews;
16798
16884
  }
16885
+ function removeDehydratedViewList(deferBlock) {
16886
+ const { lContainer } = deferBlock;
16887
+ const dehydratedViews = lContainer[DEHYDRATED_VIEWS];
16888
+ if (dehydratedViews === null)
16889
+ return;
16890
+ const parentLView = lContainer[PARENT];
16891
+ const renderer = parentLView[RENDERER];
16892
+ for (const view of dehydratedViews) {
16893
+ removeDehydratedView(view, renderer);
16894
+ ngDevMode && ngDevMode.dehydratedViewsRemoved++;
16895
+ }
16896
+ }
16799
16897
  /**
16800
16898
  * Helper function to remove all nodes from a dehydrated view.
16801
16899
  */
@@ -17431,46 +17529,26 @@ function ɵɵinvalidFactory() {
17431
17529
  throw new Error(msg);
17432
17530
  }
17433
17531
 
17434
- /**
17435
- * When elements are created dynamically after a view blueprint is created (e.g. through
17436
- * i18nApply()), we need to adjust the blueprint for future template passes.
17437
- *
17438
- * @param tView `TView` associated with `LView`
17439
- * @param lView The `LView` containing the blueprint to adjust
17440
- * @param numSlotsToAlloc The number of slots to alloc in the LView, should be >0
17441
- * @param initialValue Initial value to store in blueprint
17442
- */
17443
- function allocExpando(tView, lView, numSlotsToAlloc, initialValue) {
17444
- if (numSlotsToAlloc === 0)
17445
- return -1;
17446
- if (ngDevMode) {
17447
- assertFirstCreatePass(tView);
17448
- assertSame(tView, lView[TVIEW], '`LView` must be associated with `TView`!');
17449
- assertEqual(tView.data.length, lView.length, 'Expecting LView to be same size as TView');
17450
- assertEqual(tView.data.length, tView.blueprint.length, 'Expecting Blueprint to be same size as TView');
17451
- assertFirstUpdatePass(tView);
17452
- }
17453
- const allocIdx = lView.length;
17454
- for (let i = 0; i < numSlotsToAlloc; i++) {
17455
- lView.push(initialValue);
17456
- tView.blueprint.push(initialValue);
17457
- tView.data.push(null);
17458
- }
17459
- return allocIdx;
17460
- }
17461
-
17462
17532
  /**
17463
17533
  * Resolve the matched directives on a node.
17464
17534
  */
17465
17535
  function resolveDirectives(tView, lView, tNode, localRefs, directiveMatcher) {
17466
- // Please make sure to have explicit type for `exportsMap`. Inferred type triggers bug in
17467
- // tsickle.
17536
+ // Please make sure to have explicit type for `exportsMap`. Inferred type triggers bug in tsickle.
17468
17537
  ngDevMode && assertFirstCreatePass(tView);
17469
17538
  const exportsMap = localRefs === null ? null : { '': -1 };
17470
17539
  const matchedDirectiveDefs = directiveMatcher(tView, tNode);
17471
17540
  if (matchedDirectiveDefs !== null) {
17472
- const [directiveDefs, hostDirectiveDefs] = resolveHostDirectives(tView, tNode, matchedDirectiveDefs);
17473
- initializeDirectives(tView, lView, tNode, directiveDefs, exportsMap, hostDirectiveDefs);
17541
+ let directiveDefs;
17542
+ let hostDirectiveDefs = null;
17543
+ let hostDirectiveRanges = null;
17544
+ const hostDirectiveResolution = resolveHostDirectives(matchedDirectiveDefs);
17545
+ if (hostDirectiveResolution === null) {
17546
+ directiveDefs = matchedDirectiveDefs;
17547
+ }
17548
+ else {
17549
+ [directiveDefs, hostDirectiveDefs, hostDirectiveRanges] = hostDirectiveResolution;
17550
+ }
17551
+ initializeDirectives(tView, lView, tNode, directiveDefs, exportsMap, hostDirectiveDefs, hostDirectiveRanges);
17474
17552
  }
17475
17553
  if (exportsMap !== null && localRefs !== null) {
17476
17554
  cacheMatchingLocalNames(tNode, localRefs, exportsMap);
@@ -17489,40 +17567,63 @@ function cacheMatchingLocalNames(tNode, localRefs, exportsMap) {
17489
17567
  localNames.push(localRefs[i], index);
17490
17568
  }
17491
17569
  }
17492
- function resolveHostDirectives(tView, tNode, matches) {
17493
- const allDirectiveDefs = [];
17570
+ function resolveHostDirectives(matches) {
17571
+ let componentDef = null;
17572
+ let hasHostDirectives = false;
17573
+ for (let i = 0; i < matches.length; i++) {
17574
+ const def = matches[i];
17575
+ if (i === 0 && isComponentDef(def)) {
17576
+ componentDef = def;
17577
+ }
17578
+ if (def.findHostDirectiveDefs !== null) {
17579
+ hasHostDirectives = true;
17580
+ break;
17581
+ }
17582
+ }
17583
+ if (!hasHostDirectives) {
17584
+ return null;
17585
+ }
17586
+ let allDirectiveDefs = null;
17494
17587
  let hostDirectiveDefs = null;
17588
+ let hostDirectiveRanges = null;
17589
+ // Components are inserted at the front of the matches array so that their lifecycle
17590
+ // hooks run before any directive lifecycle hooks. This appears to be for ViewEngine
17591
+ // compatibility. This logic doesn't make sense with host directives, because it
17592
+ // would allow the host directives to undo any overrides the host may have made.
17593
+ // To handle this case, the host directives of components are inserted at the beginning
17594
+ // of the array, followed by the component. As such, the insertion order is as follows:
17595
+ // 1. Host directives belonging to the selector-matched component.
17596
+ // 2. Selector-matched component.
17597
+ // 3. Host directives belonging to selector-matched directives.
17598
+ // 4. Selector-matched dir
17495
17599
  for (const def of matches) {
17496
17600
  if (def.findHostDirectiveDefs !== null) {
17497
- // TODO(pk): probably could return matches instead of taking in an array to fill in?
17601
+ allDirectiveDefs ??= [];
17498
17602
  hostDirectiveDefs ??= new Map();
17499
- // Components are inserted at the front of the matches array so that their lifecycle
17500
- // hooks run before any directive lifecycle hooks. This appears to be for ViewEngine
17501
- // compatibility. This logic doesn't make sense with host directives, because it
17502
- // would allow the host directives to undo any overrides the host may have made.
17503
- // To handle this case, the host directives of components are inserted at the beginning
17504
- // of the array, followed by the component. As such, the insertion order is as follows:
17505
- // 1. Host directives belonging to the selector-matched component.
17506
- // 2. Selector-matched component.
17507
- // 3. Host directives belonging to selector-matched directives.
17508
- // 4. Selector-matched directives.
17509
- def.findHostDirectiveDefs(def, allDirectiveDefs, hostDirectiveDefs);
17603
+ hostDirectiveRanges ??= new Map();
17604
+ resolveHostDirectivesForDef(def, allDirectiveDefs, hostDirectiveRanges, hostDirectiveDefs);
17510
17605
  }
17511
- if (isComponentDef(def)) {
17606
+ // Component definition needs to be pushed early to maintain the correct ordering.
17607
+ if (def === componentDef) {
17608
+ allDirectiveDefs ??= [];
17512
17609
  allDirectiveDefs.push(def);
17513
- markAsComponentHost(tView, tNode, allDirectiveDefs.length - 1);
17514
17610
  }
17515
17611
  }
17516
- if (isComponentHost(tNode)) {
17517
- allDirectiveDefs.push(...matches.slice(1));
17518
- }
17519
- else {
17520
- allDirectiveDefs.push(...matches);
17612
+ if (allDirectiveDefs !== null) {
17613
+ allDirectiveDefs.push(...(componentDef === null ? matches : matches.slice(1)));
17614
+ ngDevMode && assertNoDuplicateDirectives(allDirectiveDefs);
17615
+ return [allDirectiveDefs, hostDirectiveDefs, hostDirectiveRanges];
17521
17616
  }
17522
- if (ngDevMode) {
17523
- assertNoDuplicateDirectives(allDirectiveDefs);
17524
- }
17525
- return [allDirectiveDefs, hostDirectiveDefs];
17617
+ return null;
17618
+ }
17619
+ function resolveHostDirectivesForDef(def, allDirectiveDefs, hostDirectiveRanges, hostDirectiveDefs) {
17620
+ ngDevMode && assertDefined(def.findHostDirectiveDefs, 'Expected host directive resolve function');
17621
+ const start = allDirectiveDefs.length;
17622
+ // TODO(pk): probably could return matches instead of taking in an array to fill in?
17623
+ def.findHostDirectiveDefs(def, allDirectiveDefs, hostDirectiveDefs);
17624
+ // Note that these indexes are within the offset by `directiveStart`. We can't do the
17625
+ // offsetting here, because `directiveStart` hasn't been initialized on the TNode yet.
17626
+ hostDirectiveRanges.set(def, [start, allDirectiveDefs.length - 1]);
17526
17627
  }
17527
17628
  /**
17528
17629
  * Marks a given TNode as a component's host. This consists of:
@@ -17536,37 +17637,62 @@ function markAsComponentHost(tView, hostTNode, componentOffset) {
17536
17637
  (tView.components ??= []).push(hostTNode.index);
17537
17638
  }
17538
17639
  /** Initializes the data structures necessary for a list of directives to be instantiated. */
17539
- function initializeDirectives(tView, lView, tNode, directives, exportsMap, hostDirectiveDefs) {
17640
+ function initializeDirectives(tView, lView, tNode, directives, exportsMap, hostDirectiveDefs, hostDirectiveRanges) {
17540
17641
  ngDevMode && assertFirstCreatePass(tView);
17642
+ const directivesLength = directives.length;
17643
+ let hasSeenComponent = false;
17541
17644
  // Publishes the directive types to DI so they can be injected. Needs to
17542
17645
  // happen in a separate pass before the TNode flags have been initialized.
17543
- for (let i = 0; i < directives.length; i++) {
17544
- diPublicInInjector(getOrCreateNodeInjectorForNode(tNode, lView), tView, directives[i].type);
17646
+ for (let i = 0; i < directivesLength; i++) {
17647
+ const def = directives[i];
17648
+ if (!hasSeenComponent && isComponentDef(def)) {
17649
+ hasSeenComponent = true;
17650
+ markAsComponentHost(tView, tNode, i);
17651
+ }
17652
+ diPublicInInjector(getOrCreateNodeInjectorForNode(tNode, lView), tView, def.type);
17545
17653
  }
17546
- initTNodeFlags(tNode, tView.data.length, directives.length);
17654
+ initTNodeFlags(tNode, tView.data.length, directivesLength);
17547
17655
  // When the same token is provided by several directives on the same node, some rules apply in
17548
17656
  // the viewEngine:
17549
17657
  // - viewProviders have priority over providers
17550
17658
  // - the last directive in NgModule.declarations has priority over the previous one
17551
17659
  // So to match these rules, the order in which providers are added in the arrays is very
17552
17660
  // important.
17553
- for (let i = 0; i < directives.length; i++) {
17661
+ for (let i = 0; i < directivesLength; i++) {
17554
17662
  const def = directives[i];
17555
17663
  if (def.providersResolver)
17556
17664
  def.providersResolver(def);
17557
17665
  }
17558
17666
  let preOrderHooksFound = false;
17559
17667
  let preOrderCheckHooksFound = false;
17560
- let directiveIdx = allocExpando(tView, lView, directives.length, null);
17668
+ let directiveIdx = allocExpando(tView, lView, directivesLength, null);
17561
17669
  ngDevMode &&
17562
17670
  assertSame(directiveIdx, tNode.directiveStart, 'TNode.directiveStart should point to just allocated space');
17563
- for (let i = 0; i < directives.length; i++) {
17671
+ // If there's at least one directive, we'll have to track it so initialize the map.
17672
+ if (directivesLength > 0) {
17673
+ tNode.directiveToIndex = new Map();
17674
+ }
17675
+ for (let i = 0; i < directivesLength; i++) {
17564
17676
  const def = directives[i];
17565
17677
  // Merge the attrs in the order of matches. This assumes that the first directive is the
17566
17678
  // component itself, so that the component has the least priority.
17567
17679
  tNode.mergedAttrs = mergeHostAttrs(tNode.mergedAttrs, def.hostAttrs);
17568
17680
  configureViewWithDirective(tView, tNode, lView, directiveIdx, def);
17569
17681
  saveNameToExportMap(directiveIdx, def, exportsMap);
17682
+ // If a directive has host directives, we need to track both its index and the range within
17683
+ // the host directives are declared. Host directives are not tracked, but should be resolved
17684
+ // by looking up the host and getting its indexes from there.
17685
+ if (hostDirectiveRanges !== null && hostDirectiveRanges.has(def)) {
17686
+ const [start, end] = hostDirectiveRanges.get(def);
17687
+ tNode.directiveToIndex.set(def.type, [
17688
+ directiveIdx,
17689
+ start + tNode.directiveStart,
17690
+ end + tNode.directiveStart,
17691
+ ]);
17692
+ }
17693
+ else if (hostDirectiveDefs === null || !hostDirectiveDefs.has(def)) {
17694
+ tNode.directiveToIndex.set(def.type, directiveIdx);
17695
+ }
17570
17696
  if (def.contentQueries !== null)
17571
17697
  tNode.flags |= 4 /* TNodeFlags.hasContentQuery */;
17572
17698
  if (def.hostBindings !== null || def.hostAttrs !== null || def.hostVars !== 0)
@@ -17594,102 +17720,84 @@ function initializeDirectives(tView, lView, tNode, directives, exportsMap, hostD
17594
17720
  * Initializes data structures required to work with directive inputs and outputs.
17595
17721
  * Initialization is done for all directives matched on a given TNode.
17596
17722
  */
17597
- function initializeInputAndOutputAliases(tView, tNode, hostDirectiveDefinitionMap) {
17723
+ function initializeInputAndOutputAliases(tView, tNode, hostDirectiveDefs) {
17598
17724
  ngDevMode && assertFirstCreatePass(tView);
17599
- const start = tNode.directiveStart;
17600
- const end = tNode.directiveEnd;
17601
- const tViewData = tView.data;
17602
- const tNodeAttrs = tNode.attrs;
17603
- const inputsFromAttrs = [];
17604
- let inputsStore = null;
17605
- let outputsStore = null;
17606
- for (let directiveIndex = start; directiveIndex < end; directiveIndex++) {
17607
- const directiveDef = tViewData[directiveIndex];
17608
- const aliasData = hostDirectiveDefinitionMap
17609
- ? hostDirectiveDefinitionMap.get(directiveDef)
17610
- : null;
17611
- const aliasedInputs = aliasData ? aliasData.inputs : null;
17612
- const aliasedOutputs = aliasData ? aliasData.outputs : null;
17613
- inputsStore = captureNodeBindings(0 /* CaptureNodeBindingMode.Inputs */, directiveDef.inputs, directiveIndex, inputsStore, aliasedInputs);
17614
- outputsStore = captureNodeBindings(1 /* CaptureNodeBindingMode.Outputs */, directiveDef.outputs, directiveIndex, outputsStore, aliasedOutputs);
17615
- // Do not use unbound attributes as inputs to structural directives, since structural
17616
- // directive inputs can only be set using microsyntax (e.g. `<div *dir="exp">`).
17617
- const initialInputs = inputsStore !== null && tNodeAttrs !== null && !isInlineTemplate(tNode)
17618
- ? generateInitialInputs(inputsStore, directiveIndex, tNodeAttrs)
17619
- : null;
17620
- inputsFromAttrs.push(initialInputs);
17621
- }
17622
- if (inputsStore !== null) {
17623
- if (inputsStore.hasOwnProperty('class')) {
17624
- tNode.flags |= 8 /* TNodeFlags.hasClassInput */;
17725
+ for (let index = tNode.directiveStart; index < tNode.directiveEnd; index++) {
17726
+ const directiveDef = tView.data[index];
17727
+ if (hostDirectiveDefs === null || !hostDirectiveDefs.has(directiveDef)) {
17728
+ setupSelectorMatchedInputsOrOutputs(0 /* BindingType.Inputs */, tNode, directiveDef, index);
17729
+ setupSelectorMatchedInputsOrOutputs(1 /* BindingType.Outputs */, tNode, directiveDef, index);
17730
+ setupInitialInputs(tNode, index, false);
17625
17731
  }
17626
- if (inputsStore.hasOwnProperty('style')) {
17627
- tNode.flags |= 16 /* TNodeFlags.hasStyleInput */;
17732
+ else {
17733
+ const hostDirectiveDef = hostDirectiveDefs.get(directiveDef);
17734
+ setupHostDirectiveInputsOrOutputs(0 /* BindingType.Inputs */, tNode, hostDirectiveDef, index);
17735
+ setupHostDirectiveInputsOrOutputs(1 /* BindingType.Outputs */, tNode, hostDirectiveDef, index);
17736
+ setupInitialInputs(tNode, index, true);
17628
17737
  }
17629
17738
  }
17630
- tNode.initialInputs = inputsFromAttrs;
17631
- tNode.inputs = inputsStore;
17632
- tNode.outputs = outputsStore;
17633
17739
  }
17634
- function captureNodeBindings(mode, aliasMap, directiveIndex, bindingsResult, hostDirectiveAliasMap) {
17635
- for (let publicName in aliasMap) {
17636
- if (!aliasMap.hasOwnProperty(publicName)) {
17637
- continue;
17638
- }
17639
- const value = aliasMap[publicName];
17640
- if (value === undefined) {
17641
- continue;
17642
- }
17643
- bindingsResult ??= {};
17644
- let internalName;
17645
- let inputFlags = InputFlags.None;
17646
- // For inputs, the value might be an array capturing additional
17647
- // input flags.
17648
- if (Array.isArray(value)) {
17649
- internalName = value[0];
17650
- inputFlags = value[1];
17651
- }
17652
- else {
17653
- internalName = value;
17654
- }
17655
- // If there are no host directive mappings, we want to remap using the alias map from the
17656
- // definition itself. If there is an alias map, it has two functions:
17657
- // 1. It serves as an allowlist of bindings that are exposed by the host directives. Only the
17658
- // ones inside the host directive map will be exposed on the host.
17659
- // 2. The public name of the property is aliased using the host directive alias map, rather
17660
- // than the alias map from the definition.
17661
- let finalPublicName = publicName;
17662
- if (hostDirectiveAliasMap !== null) {
17663
- // If there is no mapping, it's not part of the allowlist and this input/output
17664
- // is not captured and should be ignored.
17665
- if (!hostDirectiveAliasMap.hasOwnProperty(publicName)) {
17666
- continue;
17740
+ /**
17741
+ * Sets up the input/output bindings for a directive that was matched in the template through its
17742
+ * selector. This method is called repeatedly to build up all of the available inputs on a node.
17743
+ *
17744
+ * @param mode Whether inputs or outputs are being contructed.
17745
+ * @param tNode Node on which the bindings are being set up.
17746
+ * @param def Directive definition for which the bindings are being set up.
17747
+ * @param directiveIndex Index at which the directive instance will be stored in the LView.
17748
+ */
17749
+ function setupSelectorMatchedInputsOrOutputs(mode, tNode, def, directiveIndex) {
17750
+ const aliasMap = mode === 0 /* BindingType.Inputs */ ? def.inputs : def.outputs;
17751
+ for (const publicName in aliasMap) {
17752
+ if (aliasMap.hasOwnProperty(publicName)) {
17753
+ let bindings;
17754
+ if (mode === 0 /* BindingType.Inputs */) {
17755
+ bindings = tNode.inputs ??= {};
17667
17756
  }
17668
- finalPublicName = hostDirectiveAliasMap[publicName];
17669
- }
17670
- if (mode === 0 /* CaptureNodeBindingMode.Inputs */) {
17671
- addPropertyBinding(bindingsResult, directiveIndex, finalPublicName, internalName, inputFlags);
17672
- }
17673
- else {
17674
- addPropertyBinding(bindingsResult, directiveIndex, finalPublicName, internalName);
17757
+ else {
17758
+ bindings = tNode.outputs ??= {};
17759
+ }
17760
+ bindings[publicName] ??= [];
17761
+ bindings[publicName].push(directiveIndex);
17762
+ setShadowStylingInputFlags(tNode, publicName);
17675
17763
  }
17676
17764
  }
17677
- return bindingsResult;
17678
17765
  }
17679
- function addPropertyBinding(bindings, directiveIndex, publicName, internalName, inputFlags) {
17680
- let values;
17681
- if (bindings.hasOwnProperty(publicName)) {
17682
- (values = bindings[publicName]).push(directiveIndex, internalName);
17766
+ /**
17767
+ * Sets up input/output bindings that were defined through host directives on a specific node.
17768
+ * @param mode Whether inputs or outputs are being contructed.
17769
+ * @param tNode Node on which the bindings are being set up.
17770
+ * @param config Host directive definition that is being set up.
17771
+ * @param directiveIndex Index at which the directive instance will be stored in the LView.
17772
+ */
17773
+ function setupHostDirectiveInputsOrOutputs(mode, tNode, config, directiveIndex) {
17774
+ const aliasMap = mode === 0 /* BindingType.Inputs */ ? config.inputs : config.outputs;
17775
+ for (const initialName in aliasMap) {
17776
+ if (aliasMap.hasOwnProperty(initialName)) {
17777
+ const publicName = aliasMap[initialName];
17778
+ let bindings;
17779
+ if (mode === 0 /* BindingType.Inputs */) {
17780
+ bindings = tNode.hostDirectiveInputs ??= {};
17781
+ }
17782
+ else {
17783
+ bindings = tNode.hostDirectiveOutputs ??= {};
17784
+ }
17785
+ bindings[publicName] ??= [];
17786
+ bindings[publicName].push(directiveIndex, initialName);
17787
+ setShadowStylingInputFlags(tNode, publicName);
17788
+ }
17683
17789
  }
17684
- else {
17685
- values = bindings[publicName] = [directiveIndex, internalName];
17790
+ }
17791
+ function setShadowStylingInputFlags(tNode, publicName) {
17792
+ if (publicName === 'class') {
17793
+ tNode.flags |= 8 /* TNodeFlags.hasClassInput */;
17686
17794
  }
17687
- if (inputFlags !== undefined) {
17688
- values.push(inputFlags);
17795
+ else if (publicName === 'style') {
17796
+ tNode.flags |= 16 /* TNodeFlags.hasStyleInput */;
17689
17797
  }
17690
17798
  }
17691
17799
  /**
17692
- * Generates initialInputData for a node and stores it in the template's static storage
17800
+ * Sets up the initialInputData for a node and stores it in the template's static storage
17693
17801
  * so subsequent template invocations don't have to recalculate it.
17694
17802
  *
17695
17803
  * initialInputData is an array containing values that need to be set as input properties
@@ -17699,11 +17807,21 @@ function addPropertyBinding(bindings, directiveIndex, publicName, internalName,
17699
17807
  *
17700
17808
  * <my-component name="Bess"></my-component>
17701
17809
  *
17702
- * @param inputs Input alias map that was generated from the directive def inputs.
17810
+ * @param tNode TNode on which to set up the initial inputs.
17703
17811
  * @param directiveIndex Index of the directive that is currently being processed.
17704
- * @param attrs Static attrs on this node.
17705
17812
  */
17706
- function generateInitialInputs(inputs, directiveIndex, attrs) {
17813
+ function setupInitialInputs(tNode, directiveIndex, isHostDirective) {
17814
+ const { attrs, inputs, hostDirectiveInputs } = tNode;
17815
+ if (attrs === null ||
17816
+ (!isHostDirective && inputs === null) ||
17817
+ (isHostDirective && hostDirectiveInputs === null) ||
17818
+ // Do not use unbound attributes as inputs to structural directives, since structural
17819
+ // directive inputs can only be set using microsyntax (e.g. `<div *dir="exp">`).
17820
+ isInlineTemplate(tNode)) {
17821
+ tNode.initialInputs ??= [];
17822
+ tNode.initialInputs.push(null);
17823
+ return;
17824
+ }
17707
17825
  let inputsToStore = null;
17708
17826
  let i = 0;
17709
17827
  while (i < attrs.length) {
@@ -17718,27 +17836,38 @@ function generateInitialInputs(inputs, directiveIndex, attrs) {
17718
17836
  i += 2;
17719
17837
  continue;
17720
17838
  }
17721
- // If we hit any other attribute markers, we're done anyway. None of those are valid inputs.
17722
- if (typeof attrName === 'number')
17839
+ else if (typeof attrName === 'number') {
17840
+ // If we hit any other attribute markers, we're done anyway. None of those are valid inputs.
17723
17841
  break;
17724
- if (inputs.hasOwnProperty(attrName)) {
17725
- if (inputsToStore === null)
17726
- inputsToStore = [];
17842
+ }
17843
+ if (!isHostDirective && inputs.hasOwnProperty(attrName)) {
17727
17844
  // Find the input's public name from the input store. Note that we can be found easier
17728
17845
  // through the directive def, but we want to do it using the inputs store so that it can
17729
17846
  // account for host directive aliases.
17730
17847
  const inputConfig = inputs[attrName];
17731
- for (let j = 0; j < inputConfig.length; j += 3) {
17732
- if (inputConfig[j] === directiveIndex) {
17733
- inputsToStore.push(attrName, inputConfig[j + 1], inputConfig[j + 2], attrs[i + 1]);
17848
+ for (const index of inputConfig) {
17849
+ if (index === directiveIndex) {
17850
+ inputsToStore ??= [];
17851
+ inputsToStore.push(attrName, attrs[i + 1]);
17734
17852
  // A directive can't have multiple inputs with the same name so we can break here.
17735
17853
  break;
17736
17854
  }
17737
17855
  }
17738
17856
  }
17857
+ else if (isHostDirective && hostDirectiveInputs.hasOwnProperty(attrName)) {
17858
+ const config = hostDirectiveInputs[attrName];
17859
+ for (let j = 0; j < config.length; j += 2) {
17860
+ if (config[j] === directiveIndex) {
17861
+ inputsToStore ??= [];
17862
+ inputsToStore.push(config[j + 1], attrs[i + 1]);
17863
+ break;
17864
+ }
17865
+ }
17866
+ }
17739
17867
  i += 2;
17740
17868
  }
17741
- return inputsToStore;
17869
+ tNode.initialInputs ??= [];
17870
+ tNode.initialInputs.push(inputsToStore);
17742
17871
  }
17743
17872
  /**
17744
17873
  * Setup directive for instantiation.
@@ -17899,34 +18028,22 @@ class ComponentFactoryResolver extends ComponentFactoryResolver$1 {
17899
18028
  return new ComponentFactory(componentDef, this.ngModule);
17900
18029
  }
17901
18030
  }
17902
- function toRefArray(map, isInputMap) {
17903
- const array = [];
17904
- for (const publicName in map) {
17905
- if (!map.hasOwnProperty(publicName)) {
17906
- continue;
17907
- }
17908
- const value = map[publicName];
17909
- if (value === undefined) {
17910
- continue;
17911
- }
17912
- const isArray = Array.isArray(value);
17913
- const propName = isArray ? value[0] : value;
17914
- const flags = isArray ? value[1] : InputFlags.None;
17915
- if (isInputMap) {
17916
- array.push({
17917
- propName: propName,
17918
- templateName: publicName,
17919
- isSignal: (flags & InputFlags.SignalBased) !== 0,
17920
- });
17921
- }
17922
- else {
17923
- array.push({
17924
- propName: propName,
17925
- templateName: publicName,
17926
- });
18031
+ function toInputRefArray(map) {
18032
+ return Object.keys(map).map((name) => {
18033
+ const [propName, flags, transform] = map[name];
18034
+ const inputData = {
18035
+ propName: propName,
18036
+ templateName: name,
18037
+ isSignal: (flags & InputFlags.SignalBased) !== 0,
18038
+ };
18039
+ if (transform) {
18040
+ inputData.transform = transform;
17927
18041
  }
17928
- }
17929
- return array;
18042
+ return inputData;
18043
+ });
18044
+ }
18045
+ function toOutputRefArray(map) {
18046
+ return Object.keys(map).map((name) => ({ propName: map[name], templateName: name }));
17930
18047
  }
17931
18048
  function verifyNotAnOrphanComponent(componentDef) {
17932
18049
  // TODO(pk): create assert that verifies ngDevMode
@@ -17985,20 +18102,10 @@ class ComponentFactory extends ComponentFactory$1 {
17985
18102
  ngContentSelectors;
17986
18103
  isBoundToModule;
17987
18104
  get inputs() {
17988
- const componentDef = this.componentDef;
17989
- const inputTransforms = componentDef.inputTransforms;
17990
- const refArray = toRefArray(componentDef.inputs, true);
17991
- if (inputTransforms !== null) {
17992
- for (const input of refArray) {
17993
- if (inputTransforms.hasOwnProperty(input.propName)) {
17994
- input.transform = inputTransforms[input.propName];
17995
- }
17996
- }
17997
- }
17998
- return refArray;
18105
+ return toInputRefArray(this.componentDef.inputs);
17999
18106
  }
18000
18107
  get outputs() {
18001
- return toRefArray(this.componentDef.outputs, false);
18108
+ return toOutputRefArray(this.componentDef.outputs);
18002
18109
  }
18003
18110
  /**
18004
18111
  * @param componentDef The component definition.
@@ -18020,7 +18127,7 @@ class ComponentFactory extends ComponentFactory$1 {
18020
18127
  const cmpDef = this.componentDef;
18021
18128
  ngDevMode && verifyNotAnOrphanComponent(cmpDef);
18022
18129
  const tAttributes = rootSelectorOrNode
18023
- ? ['ng-version', '19.2.0-next.3']
18130
+ ? ['ng-version', '19.2.0']
18024
18131
  : // Extract attributes and classes from the first selector only to match VE behavior.
18025
18132
  extractAttrsAndClassesFromSelector(this.componentDef.selectors[0]);
18026
18133
  // Create the root view. Uses empty TView and ContentTemplate.
@@ -18109,29 +18216,24 @@ class ComponentRef extends ComponentRef$1 {
18109
18216
  this.componentType = componentType;
18110
18217
  }
18111
18218
  setInput(name, value) {
18112
- const inputData = this._tNode.inputs;
18113
- let dataValue;
18114
- if (inputData !== null && (dataValue = inputData[name])) {
18115
- this.previousInputValues ??= new Map();
18116
- // Do not set the input if it is the same as the last value
18117
- // This behavior matches `bindingUpdated` when binding inputs in templates.
18118
- if (this.previousInputValues.has(name) &&
18119
- Object.is(this.previousInputValues.get(name), value)) {
18120
- return;
18121
- }
18122
- const lView = this._rootLView;
18123
- setInputsForProperty(lView[TVIEW], lView, dataValue, name, value);
18124
- this.previousInputValues.set(name, value);
18125
- const childComponentLView = getComponentLViewByIndex(this._tNode.index, lView);
18126
- markViewDirty(childComponentLView, 1 /* NotificationSource.SetInput */);
18219
+ const tNode = this._tNode;
18220
+ this.previousInputValues ??= new Map();
18221
+ // Do not set the input if it is the same as the last value
18222
+ // This behavior matches `bindingUpdated` when binding inputs in templates.
18223
+ if (this.previousInputValues.has(name) &&
18224
+ Object.is(this.previousInputValues.get(name), value)) {
18225
+ return;
18127
18226
  }
18128
- else {
18129
- if (ngDevMode) {
18130
- const cmpNameForError = stringifyForError(this.componentType);
18131
- let message = `Can't set value of the '${name}' input on the '${cmpNameForError}' component. `;
18132
- message += `Make sure that the '${name}' property is annotated with @Input() or a mapped @Input('${name}') exists.`;
18133
- reportUnknownPropertyError(message);
18134
- }
18227
+ const lView = this._rootLView;
18228
+ const hasSetInput = setAllInputsForProperty(tNode, lView[TVIEW], lView, name, value);
18229
+ this.previousInputValues.set(name, value);
18230
+ const childComponentLView = getComponentLViewByIndex(tNode.index, lView);
18231
+ markViewDirty(childComponentLView, 1 /* NotificationSource.SetInput */);
18232
+ if (ngDevMode && !hasSetInput) {
18233
+ const cmpNameForError = stringifyForError(this.componentType);
18234
+ let message = `Can't set value of the '${name}' input on the '${cmpNameForError}' component. `;
18235
+ message += `Make sure that the '${name}' property is annotated with @Input() or a mapped @Input('${name}') exists.`;
18236
+ reportUnknownPropertyError(message);
18135
18237
  }
18136
18238
  }
18137
18239
  get injector() {
@@ -19893,7 +19995,74 @@ function ɵɵdefineNgModule(def) {
19893
19995
  return res;
19894
19996
  });
19895
19997
  }
19896
- function parseAndConvertBindingsForDefinition(obj, declaredInputs) {
19998
+ /**
19999
+ * Converts binding objects from the `DirectiveDefinition` into more efficient
20000
+ * lookup dictionaries that are optimized for the framework runtime.
20001
+ *
20002
+ * This function converts inputs or output directive information into new objects
20003
+ * where the public name conveniently maps to the minified internal field name.
20004
+ *
20005
+ * For inputs, the input flags are additionally persisted into the new data structure,
20006
+ * so that those can be quickly retrieved when needed.
20007
+ *
20008
+ * e.g. for
20009
+ *
20010
+ * ```ts
20011
+ * class Comp {
20012
+ * @Input()
20013
+ * propName1: string;
20014
+ *
20015
+ * @Input('publicName2')
20016
+ * declaredPropName2: number;
20017
+ *
20018
+ * inputSignal = input(3);
20019
+ * }
20020
+ * ```
20021
+ *
20022
+ * will be serialized as
20023
+ *
20024
+ * ```ts
20025
+ * {
20026
+ * propName1: 'propName1',
20027
+ * declaredPropName2: ['publicName2', 'declaredPropName2'],
20028
+ * inputSignal: [InputFlags.SignalBased, 'inputSignal'],
20029
+ * }
20030
+ * ```
20031
+ *
20032
+ * which is than translated by the minifier as:
20033
+ *
20034
+ * ```ts
20035
+ * {
20036
+ * minifiedPropName1: 'propName1',
20037
+ * minifiedPropName2: ['publicName2', 'declaredPropName2'],
20038
+ * minifiedInputSignal: [InputFlags.SignalBased, 'inputSignal'],
20039
+ * }
20040
+ * ```
20041
+ *
20042
+ * becomes: (public name => minifiedName + isSignal if needed)
20043
+ *
20044
+ * ```ts
20045
+ * {
20046
+ * 'propName1': 'minifiedPropName1',
20047
+ * 'publicName2': 'minifiedPropName2',
20048
+ * 'inputSignal': ['minifiedInputSignal', InputFlags.SignalBased],
20049
+ * }
20050
+ * ```
20051
+ *
20052
+ * Optionally the function can take `declaredInputs` which will result
20053
+ * in: (public name => declared name)
20054
+ *
20055
+ * ```ts
20056
+ * {
20057
+ * 'propName1': 'propName1',
20058
+ * 'publicName2': 'declaredPropName2',
20059
+ * 'inputSignal': 'inputSignal',
20060
+ * }
20061
+ * ```
20062
+ *
20063
+
20064
+ */
20065
+ function parseAndConvertInputsForDefinition(obj, declaredInputs) {
19897
20066
  if (obj == null)
19898
20067
  return EMPTY_OBJ;
19899
20068
  const newLookup = {};
@@ -19902,26 +20071,33 @@ function parseAndConvertBindingsForDefinition(obj, declaredInputs) {
19902
20071
  const value = obj[minifiedKey];
19903
20072
  let publicName;
19904
20073
  let declaredName;
19905
- let inputFlags = InputFlags.None;
20074
+ let inputFlags;
20075
+ let transform;
19906
20076
  if (Array.isArray(value)) {
19907
20077
  inputFlags = value[0];
19908
20078
  publicName = value[1];
19909
20079
  declaredName = value[2] ?? publicName; // declared name might not be set to save bytes.
20080
+ transform = value[3] || null;
19910
20081
  }
19911
20082
  else {
19912
20083
  publicName = value;
19913
20084
  declaredName = value;
20085
+ inputFlags = InputFlags.None;
20086
+ transform = null;
19914
20087
  }
19915
- // For inputs, capture the declared name, or if some flags are set.
19916
- if (declaredInputs) {
19917
- // Perf note: An array is only allocated for the input if there are flags.
19918
- newLookup[publicName] =
19919
- inputFlags !== InputFlags.None ? [minifiedKey, inputFlags] : minifiedKey;
19920
- declaredInputs[publicName] = declaredName;
19921
- }
19922
- else {
19923
- newLookup[publicName] = minifiedKey;
19924
- }
20088
+ newLookup[publicName] = [minifiedKey, inputFlags, transform];
20089
+ declaredInputs[publicName] = declaredName;
20090
+ }
20091
+ }
20092
+ return newLookup;
20093
+ }
20094
+ function parseAndConvertOutputsForDefinition(obj) {
20095
+ if (obj == null)
20096
+ return EMPTY_OBJ;
20097
+ const newLookup = {};
20098
+ for (const minifiedKey in obj) {
20099
+ if (obj.hasOwnProperty(minifiedKey)) {
20100
+ newLookup[obj[minifiedKey]] = minifiedKey;
19925
20101
  }
19926
20102
  }
19927
20103
  return newLookup;
@@ -19986,7 +20162,6 @@ function getNgDirectiveDef(directiveDefinition) {
19986
20162
  hostAttrs: directiveDefinition.hostAttrs || null,
19987
20163
  contentQueries: directiveDefinition.contentQueries || null,
19988
20164
  declaredInputs: declaredInputs,
19989
- inputTransforms: null,
19990
20165
  inputConfig: directiveDefinition.inputs || EMPTY_OBJ,
19991
20166
  exportAs: directiveDefinition.exportAs || null,
19992
20167
  standalone: directiveDefinition.standalone ?? true,
@@ -19997,8 +20172,8 @@ function getNgDirectiveDef(directiveDefinition) {
19997
20172
  setInput: null,
19998
20173
  findHostDirectiveDefs: null,
19999
20174
  hostDirectives: null,
20000
- inputs: parseAndConvertBindingsForDefinition(directiveDefinition.inputs, declaredInputs),
20001
- outputs: parseAndConvertBindingsForDefinition(directiveDefinition.outputs),
20175
+ inputs: parseAndConvertInputsForDefinition(directiveDefinition.inputs, declaredInputs),
20176
+ outputs: parseAndConvertOutputsForDefinition(directiveDefinition.outputs),
20002
20177
  debugInfo: null,
20003
20178
  };
20004
20179
  }
@@ -20127,7 +20302,6 @@ function ɵɵInheritDefinitionFeature(definition) {
20127
20302
  // would've justified object creation. Unwrap them if necessary.
20128
20303
  const writeableDef = definition;
20129
20304
  writeableDef.inputs = maybeUnwrapEmpty(definition.inputs);
20130
- writeableDef.inputTransforms = maybeUnwrapEmpty(definition.inputTransforms);
20131
20305
  writeableDef.declaredInputs = maybeUnwrapEmpty(definition.declaredInputs);
20132
20306
  writeableDef.outputs = maybeUnwrapEmpty(definition.outputs);
20133
20307
  // Merge hostBindings
@@ -20184,23 +20358,9 @@ function mergeInputsWithTransforms(target, source) {
20184
20358
  continue;
20185
20359
  }
20186
20360
  const value = source.inputs[key];
20187
- if (value === undefined) {
20188
- continue;
20189
- }
20190
- target.inputs[key] = value;
20191
- target.declaredInputs[key] = source.declaredInputs[key];
20192
- // If the input is inherited, and we have a transform for it, we also inherit it.
20193
- // Note that transforms should not be inherited if the input has its own metadata
20194
- // in the `source` directive itself already (i.e. the input is re-declared/overridden).
20195
- if (source.inputTransforms !== null) {
20196
- // Note: transforms are stored with their minified names.
20197
- // Perf: only access the minified name when there are source transforms.
20198
- const minifiedName = Array.isArray(value) ? value[0] : value;
20199
- if (!source.inputTransforms.hasOwnProperty(minifiedName)) {
20200
- continue;
20201
- }
20202
- target.inputTransforms ??= {};
20203
- target.inputTransforms[minifiedName] = source.inputTransforms[minifiedName];
20361
+ if (value !== undefined) {
20362
+ target.inputs[key] = value;
20363
+ target.declaredInputs[key] = source.declaredInputs[key];
20204
20364
  }
20205
20365
  }
20206
20366
  }
@@ -20514,30 +20674,6 @@ function validateMappings(bindingType, def, hostDirectiveBindings) {
20514
20674
  }
20515
20675
  }
20516
20676
 
20517
- /**
20518
- * Decorates the directive definition with support for input transform functions.
20519
- *
20520
- * If the directive uses inheritance, the feature should be included before the
20521
- * `InheritDefinitionFeature` to ensure that the `inputTransforms` field is populated.
20522
- *
20523
- * @codeGenApi
20524
- */
20525
- function ɵɵInputTransformsFeature(definition) {
20526
- const inputs = definition.inputConfig;
20527
- const inputTransforms = {};
20528
- for (const minifiedKey in inputs) {
20529
- if (inputs.hasOwnProperty(minifiedKey)) {
20530
- // Note: the private names are used for the keys, rather than the public ones, because public
20531
- // names can be re-aliased in host directives which would invalidate the lookup.
20532
- const value = inputs[minifiedKey];
20533
- if (Array.isArray(value) && value[3]) {
20534
- inputTransforms[minifiedKey] = value[3];
20535
- }
20536
- }
20537
- }
20538
- definition.inputTransforms = inputTransforms;
20539
- }
20540
-
20541
20677
  function isIterable(obj) {
20542
20678
  return obj !== null && typeof obj === 'object' && obj[Symbol.iterator] !== undefined;
20543
20679
  }
@@ -20719,7 +20855,7 @@ function declareTemplate(declarationLView, declarationTView, index, templateFn,
20719
20855
  // In client-only mode, this function is a noop.
20720
20856
  populateDehydratedViewsInLContainer(lContainer, tNode, declarationLView);
20721
20857
  if (isDirectiveHost(tNode)) {
20722
- createDirectivesInstancesInInstruction(declarationTView, declarationLView, tNode);
20858
+ createDirectivesInstances(declarationTView, declarationLView, tNode);
20723
20859
  }
20724
20860
  if (localRefsIndex != null) {
20725
20861
  saveResolvedLocalsInData(declarationLView, tNode, localRefExtractor);
@@ -21254,8 +21390,9 @@ function renderDeferBlockState(newState, tNode, lContainer, skipTimerScheduling
21254
21390
  }
21255
21391
  }
21256
21392
  function findMatchingDehydratedViewForDeferBlock(lContainer, lDetails) {
21257
- // Find matching view based on serialized defer block state.
21258
- return (lContainer[DEHYDRATED_VIEWS]?.find((view) => view.data[DEFER_BLOCK_STATE$1] === lDetails[DEFER_BLOCK_STATE]) ?? null);
21393
+ const dehydratedViewIx = lContainer[DEHYDRATED_VIEWS]?.findIndex((view) => view.data[DEFER_BLOCK_STATE$1] === lDetails[DEFER_BLOCK_STATE]) ?? -1;
21394
+ const dehydratedView = dehydratedViewIx > -1 ? lContainer[DEHYDRATED_VIEWS][dehydratedViewIx] : null;
21395
+ return { dehydratedView, dehydratedViewIx };
21259
21396
  }
21260
21397
  /**
21261
21398
  * Applies changes to the DOM to reflect a given state.
@@ -21287,21 +21424,23 @@ function applyDeferBlockState(newState, lDetails, lContainer, tNode, hostLView)
21287
21424
  injector = createDeferBlockInjector(hostLView[INJECTOR], tDetails, providers);
21288
21425
  }
21289
21426
  }
21290
- const dehydratedView = findMatchingDehydratedViewForDeferBlock(lContainer, lDetails);
21291
- // Erase dehydrated view info, so that it's not removed later
21292
- // by post-hydration cleanup process.
21293
- lContainer[DEHYDRATED_VIEWS] = null;
21427
+ const { dehydratedView, dehydratedViewIx } = findMatchingDehydratedViewForDeferBlock(lContainer, lDetails);
21294
21428
  const embeddedLView = createAndRenderEmbeddedLView(hostLView, activeBlockTNode, null, {
21295
21429
  injector,
21296
21430
  dehydratedView,
21297
21431
  });
21298
21432
  addLViewToLContainer(lContainer, embeddedLView, viewIndex, shouldAddViewToDom(activeBlockTNode, dehydratedView));
21299
21433
  markViewDirty(embeddedLView, 2 /* NotificationSource.DeferBlockStateUpdate */);
21300
- // TODO(incremental-hydration):
21301
- // - what if we had some views in `lContainer[DEHYDRATED_VIEWS]`, but
21302
- // we didn't find a view that matches the expected state?
21303
- // - for example, handle a situation when a block was in the "completed" state
21304
- // on the server, but the loading failing on the client. How do we reconcile and cleanup?
21434
+ if (dehydratedViewIx > -1) {
21435
+ // Erase dehydrated view info in a given LContainer, so that the view is not
21436
+ // removed later by post-hydration cleanup process (which iterates over all
21437
+ // dehydrated views in component tree). This clears only the dehydrated view
21438
+ // that was found for this render, which in most cases will be the only view.
21439
+ // In the case that there was control flow that changed, there may be either
21440
+ // more than one or the views would not match up due to the server rendered
21441
+ // content being a different branch of the control flow.
21442
+ lContainer[DEHYDRATED_VIEWS]?.splice(dehydratedViewIx, 1);
21443
+ }
21305
21444
  if ((newState === DeferBlockState.Complete || newState === DeferBlockState.Error) &&
21306
21445
  Array.isArray(lDetails[ON_COMPLETE_FNS])) {
21307
21446
  for (const callback of lDetails[ON_COMPLETE_FNS]) {
@@ -24150,16 +24289,36 @@ async function triggerHydrationFromBlockName(injector, blockName, replayQueuedEv
24150
24289
  await parentBlockPromise;
24151
24290
  }
24152
24291
  // Actually do the triggering and hydration of the queue of blocks
24153
- for (const dehydratedBlockId of hydrationQueue) {
24154
- await triggerResourceLoadingForHydration(dehydratedBlockId, dehydratedBlockRegistry);
24155
- await nextRender(injector);
24156
- // TODO(incremental-hydration): assert (in dev mode) that a defer block is present in the dehydrated registry
24157
- // at this point. If not - it means that the block has not been hydrated, for example due to different
24158
- // `@if` conditions on the client and the server. If we detect this case, we should also do the cleanup
24159
- // of all child block (promises, registry state, etc).
24160
- // TODO(incremental-hydration): call `rejectFn` when lDetails[DEFER_BLOCK_STATE] is `DeferBlockState.Error`.
24161
- blocksBeingHydrated.get(dehydratedBlockId).resolve();
24162
- // TODO(incremental-hydration): consider adding a wait for stability here
24292
+ for (let blockQueueIdx = 0; blockQueueIdx < hydrationQueue.length; blockQueueIdx++) {
24293
+ const dehydratedBlockId = hydrationQueue[blockQueueIdx];
24294
+ const dehydratedDeferBlock = dehydratedBlockRegistry.get(dehydratedBlockId);
24295
+ if (dehydratedDeferBlock != null) {
24296
+ // trigger the block resources and await next render for hydration. This should result
24297
+ // in the next block ɵɵdefer instruction being called and that block being added to the dehydrated registry.
24298
+ await triggerResourceLoadingForHydration(dehydratedDeferBlock);
24299
+ await nextRender(injector);
24300
+ // if the content has changed since server rendering, we need to check for the expected block
24301
+ // being in the registry or if errors occurred. In that case, we need to clean up the remaining expected
24302
+ // content that won't be rendered or fetched.
24303
+ if (deferBlockHasErrored(dehydratedDeferBlock)) {
24304
+ // Either the expected block has not yet had its ɵɵdefer instruction called or the block errored out when fetching
24305
+ // resources. In the former case, either we're hydrating too soon or the client and server differ. In both cases,
24306
+ // we need to clean up child content and promises.
24307
+ removeDehydratedViewList(dehydratedDeferBlock);
24308
+ cleanupRemainingHydrationQueue(hydrationQueue.slice(blockQueueIdx), dehydratedBlockRegistry);
24309
+ break;
24310
+ }
24311
+ // The defer block has not errored and we've finished fetching resources and rendering.
24312
+ // At this point it is safe to resolve the hydration promise.
24313
+ blocksBeingHydrated.get(dehydratedBlockId).resolve();
24314
+ }
24315
+ else {
24316
+ // The expected block has not yet had its ɵɵdefer instruction called. This is likely due to content changing between
24317
+ // client and server. We need to clean up the dehydrated DOM in the container since it no longer is valid.
24318
+ cleanupParentContainer(blockQueueIdx, hydrationQueue, dehydratedBlockRegistry);
24319
+ cleanupRemainingHydrationQueue(hydrationQueue.slice(blockQueueIdx), dehydratedBlockRegistry);
24320
+ break;
24321
+ }
24163
24322
  }
24164
24323
  // Await hydration completion for the requested block.
24165
24324
  await blocksBeingHydrated.get(blockName)?.promise;
@@ -24172,6 +24331,33 @@ async function triggerHydrationFromBlockName(injector, blockName, replayQueuedEv
24172
24331
  // Cleanup after hydration of all affected defer blocks.
24173
24332
  cleanupHydratedDeferBlocks(dehydratedBlockRegistry.get(blockName), hydrationQueue, dehydratedBlockRegistry, injector.get(ApplicationRef));
24174
24333
  }
24334
+ function deferBlockHasErrored(deferBlock) {
24335
+ return (getLDeferBlockDetails(deferBlock.lView, deferBlock.tNode)[DEFER_BLOCK_STATE] ===
24336
+ DeferBlockState.Error);
24337
+ }
24338
+ /**
24339
+ * Clean up the parent container of a block where content changed between server and client.
24340
+ * The parent of a block going through `triggerHydrationFromBlockName` will contain the
24341
+ * dehydrated content that needs to be cleaned up. So we have to do the clean up from that location
24342
+ * in the tree.
24343
+ */
24344
+ function cleanupParentContainer(currentBlockIdx, hydrationQueue, dehydratedBlockRegistry) {
24345
+ // If a parent block exists, it's in the hydration queue in front of the current block.
24346
+ const parentDeferBlockIdx = currentBlockIdx - 1;
24347
+ const parentDeferBlock = parentDeferBlockIdx > -1
24348
+ ? dehydratedBlockRegistry.get(hydrationQueue[parentDeferBlockIdx])
24349
+ : null;
24350
+ if (parentDeferBlock) {
24351
+ cleanupLContainer(parentDeferBlock.lContainer);
24352
+ }
24353
+ }
24354
+ function cleanupRemainingHydrationQueue(hydrationQueue, dehydratedBlockRegistry) {
24355
+ const blocksBeingHydrated = dehydratedBlockRegistry.hydrating;
24356
+ for (const dehydratedBlockId in hydrationQueue) {
24357
+ blocksBeingHydrated.get(dehydratedBlockId)?.reject();
24358
+ }
24359
+ dehydratedBlockRegistry.cleanup(hydrationQueue);
24360
+ }
24175
24361
  /**
24176
24362
  * Generates a new promise for every defer block in the hydrating queue
24177
24363
  */
@@ -24184,18 +24370,8 @@ function populateHydratingStateForQueue(registry, queue) {
24184
24370
  function nextRender(injector) {
24185
24371
  return new Promise((resolveFn) => afterNextRender(resolveFn, { injector }));
24186
24372
  }
24187
- async function triggerResourceLoadingForHydration(dehydratedBlockId, dehydratedBlockRegistry) {
24188
- const deferBlock = dehydratedBlockRegistry.get(dehydratedBlockId);
24189
- // Since we trigger hydration for nested defer blocks in a sequence (parent -> child),
24190
- // there is a chance that a defer block may not be present at hydration time. For example,
24191
- // when a nested block was in an `@if` condition, which has changed.
24192
- if (deferBlock === null) {
24193
- // TODO(incremental-hydration): handle the cleanup for cases when
24194
- // defer block is no longer present during hydration (e.g. `@if` condition
24195
- // has changed during hydration/rendering).
24196
- return;
24197
- }
24198
- const { tNode, lView } = deferBlock;
24373
+ async function triggerResourceLoadingForHydration(dehydratedBlock) {
24374
+ const { tNode, lView } = dehydratedBlock;
24199
24375
  const lDetails = getLDeferBlockDetails(lView, tNode);
24200
24376
  return new Promise((resolve) => {
24201
24377
  onDeferBlockCompletion(lDetails, resolve);
@@ -26248,10 +26424,8 @@ function ɵɵproperty(propName, value, sanitizer) {
26248
26424
  * directive input.
26249
26425
  */
26250
26426
  function setDirectiveInputsWhichShadowsStyling(tView, tNode, lView, value, isClassBased) {
26251
- const inputs = tNode.inputs;
26252
- const property = isClassBased ? 'class' : 'style';
26253
26427
  // We support both 'class' and `className` hence the fallback.
26254
- setInputsForProperty(tView, lView, inputs[property], property, value);
26428
+ setAllInputsForProperty(tNode, tView, lView, isClassBased ? 'class' : 'style', value);
26255
26429
  }
26256
26430
 
26257
26431
  /**
@@ -28075,12 +28249,12 @@ function ɵɵelementStart(index, name, attrsIndex, localRefsIndex) {
28075
28249
  // any immediate children of a component or template container must be pre-emptively
28076
28250
  // monkey-patched with the component view data so that the element can be inspected
28077
28251
  // later on using any element discovery utility methods (see `element_discovery.ts`)
28078
- if (getElementDepthCount() === 0) {
28252
+ if (getElementDepthCount() === 0 || hasDirectives) {
28079
28253
  attachPatchData(native, lView);
28080
28254
  }
28081
28255
  increaseElementDepthCount();
28082
28256
  if (hasDirectives) {
28083
- createDirectivesInstancesInInstruction(tView, lView, tNode);
28257
+ createDirectivesInstances(tView, lView, tNode);
28084
28258
  executeContentQueries(tView, tNode, lView);
28085
28259
  }
28086
28260
  if (localRefsIndex !== null) {
@@ -28252,7 +28426,7 @@ function ɵɵelementContainerStart(index, attrsIndex, localRefsIndex) {
28252
28426
  }
28253
28427
  attachPatchData(comment, lView);
28254
28428
  if (isDirectiveHost(tNode)) {
28255
- createDirectivesInstancesInInstruction(tView, lView, tNode);
28429
+ createDirectivesInstances(tView, lView, tNode);
28256
28430
  executeContentQueries(tView, tNode, lView);
28257
28431
  }
28258
28432
  if (localRefsIndex != null) {
@@ -30307,7 +30481,7 @@ function findExistingListener(tView, lView, eventName, tNodeIdx) {
30307
30481
  function listenerInternal(tView, lView, renderer, tNode, eventName, listenerFn, eventTargetResolver) {
30308
30482
  const isTNodeDirectiveHost = isDirectiveHost(tNode);
30309
30483
  const firstCreatePass = tView.firstCreatePass;
30310
- const tCleanup = firstCreatePass && getOrCreateTViewCleanup(tView);
30484
+ const tCleanup = firstCreatePass ? getOrCreateTViewCleanup(tView) : null;
30311
30485
  const context = lView[CONTEXT];
30312
30486
  // When the ɵɵlistener instruction was generated and is executed we know that there is either a
30313
30487
  // native listener or a directive output on this element. As such we we know that we will have to
@@ -30372,29 +30546,37 @@ function listenerInternal(tView, lView, renderer, tNode, eventName, listenerFn,
30372
30546
  // ancestors are marked dirty when an event occurs.
30373
30547
  listenerFn = wrapListener(tNode, lView, context, listenerFn);
30374
30548
  }
30375
- // subscribe to directive outputs
30376
- const outputs = tNode.outputs;
30377
- let props;
30378
- if (processOutputs && outputs !== null && (props = outputs[eventName])) {
30379
- const propsLength = props.length;
30380
- if (propsLength) {
30381
- for (let i = 0; i < propsLength; i += 2) {
30382
- const index = props[i];
30383
- ngDevMode && assertIndexInRange(lView, index);
30384
- const minifiedName = props[i + 1];
30385
- const directiveInstance = lView[index];
30386
- const output = directiveInstance[minifiedName];
30387
- if (ngDevMode && !isOutputSubscribable(output)) {
30388
- throw new Error(`@Output ${minifiedName} not initialized in '${directiveInstance.constructor.name}'.`);
30389
- }
30390
- const subscription = output.subscribe(listenerFn);
30391
- const idx = lCleanup.length;
30392
- lCleanup.push(listenerFn, subscription);
30393
- tCleanup && tCleanup.push(eventName, tNode.index, idx, -(idx + 1));
30549
+ if (processOutputs) {
30550
+ const outputConfig = tNode.outputs?.[eventName];
30551
+ const hostDirectiveOutputConfig = tNode.hostDirectiveOutputs?.[eventName];
30552
+ if (hostDirectiveOutputConfig && hostDirectiveOutputConfig.length) {
30553
+ for (let i = 0; i < hostDirectiveOutputConfig.length; i += 2) {
30554
+ const index = hostDirectiveOutputConfig[i];
30555
+ const lookupName = hostDirectiveOutputConfig[i + 1];
30556
+ listenToOutput(tNode, tView, lView, index, lookupName, eventName, listenerFn, lCleanup, tCleanup);
30557
+ }
30558
+ }
30559
+ if (outputConfig && outputConfig.length) {
30560
+ for (const index of outputConfig) {
30561
+ listenToOutput(tNode, tView, lView, index, eventName, eventName, listenerFn, lCleanup, tCleanup);
30394
30562
  }
30395
30563
  }
30396
30564
  }
30397
30565
  }
30566
+ function listenToOutput(tNode, tView, lView, index, lookupName, eventName, listenerFn, lCleanup, tCleanup) {
30567
+ ngDevMode && assertIndexInRange(lView, index);
30568
+ const instance = lView[index];
30569
+ const def = tView.data[index];
30570
+ const propertyName = def.outputs[lookupName];
30571
+ const output = instance[propertyName];
30572
+ if (ngDevMode && !isOutputSubscribable(output)) {
30573
+ throw new Error(`@Output ${propertyName} not initialized in '${instance.constructor.name}'.`);
30574
+ }
30575
+ const subscription = output.subscribe(listenerFn);
30576
+ const idx = lCleanup.length;
30577
+ lCleanup.push(listenerFn, subscription);
30578
+ tCleanup && tCleanup.push(eventName, tNode.index, idx, -(idx + 1));
30579
+ }
30398
30580
  function executeListenerWithErrorHandling(lView, context, listenerFn, e) {
30399
30581
  const prevConsumer = setActiveConsumer$1(null);
30400
30582
  try {
@@ -33558,11 +33740,12 @@ function executeWithInvalidateFallback(importMeta, id, callback) {
33558
33740
  callback();
33559
33741
  }
33560
33742
  catch (e) {
33561
- const errorMessage = e.message;
33743
+ const error = e;
33562
33744
  // If we have all the necessary information and APIs to send off the invalidation
33563
33745
  // request, send it before rethrowing so the dev server can decide what to do.
33564
- if (id !== null && errorMessage) {
33565
- importMeta?.hot?.send?.('angular:invalidate', { id, message: errorMessage, error: true });
33746
+ if (id !== null && error.message) {
33747
+ const toLog = error.message + (error.stack ? '\n' + error.stack : '');
33748
+ importMeta?.hot?.send?.('angular:invalidate', { id, message: toLog, error: true });
33566
33749
  }
33567
33750
  // Throw the error in case the page doesn't get refreshed.
33568
33751
  throw e;
@@ -33654,7 +33837,6 @@ const angularCoreEnv = (() => ({
33654
33837
  'ɵɵProvidersFeature': ɵɵProvidersFeature,
33655
33838
  'ɵɵCopyDefinitionFeature': ɵɵCopyDefinitionFeature,
33656
33839
  'ɵɵInheritDefinitionFeature': ɵɵInheritDefinitionFeature,
33657
- 'ɵɵInputTransformsFeature': ɵɵInputTransformsFeature,
33658
33840
  'ɵɵExternalStylesFeature': ɵɵExternalStylesFeature,
33659
33841
  'ɵɵnextContext': ɵɵnextContext,
33660
33842
  'ɵɵnamespaceHTML': ɵɵnamespaceHTML,
@@ -34993,7 +35175,7 @@ class Version {
34993
35175
  /**
34994
35176
  * @publicApi
34995
35177
  */
34996
- const VERSION = new Version('19.2.0-next.3');
35178
+ const VERSION = new Version('19.2.0');
34997
35179
 
34998
35180
  /**
34999
35181
  * Combination of NgModuleFactory and ComponentFactories.
@@ -35827,10 +36009,9 @@ class ImagePerformanceWarning {
35827
36009
  window = null;
35828
36010
  observer = null;
35829
36011
  options = inject(IMAGE_CONFIG);
35830
- isBrowser = inject(PLATFORM_ID) === 'browser';
35831
36012
  lcpImageUrl;
35832
36013
  start() {
35833
- if (!this.isBrowser ||
36014
+ if ((typeof ngServerMode !== 'undefined' && ngServerMode) ||
35834
36015
  typeof PerformanceObserver === 'undefined' ||
35835
36016
  (this.options?.disableImageSizeWarning && this.options?.disableImageLazyLoadWarning)) {
35836
36017
  return;
@@ -35838,7 +36019,7 @@ class ImagePerformanceWarning {
35838
36019
  this.observer = this.initPerformanceObserver();
35839
36020
  const doc = getDocument();
35840
36021
  const win = doc.defaultView;
35841
- if (typeof win !== 'undefined') {
36022
+ if (win) {
35842
36023
  this.window = win;
35843
36024
  // Wait to avoid race conditions where LCP image triggers
35844
36025
  // load event before it's recorded by the performance observer
@@ -38840,8 +39021,8 @@ function defaultThrowError() {
38840
39021
  throw new Error();
38841
39022
  }
38842
39023
  let throwInvalidWriteToSignalErrorFn = defaultThrowError;
38843
- function throwInvalidWriteToSignalError() {
38844
- throwInvalidWriteToSignalErrorFn();
39024
+ function throwInvalidWriteToSignalError(node) {
39025
+ throwInvalidWriteToSignalErrorFn(node);
38845
39026
  }
38846
39027
  function setThrowInvalidWriteToSignalError(fn) {
38847
39028
  throwInvalidWriteToSignalErrorFn = fn;
@@ -38878,7 +39059,7 @@ function signalGetFn() {
38878
39059
  }
38879
39060
  function signalSetFn(node, newValue) {
38880
39061
  if (!producerUpdatesAllowed()) {
38881
- throwInvalidWriteToSignalError();
39062
+ throwInvalidWriteToSignalError(node);
38882
39063
  }
38883
39064
  if (!node.equal(node.value, newValue)) {
38884
39065
  node.value = newValue;
@@ -38887,7 +39068,7 @@ function signalSetFn(node, newValue) {
38887
39068
  }
38888
39069
  function signalUpdateFn(node, updater) {
38889
39070
  if (!producerUpdatesAllowed()) {
38890
- throwInvalidWriteToSignalError();
39071
+ throwInvalidWriteToSignalError(node);
38891
39072
  }
38892
39073
  signalSetFn(node, updater(node.value));
38893
39074
  }
@@ -40423,182 +40604,26 @@ function disableProfiling() {
40423
40604
  enablePerfLogging = false;
40424
40605
  }
40425
40606
 
40426
- /*!
40427
- * @license
40428
- * Copyright Google LLC All Rights Reserved.
40429
- *
40430
- * Use of this source code is governed by an MIT-style license that can be
40431
- * found in the LICENSE file at https://angular.dev/license
40432
- */
40433
40607
  /**
40434
- * Gets the class name of the closest component to a node.
40435
- * Warning! this function will return minified names if the name of the component is minified. The
40436
- * consumer of the function is responsible for resolving the minified name to its original name.
40437
- * @param node Node from which to start the search.
40608
+ * Execute an arbitrary function in a non-reactive (non-tracking) context. The executed function
40609
+ * can, optionally, return a value.
40438
40610
  */
40439
- function getClosestComponentName(node) {
40440
- let currentNode = node;
40441
- while (currentNode) {
40442
- const lView = readPatchedLView(currentNode);
40443
- if (lView !== null) {
40444
- for (let i = HEADER_OFFSET; i < lView.length; i++) {
40445
- const current = lView[i];
40446
- if ((!isLView(current) && !isLContainer(current)) || current[HOST] !== currentNode) {
40447
- continue;
40448
- }
40449
- const tView = lView[TVIEW];
40450
- const tNode = getTNode(tView, i);
40451
- if (isComponentHost(tNode)) {
40452
- const def = tView.data[tNode.directiveStart + tNode.componentOffset];
40453
- const name = def.debugInfo?.className || def.type.name;
40454
- // Note: the name may be an empty string if the class name is
40455
- // dropped due to minification. In such cases keep going up the tree.
40456
- if (name) {
40457
- return name;
40458
- }
40459
- else {
40460
- break;
40461
- }
40462
- }
40463
- }
40464
- }
40465
- currentNode = currentNode.parentNode;
40611
+ function untracked(nonReactiveReadsFn) {
40612
+ const prevConsumer = setActiveConsumer$1(null);
40613
+ // We are not trying to catch any particular errors here, just making sure that the consumers
40614
+ // stack is restored in case of errors.
40615
+ try {
40616
+ return nonReactiveReadsFn();
40466
40617
  }
40467
- return null;
40468
- }
40469
-
40470
- /**
40471
- * Compiles a partial directive declaration object into a full directive definition object.
40472
- *
40473
- * @codeGenApi
40474
- */
40475
- function ɵɵngDeclareDirective(decl) {
40476
- const compiler = getCompilerFacade({
40477
- usage: 1 /* JitCompilerUsage.PartialDeclaration */,
40478
- kind: 'directive',
40479
- type: decl.type,
40480
- });
40481
- return compiler.compileDirectiveDeclaration(angularCoreEnv, `ng:///${decl.type.name}/ɵfac.js`, decl);
40482
- }
40483
- /**
40484
- * Evaluates the class metadata declaration.
40485
- *
40486
- * @codeGenApi
40487
- */
40488
- function ɵɵngDeclareClassMetadata(decl) {
40489
- setClassMetadata(decl.type, decl.decorators, decl.ctorParameters ?? null, decl.propDecorators ?? null);
40490
- }
40491
- /**
40492
- * Evaluates the class metadata of a component that contains deferred blocks.
40493
- *
40494
- * @codeGenApi
40495
- */
40496
- function ɵɵngDeclareClassMetadataAsync(decl) {
40497
- setClassMetadataAsync(decl.type, decl.resolveDeferredDeps, (...types) => {
40498
- const meta = decl.resolveMetadata(...types);
40499
- setClassMetadata(decl.type, meta.decorators, meta.ctorParameters, meta.propDecorators);
40500
- });
40501
- }
40502
- /**
40503
- * Compiles a partial component declaration object into a full component definition object.
40504
- *
40505
- * @codeGenApi
40506
- */
40507
- function ɵɵngDeclareComponent(decl) {
40508
- const compiler = getCompilerFacade({
40509
- usage: 1 /* JitCompilerUsage.PartialDeclaration */,
40510
- kind: 'component',
40511
- type: decl.type,
40512
- });
40513
- return compiler.compileComponentDeclaration(angularCoreEnv, `ng:///${decl.type.name}/ɵcmp.js`, decl);
40514
- }
40515
- /**
40516
- * Compiles a partial pipe declaration object into a full pipe definition object.
40517
- *
40518
- * @codeGenApi
40519
- */
40520
- function ɵɵngDeclareFactory(decl) {
40521
- const compiler = getCompilerFacade({
40522
- usage: 1 /* JitCompilerUsage.PartialDeclaration */,
40523
- kind: getFactoryKind(decl.target),
40524
- type: decl.type,
40525
- });
40526
- return compiler.compileFactoryDeclaration(angularCoreEnv, `ng:///${decl.type.name}/ɵfac.js`, decl);
40527
- }
40528
- function getFactoryKind(target) {
40529
- switch (target) {
40530
- case FactoryTarget.Directive:
40531
- return 'directive';
40532
- case FactoryTarget.Component:
40533
- return 'component';
40534
- case FactoryTarget.Injectable:
40535
- return 'injectable';
40536
- case FactoryTarget.Pipe:
40537
- return 'pipe';
40538
- case FactoryTarget.NgModule:
40539
- return 'NgModule';
40618
+ finally {
40619
+ setActiveConsumer$1(prevConsumer);
40540
40620
  }
40541
40621
  }
40542
- /**
40543
- * Compiles a partial injectable declaration object into a full injectable definition object.
40544
- *
40545
- * @codeGenApi
40546
- */
40547
- function ɵɵngDeclareInjectable(decl) {
40548
- const compiler = getCompilerFacade({
40549
- usage: 1 /* JitCompilerUsage.PartialDeclaration */,
40550
- kind: 'injectable',
40551
- type: decl.type,
40552
- });
40553
- return compiler.compileInjectableDeclaration(angularCoreEnv, `ng:///${decl.type.name}/ɵprov.js`, decl);
40554
- }
40555
- /**
40556
- * Compiles a partial injector declaration object into a full injector definition object.
40557
- *
40558
- * @codeGenApi
40559
- */
40560
- function ɵɵngDeclareInjector(decl) {
40561
- const compiler = getCompilerFacade({
40562
- usage: 1 /* JitCompilerUsage.PartialDeclaration */,
40563
- kind: 'NgModule',
40564
- type: decl.type,
40565
- });
40566
- return compiler.compileInjectorDeclaration(angularCoreEnv, `ng:///${decl.type.name}/ɵinj.js`, decl);
40567
- }
40568
- /**
40569
- * Compiles a partial NgModule declaration object into a full NgModule definition object.
40570
- *
40571
- * @codeGenApi
40572
- */
40573
- function ɵɵngDeclareNgModule(decl) {
40574
- const compiler = getCompilerFacade({
40575
- usage: 1 /* JitCompilerUsage.PartialDeclaration */,
40576
- kind: 'NgModule',
40577
- type: decl.type,
40578
- });
40579
- return compiler.compileNgModuleDeclaration(angularCoreEnv, `ng:///${decl.type.name}/ɵmod.js`, decl);
40580
- }
40581
- /**
40582
- * Compiles a partial pipe declaration object into a full pipe definition object.
40583
- *
40584
- * @codeGenApi
40585
- */
40586
- function ɵɵngDeclarePipe(decl) {
40587
- const compiler = getCompilerFacade({
40588
- usage: 1 /* JitCompilerUsage.PartialDeclaration */,
40589
- kind: 'pipe',
40590
- type: decl.type,
40591
- });
40592
- return compiler.compilePipeDeclaration(angularCoreEnv, `ng:///${decl.type.name}/ɵpipe.js`, decl);
40593
- }
40594
-
40595
- // we reexport these symbols just so that they are retained during the dead code elimination
40596
40622
 
40597
40623
  /**
40598
40624
  * Create a computed `Signal` which derives a reactive value from an expression.
40599
40625
  */
40600
40626
  function computed(computation, options) {
40601
- performanceMarkFeature('NgSignals');
40602
40627
  const getter = createComputed$1(computation);
40603
40628
  if (options?.equal) {
40604
40629
  getter[SIGNAL$1].equal = options.equal;
@@ -40610,46 +40635,6 @@ function computed(computation, options) {
40610
40635
  return getter;
40611
40636
  }
40612
40637
 
40613
- const identityFn = (v) => v;
40614
- function linkedSignal(optionsOrComputation, options) {
40615
- performanceMarkFeature('NgSignals');
40616
- if (typeof optionsOrComputation === 'function') {
40617
- const getter = createLinkedSignal$1(optionsOrComputation, (identityFn), options?.equal);
40618
- return upgradeLinkedSignalGetter(getter);
40619
- }
40620
- else {
40621
- const getter = createLinkedSignal$1(optionsOrComputation.source, optionsOrComputation.computation, optionsOrComputation.equal);
40622
- return upgradeLinkedSignalGetter(getter);
40623
- }
40624
- }
40625
- function upgradeLinkedSignalGetter(getter) {
40626
- if (ngDevMode) {
40627
- getter.toString = () => `[LinkedSignal: ${getter()}]`;
40628
- }
40629
- const node = getter[SIGNAL$1];
40630
- const upgradedGetter = getter;
40631
- upgradedGetter.set = (newValue) => linkedSignalSetFn$1(node, newValue);
40632
- upgradedGetter.update = (updateFn) => linkedSignalUpdateFn$1(node, updateFn);
40633
- upgradedGetter.asReadonly = signalAsReadonlyFn.bind(getter);
40634
- return upgradedGetter;
40635
- }
40636
-
40637
- /**
40638
- * Execute an arbitrary function in a non-reactive (non-tracking) context. The executed function
40639
- * can, optionally, return a value.
40640
- */
40641
- function untracked(nonReactiveReadsFn) {
40642
- const prevConsumer = setActiveConsumer$1(null);
40643
- // We are not trying to catch any particular errors here, just making sure that the consumers
40644
- // stack is restored in case of errors.
40645
- try {
40646
- return nonReactiveReadsFn();
40647
- }
40648
- finally {
40649
- setActiveConsumer$1(prevConsumer);
40650
- }
40651
- }
40652
-
40653
40638
  /**
40654
40639
  * Controls whether effects use the legacy `microtaskEffect` by default.
40655
40640
  */
@@ -40736,7 +40721,6 @@ function effect$1() { }
40736
40721
  * Create a global `Effect` for the given reactive function.
40737
40722
  */
40738
40723
  function microtaskEffect(effectFn, options) {
40739
- performanceMarkFeature('NgSignals');
40740
40724
  ngDevMode &&
40741
40725
  assertNotInReactiveContext(effect$1, 'Call `effect` outside of a reactive context. For example, schedule the ' +
40742
40726
  'effect inside the component constructor.');
@@ -40809,7 +40793,6 @@ function effect(effectFn, options) {
40809
40793
  }
40810
40794
  return microtaskEffect(effectFn, options);
40811
40795
  }
40812
- performanceMarkFeature('NgSignals');
40813
40796
  ngDevMode &&
40814
40797
  assertNotInReactiveContext(effect, 'Call `effect` outside of a reactive context. For example, schedule the ' +
40815
40798
  'effect inside the component constructor.');
@@ -40963,163 +40946,6 @@ function createRootEffect(fn, scheduler, notifier) {
40963
40946
  return node;
40964
40947
  }
40965
40948
 
40966
- const NOT_SET = Symbol('NOT_SET');
40967
- const EMPTY_CLEANUP_SET = new Set();
40968
- const AFTER_RENDER_PHASE_EFFECT_NODE = /* @__PURE__ */ (() => ({
40969
- ...SIGNAL_NODE$1,
40970
- consumerIsAlwaysLive: true,
40971
- consumerAllowSignalWrites: true,
40972
- value: NOT_SET,
40973
- cleanup: null,
40974
- /** Called when the effect becomes dirty */
40975
- consumerMarkedDirty() {
40976
- if (this.sequence.impl.executing) {
40977
- // If hooks are in the middle of executing, then it matters whether this node has yet been
40978
- // executed within its sequence. If not, then we don't want to notify the scheduler since
40979
- // this node will be reached naturally.
40980
- if (this.sequence.lastPhase === null || this.sequence.lastPhase < this.phase) {
40981
- return;
40982
- }
40983
- // If during the execution of a later phase an earlier phase became dirty, then we should not
40984
- // run any further phases until the earlier one reruns.
40985
- this.sequence.erroredOrDestroyed = true;
40986
- }
40987
- // Either hooks are not running, or we're marking a node dirty that has already run within its
40988
- // sequence.
40989
- this.sequence.scheduler.notify(7 /* NotificationSource.RenderHook */);
40990
- },
40991
- phaseFn(previousValue) {
40992
- this.sequence.lastPhase = this.phase;
40993
- if (!this.dirty) {
40994
- return this.signal;
40995
- }
40996
- this.dirty = false;
40997
- if (this.value !== NOT_SET && !consumerPollProducersForChange$1(this)) {
40998
- // None of our producers report a change since the last time they were read, so no
40999
- // recomputation of our value is necessary.
41000
- return this.signal;
41001
- }
41002
- // Run any needed cleanup functions.
41003
- try {
41004
- for (const cleanupFn of this.cleanup ?? EMPTY_CLEANUP_SET) {
41005
- cleanupFn();
41006
- }
41007
- }
41008
- finally {
41009
- // Even if a cleanup function errors, ensure it's cleared.
41010
- this.cleanup?.clear();
41011
- }
41012
- // Prepare to call the user's effect callback. If there was a previous phase, then it gave us
41013
- // its value as a `Signal`, otherwise `previousValue` will be `undefined`.
41014
- const args = [];
41015
- if (previousValue !== undefined) {
41016
- args.push(previousValue);
41017
- }
41018
- args.push(this.registerCleanupFn);
41019
- // Call the user's callback in our reactive context.
41020
- const prevConsumer = consumerBeforeComputation$1(this);
41021
- let newValue;
41022
- try {
41023
- newValue = this.userFn.apply(null, args);
41024
- }
41025
- finally {
41026
- consumerAfterComputation$1(this, prevConsumer);
41027
- }
41028
- if (this.value === NOT_SET || !this.equal(this.value, newValue)) {
41029
- this.value = newValue;
41030
- this.version++;
41031
- }
41032
- return this.signal;
41033
- },
41034
- }))();
41035
- /**
41036
- * An `AfterRenderSequence` that manages an `afterRenderEffect`'s phase effects.
41037
- */
41038
- class AfterRenderEffectSequence extends AfterRenderSequence {
41039
- scheduler;
41040
- /**
41041
- * While this sequence is executing, this tracks the last phase which was called by the
41042
- * `afterRender` machinery.
41043
- *
41044
- * When a phase effect is marked dirty, this is used to determine whether it's already run or not.
41045
- */
41046
- lastPhase = null;
41047
- /**
41048
- * The reactive nodes for each phase, if a phase effect is defined for that phase.
41049
- *
41050
- * These are initialized to `undefined` but set in the constructor.
41051
- */
41052
- nodes = [undefined, undefined, undefined, undefined];
41053
- constructor(impl, effectHooks, view, scheduler, destroyRef, snapshot = null) {
41054
- // Note that we also initialize the underlying `AfterRenderSequence` hooks to `undefined` and
41055
- // populate them as we create reactive nodes below.
41056
- super(impl, [undefined, undefined, undefined, undefined], view, false, destroyRef, snapshot);
41057
- this.scheduler = scheduler;
41058
- // Setup a reactive node for each phase.
41059
- for (const phase of AFTER_RENDER_PHASES) {
41060
- const effectHook = effectHooks[phase];
41061
- if (effectHook === undefined) {
41062
- continue;
41063
- }
41064
- const node = Object.create(AFTER_RENDER_PHASE_EFFECT_NODE);
41065
- node.sequence = this;
41066
- node.phase = phase;
41067
- node.userFn = effectHook;
41068
- node.dirty = true;
41069
- node.signal = (() => {
41070
- producerAccessed$1(node);
41071
- return node.value;
41072
- });
41073
- node.signal[SIGNAL$1] = node;
41074
- node.registerCleanupFn = (fn) => (node.cleanup ??= new Set()).add(fn);
41075
- this.nodes[phase] = node;
41076
- // Install the upstream hook which runs the `phaseFn` for this phase.
41077
- this.hooks[phase] = (value) => node.phaseFn(value);
41078
- }
41079
- }
41080
- afterRun() {
41081
- super.afterRun();
41082
- // We're done running this sequence, so reset `lastPhase`.
41083
- this.lastPhase = null;
41084
- }
41085
- destroy() {
41086
- super.destroy();
41087
- // Run the cleanup functions for each node.
41088
- for (const node of this.nodes) {
41089
- for (const fn of node?.cleanup ?? EMPTY_CLEANUP_SET) {
41090
- fn();
41091
- }
41092
- }
41093
- }
41094
- }
41095
- /**
41096
- * @experimental
41097
- */
41098
- function afterRenderEffect(callbackOrSpec, options) {
41099
- ngDevMode &&
41100
- assertNotInReactiveContext(afterRenderEffect, 'Call `afterRenderEffect` outside of a reactive context. For example, create the render ' +
41101
- 'effect inside the component constructor`.');
41102
- !options?.injector && assertInInjectionContext(afterRenderEffect);
41103
- if (typeof ngServerMode !== 'undefined' && ngServerMode) {
41104
- return NOOP_AFTER_RENDER_REF;
41105
- }
41106
- const injector = options?.injector ?? inject(Injector);
41107
- const scheduler = injector.get(ChangeDetectionScheduler);
41108
- const manager = injector.get(AfterRenderManager);
41109
- const tracing = injector.get(TracingService, null, { optional: true });
41110
- manager.impl ??= injector.get(AfterRenderImpl);
41111
- let spec = callbackOrSpec;
41112
- if (typeof spec === 'function') {
41113
- spec = { mixedReadWrite: callbackOrSpec };
41114
- }
41115
- const viewContext = injector.get(ViewContext, null, { optional: true });
41116
- const sequence = new AfterRenderEffectSequence(manager.impl, [spec.earlyRead, spec.write, spec.mixedReadWrite, spec.read], viewContext?.view, scheduler, injector.get(DestroyRef), tracing?.snapshot(null));
41117
- manager.impl.register(sequence);
41118
- return sequence;
41119
- }
41120
-
41121
- // This file exists to allow the set of reactivity exports to be modified in g3, as these APIs are
41122
-
41123
40949
  /**
41124
40950
  * Status of a `Resource`.
41125
40951
  *
@@ -41161,6 +40987,29 @@ var ResourceStatus;
41161
40987
  ResourceStatus[ResourceStatus["Local"] = 5] = "Local";
41162
40988
  })(ResourceStatus || (ResourceStatus = {}));
41163
40989
 
40990
+ const identityFn = (v) => v;
40991
+ function linkedSignal(optionsOrComputation, options) {
40992
+ if (typeof optionsOrComputation === 'function') {
40993
+ const getter = createLinkedSignal$1(optionsOrComputation, (identityFn), options?.equal);
40994
+ return upgradeLinkedSignalGetter(getter);
40995
+ }
40996
+ else {
40997
+ const getter = createLinkedSignal$1(optionsOrComputation.source, optionsOrComputation.computation, optionsOrComputation.equal);
40998
+ return upgradeLinkedSignalGetter(getter);
40999
+ }
41000
+ }
41001
+ function upgradeLinkedSignalGetter(getter) {
41002
+ if (ngDevMode) {
41003
+ getter.toString = () => `[LinkedSignal: ${getter()}]`;
41004
+ }
41005
+ const node = getter[SIGNAL$1];
41006
+ const upgradedGetter = getter;
41007
+ upgradedGetter.set = (newValue) => linkedSignalSetFn$1(node, newValue);
41008
+ upgradedGetter.update = (updateFn) => linkedSignalUpdateFn$1(node, updateFn);
41009
+ upgradedGetter.asReadonly = signalAsReadonlyFn.bind(getter);
41010
+ return upgradedGetter;
41011
+ }
41012
+
41164
41013
  function resource(options) {
41165
41014
  options?.injector || assertInInjectionContext(resource);
41166
41015
  const request = (options.request ?? (() => null));
@@ -41429,6 +41278,334 @@ function isResolved(state) {
41429
41278
  return state.error === undefined;
41430
41279
  }
41431
41280
 
41281
+ /*!
41282
+ * @license
41283
+ * Copyright Google LLC All Rights Reserved.
41284
+ *
41285
+ * Use of this source code is governed by an MIT-style license that can be
41286
+ * found in the LICENSE file at https://angular.dev/license
41287
+ */
41288
+ /**
41289
+ * Gets the class name of the closest component to a node.
41290
+ * Warning! this function will return minified names if the name of the component is minified. The
41291
+ * consumer of the function is responsible for resolving the minified name to its original name.
41292
+ * @param node Node from which to start the search.
41293
+ */
41294
+ function getClosestComponentName(node) {
41295
+ let currentNode = node;
41296
+ while (currentNode) {
41297
+ const lView = readPatchedLView(currentNode);
41298
+ if (lView !== null) {
41299
+ for (let i = HEADER_OFFSET; i < lView.length; i++) {
41300
+ const current = lView[i];
41301
+ if ((!isLView(current) && !isLContainer(current)) || current[HOST] !== currentNode) {
41302
+ continue;
41303
+ }
41304
+ const tView = lView[TVIEW];
41305
+ const tNode = getTNode(tView, i);
41306
+ if (isComponentHost(tNode)) {
41307
+ const def = tView.data[tNode.directiveStart + tNode.componentOffset];
41308
+ const name = def.debugInfo?.className || def.type.name;
41309
+ // Note: the name may be an empty string if the class name is
41310
+ // dropped due to minification. In such cases keep going up the tree.
41311
+ if (name) {
41312
+ return name;
41313
+ }
41314
+ else {
41315
+ break;
41316
+ }
41317
+ }
41318
+ }
41319
+ }
41320
+ currentNode = currentNode.parentNode;
41321
+ }
41322
+ return null;
41323
+ }
41324
+
41325
+ /**
41326
+ * Compiles a partial directive declaration object into a full directive definition object.
41327
+ *
41328
+ * @codeGenApi
41329
+ */
41330
+ function ɵɵngDeclareDirective(decl) {
41331
+ const compiler = getCompilerFacade({
41332
+ usage: 1 /* JitCompilerUsage.PartialDeclaration */,
41333
+ kind: 'directive',
41334
+ type: decl.type,
41335
+ });
41336
+ return compiler.compileDirectiveDeclaration(angularCoreEnv, `ng:///${decl.type.name}/ɵfac.js`, decl);
41337
+ }
41338
+ /**
41339
+ * Evaluates the class metadata declaration.
41340
+ *
41341
+ * @codeGenApi
41342
+ */
41343
+ function ɵɵngDeclareClassMetadata(decl) {
41344
+ setClassMetadata(decl.type, decl.decorators, decl.ctorParameters ?? null, decl.propDecorators ?? null);
41345
+ }
41346
+ /**
41347
+ * Evaluates the class metadata of a component that contains deferred blocks.
41348
+ *
41349
+ * @codeGenApi
41350
+ */
41351
+ function ɵɵngDeclareClassMetadataAsync(decl) {
41352
+ setClassMetadataAsync(decl.type, decl.resolveDeferredDeps, (...types) => {
41353
+ const meta = decl.resolveMetadata(...types);
41354
+ setClassMetadata(decl.type, meta.decorators, meta.ctorParameters, meta.propDecorators);
41355
+ });
41356
+ }
41357
+ /**
41358
+ * Compiles a partial component declaration object into a full component definition object.
41359
+ *
41360
+ * @codeGenApi
41361
+ */
41362
+ function ɵɵngDeclareComponent(decl) {
41363
+ const compiler = getCompilerFacade({
41364
+ usage: 1 /* JitCompilerUsage.PartialDeclaration */,
41365
+ kind: 'component',
41366
+ type: decl.type,
41367
+ });
41368
+ return compiler.compileComponentDeclaration(angularCoreEnv, `ng:///${decl.type.name}/ɵcmp.js`, decl);
41369
+ }
41370
+ /**
41371
+ * Compiles a partial pipe declaration object into a full pipe definition object.
41372
+ *
41373
+ * @codeGenApi
41374
+ */
41375
+ function ɵɵngDeclareFactory(decl) {
41376
+ const compiler = getCompilerFacade({
41377
+ usage: 1 /* JitCompilerUsage.PartialDeclaration */,
41378
+ kind: getFactoryKind(decl.target),
41379
+ type: decl.type,
41380
+ });
41381
+ return compiler.compileFactoryDeclaration(angularCoreEnv, `ng:///${decl.type.name}/ɵfac.js`, decl);
41382
+ }
41383
+ function getFactoryKind(target) {
41384
+ switch (target) {
41385
+ case FactoryTarget.Directive:
41386
+ return 'directive';
41387
+ case FactoryTarget.Component:
41388
+ return 'component';
41389
+ case FactoryTarget.Injectable:
41390
+ return 'injectable';
41391
+ case FactoryTarget.Pipe:
41392
+ return 'pipe';
41393
+ case FactoryTarget.NgModule:
41394
+ return 'NgModule';
41395
+ }
41396
+ }
41397
+ /**
41398
+ * Compiles a partial injectable declaration object into a full injectable definition object.
41399
+ *
41400
+ * @codeGenApi
41401
+ */
41402
+ function ɵɵngDeclareInjectable(decl) {
41403
+ const compiler = getCompilerFacade({
41404
+ usage: 1 /* JitCompilerUsage.PartialDeclaration */,
41405
+ kind: 'injectable',
41406
+ type: decl.type,
41407
+ });
41408
+ return compiler.compileInjectableDeclaration(angularCoreEnv, `ng:///${decl.type.name}/ɵprov.js`, decl);
41409
+ }
41410
+ /**
41411
+ * Compiles a partial injector declaration object into a full injector definition object.
41412
+ *
41413
+ * @codeGenApi
41414
+ */
41415
+ function ɵɵngDeclareInjector(decl) {
41416
+ const compiler = getCompilerFacade({
41417
+ usage: 1 /* JitCompilerUsage.PartialDeclaration */,
41418
+ kind: 'NgModule',
41419
+ type: decl.type,
41420
+ });
41421
+ return compiler.compileInjectorDeclaration(angularCoreEnv, `ng:///${decl.type.name}/ɵinj.js`, decl);
41422
+ }
41423
+ /**
41424
+ * Compiles a partial NgModule declaration object into a full NgModule definition object.
41425
+ *
41426
+ * @codeGenApi
41427
+ */
41428
+ function ɵɵngDeclareNgModule(decl) {
41429
+ const compiler = getCompilerFacade({
41430
+ usage: 1 /* JitCompilerUsage.PartialDeclaration */,
41431
+ kind: 'NgModule',
41432
+ type: decl.type,
41433
+ });
41434
+ return compiler.compileNgModuleDeclaration(angularCoreEnv, `ng:///${decl.type.name}/ɵmod.js`, decl);
41435
+ }
41436
+ /**
41437
+ * Compiles a partial pipe declaration object into a full pipe definition object.
41438
+ *
41439
+ * @codeGenApi
41440
+ */
41441
+ function ɵɵngDeclarePipe(decl) {
41442
+ const compiler = getCompilerFacade({
41443
+ usage: 1 /* JitCompilerUsage.PartialDeclaration */,
41444
+ kind: 'pipe',
41445
+ type: decl.type,
41446
+ });
41447
+ return compiler.compilePipeDeclaration(angularCoreEnv, `ng:///${decl.type.name}/ɵpipe.js`, decl);
41448
+ }
41449
+
41450
+ // we reexport these symbols just so that they are retained during the dead code elimination
41451
+
41452
+ const NOT_SET = Symbol('NOT_SET');
41453
+ const EMPTY_CLEANUP_SET = new Set();
41454
+ const AFTER_RENDER_PHASE_EFFECT_NODE = /* @__PURE__ */ (() => ({
41455
+ ...SIGNAL_NODE$1,
41456
+ consumerIsAlwaysLive: true,
41457
+ consumerAllowSignalWrites: true,
41458
+ value: NOT_SET,
41459
+ cleanup: null,
41460
+ /** Called when the effect becomes dirty */
41461
+ consumerMarkedDirty() {
41462
+ if (this.sequence.impl.executing) {
41463
+ // If hooks are in the middle of executing, then it matters whether this node has yet been
41464
+ // executed within its sequence. If not, then we don't want to notify the scheduler since
41465
+ // this node will be reached naturally.
41466
+ if (this.sequence.lastPhase === null || this.sequence.lastPhase < this.phase) {
41467
+ return;
41468
+ }
41469
+ // If during the execution of a later phase an earlier phase became dirty, then we should not
41470
+ // run any further phases until the earlier one reruns.
41471
+ this.sequence.erroredOrDestroyed = true;
41472
+ }
41473
+ // Either hooks are not running, or we're marking a node dirty that has already run within its
41474
+ // sequence.
41475
+ this.sequence.scheduler.notify(7 /* NotificationSource.RenderHook */);
41476
+ },
41477
+ phaseFn(previousValue) {
41478
+ this.sequence.lastPhase = this.phase;
41479
+ if (!this.dirty) {
41480
+ return this.signal;
41481
+ }
41482
+ this.dirty = false;
41483
+ if (this.value !== NOT_SET && !consumerPollProducersForChange$1(this)) {
41484
+ // None of our producers report a change since the last time they were read, so no
41485
+ // recomputation of our value is necessary.
41486
+ return this.signal;
41487
+ }
41488
+ // Run any needed cleanup functions.
41489
+ try {
41490
+ for (const cleanupFn of this.cleanup ?? EMPTY_CLEANUP_SET) {
41491
+ cleanupFn();
41492
+ }
41493
+ }
41494
+ finally {
41495
+ // Even if a cleanup function errors, ensure it's cleared.
41496
+ this.cleanup?.clear();
41497
+ }
41498
+ // Prepare to call the user's effect callback. If there was a previous phase, then it gave us
41499
+ // its value as a `Signal`, otherwise `previousValue` will be `undefined`.
41500
+ const args = [];
41501
+ if (previousValue !== undefined) {
41502
+ args.push(previousValue);
41503
+ }
41504
+ args.push(this.registerCleanupFn);
41505
+ // Call the user's callback in our reactive context.
41506
+ const prevConsumer = consumerBeforeComputation$1(this);
41507
+ let newValue;
41508
+ try {
41509
+ newValue = this.userFn.apply(null, args);
41510
+ }
41511
+ finally {
41512
+ consumerAfterComputation$1(this, prevConsumer);
41513
+ }
41514
+ if (this.value === NOT_SET || !this.equal(this.value, newValue)) {
41515
+ this.value = newValue;
41516
+ this.version++;
41517
+ }
41518
+ return this.signal;
41519
+ },
41520
+ }))();
41521
+ /**
41522
+ * An `AfterRenderSequence` that manages an `afterRenderEffect`'s phase effects.
41523
+ */
41524
+ class AfterRenderEffectSequence extends AfterRenderSequence {
41525
+ scheduler;
41526
+ /**
41527
+ * While this sequence is executing, this tracks the last phase which was called by the
41528
+ * `afterRender` machinery.
41529
+ *
41530
+ * When a phase effect is marked dirty, this is used to determine whether it's already run or not.
41531
+ */
41532
+ lastPhase = null;
41533
+ /**
41534
+ * The reactive nodes for each phase, if a phase effect is defined for that phase.
41535
+ *
41536
+ * These are initialized to `undefined` but set in the constructor.
41537
+ */
41538
+ nodes = [undefined, undefined, undefined, undefined];
41539
+ constructor(impl, effectHooks, view, scheduler, destroyRef, snapshot = null) {
41540
+ // Note that we also initialize the underlying `AfterRenderSequence` hooks to `undefined` and
41541
+ // populate them as we create reactive nodes below.
41542
+ super(impl, [undefined, undefined, undefined, undefined], view, false, destroyRef, snapshot);
41543
+ this.scheduler = scheduler;
41544
+ // Setup a reactive node for each phase.
41545
+ for (const phase of AFTER_RENDER_PHASES) {
41546
+ const effectHook = effectHooks[phase];
41547
+ if (effectHook === undefined) {
41548
+ continue;
41549
+ }
41550
+ const node = Object.create(AFTER_RENDER_PHASE_EFFECT_NODE);
41551
+ node.sequence = this;
41552
+ node.phase = phase;
41553
+ node.userFn = effectHook;
41554
+ node.dirty = true;
41555
+ node.signal = (() => {
41556
+ producerAccessed$1(node);
41557
+ return node.value;
41558
+ });
41559
+ node.signal[SIGNAL$1] = node;
41560
+ node.registerCleanupFn = (fn) => (node.cleanup ??= new Set()).add(fn);
41561
+ this.nodes[phase] = node;
41562
+ // Install the upstream hook which runs the `phaseFn` for this phase.
41563
+ this.hooks[phase] = (value) => node.phaseFn(value);
41564
+ }
41565
+ }
41566
+ afterRun() {
41567
+ super.afterRun();
41568
+ // We're done running this sequence, so reset `lastPhase`.
41569
+ this.lastPhase = null;
41570
+ }
41571
+ destroy() {
41572
+ super.destroy();
41573
+ // Run the cleanup functions for each node.
41574
+ for (const node of this.nodes) {
41575
+ for (const fn of node?.cleanup ?? EMPTY_CLEANUP_SET) {
41576
+ fn();
41577
+ }
41578
+ }
41579
+ }
41580
+ }
41581
+ /**
41582
+ * @experimental
41583
+ */
41584
+ function afterRenderEffect(callbackOrSpec, options) {
41585
+ ngDevMode &&
41586
+ assertNotInReactiveContext(afterRenderEffect, 'Call `afterRenderEffect` outside of a reactive context. For example, create the render ' +
41587
+ 'effect inside the component constructor`.');
41588
+ !options?.injector && assertInInjectionContext(afterRenderEffect);
41589
+ if (typeof ngServerMode !== 'undefined' && ngServerMode) {
41590
+ return NOOP_AFTER_RENDER_REF;
41591
+ }
41592
+ const injector = options?.injector ?? inject(Injector);
41593
+ const scheduler = injector.get(ChangeDetectionScheduler);
41594
+ const manager = injector.get(AfterRenderManager);
41595
+ const tracing = injector.get(TracingService, null, { optional: true });
41596
+ manager.impl ??= injector.get(AfterRenderImpl);
41597
+ let spec = callbackOrSpec;
41598
+ if (typeof spec === 'function') {
41599
+ spec = { mixedReadWrite: callbackOrSpec };
41600
+ }
41601
+ const viewContext = injector.get(ViewContext, null, { optional: true });
41602
+ const sequence = new AfterRenderEffectSequence(manager.impl, [spec.earlyRead, spec.write, spec.mixedReadWrite, spec.read], viewContext?.view, scheduler, injector.get(DestroyRef), tracing?.snapshot(null));
41603
+ manager.impl.register(sequence);
41604
+ return sequence;
41605
+ }
41606
+
41607
+ // This file exists to allow the set of reactivity exports to be modified in g3, as these APIs are
41608
+
41432
41609
  /**
41433
41610
  * Creates a `ComponentRef` instance based on provided component type and a set of options.
41434
41611
  *
@@ -41675,5 +41852,5 @@ if (typeof ngDevMode !== 'undefined' && ngDevMode) {
41675
41852
  * Generated bundle index. Do not edit.
41676
41853
  */
41677
41854
 
41678
- 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, InjectFlags, Injectable, InjectionToken, Injector, Input, IterableDiffers, KeyValueDiffers, LOCALE_ID, MissingTranslationStrategy, ModuleWithComponentFactories, NO_ERRORS_SCHEMA, NgModule, NgModuleFactory$1 as NgModuleFactory, NgModuleRef$1 as NgModuleRef, NgProbeToken, NgZone, Optional, Output, 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, isDevMode, isSignal, isStandalone, linkedSignal, makeEnvironmentProviders, makeStateKey, mergeApplicationConfig, model, numberAttribute, output, 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, MicrotaskEffectScheduler as ɵMicrotaskEffectScheduler, 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, 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, microtaskEffect as ɵmicrotaskEffect, 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, setAlternateWeakRefImpl as ɵsetAlternateWeakRefImpl, ɵsetClassDebugInfo, setClassMetadata as ɵsetClassMetadata, setClassMetadataAsync as ɵsetClassMetadataAsync, setCurrentInjector as ɵsetCurrentInjector, setDocument as ɵsetDocument, setInjectorProfilerContext as ɵsetInjectorProfilerContext, setLocaleId as ɵsetLocaleId, ɵsetUnknownElementStrictMode, ɵsetUnknownPropertyStrictMode, startMeasuring as ɵstartMeasuring, stopMeasuring as ɵstopMeasuring, store as ɵstore, stringify as ɵstringify, transitiveScopesFor as ɵtransitiveScopesFor, triggerResourceLoading as ɵtriggerResourceLoading, truncateMiddle as ɵtruncateMiddle, unregisterAllLocaleData as ɵunregisterLocaleData, unwrapSafeValue as ɵunwrapSafeValue, ɵunwrapWritableSignal, withDomHydration as ɵwithDomHydration, withEventReplay as ɵwithEventReplay, withI18nSupport as ɵwithI18nSupport, withIncrementalHydration as ɵwithIncrementalHydration, ɵɵCopyDefinitionFeature, ɵɵExternalStylesFeature, FactoryTarget as ɵɵFactoryTarget, ɵɵHostDirectivesFeature, ɵɵInheritDefinitionFeature, ɵɵInputTransformsFeature, ɵɵ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 };
41855
+ 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, InjectFlags, Injectable, InjectionToken, Injector, Input, IterableDiffers, KeyValueDiffers, LOCALE_ID, MissingTranslationStrategy, ModuleWithComponentFactories, NO_ERRORS_SCHEMA, NgModule, NgModuleFactory$1 as NgModuleFactory, NgModuleRef$1 as NgModuleRef, NgProbeToken, NgZone, Optional, Output, 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, isDevMode, isSignal, isStandalone, linkedSignal, makeEnvironmentProviders, makeStateKey, mergeApplicationConfig, model, numberAttribute, output, 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, MicrotaskEffectScheduler as ɵMicrotaskEffectScheduler, 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, microtaskEffect as ɵmicrotaskEffect, 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, setAlternateWeakRefImpl as ɵsetAlternateWeakRefImpl, ɵsetClassDebugInfo, setClassMetadata as ɵsetClassMetadata, setClassMetadataAsync as ɵsetClassMetadataAsync, setCurrentInjector as ɵsetCurrentInjector, setDocument as ɵsetDocument, setInjectorProfilerContext as ɵsetInjectorProfilerContext, setLocaleId as ɵsetLocaleId, ɵsetUnknownElementStrictMode, ɵsetUnknownPropertyStrictMode, startMeasuring as ɵstartMeasuring, stopMeasuring as ɵstopMeasuring, store as ɵstore, stringify as ɵstringify, transitiveScopesFor as ɵtransitiveScopesFor, triggerResourceLoading as ɵtriggerResourceLoading, truncateMiddle as ɵtruncateMiddle, unregisterAllLocaleData as ɵunregisterLocaleData, unwrapSafeValue as ɵunwrapSafeValue, ɵunwrapWritableSignal, withDomHydration as ɵwithDomHydration, withEventReplay as ɵwithEventReplay, withI18nSupport as ɵwithI18nSupport, withIncrementalHydration as ɵwithIncrementalHydration, ɵɵCopyDefinitionFeature, ɵɵExternalStylesFeature, FactoryTarget as ɵɵFactoryTarget, ɵɵHostDirectivesFeature, ɵɵInheritDefinitionFeature, ɵɵNgOnChangesFeature, ɵɵProvidersFeature, ɵɵadvance, ɵɵattachSourceLocations, ɵɵattribute, ɵɵattributeInterpolate1, ɵɵattributeInterpolate2, ɵɵattributeInterpolate3, ɵɵattributeInterpolate4, ɵɵattributeInterpolate5, ɵɵattributeInterpolate6, ɵɵattributeInterpolate7, ɵɵattributeInterpolate8, ɵɵattributeInterpolateV, ɵɵclassMap, ɵɵclassMapInterpolate1, ɵɵclassMapInterpolate2, ɵɵclassMapInterpolate3, ɵɵclassMapInterpolate4, ɵɵclassMapInterpolate5, ɵɵclassMapInterpolate6, ɵɵclassMapInterpolate7, ɵɵclassMapInterpolate8, ɵɵclassMapInterpolateV, ɵɵclassProp, ɵɵcomponentInstance, ɵɵconditional, ɵɵ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 };
41679
41856
  //# sourceMappingURL=core.mjs.map