@tanstack/react-router 0.0.1-beta.9 → 1.0.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 (229) hide show
  1. package/LICENSE +21 -0
  2. package/build/cjs/CatchBoundary.js +128 -0
  3. package/build/cjs/CatchBoundary.js.map +1 -0
  4. package/build/cjs/Matches.js +233 -0
  5. package/build/cjs/Matches.js.map +1 -0
  6. package/build/cjs/RouterProvider.js +170 -0
  7. package/build/cjs/RouterProvider.js.map +1 -0
  8. package/build/cjs/_virtual/_rollupPluginBabelHelpers.js +2 -22
  9. package/build/cjs/_virtual/_rollupPluginBabelHelpers.js.map +1 -1
  10. package/build/cjs/_virtual/with-selector.development.js +16 -0
  11. package/build/cjs/_virtual/with-selector.development.js.map +1 -0
  12. package/build/cjs/_virtual/with-selector.js +16 -0
  13. package/build/cjs/_virtual/with-selector.js.map +1 -0
  14. package/build/cjs/_virtual/with-selector.production.min.js +16 -0
  15. package/build/cjs/_virtual/with-selector.production.min.js.map +1 -0
  16. package/build/cjs/awaited.js +43 -0
  17. package/build/cjs/awaited.js.map +1 -0
  18. package/build/cjs/build/esm/index.js +79 -0
  19. package/build/cjs/build/esm/index.js.map +1 -0
  20. package/build/cjs/defer.js +37 -0
  21. package/build/cjs/defer.js.map +1 -0
  22. package/build/cjs/fileRoute.js +27 -0
  23. package/build/cjs/fileRoute.js.map +1 -0
  24. package/build/cjs/index.js +130 -0
  25. package/build/cjs/index.js.map +1 -0
  26. package/build/cjs/lazyRouteComponent.js +54 -0
  27. package/build/cjs/lazyRouteComponent.js.map +1 -0
  28. package/build/cjs/link.js +223 -0
  29. package/build/cjs/link.js.map +1 -0
  30. package/build/cjs/node_modules/.pnpm/@tanstack_react-store@0.2.1_react-dom@18.2.0_react@18.2.0/node_modules/@tanstack/react-store/build/modern/index.js +47 -0
  31. package/build/cjs/node_modules/.pnpm/@tanstack_react-store@0.2.1_react-dom@18.2.0_react@18.2.0/node_modules/@tanstack/react-store/build/modern/index.js.map +1 -0
  32. package/build/cjs/node_modules/.pnpm/@tanstack_store@0.1.3/node_modules/@tanstack/store/build/modern/index.js +70 -0
  33. package/build/cjs/node_modules/.pnpm/@tanstack_store@0.1.3/node_modules/@tanstack/store/build/modern/index.js.map +1 -0
  34. package/build/cjs/node_modules/.pnpm/use-sync-external-store@1.2.0_react@18.2.0/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim/with-selector.development.js +188 -0
  35. package/build/cjs/node_modules/.pnpm/use-sync-external-store@1.2.0_react@18.2.0/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim/with-selector.development.js.map +1 -0
  36. package/build/cjs/node_modules/.pnpm/use-sync-external-store@1.2.0_react@18.2.0/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim/with-selector.production.min.js +39 -0
  37. package/build/cjs/node_modules/.pnpm/use-sync-external-store@1.2.0_react@18.2.0/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim/with-selector.production.min.js.map +1 -0
  38. package/build/cjs/node_modules/.pnpm/use-sync-external-store@1.2.0_react@18.2.0/node_modules/use-sync-external-store/shim/with-selector.js +26 -0
  39. package/build/cjs/node_modules/.pnpm/use-sync-external-store@1.2.0_react@18.2.0/node_modules/use-sync-external-store/shim/with-selector.js.map +1 -0
  40. package/build/cjs/packages/react-router/src/CatchBoundary.js +123 -0
  41. package/build/cjs/packages/react-router/src/CatchBoundary.js.map +1 -0
  42. package/build/cjs/packages/react-router/src/Matches.js +235 -0
  43. package/build/cjs/packages/react-router/src/Matches.js.map +1 -0
  44. package/build/cjs/packages/react-router/src/RouterProvider.js +144 -0
  45. package/build/cjs/packages/react-router/src/RouterProvider.js.map +1 -0
  46. package/build/cjs/packages/react-router/src/awaited.js +43 -0
  47. package/build/cjs/packages/react-router/src/awaited.js.map +1 -0
  48. package/build/cjs/packages/react-router/src/defer.js +37 -0
  49. package/build/cjs/packages/react-router/src/defer.js.map +1 -0
  50. package/build/cjs/packages/react-router/src/fileRoute.js +27 -0
  51. package/build/cjs/packages/react-router/src/fileRoute.js.map +1 -0
  52. package/build/cjs/packages/react-router/src/index.js +61 -0
  53. package/build/cjs/packages/react-router/src/index.js.map +1 -0
  54. package/build/cjs/packages/react-router/src/lazyRouteComponent.js +54 -0
  55. package/build/cjs/packages/react-router/src/lazyRouteComponent.js.map +1 -0
  56. package/build/cjs/packages/react-router/src/link.js +148 -0
  57. package/build/cjs/packages/react-router/src/link.js.map +1 -0
  58. package/build/cjs/packages/react-router/src/path.js +209 -0
  59. package/build/cjs/packages/react-router/src/path.js.map +1 -0
  60. package/build/cjs/packages/react-router/src/qss.js +63 -0
  61. package/build/cjs/packages/react-router/src/qss.js.map +1 -0
  62. package/build/cjs/packages/react-router/src/react.js +634 -0
  63. package/build/cjs/packages/react-router/src/react.js.map +1 -0
  64. package/build/cjs/packages/react-router/src/redirects.js +25 -0
  65. package/build/cjs/packages/react-router/src/redirects.js.map +1 -0
  66. package/build/cjs/packages/react-router/src/route.js +134 -0
  67. package/build/cjs/packages/react-router/src/route.js.map +1 -0
  68. package/build/cjs/packages/react-router/src/router.js +1111 -0
  69. package/build/cjs/packages/react-router/src/router.js.map +1 -0
  70. package/build/cjs/packages/react-router/src/scroll-restoration.js +53 -0
  71. package/build/cjs/packages/react-router/src/scroll-restoration.js.map +1 -0
  72. package/build/cjs/packages/react-router/src/searchParams.js +81 -0
  73. package/build/cjs/packages/react-router/src/searchParams.js.map +1 -0
  74. package/build/cjs/packages/react-router/src/useBlocker.js +61 -0
  75. package/build/cjs/packages/react-router/src/useBlocker.js.map +1 -0
  76. package/build/cjs/packages/react-router/src/useNavigate.js +75 -0
  77. package/build/cjs/packages/react-router/src/useNavigate.js.map +1 -0
  78. package/build/cjs/packages/react-router/src/useParams.js +26 -0
  79. package/build/cjs/packages/react-router/src/useParams.js.map +1 -0
  80. package/build/cjs/packages/react-router/src/useSearch.js +25 -0
  81. package/build/cjs/packages/react-router/src/useSearch.js.map +1 -0
  82. package/build/cjs/packages/react-router/src/utils.js +239 -0
  83. package/build/cjs/packages/react-router/src/utils.js.map +1 -0
  84. package/build/cjs/path.js +214 -0
  85. package/build/cjs/path.js.map +1 -0
  86. package/build/cjs/qss.js +63 -0
  87. package/build/cjs/qss.js.map +1 -0
  88. package/build/cjs/react/CatchBoundary.js +123 -0
  89. package/build/cjs/react/CatchBoundary.js.map +1 -0
  90. package/build/cjs/react/awaited.js +43 -0
  91. package/build/cjs/react/awaited.js.map +1 -0
  92. package/build/cjs/react/defer.js +37 -0
  93. package/build/cjs/react/defer.js.map +1 -0
  94. package/build/cjs/react.js +650 -0
  95. package/build/cjs/react.js.map +1 -0
  96. package/build/cjs/redirects.js +28 -0
  97. package/build/cjs/redirects.js.map +1 -0
  98. package/build/cjs/route.js +191 -0
  99. package/build/cjs/route.js.map +1 -0
  100. package/build/cjs/router.js +1085 -0
  101. package/build/cjs/router.js.map +1 -0
  102. package/build/cjs/routerConfig.js +209 -0
  103. package/build/cjs/routerConfig.js.map +1 -0
  104. package/build/cjs/scroll-restoration.js +202 -0
  105. package/build/cjs/scroll-restoration.js.map +1 -0
  106. package/build/cjs/searchParams.js +81 -0
  107. package/build/cjs/searchParams.js.map +1 -0
  108. package/build/cjs/src/CatchBoundary.js +126 -0
  109. package/build/cjs/src/CatchBoundary.js.map +1 -0
  110. package/build/cjs/src/Matches.js +235 -0
  111. package/build/cjs/src/Matches.js.map +1 -0
  112. package/build/cjs/src/RouterProvider.js +1051 -0
  113. package/build/cjs/src/RouterProvider.js.map +1 -0
  114. package/build/cjs/src/awaited.js +45 -0
  115. package/build/cjs/src/awaited.js.map +1 -0
  116. package/build/cjs/src/defer.js +39 -0
  117. package/build/cjs/src/defer.js.map +1 -0
  118. package/build/cjs/src/fileRoute.js +29 -0
  119. package/build/cjs/src/fileRoute.js.map +1 -0
  120. package/build/cjs/src/index.js +134 -0
  121. package/build/cjs/src/index.js.map +1 -0
  122. package/build/cjs/src/lazyRouteComponent.js +57 -0
  123. package/build/cjs/src/lazyRouteComponent.js.map +1 -0
  124. package/build/cjs/src/link.js +151 -0
  125. package/build/cjs/src/link.js.map +1 -0
  126. package/build/cjs/src/path.js +211 -0
  127. package/build/cjs/src/path.js.map +1 -0
  128. package/build/cjs/src/qss.js +65 -0
  129. package/build/cjs/src/qss.js.map +1 -0
  130. package/build/cjs/src/redirects.js +27 -0
  131. package/build/cjs/src/redirects.js.map +1 -0
  132. package/build/cjs/src/route.js +139 -0
  133. package/build/cjs/src/route.js.map +1 -0
  134. package/build/cjs/src/router.js +203 -0
  135. package/build/cjs/src/router.js.map +1 -0
  136. package/build/cjs/src/scroll-restoration.js +186 -0
  137. package/build/cjs/src/scroll-restoration.js.map +1 -0
  138. package/build/cjs/src/searchParams.js +83 -0
  139. package/build/cjs/src/searchParams.js.map +1 -0
  140. package/build/cjs/src/useBlocker.js +64 -0
  141. package/build/cjs/src/useBlocker.js.map +1 -0
  142. package/build/cjs/src/useNavigate.js +78 -0
  143. package/build/cjs/src/useNavigate.js.map +1 -0
  144. package/build/cjs/src/useParams.js +28 -0
  145. package/build/cjs/src/useParams.js.map +1 -0
  146. package/build/cjs/src/useSearch.js +27 -0
  147. package/build/cjs/src/useSearch.js.map +1 -0
  148. package/build/cjs/src/utils.js +230 -0
  149. package/build/cjs/src/utils.js.map +1 -0
  150. package/build/cjs/useBlocker.js +55 -0
  151. package/build/cjs/useBlocker.js.map +1 -0
  152. package/build/cjs/useNavigate.js +86 -0
  153. package/build/cjs/useNavigate.js.map +1 -0
  154. package/build/cjs/useParams.js +26 -0
  155. package/build/cjs/useParams.js.map +1 -0
  156. package/build/cjs/useSearch.js +25 -0
  157. package/build/cjs/useSearch.js.map +1 -0
  158. package/build/cjs/useStore.js +99 -0
  159. package/build/cjs/useStore.js.map +1 -0
  160. package/build/cjs/utils.js +241 -0
  161. package/build/cjs/utils.js.map +1 -0
  162. package/build/esm/index.js +2300 -2534
  163. package/build/esm/index.js.map +1 -1
  164. package/build/stats-html.html +3498 -2694
  165. package/build/stats-react.json +1204 -44
  166. package/build/types/CatchBoundary.d.ts +36 -0
  167. package/build/types/Matches.d.ts +64 -0
  168. package/build/types/RouteMatch.d.ts +23 -0
  169. package/build/types/RouterProvider.d.ts +35 -0
  170. package/build/types/awaited.d.ts +9 -0
  171. package/build/types/defer.d.ts +19 -0
  172. package/build/types/fileRoute.d.ts +38 -0
  173. package/build/types/history.d.ts +7 -0
  174. package/build/types/index.d.ts +919 -58
  175. package/build/types/injectHtml.d.ts +0 -0
  176. package/build/types/lazyRouteComponent.d.ts +2 -0
  177. package/build/types/link.d.ts +93 -0
  178. package/build/types/location.d.ts +12 -0
  179. package/build/types/path.d.ts +17 -0
  180. package/build/types/qss.d.ts +2 -0
  181. package/build/types/react/CatchBoundary.d.ts +33 -0
  182. package/build/types/react/awaited.d.ts +9 -0
  183. package/build/types/react/defer.d.ts +19 -0
  184. package/build/types/react.d.ts +141 -0
  185. package/build/types/redirects.d.ts +11 -0
  186. package/build/types/route.d.ts +283 -0
  187. package/build/types/routeInfo.d.ts +31 -0
  188. package/build/types/router.d.ts +186 -0
  189. package/build/types/scroll-restoration.d.ts +18 -0
  190. package/build/types/searchParams.d.ts +7 -0
  191. package/build/types/useBlocker.d.ts +9 -0
  192. package/build/types/useNavigate.d.ts +19 -0
  193. package/build/types/useParams.d.ts +7 -0
  194. package/build/types/useSearch.d.ts +7 -0
  195. package/build/types/useStore.d.ts +12 -0
  196. package/build/types/utils.d.ts +69 -0
  197. package/build/umd/index.development.js +2897 -2493
  198. package/build/umd/index.development.js.map +1 -1
  199. package/build/umd/index.production.js +4 -4
  200. package/build/umd/index.production.js.map +1 -1
  201. package/package.json +12 -10
  202. package/src/CatchBoundary.tsx +101 -0
  203. package/src/Matches.tsx +423 -0
  204. package/src/RouterProvider.tsx +252 -0
  205. package/src/awaited.tsx +40 -0
  206. package/src/defer.ts +55 -0
  207. package/src/fileRoute.ts +152 -0
  208. package/src/history.ts +8 -0
  209. package/src/index.tsx +28 -619
  210. package/src/lazyRouteComponent.tsx +33 -0
  211. package/src/link.tsx +603 -0
  212. package/src/location.ts +13 -0
  213. package/src/path.ts +261 -0
  214. package/src/qss.ts +53 -0
  215. package/src/redirects.ts +39 -0
  216. package/src/route.ts +882 -0
  217. package/src/routeInfo.ts +84 -0
  218. package/src/router.ts +1671 -0
  219. package/src/scroll-restoration.tsx +230 -0
  220. package/src/searchParams.ts +79 -0
  221. package/src/useBlocker.tsx +27 -0
  222. package/src/useNavigate.tsx +111 -0
  223. package/src/useParams.tsx +25 -0
  224. package/src/useSearch.tsx +25 -0
  225. package/src/utils.ts +360 -0
  226. package/build/cjs/react-router/src/index.js +0 -458
  227. package/build/cjs/react-router/src/index.js.map +0 -1
  228. package/build/cjs/router-core/build/esm/index.js +0 -2524
  229. package/build/cjs/router-core/build/esm/index.js.map +0 -1
@@ -0,0 +1,650 @@
1
+ /**
2
+ * @tanstack/react-router/src/index.tsx
3
+ *
4
+ * Copyright (c) TanStack
5
+ *
6
+ * This source code is licensed under the MIT license found in the
7
+ * LICENSE.md file in the root directory of this source tree.
8
+ *
9
+ * @license MIT
10
+ */
11
+ 'use strict';
12
+
13
+ var _rollupPluginBabelHelpers = require('./_virtual/_rollupPluginBabelHelpers.js');
14
+ var React = require('react');
15
+ var reactStore = require('@tanstack/react-store');
16
+ var invariant = require('tiny-invariant');
17
+ var warning = require('tiny-warning');
18
+ var routerCore = require('@tanstack/router-core');
19
+
20
+ function _interopNamespaceDefault(e) {
21
+ var n = Object.create(null);
22
+ if (e) {
23
+ Object.keys(e).forEach(function (k) {
24
+ if (k !== 'default') {
25
+ var d = Object.getOwnPropertyDescriptor(e, k);
26
+ Object.defineProperty(n, k, d.get ? d : {
27
+ enumerable: true,
28
+ get: function () { return e[k]; }
29
+ });
30
+ }
31
+ });
32
+ }
33
+ n.default = e;
34
+ return Object.freeze(n);
35
+ }
36
+
37
+ var React__namespace = /*#__PURE__*/_interopNamespaceDefault(React);
38
+
39
+ const useLayoutEffect = typeof window !== 'undefined' ? React__namespace.useLayoutEffect : React__namespace.useEffect;
40
+ routerCore.Route.__onInit = route => {
41
+ Object.assign(route, {
42
+ useMatch: (opts = {}) => {
43
+ return useMatch({
44
+ ...opts,
45
+ from: route.id
46
+ });
47
+ },
48
+ useLoader: (opts = {}) => {
49
+ return useLoader({
50
+ ...opts,
51
+ from: route.id
52
+ });
53
+ },
54
+ useRouteContext: (opts = {}) => {
55
+ return useMatch({
56
+ ...opts,
57
+ from: route.id,
58
+ select: d => opts?.select ? opts.select(d.context) : d.context
59
+ });
60
+ },
61
+ useSearch: (opts = {}) => {
62
+ return useSearch({
63
+ ...opts,
64
+ from: route.id
65
+ });
66
+ },
67
+ useParams: (opts = {}) => {
68
+ return useParams({
69
+ ...opts,
70
+ from: route.id
71
+ });
72
+ }
73
+ });
74
+ };
75
+
76
+ //
77
+
78
+ function lazyRouteComponent(importer, exportName) {
79
+ let loadPromise;
80
+ const load = () => {
81
+ if (!loadPromise) {
82
+ loadPromise = importer();
83
+ }
84
+ return loadPromise;
85
+ };
86
+ const lazyComp = /*#__PURE__*/React__namespace.lazy(async () => {
87
+ const moduleExports = await load();
88
+ const comp = moduleExports[exportName ?? 'default'];
89
+ return {
90
+ default: comp
91
+ };
92
+ });
93
+ lazyComp.preload = load;
94
+ return lazyComp;
95
+ }
96
+ //
97
+
98
+ function useLinkProps(options) {
99
+ const router = useRouter();
100
+ const match = useMatch({
101
+ strict: false
102
+ });
103
+ const {
104
+ // custom props
105
+ type,
106
+ children,
107
+ target,
108
+ activeProps = () => ({
109
+ className: 'active'
110
+ }),
111
+ inactiveProps = () => ({}),
112
+ activeOptions,
113
+ disabled,
114
+ hash,
115
+ search,
116
+ params,
117
+ to,
118
+ state,
119
+ mask,
120
+ preload,
121
+ preloadDelay,
122
+ replace,
123
+ // element props
124
+ style,
125
+ className,
126
+ onClick,
127
+ onFocus,
128
+ onMouseEnter,
129
+ onMouseLeave,
130
+ onTouchStart,
131
+ ...rest
132
+ } = options;
133
+ const linkInfo = router.buildLink({
134
+ from: options.to ? match.pathname : undefined,
135
+ ...options
136
+ });
137
+ if (linkInfo.type === 'external') {
138
+ const {
139
+ href
140
+ } = linkInfo;
141
+ return {
142
+ href
143
+ };
144
+ }
145
+ const {
146
+ handleClick,
147
+ handleFocus,
148
+ handleEnter,
149
+ handleLeave,
150
+ handleTouchStart,
151
+ isActive,
152
+ next
153
+ } = linkInfo;
154
+ const handleReactClick = e => {
155
+ if (options.startTransition ?? true) {
156
+ (React__namespace.startTransition || (d => d))(() => {
157
+ handleClick(e);
158
+ });
159
+ }
160
+ };
161
+ const composeHandlers = handlers => e => {
162
+ if (e.persist) e.persist();
163
+ handlers.filter(Boolean).forEach(handler => {
164
+ if (e.defaultPrevented) return;
165
+ handler(e);
166
+ });
167
+ };
168
+
169
+ // Get the active props
170
+ const resolvedActiveProps = isActive ? routerCore.functionalUpdate(activeProps, {}) ?? {} : {};
171
+
172
+ // Get the inactive props
173
+ const resolvedInactiveProps = isActive ? {} : routerCore.functionalUpdate(inactiveProps, {}) ?? {};
174
+ return {
175
+ ...resolvedActiveProps,
176
+ ...resolvedInactiveProps,
177
+ ...rest,
178
+ href: disabled ? undefined : next.maskedLocation ? next.maskedLocation.href : next.href,
179
+ onClick: composeHandlers([onClick, handleReactClick]),
180
+ onFocus: composeHandlers([onFocus, handleFocus]),
181
+ onMouseEnter: composeHandlers([onMouseEnter, handleEnter]),
182
+ onMouseLeave: composeHandlers([onMouseLeave, handleLeave]),
183
+ onTouchStart: composeHandlers([onTouchStart, handleTouchStart]),
184
+ target,
185
+ style: {
186
+ ...style,
187
+ ...resolvedActiveProps.style,
188
+ ...resolvedInactiveProps.style
189
+ },
190
+ className: [className, resolvedActiveProps.className, resolvedInactiveProps.className].filter(Boolean).join(' ') || undefined,
191
+ ...(disabled ? {
192
+ role: 'link',
193
+ 'aria-disabled': true
194
+ } : undefined),
195
+ ['data-status']: isActive ? 'active' : undefined
196
+ };
197
+ }
198
+ const Link = /*#__PURE__*/React__namespace.forwardRef((props, ref) => {
199
+ const linkProps = useLinkProps(props);
200
+ return /*#__PURE__*/React__namespace.createElement("a", _rollupPluginBabelHelpers.extends({
201
+ ref: ref
202
+ }, linkProps, {
203
+ children: typeof props.children === 'function' ? props.children({
204
+ isActive: linkProps['data-status'] === 'active'
205
+ }) : props.children
206
+ }));
207
+ });
208
+ function Navigate(props) {
209
+ const router = useRouter();
210
+ const match = useMatch({
211
+ strict: false
212
+ });
213
+ useLayoutEffect(() => {
214
+ router.navigate({
215
+ from: props.to ? match.pathname : undefined,
216
+ ...props
217
+ });
218
+ }, []);
219
+ return null;
220
+ }
221
+ const matchIdsContext = /*#__PURE__*/React__namespace.createContext(null);
222
+ const routerContext = /*#__PURE__*/React__namespace.createContext(null);
223
+ function useRouterState(opts) {
224
+ const router = useRouter();
225
+ return reactStore.useStore(router.__store, opts?.select);
226
+ }
227
+ function RouterProvider({
228
+ router,
229
+ ...rest
230
+ }) {
231
+ router.update(rest);
232
+ React__namespace.useEffect(() => {
233
+ let unsub;
234
+ React__namespace.startTransition(() => {
235
+ unsub = router.mount();
236
+ });
237
+ return unsub;
238
+ }, [router]);
239
+ const Wrap = router.options.Wrap || React__namespace.Fragment;
240
+ return /*#__PURE__*/React__namespace.createElement(Wrap, null, /*#__PURE__*/React__namespace.createElement(routerContext.Provider, {
241
+ value: router
242
+ }, /*#__PURE__*/React__namespace.createElement(Matches, null)));
243
+ }
244
+ function Matches() {
245
+ const router = useRouter();
246
+ const matchIds = useRouterState({
247
+ select: state => {
248
+ return state.renderedMatchIds;
249
+ }
250
+ });
251
+ const locationKey = useRouterState({
252
+ select: d => d.resolvedLocation.state?.key
253
+ });
254
+ const route = router.getRoute(routerCore.rootRouteId);
255
+ const errorComponent = React__namespace.useCallback(props => {
256
+ return /*#__PURE__*/React__namespace.createElement(ErrorComponent, {
257
+ ...props,
258
+ useMatch: route.useMatch,
259
+ useRouteContext: route.useRouteContext,
260
+ useSearch: route.useSearch,
261
+ useParams: route.useParams
262
+ });
263
+ }, [route]);
264
+ return /*#__PURE__*/React__namespace.createElement(matchIdsContext.Provider, {
265
+ value: [undefined, ...matchIds]
266
+ }, /*#__PURE__*/React__namespace.createElement(CatchBoundary, {
267
+ resetKey: locationKey,
268
+ errorComponent: errorComponent,
269
+ onCatch: () => {
270
+ warning(false, `Error in router! Consider setting an 'errorComponent' in your RootRoute! 👍`);
271
+ }
272
+ }, /*#__PURE__*/React__namespace.createElement(Outlet, null)));
273
+ }
274
+ function useRouter() {
275
+ const value = React__namespace.useContext(routerContext);
276
+ warning(value, 'useRouter must be used inside a <Router> component!');
277
+ return value;
278
+ }
279
+ function useMatches(opts) {
280
+ const matchIds = React__namespace.useContext(matchIdsContext);
281
+ return useRouterState({
282
+ select: state => {
283
+ const matches = state.renderedMatches.slice(state.renderedMatches.findIndex(d => d.id === matchIds[0]));
284
+ return opts?.select ? opts.select(matches) : matches;
285
+ }
286
+ });
287
+ }
288
+ function useMatch(opts) {
289
+ const router = useRouter();
290
+ const nearestMatchId = React__namespace.useContext(matchIdsContext)[0];
291
+ const nearestMatchRouteId = router.getRouteMatch(nearestMatchId)?.routeId;
292
+ const matchRouteId = useRouterState({
293
+ select: state => {
294
+ const match = opts?.from ? state.renderedMatches.find(d => d.routeId === opts?.from) : state.renderedMatches.find(d => d.id === nearestMatchId);
295
+ return match.routeId;
296
+ }
297
+ });
298
+ if (opts?.strict ?? true) {
299
+ invariant(nearestMatchRouteId == matchRouteId, `useMatch("${matchRouteId}") is being called in a component that is meant to render the '${nearestMatchRouteId}' route. Did you mean to 'useMatch("${matchRouteId}", { strict: false })' or 'useRoute("${matchRouteId}")' instead?`);
300
+ }
301
+ const matchSelection = useRouterState({
302
+ select: state => {
303
+ const match = opts?.from ? state.renderedMatches.find(d => d.routeId === opts?.from) : state.renderedMatches.find(d => d.id === nearestMatchId);
304
+ invariant(match, `Could not find ${opts?.from ? `an active match from "${opts.from}"` : 'a nearest match!'}`);
305
+ return opts?.select ? opts.select(match) : match;
306
+ }
307
+ });
308
+ return matchSelection;
309
+ }
310
+ function useLoader(opts) {
311
+ return useMatch({
312
+ ...opts,
313
+ select: match => opts?.select ? opts?.select(match.loaderData) : match.loaderData
314
+ });
315
+ }
316
+ function useRouterContext(opts) {
317
+ return useMatch({
318
+ ...opts,
319
+ select: match => opts?.select ? opts.select(match.context) : match.context
320
+ });
321
+ }
322
+ function useRouteContext(opts) {
323
+ return useMatch({
324
+ ...opts,
325
+ select: match => opts?.select ? opts.select(match.context) : match.context
326
+ });
327
+ }
328
+ function useSearch(opts) {
329
+ return useMatch({
330
+ ...opts,
331
+ select: match => {
332
+ return opts?.select ? opts.select(match.search) : match.search;
333
+ }
334
+ });
335
+ }
336
+ function useParams(opts) {
337
+ return useRouterState({
338
+ select: state => {
339
+ const params = routerCore.last(state.renderedMatches)?.params;
340
+ return opts?.select ? opts.select(params) : params;
341
+ }
342
+ });
343
+ }
344
+ function useNavigate(defaultOpts) {
345
+ const router = useRouter();
346
+ const match = useMatch({
347
+ strict: false
348
+ });
349
+ return React__namespace.useCallback(opts => {
350
+ return router.navigate({
351
+ from: opts?.to ? match.pathname : undefined,
352
+ ...defaultOpts,
353
+ ...opts
354
+ });
355
+ }, []);
356
+ }
357
+ function useMatchRoute() {
358
+ const router = useRouter();
359
+ return React__namespace.useCallback(opts => {
360
+ const {
361
+ pending,
362
+ caseSensitive,
363
+ ...rest
364
+ } = opts;
365
+ return router.matchRoute(rest, {
366
+ pending,
367
+ caseSensitive
368
+ });
369
+ }, []);
370
+ }
371
+ function MatchRoute(props) {
372
+ const matchRoute = useMatchRoute();
373
+ const params = matchRoute(props);
374
+ if (typeof props.children === 'function') {
375
+ return props.children(params);
376
+ }
377
+ return !!params ? props.children : null;
378
+ }
379
+ function Outlet() {
380
+ const matchIds = React__namespace.useContext(matchIdsContext).slice(1);
381
+ if (!matchIds[0]) {
382
+ return null;
383
+ }
384
+ return /*#__PURE__*/React__namespace.createElement(Match, {
385
+ matchIds: matchIds
386
+ });
387
+ }
388
+ const defaultPending = () => null;
389
+ function Match({
390
+ matchIds
391
+ }) {
392
+ const router = useRouter();
393
+ const matchId = matchIds[0];
394
+ const routeId = router.getRouteMatch(matchId).routeId;
395
+ const route = router.getRoute(routeId);
396
+ const locationKey = useRouterState({
397
+ select: s => s.resolvedLocation.state?.key
398
+ });
399
+ const PendingComponent = route.options.pendingComponent ?? router.options.defaultPendingComponent ?? defaultPending;
400
+ const routeErrorComponent = route.options.errorComponent ?? router.options.defaultErrorComponent ?? ErrorComponent;
401
+ const ResolvedSuspenseBoundary = route.options.wrapInSuspense ?? !route.isRoot ? React__namespace.Suspense : SafeFragment;
402
+ const ResolvedCatchBoundary = !!routeErrorComponent ? CatchBoundary : SafeFragment;
403
+ const errorComponent = React__namespace.useCallback(props => {
404
+ return /*#__PURE__*/React__namespace.createElement(routeErrorComponent, {
405
+ ...props,
406
+ useMatch: route.useMatch,
407
+ useRouteContext: route.useRouteContext,
408
+ useSearch: route.useSearch,
409
+ useParams: route.useParams
410
+ });
411
+ }, [route]);
412
+ return /*#__PURE__*/React__namespace.createElement(matchIdsContext.Provider, {
413
+ value: matchIds
414
+ }, /*#__PURE__*/React__namespace.createElement(ResolvedSuspenseBoundary, {
415
+ fallback: /*#__PURE__*/React__namespace.createElement(PendingComponent, {
416
+ useMatch: route.useMatch,
417
+ useRouteContext: route.useRouteContext,
418
+ useSearch: route.useSearch,
419
+ useParams: route.useParams
420
+ })
421
+ }, /*#__PURE__*/React__namespace.createElement(ResolvedCatchBoundary, {
422
+ resetKey: locationKey,
423
+ errorComponent: errorComponent,
424
+ onCatch: () => {
425
+ warning(false, `Error in route match: ${matchId}`);
426
+ }
427
+ }, /*#__PURE__*/React__namespace.createElement(MatchInner, {
428
+ matchId: matchId,
429
+ PendingComponent: PendingComponent
430
+ }))));
431
+ }
432
+ function MatchInner({
433
+ matchId,
434
+ PendingComponent
435
+ }) {
436
+ const router = useRouter();
437
+ const match = useRouterState({
438
+ select: d => {
439
+ const match = d.matchesById[matchId];
440
+ return routerCore.pick(match, ['status', 'loadPromise', 'routeId', 'error']);
441
+ }
442
+ });
443
+ const route = router.getRoute(match.routeId);
444
+ if (match.status === 'error') {
445
+ throw match.error;
446
+ }
447
+ if (match.status === 'pending') {
448
+ return /*#__PURE__*/React__namespace.createElement(PendingComponent, {
449
+ useLoader: route.useLoader,
450
+ useMatch: route.useMatch,
451
+ useRouteContext: route.useRouteContext,
452
+ useSearch: route.useSearch,
453
+ useParams: route.useParams
454
+ });
455
+ }
456
+ if (match.status === 'success') {
457
+ let comp = route.options.component ?? router.options.defaultComponent;
458
+ if (comp) {
459
+ return /*#__PURE__*/React__namespace.createElement(comp, {
460
+ useLoader: route.useLoader,
461
+ useMatch: route.useMatch,
462
+ useRouteContext: route.useRouteContext,
463
+ useSearch: route.useSearch,
464
+ useParams: route.useParams
465
+ });
466
+ }
467
+ return /*#__PURE__*/React__namespace.createElement(Outlet, null);
468
+ }
469
+ invariant(false, 'Idle routeMatch status encountered during rendering! You should never see this. File an issue!');
470
+ }
471
+ function SafeFragment(props) {
472
+ return /*#__PURE__*/React__namespace.createElement(React__namespace.Fragment, null, props.children);
473
+ }
474
+ function useInjectHtml() {
475
+ const router = useRouter();
476
+ return React__namespace.useCallback(html => {
477
+ router.injectHtml(html);
478
+ }, []);
479
+ }
480
+ function useDehydrate() {
481
+ const router = useRouter();
482
+ return React__namespace.useCallback(function dehydrate(key, data) {
483
+ return router.dehydrateData(key, data);
484
+ }, []);
485
+ }
486
+ function useHydrate() {
487
+ const router = useRouter();
488
+ return function hydrate(key) {
489
+ return router.hydrateData(key);
490
+ };
491
+ }
492
+
493
+ // This is the messiest thing ever... I'm either seriously tired (likely) or
494
+ // there has to be a better way to reset error boundaries when the
495
+ // router's location key changes.
496
+
497
+ function CatchBoundary(props) {
498
+ const errorComponent = props.errorComponent ?? ErrorComponent;
499
+ return /*#__PURE__*/React__namespace.createElement(CatchBoundaryImpl, {
500
+ resetKey: props.resetKey,
501
+ onCatch: props.onCatch,
502
+ children: ({
503
+ error
504
+ }) => {
505
+ if (error) {
506
+ return /*#__PURE__*/React__namespace.createElement(errorComponent, {
507
+ error
508
+ });
509
+ }
510
+ return props.children;
511
+ }
512
+ });
513
+ }
514
+ class CatchBoundaryImpl extends React__namespace.Component {
515
+ state = {
516
+ error: null
517
+ };
518
+ static getDerivedStateFromError(error) {
519
+ return {
520
+ error
521
+ };
522
+ }
523
+ componentDidUpdate(prevProps, prevState) {
524
+ if (prevState.error && prevProps.resetKey !== this.props.resetKey) {
525
+ this.setState({
526
+ error: null
527
+ });
528
+ }
529
+ }
530
+ componentDidCatch(error) {
531
+ this.props.onCatch?.(error);
532
+ }
533
+ render() {
534
+ return this.props.children(this.state);
535
+ }
536
+ }
537
+ function ErrorComponent({
538
+ error
539
+ }) {
540
+ const [show, setShow] = React__namespace.useState(process.env.NODE_ENV !== 'production');
541
+ return /*#__PURE__*/React__namespace.createElement("div", {
542
+ style: {
543
+ padding: '.5rem',
544
+ maxWidth: '100%'
545
+ }
546
+ }, /*#__PURE__*/React__namespace.createElement("div", {
547
+ style: {
548
+ display: 'flex',
549
+ alignItems: 'center',
550
+ gap: '.5rem'
551
+ }
552
+ }, /*#__PURE__*/React__namespace.createElement("strong", {
553
+ style: {
554
+ fontSize: '1rem'
555
+ }
556
+ }, "Something went wrong!"), /*#__PURE__*/React__namespace.createElement("button", {
557
+ style: {
558
+ appearance: 'none',
559
+ fontSize: '.6em',
560
+ border: '1px solid currentColor',
561
+ padding: '.1rem .2rem',
562
+ fontWeight: 'bold',
563
+ borderRadius: '.25rem'
564
+ },
565
+ onClick: () => setShow(d => !d)
566
+ }, show ? 'Hide Error' : 'Show Error')), /*#__PURE__*/React__namespace.createElement("div", {
567
+ style: {
568
+ height: '.25rem'
569
+ }
570
+ }), show ? /*#__PURE__*/React__namespace.createElement("div", null, /*#__PURE__*/React__namespace.createElement("pre", {
571
+ style: {
572
+ fontSize: '.7em',
573
+ border: '1px solid red',
574
+ borderRadius: '.25rem',
575
+ padding: '.3rem',
576
+ color: 'red',
577
+ overflow: 'auto'
578
+ }
579
+ }, error.message ? /*#__PURE__*/React__namespace.createElement("code", null, error.message) : null)) : null);
580
+ }
581
+ function useBlocker(message, condition = true) {
582
+ const router = useRouter();
583
+ React__namespace.useEffect(() => {
584
+ if (!condition) return;
585
+ let unblock = router.history.block((retry, cancel) => {
586
+ if (window.confirm(message)) {
587
+ unblock();
588
+ retry();
589
+ }
590
+ });
591
+ return unblock;
592
+ });
593
+ }
594
+ function Block({
595
+ message,
596
+ condition,
597
+ children
598
+ }) {
599
+ useBlocker(message, condition);
600
+ return children ?? null;
601
+ }
602
+ function shallow(objA, objB) {
603
+ if (Object.is(objA, objB)) {
604
+ return true;
605
+ }
606
+ if (typeof objA !== 'object' || objA === null || typeof objB !== 'object' || objB === null) {
607
+ return false;
608
+ }
609
+ const keysA = Object.keys(objA);
610
+ if (keysA.length !== Object.keys(objB).length) {
611
+ return false;
612
+ }
613
+ for (let i = 0; i < keysA.length; i++) {
614
+ if (!Object.prototype.hasOwnProperty.call(objB, keysA[i]) || !Object.is(objA[keysA[i]], objB[keysA[i]])) {
615
+ return false;
616
+ }
617
+ }
618
+ return true;
619
+ }
620
+
621
+ exports.Block = Block;
622
+ exports.CatchBoundary = CatchBoundary;
623
+ exports.CatchBoundaryImpl = CatchBoundaryImpl;
624
+ exports.ErrorComponent = ErrorComponent;
625
+ exports.Link = Link;
626
+ exports.MatchRoute = MatchRoute;
627
+ exports.Navigate = Navigate;
628
+ exports.Outlet = Outlet;
629
+ exports.RouterProvider = RouterProvider;
630
+ exports.lazyRouteComponent = lazyRouteComponent;
631
+ exports.matchIdsContext = matchIdsContext;
632
+ exports.routerContext = routerContext;
633
+ exports.shallow = shallow;
634
+ exports.useBlocker = useBlocker;
635
+ exports.useDehydrate = useDehydrate;
636
+ exports.useHydrate = useHydrate;
637
+ exports.useInjectHtml = useInjectHtml;
638
+ exports.useLinkProps = useLinkProps;
639
+ exports.useLoader = useLoader;
640
+ exports.useMatch = useMatch;
641
+ exports.useMatchRoute = useMatchRoute;
642
+ exports.useMatches = useMatches;
643
+ exports.useNavigate = useNavigate;
644
+ exports.useParams = useParams;
645
+ exports.useRouteContext = useRouteContext;
646
+ exports.useRouter = useRouter;
647
+ exports.useRouterContext = useRouterContext;
648
+ exports.useRouterState = useRouterState;
649
+ exports.useSearch = useSearch;
650
+ //# sourceMappingURL=react.js.map