react-router 7.16.0 → 8.0.0-pre.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (369) hide show
  1. package/CHANGELOG.md +0 -1
  2. package/dist/development/dom-export.d.ts +6 -172
  3. package/dist/development/dom-export.js +12 -1007
  4. package/dist/development/index-react-server-client.d.ts +7 -4
  5. package/dist/development/index-react-server-client.js +8 -52
  6. package/dist/development/index-react-server.d.ts +1645 -1635
  7. package/dist/development/index-react-server.js +2880 -3642
  8. package/dist/development/index.d.ts +43 -1475
  9. package/dist/development/index.js +37 -2621
  10. package/dist/development/lib/actions.js +62 -0
  11. package/dist/development/lib/components.d.ts +1022 -0
  12. package/dist/development/lib/components.js +835 -0
  13. package/dist/development/lib/context.d.ts +83 -0
  14. package/dist/development/lib/context.js +41 -0
  15. package/dist/development/lib/dom/dom.d.ts +119 -0
  16. package/dist/development/lib/dom/dom.js +143 -0
  17. package/dist/development/lib/dom/lib.d.ts +2042 -0
  18. package/dist/development/lib/dom/lib.js +1259 -0
  19. package/dist/development/lib/dom/server.d.ts +138 -0
  20. package/dist/development/lib/dom/server.js +301 -0
  21. package/dist/development/lib/dom/ssr/components.d.ts +196 -0
  22. package/dist/development/lib/dom/ssr/components.js +579 -0
  23. package/dist/development/lib/dom/ssr/data.js +29 -0
  24. package/dist/development/lib/dom/ssr/entry.d.ts +59 -0
  25. package/dist/development/lib/dom/ssr/errorBoundaries.d.ts +27 -0
  26. package/dist/development/lib/dom/ssr/errorBoundaries.js +83 -0
  27. package/dist/development/lib/dom/ssr/errors.d.ts +7 -0
  28. package/dist/development/lib/dom/ssr/errors.js +36 -0
  29. package/dist/development/lib/dom/ssr/fallback.js +28 -0
  30. package/dist/development/lib/dom/ssr/fog-of-war.d.ts +12 -0
  31. package/dist/development/lib/dom/ssr/fog-of-war.js +170 -0
  32. package/dist/development/lib/dom/ssr/hydration.d.ts +32 -0
  33. package/dist/development/lib/dom/ssr/hydration.js +29 -0
  34. package/dist/development/lib/dom/ssr/invariant.js +16 -0
  35. package/dist/development/lib/dom/ssr/links.js +170 -0
  36. package/dist/development/lib/dom/ssr/markup.js +24 -0
  37. package/dist/development/lib/dom/ssr/routeModules.d.ts +206 -0
  38. package/dist/development/lib/dom/ssr/routeModules.js +31 -0
  39. package/dist/development/lib/dom/ssr/routes-test-stub.d.ts +62 -0
  40. package/dist/development/lib/dom/ssr/routes-test-stub.js +108 -0
  41. package/dist/development/lib/dom/ssr/routes.d.ts +33 -0
  42. package/dist/development/lib/dom/ssr/routes.js +303 -0
  43. package/dist/development/lib/dom/ssr/server.d.ts +45 -0
  44. package/dist/development/lib/dom/ssr/server.js +68 -0
  45. package/dist/development/lib/dom/ssr/single-fetch.d.ts +14 -0
  46. package/dist/development/lib/dom/ssr/single-fetch.js +346 -0
  47. package/dist/development/lib/dom-export/dom-router-provider.d.ts +9 -0
  48. package/dist/development/lib/dom-export/dom-router-provider.js +22 -0
  49. package/dist/development/lib/dom-export/hydrated-router.d.ts +125 -0
  50. package/dist/development/lib/dom-export/hydrated-router.js +153 -0
  51. package/dist/development/lib/errors.js +29 -0
  52. package/dist/development/lib/hooks.d.ts +947 -0
  53. package/dist/development/lib/hooks.js +1386 -0
  54. package/dist/development/lib/href.d.ts +20 -0
  55. package/dist/development/lib/href.js +50 -0
  56. package/dist/development/lib/router/history.d.ts +258 -0
  57. package/dist/development/lib/router/history.js +371 -0
  58. package/dist/development/lib/router/instrumentation.d.ts +86 -0
  59. package/dist/development/lib/router/instrumentation.js +213 -0
  60. package/dist/development/lib/router/links.d.ts +113 -0
  61. package/dist/development/lib/router/router.d.ts +663 -0
  62. package/dist/development/lib/router/router.js +2981 -0
  63. package/dist/development/lib/router/utils.d.ts +942 -0
  64. package/dist/development/lib/router/utils.js +791 -0
  65. package/dist/development/lib/rsc/browser.d.ts +137 -0
  66. package/dist/development/lib/rsc/browser.js +599 -0
  67. package/dist/development/lib/rsc/errorBoundaries.d.ts +11 -0
  68. package/dist/development/lib/rsc/errorBoundaries.js +90 -0
  69. package/dist/development/lib/rsc/html-stream/browser.d.ts +48 -0
  70. package/dist/development/lib/rsc/html-stream/browser.js +74 -0
  71. package/dist/development/lib/rsc/html-stream/server.js +78 -0
  72. package/dist/development/lib/rsc/route-modules.js +27 -0
  73. package/dist/development/lib/rsc/server.rsc.d.ts +219 -0
  74. package/dist/development/lib/rsc/server.ssr.d.ts +129 -0
  75. package/dist/development/lib/rsc/server.ssr.js +388 -0
  76. package/dist/development/lib/server-runtime/build.d.ts +66 -0
  77. package/dist/development/lib/server-runtime/cookies.d.ts +66 -0
  78. package/dist/development/lib/server-runtime/cookies.js +139 -0
  79. package/dist/development/lib/server-runtime/crypto.js +43 -0
  80. package/dist/development/lib/server-runtime/data.d.ts +13 -0
  81. package/dist/development/lib/server-runtime/data.js +25 -0
  82. package/dist/development/lib/server-runtime/dev.d.ts +9 -0
  83. package/dist/development/lib/server-runtime/dev.js +26 -0
  84. package/dist/development/lib/server-runtime/entry.js +20 -0
  85. package/dist/development/lib/server-runtime/errors.js +95 -0
  86. package/dist/development/lib/server-runtime/headers.js +73 -0
  87. package/dist/development/lib/server-runtime/invariant.js +19 -0
  88. package/dist/development/lib/server-runtime/mode.d.ts +12 -0
  89. package/dist/development/lib/server-runtime/mode.js +25 -0
  90. package/dist/development/lib/server-runtime/routeMatching.js +28 -0
  91. package/dist/development/lib/server-runtime/routes.d.ts +13 -0
  92. package/dist/development/lib/server-runtime/routes.js +74 -0
  93. package/dist/development/lib/server-runtime/server.d.ts +10 -0
  94. package/dist/development/lib/server-runtime/server.js +351 -0
  95. package/dist/development/lib/server-runtime/serverHandoff.js +17 -0
  96. package/dist/development/lib/server-runtime/sessions/cookieStorage.d.ts +25 -0
  97. package/dist/development/lib/server-runtime/sessions/cookieStorage.js +45 -0
  98. package/dist/development/lib/server-runtime/sessions/memoryStorage.d.ts +23 -0
  99. package/dist/development/lib/server-runtime/sessions/memoryStorage.js +52 -0
  100. package/dist/development/lib/server-runtime/sessions.d.ts +145 -0
  101. package/dist/development/lib/server-runtime/sessions.js +98 -0
  102. package/dist/development/lib/server-runtime/single-fetch.d.ts +7 -0
  103. package/dist/development/lib/server-runtime/single-fetch.js +215 -0
  104. package/dist/development/lib/server-runtime/urls.js +31 -0
  105. package/dist/development/lib/server-runtime/warnings.js +20 -0
  106. package/dist/development/lib/types/future.d.ts +9 -0
  107. package/dist/development/lib/types/internal.d.ts +26 -177
  108. package/dist/development/lib/types/internal.js +3 -2
  109. package/dist/{production/register-CNAx3TXj.d.ts → development/lib/types/register.d.ts} +9 -15
  110. package/dist/development/lib/types/route-data.d.ts +113 -0
  111. package/dist/development/lib/types/route-module-annotations.d.ts +149 -0
  112. package/dist/development/lib/types/route-module.d.ts +19 -0
  113. package/dist/development/lib/types/serializes-to.d.ts +13 -0
  114. package/dist/development/lib/types/utils.d.ts +11 -0
  115. package/dist/development/vendor/turbo-stream-v2/flatten.js +159 -0
  116. package/dist/development/vendor/turbo-stream-v2/turbo-stream.js +178 -0
  117. package/dist/development/vendor/turbo-stream-v2/unflatten.js +198 -0
  118. package/dist/development/vendor/turbo-stream-v2/utils.js +47 -0
  119. package/dist/production/dom-export.d.ts +6 -172
  120. package/dist/production/dom-export.js +12 -1007
  121. package/dist/production/index-react-server-client.d.ts +7 -4
  122. package/dist/production/index-react-server-client.js +8 -52
  123. package/dist/production/index-react-server.d.ts +1645 -1635
  124. package/dist/production/index-react-server.js +2871 -3642
  125. package/dist/production/index.d.ts +43 -1475
  126. package/dist/production/index.js +37 -2621
  127. package/dist/production/lib/actions.js +62 -0
  128. package/dist/production/lib/components.d.ts +1022 -0
  129. package/dist/production/lib/components.js +835 -0
  130. package/dist/production/lib/context.d.ts +83 -0
  131. package/dist/production/lib/context.js +41 -0
  132. package/dist/production/lib/dom/dom.d.ts +119 -0
  133. package/dist/production/lib/dom/dom.js +143 -0
  134. package/dist/production/lib/dom/lib.d.ts +2042 -0
  135. package/dist/production/lib/dom/lib.js +1259 -0
  136. package/dist/production/lib/dom/server.d.ts +138 -0
  137. package/dist/production/lib/dom/server.js +301 -0
  138. package/dist/production/lib/dom/ssr/components.d.ts +196 -0
  139. package/dist/production/lib/dom/ssr/components.js +579 -0
  140. package/dist/production/lib/dom/ssr/data.js +29 -0
  141. package/dist/production/lib/dom/ssr/entry.d.ts +59 -0
  142. package/dist/production/lib/dom/ssr/errorBoundaries.d.ts +27 -0
  143. package/dist/production/lib/dom/ssr/errorBoundaries.js +83 -0
  144. package/dist/production/lib/dom/ssr/errors.d.ts +7 -0
  145. package/dist/production/lib/dom/ssr/errors.js +36 -0
  146. package/dist/production/lib/dom/ssr/fallback.js +21 -0
  147. package/dist/production/lib/dom/ssr/fog-of-war.d.ts +12 -0
  148. package/dist/production/lib/dom/ssr/fog-of-war.js +170 -0
  149. package/dist/production/lib/dom/ssr/hydration.d.ts +32 -0
  150. package/dist/production/lib/dom/ssr/hydration.js +29 -0
  151. package/dist/production/lib/dom/ssr/invariant.js +16 -0
  152. package/dist/production/lib/dom/ssr/links.js +170 -0
  153. package/dist/production/lib/dom/ssr/markup.js +24 -0
  154. package/dist/production/lib/dom/ssr/routeModules.d.ts +206 -0
  155. package/dist/production/lib/dom/ssr/routeModules.js +31 -0
  156. package/dist/production/lib/dom/ssr/routes-test-stub.d.ts +62 -0
  157. package/dist/production/lib/dom/ssr/routes-test-stub.js +108 -0
  158. package/dist/production/lib/dom/ssr/routes.d.ts +33 -0
  159. package/dist/production/lib/dom/ssr/routes.js +303 -0
  160. package/dist/production/lib/dom/ssr/server.d.ts +45 -0
  161. package/dist/production/lib/dom/ssr/server.js +68 -0
  162. package/dist/production/lib/dom/ssr/single-fetch.d.ts +14 -0
  163. package/dist/production/lib/dom/ssr/single-fetch.js +346 -0
  164. package/dist/production/lib/dom-export/dom-router-provider.d.ts +9 -0
  165. package/dist/production/lib/dom-export/dom-router-provider.js +22 -0
  166. package/dist/production/lib/dom-export/hydrated-router.d.ts +125 -0
  167. package/dist/production/lib/dom-export/hydrated-router.js +153 -0
  168. package/dist/production/lib/errors.js +29 -0
  169. package/dist/production/lib/hooks.d.ts +947 -0
  170. package/dist/production/lib/hooks.js +1371 -0
  171. package/dist/production/lib/href.d.ts +20 -0
  172. package/dist/production/lib/href.js +50 -0
  173. package/dist/production/lib/router/history.d.ts +258 -0
  174. package/dist/production/lib/router/history.js +371 -0
  175. package/dist/production/lib/router/instrumentation.d.ts +86 -0
  176. package/dist/production/lib/router/instrumentation.js +213 -0
  177. package/dist/production/lib/router/links.d.ts +113 -0
  178. package/dist/production/lib/router/router.d.ts +663 -0
  179. package/dist/production/lib/router/router.js +2981 -0
  180. package/dist/production/lib/router/utils.d.ts +942 -0
  181. package/dist/production/lib/router/utils.js +782 -0
  182. package/dist/production/lib/rsc/browser.d.ts +137 -0
  183. package/dist/production/lib/rsc/browser.js +599 -0
  184. package/dist/production/lib/rsc/errorBoundaries.d.ts +11 -0
  185. package/dist/production/lib/rsc/errorBoundaries.js +90 -0
  186. package/dist/production/lib/rsc/html-stream/browser.d.ts +48 -0
  187. package/dist/production/lib/rsc/html-stream/browser.js +74 -0
  188. package/dist/production/lib/rsc/html-stream/server.js +78 -0
  189. package/dist/production/lib/rsc/route-modules.js +27 -0
  190. package/dist/production/lib/rsc/server.rsc.d.ts +219 -0
  191. package/dist/production/lib/rsc/server.ssr.d.ts +129 -0
  192. package/dist/production/lib/rsc/server.ssr.js +388 -0
  193. package/dist/production/lib/server-runtime/build.d.ts +66 -0
  194. package/dist/production/lib/server-runtime/cookies.d.ts +66 -0
  195. package/dist/production/lib/server-runtime/cookies.js +139 -0
  196. package/dist/production/lib/server-runtime/crypto.js +43 -0
  197. package/dist/production/lib/server-runtime/data.d.ts +13 -0
  198. package/dist/production/lib/server-runtime/data.js +25 -0
  199. package/dist/production/lib/server-runtime/dev.d.ts +9 -0
  200. package/dist/production/lib/server-runtime/dev.js +26 -0
  201. package/dist/production/lib/server-runtime/entry.js +20 -0
  202. package/dist/production/lib/server-runtime/errors.js +95 -0
  203. package/dist/production/lib/server-runtime/headers.js +73 -0
  204. package/dist/production/lib/server-runtime/invariant.js +19 -0
  205. package/dist/production/lib/server-runtime/mode.d.ts +12 -0
  206. package/dist/production/lib/server-runtime/mode.js +25 -0
  207. package/dist/production/lib/server-runtime/routeMatching.js +28 -0
  208. package/dist/production/lib/server-runtime/routes.d.ts +13 -0
  209. package/dist/production/lib/server-runtime/routes.js +74 -0
  210. package/dist/production/lib/server-runtime/server.d.ts +10 -0
  211. package/dist/production/lib/server-runtime/server.js +351 -0
  212. package/dist/production/lib/server-runtime/serverHandoff.js +17 -0
  213. package/dist/production/lib/server-runtime/sessions/cookieStorage.d.ts +25 -0
  214. package/dist/production/lib/server-runtime/sessions/cookieStorage.js +45 -0
  215. package/dist/production/lib/server-runtime/sessions/memoryStorage.d.ts +23 -0
  216. package/dist/production/lib/server-runtime/sessions/memoryStorage.js +52 -0
  217. package/dist/production/lib/server-runtime/sessions.d.ts +145 -0
  218. package/dist/production/lib/server-runtime/sessions.js +98 -0
  219. package/dist/production/lib/server-runtime/single-fetch.d.ts +7 -0
  220. package/dist/production/lib/server-runtime/single-fetch.js +215 -0
  221. package/dist/production/lib/server-runtime/urls.js +31 -0
  222. package/dist/production/lib/server-runtime/warnings.js +20 -0
  223. package/dist/production/lib/types/future.d.ts +9 -0
  224. package/dist/production/lib/types/internal.d.ts +26 -177
  225. package/dist/production/lib/types/internal.js +3 -2
  226. package/dist/{development/register-CNAx3TXj.d.ts → production/lib/types/register.d.ts} +9 -15
  227. package/dist/production/lib/types/route-data.d.ts +113 -0
  228. package/dist/production/lib/types/route-module-annotations.d.ts +149 -0
  229. package/dist/production/lib/types/route-module.d.ts +19 -0
  230. package/dist/production/lib/types/serializes-to.d.ts +13 -0
  231. package/dist/production/lib/types/utils.d.ts +11 -0
  232. package/dist/production/vendor/turbo-stream-v2/flatten.js +159 -0
  233. package/dist/production/vendor/turbo-stream-v2/turbo-stream.js +178 -0
  234. package/dist/production/vendor/turbo-stream-v2/unflatten.js +198 -0
  235. package/dist/production/vendor/turbo-stream-v2/utils.js +47 -0
  236. package/docs/explanation/backend-for-frontend.md +50 -0
  237. package/docs/explanation/code-splitting.md +77 -0
  238. package/docs/explanation/concurrency.md +135 -0
  239. package/docs/explanation/form-vs-fetcher.md +292 -0
  240. package/docs/explanation/hot-module-replacement.md +137 -0
  241. package/docs/explanation/hydration.md +14 -0
  242. package/docs/explanation/index-query-param.md +86 -0
  243. package/docs/explanation/index.md +4 -0
  244. package/docs/explanation/lazy-route-discovery.md +78 -0
  245. package/docs/explanation/location.md +6 -0
  246. package/docs/explanation/progressive-enhancement.md +150 -0
  247. package/docs/explanation/race-conditions.md +88 -0
  248. package/docs/explanation/react-transitions.md +160 -0
  249. package/docs/explanation/route-matching.md +7 -0
  250. package/docs/explanation/server-client-execution.md +4 -0
  251. package/docs/explanation/sessions-and-cookies.md +465 -0
  252. package/docs/explanation/special-files.md +16 -0
  253. package/docs/explanation/state-management.md +524 -0
  254. package/docs/explanation/styling.md +87 -0
  255. package/docs/explanation/type-safety.md +82 -0
  256. package/docs/how-to/accessibility.md +44 -0
  257. package/docs/how-to/client-data.md +199 -0
  258. package/docs/how-to/data-strategy.md +317 -0
  259. package/docs/how-to/error-boundary.md +231 -0
  260. package/docs/how-to/error-reporting.md +134 -0
  261. package/docs/how-to/fetchers.md +307 -0
  262. package/docs/how-to/file-route-conventions.md +410 -0
  263. package/docs/how-to/file-uploads.md +217 -0
  264. package/docs/how-to/form-validation.md +120 -0
  265. package/docs/how-to/headers.md +164 -0
  266. package/docs/how-to/index.md +4 -0
  267. package/docs/how-to/instrumentation.md +556 -0
  268. package/docs/how-to/meta.md +40 -0
  269. package/docs/how-to/middleware.md +728 -0
  270. package/docs/how-to/navigation-blocking.md +233 -0
  271. package/docs/how-to/optimize-revalidation.md +12 -0
  272. package/docs/how-to/pre-rendering.md +225 -0
  273. package/docs/how-to/presets.md +103 -0
  274. package/docs/how-to/react-server-components.md +899 -0
  275. package/docs/how-to/resource-routes.md +126 -0
  276. package/docs/how-to/route-module-type-safety.md +100 -0
  277. package/docs/how-to/search-params.md +4 -0
  278. package/docs/how-to/security.md +30 -0
  279. package/docs/how-to/server-bundles.md +66 -0
  280. package/docs/how-to/spa.md +120 -0
  281. package/docs/how-to/status.md +63 -0
  282. package/docs/how-to/suspense.md +132 -0
  283. package/docs/how-to/using-handle.md +117 -0
  284. package/docs/how-to/view-transitions.md +237 -0
  285. package/docs/how-to/webhook.md +50 -0
  286. package/docs/index.md +39 -0
  287. package/docs/start/data/actions.md +138 -0
  288. package/docs/start/data/custom.md +198 -0
  289. package/docs/start/data/data-loading.md +44 -0
  290. package/docs/start/data/index.md +4 -0
  291. package/docs/start/data/installation.md +52 -0
  292. package/docs/start/data/navigating.md +12 -0
  293. package/docs/start/data/pending-ui.md +12 -0
  294. package/docs/start/data/route-object.md +248 -0
  295. package/docs/start/data/routing.md +281 -0
  296. package/docs/start/data/testing.md +8 -0
  297. package/docs/start/declarative/index.md +4 -0
  298. package/docs/start/declarative/installation.md +43 -0
  299. package/docs/start/declarative/navigating.md +133 -0
  300. package/docs/start/declarative/routing.md +237 -0
  301. package/docs/start/declarative/url-values.md +65 -0
  302. package/docs/start/framework/actions.md +175 -0
  303. package/docs/start/framework/data-loading.md +201 -0
  304. package/docs/start/framework/deploying.md +96 -0
  305. package/docs/start/framework/index.md +4 -0
  306. package/docs/start/framework/installation.md +42 -0
  307. package/docs/start/framework/navigating.md +182 -0
  308. package/docs/start/framework/pending-ui.md +142 -0
  309. package/docs/start/framework/rendering.md +59 -0
  310. package/docs/start/framework/route-module.md +527 -0
  311. package/docs/start/framework/routing.md +362 -0
  312. package/docs/start/framework/testing.md +133 -0
  313. package/docs/start/index.md +4 -0
  314. package/docs/start/modes.md +201 -0
  315. package/docs/upgrading/component-routes.md +363 -0
  316. package/docs/upgrading/future.md +31 -0
  317. package/docs/upgrading/index.md +4 -0
  318. package/docs/upgrading/remix.md +403 -0
  319. package/docs/upgrading/router-provider.md +442 -0
  320. package/docs/upgrading/v6.md +379 -0
  321. package/package.json +44 -87
  322. package/dist/development/browser-D3uq9sI1.d.ts +0 -318
  323. package/dist/development/browser-nIQ4Nsyi.d.mts +0 -318
  324. package/dist/development/chunk-IBI7OMNB.js +0 -1363
  325. package/dist/development/chunk-QUQL4437.mjs +0 -11529
  326. package/dist/development/chunk-S54KXAEJ.mjs +0 -2585
  327. package/dist/development/chunk-SRID2YZ2.js +0 -10229
  328. package/dist/development/chunk-XEJDWL2B.js +0 -188
  329. package/dist/development/context-m8rizgnE.d.mts +0 -1771
  330. package/dist/development/data-D4xhSy90.d.ts +0 -1732
  331. package/dist/development/data-U8FS-wNn.d.mts +0 -1732
  332. package/dist/development/dom-export.d.mts +0 -172
  333. package/dist/development/dom-export.mjs +0 -1008
  334. package/dist/development/index-react-server-client-BLiUx67a.d.ts +0 -3655
  335. package/dist/development/index-react-server-client-CdKROblb.d.mts +0 -2600
  336. package/dist/development/index-react-server-client.d.mts +0 -4
  337. package/dist/development/index-react-server-client.mjs +0 -59
  338. package/dist/development/index-react-server.d.mts +0 -2703
  339. package/dist/development/index-react-server.mjs +0 -3780
  340. package/dist/development/index.d.mts +0 -1478
  341. package/dist/development/index.mjs +0 -277
  342. package/dist/development/instrumentation-1q4YhLGP.d.ts +0 -715
  343. package/dist/development/lib/types/internal.d.mts +0 -184
  344. package/dist/development/lib/types/internal.mjs +0 -10
  345. package/dist/development/register-CqK96Zfk.d.mts +0 -30
  346. package/dist/production/browser-D3uq9sI1.d.ts +0 -318
  347. package/dist/production/browser-nIQ4Nsyi.d.mts +0 -318
  348. package/dist/production/chunk-EAQNHM3N.js +0 -188
  349. package/dist/production/chunk-NALGHHKE.mjs +0 -2585
  350. package/dist/production/chunk-Q65P7S7Y.mjs +0 -11529
  351. package/dist/production/chunk-SKEDDLRM.js +0 -1363
  352. package/dist/production/chunk-Y7DNFQZP.js +0 -10229
  353. package/dist/production/context-m8rizgnE.d.mts +0 -1771
  354. package/dist/production/data-D4xhSy90.d.ts +0 -1732
  355. package/dist/production/data-U8FS-wNn.d.mts +0 -1732
  356. package/dist/production/dom-export.d.mts +0 -172
  357. package/dist/production/dom-export.mjs +0 -1008
  358. package/dist/production/index-react-server-client-BLiUx67a.d.ts +0 -3655
  359. package/dist/production/index-react-server-client-CdKROblb.d.mts +0 -2600
  360. package/dist/production/index-react-server-client.d.mts +0 -4
  361. package/dist/production/index-react-server-client.mjs +0 -59
  362. package/dist/production/index-react-server.d.mts +0 -2703
  363. package/dist/production/index-react-server.mjs +0 -3780
  364. package/dist/production/index.d.mts +0 -1478
  365. package/dist/production/index.mjs +0 -277
  366. package/dist/production/instrumentation-1q4YhLGP.d.ts +0 -715
  367. package/dist/production/lib/types/internal.d.mts +0 -184
  368. package/dist/production/lib/types/internal.mjs +0 -10
  369. package/dist/production/register-CqK96Zfk.d.mts +0 -30
@@ -0,0 +1,231 @@
1
+ ---
2
+ title: Error Boundaries
3
+ ---
4
+
5
+ # Error Boundaries
6
+
7
+ [MODES: framework, data]
8
+
9
+ <br/>
10
+ <br/>
11
+
12
+ To avoid rendering an empty page to users, route modules will automatically catch errors in your code and render the closest `ErrorBoundary`.
13
+
14
+ Error boundaries are not intended for rendering form validation errors or error reporting. Please see [Form Validation](./form-validation) and [Error Reporting](./error-reporting) instead.
15
+
16
+ ## 1. Add a root error boundary
17
+
18
+ All applications should at a minimum export a root error boundary. This one handles the three main cases:
19
+
20
+ - Thrown `data` with a status code and text
21
+ - Instances of errors with a stack trace
22
+ - Randomly thrown values
23
+
24
+ ### Framework Mode
25
+
26
+ [modes: framework]
27
+
28
+ In [Framework Mode][picking-a-mode], errors are passed to the route-level error boundary as a prop (see [`Route.ErrorBoundaryProps`][type-safety]), so you don't need to use a hook to grab it:
29
+
30
+ ```tsx filename=root.tsx lines=[1,3-5]
31
+ import { Route } from "./+types/root";
32
+
33
+ export function ErrorBoundary({
34
+ error,
35
+ }: Route.ErrorBoundaryProps) {
36
+ if (isRouteErrorResponse(error)) {
37
+ return (
38
+ <>
39
+ <h1>
40
+ {error.status} {error.statusText}
41
+ </h1>
42
+ <p>{error.data}</p>
43
+ </>
44
+ );
45
+ } else if (error instanceof Error) {
46
+ return (
47
+ <div>
48
+ <h1>Error</h1>
49
+ <p>{error.message}</p>
50
+ <p>The stack trace is:</p>
51
+ <pre>{error.stack}</pre>
52
+ </div>
53
+ );
54
+ } else {
55
+ return <h1>Unknown Error</h1>;
56
+ }
57
+ }
58
+ ```
59
+
60
+ ### Data Mode
61
+
62
+ [modes: data]
63
+
64
+ In [Data Mode][picking-a-mode], the `ErrorBoundary` doesn't receive props, so you can access it via `useRouteError`:
65
+
66
+ ```tsx lines=[1,6,16]
67
+ import { useRouteError } from "react-router";
68
+
69
+ let router = createBrowserRouter([
70
+ {
71
+ path: "/",
72
+ ErrorBoundary: RootErrorBoundary,
73
+ Component: Root,
74
+ },
75
+ ]);
76
+
77
+ function Root() {
78
+ /* ... */
79
+ }
80
+
81
+ function RootErrorBoundary() {
82
+ let error = useRouteError();
83
+ if (isRouteErrorResponse(error)) {
84
+ return (
85
+ <>
86
+ <h1>
87
+ {error.status} {error.statusText}
88
+ </h1>
89
+ <p>{error.data}</p>
90
+ </>
91
+ );
92
+ } else if (error instanceof Error) {
93
+ return (
94
+ <div>
95
+ <h1>Error</h1>
96
+ <p>{error.message}</p>
97
+ <p>The stack trace is:</p>
98
+ <pre>{error.stack}</pre>
99
+ </div>
100
+ );
101
+ } else {
102
+ return <h1>Unknown Error</h1>;
103
+ }
104
+ }
105
+ ```
106
+
107
+ ## 2. Write a bug
108
+
109
+ [modes: framework,data]
110
+
111
+ It's not recommended to intentionally throw errors to force the error boundary to render as a means of control flow. Error Boundaries are primarily for catching unintentional errors in your code.
112
+
113
+ ```tsx
114
+ export async function loader() {
115
+ return undefined();
116
+ }
117
+ ```
118
+
119
+ This will render the `instanceof Error` branch of the UI from step 1.
120
+
121
+ This is not just for loaders, but for all route module APIs: loaders, actions, components, headers, links, and meta.
122
+
123
+ ## 3. Throw data in loaders/actions
124
+
125
+ [modes: framework,data]
126
+
127
+ There are exceptions to the rule in #2, especially 404s. You can intentionally `throw data()` (with a proper status code) to the closest error boundary when your loader can't find what it needs to render the page. Throw a 404 and move on.
128
+
129
+ ```tsx
130
+ import { data } from "react-router";
131
+
132
+ export async function loader({ params }) {
133
+ let record = await fakeDb.getRecord(params.id);
134
+ if (!record) {
135
+ throw data("Record Not Found", { status: 404 });
136
+ }
137
+ return record;
138
+ }
139
+ ```
140
+
141
+ This will render the `isRouteErrorResponse` branch of the UI from step 1.
142
+
143
+ ## 4. Nested error boundaries
144
+
145
+ When an error is thrown, the "closest error boundary" will be rendered.
146
+
147
+ ### Framework Mode
148
+
149
+ [modes: framework]
150
+
151
+ Consider these nested routes:
152
+
153
+ ```tsx filename="routes.ts"
154
+ // ✅ has error boundary
155
+ route("/app", "app.tsx", [
156
+ // ❌ no error boundary
157
+ route("invoices", "invoices.tsx", [
158
+ // ✅ has error boundary
159
+ route("invoices/:id", "invoice-page.tsx", [
160
+ // ❌ no error boundary
161
+ route("payments", "payments.tsx"),
162
+ ]),
163
+ ]),
164
+ ]);
165
+ ```
166
+
167
+ The following table shows which error boundary will render given the origin of the error:
168
+
169
+ | error origin | rendered boundary |
170
+ | ---------------- | ----------------- |
171
+ | app.tsx | app.tsx |
172
+ | invoices.tsx | app.tsx |
173
+ | invoice-page.tsx | invoice-page.tsx |
174
+ | payments.tsx | invoice-page.tsx |
175
+
176
+ ### Data Mode
177
+
178
+ [modes: data]
179
+
180
+ In Data Mode, the equivalent route tree might look like:
181
+
182
+ ```tsx
183
+ let router = createBrowserRouter([
184
+ {
185
+ path: "/app",
186
+ Component: App,
187
+ ErrorBoundary: AppErrorBoundary, // ✅ has error boundary
188
+ children: [
189
+ {
190
+ path: "invoices",
191
+ Component: Invoices, // ❌ no error boundary
192
+ children: [
193
+ {
194
+ path: ":id",
195
+ Component: Invoice,
196
+ ErrorBoundary: InvoiceErrorBoundary, // ✅ has error boundary
197
+ children: [
198
+ {
199
+ path: "payments",
200
+ Component: Payments, // ❌ no error boundary
201
+ },
202
+ ],
203
+ },
204
+ ],
205
+ },
206
+ ],
207
+ },
208
+ ]);
209
+ ```
210
+
211
+ The following table shows which error boundary will render given the origin of the error:
212
+
213
+ | error origin | rendered boundary |
214
+ | ------------ | ---------------------- |
215
+ | `App` | `AppErrorBoundary` |
216
+ | `Invoices` | `AppErrorBoundary` |
217
+ | `Invoice` | `InvoiceErrorBoundary` |
218
+ | `Payments` | `InvoiceErrorBoundary` |
219
+
220
+ ## Error Sanitization
221
+
222
+ [modes: framework]
223
+
224
+ In Framework Mode when building for production, any errors that happen on the server are automatically sanitized before being sent to the browser to prevent leaking any sensitive server information (like stack traces).
225
+
226
+ This means that a thrown `Error` will have a generic message and no stack trace in production in the browser. The original error is untouched on the server.
227
+
228
+ Also note that data sent with `throw data(yourData)` is not sanitized as the data there is intended to be rendered.
229
+
230
+ [picking-a-mode]: ../start/modes
231
+ [type-safety]: ../explanation/type-safety
@@ -0,0 +1,134 @@
1
+ ---
2
+ title: Error Reporting
3
+ ---
4
+
5
+ # Error Reporting
6
+
7
+ [MODES: framework,data]
8
+
9
+ <br/>
10
+ <br/>
11
+
12
+ React Router catches errors in your route modules and sends them to [error boundaries](./error-boundary) to prevent blank pages when errors occur. However, `ErrorBoundary` isn't sufficient for logging and reporting errors.
13
+
14
+ ## Server Errors
15
+
16
+ [modes: framework]
17
+
18
+ To access these caught errors on the server, use the `handleError` export of the server entry module.
19
+
20
+ ### 1. Reveal the server entry
21
+
22
+ If you don't see [`entry.server.tsx`][entryserver] in your app directory, you're using a default entry. Reveal it with this cli command:
23
+
24
+ ```shellscript nonumber
25
+ react-router reveal entry.server
26
+ ```
27
+
28
+ ### 2. Export your error handler
29
+
30
+ This function is called whenever React Router catches an error in your application on the server.
31
+
32
+ ```tsx filename=entry.server.tsx
33
+ import { type HandleErrorFunction } from "react-router";
34
+
35
+ export const handleError: HandleErrorFunction = (
36
+ error,
37
+ { request },
38
+ ) => {
39
+ // React Router may abort some interrupted requests, don't log those
40
+ if (!request.signal.aborted) {
41
+ myReportError(error);
42
+
43
+ // make sure to still log the error so you can see it
44
+ console.error(error);
45
+ }
46
+ };
47
+ ```
48
+
49
+ See also:
50
+
51
+ - [`handleError`][handleError]
52
+
53
+ ## Client Errors
54
+
55
+ To access these caught errors on the client, use the `onError` prop on your [`HydratedRouter`][hydratedrouter] or [`RouterProvider`][routerprovider] component.
56
+
57
+ ### Framework Mode
58
+
59
+ [modes: framework]
60
+
61
+ #### 1. Reveal the client entry
62
+
63
+ If you don't see [`entry.client.tsx`][entryclient] in your app directory, you're using a default entry. Reveal it with this cli command:
64
+
65
+ ```shellscript nonumber
66
+ react-router reveal entry.client
67
+ ```
68
+
69
+ #### 2. Add your error handler
70
+
71
+ This function is called whenever React Router catches an error in your application on the client.
72
+
73
+ ```tsx filename=entry.client.tsx
74
+ import { type ClientOnErrorFunction } from "react-router";
75
+
76
+ const onError: ClientOnErrorFunction = (
77
+ error,
78
+ { location, params, pattern, errorInfo },
79
+ ) => {
80
+ myReportError(error, location, errorInfo);
81
+
82
+ // make sure to still log the error so you can see it
83
+ console.error(error, errorInfo);
84
+ };
85
+
86
+ startTransition(() => {
87
+ hydrateRoot(
88
+ document,
89
+ <StrictMode>
90
+ <HydratedRouter onError={onError} />
91
+ </StrictMode>,
92
+ );
93
+ });
94
+ ```
95
+
96
+ See also:
97
+
98
+ - [`<HydratedRouter onError>`][hydratedrouter-onerror]
99
+
100
+ ### Data Mode
101
+
102
+ [modes: data]
103
+
104
+ This function is called whenever React Router catches an error in your application on the client.
105
+
106
+ ```tsx
107
+ import { type ClientOnErrorFunction } from "react-router";
108
+
109
+ const onError: ClientOnErrorFunction = (
110
+ error,
111
+ { location, params, pattern, errorInfo },
112
+ ) => {
113
+ myReportError(error, location, errorInfo);
114
+
115
+ // make sure to still log the error so you can see it
116
+ console.error(error, errorInfo);
117
+ };
118
+
119
+ function App() {
120
+ return <RouterProvider onError={onError} />;
121
+ }
122
+ ```
123
+
124
+ See also:
125
+
126
+ - [`<RouterProvider onError>`][routerprovider-onerror]
127
+
128
+ [entryserver]: ../api/framework-conventions/entry.server.tsx
129
+ [handleError]: ../api/framework-conventions/entry.server.tsx#handleerror
130
+ [entryclient]: ../api/framework-conventions/entry.client.tsx
131
+ [hydratedrouter]: ../api/framework-routers/HydratedRouter
132
+ [routerprovider]: ../api/data-routers/RouterProvider
133
+ [hydratedrouter-onerror]: ../api/framework-routers/HydratedRouter#onError
134
+ [routerprovider-onerror]: ../api/data-routers/RouterProvider#onError
@@ -0,0 +1,307 @@
1
+ ---
2
+ title: Using Fetchers
3
+ ---
4
+
5
+ # Using Fetchers
6
+
7
+ [MODES: framework, data]
8
+
9
+ <br/>
10
+ <br/>
11
+
12
+ Fetchers are useful for creating complex, dynamic user interfaces that require multiple, concurrent data interactions without causing a navigation.
13
+
14
+ Fetchers track their own, independent state and can be used to load data, mutate data, submit forms, and generally interact with loaders and actions.
15
+
16
+ ## Calling Actions
17
+
18
+ The most common case for a fetcher is to submit data to an action, triggering a revalidation of route data. Consider the following route module:
19
+
20
+ ```tsx
21
+ import { useLoaderData } from "react-router";
22
+
23
+ export async function clientLoader({ request }) {
24
+ let title = localStorage.getItem("title") || "No Title";
25
+ return { title };
26
+ }
27
+
28
+ export default function Component() {
29
+ let data = useLoaderData();
30
+ return (
31
+ <div>
32
+ <h1>{data.title}</h1>
33
+ </div>
34
+ );
35
+ }
36
+ ```
37
+
38
+ ### 1. Add an action
39
+
40
+ First we'll add an action to the route for the fetcher to call:
41
+
42
+ ```tsx lines=[7-11]
43
+ import { useLoaderData } from "react-router";
44
+
45
+ export async function clientLoader({ request }) {
46
+ // ...
47
+ }
48
+
49
+ export async function clientAction({ request }) {
50
+ await new Promise((res) => setTimeout(res, 1000));
51
+ let data = await request.formData();
52
+ localStorage.setItem("title", data.get("title"));
53
+ return { ok: true };
54
+ }
55
+
56
+ export default function Component() {
57
+ let data = useLoaderData();
58
+ // ...
59
+ }
60
+ ```
61
+
62
+ ### 2. Create a fetcher
63
+
64
+ Next create a fetcher and render a form with it:
65
+
66
+ ```tsx lines=[7,12-14]
67
+ import { useLoaderData, useFetcher } from "react-router";
68
+
69
+ // ...
70
+
71
+ export default function Component() {
72
+ let data = useLoaderData();
73
+ let fetcher = useFetcher();
74
+ return (
75
+ <div>
76
+ <h1>{data.title}</h1>
77
+
78
+ <fetcher.Form method="post">
79
+ <input type="text" name="title" />
80
+ </fetcher.Form>
81
+ </div>
82
+ );
83
+ }
84
+ ```
85
+
86
+ ### 3. Submit the form
87
+
88
+ If you submit the form now, the fetcher will call the action and revalidate the route data automatically.
89
+
90
+ ### 4. Render pending state
91
+
92
+ Fetchers make their state available during the async work so you can render pending UI the moment the user interacts:
93
+
94
+ ```tsx lines=[10]
95
+ export default function Component() {
96
+ let data = useLoaderData();
97
+ let fetcher = useFetcher();
98
+ return (
99
+ <div>
100
+ <h1>{data.title}</h1>
101
+
102
+ <fetcher.Form method="post">
103
+ <input type="text" name="title" />
104
+ {fetcher.state !== "idle" && <p>Saving...</p>}
105
+ </fetcher.Form>
106
+ </div>
107
+ );
108
+ }
109
+ ```
110
+
111
+ ### 5. Optimistic UI
112
+
113
+ Sometimes there's enough information in the form to render the next state immediately. You can access the form data with `fetcher.formData`:
114
+
115
+ ```tsx lines=[3-4,8]
116
+ export default function Component() {
117
+ let data = useLoaderData();
118
+ let fetcher = useFetcher();
119
+ let title = fetcher.formData?.get("title") || data.title;
120
+
121
+ return (
122
+ <div>
123
+ <h1>{title}</h1>
124
+
125
+ <fetcher.Form method="post">
126
+ <input type="text" name="title" />
127
+ {fetcher.state !== "idle" && <p>Saving...</p>}
128
+ </fetcher.Form>
129
+ </div>
130
+ );
131
+ }
132
+ ```
133
+
134
+ ### 6. Fetcher Data and Validation
135
+
136
+ Data returned from an action is available in the fetcher's `data` property. This is primarily useful for returning error messages to the user for a failed mutation:
137
+
138
+ ```tsx lines=[7-10,28-32]
139
+ // ...
140
+
141
+ export async function clientAction({ request }) {
142
+ await new Promise((res) => setTimeout(res, 1000));
143
+ let data = await request.formData();
144
+
145
+ let title = data.get("title") as string;
146
+ if (title.trim() === "") {
147
+ return { ok: false, error: "Title cannot be empty" };
148
+ }
149
+
150
+ localStorage.setItem("title", title);
151
+ return { ok: true, error: null };
152
+ }
153
+
154
+ export default function Component() {
155
+ let data = useLoaderData();
156
+ let fetcher = useFetcher();
157
+ let title = fetcher.formData?.get("title") || data.title;
158
+
159
+ return (
160
+ <div>
161
+ <h1>{title}</h1>
162
+
163
+ <fetcher.Form method="post">
164
+ <input type="text" name="title" />
165
+ {fetcher.state !== "idle" && <p>Saving...</p>}
166
+ {fetcher.data?.error && (
167
+ <p style={{ color: "red" }}>
168
+ {fetcher.data.error}
169
+ </p>
170
+ )}
171
+ </fetcher.Form>
172
+ </div>
173
+ );
174
+ }
175
+ ```
176
+
177
+ ## Loading Data
178
+
179
+ Another common use case for fetchers is to load data from a route for something like a combobox.
180
+
181
+ ### 1. Create a search route
182
+
183
+ Consider the following route with a very basic search:
184
+
185
+ ```tsx filename=./search-users.tsx
186
+ // { path: '/search-users', filename: './search-users.tsx' }
187
+ const users = [
188
+ { id: 1, name: "Ryan" },
189
+ { id: 2, name: "Michael" },
190
+ // ...
191
+ ];
192
+
193
+ export async function loader({ request }) {
194
+ await new Promise((res) => setTimeout(res, 300));
195
+ let url = new URL(request.url);
196
+ let query = url.searchParams.get("q");
197
+ return users.filter((user) =>
198
+ user.name.toLowerCase().includes(query.toLowerCase()),
199
+ );
200
+ }
201
+ ```
202
+
203
+ ### 2. Render a fetcher in a combobox component
204
+
205
+ ```tsx
206
+ import { useFetcher } from "react-router";
207
+
208
+ export function UserSearchCombobox() {
209
+ let fetcher = useFetcher();
210
+ return (
211
+ <div>
212
+ <fetcher.Form method="get" action="/search-users">
213
+ <input type="text" name="q" />
214
+ </fetcher.Form>
215
+ </div>
216
+ );
217
+ }
218
+ ```
219
+
220
+ - The action points to the route we created above: "/search-users"
221
+ - The name of the input is "q" to match the query parameter
222
+
223
+ ### 3. Add type inference
224
+
225
+ ```tsx lines=[2,5]
226
+ import { useFetcher } from "react-router";
227
+ import type { loader } from "./search-users";
228
+
229
+ export function UserSearchCombobox() {
230
+ let fetcher = useFetcher<typeof loader>();
231
+ // ...
232
+ }
233
+ ```
234
+
235
+ Ensure you use `import type` so you only import the types.
236
+
237
+ ### 4. Render the data
238
+
239
+ ```tsx lines=[10-16]
240
+ import { useFetcher } from "react-router";
241
+
242
+ export function UserSearchCombobox() {
243
+ let fetcher = useFetcher<typeof loader>();
244
+ return (
245
+ <div>
246
+ <fetcher.Form method="get" action="/search-users">
247
+ <input type="text" name="q" />
248
+ </fetcher.Form>
249
+ {fetcher.data && (
250
+ <ul>
251
+ {fetcher.data.map((user) => (
252
+ <li key={user.id}>{user.name}</li>
253
+ ))}
254
+ </ul>
255
+ )}
256
+ </div>
257
+ );
258
+ }
259
+ ```
260
+
261
+ Note you will need to hit "enter" to submit the form and see the results.
262
+
263
+ ### 5. Render a pending state
264
+
265
+ ```tsx lines=[12-14]
266
+ import { useFetcher } from "react-router";
267
+
268
+ export function UserSearchCombobox() {
269
+ let fetcher = useFetcher<typeof loader>();
270
+ return (
271
+ <div>
272
+ <fetcher.Form method="get" action="/search-users">
273
+ <input type="text" name="q" />
274
+ </fetcher.Form>
275
+ {fetcher.data && (
276
+ <ul
277
+ style={{
278
+ opacity: fetcher.state === "idle" ? 1 : 0.25,
279
+ }}
280
+ >
281
+ {fetcher.data.map((user) => (
282
+ <li key={user.id}>{user.name}</li>
283
+ ))}
284
+ </ul>
285
+ )}
286
+ </div>
287
+ );
288
+ }
289
+ ```
290
+
291
+ ### 6. Search on user input
292
+
293
+ Fetchers can be submitted programmatically with `fetcher.submit`:
294
+
295
+ ```tsx lines=[5-7]
296
+ <fetcher.Form method="get" action="/search-users">
297
+ <input
298
+ type="text"
299
+ name="q"
300
+ onChange={(event) => {
301
+ fetcher.submit(event.currentTarget.form);
302
+ }}
303
+ />
304
+ </fetcher.Form>
305
+ ```
306
+
307
+ Note the input event's form is passed as the first argument to `fetcher.submit`. The fetcher will use that form to submit the request, reading its attributes and serializing the data from its elements.