@tanstack/react-router 1.34.3 → 1.34.6

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 (66) hide show
  1. package/dist/cjs/Matches.cjs.map +1 -1
  2. package/dist/cjs/Matches.d.cts +5 -8
  3. package/dist/cjs/RouterProvider.cjs.map +1 -1
  4. package/dist/cjs/RouterProvider.d.cts +3 -1
  5. package/dist/cjs/Transitioner.cjs +1 -0
  6. package/dist/cjs/Transitioner.cjs.map +1 -1
  7. package/dist/cjs/fileRoute.cjs.map +1 -1
  8. package/dist/cjs/fileRoute.d.cts +2 -2
  9. package/dist/cjs/route.cjs.map +1 -1
  10. package/dist/cjs/route.d.cts +11 -11
  11. package/dist/cjs/routeInfo.d.cts +6 -13
  12. package/dist/cjs/router.cjs +16 -8
  13. package/dist/cjs/router.cjs.map +1 -1
  14. package/dist/cjs/router.d.cts +8 -2
  15. package/dist/cjs/useLoaderData.cjs.map +1 -1
  16. package/dist/cjs/useLoaderData.d.cts +3 -2
  17. package/dist/cjs/useMatch.cjs.map +1 -1
  18. package/dist/cjs/useMatch.d.cts +3 -2
  19. package/dist/cjs/useParams.cjs.map +1 -1
  20. package/dist/cjs/useParams.d.cts +4 -3
  21. package/dist/cjs/useRouteContext.cjs.map +1 -1
  22. package/dist/cjs/useRouteContext.d.cts +5 -4
  23. package/dist/cjs/useSearch.cjs.map +1 -1
  24. package/dist/cjs/useSearch.d.cts +3 -2
  25. package/dist/cjs/utils.cjs.map +1 -1
  26. package/dist/cjs/utils.d.cts +12 -9
  27. package/dist/esm/Matches.d.ts +5 -8
  28. package/dist/esm/Matches.js.map +1 -1
  29. package/dist/esm/RouterProvider.d.ts +3 -1
  30. package/dist/esm/RouterProvider.js.map +1 -1
  31. package/dist/esm/Transitioner.js +1 -0
  32. package/dist/esm/Transitioner.js.map +1 -1
  33. package/dist/esm/fileRoute.d.ts +2 -2
  34. package/dist/esm/fileRoute.js.map +1 -1
  35. package/dist/esm/route.d.ts +11 -11
  36. package/dist/esm/route.js.map +1 -1
  37. package/dist/esm/routeInfo.d.ts +6 -13
  38. package/dist/esm/router.d.ts +8 -2
  39. package/dist/esm/router.js +16 -8
  40. package/dist/esm/router.js.map +1 -1
  41. package/dist/esm/useLoaderData.d.ts +3 -2
  42. package/dist/esm/useLoaderData.js.map +1 -1
  43. package/dist/esm/useMatch.d.ts +3 -2
  44. package/dist/esm/useMatch.js.map +1 -1
  45. package/dist/esm/useParams.d.ts +4 -3
  46. package/dist/esm/useParams.js.map +1 -1
  47. package/dist/esm/useRouteContext.d.ts +5 -4
  48. package/dist/esm/useRouteContext.js.map +1 -1
  49. package/dist/esm/useSearch.d.ts +3 -2
  50. package/dist/esm/useSearch.js.map +1 -1
  51. package/dist/esm/utils.d.ts +12 -9
  52. package/dist/esm/utils.js.map +1 -1
  53. package/package.json +1 -1
  54. package/src/Matches.tsx +21 -27
  55. package/src/RouterProvider.tsx +3 -1
  56. package/src/Transitioner.tsx +1 -6
  57. package/src/fileRoute.ts +1 -1
  58. package/src/route.ts +13 -17
  59. package/src/routeInfo.ts +17 -23
  60. package/src/router.ts +26 -12
  61. package/src/useLoaderData.tsx +18 -9
  62. package/src/useMatch.tsx +12 -7
  63. package/src/useParams.tsx +14 -10
  64. package/src/useRouteContext.ts +16 -6
  65. package/src/useSearch.tsx +15 -10
  66. package/src/utils.ts +40 -18
package/src/useMatch.tsx CHANGED
@@ -8,17 +8,22 @@ import type { MakeRouteMatch } from './Matches'
8
8
  import type { RouteIds } from './routeInfo'
9
9
  import type { StrictOrFrom } from './utils'
10
10
 
11
+ export type UseMatchOptions<
12
+ TFrom,
13
+ TStrict extends boolean,
14
+ TRouteMatch,
15
+ TSelected,
16
+ > = StrictOrFrom<TFrom, TStrict> & {
17
+ select?: (match: TRouteMatch) => TSelected
18
+ }
19
+
11
20
  export function useMatch<
12
21
  TRouteTree extends AnyRoute = RegisteredRouter['routeTree'],
13
22
  TFrom extends RouteIds<TRouteTree> = RouteIds<TRouteTree>,
14
- TReturnIntersection extends boolean = false,
15
- TRouteMatch = MakeRouteMatch<TRouteTree, TFrom, TReturnIntersection>,
23
+ TStrict extends boolean = true,
24
+ TRouteMatch = MakeRouteMatch<TRouteTree, TFrom, TStrict>,
16
25
  TSelected = TRouteMatch,
17
- >(
18
- opts: StrictOrFrom<TFrom, TReturnIntersection> & {
19
- select?: (match: TRouteMatch) => TSelected
20
- },
21
- ): TSelected {
26
+ >(opts: UseMatchOptions<TFrom, TStrict, TRouteMatch, TSelected>): TSelected {
22
27
  const nearestMatchId = React.useContext(matchContext)
23
28
 
24
29
  const matchSelection = useRouterState({
package/src/useParams.tsx CHANGED
@@ -2,22 +2,26 @@ import { useMatch } from './useMatch'
2
2
  import type { AnyRoute } from './route'
3
3
  import type { AllParams, RouteById, RouteIds } from './routeInfo'
4
4
  import type { RegisteredRouter } from './router'
5
- import type { Expand } from './utils'
6
5
  import type { StrictOrFrom } from './utils'
7
6
 
7
+ export type UseParamsOptions<
8
+ TFrom,
9
+ TStrict extends boolean,
10
+ TParams,
11
+ TSelected,
12
+ > = StrictOrFrom<TFrom, TStrict> & {
13
+ select?: (params: TParams) => TSelected
14
+ }
15
+
8
16
  export function useParams<
9
17
  TRouteTree extends AnyRoute = RegisteredRouter['routeTree'],
10
18
  TFrom extends RouteIds<TRouteTree> = RouteIds<TRouteTree>,
11
- TReturnIntersection extends boolean = false,
12
- TParams = TReturnIntersection extends false
13
- ? RouteById<TRouteTree, TFrom>['types']['allParams']
14
- : Expand<Partial<AllParams<TRouteTree>>>,
19
+ TStrict extends boolean = true,
20
+ TParams = TStrict extends false
21
+ ? AllParams<TRouteTree>
22
+ : RouteById<TRouteTree, TFrom>['types']['allParams'],
15
23
  TSelected = TParams,
16
- >(
17
- opts: StrictOrFrom<TFrom, TReturnIntersection> & {
18
- select?: (params: TParams) => TSelected
19
- },
20
- ): TSelected {
24
+ >(opts: UseParamsOptions<TFrom, TStrict, TParams, TSelected>): TSelected {
21
25
  return useMatch({
22
26
  ...opts,
23
27
  select: (match) => {
@@ -1,19 +1,29 @@
1
1
  import { useMatch } from './useMatch'
2
2
  import type { MakeRouteMatch } from './Matches'
3
3
  import type { AnyRoute } from './route'
4
- import type { RouteById, RouteIds } from './routeInfo'
4
+ import type { AllContext, RouteById, RouteIds } from './routeInfo'
5
5
  import type { RegisteredRouter } from './router'
6
- import type { StrictOrFrom } from './utils'
6
+ import type { Expand, StrictOrFrom } from './utils'
7
+
8
+ export type UseRouteContextOptions<
9
+ TFrom,
10
+ TStrict extends boolean,
11
+ TRouteContext,
12
+ TSelected,
13
+ > = StrictOrFrom<TFrom, TStrict> & {
14
+ select?: (search: TRouteContext) => TSelected
15
+ }
7
16
 
8
17
  export function useRouteContext<
9
18
  TRouteTree extends AnyRoute = RegisteredRouter['routeTree'],
10
19
  TFrom extends RouteIds<TRouteTree> = RouteIds<TRouteTree>,
11
- TRouteContext = RouteById<TRouteTree, TFrom>['types']['allContext'],
20
+ TStrict extends boolean = true,
21
+ TRouteContext = TStrict extends false
22
+ ? AllContext<TRouteTree>
23
+ : Expand<RouteById<TRouteTree, TFrom>['types']['allContext']>,
12
24
  TSelected = TRouteContext,
13
25
  >(
14
- opts: StrictOrFrom<TFrom> & {
15
- select?: (search: TRouteContext) => TSelected
16
- },
26
+ opts: UseRouteContextOptions<TFrom, TStrict, TRouteContext, TSelected>,
17
27
  ): TSelected {
18
28
  return useMatch({
19
29
  ...(opts as any),
package/src/useSearch.tsx CHANGED
@@ -5,22 +5,27 @@ import type { RegisteredRouter } from './router'
5
5
  import type { MakeRouteMatch } from './Matches'
6
6
  import type { StrictOrFrom } from './utils'
7
7
 
8
+ export type UseSearchOptions<
9
+ TFrom,
10
+ TStrict extends boolean,
11
+ TSearch,
12
+ TSelected,
13
+ > = StrictOrFrom<TFrom, TStrict> & {
14
+ select?: (search: TSearch) => TSelected
15
+ }
16
+
8
17
  export function useSearch<
9
18
  TRouteTree extends AnyRoute = RegisteredRouter['routeTree'],
10
19
  TFrom extends RouteIds<TRouteTree> = RouteIds<TRouteTree>,
11
- TReturnIntersection extends boolean = false,
12
- TSearch = TReturnIntersection extends false
13
- ? Exclude<
20
+ TStrict extends boolean = true,
21
+ TSearch = TStrict extends false
22
+ ? FullSearchSchema<TRouteTree>
23
+ : Exclude<
14
24
  RouteById<TRouteTree, TFrom>['types']['fullSearchSchema'],
15
25
  RootSearchSchema
16
- >
17
- : Partial<Omit<FullSearchSchema<TRouteTree>, keyof RootSearchSchema>>,
26
+ >,
18
27
  TSelected = TSearch,
19
- >(
20
- opts: StrictOrFrom<TFrom, TReturnIntersection> & {
21
- select?: (search: TSearch) => TSelected
22
- },
23
- ): TSelected {
28
+ >(opts: UseSearchOptions<TFrom, TStrict, TSearch, TSelected>): TSelected {
24
29
  return useMatch({
25
30
  ...opts,
26
31
  select: (match: MakeRouteMatch<TRouteTree, TFrom>) => {
package/src/utils.ts CHANGED
@@ -69,18 +69,38 @@ export type NonNullableUpdater<TPrevious, TResult = TPrevious> =
69
69
  | TResult
70
70
  | ((prev: TPrevious) => TResult)
71
71
 
72
- // from https://github.com/type-challenges/type-challenges/issues/737
73
- type LastInUnion<T> =
74
- UnionToIntersection<T extends unknown ? (x: T) => 0 : never> extends (
75
- x: infer L,
76
- ) => 0
77
- ? L
72
+ export type MergeUnionObjects<TUnion> = TUnion extends MergeUnionPrimitive
73
+ ? never
74
+ : TUnion
75
+
76
+ export type MergeUnionObject<TUnion> =
77
+ MergeUnionObjects<TUnion> extends infer TObj
78
+ ? {
79
+ [TKey in TObj extends any ? keyof TObj : never]?: TObj extends any
80
+ ? TKey extends keyof TObj
81
+ ? TObj[TKey]
82
+ : never
83
+ : never
84
+ }
78
85
  : never
79
- export type UnionToTuple<T, TLast = LastInUnion<T>> = [T] extends [never]
80
- ? []
81
- : [...UnionToTuple<Exclude<T, TLast>>, TLast]
82
86
 
83
- //
87
+ export type MergeUnionPrimitive =
88
+ | ReadonlyArray<any>
89
+ | number
90
+ | string
91
+ | bigint
92
+ | boolean
93
+ | symbol
94
+
95
+ export type MergeUnionPrimitives<TUnion> = TUnion extends MergeUnionPrimitive
96
+ ? TUnion
97
+ : TUnion extends object
98
+ ? never
99
+ : TUnion
100
+
101
+ export type MergeUnion<TUnion> =
102
+ | MergeUnionPrimitives<TUnion>
103
+ | MergeUnionObject<MergeUnionObjects<TUnion>>
84
104
 
85
105
  export function last<T>(arr: Array<T>) {
86
106
  return arr[arr.length - 1]
@@ -268,15 +288,17 @@ export type StringLiteral<T> = T extends string
268
288
  : T
269
289
  : never
270
290
 
271
- export type StrictOrFrom<TFrom, TReturnIntersection extends boolean = false> =
272
- | {
273
- from: StringLiteral<TFrom> | TFrom
274
- strict?: true
275
- }
276
- | {
291
+ export type StrictOrFrom<
292
+ TFrom,
293
+ TStrict extends boolean = true,
294
+ > = TStrict extends false
295
+ ? {
277
296
  from?: never
278
- strict: false
279
- experimental_returnIntersection?: TReturnIntersection
297
+ strict: TStrict
298
+ }
299
+ : {
300
+ from: StringLiteral<TFrom> | TFrom
301
+ strict?: TStrict
280
302
  }
281
303
 
282
304
  export const useLayoutEffect =