@tanstack/react-router 0.0.1-beta.9 → 1.0.0
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/LICENSE +21 -0
- package/build/cjs/CatchBoundary.js +128 -0
- package/build/cjs/CatchBoundary.js.map +1 -0
- package/build/cjs/Matches.js +233 -0
- package/build/cjs/Matches.js.map +1 -0
- package/build/cjs/RouterProvider.js +170 -0
- package/build/cjs/RouterProvider.js.map +1 -0
- package/build/cjs/_virtual/_rollupPluginBabelHelpers.js +2 -22
- package/build/cjs/_virtual/_rollupPluginBabelHelpers.js.map +1 -1
- package/build/cjs/_virtual/with-selector.development.js +16 -0
- package/build/cjs/_virtual/with-selector.development.js.map +1 -0
- package/build/cjs/_virtual/with-selector.js +16 -0
- package/build/cjs/_virtual/with-selector.js.map +1 -0
- package/build/cjs/_virtual/with-selector.production.min.js +16 -0
- package/build/cjs/_virtual/with-selector.production.min.js.map +1 -0
- package/build/cjs/awaited.js +43 -0
- package/build/cjs/awaited.js.map +1 -0
- package/build/cjs/build/esm/index.js +79 -0
- package/build/cjs/build/esm/index.js.map +1 -0
- package/build/cjs/defer.js +37 -0
- package/build/cjs/defer.js.map +1 -0
- package/build/cjs/fileRoute.js +27 -0
- package/build/cjs/fileRoute.js.map +1 -0
- package/build/cjs/index.js +130 -0
- package/build/cjs/index.js.map +1 -0
- package/build/cjs/lazyRouteComponent.js +54 -0
- package/build/cjs/lazyRouteComponent.js.map +1 -0
- package/build/cjs/link.js +223 -0
- package/build/cjs/link.js.map +1 -0
- package/build/cjs/node_modules/.pnpm/@tanstack_react-store@0.2.1_react-dom@18.2.0_react@18.2.0/node_modules/@tanstack/react-store/build/modern/index.js +47 -0
- package/build/cjs/node_modules/.pnpm/@tanstack_react-store@0.2.1_react-dom@18.2.0_react@18.2.0/node_modules/@tanstack/react-store/build/modern/index.js.map +1 -0
- package/build/cjs/node_modules/.pnpm/@tanstack_store@0.1.3/node_modules/@tanstack/store/build/modern/index.js +70 -0
- package/build/cjs/node_modules/.pnpm/@tanstack_store@0.1.3/node_modules/@tanstack/store/build/modern/index.js.map +1 -0
- package/build/cjs/node_modules/.pnpm/use-sync-external-store@1.2.0_react@18.2.0/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim/with-selector.development.js +188 -0
- package/build/cjs/node_modules/.pnpm/use-sync-external-store@1.2.0_react@18.2.0/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim/with-selector.development.js.map +1 -0
- package/build/cjs/node_modules/.pnpm/use-sync-external-store@1.2.0_react@18.2.0/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim/with-selector.production.min.js +39 -0
- package/build/cjs/node_modules/.pnpm/use-sync-external-store@1.2.0_react@18.2.0/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim/with-selector.production.min.js.map +1 -0
- package/build/cjs/node_modules/.pnpm/use-sync-external-store@1.2.0_react@18.2.0/node_modules/use-sync-external-store/shim/with-selector.js +26 -0
- package/build/cjs/node_modules/.pnpm/use-sync-external-store@1.2.0_react@18.2.0/node_modules/use-sync-external-store/shim/with-selector.js.map +1 -0
- package/build/cjs/packages/react-router/src/CatchBoundary.js +123 -0
- package/build/cjs/packages/react-router/src/CatchBoundary.js.map +1 -0
- package/build/cjs/packages/react-router/src/Matches.js +235 -0
- package/build/cjs/packages/react-router/src/Matches.js.map +1 -0
- package/build/cjs/packages/react-router/src/RouterProvider.js +144 -0
- package/build/cjs/packages/react-router/src/RouterProvider.js.map +1 -0
- package/build/cjs/packages/react-router/src/awaited.js +43 -0
- package/build/cjs/packages/react-router/src/awaited.js.map +1 -0
- package/build/cjs/packages/react-router/src/defer.js +37 -0
- package/build/cjs/packages/react-router/src/defer.js.map +1 -0
- package/build/cjs/packages/react-router/src/fileRoute.js +27 -0
- package/build/cjs/packages/react-router/src/fileRoute.js.map +1 -0
- package/build/cjs/packages/react-router/src/index.js +61 -0
- package/build/cjs/packages/react-router/src/index.js.map +1 -0
- package/build/cjs/packages/react-router/src/lazyRouteComponent.js +54 -0
- package/build/cjs/packages/react-router/src/lazyRouteComponent.js.map +1 -0
- package/build/cjs/packages/react-router/src/link.js +148 -0
- package/build/cjs/packages/react-router/src/link.js.map +1 -0
- package/build/cjs/packages/react-router/src/path.js +209 -0
- package/build/cjs/packages/react-router/src/path.js.map +1 -0
- package/build/cjs/packages/react-router/src/qss.js +63 -0
- package/build/cjs/packages/react-router/src/qss.js.map +1 -0
- package/build/cjs/packages/react-router/src/react.js +634 -0
- package/build/cjs/packages/react-router/src/react.js.map +1 -0
- package/build/cjs/packages/react-router/src/redirects.js +25 -0
- package/build/cjs/packages/react-router/src/redirects.js.map +1 -0
- package/build/cjs/packages/react-router/src/route.js +134 -0
- package/build/cjs/packages/react-router/src/route.js.map +1 -0
- package/build/cjs/packages/react-router/src/router.js +1111 -0
- package/build/cjs/packages/react-router/src/router.js.map +1 -0
- package/build/cjs/packages/react-router/src/scroll-restoration.js +53 -0
- package/build/cjs/packages/react-router/src/scroll-restoration.js.map +1 -0
- package/build/cjs/packages/react-router/src/searchParams.js +81 -0
- package/build/cjs/packages/react-router/src/searchParams.js.map +1 -0
- package/build/cjs/packages/react-router/src/useBlocker.js +61 -0
- package/build/cjs/packages/react-router/src/useBlocker.js.map +1 -0
- package/build/cjs/packages/react-router/src/useNavigate.js +75 -0
- package/build/cjs/packages/react-router/src/useNavigate.js.map +1 -0
- package/build/cjs/packages/react-router/src/useParams.js +26 -0
- package/build/cjs/packages/react-router/src/useParams.js.map +1 -0
- package/build/cjs/packages/react-router/src/useSearch.js +25 -0
- package/build/cjs/packages/react-router/src/useSearch.js.map +1 -0
- package/build/cjs/packages/react-router/src/utils.js +239 -0
- package/build/cjs/packages/react-router/src/utils.js.map +1 -0
- package/build/cjs/path.js +214 -0
- package/build/cjs/path.js.map +1 -0
- package/build/cjs/qss.js +63 -0
- package/build/cjs/qss.js.map +1 -0
- package/build/cjs/react/CatchBoundary.js +123 -0
- package/build/cjs/react/CatchBoundary.js.map +1 -0
- package/build/cjs/react/awaited.js +43 -0
- package/build/cjs/react/awaited.js.map +1 -0
- package/build/cjs/react/defer.js +37 -0
- package/build/cjs/react/defer.js.map +1 -0
- package/build/cjs/react.js +650 -0
- package/build/cjs/react.js.map +1 -0
- package/build/cjs/redirects.js +28 -0
- package/build/cjs/redirects.js.map +1 -0
- package/build/cjs/route.js +191 -0
- package/build/cjs/route.js.map +1 -0
- package/build/cjs/router.js +1085 -0
- package/build/cjs/router.js.map +1 -0
- package/build/cjs/routerConfig.js +209 -0
- package/build/cjs/routerConfig.js.map +1 -0
- package/build/cjs/scroll-restoration.js +202 -0
- package/build/cjs/scroll-restoration.js.map +1 -0
- package/build/cjs/searchParams.js +81 -0
- package/build/cjs/searchParams.js.map +1 -0
- package/build/cjs/src/CatchBoundary.js +126 -0
- package/build/cjs/src/CatchBoundary.js.map +1 -0
- package/build/cjs/src/Matches.js +235 -0
- package/build/cjs/src/Matches.js.map +1 -0
- package/build/cjs/src/RouterProvider.js +1051 -0
- package/build/cjs/src/RouterProvider.js.map +1 -0
- package/build/cjs/src/awaited.js +45 -0
- package/build/cjs/src/awaited.js.map +1 -0
- package/build/cjs/src/defer.js +39 -0
- package/build/cjs/src/defer.js.map +1 -0
- package/build/cjs/src/fileRoute.js +29 -0
- package/build/cjs/src/fileRoute.js.map +1 -0
- package/build/cjs/src/index.js +134 -0
- package/build/cjs/src/index.js.map +1 -0
- package/build/cjs/src/lazyRouteComponent.js +57 -0
- package/build/cjs/src/lazyRouteComponent.js.map +1 -0
- package/build/cjs/src/link.js +151 -0
- package/build/cjs/src/link.js.map +1 -0
- package/build/cjs/src/path.js +211 -0
- package/build/cjs/src/path.js.map +1 -0
- package/build/cjs/src/qss.js +65 -0
- package/build/cjs/src/qss.js.map +1 -0
- package/build/cjs/src/redirects.js +27 -0
- package/build/cjs/src/redirects.js.map +1 -0
- package/build/cjs/src/route.js +139 -0
- package/build/cjs/src/route.js.map +1 -0
- package/build/cjs/src/router.js +203 -0
- package/build/cjs/src/router.js.map +1 -0
- package/build/cjs/src/scroll-restoration.js +186 -0
- package/build/cjs/src/scroll-restoration.js.map +1 -0
- package/build/cjs/src/searchParams.js +83 -0
- package/build/cjs/src/searchParams.js.map +1 -0
- package/build/cjs/src/useBlocker.js +64 -0
- package/build/cjs/src/useBlocker.js.map +1 -0
- package/build/cjs/src/useNavigate.js +78 -0
- package/build/cjs/src/useNavigate.js.map +1 -0
- package/build/cjs/src/useParams.js +28 -0
- package/build/cjs/src/useParams.js.map +1 -0
- package/build/cjs/src/useSearch.js +27 -0
- package/build/cjs/src/useSearch.js.map +1 -0
- package/build/cjs/src/utils.js +230 -0
- package/build/cjs/src/utils.js.map +1 -0
- package/build/cjs/useBlocker.js +55 -0
- package/build/cjs/useBlocker.js.map +1 -0
- package/build/cjs/useNavigate.js +86 -0
- package/build/cjs/useNavigate.js.map +1 -0
- package/build/cjs/useParams.js +26 -0
- package/build/cjs/useParams.js.map +1 -0
- package/build/cjs/useSearch.js +25 -0
- package/build/cjs/useSearch.js.map +1 -0
- package/build/cjs/useStore.js +99 -0
- package/build/cjs/useStore.js.map +1 -0
- package/build/cjs/utils.js +241 -0
- package/build/cjs/utils.js.map +1 -0
- package/build/esm/index.js +2300 -2534
- package/build/esm/index.js.map +1 -1
- package/build/stats-html.html +3498 -2694
- package/build/stats-react.json +1204 -44
- package/build/types/CatchBoundary.d.ts +36 -0
- package/build/types/Matches.d.ts +64 -0
- package/build/types/RouteMatch.d.ts +23 -0
- package/build/types/RouterProvider.d.ts +35 -0
- package/build/types/awaited.d.ts +9 -0
- package/build/types/defer.d.ts +19 -0
- package/build/types/fileRoute.d.ts +38 -0
- package/build/types/history.d.ts +7 -0
- package/build/types/index.d.ts +919 -58
- package/build/types/injectHtml.d.ts +0 -0
- package/build/types/lazyRouteComponent.d.ts +2 -0
- package/build/types/link.d.ts +93 -0
- package/build/types/location.d.ts +12 -0
- package/build/types/path.d.ts +17 -0
- package/build/types/qss.d.ts +2 -0
- package/build/types/react/CatchBoundary.d.ts +33 -0
- package/build/types/react/awaited.d.ts +9 -0
- package/build/types/react/defer.d.ts +19 -0
- package/build/types/react.d.ts +141 -0
- package/build/types/redirects.d.ts +11 -0
- package/build/types/route.d.ts +283 -0
- package/build/types/routeInfo.d.ts +31 -0
- package/build/types/router.d.ts +186 -0
- package/build/types/scroll-restoration.d.ts +18 -0
- package/build/types/searchParams.d.ts +7 -0
- package/build/types/useBlocker.d.ts +9 -0
- package/build/types/useNavigate.d.ts +19 -0
- package/build/types/useParams.d.ts +7 -0
- package/build/types/useSearch.d.ts +7 -0
- package/build/types/useStore.d.ts +12 -0
- package/build/types/utils.d.ts +69 -0
- package/build/umd/index.development.js +2897 -2493
- package/build/umd/index.development.js.map +1 -1
- package/build/umd/index.production.js +4 -4
- package/build/umd/index.production.js.map +1 -1
- package/package.json +12 -10
- package/src/CatchBoundary.tsx +101 -0
- package/src/Matches.tsx +423 -0
- package/src/RouterProvider.tsx +252 -0
- package/src/awaited.tsx +40 -0
- package/src/defer.ts +55 -0
- package/src/fileRoute.ts +152 -0
- package/src/history.ts +8 -0
- package/src/index.tsx +28 -619
- package/src/lazyRouteComponent.tsx +33 -0
- package/src/link.tsx +603 -0
- package/src/location.ts +13 -0
- package/src/path.ts +261 -0
- package/src/qss.ts +53 -0
- package/src/redirects.ts +39 -0
- package/src/route.ts +882 -0
- package/src/routeInfo.ts +84 -0
- package/src/router.ts +1671 -0
- package/src/scroll-restoration.tsx +230 -0
- package/src/searchParams.ts +79 -0
- package/src/useBlocker.tsx +27 -0
- package/src/useNavigate.tsx +111 -0
- package/src/useParams.tsx +25 -0
- package/src/useSearch.tsx +25 -0
- package/src/utils.ts +360 -0
- package/build/cjs/react-router/src/index.js +0 -458
- package/build/cjs/react-router/src/index.js.map +0 -1
- package/build/cjs/router-core/build/esm/index.js +0 -2524
- package/build/cjs/router-core/build/esm/index.js.map +0 -1
package/src/index.tsx
CHANGED
|
@@ -1,620 +1,29 @@
|
|
|
1
|
-
import * as React from 'react'
|
|
2
|
-
|
|
3
|
-
import { useSyncExternalStore } from 'use-sync-external-store/shim'
|
|
4
|
-
|
|
5
|
-
import {
|
|
6
|
-
AnyRoute,
|
|
7
|
-
CheckId,
|
|
8
|
-
rootRouteId,
|
|
9
|
-
Router,
|
|
10
|
-
RouterState,
|
|
11
|
-
ToIdOption,
|
|
12
|
-
} from '@tanstack/router-core'
|
|
13
|
-
import {
|
|
14
|
-
warning,
|
|
15
|
-
RouterOptions,
|
|
16
|
-
RouteMatch,
|
|
17
|
-
MatchRouteOptions,
|
|
18
|
-
RouteConfig,
|
|
19
|
-
AnyRouteConfig,
|
|
20
|
-
AnyAllRouteInfo,
|
|
21
|
-
DefaultAllRouteInfo,
|
|
22
|
-
functionalUpdate,
|
|
23
|
-
createRouter,
|
|
24
|
-
AnyRouteInfo,
|
|
25
|
-
AllRouteInfo,
|
|
26
|
-
RouteInfo,
|
|
27
|
-
ValidFromPath,
|
|
28
|
-
LinkOptions,
|
|
29
|
-
RouteInfoByPath,
|
|
30
|
-
ResolveRelativePath,
|
|
31
|
-
NoInfer,
|
|
32
|
-
ToOptions,
|
|
33
|
-
invariant,
|
|
34
|
-
} from '@tanstack/router-core'
|
|
35
|
-
|
|
36
|
-
export * from '@tanstack/router-core'
|
|
37
|
-
|
|
38
|
-
declare module '@tanstack/router-core' {
|
|
39
|
-
interface FrameworkGenerics {
|
|
40
|
-
Element: React.ReactNode
|
|
41
|
-
// Any is required here so import() will work without having to do import().then(d => d.default)
|
|
42
|
-
SyncOrAsyncElement: React.ReactNode | (() => Promise<any>)
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
interface Router<
|
|
46
|
-
TRouteConfig extends AnyRouteConfig = RouteConfig,
|
|
47
|
-
TAllRouteInfo extends AnyAllRouteInfo = AllRouteInfo<TRouteConfig>,
|
|
48
|
-
> {
|
|
49
|
-
useState: () => RouterState
|
|
50
|
-
useRoute: <TId extends keyof TAllRouteInfo['routeInfoById']>(
|
|
51
|
-
routeId: TId,
|
|
52
|
-
) => Route<TAllRouteInfo, TAllRouteInfo['routeInfoById'][TId]>
|
|
53
|
-
useMatch: <TId extends keyof TAllRouteInfo['routeInfoById']>(
|
|
54
|
-
routeId: TId,
|
|
55
|
-
) => RouteMatch<TAllRouteInfo, TAllRouteInfo['routeInfoById'][TId]>
|
|
56
|
-
linkProps: <TTo extends string = '.'>(
|
|
57
|
-
props: LinkPropsOptions<TAllRouteInfo, '/', TTo> &
|
|
58
|
-
React.AnchorHTMLAttributes<HTMLAnchorElement>,
|
|
59
|
-
) => React.AnchorHTMLAttributes<HTMLAnchorElement>
|
|
60
|
-
Link: <TTo extends string = '.'>(
|
|
61
|
-
props: LinkPropsOptions<TAllRouteInfo, '/', TTo> &
|
|
62
|
-
React.AnchorHTMLAttributes<HTMLAnchorElement> &
|
|
63
|
-
Omit<React.AnchorHTMLAttributes<HTMLAnchorElement>, 'children'> & {
|
|
64
|
-
// 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
|
|
65
|
-
children?:
|
|
66
|
-
| React.ReactNode
|
|
67
|
-
| ((state: { isActive: boolean }) => React.ReactNode)
|
|
68
|
-
},
|
|
69
|
-
) => JSX.Element
|
|
70
|
-
MatchRoute: <TTo extends string = '.'>(
|
|
71
|
-
props: ToOptions<TAllRouteInfo, '/', TTo> &
|
|
72
|
-
MatchRouteOptions & {
|
|
73
|
-
// 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
|
|
74
|
-
children?:
|
|
75
|
-
| React.ReactNode
|
|
76
|
-
| ((
|
|
77
|
-
params: RouteInfoByPath<
|
|
78
|
-
TAllRouteInfo,
|
|
79
|
-
ResolveRelativePath<'/', NoInfer<TTo>>
|
|
80
|
-
>['allParams'],
|
|
81
|
-
) => React.ReactNode)
|
|
82
|
-
},
|
|
83
|
-
) => JSX.Element
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
interface Route<
|
|
87
|
-
TAllRouteInfo extends AnyAllRouteInfo = DefaultAllRouteInfo,
|
|
88
|
-
TRouteInfo extends AnyRouteInfo = RouteInfo,
|
|
89
|
-
> {
|
|
90
|
-
useRoute: <
|
|
91
|
-
TTo extends string = '.',
|
|
92
|
-
TResolved extends string = ResolveRelativePath<
|
|
93
|
-
TRouteInfo['id'],
|
|
94
|
-
NoInfer<TTo>
|
|
95
|
-
>,
|
|
96
|
-
>(
|
|
97
|
-
routeId: CheckId<
|
|
98
|
-
TAllRouteInfo,
|
|
99
|
-
TResolved,
|
|
100
|
-
ToIdOption<TAllRouteInfo, TRouteInfo['id'], TTo>
|
|
101
|
-
>,
|
|
102
|
-
) => Route<TAllRouteInfo, TAllRouteInfo['routeInfoById'][TResolved]>
|
|
103
|
-
linkProps: <TTo extends string = '.'>(
|
|
104
|
-
props: LinkPropsOptions<TAllRouteInfo, TRouteInfo['fullPath'], TTo> &
|
|
105
|
-
React.AnchorHTMLAttributes<HTMLAnchorElement>,
|
|
106
|
-
) => React.AnchorHTMLAttributes<HTMLAnchorElement>
|
|
107
|
-
Link: <TTo extends string = '.'>(
|
|
108
|
-
props: LinkPropsOptions<TAllRouteInfo, TRouteInfo['fullPath'], TTo> &
|
|
109
|
-
React.AnchorHTMLAttributes<HTMLAnchorElement> &
|
|
110
|
-
Omit<React.AnchorHTMLAttributes<HTMLAnchorElement>, 'children'> & {
|
|
111
|
-
// 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
|
|
112
|
-
children?:
|
|
113
|
-
| React.ReactNode
|
|
114
|
-
| ((state: { isActive: boolean }) => React.ReactNode)
|
|
115
|
-
},
|
|
116
|
-
) => JSX.Element
|
|
117
|
-
MatchRoute: <TTo extends string = '.'>(
|
|
118
|
-
props: ToOptions<TAllRouteInfo, TRouteInfo['fullPath'], TTo> &
|
|
119
|
-
MatchRouteOptions & {
|
|
120
|
-
// 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
|
|
121
|
-
children?:
|
|
122
|
-
| React.ReactNode
|
|
123
|
-
| ((
|
|
124
|
-
params: RouteInfoByPath<
|
|
125
|
-
TAllRouteInfo,
|
|
126
|
-
ResolveRelativePath<TRouteInfo['fullPath'], NoInfer<TTo>>
|
|
127
|
-
>['allParams'],
|
|
128
|
-
) => React.ReactNode)
|
|
129
|
-
},
|
|
130
|
-
) => JSX.Element
|
|
131
|
-
}
|
|
132
|
-
}
|
|
133
|
-
|
|
134
|
-
type LinkPropsOptions<
|
|
135
|
-
TAllRouteInfo extends AnyAllRouteInfo = DefaultAllRouteInfo,
|
|
136
|
-
TFrom extends ValidFromPath<TAllRouteInfo> = '/',
|
|
137
|
-
TTo extends string = '.',
|
|
138
|
-
> = LinkOptions<TAllRouteInfo, TFrom, TTo> & {
|
|
139
|
-
// A function that returns additional props for the `active` state of this link. These props override other props passed to the link (`style`'s are merged, `className`'s are concatenated)
|
|
140
|
-
activeProps?:
|
|
141
|
-
| React.AnchorHTMLAttributes<HTMLAnchorElement>
|
|
142
|
-
| (() => React.AnchorHTMLAttributes<HTMLAnchorElement>)
|
|
143
|
-
// A function that returns additional props for the `inactive` state of this link. These props override other props passed to the link (`style`'s are merged, `className`'s are concatenated)
|
|
144
|
-
inactiveProps?:
|
|
145
|
-
| React.AnchorHTMLAttributes<HTMLAnchorElement>
|
|
146
|
-
| (() => React.AnchorHTMLAttributes<HTMLAnchorElement>)
|
|
147
|
-
}
|
|
148
|
-
|
|
149
|
-
export type PromptProps = {
|
|
150
|
-
message: string
|
|
151
|
-
when?: boolean | any
|
|
152
|
-
children?: React.ReactNode
|
|
153
|
-
}
|
|
154
|
-
|
|
155
1
|
//
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
export
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
export
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
}
|
|
185
|
-
|
|
186
|
-
export function createReactRouter<
|
|
187
|
-
TRouteConfig extends AnyRouteConfig = RouteConfig,
|
|
188
|
-
>(opts: RouterOptions<TRouteConfig>): Router<TRouteConfig> {
|
|
189
|
-
const makeRouteExt = (
|
|
190
|
-
route: AnyRoute,
|
|
191
|
-
router: Router<any, any>,
|
|
192
|
-
): Pick<AnyRoute, 'useRoute' | 'linkProps' | 'Link' | 'MatchRoute'> => {
|
|
193
|
-
return {
|
|
194
|
-
useRoute: (subRouteId = '.' as any) => {
|
|
195
|
-
const resolvedRouteId = router.resolvePath(
|
|
196
|
-
route.routeId,
|
|
197
|
-
subRouteId as string,
|
|
198
|
-
)
|
|
199
|
-
const resolvedRoute = router.getRoute(resolvedRouteId)
|
|
200
|
-
useRouterSubscription(router)
|
|
201
|
-
invariant(
|
|
202
|
-
resolvedRoute,
|
|
203
|
-
`Could not find a route for route "${
|
|
204
|
-
resolvedRouteId as string
|
|
205
|
-
}"! Did you forget to add it to your route config?`,
|
|
206
|
-
)
|
|
207
|
-
return resolvedRoute
|
|
208
|
-
},
|
|
209
|
-
linkProps: (options) => {
|
|
210
|
-
const {
|
|
211
|
-
// custom props
|
|
212
|
-
type,
|
|
213
|
-
children,
|
|
214
|
-
target,
|
|
215
|
-
activeProps = () => ({ className: 'active' }),
|
|
216
|
-
inactiveProps = () => ({}),
|
|
217
|
-
activeOptions,
|
|
218
|
-
disabled,
|
|
219
|
-
// fromCurrent,
|
|
220
|
-
hash,
|
|
221
|
-
search,
|
|
222
|
-
params,
|
|
223
|
-
to,
|
|
224
|
-
preload,
|
|
225
|
-
preloadDelay,
|
|
226
|
-
preloadMaxAge,
|
|
227
|
-
replace,
|
|
228
|
-
// element props
|
|
229
|
-
style,
|
|
230
|
-
className,
|
|
231
|
-
onClick,
|
|
232
|
-
onFocus,
|
|
233
|
-
onMouseEnter,
|
|
234
|
-
onMouseLeave,
|
|
235
|
-
onTouchStart,
|
|
236
|
-
onTouchEnd,
|
|
237
|
-
...rest
|
|
238
|
-
} = options
|
|
239
|
-
|
|
240
|
-
const linkInfo = route.buildLink(options)
|
|
241
|
-
|
|
242
|
-
if (linkInfo.type === 'external') {
|
|
243
|
-
const { href } = linkInfo
|
|
244
|
-
return { href }
|
|
245
|
-
}
|
|
246
|
-
|
|
247
|
-
const {
|
|
248
|
-
handleClick,
|
|
249
|
-
handleFocus,
|
|
250
|
-
handleEnter,
|
|
251
|
-
handleLeave,
|
|
252
|
-
isActive,
|
|
253
|
-
next,
|
|
254
|
-
} = linkInfo
|
|
255
|
-
|
|
256
|
-
const composeHandlers =
|
|
257
|
-
(handlers: (undefined | ((e: any) => void))[]) =>
|
|
258
|
-
(e: React.SyntheticEvent) => {
|
|
259
|
-
e.persist()
|
|
260
|
-
handlers.forEach((handler) => {
|
|
261
|
-
if (handler) handler(e)
|
|
262
|
-
})
|
|
263
|
-
}
|
|
264
|
-
|
|
265
|
-
// Get the active props
|
|
266
|
-
const resolvedActiveProps: React.HTMLAttributes<HTMLAnchorElement> =
|
|
267
|
-
isActive ? functionalUpdate(activeProps, {}) ?? {} : {}
|
|
268
|
-
|
|
269
|
-
// Get the inactive props
|
|
270
|
-
const resolvedInactiveProps: React.HTMLAttributes<HTMLAnchorElement> =
|
|
271
|
-
isActive ? {} : functionalUpdate(inactiveProps, {}) ?? {}
|
|
272
|
-
|
|
273
|
-
return {
|
|
274
|
-
...resolvedActiveProps,
|
|
275
|
-
...resolvedInactiveProps,
|
|
276
|
-
...rest,
|
|
277
|
-
href: disabled ? undefined : next.href,
|
|
278
|
-
onClick: composeHandlers([handleClick, onClick]),
|
|
279
|
-
onFocus: composeHandlers([handleFocus, onFocus]),
|
|
280
|
-
onMouseEnter: composeHandlers([handleEnter, onMouseEnter]),
|
|
281
|
-
onMouseLeave: composeHandlers([handleLeave, onMouseLeave]),
|
|
282
|
-
target,
|
|
283
|
-
style: {
|
|
284
|
-
...style,
|
|
285
|
-
...resolvedActiveProps.style,
|
|
286
|
-
...resolvedInactiveProps.style,
|
|
287
|
-
},
|
|
288
|
-
className:
|
|
289
|
-
[
|
|
290
|
-
className,
|
|
291
|
-
resolvedActiveProps.className,
|
|
292
|
-
resolvedInactiveProps.className,
|
|
293
|
-
]
|
|
294
|
-
.filter(Boolean)
|
|
295
|
-
.join(' ') || undefined,
|
|
296
|
-
...(disabled
|
|
297
|
-
? {
|
|
298
|
-
role: 'link',
|
|
299
|
-
'aria-disabled': true,
|
|
300
|
-
}
|
|
301
|
-
: undefined),
|
|
302
|
-
['data-status']: isActive ? 'active' : undefined,
|
|
303
|
-
}
|
|
304
|
-
},
|
|
305
|
-
Link: React.forwardRef((props: any, ref) => {
|
|
306
|
-
const linkProps = route.linkProps(props)
|
|
307
|
-
|
|
308
|
-
useRouterSubscription(router)
|
|
309
|
-
|
|
310
|
-
return (
|
|
311
|
-
<a
|
|
312
|
-
{...{
|
|
313
|
-
ref: ref as any,
|
|
314
|
-
...linkProps,
|
|
315
|
-
children:
|
|
316
|
-
typeof props.children === 'function'
|
|
317
|
-
? props.children({
|
|
318
|
-
isActive: (linkProps as any)['data-status'] === 'active',
|
|
319
|
-
})
|
|
320
|
-
: props.children,
|
|
321
|
-
}}
|
|
322
|
-
/>
|
|
323
|
-
)
|
|
324
|
-
}) as any,
|
|
325
|
-
MatchRoute: (opts) => {
|
|
326
|
-
const { pending, caseSensitive, children, ...rest } = opts
|
|
327
|
-
|
|
328
|
-
const params = route.matchRoute(rest as any, {
|
|
329
|
-
pending,
|
|
330
|
-
caseSensitive,
|
|
331
|
-
})
|
|
332
|
-
|
|
333
|
-
if (!params) {
|
|
334
|
-
return null
|
|
335
|
-
}
|
|
336
|
-
|
|
337
|
-
return typeof opts.children === 'function'
|
|
338
|
-
? opts.children(params as any)
|
|
339
|
-
: (opts.children as any)
|
|
340
|
-
},
|
|
341
|
-
}
|
|
342
|
-
}
|
|
343
|
-
|
|
344
|
-
const coreRouter = createRouter<TRouteConfig>({
|
|
345
|
-
...opts,
|
|
346
|
-
createRouter: (router) => {
|
|
347
|
-
const routerExt: Pick<Router<any, any>, 'useMatch' | 'useState'> = {
|
|
348
|
-
useState: () => {
|
|
349
|
-
useRouterSubscription(router)
|
|
350
|
-
return router.state
|
|
351
|
-
},
|
|
352
|
-
useMatch: (routeId) => {
|
|
353
|
-
useRouterSubscription(router)
|
|
354
|
-
|
|
355
|
-
invariant(
|
|
356
|
-
routeId !== rootRouteId,
|
|
357
|
-
`"${rootRouteId}" cannot be used with useMatch! Did you mean to useRoute("${rootRouteId}")?`,
|
|
358
|
-
)
|
|
359
|
-
|
|
360
|
-
const runtimeMatch = useMatch()
|
|
361
|
-
const match = router.state.matches.find((d) => d.routeId === routeId)
|
|
362
|
-
|
|
363
|
-
invariant(
|
|
364
|
-
match,
|
|
365
|
-
`Could not find a match for route "${
|
|
366
|
-
routeId as string
|
|
367
|
-
}" being rendered in this component!`,
|
|
368
|
-
)
|
|
369
|
-
|
|
370
|
-
invariant(
|
|
371
|
-
runtimeMatch.routeId == match?.routeId,
|
|
372
|
-
`useMatch('${
|
|
373
|
-
match?.routeId as string
|
|
374
|
-
}') is being called in a component that is meant to render the '${
|
|
375
|
-
runtimeMatch.routeId
|
|
376
|
-
}' route. Did you mean to 'useRoute(${
|
|
377
|
-
match?.routeId as string
|
|
378
|
-
})' instead?`,
|
|
379
|
-
)
|
|
380
|
-
|
|
381
|
-
if (!match) {
|
|
382
|
-
invariant('Match not found!')
|
|
383
|
-
}
|
|
384
|
-
|
|
385
|
-
return match
|
|
386
|
-
},
|
|
387
|
-
}
|
|
388
|
-
|
|
389
|
-
const routeExt = makeRouteExt(router.getRoute('/'), router)
|
|
390
|
-
|
|
391
|
-
Object.assign(router, routerExt, routeExt)
|
|
392
|
-
},
|
|
393
|
-
createRoute: ({ router, route }) => {
|
|
394
|
-
const routeExt = makeRouteExt(route, router)
|
|
395
|
-
|
|
396
|
-
Object.assign(route, routeExt)
|
|
397
|
-
},
|
|
398
|
-
createElement: async (element) => {
|
|
399
|
-
if (typeof element === 'function') {
|
|
400
|
-
const res = (await element()) as any
|
|
401
|
-
|
|
402
|
-
// Support direct import() calls
|
|
403
|
-
if (typeof res === 'object' && res.default) {
|
|
404
|
-
return React.createElement(res.default)
|
|
405
|
-
} else {
|
|
406
|
-
return res
|
|
407
|
-
}
|
|
408
|
-
}
|
|
409
|
-
|
|
410
|
-
return element
|
|
411
|
-
},
|
|
412
|
-
})
|
|
413
|
-
|
|
414
|
-
return coreRouter as any
|
|
415
|
-
}
|
|
416
|
-
|
|
417
|
-
export type RouterProps<
|
|
418
|
-
TRouteConfig extends AnyRouteConfig = RouteConfig,
|
|
419
|
-
TAllRouteInfo extends AnyAllRouteInfo = DefaultAllRouteInfo,
|
|
420
|
-
> = RouterOptions<TRouteConfig> & {
|
|
421
|
-
router: Router<TRouteConfig, TAllRouteInfo>
|
|
422
|
-
// Children will default to `<Outlet />` if not provided
|
|
423
|
-
children?: React.ReactNode
|
|
424
|
-
}
|
|
425
|
-
|
|
426
|
-
export function RouterProvider<
|
|
427
|
-
TRouteConfig extends AnyRouteConfig = RouteConfig,
|
|
428
|
-
TAllRouteInfo extends AnyAllRouteInfo = DefaultAllRouteInfo,
|
|
429
|
-
>({ children, router, ...rest }: RouterProps<TRouteConfig, TAllRouteInfo>) {
|
|
430
|
-
router.update(rest)
|
|
431
|
-
|
|
432
|
-
useRouterSubscription(router)
|
|
433
|
-
|
|
434
|
-
useLayoutEffect(() => {
|
|
435
|
-
return router.mount()
|
|
436
|
-
}, [router])
|
|
437
|
-
|
|
438
|
-
return (
|
|
439
|
-
<routerContext.Provider value={{ router }}>
|
|
440
|
-
<MatchesProvider value={router.state.matches}>
|
|
441
|
-
{children ?? <Outlet />}
|
|
442
|
-
</MatchesProvider>
|
|
443
|
-
</routerContext.Provider>
|
|
444
|
-
)
|
|
445
|
-
}
|
|
446
|
-
|
|
447
|
-
function useRouter(): Router {
|
|
448
|
-
const value = React.useContext(routerContext)
|
|
449
|
-
warning(!value, 'useRouter must be used inside a <Router> component!')
|
|
450
|
-
|
|
451
|
-
useRouterSubscription(value.router)
|
|
452
|
-
|
|
453
|
-
return value.router as Router
|
|
454
|
-
}
|
|
455
|
-
|
|
456
|
-
function useMatches(): RouteMatch[] {
|
|
457
|
-
return React.useContext(matchesContext)
|
|
458
|
-
}
|
|
459
|
-
|
|
460
|
-
// function useParentMatches(): RouteMatch[] {
|
|
461
|
-
// const router = useRouter()
|
|
462
|
-
// const match = useMatch()
|
|
463
|
-
// const matches = router.state.matches
|
|
464
|
-
// return matches.slice(
|
|
465
|
-
// 0,
|
|
466
|
-
// matches.findIndex((d) => d.matchId === match.matchId) - 1,
|
|
467
|
-
// )
|
|
468
|
-
// }
|
|
469
|
-
|
|
470
|
-
function useMatch<T>(): RouteMatch {
|
|
471
|
-
return useMatches()?.[0] as RouteMatch
|
|
472
|
-
}
|
|
473
|
-
|
|
474
|
-
export function Outlet() {
|
|
475
|
-
const router = useRouter()
|
|
476
|
-
const [, ...matches] = useMatches()
|
|
477
|
-
|
|
478
|
-
const childMatch = matches[0]
|
|
479
|
-
|
|
480
|
-
if (!childMatch) return null
|
|
481
|
-
|
|
482
|
-
const element = ((): React.ReactNode => {
|
|
483
|
-
if (!childMatch) {
|
|
484
|
-
return null
|
|
485
|
-
}
|
|
486
|
-
|
|
487
|
-
const errorElement =
|
|
488
|
-
childMatch.__.errorElement ?? router.options.defaultErrorElement
|
|
489
|
-
|
|
490
|
-
if (childMatch.status === 'error') {
|
|
491
|
-
if (errorElement) {
|
|
492
|
-
return errorElement as any
|
|
493
|
-
}
|
|
494
|
-
|
|
495
|
-
if (
|
|
496
|
-
childMatch.options.useErrorBoundary ||
|
|
497
|
-
router.options.useErrorBoundary
|
|
498
|
-
) {
|
|
499
|
-
throw childMatch.error
|
|
500
|
-
}
|
|
501
|
-
|
|
502
|
-
return <DefaultErrorBoundary error={childMatch.error} />
|
|
503
|
-
}
|
|
504
|
-
|
|
505
|
-
if (childMatch.status === 'loading' || childMatch.status === 'idle') {
|
|
506
|
-
if (childMatch.isPending) {
|
|
507
|
-
const pendingElement =
|
|
508
|
-
childMatch.__.pendingElement ?? router.options.defaultPendingElement
|
|
509
|
-
|
|
510
|
-
if (childMatch.options.pendingMs || pendingElement) {
|
|
511
|
-
return (pendingElement as any) ?? null
|
|
512
|
-
}
|
|
513
|
-
}
|
|
514
|
-
|
|
515
|
-
return null
|
|
516
|
-
}
|
|
517
|
-
|
|
518
|
-
return (childMatch.__.element as any) ?? router.options.defaultElement
|
|
519
|
-
})() as JSX.Element
|
|
520
|
-
|
|
521
|
-
const catchElement =
|
|
522
|
-
childMatch?.options.catchElement ?? router.options.defaultCatchElement
|
|
523
|
-
|
|
524
|
-
return (
|
|
525
|
-
<MatchesProvider value={matches} key={childMatch.matchId}>
|
|
526
|
-
<CatchBoundary catchElement={catchElement}>{element}</CatchBoundary>
|
|
527
|
-
</MatchesProvider>
|
|
528
|
-
)
|
|
529
|
-
}
|
|
530
|
-
|
|
531
|
-
class CatchBoundary extends React.Component<{
|
|
532
|
-
children: any
|
|
533
|
-
catchElement: any
|
|
534
|
-
}> {
|
|
535
|
-
state = {
|
|
536
|
-
error: false,
|
|
537
|
-
}
|
|
538
|
-
componentDidCatch(error: any, info: any) {
|
|
539
|
-
console.error(error)
|
|
540
|
-
|
|
541
|
-
this.setState({
|
|
542
|
-
error,
|
|
543
|
-
info,
|
|
544
|
-
})
|
|
545
|
-
}
|
|
546
|
-
render() {
|
|
547
|
-
const catchElement = this.props.catchElement ?? DefaultErrorBoundary
|
|
548
|
-
|
|
549
|
-
if (this.state.error) {
|
|
550
|
-
return typeof catchElement === 'function'
|
|
551
|
-
? catchElement(this.state)
|
|
552
|
-
: catchElement
|
|
553
|
-
}
|
|
554
|
-
|
|
555
|
-
return this.props.children
|
|
556
|
-
}
|
|
557
|
-
}
|
|
558
|
-
|
|
559
|
-
export function DefaultErrorBoundary({ error }: { error: any }) {
|
|
560
|
-
return (
|
|
561
|
-
<div style={{ padding: '.5rem', maxWidth: '100%' }}>
|
|
562
|
-
<strong style={{ fontSize: '1.2rem' }}>Something went wrong!</strong>
|
|
563
|
-
<div style={{ height: '.5rem' }} />
|
|
564
|
-
<div>
|
|
565
|
-
<pre>
|
|
566
|
-
{error.message ? (
|
|
567
|
-
<code
|
|
568
|
-
style={{
|
|
569
|
-
fontSize: '.7em',
|
|
570
|
-
border: '1px solid red',
|
|
571
|
-
borderRadius: '.25rem',
|
|
572
|
-
padding: '.5rem',
|
|
573
|
-
color: 'red',
|
|
574
|
-
}}
|
|
575
|
-
>
|
|
576
|
-
{error.message}
|
|
577
|
-
</code>
|
|
578
|
-
) : null}
|
|
579
|
-
</pre>
|
|
580
|
-
</div>
|
|
581
|
-
<div style={{ height: '1rem' }} />
|
|
582
|
-
<div
|
|
583
|
-
style={{
|
|
584
|
-
fontSize: '.8em',
|
|
585
|
-
borderLeft: '3px solid rgba(127, 127, 127, 1)',
|
|
586
|
-
paddingLeft: '.5rem',
|
|
587
|
-
opacity: 0.5,
|
|
588
|
-
}}
|
|
589
|
-
>
|
|
590
|
-
If you are the owner of this website, it's highly recommended that you
|
|
591
|
-
configure your own custom Catch/Error boundaries for the router. You can
|
|
592
|
-
optionally configure a boundary for each route.
|
|
593
|
-
</div>
|
|
594
|
-
</div>
|
|
595
|
-
)
|
|
596
|
-
}
|
|
597
|
-
|
|
598
|
-
export function usePrompt(message: string, when: boolean | any): void {
|
|
599
|
-
const router = useRouter()
|
|
600
|
-
|
|
601
|
-
React.useEffect(() => {
|
|
602
|
-
if (!when) return
|
|
603
|
-
|
|
604
|
-
let unblock = router.history.block((transition) => {
|
|
605
|
-
if (window.confirm(message)) {
|
|
606
|
-
unblock()
|
|
607
|
-
transition.retry()
|
|
608
|
-
} else {
|
|
609
|
-
router.location.pathname = window.location.pathname
|
|
610
|
-
}
|
|
611
|
-
})
|
|
612
|
-
|
|
613
|
-
return unblock
|
|
614
|
-
}, [when, location, message])
|
|
615
|
-
}
|
|
616
|
-
|
|
617
|
-
export function Prompt({ message, when, children }: PromptProps) {
|
|
618
|
-
usePrompt(message, when ?? true)
|
|
619
|
-
return (children ?? null) as React.ReactNode
|
|
620
|
-
}
|
|
2
|
+
export * from '@tanstack/history'
|
|
3
|
+
export { default as invariant } from 'tiny-invariant'
|
|
4
|
+
export { default as warning } from 'tiny-warning'
|
|
5
|
+
export * from './awaited'
|
|
6
|
+
export * from './defer'
|
|
7
|
+
export * from './CatchBoundary'
|
|
8
|
+
export * from './fileRoute'
|
|
9
|
+
export * from './history'
|
|
10
|
+
export * from './index'
|
|
11
|
+
// export * from './injectHtml'
|
|
12
|
+
export * from './lazyRouteComponent'
|
|
13
|
+
export * from './link'
|
|
14
|
+
export * from './location'
|
|
15
|
+
export * from './Matches'
|
|
16
|
+
export * from './path'
|
|
17
|
+
export * from './qss'
|
|
18
|
+
export * from './redirects'
|
|
19
|
+
export * from './route'
|
|
20
|
+
export * from './routeInfo'
|
|
21
|
+
export * from './router'
|
|
22
|
+
export * from './RouterProvider'
|
|
23
|
+
export * from './scroll-restoration'
|
|
24
|
+
export * from './searchParams'
|
|
25
|
+
export * from './useBlocker'
|
|
26
|
+
export * from './useNavigate'
|
|
27
|
+
export * from './useParams'
|
|
28
|
+
export * from './useSearch'
|
|
29
|
+
export * from './utils'
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import * as React from 'react'
|
|
2
|
+
import { AsyncRouteComponent } from './route'
|
|
3
|
+
|
|
4
|
+
export function lazyRouteComponent<
|
|
5
|
+
T extends Record<string, any>,
|
|
6
|
+
TKey extends keyof T = 'default',
|
|
7
|
+
>(
|
|
8
|
+
importer: () => Promise<T>,
|
|
9
|
+
exportName?: TKey,
|
|
10
|
+
): T[TKey] extends (props: infer TProps) => any
|
|
11
|
+
? AsyncRouteComponent<TProps>
|
|
12
|
+
: never {
|
|
13
|
+
let loadPromise: Promise<any>
|
|
14
|
+
|
|
15
|
+
const load = () => {
|
|
16
|
+
if (!loadPromise) {
|
|
17
|
+
loadPromise = importer()
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
return loadPromise
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
const lazyComp = React.lazy(async () => {
|
|
24
|
+
const moduleExports = await load()
|
|
25
|
+
const comp = moduleExports[exportName ?? 'default']
|
|
26
|
+
return {
|
|
27
|
+
default: comp,
|
|
28
|
+
}
|
|
29
|
+
})
|
|
30
|
+
;(lazyComp as any).preload = load
|
|
31
|
+
|
|
32
|
+
return lazyComp as any
|
|
33
|
+
}
|