@timber-js/app 0.2.0-alpha.15 → 0.2.0-alpha.151

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 (854) hide show
  1. package/LICENSE +8 -0
  2. package/dist/_chunks/actions-a0RczDnB.js +1106 -0
  3. package/dist/_chunks/actions-a0RczDnB.js.map +1 -0
  4. package/dist/_chunks/build-output-helper-B20ZuTSA.js +102 -0
  5. package/dist/_chunks/build-output-helper-B20ZuTSA.js.map +1 -0
  6. package/dist/_chunks/cache-api-Co-yI-gP.js +424 -0
  7. package/dist/_chunks/cache-api-Co-yI-gP.js.map +1 -0
  8. package/dist/_chunks/{metadata-routes-Cjmvi3rQ.js → canonicalize-P41GR6tY.js} +94 -18
  9. package/dist/_chunks/canonicalize-P41GR6tY.js.map +1 -0
  10. package/dist/_chunks/cli-schema-sync-DJDdyEae.js +629 -0
  11. package/dist/_chunks/cli-schema-sync-DJDdyEae.js.map +1 -0
  12. package/dist/_chunks/cli-schema-sync-D_IhHEUW.js +2 -0
  13. package/dist/_chunks/codec-registry-oOUxugz3.js +21 -0
  14. package/dist/_chunks/codec-registry-oOUxugz3.js.map +1 -0
  15. package/dist/_chunks/define-Bssfp6ot.js +82 -0
  16. package/dist/_chunks/define-Bssfp6ot.js.map +1 -0
  17. package/dist/_chunks/define-CFmvb4Bt.js +203 -0
  18. package/dist/_chunks/define-CFmvb4Bt.js.map +1 -0
  19. package/dist/_chunks/fast-hash-D6hIVt1Y.js +36 -0
  20. package/dist/_chunks/fast-hash-D6hIVt1Y.js.map +1 -0
  21. package/dist/_chunks/format-CfwjgPz9.js +14 -0
  22. package/dist/_chunks/format-CfwjgPz9.js.map +1 -0
  23. package/dist/_chunks/href-validation-FiA_rToW.js +141 -0
  24. package/dist/_chunks/href-validation-FiA_rToW.js.map +1 -0
  25. package/dist/_chunks/logger-CM0clugc.js +645 -0
  26. package/dist/_chunks/logger-CM0clugc.js.map +1 -0
  27. package/dist/_chunks/navigation-root-bUDZLw74.js +124 -0
  28. package/dist/_chunks/navigation-root-bUDZLw74.js.map +1 -0
  29. package/dist/_chunks/plugin-context-DurqFBuY.js +2 -0
  30. package/dist/_chunks/plugin-context-GfDWsdd2.js +268 -0
  31. package/dist/_chunks/plugin-context-GfDWsdd2.js.map +1 -0
  32. package/dist/_chunks/registry-DbJPKoBp.js +20 -0
  33. package/dist/_chunks/registry-DbJPKoBp.js.map +1 -0
  34. package/dist/_chunks/resolve-schema-3iUvBV5T.js +50 -0
  35. package/dist/_chunks/resolve-schema-3iUvBV5T.js.map +1 -0
  36. package/dist/_chunks/router-ref-CtmF-aPv.js +28 -0
  37. package/dist/_chunks/router-ref-CtmF-aPv.js.map +1 -0
  38. package/dist/_chunks/schema-bridge-BY3QLBL7.js +119 -0
  39. package/dist/_chunks/schema-bridge-BY3QLBL7.js.map +1 -0
  40. package/dist/_chunks/segment-classify-CDDRVKs7.js +137 -0
  41. package/dist/_chunks/segment-classify-CDDRVKs7.js.map +1 -0
  42. package/dist/_chunks/segment-context-ZDnXDkbz.js +34 -0
  43. package/dist/_chunks/segment-context-ZDnXDkbz.js.map +1 -0
  44. package/dist/_chunks/{ssr-data-MjmprTmO.js → ssr-data-BOWsq18U.js} +1 -1
  45. package/dist/_chunks/ssr-data-BOWsq18U.js.map +1 -0
  46. package/dist/_chunks/tree-match-D2l830j2.js +102 -0
  47. package/dist/_chunks/tree-match-D2l830j2.js.map +1 -0
  48. package/dist/_chunks/{use-query-states-D5KaffOK.js → use-query-states-CbeQmext.js} +7 -20
  49. package/dist/_chunks/use-query-states-CbeQmext.js.map +1 -0
  50. package/dist/_chunks/use-segment-params-D1CzlgBo.js +151 -0
  51. package/dist/_chunks/use-segment-params-D1CzlgBo.js.map +1 -0
  52. package/dist/_chunks/validation-taUkvA4Q.js +113 -0
  53. package/dist/_chunks/validation-taUkvA4Q.js.map +1 -0
  54. package/dist/_chunks/walkers-DvWDj453.js +790 -0
  55. package/dist/_chunks/walkers-DvWDj453.js.map +1 -0
  56. package/dist/adapters/build-output-helper.d.ts +28 -0
  57. package/dist/adapters/build-output-helper.d.ts.map +1 -0
  58. package/dist/adapters/cloudflare-dev.d.ts +109 -0
  59. package/dist/adapters/cloudflare-dev.d.ts.map +1 -0
  60. package/dist/adapters/cloudflare-dev.js +73 -0
  61. package/dist/adapters/cloudflare-dev.js.map +1 -0
  62. package/dist/adapters/cloudflare-kv-cache.d.ts +64 -0
  63. package/dist/adapters/cloudflare-kv-cache.d.ts.map +1 -0
  64. package/dist/adapters/cloudflare-kv-cache.js +117 -0
  65. package/dist/adapters/cloudflare-kv-cache.js.map +1 -0
  66. package/dist/adapters/cloudflare.d.ts +142 -20
  67. package/dist/adapters/cloudflare.d.ts.map +1 -1
  68. package/dist/adapters/cloudflare.js +150 -64
  69. package/dist/adapters/cloudflare.js.map +1 -1
  70. package/dist/adapters/compress-module.d.ts +5 -4
  71. package/dist/adapters/compress-module.d.ts.map +1 -1
  72. package/dist/adapters/nitro.d.ts +17 -3
  73. package/dist/adapters/nitro.d.ts.map +1 -1
  74. package/dist/adapters/nitro.js +146 -147
  75. package/dist/adapters/nitro.js.map +1 -1
  76. package/dist/adapters/shared.d.ts +16 -0
  77. package/dist/adapters/shared.d.ts.map +1 -0
  78. package/dist/cache/cache-api.d.ts +24 -0
  79. package/dist/cache/cache-api.d.ts.map +1 -0
  80. package/dist/cache/handler-store.d.ts +31 -0
  81. package/dist/cache/handler-store.d.ts.map +1 -0
  82. package/dist/cache/index.d.ts +25 -7
  83. package/dist/cache/index.d.ts.map +1 -1
  84. package/dist/cache/index.js +100 -240
  85. package/dist/cache/index.js.map +1 -1
  86. package/dist/cache/invalidation-epoch.d.ts +43 -0
  87. package/dist/cache/invalidation-epoch.d.ts.map +1 -0
  88. package/dist/cache/redis-handler.d.ts +85 -8
  89. package/dist/cache/redis-handler.d.ts.map +1 -1
  90. package/dist/cache/singleflight.d.ts +18 -1
  91. package/dist/cache/singleflight.d.ts.map +1 -1
  92. package/dist/cache/sizeof.d.ts +22 -0
  93. package/dist/cache/sizeof.d.ts.map +1 -0
  94. package/dist/cache/stable-stringify.d.ts +9 -0
  95. package/dist/cache/stable-stringify.d.ts.map +1 -1
  96. package/dist/cache/timber-cache.d.ts +20 -10
  97. package/dist/cache/timber-cache.d.ts.map +1 -1
  98. package/dist/cli-schema-sync.d.ts +59 -0
  99. package/dist/cli-schema-sync.d.ts.map +1 -0
  100. package/dist/cli.d.ts +26 -2
  101. package/dist/cli.d.ts.map +1 -1
  102. package/dist/cli.js +70 -33
  103. package/dist/cli.js.map +1 -1
  104. package/dist/client/browser-dev.d.ts +34 -1
  105. package/dist/client/browser-dev.d.ts.map +1 -1
  106. package/dist/client/browser-entry/action-dispatch.d.ts +17 -0
  107. package/dist/client/browser-entry/action-dispatch.d.ts.map +1 -0
  108. package/dist/client/browser-entry/hmr.d.ts +21 -0
  109. package/dist/client/browser-entry/hmr.d.ts.map +1 -0
  110. package/dist/client/browser-entry/hydrate.d.ts +46 -0
  111. package/dist/client/browser-entry/hydrate.d.ts.map +1 -0
  112. package/dist/client/browser-entry/index.d.ts +29 -0
  113. package/dist/client/browser-entry/index.d.ts.map +1 -0
  114. package/dist/client/browser-entry/post-hydration.d.ts +26 -0
  115. package/dist/client/browser-entry/post-hydration.d.ts.map +1 -0
  116. package/dist/client/browser-entry/router-init.d.ts +26 -0
  117. package/dist/client/browser-entry/router-init.d.ts.map +1 -0
  118. package/dist/client/browser-entry/rsc-stream.d.ts +24 -0
  119. package/dist/client/browser-entry/rsc-stream.d.ts.map +1 -0
  120. package/dist/client/browser-entry/scroll.d.ts +28 -0
  121. package/dist/client/browser-entry/scroll.d.ts.map +1 -0
  122. package/dist/client/error-boundary.d.ts +12 -5
  123. package/dist/client/error-boundary.d.ts.map +1 -1
  124. package/dist/client/error-boundary.js +47 -10
  125. package/dist/client/error-boundary.js.map +1 -1
  126. package/dist/client/error-reconstituter.d.ts +61 -0
  127. package/dist/client/error-reconstituter.d.ts.map +1 -0
  128. package/dist/client/form.d.ts +16 -27
  129. package/dist/client/form.d.ts.map +1 -1
  130. package/dist/client/history.d.ts +11 -3
  131. package/dist/client/history.d.ts.map +1 -1
  132. package/dist/client/index.d.ts +10 -24
  133. package/dist/client/index.d.ts.map +1 -1
  134. package/dist/client/index.js +183 -1134
  135. package/dist/client/index.js.map +1 -1
  136. package/dist/client/internal.d.ts +19 -0
  137. package/dist/client/internal.d.ts.map +1 -0
  138. package/dist/client/internal.js +900 -0
  139. package/dist/client/internal.js.map +1 -0
  140. package/dist/client/link.d.ts +69 -60
  141. package/dist/client/link.d.ts.map +1 -1
  142. package/dist/client/navigation-api-types.d.ts +90 -0
  143. package/dist/client/navigation-api-types.d.ts.map +1 -0
  144. package/dist/client/navigation-api.d.ts +122 -0
  145. package/dist/client/navigation-api.d.ts.map +1 -0
  146. package/dist/client/navigation-context.d.ts +3 -2
  147. package/dist/client/navigation-context.d.ts.map +1 -1
  148. package/dist/client/navigation-root.d.ts +119 -0
  149. package/dist/client/navigation-root.d.ts.map +1 -0
  150. package/dist/client/nuqs-adapter.d.ts +1 -1
  151. package/dist/client/nuqs-adapter.d.ts.map +1 -1
  152. package/dist/client/router-ref.d.ts +1 -1
  153. package/dist/client/router.d.ts +86 -10
  154. package/dist/client/router.d.ts.map +1 -1
  155. package/dist/client/rsc-fetch.d.ts +46 -3
  156. package/dist/client/rsc-fetch.d.ts.map +1 -1
  157. package/dist/client/segment-cache.d.ts +3 -1
  158. package/dist/client/segment-cache.d.ts.map +1 -1
  159. package/dist/client/segment-outlet.d.ts +49 -0
  160. package/dist/client/segment-outlet.d.ts.map +1 -0
  161. package/dist/client/segment-update-context.d.ts +21 -0
  162. package/dist/client/segment-update-context.d.ts.map +1 -0
  163. package/dist/client/shallow-url.d.ts +10 -0
  164. package/dist/client/shallow-url.d.ts.map +1 -0
  165. package/dist/client/ssr-data.d.ts +13 -4
  166. package/dist/client/ssr-data.d.ts.map +1 -1
  167. package/dist/client/state.d.ts +1 -1
  168. package/dist/client/top-loader.d.ts +5 -5
  169. package/dist/client/top-loader.d.ts.map +1 -1
  170. package/dist/client/use-cookie.d.ts +12 -0
  171. package/dist/client/use-cookie.d.ts.map +1 -1
  172. package/dist/client/use-link-status.d.ts +5 -5
  173. package/dist/client/use-link-status.d.ts.map +1 -1
  174. package/dist/client/use-pathname.d.ts.map +1 -1
  175. package/dist/client/use-pending-navigation.d.ts +23 -0
  176. package/dist/client/use-pending-navigation.d.ts.map +1 -0
  177. package/dist/client/use-query-states.d.ts +1 -1
  178. package/dist/client/use-query-states.d.ts.map +1 -1
  179. package/dist/client/use-router.d.ts +1 -1
  180. package/dist/client/use-router.d.ts.map +1 -1
  181. package/dist/client/use-search-params.d.ts +12 -5
  182. package/dist/client/use-search-params.d.ts.map +1 -1
  183. package/dist/client/{use-params.d.ts → use-segment-params.d.ts} +8 -6
  184. package/dist/client/use-segment-params.d.ts.map +1 -0
  185. package/dist/codec.d.ts +69 -0
  186. package/dist/codec.d.ts.map +1 -0
  187. package/dist/codec.js +75 -0
  188. package/dist/codec.js.map +1 -0
  189. package/dist/config-types.d.ts +294 -0
  190. package/dist/config-types.d.ts.map +1 -0
  191. package/dist/config-validation.d.ts +51 -0
  192. package/dist/config-validation.d.ts.map +1 -0
  193. package/dist/content/index.d.ts +1 -10
  194. package/dist/content/index.d.ts.map +1 -1
  195. package/dist/content/index.js +0 -2
  196. package/dist/cookies/define-cookie.d.ts +58 -25
  197. package/dist/cookies/define-cookie.d.ts.map +1 -1
  198. package/dist/cookies/index.d.ts +2 -1
  199. package/dist/cookies/index.d.ts.map +1 -1
  200. package/dist/cookies/index.js +249 -36
  201. package/dist/cookies/index.js.map +1 -1
  202. package/dist/cookies/json-cookie.d.ts +64 -0
  203. package/dist/cookies/json-cookie.d.ts.map +1 -0
  204. package/dist/cookies/validation.d.ts +34 -0
  205. package/dist/cookies/validation.d.ts.map +1 -0
  206. package/dist/dev-tools/404-page.d.ts +50 -0
  207. package/dist/dev-tools/404-page.d.ts.map +1 -0
  208. package/dist/dev-tools/browser-logs.d.ts +84 -0
  209. package/dist/dev-tools/browser-logs.d.ts.map +1 -0
  210. package/dist/dev-tools/dev-page-shell.d.ts +78 -0
  211. package/dist/dev-tools/dev-page-shell.d.ts.map +1 -0
  212. package/dist/dev-tools/error-page.d.ts +32 -0
  213. package/dist/dev-tools/error-page.d.ts.map +1 -0
  214. package/dist/dev-tools/holding-server.d.ts +54 -0
  215. package/dist/dev-tools/holding-server.d.ts.map +1 -0
  216. package/dist/dev-tools/hydration-overlay.d.ts +11 -0
  217. package/dist/dev-tools/hydration-overlay.d.ts.map +1 -0
  218. package/dist/dev-tools/index.d.ts +31 -0
  219. package/dist/dev-tools/index.d.ts.map +1 -0
  220. package/dist/dev-tools/instrumentation.d.ts +59 -0
  221. package/dist/dev-tools/instrumentation.d.ts.map +1 -0
  222. package/dist/{server/dev-logger.d.ts → dev-tools/logger.d.ts} +1 -1
  223. package/dist/dev-tools/logger.d.ts.map +1 -0
  224. package/dist/{plugins/dev-logs.d.ts → dev-tools/logs.d.ts} +2 -2
  225. package/dist/dev-tools/logs.d.ts.map +1 -0
  226. package/dist/dev-tools/overlay.d.ts +91 -0
  227. package/dist/dev-tools/overlay.d.ts.map +1 -0
  228. package/dist/dev-tools/stack-classifier.d.ts +34 -0
  229. package/dist/dev-tools/stack-classifier.d.ts.map +1 -0
  230. package/dist/dev-tools/terminal.d.ts +28 -0
  231. package/dist/dev-tools/terminal.d.ts.map +1 -0
  232. package/dist/fonts/ast-walk.d.ts +68 -0
  233. package/dist/fonts/ast-walk.d.ts.map +1 -0
  234. package/dist/fonts/ast.d.ts +110 -6
  235. package/dist/fonts/ast.d.ts.map +1 -1
  236. package/dist/fonts/bundle.d.ts +50 -0
  237. package/dist/fonts/bundle.d.ts.map +1 -0
  238. package/dist/fonts/dev-middleware.d.ts +22 -0
  239. package/dist/fonts/dev-middleware.d.ts.map +1 -0
  240. package/dist/fonts/fallbacks.d.ts +0 -7
  241. package/dist/fonts/fallbacks.d.ts.map +1 -1
  242. package/dist/fonts/google.d.ts +4 -2
  243. package/dist/fonts/google.d.ts.map +1 -1
  244. package/dist/fonts/local.d.ts +4 -4
  245. package/dist/fonts/local.d.ts.map +1 -1
  246. package/dist/fonts/paths.d.ts +43 -0
  247. package/dist/fonts/paths.d.ts.map +1 -0
  248. package/dist/fonts/pipeline.d.ts +158 -0
  249. package/dist/fonts/pipeline.d.ts.map +1 -0
  250. package/dist/fonts/transform.d.ts +78 -0
  251. package/dist/fonts/transform.d.ts.map +1 -0
  252. package/dist/fonts/types.d.ts +47 -1
  253. package/dist/fonts/types.d.ts.map +1 -1
  254. package/dist/fonts/virtual-modules.d.ts +77 -0
  255. package/dist/fonts/virtual-modules.d.ts.map +1 -0
  256. package/dist/index.d.ts +46 -180
  257. package/dist/index.d.ts.map +1 -1
  258. package/dist/index.js +6452 -13421
  259. package/dist/index.js.map +1 -1
  260. package/dist/params/codec-registry.d.ts +26 -0
  261. package/dist/params/codec-registry.d.ts.map +1 -0
  262. package/dist/params/define-schema.d.ts +81 -0
  263. package/dist/params/define-schema.d.ts.map +1 -0
  264. package/dist/params/index.d.ts +5 -0
  265. package/dist/params/index.d.ts.map +1 -0
  266. package/dist/params/index.js +34 -0
  267. package/dist/params/index.js.map +1 -0
  268. package/dist/params/resolve-schema.d.ts +34 -0
  269. package/dist/params/resolve-schema.d.ts.map +1 -0
  270. package/dist/plugin-context.d.ts +137 -0
  271. package/dist/plugin-context.d.ts.map +1 -0
  272. package/dist/plugins/adapter-build.d.ts +20 -1
  273. package/dist/plugins/adapter-build.d.ts.map +1 -1
  274. package/dist/plugins/build-manifest.d.ts +7 -3
  275. package/dist/plugins/build-manifest.d.ts.map +1 -1
  276. package/dist/plugins/build-report.d.ts +9 -7
  277. package/dist/plugins/build-report.d.ts.map +1 -1
  278. package/dist/plugins/cache.d.ts +73 -0
  279. package/dist/plugins/cache.d.ts.map +1 -0
  280. package/dist/plugins/client-chunks.d.ts +39 -0
  281. package/dist/plugins/client-chunks.d.ts.map +1 -0
  282. package/dist/plugins/cloudflare-wasm.d.ts +21 -0
  283. package/dist/plugins/cloudflare-wasm.d.ts.map +1 -0
  284. package/dist/plugins/content.d.ts +1 -1
  285. package/dist/plugins/content.d.ts.map +1 -1
  286. package/dist/plugins/dev-server.d.ts +17 -1
  287. package/dist/plugins/dev-server.d.ts.map +1 -1
  288. package/dist/plugins/entries.d.ts +1 -1
  289. package/dist/plugins/entries.d.ts.map +1 -1
  290. package/dist/plugins/fonts.d.ts +16 -73
  291. package/dist/plugins/fonts.d.ts.map +1 -1
  292. package/dist/plugins/mdx.d.ts +1 -1
  293. package/dist/plugins/mdx.d.ts.map +1 -1
  294. package/dist/plugins/routing.d.ts +1 -1
  295. package/dist/plugins/routing.d.ts.map +1 -1
  296. package/dist/plugins/server-bundle.d.ts.map +1 -1
  297. package/dist/plugins/shims.d.ts +29 -5
  298. package/dist/plugins/shims.d.ts.map +1 -1
  299. package/dist/plugins/static-build.d.ts +5 -26
  300. package/dist/plugins/static-build.d.ts.map +1 -1
  301. package/dist/routing/codegen-shared.d.ts +67 -0
  302. package/dist/routing/codegen-shared.d.ts.map +1 -0
  303. package/dist/routing/codegen-types.d.ts +64 -0
  304. package/dist/routing/codegen-types.d.ts.map +1 -0
  305. package/dist/routing/codegen.d.ts +7 -2
  306. package/dist/routing/codegen.d.ts.map +1 -1
  307. package/dist/routing/convention-lint.d.ts +41 -0
  308. package/dist/routing/convention-lint.d.ts.map +1 -0
  309. package/dist/routing/file-cache.d.ts +8 -0
  310. package/dist/routing/file-cache.d.ts.map +1 -0
  311. package/dist/routing/index.d.ts +7 -1
  312. package/dist/routing/index.d.ts.map +1 -1
  313. package/dist/routing/index.js +4 -2
  314. package/dist/routing/interception.d.ts +0 -5
  315. package/dist/routing/interception.d.ts.map +1 -1
  316. package/dist/routing/link-codegen.d.ts +90 -0
  317. package/dist/routing/link-codegen.d.ts.map +1 -0
  318. package/dist/routing/manifest-codegen.d.ts +32 -0
  319. package/dist/routing/manifest-codegen.d.ts.map +1 -0
  320. package/dist/routing/scanner.d.ts +1 -10
  321. package/dist/routing/scanner.d.ts.map +1 -1
  322. package/dist/routing/schema-validation.d.ts +35 -0
  323. package/dist/routing/schema-validation.d.ts.map +1 -0
  324. package/dist/routing/segment-classify.d.ts +75 -0
  325. package/dist/routing/segment-classify.d.ts.map +1 -0
  326. package/dist/routing/segment-codegen.d.ts +38 -0
  327. package/dist/routing/segment-codegen.d.ts.map +1 -0
  328. package/dist/routing/types.d.ts +77 -25
  329. package/dist/routing/types.d.ts.map +1 -1
  330. package/dist/routing/walkers.d.ts +51 -0
  331. package/dist/routing/walkers.d.ts.map +1 -0
  332. package/dist/rsc-runtime/rsc.d.ts +1 -1
  333. package/dist/rsc-runtime/rsc.d.ts.map +1 -1
  334. package/dist/rsc-runtime/ssr.d.ts +12 -0
  335. package/dist/rsc-runtime/ssr.d.ts.map +1 -1
  336. package/dist/schema-bridge.d.ts +91 -0
  337. package/dist/schema-bridge.d.ts.map +1 -0
  338. package/dist/search-params/define.d.ts +157 -0
  339. package/dist/search-params/define.d.ts.map +1 -0
  340. package/dist/search-params/index.d.ts +4 -7
  341. package/dist/search-params/index.d.ts.map +1 -1
  342. package/dist/search-params/index.js +37 -440
  343. package/dist/search-params/index.js.map +1 -1
  344. package/dist/search-params/registry.d.ts +2 -2
  345. package/dist/search-params/registry.d.ts.map +1 -1
  346. package/dist/search-params/wrappers.d.ts +53 -0
  347. package/dist/search-params/wrappers.d.ts.map +1 -0
  348. package/dist/segment-params/define.d.ts +89 -0
  349. package/dist/segment-params/define.d.ts.map +1 -0
  350. package/dist/segment-params/index.d.ts +3 -0
  351. package/dist/segment-params/index.d.ts.map +1 -0
  352. package/dist/segment-params/index.js +2 -0
  353. package/dist/server/access-gate.d.ts +8 -3
  354. package/dist/server/access-gate.d.ts.map +1 -1
  355. package/dist/server/action-client.d.ts +41 -6
  356. package/dist/server/action-client.d.ts.map +1 -1
  357. package/dist/server/action-encryption.d.ts +76 -0
  358. package/dist/server/action-encryption.d.ts.map +1 -0
  359. package/dist/server/action-handler.d.ts +35 -1
  360. package/dist/server/action-handler.d.ts.map +1 -1
  361. package/dist/server/actions.d.ts +9 -30
  362. package/dist/server/actions.d.ts.map +1 -1
  363. package/dist/server/als-registry.d.ts +70 -11
  364. package/dist/server/als-registry.d.ts.map +1 -1
  365. package/dist/server/asset-headers.d.ts +1 -15
  366. package/dist/server/asset-headers.d.ts.map +1 -1
  367. package/dist/server/body-limits.d.ts.map +1 -1
  368. package/dist/server/build-manifest.d.ts +6 -29
  369. package/dist/server/build-manifest.d.ts.map +1 -1
  370. package/dist/server/canonicalize.d.ts +10 -0
  371. package/dist/server/canonicalize.d.ts.map +1 -1
  372. package/dist/server/coalesce-tick.d.ts +40 -0
  373. package/dist/server/coalesce-tick.d.ts.map +1 -0
  374. package/dist/server/cookie-context.d.ts +170 -0
  375. package/dist/server/cookie-context.d.ts.map +1 -0
  376. package/dist/server/cookie-parsing.d.ts +51 -0
  377. package/dist/server/cookie-parsing.d.ts.map +1 -0
  378. package/dist/server/csrf.d.ts +3 -2
  379. package/dist/server/csrf.d.ts.map +1 -1
  380. package/dist/server/default-logger.d.ts +22 -0
  381. package/dist/server/default-logger.d.ts.map +1 -0
  382. package/dist/server/deny-boundary.d.ts +115 -0
  383. package/dist/server/deny-boundary.d.ts.map +1 -0
  384. package/dist/server/deny-renderer.d.ts +2 -2
  385. package/dist/server/deny-renderer.d.ts.map +1 -1
  386. package/dist/server/dev-source-map.d.ts +22 -0
  387. package/dist/server/dev-source-map.d.ts.map +1 -0
  388. package/dist/server/early-hints-sender.d.ts.map +1 -1
  389. package/dist/server/early-hints.d.ts +13 -11
  390. package/dist/server/early-hints.d.ts.map +1 -1
  391. package/dist/server/error-boundary-wrapper.d.ts +7 -1
  392. package/dist/server/error-boundary-wrapper.d.ts.map +1 -1
  393. package/dist/server/fallback-error.d.ts +12 -7
  394. package/dist/server/fallback-error.d.ts.map +1 -1
  395. package/dist/server/flight-injection-state.d.ts +66 -0
  396. package/dist/server/flight-injection-state.d.ts.map +1 -0
  397. package/dist/server/flight-scripts.d.ts +42 -0
  398. package/dist/server/flight-scripts.d.ts.map +1 -0
  399. package/dist/server/form-data.d.ts +29 -0
  400. package/dist/server/form-data.d.ts.map +1 -1
  401. package/dist/server/html-injector-core.d.ts +221 -0
  402. package/dist/server/html-injector-core.d.ts.map +1 -0
  403. package/dist/server/html-injectors.d.ts +81 -41
  404. package/dist/server/html-injectors.d.ts.map +1 -1
  405. package/dist/server/index.d.ts +10 -46
  406. package/dist/server/index.d.ts.map +1 -1
  407. package/dist/server/index.js +170 -2911
  408. package/dist/server/index.js.map +1 -1
  409. package/dist/server/internal.d.ts +44 -0
  410. package/dist/server/internal.d.ts.map +1 -0
  411. package/dist/server/internal.js +3015 -0
  412. package/dist/server/internal.js.map +1 -0
  413. package/dist/server/logger.d.ts +39 -7
  414. package/dist/server/logger.d.ts.map +1 -1
  415. package/dist/server/metadata-routes.d.ts +23 -7
  416. package/dist/server/metadata-routes.d.ts.map +1 -1
  417. package/dist/server/middleware-runner.d.ts +36 -4
  418. package/dist/server/middleware-runner.d.ts.map +1 -1
  419. package/dist/server/node-stream-transforms.d.ts +119 -0
  420. package/dist/server/node-stream-transforms.d.ts.map +1 -0
  421. package/dist/server/param-coercion.d.ts +54 -0
  422. package/dist/server/param-coercion.d.ts.map +1 -0
  423. package/dist/server/pipeline-helpers.d.ts +95 -0
  424. package/dist/server/pipeline-helpers.d.ts.map +1 -0
  425. package/dist/server/pipeline-interception.d.ts +1 -1
  426. package/dist/server/pipeline-interception.d.ts.map +1 -1
  427. package/dist/server/pipeline-metadata.d.ts +6 -0
  428. package/dist/server/pipeline-metadata.d.ts.map +1 -1
  429. package/dist/server/pipeline-outcome.d.ts +49 -0
  430. package/dist/server/pipeline-outcome.d.ts.map +1 -0
  431. package/dist/server/pipeline-phases.d.ts +56 -0
  432. package/dist/server/pipeline-phases.d.ts.map +1 -0
  433. package/dist/server/pipeline.d.ts +122 -19
  434. package/dist/server/pipeline.d.ts.map +1 -1
  435. package/dist/server/port-resolution.d.ts +117 -0
  436. package/dist/server/port-resolution.d.ts.map +1 -0
  437. package/dist/server/primitives.d.ts +75 -31
  438. package/dist/server/primitives.d.ts.map +1 -1
  439. package/dist/server/render-timeout.d.ts +51 -0
  440. package/dist/server/render-timeout.d.ts.map +1 -0
  441. package/dist/server/render-utils.d.ts +25 -0
  442. package/dist/server/render-utils.d.ts.map +1 -0
  443. package/dist/server/request-context.d.ts +62 -107
  444. package/dist/server/request-context.d.ts.map +1 -1
  445. package/dist/server/route-element-builder.d.ts +30 -18
  446. package/dist/server/route-element-builder.d.ts.map +1 -1
  447. package/dist/server/route-handler.d.ts.map +1 -1
  448. package/dist/server/route-matcher.d.ts +25 -36
  449. package/dist/server/route-matcher.d.ts.map +1 -1
  450. package/dist/server/rsc-entry/action-middleware-runner.d.ts +66 -0
  451. package/dist/server/rsc-entry/action-middleware-runner.d.ts.map +1 -0
  452. package/dist/server/rsc-entry/api-handler.d.ts +12 -3
  453. package/dist/server/rsc-entry/api-handler.d.ts.map +1 -1
  454. package/dist/server/rsc-entry/error-renderer.d.ts +26 -13
  455. package/dist/server/rsc-entry/error-renderer.d.ts.map +1 -1
  456. package/dist/server/rsc-entry/helpers.d.ts +51 -23
  457. package/dist/server/rsc-entry/helpers.d.ts.map +1 -1
  458. package/dist/server/rsc-entry/index.d.ts +19 -8
  459. package/dist/server/rsc-entry/index.d.ts.map +1 -1
  460. package/dist/server/rsc-entry/render-route.d.ts +50 -0
  461. package/dist/server/rsc-entry/render-route.d.ts.map +1 -0
  462. package/dist/server/rsc-entry/revalidate-renderer.d.ts +108 -0
  463. package/dist/server/rsc-entry/revalidate-renderer.d.ts.map +1 -0
  464. package/dist/server/rsc-entry/rsc-payload.d.ts +3 -3
  465. package/dist/server/rsc-entry/rsc-payload.d.ts.map +1 -1
  466. package/dist/server/rsc-entry/rsc-stream.d.ts +17 -1
  467. package/dist/server/rsc-entry/rsc-stream.d.ts.map +1 -1
  468. package/dist/server/rsc-entry/ssr-bridge.d.ts +5 -1
  469. package/dist/server/rsc-entry/ssr-bridge.d.ts.map +1 -1
  470. package/dist/server/rsc-entry/ssr-renderer.d.ts +34 -4
  471. package/dist/server/rsc-entry/ssr-renderer.d.ts.map +1 -1
  472. package/dist/server/rsc-entry/wrap-action-dispatch.d.ts +119 -0
  473. package/dist/server/rsc-entry/wrap-action-dispatch.d.ts.map +1 -0
  474. package/dist/server/safe-load.d.ts +46 -0
  475. package/dist/server/safe-load.d.ts.map +1 -0
  476. package/dist/server/sensitive-fields.d.ts +74 -0
  477. package/dist/server/sensitive-fields.d.ts.map +1 -0
  478. package/dist/server/sitemap-generator.d.ts +129 -0
  479. package/dist/server/sitemap-generator.d.ts.map +1 -0
  480. package/dist/server/sitemap-handler.d.ts +22 -0
  481. package/dist/server/sitemap-handler.d.ts.map +1 -0
  482. package/dist/server/slot-resolver.d.ts +7 -5
  483. package/dist/server/slot-resolver.d.ts.map +1 -1
  484. package/dist/server/ssr-bridge-types.d.ts +121 -0
  485. package/dist/server/ssr-bridge-types.d.ts.map +1 -0
  486. package/dist/server/ssr-entry.d.ts +2 -43
  487. package/dist/server/ssr-entry.d.ts.map +1 -1
  488. package/dist/server/ssr-render.d.ts +64 -21
  489. package/dist/server/ssr-render.d.ts.map +1 -1
  490. package/dist/server/ssr-wrappers.d.ts +50 -0
  491. package/dist/server/ssr-wrappers.d.ts.map +1 -0
  492. package/dist/server/state-tree-diff.d.ts +12 -5
  493. package/dist/server/state-tree-diff.d.ts.map +1 -1
  494. package/dist/server/status-code-resolver.d.ts +22 -11
  495. package/dist/server/status-code-resolver.d.ts.map +1 -1
  496. package/dist/server/stream-utils.d.ts +36 -0
  497. package/dist/server/stream-utils.d.ts.map +1 -0
  498. package/dist/server/tracing.d.ts +7 -6
  499. package/dist/server/tracing.d.ts.map +1 -1
  500. package/dist/server/tree-builder.d.ts +62 -30
  501. package/dist/server/tree-builder.d.ts.map +1 -1
  502. package/dist/server/tree-match.d.ts +49 -0
  503. package/dist/server/tree-match.d.ts.map +1 -0
  504. package/dist/server/types.d.ts +71 -6
  505. package/dist/server/types.d.ts.map +1 -1
  506. package/dist/server/utils/escape-html.d.ts +14 -0
  507. package/dist/server/utils/escape-html.d.ts.map +1 -0
  508. package/dist/server/utils/mdx-file.d.ts +15 -0
  509. package/dist/server/utils/mdx-file.d.ts.map +1 -0
  510. package/dist/server/version-skew.d.ts +61 -0
  511. package/dist/server/version-skew.d.ts.map +1 -0
  512. package/dist/shared/head-header.d.ts +54 -0
  513. package/dist/shared/head-header.d.ts.map +1 -0
  514. package/dist/shared/href-validation.d.ts +49 -0
  515. package/dist/shared/href-validation.d.ts.map +1 -0
  516. package/dist/shared/merge-search-params.d.ts +22 -0
  517. package/dist/shared/merge-search-params.d.ts.map +1 -0
  518. package/dist/shared/redirect-type.d.ts +17 -0
  519. package/dist/shared/redirect-type.d.ts.map +1 -0
  520. package/dist/shims/font-google.d.ts +1 -1
  521. package/dist/shims/font-google.d.ts.map +1 -1
  522. package/dist/shims/font-google.js +42 -0
  523. package/dist/shims/font-google.js.map +1 -0
  524. package/dist/shims/font-local.d.ts +26 -0
  525. package/dist/shims/font-local.d.ts.map +1 -0
  526. package/dist/shims/font-local.js +20 -0
  527. package/dist/shims/font-local.js.map +1 -0
  528. package/dist/shims/headers.d.ts +53 -1
  529. package/dist/shims/headers.d.ts.map +1 -1
  530. package/dist/shims/image.d.ts +16 -16
  531. package/dist/shims/navigation-client.d.ts +35 -11
  532. package/dist/shims/navigation-client.d.ts.map +1 -1
  533. package/dist/shims/navigation.d.ts +11 -5
  534. package/dist/shims/navigation.d.ts.map +1 -1
  535. package/dist/utils/state-machine.d.ts +80 -0
  536. package/dist/utils/state-machine.d.ts.map +1 -0
  537. package/package.json +63 -24
  538. package/src/adapters/build-output-helper.ts +139 -0
  539. package/src/adapters/cloudflare-dev.ts +177 -0
  540. package/src/adapters/cloudflare-kv-cache.ts +179 -0
  541. package/src/adapters/cloudflare.ts +356 -116
  542. package/src/adapters/compress-module.ts +27 -92
  543. package/src/adapters/nitro.ts +155 -99
  544. package/src/adapters/raw-imports.d.ts +5 -0
  545. package/src/adapters/shared.ts +40 -0
  546. package/src/adapters/wrangler.d.ts +7 -0
  547. package/src/cache/cache-api.ts +47 -0
  548. package/src/cache/handler-store.ts +68 -0
  549. package/src/cache/index.ts +84 -18
  550. package/src/cache/invalidation-epoch.ts +93 -0
  551. package/src/cache/redis-handler.ts +110 -15
  552. package/src/cache/singleflight.ts +62 -4
  553. package/src/cache/sizeof.ts +33 -0
  554. package/src/cache/stable-stringify.ts +65 -2
  555. package/src/cache/timber-cache.ts +132 -36
  556. package/src/cli-schema-sync.ts +388 -0
  557. package/src/cli.ts +98 -34
  558. package/src/client/browser-dev.ts +153 -1
  559. package/src/client/browser-entry/action-dispatch.ts +119 -0
  560. package/src/client/browser-entry/hmr.ts +70 -0
  561. package/src/client/browser-entry/hydrate.ts +187 -0
  562. package/src/client/browser-entry/index.ts +111 -0
  563. package/src/client/browser-entry/post-hydration.ts +104 -0
  564. package/src/client/browser-entry/router-init.ts +292 -0
  565. package/src/client/browser-entry/rsc-stream.ts +157 -0
  566. package/src/client/browser-entry/scroll.ts +50 -0
  567. package/src/client/error-boundary.tsx +127 -22
  568. package/src/client/error-reconstituter.tsx +79 -0
  569. package/src/client/form.tsx +31 -32
  570. package/src/client/history.ts +11 -3
  571. package/src/client/index.ts +67 -45
  572. package/src/client/internal.ts +58 -0
  573. package/src/client/link.tsx +346 -150
  574. package/src/client/navigation-api-types.ts +112 -0
  575. package/src/client/navigation-api.ts +347 -0
  576. package/src/client/navigation-context.ts +15 -7
  577. package/src/client/navigation-root.tsx +355 -0
  578. package/src/client/nuqs-adapter.tsx +16 -3
  579. package/src/client/router-ref.ts +1 -1
  580. package/src/client/router.ts +490 -140
  581. package/src/client/rsc-fetch.ts +220 -17
  582. package/src/client/segment-cache.ts +6 -3
  583. package/src/client/segment-outlet.tsx +77 -0
  584. package/src/client/segment-update-context.ts +42 -0
  585. package/src/client/shallow-url.ts +22 -0
  586. package/src/client/ssr-data.ts +13 -5
  587. package/src/client/state.ts +2 -2
  588. package/src/client/top-loader.tsx +11 -9
  589. package/src/client/use-cookie.ts +31 -2
  590. package/src/client/use-link-status.ts +7 -7
  591. package/src/client/use-pathname.ts +1 -0
  592. package/src/client/use-pending-navigation.ts +40 -0
  593. package/src/client/use-query-states.ts +9 -3
  594. package/src/client/use-router.ts +4 -1
  595. package/src/client/use-search-params.ts +31 -44
  596. package/src/client/{use-params.ts → use-segment-params.ts} +9 -6
  597. package/src/codec.ts +147 -0
  598. package/src/config-types.ts +292 -0
  599. package/src/config-validation.ts +311 -0
  600. package/src/content/index.ts +5 -13
  601. package/src/cookies/define-cookie.ts +217 -53
  602. package/src/cookies/index.ts +12 -1
  603. package/src/cookies/json-cookie.ts +105 -0
  604. package/src/cookies/validation.ts +192 -0
  605. package/src/dev-tools/404-page.ts +286 -0
  606. package/src/dev-tools/browser-logs.ts +291 -0
  607. package/src/dev-tools/dev-page-shell.ts +260 -0
  608. package/src/dev-tools/error-page.ts +331 -0
  609. package/src/dev-tools/holding-server.ts +187 -0
  610. package/src/dev-tools/hydration-overlay.ts +158 -0
  611. package/src/dev-tools/index.ts +83 -0
  612. package/src/dev-tools/instrumentation.ts +213 -0
  613. package/src/{plugins/dev-logs.ts → dev-tools/logs.ts} +9 -5
  614. package/src/dev-tools/overlay.ts +469 -0
  615. package/src/dev-tools/stack-classifier.ts +75 -0
  616. package/src/dev-tools/terminal.ts +183 -0
  617. package/src/fonts/ast-walk.ts +235 -0
  618. package/src/fonts/ast.ts +477 -126
  619. package/src/fonts/bundle.ts +138 -0
  620. package/src/fonts/dev-middleware.ts +85 -0
  621. package/src/fonts/fallbacks.ts +0 -23
  622. package/src/fonts/google.ts +7 -3
  623. package/src/fonts/local.ts +9 -8
  624. package/src/fonts/paths.ts +58 -0
  625. package/src/fonts/pipeline.ts +316 -0
  626. package/src/fonts/transform.ts +344 -0
  627. package/src/fonts/types.ts +52 -1
  628. package/src/fonts/virtual-modules.ts +179 -0
  629. package/src/index.ts +417 -346
  630. package/src/params/codec-registry.ts +34 -0
  631. package/src/params/define-schema.ts +115 -0
  632. package/src/params/index.ts +17 -0
  633. package/src/params/resolve-schema.ts +84 -0
  634. package/src/plugin-context.ts +325 -0
  635. package/src/plugins/adapter-build.ts +98 -4
  636. package/src/plugins/build-manifest.ts +168 -23
  637. package/src/plugins/build-report.ts +16 -25
  638. package/src/plugins/cache.ts +285 -0
  639. package/src/plugins/client-chunks.ts +113 -0
  640. package/src/plugins/cloudflare-wasm.ts +141 -0
  641. package/src/plugins/content.ts +1 -1
  642. package/src/plugins/dev-server.ts +293 -46
  643. package/src/plugins/entries.ts +110 -8
  644. package/src/plugins/fonts.ts +170 -663
  645. package/src/plugins/mdx.ts +47 -10
  646. package/src/plugins/routing.ts +237 -241
  647. package/src/plugins/server-bundle.ts +85 -12
  648. package/src/plugins/shims.ts +207 -64
  649. package/src/plugins/static-build.ts +15 -89
  650. package/src/routing/codegen-shared.ts +115 -0
  651. package/src/routing/codegen-types.ts +65 -0
  652. package/src/routing/codegen.ts +380 -178
  653. package/src/routing/convention-lint.ts +358 -0
  654. package/src/routing/file-cache.ts +23 -0
  655. package/src/routing/index.ts +10 -1
  656. package/src/routing/interception.ts +3 -22
  657. package/src/routing/link-codegen.ts +310 -0
  658. package/src/routing/manifest-codegen.ts +290 -0
  659. package/src/routing/scanner.ts +248 -188
  660. package/src/routing/schema-validation.ts +149 -0
  661. package/src/routing/segment-classify.ts +188 -0
  662. package/src/routing/segment-codegen.ts +98 -0
  663. package/src/routing/types.ts +78 -25
  664. package/src/routing/walkers.ts +90 -0
  665. package/src/rsc-runtime/rsc.ts +2 -0
  666. package/src/rsc-runtime/ssr.ts +50 -0
  667. package/src/rsc-runtime/vendor-types.d.ts +7 -0
  668. package/src/schema-bridge.ts +252 -0
  669. package/src/search-params/define.ts +570 -0
  670. package/src/search-params/index.ts +14 -20
  671. package/src/search-params/registry.ts +2 -2
  672. package/src/search-params/wrappers.ts +110 -0
  673. package/src/segment-params/define.ts +249 -0
  674. package/src/segment-params/index.ts +9 -0
  675. package/src/server/access-gate.tsx +84 -34
  676. package/src/server/action-client.ts +119 -28
  677. package/src/server/action-encryption.ts +144 -0
  678. package/src/server/action-handler.ts +122 -16
  679. package/src/server/actions.ts +39 -53
  680. package/src/server/als-registry.ts +108 -20
  681. package/src/server/asset-headers.ts +8 -34
  682. package/src/server/body-limits.ts +10 -2
  683. package/src/server/build-manifest.ts +13 -56
  684. package/src/server/canonicalize.ts +6 -3
  685. package/src/server/coalesce-tick.ts +75 -0
  686. package/src/server/compress.ts +34 -7
  687. package/src/server/cookie-context.ts +484 -0
  688. package/src/server/cookie-parsing.ts +147 -0
  689. package/src/server/csrf.ts +39 -6
  690. package/src/server/default-logger.ts +99 -0
  691. package/src/server/deny-boundary.ts +311 -0
  692. package/src/server/deny-renderer.ts +80 -64
  693. package/src/server/dev-source-map.ts +31 -0
  694. package/src/server/early-hints-sender.ts +3 -2
  695. package/src/server/early-hints.ts +37 -27
  696. package/src/server/error-boundary-wrapper.ts +61 -22
  697. package/src/server/fallback-error.ts +79 -102
  698. package/src/server/flight-injection-state.ts +113 -0
  699. package/src/server/flight-scripts.ts +62 -0
  700. package/src/server/form-data.ts +101 -5
  701. package/src/server/html-injector-core.ts +437 -0
  702. package/src/server/html-injectors.ts +256 -251
  703. package/src/server/index.ts +29 -183
  704. package/src/server/internal.ts +165 -0
  705. package/src/server/logger.ts +67 -36
  706. package/src/server/metadata-routes.ts +44 -19
  707. package/src/server/middleware-runner.ts +75 -4
  708. package/src/server/node-stream-transforms.ts +331 -0
  709. package/src/server/param-coercion.ts +206 -0
  710. package/src/server/pipeline-helpers.ts +204 -0
  711. package/src/server/pipeline-interception.ts +32 -18
  712. package/src/server/pipeline-metadata.ts +13 -0
  713. package/src/server/pipeline-outcome.ts +197 -0
  714. package/src/server/pipeline-phases.ts +527 -0
  715. package/src/server/pipeline.ts +213 -382
  716. package/src/server/port-resolution.ts +215 -0
  717. package/src/server/primitives.ts +126 -63
  718. package/src/server/render-timeout.ts +108 -0
  719. package/src/server/render-utils.ts +31 -0
  720. package/src/server/request-context.ts +168 -337
  721. package/src/server/route-element-builder.ts +481 -222
  722. package/src/server/route-handler.ts +31 -4
  723. package/src/server/route-matcher.ts +144 -277
  724. package/src/server/rsc-entry/action-middleware-runner.ts +167 -0
  725. package/src/server/rsc-entry/api-handler.ts +69 -32
  726. package/src/server/rsc-entry/error-renderer.ts +306 -89
  727. package/src/server/rsc-entry/helpers.ts +160 -59
  728. package/src/server/rsc-entry/index.ts +299 -329
  729. package/src/server/rsc-entry/render-route.ts +311 -0
  730. package/src/server/rsc-entry/revalidate-renderer.ts +344 -0
  731. package/src/server/rsc-entry/rsc-payload.ts +71 -26
  732. package/src/server/rsc-entry/rsc-stream.ts +85 -13
  733. package/src/server/rsc-entry/ssr-bridge.ts +18 -5
  734. package/src/server/rsc-entry/ssr-renderer.ts +273 -43
  735. package/src/server/rsc-entry/wrap-action-dispatch.ts +449 -0
  736. package/src/server/safe-load.ts +60 -0
  737. package/src/server/sensitive-fields.ts +230 -0
  738. package/src/server/sitemap-generator.ts +338 -0
  739. package/src/server/sitemap-handler.ts +148 -0
  740. package/src/server/slot-resolver.ts +258 -257
  741. package/src/server/ssr-bridge-types.ts +124 -0
  742. package/src/server/ssr-entry.ts +206 -78
  743. package/src/server/ssr-render.ts +345 -82
  744. package/src/server/ssr-wrappers.tsx +141 -0
  745. package/src/server/state-tree-diff.ts +30 -23
  746. package/src/server/status-code-resolver.ts +115 -130
  747. package/src/server/stream-utils.ts +213 -0
  748. package/src/server/tracing.ts +38 -11
  749. package/src/server/tree-builder.ts +204 -90
  750. package/src/server/tree-match.ts +220 -0
  751. package/src/server/types.ts +78 -9
  752. package/src/server/utils/escape-html.ts +20 -0
  753. package/src/server/utils/mdx-file.ts +22 -0
  754. package/src/server/version-skew.ts +104 -0
  755. package/src/shared/head-header.ts +69 -0
  756. package/src/shared/href-validation.ts +159 -0
  757. package/src/shared/merge-search-params.ts +55 -0
  758. package/src/shared/redirect-type.ts +17 -0
  759. package/src/shims/font-google.ts +1 -1
  760. package/src/shims/font-local.ts +34 -0
  761. package/src/shims/headers.ts +122 -1
  762. package/src/shims/navigation-client.ts +51 -29
  763. package/src/shims/navigation.ts +14 -7
  764. package/src/utils/state-machine.ts +111 -0
  765. package/dist/_chunks/als-registry-B7DbZ2hS.js +0 -41
  766. package/dist/_chunks/als-registry-B7DbZ2hS.js.map +0 -1
  767. package/dist/_chunks/debug-B3Gypr3D.js +0 -108
  768. package/dist/_chunks/debug-B3Gypr3D.js.map +0 -1
  769. package/dist/_chunks/format-RyoGQL74.js +0 -164
  770. package/dist/_chunks/format-RyoGQL74.js.map +0 -1
  771. package/dist/_chunks/interception-BOoWmLUA.js +0 -676
  772. package/dist/_chunks/interception-BOoWmLUA.js.map +0 -1
  773. package/dist/_chunks/metadata-routes-Cjmvi3rQ.js.map +0 -1
  774. package/dist/_chunks/request-context-BQUC8PHn.js +0 -330
  775. package/dist/_chunks/request-context-BQUC8PHn.js.map +0 -1
  776. package/dist/_chunks/ssr-data-MjmprTmO.js.map +0 -1
  777. package/dist/_chunks/tracing-CemImE6h.js +0 -187
  778. package/dist/_chunks/tracing-CemImE6h.js.map +0 -1
  779. package/dist/_chunks/use-cookie-DX-l1_5E.js +0 -91
  780. package/dist/_chunks/use-cookie-DX-l1_5E.js.map +0 -1
  781. package/dist/_chunks/use-query-states-D5KaffOK.js.map +0 -1
  782. package/dist/cache/register-cached-function.d.ts +0 -17
  783. package/dist/cache/register-cached-function.d.ts.map +0 -1
  784. package/dist/client/browser-entry.d.ts +0 -21
  785. package/dist/client/browser-entry.d.ts.map +0 -1
  786. package/dist/client/link-status-provider.d.ts +0 -11
  787. package/dist/client/link-status-provider.d.ts.map +0 -1
  788. package/dist/client/segment-merger.d.ts +0 -119
  789. package/dist/client/segment-merger.d.ts.map +0 -1
  790. package/dist/client/stale-reload.d.ts +0 -44
  791. package/dist/client/stale-reload.d.ts.map +0 -1
  792. package/dist/client/transition-root.d.ts +0 -74
  793. package/dist/client/transition-root.d.ts.map +0 -1
  794. package/dist/client/use-navigation-pending.d.ts +0 -26
  795. package/dist/client/use-navigation-pending.d.ts.map +0 -1
  796. package/dist/client/use-params.d.ts.map +0 -1
  797. package/dist/plugins/cache-transform.d.ts +0 -36
  798. package/dist/plugins/cache-transform.d.ts.map +0 -1
  799. package/dist/plugins/dev-error-overlay.d.ts +0 -60
  800. package/dist/plugins/dev-error-overlay.d.ts.map +0 -1
  801. package/dist/plugins/dev-logs.d.ts.map +0 -1
  802. package/dist/plugins/dynamic-transform.d.ts +0 -72
  803. package/dist/plugins/dynamic-transform.d.ts.map +0 -1
  804. package/dist/plugins/server-action-exports.d.ts +0 -26
  805. package/dist/plugins/server-action-exports.d.ts.map +0 -1
  806. package/dist/routing/status-file-lint.d.ts +0 -33
  807. package/dist/routing/status-file-lint.d.ts.map +0 -1
  808. package/dist/search-params/analyze.d.ts +0 -54
  809. package/dist/search-params/analyze.d.ts.map +0 -1
  810. package/dist/search-params/builtin-codecs.d.ts +0 -105
  811. package/dist/search-params/builtin-codecs.d.ts.map +0 -1
  812. package/dist/search-params/codecs.d.ts +0 -53
  813. package/dist/search-params/codecs.d.ts.map +0 -1
  814. package/dist/search-params/create.d.ts +0 -106
  815. package/dist/search-params/create.d.ts.map +0 -1
  816. package/dist/server/dev-fetch-instrumentation.d.ts +0 -22
  817. package/dist/server/dev-fetch-instrumentation.d.ts.map +0 -1
  818. package/dist/server/dev-logger.d.ts.map +0 -1
  819. package/dist/server/dev-span-processor.d.ts +0 -29
  820. package/dist/server/dev-span-processor.d.ts.map +0 -1
  821. package/dist/server/dev-warnings.d.ts +0 -129
  822. package/dist/server/dev-warnings.d.ts.map +0 -1
  823. package/dist/server/flush.d.ts +0 -74
  824. package/dist/server/flush.d.ts.map +0 -1
  825. package/dist/server/manifest-status-resolver.d.ts +0 -58
  826. package/dist/server/manifest-status-resolver.d.ts.map +0 -1
  827. package/dist/server/prerender.d.ts +0 -77
  828. package/dist/server/prerender.d.ts.map +0 -1
  829. package/dist/utils/directive-parser.d.ts +0 -70
  830. package/dist/utils/directive-parser.d.ts.map +0 -1
  831. package/src/cache/register-cached-function.ts +0 -103
  832. package/src/client/browser-entry.ts +0 -678
  833. package/src/client/link-status-provider.tsx +0 -30
  834. package/src/client/segment-merger.ts +0 -339
  835. package/src/client/stale-reload.ts +0 -87
  836. package/src/client/transition-root.tsx +0 -166
  837. package/src/client/use-navigation-pending.ts +0 -38
  838. package/src/plugins/cache-transform.ts +0 -199
  839. package/src/plugins/dev-error-overlay.ts +0 -230
  840. package/src/plugins/dynamic-transform.ts +0 -161
  841. package/src/plugins/server-action-exports.ts +0 -220
  842. package/src/routing/status-file-lint.ts +0 -112
  843. package/src/search-params/analyze.ts +0 -192
  844. package/src/search-params/builtin-codecs.ts +0 -228
  845. package/src/search-params/codecs.ts +0 -153
  846. package/src/search-params/create.ts +0 -321
  847. package/src/server/dev-fetch-instrumentation.ts +0 -96
  848. package/src/server/dev-span-processor.ts +0 -78
  849. package/src/server/dev-warnings.ts +0 -283
  850. package/src/server/flush.ts +0 -182
  851. package/src/server/manifest-status-resolver.ts +0 -215
  852. package/src/server/prerender.ts +0 -139
  853. package/src/utils/directive-parser.ts +0 -529
  854. /package/src/{server/dev-logger.ts → dev-tools/logger.ts} +0 -0
@@ -1,101 +1,36 @@
1
- // Generated compression module template for self-hosted deployments.
1
+ // Compiles server/compress.ts into a standalone ESM module (_compress.mjs)
2
+ // for self-hosted deployments. The adapter writes this to the build output
3
+ // during buildOutput(). It's imported by the Nitro entry and preview server
4
+ // at runtime.
2
5
  //
3
- // This file generates a standalone ESM module (_compress.mjs) that is
4
- // written to the build output during adapter buildOutput(). It's imported
5
- // by the Nitro entry and preview server at runtime.
6
- //
7
- // Uses CompressionStream (Web API) for gzip. Brotli is left to CDNs/reverse
8
- // proxies — at streaming quality levels its ratio advantage is marginal and
9
- // node:zlib buffers output internally, breaking streaming.
10
- // Cloudflare Workers don't need this — the edge auto-compresses.
11
- //
12
- // See design/25-production-deployments.md.
6
+ // By compiling the actual TypeScript source rather than maintaining a
7
+ // hand-written string template, any fix to server/compress.ts automatically
8
+ // flows to the production module. See design/18-build-system.md ("entry
9
+ // modules are real TypeScript files, not codegen strings").
10
+
11
+ import { transformWithOxc } from 'vite';
12
+ // Vite's ?raw import embeds the file as a string at build time — works
13
+ // in both dev (Vite resolves the TS source) and the published package
14
+ // (the string is inlined into the compiled adapter entry).
15
+ import compressSource from '../server/compress.ts?raw';
13
16
 
14
17
  /**
15
- * Generate a standalone ESM module that exports compressResponse().
18
+ * Compile server/compress.ts into a standalone ESM module.
16
19
  *
17
- * Written to `_compress.mjs` during buildOutput. Imported by the Nitro entry
18
- * and preview server.
20
+ * Uses Vite's OXC transform to strip TypeScript types from the
21
+ * embedded source. The result is written to `_compress.mjs` during
22
+ * buildOutput.
19
23
  *
20
24
  * @internal Exported for testing.
21
25
  */
22
- export function generateCompressModule(): string {
23
- return `// Generated by @timber-js/app — response compression for self-hosted deployments.
24
- // Do not edit — this file is regenerated on each build.
25
- // Uses CompressionStream (Web API) for gzip. Brotli is left to CDNs/reverse
26
- // proxies — at streaming quality levels its ratio advantage is marginal and
27
- // node:zlib buffers output internally, breaking streaming.
28
-
29
- const COMPRESSIBLE_TYPES = new Set([
30
- 'text/html', 'text/css', 'text/plain', 'text/xml', 'text/javascript',
31
- 'text/x-component', 'application/json', 'application/javascript',
32
- 'application/xml', 'application/xhtml+xml', 'application/rss+xml',
33
- 'application/atom+xml', 'image/svg+xml',
34
- ]);
35
-
36
- const NO_COMPRESS_STATUSES = new Set([204, 304]);
37
-
38
- function negotiateEncoding(acceptEncoding) {
39
- if (!acceptEncoding) return null;
40
- // Parse tokens with quality values. Per RFC 9110 §12.5.3, q=0 means
41
- // "not acceptable" — the client explicitly rejects that encoding.
42
- // Brotli (br) is intentionally not handled at the application level.
43
- const parts = acceptEncoding.split(',');
44
- for (const part of parts) {
45
- const [token, ...params] = part.split(';');
46
- const name = token.trim().toLowerCase();
47
- if (name !== 'gzip') continue;
48
- let qValue = 1;
49
- for (const param of params) {
50
- const trimmed = param.trim().toLowerCase();
51
- if (trimmed.startsWith('q=')) {
52
- qValue = parseFloat(trimmed.slice(2));
53
- if (Number.isNaN(qValue)) qValue = 1;
54
- break;
55
- }
56
- }
57
- if (qValue > 0) return 'gzip';
58
- }
59
- return null;
60
- }
61
-
62
- function shouldCompress(response) {
63
- if (!response.body) return false;
64
- if (NO_COMPRESS_STATUSES.has(response.status)) return false;
65
- if (response.headers.has('Content-Encoding')) return false;
66
- const contentType = response.headers.get('Content-Type');
67
- if (!contentType) return false;
68
- const mimeType = contentType.split(';')[0].trim().toLowerCase();
69
- if (mimeType === 'text/event-stream') return false;
70
- return COMPRESSIBLE_TYPES.has(mimeType);
71
- }
72
-
73
- function compressWithGzip(body) {
74
- return body.pipeThrough(new CompressionStream('gzip'));
75
- }
76
-
77
- export function compressResponse(request, response) {
78
- if (!shouldCompress(response)) return response;
79
- const acceptEncoding = request.headers.get('Accept-Encoding') || '';
80
- const encoding = negotiateEncoding(acceptEncoding);
81
- if (!encoding) return response;
82
- const compressedBody = compressWithGzip(response.body);
83
- const headers = new Headers(response.headers);
84
- headers.set('Content-Encoding', encoding);
85
- headers.delete('Content-Length');
86
- const existingVary = headers.get('Vary');
87
- if (existingVary) {
88
- if (!existingVary.toLowerCase().includes('accept-encoding')) {
89
- headers.set('Vary', existingVary + ', Accept-Encoding');
90
- }
91
- } else {
92
- headers.set('Vary', 'Accept-Encoding');
93
- }
94
- return new Response(compressedBody, {
95
- status: response.status,
96
- statusText: response.statusText,
97
- headers,
26
+ export async function generateCompressModule(): Promise<string> {
27
+ const result = await transformWithOxc(compressSource, 'compress.ts', {
28
+ lang: 'ts',
98
29
  });
99
- }
100
- `;
30
+
31
+ return (
32
+ '// Generated by @timber-js/app — compiled from server/compress.ts.\n' +
33
+ '// Do not edit — this file is regenerated on each build.\n' +
34
+ result.code
35
+ );
101
36
  }
@@ -5,28 +5,13 @@
5
5
  // compression, graceful shutdown, static file serving, and platform quirks.
6
6
  // See design/11-platform.md and design/25-production-deployments.md.
7
7
 
8
- import { writeFile, readFile, mkdir, cp } from 'node:fs/promises';
8
+ import { writeFile, readFile } from 'node:fs/promises';
9
9
  import { execFile } from 'node:child_process';
10
10
  import { join, relative } from 'node:path';
11
11
  import type { TimberPlatformAdapter, TimberConfig } from './types';
12
12
  import { generateCompressModule } from './compress-module.js';
13
- // Inlined from server/asset-headers.ts — adapters are loaded by Node at
14
- // Vite startup time, before Vite's module resolver is available, so cross-
15
- // directory .ts imports don't resolve.
16
- const IMMUTABLE_CACHE = 'public, max-age=31536000, immutable';
17
- const STATIC_CACHE = 'public, max-age=3600, must-revalidate';
18
-
19
- function generateHeadersFile(): string {
20
- return `# Auto-generated by @timber-js/app — static asset cache headers.
21
- # See design/25-production-deployments.md §"CDN / Edge Cache"
22
-
23
- /assets/*
24
- Cache-Control: ${IMMUTABLE_CACHE}
25
-
26
- /*
27
- Cache-Control: ${STATIC_CACHE}
28
- `;
29
- }
13
+ import { IMMUTABLE_CACHE } from './shared.js';
14
+ import { runSharedBuildSteps } from './build-output-helper.js';
30
15
 
31
16
  // ─── Presets ─────────────────────────────────────────────────────────────────
32
17
 
@@ -149,6 +134,23 @@ export interface NitroAdapterOptions {
149
134
  */
150
135
  preset?: NitroPreset;
151
136
 
137
+ /**
138
+ * Enable application-level gzip compression for HTML and RSC responses.
139
+ *
140
+ * When `true` (default), the origin compresses responses using the Web
141
+ * `CompressionStream` API. This is useful for self-hosted deployments
142
+ * where no reverse proxy or CDN handles compression.
143
+ *
144
+ * Set to `false` when deploying behind a reverse proxy (nginx, caddy)
145
+ * or CDN (Cloudflare, Fastly, Vercel) that compresses at the edge.
146
+ * Disabling origin compression saves CPU on the Node.js event loop —
147
+ * compressing 1MB+ streaming HTML responses takes 10-15ms of main
148
+ * thread time per request, directly reducing throughput under load.
149
+ *
150
+ * @default true
151
+ */
152
+ compress?: boolean;
153
+
152
154
  /**
153
155
  * Additional Nitro configuration to merge into the generated config.
154
156
  * Overrides default values for the selected preset.
@@ -176,6 +178,7 @@ export interface NitroAdapterOptions {
176
178
  */
177
179
  export function nitro(options: NitroAdapterOptions = {}): TimberPlatformAdapter {
178
180
  const preset = options.preset ?? 'node-server';
181
+ const compress = options.compress ?? true;
179
182
  const presetConfig = PRESET_CONFIGS[preset];
180
183
  const pendingPromises: Promise<unknown>[] = [];
181
184
 
@@ -184,39 +187,20 @@ export function nitro(options: NitroAdapterOptions = {}): TimberPlatformAdapter
184
187
 
185
188
  async buildOutput(config: TimberConfig, buildDir: string) {
186
189
  const outDir = join(buildDir, 'nitro');
187
- await mkdir(outDir, { recursive: true });
188
-
189
- // Copy client assets to public directory.
190
- // When client JavaScript is disabled, skip .js files — only CSS,
191
- // fonts, images, and other static assets are needed.
192
- const clientDir = join(buildDir, 'client');
193
- const publicDir = join(outDir, 'public');
194
- await mkdir(publicDir, { recursive: true });
195
- await cp(clientDir, publicDir, {
196
- recursive: true,
197
- filter: config.clientJavascriptDisabled ? (src: string) => !src.endsWith('.js') : undefined,
198
- }).catch(() => {
199
- // Client dir may not exist when client JavaScript is disabled
200
- });
201
-
202
- // Write _headers file for platforms that support it (Netlify, etc.).
203
- // See design/25-production-deployments.md §"CDN / Edge Cache"
204
- await writeFile(join(publicDir, '_headers'), generateHeadersFile());
205
190
 
206
- // Write the build manifest init module (if manifest data was produced).
207
- if (config.manifestInit) {
208
- await writeFile(join(outDir, '_timber-manifest-init.js'), config.manifestInit);
209
- }
191
+ // Steps 1–5: shared across all adapters (mkdir, copy client/rsc/ssr,
192
+ // write _headers, write manifest-init).
193
+ await runSharedBuildSteps({
194
+ config,
195
+ buildDir,
196
+ outDir,
197
+ publicDirName: 'public',
198
+ });
210
199
 
211
200
  // Write the compression helper module for runtime use.
212
201
  // See design/25-production-deployments.md — self-hosted deployments
213
202
  // need application-level compression (Cloudflare handles it at the edge).
214
- await writeFile(join(outDir, '_compress.mjs'), generateCompressModule());
215
-
216
- // Copy rsc/ssr build output into the nitro dir so imports stay local
217
- // during the Nitro bundling step (avoids broken relative paths in output).
218
- await cp(join(buildDir, 'rsc'), join(outDir, 'rsc'), { recursive: true });
219
- await cp(join(buildDir, 'ssr'), join(outDir, 'ssr'), { recursive: true }).catch(() => {});
203
+ await writeFile(join(outDir, '_compress.mjs'), await generateCompressModule());
220
204
 
221
205
  // Prepend the manifest assignment directly into the RSC entry so
222
206
  // globalThis.__TIMBER_BUILD_MANIFEST__ is set before any module reads it.
@@ -229,7 +213,7 @@ export function nitro(options: NitroAdapterOptions = {}): TimberPlatformAdapter
229
213
  }
230
214
 
231
215
  // Generate the Nitro entry point (imports from ./rsc/ within nitro dir)
232
- const entry = generateNitroEntry(buildDir, outDir, preset);
216
+ const entry = generateNitroEntry(buildDir, outDir, preset, compress);
233
217
  await writeFile(join(outDir, 'entry.ts'), entry);
234
218
 
235
219
  // Run the Nitro build to produce a production-ready server bundle.
@@ -273,7 +257,7 @@ export function generateNitroEntry(
273
257
  buildDir: string,
274
258
  outDir: string,
275
259
  preset: NitroPreset,
276
- hasManifestInit = false
260
+ compress = true
277
261
  ): string {
278
262
  // The RSC entry is the main request handler — it exports the fetch handler as default.
279
263
  // rsc/ is copied into the nitro dir so the import is local.
@@ -330,20 +314,17 @@ export function generateNitroEntry(
330
314
  handlerCall = ` const webResponse = await handler(webRequest)`;
331
315
  }
332
316
 
333
- // Build manifest init must be imported before the handler so that
334
- // globalThis.__TIMBER_BUILD_MANIFEST__ is set when the virtual module evaluates.
335
- // ESM guarantees imports are evaluated in order.
336
- const manifestImport = hasManifestInit ? "import './_timber-manifest-init.js'\n" : '';
337
-
338
317
  // Import runWithWaitUntil only when the preset supports it.
339
318
  const waitUntilImport = supportsWaitUntil ? ', runWithWaitUntil' : '';
340
319
 
320
+ const compressImport = compress ? "import { compressResponse } from './_compress.mjs'\n" : '';
321
+ const compressCall = compress ? 'compressResponse(webRequest, webResponse)' : 'webResponse';
322
+
341
323
  return `// Generated by @timber-js/app/adapters/nitro
342
324
  // Do not edit — this file is regenerated on each build.
343
325
 
344
- ${manifestImport}import handler, { runWithEarlyHintsSender${waitUntilImport} } from '${serverEntryRelative}'
345
- import { compressResponse } from './_compress.mjs'
346
-
326
+ import handler, { runWithEarlyHintsSender${waitUntilImport} } from '${serverEntryRelative}'
327
+ ${compressImport}
347
328
  // Set TIMBER_RUNTIME for instrumentation.ts conditional SDK initialization.
348
329
  // See design/25-production-deployments.md §"TIMBER_RUNTIME".
349
330
  process.env.TIMBER_RUNTIME = '${runtimeName}'
@@ -357,39 +338,8 @@ export default async function timberHandler(event) {
357
338
  // h3 v2: event.req is the Web Request
358
339
  const webRequest = event.req
359
340
  ${handlerCall}
360
- return compressResponse(webRequest, webResponse)
361
- }
362
- `;
341
+ return ${compressCall}
363
342
  }
364
-
365
- /** @internal Exported for testing. */
366
- export function generateNitroConfig(
367
- preset: NitroPreset,
368
- userConfig?: Record<string, unknown>
369
- ): string {
370
- const presetConfig = PRESET_CONFIGS[preset];
371
-
372
- const config: Record<string, unknown> = {
373
- preset: presetConfig.nitroPreset,
374
- entry: './entry.ts',
375
- output: { dir: presetConfig.outputDir },
376
- // Static asset cache headers — hashed assets are immutable, others get 1h.
377
- // See design/25-production-deployments.md §"CDN / Edge Cache"
378
- routeRules: {
379
- '/assets/**': { headers: { 'Cache-Control': IMMUTABLE_CACHE } },
380
- },
381
- ...presetConfig.extraConfig,
382
- ...userConfig,
383
- };
384
-
385
- const configJson = JSON.stringify(config, null, 2);
386
-
387
- return `// Generated by @timber-js/app/adapters/nitro
388
- // Do not edit — this file is regenerated on each build.
389
-
390
- import { defineNitroConfig } from 'nitro/config'
391
-
392
- export default defineNitroConfig(${configJson})
393
343
  `;
394
344
  }
395
345
 
@@ -465,11 +415,32 @@ const MIME_TYPES = {
465
415
  };
466
416
 
467
417
  const publicDir = join(__dirname, '${publicDir}');
468
- const port = parseInt(process.env.PORT || '3000', 10);
418
+
419
+ // Port resolution (TIM-842):
420
+ // - Default to 3000
421
+ // - If PORT env var is set, honor it strictly (fail loudly on conflict)
422
+ // - Otherwise auto-bump from 3000 until a free port is found
423
+ // Mirrors the dev server behavior so timber dev/preview/production all
424
+ // behave the same way around port selection.
425
+ const envPort = process.env.PORT ? parseInt(process.env.PORT, 10) : null;
426
+ const portIsExplicit = envPort != null && Number.isFinite(envPort) && envPort > 0;
427
+ const startPort = portIsExplicit ? envPort : 3000;
469
428
  const host = process.env.HOST || process.env.HOSTNAME || 'localhost';
470
429
 
430
+ // Set after listenWithBump() resolves so request handlers can build
431
+ // absolute URLs from the actual bound port (which may differ from
432
+ // startPort after an auto-bump).
433
+ let boundPort = startPort;
434
+
471
435
  const server = createServer(async (req, res) => {
472
- const url = new URL(req.url || '/', \`http://\${host}:\${port}\`);
436
+ // Scheme from the socket's TLS state — a hardcoded http:// breaks CSRF
437
+ // origin comparison and absolute-URL construction when TLS is terminated
438
+ // at this server (TIM-1073; mirrors the dev-server fix in TIM-1067).
439
+ // X-Forwarded-Proto is intentionally not consulted here: on a direct
440
+ // connection it would be attacker-controlled. The CSRF layer honors it
441
+ // separately for reverse-proxy deployments.
442
+ const scheme = req.socket?.encrypted ? 'https' : 'http';
443
+ const url = new URL(req.url || '/', \`\${scheme}://\${host}:\${boundPort}\`);
473
444
 
474
445
  // Try serving static files from the public directory first.
475
446
  const filePath = join(publicDir, url.pathname);
@@ -482,7 +453,9 @@ const server = createServer(async (req, res) => {
482
453
  const contentType = MIME_TYPES[ext] || 'application/octet-stream';
483
454
  const body = await readFile(filePath);
484
455
  // Hashed assets get immutable cache, others get short cache.
485
- const cacheControl = url.pathname.startsWith('/assets/')
456
+ const isImmutable =
457
+ url.pathname.startsWith('/assets/') || url.pathname.startsWith('/_timber/fonts/');
458
+ const cacheControl = isImmutable
486
459
  ? 'public, max-age=31536000, immutable'
487
460
  : 'public, max-age=3600, must-revalidate';
488
461
  res.writeHead(200, {
@@ -540,18 +513,64 @@ const server = createServer(async (req, res) => {
540
513
  const webResponse = compressResponse(webRequest, rawResponse);
541
514
 
542
515
  // Write the response back to the Node response.
543
- res.writeHead(webResponse.status, Object.fromEntries(webResponse.headers.entries()));
516
+ //
517
+ // Set-Cookie needs special handling: Headers.entries() joins multiple
518
+ // Set-Cookie values with ", " into a single entry, but each cookie must
519
+ // be its own header per RFC 6265 §4.1. Object.fromEntries() would then
520
+ // collapse them into one malformed Set-Cookie header that browsers reject
521
+ // (or only honor partially). Use getSetCookie() to preserve individual
522
+ // values, and pass them as an array — Node's writeHead accepts
523
+ // Record<string, string | string[]> and emits one header per array entry.
524
+ //
525
+ // Without this, EVERY cookie set by the framework on Node—/Nitro deployments
526
+ // is silently dropped: defineCookie().setCookie() in actions, middleware
527
+ // cookie writes, the framework's own session cookies, all of it. See
528
+ // LOCAL-741.
529
+ const responseHeaders = {};
530
+ webResponse.headers.forEach((value, key) => {
531
+ if (key.toLowerCase() !== 'set-cookie') {
532
+ responseHeaders[key] = value;
533
+ }
534
+ });
535
+ const setCookies = webResponse.headers.getSetCookie();
536
+ if (setCookies.length > 0) {
537
+ responseHeaders['set-cookie'] = setCookies;
538
+ }
539
+ res.writeHead(webResponse.status, responseHeaders);
544
540
 
545
541
  if (webResponse.body) {
546
542
  const reader = webResponse.body.getReader();
547
- const pump = async () => {
543
+
544
+ // Cancel the reader when the client disconnects. This causes any
545
+ // pending reader.read() to reject, breaking the pump loop. Critical
546
+ // for SSE and other infinite streams — without this, disconnected
547
+ // clients leak readers.
548
+ let clientDisconnected = false;
549
+ const onClose = () => {
550
+ clientDisconnected = true;
551
+ reader.cancel('Client disconnected').catch(() => {});
552
+ };
553
+ res.on('close', onClose);
554
+
555
+ try {
548
556
  while (true) {
549
557
  const { done, value } = await reader.read();
550
- if (done) { res.end(); return; }
558
+ if (done) break;
551
559
  res.write(value);
552
560
  }
553
- };
554
- await pump();
561
+ } catch (err) {
562
+ // reader.cancel() from the close handler causes read() to reject.
563
+ // This is expected on client disconnect — not an error.
564
+ if (!clientDisconnected) {
565
+ throw err;
566
+ }
567
+ } finally {
568
+ res.off('close', onClose);
569
+ reader.releaseLock();
570
+ if (!res.writableEnded) {
571
+ res.end();
572
+ }
573
+ }
555
574
  } else {
556
575
  res.end();
557
576
  }
@@ -564,13 +583,49 @@ const server = createServer(async (req, res) => {
564
583
  }
565
584
  });
566
585
 
567
- server.listen(port, host, () => {
586
+ function listenWithBump(port, attempt = 0) {
587
+ return new Promise((resolveListen, rejectListen) => {
588
+ const onError = (err) => {
589
+ server.removeListener('listening', onListening);
590
+ if (err && err.code === 'EADDRINUSE' && !portIsExplicit && attempt < 100) {
591
+ if (attempt === 0) {
592
+ console.log(\` [timber] Port \${port} in use, trying \${port + 1}...\`);
593
+ }
594
+ listenWithBump(port + 1, attempt + 1).then(resolveListen, rejectListen);
595
+ return;
596
+ }
597
+ rejectListen(err);
598
+ };
599
+ const onListening = () => {
600
+ server.removeListener('error', onError);
601
+ resolveListen(port);
602
+ };
603
+ server.once('error', onError);
604
+ server.once('listening', onListening);
605
+ server.listen(port, host);
606
+ });
607
+ }
608
+
609
+ try {
610
+ boundPort = await listenWithBump(startPort);
611
+ if (boundPort !== startPort) {
612
+ console.log();
613
+ console.log(\` [timber] Port \${startPort} in use, using \${boundPort}\`);
614
+ }
568
615
  console.log();
569
616
  console.log(' ⚡ timber preview server running at:');
570
617
  console.log();
571
- console.log(\` ➜ http://\${host}:\${port}\`);
618
+ console.log(\` ➜ http://\${host}:\${boundPort}\`);
572
619
  console.log();
573
- });
620
+ } catch (err) {
621
+ if (err && err.code === 'EADDRINUSE') {
622
+ console.error(\`[timber] Port \${startPort} is already in use. \` +
623
+ 'Set PORT to a free port, or unset PORT to auto-pick.');
624
+ } else {
625
+ console.error('[timber] Failed to start preview server:', err);
626
+ }
627
+ process.exit(1);
628
+ }
574
629
  `;
575
630
  }
576
631
 
@@ -628,6 +683,7 @@ async function runNitroBuild(
628
683
  output: { dir: join(nitroDir, presetConfig.outputDir) },
629
684
  routeRules: {
630
685
  '/assets/**': { headers: { 'Cache-Control': IMMUTABLE_CACHE } },
686
+ '/_timber/fonts/**': { headers: { 'Cache-Control': IMMUTABLE_CACHE } },
631
687
  },
632
688
  // Don't bundle the timber RSC/SSR build output — it has its own
633
689
  // internal file references that nitro's bundler can't follow.
@@ -0,0 +1,5 @@
1
+ // Vite ?raw import — embeds a file as a string at build time.
2
+ declare module '*?raw' {
3
+ const content: string;
4
+ export default content;
5
+ }
@@ -0,0 +1,40 @@
1
+ // Shared adapter utilities — leaf module with zero deps on server/, client/,
2
+ // or any Vite-dependent code.
3
+ //
4
+ // Adapters are loaded by Node at Vite startup time, before Vite's module
5
+ // resolver is available. This module uses only Node built-ins and can be
6
+ // imported by both adapters via a relative path.
7
+ //
8
+ // IMPORTANT: Do NOT add imports from ../server/, ../client/, ../plugins/,
9
+ // or any module that transitively depends on Vite. A test in
10
+ // tests/adapters/shared-no-forbidden-imports.test.ts enforces this.
11
+
12
+ // ─── Static asset cache headers ──────────────────────────────────────────
13
+
14
+ /** Cache-Control value for hashed (immutable) assets. */
15
+ export const IMMUTABLE_CACHE = 'public, max-age=31536000, immutable';
16
+
17
+ /** Cache-Control value for unhashed static assets. */
18
+ export const STATIC_CACHE = 'public, max-age=3600, must-revalidate';
19
+
20
+ /**
21
+ * Generate a `_headers` file for static asset cache control.
22
+ *
23
+ * The `_headers` file is a platform convention supported by Cloudflare Workers
24
+ * Static Assets, Cloudflare Pages, and Netlify. It maps URL patterns to
25
+ * HTTP response headers.
26
+ *
27
+ * Vite places all hashed chunks under `/assets/` — these get immutable caching.
28
+ * Everything else (favicon.ico, robots.txt, etc.) gets a shorter cache.
29
+ */
30
+ export function generateHeadersFile(): string {
31
+ return `# Auto-generated by @timber-js/app — static asset cache headers.
32
+ # See design/25-production-deployments.md §"CDN / Edge Cache"
33
+
34
+ /assets/*
35
+ Cache-Control: ${IMMUTABLE_CACHE}
36
+
37
+ /*
38
+ Cache-Control: ${STATIC_CACHE}
39
+ `;
40
+ }
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Type stub for the optional `wrangler` peer dependency.
3
+ * Prevents TS2307 during declaration emit when wrangler is not installed.
4
+ */
5
+ declare module 'wrangler' {
6
+ export function getPlatformProxy(opts?: any): Promise<any>;
7
+ }
@@ -0,0 +1,47 @@
1
+ import type { CacheOptions } from './index';
2
+ import { createCache } from './timber-cache';
3
+ import { getCacheHandler } from './handler-store';
4
+ import { recordInvalidation } from './invalidation-epoch';
5
+
6
+ /**
7
+ * Public caching API: `cache(fn, opts)`.
8
+ *
9
+ * Wraps an async function with cross-request caching. Uses the configured
10
+ * cache handler (defaults to MemoryCacheHandler, overridable via timber.config.ts).
11
+ *
12
+ * ```ts
13
+ * import { cache } from '@timber-js/app/cache';
14
+ *
15
+ * const getUser = cache(
16
+ * async (id: string) => db.users.findUnique({ where: { id } }),
17
+ * { ttl: 60, tags: (id) => [`user:${id}`] }
18
+ * );
19
+ * ```
20
+ */
21
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
22
+ export function cache<Fn extends (...args: any[]) => Promise<any>>(
23
+ fn: Fn,
24
+ opts: CacheOptions<Fn>,
25
+ stableId?: string
26
+ ): Fn {
27
+ // Pass the getter, not a resolved handler: the wrapper re-resolves it on
28
+ // every call, so module-scope wrappers created before the framework's boot
29
+ // wiring calls setCacheHandler() still pick up the configured handler
30
+ // instead of permanently binding the in-memory fallback (TIM-1029).
31
+ return createCache(fn, opts, getCacheHandler, stableId);
32
+ }
33
+
34
+ /**
35
+ * Invalidate cache entries by tag or key.
36
+ *
37
+ * ```ts
38
+ * cache.invalidate({ tag: 'products' });
39
+ * cache.invalidate({ key: 'user:abc' });
40
+ * ```
41
+ */
42
+ cache.invalidate = async function invalidate(opts: { key?: string; tag?: string }): Promise<void> {
43
+ // Record before the handler delete so a cached fn in flight skips its
44
+ // post-resolve set instead of resurrecting the invalidated value (TIM-1028).
45
+ recordInvalidation(opts);
46
+ await getCacheHandler().invalidate(opts);
47
+ };
@@ -0,0 +1,68 @@
1
+ /**
2
+ * Module-level cache handler singleton.
3
+ *
4
+ * Lazily initialized to MemoryCacheHandler on first access. The framework
5
+ * replaces this at boot from timber.config.ts via setCacheHandler().
6
+ *
7
+ * This module avoids importing from ./index to prevent circular dependencies.
8
+ */
9
+
10
+ // Inline the interface to avoid circular import with index.ts
11
+ interface CacheHandlerLike {
12
+ get(key: string): Promise<{ value: unknown; stale: boolean } | null>;
13
+ set(key: string, value: unknown, opts: { ttl: number; tags: string[] }): Promise<void>;
14
+ invalidate(opts: { key?: string; tag?: string }): Promise<void>;
15
+ }
16
+
17
+ let handler: CacheHandlerLike | null = null;
18
+
19
+ /** Replace the active cache handler. Called by the framework at boot. */
20
+ export function setCacheHandler(h: CacheHandlerLike): void {
21
+ handler = h;
22
+ }
23
+
24
+ /**
25
+ * Get the active cache handler. Creates a default MemoryCacheHandler on
26
+ * first access if none has been set via setCacheHandler().
27
+ */
28
+ export function getCacheHandler(): CacheHandlerLike {
29
+ if (!handler) {
30
+ // Inline a minimal LRU cache to avoid circular dep with index.ts.
31
+ // In production, the framework always calls setCacheHandler() at boot.
32
+ handler = createDefaultHandler();
33
+ }
34
+ return handler;
35
+ }
36
+
37
+ function createDefaultHandler(): CacheHandlerLike {
38
+ const store = new Map<string, { value: unknown; expiresAt: number; tags: string[] }>();
39
+ const maxEntries = 1000;
40
+
41
+ return {
42
+ async get(key) {
43
+ const entry = store.get(key);
44
+ if (!entry) return null;
45
+ store.delete(key);
46
+ store.set(key, entry);
47
+ const stale = Date.now() > entry.expiresAt;
48
+ return { value: entry.value, stale };
49
+ },
50
+ async set(key, value, opts) {
51
+ if (store.has(key)) store.delete(key);
52
+ while (store.size >= maxEntries) {
53
+ const oldest = store.keys().next().value;
54
+ if (oldest !== undefined) store.delete(oldest);
55
+ else break;
56
+ }
57
+ store.set(key, { value, expiresAt: Date.now() + opts.ttl * 1000, tags: opts.tags });
58
+ },
59
+ async invalidate(opts) {
60
+ if (opts.key) store.delete(opts.key);
61
+ if (opts.tag) {
62
+ for (const [key, entry] of store) {
63
+ if (entry.tags.includes(opts.tag)) store.delete(key);
64
+ }
65
+ }
66
+ },
67
+ };
68
+ }