@tanstack/react-router 1.20.0 → 1.20.3-alpha.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +31 -0
- package/dist/cjs/Asset.cjs +41 -0
- package/dist/cjs/Asset.cjs.map +1 -0
- package/dist/cjs/Asset.d.cts +2 -0
- package/dist/cjs/CatchBoundary.cjs +16 -12
- package/dist/cjs/CatchBoundary.cjs.map +1 -1
- package/dist/cjs/CatchBoundary.d.cts +8 -32
- package/dist/cjs/ClientOnly.cjs +20 -0
- package/dist/cjs/ClientOnly.cjs.map +1 -0
- package/dist/cjs/ClientOnly.d.cts +29 -0
- package/dist/cjs/HeadContent.cjs +155 -0
- package/dist/cjs/HeadContent.cjs.map +1 -0
- package/dist/cjs/HeadContent.d.cts +7 -0
- package/dist/cjs/Match.cjs +252 -0
- package/dist/cjs/Match.cjs.map +1 -0
- package/dist/cjs/Match.d.cts +8 -0
- package/dist/cjs/Matches.cjs +39 -287
- package/dist/cjs/Matches.cjs.map +1 -1
- package/dist/cjs/Matches.d.cts +23 -83
- package/dist/cjs/RouterProvider.cjs +17 -140
- package/dist/cjs/RouterProvider.cjs.map +1 -1
- package/dist/cjs/RouterProvider.d.cts +8 -27
- package/dist/cjs/SafeFragment.cjs +8 -0
- package/dist/cjs/SafeFragment.cjs.map +1 -0
- package/dist/cjs/SafeFragment.d.cts +1 -0
- package/dist/cjs/ScriptOnce.cjs +28 -0
- package/dist/cjs/ScriptOnce.cjs.map +1 -0
- package/dist/cjs/ScriptOnce.d.cts +5 -0
- package/dist/cjs/Scripts.cjs +51 -0
- package/dist/cjs/Scripts.cjs.map +1 -0
- package/dist/cjs/Scripts.d.cts +1 -0
- package/dist/cjs/ScrollRestoration.cjs +39 -0
- package/dist/cjs/ScrollRestoration.cjs.map +1 -0
- package/dist/cjs/ScrollRestoration.d.cts +14 -0
- package/dist/cjs/Transitioner.cjs +115 -0
- package/dist/cjs/Transitioner.cjs.map +1 -0
- package/dist/cjs/Transitioner.d.cts +1 -0
- package/dist/cjs/awaited.cjs +12 -65
- package/dist/cjs/awaited.cjs.map +1 -1
- package/dist/cjs/awaited.d.cts +4 -4
- package/dist/cjs/fileRoute.cjs +41 -15
- package/dist/cjs/fileRoute.cjs.map +1 -1
- package/dist/cjs/fileRoute.d.cts +33 -108
- package/dist/cjs/history.d.cts +1 -0
- package/dist/cjs/index.cjs +216 -73
- package/dist/cjs/index.cjs.map +1 -1
- package/dist/cjs/index.d.cts +52 -29
- package/dist/cjs/lazyRouteComponent.cjs +40 -29
- package/dist/cjs/lazyRouteComponent.cjs.map +1 -1
- package/dist/cjs/lazyRouteComponent.d.cts +1 -1
- package/dist/cjs/link.cjs +212 -106
- package/dist/cjs/link.cjs.map +1 -1
- package/dist/cjs/link.d.cts +41 -86
- package/dist/cjs/matchContext.cjs +27 -0
- package/dist/cjs/matchContext.cjs.map +1 -0
- package/dist/cjs/matchContext.d.cts +3 -0
- package/dist/cjs/not-found.cjs +9 -15
- package/dist/cjs/not-found.cjs.map +1 -1
- package/dist/cjs/not-found.d.cts +5 -22
- package/dist/cjs/renderRouteNotFound.cjs +22 -0
- package/dist/cjs/renderRouteNotFound.cjs.map +1 -0
- package/dist/cjs/renderRouteNotFound.d.cts +2 -0
- package/dist/cjs/route.cjs +110 -79
- package/dist/cjs/route.cjs.map +1 -1
- package/dist/cjs/route.d.cts +64 -361
- package/dist/cjs/router.cjs +12 -1237
- package/dist/cjs/router.cjs.map +1 -1
- package/dist/cjs/router.d.cts +69 -237
- package/dist/cjs/routerContext.cjs +1 -1
- package/dist/cjs/routerContext.cjs.map +1 -1
- package/dist/cjs/routerContext.d.cts +7 -2
- package/dist/cjs/scroll-restoration.cjs +16 -177
- package/dist/cjs/scroll-restoration.cjs.map +1 -1
- package/dist/cjs/scroll-restoration.d.cts +1 -18
- package/dist/cjs/serializer.d.cts +6 -0
- package/dist/cjs/structuralSharing.d.cts +8 -0
- package/dist/cjs/typePrimitives.d.cts +16 -0
- package/dist/cjs/useBlocker.cjs +138 -9
- package/dist/cjs/useBlocker.cjs.map +1 -1
- package/dist/cjs/useBlocker.d.cts +64 -7
- package/dist/cjs/useCanGoBack.cjs +8 -0
- package/dist/cjs/useCanGoBack.cjs.map +1 -0
- package/dist/cjs/useCanGoBack.d.cts +1 -0
- package/dist/cjs/useLoaderData.cjs +15 -0
- package/dist/cjs/useLoaderData.cjs.map +1 -0
- package/dist/cjs/useLoaderData.d.cts +8 -0
- package/dist/cjs/useLoaderDeps.cjs +14 -0
- package/dist/cjs/useLoaderDeps.cjs.map +1 -0
- package/dist/cjs/useLoaderDeps.d.cts +8 -0
- package/dist/cjs/useLocation.cjs +10 -0
- package/dist/cjs/useLocation.cjs.map +1 -0
- package/dist/cjs/useLocation.d.cts +7 -0
- package/dist/cjs/useMatch.cjs +47 -0
- package/dist/cjs/useMatch.cjs.map +1 -0
- package/dist/cjs/useMatch.d.cts +10 -0
- package/dist/cjs/useNavigate.cjs +18 -19
- package/dist/cjs/useNavigate.cjs.map +1 -1
- package/dist/cjs/useNavigate.d.cts +4 -8
- package/dist/cjs/useParams.cjs +8 -8
- package/dist/cjs/useParams.cjs.map +1 -1
- package/dist/cjs/useParams.d.cts +9 -8
- package/dist/cjs/useRouteContext.cjs +3 -3
- package/dist/cjs/useRouteContext.cjs.map +1 -1
- package/dist/cjs/useRouteContext.d.cts +3 -7
- package/dist/cjs/useRouter.cjs.map +1 -1
- package/dist/cjs/useRouter.d.cts +3 -4
- package/dist/cjs/useRouterState.cjs +18 -1
- package/dist/cjs/useRouterState.cjs.map +1 -1
- package/dist/cjs/useRouterState.d.cts +8 -6
- package/dist/cjs/useSearch.cjs +7 -4
- package/dist/cjs/useSearch.cjs.map +1 -1
- package/dist/cjs/useSearch.d.cts +9 -7
- package/dist/cjs/utils.cjs +40 -122
- package/dist/cjs/utils.cjs.map +1 -1
- package/dist/cjs/utils.d.cts +46 -50
- package/dist/esm/Asset.d.ts +2 -0
- package/dist/esm/Asset.js +41 -0
- package/dist/esm/Asset.js.map +1 -0
- package/dist/esm/CatchBoundary.d.ts +8 -32
- package/dist/esm/CatchBoundary.js +16 -12
- package/dist/esm/CatchBoundary.js.map +1 -1
- package/dist/esm/ClientOnly.d.ts +29 -0
- package/dist/esm/ClientOnly.js +20 -0
- package/dist/esm/ClientOnly.js.map +1 -0
- package/dist/esm/HeadContent.d.ts +7 -0
- package/dist/esm/HeadContent.js +139 -0
- package/dist/esm/HeadContent.js.map +1 -0
- package/dist/esm/Match.d.ts +8 -0
- package/dist/esm/Match.js +235 -0
- package/dist/esm/Match.js.map +1 -0
- package/dist/esm/Matches.d.ts +23 -83
- package/dist/esm/Matches.js +36 -284
- package/dist/esm/Matches.js.map +1 -1
- package/dist/esm/RouterProvider.d.ts +8 -27
- package/dist/esm/RouterProvider.js +20 -126
- package/dist/esm/RouterProvider.js.map +1 -1
- package/dist/esm/SafeFragment.d.ts +1 -0
- package/dist/esm/SafeFragment.js +8 -0
- package/dist/esm/SafeFragment.js.map +1 -0
- package/dist/esm/ScriptOnce.d.ts +5 -0
- package/dist/esm/ScriptOnce.js +28 -0
- package/dist/esm/ScriptOnce.js.map +1 -0
- package/dist/esm/Scripts.d.ts +1 -0
- package/dist/esm/Scripts.js +51 -0
- package/dist/esm/Scripts.js.map +1 -0
- package/dist/esm/ScrollRestoration.d.ts +14 -0
- package/dist/esm/ScrollRestoration.js +39 -0
- package/dist/esm/ScrollRestoration.js.map +1 -0
- package/dist/esm/Transitioner.d.ts +1 -0
- package/dist/esm/Transitioner.js +98 -0
- package/dist/esm/Transitioner.js.map +1 -0
- package/dist/esm/awaited.d.ts +4 -4
- package/dist/esm/awaited.js +12 -65
- package/dist/esm/awaited.js.map +1 -1
- package/dist/esm/fileRoute.d.ts +33 -108
- package/dist/esm/fileRoute.js +38 -12
- package/dist/esm/fileRoute.js.map +1 -1
- package/dist/esm/history.d.ts +1 -0
- package/dist/esm/index.d.ts +52 -29
- package/dist/esm/index.js +41 -29
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/lazyRouteComponent.d.ts +1 -1
- package/dist/esm/lazyRouteComponent.js +40 -29
- package/dist/esm/lazyRouteComponent.js.map +1 -1
- package/dist/esm/link.d.ts +41 -86
- package/dist/esm/link.js +212 -106
- package/dist/esm/link.js.map +1 -1
- package/dist/esm/matchContext.d.ts +3 -0
- package/dist/esm/matchContext.js +10 -0
- package/dist/esm/matchContext.js.map +1 -0
- package/dist/esm/not-found.d.ts +5 -22
- package/dist/esm/not-found.js +9 -15
- package/dist/esm/not-found.js.map +1 -1
- package/dist/esm/renderRouteNotFound.d.ts +2 -0
- package/dist/esm/renderRouteNotFound.js +22 -0
- package/dist/esm/renderRouteNotFound.js.map +1 -0
- package/dist/esm/route.d.ts +64 -361
- package/dist/esm/route.js +103 -72
- package/dist/esm/route.js.map +1 -1
- package/dist/esm/router.d.ts +69 -237
- package/dist/esm/router.js +13 -1238
- package/dist/esm/router.js.map +1 -1
- package/dist/esm/routerContext.d.ts +7 -2
- package/dist/esm/routerContext.js +1 -1
- package/dist/esm/routerContext.js.map +1 -1
- package/dist/esm/scroll-restoration.d.ts +1 -18
- package/dist/esm/scroll-restoration.js +17 -161
- package/dist/esm/scroll-restoration.js.map +1 -1
- package/dist/esm/serializer.d.ts +6 -0
- package/dist/esm/structuralSharing.d.ts +8 -0
- package/dist/esm/typePrimitives.d.ts +16 -0
- package/dist/esm/useBlocker.d.ts +64 -7
- package/dist/esm/useBlocker.js +138 -9
- package/dist/esm/useBlocker.js.map +1 -1
- package/dist/esm/useCanGoBack.d.ts +1 -0
- package/dist/esm/useCanGoBack.js +8 -0
- package/dist/esm/useCanGoBack.js.map +1 -0
- package/dist/esm/useLoaderData.d.ts +8 -0
- package/dist/esm/useLoaderData.js +15 -0
- package/dist/esm/useLoaderData.js.map +1 -0
- package/dist/esm/useLoaderDeps.d.ts +8 -0
- package/dist/esm/useLoaderDeps.js +14 -0
- package/dist/esm/useLoaderDeps.js.map +1 -0
- package/dist/esm/useLocation.d.ts +7 -0
- package/dist/esm/useLocation.js +10 -0
- package/dist/esm/useLocation.js.map +1 -0
- package/dist/esm/useMatch.d.ts +10 -0
- package/dist/esm/useMatch.js +30 -0
- package/dist/esm/useMatch.js.map +1 -0
- package/dist/esm/useNavigate.d.ts +4 -8
- package/dist/esm/useNavigate.js +18 -19
- package/dist/esm/useNavigate.js.map +1 -1
- package/dist/esm/useParams.d.ts +9 -8
- package/dist/esm/useParams.js +8 -8
- package/dist/esm/useParams.js.map +1 -1
- package/dist/esm/useRouteContext.d.ts +3 -7
- package/dist/esm/useRouteContext.js +2 -2
- package/dist/esm/useRouteContext.js.map +1 -1
- package/dist/esm/useRouter.d.ts +3 -4
- package/dist/esm/useRouter.js.map +1 -1
- package/dist/esm/useRouterState.d.ts +8 -6
- package/dist/esm/useRouterState.js +18 -1
- package/dist/esm/useRouterState.js.map +1 -1
- package/dist/esm/useSearch.d.ts +9 -7
- package/dist/esm/useSearch.js +6 -3
- package/dist/esm/useSearch.js.map +1 -1
- package/dist/esm/utils.d.ts +46 -50
- package/dist/esm/utils.js +41 -123
- package/dist/esm/utils.js.map +1 -1
- package/package.json +30 -31
- package/src/Asset.tsx +40 -0
- package/src/CatchBoundary.tsx +35 -19
- package/src/ClientOnly.tsx +68 -0
- package/src/HeadContent.tsx +174 -0
- package/src/Match.tsx +330 -0
- package/src/Matches.tsx +149 -558
- package/src/RouterProvider.tsx +58 -212
- package/src/SafeFragment.tsx +5 -0
- package/src/ScriptOnce.tsx +32 -0
- package/src/Scripts.tsx +65 -0
- package/src/ScrollRestoration.tsx +69 -0
- package/src/Transitioner.tsx +130 -0
- package/src/awaited.tsx +16 -87
- package/src/fileRoute.ts +145 -248
- package/src/history.ts +2 -1
- package/src/index.tsx +368 -30
- package/src/lazyRouteComponent.tsx +68 -54
- package/src/link.tsx +397 -522
- package/src/matchContext.tsx +8 -0
- package/src/not-found.tsx +13 -34
- package/src/renderRouteNotFound.tsx +27 -0
- package/src/route.tsx +572 -0
- package/src/router.ts +99 -2067
- package/src/routerContext.tsx +8 -2
- package/src/scroll-restoration.tsx +23 -224
- package/src/serializer.ts +7 -0
- package/src/structuralSharing.ts +47 -0
- package/src/typePrimitives.ts +84 -0
- package/src/useBlocker.tsx +297 -15
- package/src/useCanGoBack.ts +5 -0
- package/src/useLoaderData.tsx +80 -0
- package/src/useLoaderDeps.tsx +58 -0
- package/src/useLocation.tsx +41 -0
- package/src/useMatch.tsx +119 -0
- package/src/useNavigate.tsx +41 -61
- package/src/useParams.tsx +88 -23
- package/src/useRouteContext.ts +24 -18
- package/src/useRouter.tsx +4 -5
- package/src/useRouterState.tsx +52 -10
- package/src/useSearch.tsx +87 -24
- package/src/utils.ts +97 -312
- package/dist/cjs/createServerFn.cjs +0 -40
- package/dist/cjs/createServerFn.cjs.map +0 -1
- package/dist/cjs/createServerFn.d.cts +0 -44
- package/dist/cjs/defer.cjs +0 -30
- package/dist/cjs/defer.cjs.map +0 -1
- package/dist/cjs/defer.d.cts +0 -25
- package/dist/cjs/location.d.cts +0 -12
- package/dist/cjs/path.cjs +0 -213
- package/dist/cjs/path.cjs.map +0 -1
- package/dist/cjs/path.d.cts +0 -24
- package/dist/cjs/qss.cjs +0 -45
- package/dist/cjs/qss.cjs.map +0 -1
- package/dist/cjs/qss.d.cts +0 -2
- package/dist/cjs/redirects.cjs +0 -16
- package/dist/cjs/redirects.cjs.map +0 -1
- package/dist/cjs/redirects.d.cts +0 -18
- package/dist/cjs/routeInfo.d.cts +0 -33
- package/dist/cjs/searchParams.cjs +0 -63
- package/dist/cjs/searchParams.cjs.map +0 -1
- package/dist/cjs/searchParams.d.cts +0 -7
- package/dist/esm/createServerFn.d.ts +0 -44
- package/dist/esm/createServerFn.js +0 -40
- package/dist/esm/createServerFn.js.map +0 -1
- package/dist/esm/defer.d.ts +0 -25
- package/dist/esm/defer.js +0 -30
- package/dist/esm/defer.js.map +0 -1
- package/dist/esm/location.d.ts +0 -12
- package/dist/esm/path.d.ts +0 -24
- package/dist/esm/path.js +0 -213
- package/dist/esm/path.js.map +0 -1
- package/dist/esm/qss.d.ts +0 -2
- package/dist/esm/qss.js +0 -45
- package/dist/esm/qss.js.map +0 -1
- package/dist/esm/redirects.d.ts +0 -18
- package/dist/esm/redirects.js +0 -16
- package/dist/esm/redirects.js.map +0 -1
- package/dist/esm/routeInfo.d.ts +0 -33
- package/dist/esm/searchParams.d.ts +0 -7
- package/dist/esm/searchParams.js +0 -63
- package/dist/esm/searchParams.js.map +0 -1
- package/src/createServerFn.ts +0 -107
- package/src/defer.ts +0 -70
- package/src/location.ts +0 -13
- package/src/path.ts +0 -280
- package/src/qss.ts +0 -53
- package/src/redirects.ts +0 -56
- package/src/route.ts +0 -1356
- package/src/routeInfo.ts +0 -62
- package/src/searchParams.ts +0 -79
|
@@ -1,139 +1,33 @@
|
|
|
1
|
-
import { jsx
|
|
2
|
-
import * as React from "react";
|
|
1
|
+
import { jsx } from "react/jsx-runtime";
|
|
3
2
|
import { Matches } from "./Matches.js";
|
|
4
|
-
import { pick, useLayoutEffect } from "./utils.js";
|
|
5
|
-
import { useRouter } from "./useRouter.js";
|
|
6
|
-
import { useRouterState } from "./useRouterState.js";
|
|
7
3
|
import { getRouterContext } from "./routerContext.js";
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
4
|
+
function RouterContextProvider({
|
|
5
|
+
router,
|
|
6
|
+
children,
|
|
7
|
+
...rest
|
|
8
|
+
}) {
|
|
9
|
+
if (Object.keys(rest).length > 0) {
|
|
10
|
+
router.update({
|
|
11
|
+
...router.options,
|
|
12
|
+
...rest,
|
|
13
|
+
context: {
|
|
14
|
+
...router.options.context,
|
|
15
|
+
...rest.context
|
|
16
|
+
}
|
|
17
|
+
});
|
|
12
18
|
}
|
|
13
|
-
]);
|
|
14
|
-
function RouterProvider({ router, ...rest }) {
|
|
15
|
-
router.update({
|
|
16
|
-
...router.options,
|
|
17
|
-
...rest,
|
|
18
|
-
context: {
|
|
19
|
-
...router.options.context,
|
|
20
|
-
...rest == null ? void 0 : rest.context
|
|
21
|
-
}
|
|
22
|
-
});
|
|
23
|
-
const matches = router.options.InnerWrap ? /* @__PURE__ */ jsx(router.options.InnerWrap, { children: /* @__PURE__ */ jsx(Matches, {}) }) : /* @__PURE__ */ jsx(Matches, {});
|
|
24
19
|
const routerContext = getRouterContext();
|
|
25
|
-
const provider = /* @__PURE__ */
|
|
26
|
-
matches,
|
|
27
|
-
/* @__PURE__ */ jsx(Transitioner, {})
|
|
28
|
-
] });
|
|
20
|
+
const provider = /* @__PURE__ */ jsx(routerContext.Provider, { value: router, children });
|
|
29
21
|
if (router.options.Wrap) {
|
|
30
22
|
return /* @__PURE__ */ jsx(router.options.Wrap, { children: provider });
|
|
31
23
|
}
|
|
32
24
|
return provider;
|
|
33
25
|
}
|
|
34
|
-
function
|
|
35
|
-
|
|
36
|
-
const mountLoadForRouter = React.useRef({ router, mounted: false });
|
|
37
|
-
const routerState = useRouterState({
|
|
38
|
-
select: (s) => pick(s, ["isLoading", "location", "resolvedLocation", "isTransitioning"])
|
|
39
|
-
});
|
|
40
|
-
const [isTransitioning, startReactTransition] = useTransition();
|
|
41
|
-
router.startReactTransition = startReactTransition;
|
|
42
|
-
React.useEffect(() => {
|
|
43
|
-
if (isTransitioning) {
|
|
44
|
-
router.__store.setState((s) => ({
|
|
45
|
-
...s,
|
|
46
|
-
isTransitioning
|
|
47
|
-
}));
|
|
48
|
-
}
|
|
49
|
-
}, [isTransitioning]);
|
|
50
|
-
const tryLoad = () => {
|
|
51
|
-
const apply = (cb) => {
|
|
52
|
-
if (!routerState.isTransitioning) {
|
|
53
|
-
startReactTransition(() => cb());
|
|
54
|
-
} else {
|
|
55
|
-
cb();
|
|
56
|
-
}
|
|
57
|
-
};
|
|
58
|
-
apply(() => {
|
|
59
|
-
try {
|
|
60
|
-
router.load();
|
|
61
|
-
} catch (err) {
|
|
62
|
-
console.error(err);
|
|
63
|
-
}
|
|
64
|
-
});
|
|
65
|
-
};
|
|
66
|
-
useLayoutEffect(() => {
|
|
67
|
-
const unsub = router.history.subscribe(() => {
|
|
68
|
-
router.latestLocation = router.parseLocation(router.latestLocation);
|
|
69
|
-
if (router.state.location !== router.latestLocation) {
|
|
70
|
-
tryLoad();
|
|
71
|
-
}
|
|
72
|
-
});
|
|
73
|
-
const nextLocation = router.buildLocation({
|
|
74
|
-
to: router.latestLocation.pathname,
|
|
75
|
-
search: true,
|
|
76
|
-
params: true,
|
|
77
|
-
hash: true,
|
|
78
|
-
state: true
|
|
79
|
-
});
|
|
80
|
-
if (routerState.location.href !== nextLocation.href) {
|
|
81
|
-
router.commitLocation({ ...nextLocation, replace: true });
|
|
82
|
-
}
|
|
83
|
-
return () => {
|
|
84
|
-
unsub();
|
|
85
|
-
};
|
|
86
|
-
}, [router.history]);
|
|
87
|
-
useLayoutEffect(() => {
|
|
88
|
-
var _a;
|
|
89
|
-
if (React.useTransition ? routerState.isTransitioning && !isTransitioning : !routerState.isLoading && routerState.resolvedLocation !== routerState.location) {
|
|
90
|
-
router.emit({
|
|
91
|
-
type: "onResolved",
|
|
92
|
-
fromLocation: routerState.resolvedLocation,
|
|
93
|
-
toLocation: routerState.location,
|
|
94
|
-
pathChanged: routerState.location.href !== ((_a = routerState.resolvedLocation) == null ? void 0 : _a.href)
|
|
95
|
-
});
|
|
96
|
-
if (document.querySelector) {
|
|
97
|
-
if (routerState.location.hash !== "") {
|
|
98
|
-
const el = document.getElementById(
|
|
99
|
-
routerState.location.hash
|
|
100
|
-
);
|
|
101
|
-
if (el) {
|
|
102
|
-
el.scrollIntoView();
|
|
103
|
-
}
|
|
104
|
-
}
|
|
105
|
-
}
|
|
106
|
-
router.__store.setState((s) => ({
|
|
107
|
-
...s,
|
|
108
|
-
isTransitioning: false,
|
|
109
|
-
resolvedLocation: s.location
|
|
110
|
-
}));
|
|
111
|
-
}
|
|
112
|
-
}, [
|
|
113
|
-
routerState.isTransitioning,
|
|
114
|
-
isTransitioning,
|
|
115
|
-
routerState.isLoading,
|
|
116
|
-
routerState.resolvedLocation,
|
|
117
|
-
routerState.location
|
|
118
|
-
]);
|
|
119
|
-
useLayoutEffect(() => {
|
|
120
|
-
if (window.__TSR_DEHYDRATED__ || mountLoadForRouter.current.router === router && mountLoadForRouter.current.mounted) {
|
|
121
|
-
return;
|
|
122
|
-
}
|
|
123
|
-
mountLoadForRouter.current = { router, mounted: true };
|
|
124
|
-
tryLoad();
|
|
125
|
-
}, [router]);
|
|
126
|
-
return null;
|
|
127
|
-
}
|
|
128
|
-
function getRouteMatch(state, id) {
|
|
129
|
-
return [
|
|
130
|
-
...state.cachedMatches,
|
|
131
|
-
...state.pendingMatches ?? [],
|
|
132
|
-
...state.matches
|
|
133
|
-
].find((d) => d.id === id);
|
|
26
|
+
function RouterProvider({ router, ...rest }) {
|
|
27
|
+
return /* @__PURE__ */ jsx(RouterContextProvider, { router, ...rest, children: /* @__PURE__ */ jsx(Matches, {}) });
|
|
134
28
|
}
|
|
135
29
|
export {
|
|
136
|
-
|
|
137
|
-
|
|
30
|
+
RouterContextProvider,
|
|
31
|
+
RouterProvider
|
|
138
32
|
};
|
|
139
33
|
//# sourceMappingURL=RouterProvider.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RouterProvider.js","sources":["../../src/RouterProvider.tsx"],"sourcesContent":["import * as React from 'react'\nimport { Matches } from './Matches'\nimport {
|
|
1
|
+
{"version":3,"file":"RouterProvider.js","sources":["../../src/RouterProvider.tsx"],"sourcesContent":["import * as React from 'react'\nimport { Matches } from './Matches'\nimport { getRouterContext } from './routerContext'\nimport type {\n AnyRouter,\n RegisteredRouter,\n RouterOptions,\n} from '@tanstack/router-core'\n\nexport function RouterContextProvider<\n TRouter extends AnyRouter = RegisteredRouter,\n TDehydrated extends Record<string, any> = Record<string, any>,\n>({\n router,\n children,\n ...rest\n}: RouterProps<TRouter, TDehydrated> & {\n children: React.ReactNode\n}) {\n if (Object.keys(rest).length > 0) {\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\n const routerContext = getRouterContext()\n\n const provider = (\n <routerContext.Provider value={router as AnyRouter}>\n {children}\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\nexport function RouterProvider<\n TRouter extends AnyRouter = RegisteredRouter,\n TDehydrated extends Record<string, any> = Record<string, any>,\n>({ router, ...rest }: RouterProps<TRouter, TDehydrated>) {\n return (\n <RouterContextProvider router={router} {...rest}>\n <Matches />\n </RouterContextProvider>\n )\n}\n\nexport type RouterProps<\n TRouter extends AnyRouter = RegisteredRouter,\n TDehydrated extends Record<string, any> = Record<string, any>,\n> = Omit<\n RouterOptions<\n TRouter['routeTree'],\n NonNullable<TRouter['options']['trailingSlash']>,\n NonNullable<TRouter['options']['defaultStructuralSharing']>,\n TRouter['history'],\n TDehydrated\n >,\n 'context'\n> & {\n router: TRouter\n context?: Partial<\n RouterOptions<\n TRouter['routeTree'],\n NonNullable<TRouter['options']['trailingSlash']>,\n NonNullable<TRouter['options']['defaultStructuralSharing']>,\n TRouter['history'],\n TDehydrated\n >['context']\n >\n}\n"],"names":[],"mappings":";;;AASO,SAAS,sBAGd;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACL,GAEG;AACD,MAAI,OAAO,KAAK,IAAI,EAAE,SAAS,GAAG;AAEhC,WAAO,OAAO;AAAA,MACZ,GAAG,OAAO;AAAA,MACV,GAAG;AAAA,MACH,SAAS;AAAA,QACP,GAAG,OAAO,QAAQ;AAAA,QAClB,GAAG,KAAK;AAAA,MAAA;AAAA,IACV,CACM;AAAA,EAAA;AAGV,QAAM,gBAAgB,iBAAiB;AAEvC,QAAM,WACH,oBAAA,cAAc,UAAd,EAAuB,OAAO,QAC5B,UACH;AAGE,MAAA,OAAO,QAAQ,MAAM;AACvB,WAAQ,oBAAA,OAAO,QAAQ,MAAf,EAAqB,UAAS,UAAA;AAAA,EAAA;AAGjC,SAAA;AACT;AAEO,SAAS,eAGd,EAAE,QAAQ,GAAG,QAA2C;AACxD,6BACG,uBAAsB,EAAA,QAAiB,GAAG,MACzC,UAAA,oBAAC,UAAQ,CAAA,GACX;AAEJ;"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function SafeFragment(props: any): import("react/jsx-runtime").JSX.Element;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SafeFragment.js","sources":["../../src/SafeFragment.tsx"],"sourcesContent":["import * as React from 'react'\n\nexport function SafeFragment(props: any) {\n return <>{props.children}</>\n}\n"],"names":[],"mappings":";AAEO,SAAS,aAAa,OAAY;AAChC,SAAA,oBAAA,UAAA,EAAG,gBAAM,SAAS,CAAA;AAC3B;"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { jsx } from "react/jsx-runtime";
|
|
2
|
+
import jsesc from "jsesc";
|
|
3
|
+
function ScriptOnce({
|
|
4
|
+
children,
|
|
5
|
+
log
|
|
6
|
+
}) {
|
|
7
|
+
if (typeof document !== "undefined") {
|
|
8
|
+
return null;
|
|
9
|
+
}
|
|
10
|
+
return /* @__PURE__ */ jsx(
|
|
11
|
+
"script",
|
|
12
|
+
{
|
|
13
|
+
className: "tsr-once",
|
|
14
|
+
dangerouslySetInnerHTML: {
|
|
15
|
+
__html: [
|
|
16
|
+
children,
|
|
17
|
+
(log ?? true) && process.env.NODE_ENV === "development" ? `console.info(\`Injected From Server:
|
|
18
|
+
${jsesc(children.toString(), { quotes: "backtick" })}\`)` : "",
|
|
19
|
+
'if (typeof __TSR_SSR__ !== "undefined") __TSR_SSR__.cleanScripts()'
|
|
20
|
+
].filter(Boolean).join("\n")
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
);
|
|
24
|
+
}
|
|
25
|
+
export {
|
|
26
|
+
ScriptOnce
|
|
27
|
+
};
|
|
28
|
+
//# sourceMappingURL=ScriptOnce.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ScriptOnce.js","sources":["../../src/ScriptOnce.tsx"],"sourcesContent":["import jsesc from 'jsesc'\n\nexport function ScriptOnce({\n children,\n log,\n}: {\n children: string\n log?: boolean\n sync?: boolean\n}) {\n if (typeof document !== 'undefined') {\n return null\n }\n\n return (\n <script\n className=\"tsr-once\"\n dangerouslySetInnerHTML={{\n __html: [\n children,\n (log ?? true) && process.env.NODE_ENV === 'development'\n ? `console.info(\\`Injected From Server:\n${jsesc(children.toString(), { quotes: 'backtick' })}\\`)`\n : '',\n 'if (typeof __TSR_SSR__ !== \"undefined\") __TSR_SSR__.cleanScripts()',\n ]\n .filter(Boolean)\n .join('\\n'),\n }}\n />\n )\n}\n"],"names":[],"mappings":";;AAEO,SAAS,WAAW;AAAA,EACzB;AAAA,EACA;AACF,GAIG;AACG,MAAA,OAAO,aAAa,aAAa;AAC5B,WAAA;AAAA,EAAA;AAIP,SAAA;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,WAAU;AAAA,MACV,yBAAyB;AAAA,QACvB,QAAQ;AAAA,UACN;AAAA,WACC,OAAO,SAAS,QAAQ,IAAI,aAAa,gBACtC;AAAA,EACZ,MAAM,SAAS,YAAY,EAAE,QAAQ,WAAY,CAAA,CAAC,QACtC;AAAA,UACJ;AAAA,QAEC,EAAA,OAAO,OAAO,EACd,KAAK,IAAI;AAAA,MAAA;AAAA,IACd;AAAA,EACF;AAEJ;"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const Scripts: () => import("react/jsx-runtime").JSX.Element;
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { jsx, Fragment } from "react/jsx-runtime";
|
|
2
|
+
import { createElement } from "react";
|
|
3
|
+
import { Asset } from "./Asset.js";
|
|
4
|
+
import { useRouterState } from "./useRouterState.js";
|
|
5
|
+
import { useRouter } from "./useRouter.js";
|
|
6
|
+
const Scripts = () => {
|
|
7
|
+
const router = useRouter();
|
|
8
|
+
const assetScripts = useRouterState({
|
|
9
|
+
select: (state) => {
|
|
10
|
+
var _a;
|
|
11
|
+
const assetScripts2 = [];
|
|
12
|
+
const manifest = (_a = router.ssr) == null ? void 0 : _a.manifest;
|
|
13
|
+
if (!manifest) {
|
|
14
|
+
return [];
|
|
15
|
+
}
|
|
16
|
+
state.matches.map((match) => router.looseRoutesById[match.routeId]).forEach(
|
|
17
|
+
(route) => {
|
|
18
|
+
var _a2, _b;
|
|
19
|
+
return (_b = (_a2 = manifest.routes[route.id]) == null ? void 0 : _a2.assets) == null ? void 0 : _b.filter((d) => d.tag === "script").forEach((asset) => {
|
|
20
|
+
assetScripts2.push({
|
|
21
|
+
tag: "script",
|
|
22
|
+
attrs: asset.attrs,
|
|
23
|
+
children: asset.children
|
|
24
|
+
});
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
);
|
|
28
|
+
return assetScripts2;
|
|
29
|
+
},
|
|
30
|
+
structuralSharing: true
|
|
31
|
+
});
|
|
32
|
+
const { scripts } = useRouterState({
|
|
33
|
+
select: (state) => ({
|
|
34
|
+
scripts: state.matches.map((match) => match.scripts).flat(1).filter(Boolean).map(({ children, ...script }) => ({
|
|
35
|
+
tag: "script",
|
|
36
|
+
attrs: {
|
|
37
|
+
...script,
|
|
38
|
+
suppressHydrationWarning: true
|
|
39
|
+
},
|
|
40
|
+
children
|
|
41
|
+
}))
|
|
42
|
+
}),
|
|
43
|
+
structuralSharing: true
|
|
44
|
+
});
|
|
45
|
+
const allScripts = [...scripts, ...assetScripts];
|
|
46
|
+
return /* @__PURE__ */ jsx(Fragment, { children: allScripts.map((asset, i) => /* @__PURE__ */ createElement(Asset, { ...asset, key: `tsr-scripts-${asset.tag}-${i}` })) });
|
|
47
|
+
};
|
|
48
|
+
export {
|
|
49
|
+
Scripts
|
|
50
|
+
};
|
|
51
|
+
//# sourceMappingURL=Scripts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Scripts.js","sources":["../../src/Scripts.tsx"],"sourcesContent":["import { Asset } from './Asset'\nimport { useRouterState } from './useRouterState'\nimport { useRouter } from './useRouter'\nimport type { RouterManagedTag } from '@tanstack/router-core'\n\nexport const Scripts = () => {\n const router = useRouter()\n\n const assetScripts = useRouterState({\n select: (state) => {\n const assetScripts: Array<RouterManagedTag> = []\n const manifest = router.ssr?.manifest\n\n if (!manifest) {\n return []\n }\n\n state.matches\n .map((match) => router.looseRoutesById[match.routeId]!)\n .forEach((route) =>\n manifest.routes[route.id]?.assets\n ?.filter((d) => d.tag === 'script')\n .forEach((asset) => {\n assetScripts.push({\n tag: 'script',\n attrs: asset.attrs,\n children: asset.children,\n } as any)\n }),\n )\n\n return assetScripts\n },\n structuralSharing: true as any,\n })\n\n const { scripts } = useRouterState({\n select: (state) => ({\n scripts: (\n state.matches\n .map((match) => match.scripts!)\n .flat(1)\n .filter(Boolean) as Array<RouterManagedTag>\n ).map(({ children, ...script }) => ({\n tag: 'script',\n attrs: {\n ...script,\n suppressHydrationWarning: true,\n },\n children,\n })),\n }),\n structuralSharing: true as any,\n })\n\n const allScripts = [...scripts, ...assetScripts] as Array<RouterManagedTag>\n\n return (\n <>\n {allScripts.map((asset, i) => (\n <Asset {...asset} key={`tsr-scripts-${asset.tag}-${i}`} />\n ))}\n </>\n )\n}\n"],"names":["assetScripts","_a"],"mappings":";;;;;AAKO,MAAM,UAAU,MAAM;AAC3B,QAAM,SAAS,UAAU;AAEzB,QAAM,eAAe,eAAe;AAAA,IAClC,QAAQ,CAAC,UAAU;;AACjB,YAAMA,gBAAwC,CAAC;AACzC,YAAA,YAAW,YAAO,QAAP,mBAAY;AAE7B,UAAI,CAAC,UAAU;AACb,eAAO,CAAC;AAAA,MAAA;AAGJ,YAAA,QACH,IAAI,CAAC,UAAU,OAAO,gBAAgB,MAAM,OAAO,CAAE,EACrD;AAAA,QAAQ,CAAC,UACR;;AAAA,wBAAAC,MAAA,SAAS,OAAO,MAAM,EAAE,MAAxB,gBAAAA,IAA2B,WAA3B,mBACI,OAAO,CAAC,MAAM,EAAE,QAAQ,UACzB,QAAQ,CAAC,UAAU;AAClBD,0BAAa,KAAK;AAAA,cAChB,KAAK;AAAA,cACL,OAAO,MAAM;AAAA,cACb,UAAU,MAAM;AAAA,YAAA,CACV;AAAA,UACT;AAAA;AAAA,MACL;AAEKA,aAAAA;AAAAA,IACT;AAAA,IACA,mBAAmB;AAAA,EAAA,CACpB;AAEK,QAAA,EAAE,QAAQ,IAAI,eAAe;AAAA,IACjC,QAAQ,CAAC,WAAW;AAAA,MAClB,SACE,MAAM,QACH,IAAI,CAAC,UAAU,MAAM,OAAQ,EAC7B,KAAK,CAAC,EACN,OAAO,OAAO,EACjB,IAAI,CAAC,EAAE,UAAU,GAAG,cAAc;AAAA,QAClC,KAAK;AAAA,QACL,OAAO;AAAA,UACL,GAAG;AAAA,UACH,0BAA0B;AAAA,QAC5B;AAAA,QACA;AAAA,MAAA,EACA;AAAA,IAAA;AAAA,IAEJ,mBAAmB;AAAA,EAAA,CACpB;AAED,QAAM,aAAa,CAAC,GAAG,SAAS,GAAG,YAAY;AAE/C,yCAEK,UAAW,WAAA,IAAI,CAAC,OAAO,oCACrB,OAAO,EAAA,GAAG,OAAO,KAAK,eAAe,MAAM,GAAG,IAAI,CAAC,IAAI,CACzD,GACH;AAEJ;"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { ParsedLocation, ScrollRestorationEntry, ScrollRestorationOptions } from '@tanstack/router-core';
|
|
2
|
+
/**
|
|
3
|
+
* @deprecated use createRouter's `scrollRestoration` option instead
|
|
4
|
+
*/
|
|
5
|
+
export declare function ScrollRestoration(_props: ScrollRestorationOptions): null;
|
|
6
|
+
export declare function useElementScrollRestoration(options: ({
|
|
7
|
+
id: string;
|
|
8
|
+
getElement?: () => Window | Element | undefined | null;
|
|
9
|
+
} | {
|
|
10
|
+
id?: string;
|
|
11
|
+
getElement: () => Window | Element | undefined | null;
|
|
12
|
+
}) & {
|
|
13
|
+
getKey?: (location: ParsedLocation) => string;
|
|
14
|
+
}): ScrollRestorationEntry | undefined;
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { defaultGetScrollRestorationKey, getCssSelector, scrollRestorationCache, setupScrollRestoration } from "@tanstack/router-core";
|
|
2
|
+
import { useRouter } from "./useRouter.js";
|
|
3
|
+
function useScrollRestoration() {
|
|
4
|
+
const router = useRouter();
|
|
5
|
+
setupScrollRestoration(router, true);
|
|
6
|
+
}
|
|
7
|
+
function ScrollRestoration(_props) {
|
|
8
|
+
useScrollRestoration();
|
|
9
|
+
if (process.env.NODE_ENV === "development") {
|
|
10
|
+
console.warn(
|
|
11
|
+
"The ScrollRestoration component is deprecated. Use createRouter's `scrollRestoration` option instead."
|
|
12
|
+
);
|
|
13
|
+
}
|
|
14
|
+
return null;
|
|
15
|
+
}
|
|
16
|
+
function useElementScrollRestoration(options) {
|
|
17
|
+
var _a;
|
|
18
|
+
useScrollRestoration();
|
|
19
|
+
const router = useRouter();
|
|
20
|
+
const getKey = options.getKey || defaultGetScrollRestorationKey;
|
|
21
|
+
let elementSelector = "";
|
|
22
|
+
if (options.id) {
|
|
23
|
+
elementSelector = `[data-scroll-restoration-id="${options.id}"]`;
|
|
24
|
+
} else {
|
|
25
|
+
const element = (_a = options.getElement) == null ? void 0 : _a.call(options);
|
|
26
|
+
if (!element) {
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
elementSelector = element instanceof Window ? "window" : getCssSelector(element);
|
|
30
|
+
}
|
|
31
|
+
const restoreKey = getKey(router.latestLocation);
|
|
32
|
+
const byKey = scrollRestorationCache.state[restoreKey];
|
|
33
|
+
return byKey == null ? void 0 : byKey[elementSelector];
|
|
34
|
+
}
|
|
35
|
+
export {
|
|
36
|
+
ScrollRestoration,
|
|
37
|
+
useElementScrollRestoration
|
|
38
|
+
};
|
|
39
|
+
//# sourceMappingURL=ScrollRestoration.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ScrollRestoration.js","sources":["../../src/ScrollRestoration.tsx"],"sourcesContent":["import {\n defaultGetScrollRestorationKey,\n getCssSelector,\n scrollRestorationCache,\n setupScrollRestoration,\n} from '@tanstack/router-core'\nimport { useRouter } from './useRouter'\nimport type {\n ParsedLocation,\n ScrollRestorationEntry,\n ScrollRestorationOptions,\n} from '@tanstack/router-core'\n\nfunction useScrollRestoration() {\n const router = useRouter()\n setupScrollRestoration(router, true)\n}\n\n/**\n * @deprecated use createRouter's `scrollRestoration` option instead\n */\nexport function ScrollRestoration(_props: ScrollRestorationOptions) {\n useScrollRestoration()\n\n if (process.env.NODE_ENV === 'development') {\n console.warn(\n \"The ScrollRestoration component is deprecated. Use createRouter's `scrollRestoration` option instead.\",\n )\n }\n\n return null\n}\n\nexport function useElementScrollRestoration(\n options: (\n | {\n id: string\n getElement?: () => Window | Element | undefined | null\n }\n | {\n id?: string\n getElement: () => Window | Element | undefined | null\n }\n ) & {\n getKey?: (location: ParsedLocation) => string\n },\n): ScrollRestorationEntry | undefined {\n useScrollRestoration()\n\n const router = useRouter()\n const getKey = options.getKey || defaultGetScrollRestorationKey\n\n let elementSelector = ''\n\n if (options.id) {\n elementSelector = `[data-scroll-restoration-id=\"${options.id}\"]`\n } else {\n const element = options.getElement?.()\n if (!element) {\n return\n }\n elementSelector =\n element instanceof Window ? 'window' : getCssSelector(element)\n }\n\n const restoreKey = getKey(router.latestLocation)\n const byKey = scrollRestorationCache.state[restoreKey]\n return byKey?.[elementSelector]\n}\n"],"names":[],"mappings":";;AAaA,SAAS,uBAAuB;AAC9B,QAAM,SAAS,UAAU;AACzB,yBAAuB,QAAQ,IAAI;AACrC;AAKO,SAAS,kBAAkB,QAAkC;AAC7C,uBAAA;AAEjB,MAAA,QAAQ,IAAI,aAAa,eAAe;AAClC,YAAA;AAAA,MACN;AAAA,IACF;AAAA,EAAA;AAGK,SAAA;AACT;AAEO,SAAS,4BACd,SAYoC;;AACf,uBAAA;AAErB,QAAM,SAAS,UAAU;AACnB,QAAA,SAAS,QAAQ,UAAU;AAEjC,MAAI,kBAAkB;AAEtB,MAAI,QAAQ,IAAI;AACI,sBAAA,gCAAgC,QAAQ,EAAE;AAAA,EAAA,OACvD;AACC,UAAA,WAAU,aAAQ,eAAR;AAChB,QAAI,CAAC,SAAS;AACZ;AAAA,IAAA;AAEF,sBACE,mBAAmB,SAAS,WAAW,eAAe,OAAO;AAAA,EAAA;AAG3D,QAAA,aAAa,OAAO,OAAO,cAAc;AACzC,QAAA,QAAQ,uBAAuB,MAAM,UAAU;AACrD,SAAO,+BAAQ;AACjB;"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function Transitioner(): null;
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
import * as React from "react";
|
|
2
|
+
import { trimPathRight, getLocationChangeInfo, handleHashScroll } from "@tanstack/router-core";
|
|
3
|
+
import { usePrevious, useLayoutEffect } from "./utils.js";
|
|
4
|
+
import { useRouter } from "./useRouter.js";
|
|
5
|
+
import { useRouterState } from "./useRouterState.js";
|
|
6
|
+
function Transitioner() {
|
|
7
|
+
const router = useRouter();
|
|
8
|
+
const mountLoadForRouter = React.useRef({ router, mounted: false });
|
|
9
|
+
const isLoading = useRouterState({
|
|
10
|
+
select: ({ isLoading: isLoading2 }) => isLoading2
|
|
11
|
+
});
|
|
12
|
+
const [isTransitioning, setIsTransitioning] = React.useState(false);
|
|
13
|
+
const hasPendingMatches = useRouterState({
|
|
14
|
+
select: (s) => s.matches.some((d) => d.status === "pending"),
|
|
15
|
+
structuralSharing: true
|
|
16
|
+
});
|
|
17
|
+
const previousIsLoading = usePrevious(isLoading);
|
|
18
|
+
const isAnyPending = isLoading || isTransitioning || hasPendingMatches;
|
|
19
|
+
const previousIsAnyPending = usePrevious(isAnyPending);
|
|
20
|
+
const isPagePending = isLoading || hasPendingMatches;
|
|
21
|
+
const previousIsPagePending = usePrevious(isPagePending);
|
|
22
|
+
if (!router.isServer) {
|
|
23
|
+
router.startTransition = (fn) => {
|
|
24
|
+
setIsTransitioning(true);
|
|
25
|
+
React.startTransition(() => {
|
|
26
|
+
fn();
|
|
27
|
+
setIsTransitioning(false);
|
|
28
|
+
});
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
React.useEffect(() => {
|
|
32
|
+
const unsub = router.history.subscribe(router.load);
|
|
33
|
+
const nextLocation = router.buildLocation({
|
|
34
|
+
to: router.latestLocation.pathname,
|
|
35
|
+
search: true,
|
|
36
|
+
params: true,
|
|
37
|
+
hash: true,
|
|
38
|
+
state: true,
|
|
39
|
+
_includeValidateSearch: true
|
|
40
|
+
});
|
|
41
|
+
if (trimPathRight(router.latestLocation.href) !== trimPathRight(nextLocation.href)) {
|
|
42
|
+
router.commitLocation({ ...nextLocation, replace: true });
|
|
43
|
+
}
|
|
44
|
+
return () => {
|
|
45
|
+
unsub();
|
|
46
|
+
};
|
|
47
|
+
}, [router, router.history]);
|
|
48
|
+
useLayoutEffect(() => {
|
|
49
|
+
if (typeof window !== "undefined" && router.clientSsr || mountLoadForRouter.current.router === router && mountLoadForRouter.current.mounted) {
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
mountLoadForRouter.current = { router, mounted: true };
|
|
53
|
+
const tryLoad = async () => {
|
|
54
|
+
try {
|
|
55
|
+
await router.load();
|
|
56
|
+
} catch (err) {
|
|
57
|
+
console.error(err);
|
|
58
|
+
}
|
|
59
|
+
};
|
|
60
|
+
tryLoad();
|
|
61
|
+
}, [router]);
|
|
62
|
+
useLayoutEffect(() => {
|
|
63
|
+
if (previousIsLoading && !isLoading) {
|
|
64
|
+
router.emit({
|
|
65
|
+
type: "onLoad",
|
|
66
|
+
// When the new URL has committed, when the new matches have been loaded into state.matches
|
|
67
|
+
...getLocationChangeInfo(router.state)
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
}, [previousIsLoading, router, isLoading]);
|
|
71
|
+
useLayoutEffect(() => {
|
|
72
|
+
if (previousIsPagePending && !isPagePending) {
|
|
73
|
+
router.emit({
|
|
74
|
+
type: "onBeforeRouteMount",
|
|
75
|
+
...getLocationChangeInfo(router.state)
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
}, [isPagePending, previousIsPagePending, router]);
|
|
79
|
+
useLayoutEffect(() => {
|
|
80
|
+
if (previousIsAnyPending && !isAnyPending) {
|
|
81
|
+
router.emit({
|
|
82
|
+
type: "onResolved",
|
|
83
|
+
...getLocationChangeInfo(router.state)
|
|
84
|
+
});
|
|
85
|
+
router.__store.setState((s) => ({
|
|
86
|
+
...s,
|
|
87
|
+
status: "idle",
|
|
88
|
+
resolvedLocation: s.location
|
|
89
|
+
}));
|
|
90
|
+
handleHashScroll(router);
|
|
91
|
+
}
|
|
92
|
+
}, [isAnyPending, previousIsAnyPending, router]);
|
|
93
|
+
return null;
|
|
94
|
+
}
|
|
95
|
+
export {
|
|
96
|
+
Transitioner
|
|
97
|
+
};
|
|
98
|
+
//# sourceMappingURL=Transitioner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Transitioner.js","sources":["../../src/Transitioner.tsx"],"sourcesContent":["import * as React from 'react'\nimport {\n getLocationChangeInfo,\n handleHashScroll,\n trimPathRight,\n} from '@tanstack/router-core'\nimport { useLayoutEffect, usePrevious } from './utils'\nimport { useRouter } from './useRouter'\nimport { useRouterState } from './useRouterState'\n\nexport function Transitioner() {\n const router = useRouter()\n const mountLoadForRouter = React.useRef({ router, mounted: false })\n const isLoading = useRouterState({\n select: ({ isLoading }) => isLoading,\n })\n\n const [isTransitioning, setIsTransitioning] = React.useState(false)\n // Track pending state changes\n const hasPendingMatches = useRouterState({\n select: (s) => s.matches.some((d) => d.status === 'pending'),\n structuralSharing: true,\n })\n\n const previousIsLoading = usePrevious(isLoading)\n\n const isAnyPending = isLoading || isTransitioning || hasPendingMatches\n const previousIsAnyPending = usePrevious(isAnyPending)\n\n const isPagePending = isLoading || hasPendingMatches\n const previousIsPagePending = usePrevious(isPagePending)\n\n if (!router.isServer) {\n router.startTransition = (fn: () => void) => {\n setIsTransitioning(true)\n React.startTransition(() => {\n fn()\n setIsTransitioning(false)\n })\n }\n }\n\n // Subscribe to location changes\n // and try to load the new location\n React.useEffect(() => {\n const unsub = router.history.subscribe(router.load)\n\n const nextLocation = router.buildLocation({\n to: router.latestLocation.pathname,\n search: true,\n params: true,\n hash: true,\n state: true,\n _includeValidateSearch: true,\n })\n\n if (\n trimPathRight(router.latestLocation.href) !==\n trimPathRight(nextLocation.href)\n ) {\n router.commitLocation({ ...nextLocation, replace: true })\n }\n\n return () => {\n unsub()\n }\n }, [router, router.history])\n\n // Try to load the initial location\n useLayoutEffect(() => {\n if (\n (typeof window !== 'undefined' && router.clientSsr) ||\n (mountLoadForRouter.current.router === router &&\n mountLoadForRouter.current.mounted)\n ) {\n return\n }\n mountLoadForRouter.current = { router, mounted: true }\n\n const tryLoad = async () => {\n try {\n await router.load()\n } catch (err) {\n console.error(err)\n }\n }\n\n tryLoad()\n }, [router])\n\n useLayoutEffect(() => {\n // The router was loading and now it's not\n if (previousIsLoading && !isLoading) {\n router.emit({\n type: 'onLoad', // When the new URL has committed, when the new matches have been loaded into state.matches\n ...getLocationChangeInfo(router.state),\n })\n }\n }, [previousIsLoading, router, isLoading])\n\n useLayoutEffect(() => {\n // emit onBeforeRouteMount\n if (previousIsPagePending && !isPagePending) {\n router.emit({\n type: 'onBeforeRouteMount',\n ...getLocationChangeInfo(router.state),\n })\n }\n }, [isPagePending, previousIsPagePending, router])\n\n useLayoutEffect(() => {\n // The router was pending and now it's not\n if (previousIsAnyPending && !isAnyPending) {\n router.emit({\n type: 'onResolved',\n ...getLocationChangeInfo(router.state),\n })\n\n router.__store.setState((s) => ({\n ...s,\n status: 'idle',\n resolvedLocation: s.location,\n }))\n\n handleHashScroll(router)\n }\n }, [isAnyPending, previousIsAnyPending, router])\n\n return null\n}\n"],"names":["isLoading"],"mappings":";;;;;AAUO,SAAS,eAAe;AAC7B,QAAM,SAAS,UAAU;AACzB,QAAM,qBAAqB,MAAM,OAAO,EAAE,QAAQ,SAAS,OAAO;AAClE,QAAM,YAAY,eAAe;AAAA,IAC/B,QAAQ,CAAC,EAAE,WAAAA,iBAAgBA;AAAAA,EAAA,CAC5B;AAED,QAAM,CAAC,iBAAiB,kBAAkB,IAAI,MAAM,SAAS,KAAK;AAElE,QAAM,oBAAoB,eAAe;AAAA,IACvC,QAAQ,CAAC,MAAM,EAAE,QAAQ,KAAK,CAAC,MAAM,EAAE,WAAW,SAAS;AAAA,IAC3D,mBAAmB;AAAA,EAAA,CACpB;AAEK,QAAA,oBAAoB,YAAY,SAAS;AAEzC,QAAA,eAAe,aAAa,mBAAmB;AAC/C,QAAA,uBAAuB,YAAY,YAAY;AAErD,QAAM,gBAAgB,aAAa;AAC7B,QAAA,wBAAwB,YAAY,aAAa;AAEnD,MAAA,CAAC,OAAO,UAAU;AACb,WAAA,kBAAkB,CAAC,OAAmB;AAC3C,yBAAmB,IAAI;AACvB,YAAM,gBAAgB,MAAM;AACvB,WAAA;AACH,2BAAmB,KAAK;AAAA,MAAA,CACzB;AAAA,IACH;AAAA,EAAA;AAKF,QAAM,UAAU,MAAM;AACpB,UAAM,QAAQ,OAAO,QAAQ,UAAU,OAAO,IAAI;AAE5C,UAAA,eAAe,OAAO,cAAc;AAAA,MACxC,IAAI,OAAO,eAAe;AAAA,MAC1B,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,MAAM;AAAA,MACN,OAAO;AAAA,MACP,wBAAwB;AAAA,IAAA,CACzB;AAGC,QAAA,cAAc,OAAO,eAAe,IAAI,MACxC,cAAc,aAAa,IAAI,GAC/B;AACA,aAAO,eAAe,EAAE,GAAG,cAAc,SAAS,MAAM;AAAA,IAAA;AAG1D,WAAO,MAAM;AACL,YAAA;AAAA,IACR;AAAA,EACC,GAAA,CAAC,QAAQ,OAAO,OAAO,CAAC;AAG3B,kBAAgB,MAAM;AAEjB,QAAA,OAAO,WAAW,eAAe,OAAO,aACxC,mBAAmB,QAAQ,WAAW,UACrC,mBAAmB,QAAQ,SAC7B;AACA;AAAA,IAAA;AAEF,uBAAmB,UAAU,EAAE,QAAQ,SAAS,KAAK;AAErD,UAAM,UAAU,YAAY;AACtB,UAAA;AACF,cAAM,OAAO,KAAK;AAAA,eACX,KAAK;AACZ,gBAAQ,MAAM,GAAG;AAAA,MAAA;AAAA,IAErB;AAEQ,YAAA;AAAA,EAAA,GACP,CAAC,MAAM,CAAC;AAEX,kBAAgB,MAAM;AAEhB,QAAA,qBAAqB,CAAC,WAAW;AACnC,aAAO,KAAK;AAAA,QACV,MAAM;AAAA;AAAA,QACN,GAAG,sBAAsB,OAAO,KAAK;AAAA,MAAA,CACtC;AAAA,IAAA;AAAA,EAEF,GAAA,CAAC,mBAAmB,QAAQ,SAAS,CAAC;AAEzC,kBAAgB,MAAM;AAEhB,QAAA,yBAAyB,CAAC,eAAe;AAC3C,aAAO,KAAK;AAAA,QACV,MAAM;AAAA,QACN,GAAG,sBAAsB,OAAO,KAAK;AAAA,MAAA,CACtC;AAAA,IAAA;AAAA,EAEF,GAAA,CAAC,eAAe,uBAAuB,MAAM,CAAC;AAEjD,kBAAgB,MAAM;AAEhB,QAAA,wBAAwB,CAAC,cAAc;AACzC,aAAO,KAAK;AAAA,QACV,MAAM;AAAA,QACN,GAAG,sBAAsB,OAAO,KAAK;AAAA,MAAA,CACtC;AAEM,aAAA,QAAQ,SAAS,CAAC,OAAO;AAAA,QAC9B,GAAG;AAAA,QACH,QAAQ;AAAA,QACR,kBAAkB,EAAE;AAAA,MAAA,EACpB;AAEF,uBAAiB,MAAM;AAAA,IAAA;AAAA,EAExB,GAAA,CAAC,cAAc,sBAAsB,MAAM,CAAC;AAExC,SAAA;AACT;"}
|
package/dist/esm/awaited.d.ts
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
|
+
import { DeferredPromise } from '@tanstack/router-core';
|
|
1
2
|
import * as React from 'react';
|
|
2
|
-
import { DeferredPromise } from './defer.js';
|
|
3
3
|
export type AwaitOptions<T> = {
|
|
4
|
-
promise:
|
|
4
|
+
promise: Promise<T>;
|
|
5
5
|
};
|
|
6
|
-
export declare function useAwaited<T>({ promise }: AwaitOptions<T>): [T];
|
|
6
|
+
export declare function useAwaited<T>({ promise: _promise, }: AwaitOptions<T>): [T, DeferredPromise<T>];
|
|
7
7
|
export declare function Await<T>(props: AwaitOptions<T> & {
|
|
8
8
|
fallback?: React.ReactNode;
|
|
9
9
|
children: (result: T) => React.ReactNode;
|
|
10
|
-
}):
|
|
10
|
+
}): import("react/jsx-runtime").JSX.Element;
|
package/dist/esm/awaited.js
CHANGED
|
@@ -1,70 +1,17 @@
|
|
|
1
1
|
import { jsx } from "react/jsx-runtime";
|
|
2
2
|
import * as React from "react";
|
|
3
|
-
import {
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
const router = useRouter();
|
|
11
|
-
const state = promise.__deferredState;
|
|
12
|
-
if (isDehydratedDeferred(promise) && state.status === "pending") {
|
|
13
|
-
const streamedData = window[`__TSR__DEFERRED__${state.uid}`];
|
|
14
|
-
if (streamedData) {
|
|
15
|
-
Object.assign(state, router.options.transformer.parse(streamedData));
|
|
16
|
-
} else {
|
|
17
|
-
let token = router.registeredDeferredsIds.get(state.uid);
|
|
18
|
-
if (!token) {
|
|
19
|
-
token = {};
|
|
20
|
-
router.registeredDeferredsIds.set(state.uid, token);
|
|
21
|
-
router.registeredDeferreds.set(token, state);
|
|
22
|
-
Object.assign(state, {
|
|
23
|
-
resolve: () => {
|
|
24
|
-
var _a2;
|
|
25
|
-
(_a2 = state.__resolvePromise) == null ? void 0 : _a2.call(state);
|
|
26
|
-
},
|
|
27
|
-
promise: new Promise((r) => {
|
|
28
|
-
state.__resolvePromise = r;
|
|
29
|
-
}),
|
|
30
|
-
__resolvePromise: () => {
|
|
31
|
-
}
|
|
32
|
-
});
|
|
33
|
-
}
|
|
34
|
-
}
|
|
3
|
+
import { defer, TSR_DEFERRED_PROMISE } from "@tanstack/router-core";
|
|
4
|
+
function useAwaited({
|
|
5
|
+
promise: _promise
|
|
6
|
+
}) {
|
|
7
|
+
const promise = defer(_promise);
|
|
8
|
+
if (promise[TSR_DEFERRED_PROMISE].status === "pending") {
|
|
9
|
+
throw promise;
|
|
35
10
|
}
|
|
36
|
-
if (
|
|
37
|
-
throw
|
|
11
|
+
if (promise[TSR_DEFERRED_PROMISE].status === "error") {
|
|
12
|
+
throw promise[TSR_DEFERRED_PROMISE].error;
|
|
38
13
|
}
|
|
39
|
-
|
|
40
|
-
router.injectHtml(`<script class='tsr_deferred_data'>window.__TSR__DEFERRED__${state.uid} = ${JSON.stringify(router.options.transformer.stringify(state))}<\/script>
|
|
41
|
-
<script class='tsr_deferred_handler'>
|
|
42
|
-
if (window.__TSR__ROUTER__) {
|
|
43
|
-
let deferred = window.__TSR__ROUTER__.getDeferred('${state.uid}')
|
|
44
|
-
if (deferred) deferred.resolve(window.__TSR__DEFERRED__${state.uid})
|
|
45
|
-
}
|
|
46
|
-
document.querySelectorAll('.tsr_deferred_handler').forEach((el) => el.parentElement.removeChild(el))
|
|
47
|
-
<\/script>`);
|
|
48
|
-
}
|
|
49
|
-
if (state.status === "error") {
|
|
50
|
-
if (typeof document !== "undefined") {
|
|
51
|
-
if (isServerSideError(state.error)) {
|
|
52
|
-
throw (((_a = router.options.errorSerializer) == null ? void 0 : _a.deserialize) ?? defaultDeserializeError)(state.error.data);
|
|
53
|
-
} else {
|
|
54
|
-
warning(
|
|
55
|
-
false,
|
|
56
|
-
"Encountered a server-side error that doesn't fit the expected shape"
|
|
57
|
-
);
|
|
58
|
-
throw state.error;
|
|
59
|
-
}
|
|
60
|
-
} else {
|
|
61
|
-
throw {
|
|
62
|
-
data: (((_b = router.options.errorSerializer) == null ? void 0 : _b.serialize) ?? defaultSerializeError)(state.error),
|
|
63
|
-
__isServerError: true
|
|
64
|
-
};
|
|
65
|
-
}
|
|
66
|
-
}
|
|
67
|
-
return [promise.__deferredState.data];
|
|
14
|
+
return [promise[TSR_DEFERRED_PROMISE].data, promise];
|
|
68
15
|
}
|
|
69
16
|
function Await(props) {
|
|
70
17
|
const inner = /* @__PURE__ */ jsx(AwaitInner, { ...props });
|
|
@@ -74,8 +21,8 @@ function Await(props) {
|
|
|
74
21
|
return inner;
|
|
75
22
|
}
|
|
76
23
|
function AwaitInner(props) {
|
|
77
|
-
const
|
|
78
|
-
return props.children(
|
|
24
|
+
const [data] = useAwaited(props);
|
|
25
|
+
return props.children(data);
|
|
79
26
|
}
|
|
80
27
|
export {
|
|
81
28
|
Await,
|
package/dist/esm/awaited.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"awaited.js","sources":["../../src/awaited.tsx"],"sourcesContent":["import * as React from 'react'\nimport {
|
|
1
|
+
{"version":3,"file":"awaited.js","sources":["../../src/awaited.tsx"],"sourcesContent":["import * as React from 'react'\n\nimport { TSR_DEFERRED_PROMISE, defer } from '@tanstack/router-core'\nimport type { DeferredPromise } from '@tanstack/router-core'\n\nexport type AwaitOptions<T> = {\n promise: Promise<T>\n}\n\nexport function useAwaited<T>({\n promise: _promise,\n}: AwaitOptions<T>): [T, DeferredPromise<T>] {\n const promise = defer(_promise)\n\n if (promise[TSR_DEFERRED_PROMISE].status === 'pending') {\n throw promise\n }\n\n if (promise[TSR_DEFERRED_PROMISE].status === 'error') {\n throw promise[TSR_DEFERRED_PROMISE].error\n }\n\n return [promise[TSR_DEFERRED_PROMISE].data, promise]\n}\n\nexport function Await<T>(\n props: AwaitOptions<T> & {\n fallback?: React.ReactNode\n children: (result: T) => React.ReactNode\n },\n) {\n const inner = <AwaitInner {...props} />\n if (props.fallback) {\n return <React.Suspense fallback={props.fallback}>{inner}</React.Suspense>\n }\n return inner\n}\n\nfunction AwaitInner<T>(\n props: AwaitOptions<T> & {\n fallback?: React.ReactNode\n children: (result: T) => React.ReactNode\n },\n): React.JSX.Element {\n const [data] = useAwaited(props)\n\n return props.children(data) as React.JSX.Element\n}\n"],"names":[],"mappings":";;;AASO,SAAS,WAAc;AAAA,EAC5B,SAAS;AACX,GAA6C;AACrC,QAAA,UAAU,MAAM,QAAQ;AAE9B,MAAI,QAAQ,oBAAoB,EAAE,WAAW,WAAW;AAChD,UAAA;AAAA,EAAA;AAGR,MAAI,QAAQ,oBAAoB,EAAE,WAAW,SAAS;AAC9C,UAAA,QAAQ,oBAAoB,EAAE;AAAA,EAAA;AAGtC,SAAO,CAAC,QAAQ,oBAAoB,EAAE,MAAM,OAAO;AACrD;AAEO,SAAS,MACd,OAIA;AACA,QAAM,QAAQ,oBAAC,YAAY,EAAA,GAAG,MAAO,CAAA;AACrC,MAAI,MAAM,UAAU;AAClB,+BAAQ,MAAM,UAAN,EAAe,UAAU,MAAM,UAAW,UAAM,OAAA;AAAA,EAAA;AAEnD,SAAA;AACT;AAEA,SAAS,WACP,OAImB;AACnB,QAAM,CAAC,IAAI,IAAI,WAAW,KAAK;AAExB,SAAA,MAAM,SAAS,IAAI;AAC5B;"}
|