@tanstack/react-start-client 1.167.4 → 1.168.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.
- package/dist/esm/GenericHydrate.d.ts +3 -0
- package/dist/esm/GenericHydrate.js +243 -0
- package/dist/esm/GenericHydrate.js.map +1 -0
- package/dist/esm/Hydrate.d.ts +31 -0
- package/dist/esm/Hydrate.js +34 -0
- package/dist/esm/Hydrate.js.map +1 -0
- package/dist/esm/hydration/generic.d.ts +7 -0
- package/dist/esm/hydration/generic.js +20 -0
- package/dist/esm/hydration/generic.js.map +1 -0
- package/dist/esm/hydration/idle.d.ts +3 -0
- package/dist/esm/hydration/idle.js +12 -0
- package/dist/esm/hydration/idle.js.map +1 -0
- package/dist/esm/hydration/load.d.ts +5 -0
- package/dist/esm/hydration/load.js +33 -0
- package/dist/esm/hydration/load.js.map +1 -0
- package/dist/esm/hydration/never.d.ts +4 -0
- package/dist/esm/hydration/never.js +56 -0
- package/dist/esm/hydration/never.js.map +1 -0
- package/dist/esm/hydration/visible.d.ts +5 -0
- package/dist/esm/hydration/visible.js +94 -0
- package/dist/esm/hydration/visible.js.map +1 -0
- package/dist/esm/hydration.d.ts +7 -0
- package/dist/esm/hydration.js +7 -0
- package/dist/esm/index.d.ts +2 -0
- package/dist/esm/index.js +3 -1
- package/dist/esm/tests/Hydrate.test-d.d.ts +1 -0
- package/dist/esm/tests/Hydrate.test.d.ts +1 -0
- package/package.json +10 -4
- package/src/GenericHydrate.tsx +436 -0
- package/src/Hydrate.tsx +107 -0
- package/src/hydration/generic.ts +43 -0
- package/src/hydration/idle.ts +22 -0
- package/src/hydration/load.tsx +49 -0
- package/src/hydration/never.tsx +97 -0
- package/src/hydration/visible.tsx +139 -0
- package/src/hydration.ts +22 -0
- package/src/index.tsx +16 -0
- package/src/tests/Hydrate.test-d.tsx +147 -0
- package/src/tests/Hydrate.test.tsx +676 -0
|
@@ -0,0 +1,243 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { reactUse, useHydrated, useLayoutEffect } from "@tanstack/react-router";
|
|
3
|
+
import { jsx } from "react/jsx-runtime";
|
|
4
|
+
import * as React from "react";
|
|
5
|
+
import { isServer } from "@tanstack/router-core/isServer";
|
|
6
|
+
import { listenForDelegatedHydrationIntent } from "@tanstack/start-client-core/hydration";
|
|
7
|
+
import { hydrateIdAttribute, hydrateWhenAttribute } from "@tanstack/start-client-core/hydration/constants";
|
|
8
|
+
import { createResolvedGate, getFallbackHtml, getOrCreateGate, onGateResolve, releaseGate, runHydrationStrategyCleanup, saveFallbackHtml, waitForHydrationPrefetchStrategy } from "@tanstack/start-client-core/hydration/runtime";
|
|
9
|
+
//#region src/GenericHydrate.tsx
|
|
10
|
+
var dynamicType = "dynamic";
|
|
11
|
+
var dynamicHydrateStrategy = {
|
|
12
|
+
_t: dynamicType,
|
|
13
|
+
_d: () => true
|
|
14
|
+
};
|
|
15
|
+
function shouldDeferHydration(strategy) {
|
|
16
|
+
return strategy._d ? strategy._d() : strategy._t !== "load";
|
|
17
|
+
}
|
|
18
|
+
function useLatest(value) {
|
|
19
|
+
const ref = React.useRef(value);
|
|
20
|
+
ref.current = value;
|
|
21
|
+
return ref;
|
|
22
|
+
}
|
|
23
|
+
function useHydrationGate(props) {
|
|
24
|
+
const hydrated = useHydrated();
|
|
25
|
+
const reactId = React.useId();
|
|
26
|
+
const id = props.h ? `${props.h}${reactId}` : reactId;
|
|
27
|
+
const when = props.when;
|
|
28
|
+
const isDynamicHydrate = typeof when === "function";
|
|
29
|
+
const dynamicHydrateStrategyRef = React.useRef(void 0);
|
|
30
|
+
if (isDynamicHydrate) dynamicHydrateStrategyRef.current ??= isServer ?? typeof window === "undefined" ? dynamicHydrateStrategy : when();
|
|
31
|
+
const hydrateStrategy = isDynamicHydrate ? dynamicHydrateStrategyRef.current : when;
|
|
32
|
+
const markerHydrateType = isDynamicHydrate ? dynamicType : hydrateStrategy._t;
|
|
33
|
+
const [prefetchError, setPrefetchError] = React.useState();
|
|
34
|
+
const latestRef = useLatest({
|
|
35
|
+
prefetch: props.prefetch,
|
|
36
|
+
preload: props.p
|
|
37
|
+
});
|
|
38
|
+
const gateRef = React.useRef(void 0);
|
|
39
|
+
const markerElementRef = React.useRef(null);
|
|
40
|
+
const shouldPreserveServerHTMLRef = React.useRef(void 0);
|
|
41
|
+
const shouldDeferInitialHydrationRef = React.useRef(void 0);
|
|
42
|
+
const didPrefetchRef = React.useRef(false);
|
|
43
|
+
const prefetchControllerRef = React.useRef(void 0);
|
|
44
|
+
prefetchControllerRef.current ??= {
|
|
45
|
+
abortController: new AbortController(),
|
|
46
|
+
hydrationRequested: false,
|
|
47
|
+
hydrationListeners: /* @__PURE__ */ new Set(),
|
|
48
|
+
hydrationResolvePending: false,
|
|
49
|
+
started: false
|
|
50
|
+
};
|
|
51
|
+
shouldPreserveServerHTMLRef.current ??= (isServer ?? typeof window === "undefined") || !hydrated;
|
|
52
|
+
shouldDeferInitialHydrationRef.current ??= !hydrated && shouldDeferHydration(hydrateStrategy);
|
|
53
|
+
if (!gateRef.current) gateRef.current = isServer ?? typeof window === "undefined" ? createResolvedGate(id, hydrateStrategy._t) : getOrCreateGate(id, hydrateStrategy._t);
|
|
54
|
+
gateRef.current.when = hydrateStrategy._t;
|
|
55
|
+
if (!(isServer ?? typeof window === "undefined") && hydrateStrategy._t !== "never" && (!shouldDeferInitialHydrationRef.current || !shouldDeferHydration(hydrateStrategy))) gateRef.current.resolve();
|
|
56
|
+
const markerRef = React.useCallback((element) => {
|
|
57
|
+
markerElementRef.current = element;
|
|
58
|
+
if (element) {
|
|
59
|
+
if (hydrateStrategy._t === "never" && !shouldPreserveServerHTMLRef.current) element.replaceChildren();
|
|
60
|
+
saveFallbackHtml(id, element);
|
|
61
|
+
}
|
|
62
|
+
}, [hydrateStrategy._t, id]);
|
|
63
|
+
React.useEffect(() => {
|
|
64
|
+
const gate = gateRef.current;
|
|
65
|
+
return () => {
|
|
66
|
+
const controller = prefetchControllerRef.current;
|
|
67
|
+
controller?.abortController.abort();
|
|
68
|
+
controller?.cleanup?.();
|
|
69
|
+
controller?.hydrationListeners.clear();
|
|
70
|
+
releaseGate(gate);
|
|
71
|
+
};
|
|
72
|
+
}, []);
|
|
73
|
+
React.useEffect(() => {
|
|
74
|
+
if ((isServer ?? typeof window === "undefined") || !latestRef.current.prefetch) return;
|
|
75
|
+
const controller = prefetchControllerRef.current;
|
|
76
|
+
if (controller.started) return;
|
|
77
|
+
controller.started = true;
|
|
78
|
+
const onHydrate = (listener) => {
|
|
79
|
+
if (controller.hydrationRequested) {
|
|
80
|
+
listener();
|
|
81
|
+
return () => {};
|
|
82
|
+
}
|
|
83
|
+
controller.hydrationListeners.add(listener);
|
|
84
|
+
return () => {
|
|
85
|
+
controller.hydrationListeners.delete(listener);
|
|
86
|
+
};
|
|
87
|
+
};
|
|
88
|
+
const preload = () => latestRef.current.preload?.() ?? Promise.resolve();
|
|
89
|
+
const prefetchInput = latestRef.current.prefetch;
|
|
90
|
+
if (typeof prefetchInput === "function") {
|
|
91
|
+
const promise = Promise.resolve().then(() => prefetchInput({
|
|
92
|
+
element: markerElementRef.current,
|
|
93
|
+
signal: controller.abortController.signal,
|
|
94
|
+
preload,
|
|
95
|
+
waitFor: (strategy) => waitForHydrationPrefetchStrategy(strategy, {
|
|
96
|
+
element: markerElementRef.current,
|
|
97
|
+
signal: controller.abortController.signal,
|
|
98
|
+
onHydrate
|
|
99
|
+
})
|
|
100
|
+
})).then(() => void 0);
|
|
101
|
+
controller.promise = promise;
|
|
102
|
+
promise.catch((error) => {
|
|
103
|
+
if (!controller.abortController.signal.aborted) setPrefetchError(error);
|
|
104
|
+
});
|
|
105
|
+
return;
|
|
106
|
+
}
|
|
107
|
+
if (!latestRef.current.preload) return;
|
|
108
|
+
const prefetch = () => {
|
|
109
|
+
if (didPrefetchRef.current) return;
|
|
110
|
+
didPrefetchRef.current = true;
|
|
111
|
+
preload();
|
|
112
|
+
};
|
|
113
|
+
controller.cleanup = runHydrationStrategyCleanup(prefetchInput._s?.({
|
|
114
|
+
element: markerElementRef.current,
|
|
115
|
+
prefetch
|
|
116
|
+
}));
|
|
117
|
+
}, [hydrateStrategy, latestRef]);
|
|
118
|
+
useLayoutEffect(() => {
|
|
119
|
+
const gate = gateRef.current;
|
|
120
|
+
if (!shouldDeferInitialHydrationRef.current || hydrateStrategy._t === "never") return;
|
|
121
|
+
if (gate.resolved) return;
|
|
122
|
+
const cleanups = [];
|
|
123
|
+
let removeResolveListener = () => {};
|
|
124
|
+
let disposed = false;
|
|
125
|
+
const resolveGate = gate.resolve;
|
|
126
|
+
const cleanup = () => {
|
|
127
|
+
if (disposed) return;
|
|
128
|
+
disposed = true;
|
|
129
|
+
if (gate.resolve === requestHydration) gate.resolve = resolveGate;
|
|
130
|
+
removeResolveListener();
|
|
131
|
+
cleanups.forEach((fn) => fn());
|
|
132
|
+
};
|
|
133
|
+
const addCleanup = (fn) => {
|
|
134
|
+
if (!fn) return;
|
|
135
|
+
if (disposed || gate.resolved) {
|
|
136
|
+
fn();
|
|
137
|
+
return;
|
|
138
|
+
}
|
|
139
|
+
cleanups.push(fn);
|
|
140
|
+
};
|
|
141
|
+
const requestHydration = () => {
|
|
142
|
+
const controller = prefetchControllerRef.current;
|
|
143
|
+
if (!controller.hydrationRequested) {
|
|
144
|
+
controller.hydrationRequested = true;
|
|
145
|
+
controller.hydrationListeners.forEach((listener) => listener());
|
|
146
|
+
controller.hydrationListeners.clear();
|
|
147
|
+
}
|
|
148
|
+
if (!controller.promise) {
|
|
149
|
+
resolveGate();
|
|
150
|
+
return;
|
|
151
|
+
}
|
|
152
|
+
if (controller.hydrationResolvePending) return;
|
|
153
|
+
controller.hydrationResolvePending = true;
|
|
154
|
+
controller.promise.then(() => resolveGate(), (error) => {
|
|
155
|
+
if (!controller.abortController.signal.aborted) setPrefetchError(error);
|
|
156
|
+
});
|
|
157
|
+
};
|
|
158
|
+
gate.resolve = requestHydration;
|
|
159
|
+
removeResolveListener = onGateResolve(gate, cleanup);
|
|
160
|
+
const context = {
|
|
161
|
+
element: markerElementRef.current,
|
|
162
|
+
gate
|
|
163
|
+
};
|
|
164
|
+
addCleanup(runHydrationStrategyCleanup(hydrateStrategy._s?.(context)));
|
|
165
|
+
if (hydrateStrategy._t !== "interaction") addCleanup(runHydrationStrategyCleanup(markerElementRef.current ? listenForDelegatedHydrationIntent(markerElementRef.current, context) : void 0));
|
|
166
|
+
return cleanup;
|
|
167
|
+
}, [hydrateStrategy, latestRef]);
|
|
168
|
+
return {
|
|
169
|
+
gate: gateRef.current,
|
|
170
|
+
markerRef,
|
|
171
|
+
markerElementRef,
|
|
172
|
+
hydrateStrategy,
|
|
173
|
+
markerHydrateType,
|
|
174
|
+
prefetchError,
|
|
175
|
+
shouldPreserveServerHTML: shouldPreserveServerHTMLRef.current
|
|
176
|
+
};
|
|
177
|
+
}
|
|
178
|
+
function HydrationGate(props) {
|
|
179
|
+
if (isServer ?? typeof window === "undefined") return props.children;
|
|
180
|
+
if (props.gate.resolved) return props.children;
|
|
181
|
+
if (!reactUse) throw props.gate.promise;
|
|
182
|
+
reactUse(props.gate.promise);
|
|
183
|
+
return props.children;
|
|
184
|
+
}
|
|
185
|
+
function HydratedBoundary(props) {
|
|
186
|
+
const { id, onHydrated, onStrategyHydrated } = props;
|
|
187
|
+
const didHydrateRef = React.useRef(false);
|
|
188
|
+
React.useEffect(() => {
|
|
189
|
+
if (didHydrateRef.current) return;
|
|
190
|
+
didHydrateRef.current = true;
|
|
191
|
+
onHydrated?.();
|
|
192
|
+
onStrategyHydrated?.(id);
|
|
193
|
+
}, [
|
|
194
|
+
id,
|
|
195
|
+
onHydrated,
|
|
196
|
+
onStrategyHydrated
|
|
197
|
+
]);
|
|
198
|
+
return props.children;
|
|
199
|
+
}
|
|
200
|
+
function GenericHydrate(props) {
|
|
201
|
+
const { gate, hydrateStrategy, markerHydrateType, markerElementRef, markerRef, prefetchError, shouldPreserveServerHTML } = useHydrationGate(props);
|
|
202
|
+
if (prefetchError) throw prefetchError;
|
|
203
|
+
const fallback = shouldPreserveServerHTML ? (() => {
|
|
204
|
+
const html = getFallbackHtml(gate.id);
|
|
205
|
+
return html ? /* @__PURE__ */ jsx("div", {
|
|
206
|
+
style: { display: "contents" },
|
|
207
|
+
dangerouslySetInnerHTML: { __html: html }
|
|
208
|
+
}) : null;
|
|
209
|
+
})() : props.fallback ?? null;
|
|
210
|
+
const markerAttributes = markerHydrateType === dynamicType ? void 0 : hydrateStrategy._a?.();
|
|
211
|
+
if (hydrateStrategy._t === "never" && !shouldPreserveServerHTML) return /* @__PURE__ */ jsx("div", {
|
|
212
|
+
ref: markerRef,
|
|
213
|
+
[hydrateIdAttribute]: gate.id,
|
|
214
|
+
[hydrateWhenAttribute]: markerHydrateType,
|
|
215
|
+
...markerAttributes,
|
|
216
|
+
children: props.fallback ?? null
|
|
217
|
+
});
|
|
218
|
+
return /* @__PURE__ */ jsx("div", {
|
|
219
|
+
ref: markerRef,
|
|
220
|
+
[hydrateIdAttribute]: gate.id,
|
|
221
|
+
[hydrateWhenAttribute]: markerHydrateType,
|
|
222
|
+
...markerAttributes,
|
|
223
|
+
children: /* @__PURE__ */ jsx(React.Suspense, {
|
|
224
|
+
fallback,
|
|
225
|
+
children: /* @__PURE__ */ jsx(HydrationGate, {
|
|
226
|
+
gate,
|
|
227
|
+
children: /* @__PURE__ */ jsx(HydratedBoundary, {
|
|
228
|
+
id: gate.id,
|
|
229
|
+
onHydrated: props.onHydrated,
|
|
230
|
+
onStrategyHydrated: (id) => {
|
|
231
|
+
markerElementRef.current?.removeAttribute(hydrateWhenAttribute);
|
|
232
|
+
hydrateStrategy._o?.(id);
|
|
233
|
+
},
|
|
234
|
+
children: props.children
|
|
235
|
+
})
|
|
236
|
+
})
|
|
237
|
+
})
|
|
238
|
+
});
|
|
239
|
+
}
|
|
240
|
+
//#endregion
|
|
241
|
+
export { GenericHydrate };
|
|
242
|
+
|
|
243
|
+
//# sourceMappingURL=GenericHydrate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GenericHydrate.js","names":[],"sources":["../../src/GenericHydrate.tsx"],"sourcesContent":["'use client'\n\nimport * as React from 'react'\n\nimport { reactUse, useHydrated, useLayoutEffect } from '@tanstack/react-router'\nimport { isServer } from '@tanstack/router-core/isServer'\nimport {\n hydrateIdAttribute,\n hydrateWhenAttribute,\n} from '@tanstack/start-client-core/hydration/constants'\nimport {\n createResolvedGate,\n getFallbackHtml,\n getOrCreateGate,\n onGateResolve,\n releaseGate,\n runHydrationStrategyCleanup,\n saveFallbackHtml,\n waitForHydrationPrefetchStrategy,\n} from '@tanstack/start-client-core/hydration/runtime'\nimport { listenForDelegatedHydrationIntent } from '@tanstack/start-client-core/hydration'\nimport type {\n HydrationRuntimeContext,\n HydrationStrategy,\n HydrationWhen,\n} from '@tanstack/start-client-core/hydration'\nimport type { HydrationGateRecord } from '@tanstack/start-client-core/hydration/runtime'\nimport type { HydrateProps, InternalHydrateProps } from './Hydrate'\n\ntype Gate = HydrationGateRecord & { promise: Promise<void> }\ntype PrefetchController = {\n abortController: AbortController\n hydrationRequested: boolean\n hydrationListeners: Set<() => void>\n hydrationResolvePending: boolean\n started: boolean\n promise?: Promise<void>\n cleanup?: () => void\n}\n\nconst dynamicType = 'dynamic'\nconst dynamicHydrateStrategy = {\n _t: dynamicType,\n _d: () => true,\n} satisfies HydrationStrategy<typeof dynamicType, false>\n\nfunction shouldDeferHydration(strategy: HydrationStrategy) {\n return strategy._d ? strategy._d() : strategy._t !== 'load'\n}\n\nfunction useLatest<T>(value: T) {\n const ref = React.useRef(value)\n ref.current = value\n return ref\n}\n\nfunction useHydrationGate(props: InternalHydrateProps) {\n const hydrated = useHydrated()\n const reactId = React.useId()\n const id = props.h ? `${props.h}${reactId}` : reactId\n const when = props.when\n const isDynamicHydrate = typeof when === 'function'\n const dynamicHydrateStrategyRef = React.useRef<HydrationStrategy | undefined>(\n undefined,\n )\n if (isDynamicHydrate) {\n dynamicHydrateStrategyRef.current ??=\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n (isServer ?? typeof window === 'undefined')\n ? dynamicHydrateStrategy\n : when()\n }\n const hydrateStrategy = isDynamicHydrate\n ? dynamicHydrateStrategyRef.current!\n : when\n const markerHydrateType: HydrationWhen = isDynamicHydrate\n ? dynamicType\n : hydrateStrategy._t!\n const [prefetchError, setPrefetchError] = React.useState<unknown>()\n const latestRef = useLatest({\n prefetch: props.prefetch,\n preload: props.p,\n })\n const gateRef = React.useRef<HydrationGateRecord | undefined>(undefined)\n const markerElementRef = React.useRef<HTMLDivElement | null>(null)\n const shouldPreserveServerHTMLRef = React.useRef<boolean | undefined>(\n undefined,\n )\n const shouldDeferInitialHydrationRef = React.useRef<boolean | undefined>(\n undefined,\n )\n const didPrefetchRef = React.useRef(false)\n const prefetchControllerRef = React.useRef<PrefetchController | undefined>(\n undefined,\n )\n\n prefetchControllerRef.current ??= {\n abortController: new AbortController(),\n hydrationRequested: false,\n hydrationListeners: new Set<() => void>(),\n hydrationResolvePending: false,\n started: false,\n }\n\n shouldPreserveServerHTMLRef.current ??=\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n (isServer ?? typeof window === 'undefined') || !hydrated\n shouldDeferInitialHydrationRef.current ??=\n !hydrated && shouldDeferHydration(hydrateStrategy)\n\n if (!gateRef.current) {\n gateRef.current =\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n (isServer ?? typeof window === 'undefined')\n ? createResolvedGate(id, hydrateStrategy._t!)\n : getOrCreateGate(id, hydrateStrategy._t!)\n }\n\n gateRef.current.when = hydrateStrategy._t!\n\n if (\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n !(isServer ?? typeof window === 'undefined') &&\n hydrateStrategy._t !== 'never' &&\n (!shouldDeferInitialHydrationRef.current ||\n !shouldDeferHydration(hydrateStrategy))\n ) {\n gateRef.current.resolve()\n }\n\n const markerRef = React.useCallback(\n (element: HTMLDivElement | null) => {\n markerElementRef.current = element\n if (element) {\n if (\n hydrateStrategy._t === 'never' &&\n !shouldPreserveServerHTMLRef.current\n ) {\n element.replaceChildren()\n }\n saveFallbackHtml(id, element)\n }\n },\n [hydrateStrategy._t, id],\n )\n\n React.useEffect(() => {\n const gate = gateRef.current!\n return () => {\n const controller = prefetchControllerRef.current\n controller?.abortController.abort()\n controller?.cleanup?.()\n controller?.hydrationListeners.clear()\n releaseGate(gate)\n }\n }, [])\n\n React.useEffect(() => {\n if (\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n (isServer ?? typeof window === 'undefined') ||\n !latestRef.current.prefetch\n ) {\n return\n }\n\n const controller = prefetchControllerRef.current!\n if (controller.started) return\n controller.started = true\n\n const onHydrate = (listener: () => void) => {\n if (controller.hydrationRequested) {\n listener()\n return () => {}\n }\n\n controller.hydrationListeners.add(listener)\n return () => {\n controller.hydrationListeners.delete(listener)\n }\n }\n\n const preload = () => latestRef.current.preload?.() ?? Promise.resolve()\n const prefetchInput = latestRef.current.prefetch\n\n if (typeof prefetchInput === 'function') {\n const promise = Promise.resolve()\n .then(() =>\n prefetchInput({\n element: markerElementRef.current,\n signal: controller.abortController.signal,\n preload,\n waitFor: (strategy) =>\n waitForHydrationPrefetchStrategy(strategy, {\n element: markerElementRef.current,\n signal: controller.abortController.signal,\n onHydrate,\n }),\n }),\n )\n .then(() => undefined)\n\n controller.promise = promise\n promise.catch((error) => {\n if (!controller.abortController.signal.aborted) {\n setPrefetchError(error)\n }\n })\n return\n }\n\n if (!latestRef.current.preload) return\n\n const prefetch = () => {\n if (didPrefetchRef.current) return\n didPrefetchRef.current = true\n void preload()\n }\n\n controller.cleanup = runHydrationStrategyCleanup(\n prefetchInput._s?.({\n element: markerElementRef.current,\n prefetch,\n }),\n )\n }, [hydrateStrategy, latestRef])\n\n useLayoutEffect(() => {\n const gate = gateRef.current!\n if (\n !shouldDeferInitialHydrationRef.current ||\n hydrateStrategy._t === 'never'\n ) {\n return\n }\n\n if (gate.resolved) {\n return\n }\n\n const cleanups: Array<() => void> = []\n let removeResolveListener = () => {}\n let disposed = false\n const resolveGate = gate.resolve\n\n const cleanup = () => {\n if (disposed) return\n disposed = true\n if (gate.resolve === requestHydration) {\n gate.resolve = resolveGate\n }\n removeResolveListener()\n cleanups.forEach((fn) => fn())\n }\n\n const addCleanup = (fn: void | (() => void)) => {\n if (!fn) return\n if (disposed || gate.resolved) {\n fn()\n return\n }\n cleanups.push(fn)\n }\n\n const requestHydration = () => {\n const controller = prefetchControllerRef.current!\n if (!controller.hydrationRequested) {\n controller.hydrationRequested = true\n controller.hydrationListeners.forEach((listener) => listener())\n controller.hydrationListeners.clear()\n }\n\n if (!controller.promise) {\n resolveGate()\n return\n }\n if (controller.hydrationResolvePending) return\n controller.hydrationResolvePending = true\n\n controller.promise.then(\n () => resolveGate(),\n (error) => {\n if (!controller.abortController.signal.aborted) {\n setPrefetchError(error)\n }\n },\n )\n }\n\n gate.resolve = requestHydration\n removeResolveListener = onGateResolve(gate, cleanup)\n\n const context: HydrationRuntimeContext = {\n element: markerElementRef.current,\n gate,\n }\n addCleanup(runHydrationStrategyCleanup(hydrateStrategy._s?.(context)))\n\n if (hydrateStrategy._t !== 'interaction') {\n addCleanup(\n runHydrationStrategyCleanup(\n markerElementRef.current\n ? listenForDelegatedHydrationIntent(\n markerElementRef.current,\n context,\n )\n : undefined,\n ),\n )\n }\n\n return cleanup\n }, [hydrateStrategy, latestRef])\n\n return {\n gate: gateRef.current,\n markerRef,\n markerElementRef,\n hydrateStrategy,\n markerHydrateType,\n prefetchError,\n shouldPreserveServerHTML: shouldPreserveServerHTMLRef.current,\n }\n}\n\nfunction HydrationGate(props: { gate: Gate; children: React.ReactNode }) {\n if (\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n isServer ??\n typeof window === 'undefined'\n ) {\n return props.children as React.JSX.Element\n }\n\n if (props.gate.resolved) {\n return props.children as React.JSX.Element\n }\n\n if (!reactUse) {\n throw props.gate.promise\n }\n\n reactUse(props.gate.promise)\n\n return props.children as React.JSX.Element\n}\n\nfunction HydratedBoundary(props: {\n id: string\n onHydrated?: () => void\n onStrategyHydrated?: (id: string) => void\n children: React.ReactNode\n}) {\n const { id, onHydrated, onStrategyHydrated } = props\n const didHydrateRef = React.useRef(false)\n\n React.useEffect(() => {\n if (didHydrateRef.current) return\n didHydrateRef.current = true\n onHydrated?.()\n onStrategyHydrated?.(id)\n }, [id, onHydrated, onStrategyHydrated])\n\n return props.children as React.JSX.Element\n}\n\nexport function GenericHydrate(props: HydrateProps): React.JSX.Element {\n const internalProps = props as InternalHydrateProps\n const {\n gate,\n hydrateStrategy,\n markerHydrateType,\n markerElementRef,\n markerRef,\n prefetchError,\n shouldPreserveServerHTML,\n } = useHydrationGate(internalProps)\n if (prefetchError) throw prefetchError\n\n const fallback = shouldPreserveServerHTML\n ? (() => {\n const html = getFallbackHtml(gate.id)\n return html ? (\n <div\n style={{ display: 'contents' }}\n dangerouslySetInnerHTML={{ __html: html }}\n />\n ) : null\n })()\n : (props.fallback ?? null)\n const markerAttributes =\n markerHydrateType === dynamicType ? undefined : hydrateStrategy._a?.()\n\n const hydrateType = hydrateStrategy._t!\n\n if (hydrateType === 'never' && !shouldPreserveServerHTML) {\n return (\n <div\n ref={markerRef}\n {...{\n [hydrateIdAttribute]: gate.id,\n [hydrateWhenAttribute]: markerHydrateType,\n ...markerAttributes,\n }}\n >\n {props.fallback ?? null}\n </div>\n )\n }\n\n return (\n <div\n ref={markerRef}\n {...{\n [hydrateIdAttribute]: gate.id,\n [hydrateWhenAttribute]: markerHydrateType,\n ...markerAttributes,\n }}\n >\n <React.Suspense fallback={fallback}>\n <HydrationGate gate={gate}>\n <HydratedBoundary\n id={gate.id}\n onHydrated={props.onHydrated}\n onStrategyHydrated={(id) => {\n markerElementRef.current?.removeAttribute(hydrateWhenAttribute)\n hydrateStrategy._o?.(id)\n }}\n >\n {props.children}\n </HydratedBoundary>\n </HydrationGate>\n </React.Suspense>\n </div>\n )\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { HydrationStrategy as CoreHydrationStrategy, HydrationPrefetchFunction, HydrationPrefetchStrategy, HydrationWhen } from '@tanstack/start-client-core/hydration';
|
|
2
|
+
import * as React from 'react';
|
|
3
|
+
export type { HydrationInteractionEvent, HydrationInteractionEvents, HydrationPrefetchContext, HydrationPrefetchFunction, HydrationPrefetchStrategy, HydrationPrefetchWaitReason, HydrationWhen, } from '@tanstack/start-client-core/hydration';
|
|
4
|
+
export type ReactHydrationStrategy<TWhen extends HydrationWhen = HydrationWhen, TCanPrefetch extends boolean = boolean> = CoreHydrationStrategy<TWhen, TCanPrefetch> & {
|
|
5
|
+
_h: (this: ReactHydrationStrategy, props: HydrateProps) => React.JSX.Element;
|
|
6
|
+
};
|
|
7
|
+
export type HydrationStrategy<TWhen extends HydrationWhen = HydrationWhen, TCanPrefetch extends boolean = boolean> = ReactHydrationStrategy<TWhen, TCanPrefetch>;
|
|
8
|
+
export type HydrateWhen = ReactHydrationStrategy | (() => ReactHydrationStrategy);
|
|
9
|
+
type HydrateCommonOptions = {
|
|
10
|
+
when: HydrateWhen;
|
|
11
|
+
fallback?: React.ReactNode;
|
|
12
|
+
onHydrated?: () => void;
|
|
13
|
+
};
|
|
14
|
+
export type HydrateOptions = (HydrateCommonOptions & {
|
|
15
|
+
prefetch?: never;
|
|
16
|
+
split?: boolean;
|
|
17
|
+
}) | (HydrateCommonOptions & {
|
|
18
|
+
prefetch: HydrationPrefetchStrategy;
|
|
19
|
+
split?: true;
|
|
20
|
+
}) | (HydrateCommonOptions & {
|
|
21
|
+
prefetch: HydrationPrefetchFunction;
|
|
22
|
+
split?: boolean;
|
|
23
|
+
});
|
|
24
|
+
export type HydrateProps = HydrateOptions & {
|
|
25
|
+
children: React.ReactNode;
|
|
26
|
+
};
|
|
27
|
+
export type InternalHydrateProps = HydrateProps & {
|
|
28
|
+
h?: string;
|
|
29
|
+
p?: () => Promise<void>;
|
|
30
|
+
};
|
|
31
|
+
export declare function Hydrate(props: HydrateProps): React.JSX.Element;
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx } from "react/jsx-runtime";
|
|
3
|
+
import * as React from "react";
|
|
4
|
+
import { isServer } from "@tanstack/router-core/isServer";
|
|
5
|
+
//#region src/Hydrate.tsx
|
|
6
|
+
var dynamicType = "dynamic";
|
|
7
|
+
var hydrateIdAttribute = "data-ts-hydrate-id";
|
|
8
|
+
var hydrateWhenAttribute = "data-ts-hydrate-when";
|
|
9
|
+
/* @__NO_SIDE_EFFECTS__ */
|
|
10
|
+
function ServerDynamicHydrate(props) {
|
|
11
|
+
const internalProps = props;
|
|
12
|
+
const reactId = React.useId();
|
|
13
|
+
const id = internalProps.h ? `${internalProps.h}${reactId}` : reactId;
|
|
14
|
+
return /* @__PURE__ */ jsx("div", {
|
|
15
|
+
[hydrateIdAttribute]: id,
|
|
16
|
+
[hydrateWhenAttribute]: dynamicType,
|
|
17
|
+
children: /* @__PURE__ */ jsx(React.Suspense, {
|
|
18
|
+
fallback: props.fallback ?? null,
|
|
19
|
+
children: props.children
|
|
20
|
+
})
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
/* @__NO_SIDE_EFFECTS__ */
|
|
24
|
+
function Hydrate(props) {
|
|
25
|
+
if (typeof props.when === "function") {
|
|
26
|
+
if (isServer ?? typeof window === "undefined") return /* @__PURE__ */ jsx(ServerDynamicHydrate, { ...props });
|
|
27
|
+
return props.when()._h(props);
|
|
28
|
+
}
|
|
29
|
+
return props.when._h(props);
|
|
30
|
+
}
|
|
31
|
+
//#endregion
|
|
32
|
+
export { Hydrate };
|
|
33
|
+
|
|
34
|
+
//# sourceMappingURL=Hydrate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Hydrate.js","names":[],"sources":["../../src/Hydrate.tsx"],"sourcesContent":["'use client'\n\nimport * as React from 'react'\n\nimport { isServer } from '@tanstack/router-core/isServer'\nimport type {\n HydrationStrategy as CoreHydrationStrategy,\n HydrationPrefetchFunction,\n HydrationPrefetchStrategy,\n HydrationWhen,\n} from '@tanstack/start-client-core/hydration'\n\nexport type {\n HydrationInteractionEvent,\n HydrationInteractionEvents,\n HydrationPrefetchContext,\n HydrationPrefetchFunction,\n HydrationPrefetchStrategy,\n HydrationPrefetchWaitReason,\n HydrationWhen,\n} from '@tanstack/start-client-core/hydration'\n\nexport type ReactHydrationStrategy<\n TWhen extends HydrationWhen = HydrationWhen,\n TCanPrefetch extends boolean = boolean,\n> = CoreHydrationStrategy<TWhen, TCanPrefetch> & {\n _h: (this: ReactHydrationStrategy, props: HydrateProps) => React.JSX.Element\n}\n\nexport type HydrationStrategy<\n TWhen extends HydrationWhen = HydrationWhen,\n TCanPrefetch extends boolean = boolean,\n> = ReactHydrationStrategy<TWhen, TCanPrefetch>\n\nexport type HydrateWhen =\n | ReactHydrationStrategy\n | (() => ReactHydrationStrategy)\n\ntype HydrateCommonOptions = {\n when: HydrateWhen\n fallback?: React.ReactNode\n onHydrated?: () => void\n}\n\nexport type HydrateOptions =\n | (HydrateCommonOptions & {\n prefetch?: never\n split?: boolean\n })\n | (HydrateCommonOptions & {\n prefetch: HydrationPrefetchStrategy\n split?: true\n })\n | (HydrateCommonOptions & {\n prefetch: HydrationPrefetchFunction\n split?: boolean\n })\n\nexport type HydrateProps = HydrateOptions & {\n children: React.ReactNode\n}\n\nexport type InternalHydrateProps = HydrateProps & {\n h?: string\n p?: () => Promise<void>\n}\n\nconst dynamicType = 'dynamic'\nconst hydrateIdAttribute = 'data-ts-hydrate-id'\nconst hydrateWhenAttribute = 'data-ts-hydrate-when'\n\n/* @__NO_SIDE_EFFECTS__ */\nfunction ServerDynamicHydrate(props: HydrateProps): React.JSX.Element {\n const internalProps = props as InternalHydrateProps\n const reactId = React.useId()\n const id = internalProps.h ? `${internalProps.h}${reactId}` : reactId\n\n return (\n <div\n {...{\n [hydrateIdAttribute]: id,\n [hydrateWhenAttribute]: dynamicType,\n }}\n >\n <React.Suspense fallback={props.fallback ?? null}>\n {props.children}\n </React.Suspense>\n </div>\n )\n}\n\n/* @__NO_SIDE_EFFECTS__ */\nexport function Hydrate(props: HydrateProps): React.JSX.Element {\n if (typeof props.when === 'function') {\n if (\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n isServer ??\n typeof window === 'undefined'\n ) {\n return <ServerDynamicHydrate {...props} />\n }\n\n return props.when()._h(props)\n }\n\n return props.when._h(props)\n}\n"],"mappings":";;;;;AAmEA,IAAM,cAAc;AACpB,IAAM,qBAAqB;AAC3B,IAAM,uBAAuB;;AAG7B,SAAS,qBAAqB,OAAwC;CACpE,MAAM,gBAAgB;CACtB,MAAM,UAAU,MAAM,OAAO;CAC7B,MAAM,KAAK,cAAc,IAAI,GAAG,cAAc,IAAI,YAAY;AAE9D,QACE,oBAAC,OAAD;GAEK,qBAAqB;GACrB,uBAAuB;YAG1B,oBAAC,MAAM,UAAP;GAAgB,UAAU,MAAM,YAAY;aACzC,MAAM;GACQ,CAAA;EACb,CAAA;;;AAKV,SAAgB,QAAQ,OAAwC;AAC9D,KAAI,OAAO,MAAM,SAAS,YAAY;AACpC,MAEE,YACA,OAAO,WAAW,YAElB,QAAO,oBAAC,sBAAD,EAAsB,GAAI,OAAS,CAAA;AAG5C,SAAO,MAAM,MAAM,CAAC,GAAG,MAAM;;AAG/B,QAAO,MAAM,KAAK,GAAG,MAAM"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { HydrationCondition, HydrationInteractionEvents, HydrationPrefetchStrategy } from '@tanstack/start-client-core/hydration';
|
|
2
|
+
import { ReactHydrationStrategy } from '../Hydrate.js';
|
|
3
|
+
export declare function media(query: string): ReactHydrationStrategy<'media', true> & HydrationPrefetchStrategy<'media'>;
|
|
4
|
+
export declare function condition(condition: HydrationCondition): ReactHydrationStrategy<'condition', false>;
|
|
5
|
+
export declare function interaction(options?: {
|
|
6
|
+
events?: HydrationInteractionEvents;
|
|
7
|
+
}): ReactHydrationStrategy<'interaction', true> & HydrationPrefetchStrategy<'interaction'>;
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { GenericHydrate } from "../GenericHydrate.js";
|
|
3
|
+
import { condition, interaction, media, withHydrationRenderer } from "@tanstack/start-client-core/hydration";
|
|
4
|
+
//#region src/hydration/generic.ts
|
|
5
|
+
/* @__NO_SIDE_EFFECTS__ */
|
|
6
|
+
function media$1(query) {
|
|
7
|
+
return /* @__PURE__ */ withHydrationRenderer(media(query), GenericHydrate);
|
|
8
|
+
}
|
|
9
|
+
/* @__NO_SIDE_EFFECTS__ */
|
|
10
|
+
function condition$1(condition$2) {
|
|
11
|
+
return /* @__PURE__ */ withHydrationRenderer(condition(condition$2), GenericHydrate);
|
|
12
|
+
}
|
|
13
|
+
/* @__NO_SIDE_EFFECTS__ */
|
|
14
|
+
function interaction$1(options) {
|
|
15
|
+
return /* @__PURE__ */ withHydrationRenderer(interaction(options), GenericHydrate);
|
|
16
|
+
}
|
|
17
|
+
//#endregion
|
|
18
|
+
export { condition$1 as condition, interaction$1 as interaction, media$1 as media };
|
|
19
|
+
|
|
20
|
+
//# sourceMappingURL=generic.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generic.js","names":[],"sources":["../../../src/hydration/generic.ts"],"sourcesContent":["'use client'\n\nimport {\n condition as coreCondition,\n interaction as coreInteraction,\n media as coreMedia,\n withHydrationRenderer,\n} from '@tanstack/start-client-core/hydration'\nimport { GenericHydrate } from '../GenericHydrate'\nimport type {\n HydrationCondition,\n HydrationInteractionEvents,\n HydrationPrefetchStrategy,\n} from '@tanstack/start-client-core/hydration'\nimport type { ReactHydrationStrategy } from '../Hydrate'\n\n/* @__NO_SIDE_EFFECTS__ */\nexport function media(\n query: string,\n): ReactHydrationStrategy<'media', true> & HydrationPrefetchStrategy<'media'> {\n return /* @__PURE__ */ withHydrationRenderer(coreMedia(query), GenericHydrate)\n}\n\n/* @__NO_SIDE_EFFECTS__ */\nexport function condition(\n condition: HydrationCondition,\n): ReactHydrationStrategy<'condition', false> {\n return /* @__PURE__ */ withHydrationRenderer(\n coreCondition(condition),\n GenericHydrate,\n )\n}\n\n/* @__NO_SIDE_EFFECTS__ */\nexport function interaction(options?: {\n events?: HydrationInteractionEvents\n}): ReactHydrationStrategy<'interaction', true> &\n HydrationPrefetchStrategy<'interaction'> {\n return /* @__PURE__ */ withHydrationRenderer(\n coreInteraction(options),\n GenericHydrate,\n )\n}\n"],"mappings":";;;;;AAiBA,SAAgB,QACd,OAC4E;AAC5E,QAAuB,sCAAsB,MAAU,MAAM,EAAE,eAAe;;;AAIhF,SAAgB,YACd,aAC4C;AAC5C,QAAuB,sCACrB,UAAc,YAAU,EACxB,eACD;;;AAIH,SAAgB,cAAY,SAGe;AACzC,QAAuB,sCACrB,YAAgB,QAAQ,EACxB,eACD"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import { HydrationPrefetchStrategy, IdleHydrationOptions } from '@tanstack/start-client-core/hydration';
|
|
2
|
+
import { ReactHydrationStrategy } from '../Hydrate.js';
|
|
3
|
+
export declare function idle(options?: IdleHydrationOptions): ReactHydrationStrategy<'idle', true> & HydrationPrefetchStrategy<'idle'>;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { GenericHydrate } from "../GenericHydrate.js";
|
|
3
|
+
import { idle, withHydrationRenderer } from "@tanstack/start-client-core/hydration";
|
|
4
|
+
//#region src/hydration/idle.ts
|
|
5
|
+
/* @__NO_SIDE_EFFECTS__ */
|
|
6
|
+
function idle$1(options = {}) {
|
|
7
|
+
return /* @__PURE__ */ withHydrationRenderer(idle(options), GenericHydrate);
|
|
8
|
+
}
|
|
9
|
+
//#endregion
|
|
10
|
+
export { idle$1 as idle };
|
|
11
|
+
|
|
12
|
+
//# sourceMappingURL=idle.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"idle.js","names":[],"sources":["../../../src/hydration/idle.ts"],"sourcesContent":["'use client'\n\nimport {\n idle as coreIdle,\n withHydrationRenderer,\n} from '@tanstack/start-client-core/hydration'\nimport { GenericHydrate } from '../GenericHydrate'\nimport type {\n HydrationPrefetchStrategy,\n IdleHydrationOptions,\n} from '@tanstack/start-client-core/hydration'\nimport type { ReactHydrationStrategy } from '../Hydrate'\n\n/* @__NO_SIDE_EFFECTS__ */\nexport function idle(\n options: IdleHydrationOptions = {},\n): ReactHydrationStrategy<'idle', true> & HydrationPrefetchStrategy<'idle'> {\n return /* @__PURE__ */ withHydrationRenderer(\n coreIdle(options),\n GenericHydrate,\n )\n}\n"],"mappings":";;;;;AAcA,SAAgB,OACd,UAAgC,EAAE,EACwC;AAC1E,QAAuB,sCACrB,KAAS,QAAQ,EACjB,eACD"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { HydrationPrefetchStrategy } from '@tanstack/start-client-core/hydration';
|
|
2
|
+
import { HydrateProps, ReactHydrationStrategy } from '../Hydrate.js';
|
|
3
|
+
import * as React from 'react';
|
|
4
|
+
export declare function LoadHydrate(props: HydrateProps): React.JSX.Element;
|
|
5
|
+
export declare function load(): ReactHydrationStrategy<'load', true> & HydrationPrefetchStrategy<'load'>;
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx } from "react/jsx-runtime";
|
|
3
|
+
import * as React from "react";
|
|
4
|
+
import { load, withHydrationRenderer } from "@tanstack/start-client-core/hydration";
|
|
5
|
+
//#region src/hydration/load.tsx
|
|
6
|
+
function HydratedBoundary(props) {
|
|
7
|
+
const { onHydrated, children } = props;
|
|
8
|
+
const didHydrateRef = React.useRef(false);
|
|
9
|
+
React.useEffect(() => {
|
|
10
|
+
if (didHydrateRef.current) return;
|
|
11
|
+
didHydrateRef.current = true;
|
|
12
|
+
onHydrated?.();
|
|
13
|
+
}, [onHydrated]);
|
|
14
|
+
return children;
|
|
15
|
+
}
|
|
16
|
+
function LoadHydrate(props) {
|
|
17
|
+
return /* @__PURE__ */ jsx("div", { children: /* @__PURE__ */ jsx(React.Suspense, {
|
|
18
|
+
fallback: props.fallback ?? null,
|
|
19
|
+
children: /* @__PURE__ */ jsx(HydratedBoundary, {
|
|
20
|
+
onHydrated: props.onHydrated,
|
|
21
|
+
children: props.children
|
|
22
|
+
})
|
|
23
|
+
}) });
|
|
24
|
+
}
|
|
25
|
+
var loadStrategy = /* @__PURE__ */ withHydrationRenderer(load(), LoadHydrate);
|
|
26
|
+
/* @__NO_SIDE_EFFECTS__ */
|
|
27
|
+
function load$1() {
|
|
28
|
+
return loadStrategy;
|
|
29
|
+
}
|
|
30
|
+
//#endregion
|
|
31
|
+
export { load$1 as load };
|
|
32
|
+
|
|
33
|
+
//# sourceMappingURL=load.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"load.js","names":[],"sources":["../../../src/hydration/load.tsx"],"sourcesContent":["'use client'\n\nimport * as React from 'react'\n\nimport {\n load as coreLoad,\n withHydrationRenderer,\n} from '@tanstack/start-client-core/hydration'\nimport type { HydrationPrefetchStrategy } from '@tanstack/start-client-core/hydration'\nimport type { HydrateProps, ReactHydrationStrategy } from '../Hydrate'\n\nfunction HydratedBoundary(props: {\n onHydrated?: () => void\n children: React.ReactNode\n}) {\n const { onHydrated, children } = props\n const didHydrateRef = React.useRef(false)\n\n React.useEffect(() => {\n if (didHydrateRef.current) return\n didHydrateRef.current = true\n onHydrated?.()\n }, [onHydrated])\n\n return children as React.JSX.Element\n}\n\nexport function LoadHydrate(props: HydrateProps): React.JSX.Element {\n return (\n <div>\n <React.Suspense fallback={props.fallback ?? null}>\n <HydratedBoundary onHydrated={props.onHydrated}>\n {props.children}\n </HydratedBoundary>\n </React.Suspense>\n </div>\n )\n}\n\nconst loadStrategy = /* @__PURE__ */ withHydrationRenderer(\n coreLoad(),\n LoadHydrate,\n) as ReactHydrationStrategy<'load', true> & HydrationPrefetchStrategy<'load'>\n\n/* @__NO_SIDE_EFFECTS__ */\nexport function load(): ReactHydrationStrategy<'load', true> &\n HydrationPrefetchStrategy<'load'> {\n return loadStrategy\n}\n"],"mappings":";;;;;AAWA,SAAS,iBAAiB,OAGvB;CACD,MAAM,EAAE,YAAY,aAAa;CACjC,MAAM,gBAAgB,MAAM,OAAO,MAAM;AAEzC,OAAM,gBAAgB;AACpB,MAAI,cAAc,QAAS;AAC3B,gBAAc,UAAU;AACxB,gBAAc;IACb,CAAC,WAAW,CAAC;AAEhB,QAAO;;AAGT,SAAgB,YAAY,OAAwC;AAClE,QACE,oBAAC,OAAD,EAAA,UACE,oBAAC,MAAM,UAAP;EAAgB,UAAU,MAAM,YAAY;YAC1C,oBAAC,kBAAD;GAAkB,YAAY,MAAM;aACjC,MAAM;GACU,CAAA;EACJ,CAAA,EACb,CAAA;;AAIV,IAAM,eAA+B,sCACnC,MAAU,EACV,YACD;;AAGD,SAAgB,SACoB;AAClC,QAAO"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { reactUse, useHydrated } from "@tanstack/react-router";
|
|
3
|
+
import { jsx } from "react/jsx-runtime";
|
|
4
|
+
import * as React from "react";
|
|
5
|
+
import { isServer } from "@tanstack/router-core/isServer";
|
|
6
|
+
import { never, withHydrationRenderer } from "@tanstack/start-client-core/hydration";
|
|
7
|
+
import { hydrateIdAttribute, hydrateWhenAttribute } from "@tanstack/start-client-core/hydration/constants";
|
|
8
|
+
import { getFallbackHtml, saveFallbackHtml } from "@tanstack/start-client-core/hydration/runtime";
|
|
9
|
+
//#region src/hydration/never.tsx
|
|
10
|
+
var neverType = "never";
|
|
11
|
+
var neverPromise = new Promise(() => {});
|
|
12
|
+
function NeverGate(props) {
|
|
13
|
+
if (isServer ?? typeof window === "undefined") return props.children;
|
|
14
|
+
if (!reactUse) throw neverPromise;
|
|
15
|
+
reactUse(neverPromise);
|
|
16
|
+
return props.children;
|
|
17
|
+
}
|
|
18
|
+
function NeverHydrate(props) {
|
|
19
|
+
const internalProps = props;
|
|
20
|
+
const hydrated = useHydrated();
|
|
21
|
+
const reactId = React.useId();
|
|
22
|
+
const id = internalProps.h ? `${internalProps.h}${reactId}` : reactId;
|
|
23
|
+
const shouldPreserveServerHTMLRef = React.useRef(void 0);
|
|
24
|
+
shouldPreserveServerHTMLRef.current ??= (isServer ?? typeof window === "undefined") || !hydrated;
|
|
25
|
+
const markerProps = {
|
|
26
|
+
ref: React.useCallback((element) => {
|
|
27
|
+
if (!element) return;
|
|
28
|
+
if (!shouldPreserveServerHTMLRef.current) element.replaceChildren();
|
|
29
|
+
else saveFallbackHtml(id, element);
|
|
30
|
+
}, [id]),
|
|
31
|
+
[hydrateIdAttribute]: id,
|
|
32
|
+
[hydrateWhenAttribute]: neverType
|
|
33
|
+
};
|
|
34
|
+
const fallback = (() => {
|
|
35
|
+
const html = getFallbackHtml(id);
|
|
36
|
+
return html ? /* @__PURE__ */ jsx("div", {
|
|
37
|
+
style: { display: "contents" },
|
|
38
|
+
dangerouslySetInnerHTML: { __html: html }
|
|
39
|
+
}) : props.fallback ?? null;
|
|
40
|
+
})();
|
|
41
|
+
return /* @__PURE__ */ jsx("div", {
|
|
42
|
+
...markerProps,
|
|
43
|
+
children: /* @__PURE__ */ jsx(React.Suspense, {
|
|
44
|
+
fallback,
|
|
45
|
+
children: /* @__PURE__ */ jsx(NeverGate, { children: props.children })
|
|
46
|
+
})
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
/* @__NO_SIDE_EFFECTS__ */
|
|
50
|
+
function never$1() {
|
|
51
|
+
return /* @__PURE__ */ withHydrationRenderer(never(), NeverHydrate);
|
|
52
|
+
}
|
|
53
|
+
//#endregion
|
|
54
|
+
export { never$1 as never };
|
|
55
|
+
|
|
56
|
+
//# sourceMappingURL=never.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"never.js","names":[],"sources":["../../../src/hydration/never.tsx"],"sourcesContent":["'use client'\n\nimport * as React from 'react'\n\nimport { reactUse, useHydrated } from '@tanstack/react-router'\nimport { isServer } from '@tanstack/router-core/isServer'\nimport {\n never as coreNever,\n withHydrationRenderer,\n} from '@tanstack/start-client-core/hydration'\nimport {\n hydrateIdAttribute,\n hydrateWhenAttribute,\n} from '@tanstack/start-client-core/hydration/constants'\nimport {\n getFallbackHtml,\n saveFallbackHtml,\n} from '@tanstack/start-client-core/hydration/runtime'\nimport type {\n HydrateProps,\n InternalHydrateProps,\n ReactHydrationStrategy,\n} from '../Hydrate'\n\nconst neverType = 'never'\nconst neverPromise = new Promise<void>(() => {})\n\nfunction NeverGate(props: { children: React.ReactNode }) {\n if (\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n isServer ??\n typeof window === 'undefined'\n ) {\n return props.children as React.JSX.Element\n }\n\n if (!reactUse) {\n throw neverPromise\n }\n\n reactUse(neverPromise)\n\n return props.children as React.JSX.Element\n}\n\nexport function NeverHydrate(props: HydrateProps): React.JSX.Element {\n const internalProps = props as InternalHydrateProps\n const hydrated = useHydrated()\n const reactId = React.useId()\n const id = internalProps.h ? `${internalProps.h}${reactId}` : reactId\n const shouldPreserveServerHTMLRef = React.useRef<boolean | undefined>(\n undefined,\n )\n shouldPreserveServerHTMLRef.current ??=\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n (isServer ?? typeof window === 'undefined') || !hydrated\n const markerRef = React.useCallback(\n (element: HTMLDivElement | null) => {\n if (!element) return\n if (!shouldPreserveServerHTMLRef.current) {\n element.replaceChildren()\n } else {\n saveFallbackHtml(id, element)\n }\n },\n [id],\n )\n const markerProps = {\n ref: markerRef,\n [hydrateIdAttribute]: id,\n [hydrateWhenAttribute]: neverType,\n }\n const fallback = (() => {\n const html = getFallbackHtml(id)\n return html ? (\n <div\n style={{ display: 'contents' }}\n dangerouslySetInnerHTML={{ __html: html }}\n />\n ) : (\n (props.fallback ?? null)\n )\n })()\n\n return (\n <div {...markerProps}>\n <React.Suspense fallback={fallback}>\n <NeverGate>{props.children}</NeverGate>\n </React.Suspense>\n </div>\n )\n}\n\n/* @__NO_SIDE_EFFECTS__ */\nexport function never(): ReactHydrationStrategy<'never', false> {\n return /* @__PURE__ */ withHydrationRenderer(coreNever(), NeverHydrate)\n}\n"],"mappings":";;;;;;;;;AAwBA,IAAM,YAAY;AAClB,IAAM,eAAe,IAAI,cAAoB,GAAG;AAEhD,SAAS,UAAU,OAAsC;AACvD,KAEE,YACA,OAAO,WAAW,YAElB,QAAO,MAAM;AAGf,KAAI,CAAC,SACH,OAAM;AAGR,UAAS,aAAa;AAEtB,QAAO,MAAM;;AAGf,SAAgB,aAAa,OAAwC;CACnE,MAAM,gBAAgB;CACtB,MAAM,WAAW,aAAa;CAC9B,MAAM,UAAU,MAAM,OAAO;CAC7B,MAAM,KAAK,cAAc,IAAI,GAAG,cAAc,IAAI,YAAY;CAC9D,MAAM,8BAA8B,MAAM,OACxC,KAAA,EACD;AACD,6BAA4B,aAEzB,YAAY,OAAO,WAAW,gBAAgB,CAAC;CAYlD,MAAM,cAAc;EAClB,KAZgB,MAAM,aACrB,YAAmC;AAClC,OAAI,CAAC,QAAS;AACd,OAAI,CAAC,4BAA4B,QAC/B,SAAQ,iBAAiB;OAEzB,kBAAiB,IAAI,QAAQ;KAGjC,CAAC,GAAG,CACL;GAGE,qBAAqB;GACrB,uBAAuB;EACzB;CACD,MAAM,kBAAkB;EACtB,MAAM,OAAO,gBAAgB,GAAG;AAChC,SAAO,OACL,oBAAC,OAAD;GACE,OAAO,EAAE,SAAS,YAAY;GAC9B,yBAAyB,EAAE,QAAQ,MAAM;GACzC,CAAA,GAED,MAAM,YAAY;KAEnB;AAEJ,QACE,oBAAC,OAAD;EAAK,GAAI;YACP,oBAAC,MAAM,UAAP;GAA0B;aACxB,oBAAC,WAAD,EAAA,UAAY,MAAM,UAAqB,CAAA;GACxB,CAAA;EACb,CAAA;;;AAKV,SAAgB,UAAgD;AAC9D,QAAuB,sCAAsB,OAAW,EAAE,aAAa"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { HydrationPrefetchStrategy, VisibleHydrationOptions } from '@tanstack/start-client-core/hydration';
|
|
2
|
+
import { HydrateProps, ReactHydrationStrategy } from '../Hydrate.js';
|
|
3
|
+
import * as React from 'react';
|
|
4
|
+
export declare function VisibleHydrate(this: ReactHydrationStrategy, props: HydrateProps): React.JSX.Element;
|
|
5
|
+
export declare function visible(options?: VisibleHydrationOptions): ReactHydrationStrategy<'visible', true> & HydrationPrefetchStrategy<'visible'>;
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { reactUse } from "@tanstack/react-router";
|
|
3
|
+
import { jsx } from "react/jsx-runtime";
|
|
4
|
+
import * as React from "react";
|
|
5
|
+
import { isServer } from "@tanstack/router-core/isServer";
|
|
6
|
+
//#region src/hydration/visible.tsx
|
|
7
|
+
/* @__NO_SIDE_EFFECTS__ */
|
|
8
|
+
function HydrationBoundary(props) {
|
|
9
|
+
const { g, o } = props;
|
|
10
|
+
if (!g.r) {
|
|
11
|
+
if (!reactUse) throw g.p;
|
|
12
|
+
reactUse(g.p);
|
|
13
|
+
}
|
|
14
|
+
React.useEffect(() => {
|
|
15
|
+
o?.();
|
|
16
|
+
}, [o]);
|
|
17
|
+
return props.children;
|
|
18
|
+
}
|
|
19
|
+
/* @__NO_SIDE_EFFECTS__ */
|
|
20
|
+
function VisibleHydrate(props) {
|
|
21
|
+
const strategy = this;
|
|
22
|
+
const prefetchStrategy = props.prefetch;
|
|
23
|
+
const preload = props.p;
|
|
24
|
+
const markerRef = React.useRef(null);
|
|
25
|
+
const [gate] = React.useState(() => {
|
|
26
|
+
let resolvePromise;
|
|
27
|
+
const nextGate = {
|
|
28
|
+
p: new Promise((resolve) => {
|
|
29
|
+
resolvePromise = resolve;
|
|
30
|
+
}),
|
|
31
|
+
r: false,
|
|
32
|
+
s: () => {
|
|
33
|
+
nextGate.r = true;
|
|
34
|
+
resolvePromise();
|
|
35
|
+
}
|
|
36
|
+
};
|
|
37
|
+
if (isServer ?? typeof window === "undefined") nextGate.s();
|
|
38
|
+
return nextGate;
|
|
39
|
+
});
|
|
40
|
+
React.useEffect(() => {
|
|
41
|
+
if (!preload || typeof prefetchStrategy === "function") return;
|
|
42
|
+
return prefetchStrategy?._s?.({
|
|
43
|
+
element: markerRef.current,
|
|
44
|
+
prefetch: preload
|
|
45
|
+
});
|
|
46
|
+
}, [prefetchStrategy, preload]);
|
|
47
|
+
React.useEffect(() => {
|
|
48
|
+
if (gate.r) return;
|
|
49
|
+
return strategy._s?.({
|
|
50
|
+
element: markerRef.current,
|
|
51
|
+
gate
|
|
52
|
+
});
|
|
53
|
+
}, [gate, strategy]);
|
|
54
|
+
return /* @__PURE__ */ jsx("div", {
|
|
55
|
+
ref: markerRef,
|
|
56
|
+
children: /* @__PURE__ */ jsx(React.Suspense, {
|
|
57
|
+
fallback: props.fallback,
|
|
58
|
+
children: /* @__PURE__ */ jsx(HydrationBoundary, {
|
|
59
|
+
g: gate,
|
|
60
|
+
o: props.onHydrated,
|
|
61
|
+
children: props.children
|
|
62
|
+
})
|
|
63
|
+
})
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
/* @__NO_SIDE_EFFECTS__ */
|
|
67
|
+
function visible(options) {
|
|
68
|
+
const rootMargin = options?.rootMargin ?? "600px";
|
|
69
|
+
const threshold = options?.threshold ?? 0;
|
|
70
|
+
return {
|
|
71
|
+
_s: ({ element, gate, prefetch }) => {
|
|
72
|
+
const callback = prefetch || gate.s;
|
|
73
|
+
if (!element) {
|
|
74
|
+
callback();
|
|
75
|
+
return;
|
|
76
|
+
}
|
|
77
|
+
const observer = new IntersectionObserver((entries) => {
|
|
78
|
+
if (!entries[0].isIntersecting) return;
|
|
79
|
+
observer.disconnect();
|
|
80
|
+
callback();
|
|
81
|
+
}, {
|
|
82
|
+
rootMargin,
|
|
83
|
+
threshold
|
|
84
|
+
});
|
|
85
|
+
observer.observe(element);
|
|
86
|
+
return () => observer.disconnect();
|
|
87
|
+
},
|
|
88
|
+
_h: VisibleHydrate
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
//#endregion
|
|
92
|
+
export { visible };
|
|
93
|
+
|
|
94
|
+
//# sourceMappingURL=visible.js.map
|