@tanstack/router-core 0.0.1-beta.14 → 0.0.1-beta.145

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