react-router 7.15.1 → 8.3.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 (364) hide show
  1. package/CHANGELOG.md +181 -2
  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 +1789 -1657
  7. package/dist/development/index-react-server.js +3074 -3674
  8. package/dist/development/index.d.ts +41 -1469
  9. package/dist/development/index.js +36 -2621
  10. package/dist/development/lib/actions.js +50 -0
  11. package/dist/development/lib/components.d.ts +1030 -0
  12. package/dist/development/lib/components.js +841 -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 +2054 -0
  18. package/dist/development/lib/dom/lib.js +1272 -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 +198 -0
  22. package/dist/development/lib/dom/ssr/components.js +589 -0
  23. package/dist/development/lib/dom/ssr/data.js +29 -0
  24. package/dist/development/lib/dom/ssr/entry.d.ts +60 -0
  25. package/dist/development/lib/dom/ssr/errorBoundaries.d.ts +27 -0
  26. package/dist/development/lib/dom/ssr/errorBoundaries.js +87 -0
  27. package/dist/development/lib/dom/ssr/fallback.js +33 -0
  28. package/dist/development/lib/dom/ssr/fog-of-war.d.ts +12 -0
  29. package/dist/development/lib/dom/ssr/fog-of-war.js +185 -0
  30. package/dist/development/lib/dom/ssr/hydration.d.ts +32 -0
  31. package/dist/development/lib/dom/ssr/hydration.js +29 -0
  32. package/dist/development/lib/dom/ssr/invariant.js +16 -0
  33. package/dist/development/lib/dom/ssr/links.js +170 -0
  34. package/dist/development/lib/dom/ssr/markup.js +24 -0
  35. package/dist/development/lib/dom/ssr/routeModules.d.ts +206 -0
  36. package/dist/development/lib/dom/ssr/routeModules.js +31 -0
  37. package/dist/development/lib/dom/ssr/routes-test-stub.d.ts +75 -0
  38. package/dist/development/lib/dom/ssr/routes-test-stub.js +121 -0
  39. package/dist/development/lib/dom/ssr/routes.d.ts +33 -0
  40. package/dist/development/lib/dom/ssr/routes.js +303 -0
  41. package/dist/development/lib/dom/ssr/server.d.ts +48 -0
  42. package/dist/development/lib/dom/ssr/server.js +69 -0
  43. package/dist/development/lib/dom/ssr/single-fetch.d.ts +14 -0
  44. package/dist/development/lib/dom/ssr/single-fetch.js +345 -0
  45. package/dist/development/lib/dom-export/dom-router-provider.d.ts +9 -0
  46. package/dist/development/lib/dom-export/dom-router-provider.js +22 -0
  47. package/dist/development/lib/dom-export/hydrated-router.d.ts +125 -0
  48. package/dist/development/lib/dom-export/hydrated-router.js +150 -0
  49. package/dist/development/lib/errors.js +29 -0
  50. package/dist/development/lib/hooks.d.ts +974 -0
  51. package/dist/development/lib/hooks.js +1415 -0
  52. package/dist/development/lib/href.d.ts +36 -0
  53. package/dist/development/lib/href.js +70 -0
  54. package/dist/development/lib/router/history.d.ts +264 -0
  55. package/dist/development/lib/router/history.js +378 -0
  56. package/dist/development/lib/router/instrumentation.d.ts +111 -0
  57. package/dist/development/lib/router/instrumentation.js +290 -0
  58. package/dist/development/lib/router/links.d.ts +114 -0
  59. package/dist/development/lib/router/router.d.ts +663 -0
  60. package/dist/development/lib/router/router.js +2988 -0
  61. package/dist/development/lib/router/url.js +18 -0
  62. package/dist/development/lib/router/utils.d.ts +960 -0
  63. package/dist/development/lib/router/utils.js +881 -0
  64. package/dist/development/lib/rsc/browser.d.ts +137 -0
  65. package/dist/development/lib/rsc/browser.js +612 -0
  66. package/dist/development/lib/rsc/errorBoundaries.d.ts +11 -0
  67. package/dist/development/lib/rsc/errorBoundaries.js +90 -0
  68. package/dist/development/lib/rsc/html-stream/browser.d.ts +48 -0
  69. package/dist/development/lib/rsc/html-stream/browser.js +74 -0
  70. package/dist/development/lib/rsc/html-stream/server.js +97 -0
  71. package/dist/development/lib/rsc/route-modules.js +27 -0
  72. package/dist/development/lib/rsc/server.rsc.d.ts +224 -0
  73. package/dist/development/lib/rsc/server.ssr.d.ts +152 -0
  74. package/dist/development/lib/rsc/server.ssr.js +419 -0
  75. package/dist/development/lib/server-runtime/build.d.ts +66 -0
  76. package/dist/development/lib/server-runtime/cookies.d.ts +92 -0
  77. package/dist/development/lib/server-runtime/cookies.js +153 -0
  78. package/dist/development/lib/server-runtime/crypto.js +43 -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 +22 -0
  92. package/dist/development/lib/server-runtime/server.js +364 -0
  93. package/dist/development/lib/server-runtime/serverHandoff.js +17 -0
  94. package/dist/development/lib/server-runtime/sessions/cookieStorage.d.ts +33 -0
  95. package/dist/development/lib/server-runtime/sessions/cookieStorage.js +53 -0
  96. package/dist/development/lib/server-runtime/sessions/memoryStorage.d.ts +29 -0
  97. package/dist/development/lib/server-runtime/sessions/memoryStorage.js +58 -0
  98. package/dist/development/lib/server-runtime/sessions.d.ts +174 -0
  99. package/dist/development/lib/server-runtime/sessions.js +115 -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/{production/register-Bsscfj79.d.ts → development/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 -1007
  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 +1789 -1657
  122. package/dist/production/index-react-server.js +3065 -3674
  123. package/dist/production/index.d.ts +41 -1469
  124. package/dist/production/index.js +36 -2621
  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 +2054 -0
  133. package/dist/production/lib/dom/lib.js +1272 -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 +185 -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 +75 -0
  153. package/dist/production/lib/dom/ssr/routes-test-stub.js +121 -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 +974 -0
  166. package/dist/production/lib/hooks.js +1400 -0
  167. package/dist/production/lib/href.d.ts +36 -0
  168. package/dist/production/lib/href.js +70 -0
  169. package/dist/production/lib/router/history.d.ts +264 -0
  170. package/dist/production/lib/router/history.js +378 -0
  171. package/dist/production/lib/router/instrumentation.d.ts +111 -0
  172. package/dist/production/lib/router/instrumentation.js +290 -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 +960 -0
  178. package/dist/production/lib/router/utils.js +872 -0
  179. package/dist/production/lib/rsc/browser.d.ts +137 -0
  180. package/dist/production/lib/rsc/browser.js +612 -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 +97 -0
  186. package/dist/production/lib/rsc/route-modules.js +27 -0
  187. package/dist/production/lib/rsc/server.rsc.d.ts +224 -0
  188. package/dist/production/lib/rsc/server.ssr.d.ts +152 -0
  189. package/dist/production/lib/rsc/server.ssr.js +419 -0
  190. package/dist/production/lib/server-runtime/build.d.ts +66 -0
  191. package/dist/production/lib/server-runtime/cookies.d.ts +92 -0
  192. package/dist/production/lib/server-runtime/cookies.js +153 -0
  193. package/dist/production/lib/server-runtime/crypto.js +43 -0
  194. package/dist/production/lib/server-runtime/data.js +25 -0
  195. package/dist/production/lib/server-runtime/dev.d.ts +9 -0
  196. package/dist/production/lib/server-runtime/dev.js +26 -0
  197. package/dist/production/lib/server-runtime/entry.js +20 -0
  198. package/dist/production/lib/server-runtime/errors.js +75 -0
  199. package/dist/production/lib/server-runtime/headers.js +73 -0
  200. package/dist/production/lib/server-runtime/invariant.js +19 -0
  201. package/dist/production/lib/server-runtime/mode.d.ts +12 -0
  202. package/dist/production/lib/server-runtime/mode.js +25 -0
  203. package/dist/production/lib/server-runtime/routeMatching.js +28 -0
  204. package/dist/production/lib/server-runtime/routes.d.ts +13 -0
  205. package/dist/production/lib/server-runtime/routes.js +74 -0
  206. package/dist/production/lib/server-runtime/server.d.ts +22 -0
  207. package/dist/production/lib/server-runtime/server.js +364 -0
  208. package/dist/production/lib/server-runtime/serverHandoff.js +17 -0
  209. package/dist/production/lib/server-runtime/sessions/cookieStorage.d.ts +33 -0
  210. package/dist/production/lib/server-runtime/sessions/cookieStorage.js +53 -0
  211. package/dist/production/lib/server-runtime/sessions/memoryStorage.d.ts +29 -0
  212. package/dist/production/lib/server-runtime/sessions/memoryStorage.js +58 -0
  213. package/dist/production/lib/server-runtime/sessions.d.ts +174 -0
  214. package/dist/production/lib/server-runtime/sessions.js +115 -0
  215. package/dist/production/lib/server-runtime/single-fetch.d.ts +7 -0
  216. package/dist/production/lib/server-runtime/single-fetch.js +215 -0
  217. package/dist/production/lib/server-runtime/urls.js +28 -0
  218. package/dist/production/lib/server-runtime/warnings.js +20 -0
  219. package/dist/production/lib/types/future.d.ts +9 -0
  220. package/dist/production/lib/types/internal.d.ts +26 -177
  221. package/dist/production/lib/types/internal.js +3 -2
  222. package/dist/{development/register-Bsscfj79.d.ts → production/lib/types/register.d.ts} +9 -15
  223. package/dist/production/lib/types/route-data.d.ts +113 -0
  224. package/dist/production/lib/types/route-module-annotations.d.ts +149 -0
  225. package/dist/production/lib/types/route-module.d.ts +19 -0
  226. package/dist/production/lib/types/serializes-to.d.ts +13 -0
  227. package/dist/production/lib/types/utils.d.ts +11 -0
  228. package/dist/production/vendor/turbo-stream-v2/flatten.js +159 -0
  229. package/dist/production/vendor/turbo-stream-v2/turbo-stream.js +179 -0
  230. package/dist/production/vendor/turbo-stream-v2/unflatten.js +199 -0
  231. package/dist/production/vendor/turbo-stream-v2/utils.js +39 -0
  232. package/docs/explanation/backend-for-frontend.md +50 -0
  233. package/docs/explanation/code-splitting.md +77 -0
  234. package/docs/explanation/concurrency.md +135 -0
  235. package/docs/explanation/form-vs-fetcher.md +292 -0
  236. package/docs/explanation/hot-module-replacement.md +137 -0
  237. package/docs/explanation/hydration.md +14 -0
  238. package/docs/explanation/index-query-param.md +86 -0
  239. package/docs/explanation/index.md +4 -0
  240. package/docs/explanation/lazy-route-discovery.md +78 -0
  241. package/docs/explanation/location.md +6 -0
  242. package/docs/explanation/progressive-enhancement.md +150 -0
  243. package/docs/explanation/race-conditions.md +88 -0
  244. package/docs/explanation/react-transitions.md +160 -0
  245. package/docs/explanation/route-matching.md +7 -0
  246. package/docs/explanation/server-client-execution.md +4 -0
  247. package/docs/explanation/sessions-and-cookies.md +465 -0
  248. package/docs/explanation/special-files.md +16 -0
  249. package/docs/explanation/state-management.md +524 -0
  250. package/docs/explanation/styling.md +87 -0
  251. package/docs/explanation/type-safety.md +82 -0
  252. package/docs/how-to/accessibility.md +44 -0
  253. package/docs/how-to/client-data.md +199 -0
  254. package/docs/how-to/data-strategy.md +317 -0
  255. package/docs/how-to/error-boundary.md +231 -0
  256. package/docs/how-to/error-reporting.md +142 -0
  257. package/docs/how-to/fetchers.md +307 -0
  258. package/docs/how-to/file-route-conventions.md +410 -0
  259. package/docs/how-to/file-uploads.md +217 -0
  260. package/docs/how-to/form-validation.md +120 -0
  261. package/docs/how-to/headers.md +165 -0
  262. package/docs/how-to/index.md +4 -0
  263. package/docs/how-to/instrumentation.md +661 -0
  264. package/docs/how-to/meta.md +40 -0
  265. package/docs/how-to/middleware.md +647 -0
  266. package/docs/how-to/navigation-blocking.md +233 -0
  267. package/docs/how-to/optimize-revalidation.md +12 -0
  268. package/docs/how-to/pre-rendering.md +225 -0
  269. package/docs/how-to/presets.md +103 -0
  270. package/docs/how-to/react-server-components.md +951 -0
  271. package/docs/how-to/resource-routes.md +126 -0
  272. package/docs/how-to/route-module-type-safety.md +85 -0
  273. package/docs/how-to/search-params.md +4 -0
  274. package/docs/how-to/security.md +39 -0
  275. package/docs/how-to/server-bundles.md +66 -0
  276. package/docs/how-to/spa.md +120 -0
  277. package/docs/how-to/status.md +63 -0
  278. package/docs/how-to/suspense.md +132 -0
  279. package/docs/how-to/using-handle.md +117 -0
  280. package/docs/how-to/view-transitions.md +237 -0
  281. package/docs/how-to/webhook.md +50 -0
  282. package/docs/index.md +36 -0
  283. package/docs/start/data/actions.md +138 -0
  284. package/docs/start/data/custom.md +198 -0
  285. package/docs/start/data/data-loading.md +44 -0
  286. package/docs/start/data/index.md +4 -0
  287. package/docs/start/data/installation.md +56 -0
  288. package/docs/start/data/navigating.md +12 -0
  289. package/docs/start/data/pending-ui.md +12 -0
  290. package/docs/start/data/route-object.md +268 -0
  291. package/docs/start/data/routing.md +281 -0
  292. package/docs/start/data/testing.md +8 -0
  293. package/docs/start/declarative/index.md +4 -0
  294. package/docs/start/declarative/installation.md +43 -0
  295. package/docs/start/declarative/navigating.md +133 -0
  296. package/docs/start/declarative/routing.md +237 -0
  297. package/docs/start/declarative/url-values.md +65 -0
  298. package/docs/start/framework/actions.md +174 -0
  299. package/docs/start/framework/data-loading.md +201 -0
  300. package/docs/start/framework/deploying.md +104 -0
  301. package/docs/start/framework/index.md +4 -0
  302. package/docs/start/framework/installation.md +41 -0
  303. package/docs/start/framework/navigating.md +182 -0
  304. package/docs/start/framework/pending-ui.md +142 -0
  305. package/docs/start/framework/rendering.md +59 -0
  306. package/docs/start/framework/route-module.md +527 -0
  307. package/docs/start/framework/routing.md +362 -0
  308. package/docs/start/framework/testing.md +133 -0
  309. package/docs/start/index.md +4 -0
  310. package/docs/start/modes.md +200 -0
  311. package/docs/upgrading/component-routes.md +363 -0
  312. package/docs/upgrading/future.md +111 -0
  313. package/docs/upgrading/index.md +4 -0
  314. package/docs/upgrading/router-provider.md +445 -0
  315. package/docs/upgrading/v7.md +460 -0
  316. package/package.json +44 -87
  317. package/dist/development/browser-3AnU12UI.d.mts +0 -318
  318. package/dist/development/browser-BOdXz9dK.d.ts +0 -318
  319. package/dist/development/chunk-4N6VE7H7.mjs +0 -11528
  320. package/dist/development/chunk-4YRVXM2U.js +0 -188
  321. package/dist/development/chunk-66UKHEGQ.js +0 -1362
  322. package/dist/development/chunk-D6LUOGOQ.js +0 -10229
  323. package/dist/development/chunk-RJYABSBD.mjs +0 -2585
  324. package/dist/development/context-ByvtofY2.d.mts +0 -1771
  325. package/dist/development/data-BVUf681J.d.mts +0 -1732
  326. package/dist/development/data-BqZ2x964.d.ts +0 -1732
  327. package/dist/development/dom-export.d.mts +0 -172
  328. package/dist/development/dom-export.mjs +0 -1008
  329. package/dist/development/index-react-server-client-BS5F89FR.d.ts +0 -3655
  330. package/dist/development/index-react-server-client-DY04-103.d.mts +0 -2600
  331. package/dist/development/index-react-server-client.d.mts +0 -4
  332. package/dist/development/index-react-server-client.mjs +0 -59
  333. package/dist/development/index-react-server.d.mts +0 -2703
  334. package/dist/development/index-react-server.mjs +0 -3780
  335. package/dist/development/index.d.mts +0 -1472
  336. package/dist/development/index.mjs +0 -277
  337. package/dist/development/instrumentation-cRWWLfsU.d.ts +0 -715
  338. package/dist/development/lib/types/internal.d.mts +0 -184
  339. package/dist/development/lib/types/internal.mjs +0 -10
  340. package/dist/development/register-Df8okEea.d.mts +0 -30
  341. package/dist/production/browser-3AnU12UI.d.mts +0 -318
  342. package/dist/production/browser-BOdXz9dK.d.ts +0 -318
  343. package/dist/production/chunk-6S4627ZB.mjs +0 -2585
  344. package/dist/production/chunk-HUBUW7R3.js +0 -10229
  345. package/dist/production/chunk-JAKZPQZC.mjs +0 -11528
  346. package/dist/production/chunk-PNZCCTKT.js +0 -1362
  347. package/dist/production/chunk-Y6IFXO7V.js +0 -188
  348. package/dist/production/context-ByvtofY2.d.mts +0 -1771
  349. package/dist/production/data-BVUf681J.d.mts +0 -1732
  350. package/dist/production/data-BqZ2x964.d.ts +0 -1732
  351. package/dist/production/dom-export.d.mts +0 -172
  352. package/dist/production/dom-export.mjs +0 -1008
  353. package/dist/production/index-react-server-client-BS5F89FR.d.ts +0 -3655
  354. package/dist/production/index-react-server-client-DY04-103.d.mts +0 -2600
  355. package/dist/production/index-react-server-client.d.mts +0 -4
  356. package/dist/production/index-react-server-client.mjs +0 -59
  357. package/dist/production/index-react-server.d.mts +0 -2703
  358. package/dist/production/index-react-server.mjs +0 -3780
  359. package/dist/production/index.d.mts +0 -1472
  360. package/dist/production/index.mjs +0 -277
  361. package/dist/production/instrumentation-cRWWLfsU.d.ts +0 -715
  362. package/dist/production/lib/types/internal.d.mts +0 -184
  363. package/dist/production/lib/types/internal.mjs +0 -10
  364. package/dist/production/register-Df8okEea.d.mts +0 -30
@@ -0,0 +1,126 @@
1
+ ---
2
+ title: Resource Routes
3
+ ---
4
+
5
+ # Resource Routes
6
+
7
+ [MODES: framework, data]
8
+
9
+ <br/>
10
+ <br/>
11
+
12
+ When server rendering, routes can serve "resources" instead of rendering components, like images, PDFs, JSON payloads, webhooks, etc.
13
+
14
+ ## Defining a Resource Route
15
+
16
+ A route becomes a resource route by convention when its module exports a loader or action but does not export a default component.
17
+
18
+ Consider a route that serves a PDF instead of UI:
19
+
20
+ ```ts
21
+ route("/reports/pdf/:id", "pdf-report.ts");
22
+ ```
23
+
24
+ ```tsx filename=pdf-report.ts
25
+ import type { Route } from "./+types/pdf-report";
26
+
27
+ export async function loader({ params }: Route.LoaderArgs) {
28
+ const report = await getReport(params.id);
29
+ const pdf = await generateReportPDF(report);
30
+ return new Response(pdf, {
31
+ status: 200,
32
+ headers: {
33
+ "Content-Type": "application/pdf",
34
+ },
35
+ });
36
+ }
37
+ ```
38
+
39
+ Note there is no default export. That makes this route a resource route.
40
+
41
+ ## Linking to Resource Routes
42
+
43
+ When linking to resource routes, use `<a>` or `<Link reloadDocument>`, otherwise React Router will attempt to use client side routing and fetching the payload (you'll get a helpful error message if you make this mistake).
44
+
45
+ ```tsx
46
+ <Link reloadDocument to="/reports/pdf/123">
47
+ View as PDF
48
+ </Link>
49
+ ```
50
+
51
+ ## Handling different request methods
52
+
53
+ GET requests are handled by the `loader`, while POST, PUT, PATCH, and DELETE are handled by the `action`:
54
+
55
+ ```tsx
56
+ import type { Route } from "./+types/resource";
57
+
58
+ export function loader(_: Route.LoaderArgs) {
59
+ return Response.json({ message: "I handle GET" });
60
+ }
61
+
62
+ export function action(_: Route.ActionArgs) {
63
+ return Response.json({
64
+ message: "I handle everything else",
65
+ });
66
+ }
67
+ ```
68
+
69
+ ## Return Types
70
+
71
+ Resource Routes are flexible when it comes to the return type - you can return [`Response`][Response] instances or [`data()`][data] objects. A good general rule of thumb when deciding which type to use is:
72
+
73
+ - If you're using resource routes intended for external consumption, return `Response` instances
74
+ - Keeps the resulting response encoding explicit in your code rather than having to wonder how React Router might convert `data() -> Response` under the hood
75
+ - If you're accessing resource routes from [fetchers][fetcher] or [`<Form>`][form] submissions, return `data()`
76
+ - Keeps things consistent with the loaders/actions in your UI routes
77
+ - Allows you to stream promises down to your UI through `data()`/[`Await`][await]
78
+
79
+ ## Error Handling
80
+
81
+ Throwing an `Error` from Resource route (or anything other than a `Response`/`data()`) will trigger [`handleError`][handleError] and result in a 500 HTTP Response:
82
+
83
+ ```tsx
84
+ export function action() {
85
+ let db = await getDb();
86
+ if (!db) {
87
+ // Fatal error - return a 500 response and trigger `handleError`
88
+ throw new Error("Could not connect to DB");
89
+ }
90
+ // ...
91
+ }
92
+ ```
93
+
94
+ If a resource route generates a `Response` (via `new Response()` or `data()`), it is considered a successful execution and will not trigger `handleError` because the API has successfully produced a Response for the HTTP request. This applies to thrown responses as well as returned responses with a 4xx/5xx status code. This behavior aligns with `fetch()` which does not return a rejected promise on 4xx/5xx Responses.
95
+
96
+ ```tsx
97
+ export function action() {
98
+ // Non-fatal error - don't trigger `handleError`:
99
+ throw new Response(
100
+ { error: "Unauthorized" },
101
+ { status: 401 },
102
+ );
103
+
104
+ // These 3 are equivalent to the above
105
+ return new Response(
106
+ { error: "Unauthorized" },
107
+ { status: 401 },
108
+ );
109
+
110
+ throw data({ error: "Unauthorized" }, { status: 401 });
111
+
112
+ return data({ error: "Unauthorized" }, { status: 401 });
113
+ }
114
+ ```
115
+
116
+ ### Error Boundaries
117
+
118
+ [Error Boundaries][error-boundary] are only applicable when a resource route is accessed from a UI, such as from a [`fetcher`][fetcher] call or a [`<Form>`][form] submission. If you `throw` from your resource route in these cases, it will bubble to the nearest `ErrorBoundary` in the UI.
119
+
120
+ [handleError]: ../api/framework-conventions/entry.server.tsx#handleerror
121
+ [data]: ../api/utils/data
122
+ [Response]: https://developer.mozilla.org/en-US/docs/Web/API/Response
123
+ [fetcher]: ../api/hooks/useFetcher
124
+ [form]: ../api/components/Form
125
+ [await]: ../api/components/Await
126
+ [error-boundary]: ../start/framework/route-module#errorboundary
@@ -0,0 +1,85 @@
1
+ ---
2
+ title: Route Module Type Safety
3
+ ---
4
+
5
+ # Route Module Type Safety
6
+
7
+ [MODES: framework]
8
+
9
+ <br/>
10
+ <br/>
11
+
12
+ React Router generates route-specific types to power type inference for URL params, loader data, and more.
13
+ This guide will help you set it up if you didn't start with a template.
14
+
15
+ To learn more about how type safety works in React Router, check out [Type Safety Explanation](../explanation/type-safety).
16
+
17
+ ## 1. Add `.react-router/` to `.gitignore`
18
+
19
+ React Router generates types into a `.react-router/` directory at the root of your app. This directory is fully managed by React Router and should be gitignore'd.
20
+
21
+ ```txt
22
+ .react-router/
23
+ ```
24
+
25
+ ## 2. Include the generated types in tsconfig
26
+
27
+ Edit your tsconfig to get TypeScript to use the generated types. Additionally, `rootDirs` needs to be configured so the types can be imported as relative siblings to route modules.
28
+
29
+ ```json filename=tsconfig.json
30
+ {
31
+ "include": [".react-router/types/**/*"],
32
+ "compilerOptions": {
33
+ "rootDirs": [".", "./.react-router/types"]
34
+ }
35
+ }
36
+ ```
37
+
38
+ If you are using multiple `tsconfig` files for your app, you'll need to make these changes in whichever one `include`s your app directory.
39
+ For example, the [`node-custom-server` template](https://github.com/remix-run/react-router-templates/tree/390fcec476dd336c810280479688fe893da38713/node-custom-server) contains `tsconfig.json`, `tsconfig.node.json`, and `tsconfig.vite.json`. Since `tsconfig.vite.json` is the one that [includes the app directory](https://github.com/remix-run/react-router-templates/blob/390fcec476dd336c810280479688fe893da38713/node-custom-server/tsconfig.vite.json#L4-L6), that's the one that sets up `.react-router/types` for route module type safety.
40
+
41
+ ## 3. Generate types before type checking
42
+
43
+ If you want to run type checking as its own command — for example, as part of your Continuous Integration pipeline — you'll need to make sure to generate types _before_ running typechecking:
44
+
45
+ ```json
46
+ {
47
+ "scripts": {
48
+ "typecheck": "react-router typegen && tsc"
49
+ }
50
+ }
51
+ ```
52
+
53
+ ## 4. Type-only auto-imports (optional)
54
+
55
+ When auto-importing the `Route` type helper, TypeScript will generate:
56
+
57
+ ```ts filename=app/routes/my-route.tsx
58
+ import { Route } from "./+types/my-route";
59
+ ```
60
+
61
+ But if you enable [verbatimModuleSyntax](https://www.typescriptlang.org/tsconfig/#verbatimModuleSyntax):
62
+
63
+ ```json filename=tsconfig.json
64
+ {
65
+ "compilerOptions": {
66
+ "verbatimModuleSyntax": true
67
+ }
68
+ }
69
+ ```
70
+
71
+ Then, you will get the `type` modifier for the import automatically as well:
72
+
73
+ ```ts filename=app/routes/my-route.tsx
74
+ import type { Route } from "./+types/my-route";
75
+ // ^^^^
76
+ ```
77
+
78
+ This helps tools like bundlers to detect type-only module that can be safely excluded from the bundle.
79
+
80
+ ## Conclusion
81
+
82
+ React Router's Vite plugin should be automatically generating types into `.react-router/types/` anytime you edit your route config (`routes.ts`).
83
+ That means all you need to do is run `react-router dev` (or your custom dev server) to get to up-to-date types in your routes.
84
+
85
+ Check out our [Type Safety Explanation](../explanation/type-safety) for an example of how to pull in those types into your routes.
@@ -0,0 +1,4 @@
1
+ ---
2
+ title: Using Search Params
3
+ hidden: true
4
+ ---
@@ -0,0 +1,39 @@
1
+ ---
2
+ title: Security
3
+ ---
4
+
5
+ # Security
6
+
7
+ [MODES: framework, data]
8
+
9
+ <br/>
10
+ <br/>
11
+
12
+ This is by no means a comprehensive guide, but React Router provides features to help address a few aspects under the _very large_ umbrella that is _Security_.
13
+
14
+ ## `Content-Security-Policy`
15
+
16
+ ### Framework Mode without RSC
17
+
18
+ If you are implementing a [Content-Security-Policy (CSP)][csp] in your application, specifically one using the `unsafe-inline` directive, you will need to specify a [`nonce`][nonce] attribute on the inline `<script>` elements rendered in your HTML.
19
+
20
+ Add a nonce to these two spots in [`entry.server.tsx`][entryserver]:
21
+
22
+ - The [`<ServerRouter nonce>`][serverrouter] prop
23
+ - This will be proxied along through React Context and used for other Framework Mode components that output `nonce`-aware elements, including [`<Scripts>`][scripts], [`<ScrollRestoration>`][scrollrestoration]
24
+ - If those components specify their own `nonce` prop, it will override the `ServerRouter` value
25
+ - The `nonce` options of [`renderToPipeableStream`][renderToPipeableStream]/[`renderToReadableStream`][renderToReadableStream]
26
+
27
+ ### RSC Framework and RSC Data Mode
28
+
29
+ For RSC Framework and RSC Data Mode, generate the nonce in `entry.ssr.tsx` and pass it to `routeRSCServerRequest`, `RSCStaticRouter`, and the CSP response header. See the [RSC Content Security Policy nonce guide][rsc-csp]. The nonce is only needed while generating the HTML document; it should not be included in the RSC payload or passed to `matchRSCServerRequest`.
30
+
31
+ [csp]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Guides/CSP
32
+ [entryserver]: ../api/framework-conventions/entry.server.tsx
33
+ [nonce]: https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/nonce
34
+ [renderToPipeableStream]: https://react.dev/reference/react-dom/server/renderToPipeableStream
35
+ [renderToReadableStream]: https://react.dev/reference/react-dom/server/renderToReadableStream
36
+ [scripts]: ../api/components/Scripts
37
+ [scrollrestoration]: ../api/components/ScrollRestoration
38
+ [serverrouter]: ../api/framework-routers/ServerRouter
39
+ [rsc-csp]: ./react-server-components#content-security-policy-nonces
@@ -0,0 +1,66 @@
1
+ ---
2
+ title: Server Bundles
3
+ ---
4
+
5
+ # Server Bundles
6
+
7
+ [MODES: framework]
8
+
9
+ <br/>
10
+ <br/>
11
+
12
+ <docs-warning>This is an advanced feature designed for hosting provider integrations. When compiling your app into multiple server bundles, there will need to be a custom routing layer in front of your app directing requests to the correct bundle.</docs-warning>
13
+
14
+ React Router typically builds your server code into a single bundle that exports a request handler function. However, there are scenarios where you might want to split your route tree into multiple server bundles, each exposing a request handler function for a subset of routes. To provide this flexibility, [`react-router.config.ts`][react-router-config] supports a `serverBundles` option, which is a function for assigning routes to different server bundles.
15
+
16
+ The [`serverBundles` function][server-bundles-function] is called for each route in the tree (except for routes that aren't addressable, e.g., pathless layout routes) and returns a server bundle ID that you'd like to assign that route to. These bundle IDs will be used as directory names in your server build directory.
17
+
18
+ For each route, this function receives an array of routes leading to and including that route, referred to as the route `branch`. This allows you to create server bundles for different portions of the route tree. For example, you could use this to create a separate server bundle containing all routes within a particular layout route:
19
+
20
+ ```ts filename=react-router.config.ts lines=[5-13]
21
+ import type { Config } from "@react-router/dev/config";
22
+
23
+ export default {
24
+ // ...
25
+ serverBundles: ({ branch }) => {
26
+ const isAuthenticatedRoute = branch.some((route) =>
27
+ route.id.split("/").includes("_authenticated"),
28
+ );
29
+
30
+ return isAuthenticatedRoute
31
+ ? "authenticated"
32
+ : "unauthenticated";
33
+ },
34
+ } satisfies Config;
35
+ ```
36
+
37
+ Each `route` in the `branch` array contains the following properties:
38
+
39
+ - `id` — The unique ID for this route, named like its `file` but relative to the app directory and without the extension, e.g., `app/routes/gists.$username.tsx` will have an `id` of `routes/gists.$username`
40
+ - `path` — The path this route uses to match the URL pathname
41
+ - `file` — The absolute path to the entry point for this route
42
+ - `index` — Whether this route is an index route
43
+
44
+ ## Build manifest
45
+
46
+ When the build is complete, React Router will call the `buildEnd` hook, passing a `buildManifest` object. This is useful if you need to inspect the build manifest to determine how to route requests to the correct server bundle.
47
+
48
+ ```ts filename=react-router.config.ts lines=[5-7]
49
+ import type { Config } from "@react-router/dev/config";
50
+
51
+ export default {
52
+ // ...
53
+ buildEnd: async ({ buildManifest }) => {
54
+ // ...
55
+ },
56
+ } satisfies Config;
57
+ ```
58
+
59
+ When using server bundles, the build manifest contains the following properties:
60
+
61
+ - `serverBundles` — An object that maps bundle IDs to the bundle's `id` and `file`
62
+ - `routeIdToServerBundleId` — An object that maps route IDs to their server bundle ID
63
+ - `routes` — A route manifest that maps route IDs to route metadata. This can be used to drive a custom routing layer in front of your React Router request handlers
64
+
65
+ [react-router-config]: https://api.reactrouter.com/v8/types/_react-router_dev.config.Config.html
66
+ [server-bundles-function]: https://api.reactrouter.com/v8/types/_react-router_dev.config.ServerBundlesFunction.html
@@ -0,0 +1,120 @@
1
+ ---
2
+ title: Single Page App (SPA)
3
+ ---
4
+
5
+ # Single Page App (SPA)
6
+
7
+ [MODES: framework]
8
+
9
+ <br/>
10
+ <br/>
11
+
12
+ <docs-info>This guide focuses on how to build Single Page Apps with React Router Framework mode. If you're using React Router in declarative or data mode, you can design your own SPA architecture.</docs-info>
13
+
14
+ When using React Router as a framework, you can enable "SPA Mode" by setting `ssr:false` in your `react-router.config.ts` file. This will disable runtime server rendering and generate an `index.html` at build time that you can serve and hydrate as a SPA.
15
+
16
+ Typical Single Page apps send a mostly blank `index.html` template with little more than an empty `<div id="root"></div>`. In contrast, `react-router build` (in SPA Mode) pre-renders your root route at build time into an `index.html` file. This means you can:
17
+
18
+ - Send more than an empty `<div>`
19
+ - Use a root `loader` to load data for your application shell
20
+ - Use React components to generate the initial page users see (root `HydrateFallback`)
21
+ - Re-enable server rendering later without changing anything about your UI
22
+
23
+ <docs-info>SPA Mode is a special form of "Pre-Rendering" that allows you to serve all paths in your application from the same HTML file. Please refer to the [Pre-Rendering](./pre-rendering) guide if you want to do more extensive pre-rendering.</docs-info>
24
+
25
+ ## 1. Disable Runtime Server Rendering
26
+
27
+ Server rendering is enabled by default. Set the `ssr` flag to `false` in `react-router.config.ts` to disable it.
28
+
29
+ ```ts filename=react-router.config.ts lines=[4]
30
+ import { type Config } from "@react-router/dev/config";
31
+
32
+ export default {
33
+ ssr: false,
34
+ } satisfies Config;
35
+ ```
36
+
37
+ With this set to false, the server build will no longer be generated.
38
+
39
+ <docs-info>It's important to note that setting `ssr:false` only disables _runtime server rendering_. React Router will still server render your root route at _build time_ to generate the `index.html` file. This is why your project still needs a dependency on `@react-router/node` and your routes need to be SSR-safe. That means you can't call `window` or other browser-only APIs during the initial render, even when server rendering is disabled.</docs-info>
40
+
41
+ ## 2. Add a `HydrateFallback` and optional `loader` to your root route
42
+
43
+ SPA Mode will generate an `index.html` file at build-time that you can serve as the entry point for your SPA. This will only render the root route so that it is capable of hydrating at runtime for any path in your application.
44
+
45
+ To provide a better loading UI than an empty `<div>`, you can add a `HydrateFallback` component to your root route to render your loading UI into the `index.html` at build time. This way, it will be shown to users immediately while the SPA is loading/hydrating.
46
+
47
+ ```tsx filename=root.tsx lines=[7-9]
48
+ import LoadingScreen from "./components/loading-screen";
49
+
50
+ export function Layout() {
51
+ return <html>{/*...*/}</html>;
52
+ }
53
+
54
+ export function HydrateFallback() {
55
+ return <LoadingScreen />;
56
+ }
57
+
58
+ export default function App() {
59
+ return <Outlet />;
60
+ }
61
+ ```
62
+
63
+ Because the root route is server-rendered at build time, you can also use a `loader` in your root route if you choose. This `loader` will be called at build time and the data will be available via the optional `HydrateFallback` `loaderData` prop.
64
+
65
+ ```tsx filename=root.tsx lines=[5,10,14]
66
+ import { Route } from "./+types/root";
67
+
68
+ export async function loader() {
69
+ return {
70
+ version: await getVersion(),
71
+ };
72
+ }
73
+
74
+ export function HydrateFallback({
75
+ loaderData,
76
+ }: Route.ComponentProps) {
77
+ return (
78
+ <div>
79
+ <h1>Loading version {loaderData.version}...</h1>
80
+ <AwesomeSpinner />
81
+ </div>
82
+ );
83
+ }
84
+ ```
85
+
86
+ You cannot include a `loader` in any other routes in your app when using SPA Mode unless you are [pre-rendering those pages](./pre-rendering).
87
+
88
+ ## 3. Use client loaders and client actions
89
+
90
+ With server rendering disabled, you can still use `clientLoader` and `clientAction` to manage route data and mutations.
91
+
92
+ ```tsx filename=some-route.tsx
93
+ import { Route } from "./+types/some-route";
94
+
95
+ export async function clientLoader({
96
+ params,
97
+ }: Route.ClientLoaderArgs) {
98
+ let data = await fetch(`/some/api/stuff/${params.id}`);
99
+ return data;
100
+ }
101
+
102
+ export async function clientAction({
103
+ request,
104
+ }: Route.ClientActionArgs) {
105
+ let formData = await request.formData();
106
+ return await processPayment(formData);
107
+ }
108
+ ```
109
+
110
+ ## 4. Direct all URLs to index.html
111
+
112
+ After running `react-router build`, deploy the `build/client` directory to whatever static host you prefer.
113
+
114
+ Common to deploying any SPA, you'll need to configure your host to direct all URLs to the `index.html` of the client build. Some hosts do this by default, but others don't. As an example, a host may support a `_redirects` file to do this:
115
+
116
+ ```
117
+ /* /index.html 200
118
+ ```
119
+
120
+ If you're getting 404s at valid routes for your app, it's likely you need to configure your host.
@@ -0,0 +1,63 @@
1
+ ---
2
+ title: Status Codes
3
+ ---
4
+
5
+ # Status Codes
6
+
7
+ [MODES: framework ,data]
8
+
9
+ <br/>
10
+ <br/>
11
+
12
+ Set status codes from loaders and actions with `data`.
13
+
14
+ ```tsx filename=app/project.tsx lines=[3,12-15,20,23]
15
+ // route('/projects/:projectId', './project.tsx')
16
+ import type { Route } from "./+types/project";
17
+ import { data } from "react-router";
18
+ import { fakeDb } from "../db";
19
+
20
+ export async function action({
21
+ request,
22
+ }: Route.ActionArgs) {
23
+ let formData = await request.formData();
24
+ let title = formData.get("title");
25
+ if (!title) {
26
+ return data(
27
+ { message: "Invalid title" },
28
+ { status: 400 },
29
+ );
30
+ }
31
+
32
+ if (!projectExists(title)) {
33
+ let project = await fakeDb.createProject({ title });
34
+ return data(project, { status: 201 });
35
+ } else {
36
+ let project = await fakeDb.updateProject({ title });
37
+ // the default status code is 200, no need for `data`
38
+ return project;
39
+ }
40
+ }
41
+ ```
42
+
43
+ See [Form Validation](./form-validation) for more information on rendering form errors like this.
44
+
45
+ Another common status code is 404:
46
+
47
+ ```tsx
48
+ // route('/projects/:projectId', './project.tsx')
49
+ import type { Route } from "./+types/project";
50
+ import { data } from "react-router";
51
+ import { fakeDb } from "../db";
52
+
53
+ export async function loader({ params }: Route.ActionArgs) {
54
+ let project = await fakeDb.getProject(params.id);
55
+ if (!project) {
56
+ // throw to ErrorBoundary
57
+ throw data("Not Found", { status: 404 });
58
+ }
59
+ return project;
60
+ }
61
+ ```
62
+
63
+ See the [Error Boundaries](./error-boundary) for more information on thrown `data`.
@@ -0,0 +1,132 @@
1
+ ---
2
+ title: Streaming with Suspense
3
+ ---
4
+
5
+ # Streaming with Suspense
6
+
7
+ [MODES: framework, data]
8
+
9
+ <br/>
10
+ <br/>
11
+
12
+ Streaming with React Suspense allows apps to speed up initial renders by deferring non-critical data and unblocking UI rendering.
13
+
14
+ React Router supports React Suspense by returning promises from loaders and actions.
15
+
16
+ ## 1. Return a promise from loader
17
+
18
+ React Router awaits route loaders before rendering route components. To unblock the loader for non-critical data, return the promise instead of awaiting it in the loader.
19
+
20
+ ```tsx
21
+ import type { Route } from "./+types/my-route";
22
+
23
+ export async function loader({}: Route.LoaderArgs) {
24
+ // note this is NOT awaited
25
+ let nonCriticalData = new Promise((res) =>
26
+ setTimeout(() => res("non-critical"), 5000),
27
+ );
28
+
29
+ let criticalData = await new Promise((res) =>
30
+ setTimeout(() => res("critical"), 300),
31
+ );
32
+
33
+ return { nonCriticalData, criticalData };
34
+ }
35
+ ```
36
+
37
+ Note you can't return a single promise, it must be an object with keys.
38
+
39
+ ## 2. Render the fallback and resolved UI
40
+
41
+ The promise will be available on `loaderData`, `<Await>` will await the promise and trigger `<Suspense>` to render the fallback UI.
42
+
43
+ ```tsx
44
+ import * as React from "react";
45
+ import { Await } from "react-router";
46
+
47
+ // [previous code]
48
+
49
+ export default function MyComponent({
50
+ loaderData,
51
+ }: Route.ComponentProps) {
52
+ let { criticalData, nonCriticalData } = loaderData;
53
+
54
+ return (
55
+ <div>
56
+ <h1>Streaming example</h1>
57
+ <h2>Critical data value: {criticalData}</h2>
58
+
59
+ <React.Suspense fallback={<div>Loading...</div>}>
60
+ <Await resolve={nonCriticalData}>
61
+ {(value) => <h3>Non critical value: {value}</h3>}
62
+ </Await>
63
+ </React.Suspense>
64
+ </div>
65
+ );
66
+ }
67
+ ```
68
+
69
+ ## With React 19
70
+
71
+ If you're using React 19, you can use `React.use` instead of `Await`, but you'll need to create a new component and pass the promise down to trigger the suspense fallback.
72
+
73
+ ```tsx
74
+ <React.Suspense fallback={<div>Loading...</div>}>
75
+ <NonCriticalUI p={nonCriticalData} />
76
+ </React.Suspense>
77
+ ```
78
+
79
+ ```tsx
80
+ function NonCriticalUI({ p }: { p: Promise<string> }) {
81
+ let value = React.use(p);
82
+ return <h3>Non critical value {value}</h3>;
83
+ }
84
+ ```
85
+
86
+ ## Timeouts
87
+
88
+ By default, loaders and actions reject any outstanding promises after 4950ms. You can control this by exporting a `streamTimeout` numerical value from your `entry.server.tsx`.
89
+
90
+ ```ts filename=entry.server.tsx
91
+ // Reject all pending promises from handler functions after 10 seconds
92
+ export const streamTimeout = 10_000;
93
+ ```
94
+
95
+ ## Handling early rejections (Node)
96
+
97
+ React Router waits for all loaders to settle (via `Promise.all`) before it begins streaming the response. Once streaming has started, React Router catches subsequent rejections of your streamed promises and surfaces them to your `<Await>` (or React 19 `React.use`) error UI.
98
+
99
+ However, if a streamed promise rejects _before_ all of the route's loaders have settled, React Router has not yet been able to attach a handler to it. In Node, an unhandled promise rejection will crash the process unless you have a top-level handler registered.
100
+
101
+ For example, this can happen if a parent route's loader takes longer to resolve than a child route's streamed promise takes to reject:
102
+
103
+ ```tsx
104
+ // parent.tsx — slow loader
105
+ export async function loader() {
106
+ await new Promise((r) => setTimeout(r, 1000));
107
+ return { parent: "data" };
108
+ }
109
+
110
+ // child.tsx — fast-rejecting streamed promise
111
+ export async function loader() {
112
+ let lazy = new Promise((_, reject) =>
113
+ setTimeout(() => reject(new Error("boom")), 100),
114
+ );
115
+ return { lazy };
116
+ }
117
+ ```
118
+
119
+ When `lazy` rejects before the parent loader resolves, the rejection bubbles to the node process as an unhandled rejection, which will crash the process without a user-defined handler.
120
+
121
+ To prevent this, register a process-level `unhandledRejection` handler in your server entry:
122
+
123
+ ```ts filename=entry.server.ts
124
+ process.on("unhandledRejection", (reason, promise) => {
125
+ console.error(
126
+ "Unhandled Rejection at:",
127
+ promise,
128
+ "reason:",
129
+ reason,
130
+ );
131
+ });
132
+ ```