react-router 7.18.0 → 8.0.0-pre.1

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 (285) hide show
  1. package/dist/development/dom-export.d.ts +6 -172
  2. package/dist/development/dom-export.js +12 -1009
  3. package/dist/development/index-react-server-client.d.ts +7 -4
  4. package/dist/development/index-react-server-client.js +8 -52
  5. package/dist/development/index-react-server.d.ts +1650 -1641
  6. package/dist/development/index-react-server.js +2882 -3664
  7. package/dist/development/index.d.ts +42 -1476
  8. package/dist/development/index.js +36 -2553
  9. package/dist/development/lib/actions.js +50 -0
  10. package/dist/development/lib/components.d.ts +1030 -0
  11. package/dist/development/lib/components.js +841 -0
  12. package/dist/development/lib/context.d.ts +83 -0
  13. package/dist/development/lib/context.js +41 -0
  14. package/dist/development/lib/dom/dom.d.ts +119 -0
  15. package/dist/development/lib/dom/dom.js +143 -0
  16. package/dist/development/lib/dom/lib.d.ts +2053 -0
  17. package/dist/development/lib/dom/lib.js +1271 -0
  18. package/dist/development/lib/dom/server.d.ts +138 -0
  19. package/dist/development/lib/dom/server.js +301 -0
  20. package/dist/development/lib/dom/ssr/components.d.ts +198 -0
  21. package/dist/development/lib/dom/ssr/components.js +589 -0
  22. package/dist/development/lib/dom/ssr/data.js +29 -0
  23. package/dist/development/lib/dom/ssr/entry.d.ts +60 -0
  24. package/dist/development/lib/dom/ssr/errorBoundaries.d.ts +27 -0
  25. package/dist/development/lib/dom/ssr/errorBoundaries.js +87 -0
  26. package/dist/development/lib/dom/ssr/fallback.js +33 -0
  27. package/dist/development/lib/dom/ssr/fog-of-war.d.ts +12 -0
  28. package/dist/development/lib/dom/ssr/fog-of-war.js +180 -0
  29. package/dist/development/lib/dom/ssr/hydration.d.ts +32 -0
  30. package/dist/development/lib/dom/ssr/hydration.js +29 -0
  31. package/dist/development/lib/dom/ssr/invariant.js +16 -0
  32. package/dist/development/lib/dom/ssr/links.js +170 -0
  33. package/dist/development/lib/dom/ssr/markup.js +24 -0
  34. package/dist/development/lib/dom/ssr/routeModules.d.ts +206 -0
  35. package/dist/development/lib/dom/ssr/routeModules.js +31 -0
  36. package/dist/development/lib/dom/ssr/routes-test-stub.d.ts +62 -0
  37. package/dist/development/lib/dom/ssr/routes-test-stub.js +108 -0
  38. package/dist/development/lib/dom/ssr/routes.d.ts +33 -0
  39. package/dist/development/lib/dom/ssr/routes.js +303 -0
  40. package/dist/development/lib/dom/ssr/server.d.ts +48 -0
  41. package/dist/development/lib/dom/ssr/server.js +69 -0
  42. package/dist/development/lib/dom/ssr/single-fetch.d.ts +14 -0
  43. package/dist/development/lib/dom/ssr/single-fetch.js +345 -0
  44. package/dist/development/lib/dom-export/dom-router-provider.d.ts +9 -0
  45. package/dist/development/lib/dom-export/dom-router-provider.js +22 -0
  46. package/dist/development/lib/dom-export/hydrated-router.d.ts +125 -0
  47. package/dist/development/lib/dom-export/hydrated-router.js +150 -0
  48. package/dist/development/lib/errors.js +29 -0
  49. package/dist/development/lib/hooks.d.ts +947 -0
  50. package/dist/development/lib/hooks.js +1388 -0
  51. package/dist/development/lib/href.d.ts +20 -0
  52. package/dist/development/lib/href.js +50 -0
  53. package/dist/development/lib/router/history.d.ts +258 -0
  54. package/dist/development/lib/router/history.js +372 -0
  55. package/dist/development/lib/router/instrumentation.d.ts +86 -0
  56. package/dist/development/lib/router/instrumentation.js +213 -0
  57. package/dist/development/lib/router/links.d.ts +114 -0
  58. package/dist/development/lib/router/router.d.ts +663 -0
  59. package/dist/development/lib/router/router.js +2988 -0
  60. package/dist/development/lib/router/url.js +18 -0
  61. package/dist/development/lib/router/utils.d.ts +948 -0
  62. package/dist/development/lib/router/utils.js +810 -0
  63. package/dist/development/lib/rsc/browser.d.ts +137 -0
  64. package/dist/development/lib/rsc/browser.js +603 -0
  65. package/dist/development/lib/rsc/errorBoundaries.d.ts +11 -0
  66. package/dist/development/lib/rsc/errorBoundaries.js +90 -0
  67. package/dist/development/lib/rsc/html-stream/browser.d.ts +48 -0
  68. package/dist/development/lib/rsc/html-stream/browser.js +74 -0
  69. package/dist/development/lib/rsc/html-stream/server.js +78 -0
  70. package/dist/development/lib/rsc/route-modules.js +27 -0
  71. package/dist/development/lib/rsc/server.rsc.d.ts +219 -0
  72. package/dist/development/lib/rsc/server.ssr.d.ts +129 -0
  73. package/dist/development/lib/rsc/server.ssr.js +404 -0
  74. package/dist/development/lib/server-runtime/build.d.ts +66 -0
  75. package/dist/development/lib/server-runtime/cookies.d.ts +66 -0
  76. package/dist/development/lib/server-runtime/cookies.js +139 -0
  77. package/dist/development/lib/server-runtime/crypto.js +43 -0
  78. package/dist/development/lib/server-runtime/data.d.ts +13 -0
  79. package/dist/development/lib/server-runtime/data.js +25 -0
  80. package/dist/development/lib/server-runtime/dev.d.ts +9 -0
  81. package/dist/development/lib/server-runtime/dev.js +26 -0
  82. package/dist/development/lib/server-runtime/entry.js +20 -0
  83. package/dist/development/lib/server-runtime/errors.js +75 -0
  84. package/dist/development/lib/server-runtime/headers.js +73 -0
  85. package/dist/development/lib/server-runtime/invariant.js +19 -0
  86. package/dist/development/lib/server-runtime/mode.d.ts +12 -0
  87. package/dist/development/lib/server-runtime/mode.js +25 -0
  88. package/dist/development/lib/server-runtime/routeMatching.js +28 -0
  89. package/dist/development/lib/server-runtime/routes.d.ts +13 -0
  90. package/dist/development/lib/server-runtime/routes.js +74 -0
  91. package/dist/development/lib/server-runtime/server.d.ts +10 -0
  92. package/dist/development/lib/server-runtime/server.js +345 -0
  93. package/dist/development/lib/server-runtime/serverHandoff.js +17 -0
  94. package/dist/development/lib/server-runtime/sessions/cookieStorage.d.ts +25 -0
  95. package/dist/development/lib/server-runtime/sessions/cookieStorage.js +45 -0
  96. package/dist/development/lib/server-runtime/sessions/memoryStorage.d.ts +23 -0
  97. package/dist/development/lib/server-runtime/sessions/memoryStorage.js +52 -0
  98. package/dist/development/lib/server-runtime/sessions.d.ts +145 -0
  99. package/dist/development/lib/server-runtime/sessions.js +98 -0
  100. package/dist/development/lib/server-runtime/single-fetch.d.ts +7 -0
  101. package/dist/development/lib/server-runtime/single-fetch.js +215 -0
  102. package/dist/development/lib/server-runtime/urls.js +28 -0
  103. package/dist/development/lib/server-runtime/warnings.js +20 -0
  104. package/dist/development/lib/types/future.d.ts +9 -0
  105. package/dist/development/lib/types/internal.d.ts +26 -177
  106. package/dist/development/lib/types/internal.js +3 -2
  107. package/dist/development/{register-roq_0qYo.d.ts → lib/types/register.d.ts} +9 -15
  108. package/dist/development/lib/types/route-data.d.ts +113 -0
  109. package/dist/development/lib/types/route-module-annotations.d.ts +149 -0
  110. package/dist/development/lib/types/route-module.d.ts +19 -0
  111. package/dist/development/lib/types/serializes-to.d.ts +13 -0
  112. package/dist/development/lib/types/utils.d.ts +11 -0
  113. package/dist/development/vendor/turbo-stream-v2/flatten.js +159 -0
  114. package/dist/development/vendor/turbo-stream-v2/turbo-stream.js +179 -0
  115. package/dist/development/vendor/turbo-stream-v2/unflatten.js +199 -0
  116. package/dist/development/vendor/turbo-stream-v2/utils.js +39 -0
  117. package/dist/production/dom-export.d.ts +6 -172
  118. package/dist/production/dom-export.js +12 -1009
  119. package/dist/production/index-react-server-client.d.ts +7 -4
  120. package/dist/production/index-react-server-client.js +8 -52
  121. package/dist/production/index-react-server.d.ts +1650 -1641
  122. package/dist/production/index-react-server.js +2873 -3664
  123. package/dist/production/index.d.ts +42 -1476
  124. package/dist/production/index.js +36 -2553
  125. package/dist/production/lib/actions.js +50 -0
  126. package/dist/production/lib/components.d.ts +1030 -0
  127. package/dist/production/lib/components.js +841 -0
  128. package/dist/production/lib/context.d.ts +83 -0
  129. package/dist/production/lib/context.js +41 -0
  130. package/dist/production/lib/dom/dom.d.ts +119 -0
  131. package/dist/production/lib/dom/dom.js +143 -0
  132. package/dist/production/lib/dom/lib.d.ts +2053 -0
  133. package/dist/production/lib/dom/lib.js +1271 -0
  134. package/dist/production/lib/dom/server.d.ts +138 -0
  135. package/dist/production/lib/dom/server.js +301 -0
  136. package/dist/production/lib/dom/ssr/components.d.ts +198 -0
  137. package/dist/production/lib/dom/ssr/components.js +589 -0
  138. package/dist/production/lib/dom/ssr/data.js +29 -0
  139. package/dist/production/lib/dom/ssr/entry.d.ts +60 -0
  140. package/dist/production/lib/dom/ssr/errorBoundaries.d.ts +27 -0
  141. package/dist/production/lib/dom/ssr/errorBoundaries.js +87 -0
  142. package/dist/production/lib/dom/ssr/fallback.js +23 -0
  143. package/dist/production/lib/dom/ssr/fog-of-war.d.ts +12 -0
  144. package/dist/production/lib/dom/ssr/fog-of-war.js +180 -0
  145. package/dist/production/lib/dom/ssr/hydration.d.ts +32 -0
  146. package/dist/production/lib/dom/ssr/hydration.js +29 -0
  147. package/dist/production/lib/dom/ssr/invariant.js +16 -0
  148. package/dist/production/lib/dom/ssr/links.js +170 -0
  149. package/dist/production/lib/dom/ssr/markup.js +24 -0
  150. package/dist/production/lib/dom/ssr/routeModules.d.ts +206 -0
  151. package/dist/production/lib/dom/ssr/routeModules.js +31 -0
  152. package/dist/production/lib/dom/ssr/routes-test-stub.d.ts +62 -0
  153. package/dist/production/lib/dom/ssr/routes-test-stub.js +108 -0
  154. package/dist/production/lib/dom/ssr/routes.d.ts +33 -0
  155. package/dist/production/lib/dom/ssr/routes.js +303 -0
  156. package/dist/production/lib/dom/ssr/server.d.ts +48 -0
  157. package/dist/production/lib/dom/ssr/server.js +69 -0
  158. package/dist/production/lib/dom/ssr/single-fetch.d.ts +14 -0
  159. package/dist/production/lib/dom/ssr/single-fetch.js +345 -0
  160. package/dist/production/lib/dom-export/dom-router-provider.d.ts +9 -0
  161. package/dist/production/lib/dom-export/dom-router-provider.js +22 -0
  162. package/dist/production/lib/dom-export/hydrated-router.d.ts +125 -0
  163. package/dist/production/lib/dom-export/hydrated-router.js +150 -0
  164. package/dist/production/lib/errors.js +29 -0
  165. package/dist/production/lib/hooks.d.ts +947 -0
  166. package/dist/production/lib/hooks.js +1373 -0
  167. package/dist/production/lib/href.d.ts +20 -0
  168. package/dist/production/lib/href.js +50 -0
  169. package/dist/production/lib/router/history.d.ts +258 -0
  170. package/dist/production/lib/router/history.js +372 -0
  171. package/dist/production/lib/router/instrumentation.d.ts +86 -0
  172. package/dist/production/lib/router/instrumentation.js +213 -0
  173. package/dist/production/lib/router/links.d.ts +114 -0
  174. package/dist/production/lib/router/router.d.ts +663 -0
  175. package/dist/production/lib/router/router.js +2988 -0
  176. package/dist/production/lib/router/url.js +18 -0
  177. package/dist/production/lib/router/utils.d.ts +948 -0
  178. package/dist/production/lib/router/utils.js +801 -0
  179. package/dist/production/lib/rsc/browser.d.ts +137 -0
  180. package/dist/production/lib/rsc/browser.js +603 -0
  181. package/dist/production/lib/rsc/errorBoundaries.d.ts +11 -0
  182. package/dist/production/lib/rsc/errorBoundaries.js +90 -0
  183. package/dist/production/lib/rsc/html-stream/browser.d.ts +48 -0
  184. package/dist/production/lib/rsc/html-stream/browser.js +74 -0
  185. package/dist/production/lib/rsc/html-stream/server.js +78 -0
  186. package/dist/production/lib/rsc/route-modules.js +27 -0
  187. package/dist/production/lib/rsc/server.rsc.d.ts +219 -0
  188. package/dist/production/lib/rsc/server.ssr.d.ts +129 -0
  189. package/dist/production/lib/rsc/server.ssr.js +404 -0
  190. package/dist/production/lib/server-runtime/build.d.ts +66 -0
  191. package/dist/production/lib/server-runtime/cookies.d.ts +66 -0
  192. package/dist/production/lib/server-runtime/cookies.js +139 -0
  193. package/dist/production/lib/server-runtime/crypto.js +43 -0
  194. package/dist/production/lib/server-runtime/data.d.ts +13 -0
  195. package/dist/production/lib/server-runtime/data.js +25 -0
  196. package/dist/production/lib/server-runtime/dev.d.ts +9 -0
  197. package/dist/production/lib/server-runtime/dev.js +26 -0
  198. package/dist/production/lib/server-runtime/entry.js +20 -0
  199. package/dist/production/lib/server-runtime/errors.js +75 -0
  200. package/dist/production/lib/server-runtime/headers.js +73 -0
  201. package/dist/production/lib/server-runtime/invariant.js +19 -0
  202. package/dist/production/lib/server-runtime/mode.d.ts +12 -0
  203. package/dist/production/lib/server-runtime/mode.js +25 -0
  204. package/dist/production/lib/server-runtime/routeMatching.js +28 -0
  205. package/dist/production/lib/server-runtime/routes.d.ts +13 -0
  206. package/dist/production/lib/server-runtime/routes.js +74 -0
  207. package/dist/production/lib/server-runtime/server.d.ts +10 -0
  208. package/dist/production/lib/server-runtime/server.js +345 -0
  209. package/dist/production/lib/server-runtime/serverHandoff.js +17 -0
  210. package/dist/production/lib/server-runtime/sessions/cookieStorage.d.ts +25 -0
  211. package/dist/production/lib/server-runtime/sessions/cookieStorage.js +45 -0
  212. package/dist/production/lib/server-runtime/sessions/memoryStorage.d.ts +23 -0
  213. package/dist/production/lib/server-runtime/sessions/memoryStorage.js +52 -0
  214. package/dist/production/lib/server-runtime/sessions.d.ts +145 -0
  215. package/dist/production/lib/server-runtime/sessions.js +98 -0
  216. package/dist/production/lib/server-runtime/single-fetch.d.ts +7 -0
  217. package/dist/production/lib/server-runtime/single-fetch.js +215 -0
  218. package/dist/production/lib/server-runtime/urls.js +28 -0
  219. package/dist/production/lib/server-runtime/warnings.js +20 -0
  220. package/dist/production/lib/types/future.d.ts +9 -0
  221. package/dist/production/lib/types/internal.d.ts +26 -177
  222. package/dist/production/lib/types/internal.js +3 -2
  223. package/dist/production/{register-roq_0qYo.d.ts → lib/types/register.d.ts} +9 -15
  224. package/dist/production/lib/types/route-data.d.ts +113 -0
  225. package/dist/production/lib/types/route-module-annotations.d.ts +149 -0
  226. package/dist/production/lib/types/route-module.d.ts +19 -0
  227. package/dist/production/lib/types/serializes-to.d.ts +13 -0
  228. package/dist/production/lib/types/utils.d.ts +11 -0
  229. package/dist/production/vendor/turbo-stream-v2/flatten.js +159 -0
  230. package/dist/production/vendor/turbo-stream-v2/turbo-stream.js +179 -0
  231. package/dist/production/vendor/turbo-stream-v2/unflatten.js +199 -0
  232. package/dist/production/vendor/turbo-stream-v2/utils.js +39 -0
  233. package/docs/explanation/code-splitting.md +16 -0
  234. package/docs/how-to/middleware.md +6 -41
  235. package/docs/how-to/react-server-components.md +1 -1
  236. package/docs/upgrading/future.md +0 -249
  237. package/package.json +43 -87
  238. package/dist/development/browser-B2PdsXXH.d.ts +0 -318
  239. package/dist/development/browser-DBmQ1yAR.d.mts +0 -318
  240. package/dist/development/chunk-4ZMWKKQ3.mjs +0 -11606
  241. package/dist/development/chunk-E4MTK73K.mjs +0 -2517
  242. package/dist/development/chunk-U7ORXROY.js +0 -10307
  243. package/dist/development/chunk-WW7PN6QI.js +0 -188
  244. package/dist/development/chunk-YL5M26XI.js +0 -1366
  245. package/dist/development/context-CeD5LmaF.d.mts +0 -1779
  246. package/dist/development/data-CjO11-hU.d.ts +0 -1740
  247. package/dist/development/data-DEjBmEfD.d.mts +0 -1740
  248. package/dist/development/dom-export.d.mts +0 -172
  249. package/dist/development/dom-export.mjs +0 -1010
  250. package/dist/development/index-react-server-client-3ykjivgQ.d.ts +0 -3677
  251. package/dist/development/index-react-server-client-CACgcj2J.d.mts +0 -2614
  252. package/dist/development/index-react-server-client.d.mts +0 -4
  253. package/dist/development/index-react-server-client.mjs +0 -59
  254. package/dist/development/index-react-server.d.mts +0 -2711
  255. package/dist/development/index-react-server.mjs +0 -3803
  256. package/dist/development/index.d.mts +0 -1479
  257. package/dist/development/index.mjs +0 -275
  258. package/dist/development/instrumentation-Dkmpzd13.d.ts +0 -715
  259. package/dist/development/lib/types/internal.d.mts +0 -184
  260. package/dist/development/lib/types/internal.mjs +0 -10
  261. package/dist/development/register-CmkRspdl.d.mts +0 -30
  262. package/dist/production/browser-B2PdsXXH.d.ts +0 -318
  263. package/dist/production/browser-DBmQ1yAR.d.mts +0 -318
  264. package/dist/production/chunk-3Z6WS2WZ.js +0 -188
  265. package/dist/production/chunk-BIP66BKV.js +0 -1366
  266. package/dist/production/chunk-EGOTSXNH.mjs +0 -2517
  267. package/dist/production/chunk-IUPBOWYO.js +0 -10307
  268. package/dist/production/chunk-M7NGGUU6.mjs +0 -11606
  269. package/dist/production/context-CeD5LmaF.d.mts +0 -1779
  270. package/dist/production/data-CjO11-hU.d.ts +0 -1740
  271. package/dist/production/data-DEjBmEfD.d.mts +0 -1740
  272. package/dist/production/dom-export.d.mts +0 -172
  273. package/dist/production/dom-export.mjs +0 -1010
  274. package/dist/production/index-react-server-client-3ykjivgQ.d.ts +0 -3677
  275. package/dist/production/index-react-server-client-CACgcj2J.d.mts +0 -2614
  276. package/dist/production/index-react-server-client.d.mts +0 -4
  277. package/dist/production/index-react-server-client.mjs +0 -59
  278. package/dist/production/index-react-server.d.mts +0 -2711
  279. package/dist/production/index-react-server.mjs +0 -3803
  280. package/dist/production/index.d.mts +0 -1479
  281. package/dist/production/index.mjs +0 -275
  282. package/dist/production/instrumentation-Dkmpzd13.d.ts +0 -715
  283. package/dist/production/lib/types/internal.d.mts +0 -184
  284. package/dist/production/lib/types/internal.mjs +0 -10
  285. package/dist/production/register-CmkRspdl.d.mts +0 -30
@@ -1,2711 +0,0 @@
1
- import * as React from 'react';
2
- export { BrowserRouter, Form, HashRouter, Link, Links, MemoryRouter, Meta, NavLink, Navigate, Outlet, Route, Router, RouterProvider, Routes, ScrollRestoration, StaticRouter, StaticRouterProvider, unstable_HistoryRouter } from 'react-router/internal/react-server-client';
3
- import { ParseOptions, SerializeOptions } from 'cookie';
4
- export { ParseOptions as CookieParseOptions, SerializeOptions as CookieSerializeOptions } from 'cookie';
5
-
6
- /**
7
- * Actions represent the type of change to a location value.
8
- */
9
- declare enum Action {
10
- /**
11
- * A POP indicates a change to an arbitrary index in the history stack, such
12
- * as a back or forward navigation. It does not describe the direction of the
13
- * navigation, only that the current index changed.
14
- *
15
- * Note: This is the default action for newly created history objects.
16
- */
17
- Pop = "POP",
18
- /**
19
- * A PUSH indicates a new entry being added to the history stack, such as when
20
- * a link is clicked and a new page loads. When this happens, all subsequent
21
- * entries in the stack are lost.
22
- */
23
- Push = "PUSH",
24
- /**
25
- * A REPLACE indicates the entry at the current index in the history stack
26
- * being replaced by a new one.
27
- */
28
- Replace = "REPLACE"
29
- }
30
- /**
31
- * The pathname, search, and hash values of a URL.
32
- */
33
- interface Path {
34
- /**
35
- * A URL pathname, beginning with a /.
36
- */
37
- pathname: string;
38
- /**
39
- * A URL search string, beginning with a ?.
40
- */
41
- search: string;
42
- /**
43
- * A URL fragment identifier, beginning with a #.
44
- */
45
- hash: string;
46
- }
47
- /**
48
- * An entry in a history stack. A location contains information about the
49
- * URL path, as well as possibly some arbitrary state and a key.
50
- */
51
- interface Location<State = any> extends Path {
52
- /**
53
- * A value of arbitrary data associated with this location.
54
- */
55
- state: State;
56
- /**
57
- * A unique string associated with this location. May be used to safely store
58
- * and retrieve data in some other storage API, like `localStorage`.
59
- *
60
- * Note: This value is always "default" on the initial location.
61
- */
62
- key: string;
63
- /**
64
- * The masked location displayed in the URL bar, which differs from the URL the
65
- * router is operating on
66
- */
67
- mask?: Path;
68
- }
69
- /**
70
- * A change to the current location.
71
- */
72
- interface Update {
73
- /**
74
- * The action that triggered the change.
75
- */
76
- action: Action;
77
- /**
78
- * The new location.
79
- */
80
- location: Location;
81
- /**
82
- * The delta between this location and the former location in the history stack
83
- */
84
- delta: number | null;
85
- }
86
- /**
87
- * A function that receives notifications about location changes.
88
- */
89
- interface Listener {
90
- (update: Update): void;
91
- }
92
- /**
93
- * Describes a location that is the destination of some navigation used in
94
- * {@link Link}, {@link useNavigate}, etc.
95
- */
96
- type To = string | Partial<Path>;
97
- /**
98
- * A history is an interface to the navigation stack. The history serves as the
99
- * source of truth for the current location, as well as provides a set of
100
- * methods that may be used to change it.
101
- *
102
- * It is similar to the DOM's `window.history` object, but with a smaller, more
103
- * focused API.
104
- */
105
- interface History {
106
- /**
107
- * The last action that modified the current location. This will always be
108
- * Action.Pop when a history instance is first created. This value is mutable.
109
- */
110
- readonly action: Action;
111
- /**
112
- * The current location. This value is mutable.
113
- */
114
- readonly location: Location;
115
- /**
116
- * Returns a valid href for the given `to` value that may be used as
117
- * the value of an <a href> attribute.
118
- *
119
- * @param to - The destination URL
120
- */
121
- createHref(to: To): string;
122
- /**
123
- * Returns a URL for the given `to` value
124
- *
125
- * @param to - The destination URL
126
- */
127
- createURL(to: To): URL;
128
- /**
129
- * Encode a location the same way window.history would do (no-op for memory
130
- * history) so we ensure our PUSH/REPLACE navigations for data routers
131
- * behave the same as POP
132
- *
133
- * @param to Unencoded path
134
- */
135
- encodeLocation(to: To): Path;
136
- /**
137
- * Pushes a new location onto the history stack, increasing its length by one.
138
- * If there were any entries in the stack after the current one, they are
139
- * lost.
140
- *
141
- * @param to - The new URL
142
- * @param state - Data to associate with the new location
143
- */
144
- push(to: To, state?: any): void;
145
- /**
146
- * Replaces the current location in the history stack with a new one. The
147
- * location that was replaced will no longer be available.
148
- *
149
- * @param to - The new URL
150
- * @param state - Data to associate with the new location
151
- */
152
- replace(to: To, state?: any): void;
153
- /**
154
- * Navigates `n` entries backward/forward in the history stack relative to the
155
- * current index. For example, a "back" navigation would use go(-1).
156
- *
157
- * @param delta - The delta in the stack index
158
- */
159
- go(delta: number): void;
160
- /**
161
- * Sets up a listener that will be called whenever the current location
162
- * changes.
163
- *
164
- * @param listener - A function that will be called when the location changes
165
- * @returns unlisten - A function that may be used to stop listening
166
- */
167
- listen(listener: Listener): () => void;
168
- }
169
-
170
- /**
171
- * An augmentable interface users can modify in their app-code to opt into
172
- * future-flag-specific types
173
- */
174
- interface Future {
175
- }
176
- type MiddlewareEnabled = Future extends {
177
- v8_middleware: infer T extends boolean;
178
- } ? T : false;
179
-
180
- type MaybePromise<T> = T | Promise<T>;
181
- /**
182
- * Map of routeId -> data returned from a loader/action/error
183
- */
184
- interface RouteData {
185
- [routeId: string]: any;
186
- }
187
- type LowerCaseFormMethod = "get" | "post" | "put" | "patch" | "delete";
188
- type UpperCaseFormMethod = Uppercase<LowerCaseFormMethod>;
189
- /**
190
- * Users can specify either lowercase or uppercase form methods on `<Form>`,
191
- * useSubmit(), `<fetcher.Form>`, etc.
192
- */
193
- type HTMLFormMethod = LowerCaseFormMethod | UpperCaseFormMethod;
194
- /**
195
- * Active navigation/fetcher form methods are exposed in uppercase on the
196
- * RouterState. This is to align with the normalization done via fetch().
197
- */
198
- type FormMethod = UpperCaseFormMethod;
199
- type FormEncType = "application/x-www-form-urlencoded" | "multipart/form-data" | "application/json" | "text/plain";
200
- type JsonObject = {
201
- [Key in string]: JsonValue;
202
- } & {
203
- [Key in string]?: JsonValue | undefined;
204
- };
205
- type JsonArray = JsonValue[] | readonly JsonValue[];
206
- type JsonPrimitive = string | number | boolean | null;
207
- type JsonValue = JsonPrimitive | JsonObject | JsonArray;
208
- /**
209
- * @private
210
- * Internal interface to pass around for action submissions, not intended for
211
- * external consumption
212
- */
213
- type Submission = {
214
- formMethod: FormMethod;
215
- formAction: string;
216
- formEncType: FormEncType;
217
- formData: FormData;
218
- json: undefined;
219
- text: undefined;
220
- } | {
221
- formMethod: FormMethod;
222
- formAction: string;
223
- formEncType: FormEncType;
224
- formData: undefined;
225
- json: JsonValue;
226
- text: undefined;
227
- } | {
228
- formMethod: FormMethod;
229
- formAction: string;
230
- formEncType: FormEncType;
231
- formData: undefined;
232
- json: undefined;
233
- text: string;
234
- };
235
- /**
236
- * A context instance used as the key for the `get`/`set` methods of a
237
- * {@link RouterContextProvider}. Accepts an optional default
238
- * value to be returned if no value has been set.
239
- */
240
- interface RouterContext<T = unknown> {
241
- defaultValue?: T;
242
- }
243
- /**
244
- * Creates a type-safe {@link RouterContext} object that can be used to
245
- * store and retrieve arbitrary values in [`action`](../../start/framework/route-module#action)s,
246
- * [`loader`](../../start/framework/route-module#loader)s, and [middleware](../../how-to/middleware).
247
- * Similar to React's [`createContext`](https://react.dev/reference/react/createContext),
248
- * but specifically designed for React Router's request/response lifecycle.
249
- *
250
- * If a `defaultValue` is provided, it will be returned from `context.get()`
251
- * when no value has been set for the context. Otherwise, reading this context
252
- * when no value has been set will throw an error.
253
- *
254
- * ```tsx filename=app/context.ts
255
- * import { createContext } from "react-router";
256
- *
257
- * // Create a context for user data
258
- * export const userContext =
259
- * createContext<User | null>(null);
260
- * ```
261
- *
262
- * ```tsx filename=app/middleware/auth.ts
263
- * import { getUserFromSession } from "~/auth.server";
264
- * import { userContext } from "~/context";
265
- *
266
- * export const authMiddleware = async ({
267
- * context,
268
- * request,
269
- * }) => {
270
- * const user = await getUserFromSession(request);
271
- * context.set(userContext, user);
272
- * };
273
- * ```
274
- *
275
- * ```tsx filename=app/routes/profile.tsx
276
- * import { userContext } from "~/context";
277
- *
278
- * export async function loader({
279
- * context,
280
- * }: Route.LoaderArgs) {
281
- * const user = context.get(userContext);
282
- *
283
- * if (!user) {
284
- * throw new Response("Unauthorized", { status: 401 });
285
- * }
286
- *
287
- * return { user };
288
- * }
289
- * ```
290
- *
291
- * @public
292
- * @category Utils
293
- * @mode framework
294
- * @mode data
295
- * @param defaultValue An optional default value for the context. This value
296
- * will be returned if no value has been set for this context.
297
- * @returns A {@link RouterContext} object that can be used with
298
- * `context.get()` and `context.set()` in [`action`](../../start/framework/route-module#action)s,
299
- * [`loader`](../../start/framework/route-module#loader)s, and [middleware](../../how-to/middleware).
300
- */
301
- declare function createContext<T>(defaultValue?: T): RouterContext<T>;
302
- /**
303
- * Provides methods for writing/reading values in application context in a
304
- * type-safe way. Primarily for usage with [middleware](../../how-to/middleware).
305
- *
306
- * @example
307
- * import {
308
- * createContext,
309
- * RouterContextProvider
310
- * } from "react-router";
311
- *
312
- * const userContext = createContext<User | null>(null);
313
- * const contextProvider = new RouterContextProvider();
314
- * contextProvider.set(userContext, getUser());
315
- * // ^ Type-safe
316
- * const user = contextProvider.get(userContext);
317
- * // ^ User
318
- *
319
- * @public
320
- * @category Utils
321
- * @mode framework
322
- * @mode data
323
- */
324
- declare class RouterContextProvider {
325
- #private;
326
- /**
327
- * Create a new `RouterContextProvider` instance
328
- * @param init An optional initial context map to populate the provider with
329
- */
330
- constructor(init?: Map<RouterContext, unknown>);
331
- /**
332
- * Access a value from the context. If no value has been set for the context,
333
- * it will return the context's `defaultValue` if provided, or throw an error
334
- * if no `defaultValue` was set.
335
- * @param context The context to get the value for
336
- * @returns The value for the context, or the context's `defaultValue` if no
337
- * value was set
338
- */
339
- get<T>(context: RouterContext<T>): T;
340
- /**
341
- * Set a value for the context. If the context already has a value set, this
342
- * will overwrite it.
343
- *
344
- * @param context The context to set the value for
345
- * @param value The value to set for the context
346
- * @returns {void}
347
- */
348
- set<C extends RouterContext>(context: C, value: C extends RouterContext<infer T> ? T : never): void;
349
- }
350
- type DefaultContext = MiddlewareEnabled extends true ? Readonly<RouterContextProvider> : any;
351
- /**
352
- * @private
353
- * Arguments passed to route loader/action functions. Same for now but we keep
354
- * this as a private implementation detail in case they diverge in the future.
355
- */
356
- interface DataFunctionArgs<Context> {
357
- /** A {@link https://developer.mozilla.org/en-US/docs/Web/API/Request Fetch Request instance} which you can use to read headers (like cookies, and {@link https://developer.mozilla.org/en-US/docs/Web/API/URLSearchParams URLSearchParams} from the request. */
358
- request: Request;
359
- /**
360
- * A URL instance representing the application location being navigated to or
361
- * fetched. By default, this matches `request.url`.
362
- *
363
- * In Framework mode with `future.v8_passThroughRequests` enabled, this is a
364
- * normalized URL with React-Router-specific implementation details removed
365
- * (`.data` suffixes, `index`/`_routes` search params).
366
- */
367
- url: URL;
368
- /**
369
- * Matched un-interpolated route pattern for the current path (i.e., /blog/:slug).
370
- * Mostly useful as a identifier to aggregate on for logging/tracing/etc.
371
- */
372
- pattern: string;
373
- /**
374
- * {@link https://reactrouter.com/start/framework/routing#dynamic-segments Dynamic route params} for the current route.
375
- * @example
376
- * // app/routes.ts
377
- * route("teams/:teamId", "./team.tsx"),
378
- *
379
- * // app/team.tsx
380
- * export function loader({
381
- * params,
382
- * }: Route.LoaderArgs) {
383
- * params.teamId;
384
- * // ^ string
385
- * }
386
- */
387
- params: Params;
388
- /**
389
- * This is the context passed in to your server adapter's getLoadContext() function.
390
- * It's a way to bridge the gap between the adapter's request/response API with your React Router app.
391
- * It is only applicable if you are using a custom server adapter.
392
- */
393
- context: Context;
394
- }
395
- /**
396
- * Route middleware `next` function to call downstream handlers and then complete
397
- * middlewares from the bottom-up
398
- */
399
- interface MiddlewareNextFunction<Result = unknown> {
400
- (): Promise<Result>;
401
- }
402
- /**
403
- * Route middleware function signature. Receives the same "data" arguments as a
404
- * `loader`/`action` (`request`, `params`, `context`) as the first parameter and
405
- * a `next` function as the second parameter which will call downstream handlers
406
- * and then complete middlewares from the bottom-up
407
- */
408
- type MiddlewareFunction<Result = unknown> = (args: DataFunctionArgs<Readonly<RouterContextProvider>>, next: MiddlewareNextFunction<Result>) => MaybePromise<Result | void>;
409
- /**
410
- * Arguments passed to loader functions
411
- */
412
- interface LoaderFunctionArgs<Context = DefaultContext> extends DataFunctionArgs<Context> {
413
- }
414
- /**
415
- * Arguments passed to action functions
416
- */
417
- interface ActionFunctionArgs<Context = DefaultContext> extends DataFunctionArgs<Context> {
418
- }
419
- /**
420
- * Loaders and actions can return anything
421
- */
422
- type DataFunctionValue = unknown;
423
- type DataFunctionReturnValue = MaybePromise<DataFunctionValue>;
424
- /**
425
- * Route loader function signature
426
- */
427
- type LoaderFunction<Context = DefaultContext> = {
428
- (args: LoaderFunctionArgs<Context>, handlerCtx?: unknown): DataFunctionReturnValue;
429
- } & {
430
- hydrate?: boolean;
431
- };
432
- /**
433
- * Route action function signature
434
- */
435
- interface ActionFunction<Context = DefaultContext> {
436
- (args: ActionFunctionArgs<Context>, handlerCtx?: unknown): DataFunctionReturnValue;
437
- }
438
- /**
439
- * Arguments passed to shouldRevalidate function
440
- */
441
- interface ShouldRevalidateFunctionArgs {
442
- /** This is the url the navigation started from. You can compare it with `nextUrl` to decide if you need to revalidate this route's data. */
443
- currentUrl: URL;
444
- /** These are the {@link https://reactrouter.com/start/framework/routing#dynamic-segments dynamic route params} from the URL that can be compared to the `nextParams` to decide if you need to reload or not. Perhaps you're using only a partial piece of the param for data loading, you don't need to revalidate if a superfluous part of the param changed. */
445
- currentParams: DataRouteMatch["params"];
446
- /** In the case of navigation, this the URL the user is requesting. Some revalidations are not navigation, so it will simply be the same as currentUrl. */
447
- nextUrl: URL;
448
- /** In the case of navigation, these are the {@link https://reactrouter.com/start/framework/routing#dynamic-segments dynamic route params} from the next location the user is requesting. Some revalidations are not navigation, so it will simply be the same as currentParams. */
449
- nextParams: DataRouteMatch["params"];
450
- /** The method (probably `"GET"` or `"POST"`) used in the form submission that triggered the revalidation. */
451
- formMethod?: Submission["formMethod"];
452
- /** The form action (`<Form action="/somewhere">`) that triggered the revalidation. */
453
- formAction?: Submission["formAction"];
454
- /** The form encType (`<Form encType="application/x-www-form-urlencoded">) used in the form submission that triggered the revalidation*/
455
- formEncType?: Submission["formEncType"];
456
- /** The form submission data when the form's encType is `text/plain` */
457
- text?: Submission["text"];
458
- /** The form submission data when the form's encType is `application/x-www-form-urlencoded` or `multipart/form-data` */
459
- formData?: Submission["formData"];
460
- /** The form submission data when the form's encType is `application/json` */
461
- json?: Submission["json"];
462
- /** The status code of the action response */
463
- actionStatus?: number;
464
- /**
465
- * When a submission causes the revalidation this will be the result of the action—either action data or an error if the action failed. It's common to include some information in the action result to instruct shouldRevalidate to revalidate or not.
466
- *
467
- * @example
468
- * export async function action() {
469
- * await saveSomeStuff();
470
- * return { ok: true };
471
- * }
472
- *
473
- * export function shouldRevalidate({
474
- * actionResult,
475
- * }) {
476
- * if (actionResult?.ok) {
477
- * return false;
478
- * }
479
- * return true;
480
- * }
481
- */
482
- actionResult?: any;
483
- /**
484
- * By default, React Router doesn't call every loader all the time. There are reliable optimizations it can make by default. For example, only loaders with changing params are called. Consider navigating from the following URL to the one below it:
485
- *
486
- * /projects/123/tasks/abc
487
- * /projects/123/tasks/def
488
- * React Router will only call the loader for tasks/def because the param for projects/123 didn't change.
489
- *
490
- * It's safest to always return defaultShouldRevalidate after you've done your specific optimizations that return false, otherwise your UI might get out of sync with your data on the server.
491
- */
492
- defaultShouldRevalidate: boolean;
493
- }
494
- /**
495
- * Route shouldRevalidate function signature. This runs after any submission
496
- * (navigation or fetcher), so we flatten the navigation/fetcher submission
497
- * onto the arguments. It shouldn't matter whether it came from a navigation
498
- * or a fetcher, what really matters is the URLs and the formData since loaders
499
- * have to re-run based on the data models that were potentially mutated.
500
- */
501
- interface ShouldRevalidateFunction {
502
- (args: ShouldRevalidateFunctionArgs): boolean;
503
- }
504
- interface DataStrategyMatch extends RouteMatch<string, DataRouteObject> {
505
- /**
506
- * @private
507
- */
508
- _lazyPromises?: {
509
- middleware: Promise<void> | undefined;
510
- handler: Promise<void> | undefined;
511
- route: Promise<void> | undefined;
512
- };
513
- /**
514
- * @deprecated Deprecated in favor of `shouldCallHandler`
515
- *
516
- * A boolean value indicating whether this route handler should be called in
517
- * this pass.
518
- *
519
- * The `matches` array always includes _all_ matched routes even when only
520
- * _some_ route handlers need to be called so that things like middleware can
521
- * be implemented.
522
- *
523
- * `shouldLoad` is usually only interesting if you are skipping the route
524
- * handler entirely and implementing custom handler logic - since it lets you
525
- * determine if that custom logic should run for this route or not.
526
- *
527
- * For example:
528
- * - If you are on `/parent/child/a` and you navigate to `/parent/child/b` -
529
- * you'll get an array of three matches (`[parent, child, b]`), but only `b`
530
- * will have `shouldLoad=true` because the data for `parent` and `child` is
531
- * already loaded
532
- * - If you are on `/parent/child/a` and you submit to `a`'s [`action`](https://reactrouter.com/docs/start/data/route-object#action),
533
- * then only `a` will have `shouldLoad=true` for the action execution of
534
- * `dataStrategy`
535
- * - After the [`action`](https://reactrouter.com/docs/start/data/route-object#action),
536
- * `dataStrategy` will be called again for the [`loader`](https://reactrouter.com/docs/start/data/route-object#loader)
537
- * revalidation, and all matches will have `shouldLoad=true` (assuming no
538
- * custom `shouldRevalidate` implementations)
539
- */
540
- shouldLoad: boolean;
541
- /**
542
- * Arguments passed to the `shouldRevalidate` function for this `loader` execution.
543
- * Will be `null` if this is not a revalidating loader {@link DataStrategyMatch}.
544
- */
545
- shouldRevalidateArgs: ShouldRevalidateFunctionArgs | null;
546
- /**
547
- * Determine if this route's handler should be called during this `dataStrategy`
548
- * execution. Calling it with no arguments will leverage the default revalidation
549
- * behavior. You can pass your own `defaultShouldRevalidate` value if you wish
550
- * to change the default revalidation behavior with your `dataStrategy`.
551
- *
552
- * @param defaultShouldRevalidate `defaultShouldRevalidate` override value (optional)
553
- */
554
- shouldCallHandler(defaultShouldRevalidate?: boolean): boolean;
555
- /**
556
- * An async function that will resolve any `route.lazy` implementations and
557
- * execute the route's handler (if necessary), returning a {@link DataStrategyResult}
558
- *
559
- * - Calling `match.resolve` does not mean you're calling the
560
- * [`action`](https://reactrouter.com/docs/start/data/route-object#action)/[`loader`](https://reactrouter.com/docs/start/data/route-object#loader)
561
- * (the "handler") - `resolve` will only call the `handler` internally if
562
- * needed _and_ if you don't pass your own `handlerOverride` function parameter
563
- * - It is safe to call `match.resolve` for all matches, even if they have
564
- * `shouldLoad=false`, and it will no-op if no loading is required
565
- * - You should generally always call `match.resolve()` for `shouldLoad:true`
566
- * routes to ensure that any `route.lazy` implementations are processed
567
- * - See the examples below for how to implement custom handler execution via
568
- * `match.resolve`
569
- */
570
- resolve: (handlerOverride?: (handler: (ctx?: unknown) => DataFunctionReturnValue) => DataFunctionReturnValue) => Promise<DataStrategyResult>;
571
- }
572
- interface DataStrategyFunctionArgs<Context = DefaultContext> extends DataFunctionArgs<Context> {
573
- /**
574
- * Matches for this route extended with Data strategy APIs
575
- */
576
- matches: DataStrategyMatch[];
577
- runClientMiddleware: (cb: DataStrategyFunction<Context>) => Promise<Record<string, DataStrategyResult>>;
578
- /**
579
- * The key of the fetcher we are calling `dataStrategy` for, otherwise `null`
580
- * for navigational executions
581
- */
582
- fetcherKey: string | null;
583
- }
584
- /**
585
- * Result from a loader or action called via dataStrategy
586
- */
587
- interface DataStrategyResult {
588
- type: "data" | "error";
589
- result: unknown;
590
- }
591
- interface DataStrategyFunction<Context = DefaultContext> {
592
- (args: DataStrategyFunctionArgs<Context>): Promise<Record<string, DataStrategyResult>>;
593
- }
594
- type PatchRoutesOnNavigationFunctionArgs = {
595
- signal: AbortSignal;
596
- path: string;
597
- matches: RouteMatch[];
598
- fetcherKey: string | undefined;
599
- patch: (routeId: string | null, children: RouteObject[]) => void;
600
- };
601
- type PatchRoutesOnNavigationFunction = (opts: PatchRoutesOnNavigationFunctionArgs) => MaybePromise<void>;
602
- /**
603
- * Function provided to set route-specific properties from route objects
604
- */
605
- interface MapRoutePropertiesFunction {
606
- (route: DataRouteObject): {
607
- hasErrorBoundary: boolean;
608
- } & Record<string, any>;
609
- }
610
- /**
611
- * Keys we cannot change from within a lazy object. We spread all other keys
612
- * onto the route. Either they're meaningful to the router, or they'll get
613
- * ignored.
614
- */
615
- type UnsupportedLazyRouteObjectKey = "lazy" | "caseSensitive" | "path" | "id" | "index" | "children";
616
- /**
617
- * Keys we cannot change from within a lazy() function. We spread all other keys
618
- * onto the route. Either they're meaningful to the router, or they'll get
619
- * ignored.
620
- */
621
- type UnsupportedLazyRouteFunctionKey = UnsupportedLazyRouteObjectKey | "middleware";
622
- /**
623
- * lazy object to load route properties, which can add non-matching
624
- * related properties to a route
625
- */
626
- type LazyRouteObject<R extends RouteObject> = {
627
- [K in keyof R as K extends UnsupportedLazyRouteObjectKey ? never : K]?: () => Promise<R[K] | null | undefined>;
628
- };
629
- /**
630
- * lazy() function to load a route definition, which can add non-matching
631
- * related properties to a route
632
- */
633
- interface LazyRouteFunction<R extends RouteObject> {
634
- (): Promise<Omit<R, UnsupportedLazyRouteFunctionKey> & Partial<Record<UnsupportedLazyRouteFunctionKey, never>>>;
635
- }
636
- type LazyRouteDefinition<R extends RouteObject> = LazyRouteObject<R> | LazyRouteFunction<R>;
637
- /**
638
- * Base RouteObject with common props shared by all types of routes
639
- * @internal
640
- */
641
- type BaseRouteObject = {
642
- /**
643
- * Whether the path should be case-sensitive. Defaults to `false`.
644
- */
645
- caseSensitive?: boolean;
646
- /**
647
- * The path pattern to match. If unspecified or empty, then this becomes a
648
- * layout route.
649
- */
650
- path?: string;
651
- /**
652
- * The unique identifier for this route (for use with {@link DataRouter}s)
653
- */
654
- id?: string;
655
- /**
656
- * The route middleware.
657
- * See [`middleware`](../../start/data/route-object#middleware).
658
- */
659
- middleware?: MiddlewareFunction[];
660
- /**
661
- * The route loader.
662
- * See [`loader`](../../start/data/route-object#loader).
663
- */
664
- loader?: LoaderFunction | boolean;
665
- /**
666
- * The route action.
667
- * See [`action`](../../start/data/route-object#action).
668
- */
669
- action?: ActionFunction | boolean;
670
- hasErrorBoundary?: boolean;
671
- /**
672
- * The route shouldRevalidate function.
673
- * See [`shouldRevalidate`](../../start/data/route-object#shouldRevalidate).
674
- */
675
- shouldRevalidate?: ShouldRevalidateFunction;
676
- /**
677
- * The route handle.
678
- */
679
- handle?: any;
680
- /**
681
- * A function that returns a promise that resolves to the route object.
682
- * Used for code-splitting routes.
683
- * See [`lazy`](../../start/data/route-object#lazy).
684
- */
685
- lazy?: LazyRouteDefinition<BaseRouteObject>;
686
- /**
687
- * The React Component to render when this route matches.
688
- * Mutually exclusive with `element`.
689
- */
690
- Component?: React.ComponentType | null;
691
- /**
692
- * The React element to render when this Route matches.
693
- * Mutually exclusive with `Component`.
694
- */
695
- element?: React.ReactNode | null;
696
- /**
697
- * The React Component to render at this route if an error occurs.
698
- * Mutually exclusive with `errorElement`.
699
- */
700
- ErrorBoundary?: React.ComponentType | null;
701
- /**
702
- * The React element to render at this route if an error occurs.
703
- * Mutually exclusive with `ErrorBoundary`.
704
- */
705
- errorElement?: React.ReactNode | null;
706
- /**
707
- * The React Component to render while this router is loading data.
708
- * Mutually exclusive with `hydrateFallbackElement`.
709
- */
710
- HydrateFallback?: React.ComponentType | null;
711
- /**
712
- * The React element to render while this router is loading data.
713
- * Mutually exclusive with `HydrateFallback`.
714
- */
715
- hydrateFallbackElement?: React.ReactNode | null;
716
- };
717
- /**
718
- * Index routes must not have children
719
- */
720
- type IndexRouteObject = BaseRouteObject & {
721
- /**
722
- * Child Route objects - not valid on index routes.
723
- */
724
- children?: undefined;
725
- /**
726
- * Whether this is an index route.
727
- */
728
- index: true;
729
- };
730
- /**
731
- * Non-index routes may have children, but cannot have `index` set to `true`.
732
- */
733
- type NonIndexRouteObject = BaseRouteObject & {
734
- /**
735
- * Child Route objects.
736
- */
737
- children?: RouteObject[];
738
- /**
739
- * Whether this is an index route - must be `false` or undefined on non-index routes.
740
- */
741
- index?: false;
742
- };
743
- /**
744
- * A route object represents a logical route, with (optionally) its child
745
- * routes organized in a tree-like structure.
746
- */
747
- type RouteObject = IndexRouteObject | NonIndexRouteObject;
748
- type DataIndexRouteObject = IndexRouteObject & {
749
- id: string;
750
- };
751
- type DataNonIndexRouteObject = NonIndexRouteObject & {
752
- children?: DataRouteObject[];
753
- id: string;
754
- };
755
- /**
756
- * A data route object, which is just a RouteObject with a required unique ID
757
- */
758
- type DataRouteObject = DataIndexRouteObject | DataNonIndexRouteObject;
759
- type RouteManifest<R = DataRouteObject> = Record<string, R | undefined>;
760
- /**
761
- * The parameters that were parsed from the URL path.
762
- */
763
- type Params<Key extends string = string> = {
764
- readonly [key in Key]: string | undefined;
765
- };
766
- /**
767
- * A RouteMatch contains info about how a route matched a URL.
768
- */
769
- interface RouteMatch<ParamKey extends string = string, RouteObjectType extends RouteObject = RouteObject> {
770
- /**
771
- * The names and values of dynamic parameters in the URL.
772
- */
773
- params: Params<ParamKey>;
774
- /**
775
- * The portion of the URL pathname that was matched.
776
- */
777
- pathname: string;
778
- /**
779
- * The portion of the URL pathname that was matched before child routes.
780
- */
781
- pathnameBase: string;
782
- /**
783
- * The route object that was used to match.
784
- */
785
- route: RouteObjectType;
786
- }
787
- interface DataRouteMatch extends RouteMatch<string, DataRouteObject> {
788
- }
789
- /**
790
- * Matches the given routes to a location and returns the match data.
791
- *
792
- * @example
793
- * import { matchRoutes } from "react-router";
794
- *
795
- * let routes = [{
796
- * path: "/",
797
- * Component: Root,
798
- * children: [{
799
- * path: "dashboard",
800
- * Component: Dashboard,
801
- * }]
802
- * }];
803
- *
804
- * matchRoutes(routes, "/dashboard"); // [rootMatch, dashboardMatch]
805
- *
806
- * @public
807
- * @category Utils
808
- * @param routes The array of route objects to match against.
809
- * @param locationArg The location to match against, either a string path or a
810
- * partial {@link Location} object
811
- * @param basename Optional base path to strip from the location before matching.
812
- * Defaults to `/`.
813
- * @returns An array of matched routes, or `null` if no matches were found.
814
- */
815
- declare function matchRoutes<RouteObjectType extends RouteObject = RouteObject>(routes: RouteObjectType[], locationArg: Partial<Location> | string, basename?: string): RouteMatch<string, RouteObjectType>[] | null;
816
- interface UIMatch<Data = unknown, Handle = unknown> {
817
- id: string;
818
- pathname: string;
819
- /**
820
- * {@link https://reactrouter.com/start/framework/routing#dynamic-segments Dynamic route params} for the matched route.
821
- */
822
- params: RouteMatch["params"];
823
- /**
824
- * The return value from the matched route's loader or clientLoader. This might
825
- * be `undefined` if this route's `loader` (or a deeper route's `loader`) threw
826
- * an error and we're currently displaying an `ErrorBoundary`.
827
- *
828
- * @deprecated Use `UIMatch.loaderData` instead
829
- */
830
- data: Data | undefined;
831
- /**
832
- * The return value from the matched route's loader or clientLoader. This might
833
- * be `undefined` if this route's `loader` (or a deeper route's `loader`) threw
834
- * an error and we're currently displaying an `ErrorBoundary`.
835
- */
836
- loaderData: Data | undefined;
837
- /**
838
- * The {@link https://reactrouter.com/start/framework/route-module#handle handle object}
839
- * exported from the matched route module
840
- */
841
- handle: Handle;
842
- }
843
- interface RouteMeta<RouteObjectType extends RouteObject = RouteObject> {
844
- relativePath: string;
845
- caseSensitive: boolean;
846
- childrenIndex: number;
847
- route: RouteObjectType;
848
- matcher?: RegExp;
849
- compiledParams?: CompiledPathParam[];
850
- }
851
- /**
852
- * @private
853
- * PRIVATE - DO NOT USE
854
- *
855
- * A "branch" of routes that match a given route pattern.
856
- * This is an internal interface not intended for direct external usage.
857
- */
858
- interface RouteBranch<RouteObjectType extends RouteObject = RouteObject> {
859
- path: string;
860
- score: number;
861
- routesMeta: RouteMeta<RouteObjectType>[];
862
- }
863
- type CompiledPathParam = {
864
- paramName: string;
865
- isOptional?: boolean;
866
- };
867
- declare class DataWithResponseInit<D> {
868
- type: string;
869
- data: D;
870
- init: ResponseInit | null;
871
- constructor(data: D, init?: ResponseInit);
872
- }
873
- /**
874
- * Create "responses" that contain `headers`/`status` without forcing
875
- * serialization into an actual [`Response`](https://developer.mozilla.org/en-US/docs/Web/API/Response)
876
- *
877
- * @example
878
- * import { data } from "react-router";
879
- *
880
- * export async function action({ request }: Route.ActionArgs) {
881
- * let formData = await request.formData();
882
- * let item = await createItem(formData);
883
- * return data(item, {
884
- * headers: { "X-Custom-Header": "value" }
885
- * status: 201,
886
- * });
887
- * }
888
- *
889
- * @public
890
- * @category Utils
891
- * @mode framework
892
- * @mode data
893
- * @param data The data to be included in the response.
894
- * @param init The status code or a `ResponseInit` object to be included in the
895
- * response.
896
- * @returns A {@link DataWithResponseInit} instance containing the data and
897
- * response init.
898
- */
899
- declare function data<D>(data: D, init?: number | ResponseInit): DataWithResponseInit<D>;
900
- type RedirectFunction = (url: string, init?: number | ResponseInit) => Response;
901
- /**
902
- * A redirect [`Response`](https://developer.mozilla.org/en-US/docs/Web/API/Response).
903
- * Sets the status code and the [`Location`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Location)
904
- * header. Defaults to [`302 Found`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/302).
905
- *
906
- * This utility accepts absolute URLs and can navigate to external domains, so
907
- * the application should validate any user-supplied inputs to redirects.
908
- *
909
- * @example
910
- * import { redirect } from "react-router";
911
- *
912
- * export async function loader({ request }: Route.LoaderArgs) {
913
- * if (!isLoggedIn(request))
914
- * throw redirect("/login");
915
- * }
916
- *
917
- * // ...
918
- * }
919
- *
920
- * @public
921
- * @category Utils
922
- * @mode framework
923
- * @mode data
924
- * @param url The URL to redirect to.
925
- * @param init The status code or a `ResponseInit` object to be included in the
926
- * response.
927
- * @returns A [`Response`](https://developer.mozilla.org/en-US/docs/Web/API/Response)
928
- * object with the redirect status and [`Location`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Location)
929
- * header.
930
- */
931
- declare const redirect$1: RedirectFunction;
932
- /**
933
- * A redirect [`Response`](https://developer.mozilla.org/en-US/docs/Web/API/Response)
934
- * that will force a document reload to the new location. Sets the status code
935
- * and the [`Location`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Location)
936
- * header. Defaults to [`302 Found`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/302).
937
- *
938
- * This utility accepts absolute URLs and can navigate to external domains, so
939
- * the application should validate any user-supplied inputs to redirects.
940
- *
941
- * ```tsx filename=routes/logout.tsx
942
- * import { redirectDocument } from "react-router";
943
- *
944
- * import { destroySession } from "../sessions.server";
945
- *
946
- * export async function action({ request }: Route.ActionArgs) {
947
- * let session = await getSession(request.headers.get("Cookie"));
948
- * return redirectDocument("/", {
949
- * headers: { "Set-Cookie": await destroySession(session) }
950
- * });
951
- * }
952
- * ```
953
- *
954
- * @public
955
- * @category Utils
956
- * @mode framework
957
- * @mode data
958
- * @param url The URL to redirect to.
959
- * @param init The status code or a `ResponseInit` object to be included in the
960
- * response.
961
- * @returns A [`Response`](https://developer.mozilla.org/en-US/docs/Web/API/Response)
962
- * object with the redirect status and [`Location`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Location)
963
- * header.
964
- */
965
- declare const redirectDocument$1: RedirectFunction;
966
- /**
967
- * A redirect [`Response`](https://developer.mozilla.org/en-US/docs/Web/API/Response)
968
- * that will perform a [`history.replaceState`](https://developer.mozilla.org/en-US/docs/Web/API/History/replaceState)
969
- * instead of a [`history.pushState`](https://developer.mozilla.org/en-US/docs/Web/API/History/pushState)
970
- * for client-side navigation redirects. Sets the status code and the [`Location`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Location)
971
- * header. Defaults to [`302 Found`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/302).
972
- *
973
- * @example
974
- * import { replace } from "react-router";
975
- *
976
- * export async function loader() {
977
- * return replace("/new-location");
978
- * }
979
- *
980
- * @public
981
- * @category Utils
982
- * @mode framework
983
- * @mode data
984
- * @param url The URL to redirect to.
985
- * @param init The status code or a `ResponseInit` object to be included in the
986
- * response.
987
- * @returns A [`Response`](https://developer.mozilla.org/en-US/docs/Web/API/Response)
988
- * object with the redirect status and [`Location`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Location)
989
- * header.
990
- */
991
- declare const replace$1: RedirectFunction;
992
- type ErrorResponse = {
993
- status: number;
994
- statusText: string;
995
- data: any;
996
- };
997
- /**
998
- * Check if the given error is an {@link ErrorResponse} generated from a 4xx/5xx
999
- * [`Response`](https://developer.mozilla.org/en-US/docs/Web/API/Response)
1000
- * thrown from an [`action`](../../start/framework/route-module#action) or
1001
- * [`loader`](../../start/framework/route-module#loader) function.
1002
- *
1003
- * @example
1004
- * import { isRouteErrorResponse } from "react-router";
1005
- *
1006
- * export function ErrorBoundary({ error }: Route.ErrorBoundaryProps) {
1007
- * if (isRouteErrorResponse(error)) {
1008
- * return (
1009
- * <>
1010
- * <p>Error: `${error.status}: ${error.statusText}`</p>
1011
- * <p>{error.data}</p>
1012
- * </>
1013
- * );
1014
- * }
1015
- *
1016
- * return (
1017
- * <p>Error: {error instanceof Error ? error.message : "Unknown Error"}</p>
1018
- * );
1019
- * }
1020
- *
1021
- * @public
1022
- * @category Utils
1023
- * @mode framework
1024
- * @mode data
1025
- * @param error The error to check.
1026
- * @returns `true` if the error is an {@link ErrorResponse}, `false` otherwise.
1027
- */
1028
- declare function isRouteErrorResponse(error: any): error is ErrorResponse;
1029
-
1030
- /**
1031
- * An object of unknown type for route loaders and actions provided by the
1032
- * server's `getLoadContext()` function. This is defined as an empty interface
1033
- * specifically so apps can leverage declaration merging to augment this type
1034
- * globally: https://www.typescriptlang.org/docs/handbook/declaration-merging.html
1035
- */
1036
- interface AppLoadContext {
1037
- [key: string]: unknown;
1038
- }
1039
-
1040
- type ServerInstrumentation = {
1041
- handler?: InstrumentRequestHandlerFunction;
1042
- route?: InstrumentRouteFunction;
1043
- };
1044
- type ClientInstrumentation = {
1045
- router?: InstrumentRouterFunction;
1046
- route?: InstrumentRouteFunction;
1047
- };
1048
- type InstrumentRequestHandlerFunction = (handler: InstrumentableRequestHandler) => void;
1049
- type InstrumentRouterFunction = (router: InstrumentableRouter) => void;
1050
- type InstrumentRouteFunction = (route: InstrumentableRoute) => void;
1051
- type InstrumentationHandlerResult = {
1052
- status: "success";
1053
- error: undefined;
1054
- } | {
1055
- status: "error";
1056
- error: Error;
1057
- };
1058
- type InstrumentFunction<T> = (handler: () => Promise<InstrumentationHandlerResult>, info: T) => Promise<void>;
1059
- type ReadonlyRequest = {
1060
- method: string;
1061
- url: string;
1062
- headers: Pick<Headers, "get">;
1063
- };
1064
- type ReadonlyContext = MiddlewareEnabled extends true ? Pick<RouterContextProvider, "get"> : Readonly<AppLoadContext>;
1065
- type InstrumentableRoute = {
1066
- id: string;
1067
- index: boolean | undefined;
1068
- path: string | undefined;
1069
- instrument(instrumentations: RouteInstrumentations): void;
1070
- };
1071
- type RouteInstrumentations = {
1072
- lazy?: InstrumentFunction<RouteLazyInstrumentationInfo>;
1073
- "lazy.loader"?: InstrumentFunction<RouteLazyInstrumentationInfo>;
1074
- "lazy.action"?: InstrumentFunction<RouteLazyInstrumentationInfo>;
1075
- "lazy.middleware"?: InstrumentFunction<RouteLazyInstrumentationInfo>;
1076
- middleware?: InstrumentFunction<RouteHandlerInstrumentationInfo>;
1077
- loader?: InstrumentFunction<RouteHandlerInstrumentationInfo>;
1078
- action?: InstrumentFunction<RouteHandlerInstrumentationInfo>;
1079
- };
1080
- type RouteLazyInstrumentationInfo = undefined;
1081
- type RouteHandlerInstrumentationInfo = Readonly<{
1082
- request: ReadonlyRequest;
1083
- params: LoaderFunctionArgs["params"];
1084
- pattern: string;
1085
- context: ReadonlyContext;
1086
- }>;
1087
- type InstrumentableRouter = {
1088
- instrument(instrumentations: RouterInstrumentations): void;
1089
- };
1090
- type RouterInstrumentations = {
1091
- navigate?: InstrumentFunction<RouterNavigationInstrumentationInfo>;
1092
- fetch?: InstrumentFunction<RouterFetchInstrumentationInfo>;
1093
- };
1094
- type RouterNavigationInstrumentationInfo = Readonly<{
1095
- to: string | number;
1096
- currentUrl: string;
1097
- formMethod?: HTMLFormMethod;
1098
- formEncType?: FormEncType;
1099
- formData?: FormData;
1100
- body?: any;
1101
- }>;
1102
- type RouterFetchInstrumentationInfo = Readonly<{
1103
- href: string;
1104
- currentUrl: string;
1105
- fetcherKey: string;
1106
- formMethod?: HTMLFormMethod;
1107
- formEncType?: FormEncType;
1108
- formData?: FormData;
1109
- body?: any;
1110
- }>;
1111
- type InstrumentableRequestHandler = {
1112
- instrument(instrumentations: RequestHandlerInstrumentations): void;
1113
- };
1114
- type RequestHandlerInstrumentations = {
1115
- request?: InstrumentFunction<RequestHandlerInstrumentationInfo>;
1116
- };
1117
- type RequestHandlerInstrumentationInfo = Readonly<{
1118
- request: ReadonlyRequest;
1119
- context: ReadonlyContext | undefined;
1120
- }>;
1121
-
1122
- /**
1123
- * A Router instance manages all navigation and data loading/mutations
1124
- */
1125
- interface Router {
1126
- /**
1127
- * @private
1128
- * PRIVATE - DO NOT USE
1129
- *
1130
- * Return the basename for the router
1131
- */
1132
- get basename(): RouterInit["basename"];
1133
- /**
1134
- * @private
1135
- * PRIVATE - DO NOT USE
1136
- *
1137
- * Return the future config for the router
1138
- */
1139
- get future(): FutureConfig;
1140
- /**
1141
- * @private
1142
- * PRIVATE - DO NOT USE
1143
- *
1144
- * Return the current state of the router
1145
- */
1146
- get state(): RouterState;
1147
- /**
1148
- * @private
1149
- * PRIVATE - DO NOT USE
1150
- *
1151
- * Return the routes for this router instance
1152
- */
1153
- get routes(): DataRouteObject[];
1154
- /**
1155
- * @private
1156
- * PRIVATE - DO NOT USE
1157
- *
1158
- * Return the route branches for this router instance
1159
- */
1160
- get branches(): RouteBranch<DataRouteObject>[] | undefined;
1161
- /**
1162
- * @private
1163
- * PRIVATE - DO NOT USE
1164
- *
1165
- * Return the manifest for this router instance
1166
- */
1167
- get manifest(): RouteManifest;
1168
- /**
1169
- * @private
1170
- * PRIVATE - DO NOT USE
1171
- *
1172
- * Return the window associated with the router
1173
- */
1174
- get window(): RouterInit["window"];
1175
- /**
1176
- * @private
1177
- * PRIVATE - DO NOT USE
1178
- *
1179
- * Initialize the router, including adding history listeners and kicking off
1180
- * initial data fetches. Returns a function to cleanup listeners and abort
1181
- * any in-progress loads
1182
- */
1183
- initialize(): Router;
1184
- /**
1185
- * @private
1186
- * PRIVATE - DO NOT USE
1187
- *
1188
- * Subscribe to router.state updates
1189
- *
1190
- * @param fn function to call with the new state
1191
- */
1192
- subscribe(fn: RouterSubscriber): () => void;
1193
- /**
1194
- * @private
1195
- * PRIVATE - DO NOT USE
1196
- *
1197
- * Enable scroll restoration behavior in the router
1198
- *
1199
- * @param savedScrollPositions Object that will manage positions, in case
1200
- * it's being restored from sessionStorage
1201
- * @param getScrollPosition Function to get the active Y scroll position
1202
- * @param getKey Function to get the key to use for restoration
1203
- */
1204
- enableScrollRestoration(savedScrollPositions: Record<string, number>, getScrollPosition: GetScrollPositionFunction, getKey?: GetScrollRestorationKeyFunction): () => void;
1205
- /**
1206
- * @private
1207
- * PRIVATE - DO NOT USE
1208
- *
1209
- * Navigate forward/backward in the history stack
1210
- * @param to Delta to move in the history stack
1211
- */
1212
- navigate(to: number): Promise<void>;
1213
- /**
1214
- * Navigate to the given path
1215
- * @param to Path to navigate to
1216
- * @param opts Navigation options (method, submission, etc.)
1217
- */
1218
- navigate(to: To | null, opts?: RouterNavigateOptions): Promise<void>;
1219
- /**
1220
- * @private
1221
- * PRIVATE - DO NOT USE
1222
- *
1223
- * Trigger a fetcher load/submission
1224
- *
1225
- * @param key Fetcher key
1226
- * @param routeId Route that owns the fetcher
1227
- * @param href href to fetch
1228
- * @param opts Fetcher options, (method, submission, etc.)
1229
- */
1230
- fetch(key: string, routeId: string, href: string | null, opts?: RouterFetchOptions): Promise<void>;
1231
- /**
1232
- * @private
1233
- * PRIVATE - DO NOT USE
1234
- *
1235
- * Trigger a revalidation of all current route loaders and fetcher loads
1236
- */
1237
- revalidate(): Promise<void>;
1238
- /**
1239
- * @private
1240
- * PRIVATE - DO NOT USE
1241
- *
1242
- * Utility function to create an href for the given location
1243
- * @param location
1244
- */
1245
- createHref(location: Location | URL): string;
1246
- /**
1247
- * @private
1248
- * PRIVATE - DO NOT USE
1249
- *
1250
- * Utility function to URL encode a destination path according to the internal
1251
- * history implementation
1252
- * @param to
1253
- */
1254
- encodeLocation(to: To): Path;
1255
- /**
1256
- * @private
1257
- * PRIVATE - DO NOT USE
1258
- *
1259
- * Get/create a fetcher for the given key
1260
- * @param key
1261
- */
1262
- getFetcher<TData = any>(key: string): Fetcher<TData>;
1263
- /**
1264
- * @internal
1265
- * PRIVATE - DO NOT USE
1266
- *
1267
- * Reset the fetcher for a given key
1268
- * @param key
1269
- */
1270
- resetFetcher(key: string, opts?: {
1271
- reason?: unknown;
1272
- }): void;
1273
- /**
1274
- * @private
1275
- * PRIVATE - DO NOT USE
1276
- *
1277
- * Delete the fetcher for a given key
1278
- * @param key
1279
- */
1280
- deleteFetcher(key: string): void;
1281
- /**
1282
- * @private
1283
- * PRIVATE - DO NOT USE
1284
- *
1285
- * Cleanup listeners and abort any in-progress loads
1286
- */
1287
- dispose(): void;
1288
- /**
1289
- * @private
1290
- * PRIVATE - DO NOT USE
1291
- *
1292
- * Get a navigation blocker
1293
- * @param key The identifier for the blocker
1294
- * @param fn The blocker function implementation
1295
- */
1296
- getBlocker(key: string, fn: BlockerFunction): Blocker;
1297
- /**
1298
- * @private
1299
- * PRIVATE - DO NOT USE
1300
- *
1301
- * Delete a navigation blocker
1302
- * @param key The identifier for the blocker
1303
- */
1304
- deleteBlocker(key: string): void;
1305
- /**
1306
- * @private
1307
- * PRIVATE DO NOT USE
1308
- *
1309
- * Patch additional children routes into an existing parent route
1310
- * @param routeId The parent route id or a callback function accepting `patch`
1311
- * to perform batch patching
1312
- * @param children The additional children routes
1313
- * @param unstable_allowElementMutations Allow mutation or route elements on
1314
- * existing routes. Intended for RSC-usage
1315
- * only.
1316
- */
1317
- patchRoutes(routeId: string | null, children: RouteObject[], unstable_allowElementMutations?: boolean): void;
1318
- /**
1319
- * @private
1320
- * PRIVATE - DO NOT USE
1321
- *
1322
- * HMR needs to pass in-flight route updates to React Router
1323
- * TODO: Replace this with granular route update APIs (addRoute, updateRoute, deleteRoute)
1324
- */
1325
- _internalSetRoutes(routes: RouteObject[]): void;
1326
- /**
1327
- * @private
1328
- * PRIVATE - DO NOT USE
1329
- *
1330
- * Cause subscribers to re-render. This is used to force a re-render.
1331
- */
1332
- _internalSetStateDoNotUseOrYouWillBreakYourApp(state: Partial<RouterState>): void;
1333
- /**
1334
- * @private
1335
- * PRIVATE - DO NOT USE
1336
- *
1337
- * Internal fetch AbortControllers accessed by unit tests
1338
- */
1339
- _internalFetchControllers: Map<string, AbortController>;
1340
- }
1341
- /**
1342
- * State maintained internally by the router. During a navigation, all states
1343
- * reflect the "old" location unless otherwise noted.
1344
- */
1345
- interface RouterState {
1346
- /**
1347
- * The action of the most recent navigation
1348
- */
1349
- historyAction: Action;
1350
- /**
1351
- * The current location reflected by the router
1352
- */
1353
- location: Location;
1354
- /**
1355
- * The current set of route matches
1356
- */
1357
- matches: DataRouteMatch[];
1358
- /**
1359
- * Tracks whether we've completed our initial data load
1360
- */
1361
- initialized: boolean;
1362
- /**
1363
- * Tracks whether we should be rendering a HydrateFallback during hydration
1364
- */
1365
- renderFallback: boolean;
1366
- /**
1367
- * Current scroll position we should start at for a new view
1368
- * - number -> scroll position to restore to
1369
- * - false -> do not restore scroll at all (used during submissions/revalidations)
1370
- * - null -> don't have a saved position, scroll to hash or top of page
1371
- */
1372
- restoreScrollPosition: number | false | null;
1373
- /**
1374
- * Indicate whether this navigation should skip resetting the scroll position
1375
- * if we are unable to restore the scroll position
1376
- */
1377
- preventScrollReset: boolean;
1378
- /**
1379
- * Tracks the state of the current navigation
1380
- */
1381
- navigation: Navigation;
1382
- /**
1383
- * Tracks any in-progress revalidations
1384
- */
1385
- revalidation: RevalidationState;
1386
- /**
1387
- * Data from the loaders for the current matches
1388
- */
1389
- loaderData: RouteData;
1390
- /**
1391
- * Data from the action for the current matches
1392
- */
1393
- actionData: RouteData | null;
1394
- /**
1395
- * Errors caught from loaders for the current matches
1396
- */
1397
- errors: RouteData | null;
1398
- /**
1399
- * Map of current fetchers
1400
- */
1401
- fetchers: Map<string, Fetcher>;
1402
- /**
1403
- * Map of current blockers
1404
- */
1405
- blockers: Map<string, Blocker>;
1406
- }
1407
- /**
1408
- * Data that can be passed into hydrate a Router from SSR
1409
- */
1410
- type HydrationState = Partial<Pick<RouterState, "loaderData" | "actionData" | "errors">>;
1411
- /**
1412
- * Future flags to toggle new feature behavior
1413
- */
1414
- interface FutureConfig {
1415
- }
1416
- /**
1417
- * Initialization options for createRouter
1418
- */
1419
- interface RouterInit {
1420
- routes: RouteObject[];
1421
- history: History;
1422
- basename?: string;
1423
- getContext?: () => MaybePromise<RouterContextProvider>;
1424
- instrumentations?: ClientInstrumentation[];
1425
- mapRouteProperties?: MapRoutePropertiesFunction;
1426
- future?: Partial<FutureConfig>;
1427
- hydrationRouteProperties?: string[];
1428
- hydrationData?: HydrationState;
1429
- window?: Window;
1430
- dataStrategy?: DataStrategyFunction;
1431
- patchRoutesOnNavigation?: PatchRoutesOnNavigationFunction;
1432
- }
1433
- /**
1434
- * State returned from a server-side query() call
1435
- */
1436
- interface StaticHandlerContext {
1437
- basename: Router["basename"];
1438
- location: RouterState["location"];
1439
- matches: RouterState["matches"];
1440
- loaderData: RouterState["loaderData"];
1441
- actionData: RouterState["actionData"];
1442
- errors: RouterState["errors"];
1443
- statusCode: number;
1444
- loaderHeaders: Record<string, Headers>;
1445
- actionHeaders: Record<string, Headers>;
1446
- _deepestRenderedBoundaryId?: string | null;
1447
- }
1448
- /**
1449
- * A StaticHandler instance manages a singular SSR navigation/fetch event
1450
- */
1451
- interface StaticHandler {
1452
- /**
1453
- * The set of data routes managed by this handler
1454
- */
1455
- dataRoutes: DataRouteObject[];
1456
- /**
1457
- * @private
1458
- * PRIVATE - DO NOT USE
1459
- *
1460
- * The route branches derived from the data routes, used for internal route
1461
- * matching in Framework Mode
1462
- */
1463
- _internalRouteBranches: RouteBranch<DataRouteObject>[];
1464
- /**
1465
- * Perform a query for a given request - executing all matched route
1466
- * loaders/actions. Used for document requests.
1467
- *
1468
- * @param request The request to query
1469
- * @param opts Optional query options
1470
- * @param opts.dataStrategy Alternate dataStrategy implementation
1471
- * @param opts.filterMatchesToLoad Predicate function to filter which matches should be loaded
1472
- * @param opts.generateMiddlewareResponse To enable middleware, provide a function
1473
- * to generate a response to bubble back up the middleware chain
1474
- * @param opts.requestContext Context object to pass to loaders/actions
1475
- * @param opts.skipLoaderErrorBubbling Skip loader error bubbling
1476
- * @param opts.skipRevalidation Skip revalidation after action submission
1477
- * @param opts.normalizePath Normalize the request path
1478
- */
1479
- query(request: Request, opts?: {
1480
- requestContext?: unknown;
1481
- filterMatchesToLoad?: (match: DataRouteMatch) => boolean;
1482
- skipLoaderErrorBubbling?: boolean;
1483
- skipRevalidation?: boolean;
1484
- dataStrategy?: DataStrategyFunction<unknown>;
1485
- generateMiddlewareResponse?: (query: (r: Request, args?: {
1486
- filterMatchesToLoad?: (match: DataRouteMatch) => boolean;
1487
- }) => Promise<StaticHandlerContext | Response>) => MaybePromise<Response>;
1488
- normalizePath?: (request: Request) => Path;
1489
- }): Promise<StaticHandlerContext | Response>;
1490
- /**
1491
- * Perform a query for a specific route. Used for resource requests.
1492
- *
1493
- * @param request The request to query
1494
- * @param opts Optional queryRoute options
1495
- * @param opts.dataStrategy Alternate dataStrategy implementation
1496
- * @param opts.generateMiddlewareResponse To enable middleware, provide a function
1497
- * to generate a response to bubble back up the middleware chain
1498
- * @param opts.requestContext Context object to pass to loaders/actions
1499
- * @param opts.routeId The ID of the route to query
1500
- * @param opts.normalizePath Normalize the request path
1501
-
1502
- */
1503
- queryRoute(request: Request, opts?: {
1504
- routeId?: string;
1505
- requestContext?: unknown;
1506
- dataStrategy?: DataStrategyFunction<unknown>;
1507
- generateMiddlewareResponse?: (queryRoute: (r: Request) => Promise<Response>) => MaybePromise<Response>;
1508
- normalizePath?: (request: Request) => Path;
1509
- }): Promise<any>;
1510
- }
1511
- type ViewTransitionOpts = {
1512
- currentLocation: Location;
1513
- nextLocation: Location;
1514
- };
1515
- /**
1516
- * Subscriber function signature for changes to router state
1517
- */
1518
- interface RouterSubscriber {
1519
- (state: RouterState, opts: {
1520
- deletedFetchers: string[];
1521
- newErrors: RouteData | null;
1522
- viewTransitionOpts?: ViewTransitionOpts;
1523
- flushSync: boolean;
1524
- }): void;
1525
- }
1526
- /**
1527
- * Function signature for determining the key to be used in scroll restoration
1528
- * for a given location
1529
- */
1530
- interface GetScrollRestorationKeyFunction {
1531
- (location: Location, matches: UIMatch[]): string | null;
1532
- }
1533
- /**
1534
- * Function signature for determining the current scroll position
1535
- */
1536
- interface GetScrollPositionFunction {
1537
- (): number;
1538
- }
1539
- /**
1540
- * - "route": relative to the route hierarchy so `..` means remove all segments
1541
- * of the current route even if it has many. For example, a `route("posts/:id")`
1542
- * would have both `:id` and `posts` removed from the url.
1543
- * - "path": relative to the pathname so `..` means remove one segment of the
1544
- * pathname. For example, a `route("posts/:id")` would have only `:id` removed
1545
- * from the url.
1546
- */
1547
- type RelativeRoutingType = "route" | "path";
1548
- type BaseNavigateOrFetchOptions = {
1549
- preventScrollReset?: boolean;
1550
- relative?: RelativeRoutingType;
1551
- flushSync?: boolean;
1552
- defaultShouldRevalidate?: boolean;
1553
- };
1554
- type BaseNavigateOptions = BaseNavigateOrFetchOptions & {
1555
- replace?: boolean;
1556
- state?: any;
1557
- fromRouteId?: string;
1558
- viewTransition?: boolean;
1559
- mask?: To;
1560
- };
1561
- type BaseSubmissionOptions = {
1562
- formMethod?: HTMLFormMethod;
1563
- formEncType?: FormEncType;
1564
- } & ({
1565
- formData: FormData;
1566
- body?: undefined;
1567
- } | {
1568
- formData?: undefined;
1569
- body: any;
1570
- });
1571
- /**
1572
- * Options for a navigate() call for a normal (non-submission) navigation
1573
- */
1574
- type LinkNavigateOptions = BaseNavigateOptions;
1575
- /**
1576
- * Options for a navigate() call for a submission navigation
1577
- */
1578
- type SubmissionNavigateOptions = BaseNavigateOptions & BaseSubmissionOptions;
1579
- /**
1580
- * Options to pass to navigate() for a navigation
1581
- */
1582
- type RouterNavigateOptions = LinkNavigateOptions | SubmissionNavigateOptions;
1583
- /**
1584
- * Options for a fetch() load
1585
- */
1586
- type LoadFetchOptions = BaseNavigateOrFetchOptions;
1587
- /**
1588
- * Options for a fetch() submission
1589
- */
1590
- type SubmitFetchOptions = BaseNavigateOrFetchOptions & BaseSubmissionOptions;
1591
- /**
1592
- * Options to pass to fetch()
1593
- */
1594
- type RouterFetchOptions = LoadFetchOptions | SubmitFetchOptions;
1595
- /**
1596
- * Potential states for state.navigation
1597
- */
1598
- type NavigationStates = {
1599
- Idle: {
1600
- state: "idle";
1601
- location: undefined;
1602
- matches: undefined;
1603
- historyAction: undefined;
1604
- formMethod: undefined;
1605
- formAction: undefined;
1606
- formEncType: undefined;
1607
- formData: undefined;
1608
- json: undefined;
1609
- text: undefined;
1610
- };
1611
- Loading: {
1612
- state: "loading";
1613
- location: Location;
1614
- matches: DataRouteMatch[];
1615
- historyAction: Action;
1616
- formMethod: Submission["formMethod"] | undefined;
1617
- formAction: Submission["formAction"] | undefined;
1618
- formEncType: Submission["formEncType"] | undefined;
1619
- formData: Submission["formData"] | undefined;
1620
- json: Submission["json"] | undefined;
1621
- text: Submission["text"] | undefined;
1622
- };
1623
- Submitting: {
1624
- state: "submitting";
1625
- location: Location;
1626
- matches: DataRouteMatch[];
1627
- historyAction: Action;
1628
- formMethod: Submission["formMethod"];
1629
- formAction: Submission["formAction"];
1630
- formEncType: Submission["formEncType"];
1631
- formData: Submission["formData"];
1632
- json: Submission["json"];
1633
- text: Submission["text"];
1634
- };
1635
- };
1636
- type Navigation = NavigationStates[keyof NavigationStates];
1637
- type RevalidationState = "idle" | "loading";
1638
- /**
1639
- * Potential states for fetchers
1640
- */
1641
- type FetcherStates<TData = any> = {
1642
- /**
1643
- * The fetcher is not calling a loader or action
1644
- *
1645
- * ```tsx
1646
- * fetcher.state === "idle"
1647
- * ```
1648
- */
1649
- Idle: {
1650
- state: "idle";
1651
- formMethod: undefined;
1652
- formAction: undefined;
1653
- formEncType: undefined;
1654
- text: undefined;
1655
- formData: undefined;
1656
- json: undefined;
1657
- /**
1658
- * If the fetcher has never been called, this will be undefined.
1659
- */
1660
- data: TData | undefined;
1661
- };
1662
- /**
1663
- * The fetcher is loading data from a {@link LoaderFunction | loader} from a
1664
- * call to {@link FetcherWithComponents.load | `fetcher.load`}.
1665
- *
1666
- * ```tsx
1667
- * // somewhere
1668
- * <button onClick={() => fetcher.load("/some/route") }>Load</button>
1669
- *
1670
- * // the state will update
1671
- * fetcher.state === "loading"
1672
- * ```
1673
- */
1674
- Loading: {
1675
- state: "loading";
1676
- formMethod: Submission["formMethod"] | undefined;
1677
- formAction: Submission["formAction"] | undefined;
1678
- formEncType: Submission["formEncType"] | undefined;
1679
- text: Submission["text"] | undefined;
1680
- formData: Submission["formData"] | undefined;
1681
- json: Submission["json"] | undefined;
1682
- data: TData | undefined;
1683
- };
1684
- /**
1685
- The fetcher is submitting to a {@link LoaderFunction} (GET) or {@link ActionFunction} (POST) from a {@link FetcherWithComponents.Form | `fetcher.Form`} or {@link FetcherWithComponents.submit | `fetcher.submit`}.
1686
-
1687
- ```tsx
1688
- // somewhere
1689
- <input
1690
- onChange={e => {
1691
- fetcher.submit(event.currentTarget.form, { method: "post" });
1692
- }}
1693
- />
1694
-
1695
- // the state will update
1696
- fetcher.state === "submitting"
1697
-
1698
- // and formData will be available
1699
- fetcher.formData
1700
- ```
1701
- */
1702
- Submitting: {
1703
- state: "submitting";
1704
- formMethod: Submission["formMethod"];
1705
- formAction: Submission["formAction"];
1706
- formEncType: Submission["formEncType"];
1707
- text: Submission["text"];
1708
- formData: Submission["formData"];
1709
- json: Submission["json"];
1710
- data: TData | undefined;
1711
- };
1712
- };
1713
- type Fetcher<TData = any> = FetcherStates<TData>[keyof FetcherStates<TData>];
1714
- interface BlockerBlocked {
1715
- state: "blocked";
1716
- reset: () => void;
1717
- proceed: () => void;
1718
- location: Location;
1719
- }
1720
- interface BlockerUnblocked {
1721
- state: "unblocked";
1722
- reset: undefined;
1723
- proceed: undefined;
1724
- location: undefined;
1725
- }
1726
- interface BlockerProceeding {
1727
- state: "proceeding";
1728
- reset: undefined;
1729
- proceed: undefined;
1730
- location: Location;
1731
- }
1732
- type Blocker = BlockerUnblocked | BlockerBlocked | BlockerProceeding;
1733
- type BlockerFunction = (args: {
1734
- currentLocation: Location;
1735
- nextLocation: Location;
1736
- historyAction: Action;
1737
- }) => boolean;
1738
- interface CreateStaticHandlerOptions {
1739
- basename?: string;
1740
- mapRouteProperties?: MapRoutePropertiesFunction;
1741
- instrumentations?: Pick<ServerInstrumentation, "route">[];
1742
- future?: Partial<FutureConfig>;
1743
- }
1744
- declare function createStaticHandler(routes: RouteObject[], opts?: CreateStaticHandlerOptions): StaticHandler;
1745
-
1746
- type Primitive = null | undefined | string | number | boolean | symbol | bigint;
1747
- type LiteralUnion<LiteralType, BaseType extends Primitive> = LiteralType | (BaseType & Record<never, never>);
1748
- interface HtmlLinkProps {
1749
- /**
1750
- * Address of the hyperlink
1751
- */
1752
- href?: string;
1753
- /**
1754
- * How the element handles crossorigin requests
1755
- */
1756
- crossOrigin?: "anonymous" | "use-credentials";
1757
- /**
1758
- * Relationship between the document containing the hyperlink and the destination resource
1759
- */
1760
- rel: LiteralUnion<"alternate" | "dns-prefetch" | "icon" | "manifest" | "modulepreload" | "next" | "pingback" | "preconnect" | "prefetch" | "preload" | "prerender" | "search" | "stylesheet", string>;
1761
- /**
1762
- * Applicable media: "screen", "print", "(max-width: 764px)"
1763
- */
1764
- media?: string;
1765
- /**
1766
- * Integrity metadata used in Subresource Integrity checks
1767
- */
1768
- integrity?: string;
1769
- /**
1770
- * Language of the linked resource
1771
- */
1772
- hrefLang?: string;
1773
- /**
1774
- * Hint for the type of the referenced resource
1775
- */
1776
- type?: string;
1777
- /**
1778
- * Referrer policy for fetches initiated by the element
1779
- */
1780
- referrerPolicy?: "" | "no-referrer" | "no-referrer-when-downgrade" | "same-origin" | "origin" | "strict-origin" | "origin-when-cross-origin" | "strict-origin-when-cross-origin" | "unsafe-url";
1781
- /**
1782
- * Sizes of the icons (for rel="icon")
1783
- */
1784
- sizes?: string;
1785
- /**
1786
- * Potential destination for a preload request (for rel="preload" and rel="modulepreload")
1787
- */
1788
- as?: LiteralUnion<"audio" | "audioworklet" | "document" | "embed" | "fetch" | "font" | "frame" | "iframe" | "image" | "manifest" | "object" | "paintworklet" | "report" | "script" | "serviceworker" | "sharedworker" | "style" | "track" | "video" | "worker" | "xslt", string>;
1789
- /**
1790
- * Color to use when customizing a site's icon (for rel="mask-icon")
1791
- */
1792
- color?: string;
1793
- /**
1794
- * Whether the link is disabled
1795
- */
1796
- disabled?: boolean;
1797
- /**
1798
- * The title attribute has special semantics on this element: Title of the link; CSS style sheet set name.
1799
- */
1800
- title?: string;
1801
- /**
1802
- * Images to use in different situations, e.g., high-resolution displays,
1803
- * small monitors, etc. (for rel="preload")
1804
- */
1805
- imageSrcSet?: string;
1806
- /**
1807
- * Image sizes for different page layouts (for rel="preload")
1808
- */
1809
- imageSizes?: string;
1810
- }
1811
- interface HtmlLinkPreloadImage extends HtmlLinkProps {
1812
- /**
1813
- * Relationship between the document containing the hyperlink and the destination resource
1814
- */
1815
- rel: "preload";
1816
- /**
1817
- * Potential destination for a preload request (for rel="preload" and rel="modulepreload")
1818
- */
1819
- as: "image";
1820
- /**
1821
- * Address of the hyperlink
1822
- */
1823
- href?: string;
1824
- /**
1825
- * Images to use in different situations, e.g., high-resolution displays,
1826
- * small monitors, etc. (for rel="preload")
1827
- */
1828
- imageSrcSet: string;
1829
- /**
1830
- * Image sizes for different page layouts (for rel="preload")
1831
- */
1832
- imageSizes?: string;
1833
- }
1834
- /**
1835
- * Represents a `<link>` element.
1836
- *
1837
- * WHATWG Specification: https://html.spec.whatwg.org/multipage/semantics.html#the-link-element
1838
- */
1839
- type HtmlLinkDescriptor = (HtmlLinkProps & Pick<Required<HtmlLinkProps>, "href">) | (HtmlLinkPreloadImage & Pick<Required<HtmlLinkPreloadImage>, "imageSizes">) | (HtmlLinkPreloadImage & Pick<Required<HtmlLinkPreloadImage>, "href"> & {
1840
- imageSizes?: never;
1841
- });
1842
- interface PageLinkDescriptor extends Omit<HtmlLinkDescriptor, "href" | "rel" | "type" | "sizes" | "imageSrcSet" | "imageSizes" | "as" | "color" | "title"> {
1843
- /**
1844
- * A [`nonce`](https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Global_attributes/nonce)
1845
- * attribute to render on the [`<link>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/link)
1846
- * element. If not provided in Framework Mode, it will default to any
1847
- * {@link ServerRouter | `<ServerRouter nonce>`} prop.
1848
-
1849
- */
1850
- nonce?: string | undefined;
1851
- /**
1852
- * The absolute path of the page to prefetch, e.g. `/absolute/path`.
1853
- */
1854
- page: string;
1855
- }
1856
- type LinkDescriptor = HtmlLinkDescriptor | PageLinkDescriptor;
1857
-
1858
- type Serializable = undefined | null | boolean | string | symbol | number | Array<Serializable> | {
1859
- [key: PropertyKey]: Serializable;
1860
- } | bigint | Date | URL | RegExp | Error | Map<Serializable, Serializable> | Set<Serializable> | Promise<Serializable>;
1861
-
1862
- type Equal<X, Y> = (<T>() => T extends X ? 1 : 2) extends (<T>() => T extends Y ? 1 : 2) ? true : false;
1863
- type IsAny<T> = 0 extends 1 & T ? true : false;
1864
- type Func = (...args: any[]) => unknown;
1865
-
1866
- /**
1867
- * A brand that can be applied to a type to indicate that it will serialize
1868
- * to a specific type when transported to the client from a loader.
1869
- * Only use this if you have additional serialization/deserialization logic
1870
- * in your application.
1871
- */
1872
- type unstable_SerializesTo<T> = {
1873
- unstable__ReactRouter_SerializesTo: [T];
1874
- };
1875
-
1876
- type Serialize<T> = T extends unstable_SerializesTo<infer To> ? To : T extends Serializable ? T : T extends (...args: any[]) => unknown ? undefined : T extends Promise<infer U> ? Promise<Serialize<U>> : T extends Map<infer K, infer V> ? Map<Serialize<K>, Serialize<V>> : T extends ReadonlyMap<infer K, infer V> ? ReadonlyMap<Serialize<K>, Serialize<V>> : T extends Set<infer U> ? Set<Serialize<U>> : T extends ReadonlySet<infer U> ? ReadonlySet<Serialize<U>> : T extends [] ? [] : T extends readonly [infer F, ...infer R] ? [Serialize<F>, ...Serialize<R>] : T extends Array<infer U> ? Array<Serialize<U>> : T extends readonly unknown[] ? readonly Serialize<T[number]>[] : T extends Record<any, any> ? {
1877
- [K in keyof T]: Serialize<T[K]>;
1878
- } : undefined;
1879
- type VoidToUndefined<T> = Equal<T, void> extends true ? undefined : T;
1880
- type DataFrom<T> = IsAny<T> extends true ? undefined : T extends Func ? VoidToUndefined<Awaited<ReturnType<T>>> : undefined;
1881
- type ClientData<T> = T extends Response ? never : T extends DataWithResponseInit<infer U> ? U : T;
1882
- type ServerData<T> = T extends Response ? never : T extends DataWithResponseInit<infer U> ? Serialize<U> : Serialize<T>;
1883
- type ServerDataFrom<T> = ServerData<DataFrom<T>>;
1884
- type ClientDataFrom<T> = ClientData<DataFrom<T>>;
1885
- type ClientDataFunctionArgs<Params> = {
1886
- /**
1887
- * A {@link https://developer.mozilla.org/en-US/docs/Web/API/Request Fetch Request instance} which you can use to read the URL, the method, the "content-type" header, and the request body from the request.
1888
- *
1889
- * @note Because client data functions are called before a network request is made, the Request object does not include the headers which the browser automatically adds. React Router infers the "content-type" header from the enc-type of the form that performed the submission.
1890
- **/
1891
- request: Request;
1892
- /**
1893
- * A URL instance representing the application location being navigated to or
1894
- * fetched. By default, this matches `request.url`.
1895
- *
1896
- * In Framework mode with `future.v8_passThroughRequests` enabled, this is a
1897
- * normalized URL with React-Router-specific implementation details removed
1898
- * (`.data` suffixes, `index`/`_routes` search params).
1899
- */
1900
- url: URL;
1901
- /**
1902
- * {@link https://reactrouter.com/start/framework/routing#dynamic-segments Dynamic route params} for the current route.
1903
- * @example
1904
- * // app/routes.ts
1905
- * route("teams/:teamId", "./team.tsx"),
1906
- *
1907
- * // app/team.tsx
1908
- * export function clientLoader({
1909
- * params,
1910
- * }: Route.ClientLoaderArgs) {
1911
- * params.teamId;
1912
- * // ^ string
1913
- * }
1914
- **/
1915
- params: Params;
1916
- /**
1917
- * Matched un-interpolated route pattern for the current path (i.e., /blog/:slug).
1918
- * Mostly useful as a identifier to aggregate on for logging/tracing/etc.
1919
- */
1920
- pattern: string;
1921
- /**
1922
- * When `future.v8_middleware` is not enabled, this is undefined.
1923
- *
1924
- * When `future.v8_middleware` is enabled, this is an instance of
1925
- * `RouterContextProvider` and can be used to access context values
1926
- * from your route middlewares. You may pass in initial context values in your
1927
- * `<HydratedRouter getContext>` prop
1928
- */
1929
- context: Readonly<RouterContextProvider>;
1930
- };
1931
- type SerializeFrom<T> = T extends (...args: infer Args) => unknown ? Args extends [
1932
- ClientLoaderFunctionArgs | ClientActionFunctionArgs | ClientDataFunctionArgs<unknown>
1933
- ] ? ClientDataFrom<T> : ServerDataFrom<T> : T;
1934
-
1935
- /**
1936
- * A function that handles data mutations for a route on the client
1937
- */
1938
- type ClientActionFunction = (args: ClientActionFunctionArgs) => ReturnType<ActionFunction>;
1939
- /**
1940
- * Arguments passed to a route `clientAction` function
1941
- */
1942
- type ClientActionFunctionArgs = ActionFunctionArgs & {
1943
- serverAction: <T = unknown>() => Promise<SerializeFrom<T>>;
1944
- };
1945
- /**
1946
- * A function that loads data for a route on the client
1947
- */
1948
- type ClientLoaderFunction = ((args: ClientLoaderFunctionArgs) => ReturnType<LoaderFunction>) & {
1949
- hydrate?: boolean;
1950
- };
1951
- /**
1952
- * Arguments passed to a route `clientLoader` function
1953
- */
1954
- type ClientLoaderFunctionArgs = LoaderFunctionArgs & {
1955
- serverLoader: <T = unknown>() => Promise<SerializeFrom<T>>;
1956
- };
1957
- type HeadersArgs = {
1958
- loaderHeaders: Headers;
1959
- parentHeaders: Headers;
1960
- actionHeaders: Headers;
1961
- errorHeaders: Headers | undefined;
1962
- };
1963
- /**
1964
- * A function that returns HTTP headers to be used for a route. These headers
1965
- * will be merged with (and take precedence over) headers from parent routes.
1966
- */
1967
- interface HeadersFunction {
1968
- (args: HeadersArgs): Headers | HeadersInit;
1969
- }
1970
- /**
1971
- * A function that defines `<link>` tags to be inserted into the `<head>` of
1972
- * the document on route transitions.
1973
- *
1974
- * @see https://reactrouter.com/start/framework/route-module#meta
1975
- */
1976
- interface LinksFunction {
1977
- (): LinkDescriptor[];
1978
- }
1979
- interface MetaMatch<RouteId extends string = string, Loader extends LoaderFunction | ClientLoaderFunction | unknown = unknown> {
1980
- id: RouteId;
1981
- pathname: DataRouteMatch["pathname"];
1982
- /** @deprecated Use `MetaMatch.loaderData` instead */
1983
- data: Loader extends LoaderFunction | ClientLoaderFunction ? SerializeFrom<Loader> : unknown;
1984
- loaderData: Loader extends LoaderFunction | ClientLoaderFunction ? SerializeFrom<Loader> : unknown;
1985
- handle?: RouteHandle;
1986
- params: DataRouteMatch["params"];
1987
- meta: MetaDescriptor[];
1988
- error?: unknown;
1989
- }
1990
- type MetaMatches<MatchLoaders extends Record<string, LoaderFunction | ClientLoaderFunction | unknown> = Record<string, unknown>> = Array<{
1991
- [K in keyof MatchLoaders]: MetaMatch<Exclude<K, number | symbol>, MatchLoaders[K]>;
1992
- }[keyof MatchLoaders]>;
1993
- interface MetaArgs<Loader extends LoaderFunction | ClientLoaderFunction | unknown = unknown, MatchLoaders extends Record<string, LoaderFunction | ClientLoaderFunction | unknown> = Record<string, unknown>> {
1994
- /** @deprecated Use `MetaArgs.loaderData` instead */
1995
- data: (Loader extends LoaderFunction | ClientLoaderFunction ? SerializeFrom<Loader> : unknown) | undefined;
1996
- loaderData: (Loader extends LoaderFunction | ClientLoaderFunction ? SerializeFrom<Loader> : unknown) | undefined;
1997
- params: Params;
1998
- location: Location;
1999
- matches: MetaMatches<MatchLoaders>;
2000
- error?: unknown;
2001
- }
2002
- /**
2003
- * A function that returns an array of data objects to use for rendering
2004
- * metadata HTML tags in a route. These tags are not rendered on descendant
2005
- * routes in the route hierarchy. In other words, they will only be rendered on
2006
- * the route in which they are exported.
2007
- *
2008
- * @param Loader - The type of the current route's loader function
2009
- * @param MatchLoaders - Mapping from a parent route's filepath to its loader
2010
- * function type
2011
- *
2012
- * Note that parent route filepaths are relative to the `app/` directory.
2013
- *
2014
- * For example, if this meta function is for `/sales/customers/$customerId`:
2015
- *
2016
- * ```ts
2017
- * // app/root.tsx
2018
- * const loader = () => ({ hello: "world" })
2019
- * export type Loader = typeof loader
2020
- *
2021
- * // app/routes/sales.tsx
2022
- * const loader = () => ({ salesCount: 1074 })
2023
- * export type Loader = typeof loader
2024
- *
2025
- * // app/routes/sales/customers.tsx
2026
- * const loader = () => ({ customerCount: 74 })
2027
- * export type Loader = typeof loader
2028
- *
2029
- * // app/routes/sales/customers/$customersId.tsx
2030
- * import type { Loader as RootLoader } from "../../../root"
2031
- * import type { Loader as SalesLoader } from "../../sales"
2032
- * import type { Loader as CustomersLoader } from "../../sales/customers"
2033
- *
2034
- * const loader = () => ({ name: "Customer name" })
2035
- *
2036
- * const meta: MetaFunction<typeof loader, {
2037
- * "root": RootLoader,
2038
- * "routes/sales": SalesLoader,
2039
- * "routes/sales/customers": CustomersLoader,
2040
- * }> = ({ data, matches }) => {
2041
- * const { name } = data
2042
- * // ^? string
2043
- * const { customerCount } = matches.find((match) => match.id === "routes/sales/customers").data
2044
- * // ^? number
2045
- * const { salesCount } = matches.find((match) => match.id === "routes/sales").data
2046
- * // ^? number
2047
- * const { hello } = matches.find((match) => match.id === "root").data
2048
- * // ^? "world"
2049
- * }
2050
- * ```
2051
- */
2052
- interface MetaFunction<Loader extends LoaderFunction | ClientLoaderFunction | unknown = unknown, MatchLoaders extends Record<string, LoaderFunction | ClientLoaderFunction | unknown> = Record<string, unknown>> {
2053
- (args: MetaArgs<Loader, MatchLoaders>): MetaDescriptor[] | undefined;
2054
- }
2055
- type MetaDescriptor = {
2056
- charSet: "utf-8";
2057
- } | {
2058
- title: string;
2059
- } | {
2060
- name: string;
2061
- content: string;
2062
- } | {
2063
- property: string;
2064
- content: string;
2065
- } | {
2066
- httpEquiv: string;
2067
- content: string;
2068
- } | {
2069
- "script:ld+json": LdJsonObject | LdJsonObject[];
2070
- } | {
2071
- tagName: "meta" | "link";
2072
- [name: string]: string;
2073
- } | {
2074
- [name: string]: unknown;
2075
- };
2076
- type LdJsonObject = {
2077
- [Key in string]: LdJsonValue;
2078
- } & {
2079
- [Key in string]?: LdJsonValue | undefined;
2080
- };
2081
- type LdJsonArray = LdJsonValue[] | readonly LdJsonValue[];
2082
- type LdJsonPrimitive = string | number | boolean | null;
2083
- type LdJsonValue = LdJsonPrimitive | LdJsonObject | LdJsonArray;
2084
- /**
2085
- * An arbitrary object that is associated with a route.
2086
- *
2087
- * @see https://reactrouter.com/how-to/using-handle
2088
- */
2089
- type RouteHandle = unknown;
2090
-
2091
- interface AwaitResolveRenderFunction<Resolve = any> {
2092
- (data: Awaited<Resolve>): React.ReactNode;
2093
- }
2094
- /**
2095
- * @category Types
2096
- */
2097
- interface AwaitProps<Resolve> {
2098
- /**
2099
- * When using a function, the resolved value is provided as the parameter.
2100
- *
2101
- * ```tsx [2]
2102
- * <Await resolve={reviewsPromise}>
2103
- * {(resolvedReviews) => <Reviews items={resolvedReviews} />}
2104
- * </Await>
2105
- * ```
2106
- *
2107
- * When using React elements, {@link useAsyncValue} will provide the
2108
- * resolved value:
2109
- *
2110
- * ```tsx [2]
2111
- * <Await resolve={reviewsPromise}>
2112
- * <Reviews />
2113
- * </Await>
2114
- *
2115
- * function Reviews() {
2116
- * const resolvedReviews = useAsyncValue();
2117
- * return <div>...</div>;
2118
- * }
2119
- * ```
2120
- */
2121
- children: React.ReactNode | AwaitResolveRenderFunction<Resolve>;
2122
- /**
2123
- * The error element renders instead of the `children` when the [`Promise`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise)
2124
- * rejects.
2125
- *
2126
- * ```tsx
2127
- * <Await
2128
- * errorElement={<div>Oops</div>}
2129
- * resolve={reviewsPromise}
2130
- * >
2131
- * <Reviews />
2132
- * </Await>
2133
- * ```
2134
- *
2135
- * To provide a more contextual error, you can use the {@link useAsyncError} in a
2136
- * child component
2137
- *
2138
- * ```tsx
2139
- * <Await
2140
- * errorElement={<ReviewsError />}
2141
- * resolve={reviewsPromise}
2142
- * >
2143
- * <Reviews />
2144
- * </Await>
2145
- *
2146
- * function ReviewsError() {
2147
- * const error = useAsyncError();
2148
- * return <div>Error loading reviews: {error.message}</div>;
2149
- * }
2150
- * ```
2151
- *
2152
- * If you do not provide an `errorElement`, the rejected value will bubble up
2153
- * to the nearest route-level [`ErrorBoundary`](../../start/framework/route-module#errorboundary)
2154
- * and be accessible via the {@link useRouteError} hook.
2155
- */
2156
- errorElement?: React.ReactNode;
2157
- /**
2158
- * Takes a [`Promise`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise)
2159
- * returned from a [`loader`](../../start/framework/route-module#loader) to be
2160
- * resolved and rendered.
2161
- *
2162
- * ```tsx
2163
- * import { Await, useLoaderData } from "react-router";
2164
- *
2165
- * export async function loader() {
2166
- * let reviews = getReviews(); // not awaited
2167
- * let book = await getBook();
2168
- * return {
2169
- * book,
2170
- * reviews, // this is a promise
2171
- * };
2172
- * }
2173
- *
2174
- * export default function Book() {
2175
- * const {
2176
- * book,
2177
- * reviews, // this is the same promise
2178
- * } = useLoaderData();
2179
- *
2180
- * return (
2181
- * <div>
2182
- * <h1>{book.title}</h1>
2183
- * <p>{book.description}</p>
2184
- * <React.Suspense fallback={<ReviewsSkeleton />}>
2185
- * <Await
2186
- * // and is the promise we pass to Await
2187
- * resolve={reviews}
2188
- * >
2189
- * <Reviews />
2190
- * </Await>
2191
- * </React.Suspense>
2192
- * </div>
2193
- * );
2194
- * }
2195
- * ```
2196
- */
2197
- resolve: Resolve;
2198
- }
2199
- /**
2200
- * Used to render promise values with automatic error handling.
2201
- *
2202
- * **Note:** `<Await>` expects to be rendered inside a [`<React.Suspense>`](https://react.dev/reference/react/Suspense)
2203
- *
2204
- * @example
2205
- * import { Await, useLoaderData } from "react-router";
2206
- *
2207
- * export async function loader() {
2208
- * // not awaited
2209
- * const reviews = getReviews();
2210
- * // awaited (blocks the transition)
2211
- * const book = await fetch("/api/book").then((res) => res.json());
2212
- * return { book, reviews };
2213
- * }
2214
- *
2215
- * function Book() {
2216
- * const { book, reviews } = useLoaderData();
2217
- * return (
2218
- * <div>
2219
- * <h1>{book.title}</h1>
2220
- * <p>{book.description}</p>
2221
- * <React.Suspense fallback={<ReviewsSkeleton />}>
2222
- * <Await
2223
- * resolve={reviews}
2224
- * errorElement={
2225
- * <div>Could not load reviews 😬</div>
2226
- * }
2227
- * children={(resolvedReviews) => (
2228
- * <Reviews items={resolvedReviews} />
2229
- * )}
2230
- * />
2231
- * </React.Suspense>
2232
- * </div>
2233
- * );
2234
- * }
2235
- *
2236
- * @public
2237
- * @category Components
2238
- * @mode framework
2239
- * @mode data
2240
- * @param props Props
2241
- * @param {AwaitProps.children} props.children n/a
2242
- * @param {AwaitProps.errorElement} props.errorElement n/a
2243
- * @param {AwaitProps.resolve} props.resolve n/a
2244
- * @returns React element for the rendered awaited value
2245
- */
2246
- declare function Await$1<Resolve>({ children, errorElement, resolve, }: AwaitProps<Resolve>): React.JSX.Element;
2247
-
2248
- declare function getRequest(): Request;
2249
- declare const redirect: typeof redirect$1;
2250
- declare const redirectDocument: typeof redirectDocument$1;
2251
- declare const replace: typeof replace$1;
2252
- declare const Await: typeof Await$1;
2253
- type RSCRouteConfigEntryBase = {
2254
- action?: ActionFunction;
2255
- clientAction?: ClientActionFunction;
2256
- clientLoader?: ClientLoaderFunction;
2257
- ErrorBoundary?: React.ComponentType<any>;
2258
- handle?: any;
2259
- headers?: HeadersFunction;
2260
- HydrateFallback?: React.ComponentType<any>;
2261
- Layout?: React.ComponentType<any>;
2262
- links?: LinksFunction;
2263
- loader?: LoaderFunction;
2264
- meta?: MetaFunction;
2265
- shouldRevalidate?: ShouldRevalidateFunction;
2266
- };
2267
- type RSCRouteConfigEntry = RSCRouteConfigEntryBase & {
2268
- id: string;
2269
- path?: string;
2270
- Component?: React.ComponentType<any>;
2271
- lazy?: () => Promise<RSCRouteConfigEntryBase & ({
2272
- default?: React.ComponentType<any>;
2273
- Component?: never;
2274
- } | {
2275
- default?: never;
2276
- Component?: React.ComponentType<any>;
2277
- })>;
2278
- } & ({
2279
- index: true;
2280
- } | {
2281
- children?: RSCRouteConfigEntry[];
2282
- });
2283
- type RSCRouteConfig = Array<RSCRouteConfigEntry>;
2284
- type RSCRouteManifest = {
2285
- clientAction?: ClientActionFunction;
2286
- clientLoader?: ClientLoaderFunction;
2287
- element?: React.ReactElement | false;
2288
- errorElement?: React.ReactElement;
2289
- handle?: any;
2290
- hasAction: boolean;
2291
- hasComponent: boolean;
2292
- hasErrorBoundary: boolean;
2293
- hasLoader: boolean;
2294
- hydrateFallbackElement?: React.ReactElement;
2295
- id: string;
2296
- index?: boolean;
2297
- links?: LinksFunction;
2298
- meta?: MetaFunction;
2299
- parentId?: string;
2300
- path?: string;
2301
- shouldRevalidate?: ShouldRevalidateFunction;
2302
- };
2303
- type RSCRouteMatch = RSCRouteManifest & {
2304
- params: Params;
2305
- pathname: string;
2306
- pathnameBase: string;
2307
- };
2308
- type RSCRenderPayload = {
2309
- type: "render";
2310
- actionData: Record<string, any> | null;
2311
- basename: string | undefined;
2312
- errors: Record<string, any> | null;
2313
- loaderData: Record<string, any>;
2314
- location: Location;
2315
- routeDiscovery: RouteDiscovery;
2316
- matches: RSCRouteMatch[];
2317
- patches?: Promise<RSCRouteManifest[]>;
2318
- nonce?: string;
2319
- formState?: unknown;
2320
- };
2321
- type RSCManifestPayload = {
2322
- type: "manifest";
2323
- patches: Promise<RSCRouteManifest[]>;
2324
- };
2325
- type RSCActionPayload = {
2326
- type: "action";
2327
- actionResult: Promise<unknown>;
2328
- rerender?: Promise<RSCRenderPayload | RSCRedirectPayload>;
2329
- };
2330
- type RSCRedirectPayload = {
2331
- type: "redirect";
2332
- status: number;
2333
- location: string;
2334
- replace: boolean;
2335
- reload: boolean;
2336
- actionResult?: Promise<unknown>;
2337
- };
2338
- type RSCPayload = RSCRenderPayload | RSCManifestPayload | RSCActionPayload | RSCRedirectPayload;
2339
- type RSCMatch = {
2340
- statusCode: number;
2341
- headers: Headers;
2342
- payload: RSCPayload;
2343
- };
2344
- type DecodeActionFunction = (formData: FormData) => Promise<() => Promise<unknown>>;
2345
- type DecodeFormStateFunction = (result: unknown, formData: FormData) => unknown;
2346
- type DecodeReplyFunction = (reply: FormData | string, options: {
2347
- temporaryReferences: unknown;
2348
- }) => Promise<unknown[]>;
2349
- type LoadServerActionFunction = (id: string) => Promise<Function>;
2350
- type RouteDiscovery = {
2351
- mode: "lazy";
2352
- manifestPath?: string | undefined;
2353
- } | {
2354
- mode: "initial";
2355
- };
2356
- /**
2357
- * Matches the given routes to a [`Request`](https://developer.mozilla.org/en-US/docs/Web/API/Request)
2358
- * and returns an [RSC](https://react.dev/reference/rsc/server-components)
2359
- * [`Response`](https://developer.mozilla.org/en-US/docs/Web/API/Response)
2360
- * encoding an {@link unstable_RSCPayload} for consumption by an [RSC](https://react.dev/reference/rsc/server-components)
2361
- * enabled client router.
2362
- *
2363
- * @example
2364
- * import {
2365
- * createTemporaryReferenceSet,
2366
- * decodeAction,
2367
- * decodeReply,
2368
- * loadServerAction,
2369
- * renderToReadableStream,
2370
- * } from "@vitejs/plugin-rsc/rsc";
2371
- * import { unstable_matchRSCServerRequest as matchRSCServerRequest } from "react-router";
2372
- *
2373
- * matchRSCServerRequest({
2374
- * createTemporaryReferenceSet,
2375
- * decodeAction,
2376
- * decodeFormState,
2377
- * decodeReply,
2378
- * loadServerAction,
2379
- * request,
2380
- * routes: routes(),
2381
- * generateResponse(match) {
2382
- * return new Response(
2383
- * renderToReadableStream(match.payload),
2384
- * {
2385
- * status: match.statusCode,
2386
- * headers: match.headers,
2387
- * }
2388
- * );
2389
- * },
2390
- * });
2391
- *
2392
- * @name unstable_matchRSCServerRequest
2393
- * @public
2394
- * @category RSC
2395
- * @mode data
2396
- * @param opts Options
2397
- * @param opts.allowedActionOrigins Origin patterns that are allowed to execute actions.
2398
- * @param opts.basename The basename to use when matching the request.
2399
- * @param opts.createTemporaryReferenceSet A function that returns a temporary
2400
- * reference set for the request, used to track temporary references in the [RSC](https://react.dev/reference/rsc/server-components)
2401
- * stream.
2402
- * @param opts.decodeAction Your `react-server-dom-xyz/server`'s `decodeAction`
2403
- * function, responsible for loading a server action.
2404
- * @param opts.decodeFormState A function responsible for decoding form state for
2405
- * progressively enhanceable forms with React's [`useActionState`](https://react.dev/reference/react/useActionState)
2406
- * using your `react-server-dom-xyz/server`'s `decodeFormState`.
2407
- * @param opts.decodeReply Your `react-server-dom-xyz/server`'s `decodeReply`
2408
- * function, used to decode the server function's arguments and bind them to the
2409
- * implementation for invocation by the router.
2410
- * @param opts.generateResponse A function responsible for using your
2411
- * `renderToReadableStream` to generate a [`Response`](https://developer.mozilla.org/en-US/docs/Web/API/Response)
2412
- * encoding the {@link unstable_RSCPayload}.
2413
- * @param opts.loadServerAction Your `react-server-dom-xyz/server`'s
2414
- * `loadServerAction` function, used to load a server action by ID.
2415
- * @param opts.onError An optional error handler that will be called with any
2416
- * errors that occur during the request processing.
2417
- * @param opts.request The [`Request`](https://developer.mozilla.org/en-US/docs/Web/API/Request)
2418
- * to match against.
2419
- * @param opts.requestContext An instance of {@link RouterContextProvider}
2420
- * that should be created per request, to be passed to [`action`](../../start/data/route-object#action)s,
2421
- * [`loader`](../../start/data/route-object#loader)s and [middleware](../../how-to/middleware).
2422
- * @param opts.routeDiscovery The route discovery configuration, used to determine how the router should discover new routes during navigations.
2423
- * @param opts.routes Your {@link unstable_RSCRouteConfigEntry | route definitions}.
2424
- * @returns A [`Response`](https://developer.mozilla.org/en-US/docs/Web/API/Response)
2425
- * that contains the [RSC](https://react.dev/reference/rsc/server-components)
2426
- * data for hydration.
2427
- */
2428
- declare function matchRSCServerRequest({ allowedActionOrigins, createTemporaryReferenceSet, basename, decodeReply, requestContext, routeDiscovery, loadServerAction, decodeAction, decodeFormState, onError, request, routes, generateResponse, }: {
2429
- allowedActionOrigins?: string[];
2430
- createTemporaryReferenceSet: () => unknown;
2431
- basename?: string;
2432
- decodeReply?: DecodeReplyFunction;
2433
- decodeAction?: DecodeActionFunction;
2434
- decodeFormState?: DecodeFormStateFunction;
2435
- requestContext?: RouterContextProvider;
2436
- loadServerAction?: LoadServerActionFunction;
2437
- onError?: (error: unknown) => void;
2438
- request: Request;
2439
- routes: RSCRouteConfigEntry[];
2440
- routeDiscovery?: RouteDiscovery;
2441
- generateResponse: (match: RSCMatch, { onError, temporaryReferences, }: {
2442
- onError(error: unknown): string | undefined;
2443
- temporaryReferences: unknown;
2444
- }) => Response;
2445
- }): Promise<Response>;
2446
-
2447
- /**
2448
- * Apps can use this interface to "register" app-wide types for React Router via interface declaration merging and module augmentation.
2449
- * React Router should handle this for you via type generation.
2450
- *
2451
- * For more on declaration merging and module augmentation, see https://www.typescriptlang.org/docs/handbook/declaration-merging.html#module-augmentation .
2452
- */
2453
- interface Register {
2454
- }
2455
- type AnyParams = Record<string, string | undefined>;
2456
- type AnyPages = Record<string, {
2457
- params: AnyParams;
2458
- }>;
2459
- type Pages = Register extends {
2460
- pages: infer Registered extends AnyPages;
2461
- } ? Registered : AnyPages;
2462
-
2463
- type Args = {
2464
- [K in keyof Pages]: ToArgs<Pages[K]["params"]>;
2465
- };
2466
- type ToArgs<Params extends Record<string, string | undefined>> = Equal<Params, {}> extends true ? [] : Partial<Params> extends Params ? [Params] | [] : [
2467
- Params
2468
- ];
2469
- /**
2470
- Returns a resolved URL path for the specified route.
2471
-
2472
- ```tsx
2473
- const h = href("/:lang?/about", { lang: "en" })
2474
- // -> `/en/about`
2475
-
2476
- <Link to={href("/products/:id", { id: "abc123" })} />
2477
- ```
2478
- */
2479
- declare function href<Path extends keyof Args>(path: Path, ...args: Args[Path]): string;
2480
-
2481
- interface CookieSignatureOptions {
2482
- /**
2483
- * An array of secrets that may be used to sign/unsign the value of a cookie.
2484
- *
2485
- * The array makes it easy to rotate secrets. New secrets should be added to
2486
- * the beginning of the array. `cookie.serialize()` will always use the first
2487
- * value in the array, but `cookie.parse()` may use any of them so that
2488
- * cookies that were signed with older secrets still work.
2489
- */
2490
- secrets?: string[];
2491
- }
2492
- type CookieOptions = ParseOptions & SerializeOptions & CookieSignatureOptions;
2493
- /**
2494
- * A HTTP cookie.
2495
- *
2496
- * A Cookie is a logical container for metadata about a HTTP cookie; its name
2497
- * and options. But it doesn't contain a value. Instead, it has `parse()` and
2498
- * `serialize()` methods that allow a single instance to be reused for
2499
- * parsing/encoding multiple different values.
2500
- *
2501
- * @see https://remix.run/utils/cookies#cookie-api
2502
- */
2503
- interface Cookie {
2504
- /**
2505
- * The name of the cookie, used in the `Cookie` and `Set-Cookie` headers.
2506
- */
2507
- readonly name: string;
2508
- /**
2509
- * True if this cookie uses one or more secrets for verification.
2510
- */
2511
- readonly isSigned: boolean;
2512
- /**
2513
- * The Date this cookie expires.
2514
- *
2515
- * Note: This is calculated at access time using `maxAge` when no `expires`
2516
- * option is provided to `createCookie()`.
2517
- */
2518
- readonly expires?: Date;
2519
- /**
2520
- * Parses a raw `Cookie` header and returns the value of this cookie or
2521
- * `null` if it's not present.
2522
- */
2523
- parse(cookieHeader: string | null, options?: ParseOptions): Promise<any>;
2524
- /**
2525
- * Serializes the given value to a string and returns the `Set-Cookie`
2526
- * header.
2527
- */
2528
- serialize(value: any, options?: SerializeOptions): Promise<string>;
2529
- }
2530
- /**
2531
- * Creates a logical container for managing a browser cookie from the server.
2532
- */
2533
- declare const createCookie: (name: string, cookieOptions?: CookieOptions) => Cookie;
2534
- type IsCookieFunction = (object: any) => object is Cookie;
2535
- /**
2536
- * Returns true if an object is a Remix cookie container.
2537
- *
2538
- * @see https://remix.run/utils/cookies#iscookie
2539
- */
2540
- declare const isCookie: IsCookieFunction;
2541
-
2542
- /**
2543
- * An object of name/value pairs to be used in the session.
2544
- */
2545
- interface SessionData {
2546
- [name: string]: any;
2547
- }
2548
- /**
2549
- * Session persists data across HTTP requests.
2550
- *
2551
- * @see https://reactrouter.com/explanation/sessions-and-cookies#sessions
2552
- */
2553
- interface Session<Data = SessionData, FlashData = Data> {
2554
- /**
2555
- * A unique identifier for this session.
2556
- *
2557
- * Note: This will be the empty string for newly created sessions and
2558
- * sessions that are not backed by a database (i.e. cookie-based sessions).
2559
- */
2560
- readonly id: string;
2561
- /**
2562
- * The raw data contained in this session.
2563
- *
2564
- * This is useful mostly for SessionStorage internally to access the raw
2565
- * session data to persist.
2566
- */
2567
- readonly data: FlashSessionData<Data, FlashData>;
2568
- /**
2569
- * Returns `true` if the session has a value for the given `name`, `false`
2570
- * otherwise.
2571
- */
2572
- has(name: (keyof Data | keyof FlashData) & string): boolean;
2573
- /**
2574
- * Returns the value for the given `name` in this session.
2575
- */
2576
- get<Key extends (keyof Data | keyof FlashData) & string>(name: Key): (Key extends keyof Data ? Data[Key] : undefined) | (Key extends keyof FlashData ? FlashData[Key] : undefined) | undefined;
2577
- /**
2578
- * Sets a value in the session for the given `name`.
2579
- */
2580
- set<Key extends keyof Data & string>(name: Key, value: Data[Key]): void;
2581
- /**
2582
- * Sets a value in the session that is only valid until the next `get()`.
2583
- * This can be useful for temporary values, like error messages.
2584
- */
2585
- flash<Key extends keyof FlashData & string>(name: Key, value: FlashData[Key]): void;
2586
- /**
2587
- * Removes a value from the session.
2588
- */
2589
- unset(name: keyof Data & string): void;
2590
- }
2591
- type FlashSessionData<Data, FlashData> = Partial<Data & {
2592
- [Key in keyof FlashData as FlashDataKey<Key & string>]: FlashData[Key];
2593
- }>;
2594
- type FlashDataKey<Key extends string> = `__flash_${Key}__`;
2595
- type CreateSessionFunction = <Data = SessionData, FlashData = Data>(initialData?: Data, id?: string) => Session<Data, FlashData>;
2596
- /**
2597
- * Creates a new Session object.
2598
- *
2599
- * Note: This function is typically not invoked directly by application code.
2600
- * Instead, use a `SessionStorage` object's `getSession` method.
2601
- */
2602
- declare const createSession: CreateSessionFunction;
2603
- type IsSessionFunction = (object: any) => object is Session;
2604
- /**
2605
- * Returns true if an object is a React Router session.
2606
- *
2607
- * @see https://reactrouter.com/api/utils/isSession
2608
- */
2609
- declare const isSession: IsSessionFunction;
2610
- /**
2611
- * SessionStorage stores session data between HTTP requests and knows how to
2612
- * parse and create cookies.
2613
- *
2614
- * A SessionStorage creates Session objects using a `Cookie` header as input.
2615
- * Then, later it generates the `Set-Cookie` header to be used in the response.
2616
- */
2617
- interface SessionStorage<Data = SessionData, FlashData = Data> {
2618
- /**
2619
- * Parses a Cookie header from a HTTP request and returns the associated
2620
- * Session. If there is no session associated with the cookie, this will
2621
- * return a new Session with no data.
2622
- */
2623
- getSession: (cookieHeader?: string | null, options?: ParseOptions) => Promise<Session<Data, FlashData>>;
2624
- /**
2625
- * Stores all data in the Session and returns the Set-Cookie header to be
2626
- * used in the HTTP response.
2627
- */
2628
- commitSession: (session: Session<Data, FlashData>, options?: SerializeOptions) => Promise<string>;
2629
- /**
2630
- * Deletes all data associated with the Session and returns the Set-Cookie
2631
- * header to be used in the HTTP response.
2632
- */
2633
- destroySession: (session: Session<Data, FlashData>, options?: SerializeOptions) => Promise<string>;
2634
- }
2635
- /**
2636
- * SessionIdStorageStrategy is designed to allow anyone to easily build their
2637
- * own SessionStorage using `createSessionStorage(strategy)`.
2638
- *
2639
- * This strategy describes a common scenario where the session id is stored in
2640
- * a cookie but the actual session data is stored elsewhere, usually in a
2641
- * database or on disk. A set of create, read, update, and delete operations
2642
- * are provided for managing the session data.
2643
- */
2644
- interface SessionIdStorageStrategy<Data = SessionData, FlashData = Data> {
2645
- /**
2646
- * The Cookie used to store the session id, or options used to automatically
2647
- * create one.
2648
- */
2649
- cookie?: Cookie | (CookieOptions & {
2650
- name?: string;
2651
- });
2652
- /**
2653
- * Creates a new record with the given data and returns the session id.
2654
- */
2655
- createData: (data: FlashSessionData<Data, FlashData>, expires?: Date) => Promise<string>;
2656
- /**
2657
- * Returns data for a given session id, or `null` if there isn't any.
2658
- */
2659
- readData: (id: string) => Promise<FlashSessionData<Data, FlashData> | null>;
2660
- /**
2661
- * Updates data for the given session id.
2662
- */
2663
- updateData: (id: string, data: FlashSessionData<Data, FlashData>, expires?: Date) => Promise<void>;
2664
- /**
2665
- * Deletes data for a given session id from the data store.
2666
- */
2667
- deleteData: (id: string) => Promise<void>;
2668
- }
2669
- /**
2670
- * Creates a SessionStorage object using a SessionIdStorageStrategy.
2671
- *
2672
- * Note: This is a low-level API that should only be used if none of the
2673
- * existing session storage options meet your requirements.
2674
- */
2675
- declare function createSessionStorage<Data = SessionData, FlashData = Data>({ cookie: cookieArg, createData, readData, updateData, deleteData, }: SessionIdStorageStrategy<Data, FlashData>): SessionStorage<Data, FlashData>;
2676
-
2677
- interface CookieSessionStorageOptions {
2678
- /**
2679
- * The Cookie used to store the session data on the client, or options used
2680
- * to automatically create one.
2681
- */
2682
- cookie?: SessionIdStorageStrategy["cookie"];
2683
- }
2684
- /**
2685
- * Creates and returns a SessionStorage object that stores all session data
2686
- * directly in the session cookie itself.
2687
- *
2688
- * This has the advantage that no database or other backend services are
2689
- * needed, and can help to simplify some load-balanced scenarios. However, it
2690
- * also has the limitation that serialized session data may not exceed the
2691
- * browser's maximum cookie size. Trade-offs!
2692
- */
2693
- declare function createCookieSessionStorage<Data = SessionData, FlashData = Data>({ cookie: cookieArg }?: CookieSessionStorageOptions): SessionStorage<Data, FlashData>;
2694
-
2695
- interface MemorySessionStorageOptions {
2696
- /**
2697
- * The Cookie used to store the session id on the client, or options used
2698
- * to automatically create one.
2699
- */
2700
- cookie?: SessionIdStorageStrategy["cookie"];
2701
- }
2702
- /**
2703
- * Creates and returns a simple in-memory SessionStorage object, mostly useful
2704
- * for testing and as a reference implementation.
2705
- *
2706
- * Note: This storage does not scale beyond a single process, so it is not
2707
- * suitable for most production scenarios.
2708
- */
2709
- declare function createMemorySessionStorage<Data = SessionData, FlashData = Data>({ cookie }?: MemorySessionStorageOptions): SessionStorage<Data, FlashData>;
2710
-
2711
- export { Await, type Cookie, type CookieOptions, type CookieSignatureOptions, type FlashSessionData, type IsCookieFunction, type IsSessionFunction, type MiddlewareFunction, type MiddlewareNextFunction, type RouterContext, RouterContextProvider, type Session, type SessionData, type SessionIdStorageStrategy, type SessionStorage, createContext, createCookie, createCookieSessionStorage, createMemorySessionStorage, createSession, createSessionStorage, createStaticHandler, data, href, isCookie, isRouteErrorResponse, isSession, matchRoutes, redirect, redirectDocument, replace, type DecodeActionFunction as unstable_DecodeActionFunction, type DecodeFormStateFunction as unstable_DecodeFormStateFunction, type DecodeReplyFunction as unstable_DecodeReplyFunction, type LoadServerActionFunction as unstable_LoadServerActionFunction, type RSCManifestPayload as unstable_RSCManifestPayload, type RSCMatch as unstable_RSCMatch, type RSCPayload as unstable_RSCPayload, type RSCRenderPayload as unstable_RSCRenderPayload, type RSCRouteConfig as unstable_RSCRouteConfig, type RSCRouteConfigEntry as unstable_RSCRouteConfigEntry, type RSCRouteManifest as unstable_RSCRouteManifest, type RSCRouteMatch as unstable_RSCRouteMatch, getRequest as unstable_getRequest, matchRSCServerRequest as unstable_matchRSCServerRequest };