@tanstack/react-router 0.0.1-beta.166 → 0.0.1-beta.167

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/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@tanstack/react-router",
3
3
  "author": "Tanner Linsley",
4
- "version": "0.0.1-beta.166",
4
+ "version": "0.0.1-beta.167",
5
5
  "license": "MIT",
6
6
  "repository": "tanstack/router",
7
7
  "homepage": "https://tanstack.com/router",
@@ -43,8 +43,8 @@
43
43
  "tiny-invariant": "^1.3.1",
44
44
  "tiny-warning": "^1.0.3",
45
45
  "@gisatcz/cross-package-react-context": "^0.2.0",
46
- "@tanstack/router-core": "0.0.1-beta.166",
47
- "@tanstack/react-store": "0.0.1-beta.166"
46
+ "@tanstack/router-core": "0.0.1-beta.167",
47
+ "@tanstack/react-store": "0.0.1-beta.167"
48
48
  },
49
49
  "scripts": {
50
50
  "build": "rollup --config rollup.config.js"
@@ -0,0 +1,40 @@
1
+ import { DeferredPromise, isDehydratedDeferred } from '@tanstack/router-core'
2
+ import { useRouter } from '.'
3
+
4
+ export type DeferredOptions<T> = {
5
+ promise: DeferredPromise<T>
6
+ }
7
+
8
+ export function useDeferred<T>({ promise }: DeferredOptions<T>): [T] {
9
+ const router = useRouter()
10
+
11
+ let state = promise.__deferredState
12
+ const key = `__TSR__DEFERRED__${state.uid}`
13
+
14
+ if (isDehydratedDeferred(promise)) {
15
+ state = router.hydrateData(key)!
16
+ promise = Promise.resolve(state.data) as DeferredPromise<any>
17
+ promise.__deferredState = state
18
+ }
19
+
20
+ if (state.status === 'pending') {
21
+ throw promise
22
+ }
23
+
24
+ if (state.status === 'error') {
25
+ throw state.error
26
+ }
27
+
28
+ router.dehydrateData(key, state)
29
+
30
+ return [state.data]
31
+ }
32
+
33
+ export function Deferred<T>(
34
+ props: DeferredOptions<T> & {
35
+ children: (result: T) => JSX.Element
36
+ },
37
+ ) {
38
+ const awaited = useDeferred(props)
39
+ return props.children(...awaited)
40
+ }
package/src/index.tsx CHANGED
@@ -36,21 +36,23 @@ import {
36
36
  ParseRoute,
37
37
  AllParams,
38
38
  rootRouteId,
39
+ AnyPathParams,
39
40
  } from '@tanstack/router-core'
40
41
 
41
42
  //
42
43
 
43
44
  export * from '@tanstack/router-core'
44
45
  export * from './scroll-restoration'
46
+ export * from './deferred'
45
47
 
46
48
  export { useStore }
47
49
 
48
50
  declare module '@tanstack/router-core' {
49
- interface RegisterRouteComponent<TProps extends Record<string, any>> {
51
+ interface RegisterRouteComponent<TProps> {
50
52
  RouteComponent: RouteComponent<TProps>
51
53
  }
52
54
 
53
- interface RegisterRouteErrorComponent<TProps extends Record<string, any>> {
55
+ interface RegisterRouteErrorComponent<TProps> {
54
56
  RouteErrorComponent: RouteComponent<TProps>
55
57
  }
56
58
 
@@ -129,6 +131,102 @@ declare module '@tanstack/router-core' {
129
131
  select?: (search: TAllParams) => TSelected
130
132
  }) => TStrict extends true ? TSelected : TSelected | undefined
131
133
  }
134
+
135
+ interface RegisterRouteProps<
136
+ TLoader = unknown,
137
+ TFullSearchSchema extends AnySearchSchema = AnySearchSchema,
138
+ TAllParams extends AnyPathParams = AnyPathParams,
139
+ TRouteContext extends AnyContext = AnyContext,
140
+ TAllContext extends AnyContext = AnyContext,
141
+ > {
142
+ RouteProps: RouteProps<
143
+ TLoader,
144
+ TFullSearchSchema,
145
+ TAllParams,
146
+ TRouteContext,
147
+ TAllContext
148
+ >
149
+ }
150
+
151
+ interface RegisterPendingRouteProps<
152
+ TFullSearchSchema extends AnySearchSchema = AnySearchSchema,
153
+ TAllParams extends AnyPathParams = AnyPathParams,
154
+ TRouteContext extends AnyContext = AnyContext,
155
+ TAllContext extends AnyContext = AnyContext,
156
+ > {
157
+ PendingRouteProps: Omit<
158
+ RouteProps<
159
+ unknown,
160
+ TFullSearchSchema,
161
+ TAllParams,
162
+ TRouteContext,
163
+ TAllContext
164
+ >,
165
+ 'useLoader'
166
+ >
167
+ }
168
+
169
+ interface RegisterErrorRouteProps<
170
+ TFullSearchSchema extends AnySearchSchema = AnySearchSchema,
171
+ TAllParams extends AnyPathParams = AnyPathParams,
172
+ TRouteContext extends AnyContext = AnyContext,
173
+ TAllContext extends AnyContext = AnyContext,
174
+ > {
175
+ ErrorRouteProps: {
176
+ error: unknown
177
+ info: { componentStack: string }
178
+ } & Omit<
179
+ RouteProps<
180
+ unknown,
181
+ TFullSearchSchema,
182
+ TAllParams,
183
+ TRouteContext,
184
+ TAllContext
185
+ >,
186
+ 'useLoader'
187
+ >
188
+ }
189
+ }
190
+
191
+ export type RouteProps<
192
+ TLoader = unknown,
193
+ TFullSearchSchema extends AnySearchSchema = AnySearchSchema,
194
+ TAllParams extends AnyPathParams = AnyPathParams,
195
+ TRouteContext extends AnyContext = AnyContext,
196
+ TAllContext extends AnyContext = AnyContext,
197
+ > = {
198
+ useLoader: <TStrict extends boolean = true, TSelected = TLoader>(opts?: {
199
+ strict?: TStrict
200
+ select?: (search: TLoader) => TSelected
201
+ }) => TStrict extends true
202
+ ? UseLoaderResult<TSelected>
203
+ : UseLoaderResult<TSelected> | undefined
204
+ useMatch: <TStrict extends boolean = true, TSelected = TAllContext>(opts?: {
205
+ strict?: TStrict
206
+ select?: (search: TAllContext) => TSelected
207
+ }) => TStrict extends true ? TSelected : TSelected | undefined
208
+ useContext: <TStrict extends boolean = true, TSelected = TAllContext>(opts?: {
209
+ strict?: TStrict
210
+ select?: (search: TAllContext) => TSelected
211
+ }) => TStrict extends true ? TSelected : TSelected | undefined
212
+ useRouteContext: <
213
+ TStrict extends boolean = true,
214
+ TSelected = TRouteContext,
215
+ >(opts?: {
216
+ strict?: TStrict
217
+ select?: (search: TRouteContext) => TSelected
218
+ }) => TStrict extends true ? TSelected : TSelected | undefined
219
+ useSearch: <
220
+ TStrict extends boolean = true,
221
+ TSelected = TFullSearchSchema,
222
+ >(opts?: {
223
+ strict?: TStrict
224
+ select?: (search: TFullSearchSchema) => TSelected
225
+ }) => TStrict extends true ? TSelected : TSelected | undefined
226
+ useParams: <TStrict extends boolean = true, TSelected = TAllParams>(opts?: {
227
+ strict?: TStrict
228
+ select?: (search: TAllParams) => TSelected
229
+ }) => TStrict extends true ? TSelected : TSelected | undefined
132
230
  }
133
231
 
134
232
  Route.__onInit = (route) => {
@@ -472,13 +570,11 @@ export function RouterProvider<
472
570
  const Wrap = router.options.Wrap || React.Fragment
473
571
 
474
572
  return (
475
- <React.Suspense fallback={null}>
476
- <Wrap>
477
- <routerContext.Provider value={router as any}>
478
- <Matches />
479
- </routerContext.Provider>
480
- </Wrap>
481
- </React.Suspense>
573
+ <Wrap>
574
+ <routerContext.Provider value={router as any}>
575
+ <Matches />
576
+ </routerContext.Provider>
577
+ </Wrap>
482
578
  )
483
579
  }
484
580