react-router 7.15.1 → 8.0.0-pre.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (369) hide show
  1. package/CHANGELOG.md +18 -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 +1645 -1635
  7. package/dist/development/index-react-server.js +2880 -3642
  8. package/dist/development/index.d.ts +43 -1469
  9. package/dist/development/index.js +37 -2621
  10. package/dist/development/lib/actions.js +62 -0
  11. package/dist/development/lib/components.d.ts +1022 -0
  12. package/dist/development/lib/components.js +835 -0
  13. package/dist/development/lib/context.d.ts +83 -0
  14. package/dist/development/lib/context.js +41 -0
  15. package/dist/development/lib/dom/dom.d.ts +119 -0
  16. package/dist/development/lib/dom/dom.js +143 -0
  17. package/dist/development/lib/dom/lib.d.ts +2042 -0
  18. package/dist/development/lib/dom/lib.js +1259 -0
  19. package/dist/development/lib/dom/server.d.ts +138 -0
  20. package/dist/development/lib/dom/server.js +301 -0
  21. package/dist/development/lib/dom/ssr/components.d.ts +196 -0
  22. package/dist/development/lib/dom/ssr/components.js +579 -0
  23. package/dist/development/lib/dom/ssr/data.js +29 -0
  24. package/dist/development/lib/dom/ssr/entry.d.ts +59 -0
  25. package/dist/development/lib/dom/ssr/errorBoundaries.d.ts +27 -0
  26. package/dist/development/lib/dom/ssr/errorBoundaries.js +83 -0
  27. package/dist/development/lib/dom/ssr/errors.d.ts +7 -0
  28. package/dist/development/lib/dom/ssr/errors.js +36 -0
  29. package/dist/development/lib/dom/ssr/fallback.js +28 -0
  30. package/dist/development/lib/dom/ssr/fog-of-war.d.ts +12 -0
  31. package/dist/development/lib/dom/ssr/fog-of-war.js +170 -0
  32. package/dist/development/lib/dom/ssr/hydration.d.ts +32 -0
  33. package/dist/development/lib/dom/ssr/hydration.js +29 -0
  34. package/dist/development/lib/dom/ssr/invariant.js +16 -0
  35. package/dist/development/lib/dom/ssr/links.js +170 -0
  36. package/dist/development/lib/dom/ssr/markup.js +24 -0
  37. package/dist/development/lib/dom/ssr/routeModules.d.ts +206 -0
  38. package/dist/development/lib/dom/ssr/routeModules.js +31 -0
  39. package/dist/development/lib/dom/ssr/routes-test-stub.d.ts +62 -0
  40. package/dist/development/lib/dom/ssr/routes-test-stub.js +108 -0
  41. package/dist/development/lib/dom/ssr/routes.d.ts +33 -0
  42. package/dist/development/lib/dom/ssr/routes.js +303 -0
  43. package/dist/development/lib/dom/ssr/server.d.ts +45 -0
  44. package/dist/development/lib/dom/ssr/server.js +68 -0
  45. package/dist/development/lib/dom/ssr/single-fetch.d.ts +14 -0
  46. package/dist/development/lib/dom/ssr/single-fetch.js +346 -0
  47. package/dist/development/lib/dom-export/dom-router-provider.d.ts +9 -0
  48. package/dist/development/lib/dom-export/dom-router-provider.js +22 -0
  49. package/dist/development/lib/dom-export/hydrated-router.d.ts +125 -0
  50. package/dist/development/lib/dom-export/hydrated-router.js +153 -0
  51. package/dist/development/lib/errors.js +29 -0
  52. package/dist/development/lib/hooks.d.ts +947 -0
  53. package/dist/development/lib/hooks.js +1386 -0
  54. package/dist/development/lib/href.d.ts +20 -0
  55. package/dist/development/lib/href.js +50 -0
  56. package/dist/development/lib/router/history.d.ts +258 -0
  57. package/dist/development/lib/router/history.js +371 -0
  58. package/dist/development/lib/router/instrumentation.d.ts +86 -0
  59. package/dist/development/lib/router/instrumentation.js +213 -0
  60. package/dist/development/lib/router/links.d.ts +113 -0
  61. package/dist/development/lib/router/router.d.ts +663 -0
  62. package/dist/development/lib/router/router.js +2981 -0
  63. package/dist/development/lib/router/utils.d.ts +942 -0
  64. package/dist/development/lib/router/utils.js +791 -0
  65. package/dist/development/lib/rsc/browser.d.ts +137 -0
  66. package/dist/development/lib/rsc/browser.js +599 -0
  67. package/dist/development/lib/rsc/errorBoundaries.d.ts +11 -0
  68. package/dist/development/lib/rsc/errorBoundaries.js +90 -0
  69. package/dist/development/lib/rsc/html-stream/browser.d.ts +48 -0
  70. package/dist/development/lib/rsc/html-stream/browser.js +74 -0
  71. package/dist/development/lib/rsc/html-stream/server.js +78 -0
  72. package/dist/development/lib/rsc/route-modules.js +27 -0
  73. package/dist/development/lib/rsc/server.rsc.d.ts +219 -0
  74. package/dist/development/lib/rsc/server.ssr.d.ts +129 -0
  75. package/dist/development/lib/rsc/server.ssr.js +388 -0
  76. package/dist/development/lib/server-runtime/build.d.ts +66 -0
  77. package/dist/development/lib/server-runtime/cookies.d.ts +66 -0
  78. package/dist/development/lib/server-runtime/cookies.js +139 -0
  79. package/dist/development/lib/server-runtime/crypto.js +43 -0
  80. package/dist/development/lib/server-runtime/data.d.ts +13 -0
  81. package/dist/development/lib/server-runtime/data.js +25 -0
  82. package/dist/development/lib/server-runtime/dev.d.ts +9 -0
  83. package/dist/development/lib/server-runtime/dev.js +26 -0
  84. package/dist/development/lib/server-runtime/entry.js +20 -0
  85. package/dist/development/lib/server-runtime/errors.js +95 -0
  86. package/dist/development/lib/server-runtime/headers.js +73 -0
  87. package/dist/development/lib/server-runtime/invariant.js +19 -0
  88. package/dist/development/lib/server-runtime/mode.d.ts +12 -0
  89. package/dist/development/lib/server-runtime/mode.js +25 -0
  90. package/dist/development/lib/server-runtime/routeMatching.js +28 -0
  91. package/dist/development/lib/server-runtime/routes.d.ts +13 -0
  92. package/dist/development/lib/server-runtime/routes.js +74 -0
  93. package/dist/development/lib/server-runtime/server.d.ts +10 -0
  94. package/dist/development/lib/server-runtime/server.js +351 -0
  95. package/dist/development/lib/server-runtime/serverHandoff.js +17 -0
  96. package/dist/development/lib/server-runtime/sessions/cookieStorage.d.ts +25 -0
  97. package/dist/development/lib/server-runtime/sessions/cookieStorage.js +45 -0
  98. package/dist/development/lib/server-runtime/sessions/memoryStorage.d.ts +23 -0
  99. package/dist/development/lib/server-runtime/sessions/memoryStorage.js +52 -0
  100. package/dist/development/lib/server-runtime/sessions.d.ts +145 -0
  101. package/dist/development/lib/server-runtime/sessions.js +98 -0
  102. package/dist/development/lib/server-runtime/single-fetch.d.ts +7 -0
  103. package/dist/development/lib/server-runtime/single-fetch.js +215 -0
  104. package/dist/development/lib/server-runtime/urls.js +31 -0
  105. package/dist/development/lib/server-runtime/warnings.js +20 -0
  106. package/dist/development/lib/types/future.d.ts +9 -0
  107. package/dist/development/lib/types/internal.d.ts +26 -177
  108. package/dist/development/lib/types/internal.js +3 -2
  109. package/dist/{production/register-Bsscfj79.d.ts → development/lib/types/register.d.ts} +9 -15
  110. package/dist/development/lib/types/route-data.d.ts +113 -0
  111. package/dist/development/lib/types/route-module-annotations.d.ts +149 -0
  112. package/dist/development/lib/types/route-module.d.ts +19 -0
  113. package/dist/development/lib/types/serializes-to.d.ts +13 -0
  114. package/dist/development/lib/types/utils.d.ts +11 -0
  115. package/dist/development/vendor/turbo-stream-v2/flatten.js +159 -0
  116. package/dist/development/vendor/turbo-stream-v2/turbo-stream.js +178 -0
  117. package/dist/development/vendor/turbo-stream-v2/unflatten.js +198 -0
  118. package/dist/development/vendor/turbo-stream-v2/utils.js +47 -0
  119. package/dist/production/dom-export.d.ts +6 -172
  120. package/dist/production/dom-export.js +12 -1007
  121. package/dist/production/index-react-server-client.d.ts +7 -4
  122. package/dist/production/index-react-server-client.js +8 -52
  123. package/dist/production/index-react-server.d.ts +1645 -1635
  124. package/dist/production/index-react-server.js +2871 -3642
  125. package/dist/production/index.d.ts +43 -1469
  126. package/dist/production/index.js +37 -2621
  127. package/dist/production/lib/actions.js +62 -0
  128. package/dist/production/lib/components.d.ts +1022 -0
  129. package/dist/production/lib/components.js +835 -0
  130. package/dist/production/lib/context.d.ts +83 -0
  131. package/dist/production/lib/context.js +41 -0
  132. package/dist/production/lib/dom/dom.d.ts +119 -0
  133. package/dist/production/lib/dom/dom.js +143 -0
  134. package/dist/production/lib/dom/lib.d.ts +2042 -0
  135. package/dist/production/lib/dom/lib.js +1259 -0
  136. package/dist/production/lib/dom/server.d.ts +138 -0
  137. package/dist/production/lib/dom/server.js +301 -0
  138. package/dist/production/lib/dom/ssr/components.d.ts +196 -0
  139. package/dist/production/lib/dom/ssr/components.js +579 -0
  140. package/dist/production/lib/dom/ssr/data.js +29 -0
  141. package/dist/production/lib/dom/ssr/entry.d.ts +59 -0
  142. package/dist/production/lib/dom/ssr/errorBoundaries.d.ts +27 -0
  143. package/dist/production/lib/dom/ssr/errorBoundaries.js +83 -0
  144. package/dist/production/lib/dom/ssr/errors.d.ts +7 -0
  145. package/dist/production/lib/dom/ssr/errors.js +36 -0
  146. package/dist/production/lib/dom/ssr/fallback.js +21 -0
  147. package/dist/production/lib/dom/ssr/fog-of-war.d.ts +12 -0
  148. package/dist/production/lib/dom/ssr/fog-of-war.js +170 -0
  149. package/dist/production/lib/dom/ssr/hydration.d.ts +32 -0
  150. package/dist/production/lib/dom/ssr/hydration.js +29 -0
  151. package/dist/production/lib/dom/ssr/invariant.js +16 -0
  152. package/dist/production/lib/dom/ssr/links.js +170 -0
  153. package/dist/production/lib/dom/ssr/markup.js +24 -0
  154. package/dist/production/lib/dom/ssr/routeModules.d.ts +206 -0
  155. package/dist/production/lib/dom/ssr/routeModules.js +31 -0
  156. package/dist/production/lib/dom/ssr/routes-test-stub.d.ts +62 -0
  157. package/dist/production/lib/dom/ssr/routes-test-stub.js +108 -0
  158. package/dist/production/lib/dom/ssr/routes.d.ts +33 -0
  159. package/dist/production/lib/dom/ssr/routes.js +303 -0
  160. package/dist/production/lib/dom/ssr/server.d.ts +45 -0
  161. package/dist/production/lib/dom/ssr/server.js +68 -0
  162. package/dist/production/lib/dom/ssr/single-fetch.d.ts +14 -0
  163. package/dist/production/lib/dom/ssr/single-fetch.js +346 -0
  164. package/dist/production/lib/dom-export/dom-router-provider.d.ts +9 -0
  165. package/dist/production/lib/dom-export/dom-router-provider.js +22 -0
  166. package/dist/production/lib/dom-export/hydrated-router.d.ts +125 -0
  167. package/dist/production/lib/dom-export/hydrated-router.js +153 -0
  168. package/dist/production/lib/errors.js +29 -0
  169. package/dist/production/lib/hooks.d.ts +947 -0
  170. package/dist/production/lib/hooks.js +1371 -0
  171. package/dist/production/lib/href.d.ts +20 -0
  172. package/dist/production/lib/href.js +50 -0
  173. package/dist/production/lib/router/history.d.ts +258 -0
  174. package/dist/production/lib/router/history.js +371 -0
  175. package/dist/production/lib/router/instrumentation.d.ts +86 -0
  176. package/dist/production/lib/router/instrumentation.js +213 -0
  177. package/dist/production/lib/router/links.d.ts +113 -0
  178. package/dist/production/lib/router/router.d.ts +663 -0
  179. package/dist/production/lib/router/router.js +2981 -0
  180. package/dist/production/lib/router/utils.d.ts +942 -0
  181. package/dist/production/lib/router/utils.js +782 -0
  182. package/dist/production/lib/rsc/browser.d.ts +137 -0
  183. package/dist/production/lib/rsc/browser.js +599 -0
  184. package/dist/production/lib/rsc/errorBoundaries.d.ts +11 -0
  185. package/dist/production/lib/rsc/errorBoundaries.js +90 -0
  186. package/dist/production/lib/rsc/html-stream/browser.d.ts +48 -0
  187. package/dist/production/lib/rsc/html-stream/browser.js +74 -0
  188. package/dist/production/lib/rsc/html-stream/server.js +78 -0
  189. package/dist/production/lib/rsc/route-modules.js +27 -0
  190. package/dist/production/lib/rsc/server.rsc.d.ts +219 -0
  191. package/dist/production/lib/rsc/server.ssr.d.ts +129 -0
  192. package/dist/production/lib/rsc/server.ssr.js +388 -0
  193. package/dist/production/lib/server-runtime/build.d.ts +66 -0
  194. package/dist/production/lib/server-runtime/cookies.d.ts +66 -0
  195. package/dist/production/lib/server-runtime/cookies.js +139 -0
  196. package/dist/production/lib/server-runtime/crypto.js +43 -0
  197. package/dist/production/lib/server-runtime/data.d.ts +13 -0
  198. package/dist/production/lib/server-runtime/data.js +25 -0
  199. package/dist/production/lib/server-runtime/dev.d.ts +9 -0
  200. package/dist/production/lib/server-runtime/dev.js +26 -0
  201. package/dist/production/lib/server-runtime/entry.js +20 -0
  202. package/dist/production/lib/server-runtime/errors.js +95 -0
  203. package/dist/production/lib/server-runtime/headers.js +73 -0
  204. package/dist/production/lib/server-runtime/invariant.js +19 -0
  205. package/dist/production/lib/server-runtime/mode.d.ts +12 -0
  206. package/dist/production/lib/server-runtime/mode.js +25 -0
  207. package/dist/production/lib/server-runtime/routeMatching.js +28 -0
  208. package/dist/production/lib/server-runtime/routes.d.ts +13 -0
  209. package/dist/production/lib/server-runtime/routes.js +74 -0
  210. package/dist/production/lib/server-runtime/server.d.ts +10 -0
  211. package/dist/production/lib/server-runtime/server.js +351 -0
  212. package/dist/production/lib/server-runtime/serverHandoff.js +17 -0
  213. package/dist/production/lib/server-runtime/sessions/cookieStorage.d.ts +25 -0
  214. package/dist/production/lib/server-runtime/sessions/cookieStorage.js +45 -0
  215. package/dist/production/lib/server-runtime/sessions/memoryStorage.d.ts +23 -0
  216. package/dist/production/lib/server-runtime/sessions/memoryStorage.js +52 -0
  217. package/dist/production/lib/server-runtime/sessions.d.ts +145 -0
  218. package/dist/production/lib/server-runtime/sessions.js +98 -0
  219. package/dist/production/lib/server-runtime/single-fetch.d.ts +7 -0
  220. package/dist/production/lib/server-runtime/single-fetch.js +215 -0
  221. package/dist/production/lib/server-runtime/urls.js +31 -0
  222. package/dist/production/lib/server-runtime/warnings.js +20 -0
  223. package/dist/production/lib/types/future.d.ts +9 -0
  224. package/dist/production/lib/types/internal.d.ts +26 -177
  225. package/dist/production/lib/types/internal.js +3 -2
  226. package/dist/{development/register-Bsscfj79.d.ts → production/lib/types/register.d.ts} +9 -15
  227. package/dist/production/lib/types/route-data.d.ts +113 -0
  228. package/dist/production/lib/types/route-module-annotations.d.ts +149 -0
  229. package/dist/production/lib/types/route-module.d.ts +19 -0
  230. package/dist/production/lib/types/serializes-to.d.ts +13 -0
  231. package/dist/production/lib/types/utils.d.ts +11 -0
  232. package/dist/production/vendor/turbo-stream-v2/flatten.js +159 -0
  233. package/dist/production/vendor/turbo-stream-v2/turbo-stream.js +178 -0
  234. package/dist/production/vendor/turbo-stream-v2/unflatten.js +198 -0
  235. package/dist/production/vendor/turbo-stream-v2/utils.js +47 -0
  236. package/docs/explanation/backend-for-frontend.md +50 -0
  237. package/docs/explanation/code-splitting.md +77 -0
  238. package/docs/explanation/concurrency.md +135 -0
  239. package/docs/explanation/form-vs-fetcher.md +292 -0
  240. package/docs/explanation/hot-module-replacement.md +137 -0
  241. package/docs/explanation/hydration.md +14 -0
  242. package/docs/explanation/index-query-param.md +86 -0
  243. package/docs/explanation/index.md +4 -0
  244. package/docs/explanation/lazy-route-discovery.md +78 -0
  245. package/docs/explanation/location.md +6 -0
  246. package/docs/explanation/progressive-enhancement.md +150 -0
  247. package/docs/explanation/race-conditions.md +88 -0
  248. package/docs/explanation/react-transitions.md +160 -0
  249. package/docs/explanation/route-matching.md +7 -0
  250. package/docs/explanation/server-client-execution.md +4 -0
  251. package/docs/explanation/sessions-and-cookies.md +465 -0
  252. package/docs/explanation/special-files.md +16 -0
  253. package/docs/explanation/state-management.md +524 -0
  254. package/docs/explanation/styling.md +87 -0
  255. package/docs/explanation/type-safety.md +82 -0
  256. package/docs/how-to/accessibility.md +44 -0
  257. package/docs/how-to/client-data.md +199 -0
  258. package/docs/how-to/data-strategy.md +317 -0
  259. package/docs/how-to/error-boundary.md +231 -0
  260. package/docs/how-to/error-reporting.md +134 -0
  261. package/docs/how-to/fetchers.md +307 -0
  262. package/docs/how-to/file-route-conventions.md +410 -0
  263. package/docs/how-to/file-uploads.md +217 -0
  264. package/docs/how-to/form-validation.md +120 -0
  265. package/docs/how-to/headers.md +164 -0
  266. package/docs/how-to/index.md +4 -0
  267. package/docs/how-to/instrumentation.md +556 -0
  268. package/docs/how-to/meta.md +40 -0
  269. package/docs/how-to/middleware.md +728 -0
  270. package/docs/how-to/navigation-blocking.md +233 -0
  271. package/docs/how-to/optimize-revalidation.md +12 -0
  272. package/docs/how-to/pre-rendering.md +225 -0
  273. package/docs/how-to/presets.md +103 -0
  274. package/docs/how-to/react-server-components.md +899 -0
  275. package/docs/how-to/resource-routes.md +126 -0
  276. package/docs/how-to/route-module-type-safety.md +100 -0
  277. package/docs/how-to/search-params.md +4 -0
  278. package/docs/how-to/security.md +30 -0
  279. package/docs/how-to/server-bundles.md +66 -0
  280. package/docs/how-to/spa.md +120 -0
  281. package/docs/how-to/status.md +63 -0
  282. package/docs/how-to/suspense.md +132 -0
  283. package/docs/how-to/using-handle.md +117 -0
  284. package/docs/how-to/view-transitions.md +237 -0
  285. package/docs/how-to/webhook.md +50 -0
  286. package/docs/index.md +39 -0
  287. package/docs/start/data/actions.md +138 -0
  288. package/docs/start/data/custom.md +198 -0
  289. package/docs/start/data/data-loading.md +44 -0
  290. package/docs/start/data/index.md +4 -0
  291. package/docs/start/data/installation.md +52 -0
  292. package/docs/start/data/navigating.md +12 -0
  293. package/docs/start/data/pending-ui.md +12 -0
  294. package/docs/start/data/route-object.md +248 -0
  295. package/docs/start/data/routing.md +281 -0
  296. package/docs/start/data/testing.md +8 -0
  297. package/docs/start/declarative/index.md +4 -0
  298. package/docs/start/declarative/installation.md +43 -0
  299. package/docs/start/declarative/navigating.md +133 -0
  300. package/docs/start/declarative/routing.md +237 -0
  301. package/docs/start/declarative/url-values.md +65 -0
  302. package/docs/start/framework/actions.md +175 -0
  303. package/docs/start/framework/data-loading.md +201 -0
  304. package/docs/start/framework/deploying.md +96 -0
  305. package/docs/start/framework/index.md +4 -0
  306. package/docs/start/framework/installation.md +42 -0
  307. package/docs/start/framework/navigating.md +182 -0
  308. package/docs/start/framework/pending-ui.md +142 -0
  309. package/docs/start/framework/rendering.md +59 -0
  310. package/docs/start/framework/route-module.md +527 -0
  311. package/docs/start/framework/routing.md +362 -0
  312. package/docs/start/framework/testing.md +133 -0
  313. package/docs/start/index.md +4 -0
  314. package/docs/start/modes.md +201 -0
  315. package/docs/upgrading/component-routes.md +363 -0
  316. package/docs/upgrading/future.md +31 -0
  317. package/docs/upgrading/index.md +4 -0
  318. package/docs/upgrading/remix.md +403 -0
  319. package/docs/upgrading/router-provider.md +442 -0
  320. package/docs/upgrading/v6.md +379 -0
  321. package/package.json +44 -87
  322. package/dist/development/browser-3AnU12UI.d.mts +0 -318
  323. package/dist/development/browser-BOdXz9dK.d.ts +0 -318
  324. package/dist/development/chunk-4N6VE7H7.mjs +0 -11528
  325. package/dist/development/chunk-4YRVXM2U.js +0 -188
  326. package/dist/development/chunk-66UKHEGQ.js +0 -1362
  327. package/dist/development/chunk-D6LUOGOQ.js +0 -10229
  328. package/dist/development/chunk-RJYABSBD.mjs +0 -2585
  329. package/dist/development/context-ByvtofY2.d.mts +0 -1771
  330. package/dist/development/data-BVUf681J.d.mts +0 -1732
  331. package/dist/development/data-BqZ2x964.d.ts +0 -1732
  332. package/dist/development/dom-export.d.mts +0 -172
  333. package/dist/development/dom-export.mjs +0 -1008
  334. package/dist/development/index-react-server-client-BS5F89FR.d.ts +0 -3655
  335. package/dist/development/index-react-server-client-DY04-103.d.mts +0 -2600
  336. package/dist/development/index-react-server-client.d.mts +0 -4
  337. package/dist/development/index-react-server-client.mjs +0 -59
  338. package/dist/development/index-react-server.d.mts +0 -2703
  339. package/dist/development/index-react-server.mjs +0 -3780
  340. package/dist/development/index.d.mts +0 -1472
  341. package/dist/development/index.mjs +0 -277
  342. package/dist/development/instrumentation-cRWWLfsU.d.ts +0 -715
  343. package/dist/development/lib/types/internal.d.mts +0 -184
  344. package/dist/development/lib/types/internal.mjs +0 -10
  345. package/dist/development/register-Df8okEea.d.mts +0 -30
  346. package/dist/production/browser-3AnU12UI.d.mts +0 -318
  347. package/dist/production/browser-BOdXz9dK.d.ts +0 -318
  348. package/dist/production/chunk-6S4627ZB.mjs +0 -2585
  349. package/dist/production/chunk-HUBUW7R3.js +0 -10229
  350. package/dist/production/chunk-JAKZPQZC.mjs +0 -11528
  351. package/dist/production/chunk-PNZCCTKT.js +0 -1362
  352. package/dist/production/chunk-Y6IFXO7V.js +0 -188
  353. package/dist/production/context-ByvtofY2.d.mts +0 -1771
  354. package/dist/production/data-BVUf681J.d.mts +0 -1732
  355. package/dist/production/data-BqZ2x964.d.ts +0 -1732
  356. package/dist/production/dom-export.d.mts +0 -172
  357. package/dist/production/dom-export.mjs +0 -1008
  358. package/dist/production/index-react-server-client-BS5F89FR.d.ts +0 -3655
  359. package/dist/production/index-react-server-client-DY04-103.d.mts +0 -2600
  360. package/dist/production/index-react-server-client.d.mts +0 -4
  361. package/dist/production/index-react-server-client.mjs +0 -59
  362. package/dist/production/index-react-server.d.mts +0 -2703
  363. package/dist/production/index-react-server.mjs +0 -3780
  364. package/dist/production/index.d.mts +0 -1472
  365. package/dist/production/index.mjs +0 -277
  366. package/dist/production/instrumentation-cRWWLfsU.d.ts +0 -715
  367. package/dist/production/lib/types/internal.d.mts +0 -184
  368. package/dist/production/lib/types/internal.mjs +0 -10
  369. package/dist/production/register-Df8okEea.d.mts +0 -30
@@ -0,0 +1,556 @@
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
+ await handleRequest();
48
+ console.log(`Request end: ${url}`);
49
+ },
50
+ });
51
+ },
52
+
53
+ // Instrument individual routes
54
+ route(route) {
55
+ // Skip instrumentation for specific routes if needed
56
+ if (route.id === "root") return;
57
+
58
+ route.instrument({
59
+ async loader(callLoader, { request }) {
60
+ let url = `${request.method} ${request.url}`;
61
+ console.log(`Loader start: ${url} - ${route.id}`);
62
+ await callLoader();
63
+ console.log(`Loader end: ${url} - ${route.id}`);
64
+ },
65
+ // Other available instrumentations:
66
+ // async action() { /* ... */ },
67
+ // async middleware() { /* ... */ },
68
+ // async lazy() { /* ... */ },
69
+ });
70
+ },
71
+ },
72
+ ];
73
+
74
+ export default function handleRequest(/* ... */) {
75
+ // Your existing handleRequest implementation
76
+ }
77
+ ```
78
+
79
+ ### 2. Client-side Instrumentation
80
+
81
+ Add instrumentations to your `entry.client.tsx`:
82
+
83
+ ```tsx filename=app/entry.client.tsx
84
+ import { startTransition, StrictMode } from "react";
85
+ import { hydrateRoot } from "react-dom/client";
86
+ import { HydratedRouter } from "react-router/dom";
87
+
88
+ const instrumentations = [
89
+ {
90
+ // Instrument router operations
91
+ router(router) {
92
+ router.instrument({
93
+ // Instrument navigations
94
+ async navigate(callNavigate, { currentUrl, to }) {
95
+ let nav = `${currentUrl} → ${to}`;
96
+ console.log(`Navigation start: ${nav}`);
97
+ await callNavigate();
98
+ console.log(`Navigation end: ${nav}`);
99
+ },
100
+ // Instrument fetcher calls
101
+ async fetch(
102
+ callFetch,
103
+ { href, currentUrl, fetcherKey },
104
+ ) {
105
+ let fetch = `${fetcherKey} → ${href}`;
106
+ console.log(`Fetcher start: ${fetch}`);
107
+ await callFetch();
108
+ console.log(`Fetcher end: ${fetch}`);
109
+ },
110
+ });
111
+ },
112
+
113
+ // Instrument individual routes (same as server-side)
114
+ route(route) {
115
+ // Skip instrumentation for specific routes if needed
116
+ if (route.id === "root") return;
117
+
118
+ route.instrument({
119
+ async loader(callLoader, { request }) {
120
+ let url = `${request.method} ${request.url}`;
121
+ console.log(`Loader start: ${url} - ${route.id}`);
122
+ await callLoader();
123
+ console.log(`Loader end: ${url} - ${route.id}`);
124
+ },
125
+ // Other available instrumentations:
126
+ // async action() { /* ... */ },
127
+ // async middleware() { /* ... */ },
128
+ // async lazy() { /* ... */ },
129
+ });
130
+ },
131
+ },
132
+ ];
133
+
134
+ startTransition(() => {
135
+ hydrateRoot(
136
+ document,
137
+ <StrictMode>
138
+ <HydratedRouter instrumentations={instrumentations} />
139
+ </StrictMode>,
140
+ );
141
+ });
142
+ ```
143
+
144
+ ## Quick Start (Data Mode)
145
+
146
+ [modes: data]
147
+
148
+ In Data Mode, you add instrumentations when creating your router:
149
+
150
+ ```tsx
151
+ import {
152
+ createBrowserRouter,
153
+ RouterProvider,
154
+ } from "react-router";
155
+
156
+ const instrumentations = [
157
+ {
158
+ // Instrument router operations
159
+ router(router) {
160
+ router.instrument({
161
+ // Instrument navigations
162
+ async navigate(callNavigate, { currentUrl, to }) {
163
+ let nav = `${currentUrl} → ${to}`;
164
+ console.log(`Navigation start: ${nav}`);
165
+ await callNavigate();
166
+ console.log(`Navigation end: ${nav}`);
167
+ },
168
+ // Instrument fetcher calls
169
+ async fetch(
170
+ callFetch,
171
+ { href, currentUrl, fetcherKey },
172
+ ) {
173
+ let fetch = `${fetcherKey} → ${href}`;
174
+ console.log(`Fetcher start: ${fetch}`);
175
+ await callFetch();
176
+ console.log(`Fetcher end: ${fetch}`);
177
+ },
178
+ });
179
+ },
180
+
181
+ // Instrument individual routes (same as server-side)
182
+ route(route) {
183
+ // Skip instrumentation for specific routes if needed
184
+ if (route.id === "root") return;
185
+
186
+ route.instrument({
187
+ async loader(callLoader, { request }) {
188
+ let url = `${request.method} ${request.url}`;
189
+ console.log(`Loader start: ${url} - ${route.id}`);
190
+ await callLoader();
191
+ console.log(`Loader end: ${url} - ${route.id}`);
192
+ },
193
+ // Other available instrumentations:
194
+ // async action() { /* ... */ },
195
+ // async middleware() { /* ... */ },
196
+ // async lazy() { /* ... */ },
197
+ });
198
+ },
199
+ },
200
+ ];
201
+
202
+ const router = createBrowserRouter(routes, {
203
+ instrumentations,
204
+ });
205
+
206
+ function App() {
207
+ return <RouterProvider router={router} />;
208
+ }
209
+ ```
210
+
211
+ ## Core Concepts
212
+
213
+ ### Instrumentation Levels
214
+
215
+ 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.
216
+
217
+ #### 1. Handler Level (Server)
218
+
219
+ [modes: framework]
220
+
221
+ Instruments the top-level request handler that processes all requests to your server:
222
+
223
+ ```tsx filename=entry.server.tsx
224
+ export const instrumentations = [
225
+ {
226
+ handler(handler) {
227
+ handler.instrument({
228
+ async request(handleRequest, { request, context }) {
229
+ // Runs around ALL requests to your app
230
+ await handleRequest();
231
+ },
232
+ });
233
+ },
234
+ },
235
+ ];
236
+ ```
237
+
238
+ #### 2. Router Level (Client)
239
+
240
+ [modes: framework,data]
241
+
242
+ Instruments client-side router operations like navigations and fetcher calls:
243
+
244
+ ```tsx
245
+ export const instrumentations = [
246
+ {
247
+ router(router) {
248
+ router.instrument({
249
+ async navigate(callNavigate, { to, currentUrl }) {
250
+ // Runs around navigation operations
251
+ await callNavigate();
252
+ },
253
+ async fetch(
254
+ callFetch,
255
+ { href, currentUrl, fetcherKey },
256
+ ) {
257
+ // Runs around fetcher operations
258
+ await callFetch();
259
+ },
260
+ });
261
+ },
262
+ },
263
+ ];
264
+
265
+ // Framework Mode (entry.client.tsx)
266
+ <HydratedRouter instrumentations={instrumentations} />;
267
+
268
+ // Data Mode
269
+ const router = createBrowserRouter(routes, {
270
+ instrumentations,
271
+ });
272
+ ```
273
+
274
+ #### 3. Route Level (Server + Client)
275
+
276
+ [modes: framework,data]
277
+
278
+ Instruments individual route handlers:
279
+
280
+ ```tsx
281
+ const instrumentations = [
282
+ {
283
+ route(route) {
284
+ route.instrument({
285
+ async loader(
286
+ callLoader,
287
+ { params, request, context, pattern },
288
+ ) {
289
+ // Runs around loader execution
290
+ await callLoader();
291
+ },
292
+ async action(
293
+ callAction,
294
+ { params, request, context, pattern },
295
+ ) {
296
+ // Runs around action execution
297
+ await callAction();
298
+ },
299
+ async middleware(
300
+ callMiddleware,
301
+ { params, request, context, pattern },
302
+ ) {
303
+ // Runs around middleware execution
304
+ await callMiddleware();
305
+ },
306
+ async lazy(callLazy) {
307
+ // Runs around lazy route loading
308
+ await callLazy();
309
+ },
310
+ });
311
+ },
312
+ },
313
+ ];
314
+ ```
315
+
316
+ ### Read-only Design
317
+
318
+ Instrumentations are designed to be **observational only**. You cannot:
319
+
320
+ - Modify arguments passed to handlers
321
+ - Change return values from handlers
322
+ - Alter application behavior
323
+
324
+ This ensures that instrumentation is safe to add to production applications and cannot introduce bugs in your route logic.
325
+
326
+ ### Error Handling
327
+
328
+ 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.
329
+
330
+ 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 `{ type: "success", error: undefined } | { type: "error", error: unknown }`. This ensures your entire instrumentation function runs without needing any try/catch/finally logic to handle application errors.
331
+
332
+ ```tsx
333
+ export const instrumentations = [
334
+ {
335
+ route(route) {
336
+ route.instrument({
337
+ async loader(callLoader) {
338
+ let { status, error } = await callLoader();
339
+
340
+ if (status === "error") {
341
+ // error case - `error` is defined
342
+ } else {
343
+ // success case - `error` is undefined
344
+ }
345
+ },
346
+ });
347
+ },
348
+ },
349
+ ];
350
+ ```
351
+
352
+ 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:
353
+
354
+ ```tsx
355
+ export const instrumentations = [
356
+ {
357
+ route(route) {
358
+ route.instrument({
359
+ // Throwing before calling the handler - RR will
360
+ // catch the error and still call the loader
361
+ async loader(callLoader) {
362
+ somethingThatThrows();
363
+ await callLoader();
364
+ },
365
+ // Throwing after calling the handler - RR will
366
+ // catch the error internally
367
+ async action(callAction) {
368
+ await callAction();
369
+ somethingThatThrows();
370
+ },
371
+ });
372
+ },
373
+ },
374
+ ];
375
+ ```
376
+
377
+ ### Composition
378
+
379
+ You can compose multiple instrumentations by providing an array:
380
+
381
+ ```tsx
382
+ export const instrumentations = [
383
+ loggingInstrumentation,
384
+ performanceInstrumentation,
385
+ errorReportingInstrumentation,
386
+ ];
387
+ ```
388
+
389
+ Each instrumentation wraps the previous one, creating a nested execution chain.
390
+
391
+ ### Conditional Instrumentation
392
+
393
+ You can enable instrumentation conditionally based on environment or other factors:
394
+
395
+ ```tsx
396
+ export const instrumentations =
397
+ process.env.NODE_ENV === "production"
398
+ ? [productionInstrumentation]
399
+ : [developmentInstrumentation];
400
+ ```
401
+
402
+ ```tsx
403
+ // Or conditionally within an instrumentation
404
+ export const instrumentations = [
405
+ {
406
+ route(route) {
407
+ // Only instrument specific routes
408
+ if (!route.id?.startsWith("routes/admin")) return;
409
+
410
+ // Or, only instrument if a query parameter is present
411
+ let sp = new URL(request.url).searchParams;
412
+ if (!sp.has("DEBUG")) return;
413
+
414
+ route.instrument({
415
+ async loader() {
416
+ /* ... */
417
+ },
418
+ });
419
+ },
420
+ },
421
+ ];
422
+ ```
423
+
424
+ ## Common Patterns
425
+
426
+ ### Request logging (server)
427
+
428
+ ```tsx
429
+ const logging: ServerInstrumentation = {
430
+ handler({ instrument }) {
431
+ instrument({
432
+ request: (fn, { request }) =>
433
+ log(`request ${request.url}`, fn),
434
+ });
435
+ },
436
+ route({ instrument, id }) {
437
+ instrument({
438
+ middleware: (fn) => log(` middleware (${id})`, fn),
439
+ loader: (fn) => log(` loader (${id})`, fn),
440
+ action: (fn) => log(` action (${id})`, fn),
441
+ });
442
+ },
443
+ };
444
+
445
+ async function log(
446
+ label: string,
447
+ cb: () => Promise<InstrumentationHandlerResult>,
448
+ ) {
449
+ let start = Date.now();
450
+ console.log(`➡️ ${label}`);
451
+ await cb();
452
+ console.log(`⬅️ ${label} (${Date.now() - start}ms)`);
453
+ }
454
+
455
+ export const instrumentations = [logging];
456
+ ```
457
+
458
+ ### OpenTelemetry Integration
459
+
460
+ ```tsx
461
+ import { trace, SpanStatusCode } from "@opentelemetry/api";
462
+
463
+ const tracer = trace.getTracer("my-app");
464
+
465
+ const otel: ServerInstrumentation = {
466
+ handler({ instrument }) {
467
+ instrument({
468
+ request: (fn, { request }) =>
469
+ otelSpan(`request`, { url: request.url }, fn),
470
+ });
471
+ },
472
+ route({ instrument, id }) {
473
+ instrument({
474
+ middleware: (fn, { pattern }) =>
475
+ otelSpan(
476
+ "middleware",
477
+ { routeId: id, pattern: pattern },
478
+ fn,
479
+ ),
480
+ loader: (fn, { pattern }) =>
481
+ otelSpan(
482
+ "loader",
483
+ { routeId: id, pattern: pattern },
484
+ fn,
485
+ ),
486
+ action: (fn, { pattern }) =>
487
+ otelSpan(
488
+ "action",
489
+ { routeId: id, pattern: pattern },
490
+ fn,
491
+ ),
492
+ });
493
+ },
494
+ };
495
+
496
+ async function otelSpan(
497
+ label: string,
498
+ attributes: Record<string, string>,
499
+ cb: () => Promise<InstrumentationHandlerResult>,
500
+ ) {
501
+ return tracer.startActiveSpan(
502
+ label,
503
+ { attributes },
504
+ async (span) => {
505
+ let { error } = await cb();
506
+ if (error) {
507
+ span.recordException(error);
508
+ span.setStatus({
509
+ code: SpanStatusCode.ERROR,
510
+ });
511
+ }
512
+ span.end();
513
+ },
514
+ );
515
+ }
516
+
517
+ export const instrumentations = [otel];
518
+ ```
519
+
520
+ ### Client-side Performance Tracking
521
+
522
+ ```tsx
523
+ const windowPerf: ClientInstrumentation = {
524
+ router({ instrument }) {
525
+ instrument({
526
+ navigate: (fn, { to, currentUrl }) =>
527
+ measure(`navigation:${currentUrl}->${to}`, fn),
528
+ fetch: (fn, { href }) =>
529
+ measure(`fetcher:${href}`, fn),
530
+ });
531
+ },
532
+ route({ instrument, id }) {
533
+ instrument({
534
+ middleware: (fn) => measure(`middleware:${id}`, fn),
535
+ loader: (fn) => measure(`loader:${id}`, fn),
536
+ action: (fn) => measure(`action:${id}`, fn),
537
+ });
538
+ },
539
+ };
540
+
541
+ async function measure(
542
+ label: string,
543
+ cb: () => Promise<InstrumentationHandlerResult>,
544
+ ) {
545
+ performance.mark(`start:${label}`);
546
+ await cb();
547
+ performance.mark(`end:${label}`);
548
+ performance.measure(
549
+ label,
550
+ `start:${label}`,
551
+ `end:${label}`,
552
+ );
553
+ }
554
+
555
+ <HydratedRouter instrumentations={[windowPerf]} />;
556
+ ```
@@ -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
+ ```