@angular/compiler 19.0.0-next.4 → 19.0.0-next.6

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.
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @license Angular v19.0.0-next.4
2
+ * @license Angular v19.0.0-next.6
3
3
  * (c) 2010-2024 Google LLC. https://angular.io/
4
4
  * License: MIT
5
5
  */
@@ -2693,6 +2693,32 @@ class Identifiers {
2693
2693
  name: 'ɵɵdeferPrefetchOnViewport',
2694
2694
  moduleName: CORE,
2695
2695
  }; }
2696
+ static { this.deferHydrateWhen = { name: 'ɵɵdeferHydrateWhen', moduleName: CORE }; }
2697
+ static { this.deferHydrateNever = { name: 'ɵɵdeferHydrateNever', moduleName: CORE }; }
2698
+ static { this.deferHydrateOnIdle = {
2699
+ name: 'ɵɵdeferHydrateOnIdle',
2700
+ moduleName: CORE,
2701
+ }; }
2702
+ static { this.deferHydrateOnImmediate = {
2703
+ name: 'ɵɵdeferHydrateOnImmediate',
2704
+ moduleName: CORE,
2705
+ }; }
2706
+ static { this.deferHydrateOnTimer = {
2707
+ name: 'ɵɵdeferHydrateOnTimer',
2708
+ moduleName: CORE,
2709
+ }; }
2710
+ static { this.deferHydrateOnHover = {
2711
+ name: 'ɵɵdeferHydrateOnHover',
2712
+ moduleName: CORE,
2713
+ }; }
2714
+ static { this.deferHydrateOnInteraction = {
2715
+ name: 'ɵɵdeferHydrateOnInteraction',
2716
+ moduleName: CORE,
2717
+ }; }
2718
+ static { this.deferHydrateOnViewport = {
2719
+ name: 'ɵɵdeferHydrateOnViewport',
2720
+ moduleName: CORE,
2721
+ }; }
2696
2722
  static { this.deferEnableTimerScheduling = {
2697
2723
  name: 'ɵɵdeferEnableTimerScheduling',
2698
2724
  moduleName: CORE,
@@ -4902,49 +4928,52 @@ class Element$1 {
4902
4928
  }
4903
4929
  }
4904
4930
  class DeferredTrigger {
4905
- constructor(nameSpan, sourceSpan, prefetchSpan, whenOrOnSourceSpan) {
4931
+ constructor(nameSpan, sourceSpan, prefetchSpan, whenOrOnSourceSpan, hydrateSpan) {
4906
4932
  this.nameSpan = nameSpan;
4907
4933
  this.sourceSpan = sourceSpan;
4908
4934
  this.prefetchSpan = prefetchSpan;
4909
4935
  this.whenOrOnSourceSpan = whenOrOnSourceSpan;
4936
+ this.hydrateSpan = hydrateSpan;
4910
4937
  }
4911
4938
  visit(visitor) {
4912
4939
  return visitor.visitDeferredTrigger(this);
4913
4940
  }
4914
4941
  }
4915
4942
  class BoundDeferredTrigger extends DeferredTrigger {
4916
- constructor(value, sourceSpan, prefetchSpan, whenSourceSpan) {
4943
+ constructor(value, sourceSpan, prefetchSpan, whenSourceSpan, hydrateSpan) {
4917
4944
  // BoundDeferredTrigger is for 'when' triggers. These aren't really "triggers" and don't have a
4918
4945
  // nameSpan. Trigger names are the built in event triggers like hover, interaction, etc.
4919
- super(/** nameSpan */ null, sourceSpan, prefetchSpan, whenSourceSpan);
4946
+ super(/** nameSpan */ null, sourceSpan, prefetchSpan, whenSourceSpan, hydrateSpan);
4920
4947
  this.value = value;
4921
4948
  }
4922
4949
  }
4950
+ class NeverDeferredTrigger extends DeferredTrigger {
4951
+ }
4923
4952
  class IdleDeferredTrigger extends DeferredTrigger {
4924
4953
  }
4925
4954
  class ImmediateDeferredTrigger extends DeferredTrigger {
4926
4955
  }
4927
4956
  class HoverDeferredTrigger extends DeferredTrigger {
4928
- constructor(reference, nameSpan, sourceSpan, prefetchSpan, onSourceSpan) {
4929
- super(nameSpan, sourceSpan, prefetchSpan, onSourceSpan);
4957
+ constructor(reference, nameSpan, sourceSpan, prefetchSpan, onSourceSpan, hydrateSpan) {
4958
+ super(nameSpan, sourceSpan, prefetchSpan, onSourceSpan, hydrateSpan);
4930
4959
  this.reference = reference;
4931
4960
  }
4932
4961
  }
4933
4962
  class TimerDeferredTrigger extends DeferredTrigger {
4934
- constructor(delay, nameSpan, sourceSpan, prefetchSpan, onSourceSpan) {
4935
- super(nameSpan, sourceSpan, prefetchSpan, onSourceSpan);
4963
+ constructor(delay, nameSpan, sourceSpan, prefetchSpan, onSourceSpan, hydrateSpan) {
4964
+ super(nameSpan, sourceSpan, prefetchSpan, onSourceSpan, hydrateSpan);
4936
4965
  this.delay = delay;
4937
4966
  }
4938
4967
  }
4939
4968
  class InteractionDeferredTrigger extends DeferredTrigger {
4940
- constructor(reference, nameSpan, sourceSpan, prefetchSpan, onSourceSpan) {
4941
- super(nameSpan, sourceSpan, prefetchSpan, onSourceSpan);
4969
+ constructor(reference, nameSpan, sourceSpan, prefetchSpan, onSourceSpan, hydrateSpan) {
4970
+ super(nameSpan, sourceSpan, prefetchSpan, onSourceSpan, hydrateSpan);
4942
4971
  this.reference = reference;
4943
4972
  }
4944
4973
  }
4945
4974
  class ViewportDeferredTrigger extends DeferredTrigger {
4946
- constructor(reference, nameSpan, sourceSpan, prefetchSpan, onSourceSpan) {
4947
- super(nameSpan, sourceSpan, prefetchSpan, onSourceSpan);
4975
+ constructor(reference, nameSpan, sourceSpan, prefetchSpan, onSourceSpan, hydrateSpan) {
4976
+ super(nameSpan, sourceSpan, prefetchSpan, onSourceSpan, hydrateSpan);
4948
4977
  this.reference = reference;
4949
4978
  }
4950
4979
  }
@@ -4990,7 +5019,7 @@ class DeferredBlockError extends BlockNode {
4990
5019
  }
4991
5020
  }
4992
5021
  class DeferredBlock extends BlockNode {
4993
- constructor(children, triggers, prefetchTriggers, placeholder, loading, error, nameSpan, sourceSpan, mainBlockSpan, startSourceSpan, endSourceSpan, i18n) {
5022
+ constructor(children, triggers, prefetchTriggers, hydrateTriggers, placeholder, loading, error, nameSpan, sourceSpan, mainBlockSpan, startSourceSpan, endSourceSpan, i18n) {
4994
5023
  super(nameSpan, sourceSpan, startSourceSpan, endSourceSpan);
4995
5024
  this.children = children;
4996
5025
  this.placeholder = placeholder;
@@ -5000,15 +5029,19 @@ class DeferredBlock extends BlockNode {
5000
5029
  this.i18n = i18n;
5001
5030
  this.triggers = triggers;
5002
5031
  this.prefetchTriggers = prefetchTriggers;
5032
+ this.hydrateTriggers = hydrateTriggers;
5003
5033
  // We cache the keys since we know that they won't change and we
5004
5034
  // don't want to enumarate them every time we're traversing the AST.
5005
5035
  this.definedTriggers = Object.keys(triggers);
5006
5036
  this.definedPrefetchTriggers = Object.keys(prefetchTriggers);
5037
+ this.definedHydrateTriggers = Object.keys(hydrateTriggers);
5007
5038
  }
5008
5039
  visit(visitor) {
5009
5040
  return visitor.visitDeferredBlock(this);
5010
5041
  }
5011
5042
  visitAll(visitor) {
5043
+ // Visit the hydrate triggers first to match their insertion order.
5044
+ this.visitTriggers(this.definedHydrateTriggers, this.hydrateTriggers, visitor);
5012
5045
  this.visitTriggers(this.definedTriggers, this.triggers, visitor);
5013
5046
  this.visitTriggers(this.definedPrefetchTriggers, this.prefetchTriggers, visitor);
5014
5047
  visitAll$1(visitor, this.children);
@@ -8630,6 +8663,7 @@ var DeferTriggerKind;
8630
8663
  DeferTriggerKind[DeferTriggerKind["Hover"] = 3] = "Hover";
8631
8664
  DeferTriggerKind[DeferTriggerKind["Interaction"] = 4] = "Interaction";
8632
8665
  DeferTriggerKind[DeferTriggerKind["Viewport"] = 5] = "Viewport";
8666
+ DeferTriggerKind[DeferTriggerKind["Never"] = 6] = "Never";
8633
8667
  })(DeferTriggerKind || (DeferTriggerKind = {}));
8634
8668
  /**
8635
8669
  * Kinds of i18n contexts. They can be created because of root i18n blocks, or ICUs.
@@ -8944,12 +8978,12 @@ function createRepeaterOp(repeaterCreate, targetSlot, collection, sourceSpan) {
8944
8978
  ...TRAIT_DEPENDS_ON_SLOT_CONTEXT,
8945
8979
  };
8946
8980
  }
8947
- function createDeferWhenOp(target, expr, prefetch, sourceSpan) {
8981
+ function createDeferWhenOp(target, expr, modifier, sourceSpan) {
8948
8982
  return {
8949
8983
  kind: OpKind.DeferWhen,
8950
8984
  target,
8951
8985
  expr,
8952
- prefetch,
8986
+ modifier,
8953
8987
  sourceSpan,
8954
8988
  ...NEW_OP,
8955
8989
  ...TRAIT_DEPENDS_ON_SLOT_CONTEXT,
@@ -10508,12 +10542,12 @@ function createDeferOp(xref, main, mainSlot, ownResolverFn, resolverFn, sourceSp
10508
10542
  numSlotsUsed: 2,
10509
10543
  };
10510
10544
  }
10511
- function createDeferOnOp(defer, trigger, prefetch, sourceSpan) {
10545
+ function createDeferOnOp(defer, trigger, modifier, sourceSpan) {
10512
10546
  return {
10513
10547
  kind: OpKind.DeferOn,
10514
10548
  defer,
10515
10549
  trigger,
10516
- prefetch,
10550
+ modifier,
10517
10551
  sourceSpan,
10518
10552
  ...NEW_OP,
10519
10553
  };
@@ -11878,6 +11912,7 @@ function resolveDeferTargetNames(job) {
11878
11912
  function resolveTrigger(deferOwnerView, op, placeholderView) {
11879
11913
  switch (op.trigger.kind) {
11880
11914
  case DeferTriggerKind.Idle:
11915
+ case DeferTriggerKind.Never:
11881
11916
  case DeferTriggerKind.Immediate:
11882
11917
  case DeferTriggerKind.Timer:
11883
11918
  return;
@@ -11937,7 +11972,9 @@ function resolveDeferTargetNames(job) {
11937
11972
  break;
11938
11973
  case OpKind.DeferOn:
11939
11974
  const deferOp = defers.get(op.defer);
11940
- resolveTrigger(unit, op, deferOp.placeholderView);
11975
+ resolveTrigger(unit, op, op.modifier === "hydrate" /* ir.DeferOpModifierKind.HYDRATE */
11976
+ ? deferOp.mainView
11977
+ : deferOp.placeholderView);
11941
11978
  break;
11942
11979
  }
11943
11980
  }
@@ -21671,28 +21708,68 @@ function defer(selfSlot, primarySlot, dependencyResolverFn, loadingSlot, placeho
21671
21708
  return call(Identifiers.defer, args, sourceSpan);
21672
21709
  }
21673
21710
  const deferTriggerToR3TriggerInstructionsMap = new Map([
21674
- [DeferTriggerKind.Idle, [Identifiers.deferOnIdle, Identifiers.deferPrefetchOnIdle]],
21711
+ [
21712
+ DeferTriggerKind.Idle,
21713
+ {
21714
+ ["none" /* ir.DeferOpModifierKind.NONE */]: Identifiers.deferOnIdle,
21715
+ ["prefetch" /* ir.DeferOpModifierKind.PREFETCH */]: Identifiers.deferPrefetchOnIdle,
21716
+ ["hydrate" /* ir.DeferOpModifierKind.HYDRATE */]: Identifiers.deferHydrateOnIdle,
21717
+ },
21718
+ ],
21675
21719
  [
21676
21720
  DeferTriggerKind.Immediate,
21677
- [Identifiers.deferOnImmediate, Identifiers.deferPrefetchOnImmediate],
21721
+ {
21722
+ ["none" /* ir.DeferOpModifierKind.NONE */]: Identifiers.deferOnImmediate,
21723
+ ["prefetch" /* ir.DeferOpModifierKind.PREFETCH */]: Identifiers.deferPrefetchOnImmediate,
21724
+ ["hydrate" /* ir.DeferOpModifierKind.HYDRATE */]: Identifiers.deferHydrateOnImmediate,
21725
+ },
21726
+ ],
21727
+ [
21728
+ DeferTriggerKind.Timer,
21729
+ {
21730
+ ["none" /* ir.DeferOpModifierKind.NONE */]: Identifiers.deferOnTimer,
21731
+ ["prefetch" /* ir.DeferOpModifierKind.PREFETCH */]: Identifiers.deferPrefetchOnTimer,
21732
+ ["hydrate" /* ir.DeferOpModifierKind.HYDRATE */]: Identifiers.deferHydrateOnTimer,
21733
+ },
21734
+ ],
21735
+ [
21736
+ DeferTriggerKind.Hover,
21737
+ {
21738
+ ["none" /* ir.DeferOpModifierKind.NONE */]: Identifiers.deferOnHover,
21739
+ ["prefetch" /* ir.DeferOpModifierKind.PREFETCH */]: Identifiers.deferPrefetchOnHover,
21740
+ ["hydrate" /* ir.DeferOpModifierKind.HYDRATE */]: Identifiers.deferHydrateOnHover,
21741
+ },
21678
21742
  ],
21679
- [DeferTriggerKind.Timer, [Identifiers.deferOnTimer, Identifiers.deferPrefetchOnTimer]],
21680
- [DeferTriggerKind.Hover, [Identifiers.deferOnHover, Identifiers.deferPrefetchOnHover]],
21681
21743
  [
21682
21744
  DeferTriggerKind.Interaction,
21683
- [Identifiers.deferOnInteraction, Identifiers.deferPrefetchOnInteraction],
21745
+ {
21746
+ ["none" /* ir.DeferOpModifierKind.NONE */]: Identifiers.deferOnInteraction,
21747
+ ["prefetch" /* ir.DeferOpModifierKind.PREFETCH */]: Identifiers.deferPrefetchOnInteraction,
21748
+ ["hydrate" /* ir.DeferOpModifierKind.HYDRATE */]: Identifiers.deferHydrateOnInteraction,
21749
+ },
21684
21750
  ],
21685
21751
  [
21686
21752
  DeferTriggerKind.Viewport,
21687
- [Identifiers.deferOnViewport, Identifiers.deferPrefetchOnViewport],
21753
+ {
21754
+ ["none" /* ir.DeferOpModifierKind.NONE */]: Identifiers.deferOnViewport,
21755
+ ["prefetch" /* ir.DeferOpModifierKind.PREFETCH */]: Identifiers.deferPrefetchOnViewport,
21756
+ ["hydrate" /* ir.DeferOpModifierKind.HYDRATE */]: Identifiers.deferHydrateOnViewport,
21757
+ },
21758
+ ],
21759
+ [
21760
+ DeferTriggerKind.Never,
21761
+ {
21762
+ ["none" /* ir.DeferOpModifierKind.NONE */]: Identifiers.deferHydrateNever,
21763
+ ["prefetch" /* ir.DeferOpModifierKind.PREFETCH */]: Identifiers.deferHydrateNever,
21764
+ ["hydrate" /* ir.DeferOpModifierKind.HYDRATE */]: Identifiers.deferHydrateNever,
21765
+ },
21688
21766
  ],
21689
21767
  ]);
21690
- function deferOn(trigger, args, prefetch, sourceSpan) {
21691
- const instructions = deferTriggerToR3TriggerInstructionsMap.get(trigger);
21692
- if (instructions === undefined) {
21768
+ function deferOn(trigger, args, modifier, sourceSpan) {
21769
+ const instructionToCall = deferTriggerToR3TriggerInstructionsMap.get(trigger)?.[modifier];
21770
+ if (instructionToCall === undefined) {
21693
21771
  throw new Error(`Unable to determine instruction for trigger ${trigger}`);
21694
21772
  }
21695
- const instructionToCall = prefetch ? instructions[1] : instructions[0];
21696
21773
  return call(instructionToCall, args.map((a) => literal(a)), sourceSpan);
21697
21774
  }
21698
21775
  function projectionDef(def) {
@@ -21748,8 +21825,14 @@ function repeaterCreate(slot, viewFnName, decls, vars, tag, constIndex, trackByF
21748
21825
  function repeater(collection, sourceSpan) {
21749
21826
  return call(Identifiers.repeater, [collection], sourceSpan);
21750
21827
  }
21751
- function deferWhen(prefetch, expr, sourceSpan) {
21752
- return call(prefetch ? Identifiers.deferPrefetchWhen : Identifiers.deferWhen, [expr], sourceSpan);
21828
+ function deferWhen(modifier, expr, sourceSpan) {
21829
+ if (modifier === "prefetch" /* ir.DeferOpModifierKind.PREFETCH */) {
21830
+ return call(Identifiers.deferPrefetchWhen, [expr], sourceSpan);
21831
+ }
21832
+ else if (modifier === "hydrate" /* ir.DeferOpModifierKind.HYDRATE */) {
21833
+ return call(Identifiers.deferHydrateWhen, [expr], sourceSpan);
21834
+ }
21835
+ return call(Identifiers.deferWhen, [expr], sourceSpan);
21753
21836
  }
21754
21837
  function declareLet(slot, sourceSpan) {
21755
21838
  return call(Identifiers.declareLet, [literal(slot)], sourceSpan);
@@ -22238,6 +22321,7 @@ function reifyCreateOperations(unit, ops) {
22238
22321
  case OpKind.DeferOn:
22239
22322
  let args = [];
22240
22323
  switch (op.trigger.kind) {
22324
+ case DeferTriggerKind.Never:
22241
22325
  case DeferTriggerKind.Idle:
22242
22326
  case DeferTriggerKind.Immediate:
22243
22327
  break;
@@ -22247,18 +22331,24 @@ function reifyCreateOperations(unit, ops) {
22247
22331
  case DeferTriggerKind.Interaction:
22248
22332
  case DeferTriggerKind.Hover:
22249
22333
  case DeferTriggerKind.Viewport:
22250
- if (op.trigger.targetSlot?.slot == null || op.trigger.targetSlotViewSteps === null) {
22251
- throw new Error(`Slot or view steps not set in trigger reification for trigger kind ${op.trigger.kind}`);
22334
+ // `hydrate` triggers don't support targets.
22335
+ if (op.modifier === "hydrate" /* ir.DeferOpModifierKind.HYDRATE */) {
22336
+ args = [];
22252
22337
  }
22253
- args = [op.trigger.targetSlot.slot];
22254
- if (op.trigger.targetSlotViewSteps !== 0) {
22255
- args.push(op.trigger.targetSlotViewSteps);
22338
+ else {
22339
+ if (op.trigger.targetSlot?.slot == null || op.trigger.targetSlotViewSteps === null) {
22340
+ throw new Error(`Slot or view steps not set in trigger reification for trigger kind ${op.trigger.kind}`);
22341
+ }
22342
+ args = [op.trigger.targetSlot.slot];
22343
+ if (op.trigger.targetSlotViewSteps !== 0) {
22344
+ args.push(op.trigger.targetSlotViewSteps);
22345
+ }
22256
22346
  }
22257
22347
  break;
22258
22348
  default:
22259
22349
  throw new Error(`AssertionError: Unsupported reification of defer trigger kind ${op.trigger.kind}`);
22260
22350
  }
22261
- OpList.replace(op, deferOn(op.trigger.kind, args, op.prefetch, op.sourceSpan));
22351
+ OpList.replace(op, deferOn(op.trigger.kind, args, op.modifier, op.sourceSpan));
22262
22352
  break;
22263
22353
  case OpKind.ProjectionDef:
22264
22354
  OpList.replace(op, projectionDef(op.def));
@@ -22416,7 +22506,7 @@ function reifyUpdateOperations(_unit, ops) {
22416
22506
  OpList.replace(op, repeater(op.collection, op.sourceSpan));
22417
22507
  break;
22418
22508
  case OpKind.DeferWhen:
22419
- OpList.replace(op, deferWhen(op.prefetch, op.expr, op.sourceSpan));
22509
+ OpList.replace(op, deferWhen(op.modifier, op.expr, op.sourceSpan));
22420
22510
  break;
22421
22511
  case OpKind.StoreLet:
22422
22512
  throw new Error(`AssertionError: unexpected storeLet ${op.declaredName}`);
@@ -24809,73 +24899,81 @@ function ingestDeferBlock(unit, deferBlock) {
24809
24899
  // Configure all defer `on` conditions.
24810
24900
  // TODO: refactor prefetch triggers to use a separate op type, with a shared superclass. This will
24811
24901
  // make it easier to refactor prefetch behavior in the future.
24812
- let prefetch = false;
24813
- let deferOnOps = [];
24814
- let deferWhenOps = [];
24815
- for (const triggers of [deferBlock.triggers, deferBlock.prefetchTriggers]) {
24816
- if (triggers.idle !== undefined) {
24817
- const deferOnOp = createDeferOnOp(deferXref, { kind: DeferTriggerKind.Idle }, prefetch, triggers.idle.sourceSpan);
24818
- deferOnOps.push(deferOnOp);
24819
- }
24820
- if (triggers.immediate !== undefined) {
24821
- const deferOnOp = createDeferOnOp(deferXref, { kind: DeferTriggerKind.Immediate }, prefetch, triggers.immediate.sourceSpan);
24822
- deferOnOps.push(deferOnOp);
24823
- }
24824
- if (triggers.timer !== undefined) {
24825
- const deferOnOp = createDeferOnOp(deferXref, { kind: DeferTriggerKind.Timer, delay: triggers.timer.delay }, prefetch, triggers.timer.sourceSpan);
24826
- deferOnOps.push(deferOnOp);
24827
- }
24828
- if (triggers.hover !== undefined) {
24829
- const deferOnOp = createDeferOnOp(deferXref, {
24830
- kind: DeferTriggerKind.Hover,
24831
- targetName: triggers.hover.reference,
24832
- targetXref: null,
24833
- targetSlot: null,
24834
- targetView: null,
24835
- targetSlotViewSteps: null,
24836
- }, prefetch, triggers.hover.sourceSpan);
24837
- deferOnOps.push(deferOnOp);
24838
- }
24839
- if (triggers.interaction !== undefined) {
24840
- const deferOnOp = createDeferOnOp(deferXref, {
24841
- kind: DeferTriggerKind.Interaction,
24842
- targetName: triggers.interaction.reference,
24843
- targetXref: null,
24844
- targetSlot: null,
24845
- targetView: null,
24846
- targetSlotViewSteps: null,
24847
- }, prefetch, triggers.interaction.sourceSpan);
24848
- deferOnOps.push(deferOnOp);
24849
- }
24850
- if (triggers.viewport !== undefined) {
24851
- const deferOnOp = createDeferOnOp(deferXref, {
24852
- kind: DeferTriggerKind.Viewport,
24853
- targetName: triggers.viewport.reference,
24854
- targetXref: null,
24855
- targetSlot: null,
24856
- targetView: null,
24857
- targetSlotViewSteps: null,
24858
- }, prefetch, triggers.viewport.sourceSpan);
24859
- deferOnOps.push(deferOnOp);
24860
- }
24861
- if (triggers.when !== undefined) {
24862
- if (triggers.when.value instanceof Interpolation$1) {
24863
- // TemplateDefinitionBuilder supports this case, but it's very strange to me. What would it
24864
- // even mean?
24865
- throw new Error(`Unexpected interpolation in defer block when trigger`);
24866
- }
24867
- const deferOnOp = createDeferWhenOp(deferXref, convertAst(triggers.when.value, unit.job, triggers.when.sourceSpan), prefetch, triggers.when.sourceSpan);
24868
- deferWhenOps.push(deferOnOp);
24869
- }
24870
- // If no (non-prefetching) defer triggers were provided, default to `idle`.
24871
- if (deferOnOps.length === 0 && deferWhenOps.length === 0) {
24872
- deferOnOps.push(createDeferOnOp(deferXref, { kind: DeferTriggerKind.Idle }, false, null));
24873
- }
24874
- prefetch = true;
24902
+ const deferOnOps = [];
24903
+ const deferWhenOps = [];
24904
+ // Ingest the hydrate triggers first since they set up all the other triggers during SSR.
24905
+ ingestDeferTriggers("hydrate" /* ir.DeferOpModifierKind.HYDRATE */, deferBlock.hydrateTriggers, deferOnOps, deferWhenOps, unit, deferXref);
24906
+ ingestDeferTriggers("none" /* ir.DeferOpModifierKind.NONE */, deferBlock.triggers, deferOnOps, deferWhenOps, unit, deferXref);
24907
+ ingestDeferTriggers("prefetch" /* ir.DeferOpModifierKind.PREFETCH */, deferBlock.prefetchTriggers, deferOnOps, deferWhenOps, unit, deferXref);
24908
+ // If no (non-prefetching or hydrating) defer triggers were provided, default to `idle`.
24909
+ const hasConcreteTrigger = deferOnOps.some((op) => op.modifier === "none" /* ir.DeferOpModifierKind.NONE */) ||
24910
+ deferWhenOps.some((op) => op.modifier === "none" /* ir.DeferOpModifierKind.NONE */);
24911
+ if (!hasConcreteTrigger) {
24912
+ deferOnOps.push(createDeferOnOp(deferXref, { kind: DeferTriggerKind.Idle }, "none" /* ir.DeferOpModifierKind.NONE */, null));
24875
24913
  }
24876
24914
  unit.create.push(deferOnOps);
24877
24915
  unit.update.push(deferWhenOps);
24878
24916
  }
24917
+ function ingestDeferTriggers(modifier, triggers, onOps, whenOps, unit, deferXref) {
24918
+ if (triggers.idle !== undefined) {
24919
+ const deferOnOp = createDeferOnOp(deferXref, { kind: DeferTriggerKind.Idle }, modifier, triggers.idle.sourceSpan);
24920
+ onOps.push(deferOnOp);
24921
+ }
24922
+ if (triggers.immediate !== undefined) {
24923
+ const deferOnOp = createDeferOnOp(deferXref, { kind: DeferTriggerKind.Immediate }, modifier, triggers.immediate.sourceSpan);
24924
+ onOps.push(deferOnOp);
24925
+ }
24926
+ if (triggers.timer !== undefined) {
24927
+ const deferOnOp = createDeferOnOp(deferXref, { kind: DeferTriggerKind.Timer, delay: triggers.timer.delay }, modifier, triggers.timer.sourceSpan);
24928
+ onOps.push(deferOnOp);
24929
+ }
24930
+ if (triggers.hover !== undefined) {
24931
+ const deferOnOp = createDeferOnOp(deferXref, {
24932
+ kind: DeferTriggerKind.Hover,
24933
+ targetName: triggers.hover.reference,
24934
+ targetXref: null,
24935
+ targetSlot: null,
24936
+ targetView: null,
24937
+ targetSlotViewSteps: null,
24938
+ }, modifier, triggers.hover.sourceSpan);
24939
+ onOps.push(deferOnOp);
24940
+ }
24941
+ if (triggers.interaction !== undefined) {
24942
+ const deferOnOp = createDeferOnOp(deferXref, {
24943
+ kind: DeferTriggerKind.Interaction,
24944
+ targetName: triggers.interaction.reference,
24945
+ targetXref: null,
24946
+ targetSlot: null,
24947
+ targetView: null,
24948
+ targetSlotViewSteps: null,
24949
+ }, modifier, triggers.interaction.sourceSpan);
24950
+ onOps.push(deferOnOp);
24951
+ }
24952
+ if (triggers.viewport !== undefined) {
24953
+ const deferOnOp = createDeferOnOp(deferXref, {
24954
+ kind: DeferTriggerKind.Viewport,
24955
+ targetName: triggers.viewport.reference,
24956
+ targetXref: null,
24957
+ targetSlot: null,
24958
+ targetView: null,
24959
+ targetSlotViewSteps: null,
24960
+ }, modifier, triggers.viewport.sourceSpan);
24961
+ onOps.push(deferOnOp);
24962
+ }
24963
+ if (triggers.never !== undefined) {
24964
+ const deferOnOp = createDeferOnOp(deferXref, { kind: DeferTriggerKind.Never }, modifier, triggers.never.sourceSpan);
24965
+ onOps.push(deferOnOp);
24966
+ }
24967
+ if (triggers.when !== undefined) {
24968
+ if (triggers.when.value instanceof Interpolation$1) {
24969
+ // TemplateDefinitionBuilder supports this case, but it's very strange to me. What would it
24970
+ // even mean?
24971
+ throw new Error(`Unexpected interpolation in defer block when trigger`);
24972
+ }
24973
+ const deferOnOp = createDeferWhenOp(deferXref, convertAst(triggers.when.value, unit.job, triggers.when.sourceSpan), modifier, triggers.when.sourceSpan);
24974
+ whenOps.push(deferOnOp);
24975
+ }
24976
+ }
24879
24977
  function ingestIcu(unit, icu) {
24880
24978
  if (icu.i18n instanceof Message && isSingleI18nIcu(icu.i18n)) {
24881
24979
  const xref = unit.job.allocateXrefId();
@@ -26631,12 +26729,29 @@ var OnTriggerType;
26631
26729
  OnTriggerType["IMMEDIATE"] = "immediate";
26632
26730
  OnTriggerType["HOVER"] = "hover";
26633
26731
  OnTriggerType["VIEWPORT"] = "viewport";
26732
+ OnTriggerType["NEVER"] = "never";
26634
26733
  })(OnTriggerType || (OnTriggerType = {}));
26635
26734
  /** Parses a `when` deferred trigger. */
26735
+ function parseNeverTrigger({ expression, sourceSpan }, triggers, errors) {
26736
+ const neverIndex = expression.indexOf('never');
26737
+ const neverSourceSpan = new ParseSourceSpan(sourceSpan.start.moveBy(neverIndex), sourceSpan.start.moveBy(neverIndex + 'never'.length));
26738
+ const prefetchSpan = getPrefetchSpan(expression, sourceSpan);
26739
+ const hydrateSpan = getHydrateSpan(expression, sourceSpan);
26740
+ // This is here just to be safe, we shouldn't enter this function
26741
+ // in the first place if a block doesn't have the "on" keyword.
26742
+ if (neverIndex === -1) {
26743
+ errors.push(new ParseError(sourceSpan, `Could not find "never" keyword in expression`));
26744
+ }
26745
+ else {
26746
+ trackTrigger('never', triggers, errors, new NeverDeferredTrigger(neverSourceSpan, sourceSpan, prefetchSpan, null, hydrateSpan));
26747
+ }
26748
+ }
26749
+ /** Parses a `when` deferred trigger. */
26636
26750
  function parseWhenTrigger({ expression, sourceSpan }, bindingParser, triggers, errors) {
26637
26751
  const whenIndex = expression.indexOf('when');
26638
26752
  const whenSourceSpan = new ParseSourceSpan(sourceSpan.start.moveBy(whenIndex), sourceSpan.start.moveBy(whenIndex + 'when'.length));
26639
26753
  const prefetchSpan = getPrefetchSpan(expression, sourceSpan);
26754
+ const hydrateSpan = getHydrateSpan(expression, sourceSpan);
26640
26755
  // This is here just to be safe, we shouldn't enter this function
26641
26756
  // in the first place if a block doesn't have the "when" keyword.
26642
26757
  if (whenIndex === -1) {
@@ -26645,7 +26760,7 @@ function parseWhenTrigger({ expression, sourceSpan }, bindingParser, triggers, e
26645
26760
  else {
26646
26761
  const start = getTriggerParametersStart(expression, whenIndex + 1);
26647
26762
  const parsed = bindingParser.parseBinding(expression.slice(start), false, sourceSpan, sourceSpan.start.offset + start);
26648
- trackTrigger('when', triggers, errors, new BoundDeferredTrigger(parsed, sourceSpan, prefetchSpan, whenSourceSpan));
26763
+ trackTrigger('when', triggers, errors, new BoundDeferredTrigger(parsed, sourceSpan, prefetchSpan, whenSourceSpan, hydrateSpan));
26649
26764
  }
26650
26765
  }
26651
26766
  /** Parses an `on` trigger */
@@ -26653,6 +26768,7 @@ function parseOnTrigger({ expression, sourceSpan }, triggers, errors, placeholde
26653
26768
  const onIndex = expression.indexOf('on');
26654
26769
  const onSourceSpan = new ParseSourceSpan(sourceSpan.start.moveBy(onIndex), sourceSpan.start.moveBy(onIndex + 'on'.length));
26655
26770
  const prefetchSpan = getPrefetchSpan(expression, sourceSpan);
26771
+ const hydrateSpan = getHydrateSpan(expression, sourceSpan);
26656
26772
  // This is here just to be safe, we shouldn't enter this function
26657
26773
  // in the first place if a block doesn't have the "on" keyword.
26658
26774
  if (onIndex === -1) {
@@ -26660,7 +26776,9 @@ function parseOnTrigger({ expression, sourceSpan }, triggers, errors, placeholde
26660
26776
  }
26661
26777
  else {
26662
26778
  const start = getTriggerParametersStart(expression, onIndex + 1);
26663
- const parser = new OnTriggerParser(expression, start, sourceSpan, triggers, errors, placeholder, prefetchSpan, onSourceSpan);
26779
+ const parser = new OnTriggerParser(expression, start, sourceSpan, triggers, errors, expression.startsWith('hydrate')
26780
+ ? validateHydrateReferenceBasedTrigger
26781
+ : validatePlainReferenceBasedTrigger, placeholder, prefetchSpan, onSourceSpan, hydrateSpan);
26664
26782
  parser.parse();
26665
26783
  }
26666
26784
  }
@@ -26670,16 +26788,24 @@ function getPrefetchSpan(expression, sourceSpan) {
26670
26788
  }
26671
26789
  return new ParseSourceSpan(sourceSpan.start, sourceSpan.start.moveBy('prefetch'.length));
26672
26790
  }
26791
+ function getHydrateSpan(expression, sourceSpan) {
26792
+ if (!expression.startsWith('hydrate')) {
26793
+ return null;
26794
+ }
26795
+ return new ParseSourceSpan(sourceSpan.start, sourceSpan.start.moveBy('hydrate'.length));
26796
+ }
26673
26797
  class OnTriggerParser {
26674
- constructor(expression, start, span, triggers, errors, placeholder, prefetchSpan, onSourceSpan) {
26798
+ constructor(expression, start, span, triggers, errors, validator, placeholder, prefetchSpan, onSourceSpan, hydrateSpan) {
26675
26799
  this.expression = expression;
26676
26800
  this.start = start;
26677
26801
  this.span = span;
26678
26802
  this.triggers = triggers;
26679
26803
  this.errors = errors;
26804
+ this.validator = validator;
26680
26805
  this.placeholder = placeholder;
26681
26806
  this.prefetchSpan = prefetchSpan;
26682
26807
  this.onSourceSpan = onSourceSpan;
26808
+ this.hydrateSpan = hydrateSpan;
26683
26809
  this.index = 0;
26684
26810
  this.tokens = new Lexer().tokenize(expression.slice(start));
26685
26811
  }
@@ -26734,26 +26860,27 @@ class OnTriggerParser {
26734
26860
  const isFirstTrigger = identifier.index === 0;
26735
26861
  const onSourceSpan = isFirstTrigger ? this.onSourceSpan : null;
26736
26862
  const prefetchSourceSpan = isFirstTrigger ? this.prefetchSpan : null;
26863
+ const hydrateSourceSpan = isFirstTrigger ? this.hydrateSpan : null;
26737
26864
  const sourceSpan = new ParseSourceSpan(isFirstTrigger ? this.span.start : triggerNameStartSpan, endSpan);
26738
26865
  try {
26739
26866
  switch (identifier.toString()) {
26740
26867
  case OnTriggerType.IDLE:
26741
- this.trackTrigger('idle', createIdleTrigger(parameters, nameSpan, sourceSpan, prefetchSourceSpan, onSourceSpan));
26868
+ this.trackTrigger('idle', createIdleTrigger(parameters, nameSpan, sourceSpan, prefetchSourceSpan, onSourceSpan, hydrateSourceSpan));
26742
26869
  break;
26743
26870
  case OnTriggerType.TIMER:
26744
- this.trackTrigger('timer', createTimerTrigger(parameters, nameSpan, sourceSpan, this.prefetchSpan, this.onSourceSpan));
26871
+ this.trackTrigger('timer', createTimerTrigger(parameters, nameSpan, sourceSpan, this.prefetchSpan, this.onSourceSpan, this.hydrateSpan));
26745
26872
  break;
26746
26873
  case OnTriggerType.INTERACTION:
26747
- this.trackTrigger('interaction', createInteractionTrigger(parameters, nameSpan, sourceSpan, this.prefetchSpan, this.onSourceSpan, this.placeholder));
26874
+ this.trackTrigger('interaction', createInteractionTrigger(parameters, nameSpan, sourceSpan, this.prefetchSpan, this.onSourceSpan, this.hydrateSpan, this.placeholder, this.validator));
26748
26875
  break;
26749
26876
  case OnTriggerType.IMMEDIATE:
26750
- this.trackTrigger('immediate', createImmediateTrigger(parameters, nameSpan, sourceSpan, this.prefetchSpan, this.onSourceSpan));
26877
+ this.trackTrigger('immediate', createImmediateTrigger(parameters, nameSpan, sourceSpan, this.prefetchSpan, this.onSourceSpan, this.hydrateSpan));
26751
26878
  break;
26752
26879
  case OnTriggerType.HOVER:
26753
- this.trackTrigger('hover', createHoverTrigger(parameters, nameSpan, sourceSpan, this.prefetchSpan, this.onSourceSpan, this.placeholder));
26880
+ this.trackTrigger('hover', createHoverTrigger(parameters, nameSpan, sourceSpan, this.prefetchSpan, this.onSourceSpan, this.hydrateSpan, this.placeholder, this.validator));
26754
26881
  break;
26755
26882
  case OnTriggerType.VIEWPORT:
26756
- this.trackTrigger('viewport', createViewportTrigger(parameters, nameSpan, sourceSpan, this.prefetchSpan, this.onSourceSpan, this.placeholder));
26883
+ this.trackTrigger('viewport', createViewportTrigger(parameters, nameSpan, sourceSpan, this.prefetchSpan, this.onSourceSpan, this.hydrateSpan, this.placeholder, this.validator));
26757
26884
  break;
26758
26885
  default:
26759
26886
  throw new Error(`Unrecognized trigger type "${identifier}"`);
@@ -26843,13 +26970,13 @@ function trackTrigger(name, allTriggers, errors, trigger) {
26843
26970
  allTriggers[name] = trigger;
26844
26971
  }
26845
26972
  }
26846
- function createIdleTrigger(parameters, nameSpan, sourceSpan, prefetchSpan, onSourceSpan) {
26973
+ function createIdleTrigger(parameters, nameSpan, sourceSpan, prefetchSpan, onSourceSpan, hydrateSpan) {
26847
26974
  if (parameters.length > 0) {
26848
26975
  throw new Error(`"${OnTriggerType.IDLE}" trigger cannot have parameters`);
26849
26976
  }
26850
- return new IdleDeferredTrigger(nameSpan, sourceSpan, prefetchSpan, onSourceSpan);
26977
+ return new IdleDeferredTrigger(nameSpan, sourceSpan, prefetchSpan, onSourceSpan, hydrateSpan);
26851
26978
  }
26852
- function createTimerTrigger(parameters, nameSpan, sourceSpan, prefetchSpan, onSourceSpan) {
26979
+ function createTimerTrigger(parameters, nameSpan, sourceSpan, prefetchSpan, onSourceSpan, hydrateSpan) {
26853
26980
  if (parameters.length !== 1) {
26854
26981
  throw new Error(`"${OnTriggerType.TIMER}" trigger must have exactly one parameter`);
26855
26982
  }
@@ -26857,27 +26984,33 @@ function createTimerTrigger(parameters, nameSpan, sourceSpan, prefetchSpan, onSo
26857
26984
  if (delay === null) {
26858
26985
  throw new Error(`Could not parse time value of trigger "${OnTriggerType.TIMER}"`);
26859
26986
  }
26860
- return new TimerDeferredTrigger(delay, nameSpan, sourceSpan, prefetchSpan, onSourceSpan);
26987
+ return new TimerDeferredTrigger(delay, nameSpan, sourceSpan, prefetchSpan, onSourceSpan, hydrateSpan);
26861
26988
  }
26862
- function createImmediateTrigger(parameters, nameSpan, sourceSpan, prefetchSpan, onSourceSpan) {
26989
+ function createImmediateTrigger(parameters, nameSpan, sourceSpan, prefetchSpan, onSourceSpan, hydrateSpan) {
26863
26990
  if (parameters.length > 0) {
26864
26991
  throw new Error(`"${OnTriggerType.IMMEDIATE}" trigger cannot have parameters`);
26865
26992
  }
26866
- return new ImmediateDeferredTrigger(nameSpan, sourceSpan, prefetchSpan, onSourceSpan);
26993
+ return new ImmediateDeferredTrigger(nameSpan, sourceSpan, prefetchSpan, onSourceSpan, hydrateSpan);
26867
26994
  }
26868
- function createHoverTrigger(parameters, nameSpan, sourceSpan, prefetchSpan, onSourceSpan, placeholder) {
26869
- validateReferenceBasedTrigger(OnTriggerType.HOVER, parameters, placeholder);
26870
- return new HoverDeferredTrigger(parameters[0] ?? null, nameSpan, sourceSpan, prefetchSpan, onSourceSpan);
26995
+ function createHoverTrigger(parameters, nameSpan, sourceSpan, prefetchSpan, onSourceSpan, hydrateSpan, placeholder, validator) {
26996
+ validator(OnTriggerType.HOVER, parameters, placeholder);
26997
+ return new HoverDeferredTrigger(parameters[0] ?? null, nameSpan, sourceSpan, prefetchSpan, onSourceSpan, hydrateSpan);
26871
26998
  }
26872
- function createInteractionTrigger(parameters, nameSpan, sourceSpan, prefetchSpan, onSourceSpan, placeholder) {
26873
- validateReferenceBasedTrigger(OnTriggerType.INTERACTION, parameters, placeholder);
26874
- return new InteractionDeferredTrigger(parameters[0] ?? null, nameSpan, sourceSpan, prefetchSpan, onSourceSpan);
26999
+ function createInteractionTrigger(parameters, nameSpan, sourceSpan, prefetchSpan, onSourceSpan, hydrateSpan, placeholder, validator) {
27000
+ validator(OnTriggerType.INTERACTION, parameters, placeholder);
27001
+ return new InteractionDeferredTrigger(parameters[0] ?? null, nameSpan, sourceSpan, prefetchSpan, onSourceSpan, hydrateSpan);
26875
27002
  }
26876
- function createViewportTrigger(parameters, nameSpan, sourceSpan, prefetchSpan, onSourceSpan, placeholder) {
26877
- validateReferenceBasedTrigger(OnTriggerType.VIEWPORT, parameters, placeholder);
26878
- return new ViewportDeferredTrigger(parameters[0] ?? null, nameSpan, sourceSpan, prefetchSpan, onSourceSpan);
27003
+ function createViewportTrigger(parameters, nameSpan, sourceSpan, prefetchSpan, onSourceSpan, hydrateSpan, placeholder, validator) {
27004
+ validator(OnTriggerType.VIEWPORT, parameters, placeholder);
27005
+ return new ViewportDeferredTrigger(parameters[0] ?? null, nameSpan, sourceSpan, prefetchSpan, onSourceSpan, hydrateSpan);
26879
27006
  }
26880
- function validateReferenceBasedTrigger(type, parameters, placeholder) {
27007
+ /**
27008
+ * Checks whether the structure of a non-hydrate reference-based trigger is valid.
27009
+ * @param type Type of the trigger being validated.
27010
+ * @param parameters Parameters of the trigger.
27011
+ * @param placeholder Placeholder of the defer block.
27012
+ */
27013
+ function validatePlainReferenceBasedTrigger(type, parameters, placeholder) {
26881
27014
  if (parameters.length > 1) {
26882
27015
  throw new Error(`"${type}" trigger can only have zero or one parameters`);
26883
27016
  }
@@ -26891,6 +27024,16 @@ function validateReferenceBasedTrigger(type, parameters, placeholder) {
26891
27024
  }
26892
27025
  }
26893
27026
  }
27027
+ /**
27028
+ * Checks whether the structure of a hydrate trigger is valid.
27029
+ * @param type Type of the trigger being validated.
27030
+ * @param parameters Parameters of the trigger.
27031
+ */
27032
+ function validateHydrateReferenceBasedTrigger(type, parameters) {
27033
+ if (parameters.length > 0) {
27034
+ throw new Error(`Hydration trigger "${type}" cannot have parameters`);
27035
+ }
27036
+ }
26894
27037
  /** Gets the index within an expression at which the trigger parameters start. */
26895
27038
  function getTriggerParametersStart(value, startPosition = 0) {
26896
27039
  let hasFoundSeparator = false;
@@ -26921,6 +27064,12 @@ function parseDeferredTime(value) {
26921
27064
  const PREFETCH_WHEN_PATTERN = /^prefetch\s+when\s/;
26922
27065
  /** Pattern to identify a `prefetch on` trigger. */
26923
27066
  const PREFETCH_ON_PATTERN = /^prefetch\s+on\s/;
27067
+ /** Pattern to identify a `hydrate when` trigger. */
27068
+ const HYDRATE_WHEN_PATTERN = /^hydrate\s+when\s/;
27069
+ /** Pattern to identify a `hydrate on` trigger. */
27070
+ const HYDRATE_ON_PATTERN = /^hydrate\s+on\s/;
27071
+ /** Pattern to identify a `hydrate never` trigger. */
27072
+ const HYDRATE_NEVER_PATTERN = /^hydrate\s+never\s*/;
26924
27073
  /** Pattern to identify a `minimum` parameter in a block. */
26925
27074
  const MINIMUM_PARAMETER_PATTERN = /^minimum\s/;
26926
27075
  /** Pattern to identify a `after` parameter in a block. */
@@ -26940,7 +27089,7 @@ function isConnectedDeferLoopBlock(name) {
26940
27089
  function createDeferredBlock(ast, connectedBlocks, visitor, bindingParser) {
26941
27090
  const errors = [];
26942
27091
  const { placeholder, loading, error } = parseConnectedBlocks(connectedBlocks, errors, visitor);
26943
- const { triggers, prefetchTriggers } = parsePrimaryTriggers(ast.parameters, bindingParser, errors, placeholder);
27092
+ const { triggers, prefetchTriggers, hydrateTriggers } = parsePrimaryTriggers(ast, bindingParser, errors, placeholder);
26944
27093
  // The `defer` block has a main span encompassing all of the connected branches as well.
26945
27094
  let lastEndSourceSpan = ast.endSourceSpan;
26946
27095
  let endOfLastSourceSpan = ast.sourceSpan.end;
@@ -26950,7 +27099,7 @@ function createDeferredBlock(ast, connectedBlocks, visitor, bindingParser) {
26950
27099
  endOfLastSourceSpan = lastConnectedBlock.sourceSpan.end;
26951
27100
  }
26952
27101
  const sourceSpanWithConnectedBlocks = new ParseSourceSpan(ast.sourceSpan.start, endOfLastSourceSpan);
26953
- const node = new DeferredBlock(visitAll(visitor, ast.children, ast.children), triggers, prefetchTriggers, placeholder, loading, error, ast.nameSpan, sourceSpanWithConnectedBlocks, ast.sourceSpan, ast.startSourceSpan, lastEndSourceSpan, ast.i18n);
27102
+ const node = new DeferredBlock(visitAll(visitor, ast.children, ast.children), triggers, prefetchTriggers, hydrateTriggers, placeholder, loading, error, ast.nameSpan, sourceSpanWithConnectedBlocks, ast.sourceSpan, ast.startSourceSpan, lastEndSourceSpan, ast.i18n);
26954
27103
  return { node, errors };
26955
27104
  }
26956
27105
  function parseConnectedBlocks(connectedBlocks, errors, visitor) {
@@ -27051,10 +27200,11 @@ function parseErrorBlock(ast, visitor) {
27051
27200
  }
27052
27201
  return new DeferredBlockError(visitAll(visitor, ast.children, ast.children), ast.nameSpan, ast.sourceSpan, ast.startSourceSpan, ast.endSourceSpan, ast.i18n);
27053
27202
  }
27054
- function parsePrimaryTriggers(params, bindingParser, errors, placeholder) {
27203
+ function parsePrimaryTriggers(ast, bindingParser, errors, placeholder) {
27055
27204
  const triggers = {};
27056
27205
  const prefetchTriggers = {};
27057
- for (const param of params) {
27206
+ const hydrateTriggers = {};
27207
+ for (const param of ast.parameters) {
27058
27208
  // The lexer ignores the leading spaces so we can assume
27059
27209
  // that the expression starts with a keyword.
27060
27210
  if (WHEN_PARAMETER_PATTERN.test(param.expression)) {
@@ -27069,11 +27219,23 @@ function parsePrimaryTriggers(params, bindingParser, errors, placeholder) {
27069
27219
  else if (PREFETCH_ON_PATTERN.test(param.expression)) {
27070
27220
  parseOnTrigger(param, prefetchTriggers, errors, placeholder);
27071
27221
  }
27222
+ else if (HYDRATE_WHEN_PATTERN.test(param.expression)) {
27223
+ parseWhenTrigger(param, bindingParser, hydrateTriggers, errors);
27224
+ }
27225
+ else if (HYDRATE_ON_PATTERN.test(param.expression)) {
27226
+ parseOnTrigger(param, hydrateTriggers, errors, placeholder);
27227
+ }
27228
+ else if (HYDRATE_NEVER_PATTERN.test(param.expression)) {
27229
+ parseNeverTrigger(param, hydrateTriggers, errors);
27230
+ }
27072
27231
  else {
27073
27232
  errors.push(new ParseError(param.sourceSpan, 'Unrecognized trigger'));
27074
27233
  }
27075
27234
  }
27076
- return { triggers, prefetchTriggers };
27235
+ if (hydrateTriggers.never && Object.keys(hydrateTriggers).length > 1) {
27236
+ errors.push(new ParseError(ast.startSourceSpan, 'Cannot specify additional `hydrate` triggers if `hydrate never` is present'));
27237
+ }
27238
+ return { triggers, prefetchTriggers, hydrateTriggers };
27077
27239
  }
27078
27240
 
27079
27241
  const BIND_NAME_REGEXP = /^(?:(bind-)|(let-)|(ref-|#)|(on-)|(bindon-)|(@))(.*)$/;
@@ -28149,11 +28311,18 @@ function compileStyles(styles, selector, hostSelector) {
28149
28311
  * is using the `ViewEncapsulation.Emulated` mode.
28150
28312
  *
28151
28313
  * @param style The content of a CSS stylesheet.
28314
+ * @param componentIdentifier The identifier to use within the CSS rules.
28152
28315
  * @returns The encapsulated content for the style.
28153
28316
  */
28154
- function encapsulateStyle(style) {
28317
+ function encapsulateStyle(style, componentIdentifier) {
28155
28318
  const shadowCss = new ShadowCss();
28156
- return shadowCss.shimCssText(style, CONTENT_ATTR, HOST_ATTR);
28319
+ const selector = componentIdentifier
28320
+ ? CONTENT_ATTR.replace(COMPONENT_VARIABLE, componentIdentifier)
28321
+ : CONTENT_ATTR;
28322
+ const hostSelector = componentIdentifier
28323
+ ? HOST_ATTR.replace(COMPONENT_VARIABLE, componentIdentifier)
28324
+ : HOST_ATTR;
28325
+ return shadowCss.shimCssText(style, selector, hostSelector);
28157
28326
  }
28158
28327
  function createHostDirectivesType(meta) {
28159
28328
  if (!meta.hostDirectives?.length) {
@@ -28860,6 +29029,8 @@ class TemplateBinder extends RecursiveAstVisitor {
28860
29029
  this.ingestScopedNode(deferred);
28861
29030
  deferred.triggers.when?.value.visit(this);
28862
29031
  deferred.prefetchTriggers.when?.value.visit(this);
29032
+ deferred.hydrateTriggers.when?.value.visit(this);
29033
+ deferred.hydrateTriggers.never?.visit(this);
28863
29034
  deferred.placeholder && this.visitNode(deferred.placeholder);
28864
29035
  deferred.loading && this.visitNode(deferred.loading);
28865
29036
  deferred.error && this.visitNode(deferred.error);
@@ -29805,7 +29976,7 @@ function publishFacade(global) {
29805
29976
  * @description
29806
29977
  * Entry point for all public APIs of the compiler package.
29807
29978
  */
29808
- const VERSION = new Version('19.0.0-next.4');
29979
+ const VERSION = new Version('19.0.0-next.6');
29809
29980
 
29810
29981
  class CompilerConfig {
29811
29982
  constructor({ defaultEncapsulation = ViewEncapsulation.Emulated, preserveWhitespaces, strictInjectionParameters, } = {}) {
@@ -31456,7 +31627,7 @@ const MINIMUM_PARTIAL_LINKER_DEFER_SUPPORT_VERSION = '18.0.0';
31456
31627
  function compileDeclareClassMetadata(metadata) {
31457
31628
  const definitionMap = new DefinitionMap();
31458
31629
  definitionMap.set('minVersion', literal(MINIMUM_PARTIAL_LINKER_VERSION$5));
31459
- definitionMap.set('version', literal('19.0.0-next.4'));
31630
+ definitionMap.set('version', literal('19.0.0-next.6'));
31460
31631
  definitionMap.set('ngImport', importExpr(Identifiers.core));
31461
31632
  definitionMap.set('type', metadata.type);
31462
31633
  definitionMap.set('decorators', metadata.decorators);
@@ -31474,7 +31645,7 @@ function compileComponentDeclareClassMetadata(metadata, dependencies) {
31474
31645
  callbackReturnDefinitionMap.set('ctorParameters', metadata.ctorParameters ?? literal(null));
31475
31646
  callbackReturnDefinitionMap.set('propDecorators', metadata.propDecorators ?? literal(null));
31476
31647
  definitionMap.set('minVersion', literal(MINIMUM_PARTIAL_LINKER_DEFER_SUPPORT_VERSION));
31477
- definitionMap.set('version', literal('19.0.0-next.4'));
31648
+ definitionMap.set('version', literal('19.0.0-next.6'));
31478
31649
  definitionMap.set('ngImport', importExpr(Identifiers.core));
31479
31650
  definitionMap.set('type', metadata.type);
31480
31651
  definitionMap.set('resolveDeferredDeps', compileComponentMetadataAsyncResolver(dependencies));
@@ -31569,7 +31740,7 @@ function createDirectiveDefinitionMap(meta) {
31569
31740
  const definitionMap = new DefinitionMap();
31570
31741
  const minVersion = getMinimumVersionForPartialOutput(meta);
31571
31742
  definitionMap.set('minVersion', literal(minVersion));
31572
- definitionMap.set('version', literal('19.0.0-next.4'));
31743
+ definitionMap.set('version', literal('19.0.0-next.6'));
31573
31744
  // e.g. `type: MyDirective`
31574
31745
  definitionMap.set('type', meta.type.value);
31575
31746
  if (meta.isStandalone) {
@@ -31991,7 +32162,7 @@ const MINIMUM_PARTIAL_LINKER_VERSION$4 = '12.0.0';
31991
32162
  function compileDeclareFactoryFunction(meta) {
31992
32163
  const definitionMap = new DefinitionMap();
31993
32164
  definitionMap.set('minVersion', literal(MINIMUM_PARTIAL_LINKER_VERSION$4));
31994
- definitionMap.set('version', literal('19.0.0-next.4'));
32165
+ definitionMap.set('version', literal('19.0.0-next.6'));
31995
32166
  definitionMap.set('ngImport', importExpr(Identifiers.core));
31996
32167
  definitionMap.set('type', meta.type.value);
31997
32168
  definitionMap.set('deps', compileDependencies(meta.deps));
@@ -32026,7 +32197,7 @@ function compileDeclareInjectableFromMetadata(meta) {
32026
32197
  function createInjectableDefinitionMap(meta) {
32027
32198
  const definitionMap = new DefinitionMap();
32028
32199
  definitionMap.set('minVersion', literal(MINIMUM_PARTIAL_LINKER_VERSION$3));
32029
- definitionMap.set('version', literal('19.0.0-next.4'));
32200
+ definitionMap.set('version', literal('19.0.0-next.6'));
32030
32201
  definitionMap.set('ngImport', importExpr(Identifiers.core));
32031
32202
  definitionMap.set('type', meta.type.value);
32032
32203
  // Only generate providedIn property if it has a non-null value
@@ -32077,7 +32248,7 @@ function compileDeclareInjectorFromMetadata(meta) {
32077
32248
  function createInjectorDefinitionMap(meta) {
32078
32249
  const definitionMap = new DefinitionMap();
32079
32250
  definitionMap.set('minVersion', literal(MINIMUM_PARTIAL_LINKER_VERSION$2));
32080
- definitionMap.set('version', literal('19.0.0-next.4'));
32251
+ definitionMap.set('version', literal('19.0.0-next.6'));
32081
32252
  definitionMap.set('ngImport', importExpr(Identifiers.core));
32082
32253
  definitionMap.set('type', meta.type.value);
32083
32254
  definitionMap.set('providers', meta.providers);
@@ -32110,7 +32281,7 @@ function createNgModuleDefinitionMap(meta) {
32110
32281
  throw new Error('Invalid path! Local compilation mode should not get into the partial compilation path');
32111
32282
  }
32112
32283
  definitionMap.set('minVersion', literal(MINIMUM_PARTIAL_LINKER_VERSION$1));
32113
- definitionMap.set('version', literal('19.0.0-next.4'));
32284
+ definitionMap.set('version', literal('19.0.0-next.6'));
32114
32285
  definitionMap.set('ngImport', importExpr(Identifiers.core));
32115
32286
  definitionMap.set('type', meta.type.value);
32116
32287
  // We only generate the keys in the metadata if the arrays contain values.
@@ -32161,7 +32332,7 @@ function compileDeclarePipeFromMetadata(meta) {
32161
32332
  function createPipeDefinitionMap(meta) {
32162
32333
  const definitionMap = new DefinitionMap();
32163
32334
  definitionMap.set('minVersion', literal(MINIMUM_PARTIAL_LINKER_VERSION));
32164
- definitionMap.set('version', literal('19.0.0-next.4'));
32335
+ definitionMap.set('version', literal('19.0.0-next.6'));
32165
32336
  definitionMap.set('ngImport', importExpr(Identifiers.core));
32166
32337
  // e.g. `type: MyPipe`
32167
32338
  definitionMap.set('type', meta.type.value);
@@ -32194,5 +32365,5 @@ publishFacade(_global);
32194
32365
 
32195
32366
  // This file is not used to build this module. It is only used during editing
32196
32367
 
32197
- export { AST, ASTWithName, ASTWithSource, AbsoluteSourceSpan, ArrayType, ArrowFunctionExpr, AstMemoryEfficientTransformer, AstTransformer, Attribute, Binary, BinaryOperator, BinaryOperatorExpr, BindingPipe, BindingType, Block, BlockParameter, BoundElementProperty, BuiltinType, BuiltinTypeName, CUSTOM_ELEMENTS_SCHEMA, Call, Chain, ChangeDetectionStrategy, CommaExpr, Comment, CompilerConfig, Conditional, ConditionalExpr, ConstantPool, CssSelector, DEFAULT_INTERPOLATION_CONFIG, DYNAMIC_TYPE, DeclareFunctionStmt, DeclareVarStmt, DomElementSchemaRegistry, DynamicImportExpr, EOF, Element, ElementSchemaRegistry, EmitterVisitorContext, EmptyExpr$1 as EmptyExpr, Expansion, ExpansionCase, Expression, ExpressionBinding, ExpressionStatement, ExpressionType, ExternalExpr, ExternalReference, FactoryTarget$1 as FactoryTarget, FunctionExpr, HtmlParser, HtmlTagDefinition, I18NHtmlParser, IfStmt, ImplicitReceiver, InstantiateExpr, Interpolation$1 as Interpolation, InterpolationConfig, InvokeFunctionExpr, JSDocComment, JitEvaluator, KeyedRead, KeyedWrite, LeadingComment, LetDeclaration, Lexer, LiteralArray, LiteralArrayExpr, LiteralExpr, LiteralMap, LiteralMapExpr, LiteralPrimitive, LocalizedString, MapType, MessageBundle, NONE_TYPE, NO_ERRORS_SCHEMA, NodeWithI18n, NonNullAssert, NotExpr, ParseError, ParseErrorLevel, ParseLocation, ParseSourceFile, ParseSourceSpan, ParseSpan, ParseTreeResult, ParsedEvent, ParsedEventType, ParsedProperty, ParsedPropertyType, ParsedVariable, Parser, ParserError, PrefixNot, PropertyRead, PropertyWrite, R3BoundTarget, Identifiers as R3Identifiers, R3NgModuleMetadataKind, R3SelectorScopeMode, R3TargetBinder, R3TemplateDependencyKind, ReadKeyExpr, ReadPropExpr, ReadVarExpr, RecursiveAstVisitor, RecursiveVisitor, ResourceLoader, ReturnStatement, STRING_TYPE, SafeCall, SafeKeyedRead, SafePropertyRead, SelectorContext, SelectorListContext, SelectorMatcher, Serializer, SplitInterpolation, Statement, StmtModifier, TagContentType, TaggedTemplateExpr, TemplateBindingParseResult, TemplateLiteral, TemplateLiteralElement, Text, ThisReceiver, BlockNode as TmplAstBlockNode, BoundAttribute as TmplAstBoundAttribute, BoundDeferredTrigger as TmplAstBoundDeferredTrigger, BoundEvent as TmplAstBoundEvent, BoundText as TmplAstBoundText, Content as TmplAstContent, DeferredBlock as TmplAstDeferredBlock, DeferredBlockError as TmplAstDeferredBlockError, DeferredBlockLoading as TmplAstDeferredBlockLoading, DeferredBlockPlaceholder as TmplAstDeferredBlockPlaceholder, DeferredTrigger as TmplAstDeferredTrigger, Element$1 as TmplAstElement, ForLoopBlock as TmplAstForLoopBlock, ForLoopBlockEmpty as TmplAstForLoopBlockEmpty, HoverDeferredTrigger as TmplAstHoverDeferredTrigger, Icu$1 as TmplAstIcu, IdleDeferredTrigger as TmplAstIdleDeferredTrigger, IfBlock as TmplAstIfBlock, IfBlockBranch as TmplAstIfBlockBranch, ImmediateDeferredTrigger as TmplAstImmediateDeferredTrigger, InteractionDeferredTrigger as TmplAstInteractionDeferredTrigger, LetDeclaration$1 as TmplAstLetDeclaration, RecursiveVisitor$1 as TmplAstRecursiveVisitor, Reference as TmplAstReference, SwitchBlock as TmplAstSwitchBlock, SwitchBlockCase as TmplAstSwitchBlockCase, Template as TmplAstTemplate, Text$3 as TmplAstText, TextAttribute as TmplAstTextAttribute, TimerDeferredTrigger as TmplAstTimerDeferredTrigger, UnknownBlock as TmplAstUnknownBlock, Variable as TmplAstVariable, ViewportDeferredTrigger as TmplAstViewportDeferredTrigger, Token, TokenType, TransplantedType, TreeError, Type, TypeModifier, TypeofExpr, Unary, UnaryOperator, UnaryOperatorExpr, VERSION, VariableBinding, Version, ViewEncapsulation, WrappedNodeExpr, WriteKeyExpr, WritePropExpr, WriteVarExpr, Xliff, Xliff2, Xmb, XmlParser, Xtb, compileClassDebugInfo, compileClassMetadata, compileComponentClassMetadata, compileComponentDeclareClassMetadata, compileComponentFromMetadata, compileDeclareClassMetadata, compileDeclareComponentFromMetadata, compileDeclareDirectiveFromMetadata, compileDeclareFactoryFunction, compileDeclareInjectableFromMetadata, compileDeclareInjectorFromMetadata, compileDeclareNgModuleFromMetadata, compileDeclarePipeFromMetadata, compileDeferResolverFunction, compileDirectiveFromMetadata, compileFactoryFunction, compileInjectable, compileInjector, compileNgModule, compileOpaqueAsyncClassMetadata, compilePipeFromMetadata, computeMsgId, core, createCssSelectorFromNode, createInjectableType, createMayBeForwardRefExpression, devOnlyGuardedExpression, emitDistinctChangesOnlyDefaultValue, encapsulateStyle, findMatchingDirectivesAndPipes, getHtmlTagDefinition, getNsPrefix, getSafePropertyAccessString, identifierName, isIdentifier, isNgContainer, isNgContent, isNgTemplate, jsDocComment, leadingComment, literal, literalMap, makeBindingParser, mergeNsAndName, output_ast as outputAst, parseHostBindings, parseTemplate, preserveWhitespacesDefault, publishFacade, r3JitTypeSourceSpan, sanitizeIdentifier, splitNsName, visitAll$1 as tmplAstVisitAll, verifyHostBindings, visitAll };
32368
+ export { AST, ASTWithName, ASTWithSource, AbsoluteSourceSpan, ArrayType, ArrowFunctionExpr, AstMemoryEfficientTransformer, AstTransformer, Attribute, Binary, BinaryOperator, BinaryOperatorExpr, BindingPipe, BindingType, Block, BlockParameter, BoundElementProperty, BuiltinType, BuiltinTypeName, CUSTOM_ELEMENTS_SCHEMA, Call, Chain, ChangeDetectionStrategy, CommaExpr, Comment, CompilerConfig, Conditional, ConditionalExpr, ConstantPool, CssSelector, DEFAULT_INTERPOLATION_CONFIG, DYNAMIC_TYPE, DeclareFunctionStmt, DeclareVarStmt, DomElementSchemaRegistry, DynamicImportExpr, EOF, Element, ElementSchemaRegistry, EmitterVisitorContext, EmptyExpr$1 as EmptyExpr, Expansion, ExpansionCase, Expression, ExpressionBinding, ExpressionStatement, ExpressionType, ExternalExpr, ExternalReference, FactoryTarget$1 as FactoryTarget, FunctionExpr, HtmlParser, HtmlTagDefinition, I18NHtmlParser, IfStmt, ImplicitReceiver, InstantiateExpr, Interpolation$1 as Interpolation, InterpolationConfig, InvokeFunctionExpr, JSDocComment, JitEvaluator, KeyedRead, KeyedWrite, LeadingComment, LetDeclaration, Lexer, LiteralArray, LiteralArrayExpr, LiteralExpr, LiteralMap, LiteralMapExpr, LiteralPrimitive, LocalizedString, MapType, MessageBundle, NONE_TYPE, NO_ERRORS_SCHEMA, NodeWithI18n, NonNullAssert, NotExpr, ParseError, ParseErrorLevel, ParseLocation, ParseSourceFile, ParseSourceSpan, ParseSpan, ParseTreeResult, ParsedEvent, ParsedEventType, ParsedProperty, ParsedPropertyType, ParsedVariable, Parser, ParserError, PrefixNot, PropertyRead, PropertyWrite, R3BoundTarget, Identifiers as R3Identifiers, R3NgModuleMetadataKind, R3SelectorScopeMode, R3TargetBinder, R3TemplateDependencyKind, ReadKeyExpr, ReadPropExpr, ReadVarExpr, RecursiveAstVisitor, RecursiveVisitor, ResourceLoader, ReturnStatement, STRING_TYPE, SafeCall, SafeKeyedRead, SafePropertyRead, SelectorContext, SelectorListContext, SelectorMatcher, Serializer, SplitInterpolation, Statement, StmtModifier, TagContentType, TaggedTemplateExpr, TemplateBindingParseResult, TemplateLiteral, TemplateLiteralElement, Text, ThisReceiver, BlockNode as TmplAstBlockNode, BoundAttribute as TmplAstBoundAttribute, BoundDeferredTrigger as TmplAstBoundDeferredTrigger, BoundEvent as TmplAstBoundEvent, BoundText as TmplAstBoundText, Content as TmplAstContent, DeferredBlock as TmplAstDeferredBlock, DeferredBlockError as TmplAstDeferredBlockError, DeferredBlockLoading as TmplAstDeferredBlockLoading, DeferredBlockPlaceholder as TmplAstDeferredBlockPlaceholder, DeferredTrigger as TmplAstDeferredTrigger, Element$1 as TmplAstElement, ForLoopBlock as TmplAstForLoopBlock, ForLoopBlockEmpty as TmplAstForLoopBlockEmpty, HoverDeferredTrigger as TmplAstHoverDeferredTrigger, Icu$1 as TmplAstIcu, IdleDeferredTrigger as TmplAstIdleDeferredTrigger, IfBlock as TmplAstIfBlock, IfBlockBranch as TmplAstIfBlockBranch, ImmediateDeferredTrigger as TmplAstImmediateDeferredTrigger, InteractionDeferredTrigger as TmplAstInteractionDeferredTrigger, LetDeclaration$1 as TmplAstLetDeclaration, NeverDeferredTrigger as TmplAstNeverDeferredTrigger, RecursiveVisitor$1 as TmplAstRecursiveVisitor, Reference as TmplAstReference, SwitchBlock as TmplAstSwitchBlock, SwitchBlockCase as TmplAstSwitchBlockCase, Template as TmplAstTemplate, Text$3 as TmplAstText, TextAttribute as TmplAstTextAttribute, TimerDeferredTrigger as TmplAstTimerDeferredTrigger, UnknownBlock as TmplAstUnknownBlock, Variable as TmplAstVariable, ViewportDeferredTrigger as TmplAstViewportDeferredTrigger, Token, TokenType, TransplantedType, TreeError, Type, TypeModifier, TypeofExpr, Unary, UnaryOperator, UnaryOperatorExpr, VERSION, VariableBinding, Version, ViewEncapsulation, WrappedNodeExpr, WriteKeyExpr, WritePropExpr, WriteVarExpr, Xliff, Xliff2, Xmb, XmlParser, Xtb, compileClassDebugInfo, compileClassMetadata, compileComponentClassMetadata, compileComponentDeclareClassMetadata, compileComponentFromMetadata, compileDeclareClassMetadata, compileDeclareComponentFromMetadata, compileDeclareDirectiveFromMetadata, compileDeclareFactoryFunction, compileDeclareInjectableFromMetadata, compileDeclareInjectorFromMetadata, compileDeclareNgModuleFromMetadata, compileDeclarePipeFromMetadata, compileDeferResolverFunction, compileDirectiveFromMetadata, compileFactoryFunction, compileInjectable, compileInjector, compileNgModule, compileOpaqueAsyncClassMetadata, compilePipeFromMetadata, computeMsgId, core, createCssSelectorFromNode, createInjectableType, createMayBeForwardRefExpression, devOnlyGuardedExpression, emitDistinctChangesOnlyDefaultValue, encapsulateStyle, findMatchingDirectivesAndPipes, getHtmlTagDefinition, getNsPrefix, getSafePropertyAccessString, identifierName, isIdentifier, isNgContainer, isNgContent, isNgTemplate, jsDocComment, leadingComment, literal, literalMap, makeBindingParser, mergeNsAndName, output_ast as outputAst, parseHostBindings, parseTemplate, preserveWhitespacesDefault, publishFacade, r3JitTypeSourceSpan, sanitizeIdentifier, splitNsName, visitAll$1 as tmplAstVisitAll, verifyHostBindings, visitAll };
32198
32369
  //# sourceMappingURL=compiler.mjs.map