@tanstack/react-router 1.20.6 → 1.21.1
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 +7 -2
- package/dist/cjs/Matches.cjs.map +1 -1
- package/dist/cjs/index.cjs +0 -5
- package/dist/cjs/index.cjs.map +1 -1
- package/dist/cjs/index.d.cts +0 -1
- package/dist/cjs/not-found.cjs.map +1 -1
- package/dist/cjs/not-found.d.cts +1 -0
- package/dist/cjs/redirects.cjs +2 -1
- package/dist/cjs/redirects.cjs.map +1 -1
- package/dist/cjs/redirects.d.cts +2 -1
- package/dist/cjs/routeInfo.d.cts +1 -1
- package/dist/cjs/useParams.cjs +4 -7
- package/dist/cjs/useParams.cjs.map +1 -1
- package/dist/esm/Matches.js +7 -2
- package/dist/esm/Matches.js.map +1 -1
- package/dist/esm/index.d.ts +0 -1
- package/dist/esm/index.js +0 -5
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/not-found.d.ts +1 -0
- package/dist/esm/not-found.js.map +1 -1
- package/dist/esm/redirects.d.ts +2 -1
- package/dist/esm/redirects.js +2 -1
- package/dist/esm/redirects.js.map +1 -1
- package/dist/esm/routeInfo.d.ts +1 -1
- package/dist/esm/useParams.js +5 -8
- package/dist/esm/useParams.js.map +1 -1
- package/package.json +2 -2
- package/src/Matches.tsx +8 -2
- package/src/index.tsx +0 -1
- package/src/not-found.tsx +1 -0
- package/src/redirects.ts +4 -2
- package/src/routeInfo.ts +1 -2
- package/src/useParams.tsx +6 -7
- package/dist/cjs/createServerFn.cjs +0 -40
- package/dist/cjs/createServerFn.cjs.map +0 -1
- package/dist/cjs/createServerFn.d.cts +0 -44
- package/dist/esm/createServerFn.d.ts +0 -44
- package/dist/esm/createServerFn.js +0 -40
- package/dist/esm/createServerFn.js.map +0 -1
- package/src/createServerFn.ts +0 -107
package/dist/cjs/Matches.cjs
CHANGED
|
@@ -277,12 +277,17 @@ function useMatch(opts) {
|
|
|
277
277
|
const nearestMatchRouteId = (_a = getRenderedMatches(router.state).find(
|
|
278
278
|
(d) => d.id === nearestMatchId
|
|
279
279
|
)) == null ? void 0 : _a.routeId;
|
|
280
|
+
const strict = (opts == null ? void 0 : opts.strict) ?? true;
|
|
280
281
|
const matchRouteId = (() => {
|
|
281
282
|
const matches = getRenderedMatches(router.state);
|
|
282
283
|
const match = (opts == null ? void 0 : opts.from) ? matches.find((d) => d.routeId === (opts == null ? void 0 : opts.from)) : matches.find((d) => d.id === nearestMatchId);
|
|
283
|
-
return match.routeId;
|
|
284
|
+
return match == null ? void 0 : match.routeId;
|
|
284
285
|
})();
|
|
285
|
-
if (
|
|
286
|
+
if (strict) {
|
|
287
|
+
invariant(
|
|
288
|
+
matchRouteId,
|
|
289
|
+
`No match found for route '${opts == null ? void 0 : opts.from}' while rendering the '${nearestMatchRouteId}' route. Did you mean to pass '{ strict: false }' instead?`
|
|
290
|
+
);
|
|
286
291
|
invariant(
|
|
287
292
|
nearestMatchRouteId == matchRouteId,
|
|
288
293
|
`useMatch("${matchRouteId}") is being called in a component that is meant to render the '${nearestMatchRouteId}' route. Did you mean to 'useMatch("${matchRouteId}", { strict: false })' or 'useRoute("${matchRouteId}")' instead?`
|
package/dist/cjs/Matches.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Matches.cjs","sources":["../../src/Matches.tsx"],"sourcesContent":["import * as React from 'react'\nimport invariant from 'tiny-invariant'\nimport warning from 'tiny-warning'\nimport { CatchBoundary, ErrorComponent } from './CatchBoundary'\nimport { useRouterState } from './useRouterState'\nimport { useRouter } from './useRouter'\nimport { ResolveRelativePath, ToOptions } from './link'\nimport {\n AnyRoute,\n ReactNode,\n RootSearchSchema,\n StaticDataRouteOption,\n} from './route'\nimport {\n AllParams,\n FullSearchSchema,\n ParseRoute,\n RouteById,\n RouteByPath,\n RouteIds,\n RoutePaths,\n} from './routeInfo'\nimport { AnyRouter, RegisteredRouter, RouterState } from './router'\nimport {\n DeepPartial,\n Expand,\n NoInfer,\n StrictOrFrom,\n isServer,\n pick,\n} from './utils'\nimport { CatchNotFound, DefaultGlobalNotFound, isNotFound } from './not-found'\nimport { isRedirect } from './redirects'\n\nexport const matchContext = React.createContext<string | undefined>(undefined)\n\nexport interface RouteMatch<\n TRouteTree extends AnyRoute = RegisteredRouter['routeTree'],\n TRouteId extends RouteIds<TRouteTree> = ParseRoute<TRouteTree>['id'],\n TReturnIntersection extends boolean = false,\n> {\n id: string\n routeId: TRouteId\n pathname: string\n params: TReturnIntersection extends false\n ? RouteById<TRouteTree, TRouteId>['types']['allParams']\n : Expand<Partial<AllParams<TRouteTree>>>\n status: 'pending' | 'success' | 'error' | 'redirected' | 'notFound'\n isFetching: boolean\n showPending: boolean\n error: unknown\n paramsError: unknown\n searchError: unknown\n updatedAt: number\n loadPromise?: Promise<void>\n loaderData?: RouteById<TRouteTree, TRouteId>['types']['loaderData']\n routeContext: RouteById<TRouteTree, TRouteId>['types']['routeContext']\n context: RouteById<TRouteTree, TRouteId>['types']['allContext']\n search: TReturnIntersection extends false\n ? Exclude<\n RouteById<TRouteTree, TRouteId>['types']['fullSearchSchema'],\n RootSearchSchema\n >\n : Expand<\n Partial<Omit<FullSearchSchema<TRouteTree>, keyof RootSearchSchema>>\n >\n fetchCount: number\n abortController: AbortController\n cause: 'preload' | 'enter' | 'stay'\n loaderDeps: RouteById<TRouteTree, TRouteId>['types']['loaderDeps']\n preload: boolean\n invalid: boolean\n pendingPromise?: Promise<void>\n meta?: JSX.IntrinsicElements['meta'][]\n links?: JSX.IntrinsicElements['link'][]\n scripts?: JSX.IntrinsicElements['script'][]\n headers?: Record<string, string>\n globalNotFound?: boolean\n staticData: StaticDataRouteOption\n}\n\nexport type AnyRouteMatch = RouteMatch<any, any>\n\nexport function Matches() {\n const router = useRouter()\n const matchId = useRouterState({\n select: (s) => {\n return getRenderedMatches(s)[0]?.id\n },\n })\n\n return (\n <matchContext.Provider value={matchId}>\n <CatchBoundary\n getResetKey={() => router.state.resolvedLocation.state?.key!}\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 console.error(error)\n }}\n >\n {matchId ? <Match matchId={matchId} /> : null}\n </CatchBoundary>\n </matchContext.Provider>\n )\n}\n\nfunction SafeFragment(props: any) {\n return <>{props.children}</>\n}\n\nexport function Match({ matchId }: { matchId: string }) {\n const router = useRouter()\n const routeId = useRouterState({\n select: (s) =>\n getRenderedMatches(s).find((d) => d.id === matchId)?.routeId as string,\n })\n\n invariant(\n routeId,\n `Could not find routeId for matchId \"${matchId}\". Please file an issue!`,\n )\n\n const route = router.routesById[routeId]!\n\n const PendingComponent = (route.options.pendingComponent ??\n router.options.defaultPendingComponent) as any\n\n const pendingElement = PendingComponent ? <PendingComponent /> : null\n\n const routeErrorComponent =\n route.options.errorComponent ??\n router.options.defaultErrorComponent ??\n ErrorComponent\n\n const routeNotFoundComponent = route.isRoot\n ? // If it's the root route, use the globalNotFound option, with fallback to the notFoundRoute's component\n route.options.notFoundComponent ??\n router.options.notFoundRoute?.options.component\n : route.options.notFoundComponent\n\n const ResolvedSuspenseBoundary =\n route.options.wrapInSuspense ??\n PendingComponent ??\n route.options.component?.preload ??\n route.options.pendingComponent?.preload ??\n (route.options.errorComponent as any)?.preload\n ? React.Suspense\n : SafeFragment\n\n const ResolvedCatchBoundary = routeErrorComponent\n ? CatchBoundary\n : SafeFragment\n\n const ResolvedNotFoundBoundary = routeNotFoundComponent\n ? CatchNotFound\n : SafeFragment\n\n return (\n <matchContext.Provider value={matchId}>\n <ResolvedSuspenseBoundary fallback={pendingElement}>\n <ResolvedCatchBoundary\n getResetKey={() => router.state.resolvedLocation.state?.key!}\n errorComponent={routeErrorComponent}\n onCatch={(error) => {\n // Forward not found errors (we don't want to show the error component for these)\n if (isNotFound(error)) throw error\n warning(false, `Error in route match: ${matchId}`)\n console.error(error)\n }}\n >\n <ResolvedNotFoundBoundary\n fallback={(error) => {\n // If the current not found handler doesn't exist or it has a\n // route ID which doesn't match the current route, rethrow the error\n if (\n !routeNotFoundComponent ||\n (error.routeId && error.routeId !== routeId) ||\n (!error.routeId && !route.isRoot)\n )\n throw error\n\n return React.createElement(routeNotFoundComponent, error as any)\n }}\n >\n <MatchInner matchId={matchId!} pendingElement={pendingElement} />\n </ResolvedNotFoundBoundary>\n </ResolvedCatchBoundary>\n </ResolvedSuspenseBoundary>\n </matchContext.Provider>\n )\n}\n\nfunction MatchInner({\n matchId,\n pendingElement,\n}: {\n matchId: string\n pendingElement: any\n}): any {\n const router = useRouter()\n const routeId = useRouterState({\n select: (s) =>\n getRenderedMatches(s).find((d) => d.id === matchId)?.routeId as string,\n })\n\n const route = router.routesById[routeId]!\n\n const match = useRouterState({\n select: (s) =>\n pick(getRenderedMatches(s).find((d) => d.id === matchId)!, [\n 'status',\n 'error',\n 'showPending',\n 'loadPromise',\n ]),\n })\n\n const RouteErrorComponent =\n (route.options.errorComponent ?? router.options.defaultErrorComponent) ||\n ErrorComponent\n\n if (match.status === 'notFound') {\n let error: unknown\n if (isServerSideError(match.error)) {\n const deserializeError =\n router.options.errorSerializer?.deserialize ?? defaultDeserializeError\n\n error = deserializeError(match.error.data)\n } else {\n error = match.error\n }\n\n invariant(isNotFound(error), 'Expected a notFound error')\n\n return renderRouteNotFound(router, route, error)\n }\n\n if (match.status === 'redirected') {\n // Redirects should be handled by the router transition. If we happen to\n // encounter a redirect here, it's a bug. Let's warn, but render nothing.\n invariant(isRedirect(match.error), 'Expected a redirect error')\n\n warning(\n false,\n 'Tried to render a redirected route match! This is a weird circumstance, please file an issue!',\n )\n\n return null\n }\n\n if (match.status === 'error') {\n // If we're on the server, we need to use React's new and super\n // wonky api for throwing errors from a server side render inside\n // of a suspense boundary. This is the only way to get\n // renderToPipeableStream to not hang indefinitely.\n // We'll serialize the error and rethrow it on the client.\n if (isServer) {\n return (\n <RouteErrorComponent\n error={match.error}\n info={{\n componentStack: '',\n }}\n />\n )\n }\n\n if (isServerSideError(match.error)) {\n const deserializeError =\n router.options.errorSerializer?.deserialize ?? defaultDeserializeError\n throw deserializeError(match.error.data)\n } else {\n throw match.error\n }\n }\n\n if (match.status === 'pending') {\n if (match.showPending) {\n return pendingElement\n }\n throw match.loadPromise\n }\n\n if (match.status === 'success') {\n let Comp = route.options.component ?? router.options.defaultComponent\n\n if (Comp) {\n return <Comp />\n }\n\n return <Outlet />\n }\n\n invariant(\n false,\n 'Idle routeMatch status encountered during rendering! You should never see this. File an issue!',\n )\n}\n\nexport const Outlet = React.memo(function Outlet() {\n const router = useRouter()\n const matchId = React.useContext(matchContext)\n const routeId = useRouterState({\n select: (s) =>\n getRenderedMatches(s).find((d) => d.id === matchId)?.routeId as string,\n })\n\n const route = router.routesById[routeId]!\n\n const { parentGlobalNotFound } = useRouterState({\n select: (s) => {\n const matches = getRenderedMatches(s)\n const parentMatch = matches.find((d) => d.id === matchId)\n invariant(\n parentMatch,\n `Could not find parent match for matchId \"${matchId}\"`,\n )\n return {\n parentGlobalNotFound: parentMatch.globalNotFound,\n }\n },\n })\n\n const childMatchId = useRouterState({\n select: (s) => {\n const matches = getRenderedMatches(s)\n const index = matches.findIndex((d) => d.id === matchId)\n return matches[index + 1]?.id\n },\n })\n\n if (parentGlobalNotFound) {\n return renderRouteNotFound(router, route, undefined)\n }\n\n if (!childMatchId) {\n return null\n }\n\n return <Match matchId={childMatchId} />\n})\n\nfunction renderRouteNotFound(router: AnyRouter, route: AnyRoute, data: any) {\n if (!route.options.notFoundComponent) {\n if (router.options.defaultNotFoundComponent) {\n return <router.options.defaultNotFoundComponent data={data} />\n }\n\n if (process.env.NODE_ENV === 'development') {\n warning(\n route.options.notFoundComponent,\n `A notFoundError was encountered on the route with ID \"${route.id}\", but a notFoundComponent option was not configured, nor was a router level defaultNotFoundComponent configured. Consider configuring at least one of these to avoid TanStack Router's overly generic defaultNotFoundComponent (<div>Not Found<div>)`,\n )\n }\n\n return <DefaultGlobalNotFound />\n }\n\n return <route.options.notFoundComponent data={data} />\n}\n\nexport interface MatchRouteOptions {\n pending?: boolean\n caseSensitive?: boolean\n includeSearch?: boolean\n fuzzy?: boolean\n}\n\nexport type UseMatchRouteOptions<\n TRouteTree extends AnyRoute = RegisteredRouter['routeTree'],\n TFrom extends RoutePaths<TRouteTree> = RoutePaths<TRouteTree>,\n TTo extends string = '',\n TMaskFrom extends RoutePaths<TRouteTree> = TFrom,\n TMaskTo extends string = '',\n Options extends ToOptions<\n TRouteTree,\n TFrom,\n TTo,\n TMaskFrom,\n TMaskTo\n > = ToOptions<TRouteTree, TFrom, TTo, TMaskFrom, TMaskTo>,\n RelaxedOptions = Omit<Options, 'search' | 'params'> &\n DeepPartial<Pick<Options, 'search' | 'params'>>,\n> = RelaxedOptions & MatchRouteOptions\n\nexport function useMatchRoute<\n TRouteTree extends AnyRoute = RegisteredRouter['routeTree'],\n>() {\n useRouterState({ select: (s) => [s.location, s.resolvedLocation] })\n const { matchRoute } = useRouter()\n\n return React.useCallback(\n <\n TFrom extends RoutePaths<TRouteTree> = RoutePaths<TRouteTree>,\n TTo extends string = '',\n TMaskFrom extends RoutePaths<TRouteTree> = TFrom,\n TMaskTo extends string = '',\n TResolved extends string = ResolveRelativePath<TFrom, NoInfer<TTo>>,\n >(\n opts: UseMatchRouteOptions<TRouteTree, TFrom, TTo, TMaskFrom, TMaskTo>,\n ): false | RouteById<TRouteTree, TResolved>['types']['allParams'] => {\n const { pending, caseSensitive, fuzzy, includeSearch, ...rest } = opts\n\n return matchRoute(rest as any, {\n pending,\n caseSensitive,\n fuzzy,\n includeSearch,\n })\n },\n [],\n )\n}\n\nexport type MakeMatchRouteOptions<\n TRouteTree extends AnyRoute = RegisteredRouter['routeTree'],\n TFrom extends RoutePaths<TRouteTree> = RoutePaths<TRouteTree>,\n TTo extends string = '',\n TMaskFrom extends RoutePaths<TRouteTree> = TFrom,\n TMaskTo extends string = '',\n> = UseMatchRouteOptions<TRouteTree, 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 TRouteTree,\n ResolveRelativePath<TFrom, NoInfer<TTo>>\n >['types']['allParams'],\n ) => ReactNode)\n | React.ReactNode\n}\n\nexport function MatchRoute<\n TRouteTree extends AnyRoute = RegisteredRouter['routeTree'],\n TFrom extends RoutePaths<TRouteTree> = RoutePaths<TRouteTree>,\n TTo extends string = '',\n TMaskFrom extends RoutePaths<TRouteTree> = TFrom,\n TMaskTo extends string = '',\n>(\n props: MakeMatchRouteOptions<TRouteTree, TFrom, TTo, TMaskFrom, TMaskTo>,\n): any {\n const matchRoute = useMatchRoute()\n const params = matchRoute(props as any)\n\n if (typeof props.children === 'function') {\n return (props.children as any)(params)\n }\n\n return !!params ? props.children : null\n}\n\nexport function getRenderedMatches<\n TRouteTree extends AnyRoute = RegisteredRouter['routeTree'],\n>(state: RouterState<TRouteTree>) {\n return state.pendingMatches?.some((d) => d.showPending)\n ? state.pendingMatches\n : state.matches\n}\n\nexport function useMatch<\n TRouteTree extends AnyRoute = RegisteredRouter['routeTree'],\n TFrom extends RouteIds<TRouteTree> = RouteIds<TRouteTree>,\n TReturnIntersection extends boolean = false,\n TRouteMatchState = RouteMatch<TRouteTree, TFrom, TReturnIntersection>,\n TSelected = TRouteMatchState,\n>(\n opts: StrictOrFrom<TFrom, TReturnIntersection> & {\n select?: (match: TRouteMatchState) => TSelected\n },\n): TSelected {\n const router = useRouter()\n const nearestMatchId = React.useContext(matchContext)\n\n const nearestMatchRouteId = getRenderedMatches(router.state).find(\n (d) => d.id === nearestMatchId,\n )?.routeId\n\n const matchRouteId = (() => {\n const matches = getRenderedMatches(router.state)\n const match = opts?.from\n ? matches.find((d) => d.routeId === opts?.from)\n : matches.find((d) => d.id === nearestMatchId)\n return match!.routeId\n })()\n\n if (opts?.strict ?? true) {\n invariant(\n nearestMatchRouteId == matchRouteId,\n `useMatch(\"${\n matchRouteId as string\n }\") is being called in a component that is meant to render the '${nearestMatchRouteId}' route. Did you mean to 'useMatch(\"${\n matchRouteId as string\n }\", { strict: false })' or 'useRoute(\"${\n matchRouteId as string\n }\")' instead?`,\n )\n }\n\n const matchSelection = useRouterState({\n select: (state) => {\n const match = getRenderedMatches(state).find((d) =>\n opts?.from ? opts?.from === d.routeId : d.id === nearestMatchId,\n )\n\n invariant(\n match,\n `Could not find ${\n opts?.from\n ? `an active match from \"${opts.from}\"`\n : 'a nearest match!'\n }`,\n )\n\n return opts?.select ? opts.select(match as any) : match\n },\n })\n\n return matchSelection as any\n}\n\nexport function useMatches<\n TRouteTree extends AnyRoute = RegisteredRouter['routeTree'],\n TRouteId extends RouteIds<TRouteTree> = ParseRoute<TRouteTree>['id'],\n TReturnIntersection extends boolean = false,\n TRouteMatch = RouteMatch<TRouteTree, TRouteId, TReturnIntersection>,\n T = TRouteMatch[],\n>(opts?: {\n select?: (matches: TRouteMatch[]) => T\n experimental_returnIntersection?: TReturnIntersection\n}): T {\n return useRouterState({\n select: (state) => {\n const matches = getRenderedMatches(state)\n return opts?.select\n ? opts.select(matches as TRouteMatch[])\n : (matches as T)\n },\n })\n}\n\nexport function useParentMatches<\n TRouteTree extends AnyRoute = RegisteredRouter['routeTree'],\n TRouteId extends RouteIds<TRouteTree> = ParseRoute<TRouteTree>['id'],\n TReturnIntersection extends boolean = false,\n TRouteMatch = RouteMatch<TRouteTree, TRouteId, TReturnIntersection>,\n T = TRouteMatch[],\n>(opts?: {\n select?: (matches: TRouteMatch[]) => T\n experimental_returnIntersection?: TReturnIntersection\n}): T {\n const contextMatchId = React.useContext(matchContext)\n\n return useMatches({\n select: (matches) => {\n matches = matches.slice(\n 0,\n matches.findIndex((d) => d.id === contextMatchId),\n )\n return opts?.select\n ? opts.select(matches as TRouteMatch[])\n : (matches as T)\n },\n })\n}\n\nexport function useChildMatches<\n TRouteTree extends AnyRoute = RegisteredRouter['routeTree'],\n TRouteId extends RouteIds<TRouteTree> = ParseRoute<TRouteTree>['id'],\n TReturnIntersection extends boolean = false,\n TRouteMatch = RouteMatch<TRouteTree, TRouteId, TReturnIntersection>,\n T = TRouteMatch[],\n>(opts?: {\n select?: (matches: TRouteMatch[]) => T\n experimental_returnIntersection?: TReturnIntersection\n}): T {\n const contextMatchId = React.useContext(matchContext)\n\n return useMatches({\n select: (matches) => {\n matches = matches.slice(\n matches.findIndex((d) => d.id === contextMatchId) + 1,\n )\n return opts?.select\n ? opts.select(matches as TRouteMatch[])\n : (matches as T)\n },\n })\n}\n\nexport function useLoaderDeps<\n TRouteTree extends AnyRoute = RegisteredRouter['routeTree'],\n TFrom extends RouteIds<TRouteTree> = RouteIds<TRouteTree>,\n TRouteMatch extends RouteMatch<TRouteTree, TFrom> = RouteMatch<\n TRouteTree,\n TFrom\n >,\n TSelected = Required<TRouteMatch>['loaderDeps'],\n>(\n opts: StrictOrFrom<TFrom> & {\n select?: (match: TRouteMatch) => TSelected\n },\n): TSelected {\n return useMatch({\n ...opts,\n select: (s) => {\n return typeof opts.select === 'function'\n ? opts.select(s?.loaderDeps)\n : s?.loaderDeps\n },\n })\n}\n\nexport function useLoaderData<\n TRouteTree extends AnyRoute = RegisteredRouter['routeTree'],\n TFrom extends RouteIds<TRouteTree> = RouteIds<TRouteTree>,\n TRouteMatch extends RouteMatch<TRouteTree, TFrom> = RouteMatch<\n TRouteTree,\n TFrom\n >,\n TSelected = Required<TRouteMatch>['loaderData'],\n>(\n opts: StrictOrFrom<TFrom> & {\n select?: (match: TRouteMatch) => TSelected\n },\n): TSelected {\n return useMatch({\n ...opts,\n select: (s) => {\n return typeof opts.select === 'function'\n ? opts.select(s?.loaderData)\n : s?.loaderData\n },\n })\n}\n\nexport function isServerSideError(error: unknown): error is {\n __isServerError: true\n data: Record<string, any>\n} {\n if (!(typeof error === 'object' && error && 'data' in error)) return false\n if (!('__isServerError' in error && error.__isServerError)) return false\n if (!(typeof error.data === 'object' && error.data)) return false\n\n return error.__isServerError === true\n}\n\nexport function defaultDeserializeError(serializedData: Record<string, any>) {\n if ('name' in serializedData && 'message' in serializedData) {\n const error = new Error(serializedData.message)\n error.name = serializedData.name\n return error\n }\n\n return serializedData.data\n}\n"],"names":["React","useRouter","useRouterState","jsx","CatchBoundary","ErrorComponent","Fragment","_a","CatchNotFound","isNotFound","pick","isRedirect","isServer","Outlet","DefaultGlobalNotFound"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Matches.cjs","sources":["../../src/Matches.tsx"],"sourcesContent":["import * as React from 'react'\nimport invariant from 'tiny-invariant'\nimport warning from 'tiny-warning'\nimport { CatchBoundary, ErrorComponent } from './CatchBoundary'\nimport { useRouterState } from './useRouterState'\nimport { useRouter } from './useRouter'\nimport { ResolveRelativePath, ToOptions } from './link'\nimport {\n AnyRoute,\n ReactNode,\n RootSearchSchema,\n StaticDataRouteOption,\n} from './route'\nimport {\n AllParams,\n FullSearchSchema,\n ParseRoute,\n RouteById,\n RouteByPath,\n RouteIds,\n RoutePaths,\n} from './routeInfo'\nimport { AnyRouter, RegisteredRouter, RouterState } from './router'\nimport {\n DeepPartial,\n Expand,\n NoInfer,\n StrictOrFrom,\n isServer,\n pick,\n} from './utils'\nimport { CatchNotFound, DefaultGlobalNotFound, isNotFound } from './not-found'\nimport { isRedirect } from './redirects'\n\nexport const matchContext = React.createContext<string | undefined>(undefined)\n\nexport interface RouteMatch<\n TRouteTree extends AnyRoute = RegisteredRouter['routeTree'],\n TRouteId extends RouteIds<TRouteTree> = ParseRoute<TRouteTree>['id'],\n TReturnIntersection extends boolean = false,\n> {\n id: string\n routeId: TRouteId\n pathname: string\n params: TReturnIntersection extends false\n ? RouteById<TRouteTree, TRouteId>['types']['allParams']\n : Expand<Partial<AllParams<TRouteTree>>>\n status: 'pending' | 'success' | 'error' | 'redirected' | 'notFound'\n isFetching: boolean\n showPending: boolean\n error: unknown\n paramsError: unknown\n searchError: unknown\n updatedAt: number\n loadPromise?: Promise<void>\n loaderData?: RouteById<TRouteTree, TRouteId>['types']['loaderData']\n routeContext: RouteById<TRouteTree, TRouteId>['types']['routeContext']\n context: RouteById<TRouteTree, TRouteId>['types']['allContext']\n search: TReturnIntersection extends false\n ? Exclude<\n RouteById<TRouteTree, TRouteId>['types']['fullSearchSchema'],\n RootSearchSchema\n >\n : Expand<\n Partial<Omit<FullSearchSchema<TRouteTree>, keyof RootSearchSchema>>\n >\n fetchCount: number\n abortController: AbortController\n cause: 'preload' | 'enter' | 'stay'\n loaderDeps: RouteById<TRouteTree, TRouteId>['types']['loaderDeps']\n preload: boolean\n invalid: boolean\n pendingPromise?: Promise<void>\n meta?: JSX.IntrinsicElements['meta'][]\n links?: JSX.IntrinsicElements['link'][]\n scripts?: JSX.IntrinsicElements['script'][]\n headers?: Record<string, string>\n globalNotFound?: boolean\n staticData: StaticDataRouteOption\n}\n\nexport type AnyRouteMatch = RouteMatch<any, any>\n\nexport function Matches() {\n const router = useRouter()\n const matchId = useRouterState({\n select: (s) => {\n return getRenderedMatches(s)[0]?.id\n },\n })\n\n return (\n <matchContext.Provider value={matchId}>\n <CatchBoundary\n getResetKey={() => router.state.resolvedLocation.state?.key!}\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 console.error(error)\n }}\n >\n {matchId ? <Match matchId={matchId} /> : null}\n </CatchBoundary>\n </matchContext.Provider>\n )\n}\n\nfunction SafeFragment(props: any) {\n return <>{props.children}</>\n}\n\nexport function Match({ matchId }: { matchId: string }) {\n const router = useRouter()\n const routeId = useRouterState({\n select: (s) =>\n getRenderedMatches(s).find((d) => d.id === matchId)?.routeId as string,\n })\n\n invariant(\n routeId,\n `Could not find routeId for matchId \"${matchId}\". Please file an issue!`,\n )\n\n const route = router.routesById[routeId]!\n\n const PendingComponent = (route.options.pendingComponent ??\n router.options.defaultPendingComponent) as any\n\n const pendingElement = PendingComponent ? <PendingComponent /> : null\n\n const routeErrorComponent =\n route.options.errorComponent ??\n router.options.defaultErrorComponent ??\n ErrorComponent\n\n const routeNotFoundComponent = route.isRoot\n ? // If it's the root route, use the globalNotFound option, with fallback to the notFoundRoute's component\n route.options.notFoundComponent ??\n router.options.notFoundRoute?.options.component\n : route.options.notFoundComponent\n\n const ResolvedSuspenseBoundary =\n route.options.wrapInSuspense ??\n PendingComponent ??\n route.options.component?.preload ??\n route.options.pendingComponent?.preload ??\n (route.options.errorComponent as any)?.preload\n ? React.Suspense\n : SafeFragment\n\n const ResolvedCatchBoundary = routeErrorComponent\n ? CatchBoundary\n : SafeFragment\n\n const ResolvedNotFoundBoundary = routeNotFoundComponent\n ? CatchNotFound\n : SafeFragment\n\n return (\n <matchContext.Provider value={matchId}>\n <ResolvedSuspenseBoundary fallback={pendingElement}>\n <ResolvedCatchBoundary\n getResetKey={() => router.state.resolvedLocation.state?.key!}\n errorComponent={routeErrorComponent}\n onCatch={(error) => {\n // Forward not found errors (we don't want to show the error component for these)\n if (isNotFound(error)) throw error\n warning(false, `Error in route match: ${matchId}`)\n console.error(error)\n }}\n >\n <ResolvedNotFoundBoundary\n fallback={(error) => {\n // If the current not found handler doesn't exist or it has a\n // route ID which doesn't match the current route, rethrow the error\n if (\n !routeNotFoundComponent ||\n (error.routeId && error.routeId !== routeId) ||\n (!error.routeId && !route.isRoot)\n )\n throw error\n\n return React.createElement(routeNotFoundComponent, error as any)\n }}\n >\n <MatchInner matchId={matchId!} pendingElement={pendingElement} />\n </ResolvedNotFoundBoundary>\n </ResolvedCatchBoundary>\n </ResolvedSuspenseBoundary>\n </matchContext.Provider>\n )\n}\n\nfunction MatchInner({\n matchId,\n pendingElement,\n}: {\n matchId: string\n pendingElement: any\n}): any {\n const router = useRouter()\n const routeId = useRouterState({\n select: (s) =>\n getRenderedMatches(s).find((d) => d.id === matchId)?.routeId as string,\n })\n\n const route = router.routesById[routeId]!\n\n const match = useRouterState({\n select: (s) =>\n pick(getRenderedMatches(s).find((d) => d.id === matchId)!, [\n 'status',\n 'error',\n 'showPending',\n 'loadPromise',\n ]),\n })\n\n const RouteErrorComponent =\n (route.options.errorComponent ?? router.options.defaultErrorComponent) ||\n ErrorComponent\n\n if (match.status === 'notFound') {\n let error: unknown\n if (isServerSideError(match.error)) {\n const deserializeError =\n router.options.errorSerializer?.deserialize ?? defaultDeserializeError\n\n error = deserializeError(match.error.data)\n } else {\n error = match.error\n }\n\n invariant(isNotFound(error), 'Expected a notFound error')\n\n return renderRouteNotFound(router, route, error)\n }\n\n if (match.status === 'redirected') {\n // Redirects should be handled by the router transition. If we happen to\n // encounter a redirect here, it's a bug. Let's warn, but render nothing.\n invariant(isRedirect(match.error), 'Expected a redirect error')\n\n warning(\n false,\n 'Tried to render a redirected route match! This is a weird circumstance, please file an issue!',\n )\n\n return null\n }\n\n if (match.status === 'error') {\n // If we're on the server, we need to use React's new and super\n // wonky api for throwing errors from a server side render inside\n // of a suspense boundary. This is the only way to get\n // renderToPipeableStream to not hang indefinitely.\n // We'll serialize the error and rethrow it on the client.\n if (isServer) {\n return (\n <RouteErrorComponent\n error={match.error}\n info={{\n componentStack: '',\n }}\n />\n )\n }\n\n if (isServerSideError(match.error)) {\n const deserializeError =\n router.options.errorSerializer?.deserialize ?? defaultDeserializeError\n throw deserializeError(match.error.data)\n } else {\n throw match.error\n }\n }\n\n if (match.status === 'pending') {\n if (match.showPending) {\n return pendingElement\n }\n throw match.loadPromise\n }\n\n if (match.status === 'success') {\n let Comp = route.options.component ?? router.options.defaultComponent\n\n if (Comp) {\n return <Comp />\n }\n\n return <Outlet />\n }\n\n invariant(\n false,\n 'Idle routeMatch status encountered during rendering! You should never see this. File an issue!',\n )\n}\n\nexport const Outlet = React.memo(function Outlet() {\n const router = useRouter()\n const matchId = React.useContext(matchContext)\n const routeId = useRouterState({\n select: (s) =>\n getRenderedMatches(s).find((d) => d.id === matchId)?.routeId as string,\n })\n\n const route = router.routesById[routeId]!\n\n const { parentGlobalNotFound } = useRouterState({\n select: (s) => {\n const matches = getRenderedMatches(s)\n const parentMatch = matches.find((d) => d.id === matchId)\n invariant(\n parentMatch,\n `Could not find parent match for matchId \"${matchId}\"`,\n )\n return {\n parentGlobalNotFound: parentMatch.globalNotFound,\n }\n },\n })\n\n const childMatchId = useRouterState({\n select: (s) => {\n const matches = getRenderedMatches(s)\n const index = matches.findIndex((d) => d.id === matchId)\n return matches[index + 1]?.id\n },\n })\n\n if (parentGlobalNotFound) {\n return renderRouteNotFound(router, route, undefined)\n }\n\n if (!childMatchId) {\n return null\n }\n\n return <Match matchId={childMatchId} />\n})\n\nfunction renderRouteNotFound(router: AnyRouter, route: AnyRoute, data: any) {\n if (!route.options.notFoundComponent) {\n if (router.options.defaultNotFoundComponent) {\n return <router.options.defaultNotFoundComponent data={data} />\n }\n\n if (process.env.NODE_ENV === 'development') {\n warning(\n route.options.notFoundComponent,\n `A notFoundError was encountered on the route with ID \"${route.id}\", but a notFoundComponent option was not configured, nor was a router level defaultNotFoundComponent configured. Consider configuring at least one of these to avoid TanStack Router's overly generic defaultNotFoundComponent (<div>Not Found<div>)`,\n )\n }\n\n return <DefaultGlobalNotFound />\n }\n\n return <route.options.notFoundComponent data={data} />\n}\n\nexport interface MatchRouteOptions {\n pending?: boolean\n caseSensitive?: boolean\n includeSearch?: boolean\n fuzzy?: boolean\n}\n\nexport type UseMatchRouteOptions<\n TRouteTree extends AnyRoute = RegisteredRouter['routeTree'],\n TFrom extends RoutePaths<TRouteTree> = RoutePaths<TRouteTree>,\n TTo extends string = '',\n TMaskFrom extends RoutePaths<TRouteTree> = TFrom,\n TMaskTo extends string = '',\n Options extends ToOptions<\n TRouteTree,\n TFrom,\n TTo,\n TMaskFrom,\n TMaskTo\n > = ToOptions<TRouteTree, TFrom, TTo, TMaskFrom, TMaskTo>,\n RelaxedOptions = Omit<Options, 'search' | 'params'> &\n DeepPartial<Pick<Options, 'search' | 'params'>>,\n> = RelaxedOptions & MatchRouteOptions\n\nexport function useMatchRoute<\n TRouteTree extends AnyRoute = RegisteredRouter['routeTree'],\n>() {\n useRouterState({ select: (s) => [s.location, s.resolvedLocation] })\n const { matchRoute } = useRouter()\n\n return React.useCallback(\n <\n TFrom extends RoutePaths<TRouteTree> = RoutePaths<TRouteTree>,\n TTo extends string = '',\n TMaskFrom extends RoutePaths<TRouteTree> = TFrom,\n TMaskTo extends string = '',\n TResolved extends string = ResolveRelativePath<TFrom, NoInfer<TTo>>,\n >(\n opts: UseMatchRouteOptions<TRouteTree, TFrom, TTo, TMaskFrom, TMaskTo>,\n ): false | RouteById<TRouteTree, TResolved>['types']['allParams'] => {\n const { pending, caseSensitive, fuzzy, includeSearch, ...rest } = opts\n\n return matchRoute(rest as any, {\n pending,\n caseSensitive,\n fuzzy,\n includeSearch,\n })\n },\n [],\n )\n}\n\nexport type MakeMatchRouteOptions<\n TRouteTree extends AnyRoute = RegisteredRouter['routeTree'],\n TFrom extends RoutePaths<TRouteTree> = RoutePaths<TRouteTree>,\n TTo extends string = '',\n TMaskFrom extends RoutePaths<TRouteTree> = TFrom,\n TMaskTo extends string = '',\n> = UseMatchRouteOptions<TRouteTree, 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 TRouteTree,\n ResolveRelativePath<TFrom, NoInfer<TTo>>\n >['types']['allParams'],\n ) => ReactNode)\n | React.ReactNode\n}\n\nexport function MatchRoute<\n TRouteTree extends AnyRoute = RegisteredRouter['routeTree'],\n TFrom extends RoutePaths<TRouteTree> = RoutePaths<TRouteTree>,\n TTo extends string = '',\n TMaskFrom extends RoutePaths<TRouteTree> = TFrom,\n TMaskTo extends string = '',\n>(\n props: MakeMatchRouteOptions<TRouteTree, TFrom, TTo, TMaskFrom, TMaskTo>,\n): any {\n const matchRoute = useMatchRoute()\n const params = matchRoute(props as any)\n\n if (typeof props.children === 'function') {\n return (props.children as any)(params)\n }\n\n return !!params ? props.children : null\n}\n\nexport function getRenderedMatches<\n TRouteTree extends AnyRoute = RegisteredRouter['routeTree'],\n>(state: RouterState<TRouteTree>) {\n return state.pendingMatches?.some((d) => d.showPending)\n ? state.pendingMatches\n : state.matches\n}\n\nexport function useMatch<\n TRouteTree extends AnyRoute = RegisteredRouter['routeTree'],\n TFrom extends RouteIds<TRouteTree> = RouteIds<TRouteTree>,\n TReturnIntersection extends boolean = false,\n TRouteMatchState = RouteMatch<TRouteTree, TFrom, TReturnIntersection>,\n TSelected = TRouteMatchState,\n>(\n opts: StrictOrFrom<TFrom, TReturnIntersection> & {\n select?: (match: TRouteMatchState) => TSelected\n },\n): TSelected {\n const router = useRouter()\n const nearestMatchId = React.useContext(matchContext)\n\n const nearestMatchRouteId = getRenderedMatches(router.state).find(\n (d) => d.id === nearestMatchId,\n )?.routeId\n\n const strict = opts?.strict ?? true\n\n const matchRouteId = (() => {\n const matches = getRenderedMatches(router.state)\n const match = opts?.from\n ? matches.find((d) => d.routeId === opts?.from)\n : matches.find((d) => d.id === nearestMatchId)\n return match?.routeId\n })()\n\n if (strict) {\n invariant(\n matchRouteId,\n `No match found for route '${opts?.from}' while rendering the '${nearestMatchRouteId}' route. Did you mean to pass '{ strict: false }' instead?`,\n )\n invariant(\n nearestMatchRouteId == matchRouteId,\n `useMatch(\"${\n matchRouteId as string\n }\") is being called in a component that is meant to render the '${nearestMatchRouteId}' route. Did you mean to 'useMatch(\"${\n matchRouteId as string\n }\", { strict: false })' or 'useRoute(\"${\n matchRouteId as string\n }\")' instead?`,\n )\n }\n\n const matchSelection = useRouterState({\n select: (state) => {\n const match = getRenderedMatches(state).find((d) =>\n opts?.from ? opts?.from === d.routeId : d.id === nearestMatchId,\n )\n\n invariant(\n match,\n `Could not find ${\n opts?.from\n ? `an active match from \"${opts.from}\"`\n : 'a nearest match!'\n }`,\n )\n\n return opts?.select ? opts.select(match as any) : match\n },\n })\n\n return matchSelection as any\n}\n\nexport function useMatches<\n TRouteTree extends AnyRoute = RegisteredRouter['routeTree'],\n TRouteId extends RouteIds<TRouteTree> = ParseRoute<TRouteTree>['id'],\n TReturnIntersection extends boolean = false,\n TRouteMatch = RouteMatch<TRouteTree, TRouteId, TReturnIntersection>,\n T = TRouteMatch[],\n>(opts?: {\n select?: (matches: TRouteMatch[]) => T\n experimental_returnIntersection?: TReturnIntersection\n}): T {\n return useRouterState({\n select: (state) => {\n const matches = getRenderedMatches(state)\n return opts?.select\n ? opts.select(matches as TRouteMatch[])\n : (matches as T)\n },\n })\n}\n\nexport function useParentMatches<\n TRouteTree extends AnyRoute = RegisteredRouter['routeTree'],\n TRouteId extends RouteIds<TRouteTree> = ParseRoute<TRouteTree>['id'],\n TReturnIntersection extends boolean = false,\n TRouteMatch = RouteMatch<TRouteTree, TRouteId, TReturnIntersection>,\n T = TRouteMatch[],\n>(opts?: {\n select?: (matches: TRouteMatch[]) => T\n experimental_returnIntersection?: TReturnIntersection\n}): T {\n const contextMatchId = React.useContext(matchContext)\n\n return useMatches({\n select: (matches) => {\n matches = matches.slice(\n 0,\n matches.findIndex((d) => d.id === contextMatchId),\n )\n return opts?.select\n ? opts.select(matches as TRouteMatch[])\n : (matches as T)\n },\n })\n}\n\nexport function useChildMatches<\n TRouteTree extends AnyRoute = RegisteredRouter['routeTree'],\n TRouteId extends RouteIds<TRouteTree> = ParseRoute<TRouteTree>['id'],\n TReturnIntersection extends boolean = false,\n TRouteMatch = RouteMatch<TRouteTree, TRouteId, TReturnIntersection>,\n T = TRouteMatch[],\n>(opts?: {\n select?: (matches: TRouteMatch[]) => T\n experimental_returnIntersection?: TReturnIntersection\n}): T {\n const contextMatchId = React.useContext(matchContext)\n\n return useMatches({\n select: (matches) => {\n matches = matches.slice(\n matches.findIndex((d) => d.id === contextMatchId) + 1,\n )\n return opts?.select\n ? opts.select(matches as TRouteMatch[])\n : (matches as T)\n },\n })\n}\n\nexport function useLoaderDeps<\n TRouteTree extends AnyRoute = RegisteredRouter['routeTree'],\n TFrom extends RouteIds<TRouteTree> = RouteIds<TRouteTree>,\n TRouteMatch extends RouteMatch<TRouteTree, TFrom> = RouteMatch<\n TRouteTree,\n TFrom\n >,\n TSelected = Required<TRouteMatch>['loaderDeps'],\n>(\n opts: StrictOrFrom<TFrom> & {\n select?: (match: TRouteMatch) => TSelected\n },\n): TSelected {\n return useMatch({\n ...opts,\n select: (s) => {\n return typeof opts.select === 'function'\n ? opts.select(s?.loaderDeps)\n : s?.loaderDeps\n },\n })\n}\n\nexport function useLoaderData<\n TRouteTree extends AnyRoute = RegisteredRouter['routeTree'],\n TFrom extends RouteIds<TRouteTree> = RouteIds<TRouteTree>,\n TRouteMatch extends RouteMatch<TRouteTree, TFrom> = RouteMatch<\n TRouteTree,\n TFrom\n >,\n TSelected = Required<TRouteMatch>['loaderData'],\n>(\n opts: StrictOrFrom<TFrom> & {\n select?: (match: TRouteMatch) => TSelected\n },\n): TSelected {\n return useMatch({\n ...opts,\n select: (s) => {\n return typeof opts.select === 'function'\n ? opts.select(s?.loaderData)\n : s?.loaderData\n },\n })\n}\n\nexport function isServerSideError(error: unknown): error is {\n __isServerError: true\n data: Record<string, any>\n} {\n if (!(typeof error === 'object' && error && 'data' in error)) return false\n if (!('__isServerError' in error && error.__isServerError)) return false\n if (!(typeof error.data === 'object' && error.data)) return false\n\n return error.__isServerError === true\n}\n\nexport function defaultDeserializeError(serializedData: Record<string, any>) {\n if ('name' in serializedData && 'message' in serializedData) {\n const error = new Error(serializedData.message)\n error.name = serializedData.name\n return error\n }\n\n return serializedData.data\n}\n"],"names":["React","useRouter","useRouterState","jsx","CatchBoundary","ErrorComponent","Fragment","_a","CatchNotFound","isNotFound","pick","isRedirect","isServer","Outlet","DefaultGlobalNotFound"],"mappings":"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"}
|
package/dist/cjs/index.cjs
CHANGED
|
@@ -28,7 +28,6 @@ const useRouter = require("./useRouter.cjs");
|
|
|
28
28
|
const useRouterState = require("./useRouterState.cjs");
|
|
29
29
|
const utils = require("./utils.cjs");
|
|
30
30
|
const notFound = require("./not-found.cjs");
|
|
31
|
-
const createServerFn = require("./createServerFn.cjs");
|
|
32
31
|
exports.invariant = invariant;
|
|
33
32
|
exports.warning = warning;
|
|
34
33
|
exports.Await = awaited.Await;
|
|
@@ -132,10 +131,6 @@ exports.CatchNotFound = notFound.CatchNotFound;
|
|
|
132
131
|
exports.DefaultGlobalNotFound = notFound.DefaultGlobalNotFound;
|
|
133
132
|
exports.isNotFound = notFound.isNotFound;
|
|
134
133
|
exports.notFound = notFound.notFound;
|
|
135
|
-
exports.createServerFn = createServerFn.createServerFn;
|
|
136
|
-
exports.json = createServerFn.json;
|
|
137
|
-
exports.serverFnPayloadTypeHeader = createServerFn.serverFnPayloadTypeHeader;
|
|
138
|
-
exports.serverFnReturnTypeHeader = createServerFn.serverFnReturnTypeHeader;
|
|
139
134
|
Object.keys(history).forEach((k) => {
|
|
140
135
|
if (k !== "default" && !Object.prototype.hasOwnProperty.call(exports, k))
|
|
141
136
|
Object.defineProperty(exports, k, {
|
package/dist/cjs/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|
package/dist/cjs/index.d.cts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"not-found.cjs","sources":["../../src/not-found.tsx"],"sourcesContent":["import * as React from 'react'\nimport { CatchBoundary } from './CatchBoundary'\nimport { useRouterState } from './useRouterState'\nimport { RegisteredRouter } from './router'\nimport { RouteIds } from './routeInfo'\n\nexport type NotFoundError = {\n /**\n @deprecated\n Use `routeId: rootRouteId` instead\n */\n global?: boolean\n /**\n @private\n Do not use this. It's used internally to indicate a path matching error\n */\n _global?: boolean\n data?: any\n throw?: boolean\n routeId?: RouteIds<RegisteredRouter['routeTree']>\n}\n\nexport function notFound(options: NotFoundError = {}) {\n ;(options as any).isNotFound = true\n if (options.throw) throw options\n return options\n}\n\nexport function isNotFound(obj: any): obj is NotFoundError {\n return !!obj?.isNotFound\n}\n\nexport function CatchNotFound(props: {\n fallback?: (error: NotFoundError) => React.ReactElement\n onCatch?: (error: any) => void\n children: React.ReactNode\n}) {\n // TODO: Some way for the user to programmatically reset the not-found boundary?\n const resetKey = useRouterState({\n select: (s) => `not-found-${s.location.pathname}-${s.status}`,\n })\n\n return (\n <CatchBoundary\n getResetKey={() => resetKey}\n onCatch={(error) => {\n if (isNotFound(error)) {\n props.onCatch?.(error)\n } else {\n throw error\n }\n }}\n errorComponent={({ error }: { error: NotFoundError }) =>\n props.fallback?.(error)\n }\n >\n {props.children}\n </CatchBoundary>\n )\n}\n\nexport function DefaultGlobalNotFound() {\n return <p>Not Found</p>\n}\n"],"names":["useRouterState","jsx","CatchBoundary"],"mappings":";;;;;
|
|
1
|
+
{"version":3,"file":"not-found.cjs","sources":["../../src/not-found.tsx"],"sourcesContent":["import * as React from 'react'\nimport { CatchBoundary } from './CatchBoundary'\nimport { useRouterState } from './useRouterState'\nimport { RegisteredRouter } from './router'\nimport { RouteIds } from './routeInfo'\n\nexport type NotFoundError = {\n /**\n @deprecated\n Use `routeId: rootRouteId` instead\n */\n global?: boolean\n /**\n @private\n Do not use this. It's used internally to indicate a path matching error\n */\n _global?: boolean\n data?: any\n throw?: boolean\n routeId?: RouteIds<RegisteredRouter['routeTree']>\n headers?: HeadersInit\n}\n\nexport function notFound(options: NotFoundError = {}) {\n ;(options as any).isNotFound = true\n if (options.throw) throw options\n return options\n}\n\nexport function isNotFound(obj: any): obj is NotFoundError {\n return !!obj?.isNotFound\n}\n\nexport function CatchNotFound(props: {\n fallback?: (error: NotFoundError) => React.ReactElement\n onCatch?: (error: any) => void\n children: React.ReactNode\n}) {\n // TODO: Some way for the user to programmatically reset the not-found boundary?\n const resetKey = useRouterState({\n select: (s) => `not-found-${s.location.pathname}-${s.status}`,\n })\n\n return (\n <CatchBoundary\n getResetKey={() => resetKey}\n onCatch={(error) => {\n if (isNotFound(error)) {\n props.onCatch?.(error)\n } else {\n throw error\n }\n }}\n errorComponent={({ error }: { error: NotFoundError }) =>\n props.fallback?.(error)\n }\n >\n {props.children}\n </CatchBoundary>\n )\n}\n\nexport function DefaultGlobalNotFound() {\n return <p>Not Found</p>\n}\n"],"names":["useRouterState","jsx","CatchBoundary"],"mappings":";;;;;AAuBgB,SAAA,SAAS,UAAyB,IAAI;AAClD,UAAgB,aAAa;AAC/B,MAAI,QAAQ;AAAa,UAAA;AAClB,SAAA;AACT;AAEO,SAAS,WAAW,KAAgC;AAClD,SAAA,CAAC,EAAC,2BAAK;AAChB;AAEO,SAAS,cAAc,OAI3B;AAED,QAAM,WAAWA,eAAAA,eAAe;AAAA,IAC9B,QAAQ,CAAC,MAAM,aAAa,EAAE,SAAS,QAAQ,IAAI,EAAE,MAAM;AAAA,EAAA,CAC5D;AAGC,SAAAC,2BAAA;AAAA,IAACC,cAAA;AAAA,IAAA;AAAA,MACC,aAAa,MAAM;AAAA,MACnB,SAAS,CAAC,UAAU;;AACd,YAAA,WAAW,KAAK,GAAG;AACrB,sBAAM,YAAN,+BAAgB;AAAA,QAAK,OAChB;AACC,gBAAA;AAAA,QACR;AAAA,MACF;AAAA,MACA,gBAAgB,CAAC,EAAE,YACjB;;AAAA,2BAAM,aAAN,+BAAiB;AAAA;AAAA,MAGlB,UAAM,MAAA;AAAA,IAAA;AAAA,EAAA;AAGb;AAEO,SAAS,wBAAwB;AAC/B,SAAAD,2BAAA,IAAC,OAAE,UAAS,YAAA,CAAA;AACrB;;;;;"}
|
package/dist/cjs/not-found.d.cts
CHANGED
|
@@ -15,6 +15,7 @@ export type NotFoundError = {
|
|
|
15
15
|
data?: any;
|
|
16
16
|
throw?: boolean;
|
|
17
17
|
routeId?: RouteIds<RegisteredRouter['routeTree']>;
|
|
18
|
+
headers?: HeadersInit;
|
|
18
19
|
};
|
|
19
20
|
export declare function notFound(options?: NotFoundError): NotFoundError;
|
|
20
21
|
export declare function isNotFound(obj: any): obj is NotFoundError;
|
package/dist/cjs/redirects.cjs
CHANGED
|
@@ -3,7 +3,8 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
|
3
3
|
function redirect(opts) {
|
|
4
4
|
opts.isRedirect = true;
|
|
5
5
|
opts.statusCode = opts.statusCode || opts.code || 301;
|
|
6
|
-
|
|
6
|
+
opts.headers = opts.headers || {};
|
|
7
|
+
if (opts.throw) {
|
|
7
8
|
throw opts;
|
|
8
9
|
}
|
|
9
10
|
return opts;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"redirects.cjs","sources":["../../src/redirects.ts"],"sourcesContent":["import { PickAsRequired } from '.'\nimport { NavigateOptions } from './link'\nimport { AnyRoute } from './route'\nimport { RoutePaths } from './routeInfo'\nimport { RegisteredRouter } from './router'\n\nexport type AnyRedirect = Redirect<any, any, any, any, any>\n\nexport type Redirect<\n TRouteTree extends AnyRoute = RegisteredRouter['routeTree'],\n TFrom extends RoutePaths<TRouteTree> = '/',\n TTo extends string = '',\n TMaskFrom extends RoutePaths<TRouteTree> = TFrom,\n TMaskTo extends string = '',\n> = {\n /**\n * @deprecated Use `statusCode` instead\n **/\n href?: string\n code?: number\n statusCode?: number\n throw?: any\n} & NavigateOptions<TRouteTree, TFrom, TTo, TMaskFrom, TMaskTo>\n\nexport type ResolvedRedirect<\n TRouteTree extends AnyRoute = RegisteredRouter['routeTree'],\n TFrom extends RoutePaths<TRouteTree> = '/',\n TTo extends string = '',\n TMaskFrom extends RoutePaths<TRouteTree> = TFrom,\n TMaskTo extends string = '',\n> = PickAsRequired<\n Redirect<TRouteTree, TFrom, TTo, TMaskFrom, TMaskTo>,\n 'code' | 'statusCode' | 'href'\n>\n\nexport function redirect<\n TRouteTree extends AnyRoute = RegisteredRouter['routeTree'],\n TFrom extends RoutePaths<TRouteTree> = '/',\n TTo extends string = '',\n TMaskFrom extends RoutePaths<TRouteTree> = TFrom,\n TMaskTo extends string = '',\n>(\n opts: Redirect<TRouteTree, TFrom, TTo, TMaskFrom, TMaskTo>,\n): Redirect<TRouteTree, TFrom, TTo, TMaskFrom, TMaskTo> {\n ;(opts as any).isRedirect = true\n opts.statusCode = opts.statusCode || opts.code || 301\n if (opts.throw
|
|
1
|
+
{"version":3,"file":"redirects.cjs","sources":["../../src/redirects.ts"],"sourcesContent":["import { PickAsRequired } from '.'\nimport { NavigateOptions } from './link'\nimport { AnyRoute } from './route'\nimport { RoutePaths } from './routeInfo'\nimport { RegisteredRouter } from './router'\n\nexport type AnyRedirect = Redirect<any, any, any, any, any>\n\nexport type Redirect<\n TRouteTree extends AnyRoute = RegisteredRouter['routeTree'],\n TFrom extends RoutePaths<TRouteTree> = '/',\n TTo extends string = '',\n TMaskFrom extends RoutePaths<TRouteTree> = TFrom,\n TMaskTo extends string = '',\n> = {\n /**\n * @deprecated Use `statusCode` instead\n **/\n href?: string\n code?: number\n statusCode?: number\n throw?: any\n headers?: HeadersInit\n} & NavigateOptions<TRouteTree, TFrom, TTo, TMaskFrom, TMaskTo>\n\nexport type ResolvedRedirect<\n TRouteTree extends AnyRoute = RegisteredRouter['routeTree'],\n TFrom extends RoutePaths<TRouteTree> = '/',\n TTo extends string = '',\n TMaskFrom extends RoutePaths<TRouteTree> = TFrom,\n TMaskTo extends string = '',\n> = PickAsRequired<\n Redirect<TRouteTree, TFrom, TTo, TMaskFrom, TMaskTo>,\n 'code' | 'statusCode' | 'href' | 'headers'\n>\n\nexport function redirect<\n TRouteTree extends AnyRoute = RegisteredRouter['routeTree'],\n TFrom extends RoutePaths<TRouteTree> = '/',\n TTo extends string = '',\n TMaskFrom extends RoutePaths<TRouteTree> = TFrom,\n TMaskTo extends string = '',\n>(\n opts: Redirect<TRouteTree, TFrom, TTo, TMaskFrom, TMaskTo>,\n): Redirect<TRouteTree, TFrom, TTo, TMaskFrom, TMaskTo> {\n ;(opts as any).isRedirect = true\n opts.statusCode = opts.statusCode || opts.code || 301\n opts.headers = opts.headers || {}\n if (opts.throw) {\n throw opts\n }\n\n return opts\n}\n\nexport function isRedirect(obj: any): obj is AnyRedirect {\n return !!obj?.isRedirect\n}\n"],"names":[],"mappings":";;AAoCO,SAAS,SAOd,MACsD;AACpD,OAAa,aAAa;AAC5B,OAAK,aAAa,KAAK,cAAc,KAAK,QAAQ;AAC7C,OAAA,UAAU,KAAK,WAAW,CAAA;AAC/B,MAAI,KAAK,OAAO;AACR,UAAA;AAAA,EACR;AAEO,SAAA;AACT;AAEO,SAAS,WAAW,KAA8B;AAChD,SAAA,CAAC,EAAC,2BAAK;AAChB;;;"}
|
package/dist/cjs/redirects.d.cts
CHANGED
|
@@ -12,7 +12,8 @@ export type Redirect<TRouteTree extends AnyRoute = RegisteredRouter['routeTree']
|
|
|
12
12
|
code?: number;
|
|
13
13
|
statusCode?: number;
|
|
14
14
|
throw?: any;
|
|
15
|
+
headers?: HeadersInit;
|
|
15
16
|
} & NavigateOptions<TRouteTree, TFrom, TTo, TMaskFrom, TMaskTo>;
|
|
16
|
-
export type ResolvedRedirect<TRouteTree extends AnyRoute = RegisteredRouter['routeTree'], TFrom extends RoutePaths<TRouteTree> = '/', TTo extends string = '', TMaskFrom extends RoutePaths<TRouteTree> = TFrom, TMaskTo extends string = ''> = PickAsRequired<Redirect<TRouteTree, TFrom, TTo, TMaskFrom, TMaskTo>, 'code' | 'statusCode' | 'href'>;
|
|
17
|
+
export type ResolvedRedirect<TRouteTree extends AnyRoute = RegisteredRouter['routeTree'], TFrom extends RoutePaths<TRouteTree> = '/', TTo extends string = '', TMaskFrom extends RoutePaths<TRouteTree> = TFrom, TMaskTo extends string = ''> = PickAsRequired<Redirect<TRouteTree, TFrom, TTo, TMaskFrom, TMaskTo>, 'code' | 'statusCode' | 'href' | 'headers'>;
|
|
17
18
|
export declare function redirect<TRouteTree extends AnyRoute = RegisteredRouter['routeTree'], TFrom extends RoutePaths<TRouteTree> = '/', TTo extends string = '', TMaskFrom extends RoutePaths<TRouteTree> = TFrom, TMaskTo extends string = ''>(opts: Redirect<TRouteTree, TFrom, TTo, TMaskFrom, TMaskTo>): Redirect<TRouteTree, TFrom, TTo, TMaskFrom, TMaskTo>;
|
|
18
19
|
export declare function isRedirect(obj: any): obj is AnyRedirect;
|
package/dist/cjs/routeInfo.d.cts
CHANGED
|
@@ -17,7 +17,7 @@ export type RoutesByPath<TRouteTree extends AnyRoute> = {
|
|
|
17
17
|
} & Record<'.' | '..', ParseRoute<TRouteTree>>;
|
|
18
18
|
export type RouteByPath<TRouteTree extends AnyRoute, TPath> = Extract<string extends TPath ? ParseRoute<TRouteTree> : RoutesByPath<TRouteTree>[TPath], AnyRoute>;
|
|
19
19
|
export type RoutePaths<TRouteTree extends AnyRoute> = ParseRoute<TRouteTree>['fullPath'] | '/';
|
|
20
|
-
export type RoutePathsAutoComplete<TRouteTree extends AnyRoute, T> =
|
|
20
|
+
export type RoutePathsAutoComplete<TRouteTree extends AnyRoute, T> = (string extends T ? T & {} : T) | RoutePaths<TRouteTree>;
|
|
21
21
|
type UnionizeCollisions<T, U> = {
|
|
22
22
|
[P in keyof T & keyof U]: T[P] extends U[P] ? T[P] : T[P] | U[P];
|
|
23
23
|
};
|
package/dist/cjs/useParams.cjs
CHANGED
|
@@ -1,14 +1,11 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
-
const utils = require("./utils.cjs");
|
|
4
|
-
const useRouterState = require("./useRouterState.cjs");
|
|
5
3
|
const Matches = require("./Matches.cjs");
|
|
6
4
|
function useParams(opts) {
|
|
7
|
-
return
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
return (opts == null ? void 0 : opts.select) ? opts.select(params) : params;
|
|
5
|
+
return Matches.useMatch({
|
|
6
|
+
...opts,
|
|
7
|
+
select: (match) => {
|
|
8
|
+
return (opts == null ? void 0 : opts.select) ? opts.select(match.params) : match.params;
|
|
12
9
|
}
|
|
13
10
|
});
|
|
14
11
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useParams.cjs","sources":["../../src/useParams.tsx"],"sourcesContent":["import { AnyRoute } from './route'\nimport { RouteIds, RouteById, AllParams } from './routeInfo'\nimport { RegisteredRouter } from './router'\nimport { Expand
|
|
1
|
+
{"version":3,"file":"useParams.cjs","sources":["../../src/useParams.tsx"],"sourcesContent":["import { AnyRoute } from './route'\nimport { RouteIds, RouteById, AllParams } from './routeInfo'\nimport { RegisteredRouter } from './router'\nimport { Expand } from './utils'\nimport { StrictOrFrom } from './utils'\nimport { useMatch } from './Matches'\n\nexport function useParams<\n TRouteTree extends AnyRoute = RegisteredRouter['routeTree'],\n TFrom extends RouteIds<TRouteTree> = RouteIds<TRouteTree>,\n TReturnIntersection extends boolean = false,\n TParams = TReturnIntersection extends false\n ? RouteById<TRouteTree, TFrom>['types']['allParams']\n : Expand<Partial<AllParams<TRouteTree>>>,\n TSelected = TParams,\n>(\n opts: StrictOrFrom<TFrom, TReturnIntersection> & {\n select?: (params: TParams) => TSelected\n },\n): TSelected {\n return useMatch({\n ...opts,\n select: (match) => {\n return opts?.select ? opts.select(match.params) : match.params\n },\n })\n}\n"],"names":["useMatch"],"mappings":";;;AAOO,SAAS,UASd,MAGW;AACX,SAAOA,iBAAS;AAAA,IACd,GAAG;AAAA,IACH,QAAQ,CAAC,UAAU;AACjB,cAAO,6BAAM,UAAS,KAAK,OAAO,MAAM,MAAM,IAAI,MAAM;AAAA,IAC1D;AAAA,EAAA,CACD;AACH;;"}
|
package/dist/esm/Matches.js
CHANGED
|
@@ -258,12 +258,17 @@ function useMatch(opts) {
|
|
|
258
258
|
const nearestMatchRouteId = (_a = getRenderedMatches(router.state).find(
|
|
259
259
|
(d) => d.id === nearestMatchId
|
|
260
260
|
)) == null ? void 0 : _a.routeId;
|
|
261
|
+
const strict = (opts == null ? void 0 : opts.strict) ?? true;
|
|
261
262
|
const matchRouteId = (() => {
|
|
262
263
|
const matches = getRenderedMatches(router.state);
|
|
263
264
|
const match = (opts == null ? void 0 : opts.from) ? matches.find((d) => d.routeId === (opts == null ? void 0 : opts.from)) : matches.find((d) => d.id === nearestMatchId);
|
|
264
|
-
return match.routeId;
|
|
265
|
+
return match == null ? void 0 : match.routeId;
|
|
265
266
|
})();
|
|
266
|
-
if (
|
|
267
|
+
if (strict) {
|
|
268
|
+
invariant(
|
|
269
|
+
matchRouteId,
|
|
270
|
+
`No match found for route '${opts == null ? void 0 : opts.from}' while rendering the '${nearestMatchRouteId}' route. Did you mean to pass '{ strict: false }' instead?`
|
|
271
|
+
);
|
|
267
272
|
invariant(
|
|
268
273
|
nearestMatchRouteId == matchRouteId,
|
|
269
274
|
`useMatch("${matchRouteId}") is being called in a component that is meant to render the '${nearestMatchRouteId}' route. Did you mean to 'useMatch("${matchRouteId}", { strict: false })' or 'useRoute("${matchRouteId}")' instead?`
|
package/dist/esm/Matches.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Matches.js","sources":["../../src/Matches.tsx"],"sourcesContent":["import * as React from 'react'\nimport invariant from 'tiny-invariant'\nimport warning from 'tiny-warning'\nimport { CatchBoundary, ErrorComponent } from './CatchBoundary'\nimport { useRouterState } from './useRouterState'\nimport { useRouter } from './useRouter'\nimport { ResolveRelativePath, ToOptions } from './link'\nimport {\n AnyRoute,\n ReactNode,\n RootSearchSchema,\n StaticDataRouteOption,\n} from './route'\nimport {\n AllParams,\n FullSearchSchema,\n ParseRoute,\n RouteById,\n RouteByPath,\n RouteIds,\n RoutePaths,\n} from './routeInfo'\nimport { AnyRouter, RegisteredRouter, RouterState } from './router'\nimport {\n DeepPartial,\n Expand,\n NoInfer,\n StrictOrFrom,\n isServer,\n pick,\n} from './utils'\nimport { CatchNotFound, DefaultGlobalNotFound, isNotFound } from './not-found'\nimport { isRedirect } from './redirects'\n\nexport const matchContext = React.createContext<string | undefined>(undefined)\n\nexport interface RouteMatch<\n TRouteTree extends AnyRoute = RegisteredRouter['routeTree'],\n TRouteId extends RouteIds<TRouteTree> = ParseRoute<TRouteTree>['id'],\n TReturnIntersection extends boolean = false,\n> {\n id: string\n routeId: TRouteId\n pathname: string\n params: TReturnIntersection extends false\n ? RouteById<TRouteTree, TRouteId>['types']['allParams']\n : Expand<Partial<AllParams<TRouteTree>>>\n status: 'pending' | 'success' | 'error' | 'redirected' | 'notFound'\n isFetching: boolean\n showPending: boolean\n error: unknown\n paramsError: unknown\n searchError: unknown\n updatedAt: number\n loadPromise?: Promise<void>\n loaderData?: RouteById<TRouteTree, TRouteId>['types']['loaderData']\n routeContext: RouteById<TRouteTree, TRouteId>['types']['routeContext']\n context: RouteById<TRouteTree, TRouteId>['types']['allContext']\n search: TReturnIntersection extends false\n ? Exclude<\n RouteById<TRouteTree, TRouteId>['types']['fullSearchSchema'],\n RootSearchSchema\n >\n : Expand<\n Partial<Omit<FullSearchSchema<TRouteTree>, keyof RootSearchSchema>>\n >\n fetchCount: number\n abortController: AbortController\n cause: 'preload' | 'enter' | 'stay'\n loaderDeps: RouteById<TRouteTree, TRouteId>['types']['loaderDeps']\n preload: boolean\n invalid: boolean\n pendingPromise?: Promise<void>\n meta?: JSX.IntrinsicElements['meta'][]\n links?: JSX.IntrinsicElements['link'][]\n scripts?: JSX.IntrinsicElements['script'][]\n headers?: Record<string, string>\n globalNotFound?: boolean\n staticData: StaticDataRouteOption\n}\n\nexport type AnyRouteMatch = RouteMatch<any, any>\n\nexport function Matches() {\n const router = useRouter()\n const matchId = useRouterState({\n select: (s) => {\n return getRenderedMatches(s)[0]?.id\n },\n })\n\n return (\n <matchContext.Provider value={matchId}>\n <CatchBoundary\n getResetKey={() => router.state.resolvedLocation.state?.key!}\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 console.error(error)\n }}\n >\n {matchId ? <Match matchId={matchId} /> : null}\n </CatchBoundary>\n </matchContext.Provider>\n )\n}\n\nfunction SafeFragment(props: any) {\n return <>{props.children}</>\n}\n\nexport function Match({ matchId }: { matchId: string }) {\n const router = useRouter()\n const routeId = useRouterState({\n select: (s) =>\n getRenderedMatches(s).find((d) => d.id === matchId)?.routeId as string,\n })\n\n invariant(\n routeId,\n `Could not find routeId for matchId \"${matchId}\". Please file an issue!`,\n )\n\n const route = router.routesById[routeId]!\n\n const PendingComponent = (route.options.pendingComponent ??\n router.options.defaultPendingComponent) as any\n\n const pendingElement = PendingComponent ? <PendingComponent /> : null\n\n const routeErrorComponent =\n route.options.errorComponent ??\n router.options.defaultErrorComponent ??\n ErrorComponent\n\n const routeNotFoundComponent = route.isRoot\n ? // If it's the root route, use the globalNotFound option, with fallback to the notFoundRoute's component\n route.options.notFoundComponent ??\n router.options.notFoundRoute?.options.component\n : route.options.notFoundComponent\n\n const ResolvedSuspenseBoundary =\n route.options.wrapInSuspense ??\n PendingComponent ??\n route.options.component?.preload ??\n route.options.pendingComponent?.preload ??\n (route.options.errorComponent as any)?.preload\n ? React.Suspense\n : SafeFragment\n\n const ResolvedCatchBoundary = routeErrorComponent\n ? CatchBoundary\n : SafeFragment\n\n const ResolvedNotFoundBoundary = routeNotFoundComponent\n ? CatchNotFound\n : SafeFragment\n\n return (\n <matchContext.Provider value={matchId}>\n <ResolvedSuspenseBoundary fallback={pendingElement}>\n <ResolvedCatchBoundary\n getResetKey={() => router.state.resolvedLocation.state?.key!}\n errorComponent={routeErrorComponent}\n onCatch={(error) => {\n // Forward not found errors (we don't want to show the error component for these)\n if (isNotFound(error)) throw error\n warning(false, `Error in route match: ${matchId}`)\n console.error(error)\n }}\n >\n <ResolvedNotFoundBoundary\n fallback={(error) => {\n // If the current not found handler doesn't exist or it has a\n // route ID which doesn't match the current route, rethrow the error\n if (\n !routeNotFoundComponent ||\n (error.routeId && error.routeId !== routeId) ||\n (!error.routeId && !route.isRoot)\n )\n throw error\n\n return React.createElement(routeNotFoundComponent, error as any)\n }}\n >\n <MatchInner matchId={matchId!} pendingElement={pendingElement} />\n </ResolvedNotFoundBoundary>\n </ResolvedCatchBoundary>\n </ResolvedSuspenseBoundary>\n </matchContext.Provider>\n )\n}\n\nfunction MatchInner({\n matchId,\n pendingElement,\n}: {\n matchId: string\n pendingElement: any\n}): any {\n const router = useRouter()\n const routeId = useRouterState({\n select: (s) =>\n getRenderedMatches(s).find((d) => d.id === matchId)?.routeId as string,\n })\n\n const route = router.routesById[routeId]!\n\n const match = useRouterState({\n select: (s) =>\n pick(getRenderedMatches(s).find((d) => d.id === matchId)!, [\n 'status',\n 'error',\n 'showPending',\n 'loadPromise',\n ]),\n })\n\n const RouteErrorComponent =\n (route.options.errorComponent ?? router.options.defaultErrorComponent) ||\n ErrorComponent\n\n if (match.status === 'notFound') {\n let error: unknown\n if (isServerSideError(match.error)) {\n const deserializeError =\n router.options.errorSerializer?.deserialize ?? defaultDeserializeError\n\n error = deserializeError(match.error.data)\n } else {\n error = match.error\n }\n\n invariant(isNotFound(error), 'Expected a notFound error')\n\n return renderRouteNotFound(router, route, error)\n }\n\n if (match.status === 'redirected') {\n // Redirects should be handled by the router transition. If we happen to\n // encounter a redirect here, it's a bug. Let's warn, but render nothing.\n invariant(isRedirect(match.error), 'Expected a redirect error')\n\n warning(\n false,\n 'Tried to render a redirected route match! This is a weird circumstance, please file an issue!',\n )\n\n return null\n }\n\n if (match.status === 'error') {\n // If we're on the server, we need to use React's new and super\n // wonky api for throwing errors from a server side render inside\n // of a suspense boundary. This is the only way to get\n // renderToPipeableStream to not hang indefinitely.\n // We'll serialize the error and rethrow it on the client.\n if (isServer) {\n return (\n <RouteErrorComponent\n error={match.error}\n info={{\n componentStack: '',\n }}\n />\n )\n }\n\n if (isServerSideError(match.error)) {\n const deserializeError =\n router.options.errorSerializer?.deserialize ?? defaultDeserializeError\n throw deserializeError(match.error.data)\n } else {\n throw match.error\n }\n }\n\n if (match.status === 'pending') {\n if (match.showPending) {\n return pendingElement\n }\n throw match.loadPromise\n }\n\n if (match.status === 'success') {\n let Comp = route.options.component ?? router.options.defaultComponent\n\n if (Comp) {\n return <Comp />\n }\n\n return <Outlet />\n }\n\n invariant(\n false,\n 'Idle routeMatch status encountered during rendering! You should never see this. File an issue!',\n )\n}\n\nexport const Outlet = React.memo(function Outlet() {\n const router = useRouter()\n const matchId = React.useContext(matchContext)\n const routeId = useRouterState({\n select: (s) =>\n getRenderedMatches(s).find((d) => d.id === matchId)?.routeId as string,\n })\n\n const route = router.routesById[routeId]!\n\n const { parentGlobalNotFound } = useRouterState({\n select: (s) => {\n const matches = getRenderedMatches(s)\n const parentMatch = matches.find((d) => d.id === matchId)\n invariant(\n parentMatch,\n `Could not find parent match for matchId \"${matchId}\"`,\n )\n return {\n parentGlobalNotFound: parentMatch.globalNotFound,\n }\n },\n })\n\n const childMatchId = useRouterState({\n select: (s) => {\n const matches = getRenderedMatches(s)\n const index = matches.findIndex((d) => d.id === matchId)\n return matches[index + 1]?.id\n },\n })\n\n if (parentGlobalNotFound) {\n return renderRouteNotFound(router, route, undefined)\n }\n\n if (!childMatchId) {\n return null\n }\n\n return <Match matchId={childMatchId} />\n})\n\nfunction renderRouteNotFound(router: AnyRouter, route: AnyRoute, data: any) {\n if (!route.options.notFoundComponent) {\n if (router.options.defaultNotFoundComponent) {\n return <router.options.defaultNotFoundComponent data={data} />\n }\n\n if (process.env.NODE_ENV === 'development') {\n warning(\n route.options.notFoundComponent,\n `A notFoundError was encountered on the route with ID \"${route.id}\", but a notFoundComponent option was not configured, nor was a router level defaultNotFoundComponent configured. Consider configuring at least one of these to avoid TanStack Router's overly generic defaultNotFoundComponent (<div>Not Found<div>)`,\n )\n }\n\n return <DefaultGlobalNotFound />\n }\n\n return <route.options.notFoundComponent data={data} />\n}\n\nexport interface MatchRouteOptions {\n pending?: boolean\n caseSensitive?: boolean\n includeSearch?: boolean\n fuzzy?: boolean\n}\n\nexport type UseMatchRouteOptions<\n TRouteTree extends AnyRoute = RegisteredRouter['routeTree'],\n TFrom extends RoutePaths<TRouteTree> = RoutePaths<TRouteTree>,\n TTo extends string = '',\n TMaskFrom extends RoutePaths<TRouteTree> = TFrom,\n TMaskTo extends string = '',\n Options extends ToOptions<\n TRouteTree,\n TFrom,\n TTo,\n TMaskFrom,\n TMaskTo\n > = ToOptions<TRouteTree, TFrom, TTo, TMaskFrom, TMaskTo>,\n RelaxedOptions = Omit<Options, 'search' | 'params'> &\n DeepPartial<Pick<Options, 'search' | 'params'>>,\n> = RelaxedOptions & MatchRouteOptions\n\nexport function useMatchRoute<\n TRouteTree extends AnyRoute = RegisteredRouter['routeTree'],\n>() {\n useRouterState({ select: (s) => [s.location, s.resolvedLocation] })\n const { matchRoute } = useRouter()\n\n return React.useCallback(\n <\n TFrom extends RoutePaths<TRouteTree> = RoutePaths<TRouteTree>,\n TTo extends string = '',\n TMaskFrom extends RoutePaths<TRouteTree> = TFrom,\n TMaskTo extends string = '',\n TResolved extends string = ResolveRelativePath<TFrom, NoInfer<TTo>>,\n >(\n opts: UseMatchRouteOptions<TRouteTree, TFrom, TTo, TMaskFrom, TMaskTo>,\n ): false | RouteById<TRouteTree, TResolved>['types']['allParams'] => {\n const { pending, caseSensitive, fuzzy, includeSearch, ...rest } = opts\n\n return matchRoute(rest as any, {\n pending,\n caseSensitive,\n fuzzy,\n includeSearch,\n })\n },\n [],\n )\n}\n\nexport type MakeMatchRouteOptions<\n TRouteTree extends AnyRoute = RegisteredRouter['routeTree'],\n TFrom extends RoutePaths<TRouteTree> = RoutePaths<TRouteTree>,\n TTo extends string = '',\n TMaskFrom extends RoutePaths<TRouteTree> = TFrom,\n TMaskTo extends string = '',\n> = UseMatchRouteOptions<TRouteTree, 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 TRouteTree,\n ResolveRelativePath<TFrom, NoInfer<TTo>>\n >['types']['allParams'],\n ) => ReactNode)\n | React.ReactNode\n}\n\nexport function MatchRoute<\n TRouteTree extends AnyRoute = RegisteredRouter['routeTree'],\n TFrom extends RoutePaths<TRouteTree> = RoutePaths<TRouteTree>,\n TTo extends string = '',\n TMaskFrom extends RoutePaths<TRouteTree> = TFrom,\n TMaskTo extends string = '',\n>(\n props: MakeMatchRouteOptions<TRouteTree, TFrom, TTo, TMaskFrom, TMaskTo>,\n): any {\n const matchRoute = useMatchRoute()\n const params = matchRoute(props as any)\n\n if (typeof props.children === 'function') {\n return (props.children as any)(params)\n }\n\n return !!params ? props.children : null\n}\n\nexport function getRenderedMatches<\n TRouteTree extends AnyRoute = RegisteredRouter['routeTree'],\n>(state: RouterState<TRouteTree>) {\n return state.pendingMatches?.some((d) => d.showPending)\n ? state.pendingMatches\n : state.matches\n}\n\nexport function useMatch<\n TRouteTree extends AnyRoute = RegisteredRouter['routeTree'],\n TFrom extends RouteIds<TRouteTree> = RouteIds<TRouteTree>,\n TReturnIntersection extends boolean = false,\n TRouteMatchState = RouteMatch<TRouteTree, TFrom, TReturnIntersection>,\n TSelected = TRouteMatchState,\n>(\n opts: StrictOrFrom<TFrom, TReturnIntersection> & {\n select?: (match: TRouteMatchState) => TSelected\n },\n): TSelected {\n const router = useRouter()\n const nearestMatchId = React.useContext(matchContext)\n\n const nearestMatchRouteId = getRenderedMatches(router.state).find(\n (d) => d.id === nearestMatchId,\n )?.routeId\n\n const matchRouteId = (() => {\n const matches = getRenderedMatches(router.state)\n const match = opts?.from\n ? matches.find((d) => d.routeId === opts?.from)\n : matches.find((d) => d.id === nearestMatchId)\n return match!.routeId\n })()\n\n if (opts?.strict ?? true) {\n invariant(\n nearestMatchRouteId == matchRouteId,\n `useMatch(\"${\n matchRouteId as string\n }\") is being called in a component that is meant to render the '${nearestMatchRouteId}' route. Did you mean to 'useMatch(\"${\n matchRouteId as string\n }\", { strict: false })' or 'useRoute(\"${\n matchRouteId as string\n }\")' instead?`,\n )\n }\n\n const matchSelection = useRouterState({\n select: (state) => {\n const match = getRenderedMatches(state).find((d) =>\n opts?.from ? opts?.from === d.routeId : d.id === nearestMatchId,\n )\n\n invariant(\n match,\n `Could not find ${\n opts?.from\n ? `an active match from \"${opts.from}\"`\n : 'a nearest match!'\n }`,\n )\n\n return opts?.select ? opts.select(match as any) : match\n },\n })\n\n return matchSelection as any\n}\n\nexport function useMatches<\n TRouteTree extends AnyRoute = RegisteredRouter['routeTree'],\n TRouteId extends RouteIds<TRouteTree> = ParseRoute<TRouteTree>['id'],\n TReturnIntersection extends boolean = false,\n TRouteMatch = RouteMatch<TRouteTree, TRouteId, TReturnIntersection>,\n T = TRouteMatch[],\n>(opts?: {\n select?: (matches: TRouteMatch[]) => T\n experimental_returnIntersection?: TReturnIntersection\n}): T {\n return useRouterState({\n select: (state) => {\n const matches = getRenderedMatches(state)\n return opts?.select\n ? opts.select(matches as TRouteMatch[])\n : (matches as T)\n },\n })\n}\n\nexport function useParentMatches<\n TRouteTree extends AnyRoute = RegisteredRouter['routeTree'],\n TRouteId extends RouteIds<TRouteTree> = ParseRoute<TRouteTree>['id'],\n TReturnIntersection extends boolean = false,\n TRouteMatch = RouteMatch<TRouteTree, TRouteId, TReturnIntersection>,\n T = TRouteMatch[],\n>(opts?: {\n select?: (matches: TRouteMatch[]) => T\n experimental_returnIntersection?: TReturnIntersection\n}): T {\n const contextMatchId = React.useContext(matchContext)\n\n return useMatches({\n select: (matches) => {\n matches = matches.slice(\n 0,\n matches.findIndex((d) => d.id === contextMatchId),\n )\n return opts?.select\n ? opts.select(matches as TRouteMatch[])\n : (matches as T)\n },\n })\n}\n\nexport function useChildMatches<\n TRouteTree extends AnyRoute = RegisteredRouter['routeTree'],\n TRouteId extends RouteIds<TRouteTree> = ParseRoute<TRouteTree>['id'],\n TReturnIntersection extends boolean = false,\n TRouteMatch = RouteMatch<TRouteTree, TRouteId, TReturnIntersection>,\n T = TRouteMatch[],\n>(opts?: {\n select?: (matches: TRouteMatch[]) => T\n experimental_returnIntersection?: TReturnIntersection\n}): T {\n const contextMatchId = React.useContext(matchContext)\n\n return useMatches({\n select: (matches) => {\n matches = matches.slice(\n matches.findIndex((d) => d.id === contextMatchId) + 1,\n )\n return opts?.select\n ? opts.select(matches as TRouteMatch[])\n : (matches as T)\n },\n })\n}\n\nexport function useLoaderDeps<\n TRouteTree extends AnyRoute = RegisteredRouter['routeTree'],\n TFrom extends RouteIds<TRouteTree> = RouteIds<TRouteTree>,\n TRouteMatch extends RouteMatch<TRouteTree, TFrom> = RouteMatch<\n TRouteTree,\n TFrom\n >,\n TSelected = Required<TRouteMatch>['loaderDeps'],\n>(\n opts: StrictOrFrom<TFrom> & {\n select?: (match: TRouteMatch) => TSelected\n },\n): TSelected {\n return useMatch({\n ...opts,\n select: (s) => {\n return typeof opts.select === 'function'\n ? opts.select(s?.loaderDeps)\n : s?.loaderDeps\n },\n })\n}\n\nexport function useLoaderData<\n TRouteTree extends AnyRoute = RegisteredRouter['routeTree'],\n TFrom extends RouteIds<TRouteTree> = RouteIds<TRouteTree>,\n TRouteMatch extends RouteMatch<TRouteTree, TFrom> = RouteMatch<\n TRouteTree,\n TFrom\n >,\n TSelected = Required<TRouteMatch>['loaderData'],\n>(\n opts: StrictOrFrom<TFrom> & {\n select?: (match: TRouteMatch) => TSelected\n },\n): TSelected {\n return useMatch({\n ...opts,\n select: (s) => {\n return typeof opts.select === 'function'\n ? opts.select(s?.loaderData)\n : s?.loaderData\n },\n })\n}\n\nexport function isServerSideError(error: unknown): error is {\n __isServerError: true\n data: Record<string, any>\n} {\n if (!(typeof error === 'object' && error && 'data' in error)) return false\n if (!('__isServerError' in error && error.__isServerError)) return false\n if (!(typeof error.data === 'object' && error.data)) return false\n\n return error.__isServerError === true\n}\n\nexport function defaultDeserializeError(serializedData: Record<string, any>) {\n if ('name' in serializedData && 'message' in serializedData) {\n const error = new Error(serializedData.message)\n error.name = serializedData.name\n return error\n }\n\n return serializedData.data\n}\n"],"names":["_a","Outlet"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Matches.js","sources":["../../src/Matches.tsx"],"sourcesContent":["import * as React from 'react'\nimport invariant from 'tiny-invariant'\nimport warning from 'tiny-warning'\nimport { CatchBoundary, ErrorComponent } from './CatchBoundary'\nimport { useRouterState } from './useRouterState'\nimport { useRouter } from './useRouter'\nimport { ResolveRelativePath, ToOptions } from './link'\nimport {\n AnyRoute,\n ReactNode,\n RootSearchSchema,\n StaticDataRouteOption,\n} from './route'\nimport {\n AllParams,\n FullSearchSchema,\n ParseRoute,\n RouteById,\n RouteByPath,\n RouteIds,\n RoutePaths,\n} from './routeInfo'\nimport { AnyRouter, RegisteredRouter, RouterState } from './router'\nimport {\n DeepPartial,\n Expand,\n NoInfer,\n StrictOrFrom,\n isServer,\n pick,\n} from './utils'\nimport { CatchNotFound, DefaultGlobalNotFound, isNotFound } from './not-found'\nimport { isRedirect } from './redirects'\n\nexport const matchContext = React.createContext<string | undefined>(undefined)\n\nexport interface RouteMatch<\n TRouteTree extends AnyRoute = RegisteredRouter['routeTree'],\n TRouteId extends RouteIds<TRouteTree> = ParseRoute<TRouteTree>['id'],\n TReturnIntersection extends boolean = false,\n> {\n id: string\n routeId: TRouteId\n pathname: string\n params: TReturnIntersection extends false\n ? RouteById<TRouteTree, TRouteId>['types']['allParams']\n : Expand<Partial<AllParams<TRouteTree>>>\n status: 'pending' | 'success' | 'error' | 'redirected' | 'notFound'\n isFetching: boolean\n showPending: boolean\n error: unknown\n paramsError: unknown\n searchError: unknown\n updatedAt: number\n loadPromise?: Promise<void>\n loaderData?: RouteById<TRouteTree, TRouteId>['types']['loaderData']\n routeContext: RouteById<TRouteTree, TRouteId>['types']['routeContext']\n context: RouteById<TRouteTree, TRouteId>['types']['allContext']\n search: TReturnIntersection extends false\n ? Exclude<\n RouteById<TRouteTree, TRouteId>['types']['fullSearchSchema'],\n RootSearchSchema\n >\n : Expand<\n Partial<Omit<FullSearchSchema<TRouteTree>, keyof RootSearchSchema>>\n >\n fetchCount: number\n abortController: AbortController\n cause: 'preload' | 'enter' | 'stay'\n loaderDeps: RouteById<TRouteTree, TRouteId>['types']['loaderDeps']\n preload: boolean\n invalid: boolean\n pendingPromise?: Promise<void>\n meta?: JSX.IntrinsicElements['meta'][]\n links?: JSX.IntrinsicElements['link'][]\n scripts?: JSX.IntrinsicElements['script'][]\n headers?: Record<string, string>\n globalNotFound?: boolean\n staticData: StaticDataRouteOption\n}\n\nexport type AnyRouteMatch = RouteMatch<any, any>\n\nexport function Matches() {\n const router = useRouter()\n const matchId = useRouterState({\n select: (s) => {\n return getRenderedMatches(s)[0]?.id\n },\n })\n\n return (\n <matchContext.Provider value={matchId}>\n <CatchBoundary\n getResetKey={() => router.state.resolvedLocation.state?.key!}\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 console.error(error)\n }}\n >\n {matchId ? <Match matchId={matchId} /> : null}\n </CatchBoundary>\n </matchContext.Provider>\n )\n}\n\nfunction SafeFragment(props: any) {\n return <>{props.children}</>\n}\n\nexport function Match({ matchId }: { matchId: string }) {\n const router = useRouter()\n const routeId = useRouterState({\n select: (s) =>\n getRenderedMatches(s).find((d) => d.id === matchId)?.routeId as string,\n })\n\n invariant(\n routeId,\n `Could not find routeId for matchId \"${matchId}\". Please file an issue!`,\n )\n\n const route = router.routesById[routeId]!\n\n const PendingComponent = (route.options.pendingComponent ??\n router.options.defaultPendingComponent) as any\n\n const pendingElement = PendingComponent ? <PendingComponent /> : null\n\n const routeErrorComponent =\n route.options.errorComponent ??\n router.options.defaultErrorComponent ??\n ErrorComponent\n\n const routeNotFoundComponent = route.isRoot\n ? // If it's the root route, use the globalNotFound option, with fallback to the notFoundRoute's component\n route.options.notFoundComponent ??\n router.options.notFoundRoute?.options.component\n : route.options.notFoundComponent\n\n const ResolvedSuspenseBoundary =\n route.options.wrapInSuspense ??\n PendingComponent ??\n route.options.component?.preload ??\n route.options.pendingComponent?.preload ??\n (route.options.errorComponent as any)?.preload\n ? React.Suspense\n : SafeFragment\n\n const ResolvedCatchBoundary = routeErrorComponent\n ? CatchBoundary\n : SafeFragment\n\n const ResolvedNotFoundBoundary = routeNotFoundComponent\n ? CatchNotFound\n : SafeFragment\n\n return (\n <matchContext.Provider value={matchId}>\n <ResolvedSuspenseBoundary fallback={pendingElement}>\n <ResolvedCatchBoundary\n getResetKey={() => router.state.resolvedLocation.state?.key!}\n errorComponent={routeErrorComponent}\n onCatch={(error) => {\n // Forward not found errors (we don't want to show the error component for these)\n if (isNotFound(error)) throw error\n warning(false, `Error in route match: ${matchId}`)\n console.error(error)\n }}\n >\n <ResolvedNotFoundBoundary\n fallback={(error) => {\n // If the current not found handler doesn't exist or it has a\n // route ID which doesn't match the current route, rethrow the error\n if (\n !routeNotFoundComponent ||\n (error.routeId && error.routeId !== routeId) ||\n (!error.routeId && !route.isRoot)\n )\n throw error\n\n return React.createElement(routeNotFoundComponent, error as any)\n }}\n >\n <MatchInner matchId={matchId!} pendingElement={pendingElement} />\n </ResolvedNotFoundBoundary>\n </ResolvedCatchBoundary>\n </ResolvedSuspenseBoundary>\n </matchContext.Provider>\n )\n}\n\nfunction MatchInner({\n matchId,\n pendingElement,\n}: {\n matchId: string\n pendingElement: any\n}): any {\n const router = useRouter()\n const routeId = useRouterState({\n select: (s) =>\n getRenderedMatches(s).find((d) => d.id === matchId)?.routeId as string,\n })\n\n const route = router.routesById[routeId]!\n\n const match = useRouterState({\n select: (s) =>\n pick(getRenderedMatches(s).find((d) => d.id === matchId)!, [\n 'status',\n 'error',\n 'showPending',\n 'loadPromise',\n ]),\n })\n\n const RouteErrorComponent =\n (route.options.errorComponent ?? router.options.defaultErrorComponent) ||\n ErrorComponent\n\n if (match.status === 'notFound') {\n let error: unknown\n if (isServerSideError(match.error)) {\n const deserializeError =\n router.options.errorSerializer?.deserialize ?? defaultDeserializeError\n\n error = deserializeError(match.error.data)\n } else {\n error = match.error\n }\n\n invariant(isNotFound(error), 'Expected a notFound error')\n\n return renderRouteNotFound(router, route, error)\n }\n\n if (match.status === 'redirected') {\n // Redirects should be handled by the router transition. If we happen to\n // encounter a redirect here, it's a bug. Let's warn, but render nothing.\n invariant(isRedirect(match.error), 'Expected a redirect error')\n\n warning(\n false,\n 'Tried to render a redirected route match! This is a weird circumstance, please file an issue!',\n )\n\n return null\n }\n\n if (match.status === 'error') {\n // If we're on the server, we need to use React's new and super\n // wonky api for throwing errors from a server side render inside\n // of a suspense boundary. This is the only way to get\n // renderToPipeableStream to not hang indefinitely.\n // We'll serialize the error and rethrow it on the client.\n if (isServer) {\n return (\n <RouteErrorComponent\n error={match.error}\n info={{\n componentStack: '',\n }}\n />\n )\n }\n\n if (isServerSideError(match.error)) {\n const deserializeError =\n router.options.errorSerializer?.deserialize ?? defaultDeserializeError\n throw deserializeError(match.error.data)\n } else {\n throw match.error\n }\n }\n\n if (match.status === 'pending') {\n if (match.showPending) {\n return pendingElement\n }\n throw match.loadPromise\n }\n\n if (match.status === 'success') {\n let Comp = route.options.component ?? router.options.defaultComponent\n\n if (Comp) {\n return <Comp />\n }\n\n return <Outlet />\n }\n\n invariant(\n false,\n 'Idle routeMatch status encountered during rendering! You should never see this. File an issue!',\n )\n}\n\nexport const Outlet = React.memo(function Outlet() {\n const router = useRouter()\n const matchId = React.useContext(matchContext)\n const routeId = useRouterState({\n select: (s) =>\n getRenderedMatches(s).find((d) => d.id === matchId)?.routeId as string,\n })\n\n const route = router.routesById[routeId]!\n\n const { parentGlobalNotFound } = useRouterState({\n select: (s) => {\n const matches = getRenderedMatches(s)\n const parentMatch = matches.find((d) => d.id === matchId)\n invariant(\n parentMatch,\n `Could not find parent match for matchId \"${matchId}\"`,\n )\n return {\n parentGlobalNotFound: parentMatch.globalNotFound,\n }\n },\n })\n\n const childMatchId = useRouterState({\n select: (s) => {\n const matches = getRenderedMatches(s)\n const index = matches.findIndex((d) => d.id === matchId)\n return matches[index + 1]?.id\n },\n })\n\n if (parentGlobalNotFound) {\n return renderRouteNotFound(router, route, undefined)\n }\n\n if (!childMatchId) {\n return null\n }\n\n return <Match matchId={childMatchId} />\n})\n\nfunction renderRouteNotFound(router: AnyRouter, route: AnyRoute, data: any) {\n if (!route.options.notFoundComponent) {\n if (router.options.defaultNotFoundComponent) {\n return <router.options.defaultNotFoundComponent data={data} />\n }\n\n if (process.env.NODE_ENV === 'development') {\n warning(\n route.options.notFoundComponent,\n `A notFoundError was encountered on the route with ID \"${route.id}\", but a notFoundComponent option was not configured, nor was a router level defaultNotFoundComponent configured. Consider configuring at least one of these to avoid TanStack Router's overly generic defaultNotFoundComponent (<div>Not Found<div>)`,\n )\n }\n\n return <DefaultGlobalNotFound />\n }\n\n return <route.options.notFoundComponent data={data} />\n}\n\nexport interface MatchRouteOptions {\n pending?: boolean\n caseSensitive?: boolean\n includeSearch?: boolean\n fuzzy?: boolean\n}\n\nexport type UseMatchRouteOptions<\n TRouteTree extends AnyRoute = RegisteredRouter['routeTree'],\n TFrom extends RoutePaths<TRouteTree> = RoutePaths<TRouteTree>,\n TTo extends string = '',\n TMaskFrom extends RoutePaths<TRouteTree> = TFrom,\n TMaskTo extends string = '',\n Options extends ToOptions<\n TRouteTree,\n TFrom,\n TTo,\n TMaskFrom,\n TMaskTo\n > = ToOptions<TRouteTree, TFrom, TTo, TMaskFrom, TMaskTo>,\n RelaxedOptions = Omit<Options, 'search' | 'params'> &\n DeepPartial<Pick<Options, 'search' | 'params'>>,\n> = RelaxedOptions & MatchRouteOptions\n\nexport function useMatchRoute<\n TRouteTree extends AnyRoute = RegisteredRouter['routeTree'],\n>() {\n useRouterState({ select: (s) => [s.location, s.resolvedLocation] })\n const { matchRoute } = useRouter()\n\n return React.useCallback(\n <\n TFrom extends RoutePaths<TRouteTree> = RoutePaths<TRouteTree>,\n TTo extends string = '',\n TMaskFrom extends RoutePaths<TRouteTree> = TFrom,\n TMaskTo extends string = '',\n TResolved extends string = ResolveRelativePath<TFrom, NoInfer<TTo>>,\n >(\n opts: UseMatchRouteOptions<TRouteTree, TFrom, TTo, TMaskFrom, TMaskTo>,\n ): false | RouteById<TRouteTree, TResolved>['types']['allParams'] => {\n const { pending, caseSensitive, fuzzy, includeSearch, ...rest } = opts\n\n return matchRoute(rest as any, {\n pending,\n caseSensitive,\n fuzzy,\n includeSearch,\n })\n },\n [],\n )\n}\n\nexport type MakeMatchRouteOptions<\n TRouteTree extends AnyRoute = RegisteredRouter['routeTree'],\n TFrom extends RoutePaths<TRouteTree> = RoutePaths<TRouteTree>,\n TTo extends string = '',\n TMaskFrom extends RoutePaths<TRouteTree> = TFrom,\n TMaskTo extends string = '',\n> = UseMatchRouteOptions<TRouteTree, 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 TRouteTree,\n ResolveRelativePath<TFrom, NoInfer<TTo>>\n >['types']['allParams'],\n ) => ReactNode)\n | React.ReactNode\n}\n\nexport function MatchRoute<\n TRouteTree extends AnyRoute = RegisteredRouter['routeTree'],\n TFrom extends RoutePaths<TRouteTree> = RoutePaths<TRouteTree>,\n TTo extends string = '',\n TMaskFrom extends RoutePaths<TRouteTree> = TFrom,\n TMaskTo extends string = '',\n>(\n props: MakeMatchRouteOptions<TRouteTree, TFrom, TTo, TMaskFrom, TMaskTo>,\n): any {\n const matchRoute = useMatchRoute()\n const params = matchRoute(props as any)\n\n if (typeof props.children === 'function') {\n return (props.children as any)(params)\n }\n\n return !!params ? props.children : null\n}\n\nexport function getRenderedMatches<\n TRouteTree extends AnyRoute = RegisteredRouter['routeTree'],\n>(state: RouterState<TRouteTree>) {\n return state.pendingMatches?.some((d) => d.showPending)\n ? state.pendingMatches\n : state.matches\n}\n\nexport function useMatch<\n TRouteTree extends AnyRoute = RegisteredRouter['routeTree'],\n TFrom extends RouteIds<TRouteTree> = RouteIds<TRouteTree>,\n TReturnIntersection extends boolean = false,\n TRouteMatchState = RouteMatch<TRouteTree, TFrom, TReturnIntersection>,\n TSelected = TRouteMatchState,\n>(\n opts: StrictOrFrom<TFrom, TReturnIntersection> & {\n select?: (match: TRouteMatchState) => TSelected\n },\n): TSelected {\n const router = useRouter()\n const nearestMatchId = React.useContext(matchContext)\n\n const nearestMatchRouteId = getRenderedMatches(router.state).find(\n (d) => d.id === nearestMatchId,\n )?.routeId\n\n const strict = opts?.strict ?? true\n\n const matchRouteId = (() => {\n const matches = getRenderedMatches(router.state)\n const match = opts?.from\n ? matches.find((d) => d.routeId === opts?.from)\n : matches.find((d) => d.id === nearestMatchId)\n return match?.routeId\n })()\n\n if (strict) {\n invariant(\n matchRouteId,\n `No match found for route '${opts?.from}' while rendering the '${nearestMatchRouteId}' route. Did you mean to pass '{ strict: false }' instead?`,\n )\n invariant(\n nearestMatchRouteId == matchRouteId,\n `useMatch(\"${\n matchRouteId as string\n }\") is being called in a component that is meant to render the '${nearestMatchRouteId}' route. Did you mean to 'useMatch(\"${\n matchRouteId as string\n }\", { strict: false })' or 'useRoute(\"${\n matchRouteId as string\n }\")' instead?`,\n )\n }\n\n const matchSelection = useRouterState({\n select: (state) => {\n const match = getRenderedMatches(state).find((d) =>\n opts?.from ? opts?.from === d.routeId : d.id === nearestMatchId,\n )\n\n invariant(\n match,\n `Could not find ${\n opts?.from\n ? `an active match from \"${opts.from}\"`\n : 'a nearest match!'\n }`,\n )\n\n return opts?.select ? opts.select(match as any) : match\n },\n })\n\n return matchSelection as any\n}\n\nexport function useMatches<\n TRouteTree extends AnyRoute = RegisteredRouter['routeTree'],\n TRouteId extends RouteIds<TRouteTree> = ParseRoute<TRouteTree>['id'],\n TReturnIntersection extends boolean = false,\n TRouteMatch = RouteMatch<TRouteTree, TRouteId, TReturnIntersection>,\n T = TRouteMatch[],\n>(opts?: {\n select?: (matches: TRouteMatch[]) => T\n experimental_returnIntersection?: TReturnIntersection\n}): T {\n return useRouterState({\n select: (state) => {\n const matches = getRenderedMatches(state)\n return opts?.select\n ? opts.select(matches as TRouteMatch[])\n : (matches as T)\n },\n })\n}\n\nexport function useParentMatches<\n TRouteTree extends AnyRoute = RegisteredRouter['routeTree'],\n TRouteId extends RouteIds<TRouteTree> = ParseRoute<TRouteTree>['id'],\n TReturnIntersection extends boolean = false,\n TRouteMatch = RouteMatch<TRouteTree, TRouteId, TReturnIntersection>,\n T = TRouteMatch[],\n>(opts?: {\n select?: (matches: TRouteMatch[]) => T\n experimental_returnIntersection?: TReturnIntersection\n}): T {\n const contextMatchId = React.useContext(matchContext)\n\n return useMatches({\n select: (matches) => {\n matches = matches.slice(\n 0,\n matches.findIndex((d) => d.id === contextMatchId),\n )\n return opts?.select\n ? opts.select(matches as TRouteMatch[])\n : (matches as T)\n },\n })\n}\n\nexport function useChildMatches<\n TRouteTree extends AnyRoute = RegisteredRouter['routeTree'],\n TRouteId extends RouteIds<TRouteTree> = ParseRoute<TRouteTree>['id'],\n TReturnIntersection extends boolean = false,\n TRouteMatch = RouteMatch<TRouteTree, TRouteId, TReturnIntersection>,\n T = TRouteMatch[],\n>(opts?: {\n select?: (matches: TRouteMatch[]) => T\n experimental_returnIntersection?: TReturnIntersection\n}): T {\n const contextMatchId = React.useContext(matchContext)\n\n return useMatches({\n select: (matches) => {\n matches = matches.slice(\n matches.findIndex((d) => d.id === contextMatchId) + 1,\n )\n return opts?.select\n ? opts.select(matches as TRouteMatch[])\n : (matches as T)\n },\n })\n}\n\nexport function useLoaderDeps<\n TRouteTree extends AnyRoute = RegisteredRouter['routeTree'],\n TFrom extends RouteIds<TRouteTree> = RouteIds<TRouteTree>,\n TRouteMatch extends RouteMatch<TRouteTree, TFrom> = RouteMatch<\n TRouteTree,\n TFrom\n >,\n TSelected = Required<TRouteMatch>['loaderDeps'],\n>(\n opts: StrictOrFrom<TFrom> & {\n select?: (match: TRouteMatch) => TSelected\n },\n): TSelected {\n return useMatch({\n ...opts,\n select: (s) => {\n return typeof opts.select === 'function'\n ? opts.select(s?.loaderDeps)\n : s?.loaderDeps\n },\n })\n}\n\nexport function useLoaderData<\n TRouteTree extends AnyRoute = RegisteredRouter['routeTree'],\n TFrom extends RouteIds<TRouteTree> = RouteIds<TRouteTree>,\n TRouteMatch extends RouteMatch<TRouteTree, TFrom> = RouteMatch<\n TRouteTree,\n TFrom\n >,\n TSelected = Required<TRouteMatch>['loaderData'],\n>(\n opts: StrictOrFrom<TFrom> & {\n select?: (match: TRouteMatch) => TSelected\n },\n): TSelected {\n return useMatch({\n ...opts,\n select: (s) => {\n return typeof opts.select === 'function'\n ? opts.select(s?.loaderData)\n : s?.loaderData\n },\n })\n}\n\nexport function isServerSideError(error: unknown): error is {\n __isServerError: true\n data: Record<string, any>\n} {\n if (!(typeof error === 'object' && error && 'data' in error)) return false\n if (!('__isServerError' in error && error.__isServerError)) return false\n if (!(typeof error.data === 'object' && error.data)) return false\n\n return error.__isServerError === true\n}\n\nexport function defaultDeserializeError(serializedData: Record<string, any>) {\n if ('name' in serializedData && 'message' in serializedData) {\n const error = new Error(serializedData.message)\n error.name = serializedData.name\n return error\n }\n\n return serializedData.data\n}\n"],"names":["_a","Outlet"],"mappings":"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"}
|
package/dist/esm/index.d.ts
CHANGED
package/dist/esm/index.js
CHANGED
|
@@ -26,7 +26,6 @@ import { useRouter } from "./useRouter.js";
|
|
|
26
26
|
import { useRouterState } from "./useRouterState.js";
|
|
27
27
|
import { deepEqual, escapeJSON, functionalUpdate, isPlainArray, isPlainObject, isServer, last, pick, replaceEqualDeep, shallow, useLayoutEffect, useStableCallback } from "./utils.js";
|
|
28
28
|
import { CatchNotFound, DefaultGlobalNotFound, isNotFound, notFound } from "./not-found.js";
|
|
29
|
-
import { createServerFn, json, serverFnPayloadTypeHeader, serverFnReturnTypeHeader } from "./createServerFn.js";
|
|
30
29
|
export {
|
|
31
30
|
Await,
|
|
32
31
|
Block,
|
|
@@ -64,7 +63,6 @@ export {
|
|
|
64
63
|
createRoute,
|
|
65
64
|
createRouteMask,
|
|
66
65
|
createRouter,
|
|
67
|
-
createServerFn,
|
|
68
66
|
decode,
|
|
69
67
|
deepEqual,
|
|
70
68
|
defaultDeserializeError,
|
|
@@ -90,7 +88,6 @@ export {
|
|
|
90
88
|
isServer,
|
|
91
89
|
isServerSideError,
|
|
92
90
|
joinPaths,
|
|
93
|
-
json,
|
|
94
91
|
last,
|
|
95
92
|
lazyFn,
|
|
96
93
|
lazyRouteComponent,
|
|
@@ -107,8 +104,6 @@ export {
|
|
|
107
104
|
resolvePath,
|
|
108
105
|
rootRouteId,
|
|
109
106
|
rootRouteWithContext,
|
|
110
|
-
serverFnPayloadTypeHeader,
|
|
111
|
-
serverFnReturnTypeHeader,
|
|
112
107
|
shallow,
|
|
113
108
|
stringifySearchWith,
|
|
114
109
|
trimPath,
|
package/dist/esm/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|
package/dist/esm/not-found.d.ts
CHANGED
|
@@ -15,6 +15,7 @@ export type NotFoundError = {
|
|
|
15
15
|
data?: any;
|
|
16
16
|
throw?: boolean;
|
|
17
17
|
routeId?: RouteIds<RegisteredRouter['routeTree']>;
|
|
18
|
+
headers?: HeadersInit;
|
|
18
19
|
};
|
|
19
20
|
export declare function notFound(options?: NotFoundError): NotFoundError;
|
|
20
21
|
export declare function isNotFound(obj: any): obj is NotFoundError;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"not-found.js","sources":["../../src/not-found.tsx"],"sourcesContent":["import * as React from 'react'\nimport { CatchBoundary } from './CatchBoundary'\nimport { useRouterState } from './useRouterState'\nimport { RegisteredRouter } from './router'\nimport { RouteIds } from './routeInfo'\n\nexport type NotFoundError = {\n /**\n @deprecated\n Use `routeId: rootRouteId` instead\n */\n global?: boolean\n /**\n @private\n Do not use this. It's used internally to indicate a path matching error\n */\n _global?: boolean\n data?: any\n throw?: boolean\n routeId?: RouteIds<RegisteredRouter['routeTree']>\n}\n\nexport function notFound(options: NotFoundError = {}) {\n ;(options as any).isNotFound = true\n if (options.throw) throw options\n return options\n}\n\nexport function isNotFound(obj: any): obj is NotFoundError {\n return !!obj?.isNotFound\n}\n\nexport function CatchNotFound(props: {\n fallback?: (error: NotFoundError) => React.ReactElement\n onCatch?: (error: any) => void\n children: React.ReactNode\n}) {\n // TODO: Some way for the user to programmatically reset the not-found boundary?\n const resetKey = useRouterState({\n select: (s) => `not-found-${s.location.pathname}-${s.status}`,\n })\n\n return (\n <CatchBoundary\n getResetKey={() => resetKey}\n onCatch={(error) => {\n if (isNotFound(error)) {\n props.onCatch?.(error)\n } else {\n throw error\n }\n }}\n errorComponent={({ error }: { error: NotFoundError }) =>\n props.fallback?.(error)\n }\n >\n {props.children}\n </CatchBoundary>\n )\n}\n\nexport function DefaultGlobalNotFound() {\n return <p>Not Found</p>\n}\n"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"not-found.js","sources":["../../src/not-found.tsx"],"sourcesContent":["import * as React from 'react'\nimport { CatchBoundary } from './CatchBoundary'\nimport { useRouterState } from './useRouterState'\nimport { RegisteredRouter } from './router'\nimport { RouteIds } from './routeInfo'\n\nexport type NotFoundError = {\n /**\n @deprecated\n Use `routeId: rootRouteId` instead\n */\n global?: boolean\n /**\n @private\n Do not use this. It's used internally to indicate a path matching error\n */\n _global?: boolean\n data?: any\n throw?: boolean\n routeId?: RouteIds<RegisteredRouter['routeTree']>\n headers?: HeadersInit\n}\n\nexport function notFound(options: NotFoundError = {}) {\n ;(options as any).isNotFound = true\n if (options.throw) throw options\n return options\n}\n\nexport function isNotFound(obj: any): obj is NotFoundError {\n return !!obj?.isNotFound\n}\n\nexport function CatchNotFound(props: {\n fallback?: (error: NotFoundError) => React.ReactElement\n onCatch?: (error: any) => void\n children: React.ReactNode\n}) {\n // TODO: Some way for the user to programmatically reset the not-found boundary?\n const resetKey = useRouterState({\n select: (s) => `not-found-${s.location.pathname}-${s.status}`,\n })\n\n return (\n <CatchBoundary\n getResetKey={() => resetKey}\n onCatch={(error) => {\n if (isNotFound(error)) {\n props.onCatch?.(error)\n } else {\n throw error\n }\n }}\n errorComponent={({ error }: { error: NotFoundError }) =>\n props.fallback?.(error)\n }\n >\n {props.children}\n </CatchBoundary>\n )\n}\n\nexport function DefaultGlobalNotFound() {\n return <p>Not Found</p>\n}\n"],"names":[],"mappings":";;;AAuBgB,SAAA,SAAS,UAAyB,IAAI;AAClD,UAAgB,aAAa;AAC/B,MAAI,QAAQ;AAAa,UAAA;AAClB,SAAA;AACT;AAEO,SAAS,WAAW,KAAgC;AAClD,SAAA,CAAC,EAAC,2BAAK;AAChB;AAEO,SAAS,cAAc,OAI3B;AAED,QAAM,WAAW,eAAe;AAAA,IAC9B,QAAQ,CAAC,MAAM,aAAa,EAAE,SAAS,QAAQ,IAAI,EAAE,MAAM;AAAA,EAAA,CAC5D;AAGC,SAAA;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,aAAa,MAAM;AAAA,MACnB,SAAS,CAAC,UAAU;;AACd,YAAA,WAAW,KAAK,GAAG;AACrB,sBAAM,YAAN,+BAAgB;AAAA,QAAK,OAChB;AACC,gBAAA;AAAA,QACR;AAAA,MACF;AAAA,MACA,gBAAgB,CAAC,EAAE,YACjB;;AAAA,2BAAM,aAAN,+BAAiB;AAAA;AAAA,MAGlB,UAAM,MAAA;AAAA,IAAA;AAAA,EAAA;AAGb;AAEO,SAAS,wBAAwB;AAC/B,SAAA,oBAAC,OAAE,UAAS,YAAA,CAAA;AACrB;"}
|
package/dist/esm/redirects.d.ts
CHANGED
|
@@ -12,7 +12,8 @@ export type Redirect<TRouteTree extends AnyRoute = RegisteredRouter['routeTree']
|
|
|
12
12
|
code?: number;
|
|
13
13
|
statusCode?: number;
|
|
14
14
|
throw?: any;
|
|
15
|
+
headers?: HeadersInit;
|
|
15
16
|
} & NavigateOptions<TRouteTree, TFrom, TTo, TMaskFrom, TMaskTo>;
|
|
16
|
-
export type ResolvedRedirect<TRouteTree extends AnyRoute = RegisteredRouter['routeTree'], TFrom extends RoutePaths<TRouteTree> = '/', TTo extends string = '', TMaskFrom extends RoutePaths<TRouteTree> = TFrom, TMaskTo extends string = ''> = PickAsRequired<Redirect<TRouteTree, TFrom, TTo, TMaskFrom, TMaskTo>, 'code' | 'statusCode' | 'href'>;
|
|
17
|
+
export type ResolvedRedirect<TRouteTree extends AnyRoute = RegisteredRouter['routeTree'], TFrom extends RoutePaths<TRouteTree> = '/', TTo extends string = '', TMaskFrom extends RoutePaths<TRouteTree> = TFrom, TMaskTo extends string = ''> = PickAsRequired<Redirect<TRouteTree, TFrom, TTo, TMaskFrom, TMaskTo>, 'code' | 'statusCode' | 'href' | 'headers'>;
|
|
17
18
|
export declare function redirect<TRouteTree extends AnyRoute = RegisteredRouter['routeTree'], TFrom extends RoutePaths<TRouteTree> = '/', TTo extends string = '', TMaskFrom extends RoutePaths<TRouteTree> = TFrom, TMaskTo extends string = ''>(opts: Redirect<TRouteTree, TFrom, TTo, TMaskFrom, TMaskTo>): Redirect<TRouteTree, TFrom, TTo, TMaskFrom, TMaskTo>;
|
|
18
19
|
export declare function isRedirect(obj: any): obj is AnyRedirect;
|
package/dist/esm/redirects.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"redirects.js","sources":["../../src/redirects.ts"],"sourcesContent":["import { PickAsRequired } from '.'\nimport { NavigateOptions } from './link'\nimport { AnyRoute } from './route'\nimport { RoutePaths } from './routeInfo'\nimport { RegisteredRouter } from './router'\n\nexport type AnyRedirect = Redirect<any, any, any, any, any>\n\nexport type Redirect<\n TRouteTree extends AnyRoute = RegisteredRouter['routeTree'],\n TFrom extends RoutePaths<TRouteTree> = '/',\n TTo extends string = '',\n TMaskFrom extends RoutePaths<TRouteTree> = TFrom,\n TMaskTo extends string = '',\n> = {\n /**\n * @deprecated Use `statusCode` instead\n **/\n href?: string\n code?: number\n statusCode?: number\n throw?: any\n} & NavigateOptions<TRouteTree, TFrom, TTo, TMaskFrom, TMaskTo>\n\nexport type ResolvedRedirect<\n TRouteTree extends AnyRoute = RegisteredRouter['routeTree'],\n TFrom extends RoutePaths<TRouteTree> = '/',\n TTo extends string = '',\n TMaskFrom extends RoutePaths<TRouteTree> = TFrom,\n TMaskTo extends string = '',\n> = PickAsRequired<\n Redirect<TRouteTree, TFrom, TTo, TMaskFrom, TMaskTo>,\n 'code' | 'statusCode' | 'href'\n>\n\nexport function redirect<\n TRouteTree extends AnyRoute = RegisteredRouter['routeTree'],\n TFrom extends RoutePaths<TRouteTree> = '/',\n TTo extends string = '',\n TMaskFrom extends RoutePaths<TRouteTree> = TFrom,\n TMaskTo extends string = '',\n>(\n opts: Redirect<TRouteTree, TFrom, TTo, TMaskFrom, TMaskTo>,\n): Redirect<TRouteTree, TFrom, TTo, TMaskFrom, TMaskTo> {\n ;(opts as any).isRedirect = true\n opts.statusCode = opts.statusCode || opts.code || 301\n if (opts.throw
|
|
1
|
+
{"version":3,"file":"redirects.js","sources":["../../src/redirects.ts"],"sourcesContent":["import { PickAsRequired } from '.'\nimport { NavigateOptions } from './link'\nimport { AnyRoute } from './route'\nimport { RoutePaths } from './routeInfo'\nimport { RegisteredRouter } from './router'\n\nexport type AnyRedirect = Redirect<any, any, any, any, any>\n\nexport type Redirect<\n TRouteTree extends AnyRoute = RegisteredRouter['routeTree'],\n TFrom extends RoutePaths<TRouteTree> = '/',\n TTo extends string = '',\n TMaskFrom extends RoutePaths<TRouteTree> = TFrom,\n TMaskTo extends string = '',\n> = {\n /**\n * @deprecated Use `statusCode` instead\n **/\n href?: string\n code?: number\n statusCode?: number\n throw?: any\n headers?: HeadersInit\n} & NavigateOptions<TRouteTree, TFrom, TTo, TMaskFrom, TMaskTo>\n\nexport type ResolvedRedirect<\n TRouteTree extends AnyRoute = RegisteredRouter['routeTree'],\n TFrom extends RoutePaths<TRouteTree> = '/',\n TTo extends string = '',\n TMaskFrom extends RoutePaths<TRouteTree> = TFrom,\n TMaskTo extends string = '',\n> = PickAsRequired<\n Redirect<TRouteTree, TFrom, TTo, TMaskFrom, TMaskTo>,\n 'code' | 'statusCode' | 'href' | 'headers'\n>\n\nexport function redirect<\n TRouteTree extends AnyRoute = RegisteredRouter['routeTree'],\n TFrom extends RoutePaths<TRouteTree> = '/',\n TTo extends string = '',\n TMaskFrom extends RoutePaths<TRouteTree> = TFrom,\n TMaskTo extends string = '',\n>(\n opts: Redirect<TRouteTree, TFrom, TTo, TMaskFrom, TMaskTo>,\n): Redirect<TRouteTree, TFrom, TTo, TMaskFrom, TMaskTo> {\n ;(opts as any).isRedirect = true\n opts.statusCode = opts.statusCode || opts.code || 301\n opts.headers = opts.headers || {}\n if (opts.throw) {\n throw opts\n }\n\n return opts\n}\n\nexport function isRedirect(obj: any): obj is AnyRedirect {\n return !!obj?.isRedirect\n}\n"],"names":[],"mappings":"AAoCO,SAAS,SAOd,MACsD;AACpD,OAAa,aAAa;AAC5B,OAAK,aAAa,KAAK,cAAc,KAAK,QAAQ;AAC7C,OAAA,UAAU,KAAK,WAAW,CAAA;AAC/B,MAAI,KAAK,OAAO;AACR,UAAA;AAAA,EACR;AAEO,SAAA;AACT;AAEO,SAAS,WAAW,KAA8B;AAChD,SAAA,CAAC,EAAC,2BAAK;AAChB;"}
|
package/dist/esm/routeInfo.d.ts
CHANGED
|
@@ -17,7 +17,7 @@ export type RoutesByPath<TRouteTree extends AnyRoute> = {
|
|
|
17
17
|
} & Record<'.' | '..', ParseRoute<TRouteTree>>;
|
|
18
18
|
export type RouteByPath<TRouteTree extends AnyRoute, TPath> = Extract<string extends TPath ? ParseRoute<TRouteTree> : RoutesByPath<TRouteTree>[TPath], AnyRoute>;
|
|
19
19
|
export type RoutePaths<TRouteTree extends AnyRoute> = ParseRoute<TRouteTree>['fullPath'] | '/';
|
|
20
|
-
export type RoutePathsAutoComplete<TRouteTree extends AnyRoute, T> =
|
|
20
|
+
export type RoutePathsAutoComplete<TRouteTree extends AnyRoute, T> = (string extends T ? T & {} : T) | RoutePaths<TRouteTree>;
|
|
21
21
|
type UnionizeCollisions<T, U> = {
|
|
22
22
|
[P in keyof T & keyof U]: T[P] extends U[P] ? T[P] : T[P] | U[P];
|
|
23
23
|
};
|
package/dist/esm/useParams.js
CHANGED
|
@@ -1,12 +1,9 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { useRouterState } from "./useRouterState.js";
|
|
3
|
-
import { getRenderedMatches } from "./Matches.js";
|
|
1
|
+
import { useMatch } from "./Matches.js";
|
|
4
2
|
function useParams(opts) {
|
|
5
|
-
return
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
return (opts == null ? void 0 : opts.select) ? opts.select(params) : params;
|
|
3
|
+
return useMatch({
|
|
4
|
+
...opts,
|
|
5
|
+
select: (match) => {
|
|
6
|
+
return (opts == null ? void 0 : opts.select) ? opts.select(match.params) : match.params;
|
|
10
7
|
}
|
|
11
8
|
});
|
|
12
9
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useParams.js","sources":["../../src/useParams.tsx"],"sourcesContent":["import { AnyRoute } from './route'\nimport { RouteIds, RouteById, AllParams } from './routeInfo'\nimport { RegisteredRouter } from './router'\nimport { Expand
|
|
1
|
+
{"version":3,"file":"useParams.js","sources":["../../src/useParams.tsx"],"sourcesContent":["import { AnyRoute } from './route'\nimport { RouteIds, RouteById, AllParams } from './routeInfo'\nimport { RegisteredRouter } from './router'\nimport { Expand } from './utils'\nimport { StrictOrFrom } from './utils'\nimport { useMatch } from './Matches'\n\nexport function useParams<\n TRouteTree extends AnyRoute = RegisteredRouter['routeTree'],\n TFrom extends RouteIds<TRouteTree> = RouteIds<TRouteTree>,\n TReturnIntersection extends boolean = false,\n TParams = TReturnIntersection extends false\n ? RouteById<TRouteTree, TFrom>['types']['allParams']\n : Expand<Partial<AllParams<TRouteTree>>>,\n TSelected = TParams,\n>(\n opts: StrictOrFrom<TFrom, TReturnIntersection> & {\n select?: (params: TParams) => TSelected\n },\n): TSelected {\n return useMatch({\n ...opts,\n select: (match) => {\n return opts?.select ? opts.select(match.params) : match.params\n },\n })\n}\n"],"names":[],"mappings":";AAOO,SAAS,UASd,MAGW;AACX,SAAO,SAAS;AAAA,IACd,GAAG;AAAA,IACH,QAAQ,CAAC,UAAU;AACjB,cAAO,6BAAM,UAAS,KAAK,OAAO,MAAM,MAAM,IAAI,MAAM;AAAA,IAC1D;AAAA,EAAA,CACD;AACH;"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@tanstack/react-router",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.21.1",
|
|
4
4
|
"description": "",
|
|
5
5
|
"author": "Tanner Linsley",
|
|
6
6
|
"license": "MIT",
|
|
@@ -67,7 +67,7 @@
|
|
|
67
67
|
"scripts": {
|
|
68
68
|
"clean": "rimraf ./dist && rimraf ./coverage",
|
|
69
69
|
"test:types": "tsc",
|
|
70
|
-
"test:lib": "vitest",
|
|
70
|
+
"test:lib": "vitest --typecheck",
|
|
71
71
|
"test:lib:dev": "pnpm run test:lib --watch",
|
|
72
72
|
"test:build": "publint --strict",
|
|
73
73
|
"build": "vite build"
|
package/src/Matches.tsx
CHANGED
|
@@ -479,15 +479,21 @@ export function useMatch<
|
|
|
479
479
|
(d) => d.id === nearestMatchId,
|
|
480
480
|
)?.routeId
|
|
481
481
|
|
|
482
|
+
const strict = opts?.strict ?? true
|
|
483
|
+
|
|
482
484
|
const matchRouteId = (() => {
|
|
483
485
|
const matches = getRenderedMatches(router.state)
|
|
484
486
|
const match = opts?.from
|
|
485
487
|
? matches.find((d) => d.routeId === opts?.from)
|
|
486
488
|
: matches.find((d) => d.id === nearestMatchId)
|
|
487
|
-
return match
|
|
489
|
+
return match?.routeId
|
|
488
490
|
})()
|
|
489
491
|
|
|
490
|
-
if (
|
|
492
|
+
if (strict) {
|
|
493
|
+
invariant(
|
|
494
|
+
matchRouteId,
|
|
495
|
+
`No match found for route '${opts?.from}' while rendering the '${nearestMatchRouteId}' route. Did you mean to pass '{ strict: false }' instead?`,
|
|
496
|
+
)
|
|
491
497
|
invariant(
|
|
492
498
|
nearestMatchRouteId == matchRouteId,
|
|
493
499
|
`useMatch("${
|
package/src/index.tsx
CHANGED
package/src/not-found.tsx
CHANGED
package/src/redirects.ts
CHANGED
|
@@ -20,6 +20,7 @@ export type Redirect<
|
|
|
20
20
|
code?: number
|
|
21
21
|
statusCode?: number
|
|
22
22
|
throw?: any
|
|
23
|
+
headers?: HeadersInit
|
|
23
24
|
} & NavigateOptions<TRouteTree, TFrom, TTo, TMaskFrom, TMaskTo>
|
|
24
25
|
|
|
25
26
|
export type ResolvedRedirect<
|
|
@@ -30,7 +31,7 @@ export type ResolvedRedirect<
|
|
|
30
31
|
TMaskTo extends string = '',
|
|
31
32
|
> = PickAsRequired<
|
|
32
33
|
Redirect<TRouteTree, TFrom, TTo, TMaskFrom, TMaskTo>,
|
|
33
|
-
'code' | 'statusCode' | 'href'
|
|
34
|
+
'code' | 'statusCode' | 'href' | 'headers'
|
|
34
35
|
>
|
|
35
36
|
|
|
36
37
|
export function redirect<
|
|
@@ -44,7 +45,8 @@ export function redirect<
|
|
|
44
45
|
): Redirect<TRouteTree, TFrom, TTo, TMaskFrom, TMaskTo> {
|
|
45
46
|
;(opts as any).isRedirect = true
|
|
46
47
|
opts.statusCode = opts.statusCode || opts.code || 301
|
|
47
|
-
|
|
48
|
+
opts.headers = opts.headers || {}
|
|
49
|
+
if (opts.throw) {
|
|
48
50
|
throw opts
|
|
49
51
|
}
|
|
50
52
|
|
package/src/routeInfo.ts
CHANGED
|
@@ -36,9 +36,8 @@ export type RoutePaths<TRouteTree extends AnyRoute> =
|
|
|
36
36
|
| '/'
|
|
37
37
|
|
|
38
38
|
export type RoutePathsAutoComplete<TRouteTree extends AnyRoute, T> =
|
|
39
|
-
| T
|
|
39
|
+
| (string extends T ? T & {} : T)
|
|
40
40
|
| RoutePaths<TRouteTree>
|
|
41
|
-
| (string & {})
|
|
42
41
|
|
|
43
42
|
type UnionizeCollisions<T, U> = {
|
|
44
43
|
[P in keyof T & keyof U]: T[P] extends U[P] ? T[P] : T[P] | U[P]
|
package/src/useParams.tsx
CHANGED
|
@@ -1,10 +1,9 @@
|
|
|
1
1
|
import { AnyRoute } from './route'
|
|
2
2
|
import { RouteIds, RouteById, AllParams } from './routeInfo'
|
|
3
3
|
import { RegisteredRouter } from './router'
|
|
4
|
-
import { Expand
|
|
5
|
-
import { useRouterState } from './useRouterState'
|
|
4
|
+
import { Expand } from './utils'
|
|
6
5
|
import { StrictOrFrom } from './utils'
|
|
7
|
-
import {
|
|
6
|
+
import { useMatch } from './Matches'
|
|
8
7
|
|
|
9
8
|
export function useParams<
|
|
10
9
|
TRouteTree extends AnyRoute = RegisteredRouter['routeTree'],
|
|
@@ -19,10 +18,10 @@ export function useParams<
|
|
|
19
18
|
select?: (params: TParams) => TSelected
|
|
20
19
|
},
|
|
21
20
|
): TSelected {
|
|
22
|
-
return
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
return opts?.select ? opts.select(params) : params
|
|
21
|
+
return useMatch({
|
|
22
|
+
...opts,
|
|
23
|
+
select: (match) => {
|
|
24
|
+
return opts?.select ? opts.select(match.params) : match.params
|
|
26
25
|
},
|
|
27
26
|
})
|
|
28
27
|
}
|
|
@@ -1,40 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
-
const invariant = require("tiny-invariant");
|
|
4
|
-
const serverFnReturnTypeHeader = "server-fn-return-type";
|
|
5
|
-
const serverFnPayloadTypeHeader = "server-fn-payload-type";
|
|
6
|
-
function createServerFn(method, fn) {
|
|
7
|
-
const compiledFn = fn;
|
|
8
|
-
invariant(
|
|
9
|
-
compiledFn.url,
|
|
10
|
-
`createServerFn must be called with a function that is marked with the 'use server' pragma.`
|
|
11
|
-
);
|
|
12
|
-
return Object.assign(
|
|
13
|
-
async (payload, opts) => {
|
|
14
|
-
return compiledFn({
|
|
15
|
-
method,
|
|
16
|
-
payload: payload || void 0,
|
|
17
|
-
requestInit: opts == null ? void 0 : opts.requestInit
|
|
18
|
-
});
|
|
19
|
-
},
|
|
20
|
-
{
|
|
21
|
-
url: fn.url
|
|
22
|
-
}
|
|
23
|
-
);
|
|
24
|
-
}
|
|
25
|
-
function json(payload, opts) {
|
|
26
|
-
return new Response(JSON.stringify(payload), {
|
|
27
|
-
status: (opts == null ? void 0 : opts.status) || 200,
|
|
28
|
-
statusText: (opts == null ? void 0 : opts.statusText) || (opts == null ? void 0 : opts.status) === 200 ? "OK" : "Error",
|
|
29
|
-
headers: {
|
|
30
|
-
"Content-Type": "application/json",
|
|
31
|
-
[serverFnReturnTypeHeader]: "json",
|
|
32
|
-
...opts == null ? void 0 : opts.headers
|
|
33
|
-
}
|
|
34
|
-
});
|
|
35
|
-
}
|
|
36
|
-
exports.createServerFn = createServerFn;
|
|
37
|
-
exports.json = json;
|
|
38
|
-
exports.serverFnPayloadTypeHeader = serverFnPayloadTypeHeader;
|
|
39
|
-
exports.serverFnReturnTypeHeader = serverFnReturnTypeHeader;
|
|
40
|
-
//# sourceMappingURL=createServerFn.cjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"createServerFn.cjs","sources":["../../src/createServerFn.ts"],"sourcesContent":["import invariant from 'tiny-invariant'\n\nexport const serverFnReturnTypeHeader = 'server-fn-return-type'\nexport const serverFnPayloadTypeHeader = 'server-fn-payload-type'\n\nexport interface JsonResponse<TData> extends Response {\n json(): Promise<TData>\n}\n\nexport type FetcherOptionsBase = {\n method?: 'GET' | 'POST'\n}\n\nexport type FetcherOptions = FetcherOptionsBase & {\n requestInit?: RequestInit\n}\n\nexport type FetchFnCtx = {\n method: 'GET' | 'POST'\n request: Request\n}\n\nexport type FetchFn<TPayload, TResponse> = {\n (payload: TPayload, ctx: FetchFnCtx): Promise<TResponse> | TResponse\n url?: string\n}\n\nexport type CompiledFetcherFnOptions<TPayload> = {\n method: 'GET' | 'POST'\n payload: TPayload | undefined\n requestInit?: RequestInit\n}\n\nexport type CompiledFetcherFn<TPayload, TResponse> = {\n (opts: CompiledFetcherFnOptions<TPayload>): Promise<TResponse>\n url: string\n}\n\ntype IsPayloadOptional<T> = [T] extends [undefined] ? true : false\n\nexport type Fetcher<TPayload, TResponse> =\n (IsPayloadOptional<TPayload> extends true\n ? {\n (\n payload?: TPayload,\n opts?: FetcherOptions,\n ): Promise<JsonResponseOrPayload<TResponse>>\n }\n : {\n (\n payload: TPayload,\n opts?: FetcherOptions,\n ): Promise<JsonResponseOrPayload<TResponse>>\n }) & {\n url: string\n }\n\nexport type JsonResponseOrPayload<TResponse> =\n TResponse extends JsonResponse<infer TData> ? TData : TResponse\n\nexport function createServerFn<\n TPayload extends any = undefined,\n TResponse = unknown,\n>(\n method: 'GET' | 'POST',\n fn: FetchFn<TPayload, TResponse>,\n): Fetcher<TPayload, TResponse> {\n // Cast the compiled function that will be injected by vinxi\n const compiledFn = fn as unknown as CompiledFetcherFn<TPayload, TResponse>\n\n invariant(\n compiledFn.url,\n `createServerFn must be called with a function that is marked with the 'use server' pragma.`,\n )\n\n return Object.assign(\n async (payload: TPayload, opts?: FetcherOptions) => {\n return compiledFn({\n method,\n payload: payload || undefined,\n requestInit: opts?.requestInit,\n })\n },\n {\n url: fn.url!,\n },\n ) as Fetcher<TPayload, TResponse>\n}\n\nexport function json<TData>(\n payload: TData,\n opts?: {\n status?: number\n statusText?: string\n headers?: HeadersInit\n },\n): JsonResponse<TData> {\n return new Response(JSON.stringify(payload), {\n status: opts?.status || 200,\n statusText: opts?.statusText || opts?.status === 200 ? 'OK' : 'Error',\n headers: {\n 'Content-Type': 'application/json',\n [serverFnReturnTypeHeader]: 'json',\n ...opts?.headers,\n },\n })\n}\n"],"names":[],"mappings":";;;AAEO,MAAM,2BAA2B;AACjC,MAAM,4BAA4B;AAyDzB,SAAA,eAId,QACA,IAC8B;AAE9B,QAAM,aAAa;AAEnB;AAAA,IACE,WAAW;AAAA,IACX;AAAA,EAAA;AAGF,SAAO,OAAO;AAAA,IACZ,OAAO,SAAmB,SAA0B;AAClD,aAAO,WAAW;AAAA,QAChB;AAAA,QACA,SAAS,WAAW;AAAA,QACpB,aAAa,6BAAM;AAAA,MAAA,CACpB;AAAA,IACH;AAAA,IACA;AAAA,MACE,KAAK,GAAG;AAAA,IACV;AAAA,EAAA;AAEJ;AAEgB,SAAA,KACd,SACA,MAKqB;AACrB,SAAO,IAAI,SAAS,KAAK,UAAU,OAAO,GAAG;AAAA,IAC3C,SAAQ,6BAAM,WAAU;AAAA,IACxB,aAAY,6BAAM,gBAAc,6BAAM,YAAW,MAAM,OAAO;AAAA,IAC9D,SAAS;AAAA,MACP,gBAAgB;AAAA,MAChB,CAAC,wBAAwB,GAAG;AAAA,MAC5B,GAAG,6BAAM;AAAA,IACX;AAAA,EAAA,CACD;AACH;;;;;"}
|
|
@@ -1,44 +0,0 @@
|
|
|
1
|
-
export declare const serverFnReturnTypeHeader = "server-fn-return-type";
|
|
2
|
-
export declare const serverFnPayloadTypeHeader = "server-fn-payload-type";
|
|
3
|
-
export interface JsonResponse<TData> extends Response {
|
|
4
|
-
json(): Promise<TData>;
|
|
5
|
-
}
|
|
6
|
-
export type FetcherOptionsBase = {
|
|
7
|
-
method?: 'GET' | 'POST';
|
|
8
|
-
};
|
|
9
|
-
export type FetcherOptions = FetcherOptionsBase & {
|
|
10
|
-
requestInit?: RequestInit;
|
|
11
|
-
};
|
|
12
|
-
export type FetchFnCtx = {
|
|
13
|
-
method: 'GET' | 'POST';
|
|
14
|
-
request: Request;
|
|
15
|
-
};
|
|
16
|
-
export type FetchFn<TPayload, TResponse> = {
|
|
17
|
-
(payload: TPayload, ctx: FetchFnCtx): Promise<TResponse> | TResponse;
|
|
18
|
-
url?: string;
|
|
19
|
-
};
|
|
20
|
-
export type CompiledFetcherFnOptions<TPayload> = {
|
|
21
|
-
method: 'GET' | 'POST';
|
|
22
|
-
payload: TPayload | undefined;
|
|
23
|
-
requestInit?: RequestInit;
|
|
24
|
-
};
|
|
25
|
-
export type CompiledFetcherFn<TPayload, TResponse> = {
|
|
26
|
-
(opts: CompiledFetcherFnOptions<TPayload>): Promise<TResponse>;
|
|
27
|
-
url: string;
|
|
28
|
-
};
|
|
29
|
-
type IsPayloadOptional<T> = [T] extends [undefined] ? true : false;
|
|
30
|
-
export type Fetcher<TPayload, TResponse> = (IsPayloadOptional<TPayload> extends true ? {
|
|
31
|
-
(payload?: TPayload, opts?: FetcherOptions): Promise<JsonResponseOrPayload<TResponse>>;
|
|
32
|
-
} : {
|
|
33
|
-
(payload: TPayload, opts?: FetcherOptions): Promise<JsonResponseOrPayload<TResponse>>;
|
|
34
|
-
}) & {
|
|
35
|
-
url: string;
|
|
36
|
-
};
|
|
37
|
-
export type JsonResponseOrPayload<TResponse> = TResponse extends JsonResponse<infer TData> ? TData : TResponse;
|
|
38
|
-
export declare function createServerFn<TPayload extends any = undefined, TResponse = unknown>(method: 'GET' | 'POST', fn: FetchFn<TPayload, TResponse>): Fetcher<TPayload, TResponse>;
|
|
39
|
-
export declare function json<TData>(payload: TData, opts?: {
|
|
40
|
-
status?: number;
|
|
41
|
-
statusText?: string;
|
|
42
|
-
headers?: HeadersInit;
|
|
43
|
-
}): JsonResponse<TData>;
|
|
44
|
-
export {};
|
|
@@ -1,44 +0,0 @@
|
|
|
1
|
-
export declare const serverFnReturnTypeHeader = "server-fn-return-type";
|
|
2
|
-
export declare const serverFnPayloadTypeHeader = "server-fn-payload-type";
|
|
3
|
-
export interface JsonResponse<TData> extends Response {
|
|
4
|
-
json(): Promise<TData>;
|
|
5
|
-
}
|
|
6
|
-
export type FetcherOptionsBase = {
|
|
7
|
-
method?: 'GET' | 'POST';
|
|
8
|
-
};
|
|
9
|
-
export type FetcherOptions = FetcherOptionsBase & {
|
|
10
|
-
requestInit?: RequestInit;
|
|
11
|
-
};
|
|
12
|
-
export type FetchFnCtx = {
|
|
13
|
-
method: 'GET' | 'POST';
|
|
14
|
-
request: Request;
|
|
15
|
-
};
|
|
16
|
-
export type FetchFn<TPayload, TResponse> = {
|
|
17
|
-
(payload: TPayload, ctx: FetchFnCtx): Promise<TResponse> | TResponse;
|
|
18
|
-
url?: string;
|
|
19
|
-
};
|
|
20
|
-
export type CompiledFetcherFnOptions<TPayload> = {
|
|
21
|
-
method: 'GET' | 'POST';
|
|
22
|
-
payload: TPayload | undefined;
|
|
23
|
-
requestInit?: RequestInit;
|
|
24
|
-
};
|
|
25
|
-
export type CompiledFetcherFn<TPayload, TResponse> = {
|
|
26
|
-
(opts: CompiledFetcherFnOptions<TPayload>): Promise<TResponse>;
|
|
27
|
-
url: string;
|
|
28
|
-
};
|
|
29
|
-
type IsPayloadOptional<T> = [T] extends [undefined] ? true : false;
|
|
30
|
-
export type Fetcher<TPayload, TResponse> = (IsPayloadOptional<TPayload> extends true ? {
|
|
31
|
-
(payload?: TPayload, opts?: FetcherOptions): Promise<JsonResponseOrPayload<TResponse>>;
|
|
32
|
-
} : {
|
|
33
|
-
(payload: TPayload, opts?: FetcherOptions): Promise<JsonResponseOrPayload<TResponse>>;
|
|
34
|
-
}) & {
|
|
35
|
-
url: string;
|
|
36
|
-
};
|
|
37
|
-
export type JsonResponseOrPayload<TResponse> = TResponse extends JsonResponse<infer TData> ? TData : TResponse;
|
|
38
|
-
export declare function createServerFn<TPayload extends any = undefined, TResponse = unknown>(method: 'GET' | 'POST', fn: FetchFn<TPayload, TResponse>): Fetcher<TPayload, TResponse>;
|
|
39
|
-
export declare function json<TData>(payload: TData, opts?: {
|
|
40
|
-
status?: number;
|
|
41
|
-
statusText?: string;
|
|
42
|
-
headers?: HeadersInit;
|
|
43
|
-
}): JsonResponse<TData>;
|
|
44
|
-
export {};
|
|
@@ -1,40 +0,0 @@
|
|
|
1
|
-
import invariant from "tiny-invariant";
|
|
2
|
-
const serverFnReturnTypeHeader = "server-fn-return-type";
|
|
3
|
-
const serverFnPayloadTypeHeader = "server-fn-payload-type";
|
|
4
|
-
function createServerFn(method, fn) {
|
|
5
|
-
const compiledFn = fn;
|
|
6
|
-
invariant(
|
|
7
|
-
compiledFn.url,
|
|
8
|
-
`createServerFn must be called with a function that is marked with the 'use server' pragma.`
|
|
9
|
-
);
|
|
10
|
-
return Object.assign(
|
|
11
|
-
async (payload, opts) => {
|
|
12
|
-
return compiledFn({
|
|
13
|
-
method,
|
|
14
|
-
payload: payload || void 0,
|
|
15
|
-
requestInit: opts == null ? void 0 : opts.requestInit
|
|
16
|
-
});
|
|
17
|
-
},
|
|
18
|
-
{
|
|
19
|
-
url: fn.url
|
|
20
|
-
}
|
|
21
|
-
);
|
|
22
|
-
}
|
|
23
|
-
function json(payload, opts) {
|
|
24
|
-
return new Response(JSON.stringify(payload), {
|
|
25
|
-
status: (opts == null ? void 0 : opts.status) || 200,
|
|
26
|
-
statusText: (opts == null ? void 0 : opts.statusText) || (opts == null ? void 0 : opts.status) === 200 ? "OK" : "Error",
|
|
27
|
-
headers: {
|
|
28
|
-
"Content-Type": "application/json",
|
|
29
|
-
[serverFnReturnTypeHeader]: "json",
|
|
30
|
-
...opts == null ? void 0 : opts.headers
|
|
31
|
-
}
|
|
32
|
-
});
|
|
33
|
-
}
|
|
34
|
-
export {
|
|
35
|
-
createServerFn,
|
|
36
|
-
json,
|
|
37
|
-
serverFnPayloadTypeHeader,
|
|
38
|
-
serverFnReturnTypeHeader
|
|
39
|
-
};
|
|
40
|
-
//# sourceMappingURL=createServerFn.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"createServerFn.js","sources":["../../src/createServerFn.ts"],"sourcesContent":["import invariant from 'tiny-invariant'\n\nexport const serverFnReturnTypeHeader = 'server-fn-return-type'\nexport const serverFnPayloadTypeHeader = 'server-fn-payload-type'\n\nexport interface JsonResponse<TData> extends Response {\n json(): Promise<TData>\n}\n\nexport type FetcherOptionsBase = {\n method?: 'GET' | 'POST'\n}\n\nexport type FetcherOptions = FetcherOptionsBase & {\n requestInit?: RequestInit\n}\n\nexport type FetchFnCtx = {\n method: 'GET' | 'POST'\n request: Request\n}\n\nexport type FetchFn<TPayload, TResponse> = {\n (payload: TPayload, ctx: FetchFnCtx): Promise<TResponse> | TResponse\n url?: string\n}\n\nexport type CompiledFetcherFnOptions<TPayload> = {\n method: 'GET' | 'POST'\n payload: TPayload | undefined\n requestInit?: RequestInit\n}\n\nexport type CompiledFetcherFn<TPayload, TResponse> = {\n (opts: CompiledFetcherFnOptions<TPayload>): Promise<TResponse>\n url: string\n}\n\ntype IsPayloadOptional<T> = [T] extends [undefined] ? true : false\n\nexport type Fetcher<TPayload, TResponse> =\n (IsPayloadOptional<TPayload> extends true\n ? {\n (\n payload?: TPayload,\n opts?: FetcherOptions,\n ): Promise<JsonResponseOrPayload<TResponse>>\n }\n : {\n (\n payload: TPayload,\n opts?: FetcherOptions,\n ): Promise<JsonResponseOrPayload<TResponse>>\n }) & {\n url: string\n }\n\nexport type JsonResponseOrPayload<TResponse> =\n TResponse extends JsonResponse<infer TData> ? TData : TResponse\n\nexport function createServerFn<\n TPayload extends any = undefined,\n TResponse = unknown,\n>(\n method: 'GET' | 'POST',\n fn: FetchFn<TPayload, TResponse>,\n): Fetcher<TPayload, TResponse> {\n // Cast the compiled function that will be injected by vinxi\n const compiledFn = fn as unknown as CompiledFetcherFn<TPayload, TResponse>\n\n invariant(\n compiledFn.url,\n `createServerFn must be called with a function that is marked with the 'use server' pragma.`,\n )\n\n return Object.assign(\n async (payload: TPayload, opts?: FetcherOptions) => {\n return compiledFn({\n method,\n payload: payload || undefined,\n requestInit: opts?.requestInit,\n })\n },\n {\n url: fn.url!,\n },\n ) as Fetcher<TPayload, TResponse>\n}\n\nexport function json<TData>(\n payload: TData,\n opts?: {\n status?: number\n statusText?: string\n headers?: HeadersInit\n },\n): JsonResponse<TData> {\n return new Response(JSON.stringify(payload), {\n status: opts?.status || 200,\n statusText: opts?.statusText || opts?.status === 200 ? 'OK' : 'Error',\n headers: {\n 'Content-Type': 'application/json',\n [serverFnReturnTypeHeader]: 'json',\n ...opts?.headers,\n },\n })\n}\n"],"names":[],"mappings":";AAEO,MAAM,2BAA2B;AACjC,MAAM,4BAA4B;AAyDzB,SAAA,eAId,QACA,IAC8B;AAE9B,QAAM,aAAa;AAEnB;AAAA,IACE,WAAW;AAAA,IACX;AAAA,EAAA;AAGF,SAAO,OAAO;AAAA,IACZ,OAAO,SAAmB,SAA0B;AAClD,aAAO,WAAW;AAAA,QAChB;AAAA,QACA,SAAS,WAAW;AAAA,QACpB,aAAa,6BAAM;AAAA,MAAA,CACpB;AAAA,IACH;AAAA,IACA;AAAA,MACE,KAAK,GAAG;AAAA,IACV;AAAA,EAAA;AAEJ;AAEgB,SAAA,KACd,SACA,MAKqB;AACrB,SAAO,IAAI,SAAS,KAAK,UAAU,OAAO,GAAG;AAAA,IAC3C,SAAQ,6BAAM,WAAU;AAAA,IACxB,aAAY,6BAAM,gBAAc,6BAAM,YAAW,MAAM,OAAO;AAAA,IAC9D,SAAS;AAAA,MACP,gBAAgB;AAAA,MAChB,CAAC,wBAAwB,GAAG;AAAA,MAC5B,GAAG,6BAAM;AAAA,IACX;AAAA,EAAA,CACD;AACH;"}
|
package/src/createServerFn.ts
DELETED
|
@@ -1,107 +0,0 @@
|
|
|
1
|
-
import invariant from 'tiny-invariant'
|
|
2
|
-
|
|
3
|
-
export const serverFnReturnTypeHeader = 'server-fn-return-type'
|
|
4
|
-
export const serverFnPayloadTypeHeader = 'server-fn-payload-type'
|
|
5
|
-
|
|
6
|
-
export interface JsonResponse<TData> extends Response {
|
|
7
|
-
json(): Promise<TData>
|
|
8
|
-
}
|
|
9
|
-
|
|
10
|
-
export type FetcherOptionsBase = {
|
|
11
|
-
method?: 'GET' | 'POST'
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
export type FetcherOptions = FetcherOptionsBase & {
|
|
15
|
-
requestInit?: RequestInit
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
export type FetchFnCtx = {
|
|
19
|
-
method: 'GET' | 'POST'
|
|
20
|
-
request: Request
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
export type FetchFn<TPayload, TResponse> = {
|
|
24
|
-
(payload: TPayload, ctx: FetchFnCtx): Promise<TResponse> | TResponse
|
|
25
|
-
url?: string
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
export type CompiledFetcherFnOptions<TPayload> = {
|
|
29
|
-
method: 'GET' | 'POST'
|
|
30
|
-
payload: TPayload | undefined
|
|
31
|
-
requestInit?: RequestInit
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
export type CompiledFetcherFn<TPayload, TResponse> = {
|
|
35
|
-
(opts: CompiledFetcherFnOptions<TPayload>): Promise<TResponse>
|
|
36
|
-
url: string
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
type IsPayloadOptional<T> = [T] extends [undefined] ? true : false
|
|
40
|
-
|
|
41
|
-
export type Fetcher<TPayload, TResponse> =
|
|
42
|
-
(IsPayloadOptional<TPayload> extends true
|
|
43
|
-
? {
|
|
44
|
-
(
|
|
45
|
-
payload?: TPayload,
|
|
46
|
-
opts?: FetcherOptions,
|
|
47
|
-
): Promise<JsonResponseOrPayload<TResponse>>
|
|
48
|
-
}
|
|
49
|
-
: {
|
|
50
|
-
(
|
|
51
|
-
payload: TPayload,
|
|
52
|
-
opts?: FetcherOptions,
|
|
53
|
-
): Promise<JsonResponseOrPayload<TResponse>>
|
|
54
|
-
}) & {
|
|
55
|
-
url: string
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
export type JsonResponseOrPayload<TResponse> =
|
|
59
|
-
TResponse extends JsonResponse<infer TData> ? TData : TResponse
|
|
60
|
-
|
|
61
|
-
export function createServerFn<
|
|
62
|
-
TPayload extends any = undefined,
|
|
63
|
-
TResponse = unknown,
|
|
64
|
-
>(
|
|
65
|
-
method: 'GET' | 'POST',
|
|
66
|
-
fn: FetchFn<TPayload, TResponse>,
|
|
67
|
-
): Fetcher<TPayload, TResponse> {
|
|
68
|
-
// Cast the compiled function that will be injected by vinxi
|
|
69
|
-
const compiledFn = fn as unknown as CompiledFetcherFn<TPayload, TResponse>
|
|
70
|
-
|
|
71
|
-
invariant(
|
|
72
|
-
compiledFn.url,
|
|
73
|
-
`createServerFn must be called with a function that is marked with the 'use server' pragma.`,
|
|
74
|
-
)
|
|
75
|
-
|
|
76
|
-
return Object.assign(
|
|
77
|
-
async (payload: TPayload, opts?: FetcherOptions) => {
|
|
78
|
-
return compiledFn({
|
|
79
|
-
method,
|
|
80
|
-
payload: payload || undefined,
|
|
81
|
-
requestInit: opts?.requestInit,
|
|
82
|
-
})
|
|
83
|
-
},
|
|
84
|
-
{
|
|
85
|
-
url: fn.url!,
|
|
86
|
-
},
|
|
87
|
-
) as Fetcher<TPayload, TResponse>
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
export function json<TData>(
|
|
91
|
-
payload: TData,
|
|
92
|
-
opts?: {
|
|
93
|
-
status?: number
|
|
94
|
-
statusText?: string
|
|
95
|
-
headers?: HeadersInit
|
|
96
|
-
},
|
|
97
|
-
): JsonResponse<TData> {
|
|
98
|
-
return new Response(JSON.stringify(payload), {
|
|
99
|
-
status: opts?.status || 200,
|
|
100
|
-
statusText: opts?.statusText || opts?.status === 200 ? 'OK' : 'Error',
|
|
101
|
-
headers: {
|
|
102
|
-
'Content-Type': 'application/json',
|
|
103
|
-
[serverFnReturnTypeHeader]: 'json',
|
|
104
|
-
...opts?.headers,
|
|
105
|
-
},
|
|
106
|
-
})
|
|
107
|
-
}
|