UNPKG

@tanstack/solid-router

Version:

Modern and scalable routing for Solid applications

1 lines 12.5 kB
{"version":3,"file":"Matches.cjs","names":["Solid","warning","rootRouteId","isServer","CatchBoundary","ErrorComponent","useRouterState","useRouter","Transitioner","matchContext","SafeFragment","Match","AnyRoute","AnyRouter","DeepPartial","Expand","MakeOptionalPathParams","MakeOptionalSearchParams","MakeRouteMatchUnion","MaskOptions","MatchRouteOptions","NoInfer","RegisteredRouter","ResolveRelativePath","ResolveRoute","RouteByPath","RouterState","ToSubOptionsProps","RouteMatchExtensions","meta","Array","JSX","IntrinsicElements","links","scripts","styles","headScripts","Matches","router","ResolvedSuspense","document","ssr","Suspense","rootRoute","routesById","PendingComponent","options","pendingComponent","defaultPendingComponent","OptionalWrapper","InnerWrap","_$createComponent","children","fallback","MatchesInner","matchId","select","s","matches","id","resetKey","loadedAt","matchComponent","Show","when","Provider","value","_$memo","disableGlobalCatchBoundary","getResetKey","errorComponent","onCatch","process","env","NODE_ENV","error","message","toString","undefined","UseMatchRouteOptions","TFrom","TRouter","TTo","TMaskFrom","TMaskTo","useMatchRoute","status","opts","Accessor","pending","caseSensitive","fuzzy","includeSearch","rest","matchRoute","createMemo","MakeMatchRouteOptions","params","Element","MatchRoute","props","keyed","_","child","UseMatchesBaseOptions","TSelected","UseMatchesResult","useMatches","state","useParentMatches","contextMatchId","useContext","slice","findIndex","d","useChildMatches"],"sources":["../../src/Matches.tsx"],"sourcesContent":["import * as Solid from 'solid-js'\nimport warning from 'tiny-warning'\nimport { rootRouteId } from '@tanstack/router-core'\nimport { isServer } from '@tanstack/router-core/isServer'\nimport { CatchBoundary, ErrorComponent } from './CatchBoundary'\nimport { useRouterState } from './useRouterState'\nimport { useRouter } from './useRouter'\nimport { Transitioner } from './Transitioner'\nimport { matchContext } from './matchContext'\nimport { SafeFragment } from './SafeFragment'\nimport { Match } from './Match'\nimport type {\n AnyRoute,\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 styles?: Array<Solid.JSX.IntrinsicElements['style'] | undefined>\n headScripts?: Array<Solid.JSX.IntrinsicElements['script'] | undefined>\n }\n}\n\nexport function Matches() {\n const router = useRouter()\n\n const ResolvedSuspense =\n (isServer ?? router.isServer) ||\n (typeof document !== 'undefined' && router.ssr)\n ? SafeFragment\n : Solid.Suspense\n\n const rootRoute: () => AnyRoute = () => router.routesById[rootRouteId]\n const PendingComponent =\n rootRoute().options.pendingComponent ??\n router.options.defaultPendingComponent\n\n const OptionalWrapper = router.options.InnerWrap || SafeFragment\n\n return (\n <OptionalWrapper>\n <ResolvedSuspense\n fallback={PendingComponent ? <PendingComponent /> : null}\n >\n <Transitioner />\n <MatchesInner />\n </ResolvedSuspense>\n </OptionalWrapper>\n )\n}\n\nfunction MatchesInner() {\n const router = useRouter()\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 const matchComponent = () => {\n return (\n <Solid.Show when={matchId()}>\n <Match matchId={matchId()!} />\n </Solid.Show>\n )\n }\n\n return (\n <matchContext.Provider value={matchId}>\n {router.options.disableGlobalCatchBoundary ? (\n matchComponent()\n ) : (\n <CatchBoundary\n getResetKey={() => resetKey()}\n errorComponent={ErrorComponent}\n onCatch={\n process.env.NODE_ENV !== 'production'\n ? (error) => {\n warning(\n false,\n `The following error wasn't caught by any route! At the very leas\n t, consider setting an 'errorComponent' in your RootRoute!`,\n )\n warning(false, error.message || error.toString())\n }\n : undefined\n }\n >\n {matchComponent()}\n </CatchBoundary>\n )}\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"],"mappings":"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"}