@tanstack/react-router 0.0.1-beta.236 → 0.0.1-beta.237
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 +3 -5
- package/build/cjs/Matches.js.map +1 -1
- package/build/cjs/RouterProvider.js +34 -19
- package/build/cjs/RouterProvider.js.map +1 -1
- package/build/esm/index.js +37 -24
- package/build/esm/index.js.map +1 -1
- package/build/stats-html.html +1 -1
- package/build/stats-react.json +355 -355
- package/build/umd/index.development.js +37 -24
- package/build/umd/index.development.js.map +1 -1
- package/build/umd/index.production.js +1 -1
- package/build/umd/index.production.js.map +1 -1
- package/package.json +2 -2
- package/src/Matches.tsx +3 -3
- package/src/RouterProvider.tsx +45 -20
package/build/cjs/Matches.js
CHANGED
|
@@ -37,13 +37,11 @@ function _interopNamespaceDefault(e) {
|
|
|
37
37
|
var React__namespace = /*#__PURE__*/_interopNamespaceDefault(React);
|
|
38
38
|
|
|
39
39
|
function Matches() {
|
|
40
|
-
const
|
|
41
|
-
routesById
|
|
42
|
-
} = RouterProvider.useRouter();
|
|
40
|
+
const router = RouterProvider.useRouter();
|
|
43
41
|
const routerState = RouterProvider.useRouterState();
|
|
44
42
|
const matches = routerState.pendingMatches?.some(d => d.showPending) ? routerState.pendingMatches : routerState.matches;
|
|
45
|
-
const locationKey =
|
|
46
|
-
const route$1 = routesById[route.rootRouteId];
|
|
43
|
+
const locationKey = router.latestLocation.state.key;
|
|
44
|
+
const route$1 = router.routesById[route.rootRouteId];
|
|
47
45
|
const errorComponent = React__namespace.useCallback(props => {
|
|
48
46
|
return /*#__PURE__*/React__namespace.createElement(CatchBoundary.ErrorComponent, {
|
|
49
47
|
...props,
|
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 } = useRouter()\n const routerState = useRouterState()\n const matches = routerState.pendingMatches?.some((d) => d.showPending)\n ? routerState.pendingMatches\n : routerState.matches\n const locationKey = useRouterState().location.state.key\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 matches = state.pendingMatches?.some((d) => d.showPending)\n ? state.pendingMatches\n : state.matches\n\n const match = opts?.from\n ? matches.find((d) => d.routeId === opts?.from)\n : 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 matches = state.pendingMatches?.some((d) => d.showPending)\n ? state.pendingMatches\n : state.matches\n\n const match = opts?.from\n ? matches.find((d) => d.routeId === opts?.from)\n : 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 let matches = state.pendingMatches?.some((d) => d.showPending)\n ? state.pendingMatches\n : state.matches\n\n matches = matches.slice(\n 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","useRouter","routerState","useRouterState","matches","pendingMatches","some","d","showPending","locationKey","location","state","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","loadPromise","comp","component","defaultComponent","useLoaderData","Outlet","invariant","useContext","slice","useMatchRoute","matchRoute","opts","pending","caseSensitive","rest","MatchRoute","params","nearestMatch","nearestMatchRouteId","matchRouteId","select","from","find","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 router = useRouter()\n const routerState = useRouterState()\n const matches = routerState.pendingMatches?.some((d) => d.showPending)\n ? routerState.pendingMatches\n : routerState.matches\n const locationKey = router.latestLocation.state.key\n const route = router.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 matches = state.pendingMatches?.some((d) => d.showPending)\n ? state.pendingMatches\n : state.matches\n\n const match = opts?.from\n ? matches.find((d) => d.routeId === opts?.from)\n : 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 matches = state.pendingMatches?.some((d) => d.showPending)\n ? state.pendingMatches\n : state.matches\n\n const match = opts?.from\n ? matches.find((d) => d.routeId === opts?.from)\n : 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 let matches = state.pendingMatches?.some((d) => d.showPending)\n ? state.pendingMatches\n : state.matches\n\n matches = matches.slice(\n 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","router","useRouter","routerState","useRouterState","matches","pendingMatches","some","d","showPending","locationKey","latestLocation","state","key","route","routesById","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","loadPromise","comp","component","defaultComponent","useLoaderData","Outlet","invariant","useContext","slice","useMatchRoute","matchRoute","opts","pending","caseSensitive","rest","MatchRoute","params","nearestMatch","nearestMatchRouteId","matchRouteId","select","from","find","strict","matchSelection","createContext","useMatches","contextMatches","findIndex","loaderData"],"mappings":"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"}
|
|
@@ -52,9 +52,11 @@ function RouterProvider({
|
|
|
52
52
|
...rest?.context
|
|
53
53
|
}
|
|
54
54
|
});
|
|
55
|
-
const inner = /*#__PURE__*/React__namespace.createElement(
|
|
55
|
+
const inner = /*#__PURE__*/React__namespace.createElement(routerContext.Provider, {
|
|
56
|
+
value: router
|
|
57
|
+
}, /*#__PURE__*/React__namespace.createElement(RouterProviderInner, {
|
|
56
58
|
router: router
|
|
57
|
-
});
|
|
59
|
+
}));
|
|
58
60
|
if (router.options.Wrap) {
|
|
59
61
|
return /*#__PURE__*/React__namespace.createElement(router.options.Wrap, null, inner);
|
|
60
62
|
}
|
|
@@ -63,6 +65,13 @@ function RouterProvider({
|
|
|
63
65
|
function RouterProviderInner({
|
|
64
66
|
router
|
|
65
67
|
}) {
|
|
68
|
+
return /*#__PURE__*/React__namespace.createElement(React__namespace.Fragment, null, /*#__PURE__*/React__namespace.createElement(Matches.Matches, null), /*#__PURE__*/React__namespace.createElement(Transitioner, null));
|
|
69
|
+
}
|
|
70
|
+
function Transitioner() {
|
|
71
|
+
const router = useRouter();
|
|
72
|
+
const routerState = useRouterState({
|
|
73
|
+
select: s => utils.pick(s, ['isLoading', 'location', 'resolvedLocation', 'isTransitioning'])
|
|
74
|
+
});
|
|
66
75
|
const [isTransitioning, startReactTransition] = React__namespace.useTransition();
|
|
67
76
|
router.startReactTransition = startReactTransition;
|
|
68
77
|
React__namespace.useEffect(() => {
|
|
@@ -74,18 +83,25 @@ function RouterProviderInner({
|
|
|
74
83
|
}
|
|
75
84
|
}, [isTransitioning]);
|
|
76
85
|
const tryLoad = () => {
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
86
|
+
const apply = cb => {
|
|
87
|
+
if (!routerState.isTransitioning) {
|
|
88
|
+
startReactTransition(() => cb());
|
|
89
|
+
} else {
|
|
90
|
+
cb();
|
|
91
|
+
}
|
|
92
|
+
};
|
|
93
|
+
apply(() => {
|
|
94
|
+
try {
|
|
95
|
+
router.load();
|
|
96
|
+
} catch (err) {
|
|
97
|
+
console.error(err);
|
|
98
|
+
}
|
|
99
|
+
});
|
|
84
100
|
};
|
|
85
101
|
utils.useLayoutEffect(() => {
|
|
86
102
|
const unsub = router.history.subscribe(() => {
|
|
87
103
|
router.latestLocation = router.parseLocation(router.latestLocation);
|
|
88
|
-
if (
|
|
104
|
+
if (routerState.location !== router.latestLocation) {
|
|
89
105
|
tryLoad();
|
|
90
106
|
}
|
|
91
107
|
});
|
|
@@ -95,7 +111,7 @@ function RouterProviderInner({
|
|
|
95
111
|
hash: true,
|
|
96
112
|
state: true
|
|
97
113
|
});
|
|
98
|
-
if (
|
|
114
|
+
if (routerState.location.href !== nextLocation.href) {
|
|
99
115
|
router.commitLocation({
|
|
100
116
|
...nextLocation,
|
|
101
117
|
replace: true
|
|
@@ -106,12 +122,13 @@ function RouterProviderInner({
|
|
|
106
122
|
};
|
|
107
123
|
}, [router.history]);
|
|
108
124
|
utils.useLayoutEffect(() => {
|
|
109
|
-
if (!isTransitioning &&
|
|
125
|
+
if (!isTransitioning && !routerState.isLoading && routerState.resolvedLocation !== routerState.location) {
|
|
126
|
+
console.log('onResolved', routerState.location);
|
|
110
127
|
router.emit({
|
|
111
128
|
type: 'onResolved',
|
|
112
|
-
fromLocation:
|
|
113
|
-
toLocation:
|
|
114
|
-
pathChanged:
|
|
129
|
+
fromLocation: routerState.resolvedLocation,
|
|
130
|
+
toLocation: routerState.location,
|
|
131
|
+
pathChanged: routerState.location.href !== routerState.resolvedLocation?.href
|
|
115
132
|
});
|
|
116
133
|
router.pendingMatches = [];
|
|
117
134
|
router.__store.setState(s => ({
|
|
@@ -120,15 +137,13 @@ function RouterProviderInner({
|
|
|
120
137
|
resolvedLocation: s.location
|
|
121
138
|
}));
|
|
122
139
|
}
|
|
123
|
-
}, [isTransitioning]);
|
|
140
|
+
}, [isTransitioning, routerState.isLoading]);
|
|
124
141
|
utils.useLayoutEffect(() => {
|
|
125
142
|
if (!window.__TSR_DEHYDRATED__) {
|
|
126
143
|
tryLoad();
|
|
127
144
|
}
|
|
128
145
|
}, []);
|
|
129
|
-
return
|
|
130
|
-
value: router
|
|
131
|
-
}, /*#__PURE__*/React__namespace.createElement(Matches.Matches, null));
|
|
146
|
+
return null;
|
|
132
147
|
}
|
|
133
148
|
function getRouteMatch(state, id) {
|
|
134
149
|
return [...(state.pendingMatches ?? []), ...state.matches].find(d => d.id === id);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RouterProvider.js","sources":["../../src/RouterProvider.tsx"],"sourcesContent":["import * as React from 'react'\nimport warning from 'tiny-warning'\nimport { useStore } from '@tanstack/react-store'\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 [isTransitioning, startReactTransition] = React.useTransition()\n\n router.startReactTransition = startReactTransition\n\n React.useEffect(() => {\n if (isTransitioning) {\n router.__store.setState((s) => ({\n ...s,\n isTransitioning,\n }))\n }\n }, [isTransitioning])\n\n const tryLoad = () => {\n // startReactTransition(() => {\n try {\n router.load()\n } catch (err) {\n console.error(err)\n }\n // })\n }\n\n useLayoutEffect(() => {\n const unsub = router.history.subscribe(() => {\n router.latestLocation = router.parseLocation(router.latestLocation)\n if (router.state.location !== router.latestLocation) {\n tryLoad()\n }\n })\n\n const nextLocation = router.buildLocation({\n search: true,\n params: true,\n hash: true,\n state: true,\n })\n\n if (router.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 (\n !isTransitioning &&\n router.state.resolvedLocation !== router.state.location\n ) {\n router.emit({\n type: 'onResolved',\n fromLocation: router.state.resolvedLocation,\n toLocation: router.state.location,\n pathChanged:\n router.state.location!.href !== router.state.resolvedLocation?.href,\n })\n router.pendingMatches = []\n\n router.__store.setState((s) => ({\n ...s,\n isTransitioning: false,\n resolvedLocation: s.location,\n }))\n }\n }, [isTransitioning])\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(\n (d) => d.id === id,\n )\n}\n\nexport function useRouterState<\n TSelected = RouterState<RegisteredRouter['routeTree']>,\n>(opts?: {\n select: (state: RouterState<RegisteredRouter['routeTree']>) => TSelected\n}): TSelected {\n const router = useRouter()\n return useStore(router.__store, opts?.select 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","isTransitioning","startReactTransition","useTransition","useEffect","__store","setState","s","tryLoad","load","err","console","error","useLayoutEffect","unsub","history","subscribe","latestLocation","parseLocation","state","location","nextLocation","buildLocation","search","params","hash","href","commitLocation","replace","resolvedLocation","emit","type","fromLocation","toLocation","pathChanged","pendingMatches","__TSR_DEHYDRATED__","Provider","value","Matches","getRouteMatch","id","matches","find","d","useRouterState","opts","useRouter","useStore","select","resolvedContext","useContext","warning"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"RouterProvider.js","sources":["../../src/RouterProvider.tsx"],"sourcesContent":["import * as React from 'react'\nimport warning from 'tiny-warning'\nimport { useStore } from '@tanstack/react-store'\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, pick, 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 = (\n <routerContext.Provider value={router}>\n <RouterProviderInner<TRouteTree, TDehydrated> router={router} />\n </routerContext.Provider>\n )\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 return (\n <>\n <Matches />\n <Transitioner />\n </>\n )\n}\n\nfunction Transitioner() {\n const router = useRouter()\n const routerState = useRouterState({\n select: (s) =>\n pick(s, ['isLoading', 'location', 'resolvedLocation', 'isTransitioning']),\n })\n\n const [isTransitioning, startReactTransition] = React.useTransition()\n\n router.startReactTransition = startReactTransition\n\n React.useEffect(() => {\n if (isTransitioning) {\n router.__store.setState((s) => ({\n ...s,\n isTransitioning,\n }))\n }\n }, [isTransitioning])\n\n const tryLoad = () => {\n const apply = (cb: () => void) => {\n if (!routerState.isTransitioning) {\n startReactTransition(() => cb())\n } else {\n cb()\n }\n }\n\n apply(() => {\n try {\n router.load()\n } catch (err) {\n console.error(err)\n }\n })\n }\n\n useLayoutEffect(() => {\n const unsub = router.history.subscribe(() => {\n router.latestLocation = router.parseLocation(router.latestLocation)\n if (routerState.location !== router.latestLocation) {\n tryLoad()\n }\n })\n\n const nextLocation = router.buildLocation({\n search: true,\n params: true,\n hash: true,\n state: true,\n })\n\n if (routerState.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 (\n !isTransitioning &&\n !routerState.isLoading &&\n routerState.resolvedLocation !== routerState.location\n ) {\n console.log('onResolved', routerState.location)\n router.emit({\n type: 'onResolved',\n fromLocation: routerState.resolvedLocation,\n toLocation: routerState.location,\n pathChanged:\n routerState.location!.href !== routerState.resolvedLocation?.href,\n })\n router.pendingMatches = []\n\n router.__store.setState((s) => ({\n ...s,\n isTransitioning: false,\n resolvedLocation: s.location,\n }))\n }\n }, [isTransitioning, routerState.isLoading])\n\n useLayoutEffect(() => {\n if (!window.__TSR_DEHYDRATED__) {\n tryLoad()\n }\n }, [])\n\n return null\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(\n (d) => d.id === id,\n )\n}\n\nexport function useRouterState<\n TSelected = RouterState<RegisteredRouter['routeTree']>,\n>(opts?: {\n select: (state: RouterState<RegisteredRouter['routeTree']>) => TSelected\n}): TSelected {\n const router = useRouter()\n return useStore(router.__store, opts?.select 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","Provider","value","RouterProviderInner","Wrap","Fragment","Matches","Transitioner","useRouter","routerState","useRouterState","select","s","pick","isTransitioning","startReactTransition","useTransition","useEffect","__store","setState","tryLoad","apply","cb","load","err","console","error","useLayoutEffect","unsub","history","subscribe","latestLocation","parseLocation","location","nextLocation","buildLocation","search","params","hash","state","href","commitLocation","replace","isLoading","resolvedLocation","log","emit","type","fromLocation","toLocation","pathChanged","pendingMatches","__TSR_DEHYDRATED__","getRouteMatch","id","matches","find","d","opts","useStore","resolvedContext","useContext","warning"],"mappings":"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"}
|
package/build/esm/index.js
CHANGED
|
@@ -609,13 +609,11 @@ function createRouteMask(opts) {
|
|
|
609
609
|
//
|
|
610
610
|
|
|
611
611
|
function Matches() {
|
|
612
|
-
const
|
|
613
|
-
routesById
|
|
614
|
-
} = useRouter();
|
|
612
|
+
const router = useRouter();
|
|
615
613
|
const routerState = useRouterState();
|
|
616
614
|
const matches = routerState.pendingMatches?.some(d => d.showPending) ? routerState.pendingMatches : routerState.matches;
|
|
617
|
-
const locationKey =
|
|
618
|
-
const route = routesById[rootRouteId];
|
|
615
|
+
const locationKey = router.latestLocation.state.key;
|
|
616
|
+
const route = router.routesById[rootRouteId];
|
|
619
617
|
const errorComponent = React.useCallback(props => {
|
|
620
618
|
return /*#__PURE__*/React.createElement(ErrorComponent, {
|
|
621
619
|
...props,
|
|
@@ -813,9 +811,11 @@ function RouterProvider({
|
|
|
813
811
|
...rest?.context
|
|
814
812
|
}
|
|
815
813
|
});
|
|
816
|
-
const inner = /*#__PURE__*/React.createElement(
|
|
814
|
+
const inner = /*#__PURE__*/React.createElement(routerContext.Provider, {
|
|
815
|
+
value: router
|
|
816
|
+
}, /*#__PURE__*/React.createElement(RouterProviderInner, {
|
|
817
817
|
router: router
|
|
818
|
-
});
|
|
818
|
+
}));
|
|
819
819
|
if (router.options.Wrap) {
|
|
820
820
|
return /*#__PURE__*/React.createElement(router.options.Wrap, null, inner);
|
|
821
821
|
}
|
|
@@ -824,6 +824,13 @@ function RouterProvider({
|
|
|
824
824
|
function RouterProviderInner({
|
|
825
825
|
router
|
|
826
826
|
}) {
|
|
827
|
+
return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(Matches, null), /*#__PURE__*/React.createElement(Transitioner, null));
|
|
828
|
+
}
|
|
829
|
+
function Transitioner() {
|
|
830
|
+
const router = useRouter();
|
|
831
|
+
const routerState = useRouterState({
|
|
832
|
+
select: s => pick(s, ['isLoading', 'location', 'resolvedLocation', 'isTransitioning'])
|
|
833
|
+
});
|
|
827
834
|
const [isTransitioning, startReactTransition] = React.useTransition();
|
|
828
835
|
router.startReactTransition = startReactTransition;
|
|
829
836
|
React.useEffect(() => {
|
|
@@ -835,18 +842,25 @@ function RouterProviderInner({
|
|
|
835
842
|
}
|
|
836
843
|
}, [isTransitioning]);
|
|
837
844
|
const tryLoad = () => {
|
|
838
|
-
|
|
839
|
-
|
|
840
|
-
|
|
841
|
-
|
|
842
|
-
|
|
843
|
-
|
|
844
|
-
|
|
845
|
+
const apply = cb => {
|
|
846
|
+
if (!routerState.isTransitioning) {
|
|
847
|
+
startReactTransition(() => cb());
|
|
848
|
+
} else {
|
|
849
|
+
cb();
|
|
850
|
+
}
|
|
851
|
+
};
|
|
852
|
+
apply(() => {
|
|
853
|
+
try {
|
|
854
|
+
router.load();
|
|
855
|
+
} catch (err) {
|
|
856
|
+
console.error(err);
|
|
857
|
+
}
|
|
858
|
+
});
|
|
845
859
|
};
|
|
846
860
|
useLayoutEffect$1(() => {
|
|
847
861
|
const unsub = router.history.subscribe(() => {
|
|
848
862
|
router.latestLocation = router.parseLocation(router.latestLocation);
|
|
849
|
-
if (
|
|
863
|
+
if (routerState.location !== router.latestLocation) {
|
|
850
864
|
tryLoad();
|
|
851
865
|
}
|
|
852
866
|
});
|
|
@@ -856,7 +870,7 @@ function RouterProviderInner({
|
|
|
856
870
|
hash: true,
|
|
857
871
|
state: true
|
|
858
872
|
});
|
|
859
|
-
if (
|
|
873
|
+
if (routerState.location.href !== nextLocation.href) {
|
|
860
874
|
router.commitLocation({
|
|
861
875
|
...nextLocation,
|
|
862
876
|
replace: true
|
|
@@ -867,12 +881,13 @@ function RouterProviderInner({
|
|
|
867
881
|
};
|
|
868
882
|
}, [router.history]);
|
|
869
883
|
useLayoutEffect$1(() => {
|
|
870
|
-
if (!isTransitioning &&
|
|
884
|
+
if (!isTransitioning && !routerState.isLoading && routerState.resolvedLocation !== routerState.location) {
|
|
885
|
+
console.log('onResolved', routerState.location);
|
|
871
886
|
router.emit({
|
|
872
887
|
type: 'onResolved',
|
|
873
|
-
fromLocation:
|
|
874
|
-
toLocation:
|
|
875
|
-
pathChanged:
|
|
888
|
+
fromLocation: routerState.resolvedLocation,
|
|
889
|
+
toLocation: routerState.location,
|
|
890
|
+
pathChanged: routerState.location.href !== routerState.resolvedLocation?.href
|
|
876
891
|
});
|
|
877
892
|
router.pendingMatches = [];
|
|
878
893
|
router.__store.setState(s => ({
|
|
@@ -881,15 +896,13 @@ function RouterProviderInner({
|
|
|
881
896
|
resolvedLocation: s.location
|
|
882
897
|
}));
|
|
883
898
|
}
|
|
884
|
-
}, [isTransitioning]);
|
|
899
|
+
}, [isTransitioning, routerState.isLoading]);
|
|
885
900
|
useLayoutEffect$1(() => {
|
|
886
901
|
if (!window.__TSR_DEHYDRATED__) {
|
|
887
902
|
tryLoad();
|
|
888
903
|
}
|
|
889
904
|
}, []);
|
|
890
|
-
return
|
|
891
|
-
value: router
|
|
892
|
-
}, /*#__PURE__*/React.createElement(Matches, null));
|
|
905
|
+
return null;
|
|
893
906
|
}
|
|
894
907
|
function getRouteMatch(state, id) {
|
|
895
908
|
return [...(state.pendingMatches ?? []), ...state.matches].find(d => d.id === id);
|