@tanstack/solid-router 1.168.12 → 1.168.13
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/cjs/Match.cjs +7 -7
- package/dist/cjs/Match.cjs.map +1 -1
- package/dist/cjs/Matches.cjs +6 -6
- package/dist/cjs/Matches.cjs.map +1 -1
- package/dist/cjs/Scripts.cjs +1 -1
- package/dist/cjs/Scripts.cjs.map +1 -1
- package/dist/cjs/Transitioner.cjs +7 -7
- package/dist/cjs/Transitioner.cjs.map +1 -1
- package/dist/cjs/headContentUtils.cjs +1 -1
- package/dist/cjs/headContentUtils.cjs.map +1 -1
- package/dist/cjs/link.cjs +1 -1
- package/dist/cjs/link.cjs.map +1 -1
- package/dist/cjs/not-found.cjs +2 -2
- package/dist/cjs/not-found.cjs.map +1 -1
- package/dist/cjs/routerStores.cjs +6 -11
- package/dist/cjs/routerStores.cjs.map +1 -1
- package/dist/cjs/ssr/RouterClient.cjs +1 -1
- package/dist/cjs/ssr/RouterClient.cjs.map +1 -1
- package/dist/cjs/ssr/renderRouterToStream.cjs +1 -1
- package/dist/cjs/ssr/renderRouterToStream.cjs.map +1 -1
- package/dist/cjs/ssr/renderRouterToString.cjs +1 -1
- package/dist/cjs/ssr/renderRouterToString.cjs.map +1 -1
- package/dist/cjs/useCanGoBack.cjs +1 -1
- package/dist/cjs/useCanGoBack.cjs.map +1 -1
- package/dist/cjs/useLocation.cjs +2 -2
- package/dist/cjs/useLocation.cjs.map +1 -1
- package/dist/cjs/useMatch.cjs +2 -2
- package/dist/cjs/useMatch.cjs.map +1 -1
- package/dist/cjs/useRouterState.cjs +3 -3
- package/dist/cjs/useRouterState.cjs.map +1 -1
- package/dist/esm/Match.js +7 -7
- package/dist/esm/Match.js.map +1 -1
- package/dist/esm/Matches.js +6 -6
- package/dist/esm/Matches.js.map +1 -1
- package/dist/esm/Scripts.js +1 -1
- package/dist/esm/Scripts.js.map +1 -1
- package/dist/esm/Transitioner.js +7 -7
- package/dist/esm/Transitioner.js.map +1 -1
- package/dist/esm/headContentUtils.js +1 -1
- package/dist/esm/headContentUtils.js.map +1 -1
- package/dist/esm/link.js +1 -1
- package/dist/esm/link.js.map +1 -1
- package/dist/esm/not-found.js +2 -2
- package/dist/esm/not-found.js.map +1 -1
- package/dist/esm/routerStores.js +6 -11
- package/dist/esm/routerStores.js.map +1 -1
- package/dist/esm/ssr/RouterClient.js +1 -1
- package/dist/esm/ssr/RouterClient.js.map +1 -1
- package/dist/esm/ssr/renderRouterToStream.js +1 -1
- package/dist/esm/ssr/renderRouterToStream.js.map +1 -1
- package/dist/esm/ssr/renderRouterToString.js +1 -1
- package/dist/esm/ssr/renderRouterToString.js.map +1 -1
- package/dist/esm/useCanGoBack.js +1 -1
- package/dist/esm/useCanGoBack.js.map +1 -1
- package/dist/esm/useLocation.js +2 -2
- package/dist/esm/useLocation.js.map +1 -1
- package/dist/esm/useMatch.js +2 -2
- package/dist/esm/useMatch.js.map +1 -1
- package/dist/esm/useRouterState.js +3 -3
- package/dist/esm/useRouterState.js.map +1 -1
- package/dist/source/Match.jsx +7 -7
- package/dist/source/Match.jsx.map +1 -1
- package/dist/source/Matches.jsx +6 -6
- package/dist/source/Matches.jsx.map +1 -1
- package/dist/source/Scripts.jsx +1 -1
- package/dist/source/Scripts.jsx.map +1 -1
- package/dist/source/Transitioner.jsx +7 -7
- package/dist/source/Transitioner.jsx.map +1 -1
- package/dist/source/headContentUtils.jsx +1 -1
- package/dist/source/headContentUtils.jsx.map +1 -1
- package/dist/source/link.jsx +1 -1
- package/dist/source/link.jsx.map +1 -1
- package/dist/source/not-found.jsx +2 -2
- package/dist/source/not-found.jsx.map +1 -1
- package/dist/source/routerStores.js +4 -13
- package/dist/source/routerStores.js.map +1 -1
- package/dist/source/ssr/RouterClient.jsx +1 -1
- package/dist/source/ssr/RouterClient.jsx.map +1 -1
- package/dist/source/ssr/renderRouterToStream.jsx +1 -1
- package/dist/source/ssr/renderRouterToStream.jsx.map +1 -1
- package/dist/source/ssr/renderRouterToString.jsx +1 -1
- package/dist/source/ssr/renderRouterToString.jsx.map +1 -1
- package/dist/source/useCanGoBack.js +1 -1
- package/dist/source/useCanGoBack.js.map +1 -1
- package/dist/source/useLocation.jsx +2 -2
- package/dist/source/useLocation.jsx.map +1 -1
- package/dist/source/useMatch.jsx +3 -3
- package/dist/source/useMatch.jsx.map +1 -1
- package/dist/source/useRouterState.jsx +3 -3
- package/dist/source/useRouterState.jsx.map +1 -1
- package/package.json +2 -2
- package/src/Match.tsx +8 -8
- package/src/Matches.tsx +6 -6
- package/src/Scripts.tsx +2 -2
- package/src/Transitioner.tsx +11 -13
- package/src/headContentUtils.tsx +2 -2
- package/src/link.tsx +1 -1
- package/src/not-found.tsx +2 -2
- package/src/routerStores.ts +4 -13
- package/src/ssr/RouterClient.tsx +1 -1
- package/src/ssr/renderRouterToStream.tsx +1 -1
- package/src/ssr/renderRouterToString.tsx +1 -1
- package/src/useCanGoBack.ts +1 -1
- package/src/useLocation.tsx +2 -2
- package/src/useMatch.tsx +3 -3
- package/src/useRouterState.tsx +3 -3
package/dist/esm/link.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"link.js","names":["Solid","mergeRefs","deepEqual","exactPathTest","functionalUpdate","isDangerousProtocol","preloadWarning","removeTrailingSlash","isServer","Dynamic","useRouter","useIntersectionObserver","useHydrated","AnyRouter","Constrain","LinkOptions","RegisteredRouter","RoutePaths","ValidateLinkOptions","ValidateLinkOptionsArray","timeoutMap","WeakMap","EventTarget","ReturnType","setTimeout","useLinkProps","TRouter","TFrom","options","UseLinkPropsOptions","TTo","TMaskFrom","TMaskTo","ComponentProps","router","isTransitioning","setIsTransitioning","createSignal","shouldHydrateHash","ssr","hasHydrated","hasRenderFetched","local","rest","splitProps","mergeProps","activeProps","STATIC_ACTIVE_PROPS_GET","inactiveProps","STATIC_INACTIVE_PROPS_GET","_","propsSafeToSpread","currentLocation","createMemo","stores","location","state","undefined","equals","prev","next","href","_options","_fromLocation","untrack","buildLocation","hrefOption","disabled","maskedLocation","publicHref","external","history","createHref","externalLink","_href","protocolAllowlist","process","env","NODE_ENV","console","warn","to","safeInternal","isSafeInternal","indexOf","URL","preload","reloadDocument","defaultPreload","preloadDelay","defaultPreloadDelay","isActive","activeOptions","current","nextLocation","exact","testExact","pathname","basepath","currentPath","nextPath","pathIsFuzzyEqual","startsWith","length","includeSearch","searchTest","search","partial","ignoreUndefined","explicitUndefined","includeHash","currentHash","hash","doPreload","preloadRoute","_builtLocation","catch","err","preloadViewportIoCallback","entry","IntersectionObserverEntry","isIntersecting","ref","setRef","Element","rootMargin","createEffect","handleClick","e","MouseEvent","elementTarget","currentTarget","HTMLAnchorElement","SVGAElement","getAttribute","effectiveTarget","target","isCtrlEvent","defaultPrevented","button","preventDefault","unsub","subscribe","navigate","replace","resetScroll","hashScrollIntoView","startTransition","viewTransition","ignoreBlocker","enqueueIntentPreload","FocusEvent","eventTarget","has","set","delete","handleTouchStart","TouchEvent","handleLeave","id","get","clearTimeout","simpleStyling","class","style","onClick","createComposedHandler","onBlur","onFocus","onMouseEnter","onMouseOver","onMouseLeave","onMouseOut","onTouchStart","ResolvedLinkStateProps","Omit","JSX","CSSProperties","resolvedProps","active","base","STATIC_DISABLED_PROPS","STATIC_TRANSITIONING_ATTRIBUTES","STATIC_DEFAULT_ACTIVE_ATTRIBUTES","EMPTY_OBJECT","className","filter","Boolean","join","Object","keys","STATIC_ACTIVE_ATTRIBUTES","STATIC_ACTIVE_PROPS","role","callHandler","Event","event","TEvent","T","handler","EventHandlerUnion","getHandler","fallback","ActiveLinkOptions","ActiveLinkOptionProps","TComp","ActiveLinkProps","Partial","LinkComponentSolidProps","key","LinkProps","LinkPropsChildren","children","ValidComponent","CreateLinkProps","LinkComponentProps","LinkComponent","TDefaultFrom","props","LinkComponentRoute","defaultFrom","createLink","Comp","_$createComponent","Link","_$mergeProps","_asChild","linkProps","ch","svgLinkProps","_el$","_tmpl$","_el$2","firstChild","_$spread","_$insert","_el$3","_tmpl$2","component","metaKey","altKey","ctrlKey","shiftKey","zero","charCodeAt","LinkOptionsFnOptions","TOptions","ReadonlyArray","LinkOptionsFn","linkOptions"],"sources":["../../src/link.tsx"],"sourcesContent":["import * as Solid from 'solid-js'\n\nimport { mergeRefs } from '@solid-primitives/refs'\n\nimport {\n deepEqual,\n exactPathTest,\n functionalUpdate,\n isDangerousProtocol,\n preloadWarning,\n removeTrailingSlash,\n} from '@tanstack/router-core'\n\nimport { isServer } from '@tanstack/router-core/isServer'\nimport { Dynamic } from 'solid-js/web'\nimport { useRouter } from './useRouter'\n\nimport { useIntersectionObserver } from './utils'\n\nimport { useHydrated } from './ClientOnly'\nimport type {\n AnyRouter,\n Constrain,\n LinkOptions,\n RegisteredRouter,\n RoutePaths,\n} from '@tanstack/router-core'\nimport type {\n ValidateLinkOptions,\n ValidateLinkOptionsArray,\n} from './typePrimitives'\n\nconst timeoutMap = new WeakMap<EventTarget, ReturnType<typeof setTimeout>>()\n\nexport function useLinkProps<\n TRouter extends AnyRouter = RegisteredRouter,\n TFrom extends RoutePaths<TRouter['routeTree']> | string = string,\n TTo extends string = '',\n TMaskFrom extends RoutePaths<TRouter['routeTree']> | string = TFrom,\n TMaskTo extends string = '',\n>(\n options: UseLinkPropsOptions<TRouter, TFrom, TTo, TMaskFrom, TMaskTo>,\n): Solid.ComponentProps<'a'> {\n const router = useRouter()\n const [isTransitioning, setIsTransitioning] = Solid.createSignal(false)\n const shouldHydrateHash = !isServer && !!router.options.ssr\n const hasHydrated = useHydrated()\n\n let hasRenderFetched = false\n\n const [local, rest] = Solid.splitProps(\n Solid.mergeProps(\n {\n activeProps: STATIC_ACTIVE_PROPS_GET,\n inactiveProps: STATIC_INACTIVE_PROPS_GET,\n },\n options,\n ),\n [\n 'activeProps',\n 'inactiveProps',\n 'activeOptions',\n 'to',\n 'preload',\n 'preloadDelay',\n 'preloadIntentProximity',\n 'hashScrollIntoView',\n 'replace',\n 'startTransition',\n 'resetScroll',\n 'viewTransition',\n 'target',\n 'disabled',\n 'style',\n 'class',\n 'onClick',\n 'onBlur',\n 'onFocus',\n 'onMouseEnter',\n 'onMouseLeave',\n 'onMouseOver',\n 'onMouseOut',\n 'onTouchStart',\n 'ignoreBlocker',\n ],\n )\n\n // const {\n // // custom props\n // activeProps = () => ({ class: 'active' }),\n // inactiveProps = () => ({}),\n // activeOptions,\n // to,\n // preload: userPreload,\n // preloadDelay: userPreloadDelay,\n // hashScrollIntoView,\n // replace,\n // startTransition,\n // resetScroll,\n // viewTransition,\n // // element props\n // children,\n // target,\n // disabled,\n // style,\n // class,\n // onClick,\n // onFocus,\n // onMouseEnter,\n // onMouseLeave,\n // onTouchStart,\n // ignoreBlocker,\n // ...rest\n // } = options\n\n const [_, propsSafeToSpread] = Solid.splitProps(rest, [\n 'params',\n 'search',\n 'hash',\n 'state',\n 'mask',\n 'reloadDocument',\n 'unsafeRelative',\n 'from',\n ])\n\n const currentLocation = Solid.createMemo(\n () => router.stores.location.state,\n undefined,\n { equals: (prev, next) => prev.href === next.href },\n )\n\n const _options = () => options\n\n const next = Solid.createMemo(() => {\n // Rebuild when inherited search/hash or the current route context changes.\n const _fromLocation = currentLocation()\n const options = { _fromLocation, ..._options() } as any\n // untrack because router-core will also access stores, which are signals in solid\n return Solid.untrack(() => router.buildLocation(options))\n })\n\n const hrefOption = Solid.createMemo(() => {\n if (_options().disabled) return undefined\n // Use publicHref - it contains the correct href for display\n // When a rewrite changes the origin, publicHref is the full URL\n // Otherwise it's the origin-stripped path\n // This avoids constructing URL objects in the hot path\n const location = next().maskedLocation ?? next()\n const publicHref = location.publicHref\n const external = location.external\n\n if (external) {\n return { href: publicHref, external: true }\n }\n\n return {\n href: router.history.createHref(publicHref) || '/',\n external: false,\n }\n })\n\n const externalLink = Solid.createMemo(() => {\n const _href = hrefOption()\n if (_href?.external) {\n // Block dangerous protocols for external links\n if (isDangerousProtocol(_href.href, router.protocolAllowlist)) {\n if (process.env.NODE_ENV !== 'production') {\n console.warn(`Blocked Link with dangerous protocol: ${_href.href}`)\n }\n return undefined\n }\n return _href.href\n }\n const to = _options().to\n const safeInternal = isSafeInternal(to)\n if (safeInternal) return undefined\n if (typeof to !== 'string' || to.indexOf(':') === -1) return undefined\n try {\n new URL(to as any)\n // Block dangerous protocols like javascript:, blob:, data:\n if (isDangerousProtocol(to, router.protocolAllowlist)) {\n if (process.env.NODE_ENV !== 'production') {\n console.warn(`Blocked Link with dangerous protocol: ${to}`)\n }\n return undefined\n }\n return to\n } catch {}\n return undefined\n })\n\n const preload = Solid.createMemo(() => {\n if (_options().reloadDocument || externalLink()) {\n return false\n }\n return local.preload ?? router.options.defaultPreload\n })\n const preloadDelay = () =>\n local.preloadDelay ?? router.options.defaultPreloadDelay ?? 0\n\n const isActive = Solid.createMemo(() => {\n if (externalLink()) return false\n const activeOptions = local.activeOptions\n const current = currentLocation()\n const nextLocation = next()\n\n if (activeOptions?.exact) {\n const testExact = exactPathTest(\n current.pathname,\n nextLocation.pathname,\n router.basepath,\n )\n if (!testExact) {\n return false\n }\n } else {\n const currentPath = removeTrailingSlash(current.pathname, router.basepath)\n const nextPath = removeTrailingSlash(\n nextLocation.pathname,\n router.basepath,\n )\n\n const pathIsFuzzyEqual =\n currentPath.startsWith(nextPath) &&\n (currentPath.length === nextPath.length ||\n currentPath[nextPath.length] === '/')\n if (!pathIsFuzzyEqual) {\n return false\n }\n }\n\n if (activeOptions?.includeSearch ?? true) {\n const searchTest = deepEqual(current.search, nextLocation.search, {\n partial: !activeOptions?.exact,\n ignoreUndefined: !activeOptions?.explicitUndefined,\n })\n if (!searchTest) {\n return false\n }\n }\n\n if (activeOptions?.includeHash) {\n const currentHash =\n shouldHydrateHash && !hasHydrated() ? '' : current.hash\n return currentHash === nextLocation.hash\n }\n return true\n })\n\n const doPreload = () =>\n router\n .preloadRoute({ ..._options(), _builtLocation: next() } as any)\n .catch((err: any) => {\n console.warn(err)\n console.warn(preloadWarning)\n })\n\n const preloadViewportIoCallback = (\n entry: IntersectionObserverEntry | undefined,\n ) => {\n if (entry?.isIntersecting) {\n doPreload()\n }\n }\n\n const [ref, setRef] = Solid.createSignal<Element | null>(null)\n\n useIntersectionObserver(\n ref,\n preloadViewportIoCallback,\n { rootMargin: '100px' },\n { disabled: !!local.disabled || !(preload() === 'viewport') },\n )\n\n Solid.createEffect(() => {\n if (hasRenderFetched) {\n return\n }\n if (!local.disabled && preload() === 'render') {\n doPreload()\n hasRenderFetched = true\n }\n })\n\n if (externalLink()) {\n return Solid.mergeProps(\n propsSafeToSpread,\n {\n ref: mergeRefs(setRef, _options().ref),\n href: externalLink(),\n },\n Solid.splitProps(local, [\n 'target',\n 'disabled',\n 'style',\n 'class',\n 'onClick',\n 'onBlur',\n 'onFocus',\n 'onMouseEnter',\n 'onMouseLeave',\n 'onMouseOut',\n 'onMouseOver',\n 'onTouchStart',\n ])[0],\n ) as any\n }\n\n // The click handler\n const handleClick = (e: MouseEvent) => {\n // Check actual element's target attribute as fallback\n const elementTarget = (\n e.currentTarget as HTMLAnchorElement | SVGAElement\n ).getAttribute('target')\n const effectiveTarget =\n local.target !== undefined ? local.target : elementTarget\n\n if (\n !local.disabled &&\n !isCtrlEvent(e) &&\n !e.defaultPrevented &&\n (!effectiveTarget || effectiveTarget === '_self') &&\n e.button === 0\n ) {\n e.preventDefault()\n\n setIsTransitioning(true)\n\n const unsub = router.subscribe('onResolved', () => {\n unsub()\n setIsTransitioning(false)\n })\n\n // All is well? Navigate!\n // N.B. we don't call `router.commitLocation(next) here because we want to run `validateSearch` before committing\n router.navigate({\n ..._options(),\n replace: local.replace,\n resetScroll: local.resetScroll,\n hashScrollIntoView: local.hashScrollIntoView,\n startTransition: local.startTransition,\n viewTransition: local.viewTransition,\n ignoreBlocker: local.ignoreBlocker,\n })\n }\n }\n\n const enqueueIntentPreload = (e: MouseEvent | FocusEvent) => {\n if (local.disabled || preload() !== 'intent') return\n\n if (!preloadDelay()) {\n doPreload()\n return\n }\n\n const eventTarget = e.currentTarget || e.target\n\n if (!eventTarget || timeoutMap.has(eventTarget)) return\n\n timeoutMap.set(\n eventTarget,\n setTimeout(() => {\n timeoutMap.delete(eventTarget)\n doPreload()\n }, preloadDelay()),\n )\n }\n\n const handleTouchStart = (_: TouchEvent) => {\n if (local.disabled || preload() !== 'intent') return\n doPreload()\n }\n\n const handleLeave = (e: MouseEvent | FocusEvent) => {\n if (local.disabled) return\n const eventTarget = e.currentTarget || e.target\n\n if (eventTarget) {\n const id = timeoutMap.get(eventTarget)\n clearTimeout(id)\n timeoutMap.delete(eventTarget)\n }\n }\n\n const simpleStyling = Solid.createMemo(\n () =>\n local.activeProps === STATIC_ACTIVE_PROPS_GET &&\n local.inactiveProps === STATIC_INACTIVE_PROPS_GET &&\n local.class === undefined &&\n local.style === undefined,\n )\n\n const onClick = createComposedHandler(() => local.onClick, handleClick)\n const onBlur = createComposedHandler(() => local.onBlur, handleLeave)\n const onFocus = createComposedHandler(\n () => local.onFocus,\n enqueueIntentPreload,\n )\n const onMouseEnter = createComposedHandler(\n () => local.onMouseEnter,\n enqueueIntentPreload,\n )\n const onMouseOver = createComposedHandler(\n () => local.onMouseOver,\n enqueueIntentPreload,\n )\n const onMouseLeave = createComposedHandler(\n () => local.onMouseLeave,\n handleLeave,\n )\n const onMouseOut = createComposedHandler(() => local.onMouseOut, handleLeave)\n const onTouchStart = createComposedHandler(\n () => local.onTouchStart,\n handleTouchStart,\n )\n\n type ResolvedLinkStateProps = Omit<Solid.ComponentProps<'a'>, 'style'> & {\n style?: Solid.JSX.CSSProperties\n }\n\n const resolvedProps = Solid.createMemo(() => {\n const active = isActive()\n\n const base = {\n href: hrefOption()?.href,\n ref: mergeRefs(setRef, _options().ref),\n onClick,\n onBlur,\n onFocus,\n onMouseEnter,\n onMouseOver,\n onMouseLeave,\n onMouseOut,\n onTouchStart,\n disabled: !!local.disabled,\n target: local.target,\n ...(local.disabled && STATIC_DISABLED_PROPS),\n ...(isTransitioning() && STATIC_TRANSITIONING_ATTRIBUTES),\n }\n\n if (simpleStyling()) {\n return {\n ...base,\n ...(active && STATIC_DEFAULT_ACTIVE_ATTRIBUTES),\n }\n }\n\n const activeProps: ResolvedLinkStateProps = active\n ? (functionalUpdate(local.activeProps as any, {}) ?? EMPTY_OBJECT)\n : EMPTY_OBJECT\n const inactiveProps: ResolvedLinkStateProps = active\n ? EMPTY_OBJECT\n : functionalUpdate(local.inactiveProps, {})\n const style = {\n ...local.style,\n ...activeProps.style,\n ...inactiveProps.style,\n }\n const className = [local.class, activeProps.class, inactiveProps.class]\n .filter(Boolean)\n .join(' ')\n\n return {\n ...activeProps,\n ...inactiveProps,\n ...base,\n ...(Object.keys(style).length ? { style } : undefined),\n ...(className ? { class: className } : undefined),\n ...(active && STATIC_ACTIVE_ATTRIBUTES),\n } as ResolvedLinkStateProps\n })\n\n return Solid.mergeProps(propsSafeToSpread, resolvedProps) as any\n}\n\nconst STATIC_ACTIVE_PROPS = { class: 'active' }\nconst STATIC_ACTIVE_PROPS_GET = () => STATIC_ACTIVE_PROPS\nconst EMPTY_OBJECT = {}\nconst STATIC_INACTIVE_PROPS_GET = () => EMPTY_OBJECT\nconst STATIC_DEFAULT_ACTIVE_ATTRIBUTES = {\n class: 'active',\n 'data-status': 'active',\n 'aria-current': 'page',\n}\nconst STATIC_DISABLED_PROPS = {\n role: 'link',\n 'aria-disabled': true,\n}\nconst STATIC_ACTIVE_ATTRIBUTES = {\n 'data-status': 'active',\n 'aria-current': 'page',\n}\nconst STATIC_TRANSITIONING_ATTRIBUTES = {\n 'data-transitioning': 'transitioning',\n}\n\n/** Call a JSX.EventHandlerUnion with the event. */\nfunction callHandler<T, TEvent extends Event>(\n event: TEvent & { currentTarget: T; target: Element },\n handler: Solid.JSX.EventHandlerUnion<T, TEvent>,\n) {\n if (typeof handler === 'function') {\n handler(event)\n } else {\n handler[0](handler[1], event)\n }\n return event.defaultPrevented\n}\n\nfunction createComposedHandler<T, TEvent extends Event>(\n getHandler: () => Solid.JSX.EventHandlerUnion<T, TEvent> | undefined,\n fallback: (event: TEvent) => void,\n) {\n return (event: TEvent & { currentTarget: T; target: Element }) => {\n const handler = getHandler()\n if (!handler || !callHandler(event, handler)) fallback(event)\n }\n}\n\nexport type UseLinkPropsOptions<\n TRouter extends AnyRouter = RegisteredRouter,\n TFrom extends RoutePaths<TRouter['routeTree']> | string = string,\n TTo extends string | undefined = '.',\n TMaskFrom extends RoutePaths<TRouter['routeTree']> | string = TFrom,\n TMaskTo extends string = '.',\n> = ActiveLinkOptions<'a', TRouter, TFrom, TTo, TMaskFrom, TMaskTo> &\n Omit<Solid.ComponentProps<'a'>, 'style'> & { style?: Solid.JSX.CSSProperties }\n\nexport type ActiveLinkOptions<\n TComp = 'a',\n TRouter extends AnyRouter = RegisteredRouter,\n TFrom extends string = string,\n TTo extends string | undefined = '.',\n TMaskFrom extends string = TFrom,\n TMaskTo extends string = '.',\n> = LinkOptions<TRouter, TFrom, TTo, TMaskFrom, TMaskTo> &\n ActiveLinkOptionProps<TComp>\n\ntype ActiveLinkProps<TComp> = Partial<\n LinkComponentSolidProps<TComp> & {\n [key: `data-${string}`]: unknown\n }\n>\n\nexport interface ActiveLinkOptionProps<TComp = 'a'> {\n /**\n * A function that returns additional props for the `active` state of this link.\n * These props override other props passed to the link (`style`'s are merged, `class`'s are concatenated)\n */\n activeProps?: ActiveLinkProps<TComp> | (() => ActiveLinkProps<TComp>)\n /**\n * A function that returns additional props for the `inactive` state of this link.\n * These props override other props passed to the link (`style`'s are merged, `class`'s are concatenated)\n */\n inactiveProps?: ActiveLinkProps<TComp> | (() => ActiveLinkProps<TComp>)\n}\n\nexport type LinkProps<\n TComp = 'a',\n TRouter extends AnyRouter = RegisteredRouter,\n TFrom extends string = string,\n TTo extends string | undefined = '.',\n TMaskFrom extends string = TFrom,\n TMaskTo extends string = '.',\n> = ActiveLinkOptions<TComp, TRouter, TFrom, TTo, TMaskFrom, TMaskTo> &\n LinkPropsChildren\n\nexport interface LinkPropsChildren {\n // If a function is passed as a child, it will be given the `isActive` boolean to aid in further styling on the element it returns\n children?:\n | Solid.JSX.Element\n | ((state: {\n isActive: boolean\n isTransitioning: boolean\n }) => Solid.JSX.Element)\n}\n\ntype LinkComponentSolidProps<TComp> = TComp extends Solid.ValidComponent\n ? Omit<Solid.ComponentProps<TComp>, keyof CreateLinkProps>\n : never\n\nexport type LinkComponentProps<\n TComp = 'a',\n TRouter extends AnyRouter = RegisteredRouter,\n TFrom extends string = string,\n TTo extends string | undefined = '.',\n TMaskFrom extends string = TFrom,\n TMaskTo extends string = '.',\n> = LinkComponentSolidProps<TComp> &\n LinkProps<TComp, TRouter, TFrom, TTo, TMaskFrom, TMaskTo>\n\nexport type CreateLinkProps = LinkProps<\n any,\n any,\n string,\n string,\n string,\n string\n>\n\nexport type LinkComponent<\n in out TComp,\n in out TDefaultFrom extends string = string,\n> = <\n TRouter extends AnyRouter = RegisteredRouter,\n const TFrom extends string = TDefaultFrom,\n const TTo extends string | undefined = undefined,\n const TMaskFrom extends string = TFrom,\n const TMaskTo extends string = '',\n>(\n props: LinkComponentProps<TComp, TRouter, TFrom, TTo, TMaskFrom, TMaskTo>,\n) => Solid.JSX.Element\n\nexport interface LinkComponentRoute<\n in out TDefaultFrom extends string = string,\n> {\n defaultFrom: TDefaultFrom;\n <\n TRouter extends AnyRouter = RegisteredRouter,\n const TTo extends string | undefined = undefined,\n const TMaskTo extends string = '',\n >(\n props: LinkComponentProps<\n 'a',\n TRouter,\n this['defaultFrom'],\n TTo,\n this['defaultFrom'],\n TMaskTo\n >,\n ): Solid.JSX.Element\n}\n\nexport function createLink<const TComp>(\n Comp: Constrain<TComp, any, (props: CreateLinkProps) => Solid.JSX.Element>,\n): LinkComponent<TComp> {\n return (props) => <Link {...props} _asChild={Comp} />\n}\n\nexport const Link: LinkComponent<'a'> = (props) => {\n const [local, rest] = Solid.splitProps(\n props as typeof props & { _asChild: any },\n ['_asChild', 'children'],\n )\n\n const [_, linkProps] = Solid.splitProps(\n useLinkProps(rest as unknown as any),\n ['type'],\n )\n\n const children = Solid.createMemo(() => {\n const ch = local.children\n if (typeof ch === 'function') {\n return ch({\n get isActive() {\n return (linkProps as any)['data-status'] === 'active'\n },\n get isTransitioning() {\n return (linkProps as any)['data-transitioning'] === 'transitioning'\n },\n })\n }\n\n return ch satisfies Solid.JSX.Element\n })\n\n if (local._asChild === 'svg') {\n const [_, svgLinkProps] = Solid.splitProps(linkProps, ['class'])\n return (\n <svg>\n <a {...svgLinkProps}>{children()}</a>\n </svg>\n )\n }\n\n if (!local._asChild) {\n return <a {...linkProps}>{children()}</a>\n }\n\n return (\n <Dynamic component={local._asChild as Solid.ValidComponent} {...linkProps}>\n {children()}\n </Dynamic>\n )\n}\n\nfunction isCtrlEvent(e: MouseEvent) {\n return !!(e.metaKey || e.altKey || e.ctrlKey || e.shiftKey)\n}\n\nfunction isSafeInternal(to: unknown) {\n if (typeof to !== 'string') return false\n const zero = to.charCodeAt(0)\n if (zero === 47) return to.charCodeAt(1) !== 47 // '/' but not '//'\n return zero === 46 // '.', '..', './', '../'\n}\n\nexport type LinkOptionsFnOptions<\n TOptions,\n TComp,\n TRouter extends AnyRouter = RegisteredRouter,\n> =\n TOptions extends ReadonlyArray<any>\n ? ValidateLinkOptionsArray<TRouter, TOptions, string, TComp>\n : ValidateLinkOptions<TRouter, TOptions, string, TComp>\n\nexport type LinkOptionsFn<TComp> = <\n const TOptions,\n TRouter extends AnyRouter = RegisteredRouter,\n>(\n options: LinkOptionsFnOptions<TOptions, TComp, TRouter>,\n) => TOptions\n\nexport const linkOptions: LinkOptionsFn<'a'> = (options) => {\n return options as any\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"link.js","names":["Solid","mergeRefs","deepEqual","exactPathTest","functionalUpdate","isDangerousProtocol","preloadWarning","removeTrailingSlash","isServer","Dynamic","useRouter","useIntersectionObserver","useHydrated","AnyRouter","Constrain","LinkOptions","RegisteredRouter","RoutePaths","ValidateLinkOptions","ValidateLinkOptionsArray","timeoutMap","WeakMap","EventTarget","ReturnType","setTimeout","useLinkProps","TRouter","TFrom","options","UseLinkPropsOptions","TTo","TMaskFrom","TMaskTo","ComponentProps","router","isTransitioning","setIsTransitioning","createSignal","shouldHydrateHash","ssr","hasHydrated","hasRenderFetched","local","rest","splitProps","mergeProps","activeProps","STATIC_ACTIVE_PROPS_GET","inactiveProps","STATIC_INACTIVE_PROPS_GET","_","propsSafeToSpread","currentLocation","createMemo","stores","location","get","undefined","equals","prev","next","href","_options","_fromLocation","untrack","buildLocation","hrefOption","disabled","maskedLocation","publicHref","external","history","createHref","externalLink","_href","protocolAllowlist","process","env","NODE_ENV","console","warn","to","safeInternal","isSafeInternal","indexOf","URL","preload","reloadDocument","defaultPreload","preloadDelay","defaultPreloadDelay","isActive","activeOptions","current","nextLocation","exact","testExact","pathname","basepath","currentPath","nextPath","pathIsFuzzyEqual","startsWith","length","includeSearch","searchTest","search","partial","ignoreUndefined","explicitUndefined","includeHash","currentHash","hash","doPreload","preloadRoute","_builtLocation","catch","err","preloadViewportIoCallback","entry","IntersectionObserverEntry","isIntersecting","ref","setRef","Element","rootMargin","createEffect","handleClick","e","MouseEvent","elementTarget","currentTarget","HTMLAnchorElement","SVGAElement","getAttribute","effectiveTarget","target","isCtrlEvent","defaultPrevented","button","preventDefault","unsub","subscribe","navigate","replace","resetScroll","hashScrollIntoView","startTransition","viewTransition","ignoreBlocker","enqueueIntentPreload","FocusEvent","eventTarget","has","set","delete","handleTouchStart","TouchEvent","handleLeave","id","clearTimeout","simpleStyling","class","style","onClick","createComposedHandler","onBlur","onFocus","onMouseEnter","onMouseOver","onMouseLeave","onMouseOut","onTouchStart","ResolvedLinkStateProps","Omit","JSX","CSSProperties","resolvedProps","active","base","STATIC_DISABLED_PROPS","STATIC_TRANSITIONING_ATTRIBUTES","STATIC_DEFAULT_ACTIVE_ATTRIBUTES","EMPTY_OBJECT","className","filter","Boolean","join","Object","keys","STATIC_ACTIVE_ATTRIBUTES","STATIC_ACTIVE_PROPS","role","callHandler","Event","event","TEvent","T","handler","EventHandlerUnion","getHandler","fallback","ActiveLinkOptions","ActiveLinkOptionProps","TComp","ActiveLinkProps","Partial","LinkComponentSolidProps","key","LinkProps","LinkPropsChildren","children","state","ValidComponent","CreateLinkProps","LinkComponentProps","LinkComponent","TDefaultFrom","props","LinkComponentRoute","defaultFrom","createLink","Comp","_$createComponent","Link","_$mergeProps","_asChild","linkProps","ch","svgLinkProps","_el$","_tmpl$","_el$2","firstChild","_$spread","_$insert","_el$3","_tmpl$2","component","metaKey","altKey","ctrlKey","shiftKey","zero","charCodeAt","LinkOptionsFnOptions","TOptions","ReadonlyArray","LinkOptionsFn","linkOptions"],"sources":["../../src/link.tsx"],"sourcesContent":["import * as Solid from 'solid-js'\n\nimport { mergeRefs } from '@solid-primitives/refs'\n\nimport {\n deepEqual,\n exactPathTest,\n functionalUpdate,\n isDangerousProtocol,\n preloadWarning,\n removeTrailingSlash,\n} from '@tanstack/router-core'\n\nimport { isServer } from '@tanstack/router-core/isServer'\nimport { Dynamic } from 'solid-js/web'\nimport { useRouter } from './useRouter'\n\nimport { useIntersectionObserver } from './utils'\n\nimport { useHydrated } from './ClientOnly'\nimport type {\n AnyRouter,\n Constrain,\n LinkOptions,\n RegisteredRouter,\n RoutePaths,\n} from '@tanstack/router-core'\nimport type {\n ValidateLinkOptions,\n ValidateLinkOptionsArray,\n} from './typePrimitives'\n\nconst timeoutMap = new WeakMap<EventTarget, ReturnType<typeof setTimeout>>()\n\nexport function useLinkProps<\n TRouter extends AnyRouter = RegisteredRouter,\n TFrom extends RoutePaths<TRouter['routeTree']> | string = string,\n TTo extends string = '',\n TMaskFrom extends RoutePaths<TRouter['routeTree']> | string = TFrom,\n TMaskTo extends string = '',\n>(\n options: UseLinkPropsOptions<TRouter, TFrom, TTo, TMaskFrom, TMaskTo>,\n): Solid.ComponentProps<'a'> {\n const router = useRouter()\n const [isTransitioning, setIsTransitioning] = Solid.createSignal(false)\n const shouldHydrateHash = !isServer && !!router.options.ssr\n const hasHydrated = useHydrated()\n\n let hasRenderFetched = false\n\n const [local, rest] = Solid.splitProps(\n Solid.mergeProps(\n {\n activeProps: STATIC_ACTIVE_PROPS_GET,\n inactiveProps: STATIC_INACTIVE_PROPS_GET,\n },\n options,\n ),\n [\n 'activeProps',\n 'inactiveProps',\n 'activeOptions',\n 'to',\n 'preload',\n 'preloadDelay',\n 'preloadIntentProximity',\n 'hashScrollIntoView',\n 'replace',\n 'startTransition',\n 'resetScroll',\n 'viewTransition',\n 'target',\n 'disabled',\n 'style',\n 'class',\n 'onClick',\n 'onBlur',\n 'onFocus',\n 'onMouseEnter',\n 'onMouseLeave',\n 'onMouseOver',\n 'onMouseOut',\n 'onTouchStart',\n 'ignoreBlocker',\n ],\n )\n\n // const {\n // // custom props\n // activeProps = () => ({ class: 'active' }),\n // inactiveProps = () => ({}),\n // activeOptions,\n // to,\n // preload: userPreload,\n // preloadDelay: userPreloadDelay,\n // hashScrollIntoView,\n // replace,\n // startTransition,\n // resetScroll,\n // viewTransition,\n // // element props\n // children,\n // target,\n // disabled,\n // style,\n // class,\n // onClick,\n // onFocus,\n // onMouseEnter,\n // onMouseLeave,\n // onTouchStart,\n // ignoreBlocker,\n // ...rest\n // } = options\n\n const [_, propsSafeToSpread] = Solid.splitProps(rest, [\n 'params',\n 'search',\n 'hash',\n 'state',\n 'mask',\n 'reloadDocument',\n 'unsafeRelative',\n 'from',\n ])\n\n const currentLocation = Solid.createMemo(\n () => router.stores.location.get(),\n undefined,\n { equals: (prev, next) => prev.href === next.href },\n )\n\n const _options = () => options\n\n const next = Solid.createMemo(() => {\n // Rebuild when inherited search/hash or the current route context changes.\n const _fromLocation = currentLocation()\n const options = { _fromLocation, ..._options() } as any\n // untrack because router-core will also access stores, which are signals in solid\n return Solid.untrack(() => router.buildLocation(options))\n })\n\n const hrefOption = Solid.createMemo(() => {\n if (_options().disabled) return undefined\n // Use publicHref - it contains the correct href for display\n // When a rewrite changes the origin, publicHref is the full URL\n // Otherwise it's the origin-stripped path\n // This avoids constructing URL objects in the hot path\n const location = next().maskedLocation ?? next()\n const publicHref = location.publicHref\n const external = location.external\n\n if (external) {\n return { href: publicHref, external: true }\n }\n\n return {\n href: router.history.createHref(publicHref) || '/',\n external: false,\n }\n })\n\n const externalLink = Solid.createMemo(() => {\n const _href = hrefOption()\n if (_href?.external) {\n // Block dangerous protocols for external links\n if (isDangerousProtocol(_href.href, router.protocolAllowlist)) {\n if (process.env.NODE_ENV !== 'production') {\n console.warn(`Blocked Link with dangerous protocol: ${_href.href}`)\n }\n return undefined\n }\n return _href.href\n }\n const to = _options().to\n const safeInternal = isSafeInternal(to)\n if (safeInternal) return undefined\n if (typeof to !== 'string' || to.indexOf(':') === -1) return undefined\n try {\n new URL(to as any)\n // Block dangerous protocols like javascript:, blob:, data:\n if (isDangerousProtocol(to, router.protocolAllowlist)) {\n if (process.env.NODE_ENV !== 'production') {\n console.warn(`Blocked Link with dangerous protocol: ${to}`)\n }\n return undefined\n }\n return to\n } catch {}\n return undefined\n })\n\n const preload = Solid.createMemo(() => {\n if (_options().reloadDocument || externalLink()) {\n return false\n }\n return local.preload ?? router.options.defaultPreload\n })\n const preloadDelay = () =>\n local.preloadDelay ?? router.options.defaultPreloadDelay ?? 0\n\n const isActive = Solid.createMemo(() => {\n if (externalLink()) return false\n const activeOptions = local.activeOptions\n const current = currentLocation()\n const nextLocation = next()\n\n if (activeOptions?.exact) {\n const testExact = exactPathTest(\n current.pathname,\n nextLocation.pathname,\n router.basepath,\n )\n if (!testExact) {\n return false\n }\n } else {\n const currentPath = removeTrailingSlash(current.pathname, router.basepath)\n const nextPath = removeTrailingSlash(\n nextLocation.pathname,\n router.basepath,\n )\n\n const pathIsFuzzyEqual =\n currentPath.startsWith(nextPath) &&\n (currentPath.length === nextPath.length ||\n currentPath[nextPath.length] === '/')\n if (!pathIsFuzzyEqual) {\n return false\n }\n }\n\n if (activeOptions?.includeSearch ?? true) {\n const searchTest = deepEqual(current.search, nextLocation.search, {\n partial: !activeOptions?.exact,\n ignoreUndefined: !activeOptions?.explicitUndefined,\n })\n if (!searchTest) {\n return false\n }\n }\n\n if (activeOptions?.includeHash) {\n const currentHash =\n shouldHydrateHash && !hasHydrated() ? '' : current.hash\n return currentHash === nextLocation.hash\n }\n return true\n })\n\n const doPreload = () =>\n router\n .preloadRoute({ ..._options(), _builtLocation: next() } as any)\n .catch((err: any) => {\n console.warn(err)\n console.warn(preloadWarning)\n })\n\n const preloadViewportIoCallback = (\n entry: IntersectionObserverEntry | undefined,\n ) => {\n if (entry?.isIntersecting) {\n doPreload()\n }\n }\n\n const [ref, setRef] = Solid.createSignal<Element | null>(null)\n\n useIntersectionObserver(\n ref,\n preloadViewportIoCallback,\n { rootMargin: '100px' },\n { disabled: !!local.disabled || !(preload() === 'viewport') },\n )\n\n Solid.createEffect(() => {\n if (hasRenderFetched) {\n return\n }\n if (!local.disabled && preload() === 'render') {\n doPreload()\n hasRenderFetched = true\n }\n })\n\n if (externalLink()) {\n return Solid.mergeProps(\n propsSafeToSpread,\n {\n ref: mergeRefs(setRef, _options().ref),\n href: externalLink(),\n },\n Solid.splitProps(local, [\n 'target',\n 'disabled',\n 'style',\n 'class',\n 'onClick',\n 'onBlur',\n 'onFocus',\n 'onMouseEnter',\n 'onMouseLeave',\n 'onMouseOut',\n 'onMouseOver',\n 'onTouchStart',\n ])[0],\n ) as any\n }\n\n // The click handler\n const handleClick = (e: MouseEvent) => {\n // Check actual element's target attribute as fallback\n const elementTarget = (\n e.currentTarget as HTMLAnchorElement | SVGAElement\n ).getAttribute('target')\n const effectiveTarget =\n local.target !== undefined ? local.target : elementTarget\n\n if (\n !local.disabled &&\n !isCtrlEvent(e) &&\n !e.defaultPrevented &&\n (!effectiveTarget || effectiveTarget === '_self') &&\n e.button === 0\n ) {\n e.preventDefault()\n\n setIsTransitioning(true)\n\n const unsub = router.subscribe('onResolved', () => {\n unsub()\n setIsTransitioning(false)\n })\n\n // All is well? Navigate!\n // N.B. we don't call `router.commitLocation(next) here because we want to run `validateSearch` before committing\n router.navigate({\n ..._options(),\n replace: local.replace,\n resetScroll: local.resetScroll,\n hashScrollIntoView: local.hashScrollIntoView,\n startTransition: local.startTransition,\n viewTransition: local.viewTransition,\n ignoreBlocker: local.ignoreBlocker,\n })\n }\n }\n\n const enqueueIntentPreload = (e: MouseEvent | FocusEvent) => {\n if (local.disabled || preload() !== 'intent') return\n\n if (!preloadDelay()) {\n doPreload()\n return\n }\n\n const eventTarget = e.currentTarget || e.target\n\n if (!eventTarget || timeoutMap.has(eventTarget)) return\n\n timeoutMap.set(\n eventTarget,\n setTimeout(() => {\n timeoutMap.delete(eventTarget)\n doPreload()\n }, preloadDelay()),\n )\n }\n\n const handleTouchStart = (_: TouchEvent) => {\n if (local.disabled || preload() !== 'intent') return\n doPreload()\n }\n\n const handleLeave = (e: MouseEvent | FocusEvent) => {\n if (local.disabled) return\n const eventTarget = e.currentTarget || e.target\n\n if (eventTarget) {\n const id = timeoutMap.get(eventTarget)\n clearTimeout(id)\n timeoutMap.delete(eventTarget)\n }\n }\n\n const simpleStyling = Solid.createMemo(\n () =>\n local.activeProps === STATIC_ACTIVE_PROPS_GET &&\n local.inactiveProps === STATIC_INACTIVE_PROPS_GET &&\n local.class === undefined &&\n local.style === undefined,\n )\n\n const onClick = createComposedHandler(() => local.onClick, handleClick)\n const onBlur = createComposedHandler(() => local.onBlur, handleLeave)\n const onFocus = createComposedHandler(\n () => local.onFocus,\n enqueueIntentPreload,\n )\n const onMouseEnter = createComposedHandler(\n () => local.onMouseEnter,\n enqueueIntentPreload,\n )\n const onMouseOver = createComposedHandler(\n () => local.onMouseOver,\n enqueueIntentPreload,\n )\n const onMouseLeave = createComposedHandler(\n () => local.onMouseLeave,\n handleLeave,\n )\n const onMouseOut = createComposedHandler(() => local.onMouseOut, handleLeave)\n const onTouchStart = createComposedHandler(\n () => local.onTouchStart,\n handleTouchStart,\n )\n\n type ResolvedLinkStateProps = Omit<Solid.ComponentProps<'a'>, 'style'> & {\n style?: Solid.JSX.CSSProperties\n }\n\n const resolvedProps = Solid.createMemo(() => {\n const active = isActive()\n\n const base = {\n href: hrefOption()?.href,\n ref: mergeRefs(setRef, _options().ref),\n onClick,\n onBlur,\n onFocus,\n onMouseEnter,\n onMouseOver,\n onMouseLeave,\n onMouseOut,\n onTouchStart,\n disabled: !!local.disabled,\n target: local.target,\n ...(local.disabled && STATIC_DISABLED_PROPS),\n ...(isTransitioning() && STATIC_TRANSITIONING_ATTRIBUTES),\n }\n\n if (simpleStyling()) {\n return {\n ...base,\n ...(active && STATIC_DEFAULT_ACTIVE_ATTRIBUTES),\n }\n }\n\n const activeProps: ResolvedLinkStateProps = active\n ? (functionalUpdate(local.activeProps as any, {}) ?? EMPTY_OBJECT)\n : EMPTY_OBJECT\n const inactiveProps: ResolvedLinkStateProps = active\n ? EMPTY_OBJECT\n : functionalUpdate(local.inactiveProps, {})\n const style = {\n ...local.style,\n ...activeProps.style,\n ...inactiveProps.style,\n }\n const className = [local.class, activeProps.class, inactiveProps.class]\n .filter(Boolean)\n .join(' ')\n\n return {\n ...activeProps,\n ...inactiveProps,\n ...base,\n ...(Object.keys(style).length ? { style } : undefined),\n ...(className ? { class: className } : undefined),\n ...(active && STATIC_ACTIVE_ATTRIBUTES),\n } as ResolvedLinkStateProps\n })\n\n return Solid.mergeProps(propsSafeToSpread, resolvedProps) as any\n}\n\nconst STATIC_ACTIVE_PROPS = { class: 'active' }\nconst STATIC_ACTIVE_PROPS_GET = () => STATIC_ACTIVE_PROPS\nconst EMPTY_OBJECT = {}\nconst STATIC_INACTIVE_PROPS_GET = () => EMPTY_OBJECT\nconst STATIC_DEFAULT_ACTIVE_ATTRIBUTES = {\n class: 'active',\n 'data-status': 'active',\n 'aria-current': 'page',\n}\nconst STATIC_DISABLED_PROPS = {\n role: 'link',\n 'aria-disabled': true,\n}\nconst STATIC_ACTIVE_ATTRIBUTES = {\n 'data-status': 'active',\n 'aria-current': 'page',\n}\nconst STATIC_TRANSITIONING_ATTRIBUTES = {\n 'data-transitioning': 'transitioning',\n}\n\n/** Call a JSX.EventHandlerUnion with the event. */\nfunction callHandler<T, TEvent extends Event>(\n event: TEvent & { currentTarget: T; target: Element },\n handler: Solid.JSX.EventHandlerUnion<T, TEvent>,\n) {\n if (typeof handler === 'function') {\n handler(event)\n } else {\n handler[0](handler[1], event)\n }\n return event.defaultPrevented\n}\n\nfunction createComposedHandler<T, TEvent extends Event>(\n getHandler: () => Solid.JSX.EventHandlerUnion<T, TEvent> | undefined,\n fallback: (event: TEvent) => void,\n) {\n return (event: TEvent & { currentTarget: T; target: Element }) => {\n const handler = getHandler()\n if (!handler || !callHandler(event, handler)) fallback(event)\n }\n}\n\nexport type UseLinkPropsOptions<\n TRouter extends AnyRouter = RegisteredRouter,\n TFrom extends RoutePaths<TRouter['routeTree']> | string = string,\n TTo extends string | undefined = '.',\n TMaskFrom extends RoutePaths<TRouter['routeTree']> | string = TFrom,\n TMaskTo extends string = '.',\n> = ActiveLinkOptions<'a', TRouter, TFrom, TTo, TMaskFrom, TMaskTo> &\n Omit<Solid.ComponentProps<'a'>, 'style'> & { style?: Solid.JSX.CSSProperties }\n\nexport type ActiveLinkOptions<\n TComp = 'a',\n TRouter extends AnyRouter = RegisteredRouter,\n TFrom extends string = string,\n TTo extends string | undefined = '.',\n TMaskFrom extends string = TFrom,\n TMaskTo extends string = '.',\n> = LinkOptions<TRouter, TFrom, TTo, TMaskFrom, TMaskTo> &\n ActiveLinkOptionProps<TComp>\n\ntype ActiveLinkProps<TComp> = Partial<\n LinkComponentSolidProps<TComp> & {\n [key: `data-${string}`]: unknown\n }\n>\n\nexport interface ActiveLinkOptionProps<TComp = 'a'> {\n /**\n * A function that returns additional props for the `active` state of this link.\n * These props override other props passed to the link (`style`'s are merged, `class`'s are concatenated)\n */\n activeProps?: ActiveLinkProps<TComp> | (() => ActiveLinkProps<TComp>)\n /**\n * A function that returns additional props for the `inactive` state of this link.\n * These props override other props passed to the link (`style`'s are merged, `class`'s are concatenated)\n */\n inactiveProps?: ActiveLinkProps<TComp> | (() => ActiveLinkProps<TComp>)\n}\n\nexport type LinkProps<\n TComp = 'a',\n TRouter extends AnyRouter = RegisteredRouter,\n TFrom extends string = string,\n TTo extends string | undefined = '.',\n TMaskFrom extends string = TFrom,\n TMaskTo extends string = '.',\n> = ActiveLinkOptions<TComp, TRouter, TFrom, TTo, TMaskFrom, TMaskTo> &\n LinkPropsChildren\n\nexport interface LinkPropsChildren {\n // If a function is passed as a child, it will be given the `isActive` boolean to aid in further styling on the element it returns\n children?:\n | Solid.JSX.Element\n | ((state: {\n isActive: boolean\n isTransitioning: boolean\n }) => Solid.JSX.Element)\n}\n\ntype LinkComponentSolidProps<TComp> = TComp extends Solid.ValidComponent\n ? Omit<Solid.ComponentProps<TComp>, keyof CreateLinkProps>\n : never\n\nexport type LinkComponentProps<\n TComp = 'a',\n TRouter extends AnyRouter = RegisteredRouter,\n TFrom extends string = string,\n TTo extends string | undefined = '.',\n TMaskFrom extends string = TFrom,\n TMaskTo extends string = '.',\n> = LinkComponentSolidProps<TComp> &\n LinkProps<TComp, TRouter, TFrom, TTo, TMaskFrom, TMaskTo>\n\nexport type CreateLinkProps = LinkProps<\n any,\n any,\n string,\n string,\n string,\n string\n>\n\nexport type LinkComponent<\n in out TComp,\n in out TDefaultFrom extends string = string,\n> = <\n TRouter extends AnyRouter = RegisteredRouter,\n const TFrom extends string = TDefaultFrom,\n const TTo extends string | undefined = undefined,\n const TMaskFrom extends string = TFrom,\n const TMaskTo extends string = '',\n>(\n props: LinkComponentProps<TComp, TRouter, TFrom, TTo, TMaskFrom, TMaskTo>,\n) => Solid.JSX.Element\n\nexport interface LinkComponentRoute<\n in out TDefaultFrom extends string = string,\n> {\n defaultFrom: TDefaultFrom;\n <\n TRouter extends AnyRouter = RegisteredRouter,\n const TTo extends string | undefined = undefined,\n const TMaskTo extends string = '',\n >(\n props: LinkComponentProps<\n 'a',\n TRouter,\n this['defaultFrom'],\n TTo,\n this['defaultFrom'],\n TMaskTo\n >,\n ): Solid.JSX.Element\n}\n\nexport function createLink<const TComp>(\n Comp: Constrain<TComp, any, (props: CreateLinkProps) => Solid.JSX.Element>,\n): LinkComponent<TComp> {\n return (props) => <Link {...props} _asChild={Comp} />\n}\n\nexport const Link: LinkComponent<'a'> = (props) => {\n const [local, rest] = Solid.splitProps(\n props as typeof props & { _asChild: any },\n ['_asChild', 'children'],\n )\n\n const [_, linkProps] = Solid.splitProps(\n useLinkProps(rest as unknown as any),\n ['type'],\n )\n\n const children = Solid.createMemo(() => {\n const ch = local.children\n if (typeof ch === 'function') {\n return ch({\n get isActive() {\n return (linkProps as any)['data-status'] === 'active'\n },\n get isTransitioning() {\n return (linkProps as any)['data-transitioning'] === 'transitioning'\n },\n })\n }\n\n return ch satisfies Solid.JSX.Element\n })\n\n if (local._asChild === 'svg') {\n const [_, svgLinkProps] = Solid.splitProps(linkProps, ['class'])\n return (\n <svg>\n <a {...svgLinkProps}>{children()}</a>\n </svg>\n )\n }\n\n if (!local._asChild) {\n return <a {...linkProps}>{children()}</a>\n }\n\n return (\n <Dynamic component={local._asChild as Solid.ValidComponent} {...linkProps}>\n {children()}\n </Dynamic>\n )\n}\n\nfunction isCtrlEvent(e: MouseEvent) {\n return !!(e.metaKey || e.altKey || e.ctrlKey || e.shiftKey)\n}\n\nfunction isSafeInternal(to: unknown) {\n if (typeof to !== 'string') return false\n const zero = to.charCodeAt(0)\n if (zero === 47) return to.charCodeAt(1) !== 47 // '/' but not '//'\n return zero === 46 // '.', '..', './', '../'\n}\n\nexport type LinkOptionsFnOptions<\n TOptions,\n TComp,\n TRouter extends AnyRouter = RegisteredRouter,\n> =\n TOptions extends ReadonlyArray<any>\n ? ValidateLinkOptionsArray<TRouter, TOptions, string, TComp>\n : ValidateLinkOptions<TRouter, TOptions, string, TComp>\n\nexport type LinkOptionsFn<TComp> = <\n const TOptions,\n TRouter extends AnyRouter = RegisteredRouter,\n>(\n options: LinkOptionsFnOptions<TOptions, TComp, TRouter>,\n) => TOptions\n\nexport const linkOptions: LinkOptionsFn<'a'> = (options) => {\n return options as any\n}\n"],"mappings":"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"}
|
package/dist/esm/not-found.js
CHANGED
|
@@ -11,8 +11,8 @@ function getNotFound(error) {
|
|
|
11
11
|
}
|
|
12
12
|
function CatchNotFound(props) {
|
|
13
13
|
const router = useRouter();
|
|
14
|
-
const pathname = Solid.createMemo(() => router.stores.location.
|
|
15
|
-
const status = Solid.createMemo(() => router.stores.status.
|
|
14
|
+
const pathname = Solid.createMemo(() => router.stores.location.get().pathname);
|
|
15
|
+
const status = Solid.createMemo(() => router.stores.status.get());
|
|
16
16
|
return createComponent(CatchBoundary, {
|
|
17
17
|
getResetKey: () => `not-found-${pathname()}-${status()}`,
|
|
18
18
|
onCatch: (error) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"not-found.js","names":["isNotFound","Solid","CatchBoundary","useRouter","NotFoundError","getNotFound","error","cause","undefined","CatchNotFound","props","fallback","JSX","Element","onCatch","children","router","pathname","createMemo","stores","location","
|
|
1
|
+
{"version":3,"file":"not-found.js","names":["isNotFound","Solid","CatchBoundary","useRouter","NotFoundError","getNotFound","error","cause","undefined","CatchNotFound","props","fallback","JSX","Element","onCatch","children","router","pathname","createMemo","stores","location","get","status","_$createComponent","getResetKey","notFoundError","errorComponent","DefaultGlobalNotFound","_tmpl$"],"sources":["../../src/not-found.tsx"],"sourcesContent":["import { isNotFound } from '@tanstack/router-core'\nimport * as Solid from 'solid-js'\nimport { CatchBoundary } from './CatchBoundary'\nimport { useRouter } from './useRouter'\nimport type { NotFoundError } from '@tanstack/router-core'\n\n// Solid wraps non-Error throws in an Error and stores the original thrown value\n// on `cause`, so component-thrown `notFound()` needs one extra unwrapping step.\nexport function getNotFound(\n error: unknown,\n): (NotFoundError & { isNotFound: true }) | undefined {\n if (isNotFound(error)) {\n return error as NotFoundError & { isNotFound: true }\n }\n\n if (isNotFound((error as any)?.cause)) {\n return (error as any).cause as NotFoundError & { isNotFound: true }\n }\n\n return undefined\n}\n\nexport function CatchNotFound(props: {\n fallback?: (error: NotFoundError) => Solid.JSX.Element\n onCatch?: (error: NotFoundError) => void\n children: Solid.JSX.Element\n}) {\n const router = useRouter()\n // TODO: Some way for the user to programmatically reset the not-found boundary?\n const pathname = Solid.createMemo(() => router.stores.location.get().pathname)\n const status = Solid.createMemo(() => router.stores.status.get())\n\n return (\n <CatchBoundary\n getResetKey={() => `not-found-${pathname()}-${status()}`}\n onCatch={(error) => {\n const notFoundError = getNotFound(error)\n\n if (notFoundError) {\n props.onCatch?.(notFoundError)\n } else {\n throw error\n }\n }}\n errorComponent={({ error }) => {\n const notFoundError = getNotFound(error)\n\n if (notFoundError) {\n return props.fallback?.(notFoundError)\n } else {\n throw error\n }\n }}\n >\n {props.children}\n </CatchBoundary>\n )\n}\n\nexport function DefaultGlobalNotFound() {\n return <p>Not Found</p>\n}\n"],"mappings":";;;;;;;AAQA,SAAgBK,YACdC,OACoD;AACpD,KAAIN,WAAWM,MAAM,CACnB,QAAOA;AAGT,KAAIN,WAAYM,OAAeC,MAAM,CACnC,QAAQD,MAAcC;;AAM1B,SAAgBE,cAAcC,OAI3B;CACD,MAAMM,SAASb,WAAW;CAE1B,MAAMc,WAAWhB,MAAMiB,iBAAiBF,OAAOG,OAAOC,SAASC,KAAK,CAACJ,SAAS;CAC9E,MAAMK,SAASrB,MAAMiB,iBAAiBF,OAAOG,OAAOG,OAAOD,KAAK,CAAC;AAEjE,QAAAE,gBACGrB,eAAa;EACZsB,mBAAmB,aAAaP,UAAU,CAAA,GAAIK,QAAQ;EACtDR,UAAUR,UAAU;GAClB,MAAMmB,gBAAgBpB,YAAYC,MAAM;AAExC,OAAImB,cACFf,OAAMI,UAAUW,cAAc;OAE9B,OAAMnB;;EAGVoB,iBAAiB,EAAEpB,YAAY;GAC7B,MAAMmB,gBAAgBpB,YAAYC,MAAM;AAExC,OAAImB,cACF,QAAOf,MAAMC,WAAWc,cAAc;OAEtC,OAAMnB;;EAET,IAAAS,WAAA;AAAA,UAEAL,MAAMK;;EAAQ,CAAA;;AAKrB,SAAgBY,wBAAwB;AACtC,QAAAC,QAAA"}
|
package/dist/esm/routerStores.js
CHANGED
|
@@ -4,7 +4,7 @@ import { isServer } from "@tanstack/router-core/isServer";
|
|
|
4
4
|
//#region src/routerStores.ts
|
|
5
5
|
function initRouterStores(stores, createReadonlyStore) {
|
|
6
6
|
stores.childMatchIdByRouteId = createReadonlyStore(() => {
|
|
7
|
-
const ids = stores.matchesId.
|
|
7
|
+
const ids = stores.matchesId.get();
|
|
8
8
|
const obj = {};
|
|
9
9
|
for (let i = 0; i < ids.length - 1; i++) {
|
|
10
10
|
const parentStore = stores.activeMatchStoresById.get(ids[i]);
|
|
@@ -13,7 +13,7 @@ function initRouterStores(stores, createReadonlyStore) {
|
|
|
13
13
|
return obj;
|
|
14
14
|
});
|
|
15
15
|
stores.pendingRouteIds = createReadonlyStore(() => {
|
|
16
|
-
const ids = stores.pendingMatchesId.
|
|
16
|
+
const ids = stores.pendingMatchesId.get();
|
|
17
17
|
const obj = {};
|
|
18
18
|
for (const id of ids) {
|
|
19
19
|
const store = stores.pendingMatchStoresById.get(id);
|
|
@@ -25,23 +25,18 @@ function initRouterStores(stores, createReadonlyStore) {
|
|
|
25
25
|
function createSolidMutableStore(initialValue) {
|
|
26
26
|
const [signal, setSignal] = Solid.createSignal(initialValue);
|
|
27
27
|
return {
|
|
28
|
-
get
|
|
29
|
-
|
|
30
|
-
},
|
|
31
|
-
setState: setSignal
|
|
28
|
+
get: signal,
|
|
29
|
+
set: setSignal
|
|
32
30
|
};
|
|
33
31
|
}
|
|
34
32
|
var finalizationRegistry = null;
|
|
35
33
|
if (typeof globalThis !== "undefined" && "FinalizationRegistry" in globalThis) finalizationRegistry = new FinalizationRegistry((cb) => cb());
|
|
36
34
|
function createSolidReadonlyStore(read) {
|
|
37
35
|
let dispose;
|
|
38
|
-
const
|
|
36
|
+
const store = { get: Solid.createRoot((d) => {
|
|
39
37
|
dispose = d;
|
|
40
38
|
return Solid.createMemo(read);
|
|
41
|
-
});
|
|
42
|
-
const store = { get state() {
|
|
43
|
-
return memo();
|
|
44
|
-
} };
|
|
39
|
+
}) };
|
|
45
40
|
finalizationRegistry?.register(store, dispose);
|
|
46
41
|
return store;
|
|
47
42
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"routerStores.js","names":[],"sources":["../../src/routerStores.ts"],"sourcesContent":["import * as Solid from 'solid-js'\nimport {\n createNonReactiveMutableStore,\n createNonReactiveReadonlyStore,\n} from '@tanstack/router-core'\nimport { isServer } from '@tanstack/router-core/isServer'\nimport type {\n AnyRoute,\n GetStoreConfig,\n RouterReadableStore,\n RouterStores,\n RouterWritableStore,\n} from '@tanstack/router-core'\n\ndeclare module '@tanstack/router-core' {\n export interface RouterStores<in out TRouteTree extends AnyRoute> {\n /** Maps each active routeId to the matchId of its child in the match tree. */\n childMatchIdByRouteId: RouterReadableStore<Record<string, string>>\n /** Maps each pending routeId to true for quick lookup. */\n pendingRouteIds: RouterReadableStore<Record<string, boolean>>\n }\n}\n\nfunction initRouterStores(\n stores: RouterStores<AnyRoute>,\n createReadonlyStore: <TValue>(\n read: () => TValue,\n ) => RouterReadableStore<TValue>,\n) {\n stores.childMatchIdByRouteId = createReadonlyStore(() => {\n const ids = stores.matchesId.
|
|
1
|
+
{"version":3,"file":"routerStores.js","names":[],"sources":["../../src/routerStores.ts"],"sourcesContent":["import * as Solid from 'solid-js'\nimport {\n createNonReactiveMutableStore,\n createNonReactiveReadonlyStore,\n} from '@tanstack/router-core'\nimport { isServer } from '@tanstack/router-core/isServer'\nimport type {\n AnyRoute,\n GetStoreConfig,\n RouterReadableStore,\n RouterStores,\n RouterWritableStore,\n} from '@tanstack/router-core'\n\ndeclare module '@tanstack/router-core' {\n export interface RouterStores<in out TRouteTree extends AnyRoute> {\n /** Maps each active routeId to the matchId of its child in the match tree. */\n childMatchIdByRouteId: RouterReadableStore<Record<string, string>>\n /** Maps each pending routeId to true for quick lookup. */\n pendingRouteIds: RouterReadableStore<Record<string, boolean>>\n }\n}\n\nfunction initRouterStores(\n stores: RouterStores<AnyRoute>,\n createReadonlyStore: <TValue>(\n read: () => TValue,\n ) => RouterReadableStore<TValue>,\n) {\n stores.childMatchIdByRouteId = createReadonlyStore(() => {\n const ids = stores.matchesId.get()\n const obj: Record<string, string> = {}\n for (let i = 0; i < ids.length - 1; i++) {\n const parentStore = stores.activeMatchStoresById.get(ids[i]!)\n if (parentStore?.routeId) {\n obj[parentStore.routeId] = ids[i + 1]!\n }\n }\n return obj\n })\n\n stores.pendingRouteIds = createReadonlyStore(() => {\n const ids = stores.pendingMatchesId.get()\n const obj: Record<string, boolean> = {}\n for (const id of ids) {\n const store = stores.pendingMatchStoresById.get(id)\n if (store?.routeId) {\n obj[store.routeId] = true\n }\n }\n return obj\n })\n}\n\nfunction createSolidMutableStore<TValue>(\n initialValue: TValue,\n): RouterWritableStore<TValue> {\n const [signal, setSignal] = Solid.createSignal(initialValue)\n\n return { get: signal, set: setSignal }\n}\n\nlet finalizationRegistry: FinalizationRegistry<() => void> | null = null\nif (typeof globalThis !== 'undefined' && 'FinalizationRegistry' in globalThis) {\n finalizationRegistry = new FinalizationRegistry((cb) => cb())\n}\n\nfunction createSolidReadonlyStore<TValue>(\n read: () => TValue,\n): RouterReadableStore<TValue> {\n let dispose!: () => void\n const memo = Solid.createRoot((d) => {\n dispose = d\n return Solid.createMemo(read)\n })\n const store = { get: memo }\n finalizationRegistry?.register(store, dispose)\n return store\n}\n\nexport const getStoreFactory: GetStoreConfig = (opts) => {\n if (isServer ?? opts.isServer) {\n return {\n createMutableStore: createNonReactiveMutableStore,\n createReadonlyStore: createNonReactiveReadonlyStore,\n batch: (fn) => fn(),\n init: (stores) =>\n initRouterStores(stores, createNonReactiveReadonlyStore),\n }\n }\n\n return {\n createMutableStore: createSolidMutableStore,\n createReadonlyStore: createSolidReadonlyStore,\n batch: Solid.batch,\n init: (stores) => initRouterStores(stores, createSolidReadonlyStore),\n }\n}\n"],"mappings":";;;;AAuBA,SAAS,iBACP,QACA,qBAGA;AACA,QAAO,wBAAwB,0BAA0B;EACvD,MAAM,MAAM,OAAO,UAAU,KAAK;EAClC,MAAM,MAA8B,EAAE;AACtC,OAAK,IAAI,IAAI,GAAG,IAAI,IAAI,SAAS,GAAG,KAAK;GACvC,MAAM,cAAc,OAAO,sBAAsB,IAAI,IAAI,GAAI;AAC7D,OAAI,aAAa,QACf,KAAI,YAAY,WAAW,IAAI,IAAI;;AAGvC,SAAO;GACP;AAEF,QAAO,kBAAkB,0BAA0B;EACjD,MAAM,MAAM,OAAO,iBAAiB,KAAK;EACzC,MAAM,MAA+B,EAAE;AACvC,OAAK,MAAM,MAAM,KAAK;GACpB,MAAM,QAAQ,OAAO,uBAAuB,IAAI,GAAG;AACnD,OAAI,OAAO,QACT,KAAI,MAAM,WAAW;;AAGzB,SAAO;GACP;;AAGJ,SAAS,wBACP,cAC6B;CAC7B,MAAM,CAAC,QAAQ,aAAa,MAAM,aAAa,aAAa;AAE5D,QAAO;EAAE,KAAK;EAAQ,KAAK;EAAW;;AAGxC,IAAI,uBAAgE;AACpE,IAAI,OAAO,eAAe,eAAe,0BAA0B,WACjE,wBAAuB,IAAI,sBAAsB,OAAO,IAAI,CAAC;AAG/D,SAAS,yBACP,MAC6B;CAC7B,IAAI;CAKJ,MAAM,QAAQ,EAAE,KAJH,MAAM,YAAY,MAAM;AACnC,YAAU;AACV,SAAO,MAAM,WAAW,KAAK;GAC7B,EACyB;AAC3B,uBAAsB,SAAS,OAAO,QAAQ;AAC9C,QAAO;;AAGT,IAAa,mBAAmC,SAAS;AACvD,KAAI,YAAY,KAAK,SACnB,QAAO;EACL,oBAAoB;EACpB,qBAAqB;EACrB,QAAQ,OAAO,IAAI;EACnB,OAAO,WACL,iBAAiB,QAAQ,+BAA+B;EAC3D;AAGH,QAAO;EACL,oBAAoB;EACpB,qBAAqB;EACrB,OAAO,MAAM;EACb,OAAO,WAAW,iBAAiB,QAAQ,yBAAyB;EACrE"}
|
|
@@ -7,7 +7,7 @@ import { hydrate } from "@tanstack/router-core/ssr/client";
|
|
|
7
7
|
var hydrationPromise;
|
|
8
8
|
var Dummy = (props) => memo(() => props.children);
|
|
9
9
|
function RouterClient(props) {
|
|
10
|
-
if (!hydrationPromise) if (!props.router.stores.matchesId.
|
|
10
|
+
if (!hydrationPromise) if (!props.router.stores.matchesId.get().length) hydrationPromise = hydrate(props.router);
|
|
11
11
|
else hydrationPromise = Promise.resolve();
|
|
12
12
|
return createComponent(Await, {
|
|
13
13
|
promise: hydrationPromise,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RouterClient.js","names":["hydrate","Await","HeadContent","RouterProvider","AnyRouter","JSXElement","hydrationPromise","Promise","Array","Dummy","props","children","_$memo","RouterClient","router","stores","matchesId","
|
|
1
|
+
{"version":3,"file":"RouterClient.js","names":["hydrate","Await","HeadContent","RouterProvider","AnyRouter","JSXElement","hydrationPromise","Promise","Array","Dummy","props","children","_$memo","RouterClient","router","stores","matchesId","get","length","resolve","_$createComponent","promise","InnerWrap"],"sources":["../../../src/ssr/RouterClient.tsx"],"sourcesContent":["import { hydrate } from '@tanstack/router-core/ssr/client'\nimport { Await } from '../awaited'\nimport { HeadContent } from '../HeadContent'\nimport { RouterProvider } from '../RouterProvider'\nimport type { AnyRouter } from '@tanstack/router-core'\nimport type { JSXElement } from 'solid-js'\n\nlet hydrationPromise: Promise<void | Array<Array<void>>> | undefined\n\nconst Dummy = (props: { children?: JSXElement }) => <>{props.children}</>\n\nexport function RouterClient(props: { router: AnyRouter }) {\n if (!hydrationPromise) {\n if (!props.router.stores.matchesId.get().length) {\n hydrationPromise = hydrate(props.router)\n } else {\n hydrationPromise = Promise.resolve()\n }\n }\n return (\n <Await\n promise={hydrationPromise}\n children={() => (\n <Dummy>\n <Dummy>\n <RouterProvider\n router={props.router}\n InnerWrap={(props) => (\n <Dummy>\n <Dummy>\n <HeadContent />\n {props.children}\n </Dummy>\n <Dummy />\n </Dummy>\n )}\n />\n </Dummy>\n </Dummy>\n )}\n />\n )\n}\n"],"mappings":";;;;;;AAOA,IAAIM;AAEJ,IAAMG,SAASC,UAAgCE,WAAQF,MAAMC,SAAY;AAEzE,SAAgBE,aAAaH,OAA8B;AACzD,KAAI,CAACJ,iBACH,KAAI,CAACI,MAAMI,OAAOC,OAAOC,UAAUC,KAAK,CAACC,OACvCZ,oBAAmBN,QAAQU,MAAMI,OAAO;KAExCR,oBAAmBC,QAAQY,SAAS;AAGxC,QAAAC,gBACGnB,OAAK;EACJoB,SAASf;EACTK,gBAAUS,gBACPX,OAAK,EAAA,IAAAE,WAAA;AAAA,UAAAS,gBACHX,OAAK,EAAA,IAAAE,WAAA;AAAA,WAAAS,gBACHjB,gBAAc;KAAA,IACbW,SAAM;AAAA,aAAEJ,MAAMI;;KACdQ,YAAYZ,UAAKU,gBACdX,OAAK,EAAA,IAAAE,WAAA;AAAA,aAAA,CAAAS,gBACHX,OAAK,EAAA,IAAAE,WAAA;AAAA,cAAA,CAAAS,gBACHlB,aAAW,EAAA,CAAA,EAAAU,WACXF,MAAMC,SAAQ,CAAA;SAAA,CAAA,EAAAS,gBAEhBX,OAAK,EAAA,CAAA,CAAA;QAAA,CAAA;KAET,CAAA;MAAA,CAAA;KAAA,CAAA;EAIR,CAAA"}
|
|
@@ -18,7 +18,7 @@ var renderRouterToStream = async ({ request, router, responseHeaders, children }
|
|
|
18
18
|
stream.pipeTo(writable);
|
|
19
19
|
const responseStream = transformReadableStreamWithRouter(router, readable);
|
|
20
20
|
return new Response(responseStream, {
|
|
21
|
-
status: router.stores.statusCode.
|
|
21
|
+
status: router.stores.statusCode.get(),
|
|
22
22
|
headers: responseHeaders
|
|
23
23
|
});
|
|
24
24
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"renderRouterToStream.js","names":["Solid","isbot","transformReadableStreamWithRouter","makeSsrSerovalPlugin","JSXElement","ReadableStream","AnyRouter","renderRouterToStream","request","router","responseHeaders","children","Request","Headers","writable","readable","TransformStream","docType","ssr","serializationAdapters","options","serovalPlugins","map","adapter","plugin","didRun","stream","renderToStream","_$memo","nonce","plugins","headers","get","pipeTo","responseStream","Response","status","stores","statusCode"
|
|
1
|
+
{"version":3,"file":"renderRouterToStream.js","names":["Solid","isbot","transformReadableStreamWithRouter","makeSsrSerovalPlugin","JSXElement","ReadableStream","AnyRouter","renderRouterToStream","request","router","responseHeaders","children","Request","Headers","writable","readable","TransformStream","docType","ssr","serializationAdapters","options","serovalPlugins","map","adapter","plugin","didRun","stream","renderToStream","_$memo","nonce","plugins","headers","get","pipeTo","responseStream","Response","status","stores","statusCode"],"sources":["../../../src/ssr/renderRouterToStream.tsx"],"sourcesContent":["import * as Solid from 'solid-js/web'\nimport { isbot } from 'isbot'\nimport { transformReadableStreamWithRouter } from '@tanstack/router-core/ssr/server'\nimport { makeSsrSerovalPlugin } from '@tanstack/router-core'\nimport type { JSXElement } from 'solid-js'\nimport type { ReadableStream } from 'node:stream/web'\nimport type { AnyRouter } from '@tanstack/router-core'\n\nexport const renderRouterToStream = async ({\n request,\n router,\n responseHeaders,\n children,\n}: {\n request: Request\n router: AnyRouter\n responseHeaders: Headers\n children: () => JSXElement\n}) => {\n const { writable, readable } = new TransformStream()\n\n const docType = Solid.ssr('<!DOCTYPE html>')\n\n const serializationAdapters =\n (router.options as any)?.serializationAdapters ||\n (router.options.ssr as any)?.serializationAdapters\n const serovalPlugins = serializationAdapters?.map((adapter: any) => {\n const plugin = makeSsrSerovalPlugin(adapter, { didRun: false })\n return plugin\n })\n\n const stream = Solid.renderToStream(\n () => (\n <>\n {docType}\n {children()}\n </>\n ),\n {\n nonce: router.options.ssr?.nonce,\n plugins: serovalPlugins,\n } as any,\n )\n\n if (isbot(request.headers.get('User-Agent'))) {\n await stream\n }\n stream.pipeTo(writable)\n\n const responseStream = transformReadableStreamWithRouter(\n router,\n readable as unknown as ReadableStream,\n )\n return new Response(responseStream as any, {\n status: router.stores.statusCode.get(),\n headers: responseHeaders,\n })\n}\n"],"mappings":";;;;;;AAQA,IAAaO,uBAAuB,OAAO,EACzCC,SACAC,QACAC,iBACAC,eAMI;CACJ,MAAM,EAAEG,UAAUC,aAAa,IAAIC,iBAAiB;CAEpD,MAAMC,UAAUjB,MAAMkB,IAAI,kBAAkB;CAK5C,MAAMG,kBAFHZ,OAAOW,SAAiBD,yBACxBV,OAAOW,QAAQF,KAAaC,wBACeG,KAAKC,YAAiB;AAElE,SADepB,qBAAqBoB,SAAS,EAAEE,QAAQ,OAAO,CAAC;GAE/D;CAEF,MAAMC,SAAS1B,MAAM2B,qBACnB,CAEKV,SAAOW,KACPjB,SAAQ,CAEZ,EACD;EACEkB,OAAOpB,OAAOW,QAAQF,KAAKW;EAC3BC,SAAST;EACV,CACF;AAED,KAAIpB,MAAMO,QAAQuB,QAAQC,IAAI,aAAa,CAAC,CAC1C,OAAMN;AAERA,QAAOO,OAAOnB,SAAS;CAEvB,MAAMoB,iBAAiBhC,kCACrBO,QACAM,SACD;AACD,QAAO,IAAIoB,SAASD,gBAAuB;EACzCE,QAAQ3B,OAAO4B,OAAOC,WAAWN,KAAK;EACtCD,SAASrB;EACV,CAAC"}
|
|
@@ -14,7 +14,7 @@ var renderRouterToString = ({ router, responseHeaders, children }) => {
|
|
|
14
14
|
const injectedHtml = router.serverSsr.takeBufferedHtml();
|
|
15
15
|
if (injectedHtml) html = html.replace(`</body>`, () => `${injectedHtml}</body>`);
|
|
16
16
|
return new Response(`<!DOCTYPE html>${html}`, {
|
|
17
|
-
status: router.stores.statusCode.
|
|
17
|
+
status: router.stores.statusCode.get(),
|
|
18
18
|
headers: responseHeaders
|
|
19
19
|
});
|
|
20
20
|
} catch (error) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"renderRouterToString.js","names":["Solid","makeSsrSerovalPlugin","AnyRouter","JSXElement","renderRouterToString","router","responseHeaders","children","Headers","serializationAdapters","options","ssr","serovalPlugins","map","adapter","plugin","didRun","html","renderToString","nonce","plugins","serverSsr","setRenderFinished","injectedHtml","takeBufferedHtml","replace","Response","status","stores","statusCode","
|
|
1
|
+
{"version":3,"file":"renderRouterToString.js","names":["Solid","makeSsrSerovalPlugin","AnyRouter","JSXElement","renderRouterToString","router","responseHeaders","children","Headers","serializationAdapters","options","ssr","serovalPlugins","map","adapter","plugin","didRun","html","renderToString","nonce","plugins","serverSsr","setRenderFinished","injectedHtml","takeBufferedHtml","replace","Response","status","stores","statusCode","get","headers","error","console","cleanup"],"sources":["../../../src/ssr/renderRouterToString.tsx"],"sourcesContent":["import * as Solid from 'solid-js/web'\nimport { makeSsrSerovalPlugin } from '@tanstack/router-core'\nimport type { AnyRouter } from '@tanstack/router-core'\nimport type { JSXElement } from 'solid-js'\n\nexport const renderRouterToString = ({\n router,\n responseHeaders,\n children,\n}: {\n router: AnyRouter\n responseHeaders: Headers\n children: () => JSXElement\n}) => {\n try {\n const serializationAdapters =\n (router.options as any)?.serializationAdapters ||\n (router.options.ssr as any)?.serializationAdapters\n const serovalPlugins = serializationAdapters?.map((adapter: any) => {\n const plugin = makeSsrSerovalPlugin(adapter, { didRun: false })\n return plugin\n })\n\n let html = Solid.renderToString(children, {\n nonce: router.options.ssr?.nonce,\n plugins: serovalPlugins,\n } as any)\n router.serverSsr!.setRenderFinished()\n\n const injectedHtml = router.serverSsr!.takeBufferedHtml()\n if (injectedHtml) {\n html = html.replace(`</body>`, () => `${injectedHtml}</body>`)\n }\n return new Response(`<!DOCTYPE html>${html}`, {\n status: router.stores.statusCode.get(),\n headers: responseHeaders,\n })\n } catch (error) {\n console.error('Render to string error:', error)\n return new Response('Internal Server Error', {\n status: 500,\n headers: responseHeaders,\n })\n } finally {\n router.serverSsr?.cleanup()\n }\n}\n"],"mappings":";;;AAKA,IAAaI,wBAAwB,EACnCC,QACAC,iBACAC,eAKI;AACJ,KAAI;EAIF,MAAMK,kBAFHP,OAAOK,SAAiBD,yBACxBJ,OAAOK,QAAQC,KAAaF,wBACeI,KAAKC,YAAiB;AAElE,UADeb,qBAAqBa,SAAS,EAAEE,QAAQ,OAAO,CAAC;IAE/D;EAEF,IAAIC,OAAOjB,MAAMkB,eAAeX,UAAU;GACxCY,OAAOd,OAAOK,QAAQC,KAAKQ;GAC3BC,SAASR;GACV,CAAQ;AACTP,SAAOgB,UAAWC,mBAAmB;EAErC,MAAMC,eAAelB,OAAOgB,UAAWG,kBAAkB;AACzD,MAAID,aACFN,QAAOA,KAAKQ,QAAQ,iBAAiB,GAAGF,aAAY,SAAU;AAEhE,SAAO,IAAIG,SAAS,kBAAkBT,QAAQ;GAC5CU,QAAQtB,OAAOuB,OAAOC,WAAWC,KAAK;GACtCC,SAASzB;GACV,CAAC;UACK0B,OAAO;AACdC,UAAQD,MAAM,2BAA2BA,MAAM;AAC/C,SAAO,IAAIN,SAAS,yBAAyB;GAC3CC,QAAQ;GACRI,SAASzB;GACV,CAAC;WACM;AACRD,SAAOgB,WAAWa,SAAS"}
|
package/dist/esm/useCanGoBack.js
CHANGED
|
@@ -3,7 +3,7 @@ import * as Solid from "solid-js";
|
|
|
3
3
|
//#region src/useCanGoBack.ts
|
|
4
4
|
function useCanGoBack() {
|
|
5
5
|
const router = useRouter();
|
|
6
|
-
return Solid.createMemo(() => router.stores.location.
|
|
6
|
+
return Solid.createMemo(() => router.stores.location.get().state.__TSR_index !== 0);
|
|
7
7
|
}
|
|
8
8
|
//#endregion
|
|
9
9
|
export { useCanGoBack };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useCanGoBack.js","names":[],"sources":["../../src/useCanGoBack.ts"],"sourcesContent":["import * as Solid from 'solid-js'\nimport { useRouter } from './useRouter'\n\nexport function useCanGoBack() {\n const router = useRouter()\n return Solid.createMemo(\n () => router.stores.location.
|
|
1
|
+
{"version":3,"file":"useCanGoBack.js","names":[],"sources":["../../src/useCanGoBack.ts"],"sourcesContent":["import * as Solid from 'solid-js'\nimport { useRouter } from './useRouter'\n\nexport function useCanGoBack() {\n const router = useRouter()\n return Solid.createMemo(\n () => router.stores.location.get().state.__TSR_index !== 0,\n )\n}\n"],"mappings":";;;AAGA,SAAgB,eAAe;CAC7B,MAAM,SAAS,WAAW;AAC1B,QAAO,MAAM,iBACL,OAAO,OAAO,SAAS,KAAK,CAAC,MAAM,gBAAgB,EAC1D"}
|
package/dist/esm/useLocation.js
CHANGED
|
@@ -4,10 +4,10 @@ import * as Solid from "solid-js";
|
|
|
4
4
|
//#region src/useLocation.tsx
|
|
5
5
|
function useLocation(opts) {
|
|
6
6
|
const router = useRouter();
|
|
7
|
-
if (!opts?.select) return (() => router.stores.location.
|
|
7
|
+
if (!opts?.select) return (() => router.stores.location.get());
|
|
8
8
|
const select = opts.select;
|
|
9
9
|
return Solid.createMemo((prev) => {
|
|
10
|
-
const res = select(router.stores.location.
|
|
10
|
+
const res = select(router.stores.location.get());
|
|
11
11
|
if (prev === void 0) return res;
|
|
12
12
|
return replaceEqualDeep(prev, res);
|
|
13
13
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useLocation.js","names":["Solid","replaceEqualDeep","useRouter","AnyRouter","RegisteredRouter","RouterState","Accessor","UseLocationBaseOptions","select","state","TRouter","TSelected","UseLocationResult","useLocation","opts","router","stores","location","createMemo","prev","res","undefined"],"sources":["../../src/useLocation.tsx"],"sourcesContent":["import * as Solid from 'solid-js'\nimport { replaceEqualDeep } from '@tanstack/router-core'\nimport { useRouter } from './useRouter'\nimport type {\n AnyRouter,\n RegisteredRouter,\n RouterState,\n} from '@tanstack/router-core'\nimport type { Accessor } from 'solid-js'\n\nexport interface UseLocationBaseOptions<TRouter extends AnyRouter, TSelected> {\n select?: (state: RouterState<TRouter['routeTree']>['location']) => TSelected\n}\n\nexport type UseLocationResult<\n TRouter extends AnyRouter,\n TSelected,\n> = unknown extends TSelected\n ? RouterState<TRouter['routeTree']>['location']\n : TSelected\n\nexport function useLocation<\n TRouter extends AnyRouter = RegisteredRouter,\n TSelected = unknown,\n>(\n opts?: UseLocationBaseOptions<TRouter, TSelected>,\n): Accessor<UseLocationResult<TRouter, TSelected>> {\n const router = useRouter<TRouter>()\n\n if (!opts?.select) {\n return (() => router.stores.location.
|
|
1
|
+
{"version":3,"file":"useLocation.js","names":["Solid","replaceEqualDeep","useRouter","AnyRouter","RegisteredRouter","RouterState","Accessor","UseLocationBaseOptions","select","state","TRouter","TSelected","UseLocationResult","useLocation","opts","router","stores","location","get","createMemo","prev","res","undefined"],"sources":["../../src/useLocation.tsx"],"sourcesContent":["import * as Solid from 'solid-js'\nimport { replaceEqualDeep } from '@tanstack/router-core'\nimport { useRouter } from './useRouter'\nimport type {\n AnyRouter,\n RegisteredRouter,\n RouterState,\n} from '@tanstack/router-core'\nimport type { Accessor } from 'solid-js'\n\nexport interface UseLocationBaseOptions<TRouter extends AnyRouter, TSelected> {\n select?: (state: RouterState<TRouter['routeTree']>['location']) => TSelected\n}\n\nexport type UseLocationResult<\n TRouter extends AnyRouter,\n TSelected,\n> = unknown extends TSelected\n ? RouterState<TRouter['routeTree']>['location']\n : TSelected\n\nexport function useLocation<\n TRouter extends AnyRouter = RegisteredRouter,\n TSelected = unknown,\n>(\n opts?: UseLocationBaseOptions<TRouter, TSelected>,\n): Accessor<UseLocationResult<TRouter, TSelected>> {\n const router = useRouter<TRouter>()\n\n if (!opts?.select) {\n return (() => router.stores.location.get()) as Accessor<\n UseLocationResult<TRouter, TSelected>\n >\n }\n\n const select = opts.select\n\n return Solid.createMemo((prev: TSelected | undefined) => {\n const res = select(router.stores.location.get())\n if (prev === undefined) return res\n return replaceEqualDeep(prev, res)\n }) as Accessor<UseLocationResult<TRouter, TSelected>>\n}\n"],"mappings":";;;;AAqBA,SAAgBa,YAIdC,MACiD;CACjD,MAAMC,SAASb,WAAoB;AAEnC,KAAI,CAACY,MAAMN,OACT,eAAcO,OAAOC,OAAOC,SAASC,KAAK;CAK5C,MAAMV,SAASM,KAAKN;AAEpB,QAAOR,MAAMmB,YAAYC,SAAgC;EACvD,MAAMC,MAAMb,OAAOO,OAAOC,OAAOC,SAASC,KAAK,CAAC;AAChD,MAAIE,SAASE,KAAAA,EAAW,QAAOD;AAC/B,SAAOpB,iBAAiBmB,MAAMC,IAAI;GAClC"}
|
package/dist/esm/useMatch.js
CHANGED
|
@@ -7,12 +7,12 @@ function useMatch(opts) {
|
|
|
7
7
|
const router = useRouter();
|
|
8
8
|
const nearestMatch = opts.from ? void 0 : Solid.useContext(nearestMatchContext);
|
|
9
9
|
const match = () => {
|
|
10
|
-
if (opts.from) return router.stores.getMatchStoreByRouteId(opts.from).
|
|
10
|
+
if (opts.from) return router.stores.getMatchStoreByRouteId(opts.from).get();
|
|
11
11
|
return nearestMatch?.match();
|
|
12
12
|
};
|
|
13
13
|
Solid.createEffect(() => {
|
|
14
14
|
if (match() !== void 0) return;
|
|
15
|
-
if (!(opts.from ? Boolean(router.stores.pendingRouteIds.
|
|
15
|
+
if (!(opts.from ? Boolean(router.stores.pendingRouteIds.get()[opts.from]) : nearestMatch?.hasPending() ?? false) && !router.stores.isTransitioning.get() && (opts.shouldThrow ?? true)) {
|
|
16
16
|
if (process.env.NODE_ENV !== "production") throw new Error(`Invariant failed: Could not find ${opts.from ? `an active match from "${opts.from}"` : "a nearest match!"}`);
|
|
17
17
|
invariant();
|
|
18
18
|
}
|
package/dist/esm/useMatch.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useMatch.js","names":["Solid","invariant","replaceEqualDeep","nearestMatchContext","useRouter","AnyRouter","MakeRouteMatch","MakeRouteMatchUnion","RegisteredRouter","StrictOrFrom","ThrowConstraint","ThrowOrOptional","UseMatchBaseOptions","select","match","TRouter","TFrom","TStrict","TSelected","shouldThrow","TThrow","UseMatchRoute","opts","Accessor","UseMatchResult","UseMatchOptions","useMatch","router","nearestMatch","from","undefined","useContext","stores","getMatchStoreByRouteId","
|
|
1
|
+
{"version":3,"file":"useMatch.js","names":["Solid","invariant","replaceEqualDeep","nearestMatchContext","useRouter","AnyRouter","MakeRouteMatch","MakeRouteMatchUnion","RegisteredRouter","StrictOrFrom","ThrowConstraint","ThrowOrOptional","UseMatchBaseOptions","select","match","TRouter","TFrom","TStrict","TSelected","shouldThrow","TThrow","UseMatchRoute","opts","Accessor","UseMatchResult","UseMatchOptions","useMatch","router","nearestMatch","from","undefined","useContext","stores","getMatchStoreByRouteId","get","createEffect","hasPendingMatch","Boolean","pendingRouteIds","hasPending","isTransitioning","process","env","NODE_ENV","Error","createMemo","prev","selectedMatch","res"],"sources":["../../src/useMatch.tsx"],"sourcesContent":["import * as Solid from 'solid-js'\nimport { invariant, replaceEqualDeep } from '@tanstack/router-core'\nimport { nearestMatchContext } from './matchContext'\nimport { useRouter } from './useRouter'\nimport type {\n AnyRouter,\n MakeRouteMatch,\n MakeRouteMatchUnion,\n RegisteredRouter,\n StrictOrFrom,\n ThrowConstraint,\n ThrowOrOptional,\n} from '@tanstack/router-core'\n\nexport interface UseMatchBaseOptions<\n TRouter extends AnyRouter,\n TFrom,\n TStrict extends boolean,\n TThrow extends boolean,\n TSelected,\n> {\n select?: (\n match: MakeRouteMatch<TRouter['routeTree'], TFrom, TStrict>,\n ) => TSelected\n shouldThrow?: TThrow\n}\n\nexport type UseMatchRoute<out TFrom> = <\n TRouter extends AnyRouter = RegisteredRouter,\n TSelected = unknown,\n>(\n opts?: UseMatchBaseOptions<TRouter, TFrom, true, true, TSelected>,\n) => Solid.Accessor<UseMatchResult<TRouter, TFrom, true, TSelected>>\n\nexport type UseMatchOptions<\n TRouter extends AnyRouter,\n TFrom extends string | undefined,\n TStrict extends boolean,\n TThrow extends boolean,\n TSelected,\n> = StrictOrFrom<TRouter, TFrom, TStrict> &\n UseMatchBaseOptions<TRouter, TFrom, TStrict, TThrow, TSelected>\n\nexport type UseMatchResult<\n TRouter extends AnyRouter,\n TFrom,\n TStrict extends boolean,\n TSelected,\n> = unknown extends TSelected\n ? TStrict extends true\n ? MakeRouteMatch<TRouter['routeTree'], TFrom, TStrict>\n : MakeRouteMatchUnion<TRouter>\n : TSelected\n\nexport function useMatch<\n TRouter extends AnyRouter = RegisteredRouter,\n const TFrom extends string | undefined = undefined,\n TStrict extends boolean = true,\n TThrow extends boolean = true,\n TSelected = unknown,\n>(\n opts: UseMatchOptions<\n TRouter,\n TFrom,\n TStrict,\n ThrowConstraint<TStrict, TThrow>,\n TSelected\n >,\n): Solid.Accessor<\n ThrowOrOptional<UseMatchResult<TRouter, TFrom, TStrict, TSelected>, TThrow>\n> {\n const router = useRouter<TRouter>()\n const nearestMatch = opts.from\n ? undefined\n : Solid.useContext(nearestMatchContext)\n\n const match = () => {\n if (opts.from) {\n return router.stores.getMatchStoreByRouteId(opts.from).get()\n }\n\n return nearestMatch?.match()\n }\n\n Solid.createEffect(() => {\n if (match() !== undefined) {\n return\n }\n\n const hasPendingMatch = opts.from\n ? Boolean(router.stores.pendingRouteIds.get()[opts.from!])\n : (nearestMatch?.hasPending() ?? false)\n\n if (\n !hasPendingMatch &&\n !router.stores.isTransitioning.get() &&\n (opts.shouldThrow ?? true)\n ) {\n if (process.env.NODE_ENV !== 'production') {\n throw new Error(\n `Invariant failed: Could not find ${opts.from ? `an active match from \"${opts.from}\"` : 'a nearest match!'}`,\n )\n }\n\n invariant()\n }\n })\n\n return Solid.createMemo((prev: TSelected | undefined) => {\n const selectedMatch = match()\n\n if (selectedMatch === undefined) return undefined\n const res = opts.select ? opts.select(selectedMatch as any) : selectedMatch\n if (prev === undefined) return res as TSelected\n return replaceEqualDeep(prev, res) as TSelected\n }) as any\n}\n"],"mappings":";;;;;AAsDA,SAAgB0B,SAOdJ,MASA;CACA,MAAMK,SAASvB,WAAoB;CACnC,MAAMwB,eAAeN,KAAKO,OACtBC,KAAAA,IACA9B,MAAM+B,WAAW5B,oBAAoB;CAEzC,MAAMW,cAAc;AAClB,MAAIQ,KAAKO,KACP,QAAOF,OAAOK,OAAOC,uBAAuBX,KAAKO,KAAK,CAACK,KAAK;AAG9D,SAAON,cAAcd,OAAO;;AAG9Bd,OAAMmC,mBAAmB;AACvB,MAAIrB,OAAO,KAAKgB,KAAAA,EACd;AAOF,MACE,EALsBR,KAAKO,OACzBQ,QAAQV,OAAOK,OAAOM,gBAAgBJ,KAAK,CAACZ,KAAKO,MAAO,GACvDD,cAAcW,YAAY,IAAI,UAIjC,CAACZ,OAAOK,OAAOQ,gBAAgBN,KAAK,KACnCZ,KAAKH,eAAe,OACrB;AACA,OAAA,QAAA,IAAA,aAA6B,aAC3B,OAAM,IAAIyB,MACR,oCAAoCtB,KAAKO,OAAO,yBAAyBP,KAAKO,KAAI,KAAM,qBACzF;AAGH5B,cAAW;;GAEb;AAEF,QAAOD,MAAM6C,YAAYC,SAAgC;EACvD,MAAMC,gBAAgBjC,OAAO;AAE7B,MAAIiC,kBAAkBjB,KAAAA,EAAW,QAAOA,KAAAA;EACxC,MAAMkB,MAAM1B,KAAKT,SAASS,KAAKT,OAAOkC,cAAqB,GAAGA;AAC9D,MAAID,SAAShB,KAAAA,EAAW,QAAOkB;AAC/B,SAAO9C,iBAAiB4C,MAAME,IAAI;GAClC"}
|
|
@@ -7,14 +7,14 @@ function useRouterState(opts) {
|
|
|
7
7
|
const contextRouter = useRouter({ warn: opts?.router === void 0 });
|
|
8
8
|
const router = opts?.router || contextRouter;
|
|
9
9
|
if (isServer ?? router.isServer) {
|
|
10
|
-
const state = router.stores.__store.
|
|
10
|
+
const state = router.stores.__store.get();
|
|
11
11
|
const selected = opts?.select ? opts.select(state) : state;
|
|
12
12
|
return (() => selected);
|
|
13
13
|
}
|
|
14
|
-
if (!opts?.select) return (() => router.stores.__store.
|
|
14
|
+
if (!opts?.select) return (() => router.stores.__store.get());
|
|
15
15
|
const select = opts.select;
|
|
16
16
|
return Solid.createMemo((prev) => {
|
|
17
|
-
const res = select(router.stores.__store.
|
|
17
|
+
const res = select(router.stores.__store.get());
|
|
18
18
|
if (prev === void 0) return res;
|
|
19
19
|
return replaceEqualDeep(prev, res);
|
|
20
20
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useRouterState.js","names":["isServer","Solid","replaceEqualDeep","useRouter","AnyRouter","RegisteredRouter","RouterState","Accessor","UseRouterStateOptions","router","TRouter","select","state","TSelected","UseRouterStateResult","useRouterState","opts","contextRouter","warn","undefined","_isServer","stores","__store","selected","createMemo","prev","res"],"sources":["../../src/useRouterState.tsx"],"sourcesContent":["import { isServer } from '@tanstack/router-core/isServer'\nimport * as Solid from 'solid-js'\nimport { replaceEqualDeep } from '@tanstack/router-core'\nimport { useRouter } from './useRouter'\nimport type {\n AnyRouter,\n RegisteredRouter,\n RouterState,\n} from '@tanstack/router-core'\nimport type { Accessor } from 'solid-js'\n\nexport type UseRouterStateOptions<TRouter extends AnyRouter, TSelected> = {\n router?: TRouter\n select?: (state: RouterState<TRouter['routeTree']>) => TSelected\n}\n\nexport type UseRouterStateResult<\n TRouter extends AnyRouter,\n TSelected,\n> = unknown extends TSelected ? RouterState<TRouter['routeTree']> : TSelected\n\nexport function useRouterState<\n TRouter extends AnyRouter = RegisteredRouter,\n TSelected = unknown,\n>(\n opts?: UseRouterStateOptions<TRouter, TSelected>,\n): Accessor<UseRouterStateResult<TRouter, TSelected>> {\n const contextRouter = useRouter<TRouter>({\n warn: opts?.router === undefined,\n })\n const router = opts?.router || contextRouter\n\n // During SSR we render exactly once and do not need reactivity.\n // Avoid subscribing to the store on the server since the server store\n // implementation does not provide subscribe() semantics.\n const _isServer = isServer ?? router.isServer\n if (_isServer) {\n const state = router.stores.__store.
|
|
1
|
+
{"version":3,"file":"useRouterState.js","names":["isServer","Solid","replaceEqualDeep","useRouter","AnyRouter","RegisteredRouter","RouterState","Accessor","UseRouterStateOptions","router","TRouter","select","state","TSelected","UseRouterStateResult","useRouterState","opts","contextRouter","warn","undefined","_isServer","stores","__store","get","selected","createMemo","prev","res"],"sources":["../../src/useRouterState.tsx"],"sourcesContent":["import { isServer } from '@tanstack/router-core/isServer'\nimport * as Solid from 'solid-js'\nimport { replaceEqualDeep } from '@tanstack/router-core'\nimport { useRouter } from './useRouter'\nimport type {\n AnyRouter,\n RegisteredRouter,\n RouterState,\n} from '@tanstack/router-core'\nimport type { Accessor } from 'solid-js'\n\nexport type UseRouterStateOptions<TRouter extends AnyRouter, TSelected> = {\n router?: TRouter\n select?: (state: RouterState<TRouter['routeTree']>) => TSelected\n}\n\nexport type UseRouterStateResult<\n TRouter extends AnyRouter,\n TSelected,\n> = unknown extends TSelected ? RouterState<TRouter['routeTree']> : TSelected\n\nexport function useRouterState<\n TRouter extends AnyRouter = RegisteredRouter,\n TSelected = unknown,\n>(\n opts?: UseRouterStateOptions<TRouter, TSelected>,\n): Accessor<UseRouterStateResult<TRouter, TSelected>> {\n const contextRouter = useRouter<TRouter>({\n warn: opts?.router === undefined,\n })\n const router = opts?.router || contextRouter\n\n // During SSR we render exactly once and do not need reactivity.\n // Avoid subscribing to the store on the server since the server store\n // implementation does not provide subscribe() semantics.\n const _isServer = isServer ?? router.isServer\n if (_isServer) {\n const state = router.stores.__store.get() as RouterState<\n TRouter['routeTree']\n >\n const selected = (\n opts?.select ? opts.select(state) : state\n ) as UseRouterStateResult<TRouter, TSelected>\n return (() => selected) as Accessor<\n UseRouterStateResult<TRouter, TSelected>\n >\n }\n\n if (!opts?.select) {\n return (() => router.stores.__store.get()) as Accessor<\n UseRouterStateResult<TRouter, TSelected>\n >\n }\n\n const select = opts.select\n\n return Solid.createMemo((prev: TSelected | undefined) => {\n const res = select(router.stores.__store.get())\n if (prev === undefined) return res\n return replaceEqualDeep(prev, res)\n }) as Accessor<UseRouterStateResult<TRouter, TSelected>>\n}\n"],"mappings":";;;;;AAqBA,SAAgBe,eAIdC,MACoD;CACpD,MAAMC,gBAAgBd,UAAmB,EACvCe,MAAMF,MAAMP,WAAWU,KAAAA,GACxB,CAAC;CACF,MAAMV,SAASO,MAAMP,UAAUQ;AAM/B,KADkBjB,YAAYS,OAAOT,UACtB;EACb,MAAMY,QAAQH,OAAOY,OAAOC,QAAQC,KAAK;EAGzC,MAAMC,WACJR,MAAML,SAASK,KAAKL,OAAOC,MAAM,GAAGA;AAEtC,gBAAcY;;AAKhB,KAAI,CAACR,MAAML,OACT,eAAcF,OAAOY,OAAOC,QAAQC,KAAK;CAK3C,MAAMZ,SAASK,KAAKL;AAEpB,QAAOV,MAAMwB,YAAYC,SAAgC;EACvD,MAAMC,MAAMhB,OAAOF,OAAOY,OAAOC,QAAQC,KAAK,CAAC;AAC/C,MAAIG,SAASP,KAAAA,EAAW,QAAOQ;AAC/B,SAAOzB,iBAAiBwB,MAAMC,IAAI;GAClC"}
|
package/dist/source/Match.jsx
CHANGED
|
@@ -15,7 +15,7 @@ export const Match = (props) => {
|
|
|
15
15
|
const id = props.matchId;
|
|
16
16
|
if (!id)
|
|
17
17
|
return undefined;
|
|
18
|
-
return router.stores.activeMatchStoresById.get(id)?.
|
|
18
|
+
return router.stores.activeMatchStoresById.get(id)?.get();
|
|
19
19
|
});
|
|
20
20
|
const rawMatchState = Solid.createMemo(() => {
|
|
21
21
|
const currentMatch = match();
|
|
@@ -36,7 +36,7 @@ export const Match = (props) => {
|
|
|
36
36
|
const hasPendingMatch = Solid.createMemo(() => {
|
|
37
37
|
const currentRouteId = rawMatchState()?.routeId;
|
|
38
38
|
return currentRouteId
|
|
39
|
-
? Boolean(router.stores.pendingRouteIds.
|
|
39
|
+
? Boolean(router.stores.pendingRouteIds.get()[currentRouteId])
|
|
40
40
|
: false;
|
|
41
41
|
});
|
|
42
42
|
const nearestMatch = {
|
|
@@ -71,7 +71,7 @@ export const Match = (props) => {
|
|
|
71
71
|
<Dynamic component={ResolvedSuspenseBoundary()} fallback={
|
|
72
72
|
// Don't show fallback on server when using no-ssr mode to avoid hydration mismatch
|
|
73
73
|
(isServer ?? router.isServer) && resolvedNoSsr ? undefined : (<Dynamic component={resolvePendingComponent()}/>)}>
|
|
74
|
-
<Dynamic component={ResolvedCatchBoundary()} getResetKey={() => router.stores.loadedAt.
|
|
74
|
+
<Dynamic component={ResolvedCatchBoundary()} getResetKey={() => router.stores.loadedAt.get()} errorComponent={routeErrorComponent() || ErrorComponent} onCatch={(error) => {
|
|
75
75
|
// Forward not found errors (we don't want to show the error component for these)
|
|
76
76
|
const notFoundError = getNotFound(error);
|
|
77
77
|
if (notFoundError) {
|
|
@@ -128,11 +128,11 @@ export const Match = (props) => {
|
|
|
128
128
|
// (like bad head/link tags, which is common).
|
|
129
129
|
function OnRendered() {
|
|
130
130
|
const router = useRouter();
|
|
131
|
-
const location = Solid.createMemo(() => router.stores.resolvedLocation.
|
|
131
|
+
const location = Solid.createMemo(() => router.stores.resolvedLocation.get()?.state.__TSR_key);
|
|
132
132
|
Solid.createEffect(Solid.on([location], () => {
|
|
133
133
|
router.emit({
|
|
134
134
|
type: 'onRendered',
|
|
135
|
-
...getLocationChangeInfo(router.stores.location.
|
|
135
|
+
...getLocationChangeInfo(router.stores.location.get(), router.stores.resolvedLocation.get()),
|
|
136
136
|
});
|
|
137
137
|
}));
|
|
138
138
|
return null;
|
|
@@ -296,14 +296,14 @@ export const Outlet = () => {
|
|
|
296
296
|
const childMatchId = Solid.createMemo(() => {
|
|
297
297
|
const currentRouteId = routeId();
|
|
298
298
|
return currentRouteId
|
|
299
|
-
? router.stores.childMatchIdByRouteId.
|
|
299
|
+
? router.stores.childMatchIdByRouteId.get()[currentRouteId]
|
|
300
300
|
: undefined;
|
|
301
301
|
});
|
|
302
302
|
const childMatchStatus = Solid.createMemo(() => {
|
|
303
303
|
const id = childMatchId();
|
|
304
304
|
if (!id)
|
|
305
305
|
return undefined;
|
|
306
|
-
return router.stores.activeMatchStoresById.get(id)?.
|
|
306
|
+
return router.stores.activeMatchStoresById.get(id)?.get().status;
|
|
307
307
|
});
|
|
308
308
|
// Only show not-found if we're not in a redirected state
|
|
309
309
|
const shouldShowNotFound = () => childMatchStatus() !== 'redirected' && parentGlobalNotFound();
|