@tanstack/react-router 1.69.0 → 1.70.0
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/dist/cjs/Matches.cjs.map +1 -1
- package/dist/cjs/Matches.d.cts +0 -1
- package/dist/cjs/Transitioner.cjs +2 -1
- package/dist/cjs/Transitioner.cjs.map +1 -1
- package/dist/cjs/fileRoute.cjs +1 -5
- package/dist/cjs/fileRoute.cjs.map +1 -1
- package/dist/cjs/route.cjs.map +1 -1
- package/dist/cjs/route.d.cts +1 -0
- package/dist/cjs/router.cjs +43 -25
- package/dist/cjs/router.cjs.map +1 -1
- package/dist/cjs/router.d.cts +13 -2
- package/dist/esm/Matches.d.ts +0 -1
- package/dist/esm/Matches.js.map +1 -1
- package/dist/esm/Transitioner.js +2 -1
- package/dist/esm/Transitioner.js.map +1 -1
- package/dist/esm/fileRoute.js +1 -5
- package/dist/esm/fileRoute.js.map +1 -1
- package/dist/esm/route.d.ts +1 -0
- package/dist/esm/route.js.map +1 -1
- package/dist/esm/router.d.ts +13 -2
- package/dist/esm/router.js +43 -25
- package/dist/esm/router.js.map +1 -1
- package/package.json +2 -2
- package/src/Matches.tsx +0 -1
- package/src/Transitioner.tsx +1 -0
- package/src/fileRoute.ts +1 -8
- package/src/route.ts +1 -0
- package/src/router.ts +58 -32
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@tanstack/react-router",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.70.0",
|
|
4
4
|
"description": "Modern and scalable routing for React applications",
|
|
5
5
|
"author": "Tanner Linsley",
|
|
6
6
|
"license": "MIT",
|
|
@@ -66,7 +66,7 @@
|
|
|
66
66
|
"peerDependencies": {
|
|
67
67
|
"react": ">=18",
|
|
68
68
|
"react-dom": ">=18",
|
|
69
|
-
"@tanstack/router-generator": "1.
|
|
69
|
+
"@tanstack/router-generator": "1.69.1"
|
|
70
70
|
},
|
|
71
71
|
"peerDependenciesMeta": {
|
|
72
72
|
"@tanstack/router-generator": {
|
package/src/Matches.tsx
CHANGED
|
@@ -142,7 +142,6 @@ export interface RouteMatch<
|
|
|
142
142
|
paramsError: unknown
|
|
143
143
|
searchError: unknown
|
|
144
144
|
updatedAt: number
|
|
145
|
-
componentsPromise?: Promise<Array<void>>
|
|
146
145
|
loadPromise?: ControlledPromise<void>
|
|
147
146
|
beforeLoadPromise?: ControlledPromise<void>
|
|
148
147
|
loaderPromise?: ControlledPromise<void>
|
package/src/Transitioner.tsx
CHANGED
package/src/fileRoute.ts
CHANGED
|
@@ -265,16 +265,9 @@ export function createLazyRoute<
|
|
|
265
265
|
}
|
|
266
266
|
}
|
|
267
267
|
|
|
268
|
-
const routeGroupPatternRegex = /\(.+\)/g
|
|
269
|
-
|
|
270
|
-
function removeGroups(s: string) {
|
|
271
|
-
return s.replaceAll(routeGroupPatternRegex, '').replaceAll('//', '/')
|
|
272
|
-
}
|
|
273
|
-
|
|
274
268
|
export function createLazyFileRoute<
|
|
275
269
|
TFilePath extends keyof FileRoutesByPath,
|
|
276
270
|
TRoute extends FileRoutesByPath[TFilePath]['preLoaderRoute'],
|
|
277
271
|
>(id: TFilePath) {
|
|
278
|
-
return (opts: LazyRouteOptions) =>
|
|
279
|
-
new LazyRoute<TRoute>({ id: removeGroups(id), ...opts })
|
|
272
|
+
return (opts: LazyRouteOptions) => new LazyRoute<TRoute>({ id, ...opts })
|
|
280
273
|
}
|
package/src/route.ts
CHANGED
package/src/router.ts
CHANGED
|
@@ -447,11 +447,21 @@ export interface RouterOptions<
|
|
|
447
447
|
* While usually automatic, sometimes it can be useful to force the router into a server-side state, e.g. when using the router in a non-browser environment that has access to a global.document object.
|
|
448
448
|
*
|
|
449
449
|
* @default typeof document !== 'undefined'
|
|
450
|
-
* @link [API Docs](https://tanstack.com/router/latest/docs/framework/react/api/router/RouterOptionsType#isserver
|
|
450
|
+
* @link [API Docs](https://tanstack.com/router/latest/docs/framework/react/api/router/RouterOptionsType#isserver-property)
|
|
451
451
|
*/
|
|
452
452
|
isServer?: boolean
|
|
453
453
|
|
|
454
454
|
defaultSsr?: boolean
|
|
455
|
+
|
|
456
|
+
search?: {
|
|
457
|
+
/**
|
|
458
|
+
* Configures how unknown search params (= not returned by any `validateSearch`) are treated.
|
|
459
|
+
*
|
|
460
|
+
* @default false
|
|
461
|
+
* @link [API Docs](https://tanstack.com/router/latest/docs/framework/react/api/router/RouterOptionsType#search.strict-property)
|
|
462
|
+
*/
|
|
463
|
+
strict?: boolean
|
|
464
|
+
}
|
|
455
465
|
}
|
|
456
466
|
|
|
457
467
|
export interface RouterErrorSerializer<TSerializedError> {
|
|
@@ -1511,6 +1521,7 @@ export class Router<
|
|
|
1511
1521
|
let search = applyMiddlewares()
|
|
1512
1522
|
|
|
1513
1523
|
if (opts._includeValidateSearch) {
|
|
1524
|
+
let validatedSearch = this.options.search?.strict ? {} : search
|
|
1514
1525
|
matchedRoutesResult?.matchedRoutes.forEach((route) => {
|
|
1515
1526
|
try {
|
|
1516
1527
|
if (route.options.validateSearch) {
|
|
@@ -1518,12 +1529,16 @@ export class Router<
|
|
|
1518
1529
|
typeof route.options.validateSearch === 'object'
|
|
1519
1530
|
? route.options.validateSearch.parse
|
|
1520
1531
|
: route.options.validateSearch
|
|
1521
|
-
|
|
1532
|
+
validatedSearch = {
|
|
1533
|
+
...validatedSearch,
|
|
1534
|
+
...validator({ ...validatedSearch, ...search }),
|
|
1535
|
+
}
|
|
1522
1536
|
}
|
|
1523
1537
|
} catch (e) {
|
|
1524
1538
|
// ignore errors here because they are already handled in matchRoutes
|
|
1525
1539
|
}
|
|
1526
1540
|
})
|
|
1541
|
+
search = validatedSearch
|
|
1527
1542
|
}
|
|
1528
1543
|
search = replaceEqualDeep(fromSearch, search)
|
|
1529
1544
|
const searchStr = this.options.stringifySearch(search)
|
|
@@ -2336,37 +2351,41 @@ export class Router<
|
|
|
2336
2351
|
|
|
2337
2352
|
// Actually run the loader and handle the result
|
|
2338
2353
|
try {
|
|
2339
|
-
route._lazyPromise
|
|
2340
|
-
route.
|
|
2341
|
-
|
|
2342
|
-
|
|
2343
|
-
|
|
2354
|
+
if (route._lazyPromise === undefined) {
|
|
2355
|
+
if (route.lazyFn) {
|
|
2356
|
+
route._lazyPromise = route
|
|
2357
|
+
.lazyFn()
|
|
2358
|
+
.then((lazyRoute) => {
|
|
2359
|
+
// explicitly don't copy over the lazy route's id
|
|
2360
|
+
const { id: _id, ...options } =
|
|
2361
|
+
lazyRoute.options
|
|
2344
2362
|
Object.assign(route.options, options)
|
|
2345
2363
|
})
|
|
2346
|
-
|
|
2364
|
+
} else {
|
|
2365
|
+
route._lazyPromise = Promise.resolve()
|
|
2366
|
+
}
|
|
2367
|
+
}
|
|
2347
2368
|
|
|
2348
2369
|
// If for some reason lazy resolves more lazy components...
|
|
2349
2370
|
// We'll wait for that before pre attempt to preload any
|
|
2350
2371
|
// components themselves.
|
|
2351
|
-
|
|
2352
|
-
|
|
2353
|
-
|
|
2354
|
-
|
|
2355
|
-
|
|
2356
|
-
|
|
2357
|
-
|
|
2358
|
-
|
|
2359
|
-
|
|
2360
|
-
}
|
|
2361
|
-
|
|
2362
|
-
),
|
|
2372
|
+
if (route._componentsPromise === undefined) {
|
|
2373
|
+
route._componentsPromise = route._lazyPromise.then(
|
|
2374
|
+
() =>
|
|
2375
|
+
Promise.all(
|
|
2376
|
+
componentTypes.map(async (type) => {
|
|
2377
|
+
const component = route.options[type]
|
|
2378
|
+
if ((component as any)?.preload) {
|
|
2379
|
+
await (component as any).preload()
|
|
2380
|
+
}
|
|
2381
|
+
}),
|
|
2382
|
+
),
|
|
2363
2383
|
)
|
|
2384
|
+
}
|
|
2364
2385
|
|
|
2365
|
-
// Otherwise, load the route
|
|
2366
2386
|
updateMatch(matchId, (prev) => ({
|
|
2367
2387
|
...prev,
|
|
2368
2388
|
isFetching: 'loader',
|
|
2369
|
-
componentsPromise,
|
|
2370
2389
|
}))
|
|
2371
2390
|
|
|
2372
2391
|
// Kick off the loader!
|
|
@@ -2442,9 +2461,9 @@ export class Router<
|
|
|
2442
2461
|
}))
|
|
2443
2462
|
}
|
|
2444
2463
|
|
|
2445
|
-
// Last but not least, wait for the the
|
|
2464
|
+
// Last but not least, wait for the the components
|
|
2446
2465
|
// to be preloaded before we resolve the match
|
|
2447
|
-
await
|
|
2466
|
+
await route._componentsPromise
|
|
2448
2467
|
} catch (err) {
|
|
2449
2468
|
handleRedirectAndNotFound(this.getMatch(matchId)!, err)
|
|
2450
2469
|
}
|
|
@@ -2505,14 +2524,21 @@ export class Router<
|
|
|
2505
2524
|
return matches
|
|
2506
2525
|
}
|
|
2507
2526
|
|
|
2508
|
-
invalidate = (
|
|
2509
|
-
|
|
2510
|
-
|
|
2511
|
-
|
|
2512
|
-
|
|
2513
|
-
|
|
2514
|
-
|
|
2515
|
-
|
|
2527
|
+
invalidate = (opts?: {
|
|
2528
|
+
filter?: (d: MakeRouteMatch<TRouteTree>) => boolean
|
|
2529
|
+
}) => {
|
|
2530
|
+
const invalidate = (d: MakeRouteMatch<TRouteTree>) => {
|
|
2531
|
+
if (opts?.filter?.(d) ?? true) {
|
|
2532
|
+
return {
|
|
2533
|
+
...d,
|
|
2534
|
+
invalid: true,
|
|
2535
|
+
...(d.status === 'error'
|
|
2536
|
+
? ({ status: 'pending', error: undefined } as const)
|
|
2537
|
+
: {}),
|
|
2538
|
+
}
|
|
2539
|
+
}
|
|
2540
|
+
return d
|
|
2541
|
+
}
|
|
2516
2542
|
|
|
2517
2543
|
this.__store.setState((s) => ({
|
|
2518
2544
|
...s,
|