@tanstack/router-core 0.0.1-beta.9 → 1.97.24

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 (140) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +5 -0
  3. package/dist/cjs/Matches.cjs +13 -0
  4. package/dist/cjs/Matches.cjs.map +1 -0
  5. package/dist/cjs/Matches.d.cts +28 -0
  6. package/dist/cjs/RouterProvider.d.cts +18 -0
  7. package/dist/cjs/defer.cjs +25 -0
  8. package/dist/cjs/defer.cjs.map +1 -0
  9. package/dist/cjs/defer.d.cts +20 -0
  10. package/dist/cjs/index.cjs +50 -0
  11. package/dist/cjs/index.cjs.map +1 -0
  12. package/dist/cjs/index.d.cts +25 -0
  13. package/dist/cjs/link.cjs +5 -0
  14. package/dist/cjs/link.cjs.map +1 -0
  15. package/dist/cjs/link.d.cts +51 -0
  16. package/dist/cjs/location.d.cts +12 -0
  17. package/dist/cjs/manifest.d.cts +24 -0
  18. package/dist/cjs/path.cjs +289 -0
  19. package/dist/cjs/path.cjs.map +1 -0
  20. package/dist/cjs/path.d.cts +34 -0
  21. package/dist/cjs/qss.cjs +51 -0
  22. package/dist/cjs/qss.cjs.map +1 -0
  23. package/dist/cjs/qss.d.cts +27 -0
  24. package/dist/cjs/root.cjs +5 -0
  25. package/dist/cjs/root.cjs.map +1 -0
  26. package/dist/cjs/root.d.cts +2 -0
  27. package/dist/cjs/route.d.cts +148 -0
  28. package/dist/cjs/router.cjs +19 -0
  29. package/dist/cjs/router.cjs.map +1 -0
  30. package/dist/cjs/router.d.cts +31 -0
  31. package/dist/cjs/searchMiddleware.cjs +42 -0
  32. package/dist/cjs/searchMiddleware.cjs.map +1 -0
  33. package/dist/cjs/searchMiddleware.d.cts +5 -0
  34. package/dist/cjs/searchParams.cjs +61 -0
  35. package/dist/cjs/searchParams.cjs.map +1 -0
  36. package/dist/cjs/searchParams.d.cts +7 -0
  37. package/dist/cjs/serializer.d.cts +15 -0
  38. package/dist/cjs/structuralSharing.d.cts +4 -0
  39. package/dist/cjs/utils.cjs +155 -0
  40. package/dist/cjs/utils.cjs.map +1 -0
  41. package/dist/cjs/utils.d.cts +81 -0
  42. package/dist/cjs/validators.d.cts +51 -0
  43. package/dist/esm/Matches.d.ts +28 -0
  44. package/dist/esm/Matches.js +13 -0
  45. package/dist/esm/Matches.js.map +1 -0
  46. package/dist/esm/RouterProvider.d.ts +18 -0
  47. package/dist/esm/defer.d.ts +20 -0
  48. package/dist/esm/defer.js +25 -0
  49. package/dist/esm/defer.js.map +1 -0
  50. package/dist/esm/index.d.ts +25 -0
  51. package/dist/esm/index.js +50 -0
  52. package/dist/esm/index.js.map +1 -0
  53. package/dist/esm/link.d.ts +51 -0
  54. package/dist/esm/link.js +5 -0
  55. package/dist/esm/link.js.map +1 -0
  56. package/dist/esm/location.d.ts +12 -0
  57. package/dist/esm/manifest.d.ts +24 -0
  58. package/dist/esm/path.d.ts +34 -0
  59. package/dist/esm/path.js +289 -0
  60. package/dist/esm/path.js.map +1 -0
  61. package/dist/esm/qss.d.ts +27 -0
  62. package/dist/esm/qss.js +51 -0
  63. package/dist/esm/qss.js.map +1 -0
  64. package/dist/esm/root.d.ts +2 -0
  65. package/dist/esm/root.js +5 -0
  66. package/dist/esm/root.js.map +1 -0
  67. package/dist/esm/route.d.ts +148 -0
  68. package/dist/esm/router.d.ts +31 -0
  69. package/dist/esm/router.js +19 -0
  70. package/dist/esm/router.js.map +1 -0
  71. package/dist/esm/searchMiddleware.d.ts +5 -0
  72. package/dist/esm/searchMiddleware.js +42 -0
  73. package/dist/esm/searchMiddleware.js.map +1 -0
  74. package/dist/esm/searchParams.d.ts +7 -0
  75. package/dist/esm/searchParams.js +61 -0
  76. package/dist/esm/searchParams.js.map +1 -0
  77. package/dist/esm/serializer.d.ts +15 -0
  78. package/dist/esm/structuralSharing.d.ts +4 -0
  79. package/dist/esm/utils.d.ts +81 -0
  80. package/dist/esm/utils.js +155 -0
  81. package/dist/esm/utils.js.map +1 -0
  82. package/dist/esm/validators.d.ts +51 -0
  83. package/package.json +35 -32
  84. package/src/Matches.ts +94 -0
  85. package/src/RouterProvider.ts +20 -0
  86. package/src/defer.ts +52 -0
  87. package/src/index.ts +206 -19
  88. package/src/link.ts +122 -300
  89. package/src/location.ts +13 -0
  90. package/src/manifest.ts +32 -0
  91. package/src/path.ts +238 -47
  92. package/src/qss.ts +56 -19
  93. package/src/root.ts +2 -0
  94. package/src/route.ts +296 -223
  95. package/src/router.ts +34 -1281
  96. package/src/searchMiddleware.ts +54 -0
  97. package/src/searchParams.ts +43 -20
  98. package/src/serializer.ts +24 -0
  99. package/src/structuralSharing.ts +7 -0
  100. package/src/utils.ts +314 -75
  101. package/src/validators.ts +121 -0
  102. package/build/cjs/_virtual/_rollupPluginBabelHelpers.js +0 -33
  103. package/build/cjs/_virtual/_rollupPluginBabelHelpers.js.map +0 -1
  104. package/build/cjs/node_modules/@babel/runtime/helpers/esm/extends.js +0 -33
  105. package/build/cjs/node_modules/@babel/runtime/helpers/esm/extends.js.map +0 -1
  106. package/build/cjs/node_modules/history/index.js +0 -815
  107. package/build/cjs/node_modules/history/index.js.map +0 -1
  108. package/build/cjs/node_modules/tiny-invariant/dist/esm/tiny-invariant.js +0 -30
  109. package/build/cjs/node_modules/tiny-invariant/dist/esm/tiny-invariant.js.map +0 -1
  110. package/build/cjs/packages/router-core/src/index.js +0 -58
  111. package/build/cjs/packages/router-core/src/index.js.map +0 -1
  112. package/build/cjs/packages/router-core/src/path.js +0 -222
  113. package/build/cjs/packages/router-core/src/path.js.map +0 -1
  114. package/build/cjs/packages/router-core/src/qss.js +0 -71
  115. package/build/cjs/packages/router-core/src/qss.js.map +0 -1
  116. package/build/cjs/packages/router-core/src/route.js +0 -150
  117. package/build/cjs/packages/router-core/src/route.js.map +0 -1
  118. package/build/cjs/packages/router-core/src/routeConfig.js +0 -69
  119. package/build/cjs/packages/router-core/src/routeConfig.js.map +0 -1
  120. package/build/cjs/packages/router-core/src/routeMatch.js +0 -266
  121. package/build/cjs/packages/router-core/src/routeMatch.js.map +0 -1
  122. package/build/cjs/packages/router-core/src/router.js +0 -822
  123. package/build/cjs/packages/router-core/src/router.js.map +0 -1
  124. package/build/cjs/packages/router-core/src/searchParams.js +0 -70
  125. package/build/cjs/packages/router-core/src/searchParams.js.map +0 -1
  126. package/build/cjs/packages/router-core/src/utils.js +0 -125
  127. package/build/cjs/packages/router-core/src/utils.js.map +0 -1
  128. package/build/esm/index.js +0 -2481
  129. package/build/esm/index.js.map +0 -1
  130. package/build/stats-html.html +0 -4034
  131. package/build/stats-react.json +0 -493
  132. package/build/types/index.d.ts +0 -618
  133. package/build/umd/index.development.js +0 -2514
  134. package/build/umd/index.development.js.map +0 -1
  135. package/build/umd/index.production.js +0 -12
  136. package/build/umd/index.production.js.map +0 -1
  137. package/src/frameworks.ts +0 -12
  138. package/src/routeConfig.ts +0 -495
  139. package/src/routeInfo.ts +0 -228
  140. package/src/routeMatch.ts +0 -374
package/src/routeMatch.ts DELETED
@@ -1,374 +0,0 @@
1
- import { GetFrameworkGeneric } from './frameworks'
2
- import { Route } from './route'
3
- import { AnyPathParams } from './routeConfig'
4
- import {
5
- AnyAllRouteInfo,
6
- AnyRouteInfo,
7
- DefaultAllRouteInfo,
8
- RouteInfo,
9
- } from './routeInfo'
10
- import { Router } from './router'
11
- import { replaceEqualDeep, Timeout } from './utils'
12
-
13
- export interface RouteMatch<
14
- TAllRouteInfo extends AnyAllRouteInfo = DefaultAllRouteInfo,
15
- TRouteInfo extends AnyRouteInfo = RouteInfo,
16
- > extends Route<TAllRouteInfo, TRouteInfo> {
17
- matchId: string
18
- pathname: string
19
- params: TRouteInfo['params']
20
- parentMatch?: RouteMatch
21
- childMatches: RouteMatch[]
22
- routeSearch: TRouteInfo['searchSchema']
23
- search: TRouteInfo['fullSearchSchema']
24
- status: 'idle' | 'loading' | 'success' | 'error'
25
- updatedAt?: number
26
- error?: unknown
27
- isInvalid: boolean
28
- getIsInvalid: () => boolean
29
- loaderData: TRouteInfo['loaderData']
30
- routeLoaderData: TRouteInfo['routeLoaderData']
31
- isFetching: boolean
32
- isPending: boolean
33
- invalidAt: number
34
- __: {
35
- element?: GetFrameworkGeneric<'Element'> // , TRouteInfo['loaderData']>
36
- errorElement?: GetFrameworkGeneric<'Element'> // , TRouteInfo['loaderData']>
37
- catchElement?: GetFrameworkGeneric<'Element'> // , TRouteInfo['loaderData']>
38
- pendingElement?: GetFrameworkGeneric<'Element'> // , TRouteInfo['loaderData']>
39
- loadPromise?: Promise<void>
40
- loaderPromise?: Promise<void>
41
- elementsPromise?: Promise<void>
42
- dataPromise?: Promise<void>
43
- pendingTimeout?: Timeout
44
- pendingMinTimeout?: Timeout
45
- pendingMinPromise?: Promise<void>
46
- onExit?:
47
- | void
48
- | ((matchContext: {
49
- params: TRouteInfo['allParams']
50
- search: TRouteInfo['fullSearchSchema']
51
- }) => void)
52
- abortController: AbortController
53
- latestId: string
54
- // setParentMatch: (parentMatch: RouteMatch) => void
55
- // addChildMatch: (childMatch: RouteMatch) => void
56
- validate: () => void
57
- startPending: () => void
58
- cancelPending: () => void
59
- notify: () => void
60
- resolve: () => void
61
- }
62
- cancel: () => void
63
- load: (
64
- loaderOpts?: { withPending?: boolean } & (
65
- | { preload: true; maxAge: number; gcMaxAge: number }
66
- | { preload?: false; maxAge?: never; gcMaxAge?: never }
67
- ),
68
- ) => Promise<TRouteInfo['routeLoaderData']>
69
- fetch: (opts?: { maxAge?: number }) => Promise<TRouteInfo['routeLoaderData']>
70
- invalidate: () => void
71
- hasLoaders: () => boolean
72
- }
73
-
74
- const elementTypes = [
75
- 'element',
76
- 'errorElement',
77
- 'catchElement',
78
- 'pendingElement',
79
- ] as const
80
-
81
- export function createRouteMatch<
82
- TAllRouteInfo extends AnyAllRouteInfo = DefaultAllRouteInfo,
83
- TRouteInfo extends AnyRouteInfo = RouteInfo,
84
- >(
85
- router: Router<any, any>,
86
- route: Route<TAllRouteInfo, TRouteInfo>,
87
- opts: {
88
- matchId: string
89
- params: TRouteInfo['allParams']
90
- pathname: string
91
- },
92
- ): RouteMatch<TAllRouteInfo, TRouteInfo> {
93
- const routeMatch: RouteMatch<TAllRouteInfo, TRouteInfo> = {
94
- ...route,
95
- ...opts,
96
- router,
97
- routeSearch: {},
98
- search: {},
99
- childMatches: [],
100
- status: 'idle',
101
- routeLoaderData: {} as TRouteInfo['routeLoaderData'],
102
- loaderData: {} as TRouteInfo['loaderData'],
103
- isPending: false,
104
- isFetching: false,
105
- isInvalid: false,
106
- invalidAt: Infinity,
107
- getIsInvalid: () => {
108
- const now = Date.now()
109
- return routeMatch.isInvalid || routeMatch.invalidAt < now
110
- },
111
- __: {
112
- abortController: new AbortController(),
113
- latestId: '',
114
- resolve: () => {},
115
- notify: () => {
116
- routeMatch.__.resolve()
117
- routeMatch.router.notify()
118
- },
119
- startPending: () => {
120
- const pendingMs =
121
- routeMatch.options.pendingMs ?? router.options.defaultPendingMs
122
- const pendingMinMs =
123
- routeMatch.options.pendingMinMs ?? router.options.defaultPendingMinMs
124
-
125
- if (
126
- routeMatch.__.pendingTimeout ||
127
- routeMatch.status !== 'loading' ||
128
- typeof pendingMs === 'undefined'
129
- ) {
130
- return
131
- }
132
-
133
- routeMatch.__.pendingTimeout = setTimeout(() => {
134
- routeMatch.isPending = true
135
- routeMatch.__.resolve()
136
- if (typeof pendingMinMs !== 'undefined') {
137
- routeMatch.__.pendingMinPromise = new Promise(
138
- (r) =>
139
- (routeMatch.__.pendingMinTimeout = setTimeout(r, pendingMinMs)),
140
- )
141
- }
142
- }, pendingMs)
143
- },
144
- cancelPending: () => {
145
- routeMatch.isPending = false
146
- clearTimeout(routeMatch.__.pendingTimeout)
147
- clearTimeout(routeMatch.__.pendingMinTimeout)
148
- delete routeMatch.__.pendingMinPromise
149
- },
150
- // setParentMatch: (parentMatch?: RouteMatch) => {
151
- // routeMatch.parentMatch = parentMatch
152
- // },
153
- // addChildMatch: (childMatch: RouteMatch) => {
154
- // if (
155
- // routeMatch.childMatches.find((d) => d.matchId === childMatch.matchId)
156
- // ) {
157
- // return
158
- // }
159
-
160
- // routeMatch.childMatches.push(childMatch)
161
- // },
162
- validate: () => {
163
- // Validate the search params and stabilize them
164
- const parentSearch =
165
- routeMatch.parentMatch?.search ?? router.location.search
166
-
167
- try {
168
- const prevSearch = routeMatch.routeSearch
169
-
170
- const validator =
171
- typeof routeMatch.options.validateSearch === 'object'
172
- ? routeMatch.options.validateSearch.parse
173
- : routeMatch.options.validateSearch
174
-
175
- let nextSearch = replaceEqualDeep(
176
- prevSearch,
177
- validator?.(parentSearch),
178
- )
179
-
180
- // Invalidate route matches when search param stability changes
181
- if (prevSearch !== nextSearch) {
182
- routeMatch.isInvalid = true
183
- }
184
-
185
- routeMatch.routeSearch = nextSearch
186
-
187
- routeMatch.search = replaceEqualDeep(parentSearch, {
188
- ...parentSearch,
189
- ...nextSearch,
190
- })
191
- } catch (err: any) {
192
- console.error(err)
193
- const error = new (Error as any)('Invalid search params found', {
194
- cause: err,
195
- })
196
- error.code = 'INVALID_SEARCH_PARAMS'
197
- routeMatch.status = 'error'
198
- routeMatch.error = error
199
- // Do not proceed with loading the route
200
- return
201
- }
202
- },
203
- },
204
- cancel: () => {
205
- routeMatch.__.abortController?.abort()
206
- routeMatch.__.cancelPending()
207
- },
208
- invalidate: () => {
209
- routeMatch.isInvalid = true
210
- },
211
- hasLoaders: () => {
212
- return !!(
213
- route.options.loader ||
214
- elementTypes.some((d) => typeof route.options[d] === 'function')
215
- )
216
- },
217
- load: async (loaderOpts) => {
218
- const now = Date.now()
219
- const minMaxAge = loaderOpts?.preload
220
- ? Math.max(loaderOpts?.maxAge, loaderOpts?.gcMaxAge)
221
- : 0
222
-
223
- // If this is a preload, add it to the preload cache
224
- if (loaderOpts?.preload && minMaxAge > 0) {
225
- // If the match is currently active, don't preload it
226
- if (
227
- router.state.matches.find((d) => d.matchId === routeMatch.matchId)
228
- ) {
229
- return
230
- }
231
-
232
- router.matchCache[routeMatch.matchId] = {
233
- gc: now + loaderOpts.gcMaxAge,
234
- match: routeMatch as RouteMatch<any, any>,
235
- }
236
- }
237
-
238
- // If the match is invalid, errored or idle, trigger it to load
239
- if (
240
- (routeMatch.status === 'success' && routeMatch.getIsInvalid()) ||
241
- routeMatch.status === 'error' ||
242
- routeMatch.status === 'idle'
243
- ) {
244
- const maxAge = loaderOpts?.preload ? loaderOpts?.maxAge : undefined
245
-
246
- routeMatch.fetch({ maxAge })
247
- }
248
- },
249
- fetch: async (opts) => {
250
- const id = '' + Date.now() + Math.random()
251
- routeMatch.__.latestId = id
252
-
253
- // If the match was in an error state, set it
254
- // to a loading state again. Otherwise, keep it
255
- // as loading or resolved
256
- if (routeMatch.status === 'idle') {
257
- routeMatch.status = 'loading'
258
- }
259
-
260
- // We started loading the route, so it's no longer invalid
261
- routeMatch.isInvalid = false
262
-
263
- routeMatch.__.loadPromise = new Promise(async (resolve) => {
264
- // We are now fetching, even if it's in the background of a
265
- // resolved state
266
- routeMatch.isFetching = true
267
- routeMatch.__.resolve = resolve as () => void
268
-
269
- const loaderPromise = (async () => {
270
- // Load the elements and data in parallel
271
-
272
- routeMatch.__.elementsPromise = (async () => {
273
- // then run all element and data loaders in parallel
274
- // For each element type, potentially load it asynchronously
275
-
276
- await Promise.all(
277
- elementTypes.map(async (type) => {
278
- const routeElement = routeMatch.options[type]
279
-
280
- if (routeMatch.__[type]) {
281
- return
282
- }
283
-
284
- routeMatch.__[type] = await router.options.createElement!(
285
- routeElement,
286
- )
287
- }),
288
- )
289
- })()
290
-
291
- routeMatch.__.dataPromise = Promise.resolve().then(async () => {
292
- try {
293
- if (routeMatch.options.loader) {
294
- const data = await routeMatch.options.loader({
295
- params: routeMatch.params,
296
- search: routeMatch.routeSearch,
297
- signal: routeMatch.__.abortController.signal,
298
- })
299
- if (id !== routeMatch.__.latestId) {
300
- return routeMatch.__.loaderPromise
301
- }
302
-
303
- routeMatch.routeLoaderData = replaceEqualDeep(
304
- routeMatch.routeLoaderData,
305
- data,
306
- )
307
- }
308
-
309
- routeMatch.error = undefined
310
- routeMatch.status = 'success'
311
- routeMatch.updatedAt = Date.now()
312
- routeMatch.invalidAt =
313
- routeMatch.updatedAt +
314
- (opts?.maxAge ??
315
- routeMatch.options.loaderMaxAge ??
316
- router.options.defaultLoaderMaxAge ??
317
- 0)
318
- } catch (err) {
319
- if (id !== routeMatch.__.latestId) {
320
- return routeMatch.__.loaderPromise
321
- }
322
-
323
- if (process.env.NODE_ENV !== 'production') {
324
- console.error(err)
325
- }
326
- routeMatch.error = err
327
- routeMatch.status = 'error'
328
- routeMatch.updatedAt = Date.now()
329
- }
330
- })
331
-
332
- try {
333
- await Promise.all([
334
- routeMatch.__.elementsPromise,
335
- routeMatch.__.dataPromise,
336
- ])
337
- if (id !== routeMatch.__.latestId) {
338
- return routeMatch.__.loaderPromise
339
- }
340
-
341
- if (routeMatch.__.pendingMinPromise) {
342
- await routeMatch.__.pendingMinPromise
343
- delete routeMatch.__.pendingMinPromise
344
- }
345
- } finally {
346
- if (id !== routeMatch.__.latestId) {
347
- return routeMatch.__.loaderPromise
348
- }
349
- routeMatch.__.cancelPending()
350
- routeMatch.isPending = false
351
- routeMatch.isFetching = false
352
- routeMatch.__.notify()
353
- }
354
- })()
355
-
356
- routeMatch.__.loaderPromise = loaderPromise
357
- await loaderPromise
358
-
359
- if (id !== routeMatch.__.latestId) {
360
- return routeMatch.__.loaderPromise
361
- }
362
- delete routeMatch.__.loaderPromise
363
- })
364
-
365
- return await routeMatch.__.loadPromise
366
- },
367
- }
368
-
369
- if (!routeMatch.hasLoaders()) {
370
- routeMatch.status = 'success'
371
- }
372
-
373
- return routeMatch
374
- }