@timber-js/app 0.2.0-alpha.11 → 0.2.0-alpha.111

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 (755) hide show
  1. package/dist/_chunks/actions-ILhDUzES.js +1094 -0
  2. package/dist/_chunks/actions-ILhDUzES.js.map +1 -0
  3. package/dist/_chunks/build-output-helper-DhxiT18k.js +61 -0
  4. package/dist/_chunks/build-output-helper-DhxiT18k.js.map +1 -0
  5. package/dist/_chunks/cli-schema-sync-BvvuK8Rp.js +137 -0
  6. package/dist/_chunks/cli-schema-sync-BvvuK8Rp.js.map +1 -0
  7. package/dist/_chunks/cli-schema-sync-i2OEL2-p.js +2 -0
  8. package/dist/_chunks/codec-registry-V7ARyeLN.js +21 -0
  9. package/dist/_chunks/codec-registry-V7ARyeLN.js.map +1 -0
  10. package/dist/_chunks/define-8zQ8Vm7x.js +195 -0
  11. package/dist/_chunks/define-8zQ8Vm7x.js.map +1 -0
  12. package/dist/_chunks/define-a0CCE6Nx.js +124 -0
  13. package/dist/_chunks/define-a0CCE6Nx.js.map +1 -0
  14. package/dist/_chunks/format-CR6v1pWE.js +14 -0
  15. package/dist/_chunks/format-CR6v1pWE.js.map +1 -0
  16. package/dist/_chunks/handler-store-iqnt2ghN.js +54 -0
  17. package/dist/_chunks/handler-store-iqnt2ghN.js.map +1 -0
  18. package/dist/_chunks/logger-DDmK5skc.js +291 -0
  19. package/dist/_chunks/logger-DDmK5skc.js.map +1 -0
  20. package/dist/_chunks/merge-search-params-CwxJzBLS.js +41 -0
  21. package/dist/_chunks/merge-search-params-CwxJzBLS.js.map +1 -0
  22. package/dist/_chunks/navigation-root-CY3pRMxF.js +96 -0
  23. package/dist/_chunks/navigation-root-CY3pRMxF.js.map +1 -0
  24. package/dist/_chunks/registry-Dp_hJL4s.js +20 -0
  25. package/dist/_chunks/registry-Dp_hJL4s.js.map +1 -0
  26. package/dist/_chunks/resolve-schema-DO8B0mO9.js +65 -0
  27. package/dist/_chunks/resolve-schema-DO8B0mO9.js.map +1 -0
  28. package/dist/_chunks/router-ref-sektkr-t.js +28 -0
  29. package/dist/_chunks/router-ref-sektkr-t.js.map +1 -0
  30. package/dist/_chunks/scanner-DmfoB7iK.js +336 -0
  31. package/dist/_chunks/scanner-DmfoB7iK.js.map +1 -0
  32. package/dist/_chunks/schema-bridge-eL5vQDSA.js +86 -0
  33. package/dist/_chunks/schema-bridge-eL5vQDSA.js.map +1 -0
  34. package/dist/_chunks/segment-classify-CnfLLvir.js +137 -0
  35. package/dist/_chunks/segment-classify-CnfLLvir.js.map +1 -0
  36. package/dist/_chunks/segment-context-EsfQpS--.js +34 -0
  37. package/dist/_chunks/segment-context-EsfQpS--.js.map +1 -0
  38. package/dist/_chunks/{ssr-data-MjmprTmO.js → ssr-data-BO5OvEvg.js} +1 -1
  39. package/dist/_chunks/ssr-data-BO5OvEvg.js.map +1 -0
  40. package/dist/_chunks/stale-reload-BCPRG0Cv.js +64 -0
  41. package/dist/_chunks/stale-reload-BCPRG0Cv.js.map +1 -0
  42. package/dist/_chunks/tracing-DvKLzCFa.js +329 -0
  43. package/dist/_chunks/tracing-DvKLzCFa.js.map +1 -0
  44. package/dist/_chunks/{use-query-states-D5KaffOK.js → use-query-states-D9SBlAfp.js} +7 -20
  45. package/dist/_chunks/use-query-states-D9SBlAfp.js.map +1 -0
  46. package/dist/_chunks/use-segment-params-BSt_O2cb.js +185 -0
  47. package/dist/_chunks/use-segment-params-BSt_O2cb.js.map +1 -0
  48. package/dist/_chunks/validation-Bm3Je-09.js +84 -0
  49. package/dist/_chunks/validation-Bm3Je-09.js.map +1 -0
  50. package/dist/_chunks/walkers-DGTmJT0f.js +606 -0
  51. package/dist/_chunks/walkers-DGTmJT0f.js.map +1 -0
  52. package/dist/_chunks/{format-DviM89f0.js → warnings-B30wpfaS.js} +6 -45
  53. package/dist/_chunks/warnings-B30wpfaS.js.map +1 -0
  54. package/dist/adapters/build-output-helper.d.ts +28 -0
  55. package/dist/adapters/build-output-helper.d.ts.map +1 -0
  56. package/dist/adapters/cloudflare-dev.d.ts +109 -0
  57. package/dist/adapters/cloudflare-dev.d.ts.map +1 -0
  58. package/dist/adapters/cloudflare-dev.js +73 -0
  59. package/dist/adapters/cloudflare-dev.js.map +1 -0
  60. package/dist/adapters/cloudflare-kv-cache.d.ts +64 -0
  61. package/dist/adapters/cloudflare-kv-cache.d.ts.map +1 -0
  62. package/dist/adapters/cloudflare-kv-cache.js +95 -0
  63. package/dist/adapters/cloudflare-kv-cache.js.map +1 -0
  64. package/dist/adapters/cloudflare.d.ts +148 -12
  65. package/dist/adapters/cloudflare.d.ts.map +1 -1
  66. package/dist/adapters/cloudflare.js +142 -38
  67. package/dist/adapters/cloudflare.js.map +1 -1
  68. package/dist/adapters/compress-module.d.ts.map +1 -1
  69. package/dist/adapters/nitro.d.ts +17 -1
  70. package/dist/adapters/nitro.d.ts.map +1 -1
  71. package/dist/adapters/nitro.js +143 -45
  72. package/dist/adapters/nitro.js.map +1 -1
  73. package/dist/adapters/shared.d.ts +16 -0
  74. package/dist/adapters/shared.d.ts.map +1 -0
  75. package/dist/cache/cache-api.d.ts +24 -0
  76. package/dist/cache/cache-api.d.ts.map +1 -0
  77. package/dist/cache/handler-store.d.ts +31 -0
  78. package/dist/cache/handler-store.d.ts.map +1 -0
  79. package/dist/cache/index.d.ts +23 -7
  80. package/dist/cache/index.d.ts.map +1 -1
  81. package/dist/cache/index.js +151 -81
  82. package/dist/cache/index.js.map +1 -1
  83. package/dist/cache/singleflight.d.ts +18 -1
  84. package/dist/cache/singleflight.d.ts.map +1 -1
  85. package/dist/cache/sizeof.d.ts +22 -0
  86. package/dist/cache/sizeof.d.ts.map +1 -0
  87. package/dist/cache/timber-cache.d.ts +1 -1
  88. package/dist/cache/timber-cache.d.ts.map +1 -1
  89. package/dist/cli-schema-sync.d.ts +37 -0
  90. package/dist/cli-schema-sync.d.ts.map +1 -0
  91. package/dist/cli.d.ts +14 -2
  92. package/dist/cli.d.ts.map +1 -1
  93. package/dist/cli.js +42 -6
  94. package/dist/cli.js.map +1 -1
  95. package/dist/client/browser-dev.d.ts +34 -1
  96. package/dist/client/browser-dev.d.ts.map +1 -1
  97. package/dist/client/browser-entry/action-dispatch.d.ts +17 -0
  98. package/dist/client/browser-entry/action-dispatch.d.ts.map +1 -0
  99. package/dist/client/browser-entry/hmr.d.ts +21 -0
  100. package/dist/client/browser-entry/hmr.d.ts.map +1 -0
  101. package/dist/client/browser-entry/hydrate.d.ts +46 -0
  102. package/dist/client/browser-entry/hydrate.d.ts.map +1 -0
  103. package/dist/client/browser-entry/index.d.ts +30 -0
  104. package/dist/client/browser-entry/index.d.ts.map +1 -0
  105. package/dist/client/browser-entry/post-hydration.d.ts +26 -0
  106. package/dist/client/browser-entry/post-hydration.d.ts.map +1 -0
  107. package/dist/client/browser-entry/router-init.d.ts +23 -0
  108. package/dist/client/browser-entry/router-init.d.ts.map +1 -0
  109. package/dist/client/browser-entry/rsc-stream.d.ts +24 -0
  110. package/dist/client/browser-entry/rsc-stream.d.ts.map +1 -0
  111. package/dist/client/browser-entry/scroll.d.ts +19 -0
  112. package/dist/client/browser-entry/scroll.d.ts.map +1 -0
  113. package/dist/client/error-boundary.d.ts +12 -5
  114. package/dist/client/error-boundary.d.ts.map +1 -1
  115. package/dist/client/error-boundary.js +29 -6
  116. package/dist/client/error-boundary.js.map +1 -1
  117. package/dist/client/error-reconstituter.d.ts +54 -0
  118. package/dist/client/error-reconstituter.d.ts.map +1 -0
  119. package/dist/client/form.d.ts +16 -27
  120. package/dist/client/form.d.ts.map +1 -1
  121. package/dist/client/history.d.ts +19 -4
  122. package/dist/client/history.d.ts.map +1 -1
  123. package/dist/client/index.d.ts +9 -24
  124. package/dist/client/index.d.ts.map +1 -1
  125. package/dist/client/index.js +172 -1100
  126. package/dist/client/index.js.map +1 -1
  127. package/dist/client/internal.d.ts +19 -0
  128. package/dist/client/internal.d.ts.map +1 -0
  129. package/dist/client/internal.js +964 -0
  130. package/dist/client/internal.js.map +1 -0
  131. package/dist/client/link-pending-store.d.ts +63 -0
  132. package/dist/client/link-pending-store.d.ts.map +1 -0
  133. package/dist/client/link.d.ts +62 -55
  134. package/dist/client/link.d.ts.map +1 -1
  135. package/dist/client/nav-link-store.d.ts +36 -0
  136. package/dist/client/nav-link-store.d.ts.map +1 -0
  137. package/dist/client/navigation-api-types.d.ts +90 -0
  138. package/dist/client/navigation-api-types.d.ts.map +1 -0
  139. package/dist/client/navigation-api.d.ts +115 -0
  140. package/dist/client/navigation-api.d.ts.map +1 -0
  141. package/dist/client/navigation-context.d.ts +13 -2
  142. package/dist/client/navigation-context.d.ts.map +1 -1
  143. package/dist/client/{transition-root.d.ts → navigation-root.d.ts} +42 -8
  144. package/dist/client/navigation-root.d.ts.map +1 -0
  145. package/dist/client/nuqs-adapter.d.ts.map +1 -1
  146. package/dist/client/router-ref.d.ts +1 -1
  147. package/dist/client/router.d.ts +70 -4
  148. package/dist/client/router.d.ts.map +1 -1
  149. package/dist/client/rsc-fetch.d.ts +38 -3
  150. package/dist/client/rsc-fetch.d.ts.map +1 -1
  151. package/dist/client/segment-cache.d.ts +1 -1
  152. package/dist/client/segment-cache.d.ts.map +1 -1
  153. package/dist/client/segment-outlet.d.ts +63 -0
  154. package/dist/client/segment-outlet.d.ts.map +1 -0
  155. package/dist/client/ssr-data.d.ts +13 -4
  156. package/dist/client/ssr-data.d.ts.map +1 -1
  157. package/dist/client/stale-reload.d.ts +15 -0
  158. package/dist/client/stale-reload.d.ts.map +1 -1
  159. package/dist/client/state.d.ts +1 -1
  160. package/dist/client/top-loader.d.ts +5 -5
  161. package/dist/client/top-loader.d.ts.map +1 -1
  162. package/dist/client/use-cookie.d.ts +12 -0
  163. package/dist/client/use-cookie.d.ts.map +1 -1
  164. package/dist/client/use-link-status.d.ts +5 -5
  165. package/dist/client/use-link-status.d.ts.map +1 -1
  166. package/dist/client/{use-navigation-pending.d.ts → use-pending-navigation.d.ts} +4 -4
  167. package/dist/client/use-pending-navigation.d.ts.map +1 -0
  168. package/dist/client/use-query-states.d.ts +1 -1
  169. package/dist/client/use-query-states.d.ts.map +1 -1
  170. package/dist/client/use-router.d.ts +1 -1
  171. package/dist/client/{use-params.d.ts → use-segment-params.d.ts} +7 -5
  172. package/dist/client/use-segment-params.d.ts.map +1 -0
  173. package/dist/codec.d.ts +33 -0
  174. package/dist/codec.d.ts.map +1 -0
  175. package/dist/codec.js +2 -0
  176. package/dist/config-types.d.ts +294 -0
  177. package/dist/config-types.d.ts.map +1 -0
  178. package/dist/config-validation.d.ts +51 -0
  179. package/dist/config-validation.d.ts.map +1 -0
  180. package/dist/content/index.d.ts +1 -10
  181. package/dist/content/index.d.ts.map +1 -1
  182. package/dist/content/index.js +0 -2
  183. package/dist/cookies/define-cookie.d.ts +58 -25
  184. package/dist/cookies/define-cookie.d.ts.map +1 -1
  185. package/dist/cookies/index.d.ts +2 -1
  186. package/dist/cookies/index.d.ts.map +1 -1
  187. package/dist/cookies/index.js +251 -36
  188. package/dist/cookies/index.js.map +1 -1
  189. package/dist/cookies/json-cookie.d.ts +64 -0
  190. package/dist/cookies/json-cookie.d.ts.map +1 -0
  191. package/dist/cookies/validation.d.ts +46 -0
  192. package/dist/cookies/validation.d.ts.map +1 -0
  193. package/dist/dev-tools/404-page.d.ts +46 -0
  194. package/dist/dev-tools/404-page.d.ts.map +1 -0
  195. package/dist/dev-tools/browser-logs.d.ts +84 -0
  196. package/dist/dev-tools/browser-logs.d.ts.map +1 -0
  197. package/dist/dev-tools/error-page.d.ts +58 -0
  198. package/dist/dev-tools/error-page.d.ts.map +1 -0
  199. package/dist/dev-tools/holding-server.d.ts +54 -0
  200. package/dist/dev-tools/holding-server.d.ts.map +1 -0
  201. package/dist/dev-tools/index.d.ts +31 -0
  202. package/dist/dev-tools/index.d.ts.map +1 -0
  203. package/dist/{server/dev-span-processor.d.ts → dev-tools/instrumentation.d.ts} +26 -6
  204. package/dist/dev-tools/instrumentation.d.ts.map +1 -0
  205. package/dist/{server/dev-logger.d.ts → dev-tools/logger.d.ts} +1 -1
  206. package/dist/dev-tools/logger.d.ts.map +1 -0
  207. package/dist/{plugins/dev-logs.d.ts → dev-tools/logs.d.ts} +2 -2
  208. package/dist/dev-tools/logs.d.ts.map +1 -0
  209. package/dist/dev-tools/overlay.d.ts +91 -0
  210. package/dist/dev-tools/overlay.d.ts.map +1 -0
  211. package/dist/dev-tools/stack-classifier.d.ts +34 -0
  212. package/dist/dev-tools/stack-classifier.d.ts.map +1 -0
  213. package/dist/dev-tools/terminal.d.ts +28 -0
  214. package/dist/dev-tools/terminal.d.ts.map +1 -0
  215. package/dist/{server/dev-warnings.d.ts → dev-tools/warnings.d.ts} +2 -22
  216. package/dist/dev-tools/warnings.d.ts.map +1 -0
  217. package/dist/fonts/ast.d.ts +98 -6
  218. package/dist/fonts/ast.d.ts.map +1 -1
  219. package/dist/fonts/bundle.d.ts +48 -0
  220. package/dist/fonts/bundle.d.ts.map +1 -0
  221. package/dist/fonts/css.d.ts +1 -0
  222. package/dist/fonts/css.d.ts.map +1 -1
  223. package/dist/fonts/dev-middleware.d.ts +22 -0
  224. package/dist/fonts/dev-middleware.d.ts.map +1 -0
  225. package/dist/fonts/local.d.ts +1 -1
  226. package/dist/fonts/pipeline.d.ts +167 -0
  227. package/dist/fonts/pipeline.d.ts.map +1 -0
  228. package/dist/fonts/transform.d.ts +78 -0
  229. package/dist/fonts/transform.d.ts.map +1 -0
  230. package/dist/fonts/types.d.ts +45 -1
  231. package/dist/fonts/types.d.ts.map +1 -1
  232. package/dist/fonts/virtual-modules.d.ts +103 -0
  233. package/dist/fonts/virtual-modules.d.ts.map +1 -0
  234. package/dist/index.d.ts +47 -190
  235. package/dist/index.d.ts.map +1 -1
  236. package/dist/index.js +4796 -12595
  237. package/dist/index.js.map +1 -1
  238. package/dist/params/codec-registry.d.ts +26 -0
  239. package/dist/params/codec-registry.d.ts.map +1 -0
  240. package/dist/params/define-schema.d.ts +52 -0
  241. package/dist/params/define-schema.d.ts.map +1 -0
  242. package/dist/params/index.d.ts +5 -0
  243. package/dist/params/index.d.ts.map +1 -0
  244. package/dist/params/index.js +33 -0
  245. package/dist/params/index.js.map +1 -0
  246. package/dist/params/resolve-schema.d.ts +34 -0
  247. package/dist/params/resolve-schema.d.ts.map +1 -0
  248. package/dist/plugin-context.d.ts +107 -0
  249. package/dist/plugin-context.d.ts.map +1 -0
  250. package/dist/plugins/adapter-build.d.ts +1 -1
  251. package/dist/plugins/adapter-build.d.ts.map +1 -1
  252. package/dist/plugins/build-manifest.d.ts +2 -2
  253. package/dist/plugins/build-manifest.d.ts.map +1 -1
  254. package/dist/plugins/build-report.d.ts +9 -7
  255. package/dist/plugins/build-report.d.ts.map +1 -1
  256. package/dist/plugins/client-chunks.d.ts +32 -0
  257. package/dist/plugins/client-chunks.d.ts.map +1 -0
  258. package/dist/plugins/content.d.ts +1 -1
  259. package/dist/plugins/content.d.ts.map +1 -1
  260. package/dist/plugins/dev-server.d.ts +1 -1
  261. package/dist/plugins/dev-server.d.ts.map +1 -1
  262. package/dist/plugins/entries.d.ts +1 -1
  263. package/dist/plugins/entries.d.ts.map +1 -1
  264. package/dist/plugins/fonts.d.ts +17 -73
  265. package/dist/plugins/fonts.d.ts.map +1 -1
  266. package/dist/plugins/mdx.d.ts +1 -1
  267. package/dist/plugins/mdx.d.ts.map +1 -1
  268. package/dist/plugins/routing.d.ts +1 -1
  269. package/dist/plugins/routing.d.ts.map +1 -1
  270. package/dist/plugins/server-bundle.d.ts.map +1 -1
  271. package/dist/plugins/shims.d.ts +6 -5
  272. package/dist/plugins/shims.d.ts.map +1 -1
  273. package/dist/plugins/static-build.d.ts +5 -26
  274. package/dist/plugins/static-build.d.ts.map +1 -1
  275. package/dist/routing/codegen-shared.d.ts +63 -0
  276. package/dist/routing/codegen-shared.d.ts.map +1 -0
  277. package/dist/routing/codegen-types.d.ts +57 -0
  278. package/dist/routing/codegen-types.d.ts.map +1 -0
  279. package/dist/routing/codegen.d.ts +7 -2
  280. package/dist/routing/codegen.d.ts.map +1 -1
  281. package/dist/routing/convention-lint.d.ts +41 -0
  282. package/dist/routing/convention-lint.d.ts.map +1 -0
  283. package/dist/routing/index.d.ts +5 -1
  284. package/dist/routing/index.d.ts.map +1 -1
  285. package/dist/routing/index.js +4 -2
  286. package/dist/routing/link-codegen.d.ts +90 -0
  287. package/dist/routing/link-codegen.d.ts.map +1 -0
  288. package/dist/routing/scanner.d.ts +1 -10
  289. package/dist/routing/scanner.d.ts.map +1 -1
  290. package/dist/routing/segment-classify.d.ts +75 -0
  291. package/dist/routing/segment-classify.d.ts.map +1 -0
  292. package/dist/routing/types.d.ts +77 -25
  293. package/dist/routing/types.d.ts.map +1 -1
  294. package/dist/routing/walkers.d.ts +51 -0
  295. package/dist/routing/walkers.d.ts.map +1 -0
  296. package/dist/rsc-runtime/rsc.d.ts +1 -1
  297. package/dist/rsc-runtime/rsc.d.ts.map +1 -1
  298. package/dist/rsc-runtime/ssr.d.ts +12 -0
  299. package/dist/rsc-runtime/ssr.d.ts.map +1 -1
  300. package/dist/schema-bridge.d.ts +76 -0
  301. package/dist/schema-bridge.d.ts.map +1 -0
  302. package/dist/search-params/define.d.ts +157 -0
  303. package/dist/search-params/define.d.ts.map +1 -0
  304. package/dist/search-params/index.d.ts +4 -7
  305. package/dist/search-params/index.d.ts.map +1 -1
  306. package/dist/search-params/index.js +34 -441
  307. package/dist/search-params/index.js.map +1 -1
  308. package/dist/search-params/registry.d.ts +2 -2
  309. package/dist/search-params/registry.d.ts.map +1 -1
  310. package/dist/search-params/wrappers.d.ts +53 -0
  311. package/dist/search-params/wrappers.d.ts.map +1 -0
  312. package/dist/segment-params/define.d.ts +95 -0
  313. package/dist/segment-params/define.d.ts.map +1 -0
  314. package/dist/segment-params/index.d.ts +3 -0
  315. package/dist/segment-params/index.d.ts.map +1 -0
  316. package/dist/segment-params/index.js +2 -0
  317. package/dist/server/access-gate.d.ts +8 -3
  318. package/dist/server/access-gate.d.ts.map +1 -1
  319. package/dist/server/action-client.d.ts +41 -6
  320. package/dist/server/action-client.d.ts.map +1 -1
  321. package/dist/server/action-encryption.d.ts +76 -0
  322. package/dist/server/action-encryption.d.ts.map +1 -0
  323. package/dist/server/action-handler.d.ts +35 -1
  324. package/dist/server/action-handler.d.ts.map +1 -1
  325. package/dist/server/actions.d.ts +3 -6
  326. package/dist/server/actions.d.ts.map +1 -1
  327. package/dist/server/als-registry.d.ts +40 -5
  328. package/dist/server/als-registry.d.ts.map +1 -1
  329. package/dist/server/asset-headers.d.ts +1 -15
  330. package/dist/server/asset-headers.d.ts.map +1 -1
  331. package/dist/server/build-manifest.d.ts +2 -2
  332. package/dist/server/build-manifest.d.ts.map +1 -1
  333. package/dist/server/coalesce-tick.d.ts +40 -0
  334. package/dist/server/coalesce-tick.d.ts.map +1 -0
  335. package/dist/server/cookie-context.d.ts +170 -0
  336. package/dist/server/cookie-context.d.ts.map +1 -0
  337. package/dist/server/cookie-parsing.d.ts +51 -0
  338. package/dist/server/cookie-parsing.d.ts.map +1 -0
  339. package/dist/server/debug.d.ts +1 -1
  340. package/dist/server/default-logger.d.ts +22 -0
  341. package/dist/server/default-logger.d.ts.map +1 -0
  342. package/dist/server/deny-boundary.d.ts +90 -0
  343. package/dist/server/deny-boundary.d.ts.map +1 -0
  344. package/dist/server/deny-renderer.d.ts.map +1 -1
  345. package/dist/server/dev-source-map.d.ts +22 -0
  346. package/dist/server/dev-source-map.d.ts.map +1 -0
  347. package/dist/server/early-hints-sender.d.ts.map +1 -1
  348. package/dist/server/early-hints.d.ts +13 -5
  349. package/dist/server/early-hints.d.ts.map +1 -1
  350. package/dist/server/error-boundary-wrapper.d.ts +7 -1
  351. package/dist/server/error-boundary-wrapper.d.ts.map +1 -1
  352. package/dist/server/fallback-error.d.ts +12 -7
  353. package/dist/server/fallback-error.d.ts.map +1 -1
  354. package/dist/server/flight-injection-state.d.ts +66 -0
  355. package/dist/server/flight-injection-state.d.ts.map +1 -0
  356. package/dist/server/flight-scripts.d.ts +42 -0
  357. package/dist/server/flight-scripts.d.ts.map +1 -0
  358. package/dist/server/flush.d.ts.map +1 -1
  359. package/dist/server/form-data.d.ts +29 -0
  360. package/dist/server/form-data.d.ts.map +1 -1
  361. package/dist/server/html-injector-core.d.ts +212 -0
  362. package/dist/server/html-injector-core.d.ts.map +1 -0
  363. package/dist/server/html-injectors.d.ts +81 -41
  364. package/dist/server/html-injectors.d.ts.map +1 -1
  365. package/dist/server/index.d.ts +9 -46
  366. package/dist/server/index.d.ts.map +1 -1
  367. package/dist/server/index.js +155 -2905
  368. package/dist/server/index.js.map +1 -1
  369. package/dist/server/internal.d.ts +48 -0
  370. package/dist/server/internal.d.ts.map +1 -0
  371. package/dist/server/internal.js +2946 -0
  372. package/dist/server/internal.js.map +1 -0
  373. package/dist/server/logger.d.ts +39 -7
  374. package/dist/server/logger.d.ts.map +1 -1
  375. package/dist/server/middleware-runner.d.ts +36 -4
  376. package/dist/server/middleware-runner.d.ts.map +1 -1
  377. package/dist/server/node-stream-transforms.d.ts +110 -0
  378. package/dist/server/node-stream-transforms.d.ts.map +1 -0
  379. package/dist/server/param-coercion.d.ts +36 -0
  380. package/dist/server/param-coercion.d.ts.map +1 -0
  381. package/dist/server/pipeline-helpers.d.ts +95 -0
  382. package/dist/server/pipeline-helpers.d.ts.map +1 -0
  383. package/dist/server/pipeline-interception.d.ts +1 -1
  384. package/dist/server/pipeline-interception.d.ts.map +1 -1
  385. package/dist/server/pipeline-metadata.d.ts +6 -0
  386. package/dist/server/pipeline-metadata.d.ts.map +1 -1
  387. package/dist/server/pipeline-outcome.d.ts +49 -0
  388. package/dist/server/pipeline-outcome.d.ts.map +1 -0
  389. package/dist/server/pipeline-phases.d.ts +52 -0
  390. package/dist/server/pipeline-phases.d.ts.map +1 -0
  391. package/dist/server/pipeline.d.ts +111 -23
  392. package/dist/server/pipeline.d.ts.map +1 -1
  393. package/dist/server/port-resolution.d.ts +117 -0
  394. package/dist/server/port-resolution.d.ts.map +1 -0
  395. package/dist/server/primitives.d.ts +69 -18
  396. package/dist/server/primitives.d.ts.map +1 -1
  397. package/dist/server/render-timeout.d.ts +51 -0
  398. package/dist/server/render-timeout.d.ts.map +1 -0
  399. package/dist/server/request-context.d.ts +54 -108
  400. package/dist/server/request-context.d.ts.map +1 -1
  401. package/dist/server/route-element-builder.d.ts +27 -1
  402. package/dist/server/route-element-builder.d.ts.map +1 -1
  403. package/dist/server/route-handler.d.ts.map +1 -1
  404. package/dist/server/route-matcher.d.ts +21 -34
  405. package/dist/server/route-matcher.d.ts.map +1 -1
  406. package/dist/server/rsc-entry/action-middleware-runner.d.ts +66 -0
  407. package/dist/server/rsc-entry/action-middleware-runner.d.ts.map +1 -0
  408. package/dist/server/rsc-entry/api-handler.d.ts +2 -2
  409. package/dist/server/rsc-entry/api-handler.d.ts.map +1 -1
  410. package/dist/server/rsc-entry/error-renderer.d.ts +26 -13
  411. package/dist/server/rsc-entry/error-renderer.d.ts.map +1 -1
  412. package/dist/server/rsc-entry/helpers.d.ts +49 -6
  413. package/dist/server/rsc-entry/helpers.d.ts.map +1 -1
  414. package/dist/server/rsc-entry/index.d.ts +19 -8
  415. package/dist/server/rsc-entry/index.d.ts.map +1 -1
  416. package/dist/server/rsc-entry/render-route.d.ts +50 -0
  417. package/dist/server/rsc-entry/render-route.d.ts.map +1 -0
  418. package/dist/server/rsc-entry/rsc-payload.d.ts +3 -3
  419. package/dist/server/rsc-entry/rsc-payload.d.ts.map +1 -1
  420. package/dist/server/rsc-entry/rsc-stream.d.ts +14 -1
  421. package/dist/server/rsc-entry/rsc-stream.d.ts.map +1 -1
  422. package/dist/server/rsc-entry/ssr-bridge.d.ts +1 -1
  423. package/dist/server/rsc-entry/ssr-bridge.d.ts.map +1 -1
  424. package/dist/server/rsc-entry/ssr-renderer.d.ts +19 -4
  425. package/dist/server/rsc-entry/ssr-renderer.d.ts.map +1 -1
  426. package/dist/server/rsc-entry/wrap-action-dispatch.d.ts +119 -0
  427. package/dist/server/rsc-entry/wrap-action-dispatch.d.ts.map +1 -0
  428. package/dist/server/safe-load.d.ts +46 -0
  429. package/dist/server/safe-load.d.ts.map +1 -0
  430. package/dist/server/sensitive-fields.d.ts +74 -0
  431. package/dist/server/sensitive-fields.d.ts.map +1 -0
  432. package/dist/server/sitemap-generator.d.ts +129 -0
  433. package/dist/server/sitemap-generator.d.ts.map +1 -0
  434. package/dist/server/sitemap-handler.d.ts +22 -0
  435. package/dist/server/sitemap-handler.d.ts.map +1 -0
  436. package/dist/server/slot-resolver.d.ts +1 -1
  437. package/dist/server/slot-resolver.d.ts.map +1 -1
  438. package/dist/server/ssr-entry.d.ts +23 -0
  439. package/dist/server/ssr-entry.d.ts.map +1 -1
  440. package/dist/server/ssr-render.d.ts +39 -21
  441. package/dist/server/ssr-render.d.ts.map +1 -1
  442. package/dist/server/ssr-wrappers.d.ts +50 -0
  443. package/dist/server/ssr-wrappers.d.ts.map +1 -0
  444. package/dist/server/state-tree-diff.d.ts.map +1 -1
  445. package/dist/server/status-code-resolver.d.ts +16 -11
  446. package/dist/server/status-code-resolver.d.ts.map +1 -1
  447. package/dist/server/stream-utils.d.ts +36 -0
  448. package/dist/server/stream-utils.d.ts.map +1 -0
  449. package/dist/server/tracing.d.ts +5 -5
  450. package/dist/server/tracing.d.ts.map +1 -1
  451. package/dist/server/tree-builder.d.ts +62 -30
  452. package/dist/server/tree-builder.d.ts.map +1 -1
  453. package/dist/server/types.d.ts +49 -4
  454. package/dist/server/types.d.ts.map +1 -1
  455. package/dist/server/utils/escape-html.d.ts +14 -0
  456. package/dist/server/utils/escape-html.d.ts.map +1 -0
  457. package/dist/server/version-skew.d.ts +61 -0
  458. package/dist/server/version-skew.d.ts.map +1 -0
  459. package/dist/shared/merge-search-params.d.ts +22 -0
  460. package/dist/shared/merge-search-params.d.ts.map +1 -0
  461. package/dist/shims/font-google.d.ts +1 -1
  462. package/dist/shims/font-google.d.ts.map +1 -1
  463. package/dist/shims/font-google.js +42 -0
  464. package/dist/shims/font-google.js.map +1 -0
  465. package/dist/shims/font-local.d.ts +26 -0
  466. package/dist/shims/font-local.d.ts.map +1 -0
  467. package/dist/shims/font-local.js +20 -0
  468. package/dist/shims/font-local.js.map +1 -0
  469. package/dist/shims/headers.d.ts +2 -1
  470. package/dist/shims/headers.d.ts.map +1 -1
  471. package/dist/shims/navigation-client.d.ts +3 -1
  472. package/dist/shims/navigation-client.d.ts.map +1 -1
  473. package/dist/shims/navigation.d.ts +11 -5
  474. package/dist/shims/navigation.d.ts.map +1 -1
  475. package/dist/utils/state-machine.d.ts +80 -0
  476. package/dist/utils/state-machine.d.ts.map +1 -0
  477. package/package.json +62 -21
  478. package/src/adapters/build-output-helper.ts +77 -0
  479. package/src/adapters/cloudflare-dev.ts +177 -0
  480. package/src/adapters/cloudflare-kv-cache.ts +142 -0
  481. package/src/adapters/cloudflare.ts +350 -76
  482. package/src/adapters/compress-module.ts +24 -4
  483. package/src/adapters/nitro.ts +142 -59
  484. package/src/adapters/shared.ts +40 -0
  485. package/src/adapters/wrangler.d.ts +7 -0
  486. package/src/cache/cache-api.ts +38 -0
  487. package/src/cache/handler-store.ts +68 -0
  488. package/src/cache/index.ts +81 -18
  489. package/src/cache/singleflight.ts +62 -4
  490. package/src/cache/sizeof.ts +33 -0
  491. package/src/cache/timber-cache.ts +25 -20
  492. package/src/cli-schema-sync.ts +209 -0
  493. package/src/cli.ts +65 -8
  494. package/src/client/browser-dev.ts +153 -1
  495. package/src/client/browser-entry/action-dispatch.ts +126 -0
  496. package/src/client/browser-entry/hmr.ts +81 -0
  497. package/src/client/browser-entry/hydrate.ts +145 -0
  498. package/src/client/browser-entry/index.ts +149 -0
  499. package/src/client/browser-entry/post-hydration.ts +119 -0
  500. package/src/client/browser-entry/router-init.ts +193 -0
  501. package/src/client/browser-entry/rsc-stream.ts +157 -0
  502. package/src/client/browser-entry/scroll.ts +27 -0
  503. package/src/client/error-boundary.tsx +99 -22
  504. package/src/client/error-reconstituter.tsx +65 -0
  505. package/src/client/form.tsx +31 -32
  506. package/src/client/history.ts +26 -4
  507. package/src/client/index.ts +69 -44
  508. package/src/client/internal.ts +58 -0
  509. package/src/client/link-pending-store.ts +111 -0
  510. package/src/client/link.tsx +366 -113
  511. package/src/client/nav-link-store.ts +47 -0
  512. package/src/client/navigation-api-types.ts +112 -0
  513. package/src/client/navigation-api.ts +332 -0
  514. package/src/client/navigation-context.ts +31 -6
  515. package/src/client/navigation-root.tsx +342 -0
  516. package/src/client/nuqs-adapter.tsx +16 -3
  517. package/src/client/router-ref.ts +1 -1
  518. package/src/client/router.ts +300 -73
  519. package/src/client/rsc-fetch.ts +112 -8
  520. package/src/client/segment-cache.ts +1 -1
  521. package/src/client/segment-outlet.tsx +86 -0
  522. package/src/client/ssr-data.ts +13 -5
  523. package/src/client/stale-reload.ts +72 -3
  524. package/src/client/state.ts +2 -2
  525. package/src/client/top-loader.tsx +18 -6
  526. package/src/client/use-cookie.ts +31 -2
  527. package/src/client/use-link-status.ts +7 -7
  528. package/src/client/{use-navigation-pending.ts → use-pending-navigation.ts} +6 -6
  529. package/src/client/use-query-states.ts +9 -3
  530. package/src/client/use-router.ts +1 -1
  531. package/src/client/{use-params.ts → use-segment-params.ts} +7 -5
  532. package/src/codec.ts +45 -0
  533. package/src/config-types.ts +292 -0
  534. package/src/config-validation.ts +303 -0
  535. package/src/content/index.ts +5 -13
  536. package/src/cookies/define-cookie.ts +233 -53
  537. package/src/cookies/index.ts +12 -1
  538. package/src/cookies/json-cookie.ts +105 -0
  539. package/src/cookies/validation.ts +134 -0
  540. package/src/dev-tools/404-page.ts +387 -0
  541. package/src/dev-tools/browser-logs.ts +291 -0
  542. package/src/dev-tools/error-page.ts +506 -0
  543. package/src/dev-tools/holding-server.ts +187 -0
  544. package/src/dev-tools/index.ts +90 -0
  545. package/src/dev-tools/instrumentation.ts +176 -0
  546. package/src/{plugins/dev-logs.ts → dev-tools/logs.ts} +9 -5
  547. package/src/dev-tools/overlay.ts +469 -0
  548. package/src/dev-tools/stack-classifier.ts +75 -0
  549. package/src/dev-tools/terminal.ts +183 -0
  550. package/src/{server/dev-warnings.ts → dev-tools/warnings.ts} +5 -50
  551. package/src/fonts/ast.ts +525 -16
  552. package/src/fonts/bundle.ts +142 -0
  553. package/src/fonts/css.ts +2 -1
  554. package/src/fonts/dev-middleware.ts +74 -0
  555. package/src/fonts/local.ts +1 -1
  556. package/src/fonts/pipeline.ts +314 -0
  557. package/src/fonts/transform.ts +317 -0
  558. package/src/fonts/types.ts +50 -1
  559. package/src/fonts/virtual-modules.ts +227 -0
  560. package/src/index.ts +413 -356
  561. package/src/params/codec-registry.ts +34 -0
  562. package/src/params/define-schema.ts +72 -0
  563. package/src/params/index.ts +11 -0
  564. package/src/params/resolve-schema.ts +88 -0
  565. package/src/plugin-context.ts +240 -0
  566. package/src/plugins/adapter-build.ts +12 -4
  567. package/src/plugins/build-manifest.ts +13 -2
  568. package/src/plugins/build-report.ts +16 -25
  569. package/src/plugins/client-chunks.ts +65 -0
  570. package/src/plugins/content.ts +1 -1
  571. package/src/plugins/dev-server.ts +175 -35
  572. package/src/plugins/entries.ts +111 -9
  573. package/src/plugins/fonts.ts +155 -654
  574. package/src/plugins/mdx.ts +47 -10
  575. package/src/plugins/routing.ts +322 -44
  576. package/src/plugins/server-bundle.ts +32 -1
  577. package/src/plugins/shims.ts +136 -35
  578. package/src/plugins/static-build.ts +15 -89
  579. package/src/routing/codegen-shared.ts +109 -0
  580. package/src/routing/codegen-types.ts +58 -0
  581. package/src/routing/codegen.ts +253 -178
  582. package/src/routing/convention-lint.ts +357 -0
  583. package/src/routing/index.ts +5 -1
  584. package/src/routing/interception.ts +1 -1
  585. package/src/routing/link-codegen.ts +308 -0
  586. package/src/routing/scanner.ts +107 -110
  587. package/src/routing/segment-classify.ts +188 -0
  588. package/src/routing/types.ts +78 -25
  589. package/src/routing/walkers.ts +90 -0
  590. package/src/rsc-runtime/rsc.ts +2 -0
  591. package/src/rsc-runtime/ssr.ts +50 -0
  592. package/src/rsc-runtime/vendor-types.d.ts +7 -0
  593. package/src/{search-params/codecs.ts → schema-bridge.ts} +57 -20
  594. package/src/search-params/define.ts +538 -0
  595. package/src/search-params/index.ts +14 -20
  596. package/src/search-params/registry.ts +2 -2
  597. package/src/search-params/wrappers.ts +92 -0
  598. package/src/segment-params/define.ts +336 -0
  599. package/src/segment-params/index.ts +9 -0
  600. package/src/server/access-gate.tsx +76 -34
  601. package/src/server/action-client.ts +88 -15
  602. package/src/server/action-encryption.ts +144 -0
  603. package/src/server/action-handler.ts +112 -14
  604. package/src/server/actions.ts +10 -9
  605. package/src/server/als-registry.ts +42 -7
  606. package/src/server/asset-headers.ts +8 -34
  607. package/src/server/build-manifest.ts +10 -4
  608. package/src/server/coalesce-tick.ts +75 -0
  609. package/src/server/compress.ts +25 -7
  610. package/src/server/cookie-context.ts +468 -0
  611. package/src/server/cookie-parsing.ts +135 -0
  612. package/src/server/debug.ts +1 -1
  613. package/src/server/default-logger.ts +99 -0
  614. package/src/server/deny-boundary.ts +218 -0
  615. package/src/server/deny-renderer.ts +31 -50
  616. package/src/server/dev-source-map.ts +31 -0
  617. package/src/server/early-hints-sender.ts +3 -2
  618. package/src/server/early-hints.ts +36 -15
  619. package/src/server/error-boundary-wrapper.ts +74 -22
  620. package/src/server/fallback-error.ts +74 -102
  621. package/src/server/flight-injection-state.ts +113 -0
  622. package/src/server/flight-scripts.ts +62 -0
  623. package/src/server/flush.ts +2 -1
  624. package/src/server/form-data.ts +76 -0
  625. package/src/server/html-injector-core.ts +403 -0
  626. package/src/server/html-injectors.ts +233 -223
  627. package/src/server/index.ts +31 -184
  628. package/src/server/internal.ts +176 -0
  629. package/src/server/logger.ts +67 -36
  630. package/src/server/middleware-runner.ts +75 -4
  631. package/src/server/node-stream-transforms.ts +359 -0
  632. package/src/server/param-coercion.ts +148 -0
  633. package/src/server/pipeline-helpers.ts +204 -0
  634. package/src/server/pipeline-interception.ts +17 -16
  635. package/src/server/pipeline-metadata.ts +13 -0
  636. package/src/server/pipeline-outcome.ts +176 -0
  637. package/src/server/pipeline-phases.ts +453 -0
  638. package/src/server/pipeline.ts +147 -394
  639. package/src/server/port-resolution.ts +215 -0
  640. package/src/server/primitives.ts +111 -28
  641. package/src/server/render-timeout.ts +108 -0
  642. package/src/server/request-context.ts +138 -334
  643. package/src/server/route-element-builder.ts +297 -193
  644. package/src/server/route-handler.ts +24 -4
  645. package/src/server/route-matcher.ts +44 -65
  646. package/src/server/rsc-entry/action-middleware-runner.ts +167 -0
  647. package/src/server/rsc-entry/api-handler.ts +16 -17
  648. package/src/server/rsc-entry/error-renderer.ts +305 -89
  649. package/src/server/rsc-entry/helpers.ts +137 -12
  650. package/src/server/rsc-entry/index.ts +316 -352
  651. package/src/server/rsc-entry/render-route.ts +307 -0
  652. package/src/server/rsc-entry/rsc-payload.ts +65 -18
  653. package/src/server/rsc-entry/rsc-stream.ts +81 -13
  654. package/src/server/rsc-entry/ssr-bridge.ts +14 -5
  655. package/src/server/rsc-entry/ssr-renderer.ts +171 -38
  656. package/src/server/rsc-entry/wrap-action-dispatch.ts +449 -0
  657. package/src/server/safe-load.ts +60 -0
  658. package/src/server/sensitive-fields.ts +230 -0
  659. package/src/server/sitemap-generator.ts +338 -0
  660. package/src/server/sitemap-handler.ts +126 -0
  661. package/src/server/slot-resolver.ts +245 -230
  662. package/src/server/ssr-entry.ts +215 -32
  663. package/src/server/ssr-render.ts +289 -67
  664. package/src/server/ssr-wrappers.tsx +139 -0
  665. package/src/server/state-tree-diff.ts +4 -1
  666. package/src/server/status-code-resolver.ts +112 -128
  667. package/src/server/stream-utils.ts +213 -0
  668. package/src/server/tracing.ts +21 -10
  669. package/src/server/tree-builder.ts +202 -90
  670. package/src/server/types.ts +55 -6
  671. package/src/server/utils/escape-html.ts +20 -0
  672. package/src/server/version-skew.ts +104 -0
  673. package/src/shared/merge-search-params.ts +55 -0
  674. package/src/shims/font-google.ts +1 -1
  675. package/src/shims/font-local.ts +34 -0
  676. package/src/shims/headers.ts +5 -1
  677. package/src/shims/navigation-client.ts +4 -3
  678. package/src/shims/navigation.ts +14 -7
  679. package/src/utils/state-machine.ts +111 -0
  680. package/LICENSE +0 -8
  681. package/dist/_chunks/als-registry-B7DbZ2hS.js +0 -41
  682. package/dist/_chunks/als-registry-B7DbZ2hS.js.map +0 -1
  683. package/dist/_chunks/debug-gwlJkDuf.js +0 -108
  684. package/dist/_chunks/debug-gwlJkDuf.js.map +0 -1
  685. package/dist/_chunks/format-DviM89f0.js.map +0 -1
  686. package/dist/_chunks/interception-BOoWmLUA.js +0 -676
  687. package/dist/_chunks/interception-BOoWmLUA.js.map +0 -1
  688. package/dist/_chunks/request-context-DIkVh_jG.js +0 -330
  689. package/dist/_chunks/request-context-DIkVh_jG.js.map +0 -1
  690. package/dist/_chunks/ssr-data-MjmprTmO.js.map +0 -1
  691. package/dist/_chunks/tracing-CemImE6h.js +0 -187
  692. package/dist/_chunks/tracing-CemImE6h.js.map +0 -1
  693. package/dist/_chunks/use-cookie-DX-l1_5E.js +0 -91
  694. package/dist/_chunks/use-cookie-DX-l1_5E.js.map +0 -1
  695. package/dist/_chunks/use-query-states-D5KaffOK.js.map +0 -1
  696. package/dist/cache/register-cached-function.d.ts +0 -17
  697. package/dist/cache/register-cached-function.d.ts.map +0 -1
  698. package/dist/client/browser-entry.d.ts +0 -21
  699. package/dist/client/browser-entry.d.ts.map +0 -1
  700. package/dist/client/link-status-provider.d.ts +0 -11
  701. package/dist/client/link-status-provider.d.ts.map +0 -1
  702. package/dist/client/transition-root.d.ts.map +0 -1
  703. package/dist/client/use-navigation-pending.d.ts.map +0 -1
  704. package/dist/client/use-params.d.ts.map +0 -1
  705. package/dist/plugins/cache-transform.d.ts +0 -36
  706. package/dist/plugins/cache-transform.d.ts.map +0 -1
  707. package/dist/plugins/dev-error-overlay.d.ts +0 -60
  708. package/dist/plugins/dev-error-overlay.d.ts.map +0 -1
  709. package/dist/plugins/dev-logs.d.ts.map +0 -1
  710. package/dist/plugins/dynamic-transform.d.ts +0 -72
  711. package/dist/plugins/dynamic-transform.d.ts.map +0 -1
  712. package/dist/plugins/server-action-exports.d.ts +0 -26
  713. package/dist/plugins/server-action-exports.d.ts.map +0 -1
  714. package/dist/routing/status-file-lint.d.ts +0 -33
  715. package/dist/routing/status-file-lint.d.ts.map +0 -1
  716. package/dist/search-params/analyze.d.ts +0 -54
  717. package/dist/search-params/analyze.d.ts.map +0 -1
  718. package/dist/search-params/builtin-codecs.d.ts +0 -105
  719. package/dist/search-params/builtin-codecs.d.ts.map +0 -1
  720. package/dist/search-params/codecs.d.ts +0 -53
  721. package/dist/search-params/codecs.d.ts.map +0 -1
  722. package/dist/search-params/create.d.ts +0 -106
  723. package/dist/search-params/create.d.ts.map +0 -1
  724. package/dist/server/dev-fetch-instrumentation.d.ts +0 -22
  725. package/dist/server/dev-fetch-instrumentation.d.ts.map +0 -1
  726. package/dist/server/dev-logger.d.ts.map +0 -1
  727. package/dist/server/dev-span-processor.d.ts.map +0 -1
  728. package/dist/server/dev-warnings.d.ts.map +0 -1
  729. package/dist/server/manifest-status-resolver.d.ts +0 -58
  730. package/dist/server/manifest-status-resolver.d.ts.map +0 -1
  731. package/dist/server/prerender.d.ts +0 -77
  732. package/dist/server/prerender.d.ts.map +0 -1
  733. package/dist/server/response-cache.d.ts +0 -54
  734. package/dist/server/response-cache.d.ts.map +0 -1
  735. package/dist/utils/directive-parser.d.ts +0 -70
  736. package/dist/utils/directive-parser.d.ts.map +0 -1
  737. package/src/cache/register-cached-function.ts +0 -103
  738. package/src/client/browser-entry.ts +0 -678
  739. package/src/client/link-status-provider.tsx +0 -30
  740. package/src/client/transition-root.tsx +0 -166
  741. package/src/plugins/cache-transform.ts +0 -199
  742. package/src/plugins/dev-error-overlay.ts +0 -230
  743. package/src/plugins/dynamic-transform.ts +0 -161
  744. package/src/plugins/server-action-exports.ts +0 -220
  745. package/src/routing/status-file-lint.ts +0 -112
  746. package/src/search-params/analyze.ts +0 -192
  747. package/src/search-params/builtin-codecs.ts +0 -228
  748. package/src/search-params/create.ts +0 -321
  749. package/src/server/dev-fetch-instrumentation.ts +0 -96
  750. package/src/server/dev-span-processor.ts +0 -78
  751. package/src/server/manifest-status-resolver.ts +0 -215
  752. package/src/server/prerender.ts +0 -139
  753. package/src/server/response-cache.ts +0 -410
  754. package/src/utils/directive-parser.ts +0 -529
  755. /package/src/{server/dev-logger.ts → dev-tools/logger.ts} +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tracing-DvKLzCFa.js","names":[],"sources":["../../src/server/debug.ts","../../src/server/als-registry.ts","../../src/server/tracing.ts"],"sourcesContent":["/**\n * Runtime debug flag for timber.js.\n *\n * Two distinct functions for two distinct security levels:\n *\n * ## `isDebug()` — server-side logging only\n *\n * Returns true when timber's debug/warning messages should be written to\n * stderr / the server console. This NEVER affects what is sent to the\n * client (no error details, no timing headers, no stack traces).\n *\n * Active when any of:\n * - `NODE_ENV !== 'production'` (standard dev mode)\n * - `TIMBER_DEBUG` env var is set to a truthy value at runtime\n * - `timber.config.ts` has `debug: true`\n *\n * ## `isDevMode()` — client-visible dev behavior\n *\n * Returns true ONLY when `NODE_ENV !== 'production'`. This gates anything\n * that changes what clients can observe:\n * - Dev error pages with stack traces (fallback-error.ts)\n * - Detailed Server-Timing headers (pipeline.ts)\n * - Error messages in action INTERNAL_ERROR payloads (action-client.ts)\n * - Pipeline error handler wiring (Vite overlay)\n *\n * `isDevMode()` is statically replaced in production builds → the guarded\n * code is tree-shaken to zero bytes. TIMBER_DEBUG cannot enable it.\n *\n * Usage:\n * In Cloudflare Workers wrangler.toml:\n * [vars]\n * TIMBER_DEBUG = \"1\"\n *\n * In Node.js:\n * TIMBER_DEBUG=1 node server.js\n *\n * In timber.config.ts:\n * export default { debug: true }\n *\n * See design/13-security.md for the security taxonomy.\n * See design/18-build-system.md for build pipeline details.\n */\n\n// ─── Dev Mode (client-visible) ──────────────────────────────────────────────\n\n/**\n * Check if the application is running in development mode.\n *\n * This is the ONLY function that should gate client-visible dev behavior:\n * - Dev error pages with stack traces\n * - Server-Timing mode default (`'detailed'` in dev, `'total'` in prod)\n * - Error messages in action `INTERNAL_ERROR` payloads\n * - Pipeline error handler wiring (Vite overlay)\n *\n * Returns `process.env.NODE_ENV !== 'production'`, which is statically\n * replaced by the bundler in production builds. Code guarded by this\n * function is tree-shaken to zero bytes in production.\n *\n * TIMBER_DEBUG does NOT enable this — that would leak server internals\n * to clients. Use `isDebug()` for server-side-only logging.\n */\nexport function isDevMode(): boolean {\n return process.env.NODE_ENV !== 'production';\n}\n\n// ─── Debug Flag (server-side logging only) ──────────────────────────────────\n\n/**\n * Config-level debug override. Set via `setDebugFromConfig()` during\n * initialization when timber.config.ts has `debug: true`.\n */\nlet _configDebug = false;\n\n/**\n * Set the debug flag from timber.config.ts.\n * Called during handler initialization.\n */\nexport function setDebugFromConfig(debug: boolean): void {\n _configDebug = debug;\n}\n\n/**\n * Check if timber debug logging is active (server-side only).\n *\n * Returns true if ANY of these conditions hold:\n * - NODE_ENV is not 'production' (standard dev mode)\n * - TIMBER_DEBUG environment variable is set to a truthy value at runtime\n * - timber.config.ts has `debug: true`\n *\n * This function controls ONLY server-side logging — messages written to\n * stderr or the server console. It NEVER affects client-visible behavior\n * (error pages, response headers, action payloads). For client-visible\n * behavior, use `isDevMode()`.\n *\n * The TIMBER_DEBUG check is deliberately written as a dynamic property\n * access so bundlers cannot statically replace it.\n */\nexport function isDebug(): boolean {\n // Fast path: dev mode (statically replaced to `true` in dev, `false` in prod)\n if (process.env.NODE_ENV !== 'production') return true;\n\n // Config override\n if (_configDebug) return true;\n\n // Runtime env var check — uses dynamic access to prevent static replacement.\n // In production builds, process.env.NODE_ENV is statically replaced, but\n // TIMBER_DEBUG must survive as a runtime check. The dynamic key access\n // pattern ensures the bundler treats this as opaque.\n return _readTimberDebugEnv();\n}\n\n/**\n * Read TIMBER_DEBUG from the environment at runtime.\n *\n * Extracted to a separate function to:\n * 1. Prevent bundler inlining (cross-module function calls are not inlined)\n * 2. Handle platforms where `process` may not exist (Cloudflare Workers)\n * 3. Support globalThis.__TIMBER_DEBUG for programmatic control\n */\nfunction _readTimberDebugEnv(): boolean {\n // globalThis override — useful for programmatic control and testing\n if ((globalThis as Record<string, unknown>).__TIMBER_DEBUG) return true;\n\n // process.env — works in Node.js and platforms that polyfill process\n try {\n const key = 'TIMBER_DEBUG';\n const val =\n typeof process !== 'undefined' && process.env\n ? (process.env as Record<string, string | undefined>)[key]\n : undefined;\n if (val && val !== '0' && val !== 'false') return true;\n } catch {\n // process may not exist or env may throw — safe to ignore\n }\n\n return false;\n}\n","/**\n * Centralized AsyncLocalStorage registry for server-side per-request state.\n *\n * ALL ALS instances used by the server framework live here. Individual\n * modules (request-context.ts, tracing.ts, actions.ts, etc.) import from\n * this registry and re-export public accessor functions.\n *\n * Why: ALS instances require singleton semantics — if two copies of the\n * same ALS exist (one from a relative import, one from a barrel import),\n * one module writes to its copy and another reads from an empty copy.\n * Centralizing ALS creation in a single module eliminates this class of bug.\n *\n * The `timber-shims` plugin ensures `@timber-js/app/server` resolves to\n * src/ in RSC and SSR environments, so all import paths converge here.\n *\n * DO NOT create ALS instances outside this file. If you need a new ALS,\n * add it here and import from `./als-registry.js` in the consuming module.\n *\n * See design/18-build-system.md §\"Module Singleton Strategy\" and\n * §\"Singleton State Registry\".\n */\n\nimport { AsyncLocalStorage } from 'node:async_hooks';\nimport type { DebugComponentEntry } from './rsc-entry/helpers.js';\n\n// ─── Request Context ──────────────────────────────────────────────────────\n// Used by: request-context.ts (getHeaders(), getCookies(), getSearchParams())\n// Design doc: design/04-authorization.md\n\n/** @internal — import via request-context.ts public API */\nexport const requestContextAls = new AsyncLocalStorage<RequestContextStore>();\n\nexport interface RequestContextStore {\n /** Incoming request headers (read-only view). */\n headers: Headers;\n /** Raw cookie header string, parsed lazily into a Map on first access. */\n cookieHeader: string;\n /** Lazily-parsed cookie map (mutable — reflects write-overlay from set()). */\n parsedCookies?: Map<string, string>;\n /** Original (pre-overlay) frozen headers, kept for overlay merging. */\n originalHeaders: Headers;\n /**\n * Raw URLSearchParams for the current request.\n * To get typed parsed params, import a search params definition and\n * call `.parse(searchParams())`.\n */\n searchParams: URLSearchParams;\n /**\n * Raw search string from the request URL (e.g. \"?foo=bar&baz=1\").\n * Available synchronously for use in `redirect()` with `preserveSearchParams`.\n */\n searchString: string;\n /**\n * Coerced segment params for the current request.\n * Set by the pipeline after route matching and param coercion, before\n * middleware and rendering. Pages and layouts read params via\n * `getSegmentParams()` instead of receiving them as a prop.\n *\n * See design/07-routing.md §\"params.ts — Convention File for Typed Params\"\n */\n segmentParams?: Record<string, string | string[]>;\n /**\n * The matched route pattern (e.g. '/[artistSlug]/[year]').\n * Set by the pipeline alongside segmentParams. Used by\n * getSegmentParams() for dev-mode route mismatch validation.\n * See design/41-global-params.md §Runtime Validation\n */\n matchedRoutePattern?: string;\n /** Outgoing Set-Cookie entries (name → serialized value + options). Last write wins. */\n cookieJar: Map<string, CookieEntry>;\n /** Whether the response has flushed (headers committed). */\n flushed: boolean;\n /** Whether the current context allows cookie mutation. */\n mutableContext: boolean;\n /**\n * Set by AccessGate or PageDenyBoundary when a DenySignal is caught\n * server-side (inside the React tree, before React Flight sees it).\n * The pipeline reads this after render to set the HTTP status code.\n * See TIM-666.\n */\n denyStatus?: number;\n /**\n * Dev-only: getter for the current request's RSC debug components.\n * Set by renderRoute() so onPipelineError can include component tree\n * context for render-phase errors without module-level shared state.\n */\n debugComponentsGetter?: () => DebugComponentEntry[];\n}\n\n/** A single outgoing cookie entry in the cookie jar. */\nexport interface CookieEntry {\n name: string;\n value: string;\n options: import('./cookie-context.js').CookieOptions;\n}\n\n// ─── Tracing ──────────────────────────────────────────────────────────────\n// Used by: tracing.ts (getTraceId(), getSpanId())\n// Design doc: design/17-logging.md\n\nexport interface TraceStore {\n /** 32-char lowercase hex trace ID (OTEL or UUID fallback). */\n traceId: string;\n /** OTEL span ID if available, undefined otherwise. */\n spanId?: string;\n}\n\n/** @internal — import via tracing.ts public API */\nexport const traceAls = new AsyncLocalStorage<TraceStore>();\n\n// ─── Server-Timing ────────────────────────────────────────────────────────\n// Used by: server-timing.ts (recordTiming(), withTiming())\n// Design doc: (dev-only performance instrumentation)\n\nexport interface TimingStore {\n entries: import('./server-timing.js').TimingEntry[];\n}\n\n/** @internal — import via server-timing.ts public API */\nexport const timingAls = new AsyncLocalStorage<TimingStore>();\n\n// ─── Revalidation ─────────────────────────────────────────────────────────\n// Used by: actions.ts (revalidatePath(), revalidateTag())\n// Design doc: design/08-forms-and-actions.md\n\nexport interface RevalidationState {\n /** Paths to re-render (populated by revalidatePath calls). */\n paths: string[];\n /** Tags to invalidate (populated by revalidateTag calls). */\n tags: string[];\n}\n\n/** @internal — import via actions.ts public API */\nexport const revalidationAls = new AsyncLocalStorage<RevalidationState>();\n\n// ─── Form Flash ───────────────────────────────────────────────────────────\n// Used by: form-flash.ts (getFormFlash())\n// Design doc: design/08-forms-and-actions.md §\"No-JS Error Round-Trip\"\n\n/** @internal — import via form-flash.ts public API */\nexport const formFlashAls = new AsyncLocalStorage<import('./form-flash.js').FormFlashData>();\n\n// ─── Early Hints Sender ──────────────────────────────────────────────────\n// Used by: early-hints-sender.ts (sendEarlyHints103())\n// Design doc: design/02-rendering-pipeline.md §\"Early Hints (103)\"\n\n/** Function that sends Link header values as a 103 Early Hints response. */\nexport type EarlyHintsSenderFn = (links: string[]) => void;\n\n/** @internal — import via early-hints-sender.ts public API */\nexport const earlyHintsSenderAls = new AsyncLocalStorage<EarlyHintsSenderFn>();\n\n// ─── waitUntil Bridge ────────────────────────────────────────────────────\n// Used by: waituntil-bridge.ts (waitUntil())\n// Design doc: design/11-platform.md §\"waitUntil()\"\n\n/** Function that extends the request lifecycle with a background promise. */\nexport type WaitUntilFn = (promise: Promise<unknown>) => void;\n\n/** @internal — import via waituntil-bridge.ts public API */\nexport const waitUntilAls = new AsyncLocalStorage<WaitUntilFn>();\n","/**\n * Tracing — per-request trace ID via AsyncLocalStorage, OTEL span helpers.\n *\n * getTraceId() is always available in server code (middleware, access, components, actions).\n * Returns a 32-char lowercase hex string — the OTEL trace ID when an SDK is active,\n * or a crypto.randomUUID()-derived fallback otherwise.\n *\n * See design/17-logging.md §\"trace_id is Always Set\"\n */\n\nimport { randomUUID } from 'node:crypto';\nimport { traceAls, type TraceStore } from './als-registry.js';\n\n// Re-export the TraceStore type for public API consumers.\nexport type { TraceStore } from './als-registry.js';\n\n// ─── Public API ───────────────────────────────────────────────────────────\n\n/**\n * Returns the current request's trace ID — always a 32-char lowercase hex string.\n *\n * With OTEL: the real OTEL trace ID (matches Jaeger/Honeycomb/Datadog).\n * Without OTEL: crypto.randomUUID() with hyphens stripped.\n *\n * Throws if called outside a request context (no ALS store).\n */\nexport function getTraceId(): string {\n const store = traceAls.getStore();\n if (!store) {\n throw new Error(\n '[timber] getTraceId() called outside of a request context. ' +\n 'It can only be used in middleware, access checks, server components, and server actions.'\n );\n }\n return store.traceId;\n}\n\n/**\n * Returns the current OTEL span ID if available, undefined otherwise.\n */\nexport function getSpanId(): string | undefined {\n return traceAls.getStore()?.spanId;\n}\n\n// ─── Framework-Internal Helpers ───────────────────────────────────────────\n\n/**\n * Generate a 32-char lowercase hex ID from crypto.randomUUID().\n * Same format as OTEL trace IDs — zero-friction upgrade path.\n */\nexport function generateTraceId(): string {\n return randomUUID().replace(/-/g, '');\n}\n\n/**\n * Run a callback within a trace context. Used by the pipeline to establish\n * per-request ALS scope.\n */\nexport function runWithTraceId<T>(id: string, fn: () => T): T {\n return traceAls.run({ traceId: id }, fn);\n}\n\n/**\n * Replace the trace ID in the current ALS store. Used when OTEL creates\n * a root span and we want to switch from the UUID fallback to the real\n * OTEL trace ID.\n */\nexport function replaceTraceId(newTraceId: string, newSpanId?: string): void {\n const store = traceAls.getStore();\n if (store) {\n store.traceId = newTraceId;\n store.spanId = newSpanId;\n }\n}\n\n/**\n * Update the span ID in the current ALS store. Used when entering a new\n * OTEL span to keep log–trace correlation accurate.\n */\nexport function updateSpanId(newSpanId: string | undefined): void {\n const store = traceAls.getStore();\n if (store) {\n store.spanId = newSpanId;\n }\n}\n\n/**\n * Get the current trace store, or undefined if outside a request context.\n * Framework-internal — use getTraceId()/getSpanId() in user code.\n */\nexport function getTraceStore(): TraceStore | undefined {\n return traceAls.getStore();\n}\n\n// ─── Dev-Mode OTEL Auto-Init ─────────────────────────────────────────────\n\n/**\n * Initialize a minimal OTEL SDK in dev mode so spans are recorded and\n * fed to the DevSpanProcessor for dev log output.\n *\n * If the user already configured an OTEL SDK in register(), we add\n * our DevSpanProcessor alongside theirs. If no SDK is configured,\n * we create a BasicTracerProvider with our processor.\n *\n * Only called in dev mode — zero overhead in production.\n */\nexport async function initDevTracing(\n config: import('../dev-tools/logger.js').DevLoggerConfig\n): Promise<void> {\n const api = await getOtelApi();\n if (!api) return;\n\n let DevSpanProcessor: typeof import('../dev-tools/instrumentation.js').DevSpanProcessor;\n let BasicTracerProvider: typeof import('@opentelemetry/sdk-trace-base').BasicTracerProvider;\n let AsyncLocalStorageContextManager: typeof import('@opentelemetry/context-async-hooks').AsyncLocalStorageContextManager;\n\n try {\n ({ DevSpanProcessor } = await import('../dev-tools/instrumentation.js'));\n ({ BasicTracerProvider } = await import('@opentelemetry/sdk-trace-base'));\n ({ AsyncLocalStorageContextManager } = await import('@opentelemetry/context-async-hooks'));\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n console.warn(`[timber] Dev tracing disabled — failed to load OTEL packages:\\n ${msg}`);\n return;\n }\n\n const processor = new DevSpanProcessor(config);\n\n // Register a context manager so OTEL can propagate the active span\n // across async boundaries. Without this, startActiveSpan can't make\n // spans \"active\" — child spans get random trace IDs and getActiveSpan()\n // returns undefined.\n const contextManager = new AsyncLocalStorageContextManager();\n contextManager.enable();\n api.context.setGlobalContextManager(contextManager);\n\n // Create a minimal TracerProvider with our DevSpanProcessor.\n // If the user also configures an SDK in register(), their provider\n // will coexist — the global provider set last wins for new tracers,\n // but our processor captures all spans from the timber.js tracer.\n const provider = new BasicTracerProvider({\n spanProcessors: [processor],\n });\n api.trace.setGlobalTracerProvider(provider);\n\n // Reset cached tracer so next getTracer() picks up the new provider\n _tracer = undefined;\n}\n\n// ─── OTEL Span Helpers ───────────────────────────────────────────────────\n\n/**\n * Attempt to get the @opentelemetry/api tracer. Returns undefined if the\n * package is not installed or no SDK is registered.\n *\n * timber.js depends on @opentelemetry/api as the vendor-neutral interface.\n * The API is a no-op by default — spans are only emitted when the developer\n * initializes an SDK in register().\n */\nlet _otelApi: typeof import('@opentelemetry/api') | null | undefined;\n\nasync function getOtelApi(): Promise<typeof import('@opentelemetry/api') | null> {\n if (_otelApi === undefined) {\n try {\n _otelApi = await import('@opentelemetry/api');\n } catch {\n _otelApi = null;\n }\n }\n return _otelApi;\n}\n\n/** OTEL tracer instance, lazily created. */\nlet _tracer: import('@opentelemetry/api').Tracer | null | undefined;\n\n/**\n * Get the timber.js OTEL tracer. Returns null if @opentelemetry/api is not available.\n */\nexport async function getTracer(): Promise<import('@opentelemetry/api').Tracer | null> {\n if (_tracer === undefined) {\n const api = await getOtelApi();\n if (api) {\n _tracer = api.trace.getTracer('timber.js');\n } else {\n _tracer = null;\n }\n }\n return _tracer;\n}\n\n/**\n * Run a function within an OTEL span. If OTEL is not available, runs the function\n * directly without any span overhead.\n *\n * Automatically:\n * - Creates the span as a child of the current context\n * - Updates the ALS span ID for log–trace correlation\n * - Ends the span when the function completes\n * - Records exceptions on error\n */\nexport async function withSpan<T>(\n name: string,\n attributes: Record<string, string | number | boolean>,\n fn: () => T | Promise<T>\n): Promise<T> {\n const tracer = await getTracer();\n if (!tracer) {\n return fn();\n }\n\n const api = (await getOtelApi())!;\n return tracer.startActiveSpan(name, { attributes }, async (span) => {\n const prevSpanId = getSpanId();\n updateSpanId(span.spanContext().spanId);\n try {\n const result = await fn();\n span.setStatus({ code: api.SpanStatusCode.OK });\n return result;\n } catch (error) {\n span.setStatus({ code: api.SpanStatusCode.ERROR });\n if (error instanceof Error) {\n span.recordException(error);\n }\n throw error;\n } finally {\n span.end();\n updateSpanId(prevSpanId);\n }\n });\n}\n\n/**\n * Set an attribute on the current active span (if any).\n * Used for setting span attributes after span creation (e.g. timber.result on access spans).\n */\nexport async function setSpanAttribute(\n key: string,\n value: string | number | boolean\n): Promise<void> {\n const api = await getOtelApi();\n if (!api) return;\n\n const activeSpan = api.trace.getActiveSpan();\n if (activeSpan) {\n activeSpan.setAttribute(key, value);\n }\n}\n\n/**\n * Add a span event to the current active span (if any).\n * Used for timber.cache HIT/MISS events — recorded as span events, not child spans.\n */\nexport async function addSpanEvent(\n name: string,\n attributes?: Record<string, string | number | boolean>\n): Promise<void> {\n const api = await getOtelApi();\n if (!api) return;\n\n const activeSpan = api.trace.getActiveSpan();\n if (activeSpan) {\n activeSpan.addEvent(name, attributes);\n }\n}\n\n/**\n * Fire-and-forget span event — no await, no microtask overhead.\n *\n * Used on the cache hot path where awaiting addSpanEvent creates an\n * unnecessary microtask per cache operation. If OTEL is not loaded yet,\n * the event is silently dropped (acceptable for diagnostics).\n *\n * See TIM-370 for perf motivation.\n */\nexport function addSpanEventSync(\n name: string,\n attributes?: Record<string, string | number | boolean>\n): void {\n // Fast path: if OTEL API hasn't been loaded yet, skip entirely.\n // _otelApi is undefined (not yet loaded), null (failed to load), or the module.\n if (!_otelApi) return;\n\n const activeSpan = _otelApi.trace.getActiveSpan();\n if (activeSpan) {\n activeSpan.addEvent(name, attributes);\n }\n}\n\n/**\n * Try to extract the OTEL trace ID from the current active span context.\n * Returns undefined if OTEL is not active or no span exists.\n */\nexport async function getOtelTraceId(): Promise<{ traceId: string; spanId: string } | undefined> {\n const api = await getOtelApi();\n if (!api) return undefined;\n\n const activeSpan = api.trace.getActiveSpan();\n if (!activeSpan) return undefined;\n\n const ctx = activeSpan.spanContext();\n // OTEL uses \"0000000000000000\" as invalid trace IDs\n if (!ctx.traceId || ctx.traceId === '00000000000000000000000000000000') {\n return undefined;\n }\n\n return { traceId: ctx.traceId, spanId: ctx.spanId };\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA6DA,SAAgB,YAAqB;AACnC,QAAA,QAAA,IAAA,aAAgC;;;;;;AASlC,IAAI,eAAe;;;;;;;;;;;;;;;;;AA0BnB,SAAgB,UAAmB;AAEjC,KAAA,QAAA,IAAA,aAA6B,aAAc,QAAO;AAGlD,KAAI,aAAc,QAAO;AAMzB,QAAO,qBAAqB;;;;;;;;;;AAW9B,SAAS,sBAA+B;AAEtC,KAAK,WAAuC,eAAgB,QAAO;AAGnE,KAAI;EAEF,MAAM,MACJ,OAAO,YAAY,eAAe,QAAQ,MACrC,QAAQ,IAHH,kBAIN,KAAA;AACN,MAAI,OAAO,QAAQ,OAAO,QAAQ,QAAS,QAAO;SAC5C;AAIR,QAAO;;;;;;;;;;;;;;;;;;;;;;;;;;ACzGT,IAAa,oBAAoB,IAAI,mBAAwC;;AA8E7E,IAAa,WAAW,IAAI,mBAA+B;;AAW3D,IAAa,YAAY,IAAI,mBAAgC;;AAc7D,IAAa,kBAAkB,IAAI,mBAAsC;;AAOzE,IAAa,eAAe,IAAI,mBAA4D;;AAU5F,IAAa,sBAAsB,IAAI,mBAAuC;;AAU9E,IAAa,eAAe,IAAI,mBAAgC;;;;;;;;;;;;;;;;;;;;ACtIhE,SAAgB,aAAqB;CACnC,MAAM,QAAQ,SAAS,UAAU;AACjC,KAAI,CAAC,MACH,OAAM,IAAI,MACR,sJAED;AAEH,QAAO,MAAM;;;;;AAMf,SAAgB,YAAgC;AAC9C,QAAO,SAAS,UAAU,EAAE;;;;;;AAS9B,SAAgB,kBAA0B;AACxC,QAAO,YAAY,CAAC,QAAQ,MAAM,GAAG;;;;;;AAOvC,SAAgB,eAAkB,IAAY,IAAgB;AAC5D,QAAO,SAAS,IAAI,EAAE,SAAS,IAAI,EAAE,GAAG;;;;;;;AAQ1C,SAAgB,eAAe,YAAoB,WAA0B;CAC3E,MAAM,QAAQ,SAAS,UAAU;AACjC,KAAI,OAAO;AACT,QAAM,UAAU;AAChB,QAAM,SAAS;;;;;;;AAQnB,SAAgB,aAAa,WAAqC;CAChE,MAAM,QAAQ,SAAS,UAAU;AACjC,KAAI,MACF,OAAM,SAAS;;;;;;AAQnB,SAAgB,gBAAwC;AACtD,QAAO,SAAS,UAAU;;;;;;;;;;AAoE5B,IAAI;AAEJ,eAAe,aAAkE;AAC/E,KAAI,aAAa,KAAA,EACf,KAAI;AACF,aAAW,MAAM,OAAO;SAClB;AACN,aAAW;;AAGf,QAAO;;;AAIT,IAAI;;;;AAKJ,eAAsB,YAAiE;AACrF,KAAI,YAAY,KAAA,GAAW;EACzB,MAAM,MAAM,MAAM,YAAY;AAC9B,MAAI,IACF,WAAU,IAAI,MAAM,UAAU,YAAY;MAE1C,WAAU;;AAGd,QAAO;;;;;;;;;;;;AAaT,eAAsB,SACpB,MACA,YACA,IACY;CACZ,MAAM,SAAS,MAAM,WAAW;AAChC,KAAI,CAAC,OACH,QAAO,IAAI;CAGb,MAAM,MAAO,MAAM,YAAY;AAC/B,QAAO,OAAO,gBAAgB,MAAM,EAAE,YAAY,EAAE,OAAO,SAAS;EAClE,MAAM,aAAa,WAAW;AAC9B,eAAa,KAAK,aAAa,CAAC,OAAO;AACvC,MAAI;GACF,MAAM,SAAS,MAAM,IAAI;AACzB,QAAK,UAAU,EAAE,MAAM,IAAI,eAAe,IAAI,CAAC;AAC/C,UAAO;WACA,OAAO;AACd,QAAK,UAAU,EAAE,MAAM,IAAI,eAAe,OAAO,CAAC;AAClD,OAAI,iBAAiB,MACnB,MAAK,gBAAgB,MAAM;AAE7B,SAAM;YACE;AACR,QAAK,KAAK;AACV,gBAAa,WAAW;;GAE1B;;;;;;AAOJ,eAAsB,iBACpB,KACA,OACe;CACf,MAAM,MAAM,MAAM,YAAY;AAC9B,KAAI,CAAC,IAAK;CAEV,MAAM,aAAa,IAAI,MAAM,eAAe;AAC5C,KAAI,WACF,YAAW,aAAa,KAAK,MAAM;;;;;;AAQvC,eAAsB,aACpB,MACA,YACe;CACf,MAAM,MAAM,MAAM,YAAY;AAC9B,KAAI,CAAC,IAAK;CAEV,MAAM,aAAa,IAAI,MAAM,eAAe;AAC5C,KAAI,WACF,YAAW,SAAS,MAAM,WAAW;;;;;;;;;;;AAazC,SAAgB,iBACd,MACA,YACM;AAGN,KAAI,CAAC,SAAU;CAEf,MAAM,aAAa,SAAS,MAAM,eAAe;AACjD,KAAI,WACF,YAAW,SAAS,MAAM,WAAW;;;;;;AAQzC,eAAsB,iBAA2E;CAC/F,MAAM,MAAM,MAAM,YAAY;AAC9B,KAAI,CAAC,IAAK,QAAO,KAAA;CAEjB,MAAM,aAAa,IAAI,MAAM,eAAe;AAC5C,KAAI,CAAC,WAAY,QAAO,KAAA;CAExB,MAAM,MAAM,WAAW,aAAa;AAEpC,KAAI,CAAC,IAAI,WAAW,IAAI,YAAY,mCAClC;AAGF,QAAO;EAAE,SAAS,IAAI;EAAS,QAAQ,IAAI;EAAQ"}
@@ -1,21 +1,5 @@
1
+ import { t as getSearchParamsDefinition } from "./registry-Dp_hJL4s.js";
1
2
  import { useQueryStates } from "nuqs";
2
- //#region src/search-params/registry.ts
3
- var registry = /* @__PURE__ */ new Map();
4
- /**
5
- * Register a route's search params definition.
6
- * Called by the generated route manifest loader when a route's modules load.
7
- */
8
- function registerSearchParams(route, definition) {
9
- registry.set(route, definition);
10
- }
11
- /**
12
- * Look up a route's search params definition.
13
- * Returns undefined if the route hasn't been loaded yet.
14
- */
15
- function getSearchParams(route) {
16
- return registry.get(route);
17
- }
18
- //#endregion
19
3
  //#region src/client/use-query-states.ts
20
4
  /**
21
5
  * useQueryStates — client-side hook for URL-synced search params.
@@ -69,13 +53,16 @@ function useQueryStates$1(codecsOrRoute, _options, urlKeys) {
69
53
  let codecs;
70
54
  let resolvedUrlKeys = urlKeys;
71
55
  if (typeof codecsOrRoute === "string") {
72
- const definition = getSearchParams(codecsOrRoute);
56
+ const definition = getSearchParamsDefinition(codecsOrRoute);
73
57
  if (!definition) throw new Error(`useQueryStates('${codecsOrRoute}'): no search params registered for this route. Either the route has no search-params.ts file, or it hasn't been loaded yet. For cross-route usage, import the definition explicitly.`);
74
58
  codecs = definition.codecs;
75
59
  resolvedUrlKeys = definition.urlKeys;
76
60
  } else codecs = codecsOrRoute;
77
61
  const bridged = bridgeCodecs(codecs);
78
62
  const nuqsOptions = {};
63
+ if (_options?.shallow !== void 0) nuqsOptions.shallow = _options.shallow;
64
+ if (_options?.scroll !== void 0) nuqsOptions.scroll = _options.scroll;
65
+ if (_options?.history !== void 0) nuqsOptions.history = _options.history;
79
66
  if (resolvedUrlKeys && Object.keys(resolvedUrlKeys).length > 0) nuqsOptions.urlKeys = resolvedUrlKeys;
80
67
  let values;
81
68
  let setValues;
@@ -104,6 +91,6 @@ function bindUseQueryStates(definition) {
104
91
  };
105
92
  }
106
93
  //#endregion
107
- export { registerSearchParams as i, useQueryStates$1 as n, getSearchParams as r, bindUseQueryStates as t };
94
+ export { useQueryStates$1 as n, bindUseQueryStates as t };
108
95
 
109
- //# sourceMappingURL=use-query-states-D5KaffOK.js.map
96
+ //# sourceMappingURL=use-query-states-D9SBlAfp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-query-states-D9SBlAfp.js","names":[],"sources":["../../src/client/use-query-states.ts"],"sourcesContent":["/**\n * useQueryStates — client-side hook for URL-synced search params.\n *\n * Delegates to nuqs for URL synchronization, batching, React 19 transitions,\n * and throttled URL writes. Bridges timber's SearchParamCodec protocol to\n * nuqs-compatible parsers.\n *\n * Design doc: design/23-search-params.md §\"Codec Bridge\"\n */\n\n'use client';\n\nimport { useQueryStates as nuqsUseQueryStates } from 'nuqs';\nimport type { SingleParser } from 'nuqs';\nimport type {\n SearchParamCodec,\n SearchParamsDefinition,\n SetParams,\n QueryStatesOptions,\n} from '../search-params/define.js';\nimport { getSearchParamsDefinition } from '../search-params/registry.js';\n\n// ─── Codec Bridge ─────────────────────────────────────────────────\n\n/**\n * Bridge a timber SearchParamCodec to a nuqs-compatible SingleParser.\n *\n * nuqs parsers: { parse(string) → T|null, serialize?(T) → string, eq?, defaultValue? }\n * timber codecs: { parse(string|string[]|undefined) → T, serialize(T) → string|null }\n */\nfunction bridgeCodec<T>(codec: SearchParamCodec<T>): SingleParser<T> & { defaultValue: T } {\n return {\n parse: (v: string) => codec.parse(v),\n serialize: (v: T) => codec.serialize(v) ?? '',\n defaultValue: codec.parse(undefined) as T,\n eq: (a: T, b: T) => codec.serialize(a) === codec.serialize(b),\n };\n}\n\n/**\n * Bridge an entire codec map to nuqs-compatible parsers.\n */\nfunction bridgeCodecs<T extends Record<string, unknown>>(codecs: {\n [K in keyof T]: SearchParamCodec<T[K]>;\n}) {\n const result: Record<string, SingleParser<unknown> & { defaultValue: unknown }> = {};\n for (const key of Object.keys(codecs)) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n result[key] = bridgeCodec(codecs[key as keyof T]) as any;\n }\n return result as { [K in keyof T]: SingleParser<T[K]> & { defaultValue: T[K] } };\n}\n\n// ─── Hook ─────────────────────────────────────────────────────────\n\n/**\n * Read and write typed search params from/to the URL.\n *\n * Delegates to nuqs internally. The timber nuqs adapter (auto-injected in\n * browser-entry.ts) handles RSC navigation on non-shallow updates.\n *\n * Usage:\n * ```ts\n * // Via a SearchParamsDefinition\n * const [params, setParams] = definition.useQueryStates()\n *\n * // Standalone with inline codecs\n * const [params, setParams] = useQueryStates({\n * page: fromSchema(z.coerce.number().int().min(1).default(1)),\n * })\n * ```\n */\nexport function useQueryStates<T extends Record<string, unknown>>(\n codecsOrRoute: { [K in keyof T]: SearchParamCodec<T[K]> } | string,\n _options?: QueryStatesOptions,\n urlKeys?: Readonly<Record<string, string>>\n): [T, SetParams<T>] {\n // Route-string overload: resolve codecs from the registry\n let codecs: { [K in keyof T]: SearchParamCodec<T[K]> };\n let resolvedUrlKeys = urlKeys;\n if (typeof codecsOrRoute === 'string') {\n const definition = getSearchParamsDefinition(codecsOrRoute);\n if (!definition) {\n throw new Error(\n `useQueryStates('${codecsOrRoute}'): no search params registered for this route. ` +\n `Either the route has no search-params.ts file, or it hasn't been loaded yet. ` +\n `For cross-route usage, import the definition explicitly.`\n );\n }\n codecs = definition.codecs as { [K in keyof T]: SearchParamCodec<T[K]> };\n resolvedUrlKeys = definition.urlKeys;\n } else {\n codecs = codecsOrRoute;\n }\n\n const bridged = bridgeCodecs(codecs);\n\n // Forward hook-level options (shallow, scroll, history) to nuqs.\n // These become the default for all setter calls from this hook instance.\n // Per-call options in setParams(values, opts) override these defaults.\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const nuqsOptions: any = {};\n if (_options?.shallow !== undefined) nuqsOptions.shallow = _options.shallow;\n if (_options?.scroll !== undefined) nuqsOptions.scroll = _options.scroll;\n if (_options?.history !== undefined) nuqsOptions.history = _options.history;\n if (resolvedUrlKeys && Object.keys(resolvedUrlKeys).length > 0) {\n nuqsOptions.urlKeys = resolvedUrlKeys;\n }\n\n let values: Record<string, unknown>;\n let setValues: Function;\n try {\n [values, setValues] = nuqsUseQueryStates(bridged, nuqsOptions);\n } catch (err) {\n if (\n err instanceof Error &&\n /Invalid hook call|cannot be called|Cannot read properties of null/i.test(err.message)\n ) {\n throw new Error(\n 'useQueryStates is a client component hook and cannot be called outside a React component. ' +\n 'Use definition.parse(searchParams) in server components instead.'\n );\n }\n throw err;\n }\n\n // Wrap the nuqs setter to match timber's SetParams<T> signature.\n // nuqs's setter accepts Partial<Nullable<Values>> | UpdaterFn | null.\n // timber's setter accepts Partial<T> with optional SetParamsOptions.\n const setParams: SetParams<T> = (partial, setOptions?) => {\n const nuqsSetOptions: Record<string, unknown> = {};\n if (setOptions?.shallow !== undefined) nuqsSetOptions.shallow = setOptions.shallow;\n if (setOptions?.scroll !== undefined) nuqsSetOptions.scroll = setOptions.scroll;\n if (setOptions?.history !== undefined) nuqsSetOptions.history = setOptions.history;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n void setValues(partial as any, nuqsSetOptions);\n };\n\n return [values as T, setParams];\n}\n\n// ─── Definition binding ───────────────────────────────────────────\n\n/**\n * Create a useQueryStates binding for a SearchParamsDefinition.\n * This is used internally by SearchParamsDefinition.useQueryStates().\n */\nexport function bindUseQueryStates<T extends Record<string, unknown>>(\n definition: SearchParamsDefinition<T>\n): (options?: QueryStatesOptions) => [T, SetParams<T>] {\n return (options?: QueryStatesOptions) => {\n return useQueryStates<T>(definition.codecs, options, definition.urlKeys);\n };\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AA8BA,SAAS,YAAe,OAAmE;AACzF,QAAO;EACL,QAAQ,MAAc,MAAM,MAAM,EAAE;EACpC,YAAY,MAAS,MAAM,UAAU,EAAE,IAAI;EAC3C,cAAc,MAAM,MAAM,KAAA,EAAU;EACpC,KAAK,GAAM,MAAS,MAAM,UAAU,EAAE,KAAK,MAAM,UAAU,EAAE;EAC9D;;;;;AAMH,SAAS,aAAgD,QAEtD;CACD,MAAM,SAA4E,EAAE;AACpF,MAAK,MAAM,OAAO,OAAO,KAAK,OAAO,CAEnC,QAAO,OAAO,YAAY,OAAO,KAAgB;AAEnD,QAAO;;;;;;;;;;;;;;;;;;;AAsBT,SAAgB,iBACd,eACA,UACA,SACmB;CAEnB,IAAI;CACJ,IAAI,kBAAkB;AACtB,KAAI,OAAO,kBAAkB,UAAU;EACrC,MAAM,aAAa,0BAA0B,cAAc;AAC3D,MAAI,CAAC,WACH,OAAM,IAAI,MACR,mBAAmB,cAAc,uLAGlC;AAEH,WAAS,WAAW;AACpB,oBAAkB,WAAW;OAE7B,UAAS;CAGX,MAAM,UAAU,aAAa,OAAO;CAMpC,MAAM,cAAmB,EAAE;AAC3B,KAAI,UAAU,YAAY,KAAA,EAAW,aAAY,UAAU,SAAS;AACpE,KAAI,UAAU,WAAW,KAAA,EAAW,aAAY,SAAS,SAAS;AAClE,KAAI,UAAU,YAAY,KAAA,EAAW,aAAY,UAAU,SAAS;AACpE,KAAI,mBAAmB,OAAO,KAAK,gBAAgB,CAAC,SAAS,EAC3D,aAAY,UAAU;CAGxB,IAAI;CACJ,IAAI;AACJ,KAAI;AACF,GAAC,QAAQ,aAAa,eAAmB,SAAS,YAAY;UACvD,KAAK;AACZ,MACE,eAAe,SACf,qEAAqE,KAAK,IAAI,QAAQ,CAEtF,OAAM,IAAI,MACR,6JAED;AAEH,QAAM;;CAMR,MAAM,aAA2B,SAAS,eAAgB;EACxD,MAAM,iBAA0C,EAAE;AAClD,MAAI,YAAY,YAAY,KAAA,EAAW,gBAAe,UAAU,WAAW;AAC3E,MAAI,YAAY,WAAW,KAAA,EAAW,gBAAe,SAAS,WAAW;AACzE,MAAI,YAAY,YAAY,KAAA,EAAW,gBAAe,UAAU,WAAW;AAEtE,YAAU,SAAgB,eAAe;;AAGhD,QAAO,CAAC,QAAa,UAAU;;;;;;AASjC,SAAgB,mBACd,YACqD;AACrD,SAAQ,YAAiC;AACvC,SAAO,iBAAkB,WAAW,QAAQ,SAAS,WAAW,QAAQ"}
@@ -0,0 +1,185 @@
1
+ import { t as __exportAll } from "../index.js";
2
+ import { a as _setCurrentParams, l as currentParams, n as getSsrData } from "./ssr-data-BO5OvEvg.js";
3
+ import React, { createElement } from "react";
4
+ //#region src/client/navigation-context.ts
5
+ /**
6
+ * NavigationContext — React context for navigation state.
7
+ *
8
+ * Holds the current route params and pathname, updated atomically
9
+ * with the RSC tree on each navigation. This replaces the previous
10
+ * useSyncExternalStore approach for useSegmentParams() and usePathname(),
11
+ * which suffered from a timing gap: the new tree could commit before
12
+ * the external store re-renders fired, causing a frame where both
13
+ * old and new active states were visible simultaneously.
14
+ *
15
+ * By wrapping the RSC payload element in NavigationProvider inside
16
+ * renderRoot(), the context value and the element tree are passed to
17
+ * reactRoot.render() in the same call — atomic by construction.
18
+ * All consumers (useParams, usePathname) see the new values in the
19
+ * same render pass as the new tree.
20
+ *
21
+ * During SSR, no NavigationProvider is mounted. Hooks fall back to
22
+ * the ALS-backed getSsrData() for per-request isolation.
23
+ *
24
+ * IMPORTANT: createContext and useContext are NOT available in the RSC
25
+ * environment (React Server Components use a stripped-down React).
26
+ * The context is lazily initialized on first access, and all functions
27
+ * that depend on these APIs are safe to call from any environment —
28
+ * they return null or no-op when the APIs aren't available.
29
+ *
30
+ * SINGLETON GUARANTEE: All shared mutable state uses globalThis via
31
+ * Symbol.for keys. The RSC client bundler can duplicate this module
32
+ * across chunks (browser-entry graph + client-reference graph). With
33
+ * ESM output, each chunk gets its own module scope — module-level
34
+ * variables would create separate singleton instances per chunk.
35
+ * globalThis guarantees a single instance regardless of duplication.
36
+ *
37
+ * This workaround will be removed when Rolldown ships `format: 'app'`
38
+ * (module registry format that deduplicates like webpack/Turbopack).
39
+ * See design/27-chunking-strategy.md.
40
+ *
41
+ * See design/19-client-navigation.md §"NavigationContext"
42
+ */
43
+ /**
44
+ * The context is created lazily to avoid calling createContext at module
45
+ * level. In the RSC environment, React.createContext doesn't exist —
46
+ * calling it at import time would crash the server.
47
+ *
48
+ * Context instances are stored on globalThis (NOT in module-level
49
+ * variables) because the ESM bundler can duplicate this module across
50
+ * chunks. Module-level variables would create separate instances per
51
+ * chunk — the provider in NavigationRoot (index chunk) would use
52
+ * context A while the consumer in usePendingNavigation (shared chunk)
53
+ * reads from context B. globalThis guarantees a single instance.
54
+ *
55
+ * See design/27-chunking-strategy.md §"Singleton Safety"
56
+ *
57
+ * NOTE: Despite similar naming, `usePendingNavigationUrl()` here is an
58
+ * internal helper — the public hook is `usePendingNavigation()` in
59
+ * use-pending-navigation.ts.
60
+ */
61
+ var NAV_CTX_KEY = Symbol.for("__timber_nav_ctx");
62
+ var PENDING_CTX_KEY = Symbol.for("__timber_pending_nav_ctx");
63
+ function getOrCreateContext() {
64
+ const existing = globalThis[NAV_CTX_KEY];
65
+ if (existing !== void 0) return existing;
66
+ if (typeof React.createContext === "function") {
67
+ const ctx = React.createContext(null);
68
+ globalThis[NAV_CTX_KEY] = ctx;
69
+ return ctx;
70
+ }
71
+ }
72
+ /**
73
+ * Read the navigation context. Returns null during SSR (no provider)
74
+ * or in the RSC environment (no context available).
75
+ * Internal — used by useSegmentParams() and usePathname().
76
+ */
77
+ function useNavigationContext() {
78
+ const ctx = getOrCreateContext();
79
+ if (!ctx) return null;
80
+ if (typeof React.useContext !== "function") return null;
81
+ return React.useContext(ctx);
82
+ }
83
+ /**
84
+ * Wraps children with NavigationContext.Provider.
85
+ *
86
+ * Used in browser-entry.ts renderRoot to wrap the RSC payload element
87
+ * so that navigation state updates atomically with the tree render.
88
+ */
89
+ function NavigationProvider({ value, children }) {
90
+ const ctx = getOrCreateContext();
91
+ if (!ctx) return children;
92
+ return createElement(ctx.Provider, { value }, children);
93
+ }
94
+ /**
95
+ * Navigation state communicated between the router and renderRoot.
96
+ *
97
+ * The router calls setNavigationState() before renderRoot(). The
98
+ * renderRoot callback reads via getNavigationState() to create the
99
+ * NavigationProvider with the correct params/pathname.
100
+ *
101
+ * This is NOT used by hooks directly — hooks read from React context.
102
+ *
103
+ * Stored on globalThis (like the context instances above) because the
104
+ * router lives in one chunk while renderRoot lives in another. Module-
105
+ * level variables would be separate per chunk.
106
+ */
107
+ var NAV_STATE_KEY = Symbol.for("__timber_nav_state");
108
+ function _getNavStateStore() {
109
+ const g = globalThis;
110
+ if (!g[NAV_STATE_KEY]) g[NAV_STATE_KEY] = { current: {
111
+ params: {},
112
+ pathname: "/"
113
+ } };
114
+ return g[NAV_STATE_KEY];
115
+ }
116
+ function setNavigationState(state) {
117
+ _getNavStateStore().current = state;
118
+ }
119
+ function getNavigationState() {
120
+ return _getNavStateStore().current;
121
+ }
122
+ /**
123
+ * Separate context for the in-flight navigation URL. Provided by
124
+ * NavigationRoot (urgent useState), consumed by usePendingNavigation
125
+ * and TopLoader. Per-link pending state uses useOptimistic instead
126
+ * (see link-pending-store.ts).
127
+ *
128
+ * Uses globalThis via Symbol.for for the same reason as NavigationContext
129
+ * above — the bundler may duplicate this module across chunks, and module-
130
+ * level variables would create separate context instances.
131
+ */
132
+ function getOrCreatePendingContext() {
133
+ const existing = globalThis[PENDING_CTX_KEY];
134
+ if (existing !== void 0) return existing;
135
+ if (typeof React.createContext === "function") {
136
+ const ctx = React.createContext(null);
137
+ globalThis[PENDING_CTX_KEY] = ctx;
138
+ return ctx;
139
+ }
140
+ }
141
+ /**
142
+ * Read the pending navigation URL from context.
143
+ * Returns null during SSR (no provider) or in the RSC environment.
144
+ */
145
+ function usePendingNavigationUrl() {
146
+ const ctx = getOrCreatePendingContext();
147
+ if (!ctx) return null;
148
+ if (typeof React.useContext !== "function") return null;
149
+ return React.useContext(ctx);
150
+ }
151
+ //#endregion
152
+ //#region src/client/use-segment-params.ts
153
+ var use_segment_params_exports = /* @__PURE__ */ __exportAll({
154
+ setCurrentParams: () => setCurrentParams,
155
+ useSegmentParams: () => useSegmentParams
156
+ });
157
+ /**
158
+ * Set the current route params in the module-level store.
159
+ *
160
+ * Called by the router on each navigation. This updates the fallback
161
+ * snapshot used by tests and by the hook when called outside a React
162
+ * component (no NavigationContext available).
163
+ *
164
+ * On the client, the primary reactivity path is NavigationContext —
165
+ * the router calls setNavigationState() then renderRoot() which wraps
166
+ * the element in NavigationProvider. setCurrentParams is still called
167
+ * for the module-level fallback.
168
+ *
169
+ * During SSR, params are also available via getSsrData().params
170
+ * (ALS-backed).
171
+ */
172
+ function setCurrentParams(params) {
173
+ _setCurrentParams(params);
174
+ }
175
+ function useSegmentParams(_route) {
176
+ try {
177
+ const navContext = useNavigationContext();
178
+ if (navContext !== null) return navContext.params;
179
+ } catch {}
180
+ return getSsrData()?.params ?? currentParams;
181
+ }
182
+ //#endregion
183
+ export { getNavigationState as a, usePendingNavigationUrl as c, NavigationProvider as i, useSegmentParams as n, setNavigationState as o, use_segment_params_exports as r, useNavigationContext as s, setCurrentParams as t };
184
+
185
+ //# sourceMappingURL=use-segment-params-BSt_O2cb.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-segment-params-BSt_O2cb.js","names":[],"sources":["../../src/client/navigation-context.ts","../../src/client/use-segment-params.ts"],"sourcesContent":["'use client';\n\n/**\n * NavigationContext — React context for navigation state.\n *\n * Holds the current route params and pathname, updated atomically\n * with the RSC tree on each navigation. This replaces the previous\n * useSyncExternalStore approach for useSegmentParams() and usePathname(),\n * which suffered from a timing gap: the new tree could commit before\n * the external store re-renders fired, causing a frame where both\n * old and new active states were visible simultaneously.\n *\n * By wrapping the RSC payload element in NavigationProvider inside\n * renderRoot(), the context value and the element tree are passed to\n * reactRoot.render() in the same call — atomic by construction.\n * All consumers (useParams, usePathname) see the new values in the\n * same render pass as the new tree.\n *\n * During SSR, no NavigationProvider is mounted. Hooks fall back to\n * the ALS-backed getSsrData() for per-request isolation.\n *\n * IMPORTANT: createContext and useContext are NOT available in the RSC\n * environment (React Server Components use a stripped-down React).\n * The context is lazily initialized on first access, and all functions\n * that depend on these APIs are safe to call from any environment —\n * they return null or no-op when the APIs aren't available.\n *\n * SINGLETON GUARANTEE: All shared mutable state uses globalThis via\n * Symbol.for keys. The RSC client bundler can duplicate this module\n * across chunks (browser-entry graph + client-reference graph). With\n * ESM output, each chunk gets its own module scope — module-level\n * variables would create separate singleton instances per chunk.\n * globalThis guarantees a single instance regardless of duplication.\n *\n * This workaround will be removed when Rolldown ships `format: 'app'`\n * (module registry format that deduplicates like webpack/Turbopack).\n * See design/27-chunking-strategy.md.\n *\n * See design/19-client-navigation.md §\"NavigationContext\"\n */\n\nimport React, { createElement, type ReactNode } from 'react';\n\n// ---------------------------------------------------------------------------\n// Context type\n// ---------------------------------------------------------------------------\n\nexport interface NavigationState {\n params: Record<string, string | string[]>;\n pathname: string;\n}\n\n// ---------------------------------------------------------------------------\n// Lazy context initialization\n// ---------------------------------------------------------------------------\n\n/**\n * The context is created lazily to avoid calling createContext at module\n * level. In the RSC environment, React.createContext doesn't exist —\n * calling it at import time would crash the server.\n *\n * Context instances are stored on globalThis (NOT in module-level\n * variables) because the ESM bundler can duplicate this module across\n * chunks. Module-level variables would create separate instances per\n * chunk — the provider in NavigationRoot (index chunk) would use\n * context A while the consumer in usePendingNavigation (shared chunk)\n * reads from context B. globalThis guarantees a single instance.\n *\n * See design/27-chunking-strategy.md §\"Singleton Safety\"\n *\n * NOTE: Despite similar naming, `usePendingNavigationUrl()` here is an\n * internal helper — the public hook is `usePendingNavigation()` in\n * use-pending-navigation.ts.\n */\n\n// Symbol keys for globalThis storage — prevents collisions with user code\nconst NAV_CTX_KEY = Symbol.for('__timber_nav_ctx');\nconst PENDING_CTX_KEY = Symbol.for('__timber_pending_nav_ctx');\n\nfunction getOrCreateContext(): React.Context<NavigationState | null> | undefined {\n const existing = (globalThis as Record<symbol, unknown>)[NAV_CTX_KEY] as\n | React.Context<NavigationState | null>\n | undefined;\n if (existing !== undefined) return existing;\n // createContext may not exist in the RSC environment\n if (typeof React.createContext === 'function') {\n const ctx = React.createContext<NavigationState | null>(null);\n (globalThis as Record<symbol, unknown>)[NAV_CTX_KEY] = ctx;\n return ctx;\n }\n return undefined;\n}\n\n/**\n * Read the navigation context. Returns null during SSR (no provider)\n * or in the RSC environment (no context available).\n * Internal — used by useSegmentParams() and usePathname().\n */\nexport function useNavigationContext(): NavigationState | null {\n const ctx = getOrCreateContext();\n if (!ctx) return null;\n // useContext may not exist in the RSC environment — caller wraps in try/catch\n if (typeof React.useContext !== 'function') return null;\n return React.useContext(ctx);\n}\n\n// ---------------------------------------------------------------------------\n// Provider component\n// ---------------------------------------------------------------------------\n\nexport interface NavigationProviderProps {\n value: NavigationState;\n children?: ReactNode;\n}\n\n/**\n * Wraps children with NavigationContext.Provider.\n *\n * Used in browser-entry.ts renderRoot to wrap the RSC payload element\n * so that navigation state updates atomically with the tree render.\n */\nexport function NavigationProvider({\n value,\n children,\n}: NavigationProviderProps): React.ReactElement {\n const ctx = getOrCreateContext();\n if (!ctx) {\n // RSC environment — no context available. Return children as-is.\n return children as React.ReactElement;\n }\n return createElement(ctx.Provider, { value }, children);\n}\n\n// ---------------------------------------------------------------------------\n// Module-level state for renderRoot to read\n// ---------------------------------------------------------------------------\n\n/**\n * Navigation state communicated between the router and renderRoot.\n *\n * The router calls setNavigationState() before renderRoot(). The\n * renderRoot callback reads via getNavigationState() to create the\n * NavigationProvider with the correct params/pathname.\n *\n * This is NOT used by hooks directly — hooks read from React context.\n *\n * Stored on globalThis (like the context instances above) because the\n * router lives in one chunk while renderRoot lives in another. Module-\n * level variables would be separate per chunk.\n */\nconst NAV_STATE_KEY = Symbol.for('__timber_nav_state');\n\nfunction _getNavStateStore(): { current: NavigationState } {\n const g = globalThis as Record<symbol, unknown>;\n if (!g[NAV_STATE_KEY]) {\n g[NAV_STATE_KEY] = { current: { params: {}, pathname: '/' } };\n }\n return g[NAV_STATE_KEY] as { current: NavigationState };\n}\n\nexport function setNavigationState(state: NavigationState): void {\n _getNavStateStore().current = state;\n}\n\nexport function getNavigationState(): NavigationState {\n return _getNavStateStore().current;\n}\n\n// ---------------------------------------------------------------------------\n// Pending Navigation Context (same module for singleton guarantee)\n// ---------------------------------------------------------------------------\n\n/**\n * Separate context for the in-flight navigation URL. Provided by\n * NavigationRoot (urgent useState), consumed by usePendingNavigation\n * and TopLoader. Per-link pending state uses useOptimistic instead\n * (see link-pending-store.ts).\n *\n * Uses globalThis via Symbol.for for the same reason as NavigationContext\n * above — the bundler may duplicate this module across chunks, and module-\n * level variables would create separate context instances.\n */\n\nfunction getOrCreatePendingContext(): React.Context<string | null> | undefined {\n const existing = (globalThis as Record<symbol, unknown>)[PENDING_CTX_KEY] as\n | React.Context<string | null>\n | undefined;\n if (existing !== undefined) return existing;\n if (typeof React.createContext === 'function') {\n const ctx = React.createContext<string | null>(null);\n (globalThis as Record<symbol, unknown>)[PENDING_CTX_KEY] = ctx;\n return ctx;\n }\n return undefined;\n}\n\n/**\n * Read the pending navigation URL from context.\n * Returns null during SSR (no provider) or in the RSC environment.\n */\nexport function usePendingNavigationUrl(): string | null {\n const ctx = getOrCreatePendingContext();\n if (!ctx) return null;\n if (typeof React.useContext !== 'function') return null;\n return React.useContext(ctx);\n}\n\n/**\n * Provider for the pending navigation URL. Wraps children with\n * the pending context Provider.\n */\nexport function PendingNavigationProvider({\n value,\n children,\n}: {\n value: string | null;\n children?: ReactNode;\n}): React.ReactElement {\n const ctx = getOrCreatePendingContext();\n if (!ctx) {\n return children as React.ReactElement;\n }\n return createElement(ctx.Provider, { value }, children);\n}\n\n// ---------------------------------------------------------------------------\n// Navigation API transition state (optional progressive enhancement)\n// ---------------------------------------------------------------------------\n\n/**\n * Check if the browser's Navigation API has an active transition.\n *\n * When the Navigation API is available and a navigation has been intercepted\n * via event.intercept(), `navigation.transition` is non-null until the\n * handler resolves. This provides browser-native progress tracking that\n * can be used alongside the existing pendingUrl mechanism.\n *\n * Returns false when Navigation API is unavailable or no transition is active.\n */\nexport function hasNativeNavigationTransition(): boolean {\n if (typeof window === 'undefined') return false;\n const nav = (window as unknown as { navigation?: { transition?: unknown } }).navigation;\n return nav?.transition != null;\n}\n","/**\n * useParams() — client-side hook for accessing route params.\n *\n * Returns the dynamic route parameters for the current URL.\n * When called with a route pattern argument, TypeScript narrows\n * the return type to the exact params shape for that route.\n *\n * Two layers of type narrowing work together:\n * 1. The generic overload here uses the Routes interface directly —\n * `useParams<R>()` returns `Routes[R]['segmentParams']`.\n * 2. Build-time codegen generates per-route string-literal overloads\n * in the .d.ts file for IDE autocomplete (see routing/codegen.ts).\n *\n * When the Routes interface is empty (no codegen yet), the generic\n * overload has `keyof Routes = never`, so only the fallback matches.\n *\n * During SSR, params are read from the ALS-backed SSR data context\n * (populated by ssr-entry.ts) to ensure correct per-request isolation\n * across concurrent requests with streaming Suspense.\n *\n * Reactivity: On the client, useParams() reads from NavigationContext\n * which is updated atomically with the RSC tree render. This replaces\n * the previous useSyncExternalStore approach that suffered from a\n * timing gap between tree render and store notification — causing\n * preserved layout components to briefly show stale active state.\n *\n * All mutable state is delegated to client/state.ts for singleton guarantees.\n * See design/18-build-system.md §\"Singleton State Registry\"\n *\n * Design doc: design/09-typescript.md §\"Typed Routes\"\n */\n\nimport type { Routes } from '../index.js';\nimport { getSsrData } from './ssr-data.js';\nimport { currentParams, _setCurrentParams, paramsListeners } from './state.js';\nimport { useNavigationContext } from './navigation-context.js';\n\n// ---------------------------------------------------------------------------\n// Module-level subscribe/notify pattern — kept for backward compat and tests\n// ---------------------------------------------------------------------------\n\n/**\n * Subscribe to params changes.\n * Retained for backward compatibility with tests that verify the\n * subscribe/notify contract. On the client, useParams() reads from\n * NavigationContext instead.\n */\nexport function subscribe(callback: () => void): () => void {\n paramsListeners.add(callback);\n return () => paramsListeners.delete(callback);\n}\n\n/**\n * Get the current params snapshot (module-level fallback).\n * Used by tests and by the hook when called outside a React component.\n */\nexport function getSnapshot(): Record<string, string | string[]> {\n return currentParams;\n}\n\n// ---------------------------------------------------------------------------\n// Framework API — called by the segment router on each navigation\n// ---------------------------------------------------------------------------\n\n/**\n * Set the current route params in the module-level store.\n *\n * Called by the router on each navigation. This updates the fallback\n * snapshot used by tests and by the hook when called outside a React\n * component (no NavigationContext available).\n *\n * On the client, the primary reactivity path is NavigationContext —\n * the router calls setNavigationState() then renderRoot() which wraps\n * the element in NavigationProvider. setCurrentParams is still called\n * for the module-level fallback.\n *\n * During SSR, params are also available via getSsrData().params\n * (ALS-backed).\n */\nexport function setCurrentParams(params: Record<string, string | string[]>): void {\n _setCurrentParams(params);\n}\n\n/**\n * Notify all legacy subscribers that params have changed.\n *\n * Retained for backward compatibility with tests. On the client,\n * the NavigationContext + renderRoot pattern replaces this — params\n * update atomically with the tree render, so explicit notification\n * is no longer needed.\n */\nexport function notifyParamsListeners(): void {\n for (const listener of paramsListeners) {\n listener();\n }\n}\n\n// ---------------------------------------------------------------------------\n// Public hook\n// ---------------------------------------------------------------------------\n\n/**\n * Read the current route's dynamic params.\n *\n * The optional `_route` argument exists only for TypeScript narrowing —\n * it does not affect the runtime return value.\n *\n * On the client, reads from NavigationContext (provided by\n * NavigationProvider in renderRoot). This ensures params update\n * atomically with the RSC tree — no timing gap.\n *\n * During SSR, reads from the ALS-backed SSR data context to ensure\n * per-request isolation across concurrent requests with streaming Suspense.\n *\n * When called outside a React component (e.g., in test assertions),\n * falls back to the module-level snapshot.\n *\n * @overload Typed — when a known route path is passed, returns the\n * exact params shape from the generated Routes interface.\n * @overload Fallback — returns the generic params record.\n */\nexport function useSegmentParams<R extends keyof Routes>(\n route: R\n): Routes[R] extends { segmentParams: infer P } ? P : Record<string, string | string[]>;\nexport function useSegmentParams(route?: string): Record<string, string | string[]>;\nexport function useSegmentParams(_route?: string): Record<string, string | string[]> {\n // Try reading from NavigationContext (client-side, inside React tree).\n // During SSR, no NavigationProvider is mounted, so this returns null.\n // When called outside a React component, useContext throws — caught below.\n try {\n const navContext = useNavigationContext();\n if (navContext !== null) {\n return navContext.params;\n }\n } catch {\n // No React dispatcher available (called outside a component).\n // Fall through to module-level snapshot below.\n }\n\n // SSR path: read from ALS-backed SSR data context.\n // Falls back to module-level currentParams for tests.\n return getSsrData()?.params ?? currentParams;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA4EA,IAAM,cAAc,OAAO,IAAI,mBAAmB;AAClD,IAAM,kBAAkB,OAAO,IAAI,2BAA2B;AAE9D,SAAS,qBAAwE;CAC/E,MAAM,WAAY,WAAuC;AAGzD,KAAI,aAAa,KAAA,EAAW,QAAO;AAEnC,KAAI,OAAO,MAAM,kBAAkB,YAAY;EAC7C,MAAM,MAAM,MAAM,cAAsC,KAAK;AAC5D,aAAuC,eAAe;AACvD,SAAO;;;;;;;;AAUX,SAAgB,uBAA+C;CAC7D,MAAM,MAAM,oBAAoB;AAChC,KAAI,CAAC,IAAK,QAAO;AAEjB,KAAI,OAAO,MAAM,eAAe,WAAY,QAAO;AACnD,QAAO,MAAM,WAAW,IAAI;;;;;;;;AAkB9B,SAAgB,mBAAmB,EACjC,OACA,YAC8C;CAC9C,MAAM,MAAM,oBAAoB;AAChC,KAAI,CAAC,IAEH,QAAO;AAET,QAAO,cAAc,IAAI,UAAU,EAAE,OAAO,EAAE,SAAS;;;;;;;;;;;;;;;AAoBzD,IAAM,gBAAgB,OAAO,IAAI,qBAAqB;AAEtD,SAAS,oBAAkD;CACzD,MAAM,IAAI;AACV,KAAI,CAAC,EAAE,eACL,GAAE,iBAAiB,EAAE,SAAS;EAAE,QAAQ,EAAE;EAAE,UAAU;EAAK,EAAE;AAE/D,QAAO,EAAE;;AAGX,SAAgB,mBAAmB,OAA8B;AAC/D,oBAAmB,CAAC,UAAU;;AAGhC,SAAgB,qBAAsC;AACpD,QAAO,mBAAmB,CAAC;;;;;;;;;;;;AAkB7B,SAAS,4BAAsE;CAC7E,MAAM,WAAY,WAAuC;AAGzD,KAAI,aAAa,KAAA,EAAW,QAAO;AACnC,KAAI,OAAO,MAAM,kBAAkB,YAAY;EAC7C,MAAM,MAAM,MAAM,cAA6B,KAAK;AACnD,aAAuC,mBAAmB;AAC3D,SAAO;;;;;;;AASX,SAAgB,0BAAyC;CACvD,MAAM,MAAM,2BAA2B;AACvC,KAAI,CAAC,IAAK,QAAO;AACjB,KAAI,OAAO,MAAM,eAAe,WAAY,QAAO;AACnD,QAAO,MAAM,WAAW,IAAI;;;;;;;;;;;;;;;;;;;;;;;AC7H9B,SAAgB,iBAAiB,QAAiD;AAChF,mBAAkB,OAAO;;AA6C3B,SAAgB,iBAAiB,QAAoD;AAInF,KAAI;EACF,MAAM,aAAa,sBAAsB;AACzC,MAAI,eAAe,KACjB,QAAO,WAAW;SAEd;AAOR,QAAO,YAAY,EAAE,UAAU"}
@@ -0,0 +1,84 @@
1
+ //#region src/cookies/validation.ts
2
+ /**
3
+ * Cookie name and value validation per RFC 6265 §4.1.1.
4
+ *
5
+ * This module is pure — no server or client imports — so it can be loaded
6
+ * by both `server/request-context.ts` (which guards `getCookies().set()`)
7
+ * and `client/use-cookie.ts` (which guards `useCookie()`'s setter). The
8
+ * shared validator gives both sides identical encoding contracts:
9
+ * **the framework never silently encodes — callers emit `cookie-octet`
10
+ * bytes or get a developer-facing error.**
11
+ *
12
+ * Why this matters: see ONGOING_SECURITY.md H-3 (TIM-868) and
13
+ * design/29-cookies.md §"Cookie Name and Value Validation".
14
+ */
15
+ /**
16
+ * RFC 7230 §3.2.6 token characters used as the cookie-name production in
17
+ * RFC 6265 §4.1.1. Anchored, non-empty match.
18
+ *
19
+ * Allowed: US-ASCII letters, digits, and `!#$%&'*+-.^_` `` ` `` `|~`.
20
+ * Disallowed: whitespace, controls, delimiters
21
+ * (`(` `)` `<` `>` `@` `,` `;` `:` `\` `"` `/` `[` `]` `?` `=` `{` `}`).
22
+ */
23
+ var COOKIE_NAME_RE = /^[!#$%&'*+\-.0-9A-Z^_`a-z|~]+$/;
24
+ /**
25
+ * Format a single byte for a clear error message — escape control bytes
26
+ * and non-ASCII as `0x..` and quote printables.
27
+ */
28
+ function describeChar(value, index) {
29
+ const code = value.charCodeAt(index);
30
+ if (code < 32 || code === 127 || code > 126) return `0x${code.toString(16).padStart(2, "0")}`;
31
+ return JSON.stringify(value[index]);
32
+ }
33
+ /**
34
+ * Validate a cookie name against RFC 6265 §4.1.1 / RFC 7230 token rules.
35
+ * Throws a developer-facing error naming the offending byte and its index.
36
+ */
37
+ function assertValidCookieName(name) {
38
+ if (typeof name !== "string" || name.length === 0) throw new Error("[timber] cookie name must be a non-empty string.");
39
+ if (!COOKIE_NAME_RE.test(name)) {
40
+ for (let i = 0; i < name.length; i++) if (!COOKIE_NAME_RE.test(name[i])) throw new Error(`[timber] invalid cookie name ${JSON.stringify(name)} — disallowed character ${describeChar(name, i)} at index ${i}. Cookie names must match the RFC 6265 §4.1.1 token grammar (US-ASCII letters, digits, and \`!#$%&'*+-.^_\`|~\`; no whitespace, controls, or delimiters).`);
41
+ throw new Error(`[timber] invalid cookie name ${JSON.stringify(name)} — must match RFC 6265 §4.1.1 token grammar.`);
42
+ }
43
+ }
44
+ /** Single-byte test for RFC 6265 §4.1.1 cookie-octet. */
45
+ function isCookieOctet(code) {
46
+ return code === 33 || code >= 35 && code <= 43 || code >= 45 && code <= 58 || code >= 60 && code <= 91 || code >= 93 && code <= 126;
47
+ }
48
+ /**
49
+ * Validate a cookie value against the RFC 6265 §4.1.1 `cookie-value`
50
+ * production:
51
+ *
52
+ * cookie-value = *cookie-octet / ( DQUOTE *cookie-octet DQUOTE )
53
+ * cookie-octet = %x21 / %x23-2B / %x2D-3A / %x3C-5B / %x5D-7E
54
+ *
55
+ * Both the bare `*cookie-octet` form and the DQUOTE-wrapped form are
56
+ * valid. The wrapped form is common in upstream `Set-Cookie` headers
57
+ * (e.g. `sid="abc"; Path=/`) and must be forwardable through
58
+ * `setFromHeaders` verbatim — stripping or rejecting the surrounding
59
+ * quotes would corrupt the on-the-wire bytes and break value semantics
60
+ * for the upstream service.
61
+ *
62
+ * Excluded bytes (in either form): CTL, whitespace (CR/LF/TAB/SP),
63
+ * interior DQUOTE, comma, semicolon, backslash, DEL, and anything
64
+ * non-ASCII. The smuggling primitive (`;`) is rejected regardless of
65
+ * wrapping.
66
+ *
67
+ * Throws a developer-facing error naming the offending byte and its
68
+ * index. Callers passing user-controlled data through the default
69
+ * `set()` path don't need to call this — `set()` auto-encodes via
70
+ * `encodeURIComponent`, whose output is always valid cookie-octet.
71
+ * This validator is for the `{ raw: true }` opt-out and for
72
+ * `setFromHeaders` forwarding.
73
+ */
74
+ function assertValidCookieValue(name, value) {
75
+ if (typeof value !== "string") throw new Error(`[timber] cookie ${JSON.stringify(name)}: cookie value must be a string.`);
76
+ const wrapped = value.length >= 2 && value.charCodeAt(0) === 34 && value.charCodeAt(value.length - 1) === 34;
77
+ const start = wrapped ? 1 : 0;
78
+ const end = wrapped ? value.length - 1 : value.length;
79
+ for (let i = start; i < end; i++) if (!isCookieOctet(value.charCodeAt(i))) throw new Error(`[timber] cookie ${JSON.stringify(name)}: invalid cookie value — disallowed character ${describeChar(value, i)} at index ${i}. Cookie values must contain only RFC 6265 §4.1.1 cookie-octet bytes (US-ASCII printable, excluding whitespace, \`"\`, \`,\`, \`;\`, and \`\\\`), optionally enclosed in a single DQUOTE pair. Encode the value (e.g. encodeURIComponent or jsonCookieCodec) before storing it.`);
80
+ }
81
+ //#endregion
82
+ export { assertValidCookieValue as n, assertValidCookieName as t };
83
+
84
+ //# sourceMappingURL=validation-Bm3Je-09.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation-Bm3Je-09.js","names":[],"sources":["../../src/cookies/validation.ts"],"sourcesContent":["/**\n * Cookie name and value validation per RFC 6265 §4.1.1.\n *\n * This module is pure — no server or client imports — so it can be loaded\n * by both `server/request-context.ts` (which guards `getCookies().set()`)\n * and `client/use-cookie.ts` (which guards `useCookie()`'s setter). The\n * shared validator gives both sides identical encoding contracts:\n * **the framework never silently encodes — callers emit `cookie-octet`\n * bytes or get a developer-facing error.**\n *\n * Why this matters: see ONGOING_SECURITY.md H-3 (TIM-868) and\n * design/29-cookies.md §\"Cookie Name and Value Validation\".\n */\n\n// ─── RFC 6265 cookie-octet ────────────────────────────────────────────────\n//\n// cookie-octet = %x21 / %x23-2B / %x2D-3A / %x3C-5B / %x5D-7E\n//\n// Equivalently: US-ASCII printable bytes excluding whitespace, `\"` (0x22),\n// `,` (0x2C), `;` (0x3B), `\\` (0x5C), and DEL (0x7F).\n\n/**\n * RFC 7230 §3.2.6 token characters used as the cookie-name production in\n * RFC 6265 §4.1.1. Anchored, non-empty match.\n *\n * Allowed: US-ASCII letters, digits, and `!#$%&'*+-.^_` `` ` `` `|~`.\n * Disallowed: whitespace, controls, delimiters\n * (`(` `)` `<` `>` `@` `,` `;` `:` `\\` `\"` `/` `[` `]` `?` `=` `{` `}`).\n */\nconst COOKIE_NAME_RE = /^[!#$%&'*+\\-.0-9A-Z^_`a-z|~]+$/;\n\n/**\n * Format a single byte for a clear error message — escape control bytes\n * and non-ASCII as `0x..` and quote printables.\n */\nfunction describeChar(value: string, index: number): string {\n const code = value.charCodeAt(index);\n if (code < 0x20 || code === 0x7f || code > 0x7e) {\n return `0x${code.toString(16).padStart(2, '0')}`;\n }\n return JSON.stringify(value[index]);\n}\n\n/**\n * Validate a cookie name against RFC 6265 §4.1.1 / RFC 7230 token rules.\n * Throws a developer-facing error naming the offending byte and its index.\n */\nexport function assertValidCookieName(name: string): void {\n if (typeof name !== 'string' || name.length === 0) {\n throw new Error('[timber] cookie name must be a non-empty string.');\n }\n if (!COOKIE_NAME_RE.test(name)) {\n for (let i = 0; i < name.length; i++) {\n if (!COOKIE_NAME_RE.test(name[i])) {\n throw new Error(\n `[timber] invalid cookie name ${JSON.stringify(name)} — ` +\n `disallowed character ${describeChar(name, i)} at index ${i}. ` +\n `Cookie names must match the RFC 6265 §4.1.1 token grammar (US-ASCII letters, digits, ` +\n `and \\`!#$%&'*+-.^_\\`|~\\`; no whitespace, controls, or delimiters).`\n );\n }\n }\n throw new Error(\n `[timber] invalid cookie name ${JSON.stringify(name)} — ` +\n `must match RFC 6265 §4.1.1 token grammar.`\n );\n }\n}\n\n/** Single-byte test for RFC 6265 §4.1.1 cookie-octet. */\nfunction isCookieOctet(code: number): boolean {\n return (\n code === 0x21 ||\n (code >= 0x23 && code <= 0x2b) ||\n (code >= 0x2d && code <= 0x3a) ||\n (code >= 0x3c && code <= 0x5b) ||\n (code >= 0x5d && code <= 0x7e)\n );\n}\n\n/**\n * Validate a cookie value against the RFC 6265 §4.1.1 `cookie-value`\n * production:\n *\n * cookie-value = *cookie-octet / ( DQUOTE *cookie-octet DQUOTE )\n * cookie-octet = %x21 / %x23-2B / %x2D-3A / %x3C-5B / %x5D-7E\n *\n * Both the bare `*cookie-octet` form and the DQUOTE-wrapped form are\n * valid. The wrapped form is common in upstream `Set-Cookie` headers\n * (e.g. `sid=\"abc\"; Path=/`) and must be forwardable through\n * `setFromHeaders` verbatim — stripping or rejecting the surrounding\n * quotes would corrupt the on-the-wire bytes and break value semantics\n * for the upstream service.\n *\n * Excluded bytes (in either form): CTL, whitespace (CR/LF/TAB/SP),\n * interior DQUOTE, comma, semicolon, backslash, DEL, and anything\n * non-ASCII. The smuggling primitive (`;`) is rejected regardless of\n * wrapping.\n *\n * Throws a developer-facing error naming the offending byte and its\n * index. Callers passing user-controlled data through the default\n * `set()` path don't need to call this — `set()` auto-encodes via\n * `encodeURIComponent`, whose output is always valid cookie-octet.\n * This validator is for the `{ raw: true }` opt-out and for\n * `setFromHeaders` forwarding.\n */\nexport function assertValidCookieValue(name: string, value: string): void {\n if (typeof value !== 'string') {\n throw new Error(`[timber] cookie ${JSON.stringify(name)}: cookie value must be a string.`);\n }\n // Detect the DQUOTE-wrapped form: at least two characters and both\n // endpoints are `\"`. The interior must be pure cookie-octet (no\n // interior DQUOTEs allowed — the grammar says *cookie-octet, and\n // cookie-octet excludes 0x22).\n const wrapped =\n value.length >= 2 &&\n value.charCodeAt(0) === 0x22 &&\n value.charCodeAt(value.length - 1) === 0x22;\n const start = wrapped ? 1 : 0;\n const end = wrapped ? value.length - 1 : value.length;\n for (let i = start; i < end; i++) {\n const code = value.charCodeAt(i);\n if (!isCookieOctet(code)) {\n throw new Error(\n `[timber] cookie ${JSON.stringify(name)}: invalid cookie value — ` +\n `disallowed character ${describeChar(value, i)} at index ${i}. ` +\n `Cookie values must contain only RFC 6265 §4.1.1 cookie-octet bytes ` +\n `(US-ASCII printable, excluding whitespace, \\`\"\\`, \\`,\\`, \\`;\\`, and \\`\\\\\\`), ` +\n `optionally enclosed in a single DQUOTE pair. ` +\n `Encode the value (e.g. encodeURIComponent or jsonCookieCodec) before storing it.`\n );\n }\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;AA6BA,IAAM,iBAAiB;;;;;AAMvB,SAAS,aAAa,OAAe,OAAuB;CAC1D,MAAM,OAAO,MAAM,WAAW,MAAM;AACpC,KAAI,OAAO,MAAQ,SAAS,OAAQ,OAAO,IACzC,QAAO,KAAK,KAAK,SAAS,GAAG,CAAC,SAAS,GAAG,IAAI;AAEhD,QAAO,KAAK,UAAU,MAAM,OAAO;;;;;;AAOrC,SAAgB,sBAAsB,MAAoB;AACxD,KAAI,OAAO,SAAS,YAAY,KAAK,WAAW,EAC9C,OAAM,IAAI,MAAM,mDAAmD;AAErE,KAAI,CAAC,eAAe,KAAK,KAAK,EAAE;AAC9B,OAAK,IAAI,IAAI,GAAG,IAAI,KAAK,QAAQ,IAC/B,KAAI,CAAC,eAAe,KAAK,KAAK,GAAG,CAC/B,OAAM,IAAI,MACR,gCAAgC,KAAK,UAAU,KAAK,CAAC,0BAC3B,aAAa,MAAM,EAAE,CAAC,YAAY,EAAE,2JAG/D;AAGL,QAAM,IAAI,MACR,gCAAgC,KAAK,UAAU,KAAK,CAAC,8CAEtD;;;;AAKL,SAAS,cAAc,MAAuB;AAC5C,QACE,SAAS,MACR,QAAQ,MAAQ,QAAQ,MACxB,QAAQ,MAAQ,QAAQ,MACxB,QAAQ,MAAQ,QAAQ,MACxB,QAAQ,MAAQ,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA8B7B,SAAgB,uBAAuB,MAAc,OAAqB;AACxE,KAAI,OAAO,UAAU,SACnB,OAAM,IAAI,MAAM,mBAAmB,KAAK,UAAU,KAAK,CAAC,kCAAkC;CAM5F,MAAM,UACJ,MAAM,UAAU,KAChB,MAAM,WAAW,EAAE,KAAK,MACxB,MAAM,WAAW,MAAM,SAAS,EAAE,KAAK;CACzC,MAAM,QAAQ,UAAU,IAAI;CAC5B,MAAM,MAAM,UAAU,MAAM,SAAS,IAAI,MAAM;AAC/C,MAAK,IAAI,IAAI,OAAO,IAAI,KAAK,IAE3B,KAAI,CAAC,cADQ,MAAM,WAAW,EAAE,CACR,CACtB,OAAM,IAAI,MACR,mBAAmB,KAAK,UAAU,KAAK,CAAC,gDACd,aAAa,OAAO,EAAE,CAAC,YAAY,EAAE,iRAKhE"}