UNPKG

@tanstack/solid-router

Version:

Modern and scalable routing for Solid applications

1 lines 13.8 kB
{"version":3,"file":"Matches.cjs","names":["Solid","replaceEqualDeep","rootRouteId","isServer","CatchBoundary","ErrorComponent","useRouter","Transitioner","nearestMatchContext","SafeFragment","Match","AnyRoute","AnyRouter","DeepPartial","Expand","MakeOptionalPathParams","MakeOptionalSearchParams","MakeRouteMatchUnion","MaskOptions","MatchRouteOptions","NoInfer","RegisteredRouter","ResolveRelativePath","ResolveRoute","RouteByPath","ToSubOptionsProps","NearestMatchContext","Component","value","children","RouteMatchExtensions","meta","Array","JSX","IntrinsicElements","links","scripts","styles","headScripts","Matches","router","ResolvedSuspense","options","disableGlobalCatchBoundary","document","ssr","Loading","rootRoute","routesById","PendingComponent","pendingComponent","defaultPendingComponent","OptionalWrapper","InnerWrap","_$createComponent","fallback","MatchesInner","matchId","stores","firstMatchId","state","routeId","undefined","match","getMatchStoreByRouteId","hasPendingMatch","Boolean","pendingRouteIds","resetKey","loadedAt","nearestMatch","hasPending","matchContent","Show","when","getResetKey","errorComponent","onCatch","process","env","NODE_ENV","error","console","warn","message","toString","UseMatchRouteOptions","TFrom","TRouter","TTo","TMaskFrom","TMaskTo","useMatchRoute","opts","Accessor","createMemo","pending","caseSensitive","fuzzy","includeSearch","rest","matchRouteReactivity","matchRoute","MakeMatchRouteOptions","params","Element","MatchRoute","props","renderedChild","matchedParams","child","_$memo","UseMatchesBaseOptions","select","matches","TSelected","UseMatchesResult","useMatches","prev","activeMatchesSnapshot","res","useParentMatches","contextMatchId","useContext","slice","findIndex","d","id","useChildMatches"],"sources":["../../src/Matches.tsx"],"sourcesContent":["import * as Solid from 'solid-js'\nimport { replaceEqualDeep, rootRouteId } from '@tanstack/router-core'\nimport { isServer } from '@tanstack/router-core/isServer'\nimport { CatchBoundary, ErrorComponent } from './CatchBoundary'\nimport { useRouter } from './useRouter'\nimport { Transitioner } from './Transitioner'\nimport { nearestMatchContext } 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 ToSubOptionsProps,\n} from '@tanstack/router-core'\n\nconst NearestMatchContext = nearestMatchContext as unknown as Solid.Component<{\n value: any\n children: any\n}>\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 // When disableGlobalCatchBoundary is true, we must NOT wrap with Solid.Loading\n // because Solid.Loading transforms STATUS_ERROR into STATUS_PENDING, which\n // prevents errors from propagating to an external Errored boundary.\n const ResolvedSuspense =\n router.options.disableGlobalCatchBoundary ||\n (isServer ?? router.isServer) ||\n (typeof document !== 'undefined' && router.ssr)\n ? SafeFragment\n : Solid.Loading\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 = () => router.stores.firstMatchId.state\n const routeId = () => (matchId() ? rootRouteId : undefined)\n const match = () =>\n routeId()\n ? router.stores.getMatchStoreByRouteId(rootRouteId).state\n : undefined\n const hasPendingMatch = () =>\n routeId()\n ? Boolean(router.stores.pendingRouteIds.state[rootRouteId])\n : false\n const resetKey = () => router.stores.loadedAt.state\n const nearestMatch = {\n matchId,\n routeId,\n match,\n hasPending: hasPendingMatch,\n }\n\n const matchContent = () => (\n <Solid.Show when={matchId()}>\n <Match matchId={matchId()!} />\n </Solid.Show>\n )\n\n if (router.options.disableGlobalCatchBoundary) {\n // When disableGlobalCatchBoundary is true, render without any internal\n // error boundary so errors bubble up freely to an external Errored boundary.\n return (\n <NearestMatchContext value={nearestMatch}>\n {matchContent()}\n </NearestMatchContext>\n )\n }\n\n return (\n <NearestMatchContext value={nearestMatch}>\n <CatchBoundary\n getResetKey={() => resetKey()}\n errorComponent={ErrorComponent}\n onCatch={\n process.env.NODE_ENV !== 'production'\n ? (error) => {\n console.warn(\n `Warning: The following error wasn't caught by any route! At the very least, consider setting an 'errorComponent' in your RootRoute!`,\n )\n console.warn(`Warning: ${error.message || error.toString()}`)\n }\n : undefined\n }\n >\n {matchContent()}\n </CatchBoundary>\n </NearestMatchContext>\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 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 return Solid.createMemo(() => {\n const { pending, caseSensitive, fuzzy, includeSearch, ...rest } = opts\n\n router.stores.matchRouteReactivity.state\n return router.matchRoute(rest as any, {\n pending,\n caseSensitive,\n fuzzy,\n includeSearch,\n })\n })\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 matchRoute = useMatchRoute()\n const params = matchRoute(props as any)\n\n const renderedChild = Solid.createMemo(() => {\n const matchedParams = params()\n const child = props.children\n\n if (typeof child === 'function') {\n return (child as any)(matchedParams)\n }\n\n return matchedParams ? child : null\n })\n\n return <>{renderedChild()}</>\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 const router = useRouter<TRouter>()\n return Solid.createMemo((prev: TSelected | undefined) => {\n const matches = router.stores.activeMatchesSnapshot.state as Array<\n MakeRouteMatchUnion<TRouter>\n >\n const res = opts?.select ? opts.select(matches) : matches\n if (prev === undefined) return res\n return replaceEqualDeep(prev, res) as any\n }) 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(nearestMatchContext).matchId\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(nearestMatchContext).matchId\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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"}