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,661 @@
1
+ ---
2
+ title: Instrumentation
3
+ ---
4
+
5
+ # Instrumentation
6
+
7
+ [MODES: framework, data]
8
+
9
+ <br/>
10
+ <br/>
11
+
12
+ Instrumentation allows you to add logging, error reporting, and performance tracing to your React Router application without modifying your actual route handlers. This enables comprehensive observability solutions for production applications on both the server and client.
13
+
14
+ ## Overview
15
+
16
+ With the React Router Instrumentation APIs, you provide "wrapper" functions that execute around your request handlers, router operations, route middlewares, and/or route handlers. This allows you to:
17
+
18
+ - Monitor application performance
19
+ - Add logging
20
+ - Integrate with observability platforms (Sentry, DataDog, New Relic, etc.)
21
+ - Implement OpenTelemetry tracing
22
+ - Track user behavior and navigation patterns
23
+
24
+ A key design principle is that instrumentation is **read-only** - you can observe what's happening but cannot modify runtime application behavior by modifying the arguments passed to, or data returned from your route handlers.
25
+
26
+ <docs-info>
27
+ As with any instrumentation approach, adding additional code execution at runtime may alter the performance characteristics compared to an uninstrumented application. Keep this in mind and perform appropriate testing and/or leverage conditional instrumentation to avoid a negative UX impact in production.
28
+ </docs-info>
29
+
30
+ ## Quick Start (Framework Mode)
31
+
32
+ [modes: framework]
33
+
34
+ ### 1. Server-side Instrumentation
35
+
36
+ Add instrumentations to your `entry.server.tsx`:
37
+
38
+ ```tsx filename=app/entry.server.tsx
39
+ export const instrumentations = [
40
+ {
41
+ // Instrument the server handler
42
+ handler(handler) {
43
+ handler.instrument({
44
+ async request(handleRequest, { request }) {
45
+ let url = `${request.method} ${request.url}`;
46
+ console.log(`Request start: ${url}`);
47
+ let result = await handleRequest();
48
+ let pattern = result.meta?.pattern ?? "unknown";
49
+ console.log(
50
+ `Request end: ${url} (${result.statusCode} ${pattern})`,
51
+ );
52
+ },
53
+ });
54
+ },
55
+
56
+ // Instrument individual routes
57
+ route(route) {
58
+ // Skip instrumentation for specific routes if needed
59
+ if (route.id === "root") return;
60
+
61
+ route.instrument({
62
+ async loader(callLoader, { request }) {
63
+ let url = `${request.method} ${request.url}`;
64
+ console.log(`Loader start: ${url} - ${route.id}`);
65
+ await callLoader();
66
+ console.log(`Loader end: ${url} - ${route.id}`);
67
+ },
68
+ // Other available instrumentations:
69
+ // async action() { /* ... */ },
70
+ // async middleware() { /* ... */ },
71
+ // async lazy() { /* ... */ },
72
+ });
73
+ },
74
+ },
75
+ ];
76
+
77
+ export default function handleRequest(/* ... */) {
78
+ // Your existing handleRequest implementation
79
+ }
80
+ ```
81
+
82
+ ### 2. Client-side Instrumentation
83
+
84
+ Add instrumentations to your `entry.client.tsx`:
85
+
86
+ ```tsx filename=app/entry.client.tsx
87
+ import { startTransition, StrictMode } from "react";
88
+ import { hydrateRoot } from "react-dom/client";
89
+ import { HydratedRouter } from "react-router/dom";
90
+
91
+ const instrumentations = [
92
+ {
93
+ // Instrument router operations
94
+ router(router) {
95
+ router.instrument({
96
+ // Instrument navigations
97
+ async navigate(callNavigate, { currentUrl, to }) {
98
+ let nav = `${currentUrl} -> ${to}`;
99
+ console.log(`Navigation start: ${nav}`);
100
+ let result = await callNavigate();
101
+ console.log(
102
+ `Navigation end: ${nav} (${result.meta?.pattern})`,
103
+ );
104
+ },
105
+ // Instrument fetcher calls
106
+ async fetch(
107
+ callFetch,
108
+ { href, currentUrl, fetcherKey },
109
+ ) {
110
+ let fetch = `${fetcherKey} -> ${href}`;
111
+ console.log(`Fetcher start: ${fetch}`);
112
+ let result = await callFetch();
113
+ console.log(
114
+ `Fetcher end: ${fetch} (${result.meta?.pattern})`,
115
+ );
116
+ },
117
+ });
118
+ },
119
+
120
+ // Instrument individual routes (same as server-side)
121
+ route(route) {
122
+ // Skip instrumentation for specific routes if needed
123
+ if (route.id === "root") return;
124
+
125
+ route.instrument({
126
+ async loader(callLoader, { request }) {
127
+ let url = `${request.method} ${request.url}`;
128
+ console.log(`Loader start: ${url} - ${route.id}`);
129
+ await callLoader();
130
+ console.log(`Loader end: ${url} - ${route.id}`);
131
+ },
132
+ // Other available instrumentations:
133
+ // async action() { /* ... */ },
134
+ // async middleware() { /* ... */ },
135
+ // async lazy() { /* ... */ },
136
+ });
137
+ },
138
+ },
139
+ ];
140
+
141
+ startTransition(() => {
142
+ hydrateRoot(
143
+ document,
144
+ <StrictMode>
145
+ <HydratedRouter instrumentations={instrumentations} />
146
+ </StrictMode>,
147
+ );
148
+ });
149
+ ```
150
+
151
+ ## Quick Start (Data Mode)
152
+
153
+ [modes: data]
154
+
155
+ In Data Mode, you add instrumentations when creating your router:
156
+
157
+ ```tsx
158
+ import {
159
+ createBrowserRouter,
160
+ RouterProvider,
161
+ } from "react-router";
162
+
163
+ const instrumentations = [
164
+ {
165
+ // Instrument router operations
166
+ router(router) {
167
+ router.instrument({
168
+ // Instrument navigations
169
+ async navigate(callNavigate, { currentUrl, to }) {
170
+ let nav = `${currentUrl} -> ${to}`;
171
+ console.log(`Navigation start: ${nav}`);
172
+ let result = await callNavigate();
173
+ console.log(
174
+ `Navigation end: ${nav} (${result.meta?.pattern})`,
175
+ );
176
+ },
177
+ // Instrument fetcher calls
178
+ async fetch(
179
+ callFetch,
180
+ { href, currentUrl, fetcherKey },
181
+ ) {
182
+ let fetch = `${fetcherKey} -> ${href}`;
183
+ console.log(`Fetcher start: ${fetch}`);
184
+ let result = await callFetch();
185
+ console.log(
186
+ `Fetcher end: ${fetch} (${result.meta?.pattern})`,
187
+ );
188
+ },
189
+ });
190
+ },
191
+
192
+ // Instrument individual routes (same as server-side)
193
+ route(route) {
194
+ // Skip instrumentation for specific routes if needed
195
+ if (route.id === "root") return;
196
+
197
+ route.instrument({
198
+ async loader(callLoader, { request }) {
199
+ let url = `${request.method} ${request.url}`;
200
+ console.log(`Loader start: ${url} - ${route.id}`);
201
+ await callLoader();
202
+ console.log(`Loader end: ${url} - ${route.id}`);
203
+ },
204
+ // Other available instrumentations:
205
+ // async action() { /* ... */ },
206
+ // async middleware() { /* ... */ },
207
+ // async lazy() { /* ... */ },
208
+ });
209
+ },
210
+ },
211
+ ];
212
+
213
+ const router = createBrowserRouter(routes, {
214
+ instrumentations,
215
+ });
216
+
217
+ function App() {
218
+ return <RouterProvider router={router} />;
219
+ }
220
+ ```
221
+
222
+ ## Core Concepts
223
+
224
+ ### Instrumentation Levels
225
+
226
+ There are different levels at which you can instrument your application. Each instrumentation function receives a second "info" parameter containing relevant contextual information for the specific aspect being instrumented.
227
+
228
+ #### 1. Handler Level (Server)
229
+
230
+ [modes: framework]
231
+
232
+ Instruments the top-level request handler that processes all requests to your server:
233
+
234
+ ```tsx filename=entry.server.tsx
235
+ export const instrumentations = [
236
+ {
237
+ handler(handler) {
238
+ handler.instrument({
239
+ async request(handleRequest, { request, context }) {
240
+ // Runs around ALL requests to your app
241
+ let result = await handleRequest();
242
+ let statusCode = result.statusCode;
243
+ let routePattern = result.meta?.pattern;
244
+ },
245
+ });
246
+ },
247
+ },
248
+ ];
249
+ ```
250
+
251
+ #### 2. Router Level (Client)
252
+
253
+ [modes: framework,data]
254
+
255
+ Instruments client-side router operations like navigations and fetcher calls:
256
+
257
+ ```tsx
258
+ export const instrumentations = [
259
+ {
260
+ router(router) {
261
+ router.instrument({
262
+ async navigate(callNavigate, { to, currentUrl }) {
263
+ // Runs around navigation operations
264
+ let result = await callNavigate();
265
+ let routePattern = result.meta?.pattern;
266
+ },
267
+ async fetch(
268
+ callFetch,
269
+ { href, currentUrl, fetcherKey },
270
+ ) {
271
+ // Runs around fetcher operations
272
+ let result = await callFetch();
273
+ let routePattern = result.meta?.pattern;
274
+ },
275
+ });
276
+ },
277
+ },
278
+ ];
279
+
280
+ // Framework Mode (entry.client.tsx)
281
+ <HydratedRouter instrumentations={instrumentations} />;
282
+
283
+ // Data Mode
284
+ const router = createBrowserRouter(routes, {
285
+ instrumentations,
286
+ });
287
+ ```
288
+
289
+ #### 3. Route Level (Server + Client)
290
+
291
+ [modes: framework,data]
292
+
293
+ Instruments individual route handlers:
294
+
295
+ ```tsx
296
+ const instrumentations = [
297
+ {
298
+ route(route) {
299
+ route.instrument({
300
+ async loader(
301
+ callLoader,
302
+ { params, request, context, pattern },
303
+ ) {
304
+ // Runs around loader execution
305
+ await callLoader();
306
+ },
307
+ async action(
308
+ callAction,
309
+ { params, request, context, pattern },
310
+ ) {
311
+ // Runs around action execution
312
+ await callAction();
313
+ },
314
+ async middleware(
315
+ callMiddleware,
316
+ { params, request, context, pattern },
317
+ ) {
318
+ // Runs around middleware execution
319
+ await callMiddleware();
320
+ },
321
+ async lazy(callLazy) {
322
+ // Runs around lazy route loading
323
+ await callLazy();
324
+ },
325
+ });
326
+ },
327
+ },
328
+ ];
329
+ ```
330
+
331
+ ### Read-only Design
332
+
333
+ Instrumentations are designed to be **observational only**. You cannot:
334
+
335
+ - Modify arguments passed to handlers
336
+ - Change return values from handlers
337
+ - Alter application behavior
338
+
339
+ This ensures that instrumentation is safe to add to production applications and cannot introduce bugs in your route logic.
340
+
341
+ ### Error Handling
342
+
343
+ To ensure that instrumentation code doesn't impact the runtime application, errors are caught internally and prevented from propagating outward. This design choice shows up in 2 aspects.
344
+
345
+ First, if a "handler" function (loader, action, request handler, navigation, etc.) throws an error, that error will not bubble out of the `callHandler` function invoked from your instrumentation. Instead, the `callHandler` function returns a discriminated union result of type `{ status: "success", error: undefined } | { status: "error", error: Error }`. This ensures your entire instrumentation function runs without needing any try/catch/finally logic to handle application errors.
346
+
347
+ ```tsx
348
+ export const instrumentations = [
349
+ {
350
+ route(route) {
351
+ route.instrument({
352
+ async loader(callLoader) {
353
+ let { status, error } = await callLoader();
354
+
355
+ if (status === "error") {
356
+ // error case - `error` is defined
357
+ } else {
358
+ // success case - `error` is undefined
359
+ }
360
+ },
361
+ });
362
+ },
363
+ },
364
+ ];
365
+ ```
366
+
367
+ Second, if your instrumentation function throws an error, React Router will gracefully swallow that so that it does not bubble outward and impact other instrumentations or application behavior. In both of these examples, the handlers and all other instrumentation functions will still run:
368
+
369
+ ```tsx
370
+ export const instrumentations = [
371
+ {
372
+ route(route) {
373
+ route.instrument({
374
+ // Throwing before calling the handler - RR will
375
+ // catch the error and still call the loader
376
+ async loader(callLoader) {
377
+ somethingThatThrows();
378
+ await callLoader();
379
+ },
380
+ // Throwing after calling the handler - RR will
381
+ // catch the error internally
382
+ async action(callAction) {
383
+ await callAction();
384
+ somethingThatThrows();
385
+ },
386
+ });
387
+ },
388
+ },
389
+ ];
390
+ ```
391
+
392
+ ### Result Metadata
393
+
394
+ Some instrumented calls return additional information that is only available after React Router starts processing the request, navigation, or fetcher call.
395
+
396
+ - Route-level instrumentations (`loader`/`action`/`middleware`) don't include `meta` because metadata is available on the `info` parameter
397
+ - Client navigation/fetcher and Server request handler instrumentations return a meta field
398
+ - `meta` contains the same values passed to loaders and actions
399
+ - `url`: The normalized `URL` for the matched route request
400
+ - `pattern`: The matched route pattern, such as `/projects/:id`
401
+ - `params`: The matched route params
402
+ - `meta` may be `undefined` when React Router does not have route metadata for the instrumented call, such as server manifest requests or numeric POP navigations like `navigate(-1)`
403
+ - For client navigations that redirect, `meta` describes the original navigation target instead of the final redirected location.
404
+ - Server request handler instrumentations also return the `statusCode` of the response
405
+
406
+ ```tsx
407
+ // entry.server.tsx
408
+ export const instrumentations = [
409
+ {
410
+ handler(handler) {
411
+ handler.instrument({
412
+ async request(handleRequest) {
413
+ let result = await handleRequest();
414
+
415
+ let statusCode = result.statusCode;
416
+ let routeUrl = result.meta?.url;
417
+ let routePattern = result.meta?.pattern;
418
+ let routeParams = result.meta?.params;
419
+ },
420
+ });
421
+ },
422
+ },
423
+ ];
424
+
425
+ // entry.client.tsx
426
+ const instrumentations = [
427
+ {
428
+ router(router) {
429
+ router.instrument({
430
+ async navigate(callNavigate) {
431
+ let result = await callNavigate();
432
+
433
+ let routeUrl = result.meta?.url;
434
+ let routePattern = result.meta?.pattern;
435
+ let routeParams = result.meta?.params;
436
+ },
437
+ async fetch(callFetch) {
438
+ let result = await callFetch();
439
+
440
+ let routeUrl = result.meta?.url;
441
+ let routePattern = result.meta?.pattern;
442
+ let routeParams = result.meta?.params;
443
+ },
444
+ });
445
+ },
446
+ },
447
+ ];
448
+ ```
449
+
450
+ ### Composition
451
+
452
+ You can compose multiple instrumentations by providing an array:
453
+
454
+ ```tsx
455
+ export const instrumentations = [
456
+ loggingInstrumentation,
457
+ performanceInstrumentation,
458
+ errorReportingInstrumentation,
459
+ ];
460
+ ```
461
+
462
+ Each instrumentation wraps the previous one, creating a nested execution chain.
463
+
464
+ ### Conditional Instrumentation
465
+
466
+ You can enable instrumentation conditionally based on environment or other factors:
467
+
468
+ ```tsx
469
+ export const instrumentations =
470
+ process.env.NODE_ENV === "production"
471
+ ? [productionInstrumentation]
472
+ : [developmentInstrumentation];
473
+ ```
474
+
475
+ ```tsx
476
+ // Or conditionally within an instrumentation
477
+ export const instrumentations = [
478
+ {
479
+ route(route) {
480
+ // Only instrument specific routes
481
+ if (!route.id?.startsWith("routes/admin")) return;
482
+
483
+ // Or, only instrument if a query parameter is present
484
+ let sp = new URL(request.url).searchParams;
485
+ if (!sp.has("DEBUG")) return;
486
+
487
+ route.instrument({
488
+ async loader() {
489
+ /* ... */
490
+ },
491
+ });
492
+ },
493
+ },
494
+ ];
495
+ ```
496
+
497
+ ## Common Patterns
498
+
499
+ ### Request logging (server)
500
+
501
+ ```tsx
502
+ const logging: ServerInstrumentation = {
503
+ handler({ instrument }) {
504
+ instrument({
505
+ async request(fn, { request }) {
506
+ let label = `request ${request.url}`;
507
+ let start = Date.now();
508
+ console.log(`-> ${label}`);
509
+ let result = await fn();
510
+ let pattern = result.meta?.pattern ?? "";
511
+ console.log(
512
+ `<- ${label} (${Date.now() - start}ms ${result.statusCode} ${pattern})`,
513
+ );
514
+ },
515
+ });
516
+ },
517
+ route({ instrument, id }) {
518
+ instrument({
519
+ middleware: (fn) => log(` middleware (${id})`, fn),
520
+ loader: (fn) => log(` loader (${id})`, fn),
521
+ action: (fn) => log(` action (${id})`, fn),
522
+ });
523
+ },
524
+ };
525
+
526
+ async function log(
527
+ label: string,
528
+ cb: () => Promise<InstrumentationHandlerResult>,
529
+ ) {
530
+ let start = Date.now();
531
+ console.log(`-> ${label}`);
532
+ await cb();
533
+ console.log(`<- ${label} (${Date.now() - start}ms)`);
534
+ }
535
+
536
+ export const instrumentations = [logging];
537
+ ```
538
+
539
+ ### OpenTelemetry Integration
540
+
541
+ ```tsx
542
+ import { trace, SpanStatusCode } from "@opentelemetry/api";
543
+
544
+ const tracer = trace.getTracer("my-app");
545
+
546
+ const otel: ServerInstrumentation = {
547
+ handler({ instrument }) {
548
+ instrument({
549
+ request: (fn, { request }) =>
550
+ otelSpan(`request`, { url: request.url }, fn),
551
+ });
552
+ },
553
+ route({ instrument, id }) {
554
+ instrument({
555
+ middleware: (fn, { pattern }) =>
556
+ otelSpan(
557
+ "middleware",
558
+ { routeId: id, pattern: pattern },
559
+ fn,
560
+ ),
561
+ loader: (fn, { pattern }) =>
562
+ otelSpan(
563
+ "loader",
564
+ { routeId: id, pattern: pattern },
565
+ fn,
566
+ ),
567
+ action: (fn, { pattern }) =>
568
+ otelSpan(
569
+ "action",
570
+ { routeId: id, pattern: pattern },
571
+ fn,
572
+ ),
573
+ });
574
+ },
575
+ };
576
+
577
+ async function otelSpan(
578
+ label: string,
579
+ attributes: Record<string, string>,
580
+ cb: () => Promise<InstrumentationHandlerResult>,
581
+ ) {
582
+ return tracer.startActiveSpan(
583
+ label,
584
+ { attributes },
585
+ async (span) => {
586
+ let { error } = await cb();
587
+ if (error) {
588
+ span.recordException(error);
589
+ span.setStatus({
590
+ code: SpanStatusCode.ERROR,
591
+ });
592
+ }
593
+ span.end();
594
+ },
595
+ );
596
+ }
597
+
598
+ export const instrumentations = [otel];
599
+ ```
600
+
601
+ ### Client-side Performance Tracking
602
+
603
+ ```tsx
604
+ const windowPerf: ClientInstrumentation = {
605
+ router({ instrument }) {
606
+ instrument({
607
+ async navigate(fn, { to, currentUrl }) {
608
+ let label = `navigation:${currentUrl}->${to}`;
609
+ performance.mark(`start:${label}`);
610
+ let result = await fn();
611
+ performance.mark(`end:${label}`);
612
+ performance.measure(
613
+ label,
614
+ `start:${label}`,
615
+ `end:${label}`,
616
+ );
617
+ console.log(
618
+ `navigation pattern: ${result.meta?.pattern}`,
619
+ );
620
+ },
621
+ async fetch(fn, { href }) {
622
+ let label = `fetcher:${href}`;
623
+ performance.mark(`start:${label}`);
624
+ let result = await fn();
625
+ performance.mark(`end:${label}`);
626
+ performance.measure(
627
+ label,
628
+ `start:${label}`,
629
+ `end:${label}`,
630
+ );
631
+ console.log(
632
+ `fetcher pattern: ${result.meta?.pattern}`,
633
+ );
634
+ },
635
+ });
636
+ },
637
+ route({ instrument, id }) {
638
+ instrument({
639
+ middleware: (fn) => measure(`middleware:${id}`, fn),
640
+ loader: (fn) => measure(`loader:${id}`, fn),
641
+ action: (fn) => measure(`action:${id}`, fn),
642
+ });
643
+ },
644
+ };
645
+
646
+ async function measure(
647
+ label: string,
648
+ cb: () => Promise<InstrumentationHandlerResult>,
649
+ ) {
650
+ performance.mark(`start:${label}`);
651
+ await cb();
652
+ performance.mark(`end:${label}`);
653
+ performance.measure(
654
+ label,
655
+ `start:${label}`,
656
+ `end:${label}`,
657
+ );
658
+ }
659
+
660
+ <HydratedRouter instrumentations={[windowPerf]} />;
661
+ ```
@@ -0,0 +1,40 @@
1
+ ---
2
+ title: Meta Tags and SEO
3
+ hidden: true
4
+ ---
5
+
6
+ [copy pasted from route module doc]
7
+
8
+ By default, meta descriptors will render a [`<meta>` tag][meta-element] in most cases. The two exceptions are:
9
+
10
+ - `{ title }` renders a `<title>` tag
11
+ - `{ "script:ld+json" }` renders a `<script type="application/ld+json">` tag, and its value should be a serializable object that is stringified and injected into the tag.
12
+
13
+ ```tsx
14
+ export function meta() {
15
+ return [
16
+ {
17
+ "script:ld+json": {
18
+ "@context": "https://schema.org",
19
+ "@type": "Organization",
20
+ name: "React Router",
21
+ url: "https://reactrouter.com",
22
+ },
23
+ },
24
+ ];
25
+ }
26
+ ```
27
+
28
+ A meta descriptor can also render a [`<link>` tag][link-element] by setting the `tagName` property to `"link"`. This is useful for `<link>` tags associated with SEO like `canonical` URLs. For asset links like stylesheets and favicons, you should use the [`links` export][links] instead.
29
+
30
+ ```tsx
31
+ export function meta() {
32
+ return [
33
+ {
34
+ tagName: "link",
35
+ rel: "canonical",
36
+ href: "https://reactrouter.com",
37
+ },
38
+ ];
39
+ }
40
+ ```