@tanstack/react-router 1.79.0 → 1.81.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/Match.cjs +10 -11
- package/dist/cjs/Match.cjs.map +1 -1
- package/dist/cjs/Matches.cjs +8 -4
- package/dist/cjs/Matches.cjs.map +1 -1
- package/dist/cjs/Matches.d.cts +8 -9
- package/dist/cjs/RouterProvider.cjs.map +1 -1
- package/dist/cjs/RouterProvider.d.cts +3 -3
- package/dist/cjs/Transitioner.cjs +9 -8
- package/dist/cjs/Transitioner.cjs.map +1 -1
- package/dist/cjs/fileRoute.cjs +15 -3
- package/dist/cjs/fileRoute.cjs.map +1 -1
- package/dist/cjs/fileRoute.d.cts +12 -19
- package/dist/cjs/link.cjs +4 -1
- package/dist/cjs/link.cjs.map +1 -1
- package/dist/cjs/link.d.cts +1 -1
- package/dist/cjs/route.cjs +33 -9
- package/dist/cjs/route.cjs.map +1 -1
- package/dist/cjs/route.d.cts +20 -38
- package/dist/cjs/router.cjs +1 -0
- package/dist/cjs/router.cjs.map +1 -1
- package/dist/cjs/router.d.cts +17 -11
- package/dist/cjs/routerContext.cjs.map +1 -1
- package/dist/cjs/routerContext.d.cts +1 -1
- package/dist/cjs/structuralSharing.d.cts +12 -0
- package/dist/cjs/useLoaderData.cjs +4 -2
- package/dist/cjs/useLoaderData.cjs.map +1 -1
- package/dist/cjs/useLoaderData.d.cts +12 -9
- package/dist/cjs/useLoaderDeps.cjs +3 -2
- package/dist/cjs/useLoaderDeps.cjs.map +1 -1
- package/dist/cjs/useLoaderDeps.d.cts +12 -8
- package/dist/cjs/useLocation.cjs.map +1 -1
- package/dist/cjs/useLocation.d.cts +6 -3
- package/dist/cjs/useMatch.cjs +2 -1
- package/dist/cjs/useMatch.cjs.map +1 -1
- package/dist/cjs/useMatch.d.cts +10 -8
- package/dist/cjs/useParams.cjs +3 -1
- package/dist/cjs/useParams.cjs.map +1 -1
- package/dist/cjs/useParams.d.cts +12 -8
- package/dist/cjs/useRouteContext.cjs.map +1 -1
- package/dist/cjs/useRouteContext.d.cts +11 -8
- package/dist/cjs/useRouterState.cjs +18 -1
- package/dist/cjs/useRouterState.cjs.map +1 -1
- package/dist/cjs/useRouterState.d.cts +6 -3
- package/dist/cjs/useSearch.cjs +3 -1
- package/dist/cjs/useSearch.cjs.map +1 -1
- package/dist/cjs/useSearch.d.cts +12 -8
- package/dist/cjs/utils.cjs.map +1 -1
- package/dist/cjs/utils.d.cts +10 -4
- package/dist/esm/Match.js +10 -11
- package/dist/esm/Match.js.map +1 -1
- package/dist/esm/Matches.d.ts +8 -9
- package/dist/esm/Matches.js +8 -4
- package/dist/esm/Matches.js.map +1 -1
- package/dist/esm/RouterProvider.d.ts +3 -3
- package/dist/esm/RouterProvider.js.map +1 -1
- package/dist/esm/Transitioner.js +10 -9
- package/dist/esm/Transitioner.js.map +1 -1
- package/dist/esm/fileRoute.d.ts +12 -19
- package/dist/esm/fileRoute.js +15 -3
- package/dist/esm/fileRoute.js.map +1 -1
- package/dist/esm/link.d.ts +1 -1
- package/dist/esm/link.js +4 -1
- package/dist/esm/link.js.map +1 -1
- package/dist/esm/route.d.ts +20 -38
- package/dist/esm/route.js +33 -9
- package/dist/esm/route.js.map +1 -1
- package/dist/esm/router.d.ts +17 -11
- package/dist/esm/router.js +1 -0
- package/dist/esm/router.js.map +1 -1
- package/dist/esm/routerContext.d.ts +1 -1
- package/dist/esm/routerContext.js.map +1 -1
- package/dist/esm/structuralSharing.d.ts +12 -0
- package/dist/esm/useLoaderData.d.ts +12 -9
- package/dist/esm/useLoaderData.js +4 -2
- package/dist/esm/useLoaderData.js.map +1 -1
- package/dist/esm/useLoaderDeps.d.ts +12 -8
- package/dist/esm/useLoaderDeps.js +3 -2
- package/dist/esm/useLoaderDeps.js.map +1 -1
- package/dist/esm/useLocation.d.ts +6 -3
- package/dist/esm/useLocation.js.map +1 -1
- package/dist/esm/useMatch.d.ts +10 -8
- package/dist/esm/useMatch.js +2 -1
- package/dist/esm/useMatch.js.map +1 -1
- package/dist/esm/useParams.d.ts +12 -8
- package/dist/esm/useParams.js +3 -1
- package/dist/esm/useParams.js.map +1 -1
- package/dist/esm/useRouteContext.d.ts +11 -8
- package/dist/esm/useRouteContext.js.map +1 -1
- package/dist/esm/useRouterState.d.ts +6 -3
- package/dist/esm/useRouterState.js +18 -1
- package/dist/esm/useRouterState.js.map +1 -1
- package/dist/esm/useSearch.d.ts +12 -8
- package/dist/esm/useSearch.js +3 -1
- package/dist/esm/useSearch.js.map +1 -1
- package/dist/esm/utils.d.ts +10 -4
- package/dist/esm/utils.js.map +1 -1
- package/package.json +1 -1
- package/src/Match.tsx +6 -7
- package/src/Matches.tsx +52 -24
- package/src/RouterProvider.tsx +4 -1
- package/src/Transitioner.tsx +9 -10
- package/src/fileRoute.ts +29 -29
- package/src/link.tsx +6 -3
- package/src/route.ts +57 -101
- package/src/router.ts +37 -4
- package/src/routerContext.tsx +1 -1
- package/src/structuralSharing.ts +49 -0
- package/src/useLoaderData.tsx +76 -28
- package/src/useLoaderDeps.tsx +55 -20
- package/src/useLocation.tsx +30 -8
- package/src/useMatch.tsx +71 -21
- package/src/useParams.tsx +70 -21
- package/src/useRouteContext.ts +45 -23
- package/src/useRouterState.tsx +45 -6
- package/src/useSearch.tsx +69 -20
- package/src/utils.ts +16 -3
package/src/useParams.tsx
CHANGED
|
@@ -1,38 +1,87 @@
|
|
|
1
1
|
import { useMatch } from './useMatch'
|
|
2
|
-
import type {
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
2
|
+
import type {
|
|
3
|
+
StructuralSharingOption,
|
|
4
|
+
ValidateSelected,
|
|
5
|
+
} from './structuralSharing'
|
|
6
|
+
import type { AllParams, RouteById } from './routeInfo'
|
|
7
|
+
import type { AnyRouter, RegisteredRouter } from './router'
|
|
8
|
+
import type { Expand, StrictOrFrom } from './utils'
|
|
6
9
|
|
|
7
|
-
export
|
|
10
|
+
export interface UseParamsBaseOptions<
|
|
11
|
+
TRouter extends AnyRouter,
|
|
8
12
|
TFrom,
|
|
9
13
|
TStrict extends boolean,
|
|
10
|
-
TParams,
|
|
11
14
|
TSelected,
|
|
12
|
-
|
|
13
|
-
|
|
15
|
+
TStructuralSharing,
|
|
16
|
+
> {
|
|
17
|
+
select?: (
|
|
18
|
+
params: ResolveParams<TRouter, TFrom, TStrict>,
|
|
19
|
+
) => ValidateSelected<TRouter, TSelected, TStructuralSharing>
|
|
14
20
|
}
|
|
15
21
|
|
|
22
|
+
export type UseParamsOptions<
|
|
23
|
+
TRouter extends AnyRouter,
|
|
24
|
+
TFrom extends string | undefined,
|
|
25
|
+
TStrict extends boolean,
|
|
26
|
+
TSelected,
|
|
27
|
+
TStructuralSharing,
|
|
28
|
+
> = StrictOrFrom<TRouter, TFrom, TStrict> &
|
|
29
|
+
UseParamsBaseOptions<TRouter, TFrom, TStrict, TSelected, TStructuralSharing> &
|
|
30
|
+
StructuralSharingOption<TRouter, TSelected, TStructuralSharing>
|
|
31
|
+
|
|
32
|
+
export type ResolveParams<
|
|
33
|
+
TRouter extends AnyRouter,
|
|
34
|
+
TFrom,
|
|
35
|
+
TStrict extends boolean,
|
|
36
|
+
> = TStrict extends false
|
|
37
|
+
? AllParams<TRouter['routeTree']>
|
|
38
|
+
: Expand<RouteById<TRouter['routeTree'], TFrom>['types']['allParams']>
|
|
39
|
+
|
|
40
|
+
export type UseParamsResult<
|
|
41
|
+
TRouter extends AnyRouter,
|
|
42
|
+
TFrom,
|
|
43
|
+
TStrict extends boolean,
|
|
44
|
+
TSelected,
|
|
45
|
+
> = unknown extends TSelected
|
|
46
|
+
? ResolveParams<TRouter, TFrom, TStrict>
|
|
47
|
+
: TSelected
|
|
48
|
+
|
|
49
|
+
export type UseParamsRoute<out TFrom> = <
|
|
50
|
+
TRouter extends AnyRouter = RegisteredRouter,
|
|
51
|
+
TSelected = unknown,
|
|
52
|
+
TStructuralSharing extends boolean = boolean,
|
|
53
|
+
>(
|
|
54
|
+
opts?: UseParamsBaseOptions<
|
|
55
|
+
TRouter,
|
|
56
|
+
TFrom,
|
|
57
|
+
true,
|
|
58
|
+
TSelected,
|
|
59
|
+
TStructuralSharing
|
|
60
|
+
> &
|
|
61
|
+
StructuralSharingOption<TRouter, TSelected, TStructuralSharing>,
|
|
62
|
+
) => UseParamsResult<TRouter, TFrom, true, TSelected>
|
|
63
|
+
|
|
16
64
|
export function useParams<
|
|
17
|
-
|
|
65
|
+
TRouter extends AnyRouter = RegisteredRouter,
|
|
18
66
|
TFrom extends string | undefined = undefined,
|
|
19
67
|
TStrict extends boolean = true,
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
: RouteById<TRouteTree, TFrom>['types']['allParams'],
|
|
23
|
-
TSelected = TParams,
|
|
68
|
+
TSelected = unknown,
|
|
69
|
+
TStructuralSharing extends boolean = boolean,
|
|
24
70
|
>(
|
|
25
71
|
opts: UseParamsOptions<
|
|
26
|
-
|
|
72
|
+
TRouter,
|
|
73
|
+
TFrom,
|
|
27
74
|
TStrict,
|
|
28
|
-
|
|
29
|
-
|
|
75
|
+
TSelected,
|
|
76
|
+
TStructuralSharing
|
|
30
77
|
>,
|
|
31
|
-
): TSelected {
|
|
78
|
+
): UseParamsResult<TRouter, TFrom, TStrict, TSelected> {
|
|
32
79
|
return useMatch({
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
80
|
+
from: opts.from!,
|
|
81
|
+
strict: opts.strict,
|
|
82
|
+
structuralSharing: opts.structuralSharing,
|
|
83
|
+
select: (match: any) => {
|
|
84
|
+
return opts.select ? opts.select(match.params) : match.params
|
|
36
85
|
},
|
|
37
|
-
}) as TSelected
|
|
86
|
+
} as any) as UseParamsResult<TRouter, TFrom, TStrict, TSelected>
|
|
38
87
|
}
|
package/src/useRouteContext.ts
CHANGED
|
@@ -1,38 +1,60 @@
|
|
|
1
1
|
import { useMatch } from './useMatch'
|
|
2
|
-
import type {
|
|
3
|
-
import type {
|
|
4
|
-
import type {
|
|
5
|
-
import type { RegisteredRouter } from './router'
|
|
6
|
-
import type { Constrain, Expand, StrictOrFrom } from './utils'
|
|
2
|
+
import type { AllContext, RouteById } from './routeInfo'
|
|
3
|
+
import type { AnyRouter, RegisteredRouter } from './router'
|
|
4
|
+
import type { Expand, StrictOrFrom } from './utils'
|
|
7
5
|
|
|
8
|
-
export
|
|
6
|
+
export interface UseRouteContextBaseOptions<
|
|
7
|
+
TRouter extends AnyRouter,
|
|
9
8
|
TFrom,
|
|
10
9
|
TStrict extends boolean,
|
|
11
|
-
TRouteContext,
|
|
12
10
|
TSelected,
|
|
13
|
-
>
|
|
14
|
-
select?: (search:
|
|
11
|
+
> {
|
|
12
|
+
select?: (search: ResolveRouteContext<TRouter, TFrom, TStrict>) => TSelected
|
|
15
13
|
}
|
|
16
14
|
|
|
15
|
+
export type UseRouteContextOptions<
|
|
16
|
+
TRouter extends AnyRouter,
|
|
17
|
+
TFrom extends string | undefined,
|
|
18
|
+
TStrict extends boolean,
|
|
19
|
+
TSelected,
|
|
20
|
+
> = StrictOrFrom<TRouter, TFrom, TStrict> &
|
|
21
|
+
UseRouteContextBaseOptions<TRouter, TFrom, TStrict, TSelected>
|
|
22
|
+
|
|
23
|
+
export type ResolveRouteContext<
|
|
24
|
+
TRouter extends AnyRouter,
|
|
25
|
+
TFrom,
|
|
26
|
+
TStrict extends boolean,
|
|
27
|
+
> = TStrict extends false
|
|
28
|
+
? AllContext<TRouter['routeTree']>
|
|
29
|
+
: Expand<RouteById<TRouter['routeTree'], TFrom>['types']['allContext']>
|
|
30
|
+
|
|
31
|
+
export type UseRouteContextResult<
|
|
32
|
+
TRouter extends AnyRouter,
|
|
33
|
+
TFrom,
|
|
34
|
+
TStrict extends boolean,
|
|
35
|
+
TSelected,
|
|
36
|
+
> = unknown extends TSelected
|
|
37
|
+
? ResolveRouteContext<TRouter, TFrom, TStrict>
|
|
38
|
+
: TSelected
|
|
39
|
+
|
|
40
|
+
export type UseRouteContextRoute<out TFrom> = <
|
|
41
|
+
TRouter extends AnyRouter = RegisteredRouter,
|
|
42
|
+
TSelected = unknown,
|
|
43
|
+
>(
|
|
44
|
+
opts?: UseRouteContextBaseOptions<TRouter, TFrom, true, TSelected>,
|
|
45
|
+
) => UseRouteContextResult<TRouter, TFrom, true, TSelected>
|
|
46
|
+
|
|
17
47
|
export function useRouteContext<
|
|
18
|
-
|
|
48
|
+
TRouter extends AnyRouter = RegisteredRouter,
|
|
19
49
|
TFrom extends string | undefined = undefined,
|
|
20
50
|
TStrict extends boolean = true,
|
|
21
|
-
|
|
22
|
-
? AllContext<TRouteTree>
|
|
23
|
-
: Expand<RouteById<TRouteTree, TFrom>['types']['allContext']>,
|
|
24
|
-
TSelected = TRouteContext,
|
|
51
|
+
TSelected = unknown,
|
|
25
52
|
>(
|
|
26
|
-
opts: UseRouteContextOptions<
|
|
27
|
-
|
|
28
|
-
TStrict,
|
|
29
|
-
TRouteContext,
|
|
30
|
-
TSelected
|
|
31
|
-
>,
|
|
32
|
-
): TSelected {
|
|
53
|
+
opts: UseRouteContextOptions<TRouter, TFrom, TStrict, TSelected>,
|
|
54
|
+
): UseRouteContextResult<TRouter, TFrom, TStrict, TSelected> {
|
|
33
55
|
return useMatch({
|
|
34
56
|
...(opts as any),
|
|
35
|
-
select: (match
|
|
57
|
+
select: (match) =>
|
|
36
58
|
opts.select ? opts.select(match.context) : match.context,
|
|
37
|
-
})
|
|
59
|
+
}) as UseRouteContextResult<TRouter, TFrom, TStrict, TSelected>
|
|
38
60
|
}
|
package/src/useRouterState.tsx
CHANGED
|
@@ -1,16 +1,55 @@
|
|
|
1
1
|
import { useStore } from '@tanstack/react-store'
|
|
2
|
+
import { useRef } from 'react'
|
|
2
3
|
import { useRouter } from './useRouter'
|
|
4
|
+
import { replaceEqualDeep } from './utils'
|
|
5
|
+
import type {
|
|
6
|
+
StructuralSharingOption,
|
|
7
|
+
ValidateSelected,
|
|
8
|
+
} from './structuralSharing'
|
|
3
9
|
import type { AnyRouter, RegisteredRouter, RouterState } from './router'
|
|
4
10
|
|
|
11
|
+
export type UseRouterStateOptions<
|
|
12
|
+
TRouter extends AnyRouter,
|
|
13
|
+
TSelected,
|
|
14
|
+
TStructuralSharing,
|
|
15
|
+
> = {
|
|
16
|
+
router?: TRouter
|
|
17
|
+
select?: (
|
|
18
|
+
state: RouterState<TRouter['routeTree']>,
|
|
19
|
+
) => ValidateSelected<TRouter, TSelected, TStructuralSharing>
|
|
20
|
+
} & StructuralSharingOption<TRouter, TSelected, TStructuralSharing>
|
|
21
|
+
|
|
22
|
+
export type UseRouterStateResult<
|
|
23
|
+
TRouter extends AnyRouter,
|
|
24
|
+
TSelected,
|
|
25
|
+
> = unknown extends TSelected ? RouterState<TRouter['routeTree']> : TSelected
|
|
26
|
+
|
|
5
27
|
export function useRouterState<
|
|
6
28
|
TRouter extends AnyRouter = RegisteredRouter,
|
|
7
|
-
TSelected =
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
29
|
+
TSelected = unknown,
|
|
30
|
+
TStructuralSharing extends boolean = boolean,
|
|
31
|
+
>(
|
|
32
|
+
opts?: UseRouterStateOptions<TRouter, TSelected, TStructuralSharing>,
|
|
33
|
+
): UseRouterStateResult<TRouter, TSelected> {
|
|
12
34
|
const contextRouter = useRouter<TRouter>({
|
|
13
35
|
warn: opts?.router === undefined,
|
|
14
36
|
})
|
|
15
|
-
|
|
37
|
+
const router = opts?.router || contextRouter
|
|
38
|
+
const previousResult =
|
|
39
|
+
useRef<ValidateSelected<TRouter, TSelected, TStructuralSharing>>()
|
|
40
|
+
|
|
41
|
+
return useStore(router.__store, (state) => {
|
|
42
|
+
if (opts?.select) {
|
|
43
|
+
if (opts.structuralSharing ?? router.options.defaultStructuralSharing) {
|
|
44
|
+
const newSlice = replaceEqualDeep(
|
|
45
|
+
previousResult.current,
|
|
46
|
+
opts.select(state),
|
|
47
|
+
)
|
|
48
|
+
previousResult.current = newSlice
|
|
49
|
+
return newSlice
|
|
50
|
+
}
|
|
51
|
+
return opts.select(state)
|
|
52
|
+
}
|
|
53
|
+
return state
|
|
54
|
+
}) as UseRouterStateResult<TRouter, TSelected>
|
|
16
55
|
}
|
package/src/useSearch.tsx
CHANGED
|
@@ -1,38 +1,87 @@
|
|
|
1
1
|
import { useMatch } from './useMatch'
|
|
2
|
-
import type {
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
2
|
+
import type {
|
|
3
|
+
StructuralSharingOption,
|
|
4
|
+
ValidateSelected,
|
|
5
|
+
} from './structuralSharing'
|
|
6
|
+
import type { FullSearchSchema, RouteById } from './routeInfo'
|
|
7
|
+
import type { AnyRouter, RegisteredRouter } from './router'
|
|
8
|
+
import type { Expand, StrictOrFrom } from './utils'
|
|
6
9
|
|
|
7
|
-
export
|
|
10
|
+
export interface UseSearchBaseOptions<
|
|
11
|
+
TRouter extends AnyRouter,
|
|
8
12
|
TFrom,
|
|
9
13
|
TStrict extends boolean,
|
|
10
|
-
TSearch,
|
|
11
14
|
TSelected,
|
|
12
|
-
|
|
13
|
-
|
|
15
|
+
TStructuralSharing,
|
|
16
|
+
> {
|
|
17
|
+
select?: (
|
|
18
|
+
state: ResolveSearch<TRouter, TFrom, TStrict>,
|
|
19
|
+
) => ValidateSelected<TRouter, TSelected, TStructuralSharing>
|
|
14
20
|
}
|
|
15
21
|
|
|
22
|
+
export type UseSearchOptions<
|
|
23
|
+
TRouter extends AnyRouter,
|
|
24
|
+
TFrom,
|
|
25
|
+
TStrict extends boolean,
|
|
26
|
+
TSelected,
|
|
27
|
+
TStructuralSharing,
|
|
28
|
+
> = StrictOrFrom<TRouter, TFrom, TStrict> &
|
|
29
|
+
UseSearchBaseOptions<TRouter, TFrom, TStrict, TSelected, TStructuralSharing> &
|
|
30
|
+
StructuralSharingOption<TRouter, TSelected, TStructuralSharing>
|
|
31
|
+
|
|
32
|
+
export type UseSearchResult<
|
|
33
|
+
TRouter extends AnyRouter,
|
|
34
|
+
TFrom,
|
|
35
|
+
TStrict extends boolean,
|
|
36
|
+
TSelected,
|
|
37
|
+
> = unknown extends TSelected
|
|
38
|
+
? ResolveSearch<TRouter, TFrom, TStrict>
|
|
39
|
+
: TSelected
|
|
40
|
+
|
|
41
|
+
export type ResolveSearch<
|
|
42
|
+
TRouter extends AnyRouter,
|
|
43
|
+
TFrom,
|
|
44
|
+
TStrict extends boolean,
|
|
45
|
+
> = TStrict extends false
|
|
46
|
+
? FullSearchSchema<TRouter['routeTree']>
|
|
47
|
+
: Expand<RouteById<TRouter['routeTree'], TFrom>['types']['fullSearchSchema']>
|
|
48
|
+
|
|
49
|
+
export type UseSearchRoute<out TFrom> = <
|
|
50
|
+
TRouter extends AnyRouter = RegisteredRouter,
|
|
51
|
+
TSelected = unknown,
|
|
52
|
+
TStructuralSharing extends boolean = boolean,
|
|
53
|
+
>(
|
|
54
|
+
opts?: UseSearchBaseOptions<
|
|
55
|
+
TRouter,
|
|
56
|
+
TFrom,
|
|
57
|
+
true,
|
|
58
|
+
TSelected,
|
|
59
|
+
TStructuralSharing
|
|
60
|
+
> &
|
|
61
|
+
StructuralSharingOption<TRouter, TSelected, TStructuralSharing>,
|
|
62
|
+
) => UseSearchResult<TRouter, TFrom, true, TSelected>
|
|
63
|
+
|
|
16
64
|
export function useSearch<
|
|
17
|
-
|
|
65
|
+
TRouter extends AnyRouter = RegisteredRouter,
|
|
18
66
|
TFrom extends string | undefined = undefined,
|
|
19
67
|
TStrict extends boolean = true,
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
: Expand<RouteById<TRouteTree, TFrom>['types']['fullSearchSchema']>,
|
|
23
|
-
TSelected = TSearch,
|
|
68
|
+
TSelected = unknown,
|
|
69
|
+
TStructuralSharing extends boolean = boolean,
|
|
24
70
|
>(
|
|
25
71
|
opts: UseSearchOptions<
|
|
26
|
-
|
|
72
|
+
TRouter,
|
|
73
|
+
TFrom,
|
|
27
74
|
TStrict,
|
|
28
|
-
|
|
29
|
-
|
|
75
|
+
TSelected,
|
|
76
|
+
TStructuralSharing
|
|
30
77
|
>,
|
|
31
|
-
): TSelected {
|
|
78
|
+
): UseSearchResult<TRouter, TFrom, TStrict, TSelected> {
|
|
32
79
|
return useMatch({
|
|
33
|
-
|
|
34
|
-
|
|
80
|
+
from: opts.from!,
|
|
81
|
+
strict: opts.strict,
|
|
82
|
+
structuralSharing: opts.structuralSharing,
|
|
83
|
+
select: (match: any) => {
|
|
35
84
|
return opts.select ? opts.select(match.search) : match.search
|
|
36
85
|
},
|
|
37
|
-
})
|
|
86
|
+
}) as UseSearchResult<TRouter, TFrom, TStrict, TSelected>
|
|
38
87
|
}
|
package/src/utils.ts
CHANGED
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
import * as React from 'react'
|
|
2
|
+
import type { RouteIds } from './routeInfo'
|
|
3
|
+
import type { AnyRouter } from './router'
|
|
2
4
|
|
|
3
5
|
export type NoInfer<T> = [T][T extends any ? 0 : never]
|
|
4
6
|
export type IsAny<TValue, TYesResult, TNoResult = TValue> = 1 extends 0 & TValue
|
|
@@ -103,10 +105,16 @@ export type MergeUnion<TUnion> =
|
|
|
103
105
|
| MergeUnionPrimitives<TUnion>
|
|
104
106
|
| MergeUnionObject<TUnion>
|
|
105
107
|
|
|
106
|
-
export type Constrain<T,
|
|
107
|
-
| (T extends
|
|
108
|
+
export type Constrain<T, TConstraint, TDefault = TConstraint> =
|
|
109
|
+
| (T extends TConstraint ? T : never)
|
|
108
110
|
| TDefault
|
|
109
111
|
|
|
112
|
+
export type ValidateJSON<T> = ((...args: Array<any>) => any) extends T
|
|
113
|
+
? unknown extends T
|
|
114
|
+
? never
|
|
115
|
+
: 'Function is not serializable'
|
|
116
|
+
: { [K in keyof T]: ValidateJSON<T[K]> }
|
|
117
|
+
|
|
110
118
|
export function last<T>(arr: Array<T>) {
|
|
111
119
|
return arr[arr.length - 1]
|
|
112
120
|
}
|
|
@@ -308,6 +316,7 @@ export type StringLiteral<T> = T extends string
|
|
|
308
316
|
: never
|
|
309
317
|
|
|
310
318
|
export type StrictOrFrom<
|
|
319
|
+
TRouter extends AnyRouter,
|
|
311
320
|
TFrom,
|
|
312
321
|
TStrict extends boolean = true,
|
|
313
322
|
> = TStrict extends false
|
|
@@ -316,10 +325,14 @@ export type StrictOrFrom<
|
|
|
316
325
|
strict: TStrict
|
|
317
326
|
}
|
|
318
327
|
: {
|
|
319
|
-
from: StringLiteral<TFrom
|
|
328
|
+
from: StringLiteral<Constrain<TFrom, RouteIds<TRouter['routeTree']>>>
|
|
320
329
|
strict?: TStrict
|
|
321
330
|
}
|
|
322
331
|
|
|
332
|
+
export type ThrowOrOptional<T, TThrow extends boolean> = TThrow extends true
|
|
333
|
+
? T
|
|
334
|
+
: T | undefined
|
|
335
|
+
|
|
323
336
|
export const useLayoutEffect =
|
|
324
337
|
typeof window !== 'undefined' ? React.useLayoutEffect : React.useEffect
|
|
325
338
|
|