@tanstack/start-client-core 1.169.4 → 1.170.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 (52) hide show
  1. package/dist/esm/client/hydrateStart.d.ts +13 -1
  2. package/dist/esm/client/hydrateStart.js +20 -1
  3. package/dist/esm/client/hydrateStart.js.map +1 -1
  4. package/dist/esm/client/index.js +2 -2
  5. package/dist/esm/hydration/condition.d.ts +5 -0
  6. package/dist/esm/hydration/condition.js +16 -0
  7. package/dist/esm/hydration/condition.js.map +1 -0
  8. package/dist/esm/hydration/constants.d.ts +3 -0
  9. package/dist/esm/hydration/constants.js +8 -0
  10. package/dist/esm/hydration/constants.js.map +1 -0
  11. package/dist/esm/hydration/idle.d.ts +7 -0
  12. package/dist/esm/hydration/idle.js +22 -0
  13. package/dist/esm/hydration/idle.js.map +1 -0
  14. package/dist/esm/hydration/interaction.d.ts +8 -0
  15. package/dist/esm/hydration/interaction.js +221 -0
  16. package/dist/esm/hydration/interaction.js.map +1 -0
  17. package/dist/esm/hydration/load.d.ts +4 -0
  18. package/dist/esm/hydration/load.js +16 -0
  19. package/dist/esm/hydration/load.js.map +1 -0
  20. package/dist/esm/hydration/media.d.ts +4 -0
  21. package/dist/esm/hydration/media.js +23 -0
  22. package/dist/esm/hydration/media.js.map +1 -0
  23. package/dist/esm/hydration/never.d.ts +4 -0
  24. package/dist/esm/hydration/never.js +13 -0
  25. package/dist/esm/hydration/never.js.map +1 -0
  26. package/dist/esm/hydration/renderer.d.ts +5 -0
  27. package/dist/esm/hydration/renderer.js +9 -0
  28. package/dist/esm/hydration/renderer.js.map +1 -0
  29. package/dist/esm/hydration/runtime.d.ts +23 -0
  30. package/dist/esm/hydration/runtime.js +129 -0
  31. package/dist/esm/hydration/runtime.js.map +1 -0
  32. package/dist/esm/hydration/types.d.ts +38 -0
  33. package/dist/esm/hydration/visible.d.ts +8 -0
  34. package/dist/esm/hydration/visible.js +67 -0
  35. package/dist/esm/hydration/visible.js.map +1 -0
  36. package/dist/esm/hydration.d.ts +18 -0
  37. package/dist/esm/hydration.js +16 -0
  38. package/dist/esm/hydration.js.map +1 -0
  39. package/package.json +24 -3
  40. package/src/client/hydrateStart.ts +48 -2
  41. package/src/hydration/condition.ts +20 -0
  42. package/src/hydration/constants.ts +4 -0
  43. package/src/hydration/idle.ts +35 -0
  44. package/src/hydration/interaction.ts +342 -0
  45. package/src/hydration/load.ts +16 -0
  46. package/src/hydration/media.ts +25 -0
  47. package/src/hydration/never.ts +13 -0
  48. package/src/hydration/renderer.ts +21 -0
  49. package/src/hydration/runtime.ts +191 -0
  50. package/src/hydration/types.ts +90 -0
  51. package/src/hydration/visible.ts +90 -0
  52. package/src/hydration.ts +50 -0
@@ -1,2 +1,14 @@
1
1
  import { AnyRouter } from '@tanstack/router-core';
2
- export declare function hydrateStart(): Promise<AnyRouter>;
2
+ type HotContext = {
3
+ data?: Record<string, unknown>;
4
+ dispose?: (cb: (data: Record<string, unknown>) => void) => void;
5
+ };
6
+ declare global {
7
+ interface ImportMeta {
8
+ hot?: HotContext;
9
+ webpackHot?: HotContext;
10
+ }
11
+ }
12
+ declare function hydrateStart(): Promise<AnyRouter>;
13
+ declare const exportedHydrateStart: typeof hydrateStart;
14
+ export { exportedHydrateStart as hydrateStart };
@@ -27,7 +27,26 @@ async function hydrateStart() {
27
27
  if (!router.stores.matchesId.get().length) await hydrate(router);
28
28
  return router;
29
29
  }
30
+ function hydrateStartWithHmr() {
31
+ const hot = import.meta.hot ?? import.meta.webpackHot;
32
+ if (!hot) return hydrateStart();
33
+ const key = "tss-hydrate-start-promise";
34
+ const hotData = hot.data ??= {};
35
+ let hydrationPromise = hotData[key];
36
+ if (!hydrationPromise) {
37
+ hydrationPromise = hydrateStart().catch((error) => {
38
+ if (hotData[key] === hydrationPromise) hotData[key] = void 0;
39
+ throw error;
40
+ });
41
+ hotData[key] = hydrationPromise;
42
+ }
43
+ hot.dispose?.((data) => {
44
+ data[key] = hotData[key];
45
+ });
46
+ return hydrationPromise;
47
+ }
48
+ var exportedHydrateStart = process.env.NODE_ENV !== "production" ? hydrateStartWithHmr : hydrateStart;
30
49
  //#endregion
31
- export { hydrateStart };
50
+ export { exportedHydrateStart };
32
51
 
33
52
  //# sourceMappingURL=hydrateStart.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"hydrateStart.js","names":[],"sources":["../../../src/client/hydrateStart.ts"],"sourcesContent":["import { hydrate } from '@tanstack/router-core/ssr/client'\n\nimport { startInstance } from '#tanstack-start-entry'\nimport {\n hasPluginAdapters,\n pluginSerializationAdapters,\n} from '#tanstack-start-plugin-adapters'\nimport { getRouter } from '#tanstack-router-entry'\nimport { ServerFunctionSerializationAdapter } from './ServerFunctionSerializationAdapter'\nimport type { AnyRouter, AnySerializationAdapter } from '@tanstack/router-core'\nimport type { AnyStartInstanceOptions } from '../createStart'\n\nexport async function hydrateStart(): Promise<AnyRouter> {\n const router = await getRouter()\n\n let serializationAdapters: Array<AnySerializationAdapter>\n if (startInstance) {\n const startOptions = await startInstance.getOptions()\n startOptions.serializationAdapters =\n startOptions.serializationAdapters ?? []\n window.__TSS_START_OPTIONS__ = startOptions as AnyStartInstanceOptions\n serializationAdapters = startOptions.serializationAdapters\n router.options.defaultSsr = startOptions.defaultSsr\n } else {\n serializationAdapters = []\n window.__TSS_START_OPTIONS__ = {\n serializationAdapters,\n } as AnyStartInstanceOptions\n }\n\n // Only spread plugin adapters if any are configured (this will tree-shake away otherwise)\n if (hasPluginAdapters) {\n serializationAdapters.push(...pluginSerializationAdapters)\n }\n serializationAdapters.push(ServerFunctionSerializationAdapter)\n if (router.options.serializationAdapters) {\n serializationAdapters.push(...router.options.serializationAdapters)\n }\n\n router.update({\n basepath: process.env.TSS_ROUTER_BASEPATH,\n ...{ serializationAdapters },\n })\n if (!router.stores.matchesId.get().length) {\n await hydrate(router)\n }\n\n return router\n}\n"],"mappings":";;;;;;AAYA,eAAsB,eAAmC;CACvD,MAAM,SAAS,MAAM,WAAW;CAEhC,IAAI;AACJ,KAAI,eAAe;EACjB,MAAM,eAAe,MAAM,cAAc,YAAY;AACrD,eAAa,wBACX,aAAa,yBAAyB,EAAE;AAC1C,SAAO,wBAAwB;AAC/B,0BAAwB,aAAa;AACrC,SAAO,QAAQ,aAAa,aAAa;QACpC;AACL,0BAAwB,EAAE;AAC1B,SAAO,wBAAwB,EAC7B,uBACD;;AAIH,KAAI,kBACF,uBAAsB,KAAK,GAAG,4BAA4B;AAE5D,uBAAsB,KAAK,mCAAmC;AAC9D,KAAI,OAAO,QAAQ,sBACjB,uBAAsB,KAAK,GAAG,OAAO,QAAQ,sBAAsB;AAGrE,QAAO,OAAO;EACZ,UAAU,QAAQ,IAAI;EACjB;EACN,CAAC;AACF,KAAI,CAAC,OAAO,OAAO,UAAU,KAAK,CAAC,OACjC,OAAM,QAAQ,OAAO;AAGvB,QAAO"}
1
+ {"version":3,"file":"hydrateStart.js","names":[],"sources":["../../../src/client/hydrateStart.ts"],"sourcesContent":["import { hydrate } from '@tanstack/router-core/ssr/client'\nimport { startInstance } from '#tanstack-start-entry'\nimport {\n hasPluginAdapters,\n pluginSerializationAdapters,\n} from '#tanstack-start-plugin-adapters'\nimport { getRouter } from '#tanstack-router-entry'\nimport { ServerFunctionSerializationAdapter } from './ServerFunctionSerializationAdapter'\nimport type { AnyRouter, AnySerializationAdapter } from '@tanstack/router-core'\nimport type { AnyStartInstanceOptions } from '../createStart'\n\ntype HotContext = {\n data?: Record<string, unknown>\n dispose?: (cb: (data: Record<string, unknown>) => void) => void\n}\n\ndeclare global {\n interface ImportMeta {\n hot?: HotContext\n webpackHot?: HotContext\n }\n}\n\nasync function hydrateStart(): Promise<AnyRouter> {\n const router = await getRouter()\n\n let serializationAdapters: Array<AnySerializationAdapter>\n if (startInstance) {\n const startOptions = await startInstance.getOptions()\n startOptions.serializationAdapters =\n startOptions.serializationAdapters ?? []\n window.__TSS_START_OPTIONS__ = startOptions as AnyStartInstanceOptions\n serializationAdapters = startOptions.serializationAdapters\n router.options.defaultSsr = startOptions.defaultSsr\n } else {\n serializationAdapters = []\n window.__TSS_START_OPTIONS__ = {\n serializationAdapters,\n } as AnyStartInstanceOptions\n }\n\n // Only spread plugin adapters if any are configured (this will tree-shake away otherwise)\n if (hasPluginAdapters) {\n serializationAdapters.push(...pluginSerializationAdapters)\n }\n serializationAdapters.push(ServerFunctionSerializationAdapter)\n if (router.options.serializationAdapters) {\n serializationAdapters.push(...router.options.serializationAdapters)\n }\n\n router.update({\n basepath: process.env.TSS_ROUTER_BASEPATH,\n ...{ serializationAdapters },\n })\n if (!router.stores.matchesId.get().length) {\n await hydrate(router)\n }\n\n return router\n}\n\nfunction hydrateStartWithHmr(): Promise<AnyRouter> {\n const hot = import.meta.hot ?? import.meta.webpackHot\n\n if (!hot) {\n return hydrateStart()\n }\n\n const key = 'tss-hydrate-start-promise'\n const hotData = (hot.data ??= {})\n let hydrationPromise = hotData[key] as Promise<AnyRouter> | undefined\n\n if (!hydrationPromise) {\n hydrationPromise = hydrateStart().catch((error) => {\n if (hotData[key] === hydrationPromise) {\n hotData[key] = undefined\n }\n\n throw error\n })\n\n hotData[key] = hydrationPromise\n }\n\n hot.dispose?.((data) => {\n data[key] = hotData[key]\n })\n\n return hydrationPromise\n}\n\nconst exportedHydrateStart =\n process.env.NODE_ENV !== 'production' ? hydrateStartWithHmr : hydrateStart\n\nexport { exportedHydrateStart as hydrateStart }\n"],"mappings":";;;;;;AAuBA,eAAe,eAAmC;CAChD,MAAM,SAAS,MAAM,WAAW;CAEhC,IAAI;AACJ,KAAI,eAAe;EACjB,MAAM,eAAe,MAAM,cAAc,YAAY;AACrD,eAAa,wBACX,aAAa,yBAAyB,EAAE;AAC1C,SAAO,wBAAwB;AAC/B,0BAAwB,aAAa;AACrC,SAAO,QAAQ,aAAa,aAAa;QACpC;AACL,0BAAwB,EAAE;AAC1B,SAAO,wBAAwB,EAC7B,uBACD;;AAIH,KAAI,kBACF,uBAAsB,KAAK,GAAG,4BAA4B;AAE5D,uBAAsB,KAAK,mCAAmC;AAC9D,KAAI,OAAO,QAAQ,sBACjB,uBAAsB,KAAK,GAAG,OAAO,QAAQ,sBAAsB;AAGrE,QAAO,OAAO;EACZ,UAAU,QAAQ,IAAI;EACjB;EACN,CAAC;AACF,KAAI,CAAC,OAAO,OAAO,UAAU,KAAK,CAAC,OACjC,OAAM,QAAQ,OAAO;AAGvB,QAAO;;AAGT,SAAS,sBAA0C;CACjD,MAAM,MAAA,OAAA,KAAA,OAAyB,OAAO,KAAK;AAE3C,KAAI,CAAC,IACH,QAAO,cAAc;CAGvB,MAAM,MAAM;CACZ,MAAM,UAAW,IAAI,SAAS,EAAE;CAChC,IAAI,mBAAmB,QAAQ;AAE/B,KAAI,CAAC,kBAAkB;AACrB,qBAAmB,cAAc,CAAC,OAAO,UAAU;AACjD,OAAI,QAAQ,SAAS,iBACnB,SAAQ,OAAO,KAAA;AAGjB,SAAM;IACN;AAEF,UAAQ,OAAO;;AAGjB,KAAI,WAAW,SAAS;AACtB,OAAK,OAAO,QAAQ;GACpB;AAEF,QAAO;;AAGT,IAAM,uBAAA,QAAA,IAAA,aACqB,eAAe,sBAAsB"}
@@ -1,2 +1,2 @@
1
- import { hydrateStart } from "./hydrateStart.js";
2
- export { hydrateStart };
1
+ import { exportedHydrateStart } from "./hydrateStart.js";
2
+ export { exportedHydrateStart as hydrateStart };
@@ -0,0 +1,5 @@
1
+ import { HydrationStrategy } from './types.js';
2
+ declare const conditionType = "condition";
3
+ export type HydrationCondition = boolean | (() => boolean);
4
+ export declare function condition(condition: HydrationCondition): HydrationStrategy<typeof conditionType, false>;
5
+ export {};
@@ -0,0 +1,16 @@
1
+ //#region src/hydration/condition.ts
2
+ var conditionType = "condition";
3
+ /* @__NO_SIDE_EFFECTS__ */
4
+ function condition(condition) {
5
+ return {
6
+ _t: conditionType,
7
+ _d: () => !(typeof condition === "function" ? condition() : condition),
8
+ _s: ({ gate }) => {
9
+ if (typeof condition === "function" ? condition() : condition) gate.resolve();
10
+ }
11
+ };
12
+ }
13
+ //#endregion
14
+ export { condition };
15
+
16
+ //# sourceMappingURL=condition.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"condition.js","names":[],"sources":["../../../src/hydration/condition.ts"],"sourcesContent":["import type { HydrationStrategy } from './types'\n\nconst conditionType = 'condition'\n\nexport type HydrationCondition = boolean | (() => boolean)\n\n/* @__NO_SIDE_EFFECTS__ */\nexport function condition(\n condition: HydrationCondition,\n): HydrationStrategy<typeof conditionType, false> {\n return {\n _t: conditionType,\n _d: () => !(typeof condition === 'function' ? condition() : condition),\n _s: ({ gate }) => {\n if (typeof condition === 'function' ? condition() : condition) {\n gate!.resolve()\n }\n },\n }\n}\n"],"mappings":";AAEA,IAAM,gBAAgB;;AAKtB,SAAgB,UACd,WACgD;AAChD,QAAO;EACL,IAAI;EACJ,UAAU,EAAE,OAAO,cAAc,aAAa,WAAW,GAAG;EAC5D,KAAK,EAAE,WAAW;AAChB,OAAI,OAAO,cAAc,aAAa,WAAW,GAAG,UAClD,MAAM,SAAS;;EAGpB"}
@@ -0,0 +1,3 @@
1
+ export declare const hydrateIdAttribute = "data-ts-hydrate-id";
2
+ export declare const hydrateWhenAttribute = "data-ts-hydrate-when";
3
+ export declare const hydrateInteractionEventsAttribute = "data-ts-hydrate-interaction-events";
@@ -0,0 +1,8 @@
1
+ //#region src/hydration/constants.ts
2
+ var hydrateIdAttribute = "data-ts-hydrate-id";
3
+ var hydrateWhenAttribute = "data-ts-hydrate-when";
4
+ var hydrateInteractionEventsAttribute = "data-ts-hydrate-interaction-events";
5
+ //#endregion
6
+ export { hydrateIdAttribute, hydrateInteractionEventsAttribute, hydrateWhenAttribute };
7
+
8
+ //# sourceMappingURL=constants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.js","names":[],"sources":["../../../src/hydration/constants.ts"],"sourcesContent":["export const hydrateIdAttribute = 'data-ts-hydrate-id'\nexport const hydrateWhenAttribute = 'data-ts-hydrate-when'\nexport const hydrateInteractionEventsAttribute =\n 'data-ts-hydrate-interaction-events'\n"],"mappings":";AAAA,IAAa,qBAAqB;AAClC,IAAa,uBAAuB;AACpC,IAAa,oCACX"}
@@ -0,0 +1,7 @@
1
+ import { HydrationPrefetchStrategy } from './types.js';
2
+ declare const idleType = "idle";
3
+ export type IdleHydrationOptions = {
4
+ timeout?: number;
5
+ };
6
+ export declare function idle(options?: IdleHydrationOptions): HydrationPrefetchStrategy<typeof idleType>;
7
+ export {};
@@ -0,0 +1,22 @@
1
+ //#region src/hydration/idle.ts
2
+ var idleType = "idle";
3
+ function idle(options = {}) {
4
+ const timeout = options.timeout ?? 2e3;
5
+ return {
6
+ _t: idleType,
7
+ _s: ({ gate, prefetch }) => {
8
+ const schedule = globalThis;
9
+ const callback = prefetch ?? gate.resolve;
10
+ if (schedule.requestIdleCallback) {
11
+ const handle = schedule.requestIdleCallback(callback, { timeout });
12
+ return () => schedule.cancelIdleCallback?.(handle);
13
+ }
14
+ const timeoutId = globalThis.setTimeout(callback, timeout);
15
+ return () => globalThis.clearTimeout(timeoutId);
16
+ }
17
+ };
18
+ }
19
+ //#endregion
20
+ export { idle };
21
+
22
+ //# sourceMappingURL=idle.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"idle.js","names":[],"sources":["../../../src/hydration/idle.ts"],"sourcesContent":["import type { HydrationPrefetchStrategy } from './types'\n\nconst idleType = 'idle'\n\nexport type IdleHydrationOptions = {\n timeout?: number\n}\n\nexport function idle(\n options: IdleHydrationOptions = {},\n): HydrationPrefetchStrategy<typeof idleType> {\n const timeout = options.timeout ?? 2000\n\n return {\n _t: idleType,\n _s: ({ gate, prefetch }) => {\n const schedule = globalThis as unknown as {\n requestIdleCallback?: (\n callback: IdleRequestCallback,\n options?: IdleRequestOptions,\n ) => number\n cancelIdleCallback?: (handle: number) => void\n }\n const callback = prefetch ?? gate!.resolve\n\n if (schedule.requestIdleCallback) {\n const handle = schedule.requestIdleCallback(callback, { timeout })\n return () => schedule.cancelIdleCallback?.(handle)\n }\n\n const timeoutId = globalThis.setTimeout(callback, timeout)\n return () => globalThis.clearTimeout(timeoutId)\n },\n }\n}\n"],"mappings":";AAEA,IAAM,WAAW;AAMjB,SAAgB,KACd,UAAgC,EAAE,EACU;CAC5C,MAAM,UAAU,QAAQ,WAAW;AAEnC,QAAO;EACL,IAAI;EACJ,KAAK,EAAE,MAAM,eAAe;GAC1B,MAAM,WAAW;GAOjB,MAAM,WAAW,YAAY,KAAM;AAEnC,OAAI,SAAS,qBAAqB;IAChC,MAAM,SAAS,SAAS,oBAAoB,UAAU,EAAE,SAAS,CAAC;AAClE,iBAAa,SAAS,qBAAqB,OAAO;;GAGpD,MAAM,YAAY,WAAW,WAAW,UAAU,QAAQ;AAC1D,gBAAa,WAAW,aAAa,UAAU;;EAElD"}
@@ -0,0 +1,8 @@
1
+ import { HydrationInteractionEvents, HydrationPrefetchStrategy, HydrationRuntimeContext } from './types.js';
2
+ export type InteractionHydrationOptions = {
3
+ events?: HydrationInteractionEvents;
4
+ };
5
+ declare const interactionType = "interaction";
6
+ export declare function listenForDelegatedHydrationIntent(element: Element, context: HydrationRuntimeContext): (() => void) | undefined;
7
+ export declare function interaction(options?: InteractionHydrationOptions): HydrationPrefetchStrategy<typeof interactionType>;
8
+ export {};
@@ -0,0 +1,221 @@
1
+ import { hydrateIdAttribute, hydrateInteractionEventsAttribute, hydrateWhenAttribute } from "./constants.js";
2
+ import { clearResolvedGateIdsInMarker, getMarkerGate, resolveHydrationMarker } from "./runtime.js";
3
+ //#region src/hydration/interaction.ts
4
+ var hydrateIdSelector = `[${hydrateIdAttribute}]`;
5
+ var defaultInteractionEvents = [
6
+ "pointerenter",
7
+ "focusin",
8
+ "pointerdown",
9
+ "click"
10
+ ];
11
+ var supportedInteractionEvents = [
12
+ "auxclick",
13
+ "click",
14
+ "contextmenu",
15
+ "dblclick",
16
+ "focusin",
17
+ "keydown",
18
+ "keyup",
19
+ "mousedown",
20
+ "mouseenter",
21
+ "mouseover",
22
+ "mouseup",
23
+ "pointerdown",
24
+ "pointerenter",
25
+ "pointerover",
26
+ "pointerup"
27
+ ];
28
+ var interactionType = "interaction";
29
+ var dynamicType = "dynamic";
30
+ var delegatedHydrateSelector = `${`[${hydrateWhenAttribute}="${interactionType}"]`},[${hydrateWhenAttribute}="${dynamicType}"]`;
31
+ var replayEventsByGateId = /* @__PURE__ */ new Map();
32
+ function getIntentListenerEvents(marker, events) {
33
+ const listenerEvents = new Set(events);
34
+ marker.querySelectorAll(delegatedHydrateSelector).forEach((childMarker) => {
35
+ if (childMarker.getAttribute("data-ts-hydrate-when") === dynamicType) {
36
+ supportedInteractionEvents.forEach((eventName) => {
37
+ listenerEvents.add(eventName);
38
+ });
39
+ return;
40
+ }
41
+ const attr = childMarker.getAttribute(hydrateInteractionEventsAttribute);
42
+ for (const eventName of attr === null ? defaultInteractionEvents : attr.split(/\s+/).filter(Boolean)) listenerEvents.add(eventName);
43
+ });
44
+ return [...listenerEvents];
45
+ }
46
+ function queueHydrationReplayEvent(marker, event) {
47
+ if (!event.bubbles) return;
48
+ const id = marker.getAttribute(hydrateIdAttribute);
49
+ const when = marker.getAttribute(hydrateWhenAttribute);
50
+ if (!id || !when || when === "never") return;
51
+ const target = event.target;
52
+ if (!target) return;
53
+ if (getMarkerGate(marker)?.resolved) return;
54
+ event.preventDefault();
55
+ event.stopPropagation();
56
+ event.stopImmediatePropagation();
57
+ let targetPath = [];
58
+ if (target instanceof Node && marker.contains(target)) {
59
+ let node = target instanceof Element ? target : target.parentElement;
60
+ while (node && node !== marker) {
61
+ const parent = node.parentElement;
62
+ if (!parent) {
63
+ targetPath = [];
64
+ break;
65
+ }
66
+ targetPath.push(Array.prototype.indexOf.call(parent.children, node));
67
+ node = parent;
68
+ }
69
+ targetPath.reverse();
70
+ }
71
+ const pendingEvents = replayEventsByGateId.get(id) ?? [];
72
+ pendingEvents.push({
73
+ marker,
74
+ targetPath,
75
+ type: event.type,
76
+ event
77
+ });
78
+ replayEventsByGateId.set(id, pendingEvents);
79
+ }
80
+ if (typeof document !== "undefined") {
81
+ const onIntent = (event) => {
82
+ const target = event.target;
83
+ if (!(target instanceof Element)) return;
84
+ let marker = target.closest(hydrateIdSelector);
85
+ const markers = [];
86
+ let shouldHandle = false;
87
+ while (marker) {
88
+ markers.push(marker);
89
+ const when = marker.getAttribute(hydrateWhenAttribute);
90
+ if (when === dynamicType) shouldHandle ||= event.type === "click";
91
+ else if (when === interactionType) {
92
+ const attr = marker.getAttribute(hydrateInteractionEventsAttribute);
93
+ const events = attr === null ? defaultInteractionEvents : attr.split(/\s+/).filter(Boolean);
94
+ shouldHandle ||= events.includes(event.type);
95
+ }
96
+ marker = marker.parentElement?.closest(hydrateIdSelector) ?? null;
97
+ }
98
+ if (!shouldHandle) return;
99
+ markers.reverse();
100
+ if (markers.every((marker) => getMarkerGate(marker))) return;
101
+ markers.forEach((marker) => {
102
+ queueHydrationReplayEvent(marker, event);
103
+ resolveHydrationMarker(marker);
104
+ });
105
+ };
106
+ supportedInteractionEvents.forEach((eventName) => {
107
+ document.addEventListener(eventName, onIntent, true);
108
+ });
109
+ }
110
+ function listenForIntent(element, events, context) {
111
+ const onIntent = (event) => {
112
+ const target = event.target;
113
+ let marker;
114
+ if (target instanceof Element) {
115
+ const closestMarker = target.closest(hydrateIdSelector);
116
+ marker = closestMarker && element.contains(closestMarker) ? closestMarker : element;
117
+ } else marker = element;
118
+ const markers = [];
119
+ while (marker) {
120
+ if (marker.hasAttribute("data-ts-hydrate-id")) markers.push(marker);
121
+ if (marker === element) break;
122
+ marker = marker.parentElement;
123
+ }
124
+ if (!markers.includes(element)) markers.push(element);
125
+ markers.reverse();
126
+ if (context.delegated && !markers.some((marker) => marker.getAttribute("data-ts-hydrate-when") === interactionType || marker.getAttribute("data-ts-hydrate-when") === dynamicType)) return;
127
+ markers.forEach((marker) => {
128
+ queueHydrationReplayEvent(marker, event);
129
+ resolveHydrationMarker(marker);
130
+ });
131
+ };
132
+ let disposed = false;
133
+ events.forEach((eventName) => {
134
+ element.addEventListener(eventName, onIntent, true);
135
+ });
136
+ return () => {
137
+ if (disposed) return;
138
+ disposed = true;
139
+ events.forEach((eventName) => {
140
+ element.removeEventListener(eventName, onIntent, true);
141
+ });
142
+ };
143
+ }
144
+ function listenForDelegatedHydrationIntent(element, context) {
145
+ const listenerEvents = getIntentListenerEvents(element, []);
146
+ if (!listenerEvents.length) return;
147
+ const cleanupIntent = listenForIntent(element, listenerEvents, {
148
+ ...context,
149
+ delegated: true
150
+ });
151
+ return () => {
152
+ cleanupIntent();
153
+ clearResolvedGateIdsInMarker(element);
154
+ };
155
+ }
156
+ /* @__NO_SIDE_EFFECTS__ */
157
+ function interaction(options = {}) {
158
+ let events = defaultInteractionEvents;
159
+ if (options.events !== void 0) {
160
+ const eventList = typeof options.events === "string" ? [options.events] : options.events;
161
+ const normalizedEvents = [];
162
+ const seen = /* @__PURE__ */ new Set();
163
+ for (const eventName of eventList) {
164
+ if (!eventName || seen.has(eventName)) continue;
165
+ seen.add(eventName);
166
+ normalizedEvents.push(eventName);
167
+ }
168
+ events = normalizedEvents;
169
+ }
170
+ const eventKey = events.join(" ");
171
+ return {
172
+ _t: interactionType,
173
+ _s: (context) => {
174
+ const element = context.element;
175
+ if (!element) return;
176
+ const prefetch = context.prefetch;
177
+ if (prefetch) {
178
+ if (!events.length) return;
179
+ let disposed = false;
180
+ events.forEach((eventName) => {
181
+ element.addEventListener(eventName, prefetch, true);
182
+ });
183
+ return () => {
184
+ if (disposed) return;
185
+ disposed = true;
186
+ events.forEach((eventName) => {
187
+ element.removeEventListener(eventName, prefetch, true);
188
+ });
189
+ };
190
+ }
191
+ const listenerEvents = getIntentListenerEvents(element, events);
192
+ const cleanupIntent = listenerEvents.length ? listenForIntent(element, listenerEvents, context) : void 0;
193
+ return () => {
194
+ cleanupIntent?.();
195
+ clearResolvedGateIdsInMarker(element);
196
+ };
197
+ },
198
+ _o: (id) => {
199
+ globalThis.requestAnimationFrame(() => {
200
+ const pendingEvents = replayEventsByGateId.get(id);
201
+ if (!pendingEvents?.length) return;
202
+ replayEventsByGateId.delete(id);
203
+ for (const pendingEvent of pendingEvents) {
204
+ let replayTarget = pendingEvent.marker;
205
+ for (const index of pendingEvent.targetPath) {
206
+ replayTarget = replayTarget.children[index] ?? null;
207
+ if (!replayTarget) break;
208
+ }
209
+ const event = pendingEvent.event;
210
+ replayTarget ??= pendingEvent.marker;
211
+ replayTarget.dispatchEvent(event instanceof MouseEvent ? new MouseEvent(event.type, event) : event instanceof FocusEvent ? new FocusEvent(event.type, event) : new Event(event.type, event));
212
+ }
213
+ });
214
+ },
215
+ _a: () => options.events === void 0 ? void 0 : { [hydrateInteractionEventsAttribute]: eventKey }
216
+ };
217
+ }
218
+ //#endregion
219
+ export { interaction, listenForDelegatedHydrationIntent };
220
+
221
+ //# sourceMappingURL=interaction.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"interaction.js","names":[],"sources":["../../../src/hydration/interaction.ts"],"sourcesContent":["import {\n hydrateIdAttribute,\n hydrateInteractionEventsAttribute,\n hydrateWhenAttribute,\n} from './constants'\nimport {\n clearResolvedGateIdsInMarker,\n getMarkerGate,\n resolveHydrationMarker,\n} from './runtime'\nimport type {\n HydrationInteractionEvents,\n HydrationPrefetchStrategy,\n HydrationRuntimeContext,\n} from './types'\n\nexport type InteractionHydrationOptions = {\n events?: HydrationInteractionEvents\n}\n\nconst hydrateIdSelector = `[${hydrateIdAttribute}]`\n\ntype PendingReplayEvent = {\n marker: Element\n targetPath: Array<number>\n type: string\n event: Event\n}\n\nconst defaultInteractionEvents = [\n 'pointerenter',\n 'focusin',\n 'pointerdown',\n 'click',\n] as const\nconst supportedInteractionEvents = [\n 'auxclick',\n 'click',\n 'contextmenu',\n 'dblclick',\n 'focusin',\n 'keydown',\n 'keyup',\n 'mousedown',\n 'mouseenter',\n 'mouseover',\n 'mouseup',\n 'pointerdown',\n 'pointerenter',\n 'pointerover',\n 'pointerup',\n] as const\nconst interactionType = 'interaction'\nconst dynamicType = 'dynamic'\nconst interactionHydrateSelector = `[${hydrateWhenAttribute}=\"${interactionType}\"]`\nconst delegatedHydrateSelector = `${interactionHydrateSelector},[${hydrateWhenAttribute}=\"${dynamicType}\"]`\nconst replayEventsByGateId = /* @__PURE__ */ new Map<\n string,\n Array<PendingReplayEvent>\n>()\n\nfunction getIntentListenerEvents(\n marker: Element,\n events: ReadonlyArray<string>,\n) {\n const listenerEvents = new Set(events)\n\n marker.querySelectorAll(delegatedHydrateSelector).forEach((childMarker) => {\n if (childMarker.getAttribute(hydrateWhenAttribute) === dynamicType) {\n supportedInteractionEvents.forEach((eventName) => {\n listenerEvents.add(eventName)\n })\n return\n }\n\n const attr = childMarker.getAttribute(hydrateInteractionEventsAttribute)\n for (const eventName of attr === null\n ? defaultInteractionEvents\n : attr.split(/\\s+/).filter(Boolean)) {\n listenerEvents.add(eventName)\n }\n })\n\n return [...listenerEvents]\n}\n\nfunction queueHydrationReplayEvent(marker: Element, event: Event) {\n if (!event.bubbles) return\n\n const id = marker.getAttribute(hydrateIdAttribute)\n const when = marker.getAttribute(hydrateWhenAttribute)\n if (!id || !when || when === 'never') return\n\n const target = event.target\n if (!target) return\n\n const gate = getMarkerGate(marker)\n if (gate?.resolved) return\n\n event.preventDefault()\n event.stopPropagation()\n event.stopImmediatePropagation()\n\n let targetPath: Array<number> = []\n if (target instanceof Node && marker.contains(target)) {\n let node: Element | null =\n target instanceof Element ? target : target.parentElement\n\n while (node && node !== marker) {\n const parent = node.parentElement\n if (!parent) {\n targetPath = []\n break\n }\n targetPath.push(Array.prototype.indexOf.call(parent.children, node))\n node = parent\n }\n targetPath.reverse()\n }\n\n const pendingEvents = replayEventsByGateId.get(id) ?? []\n pendingEvents.push({\n marker,\n targetPath,\n type: event.type,\n event,\n })\n replayEventsByGateId.set(id, pendingEvents)\n}\n\nif (typeof document !== 'undefined') {\n const onIntent = (event: Event) => {\n const target = event.target\n if (!(target instanceof Element)) return\n\n let marker: Element | null = target.closest(hydrateIdSelector)\n const markers: Array<Element> = []\n let shouldHandle = false\n\n while (marker) {\n markers.push(marker)\n\n const when = marker.getAttribute(hydrateWhenAttribute)\n if (when === dynamicType) {\n shouldHandle ||= event.type === 'click'\n } else if (when === interactionType) {\n const attr = marker.getAttribute(hydrateInteractionEventsAttribute)\n const events: ReadonlyArray<string> =\n attr === null\n ? defaultInteractionEvents\n : attr.split(/\\s+/).filter(Boolean)\n shouldHandle ||= events.includes(event.type)\n }\n\n marker = marker.parentElement?.closest(hydrateIdSelector) ?? null\n }\n\n if (!shouldHandle) return\n\n markers.reverse()\n if (markers.every((marker) => getMarkerGate(marker))) return\n\n markers.forEach((marker) => {\n queueHydrationReplayEvent(marker, event)\n resolveHydrationMarker(marker)\n })\n }\n\n supportedInteractionEvents.forEach((eventName) => {\n document.addEventListener(eventName, onIntent, true)\n })\n}\n\nfunction listenForIntent(\n element: Element,\n events: ReadonlyArray<string>,\n context: HydrationRuntimeContext,\n) {\n const onIntent = (event: Event) => {\n const target = event.target\n let marker: Element | null\n if (target instanceof Element) {\n const closestMarker = target.closest(hydrateIdSelector)\n marker =\n closestMarker && element.contains(closestMarker)\n ? closestMarker\n : element\n } else {\n marker = element\n }\n\n const markers: Array<Element> = []\n while (marker) {\n if (marker.hasAttribute(hydrateIdAttribute)) {\n markers.push(marker)\n }\n if (marker === element) break\n marker = marker.parentElement\n }\n\n if (!markers.includes(element)) {\n markers.push(element)\n }\n\n markers.reverse()\n\n if (\n context.delegated &&\n !markers.some(\n (marker) =>\n marker.getAttribute(hydrateWhenAttribute) === interactionType ||\n marker.getAttribute(hydrateWhenAttribute) === dynamicType,\n )\n ) {\n return\n }\n\n markers.forEach((marker) => {\n queueHydrationReplayEvent(marker, event)\n resolveHydrationMarker(marker)\n })\n }\n let disposed = false\n\n events.forEach((eventName) => {\n element.addEventListener(eventName, onIntent, true)\n })\n\n return () => {\n if (disposed) return\n disposed = true\n events.forEach((eventName) => {\n element.removeEventListener(eventName, onIntent, true)\n })\n }\n}\n\nexport function listenForDelegatedHydrationIntent(\n element: Element,\n context: HydrationRuntimeContext,\n) {\n const listenerEvents = getIntentListenerEvents(element, [])\n if (!listenerEvents.length) return\n\n const cleanupIntent = listenForIntent(element, listenerEvents, {\n ...context,\n delegated: true,\n })\n return () => {\n cleanupIntent()\n clearResolvedGateIdsInMarker(element)\n }\n}\n\n/* @__NO_SIDE_EFFECTS__ */\nexport function interaction(\n options: InteractionHydrationOptions = {},\n): HydrationPrefetchStrategy<typeof interactionType> {\n let events: ReadonlyArray<string> = defaultInteractionEvents\n if (options.events !== undefined) {\n const eventList: ReadonlyArray<string> =\n typeof options.events === 'string' ? [options.events] : options.events\n const normalizedEvents: Array<string> = []\n const seen = new Set<string>()\n\n for (const eventName of eventList) {\n if (!eventName || seen.has(eventName)) continue\n seen.add(eventName)\n normalizedEvents.push(eventName)\n }\n\n events = normalizedEvents\n }\n\n const eventKey = events.join(' ')\n\n return {\n _t: interactionType,\n _s: (context) => {\n const element = context.element\n if (!element) return\n const prefetch = context.prefetch\n if (prefetch) {\n if (!events.length) return\n let disposed = false\n\n events.forEach((eventName) => {\n element.addEventListener(eventName, prefetch, true)\n })\n\n return () => {\n if (disposed) return\n disposed = true\n events.forEach((eventName) => {\n element.removeEventListener(eventName, prefetch, true)\n })\n }\n }\n\n const listenerEvents = getIntentListenerEvents(element, events)\n const cleanupIntent = listenerEvents.length\n ? listenForIntent(element, listenerEvents, context)\n : undefined\n return () => {\n cleanupIntent?.()\n clearResolvedGateIdsInMarker(element)\n }\n },\n _o: (id) => {\n globalThis.requestAnimationFrame(() => {\n const pendingEvents = replayEventsByGateId.get(id)\n if (!pendingEvents?.length) return\n\n replayEventsByGateId.delete(id)\n\n for (const pendingEvent of pendingEvents) {\n let replayTarget: Element | null = pendingEvent.marker\n for (const index of pendingEvent.targetPath) {\n replayTarget = replayTarget.children[index] ?? null\n if (!replayTarget) break\n }\n\n const event = pendingEvent.event\n replayTarget ??= pendingEvent.marker\n replayTarget.dispatchEvent(\n event instanceof MouseEvent\n ? new MouseEvent(event.type, event)\n : event instanceof FocusEvent\n ? new FocusEvent(event.type, event)\n : new Event(event.type, event),\n )\n }\n })\n },\n _a: () =>\n options.events === undefined\n ? undefined\n : {\n [hydrateInteractionEventsAttribute]: eventKey,\n },\n }\n}\n"],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import { HydrationPrefetchStrategy } from './types.js';
2
+ declare const loadType = "load";
3
+ export declare function load(): HydrationPrefetchStrategy<typeof loadType>;
4
+ export {};
@@ -0,0 +1,16 @@
1
+ //#region src/hydration/load.ts
2
+ var loadStrategy = {
3
+ _t: "load",
4
+ _d: () => false,
5
+ _s: ({ gate, prefetch }) => {
6
+ (prefetch ?? gate.resolve)();
7
+ }
8
+ };
9
+ /* @__NO_SIDE_EFFECTS__ */
10
+ function load() {
11
+ return loadStrategy;
12
+ }
13
+ //#endregion
14
+ export { load };
15
+
16
+ //# sourceMappingURL=load.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"load.js","names":[],"sources":["../../../src/hydration/load.ts"],"sourcesContent":["import type { HydrationPrefetchStrategy } from './types'\n\nconst loadType = 'load'\n\nconst loadStrategy: HydrationPrefetchStrategy<typeof loadType> = {\n _t: loadType,\n _d: () => false,\n _s: ({ gate, prefetch }) => {\n ;(prefetch ?? gate!.resolve)()\n },\n}\n\n/* @__NO_SIDE_EFFECTS__ */\nexport function load(): HydrationPrefetchStrategy<typeof loadType> {\n return loadStrategy\n}\n"],"mappings":";AAIA,IAAM,eAA2D;CAC/D,IAHe;CAIf,UAAU;CACV,KAAK,EAAE,MAAM,eAAe;AACzB,GAAC,YAAY,KAAM,UAAU;;CAEjC;;AAGD,SAAgB,OAAmD;AACjE,QAAO"}
@@ -0,0 +1,4 @@
1
+ import { HydrationPrefetchStrategy } from './types.js';
2
+ declare const mediaType = "media";
3
+ export declare function media(query: string): HydrationPrefetchStrategy<typeof mediaType>;
4
+ export {};
@@ -0,0 +1,23 @@
1
+ //#region src/hydration/media.ts
2
+ var mediaType = "media";
3
+ /* @__NO_SIDE_EFFECTS__ */
4
+ function media(query) {
5
+ return {
6
+ _t: mediaType,
7
+ _s: ({ gate, prefetch }) => {
8
+ if (!query) return;
9
+ const callback = prefetch ?? gate.resolve;
10
+ const mediaQuery = window.matchMedia(query);
11
+ const onChange = () => {
12
+ if (mediaQuery.matches) callback();
13
+ };
14
+ mediaQuery.addEventListener("change", onChange);
15
+ onChange();
16
+ return () => mediaQuery.removeEventListener("change", onChange);
17
+ }
18
+ };
19
+ }
20
+ //#endregion
21
+ export { media };
22
+
23
+ //# sourceMappingURL=media.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"media.js","names":[],"sources":["../../../src/hydration/media.ts"],"sourcesContent":["import type { HydrationPrefetchStrategy } from './types'\n\nconst mediaType = 'media'\n\n/* @__NO_SIDE_EFFECTS__ */\nexport function media(\n query: string,\n): HydrationPrefetchStrategy<typeof mediaType> {\n return {\n _t: mediaType,\n _s: ({ gate, prefetch }) => {\n if (!query) return\n\n const callback = prefetch ?? gate!.resolve\n const mediaQuery = window.matchMedia(query)\n const onChange = () => {\n if (mediaQuery.matches) callback()\n }\n mediaQuery.addEventListener('change', onChange)\n onChange()\n\n return () => mediaQuery.removeEventListener('change', onChange)\n },\n }\n}\n"],"mappings":";AAEA,IAAM,YAAY;;AAGlB,SAAgB,MACd,OAC6C;AAC7C,QAAO;EACL,IAAI;EACJ,KAAK,EAAE,MAAM,eAAe;AAC1B,OAAI,CAAC,MAAO;GAEZ,MAAM,WAAW,YAAY,KAAM;GACnC,MAAM,aAAa,OAAO,WAAW,MAAM;GAC3C,MAAM,iBAAiB;AACrB,QAAI,WAAW,QAAS,WAAU;;AAEpC,cAAW,iBAAiB,UAAU,SAAS;AAC/C,aAAU;AAEV,gBAAa,WAAW,oBAAoB,UAAU,SAAS;;EAElE"}
@@ -0,0 +1,4 @@
1
+ import { HydrationStrategy } from './types.js';
2
+ declare const neverType = "never";
3
+ export declare function never(): HydrationStrategy<typeof neverType, false>;
4
+ export {};
@@ -0,0 +1,13 @@
1
+ //#region src/hydration/never.ts
2
+ var neverStrategy = {
3
+ _t: "never",
4
+ _d: () => true
5
+ };
6
+ /* @__NO_SIDE_EFFECTS__ */
7
+ function never() {
8
+ return neverStrategy;
9
+ }
10
+ //#endregion
11
+ export { never };
12
+
13
+ //# sourceMappingURL=never.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"never.js","names":[],"sources":["../../../src/hydration/never.ts"],"sourcesContent":["import type { HydrationStrategy } from './types'\n\nconst neverType = 'never'\n\nconst neverStrategy: HydrationStrategy<typeof neverType, false> = {\n _t: neverType,\n _d: () => true,\n}\n\n/* @__NO_SIDE_EFFECTS__ */\nexport function never(): HydrationStrategy<typeof neverType, false> {\n return neverStrategy\n}\n"],"mappings":";AAIA,IAAM,gBAA4D;CAChE,IAHgB;CAIhB,UAAU;CACX;;AAGD,SAAgB,QAAoD;AAClE,QAAO"}
@@ -0,0 +1,5 @@
1
+ import { HydrationStrategy } from './types.js';
2
+ export type HydrationStrategyWithRenderer<TStrategy extends HydrationStrategy, TRenderer> = TStrategy & {
3
+ _h: TRenderer;
4
+ };
5
+ export declare function withHydrationRenderer<TStrategy extends HydrationStrategy, TRenderer>(strategy: TStrategy, renderer: TRenderer): HydrationStrategyWithRenderer<TStrategy, TRenderer>;
@@ -0,0 +1,9 @@
1
+ //#region src/hydration/renderer.ts
2
+ /* @__NO_SIDE_EFFECTS__ */
3
+ function withHydrationRenderer(strategy, renderer) {
4
+ return /* @__PURE__ */ Object.assign(strategy, { _h: renderer });
5
+ }
6
+ //#endregion
7
+ export { withHydrationRenderer };
8
+
9
+ //# sourceMappingURL=renderer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"renderer.js","names":[],"sources":["../../../src/hydration/renderer.ts"],"sourcesContent":["import type { HydrationStrategy } from './types'\n\nexport type HydrationStrategyWithRenderer<\n TStrategy extends HydrationStrategy,\n TRenderer,\n> = TStrategy & {\n _h: TRenderer\n}\n\n/* @__NO_SIDE_EFFECTS__ */\nexport function withHydrationRenderer<\n TStrategy extends HydrationStrategy,\n TRenderer,\n>(\n strategy: TStrategy,\n renderer: TRenderer,\n): HydrationStrategyWithRenderer<TStrategy, TRenderer> {\n return /* @__PURE__ */ Object.assign(strategy, {\n _h: renderer,\n })\n}\n"],"mappings":";;AAUA,SAAgB,sBAId,UACA,UACqD;AACrD,QAAuB,uBAAO,OAAO,UAAU,EAC7C,IAAI,UACL,CAAC"}
@@ -0,0 +1,23 @@
1
+ import { HydrationPrefetchStrategy, HydrationPrefetchWaitReason, HydrationRuntimeGate, HydrationWhen } from './types.js';
2
+ export type HydrationGateRecord = HydrationRuntimeGate & {
3
+ id: string;
4
+ when: HydrationWhen;
5
+ promise: Promise<void>;
6
+ consumers: number;
7
+ resolveListeners: Set<() => void>;
8
+ };
9
+ export declare function createResolvedGate(id: string, when: HydrationWhen): HydrationGateRecord;
10
+ export declare function getOrCreateGate(id: string, when: HydrationWhen): HydrationGateRecord;
11
+ export declare function releaseGate(gate: HydrationGateRecord): void;
12
+ export declare function onGateResolve(gate: HydrationGateRecord, listener: () => void): () => void;
13
+ export declare function runHydrationStrategyCleanup(cleanup: void | (() => void)): (() => void) | undefined;
14
+ export declare function waitForHydrationPrefetchStrategy(strategy: HydrationPrefetchStrategy, options: {
15
+ element: Element | null;
16
+ signal: AbortSignal;
17
+ onHydrate: (listener: () => void) => () => void;
18
+ }): Promise<HydrationPrefetchWaitReason>;
19
+ export declare function getMarkerGate(marker: Element): HydrationGateRecord | undefined;
20
+ export declare function resolveHydrationMarker(marker: Element): void;
21
+ export declare function clearResolvedGateIdsInMarker(marker: Element): void;
22
+ export declare function saveFallbackHtml(id: string, element: Element): void;
23
+ export declare function getFallbackHtml(id: string): string | undefined;