@rangojs/router 0.0.0-experimental.125 → 0.0.0-experimental.127

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 (902) hide show
  1. package/README.md +6 -4
  2. package/dist/__internal.d.ts +83 -0
  3. package/dist/__internal.d.ts.map +1 -0
  4. package/dist/__internal.js +19 -0
  5. package/dist/__internal.js.map +1 -0
  6. package/dist/__mocks__/version.d.ts +7 -0
  7. package/dist/__mocks__/version.d.ts.map +1 -0
  8. package/dist/__mocks__/version.js +7 -0
  9. package/dist/__mocks__/version.js.map +1 -0
  10. package/dist/__tests__/client-href.test.d.ts +2 -0
  11. package/dist/__tests__/client-href.test.d.ts.map +1 -0
  12. package/dist/__tests__/client-href.test.js +74 -0
  13. package/dist/__tests__/client-href.test.js.map +1 -0
  14. package/dist/__tests__/component-utils.test.d.ts +2 -0
  15. package/dist/__tests__/component-utils.test.d.ts.map +1 -0
  16. package/dist/__tests__/component-utils.test.js +51 -0
  17. package/dist/__tests__/component-utils.test.js.map +1 -0
  18. package/dist/__tests__/event-controller.test.d.ts +2 -0
  19. package/dist/__tests__/event-controller.test.d.ts.map +1 -0
  20. package/dist/__tests__/event-controller.test.js +538 -0
  21. package/dist/__tests__/event-controller.test.js.map +1 -0
  22. package/dist/__tests__/helpers/route-tree.d.ts +118 -0
  23. package/dist/__tests__/helpers/route-tree.d.ts.map +1 -0
  24. package/dist/__tests__/helpers/route-tree.js +374 -0
  25. package/dist/__tests__/helpers/route-tree.js.map +1 -0
  26. package/dist/__tests__/match-result.test.d.ts +2 -0
  27. package/dist/__tests__/match-result.test.d.ts.map +1 -0
  28. package/dist/__tests__/match-result.test.js +154 -0
  29. package/dist/__tests__/match-result.test.js.map +1 -0
  30. package/dist/__tests__/navigation-store.test.d.ts +2 -0
  31. package/dist/__tests__/navigation-store.test.d.ts.map +1 -0
  32. package/dist/__tests__/navigation-store.test.js +440 -0
  33. package/dist/__tests__/navigation-store.test.js.map +1 -0
  34. package/dist/__tests__/partial-update.test.d.ts +2 -0
  35. package/dist/__tests__/partial-update.test.d.ts.map +1 -0
  36. package/dist/__tests__/partial-update.test.js +1009 -0
  37. package/dist/__tests__/partial-update.test.js.map +1 -0
  38. package/dist/__tests__/reverse-types.test.d.ts +8 -0
  39. package/dist/__tests__/reverse-types.test.d.ts.map +1 -0
  40. package/dist/__tests__/reverse-types.test.js +656 -0
  41. package/dist/__tests__/reverse-types.test.js.map +1 -0
  42. package/dist/__tests__/route-definition.test.d.ts +2 -0
  43. package/dist/__tests__/route-definition.test.d.ts.map +1 -0
  44. package/dist/__tests__/route-definition.test.js +55 -0
  45. package/dist/__tests__/route-definition.test.js.map +1 -0
  46. package/dist/__tests__/router-helpers.test.d.ts +2 -0
  47. package/dist/__tests__/router-helpers.test.d.ts.map +1 -0
  48. package/dist/__tests__/router-helpers.test.js +377 -0
  49. package/dist/__tests__/router-helpers.test.js.map +1 -0
  50. package/dist/__tests__/router-integration-2.test.d.ts +2 -0
  51. package/dist/__tests__/router-integration-2.test.d.ts.map +1 -0
  52. package/dist/__tests__/router-integration-2.test.js +426 -0
  53. package/dist/__tests__/router-integration-2.test.js.map +1 -0
  54. package/dist/__tests__/router-integration.test.d.ts +2 -0
  55. package/dist/__tests__/router-integration.test.d.ts.map +1 -0
  56. package/dist/__tests__/router-integration.test.js +1051 -0
  57. package/dist/__tests__/router-integration.test.js.map +1 -0
  58. package/dist/__tests__/search-params.test.d.ts +5 -0
  59. package/dist/__tests__/search-params.test.d.ts.map +1 -0
  60. package/dist/__tests__/search-params.test.js +306 -0
  61. package/dist/__tests__/search-params.test.js.map +1 -0
  62. package/dist/__tests__/segment-system.test.d.ts +2 -0
  63. package/dist/__tests__/segment-system.test.d.ts.map +1 -0
  64. package/dist/__tests__/segment-system.test.js +627 -0
  65. package/dist/__tests__/segment-system.test.js.map +1 -0
  66. package/dist/__tests__/static-handler-types.test.d.ts +8 -0
  67. package/dist/__tests__/static-handler-types.test.d.ts.map +1 -0
  68. package/dist/__tests__/static-handler-types.test.js +63 -0
  69. package/dist/__tests__/static-handler-types.test.js.map +1 -0
  70. package/dist/__tests__/urls.test.d.ts +2 -0
  71. package/dist/__tests__/urls.test.d.ts.map +1 -0
  72. package/dist/__tests__/urls.test.js +421 -0
  73. package/dist/__tests__/urls.test.js.map +1 -0
  74. package/dist/__tests__/use-mount.test.d.ts +2 -0
  75. package/dist/__tests__/use-mount.test.d.ts.map +1 -0
  76. package/dist/__tests__/use-mount.test.js +35 -0
  77. package/dist/__tests__/use-mount.test.js.map +1 -0
  78. package/dist/bin/rango.d.ts +2 -0
  79. package/dist/bin/rango.d.ts.map +1 -0
  80. package/dist/bin/rango.js +5 -1
  81. package/dist/bin/rango.js.map +1 -0
  82. package/dist/browser/event-controller.d.ts +191 -0
  83. package/dist/browser/event-controller.d.ts.map +1 -0
  84. package/dist/browser/event-controller.js +559 -0
  85. package/dist/browser/event-controller.js.map +1 -0
  86. package/dist/browser/index.d.ts +2 -0
  87. package/dist/browser/index.d.ts.map +1 -0
  88. package/dist/browser/index.js +14 -0
  89. package/dist/browser/index.js.map +1 -0
  90. package/dist/browser/link-interceptor.d.ts +38 -0
  91. package/dist/browser/link-interceptor.d.ts.map +1 -0
  92. package/dist/browser/link-interceptor.js +99 -0
  93. package/dist/browser/link-interceptor.js.map +1 -0
  94. package/dist/browser/logging.d.ts +10 -0
  95. package/dist/browser/logging.d.ts.map +1 -0
  96. package/dist/browser/logging.js +29 -0
  97. package/dist/browser/logging.js.map +1 -0
  98. package/dist/browser/lru-cache.d.ts +17 -0
  99. package/dist/browser/lru-cache.d.ts.map +1 -0
  100. package/dist/browser/lru-cache.js +50 -0
  101. package/dist/browser/lru-cache.js.map +1 -0
  102. package/dist/browser/merge-segment-loaders.d.ts +39 -0
  103. package/dist/browser/merge-segment-loaders.d.ts.map +1 -0
  104. package/dist/browser/merge-segment-loaders.js +102 -0
  105. package/dist/browser/merge-segment-loaders.js.map +1 -0
  106. package/dist/browser/navigation-bridge.d.ts +102 -0
  107. package/dist/browser/navigation-bridge.d.ts.map +1 -0
  108. package/dist/browser/navigation-bridge.js +708 -0
  109. package/dist/browser/navigation-bridge.js.map +1 -0
  110. package/dist/browser/navigation-client.d.ts +25 -0
  111. package/dist/browser/navigation-client.d.ts.map +1 -0
  112. package/dist/browser/navigation-client.js +157 -0
  113. package/dist/browser/navigation-client.js.map +1 -0
  114. package/dist/browser/navigation-store.d.ts +101 -0
  115. package/dist/browser/navigation-store.d.ts.map +1 -0
  116. package/dist/browser/navigation-store.js +625 -0
  117. package/dist/browser/navigation-store.js.map +1 -0
  118. package/dist/browser/partial-update.d.ts +75 -0
  119. package/dist/browser/partial-update.d.ts.map +1 -0
  120. package/dist/browser/partial-update.js +426 -0
  121. package/dist/browser/partial-update.js.map +1 -0
  122. package/dist/browser/react/Link.d.ts +86 -0
  123. package/dist/browser/react/Link.d.ts.map +1 -0
  124. package/dist/browser/react/Link.js +128 -0
  125. package/dist/browser/react/Link.js.map +1 -0
  126. package/dist/browser/react/NavigationProvider.d.ts +63 -0
  127. package/dist/browser/react/NavigationProvider.d.ts.map +1 -0
  128. package/dist/browser/react/NavigationProvider.js +216 -0
  129. package/dist/browser/react/NavigationProvider.js.map +1 -0
  130. package/dist/browser/react/ScrollRestoration.d.ts +75 -0
  131. package/dist/browser/react/ScrollRestoration.d.ts.map +1 -0
  132. package/dist/browser/react/ScrollRestoration.js +57 -0
  133. package/dist/browser/react/ScrollRestoration.js.map +1 -0
  134. package/dist/browser/react/context.d.ts +46 -0
  135. package/dist/browser/react/context.d.ts.map +1 -0
  136. package/dist/browser/react/context.js +10 -0
  137. package/dist/browser/react/context.js.map +1 -0
  138. package/dist/browser/react/index.d.ts +11 -0
  139. package/dist/browser/react/index.d.ts.map +1 -0
  140. package/dist/browser/react/index.js +22 -0
  141. package/dist/browser/react/index.js.map +1 -0
  142. package/dist/browser/react/location-state-shared.d.ts +63 -0
  143. package/dist/browser/react/location-state-shared.d.ts.map +1 -0
  144. package/dist/browser/react/location-state-shared.js +81 -0
  145. package/dist/browser/react/location-state-shared.js.map +1 -0
  146. package/dist/browser/react/location-state.d.ts +23 -0
  147. package/dist/browser/react/location-state.d.ts.map +1 -0
  148. package/dist/browser/react/location-state.js +29 -0
  149. package/dist/browser/react/location-state.js.map +1 -0
  150. package/dist/browser/react/mount-context.d.ts +24 -0
  151. package/dist/browser/react/mount-context.d.ts.map +1 -0
  152. package/dist/browser/react/mount-context.js +24 -0
  153. package/dist/browser/react/mount-context.js.map +1 -0
  154. package/dist/browser/react/use-action.d.ts +64 -0
  155. package/dist/browser/react/use-action.d.ts.map +1 -0
  156. package/dist/browser/react/use-action.js +134 -0
  157. package/dist/browser/react/use-action.js.map +1 -0
  158. package/dist/browser/react/use-client-cache.d.ts +41 -0
  159. package/dist/browser/react/use-client-cache.d.ts.map +1 -0
  160. package/dist/browser/react/use-client-cache.js +39 -0
  161. package/dist/browser/react/use-client-cache.js.map +1 -0
  162. package/dist/browser/react/use-handle.d.ts +31 -0
  163. package/dist/browser/react/use-handle.d.ts.map +1 -0
  164. package/dist/browser/react/use-handle.js +144 -0
  165. package/dist/browser/react/use-handle.js.map +1 -0
  166. package/dist/browser/react/use-href.d.ts +33 -0
  167. package/dist/browser/react/use-href.d.ts.map +1 -0
  168. package/dist/browser/react/use-href.js +39 -0
  169. package/dist/browser/react/use-href.js.map +1 -0
  170. package/dist/browser/react/use-link-status.d.ts +37 -0
  171. package/dist/browser/react/use-link-status.d.ts.map +1 -0
  172. package/dist/browser/react/use-link-status.js +99 -0
  173. package/dist/browser/react/use-link-status.js.map +1 -0
  174. package/dist/browser/react/use-mount.d.ts +25 -0
  175. package/dist/browser/react/use-mount.d.ts.map +1 -0
  176. package/dist/browser/react/use-mount.js +30 -0
  177. package/dist/browser/react/use-mount.js.map +1 -0
  178. package/dist/browser/react/use-navigation.d.ts +27 -0
  179. package/dist/browser/react/use-navigation.d.ts.map +1 -0
  180. package/dist/browser/react/use-navigation.js +87 -0
  181. package/dist/browser/react/use-navigation.js.map +1 -0
  182. package/dist/browser/react/use-segments.d.ts +38 -0
  183. package/dist/browser/react/use-segments.d.ts.map +1 -0
  184. package/dist/browser/react/use-segments.js +130 -0
  185. package/dist/browser/react/use-segments.js.map +1 -0
  186. package/dist/browser/request-controller.d.ts +26 -0
  187. package/dist/browser/request-controller.d.ts.map +1 -0
  188. package/dist/browser/request-controller.js +147 -0
  189. package/dist/browser/request-controller.js.map +1 -0
  190. package/dist/browser/rsc-router.d.ts +129 -0
  191. package/dist/browser/rsc-router.d.ts.map +1 -0
  192. package/dist/browser/rsc-router.js +195 -0
  193. package/dist/browser/rsc-router.js.map +1 -0
  194. package/dist/browser/scroll-restoration.d.ts +93 -0
  195. package/dist/browser/scroll-restoration.d.ts.map +1 -0
  196. package/dist/browser/scroll-restoration.js +321 -0
  197. package/dist/browser/scroll-restoration.js.map +1 -0
  198. package/dist/browser/segment-structure-assert.d.ts +17 -0
  199. package/dist/browser/segment-structure-assert.d.ts.map +1 -0
  200. package/dist/browser/segment-structure-assert.js +59 -0
  201. package/dist/browser/segment-structure-assert.js.map +1 -0
  202. package/dist/browser/server-action-bridge.d.ts +26 -0
  203. package/dist/browser/server-action-bridge.d.ts.map +1 -0
  204. package/dist/browser/server-action-bridge.js +668 -0
  205. package/dist/browser/server-action-bridge.js.map +1 -0
  206. package/dist/browser/shallow.d.ts +12 -0
  207. package/dist/browser/shallow.d.ts.map +1 -0
  208. package/dist/browser/shallow.js +34 -0
  209. package/dist/browser/shallow.js.map +1 -0
  210. package/dist/browser/types.d.ts +369 -0
  211. package/dist/browser/types.d.ts.map +1 -0
  212. package/dist/browser/types.js +2 -0
  213. package/dist/browser/types.js.map +1 -0
  214. package/dist/build/__tests__/generate-cli.test.d.ts +2 -0
  215. package/dist/build/__tests__/generate-cli.test.d.ts.map +1 -0
  216. package/dist/build/__tests__/generate-cli.test.js +237 -0
  217. package/dist/build/__tests__/generate-cli.test.js.map +1 -0
  218. package/dist/build/__tests__/generate-manifest.test.d.ts +2 -0
  219. package/dist/build/__tests__/generate-manifest.test.d.ts.map +1 -0
  220. package/dist/build/__tests__/generate-manifest.test.js +119 -0
  221. package/dist/build/__tests__/generate-manifest.test.js.map +1 -0
  222. package/dist/build/__tests__/generate-route-types.test.d.ts +2 -0
  223. package/dist/build/__tests__/generate-route-types.test.d.ts.map +1 -0
  224. package/dist/build/__tests__/generate-route-types.test.js +620 -0
  225. package/dist/build/__tests__/generate-route-types.test.js.map +1 -0
  226. package/dist/build/__tests__/per-router-manifest.test.d.ts +2 -0
  227. package/dist/build/__tests__/per-router-manifest.test.d.ts.map +1 -0
  228. package/dist/build/__tests__/per-router-manifest.test.js +308 -0
  229. package/dist/build/__tests__/per-router-manifest.test.js.map +1 -0
  230. package/dist/build/generate-manifest.d.ts +81 -0
  231. package/dist/build/generate-manifest.d.ts.map +1 -0
  232. package/dist/build/generate-manifest.js +276 -0
  233. package/dist/build/generate-manifest.js.map +1 -0
  234. package/dist/build/generate-route-types.d.ts +115 -0
  235. package/dist/build/generate-route-types.d.ts.map +1 -0
  236. package/dist/build/generate-route-types.js +740 -0
  237. package/dist/build/generate-route-types.js.map +1 -0
  238. package/dist/build/index.d.ts +21 -0
  239. package/dist/build/index.d.ts.map +1 -0
  240. package/dist/build/index.js +21 -0
  241. package/dist/build/index.js.map +1 -0
  242. package/dist/build/route-trie.d.ts +71 -0
  243. package/dist/build/route-trie.d.ts.map +1 -0
  244. package/dist/build/route-trie.js +175 -0
  245. package/dist/build/route-trie.js.map +1 -0
  246. package/dist/cache/__tests__/cache-scope.test.d.ts +2 -0
  247. package/dist/cache/__tests__/cache-scope.test.d.ts.map +1 -0
  248. package/dist/cache/__tests__/cache-scope.test.js +208 -0
  249. package/dist/cache/__tests__/cache-scope.test.js.map +1 -0
  250. package/dist/cache/__tests__/document-cache.test.d.ts +2 -0
  251. package/dist/cache/__tests__/document-cache.test.d.ts.map +1 -0
  252. package/dist/cache/__tests__/document-cache.test.js +345 -0
  253. package/dist/cache/__tests__/document-cache.test.js.map +1 -0
  254. package/dist/cache/__tests__/memory-segment-store.test.d.ts +2 -0
  255. package/dist/cache/__tests__/memory-segment-store.test.d.ts.map +1 -0
  256. package/dist/cache/__tests__/memory-segment-store.test.js +425 -0
  257. package/dist/cache/__tests__/memory-segment-store.test.js.map +1 -0
  258. package/dist/cache/__tests__/memory-store.test.d.ts +2 -0
  259. package/dist/cache/__tests__/memory-store.test.d.ts.map +1 -0
  260. package/dist/cache/__tests__/memory-store.test.js +367 -0
  261. package/dist/cache/__tests__/memory-store.test.js.map +1 -0
  262. package/dist/cache/cache-scope.d.ts +102 -0
  263. package/dist/cache/cache-scope.d.ts.map +1 -0
  264. package/dist/cache/cache-scope.js +440 -0
  265. package/dist/cache/cache-scope.js.map +1 -0
  266. package/dist/cache/cf/__tests__/cf-cache-store.test.d.ts +2 -0
  267. package/dist/cache/cf/__tests__/cf-cache-store.test.d.ts.map +1 -0
  268. package/dist/cache/cf/__tests__/cf-cache-store.test.js +330 -0
  269. package/dist/cache/cf/__tests__/cf-cache-store.test.js.map +1 -0
  270. package/dist/cache/cf/cf-cache-store.d.ts +165 -0
  271. package/dist/cache/cf/cf-cache-store.d.ts.map +1 -0
  272. package/dist/cache/cf/cf-cache-store.js +242 -0
  273. package/dist/cache/cf/cf-cache-store.js.map +1 -0
  274. package/dist/cache/cf/index.d.ts +14 -0
  275. package/dist/cache/cf/index.d.ts.map +1 -0
  276. package/dist/cache/cf/index.js +17 -0
  277. package/dist/cache/cf/index.js.map +1 -0
  278. package/dist/cache/document-cache.d.ts +64 -0
  279. package/dist/cache/document-cache.d.ts.map +1 -0
  280. package/dist/cache/document-cache.js +228 -0
  281. package/dist/cache/document-cache.js.map +1 -0
  282. package/dist/cache/index.d.ts +19 -0
  283. package/dist/cache/index.d.ts.map +1 -0
  284. package/dist/cache/index.js +21 -0
  285. package/dist/cache/index.js.map +1 -0
  286. package/dist/cache/memory-segment-store.d.ts +110 -0
  287. package/dist/cache/memory-segment-store.d.ts.map +1 -0
  288. package/dist/cache/memory-segment-store.js +117 -0
  289. package/dist/cache/memory-segment-store.js.map +1 -0
  290. package/dist/cache/memory-store.d.ts +41 -0
  291. package/dist/cache/memory-store.d.ts.map +1 -0
  292. package/dist/cache/memory-store.js +191 -0
  293. package/dist/cache/memory-store.js.map +1 -0
  294. package/dist/cache/types.d.ts +317 -0
  295. package/dist/cache/types.d.ts.map +1 -0
  296. package/dist/cache/types.js +12 -0
  297. package/dist/cache/types.js.map +1 -0
  298. package/dist/client.d.ts +248 -0
  299. package/dist/client.d.ts.map +1 -0
  300. package/dist/client.js +367 -0
  301. package/dist/client.js.map +1 -0
  302. package/dist/client.rsc.d.ts +26 -0
  303. package/dist/client.rsc.d.ts.map +1 -0
  304. package/dist/client.rsc.js +46 -0
  305. package/dist/client.rsc.js.map +1 -0
  306. package/dist/component-utils.d.ts +36 -0
  307. package/dist/component-utils.d.ts.map +1 -0
  308. package/dist/component-utils.js +61 -0
  309. package/dist/component-utils.js.map +1 -0
  310. package/dist/components/DefaultDocument.d.ts +13 -0
  311. package/dist/components/DefaultDocument.d.ts.map +1 -0
  312. package/dist/components/DefaultDocument.js +15 -0
  313. package/dist/components/DefaultDocument.js.map +1 -0
  314. package/dist/debug.d.ts +58 -0
  315. package/dist/debug.d.ts.map +1 -0
  316. package/dist/debug.js +157 -0
  317. package/dist/debug.js.map +1 -0
  318. package/dist/default-error-boundary.d.ts +11 -0
  319. package/dist/default-error-boundary.d.ts.map +1 -0
  320. package/dist/default-error-boundary.js +45 -0
  321. package/dist/default-error-boundary.js.map +1 -0
  322. package/dist/deps/browser.d.ts +2 -0
  323. package/dist/deps/browser.d.ts.map +1 -0
  324. package/dist/deps/browser.js +3 -0
  325. package/dist/deps/browser.js.map +1 -0
  326. package/dist/deps/html-stream-client.d.ts +2 -0
  327. package/dist/deps/html-stream-client.d.ts.map +1 -0
  328. package/dist/deps/html-stream-client.js +3 -0
  329. package/dist/deps/html-stream-client.js.map +1 -0
  330. package/dist/deps/html-stream-server.d.ts +2 -0
  331. package/dist/deps/html-stream-server.d.ts.map +1 -0
  332. package/dist/deps/html-stream-server.js +3 -0
  333. package/dist/deps/html-stream-server.js.map +1 -0
  334. package/dist/deps/rsc.d.ts +2 -0
  335. package/dist/deps/rsc.d.ts.map +1 -0
  336. package/dist/deps/rsc.js +4 -0
  337. package/dist/deps/rsc.js.map +1 -0
  338. package/dist/deps/ssr.d.ts +2 -0
  339. package/dist/deps/ssr.d.ts.map +1 -0
  340. package/dist/deps/ssr.js +3 -0
  341. package/dist/deps/ssr.js.map +1 -0
  342. package/dist/errors.d.ts +174 -0
  343. package/dist/errors.d.ts.map +1 -0
  344. package/dist/errors.js +241 -0
  345. package/dist/errors.js.map +1 -0
  346. package/dist/handle.d.ts +78 -0
  347. package/dist/handle.d.ts.map +1 -0
  348. package/dist/handle.js +82 -0
  349. package/dist/handle.js.map +1 -0
  350. package/dist/handles/MetaTags.d.ts +14 -0
  351. package/dist/handles/MetaTags.d.ts.map +1 -0
  352. package/dist/handles/MetaTags.js +136 -0
  353. package/dist/handles/MetaTags.js.map +1 -0
  354. package/{src/handles/index.ts → dist/handles/index.d.ts} +1 -2
  355. package/dist/handles/index.d.ts.map +1 -0
  356. package/dist/handles/index.js +6 -0
  357. package/dist/handles/index.js.map +1 -0
  358. package/dist/handles/meta.d.ts +39 -0
  359. package/dist/handles/meta.d.ts.map +1 -0
  360. package/dist/handles/meta.js +202 -0
  361. package/dist/handles/meta.js.map +1 -0
  362. package/dist/host/__tests__/errors.test.d.ts +2 -0
  363. package/dist/host/__tests__/errors.test.d.ts.map +1 -0
  364. package/dist/host/__tests__/errors.test.js +76 -0
  365. package/dist/host/__tests__/errors.test.js.map +1 -0
  366. package/dist/host/__tests__/pattern-comprehensive.test.d.ts +2 -0
  367. package/dist/host/__tests__/pattern-comprehensive.test.d.ts.map +1 -0
  368. package/dist/host/__tests__/pattern-comprehensive.test.js +732 -0
  369. package/dist/host/__tests__/pattern-comprehensive.test.js.map +1 -0
  370. package/dist/host/__tests__/pattern-matcher.test.d.ts +2 -0
  371. package/dist/host/__tests__/pattern-matcher.test.d.ts.map +1 -0
  372. package/dist/host/__tests__/pattern-matcher.test.js +251 -0
  373. package/dist/host/__tests__/pattern-matcher.test.js.map +1 -0
  374. package/dist/host/__tests__/router.test.d.ts +2 -0
  375. package/dist/host/__tests__/router.test.d.ts.map +1 -0
  376. package/dist/host/__tests__/router.test.js +241 -0
  377. package/dist/host/__tests__/router.test.js.map +1 -0
  378. package/dist/host/__tests__/testing.test.d.ts +2 -0
  379. package/dist/host/__tests__/testing.test.d.ts.map +1 -0
  380. package/dist/host/__tests__/testing.test.js +64 -0
  381. package/dist/host/__tests__/testing.test.js.map +1 -0
  382. package/dist/host/__tests__/utils.test.d.ts +2 -0
  383. package/dist/host/__tests__/utils.test.d.ts.map +1 -0
  384. package/dist/host/__tests__/utils.test.js +29 -0
  385. package/dist/host/__tests__/utils.test.js.map +1 -0
  386. package/dist/host/cookie-handler.d.ts +34 -0
  387. package/dist/host/cookie-handler.d.ts.map +1 -0
  388. package/dist/host/cookie-handler.js +124 -0
  389. package/dist/host/cookie-handler.js.map +1 -0
  390. package/dist/host/errors.d.ts +56 -0
  391. package/dist/host/errors.d.ts.map +1 -0
  392. package/dist/host/errors.js +79 -0
  393. package/dist/host/errors.js.map +1 -0
  394. package/dist/host/index.d.ts +29 -0
  395. package/dist/host/index.d.ts.map +1 -0
  396. package/dist/host/index.js +32 -0
  397. package/dist/host/index.js.map +1 -0
  398. package/dist/host/pattern-matcher.d.ts +36 -0
  399. package/dist/host/pattern-matcher.d.ts.map +1 -0
  400. package/dist/host/pattern-matcher.js +172 -0
  401. package/dist/host/pattern-matcher.js.map +1 -0
  402. package/dist/host/router.d.ts +26 -0
  403. package/dist/host/router.d.ts.map +1 -0
  404. package/dist/host/router.js +218 -0
  405. package/dist/host/router.js.map +1 -0
  406. package/dist/host/testing.d.ts +36 -0
  407. package/dist/host/testing.d.ts.map +1 -0
  408. package/dist/host/testing.js +55 -0
  409. package/dist/host/testing.js.map +1 -0
  410. package/dist/host/types.d.ts +115 -0
  411. package/dist/host/types.d.ts.map +1 -0
  412. package/dist/host/types.js +7 -0
  413. package/dist/host/types.js.map +1 -0
  414. package/dist/host/utils.d.ts +21 -0
  415. package/dist/host/utils.d.ts.map +1 -0
  416. package/dist/host/utils.js +23 -0
  417. package/dist/host/utils.js.map +1 -0
  418. package/dist/href-client.d.ts +131 -0
  419. package/dist/href-client.d.ts.map +1 -0
  420. package/dist/href-client.js +64 -0
  421. package/dist/href-client.js.map +1 -0
  422. package/dist/href-context.d.ts +29 -0
  423. package/dist/href-context.d.ts.map +1 -0
  424. package/dist/href-context.js +21 -0
  425. package/dist/href-context.js.map +1 -0
  426. package/dist/index.d.ts +73 -0
  427. package/dist/index.d.ts.map +1 -0
  428. package/dist/index.js +91 -0
  429. package/dist/index.js.map +1 -0
  430. package/dist/index.rsc.d.ts +32 -0
  431. package/dist/index.rsc.d.ts.map +1 -0
  432. package/dist/index.rsc.js +40 -0
  433. package/dist/index.rsc.js.map +1 -0
  434. package/dist/internal-debug.d.ts +2 -0
  435. package/dist/internal-debug.d.ts.map +1 -0
  436. package/dist/internal-debug.js +5 -0
  437. package/dist/internal-debug.js.map +1 -0
  438. package/dist/loader.d.ts +14 -0
  439. package/dist/loader.d.ts.map +1 -0
  440. package/dist/loader.js +20 -0
  441. package/dist/loader.js.map +1 -0
  442. package/dist/loader.rsc.d.ts +19 -0
  443. package/dist/loader.rsc.d.ts.map +1 -0
  444. package/dist/loader.rsc.js +99 -0
  445. package/dist/loader.rsc.js.map +1 -0
  446. package/dist/network-error-thrower.d.ts +17 -0
  447. package/dist/network-error-thrower.d.ts.map +1 -0
  448. package/dist/network-error-thrower.js +14 -0
  449. package/dist/network-error-thrower.js.map +1 -0
  450. package/dist/outlet-context.d.ts +13 -0
  451. package/dist/outlet-context.d.ts.map +1 -0
  452. package/dist/outlet-context.js +3 -0
  453. package/dist/outlet-context.js.map +1 -0
  454. package/dist/prerender/__tests__/param-hash.test.d.ts +2 -0
  455. package/dist/prerender/__tests__/param-hash.test.d.ts.map +1 -0
  456. package/dist/prerender/__tests__/param-hash.test.js +148 -0
  457. package/dist/prerender/__tests__/param-hash.test.js.map +1 -0
  458. package/dist/prerender/param-hash.d.ts +16 -0
  459. package/dist/prerender/param-hash.d.ts.map +1 -0
  460. package/dist/prerender/param-hash.js +36 -0
  461. package/dist/prerender/param-hash.js.map +1 -0
  462. package/dist/prerender/store.d.ts +38 -0
  463. package/dist/prerender/store.d.ts.map +1 -0
  464. package/dist/prerender/store.js +61 -0
  465. package/dist/prerender/store.js.map +1 -0
  466. package/dist/prerender.d.ts +66 -0
  467. package/dist/prerender.d.ts.map +1 -0
  468. package/dist/prerender.js +57 -0
  469. package/dist/prerender.js.map +1 -0
  470. package/dist/reverse.d.ts +196 -0
  471. package/dist/reverse.d.ts.map +1 -0
  472. package/dist/reverse.js +78 -0
  473. package/dist/reverse.js.map +1 -0
  474. package/dist/root-error-boundary.d.ts +33 -0
  475. package/dist/root-error-boundary.d.ts.map +1 -0
  476. package/dist/root-error-boundary.js +165 -0
  477. package/dist/root-error-boundary.js.map +1 -0
  478. package/dist/route-content-wrapper.d.ts +46 -0
  479. package/dist/route-content-wrapper.d.ts.map +1 -0
  480. package/dist/route-content-wrapper.js +77 -0
  481. package/dist/route-content-wrapper.js.map +1 -0
  482. package/dist/route-definition.d.ts +421 -0
  483. package/dist/route-definition.d.ts.map +1 -0
  484. package/dist/route-definition.js +868 -0
  485. package/dist/route-definition.js.map +1 -0
  486. package/dist/route-map-builder.d.ts +155 -0
  487. package/dist/route-map-builder.d.ts.map +1 -0
  488. package/dist/route-map-builder.js +237 -0
  489. package/dist/route-map-builder.js.map +1 -0
  490. package/dist/route-types.d.ts +165 -0
  491. package/dist/route-types.d.ts.map +1 -0
  492. package/dist/route-types.js +7 -0
  493. package/dist/route-types.js.map +1 -0
  494. package/dist/router/__tests__/handler-context.test.d.ts +2 -0
  495. package/dist/router/__tests__/handler-context.test.d.ts.map +1 -0
  496. package/dist/router/__tests__/handler-context.test.js +65 -0
  497. package/dist/router/__tests__/handler-context.test.js.map +1 -0
  498. package/dist/router/__tests__/loader-cycle-detection.test.d.ts +2 -0
  499. package/dist/router/__tests__/loader-cycle-detection.test.d.ts.map +1 -0
  500. package/dist/router/__tests__/loader-cycle-detection.test.js +221 -0
  501. package/dist/router/__tests__/loader-cycle-detection.test.js.map +1 -0
  502. package/dist/router/__tests__/match-context.test.d.ts +2 -0
  503. package/dist/router/__tests__/match-context.test.d.ts.map +1 -0
  504. package/dist/router/__tests__/match-context.test.js +92 -0
  505. package/dist/router/__tests__/match-context.test.js.map +1 -0
  506. package/dist/router/__tests__/match-pipelines.test.d.ts +2 -0
  507. package/dist/router/__tests__/match-pipelines.test.d.ts.map +1 -0
  508. package/dist/router/__tests__/match-pipelines.test.js +417 -0
  509. package/dist/router/__tests__/match-pipelines.test.js.map +1 -0
  510. package/dist/router/__tests__/match-result.test.d.ts +2 -0
  511. package/dist/router/__tests__/match-result.test.d.ts.map +1 -0
  512. package/dist/router/__tests__/match-result.test.js +457 -0
  513. package/dist/router/__tests__/match-result.test.js.map +1 -0
  514. package/dist/router/__tests__/on-error.test.d.ts +2 -0
  515. package/dist/router/__tests__/on-error.test.d.ts.map +1 -0
  516. package/dist/router/__tests__/on-error.test.js +678 -0
  517. package/dist/router/__tests__/on-error.test.js.map +1 -0
  518. package/dist/router/__tests__/pattern-matching.test.d.ts +2 -0
  519. package/dist/router/__tests__/pattern-matching.test.d.ts.map +1 -0
  520. package/dist/router/__tests__/pattern-matching.test.js +629 -0
  521. package/dist/router/__tests__/pattern-matching.test.js.map +1 -0
  522. package/dist/router/__tests__/segment-resolution-parallel-loading.test.d.ts +2 -0
  523. package/dist/router/__tests__/segment-resolution-parallel-loading.test.d.ts.map +1 -0
  524. package/dist/router/__tests__/segment-resolution-parallel-loading.test.js +155 -0
  525. package/dist/router/__tests__/segment-resolution-parallel-loading.test.js.map +1 -0
  526. package/dist/router/error-handling.d.ts +77 -0
  527. package/dist/router/error-handling.d.ts.map +1 -0
  528. package/dist/router/error-handling.js +202 -0
  529. package/dist/router/error-handling.js.map +1 -0
  530. package/dist/router/handler-context.d.ts +20 -0
  531. package/dist/router/handler-context.d.ts.map +1 -0
  532. package/dist/router/handler-context.js +198 -0
  533. package/dist/router/handler-context.js.map +1 -0
  534. package/dist/router/intercept-resolution.d.ts +66 -0
  535. package/dist/router/intercept-resolution.d.ts.map +1 -0
  536. package/dist/router/intercept-resolution.js +246 -0
  537. package/dist/router/intercept-resolution.js.map +1 -0
  538. package/dist/router/loader-resolution.d.ts +64 -0
  539. package/dist/router/loader-resolution.d.ts.map +1 -0
  540. package/dist/router/loader-resolution.js +284 -0
  541. package/dist/router/loader-resolution.js.map +1 -0
  542. package/dist/router/logging.d.ts +15 -0
  543. package/dist/router/logging.d.ts.map +1 -0
  544. package/dist/router/logging.js +99 -0
  545. package/dist/router/logging.js.map +1 -0
  546. package/dist/router/manifest.d.ts +22 -0
  547. package/dist/router/manifest.d.ts.map +1 -0
  548. package/dist/router/manifest.js +181 -0
  549. package/dist/router/manifest.js.map +1 -0
  550. package/dist/router/match-api.d.ts +35 -0
  551. package/dist/router/match-api.d.ts.map +1 -0
  552. package/dist/router/match-api.js +406 -0
  553. package/dist/router/match-api.js.map +1 -0
  554. package/dist/router/match-context.d.ts +206 -0
  555. package/dist/router/match-context.d.ts.map +1 -0
  556. package/dist/router/match-context.js +17 -0
  557. package/dist/router/match-context.js.map +1 -0
  558. package/dist/router/match-middleware/background-revalidation.d.ts +127 -0
  559. package/dist/router/match-middleware/background-revalidation.d.ts.map +1 -0
  560. package/dist/router/match-middleware/background-revalidation.js +75 -0
  561. package/dist/router/match-middleware/background-revalidation.js.map +1 -0
  562. package/dist/router/match-middleware/cache-lookup.d.ts +112 -0
  563. package/dist/router/match-middleware/cache-lookup.d.ts.map +1 -0
  564. package/dist/router/match-middleware/cache-lookup.js +257 -0
  565. package/dist/router/match-middleware/cache-lookup.js.map +1 -0
  566. package/dist/router/match-middleware/cache-store.d.ts +113 -0
  567. package/dist/router/match-middleware/cache-store.d.ts.map +1 -0
  568. package/dist/router/match-middleware/cache-store.js +108 -0
  569. package/dist/router/match-middleware/cache-store.js.map +1 -0
  570. package/dist/router/match-middleware/index.d.ts +81 -0
  571. package/dist/router/match-middleware/index.d.ts.map +1 -0
  572. package/dist/router/match-middleware/index.js +80 -0
  573. package/dist/router/match-middleware/index.js.map +1 -0
  574. package/dist/router/match-middleware/intercept-resolution.d.ts +117 -0
  575. package/dist/router/match-middleware/intercept-resolution.d.ts.map +1 -0
  576. package/dist/router/match-middleware/intercept-resolution.js +134 -0
  577. package/dist/router/match-middleware/intercept-resolution.js.map +1 -0
  578. package/dist/router/match-middleware/segment-resolution.d.ts +99 -0
  579. package/dist/router/match-middleware/segment-resolution.d.ts.map +1 -0
  580. package/dist/router/match-middleware/segment-resolution.js +53 -0
  581. package/dist/router/match-middleware/segment-resolution.js.map +1 -0
  582. package/dist/router/match-pipelines.d.ts +147 -0
  583. package/dist/router/match-pipelines.d.ts.map +1 -0
  584. package/dist/router/match-pipelines.js +82 -0
  585. package/dist/router/match-pipelines.js.map +1 -0
  586. package/dist/router/match-result.d.ts +126 -0
  587. package/dist/router/match-result.d.ts.map +1 -0
  588. package/dist/router/match-result.js +93 -0
  589. package/dist/router/match-result.js.map +1 -0
  590. package/dist/router/metrics.d.ts +20 -0
  591. package/dist/router/metrics.d.ts.map +1 -0
  592. package/dist/router/metrics.js +47 -0
  593. package/dist/router/metrics.js.map +1 -0
  594. package/dist/router/middleware.d.ts +249 -0
  595. package/dist/router/middleware.d.ts.map +1 -0
  596. package/dist/router/middleware.js +434 -0
  597. package/dist/router/middleware.js.map +1 -0
  598. package/dist/router/middleware.test.d.ts +2 -0
  599. package/dist/router/middleware.test.d.ts.map +1 -0
  600. package/dist/router/middleware.test.js +816 -0
  601. package/dist/router/middleware.test.js.map +1 -0
  602. package/dist/router/pattern-matching.d.ts +149 -0
  603. package/dist/router/pattern-matching.d.ts.map +1 -0
  604. package/dist/router/pattern-matching.js +349 -0
  605. package/dist/router/pattern-matching.js.map +1 -0
  606. package/dist/router/revalidation.d.ts +44 -0
  607. package/dist/router/revalidation.d.ts.map +1 -0
  608. package/dist/router/revalidation.js +147 -0
  609. package/dist/router/revalidation.js.map +1 -0
  610. package/dist/router/router-context.d.ts +135 -0
  611. package/dist/router/router-context.d.ts.map +1 -0
  612. package/dist/router/router-context.js +36 -0
  613. package/dist/router/router-context.js.map +1 -0
  614. package/dist/router/segment-resolution.d.ts +127 -0
  615. package/dist/router/segment-resolution.d.ts.map +1 -0
  616. package/dist/router/segment-resolution.js +919 -0
  617. package/dist/router/segment-resolution.js.map +1 -0
  618. package/dist/router/trie-matching.d.ts +40 -0
  619. package/dist/router/trie-matching.d.ts.map +1 -0
  620. package/dist/router/trie-matching.js +127 -0
  621. package/dist/router/trie-matching.js.map +1 -0
  622. package/dist/router/types.d.ts +136 -0
  623. package/dist/router/types.d.ts.map +1 -0
  624. package/dist/router/types.js +7 -0
  625. package/dist/router/types.js.map +1 -0
  626. package/dist/router.d.ts +753 -0
  627. package/dist/router.d.ts.map +1 -0
  628. package/dist/router.gen.d.ts +6 -0
  629. package/dist/router.gen.d.ts.map +1 -0
  630. package/dist/router.gen.js +6 -0
  631. package/dist/router.gen.js.map +1 -0
  632. package/dist/router.js +1304 -0
  633. package/dist/router.js.map +1 -0
  634. package/dist/rsc/__tests__/helpers.test.d.ts +2 -0
  635. package/dist/rsc/__tests__/helpers.test.d.ts.map +1 -0
  636. package/dist/rsc/__tests__/helpers.test.js +140 -0
  637. package/dist/rsc/__tests__/helpers.test.js.map +1 -0
  638. package/dist/rsc/handler.d.ts +45 -0
  639. package/dist/rsc/handler.d.ts.map +1 -0
  640. package/dist/rsc/handler.js +1172 -0
  641. package/dist/rsc/handler.js.map +1 -0
  642. package/dist/rsc/helpers.d.ts +16 -0
  643. package/dist/rsc/helpers.d.ts.map +1 -0
  644. package/dist/rsc/helpers.js +55 -0
  645. package/dist/rsc/helpers.js.map +1 -0
  646. package/dist/rsc/index.d.ts +22 -0
  647. package/dist/rsc/index.d.ts.map +1 -0
  648. package/dist/rsc/index.js +23 -0
  649. package/dist/rsc/index.js.map +1 -0
  650. package/dist/rsc/nonce.d.ts +9 -0
  651. package/dist/rsc/nonce.d.ts.map +1 -0
  652. package/dist/rsc/nonce.js +18 -0
  653. package/dist/rsc/nonce.js.map +1 -0
  654. package/dist/rsc/types.d.ts +206 -0
  655. package/dist/rsc/types.d.ts.map +1 -0
  656. package/dist/rsc/types.js +8 -0
  657. package/dist/rsc/types.js.map +1 -0
  658. package/dist/search-params.d.ts +103 -0
  659. package/dist/search-params.d.ts.map +1 -0
  660. package/dist/search-params.js +74 -0
  661. package/dist/search-params.js.map +1 -0
  662. package/dist/segment-system.d.ts +75 -0
  663. package/dist/segment-system.d.ts.map +1 -0
  664. package/dist/segment-system.js +336 -0
  665. package/dist/segment-system.js.map +1 -0
  666. package/dist/server/context.d.ts +245 -0
  667. package/dist/server/context.d.ts.map +1 -0
  668. package/dist/server/context.js +197 -0
  669. package/dist/server/context.js.map +1 -0
  670. package/dist/server/fetchable-loader-store.d.ts +18 -0
  671. package/dist/server/fetchable-loader-store.d.ts.map +1 -0
  672. package/dist/server/fetchable-loader-store.js +18 -0
  673. package/dist/server/fetchable-loader-store.js.map +1 -0
  674. package/dist/server/handle-store.d.ts +85 -0
  675. package/dist/server/handle-store.d.ts.map +1 -0
  676. package/dist/server/handle-store.js +142 -0
  677. package/dist/server/handle-store.js.map +1 -0
  678. package/dist/server/loader-registry.d.ts +55 -0
  679. package/dist/server/loader-registry.d.ts.map +1 -0
  680. package/dist/server/loader-registry.js +132 -0
  681. package/dist/server/loader-registry.js.map +1 -0
  682. package/dist/server/request-context.d.ts +226 -0
  683. package/dist/server/request-context.d.ts.map +1 -0
  684. package/dist/server/request-context.js +290 -0
  685. package/dist/server/request-context.js.map +1 -0
  686. package/dist/server/root-layout.d.ts +4 -0
  687. package/dist/server/root-layout.d.ts.map +1 -0
  688. package/dist/server/root-layout.js +5 -0
  689. package/dist/server/root-layout.js.map +1 -0
  690. package/dist/server.d.ts +15 -0
  691. package/dist/server.d.ts.map +1 -0
  692. package/dist/server.js +20 -0
  693. package/dist/server.js.map +1 -0
  694. package/dist/ssr/__tests__/ssr-handler.test.d.ts +2 -0
  695. package/dist/ssr/__tests__/ssr-handler.test.d.ts.map +1 -0
  696. package/dist/ssr/__tests__/ssr-handler.test.js +132 -0
  697. package/dist/ssr/__tests__/ssr-handler.test.js.map +1 -0
  698. package/dist/ssr/index.d.ts +98 -0
  699. package/dist/ssr/index.d.ts.map +1 -0
  700. package/dist/ssr/index.js +158 -0
  701. package/dist/ssr/index.js.map +1 -0
  702. package/dist/static-handler.d.ts +50 -0
  703. package/dist/static-handler.d.ts.map +1 -0
  704. package/dist/static-handler.gen.d.ts +5 -0
  705. package/dist/static-handler.gen.d.ts.map +1 -0
  706. package/dist/static-handler.gen.js +5 -0
  707. package/dist/static-handler.gen.js.map +1 -0
  708. package/dist/static-handler.js +29 -0
  709. package/dist/static-handler.js.map +1 -0
  710. package/dist/theme/ThemeProvider.d.ts +20 -0
  711. package/dist/theme/ThemeProvider.d.ts.map +1 -0
  712. package/dist/theme/ThemeProvider.js +240 -0
  713. package/dist/theme/ThemeProvider.js.map +1 -0
  714. package/dist/theme/ThemeScript.d.ts +48 -0
  715. package/dist/theme/ThemeScript.d.ts.map +1 -0
  716. package/dist/theme/ThemeScript.js +13 -0
  717. package/dist/theme/ThemeScript.js.map +1 -0
  718. package/dist/theme/__tests__/theme.test.d.ts +2 -0
  719. package/dist/theme/__tests__/theme.test.d.ts.map +1 -0
  720. package/dist/theme/__tests__/theme.test.js +103 -0
  721. package/dist/theme/__tests__/theme.test.js.map +1 -0
  722. package/dist/theme/constants.d.ts +29 -0
  723. package/dist/theme/constants.d.ts.map +1 -0
  724. package/dist/theme/constants.js +48 -0
  725. package/dist/theme/constants.js.map +1 -0
  726. package/dist/theme/index.d.ts +31 -0
  727. package/dist/theme/index.d.ts.map +1 -0
  728. package/dist/theme/index.js +36 -0
  729. package/dist/theme/index.js.map +1 -0
  730. package/dist/theme/theme-context.d.ts +40 -0
  731. package/dist/theme/theme-context.d.ts.map +1 -0
  732. package/dist/theme/theme-context.js +60 -0
  733. package/dist/theme/theme-context.js.map +1 -0
  734. package/dist/theme/theme-script.d.ts +27 -0
  735. package/dist/theme/theme-script.d.ts.map +1 -0
  736. package/dist/theme/theme-script.js +147 -0
  737. package/dist/theme/theme-script.js.map +1 -0
  738. package/dist/theme/types.d.ts +163 -0
  739. package/dist/theme/types.d.ts.map +1 -0
  740. package/dist/theme/types.js +11 -0
  741. package/dist/theme/types.js.map +1 -0
  742. package/dist/theme/use-theme.d.ts +12 -0
  743. package/dist/theme/use-theme.d.ts.map +1 -0
  744. package/dist/theme/use-theme.js +40 -0
  745. package/dist/theme/use-theme.js.map +1 -0
  746. package/dist/types.d.ts +1479 -0
  747. package/dist/types.d.ts.map +1 -0
  748. package/dist/types.js +10 -0
  749. package/dist/types.js.map +1 -0
  750. package/dist/urls.d.ts +441 -0
  751. package/dist/urls.d.ts.map +1 -0
  752. package/dist/urls.gen.d.ts +8 -0
  753. package/dist/urls.gen.d.ts.map +1 -0
  754. package/dist/urls.gen.js +8 -0
  755. package/dist/urls.gen.js.map +1 -0
  756. package/dist/urls.js +443 -0
  757. package/dist/urls.js.map +1 -0
  758. package/dist/use-loader.d.ts +127 -0
  759. package/dist/use-loader.d.ts.map +1 -0
  760. package/dist/use-loader.js +237 -0
  761. package/dist/use-loader.js.map +1 -0
  762. package/dist/vite/__tests__/ast-handler-extract.test.d.ts +2 -0
  763. package/dist/vite/__tests__/ast-handler-extract.test.d.ts.map +1 -0
  764. package/dist/vite/__tests__/ast-handler-extract.test.js +294 -0
  765. package/dist/vite/__tests__/ast-handler-extract.test.js.map +1 -0
  766. package/dist/vite/__tests__/expose-id-utils.test.d.ts +2 -0
  767. package/dist/vite/__tests__/expose-id-utils.test.d.ts.map +1 -0
  768. package/dist/vite/__tests__/expose-id-utils.test.js +224 -0
  769. package/dist/vite/__tests__/expose-id-utils.test.js.map +1 -0
  770. package/dist/vite/__tests__/expose-internal-ids.test.d.ts +2 -0
  771. package/dist/vite/__tests__/expose-internal-ids.test.d.ts.map +1 -0
  772. package/dist/vite/__tests__/expose-internal-ids.test.js +647 -0
  773. package/dist/vite/__tests__/expose-internal-ids.test.js.map +1 -0
  774. package/dist/vite/__tests__/expose-router-id.test.d.ts +2 -0
  775. package/dist/vite/__tests__/expose-router-id.test.d.ts.map +1 -0
  776. package/dist/vite/__tests__/expose-router-id.test.js +39 -0
  777. package/dist/vite/__tests__/expose-router-id.test.js.map +1 -0
  778. package/dist/vite/ast-handler-extract.d.ts +49 -0
  779. package/dist/vite/ast-handler-extract.d.ts.map +1 -0
  780. package/dist/vite/ast-handler-extract.js +249 -0
  781. package/dist/vite/ast-handler-extract.js.map +1 -0
  782. package/dist/vite/expose-action-id.d.ts +19 -0
  783. package/dist/vite/expose-action-id.d.ts.map +1 -0
  784. package/dist/vite/expose-action-id.js +250 -0
  785. package/dist/vite/expose-action-id.js.map +1 -0
  786. package/dist/vite/expose-id-utils.d.ts +69 -0
  787. package/dist/vite/expose-id-utils.d.ts.map +1 -0
  788. package/dist/vite/expose-id-utils.js +289 -0
  789. package/dist/vite/expose-id-utils.js.map +1 -0
  790. package/dist/vite/expose-internal-ids.d.ts +22 -0
  791. package/dist/vite/expose-internal-ids.d.ts.map +1 -0
  792. package/dist/vite/expose-internal-ids.js +886 -0
  793. package/dist/vite/expose-internal-ids.js.map +1 -0
  794. package/dist/vite/index.d.ts +149 -0
  795. package/dist/vite/index.d.ts.map +1 -0
  796. package/dist/vite/index.js +361 -65
  797. package/dist/vite/index.js.bak +5448 -0
  798. package/dist/vite/index.js.map +1 -0
  799. package/dist/vite/index.named-routes.gen.ts +103 -0
  800. package/dist/vite/package-resolution.d.ts +43 -0
  801. package/dist/vite/package-resolution.d.ts.map +1 -0
  802. package/dist/vite/package-resolution.js +112 -0
  803. package/dist/vite/package-resolution.js.map +1 -0
  804. package/dist/vite/virtual-entries.d.ts +25 -0
  805. package/dist/vite/virtual-entries.d.ts.map +1 -0
  806. package/dist/vite/virtual-entries.js +110 -0
  807. package/dist/vite/virtual-entries.js.map +1 -0
  808. package/package.json +6 -1
  809. package/skills/breadcrumbs/SKILL.md +60 -0
  810. package/skills/observability/SKILL.md +12 -3
  811. package/skills/prerender/SKILL.md +30 -11
  812. package/skills/router-setup/SKILL.md +11 -3
  813. package/skills/server-actions/SKILL.md +25 -1
  814. package/skills/testing/SKILL.md +17 -17
  815. package/skills/testing/cache-prerender.md +29 -3
  816. package/skills/testing/flight.md +13 -10
  817. package/skills/testing/render-handler.md +3 -0
  818. package/skills/testing/server-tree.md +1 -1
  819. package/skills/testing/setup.md +1 -1
  820. package/src/browser/partial-update.ts +22 -1
  821. package/src/browser/react/use-router.ts +2 -1
  822. package/src/browser/rsc-router.tsx +8 -1
  823. package/src/browser/server-action-bridge.ts +51 -3
  824. package/src/browser/types.ts +23 -4
  825. package/src/browser/validate-redirect-origin.ts +43 -15
  826. package/src/build/index.ts +8 -9
  827. package/src/build/route-trie.ts +43 -11
  828. package/src/build/route-types/codegen.ts +12 -1
  829. package/src/cache/cache-runtime.ts +21 -0
  830. package/src/cache/cache-scope.ts +20 -0
  831. package/src/cache/document-cache.ts +10 -0
  832. package/src/cache/profile-registry.ts +6 -34
  833. package/src/client.rsc.tsx +3 -0
  834. package/src/client.tsx +5 -0
  835. package/src/cloudflare/index.ts +11 -0
  836. package/src/cloudflare/tracing.ts +109 -0
  837. package/src/context-var.ts +12 -0
  838. package/src/defer.ts +196 -0
  839. package/src/handles/breadcrumbs.ts +16 -5
  840. package/src/index.rsc.ts +26 -2
  841. package/src/index.ts +23 -1
  842. package/src/redirect-origin.ts +100 -0
  843. package/src/route-definition/dsl-helpers.ts +19 -0
  844. package/src/route-definition/redirect.ts +32 -8
  845. package/src/route-definition/resolve-handler-use.ts +6 -0
  846. package/src/router/find-match.ts +0 -1
  847. package/src/router/instrument.ts +230 -0
  848. package/src/router/loader-resolution.ts +37 -31
  849. package/src/router/match-middleware/cache-lookup.ts +104 -139
  850. package/src/router/match-middleware/cache-store.ts +12 -0
  851. package/src/router/match-middleware/segment-resolution.ts +0 -1
  852. package/src/router/middleware-types.ts +0 -1
  853. package/src/router/middleware.ts +94 -33
  854. package/src/router/pattern-matching.ts +4 -23
  855. package/src/router/prerender-match.ts +32 -8
  856. package/src/router/revalidation.ts +9 -4
  857. package/src/router/route-snapshot.ts +0 -1
  858. package/src/router/router-context.ts +2 -2
  859. package/src/router/router-interfaces.ts +18 -0
  860. package/src/router/router-options.ts +58 -4
  861. package/src/router/segment-resolution/fresh.ts +15 -18
  862. package/src/router/segment-resolution/helpers.ts +6 -0
  863. package/src/router/segment-resolution/loader-cache.ts +30 -10
  864. package/src/router/segment-resolution/revalidation.ts +194 -261
  865. package/src/router/segment-wrappers.ts +3 -5
  866. package/src/router/telemetry-otel.ts +161 -179
  867. package/src/router/tracing.ts +198 -0
  868. package/src/router/trie-matching.ts +3 -5
  869. package/src/router.ts +13 -9
  870. package/src/rsc/handler-context.ts +1 -0
  871. package/src/rsc/handler.ts +135 -130
  872. package/src/rsc/helpers.ts +56 -3
  873. package/src/rsc/json-route-result.ts +38 -0
  874. package/src/rsc/loader-fetch.ts +7 -1
  875. package/src/rsc/origin-guard.ts +10 -4
  876. package/src/rsc/progressive-enhancement.ts +17 -2
  877. package/src/rsc/redirect-guard.ts +99 -0
  878. package/src/rsc/response-route-handler.ts +23 -18
  879. package/src/rsc/rsc-rendering.ts +38 -14
  880. package/src/rsc/server-action.ts +32 -8
  881. package/src/rsc/types.ts +6 -2
  882. package/src/segment-system.tsx +4 -1
  883. package/src/server/request-context.ts +35 -18
  884. package/src/testing/cache-status.ts +44 -1
  885. package/src/testing/dispatch.ts +43 -6
  886. package/src/testing/e2e/index.ts +1 -0
  887. package/src/testing/flight.ts +48 -2
  888. package/src/testing/index.ts +1 -0
  889. package/src/testing/render-handler.ts +31 -12
  890. package/src/testing/render-route.tsx +75 -13
  891. package/src/types/handler-context.ts +28 -1
  892. package/src/vite/discovery/discover-routers.ts +22 -11
  893. package/src/vite/discovery/prerender-collection.ts +28 -41
  894. package/src/vite/discovery/state.ts +11 -0
  895. package/src/vite/plugin-types.ts +56 -7
  896. package/src/vite/plugins/expose-ids/router-transform.ts +10 -0
  897. package/src/vite/plugins/refresh-cmd.ts +1 -1
  898. package/src/vite/plugins/use-cache-transform.ts +21 -10
  899. package/src/vite/rango.ts +2 -0
  900. package/src/vite/router-discovery.ts +16 -3
  901. package/src/vite/utils/prerender-utils.ts +36 -0
  902. package/src/router/middleware-cookies.ts +0 -42
@@ -1,20 +1,48 @@
1
1
  /**
2
- * OpenTelemetry Adapter for Router Telemetry
2
+ * OpenTelemetry adapters for the router.
3
3
  *
4
- * Maps internal TelemetrySink events to OTel spans. The core router
5
- * remains OTel-agnostic — this adapter bridges the gap by accepting
6
- * a standard OTel Tracer and producing spans/events from it.
4
+ * Two adapters, two surfaces matching the split in instrument.ts:
5
+ *
6
+ * - createOTelTracing(tracer): the OTel adapter for the `tracing` SLOT — the
7
+ * canonical phase-span layer. It bridges observePhase's callback boundary
8
+ * onto OTel's callback-bound `startActiveSpan`, so the router's phase spans
9
+ * (rango.request/middleware/loader/render/ssr) nest by async context and the
10
+ * loader's own OTel spans (db/fetch) land under rango.loader. This is the
11
+ * OTel equivalent of createCloudflareTracing — pass it to
12
+ * `createRouter({ tracing })`.
13
+ *
14
+ * - createOTelSink(tracer): the OTel adapter for the `telemetry` SLOT — a
15
+ * TelemetrySink for the EVENT-shaped facts (handler errors, cache decisions,
16
+ * revalidation decisions, timeouts, origin rejections). It emits one instant
17
+ * OTel span per fact. It deliberately does NOT emit request/loader phase
18
+ * spans: those are owned by the tracing slot (createOTelTracing) so the two
19
+ * layers don't produce duplicate rango.request / rango.loader spans.
20
+ *
21
+ * The core router stays OTel-agnostic — these adapters accept a standard OTel
22
+ * Tracer (structurally typed, no import needed) and bridge the gap.
7
23
  *
8
24
  * Usage:
9
25
  * import { trace } from "@opentelemetry/api";
10
- * import { createOTelSink } from "@rangojs/router";
26
+ * import { createRouter, createOTelTracing, createOTelSink } from "@rangojs/router";
11
27
  *
28
+ * const tracer = trace.getTracer("my-app");
12
29
  * const router = createRouter({
13
- * telemetry: createOTelSink(trace.getTracer("my-app")),
30
+ * tracing: createOTelTracing(tracer), // phase spans (callback-bound)
31
+ * telemetry: createOTelSink(tracer), // discrete-fact instant spans
14
32
  * });
33
+ *
34
+ * Faithful nesting requires an OTel async context manager
35
+ * (AsyncLocalStorageContextManager) configured in your OTel setup — standard for
36
+ * any startActiveSpan-based instrumentation.
15
37
  */
16
38
 
17
39
  import type { TelemetrySink, TelemetryEvent } from "./telemetry.js";
40
+ import { runThenSettle } from "./tracing.js";
41
+ import type {
42
+ RouterTracingConfig,
43
+ SpanRunner,
44
+ TracePhaseToggles,
45
+ } from "./tracing.js";
18
46
 
19
47
  // ---------------------------------------------------------------------------
20
48
  // Minimal OTel-compatible types (structurally typed, no import needed)
@@ -22,21 +50,21 @@ import type { TelemetrySink, TelemetryEvent } from "./telemetry.js";
22
50
 
23
51
  /**
24
52
  * Minimal Span interface compatible with @opentelemetry/api Span.
25
- * Only the methods used by the adapter are declared.
53
+ * Only the methods used by the adapters are declared.
26
54
  */
27
55
  export interface OTelSpan {
28
56
  setAttribute(key: string, value: string | number | boolean): OTelSpan | void;
29
- addEvent(
30
- name: string,
31
- attributes?: Record<string, string | number | boolean>,
32
- ): OTelSpan | void;
33
57
  setStatus(status: { code: number; message?: string }): OTelSpan | void;
34
58
  recordException(exception: Error): void;
35
59
  end(): void;
36
60
  }
37
61
 
38
62
  /**
39
- * Minimal Tracer interface compatible with @opentelemetry/api Tracer.
63
+ * Minimal Tracer interface for the EVENT sink (createOTelSink): only `startSpan`
64
+ * is used (one instant span per discrete fact). Kept narrow so a custom,
65
+ * event-only tracer that does not implement `startActiveSpan` still satisfies it.
66
+ * The real `@opentelemetry/api` Tracer has both methods, so it satisfies this and
67
+ * `OTelActiveSpanTracer` below.
40
68
  */
41
69
  export interface OTelTracer {
42
70
  startSpan(
@@ -47,182 +75,110 @@ export interface OTelTracer {
47
75
  ): OTelSpan;
48
76
  }
49
77
 
78
+ /**
79
+ * Minimal Tracer interface for the PHASE-SPAN adapter (createOTelTracing): only
80
+ * `startActiveSpan` is used (callback-bound, so the span is active for the work
81
+ * and child spans nest). Declared separately from `OTelTracer` so each factory
82
+ * requires exactly the method it calls.
83
+ */
84
+ export interface OTelActiveSpanTracer {
85
+ startActiveSpan<T>(name: string, fn: (span: OTelSpan) => T): T;
86
+ }
87
+
50
88
  // OTel SpanStatusCode constants (mirrors @opentelemetry/api values)
51
- const STATUS_OK = 1;
52
89
  const STATUS_ERROR = 2;
53
90
 
54
91
  // ---------------------------------------------------------------------------
55
- // Span correlation helpers
92
+ // Tracing adapter: phase spans via startActiveSpan (the `tracing` slot)
56
93
  // ---------------------------------------------------------------------------
57
94
 
58
- // Build correlation keys using requestId.
59
- // getRequestId() always returns a value (generated internally when no
60
- // header is present), so concurrent requests to the same path each get
61
- // their own correlation key and never mis-correlate.
62
-
63
- function requestKey(event: {
64
- requestId?: string;
65
- pathname: string;
66
- transaction: string;
67
- }): string {
68
- return `${event.requestId ?? ""}:${event.pathname}:${event.transaction}`;
69
- }
70
-
71
- function loaderKey(event: {
72
- requestId?: string;
73
- segmentId: string;
74
- loaderName: string;
75
- pathname: string;
76
- }): string {
77
- return `${event.requestId ?? ""}:${event.segmentId}:${event.loaderName}:${event.pathname}`;
95
+ /** Options for createOTelTracing. */
96
+ export interface OTelTracingOptions {
97
+ /** Master switch. Defaults to true. */
98
+ enabled?: boolean;
99
+ /** Per-phase span toggles. Omitted phases default to enabled. */
100
+ spans?: TracePhaseToggles;
78
101
  }
79
102
 
80
- function pushSpan(
81
- map: Map<string, OTelSpan[]>,
82
- key: string,
83
- span: OTelSpan,
84
- ): void {
85
- let stack = map.get(key);
86
- if (!stack) {
87
- stack = [];
88
- map.set(key, stack);
89
- }
90
- stack.push(span);
91
- }
103
+ /**
104
+ * Create the tracing config that maps the router's phases onto OTel spans via
105
+ * `tracer.startActiveSpan`, which runs the work inside the span's active context
106
+ * (so child spans nest) and returns the work's value unchanged. The span ends
107
+ * when that value — or, for async work, the returned promise — settles, matching
108
+ * observePhase's contract. When the work throws or rejects, the exception is
109
+ * recorded and the span status is set to ERROR before it ends, so a failed phase
110
+ * stays visible in the trace (the old createOTelSink error path is preserved here
111
+ * now that phase spans live in this adapter). Pass the result to
112
+ * `createRouter({ tracing })`.
113
+ *
114
+ * @see createCloudflareTracing (`@rangojs/router/cloudflare`) for the same slot
115
+ * using Cloudflare Workers native custom spans.
116
+ */
117
+ export function createOTelTracing(
118
+ tracer: OTelActiveSpanTracer,
119
+ options: OTelTracingOptions = {},
120
+ ): RouterTracingConfig {
121
+ const runner: SpanRunner = <T>(name: string, fn: (span: OTelSpan) => T): T =>
122
+ tracer.startActiveSpan(
123
+ name,
124
+ (span): T =>
125
+ runThenSettle(
126
+ () => fn(span),
127
+ (error) => {
128
+ // On failure record the exception + ERROR status before ending, so a
129
+ // failed phase stays visible in the trace.
130
+ if (error !== undefined) {
131
+ if (error instanceof Error) {
132
+ span.recordException(error);
133
+ span.setStatus({ code: STATUS_ERROR, message: error.message });
134
+ } else {
135
+ span.setStatus({ code: STATUS_ERROR });
136
+ }
137
+ }
138
+ span.end();
139
+ },
140
+ ),
141
+ );
92
142
 
93
- function popSpan(
94
- map: Map<string, OTelSpan[]>,
95
- key: string,
96
- ): OTelSpan | undefined {
97
- const stack = map.get(key);
98
- if (!stack || stack.length === 0) return undefined;
99
- const span = stack.pop()!;
100
- if (stack.length === 0) map.delete(key);
101
- return span;
143
+ return {
144
+ runner,
145
+ enabled: options.enabled ?? true,
146
+ spans: options.spans,
147
+ };
102
148
  }
103
149
 
104
150
  // ---------------------------------------------------------------------------
105
- // Adapter factory
151
+ // Telemetry sink: discrete-fact instant spans (the `telemetry` slot)
106
152
  // ---------------------------------------------------------------------------
107
153
 
108
154
  /**
109
- * Create a TelemetrySink that maps router lifecycle events to OTel spans.
155
+ * Create a TelemetrySink that maps the router's discrete-fact events to instant
156
+ * OTel spans. One span per fact; no duration spans.
157
+ *
158
+ * Fact mapping:
159
+ * - handler.error -> "rango.handler.error" (error)
160
+ * - cache.decision -> "rango.cache.decision"
161
+ * - revalidation.decision -> "rango.revalidation.decision"
162
+ * - request.timeout -> "rango.request.timeout" (error)
163
+ * - request.origin-rejected -> "rango.request.origin-rejected" (error)
110
164
  *
111
- * Span mapping:
112
- * - request.start / request.end / request.error → "rango.request" span
113
- * - loader.start / loader.end / loader.error → "rango.loader" span
114
- * - handler.error → "rango.handler.error" instant span
115
- * - cache.decision → "rango.cache.decision" instant span
116
- * - revalidation.decision → "rango.revalidation.decision" instant span
165
+ * Request and loader PHASE spans are intentionally NOT emitted here — they are
166
+ * owned by the tracing slot (createOTelTracing) so the two layers cannot produce
167
+ * duplicate rango.request / rango.loader spans. request.start/end and
168
+ * loader.start/end events are no-ops for this sink.
117
169
  *
118
170
  * Attributes use the `rango.*` namespace for router-specific data and
119
171
  * `http.method` / `http.route` for HTTP semantics.
120
172
  */
121
173
  export function createOTelSink(tracer: OTelTracer): TelemetrySink {
122
- const requestSpans = new Map<string, OTelSpan[]>();
123
- const loaderSpans = new Map<string, OTelSpan[]>();
174
+ const instant = (
175
+ name: string,
176
+ attributes: Record<string, string | number | boolean>,
177
+ ): OTelSpan => tracer.startSpan(name, { attributes });
124
178
 
125
179
  return {
126
180
  emit(event: TelemetryEvent): void {
127
181
  switch (event.type) {
128
- case "request.start": {
129
- const span = tracer.startSpan("rango.request", {
130
- attributes: {
131
- "http.method": event.method,
132
- "http.route": event.pathname,
133
- "rango.transaction": event.transaction,
134
- "rango.is_partial": event.isPartial,
135
- },
136
- });
137
- pushSpan(requestSpans, requestKey(event), span);
138
- break;
139
- }
140
-
141
- case "request.end": {
142
- const span = popSpan(requestSpans, requestKey(event));
143
- if (span) {
144
- span.setAttribute("rango.duration_ms", event.durationMs);
145
- span.setAttribute("rango.segment_count", event.segmentCount);
146
- span.setAttribute("rango.cache.hit", event.cacheHit);
147
- span.setStatus({ code: STATUS_OK });
148
- span.end();
149
- }
150
- break;
151
- }
152
-
153
- case "request.error": {
154
- const span = popSpan(requestSpans, requestKey(event));
155
- if (span) {
156
- span.setAttribute("rango.duration_ms", event.durationMs);
157
- span.setAttribute("rango.phase", event.phase);
158
- span.recordException(event.error);
159
- span.setStatus({
160
- code: STATUS_ERROR,
161
- message: event.error.message,
162
- });
163
- span.end();
164
- }
165
- break;
166
- }
167
-
168
- case "loader.start": {
169
- const span = tracer.startSpan("rango.loader", {
170
- attributes: {
171
- "rango.segment_id": event.segmentId,
172
- "rango.loader_name": event.loaderName,
173
- "http.route": event.pathname,
174
- },
175
- });
176
- pushSpan(loaderSpans, loaderKey(event), span);
177
- break;
178
- }
179
-
180
- case "loader.end": {
181
- const key = loaderKey(event);
182
- const span = popSpan(loaderSpans, key);
183
- if (span) {
184
- span.setAttribute("rango.duration_ms", event.durationMs);
185
- span.setAttribute("rango.loader.ok", event.ok);
186
- span.setStatus({ code: event.ok ? STATUS_OK : STATUS_ERROR });
187
- span.end();
188
- }
189
- break;
190
- }
191
-
192
- case "loader.error": {
193
- const key = loaderKey(event);
194
- const span = popSpan(loaderSpans, key);
195
- if (span) {
196
- span.setAttribute(
197
- "rango.handled_by_boundary",
198
- event.handledByBoundary,
199
- );
200
- span.recordException(event.error);
201
- span.setStatus({
202
- code: STATUS_ERROR,
203
- message: event.error.message,
204
- });
205
- span.end();
206
- } else {
207
- // No matching start — create a standalone error span
208
- const errorSpan = tracer.startSpan("rango.loader", {
209
- attributes: {
210
- "rango.segment_id": event.segmentId,
211
- "rango.loader_name": event.loaderName,
212
- "http.route": event.pathname,
213
- "rango.handled_by_boundary": event.handledByBoundary,
214
- },
215
- });
216
- errorSpan.recordException(event.error);
217
- errorSpan.setStatus({
218
- code: STATUS_ERROR,
219
- message: event.error.message,
220
- });
221
- errorSpan.end();
222
- }
223
- break;
224
- }
225
-
226
182
  case "handler.error": {
227
183
  const attrs: Record<string, string | number | boolean> = {
228
184
  "rango.handled_by_boundary": event.handledByBoundary,
@@ -232,13 +188,10 @@ export function createOTelSink(tracer: OTelTracer): TelemetrySink {
232
188
  attrs["rango.segment_type"] = event.segmentType;
233
189
  if (event.pathname) attrs["http.route"] = event.pathname;
234
190
  if (event.routeKey) attrs["rango.route_key"] = event.routeKey;
235
- if (event.params) {
191
+ if (event.params)
236
192
  attrs["rango.params"] = JSON.stringify(event.params);
237
- }
238
193
 
239
- const span = tracer.startSpan("rango.handler.error", {
240
- attributes: attrs,
241
- });
194
+ const span = instant("rango.handler.error", attrs);
242
195
  span.recordException(event.error);
243
196
  span.setStatus({ code: STATUS_ERROR, message: event.error.message });
244
197
  span.end();
@@ -253,26 +206,55 @@ export function createOTelSink(tracer: OTelTracer): TelemetrySink {
253
206
  "rango.cache.should_revalidate": event.shouldRevalidate,
254
207
  };
255
208
  if (event.source) attrs["rango.cache.source"] = event.source;
209
+ instant("rango.cache.decision", attrs).end();
210
+ break;
211
+ }
256
212
 
257
- const span = tracer.startSpan("rango.cache.decision", {
258
- attributes: attrs,
213
+ case "revalidation.decision": {
214
+ instant("rango.revalidation.decision", {
215
+ "rango.segment_id": event.segmentId,
216
+ "http.route": event.pathname,
217
+ "rango.route_key": event.routeKey,
218
+ "rango.revalidate": event.shouldRevalidate,
219
+ }).end();
220
+ break;
221
+ }
222
+
223
+ case "request.timeout": {
224
+ const attrs: Record<string, string | number | boolean> = {
225
+ "rango.phase": event.phase,
226
+ "http.route": event.pathname,
227
+ "rango.duration_ms": event.durationMs,
228
+ "rango.timeout.custom_handler": event.customHandler,
229
+ };
230
+ if (event.routeKey) attrs["rango.route_key"] = event.routeKey;
231
+ if (event.actionId) attrs["rango.action_id"] = event.actionId;
232
+ const span = instant("rango.request.timeout", attrs);
233
+ span.setStatus({
234
+ code: STATUS_ERROR,
235
+ message: `timeout: ${event.phase}`,
259
236
  });
260
237
  span.end();
261
238
  break;
262
239
  }
263
240
 
264
- case "revalidation.decision": {
265
- const span = tracer.startSpan("rango.revalidation.decision", {
266
- attributes: {
267
- "rango.segment_id": event.segmentId,
268
- "http.route": event.pathname,
269
- "rango.route_key": event.routeKey,
270
- "rango.revalidate": event.shouldRevalidate,
271
- },
272
- });
241
+ case "request.origin-rejected": {
242
+ const attrs: Record<string, string | number | boolean> = {
243
+ "http.method": event.method,
244
+ "http.route": event.pathname,
245
+ "rango.phase": event.phase,
246
+ };
247
+ if (event.origin) attrs["rango.origin"] = event.origin;
248
+ if (event.host) attrs["http.host"] = event.host;
249
+ const span = instant("rango.request.origin-rejected", attrs);
250
+ span.setStatus({ code: STATUS_ERROR, message: "origin rejected" });
273
251
  span.end();
274
252
  break;
275
253
  }
254
+
255
+ // request.start/end/error and loader.start/end/error are phase events;
256
+ // their spans are owned by the tracing slot (createOTelTracing), so this
257
+ // sink ignores them to avoid duplicate rango.request / rango.loader spans.
276
258
  }
277
259
  },
278
260
  };
@@ -0,0 +1,198 @@
1
+ /**
2
+ * Span tracing hook (platform-agnostic).
3
+ *
4
+ * The core router emits its existing performance phases (request, middleware, action,
5
+ * loaders, render, ssr) as spans by calling traceSpan() at a small set of
6
+ * execution boundaries. When no tracing is configured the call is a direct
7
+ * pass-through: fn is invoked with a no-op span, with no wrapper and no
8
+ * allocation, so a non-traced request behaves exactly as before.
9
+ *
10
+ * A platform integration supplies a SpanRunner that wraps fn in a real span.
11
+ * Two runners ship: the Cloudflare one (createCloudflareTracing in
12
+ * src/cloudflare/tracing.ts), which bridges onto executionContext.tracing.
13
+ * enterSpan, and the OTel one (createOTelTracing in router/telemetry-otel.ts),
14
+ * which bridges onto tracer.startActiveSpan. Both wrap the actual work — not a
15
+ * post-hoc event — so spans nest by async context and the platform's automatic
16
+ * spans (KV/D1/fetch) nest under the right phase.
17
+ *
18
+ * traceSpan() below is the low-level wrap primitive. It is INTERNAL: the only
19
+ * caller is observePhase() (instrument.ts), the single phase-instrumentation
20
+ * API, which co-emits the span AND the debugPerformance perf metric from one
21
+ * wrap site (or just the span, for metric:false phases) so the two surfaces
22
+ * can't drift. Every router phase routes through observePhase via the PHASES
23
+ * registry; do not call traceSpan directly from new code.
24
+ *
25
+ * Phase coverage (all via observePhase): rango.request (span-only; handler:total
26
+ * metered directly), rango.middleware (span-only incl. intercept middleware;
27
+ * pre/post metered directly), rango.action (action:<id>; server-action
28
+ * execution, JS + no-JS/PE), rango.loader (loader:<id>; single metering site at
29
+ * useLoader, plus the fetchable path), rango.render (render:total:<route>; normal AND
30
+ * action-revalidation renders), rango.ssr (ssr:render-html).
31
+ *
32
+ * Span-duration caveat: a span ends when its callback's value (or promise)
33
+ * settles. For the streaming phases (request/render/ssr) that is when the
34
+ * Response / HTML / RSC stream is constructed, NOT when the body finishes
35
+ * draining. Loader/Suspense work that settles during stream drain extends past
36
+ * the parent span's end, so parent durations under-report streamed time and a
37
+ * rango.loader child can end after its parent. This is the streaming + end-on-
38
+ * settle contract, not a defect; phase spans bound setup-to-stream-handoff.
39
+ *
40
+ * Both shipped runners (Cloudflare, OTel) keep the core agnostic: the
41
+ * platform-specific bridge lives at the edge behind the SpanRunner contract.
42
+ */
43
+
44
+ /**
45
+ * Minimal span handle passed to traced work. Structurally compatible with both
46
+ * Cloudflare's `Span` and OTel's `Span` (only setAttribute is used here).
47
+ */
48
+ export interface TraceSpan {
49
+ setAttribute(key: string, value: string | number | boolean): void;
50
+ }
51
+
52
+ /**
53
+ * Wraps a unit of work in a span. A runner MUST invoke fn exactly once, pass it
54
+ * a span, return fn's result unchanged, and propagate thrown errors / rejected
55
+ * promises unchanged. When fn returns a promise the span ends once it settles.
56
+ */
57
+ export type SpanRunner = <T>(name: string, fn: (span: TraceSpan) => T) => T;
58
+
59
+ /** The router phases that can be wrapped in a span. */
60
+ export type TracePhase =
61
+ | "request"
62
+ | "middleware"
63
+ | "action"
64
+ | "loader"
65
+ | "render"
66
+ | "ssr";
67
+
68
+ /** Per-phase span toggles. Omitted phases default to enabled. */
69
+ export interface TracePhaseToggles {
70
+ request?: boolean;
71
+ middleware?: boolean;
72
+ action?: boolean;
73
+ loader?: boolean;
74
+ render?: boolean;
75
+ ssr?: boolean;
76
+ }
77
+
78
+ /**
79
+ * Value passed to `createRouter({ tracing })`. Produced by a platform factory
80
+ * such as `createCloudflareTracing()`.
81
+ */
82
+ export interface RouterTracingConfig {
83
+ /** Platform span runner. */
84
+ runner: SpanRunner;
85
+ /** Master switch. Defaults to true when a config object is provided. */
86
+ enabled?: boolean;
87
+ /** Per-phase span toggles. */
88
+ spans?: TracePhaseToggles;
89
+ }
90
+
91
+ /**
92
+ * Resolved tracing state stored on the router/request context. `undefined`
93
+ * means tracing is fully disabled and every traceSpan() call is a pass-through.
94
+ */
95
+ export interface ResolvedTracing {
96
+ runner: SpanRunner;
97
+ phases: Record<TracePhase, boolean>;
98
+ }
99
+
100
+ /** Shared no-op span. setAttribute is a no-op so disabled call sites stay free. */
101
+ export const NOOP_TRACE_SPAN: TraceSpan = {
102
+ setAttribute() {},
103
+ };
104
+
105
+ const ALL_PHASES_ON: Record<TracePhase, boolean> = {
106
+ request: true,
107
+ middleware: true,
108
+ action: true,
109
+ loader: true,
110
+ render: true,
111
+ ssr: true,
112
+ };
113
+
114
+ /**
115
+ * Resolve a user-supplied tracing config into the fast internal form, or
116
+ * `undefined` when tracing is off (no config, `enabled: false`, or no runner).
117
+ */
118
+ export function resolveTracing(
119
+ config: RouterTracingConfig | undefined,
120
+ ): ResolvedTracing | undefined {
121
+ if (
122
+ !config ||
123
+ config.enabled === false ||
124
+ typeof config.runner !== "function"
125
+ ) {
126
+ return undefined;
127
+ }
128
+ const spans = config.spans;
129
+ return {
130
+ runner: config.runner,
131
+ phases: spans
132
+ ? {
133
+ request: spans.request ?? true,
134
+ middleware: spans.middleware ?? true,
135
+ action: spans.action ?? true,
136
+ loader: spans.loader ?? true,
137
+ render: spans.render ?? true,
138
+ ssr: spans.ssr ?? true,
139
+ }
140
+ : ALL_PHASES_ON,
141
+ };
142
+ }
143
+
144
+ /**
145
+ * Wrap `fn` in a span for `phase`. When tracing is off (or the phase is
146
+ * disabled) fn runs directly with a no-op span — identical to the untraced
147
+ * path. Otherwise the platform runner wraps fn so the span covers the real
148
+ * work and nests by async context.
149
+ */
150
+ export function traceSpan<T>(
151
+ tracing: ResolvedTracing | undefined,
152
+ phase: TracePhase,
153
+ name: string,
154
+ fn: (span: TraceSpan) => T,
155
+ ): T {
156
+ if (tracing === undefined || tracing.phases[phase] === false) {
157
+ return fn(NOOP_TRACE_SPAN);
158
+ }
159
+ return tracing.runner(name, fn);
160
+ }
161
+
162
+ /**
163
+ * Run `fn` once and invoke `onSettle` exactly once when it terminates — on a
164
+ * synchronous return, a synchronous throw, an async resolution, or an async
165
+ * rejection. `onSettle` receives the error (or `undefined` on success). fn's
166
+ * value is returned and errors propagate unchanged.
167
+ *
168
+ * Centralizes the run-once-then-settle control flow shared by the two span
169
+ * surfaces: observePhase records the perf metric on settle, and the OTel runner
170
+ * ends (or error-marks) the span on settle. The Cloudflare runner delegates
171
+ * settling to enterSpan, so it does not use this.
172
+ */
173
+ export function runThenSettle<T>(
174
+ fn: () => T,
175
+ onSettle: (error: unknown) => void,
176
+ ): T {
177
+ let out: T;
178
+ try {
179
+ out = fn();
180
+ } catch (error) {
181
+ onSettle(error);
182
+ throw error;
183
+ }
184
+ if (out instanceof Promise) {
185
+ return out.then(
186
+ (value) => {
187
+ onSettle(undefined);
188
+ return value;
189
+ },
190
+ (error) => {
191
+ onSettle(error);
192
+ throw error;
193
+ },
194
+ ) as unknown as T;
195
+ }
196
+ onSettle(undefined);
197
+ return out;
198
+ }
@@ -15,10 +15,6 @@ export interface TrieMatchResult {
15
15
  sp: string;
16
16
  /** Matched route params */
17
17
  params: Record<string, string>;
18
- /** Optional param names declared on the route. Absent params are omitted
19
- * from `params` (read as `undefined`), matching the
20
- * `ExtractParams<"/:locale?/...">` type. */
21
- optionalParams?: string[];
22
18
  /** Redirect target if trailing slash requires it */
23
19
  redirectTo?: string;
24
20
  /** Route has pre-rendered data available */
@@ -182,6 +178,9 @@ function walkTrie(
182
178
  }
183
179
 
184
180
  if (node.xp) {
181
+ // node.xp keys are pre-sorted longest-suffix-first at build time
182
+ // (route-trie.ts sortSuffixParams), so the first match is the most specific
183
+ // suffix: `/app.min.js` matches `:file.min.js` before `:file.js`.
185
184
  for (const suffix in node.xp) {
186
185
  if (segment.endsWith(suffix) && segment.length > suffix.length) {
187
186
  const paramValue = segment.slice(0, -suffix.length);
@@ -274,7 +273,6 @@ function validateAndBuild(
274
273
  params,
275
274
  };
276
275
 
277
- if (leaf.op) result.optionalParams = leaf.op;
278
276
  if (redirectTo) result.redirectTo = redirectTo;
279
277
  if (leaf.pr) result.pr = true;
280
278
  if (leaf.pt) result.pt = true;