@tanstack/react-router 0.0.1-beta.234 → 0.0.1-beta.236

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.
@@ -38,12 +38,10 @@ var React__namespace = /*#__PURE__*/_interopNamespaceDefault(React);
38
38
 
39
39
  function Matches() {
40
40
  const {
41
- routesById,
42
- state
41
+ routesById
43
42
  } = RouterProvider.useRouter();
44
- const {
45
- matches
46
- } = state;
43
+ const routerState = RouterProvider.useRouterState();
44
+ const matches = routerState.pendingMatches?.some(d => d.showPending) ? routerState.pendingMatches : routerState.matches;
47
45
  const locationKey = RouterProvider.useRouterState().location.state.key;
48
46
  const route$1 = routesById[route.rootRouteId];
49
47
  const errorComponent = React__namespace.useCallback(props => {
@@ -189,7 +187,8 @@ function useMatch(opts) {
189
187
  const nearestMatchRouteId = nearestMatch?.routeId;
190
188
  const matchRouteId = RouterProvider.useRouterState({
191
189
  select: state => {
192
- const match = opts?.from ? state.matches.find(d => d.routeId === opts?.from) : state.matches.find(d => d.id === nearestMatch.id);
190
+ const matches = state.pendingMatches?.some(d => d.showPending) ? state.pendingMatches : state.matches;
191
+ const match = opts?.from ? matches.find(d => d.routeId === opts?.from) : matches.find(d => d.id === nearestMatch.id);
193
192
  return match.routeId;
194
193
  }
195
194
  });
@@ -198,7 +197,8 @@ function useMatch(opts) {
198
197
  }
199
198
  const matchSelection = RouterProvider.useRouterState({
200
199
  select: state => {
201
- const match = opts?.from ? state.matches.find(d => d.routeId === opts?.from) : state.matches.find(d => d.id === nearestMatch.id);
200
+ const matches = state.pendingMatches?.some(d => d.showPending) ? state.pendingMatches : state.matches;
201
+ const match = opts?.from ? matches.find(d => d.routeId === opts?.from) : matches.find(d => d.id === nearestMatch.id);
202
202
  invariant(match, `Could not find ${opts?.from ? `an active match from "${opts.from}"` : 'a nearest match!'}`);
203
203
  return opts?.select ? opts.select(match) : match;
204
204
  }
@@ -210,7 +210,8 @@ function useMatches(opts) {
210
210
  const contextMatches = React__namespace.useContext(matchesContext);
211
211
  return RouterProvider.useRouterState({
212
212
  select: state => {
213
- const matches = state.matches.slice(state.matches.findIndex(d => d.id === contextMatches[0]?.id));
213
+ let matches = state.pendingMatches?.some(d => d.showPending) ? state.pendingMatches : state.matches;
214
+ matches = matches.slice(matches.findIndex(d => d.id === contextMatches[0]?.id));
214
215
  return opts?.select ? opts.select(matches) : matches;
215
216
  }
216
217
  });
@@ -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 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;;;;;;;;;;;;"}
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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"}
@@ -12,6 +12,7 @@
12
12
 
13
13
  var React = require('react');
14
14
  var warning = require('tiny-warning');
15
+ var reactStore = require('@tanstack/react-store');
15
16
  var Matches = require('./Matches.js');
16
17
  var utils = require('./utils.js');
17
18
 
@@ -62,31 +63,29 @@ function RouterProvider({
62
63
  function RouterProviderInner({
63
64
  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');
68
- const state = React__namespace.useMemo(() => ({
69
- ...preState,
70
- status: isAnyTransitioning ? 'pending' : 'idle',
71
- location: isTransitioning ? router.latestLocation : preState.location,
72
- pendingMatches: router.pendingMatches
73
- }), [preState, isTransitioning]);
74
- router.setState = setState;
75
- router.state = state;
76
67
  router.startReactTransition = startReactTransition;
68
+ React__namespace.useEffect(() => {
69
+ if (isTransitioning) {
70
+ router.__store.setState(s => ({
71
+ ...s,
72
+ isTransitioning
73
+ }));
74
+ }
75
+ }, [isTransitioning]);
77
76
  const tryLoad = () => {
78
- startReactTransition(() => {
79
- try {
80
- router.load();
81
- } catch (err) {
82
- console.error(err);
83
- }
84
- });
77
+ // startReactTransition(() => {
78
+ try {
79
+ router.load();
80
+ } catch (err) {
81
+ console.error(err);
82
+ }
83
+ // })
85
84
  };
86
85
  utils.useLayoutEffect(() => {
87
86
  const unsub = router.history.subscribe(() => {
88
87
  router.latestLocation = router.parseLocation(router.latestLocation);
89
- if (state.location !== router.latestLocation) {
88
+ if (router.state.location !== router.latestLocation) {
90
89
  tryLoad();
91
90
  }
92
91
  });
@@ -96,7 +95,7 @@ function RouterProviderInner({
96
95
  hash: true,
97
96
  state: true
98
97
  });
99
- if (state.location.href !== nextLocation.href) {
98
+ if (router.state.location.href !== nextLocation.href) {
100
99
  router.commitLocation({
101
100
  ...nextLocation,
102
101
  replace: true
@@ -107,20 +106,21 @@ function RouterProviderInner({
107
106
  };
108
107
  }, [router.history]);
109
108
  utils.useLayoutEffect(() => {
110
- if (!isTransitioning && state.resolvedLocation !== state.location) {
109
+ if (!isTransitioning && router.state.resolvedLocation !== router.state.location) {
111
110
  router.emit({
112
111
  type: 'onResolved',
113
- fromLocation: state.resolvedLocation,
114
- toLocation: state.location,
115
- pathChanged: state.location.href !== state.resolvedLocation?.href
112
+ fromLocation: router.state.resolvedLocation,
113
+ toLocation: router.state.location,
114
+ pathChanged: router.state.location.href !== router.state.resolvedLocation?.href
116
115
  });
117
116
  router.pendingMatches = [];
118
- setState(s => ({
117
+ router.__store.setState(s => ({
119
118
  ...s,
119
+ isTransitioning: false,
120
120
  resolvedLocation: s.location
121
121
  }));
122
122
  }
123
- });
123
+ }, [isTransitioning]);
124
124
  utils.useLayoutEffect(() => {
125
125
  if (!window.__TSR_DEHYDRATED__) {
126
126
  tryLoad();
@@ -131,14 +131,11 @@ function RouterProviderInner({
131
131
  }, /*#__PURE__*/React__namespace.createElement(Matches.Matches, null));
132
132
  }
133
133
  function getRouteMatch(state, id) {
134
- return [...state.pendingMatches, ...state.matches].find(d => d.id === id);
134
+ return [...(state.pendingMatches ?? []), ...state.matches].find(d => d.id === id);
135
135
  }
136
136
  function useRouterState(opts) {
137
- const {
138
- state
139
- } = useRouter();
140
- // return useStore(router.__store, opts?.select as any)
141
- return opts?.select ? opts.select(state) : state;
137
+ const router = useRouter();
138
+ return reactStore.useStore(router.__store, opts?.select);
142
139
  }
143
140
  function useRouter() {
144
141
  const resolvedContext = typeof document !== 'undefined' ? window.__TSR_ROUTER_CONTEXT__ || routerContext : routerContext;
@@ -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, 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 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 (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 (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":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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,SAASM,cAAcA,CAG5B;EAAEC,MAAM;EAAE,GAAGC,IAAAA;AAA2C,CAAC,EAAE;AAC3D;EACAD,MAAM,CAACE,MAAM,CAAC;IACZ,GAAGF,MAAM,CAACG,OAAO;AACjB,IAAA,GAAGF,IAAI;AACPG,IAAAA,OAAO,EAAE;AACP,MAAA,GAAGJ,MAAM,CAACG,OAAO,CAACC,OAAO;AACzB,MAAA,GAAGH,IAAI,EAAEG,OAAAA;AACX,KAAA;AACF,GAAQ,CAAC,CAAA;AAET,EAAA,MAAMC,KAAK,gBAAGX,gBAAA,CAAAY,aAAA,CAACC,mBAAmB,EAAA;AAA0BP,IAAAA,MAAM,EAAEA,MAAAA;AAAO,GAAE,CAAC,CAAA;AAE9E,EAAA,IAAIA,MAAM,CAACG,OAAO,CAACK,IAAI,EAAE;IACvB,oBAAOd,gBAAA,CAAAY,aAAA,CAACN,MAAM,CAACG,OAAO,CAACK,IAAI,EAAEH,IAAAA,EAAAA,KAA2B,CAAC,CAAA;AAC3D,GAAA;AAEA,EAAA,OAAOA,KAAK,CAAA;AACd,CAAA;AAEA,SAASE,mBAAmBA,CAG1B;AAAEP,EAAAA,MAAAA;AAA6C,CAAC,EAAE;AAClD,EAAA,MAAM,CAACS,QAAQ,EAAEC,QAAQ,CAAC,GAAGhB,gBAAK,CAACiB,QAAQ,CAAC,MAAMX,MAAM,CAACY,KAAK,CAAC,CAAA;EAC/D,MAAM,CAACC,eAAe,EAAEC,oBAAoB,CAAC,GAAGpB,gBAAK,CAACqB,aAAa,EAAE,CAAA;AACrE,EAAA,MAAMC,kBAAkB,GACtBH,eAAe,IAAIJ,QAAQ,CAACQ,OAAO,CAACC,IAAI,CAAEC,CAAC,IAAKA,CAAC,CAACC,MAAM,KAAK,SAAS,CAAC,CAAA;AAEzE,EAAA,MAAMR,KAAK,GAAGlB,gBAAK,CAAC2B,OAAO,CACzB,OAAO;AACL,IAAA,GAAGZ,QAAQ;AACXW,IAAAA,MAAM,EAAEJ,kBAAkB,GAAG,SAAS,GAAG,MAAM;IAC/CM,QAAQ,EAAET,eAAe,GAAGb,MAAM,CAACuB,cAAc,GAAGd,QAAQ,CAACa,QAAQ;IACrEE,cAAc,EAAExB,MAAM,CAACwB,cAAAA;AACzB,GAAC,CAAC,EACF,CAACf,QAAQ,EAAEI,eAAe,CAC5B,CAAC,CAAA;EAEDb,MAAM,CAACU,QAAQ,GAAGA,QAAQ,CAAA;EAC1BV,MAAM,CAACY,KAAK,GAAGA,KAAK,CAAA;EACpBZ,MAAM,CAACc,oBAAoB,GAAGA,oBAAoB,CAAA;EAElD,MAAMW,OAAO,GAAGA,MAAM;AACpBX,IAAAA,oBAAoB,CAAC,MAAM;MACzB,IAAI;QACFd,MAAM,CAAC0B,IAAI,EAAE,CAAA;OACd,CAAC,OAAOC,GAAG,EAAE;AACZC,QAAAA,OAAO,CAACC,KAAK,CAACF,GAAG,CAAC,CAAA;AACpB,OAAA;AACF,KAAC,CAAC,CAAA;GACH,CAAA;AAEDG,EAAAA,qBAAe,CAAC,MAAM;IACpB,MAAMC,KAAK,GAAG/B,MAAM,CAACgC,OAAO,CAACC,SAAS,CAAC,MAAM;MAC3CjC,MAAM,CAACuB,cAAc,GAAGvB,MAAM,CAACkC,aAAa,CAAClC,MAAM,CAACuB,cAAc,CAAC,CAAA;AACnE,MAAA,IAAIX,KAAK,CAACU,QAAQ,KAAKtB,MAAM,CAACuB,cAAc,EAAE;AAC5CE,QAAAA,OAAO,EAAE,CAAA;AACX,OAAA;AACF,KAAC,CAAC,CAAA;AAEF,IAAA,MAAMU,YAAY,GAAGnC,MAAM,CAACoC,aAAa,CAAC;AACxCC,MAAAA,MAAM,EAAE,IAAI;AACZC,MAAAA,MAAM,EAAE,IAAI;AACZC,MAAAA,IAAI,EAAE,IAAI;AACV3B,MAAAA,KAAK,EAAE,IAAA;AACT,KAAC,CAAC,CAAA;IAEF,IAAIA,KAAK,CAACU,QAAQ,CAACkB,IAAI,KAAKL,YAAY,CAACK,IAAI,EAAE;MAC7CxC,MAAM,CAACyC,cAAc,CAAC;AAAE,QAAA,GAAGN,YAAY;AAAEO,QAAAA,OAAO,EAAE,IAAA;AAAK,OAAC,CAAC,CAAA;AAC3D,KAAA;AAEA,IAAA,OAAO,MAAM;AACXX,MAAAA,KAAK,EAAE,CAAA;KACR,CAAA;AACH,GAAC,EAAE,CAAC/B,MAAM,CAACgC,OAAO,CAAC,CAAC,CAAA;AAEpBF,EAAAA,qBAAe,CAAC,MAAM;IACpB,IAAI,CAACjB,eAAe,IAAID,KAAK,CAAC+B,gBAAgB,KAAK/B,KAAK,CAACU,QAAQ,EAAE;MACjEtB,MAAM,CAAC4C,IAAI,CAAC;AACVC,QAAAA,IAAI,EAAE,YAAY;QAClBC,YAAY,EAAElC,KAAK,CAAC+B,gBAAgB;QACpCI,UAAU,EAAEnC,KAAK,CAACU,QAAQ;QAC1B0B,WAAW,EAAEpC,KAAK,CAACU,QAAQ,CAAEkB,IAAI,KAAK5B,KAAK,CAAC+B,gBAAgB,EAAEH,IAAAA;AAChE,OAAC,CAAC,CAAA;MACFxC,MAAM,CAACwB,cAAc,GAAG,EAAE,CAAA;MAE1Bd,QAAQ,CAAEuC,CAAC,KAAM;AACf,QAAA,GAAGA,CAAC;QACJN,gBAAgB,EAAEM,CAAC,CAAC3B,QAAAA;AACtB,OAAC,CAAC,CAAC,CAAA;AACL,KAAA;AACF,GAAC,CAAC,CAAA;AAEFQ,EAAAA,qBAAe,CAAC,MAAM;AACpB,IAAA,IAAI,CAACjC,MAAM,CAACqD,kBAAkB,EAAE;AAC9BzB,MAAAA,OAAO,EAAE,CAAA;AACX,KAAA;GACD,EAAE,EAAE,CAAC,CAAA;AAEN,EAAA,oBACE/B,gBAAA,CAAAY,aAAA,CAACb,aAAa,CAAC0D,QAAQ,EAAA;AAACC,IAAAA,KAAK,EAAEpD,MAAAA;AAAO,GAAA,eACpCN,gBAAA,CAAAY,aAAA,CAAC+C,eAAO,EAAA,IAAE,CACY,CAAC,CAAA;AAE7B,CAAA;AAEO,SAASC,aAAaA,CAC3B1C,KAA8B,EAC9B2C,EAAU,EAC0B;EACpC,OAAO,CAAC,GAAG3C,KAAK,CAACY,cAAc,EAAE,GAAGZ,KAAK,CAACK,OAAO,CAAC,CAACuC,IAAI,CAAErC,CAAC,IAAKA,CAAC,CAACoC,EAAE,KAAKA,EAAE,CAAC,CAAA;AAC7E,CAAA;AAEO,SAASE,cAAcA,CAE5BC,IAED,EAAa;EACZ,MAAM;AAAE9C,IAAAA,KAAAA;GAAO,GAAG+C,SAAS,EAAE,CAAA;AAC7B;EACA,OAAOD,IAAI,EAAEE,MAAM,GAAGF,IAAI,CAACE,MAAM,CAAChD,KAAK,CAAC,GAAIA,KAAa,CAAA;AAC3D,CAAA;AAUO,SAAS+C,SAASA,GAED;AACtB,EAAA,MAAME,eAAe,GACnB,OAAOjE,QAAQ,KAAK,WAAW,GAC3BC,MAAM,CAACC,sBAAsB,IAAIL,aAAa,GAC9CA,aAAa,CAAA;AACnB,EAAA,MAAM2D,KAAK,GAAG1D,gBAAK,CAACoE,UAAU,CAACD,eAAe,CAAC,CAAA;AAC/CE,EAAAA,OAAO,CAACX,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 { 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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"}
@@ -11,6 +11,7 @@
11
11
  'use strict';
12
12
 
13
13
  var history = require('@tanstack/history');
14
+ var store = require('@tanstack/store');
14
15
  var searchParams = require('./searchParams.js');
15
16
  var utils = require('./utils.js');
16
17
  var RouterProvider = require('./RouterProvider.js');
@@ -52,9 +53,6 @@ class Router {
52
53
  // by the router provider once rendered. We provide these so that the
53
54
  // router can be used in a non-react environment if necessary
54
55
  startReactTransition = fn => fn();
55
- setState = updater => {
56
- this.state = utils.functionalUpdate(updater, this.state);
57
- };
58
56
  update = newOptions => {
59
57
  this.options = {
60
58
  ...this.options,
@@ -69,10 +67,20 @@ class Router {
69
67
  this.routeTree = this.options.routeTree;
70
68
  this.buildRouteTree();
71
69
  }
72
- if (!this.state) {
73
- this.state = getInitialRouterState(this.latestLocation);
70
+ if (!this.__store) {
71
+ this.__store = new store.Store(getInitialRouterState(this.latestLocation), {
72
+ onUpdate: () => {
73
+ this.__store.state = {
74
+ ...this.state,
75
+ status: this.state.isTransitioning || this.state.isLoading ? 'pending' : 'idle'
76
+ };
77
+ }
78
+ });
74
79
  }
75
80
  };
81
+ get state() {
82
+ return this.__store.state;
83
+ }
76
84
  buildRouteTree = () => {
77
85
  this.routesById = {};
78
86
  this.routesByPath = {};
@@ -344,7 +352,7 @@ class Router {
344
352
  RouterProvider.getRouteMatch(this.state, id)?.abortController?.abort();
345
353
  };
346
354
  cancelMatches = () => {
347
- this.state.matches.forEach(match => {
355
+ this.state.pendingMatches?.forEach(match => {
348
356
  this.cancelMatch(match.id);
349
357
  });
350
358
  };
@@ -535,6 +543,12 @@ class Router {
535
543
  }) => {
536
544
  let latestPromise;
537
545
  let firstBadMatchIndex;
546
+ const updatePendingMatch = match => {
547
+ this.__store.setState(s => ({
548
+ ...s,
549
+ pendingMatches: s.pendingMatches?.map(d => d.id === match.id ? match : d)
550
+ }));
551
+ };
538
552
 
539
553
  // Check each match middleware to see if the route can be accessed
540
554
  try {
@@ -691,12 +705,10 @@ class Router {
691
705
  loadPromise
692
706
  };
693
707
  if (!preload) {
694
- this.setState(s => ({
695
- ...s,
696
- matches: s.matches.map(d => d.id === match.id ? match : d)
697
- }));
708
+ updatePendingMatch(match);
698
709
  }
699
710
  let didShowPending = false;
711
+ const pendingMinMs = route.options.pendingMinMs ?? this.options.defaultPendingMinMs;
700
712
  await new Promise(async resolve => {
701
713
  // If the route has a pending component and a pendingMs option,
702
714
  // forcefully show the pending component
@@ -708,17 +720,13 @@ class Router {
708
720
  ...match,
709
721
  showPending: true
710
722
  };
711
- this.setState(s => ({
712
- ...s,
713
- matches: s.matches.map(d => d.id === match.id ? match : d)
714
- }));
723
+ updatePendingMatch(match);
715
724
  resolve();
716
725
  });
717
726
  }
718
727
  try {
719
728
  const loaderData = await loadPromise;
720
729
  if (latestPromise = checkLatest()) return await latestPromise;
721
- const pendingMinMs = route.options.pendingMinMs ?? this.options.defaultPendingMinMs;
722
730
  if (didShowPending && pendingMinMs) {
723
731
  await new Promise(r => setTimeout(r, pendingMinMs));
724
732
  }
@@ -748,12 +756,19 @@ class Router {
748
756
  isFetching: false,
749
757
  updatedAt: Date.now()
750
758
  };
759
+ } finally {
760
+ // If we showed the pending component, that means
761
+ // we already moved the pendingMatches to the matches
762
+ // state, so we need to update that specific match
763
+ if (didShowPending && pendingMinMs && match.showPending) {
764
+ this.__store.setState(s => ({
765
+ ...s,
766
+ matches: s.matches?.map(d => d.id === match.id ? match : d)
767
+ }));
768
+ }
751
769
  }
752
770
  if (!preload) {
753
- this.setState(s => ({
754
- ...s,
755
- matches: s.matches.map(d => d.id === match.id ? match : d)
756
- }));
771
+ updatePendingMatch(match);
757
772
  }
758
773
  resolve();
759
774
  });
@@ -782,24 +797,23 @@ class Router {
782
797
  });
783
798
 
784
799
  // Match the routes
785
- let matches = this.matchRoutes(next.pathname, next.search, {
800
+ let pendingMatches = this.matchRoutes(next.pathname, next.search, {
786
801
  debug: true
787
802
  });
788
- this.pendingMatches = matches;
789
803
  const previousMatches = this.state.matches;
790
804
 
791
805
  // Ingest the new matches
792
- this.setState(s => ({
806
+ this.__store.setState(s => ({
793
807
  ...s,
794
- // status: 'pending',
808
+ isLoading: true,
795
809
  location: next,
796
- matches
810
+ pendingMatches
797
811
  }));
798
812
  try {
799
813
  try {
800
814
  // Load the matches
801
815
  await this.loadMatches({
802
- matches,
816
+ matches: pendingMatches,
803
817
  checkLatest: () => this.checkLatest(promise),
804
818
  invalidate: opts?.invalidate
805
819
  });
@@ -814,14 +828,13 @@ class Router {
814
828
  }
815
829
  const exitingMatchIds = previousMatches.filter(id => !this.pendingMatches.includes(id));
816
830
  const enteringMatchIds = this.pendingMatches.filter(id => !previousMatches.includes(id));
817
- const stayingMatchIds = previousMatches.filter(id => this.pendingMatches.includes(id))
818
-
819
- // setState((s) => ({
820
- // ...s,
821
- // status: 'idle',
822
- // resolvedLocation: s.location,
823
- // matches,
824
- // }))
831
+ const stayingMatchIds = previousMatches.filter(id => this.pendingMatches.includes(id));
832
+ this.__store.setState(s => ({
833
+ ...s,
834
+ isLoading: false,
835
+ matches: pendingMatches,
836
+ pendingMatches: undefined
837
+ }))
825
838
 
826
839
  //
827
840
  ;
@@ -976,9 +989,6 @@ class Router {
976
989
  return false;
977
990
  }
978
991
  const baseLocation = opts?.pending ? this.latestLocation : this.state.resolvedLocation;
979
-
980
- // const baseLocation = state.resolvedLocation
981
-
982
992
  if (!baseLocation) {
983
993
  return false;
984
994
  }
@@ -1050,7 +1060,7 @@ class Router {
1050
1060
  }
1051
1061
  return match;
1052
1062
  });
1053
- this.setState(s => {
1063
+ this.__store.setState(s => {
1054
1064
  return {
1055
1065
  ...s,
1056
1066
  matches: matches
@@ -1081,6 +1091,8 @@ class SearchParamError extends Error {}
1081
1091
  class PathParamError extends Error {}
1082
1092
  function getInitialRouterState(location) {
1083
1093
  return {
1094
+ isLoading: false,
1095
+ isTransitioning: false,
1084
1096
  status: 'idle',
1085
1097
  resolvedLocation: location,
1086
1098
  location,