UNPKG

@tanstack/solid-router

Version:

Modern and scalable routing for Solid applications

1 lines 12 kB
{"version":3,"file":"Matches.cjs","names":["<OptionalWrapper>\n <Transitioner />\n <MatchesInner />\n <Rendered />\n </OptionalWrapper>","<Transitioner />","<MatchesInner />","<Rendered />","<Solid.Show when={routeId()} keyed>\n {(currentRouteId) => <Match routeId={currentRouteId} />}\n </Solid.Show>","Solid.Show","<Match routeId={currentRouteId} />","routeId={currentRouteId}","<NearestMatchContext value={nearestMatch}>\n {matchContent()}\n </NearestMatchContext>","value={nearestMatch}","<NearestMatchContext value={nearestMatch}>\n <CatchBoundary\n getResetKey={() => router.stores.matches.get()}\n render={matchContent}\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 </NearestMatchContext>","<CatchBoundary\n getResetKey={() => router.stores.matches.get()}\n render={matchContent}\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 />","getResetKey={() => router.stores.matches.get()}","render={matchContent}","errorComponent={ErrorComponent}","{renderedChild()}"],"sources":["../../src/Matches.tsx"],"sourcesContent":["import * as Solid from 'solid-js'\nimport { replaceEqualDeep } from '@tanstack/router-core'\nimport { CatchBoundary, ErrorComponent } from './CatchBoundary'\nimport { useRouter } from './useRouter'\nimport { Rendered, Transitioner } from './Transitioner'\nimport { nearestMatchContext } from './matchContext'\nimport { SafeFragment } from './SafeFragment'\nimport { Match } from './Match'\nimport type {\n AnyRouter,\n DeepPartial,\n Expand,\n MakeOptionalPathParams,\n MakeOptionalSearchParams,\n MakeRouteMatchUnion,\n MaskOptions,\n MatchRouteOptions,\n RegisteredRouter,\n ResolveRoute,\n ToSubOptionsProps,\n} from '@tanstack/router-core'\nimport type { JSX } from '@solidjs/web'\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<JSX.IntrinsicElements['meta'] | undefined>\n links?: Array<JSX.IntrinsicElements['link'] | undefined>\n scripts?: Array<JSX.IntrinsicElements['script'] | undefined>\n styles?: Array<JSX.IntrinsicElements['style'] | undefined>\n headScripts?: Array<JSX.IntrinsicElements['script'] | undefined>\n }\n}\n\nexport function Matches() {\n const router = useRouter()\n\n const OptionalWrapper = router.options.InnerWrap || SafeFragment\n\n return (\n <OptionalWrapper>\n <Transitioner />\n <MatchesInner />\n <Rendered />\n </OptionalWrapper>\n )\n}\n\nfunction MatchesInner() {\n const router = useRouter()\n const routeId = () => router.stores.ids.get()[0]\n const match = () =>\n routeId() ? router.stores.byRoute.get(routeId()!)?.get() : undefined\n const nearestMatch = [routeId, match] as const\n\n const matchContent = () => (\n <Solid.Show when={routeId()} keyed>\n {(currentRouteId) => <Match routeId={currentRouteId} />}\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={() => router.stores.matches.get()}\n render={matchContent}\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 </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.location.get()\n router.stores.resolvedLocation.get()\n router.stores.status.get()\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?: Expand<\n ResolveRoute<TRouter, TFrom, TTo>['types']['allParams']\n >,\n ) => JSX.Element)\n | 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.matches.get() 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 contextRouteId = Solid.useContext(nearestMatchContext)[0 /* route id */]\n\n return useMatches({\n select: (matches: Array<MakeRouteMatchUnion<TRouter>>) => {\n matches = matches.slice(\n 0,\n matches.findIndex((d) => d.routeId === contextRouteId()),\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 contextRouteId = Solid.useContext(nearestMatchContext)[0 /* route id */]\n\n return useMatches({\n select: (matches: Array<MakeRouteMatchUnion<TRouter>>) => {\n matches = matches.slice(\n matches.findIndex((d) => d.routeId === contextRouteId()) + 1,\n )\n return opts?.select ? opts.select(matches) : matches\n },\n } as any)\n}\n"],"mappings":"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"}