@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.
Files changed (116) hide show
  1. package/dist/cjs/Match.cjs +10 -11
  2. package/dist/cjs/Match.cjs.map +1 -1
  3. package/dist/cjs/Matches.cjs +8 -4
  4. package/dist/cjs/Matches.cjs.map +1 -1
  5. package/dist/cjs/Matches.d.cts +8 -9
  6. package/dist/cjs/RouterProvider.cjs.map +1 -1
  7. package/dist/cjs/RouterProvider.d.cts +3 -3
  8. package/dist/cjs/Transitioner.cjs +9 -8
  9. package/dist/cjs/Transitioner.cjs.map +1 -1
  10. package/dist/cjs/fileRoute.cjs +15 -3
  11. package/dist/cjs/fileRoute.cjs.map +1 -1
  12. package/dist/cjs/fileRoute.d.cts +12 -19
  13. package/dist/cjs/link.cjs +4 -1
  14. package/dist/cjs/link.cjs.map +1 -1
  15. package/dist/cjs/link.d.cts +1 -1
  16. package/dist/cjs/route.cjs +33 -9
  17. package/dist/cjs/route.cjs.map +1 -1
  18. package/dist/cjs/route.d.cts +20 -38
  19. package/dist/cjs/router.cjs +1 -0
  20. package/dist/cjs/router.cjs.map +1 -1
  21. package/dist/cjs/router.d.cts +17 -11
  22. package/dist/cjs/routerContext.cjs.map +1 -1
  23. package/dist/cjs/routerContext.d.cts +1 -1
  24. package/dist/cjs/structuralSharing.d.cts +12 -0
  25. package/dist/cjs/useLoaderData.cjs +4 -2
  26. package/dist/cjs/useLoaderData.cjs.map +1 -1
  27. package/dist/cjs/useLoaderData.d.cts +12 -9
  28. package/dist/cjs/useLoaderDeps.cjs +3 -2
  29. package/dist/cjs/useLoaderDeps.cjs.map +1 -1
  30. package/dist/cjs/useLoaderDeps.d.cts +12 -8
  31. package/dist/cjs/useLocation.cjs.map +1 -1
  32. package/dist/cjs/useLocation.d.cts +6 -3
  33. package/dist/cjs/useMatch.cjs +2 -1
  34. package/dist/cjs/useMatch.cjs.map +1 -1
  35. package/dist/cjs/useMatch.d.cts +10 -8
  36. package/dist/cjs/useParams.cjs +3 -1
  37. package/dist/cjs/useParams.cjs.map +1 -1
  38. package/dist/cjs/useParams.d.cts +12 -8
  39. package/dist/cjs/useRouteContext.cjs.map +1 -1
  40. package/dist/cjs/useRouteContext.d.cts +11 -8
  41. package/dist/cjs/useRouterState.cjs +18 -1
  42. package/dist/cjs/useRouterState.cjs.map +1 -1
  43. package/dist/cjs/useRouterState.d.cts +6 -3
  44. package/dist/cjs/useSearch.cjs +3 -1
  45. package/dist/cjs/useSearch.cjs.map +1 -1
  46. package/dist/cjs/useSearch.d.cts +12 -8
  47. package/dist/cjs/utils.cjs.map +1 -1
  48. package/dist/cjs/utils.d.cts +10 -4
  49. package/dist/esm/Match.js +10 -11
  50. package/dist/esm/Match.js.map +1 -1
  51. package/dist/esm/Matches.d.ts +8 -9
  52. package/dist/esm/Matches.js +8 -4
  53. package/dist/esm/Matches.js.map +1 -1
  54. package/dist/esm/RouterProvider.d.ts +3 -3
  55. package/dist/esm/RouterProvider.js.map +1 -1
  56. package/dist/esm/Transitioner.js +10 -9
  57. package/dist/esm/Transitioner.js.map +1 -1
  58. package/dist/esm/fileRoute.d.ts +12 -19
  59. package/dist/esm/fileRoute.js +15 -3
  60. package/dist/esm/fileRoute.js.map +1 -1
  61. package/dist/esm/link.d.ts +1 -1
  62. package/dist/esm/link.js +4 -1
  63. package/dist/esm/link.js.map +1 -1
  64. package/dist/esm/route.d.ts +20 -38
  65. package/dist/esm/route.js +33 -9
  66. package/dist/esm/route.js.map +1 -1
  67. package/dist/esm/router.d.ts +17 -11
  68. package/dist/esm/router.js +1 -0
  69. package/dist/esm/router.js.map +1 -1
  70. package/dist/esm/routerContext.d.ts +1 -1
  71. package/dist/esm/routerContext.js.map +1 -1
  72. package/dist/esm/structuralSharing.d.ts +12 -0
  73. package/dist/esm/useLoaderData.d.ts +12 -9
  74. package/dist/esm/useLoaderData.js +4 -2
  75. package/dist/esm/useLoaderData.js.map +1 -1
  76. package/dist/esm/useLoaderDeps.d.ts +12 -8
  77. package/dist/esm/useLoaderDeps.js +3 -2
  78. package/dist/esm/useLoaderDeps.js.map +1 -1
  79. package/dist/esm/useLocation.d.ts +6 -3
  80. package/dist/esm/useLocation.js.map +1 -1
  81. package/dist/esm/useMatch.d.ts +10 -8
  82. package/dist/esm/useMatch.js +2 -1
  83. package/dist/esm/useMatch.js.map +1 -1
  84. package/dist/esm/useParams.d.ts +12 -8
  85. package/dist/esm/useParams.js +3 -1
  86. package/dist/esm/useParams.js.map +1 -1
  87. package/dist/esm/useRouteContext.d.ts +11 -8
  88. package/dist/esm/useRouteContext.js.map +1 -1
  89. package/dist/esm/useRouterState.d.ts +6 -3
  90. package/dist/esm/useRouterState.js +18 -1
  91. package/dist/esm/useRouterState.js.map +1 -1
  92. package/dist/esm/useSearch.d.ts +12 -8
  93. package/dist/esm/useSearch.js +3 -1
  94. package/dist/esm/useSearch.js.map +1 -1
  95. package/dist/esm/utils.d.ts +10 -4
  96. package/dist/esm/utils.js.map +1 -1
  97. package/package.json +1 -1
  98. package/src/Match.tsx +6 -7
  99. package/src/Matches.tsx +52 -24
  100. package/src/RouterProvider.tsx +4 -1
  101. package/src/Transitioner.tsx +9 -10
  102. package/src/fileRoute.ts +29 -29
  103. package/src/link.tsx +6 -3
  104. package/src/route.ts +57 -101
  105. package/src/router.ts +37 -4
  106. package/src/routerContext.tsx +1 -1
  107. package/src/structuralSharing.ts +49 -0
  108. package/src/useLoaderData.tsx +76 -28
  109. package/src/useLoaderDeps.tsx +55 -20
  110. package/src/useLocation.tsx +30 -8
  111. package/src/useMatch.tsx +71 -21
  112. package/src/useParams.tsx +70 -21
  113. package/src/useRouteContext.ts +45 -23
  114. package/src/useRouterState.tsx +45 -6
  115. package/src/useSearch.tsx +69 -20
  116. package/src/utils.ts +16 -3
package/src/useParams.tsx CHANGED
@@ -1,38 +1,87 @@
1
1
  import { useMatch } from './useMatch'
2
- import type { AnyRoute } from './route'
3
- import type { AllParams, RouteById, RouteIds } from './routeInfo'
4
- import type { RegisteredRouter } from './router'
5
- import type { Constrain, StrictOrFrom } from './utils'
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 type UseParamsOptions<
10
+ export interface UseParamsBaseOptions<
11
+ TRouter extends AnyRouter,
8
12
  TFrom,
9
13
  TStrict extends boolean,
10
- TParams,
11
14
  TSelected,
12
- > = StrictOrFrom<TFrom, TStrict> & {
13
- select?: (params: TParams) => TSelected
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
- TRouteTree extends AnyRoute = RegisteredRouter['routeTree'],
65
+ TRouter extends AnyRouter = RegisteredRouter,
18
66
  TFrom extends string | undefined = undefined,
19
67
  TStrict extends boolean = true,
20
- TParams = TStrict extends false
21
- ? AllParams<TRouteTree>
22
- : RouteById<TRouteTree, TFrom>['types']['allParams'],
23
- TSelected = TParams,
68
+ TSelected = unknown,
69
+ TStructuralSharing extends boolean = boolean,
24
70
  >(
25
71
  opts: UseParamsOptions<
26
- Constrain<TFrom, RouteIds<TRouteTree>>,
72
+ TRouter,
73
+ TFrom,
27
74
  TStrict,
28
- TParams,
29
- TSelected
75
+ TSelected,
76
+ TStructuralSharing
30
77
  >,
31
- ): TSelected {
78
+ ): UseParamsResult<TRouter, TFrom, TStrict, TSelected> {
32
79
  return useMatch({
33
- ...opts,
34
- select: (match) => {
35
- return opts.select ? opts.select(match.params as TParams) : match.params
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
  }
@@ -1,38 +1,60 @@
1
1
  import { useMatch } from './useMatch'
2
- import type { MakeRouteMatch } from './Matches'
3
- import type { AnyRoute } from './route'
4
- import type { AllContext, RouteById, RouteIds } from './routeInfo'
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 type UseRouteContextOptions<
6
+ export interface UseRouteContextBaseOptions<
7
+ TRouter extends AnyRouter,
9
8
  TFrom,
10
9
  TStrict extends boolean,
11
- TRouteContext,
12
10
  TSelected,
13
- > = StrictOrFrom<TFrom, TStrict> & {
14
- select?: (search: TRouteContext) => TSelected
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
- TRouteTree extends AnyRoute = RegisteredRouter['routeTree'],
48
+ TRouter extends AnyRouter = RegisteredRouter,
19
49
  TFrom extends string | undefined = undefined,
20
50
  TStrict extends boolean = true,
21
- TRouteContext = TStrict extends false
22
- ? AllContext<TRouteTree>
23
- : Expand<RouteById<TRouteTree, TFrom>['types']['allContext']>,
24
- TSelected = TRouteContext,
51
+ TSelected = unknown,
25
52
  >(
26
- opts: UseRouteContextOptions<
27
- Constrain<TFrom, RouteIds<TRouteTree>>,
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: MakeRouteMatch<TRouteTree, TFrom>) =>
57
+ select: (match) =>
36
58
  opts.select ? opts.select(match.context) : match.context,
37
- })
59
+ }) as UseRouteContextResult<TRouter, TFrom, TStrict, TSelected>
38
60
  }
@@ -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 = RouterState<TRouter['routeTree']>,
8
- >(opts?: {
9
- router?: TRouter
10
- select: (state: RouterState<RegisteredRouter['routeTree']>) => TSelected
11
- }): TSelected {
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
- return useStore((opts?.router || contextRouter).__store, opts?.select as any)
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 { AnyRoute } from './route'
3
- import type { FullSearchSchema, RouteById, RouteIds } from './routeInfo'
4
- import type { RegisteredRouter } from './router'
5
- import type { Constrain, Expand, StrictOrFrom } from './utils'
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 type UseSearchOptions<
10
+ export interface UseSearchBaseOptions<
11
+ TRouter extends AnyRouter,
8
12
  TFrom,
9
13
  TStrict extends boolean,
10
- TSearch,
11
14
  TSelected,
12
- > = StrictOrFrom<TFrom, TStrict> & {
13
- select?: (search: TSearch) => TSelected
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
- TRouteTree extends AnyRoute = RegisteredRouter['routeTree'],
65
+ TRouter extends AnyRouter = RegisteredRouter,
18
66
  TFrom extends string | undefined = undefined,
19
67
  TStrict extends boolean = true,
20
- TSearch = TStrict extends false
21
- ? FullSearchSchema<TRouteTree>
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
- Constrain<TFrom, RouteIds<TRouteTree>>,
72
+ TRouter,
73
+ TFrom,
27
74
  TStrict,
28
- TSearch,
29
- TSelected
75
+ TSelected,
76
+ TStructuralSharing
30
77
  >,
31
- ): TSelected {
78
+ ): UseSearchResult<TRouter, TFrom, TStrict, TSelected> {
32
79
  return useMatch({
33
- ...opts,
34
- select: (match) => {
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, TConstaint, TDefault = TConstaint> =
107
- | (T extends TConstaint ? T : never)
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> | 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