@tanstack/react-start-client 1.168.2 → 1.168.4

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 +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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"}
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":";;;;;;;;;AAwCA,IAAM,cAAc;AACpB,IAAM,yBAAyB;CAC7B,IAAI;CACJ,UAAU;AACZ;AAEA,SAAS,qBAAqB,UAA6B;CACzD,OAAO,SAAS,KAAK,SAAS,GAAG,IAAI,SAAS,OAAO;AACvD;AAEA,SAAS,UAAa,OAAU;CAC9B,MAAM,MAAM,MAAM,OAAO,KAAK;CAC9B,IAAI,UAAU;CACd,OAAO;AACT;AAEA,SAAS,iBAAiB,OAA6B;CACrD,MAAM,WAAW,YAAY;CAC7B,MAAM,UAAU,MAAM,MAAM;CAC5B,MAAM,KAAK,MAAM,IAAI,GAAG,MAAM,IAAI,YAAY;CAC9C,MAAM,OAAO,MAAM;CACnB,MAAM,mBAAmB,OAAO,SAAS;CACzC,MAAM,4BAA4B,MAAM,OACtC,KAAA,CACF;CACA,IAAI,kBACF,0BAA0B,YAEvB,YAAY,OAAO,WAAW,cAC3B,yBACA,KAAK;CAEb,MAAM,kBAAkB,mBACpB,0BAA0B,UAC1B;CACJ,MAAM,oBAAmC,mBACrC,cACA,gBAAgB;CACpB,MAAM,CAAC,eAAe,oBAAoB,MAAM,SAAkB;CAClE,MAAM,YAAY,UAAU;EAC1B,UAAU,MAAM;EAChB,SAAS,MAAM;CACjB,CAAC;CACD,MAAM,UAAU,MAAM,OAAwC,KAAA,CAAS;CACvE,MAAM,mBAAmB,MAAM,OAA8B,IAAI;CACjE,MAAM,8BAA8B,MAAM,OACxC,KAAA,CACF;CACA,MAAM,iCAAiC,MAAM,OAC3C,KAAA,CACF;CACA,MAAM,iBAAiB,MAAM,OAAO,KAAK;CACzC,MAAM,wBAAwB,MAAM,OAClC,KAAA,CACF;CAEA,sBAAsB,YAAY;EAChC,iBAAiB,IAAI,gBAAgB;EACrC,oBAAoB;EACpB,oCAAoB,IAAI,IAAgB;EACxC,yBAAyB;EACzB,SAAS;CACX;CAEA,4BAA4B,aAEzB,YAAY,OAAO,WAAW,gBAAgB,CAAC;CAClD,+BAA+B,YAC7B,CAAC,YAAY,qBAAqB,eAAe;CAEnD,IAAI,CAAC,QAAQ,SACX,QAAQ,UAEL,YAAY,OAAO,WAAW,cAC3B,mBAAmB,IAAI,gBAAgB,EAAG,IAC1C,gBAAgB,IAAI,gBAAgB,EAAG;CAG/C,QAAQ,QAAQ,OAAO,gBAAgB;CAEvC,IAEE,EAAE,YAAY,OAAO,WAAW,gBAChC,gBAAgB,OAAO,YACtB,CAAC,+BAA+B,WAC/B,CAAC,qBAAqB,eAAe,IAEvC,QAAQ,QAAQ,QAAQ;CAG1B,MAAM,YAAY,MAAM,aACrB,YAAmC;EAClC,iBAAiB,UAAU;EAC3B,IAAI,SAAS;GACX,IACE,gBAAgB,OAAO,WACvB,CAAC,4BAA4B,SAE7B,QAAQ,gBAAgB;GAE1B,iBAAiB,IAAI,OAAO;EAC9B;CACF,GACA,CAAC,gBAAgB,IAAI,EAAE,CACzB;CAEA,MAAM,gBAAgB;EACpB,MAAM,OAAO,QAAQ;EACrB,aAAa;GACX,MAAM,aAAa,sBAAsB;GACzC,YAAY,gBAAgB,MAAM;GAClC,YAAY,UAAU;GACtB,YAAY,mBAAmB,MAAM;GACrC,YAAY,IAAI;EAClB;CACF,GAAG,CAAC,CAAC;CAEL,MAAM,gBAAgB;EACpB,KAEG,YAAY,OAAO,WAAW,gBAC/B,CAAC,UAAU,QAAQ,UAEnB;EAGF,MAAM,aAAa,sBAAsB;EACzC,IAAI,WAAW,SAAS;EACxB,WAAW,UAAU;EAErB,MAAM,aAAa,aAAyB;GAC1C,IAAI,WAAW,oBAAoB;IACjC,SAAS;IACT,aAAa,CAAC;GAChB;GAEA,WAAW,mBAAmB,IAAI,QAAQ;GAC1C,aAAa;IACX,WAAW,mBAAmB,OAAO,QAAQ;GAC/C;EACF;EAEA,MAAM,gBAAgB,UAAU,QAAQ,UAAU,KAAK,QAAQ,QAAQ;EACvE,MAAM,gBAAgB,UAAU,QAAQ;EAExC,IAAI,OAAO,kBAAkB,YAAY;GACvC,MAAM,UAAU,QAAQ,QAAQ,EAC7B,WACC,cAAc;IACZ,SAAS,iBAAiB;IAC1B,QAAQ,WAAW,gBAAgB;IACnC;IACA,UAAU,aACR,iCAAiC,UAAU;KACzC,SAAS,iBAAiB;KAC1B,QAAQ,WAAW,gBAAgB;KACnC;IACF,CAAC;GACL,CAAC,CACH,EACC,WAAW,KAAA,CAAS;GAEvB,WAAW,UAAU;GACrB,QAAQ,OAAO,UAAU;IACvB,IAAI,CAAC,WAAW,gBAAgB,OAAO,SACrC,iBAAiB,KAAK;GAE1B,CAAC;GACD;EACF;EAEA,IAAI,CAAC,UAAU,QAAQ,SAAS;EAEhC,MAAM,iBAAiB;GACrB,IAAI,eAAe,SAAS;GAC5B,eAAe,UAAU;GACzB,QAAa;EACf;EAEA,WAAW,UAAU,4BACnB,cAAc,KAAK;GACjB,SAAS,iBAAiB;GAC1B;EACF,CAAC,CACH;CACF,GAAG,CAAC,iBAAiB,SAAS,CAAC;CAE/B,sBAAsB;EACpB,MAAM,OAAO,QAAQ;EACrB,IACE,CAAC,+BAA+B,WAChC,gBAAgB,OAAO,SAEvB;EAGF,IAAI,KAAK,UACP;EAGF,MAAM,WAA8B,CAAC;EACrC,IAAI,8BAA8B,CAAC;EACnC,IAAI,WAAW;EACf,MAAM,cAAc,KAAK;EAEzB,MAAM,gBAAgB;GACpB,IAAI,UAAU;GACd,WAAW;GACX,IAAI,KAAK,YAAY,kBACnB,KAAK,UAAU;GAEjB,sBAAsB;GACtB,SAAS,SAAS,OAAO,GAAG,CAAC;EAC/B;EAEA,MAAM,cAAc,OAA4B;GAC9C,IAAI,CAAC,IAAI;GACT,IAAI,YAAY,KAAK,UAAU;IAC7B,GAAG;IACH;GACF;GACA,SAAS,KAAK,EAAE;EAClB;EAEA,MAAM,yBAAyB;GAC7B,MAAM,aAAa,sBAAsB;GACzC,IAAI,CAAC,WAAW,oBAAoB;IAClC,WAAW,qBAAqB;IAChC,WAAW,mBAAmB,SAAS,aAAa,SAAS,CAAC;IAC9D,WAAW,mBAAmB,MAAM;GACtC;GAEA,IAAI,CAAC,WAAW,SAAS;IACvB,YAAY;IACZ;GACF;GACA,IAAI,WAAW,yBAAyB;GACxC,WAAW,0BAA0B;GAErC,WAAW,QAAQ,WACX,YAAY,IACjB,UAAU;IACT,IAAI,CAAC,WAAW,gBAAgB,OAAO,SACrC,iBAAiB,KAAK;GAE1B,CACF;EACF;EAEA,KAAK,UAAU;EACf,wBAAwB,cAAc,MAAM,OAAO;EAEnD,MAAM,UAAmC;GACvC,SAAS,iBAAiB;GAC1B;EACF;EACA,WAAW,4BAA4B,gBAAgB,KAAK,OAAO,CAAC,CAAC;EAErE,IAAI,gBAAgB,OAAO,eACzB,WACE,4BACE,iBAAiB,UACb,kCACE,iBAAiB,SACjB,OACF,IACA,KAAA,CACN,CACF;EAGF,OAAO;CACT,GAAG,CAAC,iBAAiB,SAAS,CAAC;CAE/B,OAAO;EACL,MAAM,QAAQ;EACd;EACA;EACA;EACA;EACA;EACA,0BAA0B,4BAA4B;CACxD;AACF;AAEA,SAAS,cAAc,OAAkD;CACvE,IAEE,YACA,OAAO,WAAW,aAElB,OAAO,MAAM;CAGf,IAAI,MAAM,KAAK,UACb,OAAO,MAAM;CAGf,IAAI,CAAC,UACH,MAAM,MAAM,KAAK;CAGnB,SAAS,MAAM,KAAK,OAAO;CAE3B,OAAO,MAAM;AACf;AAEA,SAAS,iBAAiB,OAKvB;CACD,MAAM,EAAE,IAAI,YAAY,uBAAuB;CAC/C,MAAM,gBAAgB,MAAM,OAAO,KAAK;CAExC,MAAM,gBAAgB;EACpB,IAAI,cAAc,SAAS;EAC3B,cAAc,UAAU;EACxB,aAAa;EACb,qBAAqB,EAAE;CACzB,GAAG;EAAC;EAAI;EAAY;CAAkB,CAAC;CAEvC,OAAO,MAAM;AACf;AAEA,SAAgB,eAAe,OAAwC;CAErE,MAAM,EACJ,MACA,iBACA,mBACA,kBACA,WACA,eACA,6BACE,iBAAiB,KAAa;CAClC,IAAI,eAAe,MAAM;CAEzB,MAAM,WAAW,kCACN;EACL,MAAM,OAAO,gBAAgB,KAAK,EAAE;EACpC,OAAO,OACL,oBAAC,OAAD;GACE,OAAO,EAAE,SAAS,WAAW;GAC7B,yBAAyB,EAAE,QAAQ,KAAK;EACzC,CAAA,IACC;CACN,GAAG,IACF,MAAM,YAAY;CACvB,MAAM,mBACJ,sBAAsB,cAAc,KAAA,IAAY,gBAAgB,KAAK;CAIvE,IAFoB,gBAAgB,OAEhB,WAAW,CAAC,0BAC9B,OACE,oBAAC,OAAD;EACE,KAAK;GAEF,qBAAqB,KAAK;GAC1B,uBAAuB;EACxB,GAAG;YAGJ,MAAM,YAAY;CAChB,CAAA;CAIT,OACE,oBAAC,OAAD;EACE,KAAK;GAEF,qBAAqB,KAAK;GAC1B,uBAAuB;EACxB,GAAG;YAGL,oBAAC,MAAM,UAAP;GAA0B;aACxB,oBAAC,eAAD;IAAqB;cACnB,oBAAC,kBAAD;KACE,IAAI,KAAK;KACT,YAAY,MAAM;KAClB,qBAAqB,OAAO;MAC1B,iBAAiB,SAAS,gBAAgB,oBAAoB;MAC9D,gBAAgB,KAAK,EAAE;KACzB;eAEC,MAAM;IACS,CAAA;GACL,CAAA;EACD,CAAA;CACb,CAAA;AAET"}
@@ -1 +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"}
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,MAAM;CAC5B,MAAM,KAAK,cAAc,IAAI,GAAG,cAAc,IAAI,YAAY;CAE9D,OACE,oBAAC,OAAD;GAEK,qBAAqB;GACrB,uBAAuB;YAG1B,oBAAC,MAAM,UAAP;GAAgB,UAAU,MAAM,YAAY;aACzC,MAAM;EACO,CAAA;CACb,CAAA;AAET;;AAGA,SAAgB,QAAQ,OAAwC;CAC9D,IAAI,OAAO,MAAM,SAAS,YAAY;EACpC,IAEE,YACA,OAAO,WAAW,aAElB,OAAO,oBAAC,sBAAD,EAAsB,GAAI,MAAQ,CAAA;EAG3C,OAAO,MAAM,KAAK,EAAE,GAAG,KAAK;CAC9B;CAEA,OAAO,MAAM,KAAK,GAAG,KAAK;AAC5B"}
@@ -1 +1 @@
1
- {"version":3,"file":"StartClient.js","names":[],"sources":["../../src/StartClient.tsx"],"sourcesContent":["import { Await, RouterProvider } from '@tanstack/react-router'\n\nimport { hydrateStart } from './hydrateStart'\n\nimport type { AnyRouter } from '@tanstack/router-core'\n\nlet hydrationPromise: Promise<AnyRouter> | undefined\nexport function StartClient() {\n if (!hydrationPromise) {\n hydrationPromise = hydrateStart()\n }\n\n return (\n <Await\n promise={hydrationPromise}\n children={(router) => <RouterProvider router={router} />}\n />\n )\n}\n"],"mappings":";;;;AAMA,IAAI;AACJ,SAAgB,cAAc;AAC5B,KAAI,CAAC,iBACH,oBAAmB,cAAc;AAGnC,QACE,oBAAC,OAAD;EACE,SAAS;EACT,WAAW,WAAW,oBAAC,gBAAD,EAAwB,QAAU,CAAA;EACxD,CAAA"}
1
+ {"version":3,"file":"StartClient.js","names":[],"sources":["../../src/StartClient.tsx"],"sourcesContent":["import { Await, RouterProvider } from '@tanstack/react-router'\n\nimport { hydrateStart } from './hydrateStart'\n\nimport type { AnyRouter } from '@tanstack/router-core'\n\nlet hydrationPromise: Promise<AnyRouter> | undefined\nexport function StartClient() {\n if (!hydrationPromise) {\n hydrationPromise = hydrateStart()\n }\n\n return (\n <Await\n promise={hydrationPromise}\n children={(router) => <RouterProvider router={router} />}\n />\n )\n}\n"],"mappings":";;;;AAMA,IAAI;AACJ,SAAgB,cAAc;CAC5B,IAAI,CAAC,kBACH,mBAAmB,aAAa;CAGlC,OACE,oBAAC,OAAD;EACE,SAAS;EACT,WAAW,WAAW,oBAAC,gBAAD,EAAwB,OAAS,CAAA;CACxD,CAAA;AAEL"}
@@ -1 +1 @@
1
- {"version":3,"file":"hydrateStart.js","names":[],"sources":["../../src/hydrateStart.ts"],"sourcesContent":["import { hydrateStart as coreHydrateStart } from '@tanstack/start-client-core/client'\nimport type { AnyRouter } from '@tanstack/router-core'\n\n/**\n * React-specific wrapper for hydrateStart that signals hydration completion\n */\nexport async function hydrateStart(): Promise<AnyRouter> {\n const router = await coreHydrateStart()\n // Signal that router hydration is complete so cleanup can happen if stream has ended\n window.$_TSR?.h()\n return router\n}\n"],"mappings":";;;;;AAMA,eAAsB,iBAAmC;CACvD,MAAM,SAAS,MAAM,cAAkB;AAEvC,QAAO,OAAO,GAAG;AACjB,QAAO"}
1
+ {"version":3,"file":"hydrateStart.js","names":[],"sources":["../../src/hydrateStart.ts"],"sourcesContent":["import { hydrateStart as coreHydrateStart } from '@tanstack/start-client-core/client'\nimport type { AnyRouter } from '@tanstack/router-core'\n\n/**\n * React-specific wrapper for hydrateStart that signals hydration completion\n */\nexport async function hydrateStart(): Promise<AnyRouter> {\n const router = await coreHydrateStart()\n // Signal that router hydration is complete so cleanup can happen if stream has ended\n window.$_TSR?.h()\n return router\n}\n"],"mappings":";;;;;AAMA,eAAsB,iBAAmC;CACvD,MAAM,SAAS,MAAM,aAAiB;CAEtC,OAAO,OAAO,EAAE;CAChB,OAAO;AACT"}
@@ -1 +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"}
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;CAC5E,OAAuB,sCAAsB,MAAU,KAAK,GAAG,cAAc;AAC/E;;AAGA,SAAgB,YACd,aAC4C;CAC5C,OAAuB,sCACrB,UAAc,WAAS,GACvB,cACF;AACF;;AAGA,SAAgB,cAAY,SAGe;CACzC,OAAuB,sCACrB,YAAgB,OAAO,GACvB,cACF;AACF"}
@@ -1 +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"}
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,CAAC,GACyC;CAC1E,OAAuB,sCACrB,KAAS,OAAO,GAChB,cACF;AACF"}
@@ -1 +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"}
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,KAAK;CAExC,MAAM,gBAAgB;EACpB,IAAI,cAAc,SAAS;EAC3B,cAAc,UAAU;EACxB,aAAa;CACf,GAAG,CAAC,UAAU,CAAC;CAEf,OAAO;AACT;AAEA,SAAgB,YAAY,OAAwC;CAClE,OACE,oBAAC,OAAD,EAAA,UACE,oBAAC,MAAM,UAAP;EAAgB,UAAU,MAAM,YAAY;YAC1C,oBAAC,kBAAD;GAAkB,YAAY,MAAM;aACjC,MAAM;EACS,CAAA;CACJ,CAAA,EACb,CAAA;AAET;AAEA,IAAM,eAA+B,sCACnC,KAAS,GACT,WACF;;AAGA,SAAgB,SACoB;CAClC,OAAO;AACT"}
@@ -1 +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"}
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,CAAC,CAAC;AAE/C,SAAS,UAAU,OAAsC;CACvD,IAEE,YACA,OAAO,WAAW,aAElB,OAAO,MAAM;CAGf,IAAI,CAAC,UACH,MAAM;CAGR,SAAS,YAAY;CAErB,OAAO,MAAM;AACf;AAEA,SAAgB,aAAa,OAAwC;CACnE,MAAM,gBAAgB;CACtB,MAAM,WAAW,YAAY;CAC7B,MAAM,UAAU,MAAM,MAAM;CAC5B,MAAM,KAAK,cAAc,IAAI,GAAG,cAAc,IAAI,YAAY;CAC9D,MAAM,8BAA8B,MAAM,OACxC,KAAA,CACF;CACA,4BAA4B,aAEzB,YAAY,OAAO,WAAW,gBAAgB,CAAC;CAYlD,MAAM,cAAc;EAClB,KAZgB,MAAM,aACrB,YAAmC;GAClC,IAAI,CAAC,SAAS;GACd,IAAI,CAAC,4BAA4B,SAC/B,QAAQ,gBAAgB;QAExB,iBAAiB,IAAI,OAAO;EAEhC,GACA,CAAC,EAAE,CAGE;GACJ,qBAAqB;GACrB,uBAAuB;CAC1B;CACA,MAAM,kBAAkB;EACtB,MAAM,OAAO,gBAAgB,EAAE;EAC/B,OAAO,OACL,oBAAC,OAAD;GACE,OAAO,EAAE,SAAS,WAAW;GAC7B,yBAAyB,EAAE,QAAQ,KAAK;EACzC,CAAA,IAEA,MAAM,YAAY;CAEvB,GAAG;CAEH,OACE,oBAAC,OAAD;EAAK,GAAI;YACP,oBAAC,MAAM,UAAP;GAA0B;aACxB,oBAAC,WAAD,EAAA,UAAY,MAAM,SAAoB,CAAA;EACxB,CAAA;CACb,CAAA;AAET;;AAGA,SAAgB,UAAgD;CAC9D,OAAuB,sCAAsB,MAAU,GAAG,YAAY;AACxE"}
@@ -1 +1 @@
1
- {"version":3,"file":"visible.js","names":[],"sources":["../../../src/hydration/visible.tsx"],"sourcesContent":["'use client'\n\nimport * as React from 'react'\n\nimport { reactUse } from '@tanstack/react-router'\nimport { isServer } from '@tanstack/router-core/isServer'\nimport type {\n HydrationPrefetchStrategy,\n VisibleHydrationOptions,\n} from '@tanstack/start-client-core/hydration'\nimport type {\n HydrateProps,\n InternalHydrateProps,\n ReactHydrationStrategy,\n} from '../Hydrate'\n\ntype VisibleGate = {\n p: Promise<void>\n r: boolean\n s: () => void\n}\n\n/* @__NO_SIDE_EFFECTS__ */\nfunction HydrationBoundary(props: {\n g: VisibleGate\n o?: () => void\n children?: React.ReactNode\n}) {\n const { g, o } = props\n\n if (!g.r) {\n if (!reactUse) {\n throw g.p\n }\n\n reactUse(g.p)\n }\n\n React.useEffect(() => {\n o?.()\n }, [o])\n\n return props.children as React.JSX.Element\n}\n\n/* @__NO_SIDE_EFFECTS__ */\nexport function VisibleHydrate(\n this: ReactHydrationStrategy,\n props: HydrateProps,\n): React.JSX.Element {\n const strategy = this as ReactHydrationStrategy<'visible', true>\n const prefetchStrategy = props.prefetch\n const preload = (props as InternalHydrateProps).p\n const markerRef = React.useRef<HTMLDivElement | null>(null)\n const [gate] = React.useState<VisibleGate>(() => {\n let resolvePromise!: () => void\n const nextGate: VisibleGate = {\n p: new Promise<void>((resolve) => {\n resolvePromise = resolve\n }),\n r: false,\n s: () => {\n nextGate.r = true\n resolvePromise()\n },\n }\n if (\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n isServer ??\n typeof window === 'undefined'\n ) {\n nextGate.s()\n }\n\n return nextGate\n })\n\n React.useEffect(() => {\n if (!preload || typeof prefetchStrategy === 'function') {\n return\n }\n\n return prefetchStrategy?._s?.({\n element: markerRef.current,\n prefetch: preload,\n })\n }, [prefetchStrategy, preload])\n\n React.useEffect(() => {\n if (gate.r) return\n\n return strategy._s?.({\n element: markerRef.current,\n gate: gate as never,\n })\n }, [gate, strategy])\n\n return (\n <div ref={markerRef}>\n <React.Suspense fallback={props.fallback}>\n <HydrationBoundary g={gate} o={props.onHydrated}>\n {props.children}\n </HydrationBoundary>\n </React.Suspense>\n </div>\n )\n}\n\n/* @__NO_SIDE_EFFECTS__ */\nexport function visible(\n options?: VisibleHydrationOptions,\n): ReactHydrationStrategy<'visible', true> &\n HydrationPrefetchStrategy<'visible'> {\n const rootMargin = options?.rootMargin ?? '600px'\n const threshold = options?.threshold ?? 0\n\n return {\n _s: ({ element, gate, prefetch }) => {\n const callback = prefetch || (gate as never as VisibleGate).s\n\n if (!element) {\n callback()\n return\n }\n\n const observer = new IntersectionObserver(\n (entries) => {\n if (!entries[0]!.isIntersecting) return\n observer.disconnect()\n callback()\n },\n { rootMargin, threshold },\n )\n observer.observe(element)\n return () => observer.disconnect()\n },\n _h: VisibleHydrate,\n }\n}\n"],"mappings":";;;;;;;AAuBA,SAAS,kBAAkB,OAIxB;CACD,MAAM,EAAE,GAAG,MAAM;AAEjB,KAAI,CAAC,EAAE,GAAG;AACR,MAAI,CAAC,SACH,OAAM,EAAE;AAGV,WAAS,EAAE,EAAE;;AAGf,OAAM,gBAAgB;AACpB,OAAK;IACJ,CAAC,EAAE,CAAC;AAEP,QAAO,MAAM;;;AAIf,SAAgB,eAEd,OACmB;CACnB,MAAM,WAAW;CACjB,MAAM,mBAAmB,MAAM;CAC/B,MAAM,UAAW,MAA+B;CAChD,MAAM,YAAY,MAAM,OAA8B,KAAK;CAC3D,MAAM,CAAC,QAAQ,MAAM,eAA4B;EAC/C,IAAI;EACJ,MAAM,WAAwB;GAC5B,GAAG,IAAI,SAAe,YAAY;AAChC,qBAAiB;KACjB;GACF,GAAG;GACH,SAAS;AACP,aAAS,IAAI;AACb,oBAAgB;;GAEnB;AACD,MAEE,YACA,OAAO,WAAW,YAElB,UAAS,GAAG;AAGd,SAAO;GACP;AAEF,OAAM,gBAAgB;AACpB,MAAI,CAAC,WAAW,OAAO,qBAAqB,WAC1C;AAGF,SAAO,kBAAkB,KAAK;GAC5B,SAAS,UAAU;GACnB,UAAU;GACX,CAAC;IACD,CAAC,kBAAkB,QAAQ,CAAC;AAE/B,OAAM,gBAAgB;AACpB,MAAI,KAAK,EAAG;AAEZ,SAAO,SAAS,KAAK;GACnB,SAAS,UAAU;GACb;GACP,CAAC;IACD,CAAC,MAAM,SAAS,CAAC;AAEpB,QACE,oBAAC,OAAD;EAAK,KAAK;YACR,oBAAC,MAAM,UAAP;GAAgB,UAAU,MAAM;aAC9B,oBAAC,mBAAD;IAAmB,GAAG;IAAM,GAAG,MAAM;cAClC,MAAM;IACW,CAAA;GACL,CAAA;EACb,CAAA;;;AAKV,SAAgB,QACd,SAEqC;CACrC,MAAM,aAAa,SAAS,cAAc;CAC1C,MAAM,YAAY,SAAS,aAAa;AAExC,QAAO;EACL,KAAK,EAAE,SAAS,MAAM,eAAe;GACnC,MAAM,WAAW,YAAa,KAA8B;AAE5D,OAAI,CAAC,SAAS;AACZ,cAAU;AACV;;GAGF,MAAM,WAAW,IAAI,sBAClB,YAAY;AACX,QAAI,CAAC,QAAQ,GAAI,eAAgB;AACjC,aAAS,YAAY;AACrB,cAAU;MAEZ;IAAE;IAAY;IAAW,CAC1B;AACD,YAAS,QAAQ,QAAQ;AACzB,gBAAa,SAAS,YAAY;;EAEpC,IAAI;EACL"}
1
+ {"version":3,"file":"visible.js","names":[],"sources":["../../../src/hydration/visible.tsx"],"sourcesContent":["'use client'\n\nimport * as React from 'react'\n\nimport { reactUse } from '@tanstack/react-router'\nimport { isServer } from '@tanstack/router-core/isServer'\nimport type {\n HydrationPrefetchStrategy,\n VisibleHydrationOptions,\n} from '@tanstack/start-client-core/hydration'\nimport type {\n HydrateProps,\n InternalHydrateProps,\n ReactHydrationStrategy,\n} from '../Hydrate'\n\ntype VisibleGate = {\n p: Promise<void>\n r: boolean\n s: () => void\n}\n\n/* @__NO_SIDE_EFFECTS__ */\nfunction HydrationBoundary(props: {\n g: VisibleGate\n o?: () => void\n children?: React.ReactNode\n}) {\n const { g, o } = props\n\n if (!g.r) {\n if (!reactUse) {\n throw g.p\n }\n\n reactUse(g.p)\n }\n\n React.useEffect(() => {\n o?.()\n }, [o])\n\n return props.children as React.JSX.Element\n}\n\n/* @__NO_SIDE_EFFECTS__ */\nexport function VisibleHydrate(\n this: ReactHydrationStrategy,\n props: HydrateProps,\n): React.JSX.Element {\n const strategy = this as ReactHydrationStrategy<'visible', true>\n const prefetchStrategy = props.prefetch\n const preload = (props as InternalHydrateProps).p\n const markerRef = React.useRef<HTMLDivElement | null>(null)\n const [gate] = React.useState<VisibleGate>(() => {\n let resolvePromise!: () => void\n const nextGate: VisibleGate = {\n p: new Promise<void>((resolve) => {\n resolvePromise = resolve\n }),\n r: false,\n s: () => {\n nextGate.r = true\n resolvePromise()\n },\n }\n if (\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n isServer ??\n typeof window === 'undefined'\n ) {\n nextGate.s()\n }\n\n return nextGate\n })\n\n React.useEffect(() => {\n if (!preload || typeof prefetchStrategy === 'function') {\n return\n }\n\n return prefetchStrategy?._s?.({\n element: markerRef.current,\n prefetch: preload,\n })\n }, [prefetchStrategy, preload])\n\n React.useEffect(() => {\n if (gate.r) return\n\n return strategy._s?.({\n element: markerRef.current,\n gate: gate as never,\n })\n }, [gate, strategy])\n\n return (\n <div ref={markerRef}>\n <React.Suspense fallback={props.fallback}>\n <HydrationBoundary g={gate} o={props.onHydrated}>\n {props.children}\n </HydrationBoundary>\n </React.Suspense>\n </div>\n )\n}\n\n/* @__NO_SIDE_EFFECTS__ */\nexport function visible(\n options?: VisibleHydrationOptions,\n): ReactHydrationStrategy<'visible', true> &\n HydrationPrefetchStrategy<'visible'> {\n const rootMargin = options?.rootMargin ?? '600px'\n const threshold = options?.threshold ?? 0\n\n return {\n _s: ({ element, gate, prefetch }) => {\n const callback = prefetch || (gate as never as VisibleGate).s\n\n if (!element) {\n callback()\n return\n }\n\n const observer = new IntersectionObserver(\n (entries) => {\n if (!entries[0]!.isIntersecting) return\n observer.disconnect()\n callback()\n },\n { rootMargin, threshold },\n )\n observer.observe(element)\n return () => observer.disconnect()\n },\n _h: VisibleHydrate,\n }\n}\n"],"mappings":";;;;;;;AAuBA,SAAS,kBAAkB,OAIxB;CACD,MAAM,EAAE,GAAG,MAAM;CAEjB,IAAI,CAAC,EAAE,GAAG;EACR,IAAI,CAAC,UACH,MAAM,EAAE;EAGV,SAAS,EAAE,CAAC;CACd;CAEA,MAAM,gBAAgB;EACpB,IAAI;CACN,GAAG,CAAC,CAAC,CAAC;CAEN,OAAO,MAAM;AACf;;AAGA,SAAgB,eAEd,OACmB;CACnB,MAAM,WAAW;CACjB,MAAM,mBAAmB,MAAM;CAC/B,MAAM,UAAW,MAA+B;CAChD,MAAM,YAAY,MAAM,OAA8B,IAAI;CAC1D,MAAM,CAAC,QAAQ,MAAM,eAA4B;EAC/C,IAAI;EACJ,MAAM,WAAwB;GAC5B,GAAG,IAAI,SAAe,YAAY;IAChC,iBAAiB;GACnB,CAAC;GACD,GAAG;GACH,SAAS;IACP,SAAS,IAAI;IACb,eAAe;GACjB;EACF;EACA,IAEE,YACA,OAAO,WAAW,aAElB,SAAS,EAAE;EAGb,OAAO;CACT,CAAC;CAED,MAAM,gBAAgB;EACpB,IAAI,CAAC,WAAW,OAAO,qBAAqB,YAC1C;EAGF,OAAO,kBAAkB,KAAK;GAC5B,SAAS,UAAU;GACnB,UAAU;EACZ,CAAC;CACH,GAAG,CAAC,kBAAkB,OAAO,CAAC;CAE9B,MAAM,gBAAgB;EACpB,IAAI,KAAK,GAAG;EAEZ,OAAO,SAAS,KAAK;GACnB,SAAS,UAAU;GACb;EACR,CAAC;CACH,GAAG,CAAC,MAAM,QAAQ,CAAC;CAEnB,OACE,oBAAC,OAAD;EAAK,KAAK;YACR,oBAAC,MAAM,UAAP;GAAgB,UAAU,MAAM;aAC9B,oBAAC,mBAAD;IAAmB,GAAG;IAAM,GAAG,MAAM;cAClC,MAAM;GACU,CAAA;EACL,CAAA;CACb,CAAA;AAET;;AAGA,SAAgB,QACd,SAEqC;CACrC,MAAM,aAAa,SAAS,cAAc;CAC1C,MAAM,YAAY,SAAS,aAAa;CAExC,OAAO;EACL,KAAK,EAAE,SAAS,MAAM,eAAe;GACnC,MAAM,WAAW,YAAa,KAA8B;GAE5D,IAAI,CAAC,SAAS;IACZ,SAAS;IACT;GACF;GAEA,MAAM,WAAW,IAAI,sBAClB,YAAY;IACX,IAAI,CAAC,QAAQ,GAAI,gBAAgB;IACjC,SAAS,WAAW;IACpB,SAAS;GACX,GACA;IAAE;IAAY;GAAU,CAC1B;GACA,SAAS,QAAQ,OAAO;GACxB,aAAa,SAAS,WAAW;EACnC;EACA,IAAI;CACN;AACF"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tanstack/react-start-client",
3
- "version": "1.168.2",
3
+ "version": "1.168.4",
4
4
  "description": "Modern and scalable routing for React applications",
5
5
  "author": "Tanner Linsley",
6
6
  "license": "MIT",
@@ -49,9 +49,9 @@
49
49
  "node": ">=22.12.0"
50
50
  },
51
51
  "dependencies": {
52
- "@tanstack/react-router": "1.170.7",
53
- "@tanstack/router-core": "1.171.5",
54
- "@tanstack/start-client-core": "1.170.2"
52
+ "@tanstack/react-router": "1.170.8",
53
+ "@tanstack/router-core": "1.171.6",
54
+ "@tanstack/start-client-core": "1.170.4"
55
55
  },
56
56
  "devDependencies": {
57
57
  "@testing-library/react": "^16.2.0",