@tanstack/react-router 1.28.2 → 1.28.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/RouterProvider.cjs +2 -2
- package/dist/cjs/RouterProvider.cjs.map +1 -1
- package/dist/cjs/router.cjs +36 -43
- package/dist/cjs/router.cjs.map +1 -1
- package/dist/esm/RouterProvider.js +2 -2
- package/dist/esm/RouterProvider.js.map +1 -1
- package/dist/esm/router.js +36 -43
- package/dist/esm/router.js.map +1 -1
- package/package.json +2 -2
- package/src/RouterProvider.tsx +2 -0
- package/src/router.ts +34 -44
|
@@ -44,10 +44,10 @@ function RouterProvider({ router, ...rest }) {
|
|
|
44
44
|
});
|
|
45
45
|
const matches = router.options.InnerWrap ? /* @__PURE__ */ jsxRuntime.jsx(router.options.InnerWrap, { children: /* @__PURE__ */ jsxRuntime.jsx(Matches.Matches, {}) }) : /* @__PURE__ */ jsxRuntime.jsx(Matches.Matches, {});
|
|
46
46
|
const routerContext$1 = routerContext.getRouterContext();
|
|
47
|
-
const provider = /* @__PURE__ */ jsxRuntime.jsxs(routerContext$1.Provider, { value: router, children: [
|
|
47
|
+
const provider = /* @__PURE__ */ jsxRuntime.jsx(React__namespace.Suspense, { fallback: null, children: /* @__PURE__ */ jsxRuntime.jsxs(routerContext$1.Provider, { value: router, children: [
|
|
48
48
|
matches,
|
|
49
49
|
/* @__PURE__ */ jsxRuntime.jsx(Transitioner, {})
|
|
50
|
-
] });
|
|
50
|
+
] }) });
|
|
51
51
|
if (router.options.Wrap) {
|
|
52
52
|
return /* @__PURE__ */ jsxRuntime.jsx(router.options.Wrap, { children: provider });
|
|
53
53
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RouterProvider.cjs","sources":["../../src/RouterProvider.tsx"],"sourcesContent":["import * as React from 'react'\nimport { Matches } from './Matches'\nimport { pick, useLayoutEffect } from './utils'\nimport { useRouter } from './useRouter'\nimport { useRouterState } from './useRouterState'\nimport { getRouterContext } from './routerContext'\nimport type { NavigateOptions, ToOptions } from './link'\nimport type { ParsedLocation } from './location'\nimport type { AnyRoute } from './route'\nimport type { RoutePaths } from './routeInfo'\nimport type {\n RegisteredRouter,\n Router,\n RouterOptions,\n RouterState,\n} from './router'\n\nimport type { RouteMatch } from './Matches'\n\nconst useTransition =\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n React.useTransition ||\n (() => [\n false,\n (cb) => {\n cb()\n },\n ])\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 NavigateFn = <\n TTo extends string,\n TRouteTree extends AnyRoute = RegisteredRouter['routeTree'],\n TFrom extends RoutePaths<TRouteTree> | string = string,\n TMaskFrom extends RoutePaths<TRouteTree> | string = TFrom,\n TMaskTo extends string = '',\n>(\n opts: NavigateOptions<TRouteTree, TFrom, TTo, TMaskFrom, TMaskTo>,\n) => Promise<void>\n\nexport type BuildLocationFn<TRouteTree extends AnyRoute> = <\n TTo extends string,\n TFrom extends RoutePaths<TRouteTree> | string = string,\n TMaskFrom extends RoutePaths<TRouteTree> | string = TFrom,\n TMaskTo extends string = '',\n>(\n opts: ToOptions<TRouteTree, TFrom, TTo, TMaskFrom, TMaskTo> & {\n leaveParams?: boolean\n },\n) => ParsedLocation\n\nexport type InjectedHtmlEntry = string | (() => Promise<string> | string)\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 matches = router.options.InnerWrap ? (\n <router.options.InnerWrap>\n <Matches />\n </router.options.InnerWrap>\n ) : (\n <Matches />\n )\n\n const routerContext = getRouterContext()\n\n const provider = (\n <routerContext.Provider value={router}>\n {matches}\n <Transitioner />\n </routerContext.Provider>\n )\n\n if (router.options.Wrap) {\n return <router.options.Wrap>{provider}</router.options.Wrap>\n }\n\n return provider\n}\n\nfunction Transitioner() {\n const router = useRouter()\n const mountLoadForRouter = React.useRef({ router, mounted: false })\n const routerState = useRouterState({\n select: (s) =>\n pick(s, ['isLoading', 'location', 'resolvedLocation', 'isTransitioning']),\n })\n\n const [isTransitioning, startReactTransition] = 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, router])\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 (router.state.location !== router.latestLocation) {\n tryLoad()\n }\n })\n\n const nextLocation = router.buildLocation({\n to: router.latestLocation.pathname,\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 // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [router, router.history])\n\n useLayoutEffect(() => {\n if (\n (React.useTransition as any)\n ? routerState.isTransitioning && !isTransitioning\n : !routerState.isLoading &&\n routerState.resolvedLocation !== routerState.location\n ) {\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\n if ((document as any).querySelector) {\n if (routerState.location.hash !== '') {\n const el = document.getElementById(routerState.location.hash)\n if (el) {\n el.scrollIntoView()\n }\n }\n }\n\n router.__store.setState((s) => ({\n ...s,\n isTransitioning: false,\n resolvedLocation: s.location,\n }))\n }\n }, [\n routerState.isTransitioning,\n isTransitioning,\n routerState.isLoading,\n routerState.resolvedLocation,\n routerState.location,\n router,\n ])\n\n useLayoutEffect(() => {\n if (\n window.__TSR_DEHYDRATED__ ||\n (mountLoadForRouter.current.router === router &&\n mountLoadForRouter.current.mounted)\n ) {\n return\n }\n mountLoadForRouter.current = { router, mounted: true }\n tryLoad()\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [router])\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 [\n ...state.cachedMatches,\n ...(state.pendingMatches ?? []),\n ...state.matches,\n ].find((d) => d.id === id)\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"],"names":["React","jsx","Matches","routerContext","getRouterContext","jsxs","useRouter","useRouterState","pick","useLayoutEffect"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAmBA,MAAM;AAAA;AAAA,EAEJA,iBAAM,kBACL,MAAM;AAAA,IACL;AAAA,IACA,CAAC,OAAO;AACH;IACL;AAAA,EAAA;AAAA;AAuCG,SAAS,eAGd,EAAE,QAAQ,GAAG,QAA8C;AAE3D,SAAO,OAAO;AAAA,IACZ,GAAG,OAAO;AAAA,IACV,GAAG;AAAA,IACH,SAAS;AAAA,MACP,GAAG,OAAO,QAAQ;AAAA,MAClB,GAAG,KAAK;AAAA,IACV;AAAA,EAAA,CACM;AAER,QAAM,UAAU,OAAO,QAAQ,2CAC5B,OAAO,QAAQ,WAAf,EACC,UAACC,2BAAA,IAAAC,QAAA,SAAA,EAAQ,EACX,CAAA,mCAECA,QAAAA,SAAQ,CAAA,CAAA;AAGX,QAAMC,kBAAgBC,cAAAA;AAEtB,QAAM,
|
|
1
|
+
{"version":3,"file":"RouterProvider.cjs","sources":["../../src/RouterProvider.tsx"],"sourcesContent":["import * as React from 'react'\nimport { Matches } from './Matches'\nimport { pick, useLayoutEffect } from './utils'\nimport { useRouter } from './useRouter'\nimport { useRouterState } from './useRouterState'\nimport { getRouterContext } from './routerContext'\nimport type { NavigateOptions, ToOptions } from './link'\nimport type { ParsedLocation } from './location'\nimport type { AnyRoute } from './route'\nimport type { RoutePaths } from './routeInfo'\nimport type {\n RegisteredRouter,\n Router,\n RouterOptions,\n RouterState,\n} from './router'\n\nimport type { RouteMatch } from './Matches'\n\nconst useTransition =\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n React.useTransition ||\n (() => [\n false,\n (cb) => {\n cb()\n },\n ])\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 NavigateFn = <\n TTo extends string,\n TRouteTree extends AnyRoute = RegisteredRouter['routeTree'],\n TFrom extends RoutePaths<TRouteTree> | string = string,\n TMaskFrom extends RoutePaths<TRouteTree> | string = TFrom,\n TMaskTo extends string = '',\n>(\n opts: NavigateOptions<TRouteTree, TFrom, TTo, TMaskFrom, TMaskTo>,\n) => Promise<void>\n\nexport type BuildLocationFn<TRouteTree extends AnyRoute> = <\n TTo extends string,\n TFrom extends RoutePaths<TRouteTree> | string = string,\n TMaskFrom extends RoutePaths<TRouteTree> | string = TFrom,\n TMaskTo extends string = '',\n>(\n opts: ToOptions<TRouteTree, TFrom, TTo, TMaskFrom, TMaskTo> & {\n leaveParams?: boolean\n },\n) => ParsedLocation\n\nexport type InjectedHtmlEntry = string | (() => Promise<string> | string)\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 matches = router.options.InnerWrap ? (\n <router.options.InnerWrap>\n <Matches />\n </router.options.InnerWrap>\n ) : (\n <Matches />\n )\n\n const routerContext = getRouterContext()\n\n const provider = (\n <React.Suspense fallback={null}>\n <routerContext.Provider value={router}>\n {matches}\n <Transitioner />\n </routerContext.Provider>\n </React.Suspense>\n )\n\n if (router.options.Wrap) {\n return <router.options.Wrap>{provider}</router.options.Wrap>\n }\n\n return provider\n}\n\nfunction Transitioner() {\n const router = useRouter()\n const mountLoadForRouter = React.useRef({ router, mounted: false })\n const routerState = useRouterState({\n select: (s) =>\n pick(s, ['isLoading', 'location', 'resolvedLocation', 'isTransitioning']),\n })\n\n const [isTransitioning, startReactTransition] = 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, router])\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 (router.state.location !== router.latestLocation) {\n tryLoad()\n }\n })\n\n const nextLocation = router.buildLocation({\n to: router.latestLocation.pathname,\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 // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [router, router.history])\n\n useLayoutEffect(() => {\n if (\n (React.useTransition as any)\n ? routerState.isTransitioning && !isTransitioning\n : !routerState.isLoading &&\n routerState.resolvedLocation !== routerState.location\n ) {\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\n if ((document as any).querySelector) {\n if (routerState.location.hash !== '') {\n const el = document.getElementById(routerState.location.hash)\n if (el) {\n el.scrollIntoView()\n }\n }\n }\n\n router.__store.setState((s) => ({\n ...s,\n isTransitioning: false,\n resolvedLocation: s.location,\n }))\n }\n }, [\n routerState.isTransitioning,\n isTransitioning,\n routerState.isLoading,\n routerState.resolvedLocation,\n routerState.location,\n router,\n ])\n\n useLayoutEffect(() => {\n if (\n window.__TSR_DEHYDRATED__ ||\n (mountLoadForRouter.current.router === router &&\n mountLoadForRouter.current.mounted)\n ) {\n return\n }\n mountLoadForRouter.current = { router, mounted: true }\n tryLoad()\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [router])\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 [\n ...state.cachedMatches,\n ...(state.pendingMatches ?? []),\n ...state.matches,\n ].find((d) => d.id === id)\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"],"names":["React","jsx","Matches","routerContext","getRouterContext","jsxs","useRouter","useRouterState","pick","useLayoutEffect"],"mappings":"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"}
|
package/dist/cjs/router.cjs
CHANGED
|
@@ -597,42 +597,51 @@ class Router {
|
|
|
597
597
|
});
|
|
598
598
|
return updated;
|
|
599
599
|
};
|
|
600
|
-
const handleMatchSpecialError = (match, err) => {
|
|
601
|
-
updateMatch(match.id, (prev) => ({
|
|
602
|
-
...prev,
|
|
603
|
-
status: redirects.isRedirect(err) ? "redirected" : notFound.isNotFound(err) ? "notFound" : "error",
|
|
604
|
-
isFetching: false,
|
|
605
|
-
error: err
|
|
606
|
-
}));
|
|
607
|
-
if (!err.routeId) {
|
|
608
|
-
err.routeId = match.routeId;
|
|
609
|
-
}
|
|
610
|
-
throw err;
|
|
611
|
-
};
|
|
612
600
|
try {
|
|
613
601
|
await new Promise((resolveAll, rejectAll) => {
|
|
614
602
|
;
|
|
615
603
|
(async () => {
|
|
616
604
|
var _a, _b;
|
|
617
605
|
try {
|
|
606
|
+
const handleRedirectAndNotFound = (match, err) => {
|
|
607
|
+
if (redirects.isRedirect(err) || notFound.isNotFound(err)) {
|
|
608
|
+
updateMatch(match.id, (prev) => ({
|
|
609
|
+
...prev,
|
|
610
|
+
status: redirects.isRedirect(err) ? "redirected" : notFound.isNotFound(err) ? "notFound" : "error",
|
|
611
|
+
isFetching: false,
|
|
612
|
+
error: err
|
|
613
|
+
}));
|
|
614
|
+
if (!err.routeId) {
|
|
615
|
+
;
|
|
616
|
+
err.routeId = match.routeId;
|
|
617
|
+
}
|
|
618
|
+
if (redirects.isRedirect(err)) {
|
|
619
|
+
const redirect = this.resolveRedirect(err);
|
|
620
|
+
if (!preload && !this.isServer) {
|
|
621
|
+
this.navigate({ ...redirect, replace: true });
|
|
622
|
+
}
|
|
623
|
+
throw redirect;
|
|
624
|
+
} else if (notFound.isNotFound(err)) {
|
|
625
|
+
if (!preload)
|
|
626
|
+
this.handleNotFound(matches, err);
|
|
627
|
+
throw err;
|
|
628
|
+
}
|
|
629
|
+
}
|
|
630
|
+
};
|
|
618
631
|
for (let [index, match] of matches.entries()) {
|
|
619
632
|
const parentMatch = matches[index - 1];
|
|
620
633
|
const route2 = this.looseRoutesById[match.routeId];
|
|
621
634
|
const abortController = new AbortController();
|
|
622
|
-
const handleSerialError = (err,
|
|
635
|
+
const handleSerialError = (err, routerCode) => {
|
|
623
636
|
var _a2, _b2;
|
|
624
|
-
err.routerCode =
|
|
637
|
+
err.routerCode = routerCode;
|
|
625
638
|
firstBadMatchIndex = firstBadMatchIndex ?? index;
|
|
626
|
-
|
|
627
|
-
handleMatchSpecialError(match, err);
|
|
628
|
-
}
|
|
639
|
+
handleRedirectAndNotFound(match, err);
|
|
629
640
|
try {
|
|
630
641
|
(_b2 = (_a2 = route2.options).onError) == null ? void 0 : _b2.call(_a2, err);
|
|
631
642
|
} catch (errorHandlerErr) {
|
|
632
643
|
err = errorHandlerErr;
|
|
633
|
-
|
|
634
|
-
handleMatchSpecialError(match, errorHandlerErr);
|
|
635
|
-
}
|
|
644
|
+
handleRedirectAndNotFound(match, err);
|
|
636
645
|
}
|
|
637
646
|
matches[index] = match = {
|
|
638
647
|
...match,
|
|
@@ -701,11 +710,6 @@ class Router {
|
|
|
701
710
|
validResolvedMatches.map(async (match, index) => {
|
|
702
711
|
const parentMatchPromise = matchPromises[index - 1];
|
|
703
712
|
const route2 = this.looseRoutesById[match.routeId];
|
|
704
|
-
const handleError = (err) => {
|
|
705
|
-
if (redirects.isRedirect(err) || notFound.isNotFound(err)) {
|
|
706
|
-
handleMatchSpecialError(match, err);
|
|
707
|
-
}
|
|
708
|
-
};
|
|
709
713
|
const loaderContext = {
|
|
710
714
|
params: match.params,
|
|
711
715
|
deps: match.loaderDeps,
|
|
@@ -775,7 +779,7 @@ class Router {
|
|
|
775
779
|
const loaderData = await loaderPromise;
|
|
776
780
|
if (latestPromise = checkLatest())
|
|
777
781
|
return await latestPromise;
|
|
778
|
-
|
|
782
|
+
handleRedirectAndNotFound(match, loaderData);
|
|
779
783
|
if (latestPromise = checkLatest())
|
|
780
784
|
return await latestPromise;
|
|
781
785
|
await potentialPendingMinPromise();
|
|
@@ -805,12 +809,12 @@ class Router {
|
|
|
805
809
|
await potentialPendingMinPromise();
|
|
806
810
|
if (latestPromise = checkLatest())
|
|
807
811
|
return await latestPromise;
|
|
808
|
-
|
|
812
|
+
handleRedirectAndNotFound(match, e);
|
|
809
813
|
try {
|
|
810
814
|
(_i = (_h = route2.options).onError) == null ? void 0 : _i.call(_h, e);
|
|
811
815
|
} catch (onErrorError) {
|
|
812
816
|
error = onErrorError;
|
|
813
|
-
|
|
817
|
+
handleRedirectAndNotFound(match, onErrorError);
|
|
814
818
|
}
|
|
815
819
|
matches[index] = match = updateMatch(match.id, (prev) => ({
|
|
816
820
|
...prev,
|
|
@@ -832,32 +836,21 @@ class Router {
|
|
|
832
836
|
...match,
|
|
833
837
|
preload: !!preload && !this.state.matches.find((d) => d.id === match.id)
|
|
834
838
|
};
|
|
835
|
-
const
|
|
839
|
+
const fetchWithRedirectAndNotFound = async () => {
|
|
836
840
|
try {
|
|
837
841
|
await fetch();
|
|
838
842
|
} catch (err) {
|
|
839
843
|
if (latestPromise = checkLatest())
|
|
840
844
|
return await latestPromise;
|
|
841
|
-
|
|
842
|
-
const redirect = this.resolveRedirect(err);
|
|
843
|
-
if (!preload && !this.isServer) {
|
|
844
|
-
this.navigate({ ...redirect, replace: true });
|
|
845
|
-
}
|
|
846
|
-
throw redirect;
|
|
847
|
-
} else if (notFound.isNotFound(err)) {
|
|
848
|
-
if (!preload)
|
|
849
|
-
this.handleNotFound(matches, err);
|
|
850
|
-
throw err;
|
|
851
|
-
}
|
|
852
|
-
handleError(err);
|
|
845
|
+
handleRedirectAndNotFound(match, err);
|
|
853
846
|
}
|
|
854
847
|
};
|
|
855
848
|
if (match.status === "success" && (match.invalid || (shouldReload ?? age > staleAge))) {
|
|
856
|
-
|
|
849
|
+
fetchWithRedirectAndNotFound();
|
|
857
850
|
return;
|
|
858
851
|
}
|
|
859
852
|
if (match.status !== "success") {
|
|
860
|
-
await
|
|
853
|
+
await fetchWithRedirectAndNotFound();
|
|
861
854
|
}
|
|
862
855
|
})
|
|
863
856
|
);
|