@tanstack/router-core 0.0.1-beta.19 → 0.0.1-beta.190

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.
Files changed (82) hide show
  1. package/LICENSE +21 -0
  2. package/build/cjs/defer.js +39 -0
  3. package/build/cjs/defer.js.map +1 -0
  4. package/build/cjs/fileRoute.js +29 -0
  5. package/build/cjs/fileRoute.js.map +1 -0
  6. package/build/cjs/history.js +228 -0
  7. package/build/cjs/history.js.map +1 -0
  8. package/build/cjs/index.js +86 -0
  9. package/build/cjs/{packages/router-core/src/index.js.map → index.js.map} +1 -1
  10. package/build/cjs/{packages/router-core/src/path.js → path.js} +45 -56
  11. package/build/cjs/path.js.map +1 -0
  12. package/build/cjs/{packages/router-core/src/qss.js → qss.js} +10 -16
  13. package/build/cjs/qss.js.map +1 -0
  14. package/build/cjs/route.js +114 -0
  15. package/build/cjs/route.js.map +1 -0
  16. package/build/cjs/router.js +1267 -0
  17. package/build/cjs/router.js.map +1 -0
  18. package/build/cjs/scroll-restoration.js +139 -0
  19. package/build/cjs/scroll-restoration.js.map +1 -0
  20. package/build/cjs/{packages/router-core/src/searchParams.js → searchParams.js} +32 -19
  21. package/build/cjs/searchParams.js.map +1 -0
  22. package/build/cjs/{packages/router-core/src/utils.js → utils.js} +69 -64
  23. package/build/cjs/utils.js.map +1 -0
  24. package/build/esm/index.js +1746 -2121
  25. package/build/esm/index.js.map +1 -1
  26. package/build/stats-html.html +59 -49
  27. package/build/stats-react.json +197 -211
  28. package/build/types/defer.d.ts +19 -0
  29. package/build/types/fileRoute.d.ts +35 -0
  30. package/build/types/history.d.ts +36 -0
  31. package/build/types/index.d.ts +13 -609
  32. package/build/types/link.d.ts +96 -0
  33. package/build/types/path.d.ts +16 -0
  34. package/build/types/qss.d.ts +2 -0
  35. package/build/types/route.d.ts +251 -0
  36. package/build/types/routeInfo.d.ts +22 -0
  37. package/build/types/router.d.ts +260 -0
  38. package/build/types/scroll-restoration.d.ts +6 -0
  39. package/build/types/searchParams.d.ts +5 -0
  40. package/build/types/utils.d.ts +44 -0
  41. package/build/umd/index.development.js +1978 -2243
  42. package/build/umd/index.development.js.map +1 -1
  43. package/build/umd/index.production.js +13 -2
  44. package/build/umd/index.production.js.map +1 -1
  45. package/package.json +11 -7
  46. package/src/defer.ts +55 -0
  47. package/src/fileRoute.ts +161 -0
  48. package/src/history.ts +300 -0
  49. package/src/index.ts +5 -10
  50. package/src/link.ts +136 -125
  51. package/src/path.ts +37 -17
  52. package/src/qss.ts +1 -2
  53. package/src/route.ts +948 -218
  54. package/src/routeInfo.ts +45 -211
  55. package/src/router.ts +1778 -1075
  56. package/src/scroll-restoration.ts +179 -0
  57. package/src/searchParams.ts +31 -9
  58. package/src/utils.ts +84 -49
  59. package/build/cjs/_virtual/_rollupPluginBabelHelpers.js +0 -33
  60. package/build/cjs/_virtual/_rollupPluginBabelHelpers.js.map +0 -1
  61. package/build/cjs/node_modules/@babel/runtime/helpers/esm/extends.js +0 -33
  62. package/build/cjs/node_modules/@babel/runtime/helpers/esm/extends.js.map +0 -1
  63. package/build/cjs/node_modules/history/index.js +0 -815
  64. package/build/cjs/node_modules/history/index.js.map +0 -1
  65. package/build/cjs/node_modules/tiny-invariant/dist/esm/tiny-invariant.js +0 -30
  66. package/build/cjs/node_modules/tiny-invariant/dist/esm/tiny-invariant.js.map +0 -1
  67. package/build/cjs/packages/router-core/src/index.js +0 -58
  68. package/build/cjs/packages/router-core/src/path.js.map +0 -1
  69. package/build/cjs/packages/router-core/src/qss.js.map +0 -1
  70. package/build/cjs/packages/router-core/src/route.js +0 -147
  71. package/build/cjs/packages/router-core/src/route.js.map +0 -1
  72. package/build/cjs/packages/router-core/src/routeConfig.js +0 -69
  73. package/build/cjs/packages/router-core/src/routeConfig.js.map +0 -1
  74. package/build/cjs/packages/router-core/src/routeMatch.js +0 -220
  75. package/build/cjs/packages/router-core/src/routeMatch.js.map +0 -1
  76. package/build/cjs/packages/router-core/src/router.js +0 -870
  77. package/build/cjs/packages/router-core/src/router.js.map +0 -1
  78. package/build/cjs/packages/router-core/src/searchParams.js.map +0 -1
  79. package/build/cjs/packages/router-core/src/utils.js.map +0 -1
  80. package/src/frameworks.ts +0 -11
  81. package/src/routeConfig.ts +0 -511
  82. package/src/routeMatch.ts +0 -312
package/src/routeMatch.ts DELETED
@@ -1,312 +0,0 @@
1
- import { GetFrameworkGeneric } from './frameworks'
2
- import { Route } from './route'
3
- import {
4
- AnyAllRouteInfo,
5
- AnyRouteInfo,
6
- DefaultAllRouteInfo,
7
- RouteInfo,
8
- } from './routeInfo'
9
- import { Router } from './router'
10
- import { replaceEqualDeep, warning } from './utils'
11
-
12
- export interface RouteMatch<
13
- TAllRouteInfo extends AnyAllRouteInfo = DefaultAllRouteInfo,
14
- TRouteInfo extends AnyRouteInfo = RouteInfo,
15
- > extends Route<TAllRouteInfo, TRouteInfo> {
16
- matchId: string
17
- pathname: string
18
- params: TRouteInfo['params']
19
- parentMatch?: RouteMatch
20
- childMatches: RouteMatch[]
21
- routeSearch: TRouteInfo['searchSchema']
22
- search: TRouteInfo['fullSearchSchema']
23
- status: 'idle' | 'loading' | 'success' | 'error'
24
- updatedAt?: number
25
- error?: unknown
26
- isInvalid: boolean
27
- getIsInvalid: () => boolean
28
- loaderData: TRouteInfo['loaderData']
29
- routeLoaderData: TRouteInfo['routeLoaderData']
30
- isFetching: boolean
31
- invalidAt: number
32
- __: {
33
- component?: GetFrameworkGeneric<'Component'> // , TRouteInfo['loaderData']>
34
- errorComponent?: GetFrameworkGeneric<'Component'> // , TRouteInfo['loaderData']>
35
- pendingComponent?: GetFrameworkGeneric<'Component'> // , TRouteInfo['loaderData']>
36
- loadPromise?: Promise<void>
37
- componentsPromise?: Promise<void>
38
- dataPromise?: Promise<TRouteInfo['routeLoaderData']>
39
- onExit?:
40
- | void
41
- | ((matchContext: {
42
- params: TRouteInfo['allParams']
43
- search: TRouteInfo['fullSearchSchema']
44
- }) => void)
45
- abortController: AbortController
46
- latestId: string
47
- // setParentMatch: (parentMatch: RouteMatch) => void
48
- // addChildMatch: (childMatch: RouteMatch) => void
49
- validate: () => void
50
- notify: () => void
51
- resolve: () => void
52
- }
53
- cancel: () => void
54
- load: (
55
- loaderOpts?:
56
- | { preload: true; maxAge: number; gcMaxAge: number }
57
- | { preload?: false; maxAge?: never; gcMaxAge?: never },
58
- ) => Promise<TRouteInfo['routeLoaderData']>
59
- fetch: (opts?: { maxAge?: number }) => Promise<TRouteInfo['routeLoaderData']>
60
- invalidate: () => void
61
- hasLoaders: () => boolean
62
- }
63
-
64
- const componentTypes = [
65
- 'component',
66
- 'errorComponent',
67
- 'pendingComponent',
68
- ] as const
69
-
70
- export function createRouteMatch<
71
- TAllRouteInfo extends AnyAllRouteInfo = DefaultAllRouteInfo,
72
- TRouteInfo extends AnyRouteInfo = RouteInfo,
73
- >(
74
- router: Router<any, any>,
75
- route: Route<TAllRouteInfo, TRouteInfo>,
76
- opts: {
77
- parentMatch?: RouteMatch<any, any>
78
- matchId: string
79
- params: TRouteInfo['allParams']
80
- pathname: string
81
- },
82
- ): RouteMatch<TAllRouteInfo, TRouteInfo> {
83
- const routeMatch: RouteMatch<TAllRouteInfo, TRouteInfo> = {
84
- ...route,
85
- ...opts,
86
- router,
87
- routeSearch: {},
88
- search: {},
89
- childMatches: [],
90
- status: 'idle',
91
- routeLoaderData: {} as TRouteInfo['routeLoaderData'],
92
- loaderData: {} as TRouteInfo['loaderData'],
93
- isFetching: false,
94
- isInvalid: false,
95
- invalidAt: Infinity,
96
- // pendingActions: [],
97
- getIsInvalid: () => {
98
- const now = Date.now()
99
- return routeMatch.isInvalid || routeMatch.invalidAt < now
100
- },
101
- __: {
102
- abortController: new AbortController(),
103
- latestId: '',
104
- resolve: () => {},
105
- notify: () => {
106
- routeMatch.__.resolve()
107
- routeMatch.router.notify()
108
- },
109
- validate: () => {
110
- // Validate the search params and stabilize them
111
- const parentSearch =
112
- routeMatch.parentMatch?.search ?? router.location.search
113
-
114
- try {
115
- const prevSearch = routeMatch.routeSearch
116
-
117
- const validator =
118
- typeof routeMatch.options.validateSearch === 'object'
119
- ? routeMatch.options.validateSearch.parse
120
- : routeMatch.options.validateSearch
121
-
122
- let nextSearch = replaceEqualDeep(
123
- prevSearch,
124
- validator?.(parentSearch) ?? {},
125
- )
126
-
127
- // Invalidate route matches when search param stability changes
128
- if (prevSearch !== nextSearch) {
129
- routeMatch.isInvalid = true
130
- }
131
-
132
- routeMatch.routeSearch = nextSearch
133
-
134
- routeMatch.search = replaceEqualDeep(parentSearch, {
135
- ...parentSearch,
136
- ...nextSearch,
137
- })
138
-
139
- componentTypes.map(async (type) => {
140
- const component = routeMatch.options[type]
141
-
142
- if (typeof routeMatch.__[type] !== 'function') {
143
- routeMatch.__[type] = component
144
- }
145
- })
146
- } catch (err: any) {
147
- console.error(err)
148
- const error = new (Error as any)('Invalid search params found', {
149
- cause: err,
150
- })
151
- error.code = 'INVALID_SEARCH_PARAMS'
152
- routeMatch.status = 'error'
153
- routeMatch.error = error
154
- // Do not proceed with loading the route
155
- return
156
- }
157
- },
158
- },
159
- cancel: () => {
160
- routeMatch.__.abortController?.abort()
161
- },
162
- invalidate: () => {
163
- routeMatch.isInvalid = true
164
- },
165
- hasLoaders: () => {
166
- return !!(
167
- route.options.loader ||
168
- componentTypes.some((d) => route.options[d]?.preload)
169
- )
170
- },
171
- load: async (loaderOpts) => {
172
- const now = Date.now()
173
- const minMaxAge = loaderOpts?.preload
174
- ? Math.max(loaderOpts?.maxAge, loaderOpts?.gcMaxAge)
175
- : 0
176
-
177
- // If this is a preload, add it to the preload cache
178
- if (loaderOpts?.preload && minMaxAge > 0) {
179
- // If the match is currently active, don't preload it
180
- if (
181
- router.state.matches.find((d) => d.matchId === routeMatch.matchId)
182
- ) {
183
- return
184
- }
185
-
186
- router.matchCache[routeMatch.matchId] = {
187
- gc: now + loaderOpts.gcMaxAge,
188
- match: routeMatch as RouteMatch<any, any>,
189
- }
190
- }
191
-
192
- // If the match is invalid, errored or idle, trigger it to load
193
- if (
194
- (routeMatch.status === 'success' && routeMatch.getIsInvalid()) ||
195
- routeMatch.status === 'error' ||
196
- routeMatch.status === 'idle'
197
- ) {
198
- const maxAge = loaderOpts?.preload ? loaderOpts?.maxAge : undefined
199
-
200
- await routeMatch.fetch({ maxAge })
201
- }
202
- },
203
- fetch: async (opts) => {
204
- const loadId = '' + Date.now() + Math.random()
205
- routeMatch.__.latestId = loadId
206
- const checkLatest = async () => {
207
- if (loadId !== routeMatch.__.latestId) {
208
- // warning(true, 'Data loader is out of date!')
209
- return new Promise(() => {})
210
- }
211
- }
212
-
213
- // If the match was in an error state, set it
214
- // to a loading state again. Otherwise, keep it
215
- // as loading or resolved
216
- if (routeMatch.status === 'idle') {
217
- routeMatch.status = 'loading'
218
- }
219
-
220
- // We started loading the route, so it's no longer invalid
221
- routeMatch.isInvalid = false
222
-
223
- routeMatch.__.loadPromise = new Promise(async (resolve) => {
224
- // We are now fetching, even if it's in the background of a
225
- // resolved state
226
- routeMatch.isFetching = true
227
- routeMatch.__.resolve = resolve as () => void
228
-
229
- routeMatch.__.componentsPromise = (async () => {
230
- // then run all component and data loaders in parallel
231
- // For each component type, potentially load it asynchronously
232
-
233
- await Promise.all(
234
- componentTypes.map(async (type) => {
235
- const component = routeMatch.options[type]
236
-
237
- if (routeMatch.__[type]?.preload) {
238
- routeMatch.__[type] = await router.options.loadComponent!(
239
- component,
240
- )
241
- }
242
- }),
243
- )
244
- })()
245
-
246
- routeMatch.__.dataPromise = Promise.resolve().then(async () => {
247
- try {
248
- if (routeMatch.options.loader) {
249
- const data = await router.loadMatchData(routeMatch)
250
- await checkLatest()
251
-
252
- routeMatch.routeLoaderData = replaceEqualDeep(
253
- routeMatch.routeLoaderData,
254
- data,
255
- )
256
- }
257
-
258
- routeMatch.error = undefined
259
- routeMatch.status = 'success'
260
- routeMatch.updatedAt = Date.now()
261
- routeMatch.invalidAt =
262
- routeMatch.updatedAt +
263
- (opts?.maxAge ??
264
- routeMatch.options.loaderMaxAge ??
265
- router.options.defaultLoaderMaxAge ??
266
- 0)
267
-
268
- return routeMatch.routeLoaderData
269
- } catch (err) {
270
- await checkLatest()
271
-
272
- if (process.env.NODE_ENV !== 'production') {
273
- console.error(err)
274
- }
275
-
276
- routeMatch.error = err
277
- routeMatch.status = 'error'
278
- routeMatch.updatedAt = Date.now()
279
-
280
- throw err
281
- }
282
- })
283
-
284
- const after = async () => {
285
- await checkLatest()
286
- routeMatch.isFetching = false
287
- delete routeMatch.__.loadPromise
288
- routeMatch.__.notify()
289
- }
290
-
291
- try {
292
- await Promise.all([
293
- routeMatch.__.componentsPromise,
294
- routeMatch.__.dataPromise.catch(() => {}),
295
- ])
296
- after()
297
- } catch {
298
- after()
299
- }
300
- })
301
-
302
- await routeMatch.__.loadPromise
303
- await checkLatest()
304
- },
305
- }
306
-
307
- if (!routeMatch.hasLoaders()) {
308
- routeMatch.status = 'success'
309
- }
310
-
311
- return routeMatch
312
- }