@tanstack/solid-router 1.121.0 → 1.121.3
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/Matches.cjs +4 -3
- package/dist/cjs/Matches.cjs.map +1 -1
- package/dist/cjs/link.cjs +18 -9
- package/dist/cjs/link.cjs.map +1 -1
- package/dist/cjs/useBlocker.cjs +41 -35
- package/dist/cjs/useBlocker.cjs.map +1 -1
- package/dist/esm/Matches.js +4 -3
- package/dist/esm/Matches.js.map +1 -1
- package/dist/esm/link.js +18 -9
- package/dist/esm/link.js.map +1 -1
- package/dist/esm/useBlocker.js +41 -35
- package/dist/esm/useBlocker.js.map +1 -1
- package/dist/source/Matches.jsx +4 -3
- package/dist/source/Matches.jsx.map +1 -1
- package/dist/source/link.jsx +15 -12
- package/dist/source/link.jsx.map +1 -1
- package/dist/source/useBlocker.jsx +44 -27
- package/dist/source/useBlocker.jsx.map +1 -1
- package/package.json +2 -2
- package/src/Matches.tsx +4 -4
- package/src/link.tsx +22 -16
- package/src/useBlocker.tsx +48 -32
package/dist/cjs/Matches.cjs
CHANGED
|
@@ -109,10 +109,11 @@ function MatchRoute(props) {
|
|
|
109
109
|
children: (_) => {
|
|
110
110
|
const matchRoute = useMatchRoute();
|
|
111
111
|
const params = matchRoute(props)();
|
|
112
|
-
|
|
113
|
-
|
|
112
|
+
const child = props.children;
|
|
113
|
+
if (typeof child === "function") {
|
|
114
|
+
return child(params);
|
|
114
115
|
}
|
|
115
|
-
return params ?
|
|
116
|
+
return params ? child : null;
|
|
116
117
|
}
|
|
117
118
|
});
|
|
118
119
|
}
|
package/dist/cjs/Matches.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Matches.cjs","sources":["../../src/Matches.tsx"],"sourcesContent":["import * as Solid from 'solid-js'\nimport warning from 'tiny-warning'\nimport { CatchBoundary, ErrorComponent } from './CatchBoundary'\nimport { useRouterState } from './useRouterState'\nimport { useRouter } from './useRouter'\nimport { Transitioner } from './Transitioner'\nimport { matchContext } from './matchContext'\nimport { Match } from './Match'\nimport { SafeFragment } from './SafeFragment'\nimport type {\n AnyRouter,\n DeepPartial,\n Expand,\n MakeOptionalPathParams,\n MakeOptionalSearchParams,\n MakeRouteMatchUnion,\n MaskOptions,\n MatchRouteOptions,\n NoInfer,\n RegisteredRouter,\n ResolveRelativePath,\n ResolveRoute,\n RouteByPath,\n RouterState,\n ToSubOptionsProps,\n} from '@tanstack/router-core'\n\ndeclare module '@tanstack/router-core' {\n export interface RouteMatchExtensions {\n meta?: Array<Solid.JSX.IntrinsicElements['meta'] | undefined>\n links?: Array<Solid.JSX.IntrinsicElements['link'] | undefined>\n scripts?: Array<Solid.JSX.IntrinsicElements['script'] | undefined>\n headScripts?: Array<Solid.JSX.IntrinsicElements['script'] | undefined>\n }\n}\n\nexport function Matches() {\n const router = useRouter()\n\n const pendingElement = router.options.defaultPendingComponent ? (\n <router.options.defaultPendingComponent />\n ) : null\n\n // Do not render a root Suspense during SSR or hydrating from SSR\n const ResolvedSuspense =\n router.isServer || (typeof document !== 'undefined' && router.clientSsr)\n ? SafeFragment\n : Solid.Suspense\n\n const inner = (\n <ResolvedSuspense fallback={pendingElement}>\n <Transitioner />\n <MatchesInner />\n </ResolvedSuspense>\n )\n\n return router.options.InnerWrap ? (\n <router.options.InnerWrap>{inner}</router.options.InnerWrap>\n ) : (\n inner\n )\n}\n\nfunction MatchesInner() {\n const matchId = useRouterState({\n select: (s) => {\n return s.matches[0]?.id\n },\n })\n\n const resetKey = useRouterState({\n select: (s) => s.loadedAt,\n })\n\n return (\n <matchContext.Provider value={matchId}>\n <CatchBoundary\n getResetKey={() => resetKey()}\n errorComponent={ErrorComponent}\n onCatch={(error) => {\n warning(\n false,\n `The following error wasn't caught by any route! At the very least, consider setting an 'errorComponent' in your RootRoute!`,\n )\n warning(false, error.message || error.toString())\n }}\n >\n {matchId() ? <Match matchId={matchId()!} /> : null}\n </CatchBoundary>\n </matchContext.Provider>\n )\n}\n\nexport type UseMatchRouteOptions<\n TRouter extends AnyRouter = RegisteredRouter,\n TFrom extends string = string,\n TTo extends string | undefined = undefined,\n TMaskFrom extends string = TFrom,\n TMaskTo extends string = '',\n> = ToSubOptionsProps<TRouter, TFrom, TTo> &\n DeepPartial<MakeOptionalSearchParams<TRouter, TFrom, TTo>> &\n DeepPartial<MakeOptionalPathParams<TRouter, TFrom, TTo>> &\n MaskOptions<TRouter, TMaskFrom, TMaskTo> &\n MatchRouteOptions\n\nexport function useMatchRoute<TRouter extends AnyRouter = RegisteredRouter>() {\n const router = useRouter()\n\n const status = useRouterState({\n select: (s) => s.status,\n })\n\n return <\n const TFrom extends string = string,\n const TTo extends string | undefined = undefined,\n const TMaskFrom extends string = TFrom,\n const TMaskTo extends string = '',\n >(\n opts: UseMatchRouteOptions<TRouter, TFrom, TTo, TMaskFrom, TMaskTo>,\n ): Solid.Accessor<\n false | Expand<ResolveRoute<TRouter, TFrom, TTo>['types']['allParams']>\n > => {\n const { pending, caseSensitive, fuzzy, includeSearch, ...rest } = opts\n\n const matchRoute = Solid.createMemo(() => {\n status()\n return router.matchRoute(rest as any, {\n pending,\n caseSensitive,\n fuzzy,\n includeSearch,\n })\n })\n\n return matchRoute\n }\n}\n\nexport type MakeMatchRouteOptions<\n TRouter extends AnyRouter = RegisteredRouter,\n TFrom extends string = string,\n TTo extends string | undefined = undefined,\n TMaskFrom extends string = TFrom,\n TMaskTo extends string = '',\n> = UseMatchRouteOptions<TRouter, TFrom, TTo, TMaskFrom, TMaskTo> & {\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 | ((\n params?: RouteByPath<\n TRouter['routeTree'],\n ResolveRelativePath<TFrom, NoInfer<TTo>>\n >['types']['allParams'],\n ) => Solid.JSX.Element)\n | Solid.JSX.Element\n}\n\nexport function MatchRoute<\n TRouter extends AnyRouter = RegisteredRouter,\n const TFrom extends string = string,\n const TTo extends string | undefined = undefined,\n const TMaskFrom extends string = TFrom,\n const TMaskTo extends string = '',\n>(props: MakeMatchRouteOptions<TRouter, TFrom, TTo, TMaskFrom, TMaskTo>): any {\n const status = useRouterState({\n select: (s) => s.status,\n })\n\n return (\n <Solid.Show when={status()} keyed>\n {(_) => {\n const matchRoute = useMatchRoute()\n const params = matchRoute(props as any)() as boolean\n\n if (typeof props.children === 'function') {\n return (props.children as any)(params)\n }\n\n return params ? props.children : null\n }}\n </Solid.Show>\n )\n}\n\nexport interface UseMatchesBaseOptions<TRouter extends AnyRouter, TSelected> {\n select?: (matches: Array<MakeRouteMatchUnion<TRouter>>) => TSelected\n}\n\nexport type UseMatchesResult<\n TRouter extends AnyRouter,\n TSelected,\n> = unknown extends TSelected ? Array<MakeRouteMatchUnion<TRouter>> : TSelected\n\nexport function useMatches<\n TRouter extends AnyRouter = RegisteredRouter,\n TSelected = unknown,\n>(\n opts?: UseMatchesBaseOptions<TRouter, TSelected>,\n): Solid.Accessor<UseMatchesResult<TRouter, TSelected>> {\n return useRouterState({\n select: (state: RouterState<TRouter['routeTree']>) => {\n const matches = state.matches\n return opts?.select\n ? opts.select(matches as Array<MakeRouteMatchUnion<TRouter>>)\n : matches\n },\n } as any) as Solid.Accessor<UseMatchesResult<TRouter, TSelected>>\n}\n\nexport function useParentMatches<\n TRouter extends AnyRouter = RegisteredRouter,\n TSelected = unknown,\n>(\n opts?: UseMatchesBaseOptions<TRouter, TSelected>,\n): Solid.Accessor<UseMatchesResult<TRouter, TSelected>> {\n const contextMatchId = Solid.useContext(matchContext)\n\n return useMatches({\n select: (matches: Array<MakeRouteMatchUnion<TRouter>>) => {\n matches = matches.slice(\n 0,\n matches.findIndex((d) => d.id === contextMatchId()),\n )\n return opts?.select ? opts.select(matches) : matches\n },\n } as any)\n}\n\nexport function useChildMatches<\n TRouter extends AnyRouter = RegisteredRouter,\n TSelected = unknown,\n>(\n opts?: UseMatchesBaseOptions<TRouter, TSelected>,\n): Solid.Accessor<UseMatchesResult<TRouter, TSelected>> {\n const contextMatchId = Solid.useContext(matchContext)\n\n return useMatches({\n select: (matches: Array<MakeRouteMatchUnion<TRouter>>) => {\n matches = matches.slice(\n matches.findIndex((d) => d.id === contextMatchId()) + 1,\n )\n return opts?.select ? opts.select(matches) : matches\n },\n } as any)\n}\n"],"names":["Matches","router","useRouter","pendingElement","options","defaultPendingComponent","_$createComponent","ResolvedSuspense","isServer","document","clientSsr","SafeFragment","Solid","Suspense","inner","fallback","children","Transitioner","MatchesInner","InnerWrap","matchId","useRouterState","select","s","matches","id","resetKey","loadedAt","matchContext","Provider","value","CatchBoundary","getResetKey","errorComponent","ErrorComponent","onCatch","error","warning","message","toString","_$memo","Match","useMatchRoute","status","opts","pending","caseSensitive","fuzzy","includeSearch","rest","matchRoute","createMemo","MatchRoute","props","Show","when","keyed","_","params","useMatches","state","useParentMatches","contextMatchId","useContext","slice","findIndex","d","useChildMatches"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Matches.cjs","sources":["../../src/Matches.tsx"],"sourcesContent":["import * as Solid from 'solid-js'\nimport warning from 'tiny-warning'\nimport { CatchBoundary, ErrorComponent } from './CatchBoundary'\nimport { useRouterState } from './useRouterState'\nimport { useRouter } from './useRouter'\nimport { Transitioner } from './Transitioner'\nimport { matchContext } from './matchContext'\nimport { Match } from './Match'\nimport { SafeFragment } from './SafeFragment'\nimport type {\n AnyRouter,\n DeepPartial,\n Expand,\n MakeOptionalPathParams,\n MakeOptionalSearchParams,\n MakeRouteMatchUnion,\n MaskOptions,\n MatchRouteOptions,\n NoInfer,\n RegisteredRouter,\n ResolveRelativePath,\n ResolveRoute,\n RouteByPath,\n RouterState,\n ToSubOptionsProps,\n} from '@tanstack/router-core'\n\ndeclare module '@tanstack/router-core' {\n export interface RouteMatchExtensions {\n meta?: Array<Solid.JSX.IntrinsicElements['meta'] | undefined>\n links?: Array<Solid.JSX.IntrinsicElements['link'] | undefined>\n scripts?: Array<Solid.JSX.IntrinsicElements['script'] | undefined>\n headScripts?: Array<Solid.JSX.IntrinsicElements['script'] | undefined>\n }\n}\n\nexport function Matches() {\n const router = useRouter()\n\n const pendingElement = router.options.defaultPendingComponent ? (\n <router.options.defaultPendingComponent />\n ) : null\n\n // Do not render a root Suspense during SSR or hydrating from SSR\n const ResolvedSuspense =\n router.isServer || (typeof document !== 'undefined' && router.clientSsr)\n ? SafeFragment\n : Solid.Suspense\n\n const inner = (\n <ResolvedSuspense fallback={pendingElement}>\n <Transitioner />\n <MatchesInner />\n </ResolvedSuspense>\n )\n\n return router.options.InnerWrap ? (\n <router.options.InnerWrap>{inner}</router.options.InnerWrap>\n ) : (\n inner\n )\n}\n\nfunction MatchesInner() {\n const matchId = useRouterState({\n select: (s) => {\n return s.matches[0]?.id\n },\n })\n\n const resetKey = useRouterState({\n select: (s) => s.loadedAt,\n })\n\n return (\n <matchContext.Provider value={matchId}>\n <CatchBoundary\n getResetKey={() => resetKey()}\n errorComponent={ErrorComponent}\n onCatch={(error) => {\n warning(\n false,\n `The following error wasn't caught by any route! At the very least, consider setting an 'errorComponent' in your RootRoute!`,\n )\n warning(false, error.message || error.toString())\n }}\n >\n {matchId() ? <Match matchId={matchId()!} /> : null}\n </CatchBoundary>\n </matchContext.Provider>\n )\n}\n\nexport type UseMatchRouteOptions<\n TRouter extends AnyRouter = RegisteredRouter,\n TFrom extends string = string,\n TTo extends string | undefined = undefined,\n TMaskFrom extends string = TFrom,\n TMaskTo extends string = '',\n> = ToSubOptionsProps<TRouter, TFrom, TTo> &\n DeepPartial<MakeOptionalSearchParams<TRouter, TFrom, TTo>> &\n DeepPartial<MakeOptionalPathParams<TRouter, TFrom, TTo>> &\n MaskOptions<TRouter, TMaskFrom, TMaskTo> &\n MatchRouteOptions\n\nexport function useMatchRoute<TRouter extends AnyRouter = RegisteredRouter>() {\n const router = useRouter()\n\n const status = useRouterState({\n select: (s) => s.status,\n })\n\n return <\n const TFrom extends string = string,\n const TTo extends string | undefined = undefined,\n const TMaskFrom extends string = TFrom,\n const TMaskTo extends string = '',\n >(\n opts: UseMatchRouteOptions<TRouter, TFrom, TTo, TMaskFrom, TMaskTo>,\n ): Solid.Accessor<\n false | Expand<ResolveRoute<TRouter, TFrom, TTo>['types']['allParams']>\n > => {\n const { pending, caseSensitive, fuzzy, includeSearch, ...rest } = opts\n\n const matchRoute = Solid.createMemo(() => {\n status()\n return router.matchRoute(rest as any, {\n pending,\n caseSensitive,\n fuzzy,\n includeSearch,\n })\n })\n\n return matchRoute\n }\n}\n\nexport type MakeMatchRouteOptions<\n TRouter extends AnyRouter = RegisteredRouter,\n TFrom extends string = string,\n TTo extends string | undefined = undefined,\n TMaskFrom extends string = TFrom,\n TMaskTo extends string = '',\n> = UseMatchRouteOptions<TRouter, TFrom, TTo, TMaskFrom, TMaskTo> & {\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 | ((\n params?: RouteByPath<\n TRouter['routeTree'],\n ResolveRelativePath<TFrom, NoInfer<TTo>>\n >['types']['allParams'],\n ) => Solid.JSX.Element)\n | Solid.JSX.Element\n}\n\nexport function MatchRoute<\n TRouter extends AnyRouter = RegisteredRouter,\n const TFrom extends string = string,\n const TTo extends string | undefined = undefined,\n const TMaskFrom extends string = TFrom,\n const TMaskTo extends string = '',\n>(props: MakeMatchRouteOptions<TRouter, TFrom, TTo, TMaskFrom, TMaskTo>): any {\n const status = useRouterState({\n select: (s) => s.status,\n })\n\n return (\n <Solid.Show when={status()} keyed>\n {(_) => {\n const matchRoute = useMatchRoute()\n const params = matchRoute(props as any)() as boolean\n const child = props.children\n if (typeof child === 'function') {\n return (child as any)(params)\n }\n\n return params ? child : null\n }}\n </Solid.Show>\n )\n}\n\nexport interface UseMatchesBaseOptions<TRouter extends AnyRouter, TSelected> {\n select?: (matches: Array<MakeRouteMatchUnion<TRouter>>) => TSelected\n}\n\nexport type UseMatchesResult<\n TRouter extends AnyRouter,\n TSelected,\n> = unknown extends TSelected ? Array<MakeRouteMatchUnion<TRouter>> : TSelected\n\nexport function useMatches<\n TRouter extends AnyRouter = RegisteredRouter,\n TSelected = unknown,\n>(\n opts?: UseMatchesBaseOptions<TRouter, TSelected>,\n): Solid.Accessor<UseMatchesResult<TRouter, TSelected>> {\n return useRouterState({\n select: (state: RouterState<TRouter['routeTree']>) => {\n const matches = state.matches\n return opts?.select\n ? opts.select(matches as Array<MakeRouteMatchUnion<TRouter>>)\n : matches\n },\n } as any) as Solid.Accessor<UseMatchesResult<TRouter, TSelected>>\n}\n\nexport function useParentMatches<\n TRouter extends AnyRouter = RegisteredRouter,\n TSelected = unknown,\n>(\n opts?: UseMatchesBaseOptions<TRouter, TSelected>,\n): Solid.Accessor<UseMatchesResult<TRouter, TSelected>> {\n const contextMatchId = Solid.useContext(matchContext)\n\n return useMatches({\n select: (matches: Array<MakeRouteMatchUnion<TRouter>>) => {\n matches = matches.slice(\n 0,\n matches.findIndex((d) => d.id === contextMatchId()),\n )\n return opts?.select ? opts.select(matches) : matches\n },\n } as any)\n}\n\nexport function useChildMatches<\n TRouter extends AnyRouter = RegisteredRouter,\n TSelected = unknown,\n>(\n opts?: UseMatchesBaseOptions<TRouter, TSelected>,\n): Solid.Accessor<UseMatchesResult<TRouter, TSelected>> {\n const contextMatchId = Solid.useContext(matchContext)\n\n return useMatches({\n select: (matches: Array<MakeRouteMatchUnion<TRouter>>) => {\n matches = matches.slice(\n matches.findIndex((d) => d.id === contextMatchId()) + 1,\n )\n return opts?.select ? opts.select(matches) : matches\n },\n } as any)\n}\n"],"names":["Matches","router","useRouter","pendingElement","options","defaultPendingComponent","_$createComponent","ResolvedSuspense","isServer","document","clientSsr","SafeFragment","Solid","Suspense","inner","fallback","children","Transitioner","MatchesInner","InnerWrap","matchId","useRouterState","select","s","matches","id","resetKey","loadedAt","matchContext","Provider","value","CatchBoundary","getResetKey","errorComponent","ErrorComponent","onCatch","error","warning","message","toString","_$memo","Match","useMatchRoute","status","opts","pending","caseSensitive","fuzzy","includeSearch","rest","matchRoute","createMemo","MatchRoute","props","Show","when","keyed","_","params","child","useMatches","state","useParentMatches","contextMatchId","useContext","slice","findIndex","d","useChildMatches"],"mappings":"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"}
|
package/dist/cjs/link.cjs
CHANGED
|
@@ -34,7 +34,7 @@ function useLinkProps(options) {
|
|
|
34
34
|
class: "active"
|
|
35
35
|
}),
|
|
36
36
|
inactiveProps: () => ({})
|
|
37
|
-
}, options), ["activeProps", "inactiveProps", "activeOptions", "to", "preload", "preloadDelay", "hashScrollIntoView", "replace", "startTransition", "resetScroll", "viewTransition", "
|
|
37
|
+
}, options), ["activeProps", "inactiveProps", "activeOptions", "to", "preload", "preloadDelay", "hashScrollIntoView", "replace", "startTransition", "resetScroll", "viewTransition", "target", "disabled", "style", "class", "onClick", "onFocus", "onMouseEnter", "onMouseLeave", "onMouseOver", "onMouseOut", "onTouchStart", "ignoreBlocker"]);
|
|
38
38
|
const [_, propsSafeToSpread] = Solid__namespace.splitProps(rest, ["params", "search", "hash", "state", "mask", "reloadDocument"]);
|
|
39
39
|
const type = () => {
|
|
40
40
|
try {
|
|
@@ -132,7 +132,7 @@ function useLinkProps(options) {
|
|
|
132
132
|
get href() {
|
|
133
133
|
return local.to;
|
|
134
134
|
}
|
|
135
|
-
}, Solid__namespace.splitProps(local, ["
|
|
135
|
+
}, Solid__namespace.splitProps(local, ["target", "disabled", "style", "class", "onClick", "onFocus", "onMouseEnter", "onMouseLeave", "onMouseOut", "onMouseOver", "onTouchStart"])[0]);
|
|
136
136
|
}
|
|
137
137
|
const handleClick = (e) => {
|
|
138
138
|
if (!local.disabled && !isCtrlEvent(e) && !e.defaultPrevented && (!local.target || local.target === "_self") && e.button === 0) {
|
|
@@ -250,19 +250,28 @@ function createLink(Comp) {
|
|
|
250
250
|
}));
|
|
251
251
|
}
|
|
252
252
|
const Link = (props) => {
|
|
253
|
-
const [local, rest] = Solid__namespace.splitProps(props, ["_asChild"]);
|
|
254
|
-
const [_, linkProps] = Solid__namespace.splitProps(useLinkProps(rest), ["type"
|
|
255
|
-
const children = () =>
|
|
256
|
-
|
|
257
|
-
|
|
253
|
+
const [local, rest] = Solid__namespace.splitProps(props, ["_asChild", "children"]);
|
|
254
|
+
const [_, linkProps] = Solid__namespace.splitProps(useLinkProps(rest), ["type"]);
|
|
255
|
+
const children = Solid__namespace.createMemo(() => {
|
|
256
|
+
const ch = local.children;
|
|
257
|
+
if (typeof ch === "function") {
|
|
258
|
+
return ch({
|
|
259
|
+
get isActive() {
|
|
260
|
+
return linkProps["data-status"] === "active";
|
|
261
|
+
},
|
|
262
|
+
isTransitioning: false
|
|
263
|
+
});
|
|
258
264
|
}
|
|
259
|
-
|
|
265
|
+
return ch;
|
|
266
|
+
});
|
|
260
267
|
return web.createComponent(web.Dynamic, web.mergeProps({
|
|
261
268
|
get component() {
|
|
262
269
|
return local._asChild ? local._asChild : "a";
|
|
263
270
|
}
|
|
264
271
|
}, linkProps, {
|
|
265
|
-
children
|
|
272
|
+
get children() {
|
|
273
|
+
return children();
|
|
274
|
+
}
|
|
266
275
|
}));
|
|
267
276
|
};
|
|
268
277
|
function isCtrlEvent(e) {
|
package/dist/cjs/link.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"link.cjs","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 preloadWarning,\n removeTrailingSlash,\n} from '@tanstack/router-core'\nimport { Dynamic } from 'solid-js/web'\nimport { useRouterState } from './useRouterState'\nimport { useRouter } from './useRouter'\n\nimport { useIntersectionObserver } from './utils'\n\nimport { useMatches } from './Matches'\nimport type {\n AnyRouter,\n Constrain,\n LinkCurrentTargetElement,\n LinkOptions,\n RegisteredRouter,\n RoutePaths,\n} from '@tanstack/router-core'\nimport type {\n ValidateLinkOptions,\n ValidateLinkOptionsArray,\n} from './typePrimitives'\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 let hasRenderFetched = false\n\n const [local, rest] = Solid.splitProps(\n Solid.mergeProps(\n {\n activeProps: () => ({ class: 'active' }),\n inactiveProps: () => ({}),\n },\n options,\n ),\n [\n 'activeProps',\n 'inactiveProps',\n 'activeOptions',\n 'to',\n 'preload',\n 'preloadDelay',\n 'hashScrollIntoView',\n 'replace',\n 'startTransition',\n 'resetScroll',\n 'viewTransition',\n 'children',\n 'target',\n 'disabled',\n 'style',\n 'class',\n 'onClick',\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 ])\n\n // If this link simply reloads the current route,\n // make sure it has a new key so it will trigger a data refresh\n\n // If this `to` is a valid external URL, return\n // null for LinkUtils\n\n const type: Solid.Accessor<'internal' | 'external'> = () => {\n try {\n new URL(`${local.to}`)\n return 'external'\n } catch {}\n return 'internal'\n }\n\n const currentSearch = useRouterState({\n select: (s) => s.location.searchStr,\n })\n\n // when `from` is not supplied, use the leaf route of the current matches as the `from` location\n // so relative routing works as expected\n const from = useMatches({\n select: (matches) => options.from ?? matches[matches.length - 1]?.fullPath,\n })\n\n const _options = () => ({\n ...options,\n from: from(),\n })\n\n const next = Solid.createMemo(() => {\n currentSearch()\n return router.buildLocation(_options() as any)\n })\n\n const preload = Solid.createMemo(() => {\n if (_options().reloadDocument) {\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 = useRouterState({\n select: (s) => {\n if (local.activeOptions?.exact) {\n const testExact = exactPathTest(\n s.location.pathname,\n next().pathname,\n router.basepath,\n )\n if (!testExact) {\n return false\n }\n } else {\n const currentPathSplit = removeTrailingSlash(\n s.location.pathname,\n router.basepath,\n ).split('/')\n const nextPathSplit = removeTrailingSlash(\n next()?.pathname,\n router.basepath,\n )?.split('/')\n\n const pathIsFuzzyEqual = nextPathSplit?.every(\n (d, i) => d === currentPathSplit[i],\n )\n if (!pathIsFuzzyEqual) {\n return false\n }\n }\n\n if (local.activeOptions?.includeSearch ?? true) {\n const searchTest = deepEqual(s.location.search, next().search, {\n partial: !local.activeOptions?.exact,\n ignoreUndefined: !local.activeOptions?.explicitUndefined,\n })\n if (!searchTest) {\n return false\n }\n }\n\n if (local.activeOptions?.includeHash) {\n return s.location.hash === next().hash\n }\n return true\n },\n })\n\n const doPreload = () =>\n router.preloadRoute(_options() as any).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 (type() === 'external') {\n return Solid.mergeProps(\n propsSafeToSpread,\n {\n ref,\n get type() {\n return type()\n },\n get href() {\n return local.to\n },\n },\n Solid.splitProps(local, [\n 'children',\n 'target',\n 'disabled',\n 'style',\n 'class',\n 'onClick',\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 if (\n !local.disabled &&\n !isCtrlEvent(e) &&\n !e.defaultPrevented &&\n (!local.target || local.target === '_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 return 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 } as any)\n }\n }\n\n // The click handler\n const handleFocus = (_: MouseEvent) => {\n if (local.disabled) return\n if (preload()) {\n doPreload()\n }\n }\n\n const handleTouchStart = handleFocus\n\n const handleEnter = (e: MouseEvent) => {\n if (local.disabled) return\n const eventTarget = (e.target || {}) as LinkCurrentTargetElement\n\n if (preload()) {\n if (eventTarget.preloadTimeout) {\n return\n }\n\n eventTarget.preloadTimeout = setTimeout(() => {\n eventTarget.preloadTimeout = null\n doPreload()\n }, preloadDelay())\n }\n }\n\n const handleLeave = (e: MouseEvent) => {\n if (local.disabled) return\n const eventTarget = (e.target || {}) as LinkCurrentTargetElement\n\n if (eventTarget.preloadTimeout) {\n clearTimeout(eventTarget.preloadTimeout)\n eventTarget.preloadTimeout = null\n }\n }\n\n /** Call a JSX.EventHandlerUnion with the event. */\n function callHandler<T, TEvent extends Event>(\n event: TEvent & { currentTarget: T; target: Element },\n handler: Solid.JSX.EventHandlerUnion<T, TEvent> | undefined,\n ) {\n if (handler) {\n if (typeof handler === 'function') {\n handler(event)\n } else {\n handler[0](handler[1], event)\n }\n }\n\n return event.defaultPrevented\n }\n\n function composeEventHandlers<T>(\n handlers: Array<Solid.JSX.EventHandlerUnion<T, any> | undefined>,\n ) {\n return (event: any) => {\n for (const handler of handlers) {\n callHandler(event, handler)\n }\n }\n }\n\n // Get the active props\n const resolvedActiveProps: () => Omit<Solid.ComponentProps<'a'>, 'style'> & {\n style?: Solid.JSX.CSSProperties\n } = () =>\n isActive() ? (functionalUpdate(local.activeProps as any, {}) ?? {}) : {}\n\n // Get the inactive props\n const resolvedInactiveProps: () => Omit<\n Solid.ComponentProps<'a'>,\n 'style'\n > & { style?: Solid.JSX.CSSProperties } = () =>\n isActive() ? {} : functionalUpdate(local.inactiveProps, {})\n\n const resolvedClassName = () =>\n [local.class, resolvedActiveProps().class, resolvedInactiveProps().class]\n .filter(Boolean)\n .join(' ')\n\n const resolvedStyle = () => ({\n ...local.style,\n ...resolvedActiveProps().style,\n ...resolvedInactiveProps().style,\n })\n\n const href = Solid.createMemo(() => {\n const nextLocation = next()\n const maskedLocation = nextLocation?.maskedLocation\n\n return _options().disabled\n ? undefined\n : maskedLocation\n ? router.history.createHref(maskedLocation.href)\n : router.history.createHref(nextLocation?.href)\n })\n\n return Solid.mergeProps(\n propsSafeToSpread,\n resolvedActiveProps,\n resolvedInactiveProps,\n () => {\n return {\n href: href(),\n ref: mergeRefs(setRef, _options().ref),\n onClick: composeEventHandlers([local.onClick, handleClick]),\n onFocus: composeEventHandlers([local.onFocus, handleFocus]),\n onMouseEnter: composeEventHandlers([local.onMouseEnter, handleEnter]),\n onMouseOver: composeEventHandlers([local.onMouseOver, handleEnter]),\n onMouseLeave: composeEventHandlers([local.onMouseLeave, handleLeave]),\n onMouseOut: composeEventHandlers([local.onMouseOut, handleLeave]),\n onTouchStart: composeEventHandlers([\n local.onTouchStart,\n handleTouchStart,\n ]),\n disabled: !!local.disabled,\n target: local.target,\n ...(Object.keys(resolvedStyle).length && { style: resolvedStyle }),\n ...(resolvedClassName() && { class: resolvedClassName() }),\n ...(local.disabled && {\n role: 'link',\n 'aria-disabled': true,\n }),\n ...(isActive() && { 'data-status': 'active', 'aria-current': 'page' }),\n ...(isTransitioning() && { 'data-transitioning': 'transitioning' }),\n }\n },\n ) as any\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 as any)} _asChild={Comp} />\n}\n\nexport const Link: LinkComponent<'a'> = (props: any) => {\n const [local, rest] = Solid.splitProps(props, ['_asChild'])\n\n const [_, linkProps] = Solid.splitProps(\n useLinkProps(rest as unknown as any),\n ['type', 'children'],\n )\n\n const children = () =>\n typeof rest.children === 'function'\n ? rest.children({\n get isActive() {\n return (linkProps as any)['data-status'] === 'active'\n },\n })\n : rest.children\n\n return (\n <Dynamic component={local._asChild ? local._asChild : 'a'} {...linkProps}>\n {children}\n </Dynamic>\n )\n}\n\nfunction isCtrlEvent(e: MouseEvent) {\n return !!(e.metaKey || e.altKey || e.ctrlKey || e.shiftKey)\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"],"names":["useLinkProps","options","router","useRouter","isTransitioning","setIsTransitioning","Solid","createSignal","hasRenderFetched","local","rest","splitProps","mergeProps","activeProps","class","inactiveProps","_","propsSafeToSpread","type","URL","to","currentSearch","useRouterState","select","s","location","searchStr","from","useMatches","matches","length","fullPath","_options","next","createMemo","buildLocation","preload","reloadDocument","defaultPreload","preloadDelay","defaultPreloadDelay","isActive","activeOptions","exact","testExact","exactPathTest","pathname","basepath","currentPathSplit","removeTrailingSlash","split","nextPathSplit","pathIsFuzzyEqual","every","d","i","includeSearch","searchTest","deepEqual","search","partial","ignoreUndefined","explicitUndefined","includeHash","hash","doPreload","preloadRoute","catch","err","console","warn","preloadWarning","preloadViewportIoCallback","entry","isIntersecting","ref","setRef","useIntersectionObserver","rootMargin","disabled","createEffect","href","handleClick","e","isCtrlEvent","defaultPrevented","target","button","preventDefault","unsub","subscribe","navigate","replace","resetScroll","hashScrollIntoView","startTransition","viewTransition","ignoreBlocker","handleFocus","handleTouchStart","handleEnter","eventTarget","preloadTimeout","setTimeout","handleLeave","clearTimeout","callHandler","event","handler","composeEventHandlers","handlers","resolvedActiveProps","functionalUpdate","resolvedInactiveProps","resolvedClassName","filter","Boolean","join","resolvedStyle","style","nextLocation","maskedLocation","undefined","history","createHref","mergeRefs","onClick","onFocus","onMouseEnter","onMouseOver","onMouseLeave","onMouseOut","onTouchStart","Object","keys","role","createLink","Comp","props","_$createComponent","Link","_$mergeProps","_asChild","linkProps","children","Dynamic","component","metaKey","altKey","ctrlKey","shiftKey","linkOptions"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"link.cjs","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 preloadWarning,\n removeTrailingSlash,\n} from '@tanstack/router-core'\nimport { Dynamic } from 'solid-js/web'\nimport { useRouterState } from './useRouterState'\nimport { useRouter } from './useRouter'\n\nimport { useIntersectionObserver } from './utils'\n\nimport { useMatches } from './Matches'\nimport type {\n AnyRouter,\n Constrain,\n LinkCurrentTargetElement,\n LinkOptions,\n RegisteredRouter,\n RoutePaths,\n} from '@tanstack/router-core'\nimport type {\n ValidateLinkOptions,\n ValidateLinkOptionsArray,\n} from './typePrimitives'\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 let hasRenderFetched = false\n\n const [local, rest] = Solid.splitProps(\n Solid.mergeProps(\n {\n activeProps: () => ({ class: 'active' }),\n inactiveProps: () => ({}),\n },\n options,\n ),\n [\n 'activeProps',\n 'inactiveProps',\n 'activeOptions',\n 'to',\n 'preload',\n 'preloadDelay',\n 'hashScrollIntoView',\n 'replace',\n 'startTransition',\n 'resetScroll',\n 'viewTransition',\n 'target',\n 'disabled',\n 'style',\n 'class',\n 'onClick',\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 ])\n\n // If this link simply reloads the current route,\n // make sure it has a new key so it will trigger a data refresh\n\n // If this `to` is a valid external URL, return\n // null for LinkUtils\n\n const type: Solid.Accessor<'internal' | 'external'> = () => {\n try {\n new URL(`${local.to}`)\n return 'external'\n } catch {}\n return 'internal'\n }\n\n const currentSearch = useRouterState({\n select: (s) => s.location.searchStr,\n })\n\n // when `from` is not supplied, use the leaf route of the current matches as the `from` location\n // so relative routing works as expected\n const from = useMatches({\n select: (matches) => options.from ?? matches[matches.length - 1]?.fullPath,\n })\n\n const _options = () => ({\n ...options,\n from: from(),\n })\n\n const next = Solid.createMemo(() => {\n currentSearch()\n return router.buildLocation(_options() as any)\n })\n\n const preload = Solid.createMemo(() => {\n if (_options().reloadDocument) {\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 = useRouterState({\n select: (s) => {\n if (local.activeOptions?.exact) {\n const testExact = exactPathTest(\n s.location.pathname,\n next().pathname,\n router.basepath,\n )\n if (!testExact) {\n return false\n }\n } else {\n const currentPathSplit = removeTrailingSlash(\n s.location.pathname,\n router.basepath,\n ).split('/')\n const nextPathSplit = removeTrailingSlash(\n next()?.pathname,\n router.basepath,\n )?.split('/')\n\n const pathIsFuzzyEqual = nextPathSplit?.every(\n (d, i) => d === currentPathSplit[i],\n )\n if (!pathIsFuzzyEqual) {\n return false\n }\n }\n\n if (local.activeOptions?.includeSearch ?? true) {\n const searchTest = deepEqual(s.location.search, next().search, {\n partial: !local.activeOptions?.exact,\n ignoreUndefined: !local.activeOptions?.explicitUndefined,\n })\n if (!searchTest) {\n return false\n }\n }\n\n if (local.activeOptions?.includeHash) {\n return s.location.hash === next().hash\n }\n return true\n },\n })\n\n const doPreload = () =>\n router.preloadRoute(_options() as any).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 (type() === 'external') {\n return Solid.mergeProps(\n propsSafeToSpread,\n {\n ref,\n get type() {\n return type()\n },\n get href() {\n return local.to\n },\n },\n Solid.splitProps(local, [\n 'target',\n 'disabled',\n 'style',\n 'class',\n 'onClick',\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 if (\n !local.disabled &&\n !isCtrlEvent(e) &&\n !e.defaultPrevented &&\n (!local.target || local.target === '_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 return 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 // The click handler\n const handleFocus = (_: MouseEvent) => {\n if (local.disabled) return\n if (preload()) {\n doPreload()\n }\n }\n\n const handleTouchStart = handleFocus\n\n const handleEnter = (e: MouseEvent) => {\n if (local.disabled) return\n const eventTarget = (e.target || {}) as LinkCurrentTargetElement\n\n if (preload()) {\n if (eventTarget.preloadTimeout) {\n return\n }\n\n eventTarget.preloadTimeout = setTimeout(() => {\n eventTarget.preloadTimeout = null\n doPreload()\n }, preloadDelay())\n }\n }\n\n const handleLeave = (e: MouseEvent) => {\n if (local.disabled) return\n const eventTarget = (e.target || {}) as LinkCurrentTargetElement\n\n if (eventTarget.preloadTimeout) {\n clearTimeout(eventTarget.preloadTimeout)\n eventTarget.preloadTimeout = null\n }\n }\n\n /** Call a JSX.EventHandlerUnion with the event. */\n function callHandler<T, TEvent extends Event>(\n event: TEvent & { currentTarget: T; target: Element },\n handler: Solid.JSX.EventHandlerUnion<T, TEvent> | undefined,\n ) {\n if (handler) {\n if (typeof handler === 'function') {\n handler(event)\n } else {\n handler[0](handler[1], event)\n }\n }\n\n return event.defaultPrevented\n }\n\n function composeEventHandlers<T>(\n handlers: Array<Solid.JSX.EventHandlerUnion<T, any> | undefined>,\n ) {\n return (event: any) => {\n for (const handler of handlers) {\n callHandler(event, handler)\n }\n }\n }\n\n // Get the active props\n const resolvedActiveProps: () => Omit<Solid.ComponentProps<'a'>, 'style'> & {\n style?: Solid.JSX.CSSProperties\n } = () =>\n isActive() ? (functionalUpdate(local.activeProps as any, {}) ?? {}) : {}\n\n // Get the inactive props\n const resolvedInactiveProps: () => Omit<\n Solid.ComponentProps<'a'>,\n 'style'\n > & { style?: Solid.JSX.CSSProperties } = () =>\n isActive() ? {} : functionalUpdate(local.inactiveProps, {})\n\n const resolvedClassName = () =>\n [local.class, resolvedActiveProps().class, resolvedInactiveProps().class]\n .filter(Boolean)\n .join(' ')\n\n const resolvedStyle = () => ({\n ...local.style,\n ...resolvedActiveProps().style,\n ...resolvedInactiveProps().style,\n })\n\n const href = Solid.createMemo(() => {\n const nextLocation = next()\n const maskedLocation = nextLocation?.maskedLocation\n\n return _options().disabled\n ? undefined\n : maskedLocation\n ? router.history.createHref(maskedLocation.href)\n : router.history.createHref(nextLocation?.href)\n })\n\n return Solid.mergeProps(\n propsSafeToSpread,\n resolvedActiveProps,\n resolvedInactiveProps,\n () => {\n return {\n href: href(),\n ref: mergeRefs(setRef, _options().ref),\n onClick: composeEventHandlers([local.onClick, handleClick]),\n onFocus: composeEventHandlers([local.onFocus, handleFocus]),\n onMouseEnter: composeEventHandlers([local.onMouseEnter, handleEnter]),\n onMouseOver: composeEventHandlers([local.onMouseOver, handleEnter]),\n onMouseLeave: composeEventHandlers([local.onMouseLeave, handleLeave]),\n onMouseOut: composeEventHandlers([local.onMouseOut, handleLeave]),\n onTouchStart: composeEventHandlers([\n local.onTouchStart,\n handleTouchStart,\n ]),\n disabled: !!local.disabled,\n target: local.target,\n ...(Object.keys(resolvedStyle).length && { style: resolvedStyle }),\n ...(resolvedClassName() && { class: resolvedClassName() }),\n ...(local.disabled && {\n role: 'link',\n 'aria-disabled': true,\n }),\n ...(isActive() && { 'data-status': 'active', 'aria-current': 'page' }),\n ...(isTransitioning() && { 'data-transitioning': 'transitioning' }),\n }\n },\n ) as any\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 isTransitioning: false,\n })\n }\n\n return ch satisfies Solid.JSX.Element\n })\n\n return (\n <Dynamic component={local._asChild ? local._asChild : 'a'} {...linkProps}>\n {children()}\n </Dynamic>\n )\n}\n\nfunction isCtrlEvent(e: MouseEvent) {\n return !!(e.metaKey || e.altKey || e.ctrlKey || e.shiftKey)\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"],"names":["useLinkProps","options","router","useRouter","isTransitioning","setIsTransitioning","Solid","createSignal","hasRenderFetched","local","rest","splitProps","mergeProps","activeProps","class","inactiveProps","_","propsSafeToSpread","type","URL","to","currentSearch","useRouterState","select","s","location","searchStr","from","useMatches","matches","length","fullPath","_options","next","createMemo","buildLocation","preload","reloadDocument","defaultPreload","preloadDelay","defaultPreloadDelay","isActive","activeOptions","exact","testExact","exactPathTest","pathname","basepath","currentPathSplit","removeTrailingSlash","split","nextPathSplit","pathIsFuzzyEqual","every","d","i","includeSearch","searchTest","deepEqual","search","partial","ignoreUndefined","explicitUndefined","includeHash","hash","doPreload","preloadRoute","catch","err","console","warn","preloadWarning","preloadViewportIoCallback","entry","isIntersecting","ref","setRef","useIntersectionObserver","rootMargin","disabled","createEffect","href","handleClick","e","isCtrlEvent","defaultPrevented","target","button","preventDefault","unsub","subscribe","navigate","replace","resetScroll","hashScrollIntoView","startTransition","viewTransition","ignoreBlocker","handleFocus","handleTouchStart","handleEnter","eventTarget","preloadTimeout","setTimeout","handleLeave","clearTimeout","callHandler","event","handler","composeEventHandlers","handlers","resolvedActiveProps","functionalUpdate","resolvedInactiveProps","resolvedClassName","filter","Boolean","join","resolvedStyle","style","nextLocation","maskedLocation","undefined","history","createHref","mergeRefs","onClick","onFocus","onMouseEnter","onMouseOver","onMouseLeave","onMouseOut","onTouchStart","Object","keys","role","createLink","Comp","props","_$createComponent","Link","_$mergeProps","_asChild","linkProps","children","ch","Dynamic","component","metaKey","altKey","ctrlKey","shiftKey","linkOptions"],"mappings":"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"}
|
package/dist/cjs/useBlocker.cjs
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
+
const web = require("solid-js/web");
|
|
3
4
|
const Solid = require("solid-js");
|
|
4
5
|
const useRouter = require("./useRouter.cjs");
|
|
5
6
|
function _interopNamespaceDefault(e) {
|
|
@@ -41,31 +42,32 @@ function _resolveBlockerOpts(opts, condition) {
|
|
|
41
42
|
withResolver: false
|
|
42
43
|
};
|
|
43
44
|
}
|
|
44
|
-
const shouldBlock = Boolean(opts.condition ?? true);
|
|
45
|
-
const fn = opts.blockerFn;
|
|
45
|
+
const shouldBlock = Solid__namespace.createMemo(() => Boolean(opts.condition ?? true));
|
|
46
46
|
const _customBlockerFn = async () => {
|
|
47
|
-
if (shouldBlock &&
|
|
48
|
-
return await
|
|
47
|
+
if (shouldBlock() && opts.blockerFn !== void 0) {
|
|
48
|
+
return await opts.blockerFn();
|
|
49
49
|
}
|
|
50
|
-
return shouldBlock;
|
|
50
|
+
return shouldBlock();
|
|
51
51
|
};
|
|
52
52
|
return {
|
|
53
|
-
shouldBlockFn
|
|
54
|
-
|
|
55
|
-
|
|
53
|
+
get shouldBlockFn() {
|
|
54
|
+
return _customBlockerFn;
|
|
55
|
+
},
|
|
56
|
+
get enableBeforeUnload() {
|
|
57
|
+
return shouldBlock();
|
|
58
|
+
},
|
|
59
|
+
get withResolver() {
|
|
60
|
+
return opts.blockerFn === void 0;
|
|
61
|
+
}
|
|
56
62
|
};
|
|
57
63
|
}
|
|
58
64
|
function useBlocker(opts, condition) {
|
|
59
|
-
const {
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
} = _resolveBlockerOpts(opts, condition);
|
|
65
|
+
const props = Solid__namespace.mergeProps({
|
|
66
|
+
enableBeforeUnload: true,
|
|
67
|
+
disabled: false,
|
|
68
|
+
withResolver: false
|
|
69
|
+
}, _resolveBlockerOpts(opts, condition));
|
|
65
70
|
const router = useRouter.useRouter();
|
|
66
|
-
const {
|
|
67
|
-
history
|
|
68
|
-
} = router;
|
|
69
71
|
const [resolver, setResolver] = Solid__namespace.createSignal({
|
|
70
72
|
status: "idle",
|
|
71
73
|
current: void 0,
|
|
@@ -92,12 +94,12 @@ function useBlocker(opts, condition) {
|
|
|
92
94
|
}
|
|
93
95
|
const current = getLocation(blockerFnArgs.currentLocation);
|
|
94
96
|
const next = getLocation(blockerFnArgs.nextLocation);
|
|
95
|
-
const shouldBlock = await shouldBlockFn({
|
|
97
|
+
const shouldBlock = await props.shouldBlockFn({
|
|
96
98
|
action: blockerFnArgs.action,
|
|
97
99
|
current,
|
|
98
100
|
next
|
|
99
101
|
});
|
|
100
|
-
if (!withResolver) {
|
|
102
|
+
if (!props.withResolver) {
|
|
101
103
|
return shouldBlock;
|
|
102
104
|
}
|
|
103
105
|
if (!shouldBlock) {
|
|
@@ -124,41 +126,45 @@ function useBlocker(opts, condition) {
|
|
|
124
126
|
});
|
|
125
127
|
return canNavigateAsync;
|
|
126
128
|
};
|
|
127
|
-
|
|
129
|
+
const disposeBlock = props.disabled ? void 0 : router.history.block({
|
|
128
130
|
blockerFn: blockerFnComposed,
|
|
129
|
-
enableBeforeUnload
|
|
131
|
+
enableBeforeUnload: props.enableBeforeUnload
|
|
130
132
|
});
|
|
133
|
+
Solid__namespace.onCleanup(() => disposeBlock == null ? void 0 : disposeBlock());
|
|
131
134
|
});
|
|
132
135
|
return resolver;
|
|
133
136
|
}
|
|
134
137
|
const _resolvePromptBlockerArgs = (props) => {
|
|
135
138
|
if ("shouldBlockFn" in props) {
|
|
136
|
-
return
|
|
137
|
-
...props
|
|
138
|
-
};
|
|
139
|
+
return props;
|
|
139
140
|
}
|
|
140
|
-
const shouldBlock = Boolean(props.condition ?? true);
|
|
141
|
-
const fn = props.blockerFn;
|
|
141
|
+
const shouldBlock = Solid__namespace.createMemo(() => Boolean(props.condition ?? true));
|
|
142
142
|
const _customBlockerFn = async () => {
|
|
143
|
-
if (shouldBlock &&
|
|
144
|
-
return await
|
|
143
|
+
if (shouldBlock() && props.blockerFn !== void 0) {
|
|
144
|
+
return await props.blockerFn();
|
|
145
145
|
}
|
|
146
146
|
return shouldBlock;
|
|
147
147
|
};
|
|
148
148
|
return {
|
|
149
149
|
shouldBlockFn: _customBlockerFn,
|
|
150
|
-
enableBeforeUnload
|
|
151
|
-
|
|
150
|
+
get enableBeforeUnload() {
|
|
151
|
+
return shouldBlock();
|
|
152
|
+
},
|
|
153
|
+
get withResolver() {
|
|
154
|
+
return props.blockerFn === void 0;
|
|
155
|
+
}
|
|
152
156
|
};
|
|
153
157
|
};
|
|
154
158
|
function Block(opts) {
|
|
155
|
-
const
|
|
156
|
-
children,
|
|
157
|
-
...rest
|
|
158
|
-
} = opts;
|
|
159
|
+
const [propsWithChildren, rest] = Solid__namespace.splitProps(opts, ["children"]);
|
|
159
160
|
const args = _resolvePromptBlockerArgs(rest);
|
|
160
161
|
const resolver = useBlocker(args);
|
|
161
|
-
|
|
162
|
+
const children = Solid__namespace.createMemo(() => {
|
|
163
|
+
const child = propsWithChildren.children;
|
|
164
|
+
if (resolver && typeof child === "function") return child(resolver());
|
|
165
|
+
return child;
|
|
166
|
+
});
|
|
167
|
+
return web.memo(children);
|
|
162
168
|
}
|
|
163
169
|
exports.Block = Block;
|
|
164
170
|
exports.useBlocker = useBlocker;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useBlocker.cjs","sources":["../../src/useBlocker.tsx"],"sourcesContent":["import * as Solid from 'solid-js'\nimport { useRouter } from './useRouter'\nimport type {\n BlockerFnArgs,\n HistoryAction,\n HistoryLocation,\n} from '@tanstack/history'\nimport type { SolidNode } from './route'\nimport type {\n AnyRoute,\n AnyRouter,\n ParseRoute,\n RegisteredRouter,\n} from '@tanstack/router-core'\n\ninterface ShouldBlockFnLocation<\n out TRouteId,\n out TFullPath,\n out TAllParams,\n out TFullSearchSchema,\n> {\n routeId: TRouteId\n fullPath: TFullPath\n pathname: string\n params: TAllParams\n search: TFullSearchSchema\n}\n\ntype AnyShouldBlockFnLocation = ShouldBlockFnLocation<any, any, any, any>\ntype MakeShouldBlockFnLocationUnion<\n TRouter extends AnyRouter = RegisteredRouter,\n TRoute extends AnyRoute = ParseRoute<TRouter['routeTree']>,\n> = TRoute extends any\n ? ShouldBlockFnLocation<\n TRoute['id'],\n TRoute['fullPath'],\n TRoute['types']['allParams'],\n TRoute['types']['fullSearchSchema']\n >\n : never\n\ntype BlockerResolver<TRouter extends AnyRouter = RegisteredRouter> =\n | {\n status: 'blocked'\n current: MakeShouldBlockFnLocationUnion<TRouter>\n next: MakeShouldBlockFnLocationUnion<TRouter>\n action: HistoryAction\n proceed: () => void\n reset: () => void\n }\n | {\n status: 'idle'\n current: undefined\n next: undefined\n action: undefined\n proceed: undefined\n reset: undefined\n }\n\ntype ShouldBlockFnArgs<TRouter extends AnyRouter = RegisteredRouter> = {\n current: MakeShouldBlockFnLocationUnion<TRouter>\n next: MakeShouldBlockFnLocationUnion<TRouter>\n action: HistoryAction\n}\n\nexport type ShouldBlockFn<TRouter extends AnyRouter = RegisteredRouter> = (\n args: ShouldBlockFnArgs<TRouter>,\n) => boolean | Promise<boolean>\nexport type UseBlockerOpts<\n TRouter extends AnyRouter = RegisteredRouter,\n TWithResolver extends boolean = boolean,\n> = {\n shouldBlockFn: ShouldBlockFn<TRouter>\n enableBeforeUnload?: boolean | (() => boolean)\n disabled?: boolean\n withResolver?: TWithResolver\n}\n\ntype LegacyBlockerFn = () => Promise<any> | any\ntype LegacyBlockerOpts = {\n blockerFn?: LegacyBlockerFn\n condition?: boolean | any\n}\n\nfunction _resolveBlockerOpts(\n opts?: UseBlockerOpts | LegacyBlockerOpts | LegacyBlockerFn,\n condition?: boolean | any,\n): UseBlockerOpts {\n if (opts === undefined) {\n return {\n shouldBlockFn: () => true,\n withResolver: false,\n }\n }\n\n if ('shouldBlockFn' in opts) {\n return opts\n }\n\n if (typeof opts === 'function') {\n const shouldBlock = Boolean(condition ?? true)\n\n const _customBlockerFn = async () => {\n if (shouldBlock) return await opts()\n return false\n }\n\n return {\n shouldBlockFn: _customBlockerFn,\n enableBeforeUnload: shouldBlock,\n withResolver: false,\n }\n }\n\n const shouldBlock = Boolean(opts.condition ?? true)\n const fn = opts.blockerFn\n\n const _customBlockerFn = async () => {\n if (shouldBlock && fn !== undefined) {\n return await fn()\n }\n return shouldBlock\n }\n\n return {\n shouldBlockFn: _customBlockerFn,\n enableBeforeUnload: shouldBlock,\n withResolver: fn === undefined,\n }\n}\n\nexport function useBlocker<\n TRouter extends AnyRouter = RegisteredRouter,\n TWithResolver extends boolean = false,\n>(\n opts: UseBlockerOpts<TRouter, TWithResolver>,\n): TWithResolver extends true ? Solid.Accessor<BlockerResolver<TRouter>> : void\n\n/**\n * @deprecated Use the shouldBlockFn property instead\n */\nexport function useBlocker(\n blockerFnOrOpts?: LegacyBlockerOpts,\n): Solid.Accessor<BlockerResolver>\n\n/**\n * @deprecated Use the UseBlockerOpts object syntax instead\n */\nexport function useBlocker(\n blockerFn?: LegacyBlockerFn,\n condition?: boolean | any,\n): Solid.Accessor<BlockerResolver>\n\nexport function useBlocker(\n opts?: UseBlockerOpts | LegacyBlockerOpts | LegacyBlockerFn,\n condition?: boolean | any,\n): Solid.Accessor<BlockerResolver> | void {\n const {\n shouldBlockFn,\n enableBeforeUnload = true,\n disabled = false,\n withResolver = false,\n } = _resolveBlockerOpts(opts, condition)\n\n const router = useRouter()\n const { history } = router\n\n const [resolver, setResolver] = Solid.createSignal<BlockerResolver>({\n status: 'idle',\n current: undefined,\n next: undefined,\n action: undefined,\n proceed: undefined,\n reset: undefined,\n })\n\n Solid.createEffect(() => {\n const blockerFnComposed = async (blockerFnArgs: BlockerFnArgs) => {\n function getLocation(\n location: HistoryLocation,\n ): AnyShouldBlockFnLocation {\n const parsedLocation = router.parseLocation(undefined, location)\n const matchedRoutes = router.getMatchedRoutes(\n parsedLocation.pathname,\n undefined,\n )\n if (matchedRoutes.foundRoute === undefined) {\n throw new Error(`No route found for location ${location.href}`)\n }\n return {\n routeId: matchedRoutes.foundRoute.id,\n fullPath: matchedRoutes.foundRoute.fullPath,\n pathname: parsedLocation.pathname,\n params: matchedRoutes.routeParams,\n search: parsedLocation.search,\n }\n }\n\n const current = getLocation(blockerFnArgs.currentLocation)\n const next = getLocation(blockerFnArgs.nextLocation)\n\n const shouldBlock = await shouldBlockFn({\n action: blockerFnArgs.action,\n current,\n next,\n })\n if (!withResolver) {\n return shouldBlock\n }\n\n if (!shouldBlock) {\n return false\n }\n\n const promise = new Promise<boolean>((resolve) => {\n setResolver({\n status: 'blocked',\n current,\n next,\n action: blockerFnArgs.action,\n proceed: () => resolve(false),\n reset: () => resolve(true),\n })\n })\n\n const canNavigateAsync = await promise\n setResolver({\n status: 'idle',\n current: undefined,\n next: undefined,\n action: undefined,\n proceed: undefined,\n reset: undefined,\n })\n\n return canNavigateAsync\n }\n\n return disabled\n ? undefined\n : history.block({ blockerFn: blockerFnComposed, enableBeforeUnload })\n })\n\n return resolver\n}\n\nconst _resolvePromptBlockerArgs = (\n props: PromptProps | LegacyPromptProps,\n): UseBlockerOpts => {\n if ('shouldBlockFn' in props) {\n return { ...props }\n }\n\n const shouldBlock = Boolean(props.condition ?? true)\n const fn = props.blockerFn\n\n const _customBlockerFn = async () => {\n if (shouldBlock && fn !== undefined) {\n return await fn()\n }\n return shouldBlock\n }\n\n return {\n shouldBlockFn: _customBlockerFn,\n enableBeforeUnload: shouldBlock,\n withResolver: fn === undefined,\n }\n}\n\nexport function Block<\n TRouter extends AnyRouter = RegisteredRouter,\n TWithResolver extends boolean = boolean,\n>(opts: PromptProps<TRouter, TWithResolver>): SolidNode\n\n/**\n * @deprecated Use the UseBlockerOpts property instead\n */\nexport function Block(opts: LegacyPromptProps): SolidNode\n\nexport function Block(opts: PromptProps | LegacyPromptProps): SolidNode {\n const { children, ...rest } = opts\n const args = _resolvePromptBlockerArgs(rest)\n\n const resolver = useBlocker(args)\n return children\n ? typeof children === 'function'\n ? children(resolver as any)\n : children\n : null\n}\n\ntype LegacyPromptProps = {\n blockerFn?: LegacyBlockerFn\n condition?: boolean | any\n children?: SolidNode | ((params: BlockerResolver) => SolidNode)\n}\n\ntype PromptProps<\n TRouter extends AnyRouter = RegisteredRouter,\n TWithResolver extends boolean = boolean,\n TParams = TWithResolver extends true ? BlockerResolver<TRouter> : void,\n> = UseBlockerOpts<TRouter, TWithResolver> & {\n children?: SolidNode | ((params: TParams) => SolidNode)\n}\n"],"names":["_resolveBlockerOpts","opts","condition","undefined","shouldBlockFn","withResolver","shouldBlock","Boolean","_customBlockerFn","enableBeforeUnload","fn","blockerFn","useBlocker","disabled","router","useRouter","history","resolver","setResolver","Solid","createSignal","status","current","next","action","proceed","reset","createEffect","blockerFnComposed","blockerFnArgs","getLocation","location","parsedLocation","parseLocation","matchedRoutes","getMatchedRoutes","pathname","foundRoute","Error","href","routeId","id","fullPath","params","routeParams","search","currentLocation","nextLocation","promise","Promise","resolve","canNavigateAsync","block","_resolvePromptBlockerArgs","props","Block","children","rest","args"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"useBlocker.cjs","sources":["../../src/useBlocker.tsx"],"sourcesContent":["import * as Solid from 'solid-js'\nimport { useRouter } from './useRouter'\nimport type {\n BlockerFnArgs,\n HistoryAction,\n HistoryLocation,\n} from '@tanstack/history'\nimport type { SolidNode } from './route'\nimport type {\n AnyRoute,\n AnyRouter,\n ParseRoute,\n RegisteredRouter,\n} from '@tanstack/router-core'\n\ninterface ShouldBlockFnLocation<\n out TRouteId,\n out TFullPath,\n out TAllParams,\n out TFullSearchSchema,\n> {\n routeId: TRouteId\n fullPath: TFullPath\n pathname: string\n params: TAllParams\n search: TFullSearchSchema\n}\n\ntype AnyShouldBlockFnLocation = ShouldBlockFnLocation<any, any, any, any>\ntype MakeShouldBlockFnLocationUnion<\n TRouter extends AnyRouter = RegisteredRouter,\n TRoute extends AnyRoute = ParseRoute<TRouter['routeTree']>,\n> = TRoute extends any\n ? ShouldBlockFnLocation<\n TRoute['id'],\n TRoute['fullPath'],\n TRoute['types']['allParams'],\n TRoute['types']['fullSearchSchema']\n >\n : never\n\ntype BlockerResolver<TRouter extends AnyRouter = RegisteredRouter> =\n | {\n status: 'blocked'\n current: MakeShouldBlockFnLocationUnion<TRouter>\n next: MakeShouldBlockFnLocationUnion<TRouter>\n action: HistoryAction\n proceed: () => void\n reset: () => void\n }\n | {\n status: 'idle'\n current: undefined\n next: undefined\n action: undefined\n proceed: undefined\n reset: undefined\n }\n\ntype ShouldBlockFnArgs<TRouter extends AnyRouter = RegisteredRouter> = {\n current: MakeShouldBlockFnLocationUnion<TRouter>\n next: MakeShouldBlockFnLocationUnion<TRouter>\n action: HistoryAction\n}\n\nexport type ShouldBlockFn<TRouter extends AnyRouter = RegisteredRouter> = (\n args: ShouldBlockFnArgs<TRouter>,\n) => boolean | Promise<boolean>\nexport type UseBlockerOpts<\n TRouter extends AnyRouter = RegisteredRouter,\n TWithResolver extends boolean = boolean,\n> = {\n shouldBlockFn: ShouldBlockFn<TRouter>\n enableBeforeUnload?: boolean | (() => boolean)\n disabled?: boolean\n withResolver?: TWithResolver\n}\n\ntype LegacyBlockerFn = () => Promise<any> | any\ntype LegacyBlockerOpts = {\n blockerFn?: LegacyBlockerFn\n condition?: boolean | any\n}\n\nfunction _resolveBlockerOpts(\n opts?: UseBlockerOpts | LegacyBlockerOpts | LegacyBlockerFn,\n condition?: boolean | any,\n): UseBlockerOpts {\n if (opts === undefined) {\n return {\n shouldBlockFn: () => true,\n withResolver: false,\n }\n }\n\n if ('shouldBlockFn' in opts) {\n return opts\n }\n\n if (typeof opts === 'function') {\n const shouldBlock = Boolean(condition ?? true)\n\n const _customBlockerFn = async () => {\n if (shouldBlock) return await opts()\n return false\n }\n\n return {\n shouldBlockFn: _customBlockerFn,\n enableBeforeUnload: shouldBlock,\n withResolver: false,\n }\n }\n\n const shouldBlock = Solid.createMemo(() => Boolean(opts.condition ?? true))\n\n const _customBlockerFn = async () => {\n if (shouldBlock() && opts.blockerFn !== undefined) {\n return await opts.blockerFn()\n }\n return shouldBlock()\n }\n\n return {\n get shouldBlockFn() {\n return _customBlockerFn\n },\n get enableBeforeUnload() {\n return shouldBlock()\n },\n get withResolver() {\n return opts.blockerFn === undefined\n },\n }\n}\n\nexport function useBlocker<\n TRouter extends AnyRouter = RegisteredRouter,\n TWithResolver extends boolean = false,\n>(\n opts: UseBlockerOpts<TRouter, TWithResolver>,\n): TWithResolver extends true ? Solid.Accessor<BlockerResolver<TRouter>> : void\n\n/**\n * @deprecated Use the shouldBlockFn property instead\n */\nexport function useBlocker(\n blockerFnOrOpts?: LegacyBlockerOpts,\n): Solid.Accessor<BlockerResolver>\n\n/**\n * @deprecated Use the UseBlockerOpts object syntax instead\n */\nexport function useBlocker(\n blockerFn?: LegacyBlockerFn,\n condition?: boolean | any,\n): Solid.Accessor<BlockerResolver>\n\nexport function useBlocker(\n opts?: UseBlockerOpts | LegacyBlockerOpts | LegacyBlockerFn,\n condition?: boolean | any,\n): Solid.Accessor<BlockerResolver> | void {\n const props = Solid.mergeProps(\n {\n enableBeforeUnload: true,\n disabled: false,\n withResolver: false,\n },\n _resolveBlockerOpts(opts, condition),\n )\n\n const router = useRouter()\n\n const [resolver, setResolver] = Solid.createSignal<BlockerResolver>({\n status: 'idle',\n current: undefined,\n next: undefined,\n action: undefined,\n proceed: undefined,\n reset: undefined,\n })\n\n Solid.createEffect(() => {\n const blockerFnComposed = async (blockerFnArgs: BlockerFnArgs) => {\n function getLocation(\n location: HistoryLocation,\n ): AnyShouldBlockFnLocation {\n const parsedLocation = router.parseLocation(undefined, location)\n const matchedRoutes = router.getMatchedRoutes(\n parsedLocation.pathname,\n undefined,\n )\n if (matchedRoutes.foundRoute === undefined) {\n throw new Error(`No route found for location ${location.href}`)\n }\n return {\n routeId: matchedRoutes.foundRoute.id,\n fullPath: matchedRoutes.foundRoute.fullPath,\n pathname: parsedLocation.pathname,\n params: matchedRoutes.routeParams,\n search: parsedLocation.search,\n }\n }\n\n const current = getLocation(blockerFnArgs.currentLocation)\n const next = getLocation(blockerFnArgs.nextLocation)\n\n const shouldBlock = await props.shouldBlockFn({\n action: blockerFnArgs.action,\n current,\n next,\n })\n if (!props.withResolver) {\n return shouldBlock\n }\n\n if (!shouldBlock) {\n return false\n }\n\n const promise = new Promise<boolean>((resolve) => {\n setResolver({\n status: 'blocked',\n current,\n next,\n action: blockerFnArgs.action,\n proceed: () => resolve(false),\n reset: () => resolve(true),\n })\n })\n\n const canNavigateAsync = await promise\n setResolver({\n status: 'idle',\n current: undefined,\n next: undefined,\n action: undefined,\n proceed: undefined,\n reset: undefined,\n })\n\n return canNavigateAsync\n }\n\n const disposeBlock = props.disabled\n ? undefined\n : router.history.block({\n blockerFn: blockerFnComposed,\n enableBeforeUnload: props.enableBeforeUnload,\n })\n\n Solid.onCleanup(() => disposeBlock?.())\n })\n\n return resolver\n}\n\nconst _resolvePromptBlockerArgs = (\n props: PromptProps | LegacyPromptProps,\n): UseBlockerOpts => {\n if ('shouldBlockFn' in props) {\n return props\n }\n\n const shouldBlock = Solid.createMemo(() => Boolean(props.condition ?? true))\n\n const _customBlockerFn = async () => {\n if (shouldBlock() && props.blockerFn !== undefined) {\n return await props.blockerFn()\n }\n return shouldBlock\n }\n\n return {\n shouldBlockFn: _customBlockerFn,\n get enableBeforeUnload() {\n return shouldBlock()\n },\n get withResolver() {\n return props.blockerFn === undefined\n },\n }\n}\n\nexport function Block<\n TRouter extends AnyRouter = RegisteredRouter,\n TWithResolver extends boolean = boolean,\n>(opts: PromptProps<TRouter, TWithResolver>): SolidNode\n\n/**\n * @deprecated Use the UseBlockerOpts property instead\n */\nexport function Block(opts: LegacyPromptProps): SolidNode\n\nexport function Block(opts: PromptProps | LegacyPromptProps): SolidNode {\n const [propsWithChildren, rest] = Solid.splitProps(opts, ['children'])\n const args = _resolvePromptBlockerArgs(rest)\n\n const resolver = useBlocker(args)\n const children = Solid.createMemo(() => {\n const child = propsWithChildren.children\n if (resolver && typeof child === 'function') return child(resolver())\n return child\n })\n\n return <>{children()}</>\n}\n\ntype LegacyPromptProps = {\n blockerFn?: LegacyBlockerFn\n condition?: boolean | any\n children?: SolidNode | ((params: BlockerResolver) => SolidNode)\n}\n\ntype PromptProps<\n TRouter extends AnyRouter = RegisteredRouter,\n TWithResolver extends boolean = boolean,\n TParams = TWithResolver extends true ? BlockerResolver<TRouter> : void,\n> = UseBlockerOpts<TRouter, TWithResolver> & {\n children?: SolidNode | ((params: TParams) => SolidNode)\n}\n"],"names":["_resolveBlockerOpts","opts","condition","undefined","shouldBlockFn","withResolver","shouldBlock","Boolean","_customBlockerFn","enableBeforeUnload","Solid","createMemo","blockerFn","useBlocker","props","mergeProps","disabled","router","useRouter","resolver","setResolver","createSignal","status","current","next","action","proceed","reset","createEffect","blockerFnComposed","blockerFnArgs","getLocation","location","parsedLocation","parseLocation","matchedRoutes","getMatchedRoutes","pathname","foundRoute","Error","href","routeId","id","fullPath","params","routeParams","search","currentLocation","nextLocation","promise","Promise","resolve","canNavigateAsync","disposeBlock","history","block","onCleanup","_resolvePromptBlockerArgs","Block","propsWithChildren","rest","splitProps","args","children","child","_$memo"],"mappings":"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"}
|
package/dist/esm/Matches.js
CHANGED
|
@@ -90,10 +90,11 @@ function MatchRoute(props) {
|
|
|
90
90
|
children: (_) => {
|
|
91
91
|
const matchRoute = useMatchRoute();
|
|
92
92
|
const params = matchRoute(props)();
|
|
93
|
-
|
|
94
|
-
|
|
93
|
+
const child = props.children;
|
|
94
|
+
if (typeof child === "function") {
|
|
95
|
+
return child(params);
|
|
95
96
|
}
|
|
96
|
-
return params ?
|
|
97
|
+
return params ? child : null;
|
|
97
98
|
}
|
|
98
99
|
});
|
|
99
100
|
}
|
package/dist/esm/Matches.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Matches.js","sources":["../../src/Matches.tsx"],"sourcesContent":["import * as Solid from 'solid-js'\nimport warning from 'tiny-warning'\nimport { CatchBoundary, ErrorComponent } from './CatchBoundary'\nimport { useRouterState } from './useRouterState'\nimport { useRouter } from './useRouter'\nimport { Transitioner } from './Transitioner'\nimport { matchContext } from './matchContext'\nimport { Match } from './Match'\nimport { SafeFragment } from './SafeFragment'\nimport type {\n AnyRouter,\n DeepPartial,\n Expand,\n MakeOptionalPathParams,\n MakeOptionalSearchParams,\n MakeRouteMatchUnion,\n MaskOptions,\n MatchRouteOptions,\n NoInfer,\n RegisteredRouter,\n ResolveRelativePath,\n ResolveRoute,\n RouteByPath,\n RouterState,\n ToSubOptionsProps,\n} from '@tanstack/router-core'\n\ndeclare module '@tanstack/router-core' {\n export interface RouteMatchExtensions {\n meta?: Array<Solid.JSX.IntrinsicElements['meta'] | undefined>\n links?: Array<Solid.JSX.IntrinsicElements['link'] | undefined>\n scripts?: Array<Solid.JSX.IntrinsicElements['script'] | undefined>\n headScripts?: Array<Solid.JSX.IntrinsicElements['script'] | undefined>\n }\n}\n\nexport function Matches() {\n const router = useRouter()\n\n const pendingElement = router.options.defaultPendingComponent ? (\n <router.options.defaultPendingComponent />\n ) : null\n\n // Do not render a root Suspense during SSR or hydrating from SSR\n const ResolvedSuspense =\n router.isServer || (typeof document !== 'undefined' && router.clientSsr)\n ? SafeFragment\n : Solid.Suspense\n\n const inner = (\n <ResolvedSuspense fallback={pendingElement}>\n <Transitioner />\n <MatchesInner />\n </ResolvedSuspense>\n )\n\n return router.options.InnerWrap ? (\n <router.options.InnerWrap>{inner}</router.options.InnerWrap>\n ) : (\n inner\n )\n}\n\nfunction MatchesInner() {\n const matchId = useRouterState({\n select: (s) => {\n return s.matches[0]?.id\n },\n })\n\n const resetKey = useRouterState({\n select: (s) => s.loadedAt,\n })\n\n return (\n <matchContext.Provider value={matchId}>\n <CatchBoundary\n getResetKey={() => resetKey()}\n errorComponent={ErrorComponent}\n onCatch={(error) => {\n warning(\n false,\n `The following error wasn't caught by any route! At the very least, consider setting an 'errorComponent' in your RootRoute!`,\n )\n warning(false, error.message || error.toString())\n }}\n >\n {matchId() ? <Match matchId={matchId()!} /> : null}\n </CatchBoundary>\n </matchContext.Provider>\n )\n}\n\nexport type UseMatchRouteOptions<\n TRouter extends AnyRouter = RegisteredRouter,\n TFrom extends string = string,\n TTo extends string | undefined = undefined,\n TMaskFrom extends string = TFrom,\n TMaskTo extends string = '',\n> = ToSubOptionsProps<TRouter, TFrom, TTo> &\n DeepPartial<MakeOptionalSearchParams<TRouter, TFrom, TTo>> &\n DeepPartial<MakeOptionalPathParams<TRouter, TFrom, TTo>> &\n MaskOptions<TRouter, TMaskFrom, TMaskTo> &\n MatchRouteOptions\n\nexport function useMatchRoute<TRouter extends AnyRouter = RegisteredRouter>() {\n const router = useRouter()\n\n const status = useRouterState({\n select: (s) => s.status,\n })\n\n return <\n const TFrom extends string = string,\n const TTo extends string | undefined = undefined,\n const TMaskFrom extends string = TFrom,\n const TMaskTo extends string = '',\n >(\n opts: UseMatchRouteOptions<TRouter, TFrom, TTo, TMaskFrom, TMaskTo>,\n ): Solid.Accessor<\n false | Expand<ResolveRoute<TRouter, TFrom, TTo>['types']['allParams']>\n > => {\n const { pending, caseSensitive, fuzzy, includeSearch, ...rest } = opts\n\n const matchRoute = Solid.createMemo(() => {\n status()\n return router.matchRoute(rest as any, {\n pending,\n caseSensitive,\n fuzzy,\n includeSearch,\n })\n })\n\n return matchRoute\n }\n}\n\nexport type MakeMatchRouteOptions<\n TRouter extends AnyRouter = RegisteredRouter,\n TFrom extends string = string,\n TTo extends string | undefined = undefined,\n TMaskFrom extends string = TFrom,\n TMaskTo extends string = '',\n> = UseMatchRouteOptions<TRouter, TFrom, TTo, TMaskFrom, TMaskTo> & {\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 | ((\n params?: RouteByPath<\n TRouter['routeTree'],\n ResolveRelativePath<TFrom, NoInfer<TTo>>\n >['types']['allParams'],\n ) => Solid.JSX.Element)\n | Solid.JSX.Element\n}\n\nexport function MatchRoute<\n TRouter extends AnyRouter = RegisteredRouter,\n const TFrom extends string = string,\n const TTo extends string | undefined = undefined,\n const TMaskFrom extends string = TFrom,\n const TMaskTo extends string = '',\n>(props: MakeMatchRouteOptions<TRouter, TFrom, TTo, TMaskFrom, TMaskTo>): any {\n const status = useRouterState({\n select: (s) => s.status,\n })\n\n return (\n <Solid.Show when={status()} keyed>\n {(_) => {\n const matchRoute = useMatchRoute()\n const params = matchRoute(props as any)() as boolean\n\n if (typeof props.children === 'function') {\n return (props.children as any)(params)\n }\n\n return params ? props.children : null\n }}\n </Solid.Show>\n )\n}\n\nexport interface UseMatchesBaseOptions<TRouter extends AnyRouter, TSelected> {\n select?: (matches: Array<MakeRouteMatchUnion<TRouter>>) => TSelected\n}\n\nexport type UseMatchesResult<\n TRouter extends AnyRouter,\n TSelected,\n> = unknown extends TSelected ? Array<MakeRouteMatchUnion<TRouter>> : TSelected\n\nexport function useMatches<\n TRouter extends AnyRouter = RegisteredRouter,\n TSelected = unknown,\n>(\n opts?: UseMatchesBaseOptions<TRouter, TSelected>,\n): Solid.Accessor<UseMatchesResult<TRouter, TSelected>> {\n return useRouterState({\n select: (state: RouterState<TRouter['routeTree']>) => {\n const matches = state.matches\n return opts?.select\n ? opts.select(matches as Array<MakeRouteMatchUnion<TRouter>>)\n : matches\n },\n } as any) as Solid.Accessor<UseMatchesResult<TRouter, TSelected>>\n}\n\nexport function useParentMatches<\n TRouter extends AnyRouter = RegisteredRouter,\n TSelected = unknown,\n>(\n opts?: UseMatchesBaseOptions<TRouter, TSelected>,\n): Solid.Accessor<UseMatchesResult<TRouter, TSelected>> {\n const contextMatchId = Solid.useContext(matchContext)\n\n return useMatches({\n select: (matches: Array<MakeRouteMatchUnion<TRouter>>) => {\n matches = matches.slice(\n 0,\n matches.findIndex((d) => d.id === contextMatchId()),\n )\n return opts?.select ? opts.select(matches) : matches\n },\n } as any)\n}\n\nexport function useChildMatches<\n TRouter extends AnyRouter = RegisteredRouter,\n TSelected = unknown,\n>(\n opts?: UseMatchesBaseOptions<TRouter, TSelected>,\n): Solid.Accessor<UseMatchesResult<TRouter, TSelected>> {\n const contextMatchId = Solid.useContext(matchContext)\n\n return useMatches({\n select: (matches: Array<MakeRouteMatchUnion<TRouter>>) => {\n matches = matches.slice(\n matches.findIndex((d) => d.id === contextMatchId()) + 1,\n )\n return opts?.select ? opts.select(matches) : matches\n },\n } as any)\n}\n"],"names":["Matches","router","useRouter","pendingElement","options","defaultPendingComponent","_$createComponent","ResolvedSuspense","isServer","document","clientSsr","SafeFragment","Solid","Suspense","inner","fallback","children","Transitioner","MatchesInner","InnerWrap","matchId","useRouterState","select","s","matches","id","resetKey","loadedAt","matchContext","Provider","value","CatchBoundary","getResetKey","errorComponent","ErrorComponent","onCatch","error","warning","message","toString","_$memo","Match","useMatchRoute","status","opts","pending","caseSensitive","fuzzy","includeSearch","rest","matchRoute","createMemo","MatchRoute","props","Show","when","keyed","_","params","useMatches","state","useParentMatches","contextMatchId","useContext","slice","findIndex","d","useChildMatches"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Matches.js","sources":["../../src/Matches.tsx"],"sourcesContent":["import * as Solid from 'solid-js'\nimport warning from 'tiny-warning'\nimport { CatchBoundary, ErrorComponent } from './CatchBoundary'\nimport { useRouterState } from './useRouterState'\nimport { useRouter } from './useRouter'\nimport { Transitioner } from './Transitioner'\nimport { matchContext } from './matchContext'\nimport { Match } from './Match'\nimport { SafeFragment } from './SafeFragment'\nimport type {\n AnyRouter,\n DeepPartial,\n Expand,\n MakeOptionalPathParams,\n MakeOptionalSearchParams,\n MakeRouteMatchUnion,\n MaskOptions,\n MatchRouteOptions,\n NoInfer,\n RegisteredRouter,\n ResolveRelativePath,\n ResolveRoute,\n RouteByPath,\n RouterState,\n ToSubOptionsProps,\n} from '@tanstack/router-core'\n\ndeclare module '@tanstack/router-core' {\n export interface RouteMatchExtensions {\n meta?: Array<Solid.JSX.IntrinsicElements['meta'] | undefined>\n links?: Array<Solid.JSX.IntrinsicElements['link'] | undefined>\n scripts?: Array<Solid.JSX.IntrinsicElements['script'] | undefined>\n headScripts?: Array<Solid.JSX.IntrinsicElements['script'] | undefined>\n }\n}\n\nexport function Matches() {\n const router = useRouter()\n\n const pendingElement = router.options.defaultPendingComponent ? (\n <router.options.defaultPendingComponent />\n ) : null\n\n // Do not render a root Suspense during SSR or hydrating from SSR\n const ResolvedSuspense =\n router.isServer || (typeof document !== 'undefined' && router.clientSsr)\n ? SafeFragment\n : Solid.Suspense\n\n const inner = (\n <ResolvedSuspense fallback={pendingElement}>\n <Transitioner />\n <MatchesInner />\n </ResolvedSuspense>\n )\n\n return router.options.InnerWrap ? (\n <router.options.InnerWrap>{inner}</router.options.InnerWrap>\n ) : (\n inner\n )\n}\n\nfunction MatchesInner() {\n const matchId = useRouterState({\n select: (s) => {\n return s.matches[0]?.id\n },\n })\n\n const resetKey = useRouterState({\n select: (s) => s.loadedAt,\n })\n\n return (\n <matchContext.Provider value={matchId}>\n <CatchBoundary\n getResetKey={() => resetKey()}\n errorComponent={ErrorComponent}\n onCatch={(error) => {\n warning(\n false,\n `The following error wasn't caught by any route! At the very least, consider setting an 'errorComponent' in your RootRoute!`,\n )\n warning(false, error.message || error.toString())\n }}\n >\n {matchId() ? <Match matchId={matchId()!} /> : null}\n </CatchBoundary>\n </matchContext.Provider>\n )\n}\n\nexport type UseMatchRouteOptions<\n TRouter extends AnyRouter = RegisteredRouter,\n TFrom extends string = string,\n TTo extends string | undefined = undefined,\n TMaskFrom extends string = TFrom,\n TMaskTo extends string = '',\n> = ToSubOptionsProps<TRouter, TFrom, TTo> &\n DeepPartial<MakeOptionalSearchParams<TRouter, TFrom, TTo>> &\n DeepPartial<MakeOptionalPathParams<TRouter, TFrom, TTo>> &\n MaskOptions<TRouter, TMaskFrom, TMaskTo> &\n MatchRouteOptions\n\nexport function useMatchRoute<TRouter extends AnyRouter = RegisteredRouter>() {\n const router = useRouter()\n\n const status = useRouterState({\n select: (s) => s.status,\n })\n\n return <\n const TFrom extends string = string,\n const TTo extends string | undefined = undefined,\n const TMaskFrom extends string = TFrom,\n const TMaskTo extends string = '',\n >(\n opts: UseMatchRouteOptions<TRouter, TFrom, TTo, TMaskFrom, TMaskTo>,\n ): Solid.Accessor<\n false | Expand<ResolveRoute<TRouter, TFrom, TTo>['types']['allParams']>\n > => {\n const { pending, caseSensitive, fuzzy, includeSearch, ...rest } = opts\n\n const matchRoute = Solid.createMemo(() => {\n status()\n return router.matchRoute(rest as any, {\n pending,\n caseSensitive,\n fuzzy,\n includeSearch,\n })\n })\n\n return matchRoute\n }\n}\n\nexport type MakeMatchRouteOptions<\n TRouter extends AnyRouter = RegisteredRouter,\n TFrom extends string = string,\n TTo extends string | undefined = undefined,\n TMaskFrom extends string = TFrom,\n TMaskTo extends string = '',\n> = UseMatchRouteOptions<TRouter, TFrom, TTo, TMaskFrom, TMaskTo> & {\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 | ((\n params?: RouteByPath<\n TRouter['routeTree'],\n ResolveRelativePath<TFrom, NoInfer<TTo>>\n >['types']['allParams'],\n ) => Solid.JSX.Element)\n | Solid.JSX.Element\n}\n\nexport function MatchRoute<\n TRouter extends AnyRouter = RegisteredRouter,\n const TFrom extends string = string,\n const TTo extends string | undefined = undefined,\n const TMaskFrom extends string = TFrom,\n const TMaskTo extends string = '',\n>(props: MakeMatchRouteOptions<TRouter, TFrom, TTo, TMaskFrom, TMaskTo>): any {\n const status = useRouterState({\n select: (s) => s.status,\n })\n\n return (\n <Solid.Show when={status()} keyed>\n {(_) => {\n const matchRoute = useMatchRoute()\n const params = matchRoute(props as any)() as boolean\n const child = props.children\n if (typeof child === 'function') {\n return (child as any)(params)\n }\n\n return params ? child : null\n }}\n </Solid.Show>\n )\n}\n\nexport interface UseMatchesBaseOptions<TRouter extends AnyRouter, TSelected> {\n select?: (matches: Array<MakeRouteMatchUnion<TRouter>>) => TSelected\n}\n\nexport type UseMatchesResult<\n TRouter extends AnyRouter,\n TSelected,\n> = unknown extends TSelected ? Array<MakeRouteMatchUnion<TRouter>> : TSelected\n\nexport function useMatches<\n TRouter extends AnyRouter = RegisteredRouter,\n TSelected = unknown,\n>(\n opts?: UseMatchesBaseOptions<TRouter, TSelected>,\n): Solid.Accessor<UseMatchesResult<TRouter, TSelected>> {\n return useRouterState({\n select: (state: RouterState<TRouter['routeTree']>) => {\n const matches = state.matches\n return opts?.select\n ? opts.select(matches as Array<MakeRouteMatchUnion<TRouter>>)\n : matches\n },\n } as any) as Solid.Accessor<UseMatchesResult<TRouter, TSelected>>\n}\n\nexport function useParentMatches<\n TRouter extends AnyRouter = RegisteredRouter,\n TSelected = unknown,\n>(\n opts?: UseMatchesBaseOptions<TRouter, TSelected>,\n): Solid.Accessor<UseMatchesResult<TRouter, TSelected>> {\n const contextMatchId = Solid.useContext(matchContext)\n\n return useMatches({\n select: (matches: Array<MakeRouteMatchUnion<TRouter>>) => {\n matches = matches.slice(\n 0,\n matches.findIndex((d) => d.id === contextMatchId()),\n )\n return opts?.select ? opts.select(matches) : matches\n },\n } as any)\n}\n\nexport function useChildMatches<\n TRouter extends AnyRouter = RegisteredRouter,\n TSelected = unknown,\n>(\n opts?: UseMatchesBaseOptions<TRouter, TSelected>,\n): Solid.Accessor<UseMatchesResult<TRouter, TSelected>> {\n const contextMatchId = Solid.useContext(matchContext)\n\n return useMatches({\n select: (matches: Array<MakeRouteMatchUnion<TRouter>>) => {\n matches = matches.slice(\n matches.findIndex((d) => d.id === contextMatchId()) + 1,\n )\n return opts?.select ? opts.select(matches) : matches\n },\n } as any)\n}\n"],"names":["Matches","router","useRouter","pendingElement","options","defaultPendingComponent","_$createComponent","ResolvedSuspense","isServer","document","clientSsr","SafeFragment","Solid","Suspense","inner","fallback","children","Transitioner","MatchesInner","InnerWrap","matchId","useRouterState","select","s","matches","id","resetKey","loadedAt","matchContext","Provider","value","CatchBoundary","getResetKey","errorComponent","ErrorComponent","onCatch","error","warning","message","toString","_$memo","Match","useMatchRoute","status","opts","pending","caseSensitive","fuzzy","includeSearch","rest","matchRoute","createMemo","MatchRoute","props","Show","when","keyed","_","params","child","useMatches","state","useParentMatches","contextMatchId","useContext","slice","findIndex","d","useChildMatches"],"mappings":"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"}
|
package/dist/esm/link.js
CHANGED
|
@@ -15,7 +15,7 @@ function useLinkProps(options) {
|
|
|
15
15
|
class: "active"
|
|
16
16
|
}),
|
|
17
17
|
inactiveProps: () => ({})
|
|
18
|
-
}, options), ["activeProps", "inactiveProps", "activeOptions", "to", "preload", "preloadDelay", "hashScrollIntoView", "replace", "startTransition", "resetScroll", "viewTransition", "
|
|
18
|
+
}, options), ["activeProps", "inactiveProps", "activeOptions", "to", "preload", "preloadDelay", "hashScrollIntoView", "replace", "startTransition", "resetScroll", "viewTransition", "target", "disabled", "style", "class", "onClick", "onFocus", "onMouseEnter", "onMouseLeave", "onMouseOver", "onMouseOut", "onTouchStart", "ignoreBlocker"]);
|
|
19
19
|
const [_, propsSafeToSpread] = Solid.splitProps(rest, ["params", "search", "hash", "state", "mask", "reloadDocument"]);
|
|
20
20
|
const type = () => {
|
|
21
21
|
try {
|
|
@@ -113,7 +113,7 @@ function useLinkProps(options) {
|
|
|
113
113
|
get href() {
|
|
114
114
|
return local.to;
|
|
115
115
|
}
|
|
116
|
-
}, Solid.splitProps(local, ["
|
|
116
|
+
}, Solid.splitProps(local, ["target", "disabled", "style", "class", "onClick", "onFocus", "onMouseEnter", "onMouseLeave", "onMouseOut", "onMouseOver", "onTouchStart"])[0]);
|
|
117
117
|
}
|
|
118
118
|
const handleClick = (e) => {
|
|
119
119
|
if (!local.disabled && !isCtrlEvent(e) && !e.defaultPrevented && (!local.target || local.target === "_self") && e.button === 0) {
|
|
@@ -231,19 +231,28 @@ function createLink(Comp) {
|
|
|
231
231
|
}));
|
|
232
232
|
}
|
|
233
233
|
const Link = (props) => {
|
|
234
|
-
const [local, rest] = Solid.splitProps(props, ["_asChild"]);
|
|
235
|
-
const [_, linkProps] = Solid.splitProps(useLinkProps(rest), ["type"
|
|
236
|
-
const children = () =>
|
|
237
|
-
|
|
238
|
-
|
|
234
|
+
const [local, rest] = Solid.splitProps(props, ["_asChild", "children"]);
|
|
235
|
+
const [_, linkProps] = Solid.splitProps(useLinkProps(rest), ["type"]);
|
|
236
|
+
const children = Solid.createMemo(() => {
|
|
237
|
+
const ch = local.children;
|
|
238
|
+
if (typeof ch === "function") {
|
|
239
|
+
return ch({
|
|
240
|
+
get isActive() {
|
|
241
|
+
return linkProps["data-status"] === "active";
|
|
242
|
+
},
|
|
243
|
+
isTransitioning: false
|
|
244
|
+
});
|
|
239
245
|
}
|
|
240
|
-
|
|
246
|
+
return ch;
|
|
247
|
+
});
|
|
241
248
|
return createComponent(Dynamic, mergeProps({
|
|
242
249
|
get component() {
|
|
243
250
|
return local._asChild ? local._asChild : "a";
|
|
244
251
|
}
|
|
245
252
|
}, linkProps, {
|
|
246
|
-
children
|
|
253
|
+
get children() {
|
|
254
|
+
return children();
|
|
255
|
+
}
|
|
247
256
|
}));
|
|
248
257
|
};
|
|
249
258
|
function isCtrlEvent(e) {
|