@tanstack/react-router 0.0.1-beta.230 → 0.0.1-beta.232
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/build/cjs/Matches.js +4 -1
- package/build/cjs/Matches.js.map +1 -1
- package/build/cjs/RouterProvider.js +34 -37
- package/build/cjs/RouterProvider.js.map +1 -1
- package/build/cjs/awaited.js +1 -1
- package/build/cjs/awaited.js.map +1 -1
- package/build/cjs/index.js +4 -3
- package/build/cjs/index.js.map +1 -1
- package/build/cjs/router.js +70 -70
- package/build/cjs/router.js.map +1 -1
- package/build/cjs/scroll-restoration.js +52 -29
- package/build/cjs/scroll-restoration.js.map +1 -1
- package/build/esm/index.js +155 -133
- package/build/esm/index.js.map +1 -1
- package/build/stats-html.html +1 -1
- package/build/stats-react.json +293 -293
- package/build/types/RouterProvider.d.ts +0 -5
- package/build/types/router.d.ts +14 -2
- package/build/types/scroll-restoration.d.ts +12 -0
- package/build/umd/index.development.js +154 -131
- package/build/umd/index.development.js.map +1 -1
- package/build/umd/index.production.js +2 -2
- package/build/umd/index.production.js.map +1 -1
- package/package.json +2 -2
- package/src/Matches.tsx +3 -1
- package/src/RouterProvider.tsx +42 -46
- package/src/awaited.tsx +1 -1
- package/src/router.ts +106 -84
- package/src/scroll-restoration.tsx +81 -43
package/build/cjs/Matches.js
CHANGED
|
@@ -80,7 +80,10 @@ function Match({
|
|
|
80
80
|
const match = matches[0];
|
|
81
81
|
const routeId = match?.routeId;
|
|
82
82
|
const route = routesById[routeId];
|
|
83
|
-
const
|
|
83
|
+
const router = RouterProvider.useRouter();
|
|
84
|
+
const locationKey = router.latestLocation.state?.key;
|
|
85
|
+
// const locationKey = useRouterState().location.state?.key
|
|
86
|
+
|
|
84
87
|
const PendingComponent = route.options.pendingComponent ?? options.defaultPendingComponent;
|
|
85
88
|
const pendingElement = PendingComponent ? /*#__PURE__*/React__namespace.createElement(PendingComponent, {
|
|
86
89
|
useMatch: route.useMatch,
|
package/build/cjs/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 { useRouter, useRouterState } from './RouterProvider'\nimport { ResolveRelativePath, ToOptions } from './link'\nimport { AnyRoute, ReactNode, rootRouteId } from './route'\nimport {\n FullSearchSchema,\n ParseRoute,\n RouteById,\n RouteByPath,\n RouteIds,\n RoutePaths,\n} from './routeInfo'\nimport { RegisteredRouter } from './router'\nimport { NoInfer, StrictOrFrom, pick } from './utils'\n\nexport interface RouteMatch<\n TRouteTree extends AnyRoute = AnyRoute,\n TRouteId extends RouteIds<TRouteTree> = ParseRoute<TRouteTree>['id'],\n> {\n id: string\n routeId: TRouteId\n pathname: string\n params: RouteById<TRouteTree, TRouteId>['types']['allParams']\n status: 'pending' | 'success' | 'error'\n isFetching: boolean\n showPending: boolean\n invalid: 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 __resolveLoadPromise?: () => void\n context: RouteById<TRouteTree, TRouteId>['types']['allContext']\n search: FullSearchSchema<TRouteTree> &\n RouteById<TRouteTree, TRouteId>['types']['fullSearchSchema']\n fetchedAt: number\n shouldReloadDeps: any\n abortController: AbortController\n cause: 'enter' | 'stay'\n}\n\nexport type AnyRouteMatch = RouteMatch<any>\n\nexport function Matches() {\n const { routesById, state } = useRouter()\n const { matches } = state\n\n const locationKey = useRouterState().location.state.key\n\n const route = routesById[rootRouteId]!\n\n const errorComponent = React.useCallback(\n (props: any) => {\n return React.createElement(ErrorComponent, {\n ...props,\n useMatch: route.useMatch,\n useRouteContext: route.useRouteContext,\n useSearch: route.useSearch,\n useParams: route.useParams,\n })\n },\n [route],\n )\n\n return (\n <matchesContext.Provider value={matches}>\n <CatchBoundary\n resetKey={locationKey}\n errorComponent={errorComponent}\n onCatch={() => {\n warning(\n false,\n `Error in router! Consider setting an 'errorComponent' in your RootRoute! 👍`,\n )\n }}\n >\n {matches.length ? <Match matches={matches} /> : null}\n </CatchBoundary>\n </matchesContext.Provider>\n )\n}\n\nfunction SafeFragment(props: any) {\n return <>{props.children}</>\n}\n\nexport function Match({ matches }: { matches: RouteMatch[] }) {\n const { options, routesById } = useRouter()\n const match = matches[0]!\n const routeId = match?.routeId\n const route = routesById[routeId]!\n const locationKey = useRouterState().location.state?.key\n\n const PendingComponent = (route.options.pendingComponent ??\n options.defaultPendingComponent) as any\n\n const pendingElement = PendingComponent\n ? React.createElement(PendingComponent, {\n useMatch: route.useMatch,\n useRouteContext: route.useRouteContext,\n useSearch: route.useSearch,\n useParams: route.useParams,\n })\n : undefined\n\n const routeErrorComponent =\n route.options.errorComponent ??\n options.defaultErrorComponent ??\n ErrorComponent\n\n const ResolvedSuspenseBoundary =\n route.options.wrapInSuspense ?? pendingElement\n ? React.Suspense\n : SafeFragment\n\n const errorComponent = routeErrorComponent\n ? React.useCallback(\n (props: any) => {\n return React.createElement(routeErrorComponent, {\n ...props,\n useMatch: route.useMatch,\n useRouteContext: route.useRouteContext,\n useSearch: route.useSearch,\n useParams: route.useParams,\n })\n },\n [route],\n )\n : undefined\n\n const ResolvedCatchBoundary = errorComponent ? CatchBoundary : SafeFragment\n\n return (\n <matchesContext.Provider value={matches}>\n <ResolvedSuspenseBoundary fallback={pendingElement}>\n <ResolvedCatchBoundary\n resetKey={locationKey}\n errorComponent={errorComponent}\n onCatch={() => {\n warning(false, `Error in route match: ${match.id}`)\n }}\n >\n <MatchInner match={match} pendingElement={pendingElement} />\n </ResolvedCatchBoundary>\n </ResolvedSuspenseBoundary>\n </matchesContext.Provider>\n )\n}\nfunction MatchInner({\n match,\n pendingElement,\n}: {\n match: RouteMatch\n pendingElement: any\n}): any {\n const { options, routesById } = useRouter()\n const route = routesById[match.routeId]!\n\n if (match.status === 'error') {\n throw match.error\n }\n\n if (match.status === 'pending') {\n if (match.showPending) {\n return pendingElement || null\n }\n throw match.loadPromise\n }\n\n if (match.status === 'success') {\n let comp = route.options.component ?? options.defaultComponent\n\n if (comp) {\n return React.createElement(comp, {\n useMatch: route.useMatch,\n useRouteContext: route.useRouteContext as any,\n useSearch: route.useSearch,\n useParams: route.useParams as any,\n useLoaderData: route.useLoaderData,\n })\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 function Outlet() {\n const matches = React.useContext(matchesContext).slice(1)\n\n if (!matches[0]) {\n return null\n }\n\n return <Match matches={matches} />\n}\n\nexport interface MatchRouteOptions {\n pending?: boolean\n caseSensitive?: boolean\n includeSearch?: boolean\n fuzzy?: boolean\n}\n\nexport type MakeUseMatchRouteOptions<\n TRouteTree extends AnyRoute = RegisteredRouter['routeTree'],\n TFrom extends RoutePaths<TRouteTree> = '/',\n TTo extends string = '',\n TMaskFrom extends RoutePaths<TRouteTree> = '/',\n TMaskTo extends string = '',\n> = ToOptions<AnyRoute, TFrom, TTo, TMaskFrom, TMaskTo> & MatchRouteOptions\n\nexport function useMatchRoute<\n TRouteTree extends AnyRoute = RegisteredRouter['routeTree'],\n>() {\n const { matchRoute } = useRouter()\n\n return React.useCallback(\n <\n TFrom extends RoutePaths<TRouteTree> = '/',\n TTo extends string = '',\n TMaskFrom extends RoutePaths<TRouteTree> = '/',\n TMaskTo extends string = '',\n TResolved extends string = ResolveRelativePath<TFrom, NoInfer<TTo>>,\n >(\n opts: MakeUseMatchRouteOptions<\n TRouteTree,\n TFrom,\n TTo,\n TMaskFrom,\n TMaskTo\n >,\n ): false | RouteById<TRouteTree, TResolved>['types']['allParams'] => {\n const { pending, caseSensitive, ...rest } = opts\n\n return matchRoute(rest as any, {\n pending,\n caseSensitive,\n })\n },\n [],\n )\n}\n\nexport type MakeMatchRouteOptions<\n TRouteTree extends AnyRoute = RegisteredRouter['routeTree'],\n TFrom extends RoutePaths<TRouteTree> = '/',\n TTo extends string = '',\n TMaskFrom extends RoutePaths<TRouteTree> = '/',\n TMaskTo extends string = '',\n> = ToOptions<TRouteTree, TFrom, TTo, TMaskFrom, TMaskTo> &\n MatchRouteOptions & {\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> = '/',\n TTo extends string = '',\n TMaskFrom extends RoutePaths<TRouteTree> = '/',\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 useMatch<\n TRouteTree extends AnyRoute = RegisteredRouter['routeTree'],\n TFrom extends RouteIds<TRouteTree> = RouteIds<TRouteTree>,\n TStrict extends boolean = true,\n TRouteMatchState = RouteMatch<TRouteTree, TFrom>,\n TSelected = TRouteMatchState,\n>(\n opts: StrictOrFrom<TFrom> & {\n select?: (match: TRouteMatchState) => TSelected\n },\n): TStrict extends true ? TSelected : TSelected | undefined {\n const nearestMatch = React.useContext(matchesContext)[0]!\n const nearestMatchRouteId = nearestMatch?.routeId\n\n const matchRouteId = useRouterState({\n select: (state) => {\n const match = opts?.from\n ? state.matches.find((d) => d.routeId === opts?.from)\n : state.matches.find((d) => d.id === nearestMatch.id)\n\n return match!.routeId\n },\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 = opts?.from\n ? state.matches.find((d) => d.routeId === opts?.from)\n : state.matches.find((d) => d.id === nearestMatch.id)\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 const matchesContext = React.createContext<RouteMatch[]>(null!)\n\nexport function useMatches<T = RouteMatch[]>(opts?: {\n select?: (matches: RouteMatch[]) => T\n}): T {\n const contextMatches = React.useContext(matchesContext)\n\n return useRouterState({\n select: (state) => {\n const matches = state.matches.slice(\n state.matches.findIndex((d) => d.id === contextMatches[0]?.id),\n )\n return opts?.select ? opts.select(matches) : (matches as T)\n },\n })\n}\n\nexport function useLoaderData<\n TRouteTree extends AnyRoute = RegisteredRouter['routeTree'],\n TFrom extends RouteIds<TRouteTree> = RouteIds<TRouteTree>,\n TStrict extends boolean = true,\n TRouteMatch extends RouteMatch<TRouteTree, TFrom> = RouteMatch<\n TRouteTree,\n TFrom\n >,\n TSelected = TRouteMatch['loaderData'],\n>(\n opts: StrictOrFrom<TFrom> & {\n select?: (match: TRouteMatch) => TSelected\n },\n): TStrict extends true ? TSelected : TSelected | undefined {\n const match = useMatch({ ...opts, select: undefined })!\n\n return typeof opts.select === 'function'\n ? opts.select(match?.loaderData)\n : match?.loaderData\n}\n"],"names":["Matches","routesById","state","useRouter","matches","locationKey","useRouterState","location","key","route","rootRouteId","errorComponent","React","useCallback","props","createElement","ErrorComponent","useMatch","useRouteContext","useSearch","useParams","matchesContext","Provider","value","CatchBoundary","resetKey","onCatch","warning","length","Match","SafeFragment","Fragment","children","options","match","routeId","PendingComponent","pendingComponent","defaultPendingComponent","pendingElement","undefined","routeErrorComponent","defaultErrorComponent","ResolvedSuspenseBoundary","wrapInSuspense","Suspense","ResolvedCatchBoundary","fallback","id","MatchInner","status","error","showPending","loadPromise","comp","component","defaultComponent","useLoaderData","Outlet","invariant","useContext","slice","useMatchRoute","matchRoute","opts","pending","caseSensitive","rest","MatchRoute","params","nearestMatch","nearestMatchRouteId","matchRouteId","select","from","find","d","strict","matchSelection","createContext","useMatches","contextMatches","findIndex","loaderData"],"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 { useRouter, useRouterState } from './RouterProvider'\nimport { ResolveRelativePath, ToOptions } from './link'\nimport { AnyRoute, ReactNode, rootRouteId } from './route'\nimport {\n FullSearchSchema,\n ParseRoute,\n RouteById,\n RouteByPath,\n RouteIds,\n RoutePaths,\n} from './routeInfo'\nimport { RegisteredRouter } from './router'\nimport { NoInfer, StrictOrFrom, pick } from './utils'\n\nexport interface RouteMatch<\n TRouteTree extends AnyRoute = AnyRoute,\n TRouteId extends RouteIds<TRouteTree> = ParseRoute<TRouteTree>['id'],\n> {\n id: string\n routeId: TRouteId\n pathname: string\n params: RouteById<TRouteTree, TRouteId>['types']['allParams']\n status: 'pending' | 'success' | 'error'\n isFetching: boolean\n showPending: boolean\n invalid: 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 __resolveLoadPromise?: () => void\n context: RouteById<TRouteTree, TRouteId>['types']['allContext']\n search: FullSearchSchema<TRouteTree> &\n RouteById<TRouteTree, TRouteId>['types']['fullSearchSchema']\n fetchedAt: number\n shouldReloadDeps: any\n abortController: AbortController\n cause: 'enter' | 'stay'\n}\n\nexport type AnyRouteMatch = RouteMatch<any>\n\nexport function Matches() {\n const { routesById, state } = useRouter()\n const { matches } = state\n\n const locationKey = useRouterState().location.state.key\n\n const route = routesById[rootRouteId]!\n\n const errorComponent = React.useCallback(\n (props: any) => {\n return React.createElement(ErrorComponent, {\n ...props,\n useMatch: route.useMatch,\n useRouteContext: route.useRouteContext,\n useSearch: route.useSearch,\n useParams: route.useParams,\n })\n },\n [route],\n )\n\n return (\n <matchesContext.Provider value={matches}>\n <CatchBoundary\n resetKey={locationKey}\n errorComponent={errorComponent}\n onCatch={() => {\n warning(\n false,\n `Error in router! Consider setting an 'errorComponent' in your RootRoute! 👍`,\n )\n }}\n >\n {matches.length ? <Match matches={matches} /> : null}\n </CatchBoundary>\n </matchesContext.Provider>\n )\n}\n\nfunction SafeFragment(props: any) {\n return <>{props.children}</>\n}\n\nexport function Match({ matches }: { matches: RouteMatch[] }) {\n const { options, routesById } = useRouter()\n const match = matches[0]!\n const routeId = match?.routeId\n const route = routesById[routeId]!\n const router = useRouter()\n const locationKey = router.latestLocation.state?.key\n // const locationKey = useRouterState().location.state?.key\n\n const PendingComponent = (route.options.pendingComponent ??\n options.defaultPendingComponent) as any\n\n const pendingElement = PendingComponent\n ? React.createElement(PendingComponent, {\n useMatch: route.useMatch,\n useRouteContext: route.useRouteContext,\n useSearch: route.useSearch,\n useParams: route.useParams,\n })\n : undefined\n\n const routeErrorComponent =\n route.options.errorComponent ??\n options.defaultErrorComponent ??\n ErrorComponent\n\n const ResolvedSuspenseBoundary =\n route.options.wrapInSuspense ?? pendingElement\n ? React.Suspense\n : SafeFragment\n\n const errorComponent = routeErrorComponent\n ? React.useCallback(\n (props: any) => {\n return React.createElement(routeErrorComponent, {\n ...props,\n useMatch: route.useMatch,\n useRouteContext: route.useRouteContext,\n useSearch: route.useSearch,\n useParams: route.useParams,\n })\n },\n [route],\n )\n : undefined\n\n const ResolvedCatchBoundary = errorComponent ? CatchBoundary : SafeFragment\n\n return (\n <matchesContext.Provider value={matches}>\n <ResolvedSuspenseBoundary fallback={pendingElement}>\n <ResolvedCatchBoundary\n resetKey={locationKey}\n errorComponent={errorComponent}\n onCatch={() => {\n warning(false, `Error in route match: ${match.id}`)\n }}\n >\n <MatchInner match={match} pendingElement={pendingElement} />\n </ResolvedCatchBoundary>\n </ResolvedSuspenseBoundary>\n </matchesContext.Provider>\n )\n}\nfunction MatchInner({\n match,\n pendingElement,\n}: {\n match: RouteMatch\n pendingElement: any\n}): any {\n const { options, routesById } = useRouter()\n const route = routesById[match.routeId]!\n\n if (match.status === 'error') {\n throw match.error\n }\n\n if (match.status === 'pending') {\n if (match.showPending) {\n return pendingElement || null\n }\n throw match.loadPromise\n }\n\n if (match.status === 'success') {\n let comp = route.options.component ?? options.defaultComponent\n\n if (comp) {\n return React.createElement(comp, {\n useMatch: route.useMatch,\n useRouteContext: route.useRouteContext as any,\n useSearch: route.useSearch,\n useParams: route.useParams as any,\n useLoaderData: route.useLoaderData,\n })\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 function Outlet() {\n const matches = React.useContext(matchesContext).slice(1)\n\n if (!matches[0]) {\n return null\n }\n\n return <Match matches={matches} />\n}\n\nexport interface MatchRouteOptions {\n pending?: boolean\n caseSensitive?: boolean\n includeSearch?: boolean\n fuzzy?: boolean\n}\n\nexport type MakeUseMatchRouteOptions<\n TRouteTree extends AnyRoute = RegisteredRouter['routeTree'],\n TFrom extends RoutePaths<TRouteTree> = '/',\n TTo extends string = '',\n TMaskFrom extends RoutePaths<TRouteTree> = '/',\n TMaskTo extends string = '',\n> = ToOptions<AnyRoute, TFrom, TTo, TMaskFrom, TMaskTo> & MatchRouteOptions\n\nexport function useMatchRoute<\n TRouteTree extends AnyRoute = RegisteredRouter['routeTree'],\n>() {\n const { matchRoute } = useRouter()\n\n return React.useCallback(\n <\n TFrom extends RoutePaths<TRouteTree> = '/',\n TTo extends string = '',\n TMaskFrom extends RoutePaths<TRouteTree> = '/',\n TMaskTo extends string = '',\n TResolved extends string = ResolveRelativePath<TFrom, NoInfer<TTo>>,\n >(\n opts: MakeUseMatchRouteOptions<\n TRouteTree,\n TFrom,\n TTo,\n TMaskFrom,\n TMaskTo\n >,\n ): false | RouteById<TRouteTree, TResolved>['types']['allParams'] => {\n const { pending, caseSensitive, ...rest } = opts\n\n return matchRoute(rest as any, {\n pending,\n caseSensitive,\n })\n },\n [],\n )\n}\n\nexport type MakeMatchRouteOptions<\n TRouteTree extends AnyRoute = RegisteredRouter['routeTree'],\n TFrom extends RoutePaths<TRouteTree> = '/',\n TTo extends string = '',\n TMaskFrom extends RoutePaths<TRouteTree> = '/',\n TMaskTo extends string = '',\n> = ToOptions<TRouteTree, TFrom, TTo, TMaskFrom, TMaskTo> &\n MatchRouteOptions & {\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> = '/',\n TTo extends string = '',\n TMaskFrom extends RoutePaths<TRouteTree> = '/',\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 useMatch<\n TRouteTree extends AnyRoute = RegisteredRouter['routeTree'],\n TFrom extends RouteIds<TRouteTree> = RouteIds<TRouteTree>,\n TStrict extends boolean = true,\n TRouteMatchState = RouteMatch<TRouteTree, TFrom>,\n TSelected = TRouteMatchState,\n>(\n opts: StrictOrFrom<TFrom> & {\n select?: (match: TRouteMatchState) => TSelected\n },\n): TStrict extends true ? TSelected : TSelected | undefined {\n const nearestMatch = React.useContext(matchesContext)[0]!\n const nearestMatchRouteId = nearestMatch?.routeId\n\n const matchRouteId = useRouterState({\n select: (state) => {\n const match = opts?.from\n ? state.matches.find((d) => d.routeId === opts?.from)\n : state.matches.find((d) => d.id === nearestMatch.id)\n\n return match!.routeId\n },\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 = opts?.from\n ? state.matches.find((d) => d.routeId === opts?.from)\n : state.matches.find((d) => d.id === nearestMatch.id)\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 const matchesContext = React.createContext<RouteMatch[]>(null!)\n\nexport function useMatches<T = RouteMatch[]>(opts?: {\n select?: (matches: RouteMatch[]) => T\n}): T {\n const contextMatches = React.useContext(matchesContext)\n\n return useRouterState({\n select: (state) => {\n const matches = state.matches.slice(\n state.matches.findIndex((d) => d.id === contextMatches[0]?.id),\n )\n return opts?.select ? opts.select(matches) : (matches as T)\n },\n })\n}\n\nexport function useLoaderData<\n TRouteTree extends AnyRoute = RegisteredRouter['routeTree'],\n TFrom extends RouteIds<TRouteTree> = RouteIds<TRouteTree>,\n TStrict extends boolean = true,\n TRouteMatch extends RouteMatch<TRouteTree, TFrom> = RouteMatch<\n TRouteTree,\n TFrom\n >,\n TSelected = TRouteMatch['loaderData'],\n>(\n opts: StrictOrFrom<TFrom> & {\n select?: (match: TRouteMatch) => TSelected\n },\n): TStrict extends true ? TSelected : TSelected | undefined {\n const match = useMatch({ ...opts, select: undefined })!\n\n return typeof opts.select === 'function'\n ? opts.select(match?.loaderData)\n : match?.loaderData\n}\n"],"names":["Matches","routesById","state","useRouter","matches","locationKey","useRouterState","location","key","route","rootRouteId","errorComponent","React","useCallback","props","createElement","ErrorComponent","useMatch","useRouteContext","useSearch","useParams","matchesContext","Provider","value","CatchBoundary","resetKey","onCatch","warning","length","Match","SafeFragment","Fragment","children","options","match","routeId","router","latestLocation","PendingComponent","pendingComponent","defaultPendingComponent","pendingElement","undefined","routeErrorComponent","defaultErrorComponent","ResolvedSuspenseBoundary","wrapInSuspense","Suspense","ResolvedCatchBoundary","fallback","id","MatchInner","status","error","showPending","loadPromise","comp","component","defaultComponent","useLoaderData","Outlet","invariant","useContext","slice","useMatchRoute","matchRoute","opts","pending","caseSensitive","rest","MatchRoute","params","nearestMatch","nearestMatchRouteId","matchRouteId","select","from","find","d","strict","matchSelection","createContext","useMatches","contextMatches","findIndex","loaderData"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAgDO,SAASA,OAAOA,GAAG;EACxB,MAAM;IAAEC,UAAU;AAAEC,IAAAA,KAAAA;GAAO,GAAGC,wBAAS,EAAE,CAAA;EACzC,MAAM;AAAEC,IAAAA,OAAAA;AAAQ,GAAC,GAAGF,KAAK,CAAA;EAEzB,MAAMG,WAAW,GAAGC,6BAAc,EAAE,CAACC,QAAQ,CAACL,KAAK,CAACM,GAAG,CAAA;AAEvD,EAAA,MAAMC,OAAK,GAAGR,UAAU,CAACS,iBAAW,CAAE,CAAA;AAEtC,EAAA,MAAMC,cAAc,GAAGC,gBAAK,CAACC,WAAW,CACrCC,KAAU,IAAK;AACd,IAAA,oBAAOF,gBAAK,CAACG,aAAa,CAACC,4BAAc,EAAE;AACzC,MAAA,GAAGF,KAAK;MACRG,QAAQ,EAAER,OAAK,CAACQ,QAAQ;MACxBC,eAAe,EAAET,OAAK,CAACS,eAAe;MACtCC,SAAS,EAAEV,OAAK,CAACU,SAAS;MAC1BC,SAAS,EAAEX,OAAK,CAACW,SAAAA;AACnB,KAAC,CAAC,CAAA;AACJ,GAAC,EACD,CAACX,OAAK,CACR,CAAC,CAAA;AAED,EAAA,oBACEG,gBAAA,CAAAG,aAAA,CAACM,cAAc,CAACC,QAAQ,EAAA;AAACC,IAAAA,KAAK,EAAEnB,OAAAA;AAAQ,GAAA,eACtCQ,gBAAA,CAAAG,aAAA,CAACS,2BAAa,EAAA;AACZC,IAAAA,QAAQ,EAAEpB,WAAY;AACtBM,IAAAA,cAAc,EAAEA,cAAe;IAC/Be,OAAO,EAAEA,MAAM;AACbC,MAAAA,OAAO,CACL,KAAK,EACJ,CAAA,2EAAA,CACH,CAAC,CAAA;AACH,KAAA;GAECvB,EAAAA,OAAO,CAACwB,MAAM,gBAAGhB,gBAAA,CAAAG,aAAA,CAACc,KAAK,EAAA;AAACzB,IAAAA,OAAO,EAAEA,OAAAA;AAAQ,GAAE,CAAC,GAAG,IACnC,CACQ,CAAC,CAAA;AAE9B,CAAA;AAEA,SAAS0B,YAAYA,CAAChB,KAAU,EAAE;EAChC,oBAAOF,gBAAA,CAAAG,aAAA,CAAAH,gBAAA,CAAAmB,QAAA,EAAGjB,IAAAA,EAAAA,KAAK,CAACkB,QAAW,CAAC,CAAA;AAC9B,CAAA;AAEO,SAASH,KAAKA,CAAC;AAAEzB,EAAAA,OAAAA;AAAmC,CAAC,EAAE;EAC5D,MAAM;IAAE6B,OAAO;AAAEhC,IAAAA,UAAAA;GAAY,GAAGE,wBAAS,EAAE,CAAA;AAC3C,EAAA,MAAM+B,KAAK,GAAG9B,OAAO,CAAC,CAAC,CAAE,CAAA;AACzB,EAAA,MAAM+B,OAAO,GAAGD,KAAK,EAAEC,OAAO,CAAA;AAC9B,EAAA,MAAM1B,KAAK,GAAGR,UAAU,CAACkC,OAAO,CAAE,CAAA;AAClC,EAAA,MAAMC,MAAM,GAAGjC,wBAAS,EAAE,CAAA;EAC1B,MAAME,WAAW,GAAG+B,MAAM,CAACC,cAAc,CAACnC,KAAK,EAAEM,GAAG,CAAA;AACpD;;EAEA,MAAM8B,gBAAgB,GAAI7B,KAAK,CAACwB,OAAO,CAACM,gBAAgB,IACtDN,OAAO,CAACO,uBAA+B,CAAA;EAEzC,MAAMC,cAAc,GAAGH,gBAAgB,gBACnC1B,gBAAK,CAACG,aAAa,CAACuB,gBAAgB,EAAE;IACpCrB,QAAQ,EAAER,KAAK,CAACQ,QAAQ;IACxBC,eAAe,EAAET,KAAK,CAACS,eAAe;IACtCC,SAAS,EAAEV,KAAK,CAACU,SAAS;IAC1BC,SAAS,EAAEX,KAAK,CAACW,SAAAA;GAClB,CAAC,GACFsB,SAAS,CAAA;AAEb,EAAA,MAAMC,mBAAmB,GACvBlC,KAAK,CAACwB,OAAO,CAACtB,cAAc,IAC5BsB,OAAO,CAACW,qBAAqB,IAC7B5B,4BAAc,CAAA;AAEhB,EAAA,MAAM6B,wBAAwB,GAC5BpC,KAAK,CAACwB,OAAO,CAACa,cAAc,IAAIL,cAAc,GAC1C7B,gBAAK,CAACmC,QAAQ,GACdjB,YAAY,CAAA;EAElB,MAAMnB,cAAc,GAAGgC,mBAAmB,GACtC/B,gBAAK,CAACC,WAAW,CACdC,KAAU,IAAK;AACd,IAAA,oBAAOF,gBAAK,CAACG,aAAa,CAAC4B,mBAAmB,EAAE;AAC9C,MAAA,GAAG7B,KAAK;MACRG,QAAQ,EAAER,KAAK,CAACQ,QAAQ;MACxBC,eAAe,EAAET,KAAK,CAACS,eAAe;MACtCC,SAAS,EAAEV,KAAK,CAACU,SAAS;MAC1BC,SAAS,EAAEX,KAAK,CAACW,SAAAA;AACnB,KAAC,CAAC,CAAA;AACJ,GAAC,EACD,CAACX,KAAK,CACR,CAAC,GACDiC,SAAS,CAAA;AAEb,EAAA,MAAMM,qBAAqB,GAAGrC,cAAc,GAAGa,2BAAa,GAAGM,YAAY,CAAA;AAE3E,EAAA,oBACElB,gBAAA,CAAAG,aAAA,CAACM,cAAc,CAACC,QAAQ,EAAA;AAACC,IAAAA,KAAK,EAAEnB,OAAAA;AAAQ,GAAA,eACtCQ,gBAAA,CAAAG,aAAA,CAAC8B,wBAAwB,EAAA;AAACI,IAAAA,QAAQ,EAAER,cAAAA;AAAe,GAAA,eACjD7B,gBAAA,CAAAG,aAAA,CAACiC,qBAAqB,EAAA;AACpBvB,IAAAA,QAAQ,EAAEpB,WAAY;AACtBM,IAAAA,cAAc,EAAEA,cAAe;IAC/Be,OAAO,EAAEA,MAAM;MACbC,OAAO,CAAC,KAAK,EAAG,CAAA,sBAAA,EAAwBO,KAAK,CAACgB,EAAG,EAAC,CAAC,CAAA;AACrD,KAAA;AAAE,GAAA,eAEFtC,gBAAA,CAAAG,aAAA,CAACoC,UAAU,EAAA;AAACjB,IAAAA,KAAK,EAAEA,KAAM;AAACO,IAAAA,cAAc,EAAEA,cAAAA;GAAiB,CACtC,CACC,CACH,CAAC,CAAA;AAE9B,CAAA;AACA,SAASU,UAAUA,CAAC;EAClBjB,KAAK;AACLO,EAAAA,cAAAA;AAIF,CAAC,EAAO;EACN,MAAM;IAAER,OAAO;AAAEhC,IAAAA,UAAAA;GAAY,GAAGE,wBAAS,EAAE,CAAA;AAC3C,EAAA,MAAMM,KAAK,GAAGR,UAAU,CAACiC,KAAK,CAACC,OAAO,CAAE,CAAA;AAExC,EAAA,IAAID,KAAK,CAACkB,MAAM,KAAK,OAAO,EAAE;IAC5B,MAAMlB,KAAK,CAACmB,KAAK,CAAA;AACnB,GAAA;AAEA,EAAA,IAAInB,KAAK,CAACkB,MAAM,KAAK,SAAS,EAAE;IAC9B,IAAIlB,KAAK,CAACoB,WAAW,EAAE;MACrB,OAAOb,cAAc,IAAI,IAAI,CAAA;AAC/B,KAAA;IACA,MAAMP,KAAK,CAACqB,WAAW,CAAA;AACzB,GAAA;AAEA,EAAA,IAAIrB,KAAK,CAACkB,MAAM,KAAK,SAAS,EAAE;IAC9B,IAAII,IAAI,GAAG/C,KAAK,CAACwB,OAAO,CAACwB,SAAS,IAAIxB,OAAO,CAACyB,gBAAgB,CAAA;AAE9D,IAAA,IAAIF,IAAI,EAAE;AACR,MAAA,oBAAO5C,gBAAK,CAACG,aAAa,CAACyC,IAAI,EAAE;QAC/BvC,QAAQ,EAAER,KAAK,CAACQ,QAAQ;QACxBC,eAAe,EAAET,KAAK,CAACS,eAAsB;QAC7CC,SAAS,EAAEV,KAAK,CAACU,SAAS;QAC1BC,SAAS,EAAEX,KAAK,CAACW,SAAgB;QACjCuC,aAAa,EAAElD,KAAK,CAACkD,aAAAA;AACvB,OAAC,CAAC,CAAA;AACJ,KAAA;AAEA,IAAA,oBAAO/C,gBAAA,CAAAG,aAAA,CAAC6C,MAAM,MAAE,CAAC,CAAA;AACnB,GAAA;AAEAC,EAAAA,SAAS,CACP,KAAK,EACL,gGACF,CAAC,CAAA;AACH,CAAA;AAEO,SAASD,MAAMA,GAAG;AACvB,EAAA,MAAMxD,OAAO,GAAGQ,gBAAK,CAACkD,UAAU,CAACzC,cAAc,CAAC,CAAC0C,KAAK,CAAC,CAAC,CAAC,CAAA;AAEzD,EAAA,IAAI,CAAC3D,OAAO,CAAC,CAAC,CAAC,EAAE;AACf,IAAA,OAAO,IAAI,CAAA;AACb,GAAA;AAEA,EAAA,oBAAOQ,gBAAA,CAAAG,aAAA,CAACc,KAAK,EAAA;AAACzB,IAAAA,OAAO,EAAEA,OAAAA;AAAQ,GAAE,CAAC,CAAA;AACpC,CAAA;AAiBO,SAAS4D,aAAaA,GAEzB;EACF,MAAM;AAAEC,IAAAA,UAAAA;GAAY,GAAG9D,wBAAS,EAAE,CAAA;AAElC,EAAA,OAAOS,gBAAK,CAACC,WAAW,CAQpBqD,IAMC,IACkE;IACnE,MAAM;MAAEC,OAAO;MAAEC,aAAa;MAAE,GAAGC,IAAAA;AAAK,KAAC,GAAGH,IAAI,CAAA;IAEhD,OAAOD,UAAU,CAACI,IAAI,EAAS;MAC7BF,OAAO;AACPC,MAAAA,aAAAA;AACF,KAAC,CAAC,CAAA;GACH,EACD,EACF,CAAC,CAAA;AACH,CAAA;AAqBO,SAASE,UAAUA,CAOxBxD,KAAwE,EACnE;AACL,EAAA,MAAMmD,UAAU,GAAGD,aAAa,EAAE,CAAA;AAClC,EAAA,MAAMO,MAAM,GAAGN,UAAU,CAACnD,KAAY,CAAC,CAAA;AAEvC,EAAA,IAAI,OAAOA,KAAK,CAACkB,QAAQ,KAAK,UAAU,EAAE;AACxC,IAAA,OAAQlB,KAAK,CAACkB,QAAQ,CAASuC,MAAM,CAAC,CAAA;AACxC,GAAA;EAEA,OAAO,CAAC,CAACA,MAAM,GAAGzD,KAAK,CAACkB,QAAQ,GAAG,IAAI,CAAA;AACzC,CAAA;AAEO,SAASf,QAAQA,CAOtBiD,IAEC,EACyD;EAC1D,MAAMM,YAAY,GAAG5D,gBAAK,CAACkD,UAAU,CAACzC,cAAc,CAAC,CAAC,CAAC,CAAE,CAAA;AACzD,EAAA,MAAMoD,mBAAmB,GAAGD,YAAY,EAAErC,OAAO,CAAA;EAEjD,MAAMuC,YAAY,GAAGpE,6BAAc,CAAC;IAClCqE,MAAM,EAAGzE,KAAK,IAAK;AACjB,MAAA,MAAMgC,KAAK,GAAGgC,IAAI,EAAEU,IAAI,GACpB1E,KAAK,CAACE,OAAO,CAACyE,IAAI,CAAEC,CAAC,IAAKA,CAAC,CAAC3C,OAAO,KAAK+B,IAAI,EAAEU,IAAI,CAAC,GACnD1E,KAAK,CAACE,OAAO,CAACyE,IAAI,CAAEC,CAAC,IAAKA,CAAC,CAAC5B,EAAE,KAAKsB,YAAY,CAACtB,EAAE,CAAC,CAAA;MAEvD,OAAOhB,KAAK,CAAEC,OAAO,CAAA;AACvB,KAAA;AACF,GAAC,CAAC,CAAA;AAEF,EAAA,IAAI+B,IAAI,EAAEa,MAAM,IAAI,IAAI,EAAE;AACxBlB,IAAAA,SAAS,CACPY,mBAAmB,IAAIC,YAAY,EAClC,CACCA,UAAAA,EAAAA,YACD,CAAiED,+DAAAA,EAAAA,mBAAoB,CACpFC,oCAAAA,EAAAA,YACD,CACCA,qCAAAA,EAAAA,YACD,cACH,CAAC,CAAA;AACH,GAAA;EAEA,MAAMM,cAAc,GAAG1E,6BAAc,CAAC;IACpCqE,MAAM,EAAGzE,KAAK,IAAK;AACjB,MAAA,MAAMgC,KAAK,GAAGgC,IAAI,EAAEU,IAAI,GACpB1E,KAAK,CAACE,OAAO,CAACyE,IAAI,CAAEC,CAAC,IAAKA,CAAC,CAAC3C,OAAO,KAAK+B,IAAI,EAAEU,IAAI,CAAC,GACnD1E,KAAK,CAACE,OAAO,CAACyE,IAAI,CAAEC,CAAC,IAAKA,CAAC,CAAC5B,EAAE,KAAKsB,YAAY,CAACtB,EAAE,CAAC,CAAA;AAEvDW,MAAAA,SAAS,CACP3B,KAAK,EACJ,CACCgC,eAAAA,EAAAA,IAAI,EAAEU,IAAI,GACL,CAAwBV,sBAAAA,EAAAA,IAAI,CAACU,IAAK,CAAA,CAAA,CAAE,GACrC,kBACL,EACH,CAAC,CAAA;MAED,OAAOV,IAAI,EAAES,MAAM,GAAGT,IAAI,CAACS,MAAM,CAACzC,KAAY,CAAC,GAAGA,KAAK,CAAA;AACzD,KAAA;AACF,GAAC,CAAC,CAAA;AAEF,EAAA,OAAO8C,cAAc,CAAA;AACvB,CAAA;AAEO,MAAM3D,cAAc,gBAAGT,gBAAK,CAACqE,aAAa,CAAe,IAAK,EAAC;AAE/D,SAASC,UAAUA,CAAmBhB,IAE5C,EAAK;AACJ,EAAA,MAAMiB,cAAc,GAAGvE,gBAAK,CAACkD,UAAU,CAACzC,cAAc,CAAC,CAAA;AAEvD,EAAA,OAAOf,6BAAc,CAAC;IACpBqE,MAAM,EAAGzE,KAAK,IAAK;MACjB,MAAME,OAAO,GAAGF,KAAK,CAACE,OAAO,CAAC2D,KAAK,CACjC7D,KAAK,CAACE,OAAO,CAACgF,SAAS,CAAEN,CAAC,IAAKA,CAAC,CAAC5B,EAAE,KAAKiC,cAAc,CAAC,CAAC,CAAC,EAAEjC,EAAE,CAC/D,CAAC,CAAA;MACD,OAAOgB,IAAI,EAAES,MAAM,GAAGT,IAAI,CAACS,MAAM,CAACvE,OAAO,CAAC,GAAIA,OAAa,CAAA;AAC7D,KAAA;AACF,GAAC,CAAC,CAAA;AACJ,CAAA;AAEO,SAASuD,aAAaA,CAU3BO,IAEC,EACyD;EAC1D,MAAMhC,KAAK,GAAGjB,QAAQ,CAAC;AAAE,IAAA,GAAGiD,IAAI;AAAES,IAAAA,MAAM,EAAEjC,SAAAA;AAAU,GAAC,CAAE,CAAA;AAEvD,EAAA,OAAO,OAAOwB,IAAI,CAACS,MAAM,KAAK,UAAU,GACpCT,IAAI,CAACS,MAAM,CAACzC,KAAK,EAAEmD,UAAU,CAAC,GAC9BnD,KAAK,EAAEmD,UAAU,CAAA;AACvB;;;;;;;;;;;;"}
|
|
@@ -13,6 +13,7 @@
|
|
|
13
13
|
var React = require('react');
|
|
14
14
|
var warning = require('tiny-warning');
|
|
15
15
|
var Matches = require('./Matches.js');
|
|
16
|
+
var utils = require('./utils.js');
|
|
16
17
|
|
|
17
18
|
function _interopNamespaceDefault(e) {
|
|
18
19
|
var n = Object.create(null);
|
|
@@ -37,24 +38,12 @@ const routerContext = /*#__PURE__*/React__namespace.createContext(null);
|
|
|
37
38
|
if (typeof document !== 'undefined') {
|
|
38
39
|
window.__TSR_ROUTER_CONTEXT__ = routerContext;
|
|
39
40
|
}
|
|
40
|
-
class SearchParamError extends Error {}
|
|
41
|
-
class PathParamError extends Error {}
|
|
42
|
-
function getInitialRouterState(location) {
|
|
43
|
-
return {
|
|
44
|
-
status: 'idle',
|
|
45
|
-
resolvedLocation: location,
|
|
46
|
-
location,
|
|
47
|
-
matches: [],
|
|
48
|
-
pendingMatches: [],
|
|
49
|
-
lastUpdated: Date.now()
|
|
50
|
-
};
|
|
51
|
-
}
|
|
52
41
|
function RouterProvider({
|
|
53
42
|
router,
|
|
54
43
|
...rest
|
|
55
44
|
}) {
|
|
56
45
|
// Allow the router to update options on the router instance
|
|
57
|
-
router.
|
|
46
|
+
router.update({
|
|
58
47
|
...router.options,
|
|
59
48
|
...rest,
|
|
60
49
|
context: {
|
|
@@ -62,29 +51,44 @@ function RouterProvider({
|
|
|
62
51
|
...rest?.context
|
|
63
52
|
}
|
|
64
53
|
});
|
|
54
|
+
const inner = /*#__PURE__*/React__namespace.createElement(RouterProviderInner, {
|
|
55
|
+
router: router
|
|
56
|
+
});
|
|
57
|
+
if (router.options.Wrap) {
|
|
58
|
+
return /*#__PURE__*/React__namespace.createElement(router.options.Wrap, null, inner);
|
|
59
|
+
}
|
|
60
|
+
return inner;
|
|
61
|
+
}
|
|
62
|
+
function RouterProviderInner({
|
|
63
|
+
router
|
|
64
|
+
}) {
|
|
65
65
|
const [preState, setState] = React__namespace.useState(() => router.state);
|
|
66
66
|
const [isTransitioning, startReactTransition] = React__namespace.useTransition();
|
|
67
|
+
const isAnyTransitioning = isTransitioning || preState.matches.some(d => d.status === 'pending');
|
|
67
68
|
const state = React__namespace.useMemo(() => ({
|
|
68
69
|
...preState,
|
|
69
|
-
status:
|
|
70
|
+
status: isAnyTransitioning ? 'pending' : 'idle',
|
|
70
71
|
location: isTransitioning ? router.latestLocation : preState.location,
|
|
71
72
|
pendingMatches: router.pendingMatches
|
|
72
73
|
}), [preState, isTransitioning]);
|
|
73
74
|
router.setState = setState;
|
|
74
75
|
router.state = state;
|
|
75
76
|
router.startReactTransition = startReactTransition;
|
|
76
|
-
|
|
77
|
+
const tryLoad = () => {
|
|
78
|
+
if (state.location !== router.latestLocation) {
|
|
79
|
+
startReactTransition(() => {
|
|
80
|
+
try {
|
|
81
|
+
router.load();
|
|
82
|
+
} catch (err) {
|
|
83
|
+
console.error(err);
|
|
84
|
+
}
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
};
|
|
88
|
+
utils.useLayoutEffect(() => {
|
|
77
89
|
const unsub = router.history.subscribe(() => {
|
|
78
90
|
router.latestLocation = router.parseLocation(router.latestLocation);
|
|
79
|
-
|
|
80
|
-
startReactTransition(() => {
|
|
81
|
-
try {
|
|
82
|
-
router.load();
|
|
83
|
-
} catch (err) {
|
|
84
|
-
console.error(err);
|
|
85
|
-
}
|
|
86
|
-
});
|
|
87
|
-
}
|
|
91
|
+
tryLoad();
|
|
88
92
|
});
|
|
89
93
|
const nextLocation = router.buildLocation({
|
|
90
94
|
search: true,
|
|
@@ -102,7 +106,7 @@ function RouterProvider({
|
|
|
102
106
|
unsub();
|
|
103
107
|
};
|
|
104
108
|
}, [router.history]);
|
|
105
|
-
|
|
109
|
+
utils.useLayoutEffect(() => {
|
|
106
110
|
if (!isTransitioning && state.resolvedLocation !== state.location) {
|
|
107
111
|
router.emit({
|
|
108
112
|
type: 'onResolved',
|
|
@@ -117,14 +121,10 @@ function RouterProvider({
|
|
|
117
121
|
}));
|
|
118
122
|
}
|
|
119
123
|
});
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
} catch (err) {
|
|
125
|
-
console.error(err);
|
|
126
|
-
}
|
|
127
|
-
});
|
|
124
|
+
utils.useLayoutEffect(() => {
|
|
125
|
+
if (!window.__TSR_DEHYDRATED__) {
|
|
126
|
+
tryLoad();
|
|
127
|
+
}
|
|
128
128
|
}, []);
|
|
129
129
|
return /*#__PURE__*/React__namespace.createElement(routerContext.Provider, {
|
|
130
130
|
value: router
|
|
@@ -141,16 +141,13 @@ function useRouterState(opts) {
|
|
|
141
141
|
return opts?.select ? opts.select(state) : state;
|
|
142
142
|
}
|
|
143
143
|
function useRouter() {
|
|
144
|
-
const resolvedContext = window.__TSR_ROUTER_CONTEXT__ || routerContext;
|
|
144
|
+
const resolvedContext = typeof document !== 'undefined' ? window.__TSR_ROUTER_CONTEXT__ || routerContext : routerContext;
|
|
145
145
|
const value = React__namespace.useContext(resolvedContext);
|
|
146
146
|
warning(value, 'useRouter must be used inside a <RouterProvider> component!');
|
|
147
147
|
return value;
|
|
148
148
|
}
|
|
149
149
|
|
|
150
|
-
exports.PathParamError = PathParamError;
|
|
151
150
|
exports.RouterProvider = RouterProvider;
|
|
152
|
-
exports.SearchParamError = SearchParamError;
|
|
153
|
-
exports.getInitialRouterState = getInitialRouterState;
|
|
154
151
|
exports.getRouteMatch = getRouteMatch;
|
|
155
152
|
exports.routerContext = routerContext;
|
|
156
153
|
exports.useRouter = useRouter;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RouterProvider.js","sources":["../../src/RouterProvider.tsx"],"sourcesContent":["import * as React from 'react'\nimport warning from 'tiny-warning'\nimport { Matches } from './Matches'\nimport {\n LinkInfo,\n LinkOptions,\n NavigateOptions,\n ResolveRelativePath,\n ToOptions,\n} from './link'\nimport { ParsedLocation } from './location'\nimport { AnyRoute } from './route'\nimport { RouteById, RoutePaths } from './routeInfo'\nimport {\n BuildNextOptions,\n RegisteredRouter,\n Router,\n RouterOptions,\n RouterState,\n} from './router'\nimport { NoInfer, PickAsRequired } from './utils'\nimport { MatchRouteOptions } from './Matches'\nimport { RouteMatch } from './Matches'\n\nexport interface CommitLocationOptions {\n replace?: boolean\n resetScroll?: boolean\n startTransition?: boolean\n}\n\nexport interface MatchLocation {\n to?: string | number | null\n fuzzy?: boolean\n caseSensitive?: boolean\n from?: string\n}\n\nexport type BuildLinkFn<TRouteTree extends AnyRoute> = <\n TFrom extends RoutePaths<TRouteTree> = '/',\n TTo extends string = '',\n>(\n dest: LinkOptions<TRouteTree, TFrom, TTo>,\n) => LinkInfo\n\nexport type NavigateFn<TRouteTree extends AnyRoute> = <\n TFrom extends RoutePaths<TRouteTree> = '/',\n TTo extends string = '',\n TMaskFrom extends RoutePaths<TRouteTree> = TFrom,\n TMaskTo extends string = '',\n>(\n opts: NavigateOptions<TRouteTree, TFrom, TTo, TMaskFrom, TMaskTo>,\n) => Promise<void>\n\nexport type MatchRouteFn<TRouteTree extends AnyRoute> = <\n TFrom extends RoutePaths<TRouteTree> = '/',\n TTo extends string = '',\n TResolved = ResolveRelativePath<TFrom, NoInfer<TTo>>,\n>(\n location: ToOptions<TRouteTree, TFrom, TTo>,\n opts?: MatchRouteOptions,\n) => false | RouteById<TRouteTree, TResolved>['types']['allParams']\n\nexport type BuildLocationFn<TRouteTree extends AnyRoute> = (\n opts: BuildNextOptions,\n) => ParsedLocation\n\nexport type InjectedHtmlEntry = string | (() => Promise<string> | string)\n\nexport const routerContext = React.createContext<Router<any>>(null!)\n\nif (typeof document !== 'undefined') {\n window.__TSR_ROUTER_CONTEXT__ = routerContext as any\n}\n\nexport class SearchParamError extends Error {}\n\nexport class PathParamError extends Error {}\n\nexport function getInitialRouterState(\n location: ParsedLocation,\n): RouterState<any> {\n return {\n status: 'idle',\n resolvedLocation: location,\n location,\n matches: [],\n pendingMatches: [],\n lastUpdated: Date.now(),\n }\n}\n\nexport function RouterProvider<\n TRouteTree extends AnyRoute = RegisteredRouter['routeTree'],\n TDehydrated extends Record<string, any> = Record<string, any>,\n>({ router, ...rest }: RouterProps<TRouteTree, TDehydrated>) {\n // Allow the router to update options on the router instance\n router.updateOptions({\n ...router.options,\n ...rest,\n\n context: {\n ...router.options.context,\n ...rest?.context,\n },\n } as PickAsRequired<\n RouterOptions<TRouteTree, TDehydrated>,\n 'stringifySearch' | 'parseSearch' | 'context'\n >)\n\n const [preState, setState] = React.useState(() => router.state)\n const [isTransitioning, startReactTransition] = React.useTransition()\n\n const state = React.useMemo<RouterState<TRouteTree>>(\n () => ({\n ...preState,\n status: isTransitioning ? 'pending' : 'idle',\n location: isTransitioning ? router.latestLocation : preState.location,\n pendingMatches: router.pendingMatches,\n }),\n [preState, isTransitioning],\n )\n\n router.setState = setState\n router.state = state\n router.startReactTransition = startReactTransition\n\n React.useLayoutEffect(() => {\n const unsub = router.history.subscribe(() => {\n router.latestLocation = router.parseLocation(router.latestLocation)\n\n if (state.location !== router.latestLocation) {\n startReactTransition(() => {\n try {\n router.load()\n } catch (err) {\n console.error(err)\n }\n })\n }\n })\n\n const nextLocation = router.buildLocation({\n search: true,\n params: true,\n hash: true,\n state: true,\n })\n\n if (state.location.href !== nextLocation.href) {\n router.commitLocation({ ...nextLocation, replace: true })\n }\n\n return () => {\n unsub()\n }\n }, [router.history])\n\n React.useLayoutEffect(() => {\n if (!isTransitioning && state.resolvedLocation !== state.location) {\n router.emit({\n type: 'onResolved',\n fromLocation: state.resolvedLocation,\n toLocation: state.location,\n pathChanged: state.location!.href !== state.resolvedLocation?.href,\n })\n router.pendingMatches = []\n\n setState((s) => ({\n ...s,\n resolvedLocation: s.location,\n }))\n }\n })\n\n React.useLayoutEffect(() => {\n startReactTransition(() => {\n try {\n router.load()\n } catch (err) {\n console.error(err)\n }\n })\n }, [])\n\n return (\n <routerContext.Provider value={router}>\n <Matches />\n </routerContext.Provider>\n )\n}\n\nexport function getRouteMatch<TRouteTree extends AnyRoute>(\n state: RouterState<TRouteTree>,\n id: string,\n): undefined | RouteMatch<TRouteTree> {\n return [...state.pendingMatches, ...state.matches].find((d) => d.id === id)\n}\n\nexport function useRouterState<\n TSelected = RouterState<RegisteredRouter['routeTree']>,\n>(opts?: {\n select: (state: RouterState<RegisteredRouter['routeTree']>) => TSelected\n}): TSelected {\n const { state } = useRouter()\n // return useStore(router.__store, opts?.select as any)\n return opts?.select ? opts.select(state) : (state as any)\n}\n\nexport type RouterProps<\n TRouteTree extends AnyRoute = RegisteredRouter['routeTree'],\n TDehydrated extends Record<string, any> = Record<string, any>,\n> = Omit<RouterOptions<TRouteTree, TDehydrated>, 'context'> & {\n router: Router<TRouteTree>\n context?: Partial<RouterOptions<TRouteTree, TDehydrated>['context']>\n}\n\nexport function useRouter<\n TRouteTree extends AnyRoute = RegisteredRouter['routeTree'],\n>(): Router<TRouteTree> {\n const resolvedContext = window.__TSR_ROUTER_CONTEXT__ || routerContext\n const value = React.useContext(resolvedContext)\n warning(value, 'useRouter must be used inside a <RouterProvider> component!')\n return value as any\n}\n"],"names":["routerContext","React","createContext","document","window","__TSR_ROUTER_CONTEXT__","SearchParamError","Error","PathParamError","getInitialRouterState","location","status","resolvedLocation","matches","pendingMatches","lastUpdated","Date","now","RouterProvider","router","rest","updateOptions","options","context","preState","setState","useState","state","isTransitioning","startReactTransition","useTransition","useMemo","latestLocation","useLayoutEffect","unsub","history","subscribe","parseLocation","load","err","console","error","nextLocation","buildLocation","search","params","hash","href","commitLocation","replace","emit","type","fromLocation","toLocation","pathChanged","s","createElement","Provider","value","Matches","getRouteMatch","id","find","d","useRouterState","opts","useRouter","select","resolvedContext","useContext","warning"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAoEO,MAAMA,aAAa,gBAAGC,gBAAK,CAACC,aAAa,CAAc,IAAK,EAAC;AAEpE,IAAI,OAAOC,QAAQ,KAAK,WAAW,EAAE;EACnCC,MAAM,CAACC,sBAAsB,GAAGL,aAAoB,CAAA;AACtD,CAAA;AAEO,MAAMM,gBAAgB,SAASC,KAAK,CAAC,EAAA;AAErC,MAAMC,cAAc,SAASD,KAAK,CAAC,EAAA;AAEnC,SAASE,qBAAqBA,CACnCC,QAAwB,EACN;EAClB,OAAO;AACLC,IAAAA,MAAM,EAAE,MAAM;AACdC,IAAAA,gBAAgB,EAAEF,QAAQ;IAC1BA,QAAQ;AACRG,IAAAA,OAAO,EAAE,EAAE;AACXC,IAAAA,cAAc,EAAE,EAAE;AAClBC,IAAAA,WAAW,EAAEC,IAAI,CAACC,GAAG,EAAC;GACvB,CAAA;AACH,CAAA;AAEO,SAASC,cAAcA,CAG5B;EAAEC,MAAM;EAAE,GAAGC,IAAAA;AAA2C,CAAC,EAAE;AAC3D;EACAD,MAAM,CAACE,aAAa,CAAC;IACnB,GAAGF,MAAM,CAACG,OAAO;AACjB,IAAA,GAAGF,IAAI;AAEPG,IAAAA,OAAO,EAAE;AACP,MAAA,GAAGJ,MAAM,CAACG,OAAO,CAACC,OAAO;AACzB,MAAA,GAAGH,IAAI,EAAEG,OAAAA;AACX,KAAA;AACF,GAGC,CAAC,CAAA;AAEF,EAAA,MAAM,CAACC,QAAQ,EAAEC,QAAQ,CAAC,GAAGxB,gBAAK,CAACyB,QAAQ,CAAC,MAAMP,MAAM,CAACQ,KAAK,CAAC,CAAA;EAC/D,MAAM,CAACC,eAAe,EAAEC,oBAAoB,CAAC,GAAG5B,gBAAK,CAAC6B,aAAa,EAAE,CAAA;AAErE,EAAA,MAAMH,KAAK,GAAG1B,gBAAK,CAAC8B,OAAO,CACzB,OAAO;AACL,IAAA,GAAGP,QAAQ;AACXb,IAAAA,MAAM,EAAEiB,eAAe,GAAG,SAAS,GAAG,MAAM;IAC5ClB,QAAQ,EAAEkB,eAAe,GAAGT,MAAM,CAACa,cAAc,GAAGR,QAAQ,CAACd,QAAQ;IACrEI,cAAc,EAAEK,MAAM,CAACL,cAAAA;AACzB,GAAC,CAAC,EACF,CAACU,QAAQ,EAAEI,eAAe,CAC5B,CAAC,CAAA;EAEDT,MAAM,CAACM,QAAQ,GAAGA,QAAQ,CAAA;EAC1BN,MAAM,CAACQ,KAAK,GAAGA,KAAK,CAAA;EACpBR,MAAM,CAACU,oBAAoB,GAAGA,oBAAoB,CAAA;EAElD5B,gBAAK,CAACgC,eAAe,CAAC,MAAM;IAC1B,MAAMC,KAAK,GAAGf,MAAM,CAACgB,OAAO,CAACC,SAAS,CAAC,MAAM;MAC3CjB,MAAM,CAACa,cAAc,GAAGb,MAAM,CAACkB,aAAa,CAAClB,MAAM,CAACa,cAAc,CAAC,CAAA;AAEnE,MAAA,IAAIL,KAAK,CAACjB,QAAQ,KAAKS,MAAM,CAACa,cAAc,EAAE;AAC5CH,QAAAA,oBAAoB,CAAC,MAAM;UACzB,IAAI;YACFV,MAAM,CAACmB,IAAI,EAAE,CAAA;WACd,CAAC,OAAOC,GAAG,EAAE;AACZC,YAAAA,OAAO,CAACC,KAAK,CAACF,GAAG,CAAC,CAAA;AACpB,WAAA;AACF,SAAC,CAAC,CAAA;AACJ,OAAA;AACF,KAAC,CAAC,CAAA;AAEF,IAAA,MAAMG,YAAY,GAAGvB,MAAM,CAACwB,aAAa,CAAC;AACxCC,MAAAA,MAAM,EAAE,IAAI;AACZC,MAAAA,MAAM,EAAE,IAAI;AACZC,MAAAA,IAAI,EAAE,IAAI;AACVnB,MAAAA,KAAK,EAAE,IAAA;AACT,KAAC,CAAC,CAAA;IAEF,IAAIA,KAAK,CAACjB,QAAQ,CAACqC,IAAI,KAAKL,YAAY,CAACK,IAAI,EAAE;MAC7C5B,MAAM,CAAC6B,cAAc,CAAC;AAAE,QAAA,GAAGN,YAAY;AAAEO,QAAAA,OAAO,EAAE,IAAA;AAAK,OAAC,CAAC,CAAA;AAC3D,KAAA;AAEA,IAAA,OAAO,MAAM;AACXf,MAAAA,KAAK,EAAE,CAAA;KACR,CAAA;AACH,GAAC,EAAE,CAACf,MAAM,CAACgB,OAAO,CAAC,CAAC,CAAA;EAEpBlC,gBAAK,CAACgC,eAAe,CAAC,MAAM;IAC1B,IAAI,CAACL,eAAe,IAAID,KAAK,CAACf,gBAAgB,KAAKe,KAAK,CAACjB,QAAQ,EAAE;MACjES,MAAM,CAAC+B,IAAI,CAAC;AACVC,QAAAA,IAAI,EAAE,YAAY;QAClBC,YAAY,EAAEzB,KAAK,CAACf,gBAAgB;QACpCyC,UAAU,EAAE1B,KAAK,CAACjB,QAAQ;QAC1B4C,WAAW,EAAE3B,KAAK,CAACjB,QAAQ,CAAEqC,IAAI,KAAKpB,KAAK,CAACf,gBAAgB,EAAEmC,IAAAA;AAChE,OAAC,CAAC,CAAA;MACF5B,MAAM,CAACL,cAAc,GAAG,EAAE,CAAA;MAE1BW,QAAQ,CAAE8B,CAAC,KAAM;AACf,QAAA,GAAGA,CAAC;QACJ3C,gBAAgB,EAAE2C,CAAC,CAAC7C,QAAAA;AACtB,OAAC,CAAC,CAAC,CAAA;AACL,KAAA;AACF,GAAC,CAAC,CAAA;EAEFT,gBAAK,CAACgC,eAAe,CAAC,MAAM;AAC1BJ,IAAAA,oBAAoB,CAAC,MAAM;MACzB,IAAI;QACFV,MAAM,CAACmB,IAAI,EAAE,CAAA;OACd,CAAC,OAAOC,GAAG,EAAE;AACZC,QAAAA,OAAO,CAACC,KAAK,CAACF,GAAG,CAAC,CAAA;AACpB,OAAA;AACF,KAAC,CAAC,CAAA;GACH,EAAE,EAAE,CAAC,CAAA;AAEN,EAAA,oBACEtC,gBAAA,CAAAuD,aAAA,CAACxD,aAAa,CAACyD,QAAQ,EAAA;AAACC,IAAAA,KAAK,EAAEvC,MAAAA;AAAO,GAAA,eACpClB,gBAAA,CAAAuD,aAAA,CAACG,eAAO,EAAA,IAAE,CACY,CAAC,CAAA;AAE7B,CAAA;AAEO,SAASC,aAAaA,CAC3BjC,KAA8B,EAC9BkC,EAAU,EAC0B;EACpC,OAAO,CAAC,GAAGlC,KAAK,CAACb,cAAc,EAAE,GAAGa,KAAK,CAACd,OAAO,CAAC,CAACiD,IAAI,CAAEC,CAAC,IAAKA,CAAC,CAACF,EAAE,KAAKA,EAAE,CAAC,CAAA;AAC7E,CAAA;AAEO,SAASG,cAAcA,CAE5BC,IAED,EAAa;EACZ,MAAM;AAAEtC,IAAAA,KAAAA;GAAO,GAAGuC,SAAS,EAAE,CAAA;AAC7B;EACA,OAAOD,IAAI,EAAEE,MAAM,GAAGF,IAAI,CAACE,MAAM,CAACxC,KAAK,CAAC,GAAIA,KAAa,CAAA;AAC3D,CAAA;AAUO,SAASuC,SAASA,GAED;AACtB,EAAA,MAAME,eAAe,GAAGhE,MAAM,CAACC,sBAAsB,IAAIL,aAAa,CAAA;AACtE,EAAA,MAAM0D,KAAK,GAAGzD,gBAAK,CAACoE,UAAU,CAACD,eAAe,CAAC,CAAA;AAC/CE,EAAAA,OAAO,CAACZ,KAAK,EAAE,6DAA6D,CAAC,CAAA;AAC7E,EAAA,OAAOA,KAAK,CAAA;AACd;;;;;;;;;;;"}
|
|
1
|
+
{"version":3,"file":"RouterProvider.js","sources":["../../src/RouterProvider.tsx"],"sourcesContent":["import * as React from 'react'\nimport warning from 'tiny-warning'\nimport { Matches } from './Matches'\nimport {\n LinkInfo,\n LinkOptions,\n NavigateOptions,\n ResolveRelativePath,\n ToOptions,\n} from './link'\nimport { ParsedLocation } from './location'\nimport { AnyRoute } from './route'\nimport { RouteById, RoutePaths } from './routeInfo'\nimport {\n BuildNextOptions,\n RegisteredRouter,\n Router,\n RouterOptions,\n RouterState,\n} from './router'\nimport { NoInfer, PickAsRequired, useLayoutEffect } from './utils'\nimport { MatchRouteOptions } from './Matches'\nimport { RouteMatch } from './Matches'\n\nexport interface CommitLocationOptions {\n replace?: boolean\n resetScroll?: boolean\n startTransition?: boolean\n}\n\nexport interface MatchLocation {\n to?: string | number | null\n fuzzy?: boolean\n caseSensitive?: boolean\n from?: string\n}\n\nexport type BuildLinkFn<TRouteTree extends AnyRoute> = <\n TFrom extends RoutePaths<TRouteTree> = '/',\n TTo extends string = '',\n>(\n dest: LinkOptions<TRouteTree, TFrom, TTo>,\n) => LinkInfo\n\nexport type NavigateFn<TRouteTree extends AnyRoute> = <\n TFrom extends RoutePaths<TRouteTree> = '/',\n TTo extends string = '',\n TMaskFrom extends RoutePaths<TRouteTree> = TFrom,\n TMaskTo extends string = '',\n>(\n opts: NavigateOptions<TRouteTree, TFrom, TTo, TMaskFrom, TMaskTo>,\n) => Promise<void>\n\nexport type MatchRouteFn<TRouteTree extends AnyRoute> = <\n TFrom extends RoutePaths<TRouteTree> = '/',\n TTo extends string = '',\n TResolved = ResolveRelativePath<TFrom, NoInfer<TTo>>,\n>(\n location: ToOptions<TRouteTree, TFrom, TTo>,\n opts?: MatchRouteOptions,\n) => false | RouteById<TRouteTree, TResolved>['types']['allParams']\n\nexport type BuildLocationFn<TRouteTree extends AnyRoute> = (\n opts: BuildNextOptions,\n) => ParsedLocation\n\nexport type InjectedHtmlEntry = string | (() => Promise<string> | string)\n\nexport const routerContext = React.createContext<Router<any>>(null!)\n\nif (typeof document !== 'undefined') {\n window.__TSR_ROUTER_CONTEXT__ = routerContext as any\n}\n\nexport function RouterProvider<\n TRouteTree extends AnyRoute = RegisteredRouter['routeTree'],\n TDehydrated extends Record<string, any> = Record<string, any>,\n>({ router, ...rest }: RouterProps<TRouteTree, TDehydrated>) {\n // Allow the router to update options on the router instance\n router.update({\n ...router.options,\n ...rest,\n context: {\n ...router.options.context,\n ...rest?.context,\n },\n } as any)\n\n const inner = <RouterProviderInner<TRouteTree, TDehydrated> router={router} />\n\n if (router.options.Wrap) {\n return <router.options.Wrap>{inner}</router.options.Wrap>\n }\n\n return inner\n}\n\nfunction RouterProviderInner<\n TRouteTree extends AnyRoute = RegisteredRouter['routeTree'],\n TDehydrated extends Record<string, any> = Record<string, any>,\n>({ router }: RouterProps<TRouteTree, TDehydrated>) {\n const [preState, setState] = React.useState(() => router.state)\n const [isTransitioning, startReactTransition] = React.useTransition()\n const isAnyTransitioning =\n isTransitioning || preState.matches.some((d) => d.status === 'pending')\n\n const state = React.useMemo<RouterState<TRouteTree>>(\n () => ({\n ...preState,\n status: isAnyTransitioning ? 'pending' : 'idle',\n location: isTransitioning ? router.latestLocation : preState.location,\n pendingMatches: router.pendingMatches,\n }),\n [preState, isTransitioning],\n )\n\n router.setState = setState\n router.state = state\n router.startReactTransition = startReactTransition\n\n const tryLoad = () => {\n if (state.location !== router.latestLocation) {\n startReactTransition(() => {\n try {\n router.load()\n } catch (err) {\n console.error(err)\n }\n })\n }\n }\n\n useLayoutEffect(() => {\n const unsub = router.history.subscribe(() => {\n router.latestLocation = router.parseLocation(router.latestLocation)\n tryLoad()\n })\n\n const nextLocation = router.buildLocation({\n search: true,\n params: true,\n hash: true,\n state: true,\n })\n\n if (state.location.href !== nextLocation.href) {\n router.commitLocation({ ...nextLocation, replace: true })\n }\n\n return () => {\n unsub()\n }\n }, [router.history])\n\n useLayoutEffect(() => {\n if (!isTransitioning && state.resolvedLocation !== state.location) {\n router.emit({\n type: 'onResolved',\n fromLocation: state.resolvedLocation,\n toLocation: state.location,\n pathChanged: state.location!.href !== state.resolvedLocation?.href,\n })\n router.pendingMatches = []\n\n setState((s) => ({\n ...s,\n resolvedLocation: s.location,\n }))\n }\n })\n\n useLayoutEffect(() => {\n if (!window.__TSR_DEHYDRATED__) {\n tryLoad()\n }\n }, [])\n\n return (\n <routerContext.Provider value={router}>\n <Matches />\n </routerContext.Provider>\n )\n}\n\nexport function getRouteMatch<TRouteTree extends AnyRoute>(\n state: RouterState<TRouteTree>,\n id: string,\n): undefined | RouteMatch<TRouteTree> {\n return [...state.pendingMatches, ...state.matches].find((d) => d.id === id)\n}\n\nexport function useRouterState<\n TSelected = RouterState<RegisteredRouter['routeTree']>,\n>(opts?: {\n select: (state: RouterState<RegisteredRouter['routeTree']>) => TSelected\n}): TSelected {\n const { state } = useRouter()\n // return useStore(router.__store, opts?.select as any)\n return opts?.select ? opts.select(state) : (state as any)\n}\n\nexport type RouterProps<\n TRouteTree extends AnyRoute = RegisteredRouter['routeTree'],\n TDehydrated extends Record<string, any> = Record<string, any>,\n> = Omit<RouterOptions<TRouteTree, TDehydrated>, 'context'> & {\n router: Router<TRouteTree>\n context?: Partial<RouterOptions<TRouteTree, TDehydrated>['context']>\n}\n\nexport function useRouter<\n TRouteTree extends AnyRoute = RegisteredRouter['routeTree'],\n>(): Router<TRouteTree> {\n const resolvedContext =\n typeof document !== 'undefined'\n ? window.__TSR_ROUTER_CONTEXT__ || routerContext\n : routerContext\n const value = React.useContext(resolvedContext)\n warning(value, 'useRouter must be used inside a <RouterProvider> component!')\n return value as any\n}\n"],"names":["routerContext","React","createContext","document","window","__TSR_ROUTER_CONTEXT__","RouterProvider","router","rest","update","options","context","inner","createElement","RouterProviderInner","Wrap","preState","setState","useState","state","isTransitioning","startReactTransition","useTransition","isAnyTransitioning","matches","some","d","status","useMemo","location","latestLocation","pendingMatches","tryLoad","load","err","console","error","useLayoutEffect","unsub","history","subscribe","parseLocation","nextLocation","buildLocation","search","params","hash","href","commitLocation","replace","resolvedLocation","emit","type","fromLocation","toLocation","pathChanged","s","__TSR_DEHYDRATED__","Provider","value","Matches","getRouteMatch","id","find","useRouterState","opts","useRouter","select","resolvedContext","useContext","warning"],"mappings":"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"}
|
package/build/cjs/awaited.js
CHANGED
package/build/cjs/awaited.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"awaited.js","sources":["../../src/awaited.tsx"],"sourcesContent":["import { useRouter } from './RouterProvider'\nimport { DeferredPromise, isDehydratedDeferred } from './defer'\n\nexport type AwaitOptions<T> = {\n promise: DeferredPromise<T>\n}\n\nexport function useAwaited<T>({ promise }: AwaitOptions<T>): [T] {\n const router = useRouter()\n\n let state = promise.__deferredState\n const key = `__TSR__DEFERRED__${state.uid}`\n\n if (isDehydratedDeferred(promise)) {\n state = router.hydrateData(key)!\n promise = Promise.resolve(state.data) as DeferredPromise<any>\n promise.__deferredState = state\n }\n\n if (state.status === 'pending') {\n throw promise\n }\n\n if (state.status === 'error') {\n throw state.error\n }\n\n router.dehydrateData(key, state)\n\n return [state.data]\n}\n\nexport function Await<T>(\n props: AwaitOptions<T> & {\n children: (result: T) => JSX.Element\n },\n) {\n const awaited = useAwaited(props)\n return props.children(...awaited)\n}\n"],"names":["useAwaited","promise","router","useRouter","state","__deferredState","key","uid","isDehydratedDeferred","hydrateData","Promise","resolve","data","status","error","dehydrateData","Await","props","awaited","children"],"mappings":";;;;;;;;;;;;;;;AAOO,SAASA,UAAUA,CAAI;AAAEC,EAAAA,OAAAA;AAAyB,CAAC,EAAO;AAC/D,EAAA,MAAMC,MAAM,GAAGC,wBAAS,EAAE,CAAA;AAE1B,EAAA,IAAIC,KAAK,GAAGH,OAAO,CAACI,eAAe,CAAA;AACnC,EAAA,MAAMC,GAAG,GAAI,CAAA,iBAAA,EAAmBF,KAAK,CAACG,GAAI,CAAC,CAAA,CAAA;AAE3C,EAAA,IAAIC,0BAAoB,CAACP,OAAO,CAAC,EAAE;AACjCG,IAAAA,KAAK,GAAGF,MAAM,CAACO,WAAW,CAACH,GAAG,CAAE,CAAA;IAChCL,OAAO,GAAGS,OAAO,CAACC,OAAO,CAACP,KAAK,CAACQ,IAAI,CAAyB,CAAA;IAC7DX,OAAO,CAACI,eAAe,GAAGD,KAAK,CAAA;AACjC,GAAA;AAEA,EAAA,IAAIA,KAAK,CAACS,MAAM,KAAK,SAAS,EAAE;AAC9B,IAAA,
|
|
1
|
+
{"version":3,"file":"awaited.js","sources":["../../src/awaited.tsx"],"sourcesContent":["import { useRouter } from './RouterProvider'\nimport { DeferredPromise, isDehydratedDeferred } from './defer'\n\nexport type AwaitOptions<T> = {\n promise: DeferredPromise<T>\n}\n\nexport function useAwaited<T>({ promise }: AwaitOptions<T>): [T] {\n const router = useRouter()\n\n let state = promise.__deferredState\n const key = `__TSR__DEFERRED__${state.uid}`\n\n if (isDehydratedDeferred(promise)) {\n state = router.hydrateData(key)!\n promise = Promise.resolve(state.data) as DeferredPromise<any>\n promise.__deferredState = state\n }\n\n if (state.status === 'pending') {\n throw new Promise((r) => setTimeout(r, 1)).then(() => promise)\n }\n\n if (state.status === 'error') {\n throw state.error\n }\n\n router.dehydrateData(key, state)\n\n return [state.data]\n}\n\nexport function Await<T>(\n props: AwaitOptions<T> & {\n children: (result: T) => JSX.Element\n },\n) {\n const awaited = useAwaited(props)\n return props.children(...awaited)\n}\n"],"names":["useAwaited","promise","router","useRouter","state","__deferredState","key","uid","isDehydratedDeferred","hydrateData","Promise","resolve","data","status","r","setTimeout","then","error","dehydrateData","Await","props","awaited","children"],"mappings":";;;;;;;;;;;;;;;AAOO,SAASA,UAAUA,CAAI;AAAEC,EAAAA,OAAAA;AAAyB,CAAC,EAAO;AAC/D,EAAA,MAAMC,MAAM,GAAGC,wBAAS,EAAE,CAAA;AAE1B,EAAA,IAAIC,KAAK,GAAGH,OAAO,CAACI,eAAe,CAAA;AACnC,EAAA,MAAMC,GAAG,GAAI,CAAA,iBAAA,EAAmBF,KAAK,CAACG,GAAI,CAAC,CAAA,CAAA;AAE3C,EAAA,IAAIC,0BAAoB,CAACP,OAAO,CAAC,EAAE;AACjCG,IAAAA,KAAK,GAAGF,MAAM,CAACO,WAAW,CAACH,GAAG,CAAE,CAAA;IAChCL,OAAO,GAAGS,OAAO,CAACC,OAAO,CAACP,KAAK,CAACQ,IAAI,CAAyB,CAAA;IAC7DX,OAAO,CAACI,eAAe,GAAGD,KAAK,CAAA;AACjC,GAAA;AAEA,EAAA,IAAIA,KAAK,CAACS,MAAM,KAAK,SAAS,EAAE;AAC9B,IAAA,MAAM,IAAIH,OAAO,CAAEI,CAAC,IAAKC,UAAU,CAACD,CAAC,EAAE,CAAC,CAAC,CAAC,CAACE,IAAI,CAAC,MAAMf,OAAO,CAAC,CAAA;AAChE,GAAA;AAEA,EAAA,IAAIG,KAAK,CAACS,MAAM,KAAK,OAAO,EAAE;IAC5B,MAAMT,KAAK,CAACa,KAAK,CAAA;AACnB,GAAA;AAEAf,EAAAA,MAAM,CAACgB,aAAa,CAACZ,GAAG,EAAEF,KAAK,CAAC,CAAA;AAEhC,EAAA,OAAO,CAACA,KAAK,CAACQ,IAAI,CAAC,CAAA;AACrB,CAAA;AAEO,SAASO,KAAKA,CACnBC,KAEC,EACD;AACA,EAAA,MAAMC,OAAO,GAAGrB,UAAU,CAACoB,KAAK,CAAC,CAAA;AACjC,EAAA,OAAOA,KAAK,CAACE,QAAQ,CAAC,GAAGD,OAAO,CAAC,CAAA;AACnC;;;;;"}
|
package/build/cjs/index.js
CHANGED
|
@@ -77,18 +77,19 @@ exports.Route = route.Route;
|
|
|
77
77
|
exports.createRouteMask = route.createRouteMask;
|
|
78
78
|
exports.rootRouteId = route.rootRouteId;
|
|
79
79
|
exports.rootRouteWithContext = route.rootRouteWithContext;
|
|
80
|
+
exports.PathParamError = router.PathParamError;
|
|
80
81
|
exports.Router = router.Router;
|
|
82
|
+
exports.SearchParamError = router.SearchParamError;
|
|
81
83
|
exports.componentTypes = router.componentTypes;
|
|
84
|
+
exports.getInitialRouterState = router.getInitialRouterState;
|
|
82
85
|
exports.lazyFn = router.lazyFn;
|
|
83
|
-
exports.PathParamError = RouterProvider.PathParamError;
|
|
84
86
|
exports.RouterProvider = RouterProvider.RouterProvider;
|
|
85
|
-
exports.SearchParamError = RouterProvider.SearchParamError;
|
|
86
|
-
exports.getInitialRouterState = RouterProvider.getInitialRouterState;
|
|
87
87
|
exports.getRouteMatch = RouterProvider.getRouteMatch;
|
|
88
88
|
exports.routerContext = RouterProvider.routerContext;
|
|
89
89
|
exports.useRouter = RouterProvider.useRouter;
|
|
90
90
|
exports.useRouterState = RouterProvider.useRouterState;
|
|
91
91
|
exports.ScrollRestoration = scrollRestoration.ScrollRestoration;
|
|
92
|
+
exports.useElementScrollRestoration = scrollRestoration.useElementScrollRestoration;
|
|
92
93
|
exports.useScrollRestoration = scrollRestoration.useScrollRestoration;
|
|
93
94
|
exports.defaultParseSearch = searchParams.defaultParseSearch;
|
|
94
95
|
exports.defaultStringifySearch = searchParams.defaultStringifySearch;
|
package/build/cjs/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/build/cjs/router.js
CHANGED
|
@@ -17,7 +17,8 @@ var RouterProvider = require('./RouterProvider.js');
|
|
|
17
17
|
var path = require('./path.js');
|
|
18
18
|
var invariant = require('tiny-invariant');
|
|
19
19
|
var redirects = require('./redirects.js');
|
|
20
|
-
|
|
20
|
+
|
|
21
|
+
// import warning from 'tiny-warning'
|
|
21
22
|
|
|
22
23
|
//
|
|
23
24
|
|
|
@@ -36,7 +37,7 @@ class Router {
|
|
|
36
37
|
// Must build in constructor
|
|
37
38
|
|
|
38
39
|
constructor(options) {
|
|
39
|
-
this.
|
|
40
|
+
this.update({
|
|
40
41
|
defaultPreloadDelay: 50,
|
|
41
42
|
defaultPendingMs: 1000,
|
|
42
43
|
defaultPendingMinMs: 500,
|
|
@@ -46,20 +47,22 @@ class Router {
|
|
|
46
47
|
parseSearch: options?.parseSearch ?? searchParams.defaultParseSearch
|
|
47
48
|
});
|
|
48
49
|
}
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
50
|
+
|
|
51
|
+
// These are default implementations that can optionally be overridden
|
|
52
|
+
// by the router provider once rendered. We provide these so that the
|
|
53
|
+
// router can be used in a non-react environment if necessary
|
|
54
|
+
startReactTransition = fn => fn();
|
|
55
|
+
setState = updater => {
|
|
56
|
+
this.state = utils.functionalUpdate(updater, this.state);
|
|
54
57
|
};
|
|
55
|
-
|
|
58
|
+
update = newOptions => {
|
|
56
59
|
this.options = {
|
|
57
60
|
...this.options,
|
|
58
61
|
...newOptions
|
|
59
62
|
};
|
|
60
63
|
this.basepath = `/${path.trimPath(newOptions.basepath ?? '') ?? ''}`;
|
|
61
64
|
if (!this.history || this.options.history && this.options.history !== this.history) {
|
|
62
|
-
this.history = this.options.history ?? history.createBrowserHistory();
|
|
65
|
+
this.history = this.options.history ?? (typeof document !== 'undefined' ? history.createBrowserHistory() : history.createMemoryHistory());
|
|
63
66
|
this.latestLocation = this.parseLocation();
|
|
64
67
|
}
|
|
65
68
|
if (this.options.routeTree !== this.routeTree) {
|
|
@@ -67,7 +70,7 @@ class Router {
|
|
|
67
70
|
this.buildRouteTree();
|
|
68
71
|
}
|
|
69
72
|
if (!this.state) {
|
|
70
|
-
this.state =
|
|
73
|
+
this.state = getInitialRouterState(this.latestLocation);
|
|
71
74
|
}
|
|
72
75
|
};
|
|
73
76
|
buildRouteTree = () => {
|
|
@@ -248,7 +251,7 @@ class Router {
|
|
|
248
251
|
// Add the parsed params to the accumulated params bag
|
|
249
252
|
Object.assign(routeParams, parsedParams);
|
|
250
253
|
} catch (err) {
|
|
251
|
-
parsedParamsError = new
|
|
254
|
+
parsedParamsError = new PathParamError(err.message, {
|
|
252
255
|
cause: err
|
|
253
256
|
});
|
|
254
257
|
if (opts?.throwOnError) {
|
|
@@ -280,7 +283,7 @@ class Router {
|
|
|
280
283
|
...search
|
|
281
284
|
}, undefined];
|
|
282
285
|
} catch (err) {
|
|
283
|
-
const searchError = new
|
|
286
|
+
const searchError = new SearchParamError(err.message, {
|
|
284
287
|
cause: err
|
|
285
288
|
});
|
|
286
289
|
if (opts?.throwOnError) {
|
|
@@ -699,6 +702,7 @@ class Router {
|
|
|
699
702
|
// forcefully show the pending component
|
|
700
703
|
if (pendingPromise) {
|
|
701
704
|
pendingPromise.then(() => {
|
|
705
|
+
if (latestPromise = checkLatest()) return;
|
|
702
706
|
didShowPending = true;
|
|
703
707
|
matches[index] = match = {
|
|
704
708
|
...match,
|
|
@@ -718,6 +722,7 @@ class Router {
|
|
|
718
722
|
if (didShowPending && pendingMinMs) {
|
|
719
723
|
await new Promise(r => setTimeout(r, pendingMinMs));
|
|
720
724
|
}
|
|
725
|
+
if (latestPromise = checkLatest()) return await latestPromise;
|
|
721
726
|
matches[index] = match = {
|
|
722
727
|
...match,
|
|
723
728
|
error: undefined,
|
|
@@ -786,7 +791,7 @@ class Router {
|
|
|
786
791
|
// Ingest the new matches
|
|
787
792
|
this.setState(s => ({
|
|
788
793
|
...s,
|
|
789
|
-
status: 'pending',
|
|
794
|
+
// status: 'pending',
|
|
790
795
|
location: next,
|
|
791
796
|
matches
|
|
792
797
|
}));
|
|
@@ -815,6 +820,7 @@ class Router {
|
|
|
815
820
|
// ...s,
|
|
816
821
|
// status: 'idle',
|
|
817
822
|
// resolvedLocation: s.location,
|
|
823
|
+
// matches,
|
|
818
824
|
// }))
|
|
819
825
|
|
|
820
826
|
//
|
|
@@ -1015,63 +1021,42 @@ class Router {
|
|
|
1015
1021
|
}
|
|
1016
1022
|
return undefined;
|
|
1017
1023
|
};
|
|
1018
|
-
|
|
1019
|
-
|
|
1020
|
-
|
|
1021
|
-
|
|
1022
|
-
|
|
1023
|
-
|
|
1024
|
-
|
|
1025
|
-
|
|
1026
|
-
|
|
1027
|
-
|
|
1028
|
-
|
|
1029
|
-
|
|
1030
|
-
|
|
1031
|
-
|
|
1032
|
-
|
|
1033
|
-
|
|
1034
|
-
|
|
1035
|
-
|
|
1036
|
-
|
|
1037
|
-
|
|
1038
|
-
|
|
1039
|
-
|
|
1040
|
-
|
|
1041
|
-
|
|
1042
|
-
|
|
1043
|
-
|
|
1044
|
-
|
|
1045
|
-
|
|
1046
|
-
|
|
1047
|
-
|
|
1048
|
-
|
|
1049
|
-
|
|
1050
|
-
|
|
1051
|
-
|
|
1052
|
-
|
|
1053
|
-
|
|
1054
|
-
// invariant(
|
|
1055
|
-
// dehydratedMatch,
|
|
1056
|
-
// `Could not find a client-side match for dehydrated match with id: ${match.id}!`,
|
|
1057
|
-
// )
|
|
1058
|
-
|
|
1059
|
-
// if (dehydratedMatch) {
|
|
1060
|
-
// return {
|
|
1061
|
-
// ...match,
|
|
1062
|
-
// ...dehydratedMatch,
|
|
1063
|
-
// }
|
|
1064
|
-
// }
|
|
1065
|
-
// return match
|
|
1066
|
-
// })
|
|
1067
|
-
|
|
1068
|
-
// this.setState((s) => {
|
|
1069
|
-
// return {
|
|
1070
|
-
// ...s,
|
|
1071
|
-
// matches: dehydratedState.dehydratedMatches as any,
|
|
1072
|
-
// }
|
|
1073
|
-
// })
|
|
1074
|
-
// }
|
|
1024
|
+
dehydrate = () => {
|
|
1025
|
+
return {
|
|
1026
|
+
state: {
|
|
1027
|
+
dehydratedMatches: this.state.matches.map(d => utils.pick(d, ['fetchedAt', 'invalid', 'id', 'status', 'updatedAt', 'loaderData']))
|
|
1028
|
+
}
|
|
1029
|
+
};
|
|
1030
|
+
};
|
|
1031
|
+
hydrate = async __do_not_use_server_ctx => {
|
|
1032
|
+
let _ctx = __do_not_use_server_ctx;
|
|
1033
|
+
// Client hydrates from window
|
|
1034
|
+
if (typeof document !== 'undefined') {
|
|
1035
|
+
_ctx = window.__TSR_DEHYDRATED__;
|
|
1036
|
+
}
|
|
1037
|
+
invariant(_ctx, 'Expected to find a __TSR_DEHYDRATED__ property on window... but we did not. Did you forget to render <DehydrateRouter /> in your app?');
|
|
1038
|
+
const ctx = _ctx;
|
|
1039
|
+
this.dehydratedData = ctx.payload;
|
|
1040
|
+
this.options.hydrate?.(ctx.payload);
|
|
1041
|
+
const dehydratedState = ctx.router.state;
|
|
1042
|
+
let matches = this.matchRoutes(this.state.location.pathname, this.state.location.search).map(match => {
|
|
1043
|
+
const dehydratedMatch = dehydratedState.dehydratedMatches.find(d => d.id === match.id);
|
|
1044
|
+
invariant(dehydratedMatch, `Could not find a client-side match for dehydrated match with id: ${match.id}!`);
|
|
1045
|
+
if (dehydratedMatch) {
|
|
1046
|
+
return {
|
|
1047
|
+
...match,
|
|
1048
|
+
...dehydratedMatch
|
|
1049
|
+
};
|
|
1050
|
+
}
|
|
1051
|
+
return match;
|
|
1052
|
+
});
|
|
1053
|
+
this.setState(s => {
|
|
1054
|
+
return {
|
|
1055
|
+
...s,
|
|
1056
|
+
matches: matches
|
|
1057
|
+
};
|
|
1058
|
+
});
|
|
1059
|
+
};
|
|
1075
1060
|
|
|
1076
1061
|
// resolveMatchPromise = (matchId: string, key: string, value: any) => {
|
|
1077
1062
|
// state.matches
|
|
@@ -1092,8 +1077,23 @@ function lazyFn(fn, key) {
|
|
|
1092
1077
|
function isCtrlEvent(e) {
|
|
1093
1078
|
return !!(e.metaKey || e.altKey || e.ctrlKey || e.shiftKey);
|
|
1094
1079
|
}
|
|
1080
|
+
class SearchParamError extends Error {}
|
|
1081
|
+
class PathParamError extends Error {}
|
|
1082
|
+
function getInitialRouterState(location) {
|
|
1083
|
+
return {
|
|
1084
|
+
status: 'idle',
|
|
1085
|
+
resolvedLocation: location,
|
|
1086
|
+
location,
|
|
1087
|
+
matches: [],
|
|
1088
|
+
pendingMatches: [],
|
|
1089
|
+
lastUpdated: Date.now()
|
|
1090
|
+
};
|
|
1091
|
+
}
|
|
1095
1092
|
|
|
1093
|
+
exports.PathParamError = PathParamError;
|
|
1096
1094
|
exports.Router = Router;
|
|
1095
|
+
exports.SearchParamError = SearchParamError;
|
|
1097
1096
|
exports.componentTypes = componentTypes;
|
|
1097
|
+
exports.getInitialRouterState = getInitialRouterState;
|
|
1098
1098
|
exports.lazyFn = lazyFn;
|
|
1099
1099
|
//# sourceMappingURL=router.js.map
|