@tanstack/router-core 0.0.1-beta.15 → 0.0.1-beta.151

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 (64) hide show
  1. package/LICENSE +21 -0
  2. package/build/cjs/fileRoute.js +29 -0
  3. package/build/cjs/fileRoute.js.map +1 -0
  4. package/build/cjs/history.js +226 -0
  5. package/build/cjs/history.js.map +1 -0
  6. package/build/cjs/index.js +78 -0
  7. package/build/cjs/{packages/router-core/src/index.js.map → index.js.map} +1 -1
  8. package/build/cjs/{packages/router-core/src/path.js → path.js} +45 -56
  9. package/build/cjs/path.js.map +1 -0
  10. package/build/cjs/{packages/router-core/src/qss.js → qss.js} +10 -16
  11. package/build/cjs/qss.js.map +1 -0
  12. package/build/cjs/route.js +103 -0
  13. package/build/cjs/route.js.map +1 -0
  14. package/build/cjs/router.js +1113 -0
  15. package/build/cjs/router.js.map +1 -0
  16. package/build/cjs/{packages/router-core/src/searchParams.js → searchParams.js} +11 -13
  17. package/build/cjs/searchParams.js.map +1 -0
  18. package/build/cjs/{packages/router-core/src/utils.js → utils.js} +54 -64
  19. package/build/cjs/utils.js.map +1 -0
  20. package/build/esm/index.js +1417 -2105
  21. package/build/esm/index.js.map +1 -1
  22. package/build/stats-html.html +59 -49
  23. package/build/stats-react.json +203 -234
  24. package/build/types/index.d.ts +604 -426
  25. package/build/umd/index.development.js +1640 -2224
  26. package/build/umd/index.development.js.map +1 -1
  27. package/build/umd/index.production.js +13 -2
  28. package/build/umd/index.production.js.map +1 -1
  29. package/package.json +11 -7
  30. package/src/fileRoute.ts +120 -0
  31. package/src/history.ts +292 -0
  32. package/src/index.ts +3 -10
  33. package/src/link.ts +118 -113
  34. package/src/path.ts +37 -17
  35. package/src/qss.ts +1 -2
  36. package/src/route.ts +891 -218
  37. package/src/routeInfo.ts +121 -204
  38. package/src/router.ts +1494 -1017
  39. package/src/searchParams.ts +1 -1
  40. package/src/utils.ts +80 -49
  41. package/build/cjs/_virtual/_rollupPluginBabelHelpers.js +0 -33
  42. package/build/cjs/_virtual/_rollupPluginBabelHelpers.js.map +0 -1
  43. package/build/cjs/node_modules/@babel/runtime/helpers/esm/extends.js +0 -33
  44. package/build/cjs/node_modules/@babel/runtime/helpers/esm/extends.js.map +0 -1
  45. package/build/cjs/node_modules/history/index.js +0 -815
  46. package/build/cjs/node_modules/history/index.js.map +0 -1
  47. package/build/cjs/node_modules/tiny-invariant/dist/esm/tiny-invariant.js +0 -30
  48. package/build/cjs/node_modules/tiny-invariant/dist/esm/tiny-invariant.js.map +0 -1
  49. package/build/cjs/packages/router-core/src/index.js +0 -58
  50. package/build/cjs/packages/router-core/src/path.js.map +0 -1
  51. package/build/cjs/packages/router-core/src/qss.js.map +0 -1
  52. package/build/cjs/packages/router-core/src/route.js +0 -147
  53. package/build/cjs/packages/router-core/src/route.js.map +0 -1
  54. package/build/cjs/packages/router-core/src/routeConfig.js +0 -69
  55. package/build/cjs/packages/router-core/src/routeConfig.js.map +0 -1
  56. package/build/cjs/packages/router-core/src/routeMatch.js +0 -231
  57. package/build/cjs/packages/router-core/src/routeMatch.js.map +0 -1
  58. package/build/cjs/packages/router-core/src/router.js +0 -833
  59. package/build/cjs/packages/router-core/src/router.js.map +0 -1
  60. package/build/cjs/packages/router-core/src/searchParams.js.map +0 -1
  61. package/build/cjs/packages/router-core/src/utils.js.map +0 -1
  62. package/src/frameworks.ts +0 -11
  63. package/src/routeConfig.ts +0 -514
  64. package/src/routeMatch.ts +0 -319
package/src/routeMatch.ts DELETED
@@ -1,319 +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 { ActionState, Router } from './router'
10
- import { replaceEqualDeep, Timeout } 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 id = '' + Date.now() + Math.random()
205
- routeMatch.__.latestId = id
206
-
207
- // If the match was in an error state, set it
208
- // to a loading state again. Otherwise, keep it
209
- // as loading or resolved
210
- if (routeMatch.status === 'idle') {
211
- routeMatch.status = 'loading'
212
- }
213
-
214
- // We started loading the route, so it's no longer invalid
215
- routeMatch.isInvalid = false
216
-
217
- routeMatch.__.loadPromise = new Promise(async (resolve) => {
218
- // We are now fetching, even if it's in the background of a
219
- // resolved state
220
- routeMatch.isFetching = true
221
- routeMatch.__.resolve = resolve as () => void
222
-
223
- routeMatch.__.componentsPromise = (async () => {
224
- // then run all component and data loaders in parallel
225
- // For each component type, potentially load it asynchronously
226
-
227
- await Promise.all(
228
- componentTypes.map(async (type) => {
229
- const component = routeMatch.options[type]
230
-
231
- if (routeMatch.__[type]?.preload) {
232
- routeMatch.__[type] = await router.options.loadComponent!(
233
- component,
234
- )
235
- }
236
- }),
237
- )
238
- })()
239
-
240
- routeMatch.__.dataPromise = Promise.resolve().then(async () => {
241
- try {
242
- if (routeMatch.options.loader) {
243
- const data = await routeMatch.options.loader({
244
- parentLoaderPromise: routeMatch.parentMatch?.__.dataPromise,
245
- params: routeMatch.params,
246
- search: routeMatch.routeSearch,
247
- signal: routeMatch.__.abortController.signal,
248
- })
249
- if (id !== routeMatch.__.latestId) {
250
- return routeMatch.__.loadPromise
251
- }
252
-
253
- routeMatch.routeLoaderData = replaceEqualDeep(
254
- routeMatch.routeLoaderData,
255
- data,
256
- )
257
- }
258
-
259
- routeMatch.error = undefined
260
- routeMatch.status = 'success'
261
- routeMatch.updatedAt = Date.now()
262
- routeMatch.invalidAt =
263
- routeMatch.updatedAt +
264
- (opts?.maxAge ??
265
- routeMatch.options.loaderMaxAge ??
266
- router.options.defaultLoaderMaxAge ??
267
- 0)
268
-
269
- return routeMatch.routeLoaderData
270
- } catch (err) {
271
- if (id !== routeMatch.__.latestId) {
272
- return routeMatch.__.loadPromise
273
- }
274
-
275
- if (process.env.NODE_ENV !== 'production') {
276
- console.error(err)
277
- }
278
-
279
- routeMatch.error = err
280
- routeMatch.status = 'error'
281
- routeMatch.updatedAt = Date.now()
282
-
283
- throw err
284
- }
285
- })
286
-
287
- try {
288
- await Promise.all([
289
- routeMatch.__.componentsPromise,
290
- routeMatch.__.dataPromise.catch(() => {}),
291
- ])
292
- if (id !== routeMatch.__.latestId) {
293
- return routeMatch.__.loadPromise
294
- }
295
- } finally {
296
- if (id !== routeMatch.__.latestId) {
297
- return routeMatch.__.loadPromise
298
- }
299
- routeMatch.isFetching = false
300
- routeMatch.__.notify()
301
- }
302
- })
303
-
304
- await routeMatch.__.loadPromise
305
-
306
- if (id !== routeMatch.__.latestId) {
307
- return routeMatch.__.loadPromise
308
- }
309
-
310
- delete routeMatch.__.loadPromise
311
- },
312
- }
313
-
314
- if (!routeMatch.hasLoaders()) {
315
- routeMatch.status = 'success'
316
- }
317
-
318
- return routeMatch
319
- }