@timber-js/app 0.2.0-alpha.14 → 0.2.0-alpha.141

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 (801) hide show
  1. package/dist/_chunks/actions-DzFMnUAR.js +1147 -0
  2. package/dist/_chunks/actions-DzFMnUAR.js.map +1 -0
  3. package/dist/_chunks/build-output-helper-B20ZuTSA.js +102 -0
  4. package/dist/_chunks/build-output-helper-B20ZuTSA.js.map +1 -0
  5. package/dist/_chunks/cli-schema-sync-D2IpXicg.js +785 -0
  6. package/dist/_chunks/cli-schema-sync-D2IpXicg.js.map +1 -0
  7. package/dist/_chunks/cli-schema-sync-DH-M8Poy.js +2 -0
  8. package/dist/_chunks/codec-registry-oOUxugz3.js +21 -0
  9. package/dist/_chunks/codec-registry-oOUxugz3.js.map +1 -0
  10. package/dist/_chunks/define-C3RvHQPK.js +195 -0
  11. package/dist/_chunks/define-C3RvHQPK.js.map +1 -0
  12. package/dist/_chunks/define-DMVhsipD.js +112 -0
  13. package/dist/_chunks/define-DMVhsipD.js.map +1 -0
  14. package/dist/_chunks/fast-hash-D6hIVt1Y.js +36 -0
  15. package/dist/_chunks/fast-hash-D6hIVt1Y.js.map +1 -0
  16. package/dist/_chunks/format-CfwjgPz9.js +14 -0
  17. package/dist/_chunks/format-CfwjgPz9.js.map +1 -0
  18. package/dist/_chunks/handler-store-DjISKYEB.js +54 -0
  19. package/dist/_chunks/handler-store-DjISKYEB.js.map +1 -0
  20. package/dist/_chunks/href-validation-EZktELp8.js +124 -0
  21. package/dist/_chunks/href-validation-EZktELp8.js.map +1 -0
  22. package/dist/_chunks/logger-Dt-jQaBO.js +291 -0
  23. package/dist/_chunks/logger-Dt-jQaBO.js.map +1 -0
  24. package/dist/_chunks/{metadata-routes-Cjmvi3rQ.js → metadata-routes-BjepjefT.js} +32 -19
  25. package/dist/_chunks/metadata-routes-BjepjefT.js.map +1 -0
  26. package/dist/_chunks/navigation-root-DLc4s4ZC.js +103 -0
  27. package/dist/_chunks/navigation-root-DLc4s4ZC.js.map +1 -0
  28. package/dist/_chunks/registry-DbJPKoBp.js +20 -0
  29. package/dist/_chunks/registry-DbJPKoBp.js.map +1 -0
  30. package/dist/_chunks/resolve-schema-Dj8tQloi.js +77 -0
  31. package/dist/_chunks/resolve-schema-Dj8tQloi.js.map +1 -0
  32. package/dist/_chunks/router-ref-CtmF-aPv.js +28 -0
  33. package/dist/_chunks/router-ref-CtmF-aPv.js.map +1 -0
  34. package/dist/_chunks/schema-bridge-DK_89h8O.js +86 -0
  35. package/dist/_chunks/schema-bridge-DK_89h8O.js.map +1 -0
  36. package/dist/_chunks/segment-classify-CDDRVKs7.js +137 -0
  37. package/dist/_chunks/segment-classify-CDDRVKs7.js.map +1 -0
  38. package/dist/_chunks/segment-context-ZDnXDkbz.js +34 -0
  39. package/dist/_chunks/segment-context-ZDnXDkbz.js.map +1 -0
  40. package/dist/_chunks/{ssr-data-MjmprTmO.js → ssr-data-BOWsq18U.js} +1 -1
  41. package/dist/_chunks/ssr-data-BOWsq18U.js.map +1 -0
  42. package/dist/_chunks/tracing-M_zKubhk.js +358 -0
  43. package/dist/_chunks/tracing-M_zKubhk.js.map +1 -0
  44. package/dist/_chunks/{use-query-states-D5KaffOK.js → use-query-states-CbeQmext.js} +7 -20
  45. package/dist/_chunks/use-query-states-CbeQmext.js.map +1 -0
  46. package/dist/_chunks/use-segment-params-D1CzlgBo.js +151 -0
  47. package/dist/_chunks/use-segment-params-D1CzlgBo.js.map +1 -0
  48. package/dist/_chunks/validation-taUkvA4Q.js +113 -0
  49. package/dist/_chunks/validation-taUkvA4Q.js.map +1 -0
  50. package/dist/_chunks/walkers-7FBPM-hX.js +724 -0
  51. package/dist/_chunks/walkers-7FBPM-hX.js.map +1 -0
  52. package/dist/_chunks/{format-RyoGQL74.js → warnings-CNPXaypM.js} +6 -45
  53. package/dist/_chunks/warnings-CNPXaypM.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 +154 -48
  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 +165 -117
  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 +39 -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 +48 -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 +26 -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 +10 -24
  124. package/dist/client/index.d.ts.map +1 -1
  125. package/dist/client/index.js +183 -1134
  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 +925 -0
  130. package/dist/client/internal.js.map +1 -0
  131. package/dist/client/link-pending-store.d.ts +65 -0
  132. package/dist/client/link-pending-store.d.ts.map +1 -0
  133. package/dist/client/link.d.ts +69 -60
  134. package/dist/client/link.d.ts.map +1 -1
  135. package/dist/client/nav-link-store.d.ts +27 -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 +14 -2
  142. package/dist/client/navigation-context.d.ts.map +1 -1
  143. package/dist/client/{transition-root.d.ts → navigation-root.d.ts} +46 -9
  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 +79 -10
  148. package/dist/client/router.d.ts.map +1 -1
  149. package/dist/client/rsc-fetch.d.ts +46 -3
  150. package/dist/client/rsc-fetch.d.ts.map +1 -1
  151. package/dist/client/segment-cache.d.ts +3 -1
  152. package/dist/client/segment-cache.d.ts.map +1 -1
  153. package/dist/client/segment-outlet.d.ts +49 -0
  154. package/dist/client/segment-outlet.d.ts.map +1 -0
  155. package/dist/client/segment-update-context.d.ts +21 -0
  156. package/dist/client/segment-update-context.d.ts.map +1 -0
  157. package/dist/client/shallow-url.d.ts +10 -0
  158. package/dist/client/shallow-url.d.ts.map +1 -0
  159. package/dist/client/ssr-data.d.ts +13 -4
  160. package/dist/client/ssr-data.d.ts.map +1 -1
  161. package/dist/client/stale-reload.d.ts +15 -0
  162. package/dist/client/stale-reload.d.ts.map +1 -1
  163. package/dist/client/state.d.ts +1 -1
  164. package/dist/client/top-loader.d.ts +5 -5
  165. package/dist/client/top-loader.d.ts.map +1 -1
  166. package/dist/client/use-cookie.d.ts +12 -0
  167. package/dist/client/use-cookie.d.ts.map +1 -1
  168. package/dist/client/use-link-status.d.ts +5 -5
  169. package/dist/client/use-link-status.d.ts.map +1 -1
  170. package/dist/client/use-pathname.d.ts.map +1 -1
  171. package/dist/client/use-pending-navigation.d.ts +23 -0
  172. package/dist/client/use-pending-navigation.d.ts.map +1 -0
  173. package/dist/client/use-query-states.d.ts +1 -1
  174. package/dist/client/use-query-states.d.ts.map +1 -1
  175. package/dist/client/use-router.d.ts +1 -1
  176. package/dist/client/use-router.d.ts.map +1 -1
  177. package/dist/client/use-search-params.d.ts +7 -5
  178. package/dist/client/use-search-params.d.ts.map +1 -1
  179. package/dist/client/{use-params.d.ts → use-segment-params.d.ts} +8 -6
  180. package/dist/client/use-segment-params.d.ts.map +1 -0
  181. package/dist/codec.d.ts +69 -0
  182. package/dist/codec.d.ts.map +1 -0
  183. package/dist/codec.js +75 -0
  184. package/dist/codec.js.map +1 -0
  185. package/dist/config-types.d.ts +294 -0
  186. package/dist/config-types.d.ts.map +1 -0
  187. package/dist/config-validation.d.ts +51 -0
  188. package/dist/config-validation.d.ts.map +1 -0
  189. package/dist/content/index.d.ts +1 -10
  190. package/dist/content/index.d.ts.map +1 -1
  191. package/dist/content/index.js +0 -2
  192. package/dist/cookies/define-cookie.d.ts +58 -25
  193. package/dist/cookies/define-cookie.d.ts.map +1 -1
  194. package/dist/cookies/index.d.ts +2 -1
  195. package/dist/cookies/index.d.ts.map +1 -1
  196. package/dist/cookies/index.js +251 -36
  197. package/dist/cookies/index.js.map +1 -1
  198. package/dist/cookies/json-cookie.d.ts +64 -0
  199. package/dist/cookies/json-cookie.d.ts.map +1 -0
  200. package/dist/cookies/validation.d.ts +34 -0
  201. package/dist/cookies/validation.d.ts.map +1 -0
  202. package/dist/dev-tools/404-page.d.ts +46 -0
  203. package/dist/dev-tools/404-page.d.ts.map +1 -0
  204. package/dist/dev-tools/browser-logs.d.ts +84 -0
  205. package/dist/dev-tools/browser-logs.d.ts.map +1 -0
  206. package/dist/dev-tools/error-page.d.ts +58 -0
  207. package/dist/dev-tools/error-page.d.ts.map +1 -0
  208. package/dist/dev-tools/holding-server.d.ts +54 -0
  209. package/dist/dev-tools/holding-server.d.ts.map +1 -0
  210. package/dist/dev-tools/index.d.ts +31 -0
  211. package/dist/dev-tools/index.d.ts.map +1 -0
  212. package/dist/{server/dev-span-processor.d.ts → dev-tools/instrumentation.d.ts} +26 -6
  213. package/dist/dev-tools/instrumentation.d.ts.map +1 -0
  214. package/dist/{server/dev-logger.d.ts → dev-tools/logger.d.ts} +1 -1
  215. package/dist/dev-tools/logger.d.ts.map +1 -0
  216. package/dist/{plugins/dev-logs.d.ts → dev-tools/logs.d.ts} +2 -2
  217. package/dist/dev-tools/logs.d.ts.map +1 -0
  218. package/dist/dev-tools/overlay.d.ts +91 -0
  219. package/dist/dev-tools/overlay.d.ts.map +1 -0
  220. package/dist/dev-tools/stack-classifier.d.ts +34 -0
  221. package/dist/dev-tools/stack-classifier.d.ts.map +1 -0
  222. package/dist/dev-tools/terminal.d.ts +28 -0
  223. package/dist/dev-tools/terminal.d.ts.map +1 -0
  224. package/dist/{server/dev-warnings.d.ts → dev-tools/warnings.d.ts} +2 -22
  225. package/dist/dev-tools/warnings.d.ts.map +1 -0
  226. package/dist/fonts/ast.d.ts +98 -6
  227. package/dist/fonts/ast.d.ts.map +1 -1
  228. package/dist/fonts/bundle.d.ts +48 -0
  229. package/dist/fonts/bundle.d.ts.map +1 -0
  230. package/dist/fonts/dev-middleware.d.ts +22 -0
  231. package/dist/fonts/dev-middleware.d.ts.map +1 -0
  232. package/dist/fonts/local.d.ts +1 -1
  233. package/dist/fonts/pipeline.d.ts +172 -0
  234. package/dist/fonts/pipeline.d.ts.map +1 -0
  235. package/dist/fonts/transform.d.ts +78 -0
  236. package/dist/fonts/transform.d.ts.map +1 -0
  237. package/dist/fonts/types.d.ts +47 -1
  238. package/dist/fonts/types.d.ts.map +1 -1
  239. package/dist/fonts/virtual-modules.d.ts +94 -0
  240. package/dist/fonts/virtual-modules.d.ts.map +1 -0
  241. package/dist/index.d.ts +46 -180
  242. package/dist/index.d.ts.map +1 -1
  243. package/dist/index.js +5315 -12687
  244. package/dist/index.js.map +1 -1
  245. package/dist/params/codec-registry.d.ts +26 -0
  246. package/dist/params/codec-registry.d.ts.map +1 -0
  247. package/dist/params/define-schema.d.ts +81 -0
  248. package/dist/params/define-schema.d.ts.map +1 -0
  249. package/dist/params/index.d.ts +5 -0
  250. package/dist/params/index.d.ts.map +1 -0
  251. package/dist/params/index.js +34 -0
  252. package/dist/params/index.js.map +1 -0
  253. package/dist/params/resolve-schema.d.ts +34 -0
  254. package/dist/params/resolve-schema.d.ts.map +1 -0
  255. package/dist/plugin-context.d.ts +114 -0
  256. package/dist/plugin-context.d.ts.map +1 -0
  257. package/dist/plugins/adapter-build.d.ts +20 -1
  258. package/dist/plugins/adapter-build.d.ts.map +1 -1
  259. package/dist/plugins/build-manifest.d.ts +7 -3
  260. package/dist/plugins/build-manifest.d.ts.map +1 -1
  261. package/dist/plugins/build-report.d.ts +9 -7
  262. package/dist/plugins/build-report.d.ts.map +1 -1
  263. package/dist/plugins/cache.d.ts +31 -0
  264. package/dist/plugins/cache.d.ts.map +1 -0
  265. package/dist/plugins/client-chunks.d.ts +39 -0
  266. package/dist/plugins/client-chunks.d.ts.map +1 -0
  267. package/dist/plugins/cloudflare-wasm.d.ts +18 -0
  268. package/dist/plugins/cloudflare-wasm.d.ts.map +1 -0
  269. package/dist/plugins/content.d.ts +1 -1
  270. package/dist/plugins/content.d.ts.map +1 -1
  271. package/dist/plugins/dev-server.d.ts +1 -1
  272. package/dist/plugins/dev-server.d.ts.map +1 -1
  273. package/dist/plugins/entries.d.ts +1 -1
  274. package/dist/plugins/entries.d.ts.map +1 -1
  275. package/dist/plugins/fonts.d.ts +17 -73
  276. package/dist/plugins/fonts.d.ts.map +1 -1
  277. package/dist/plugins/mdx.d.ts +1 -1
  278. package/dist/plugins/mdx.d.ts.map +1 -1
  279. package/dist/plugins/routing.d.ts +1 -1
  280. package/dist/plugins/routing.d.ts.map +1 -1
  281. package/dist/plugins/server-bundle.d.ts.map +1 -1
  282. package/dist/plugins/shims.d.ts +6 -5
  283. package/dist/plugins/shims.d.ts.map +1 -1
  284. package/dist/plugins/static-build.d.ts +5 -26
  285. package/dist/plugins/static-build.d.ts.map +1 -1
  286. package/dist/routing/codegen-shared.d.ts +67 -0
  287. package/dist/routing/codegen-shared.d.ts.map +1 -0
  288. package/dist/routing/codegen-types.d.ts +60 -0
  289. package/dist/routing/codegen-types.d.ts.map +1 -0
  290. package/dist/routing/codegen.d.ts +7 -2
  291. package/dist/routing/codegen.d.ts.map +1 -1
  292. package/dist/routing/convention-lint.d.ts +41 -0
  293. package/dist/routing/convention-lint.d.ts.map +1 -0
  294. package/dist/routing/index.d.ts +7 -1
  295. package/dist/routing/index.d.ts.map +1 -1
  296. package/dist/routing/index.js +4 -2
  297. package/dist/routing/link-codegen.d.ts +90 -0
  298. package/dist/routing/link-codegen.d.ts.map +1 -0
  299. package/dist/routing/scanner.d.ts +1 -10
  300. package/dist/routing/scanner.d.ts.map +1 -1
  301. package/dist/routing/schema-validation.d.ts +35 -0
  302. package/dist/routing/schema-validation.d.ts.map +1 -0
  303. package/dist/routing/segment-classify.d.ts +75 -0
  304. package/dist/routing/segment-classify.d.ts.map +1 -0
  305. package/dist/routing/segment-codegen.d.ts +38 -0
  306. package/dist/routing/segment-codegen.d.ts.map +1 -0
  307. package/dist/routing/types.d.ts +77 -25
  308. package/dist/routing/types.d.ts.map +1 -1
  309. package/dist/routing/walkers.d.ts +51 -0
  310. package/dist/routing/walkers.d.ts.map +1 -0
  311. package/dist/rsc-runtime/rsc.d.ts +1 -1
  312. package/dist/rsc-runtime/rsc.d.ts.map +1 -1
  313. package/dist/rsc-runtime/ssr.d.ts +12 -0
  314. package/dist/rsc-runtime/ssr.d.ts.map +1 -1
  315. package/dist/schema-bridge.d.ts +76 -0
  316. package/dist/schema-bridge.d.ts.map +1 -0
  317. package/dist/search-params/define.d.ts +157 -0
  318. package/dist/search-params/define.d.ts.map +1 -0
  319. package/dist/search-params/index.d.ts +4 -7
  320. package/dist/search-params/index.d.ts.map +1 -1
  321. package/dist/search-params/index.js +34 -441
  322. package/dist/search-params/index.js.map +1 -1
  323. package/dist/search-params/registry.d.ts +2 -2
  324. package/dist/search-params/registry.d.ts.map +1 -1
  325. package/dist/search-params/wrappers.d.ts +53 -0
  326. package/dist/search-params/wrappers.d.ts.map +1 -0
  327. package/dist/segment-params/define.d.ts +89 -0
  328. package/dist/segment-params/define.d.ts.map +1 -0
  329. package/dist/segment-params/index.d.ts +3 -0
  330. package/dist/segment-params/index.d.ts.map +1 -0
  331. package/dist/segment-params/index.js +2 -0
  332. package/dist/server/access-gate.d.ts +8 -3
  333. package/dist/server/access-gate.d.ts.map +1 -1
  334. package/dist/server/action-client.d.ts +41 -6
  335. package/dist/server/action-client.d.ts.map +1 -1
  336. package/dist/server/action-encryption.d.ts +76 -0
  337. package/dist/server/action-encryption.d.ts.map +1 -0
  338. package/dist/server/action-handler.d.ts +35 -1
  339. package/dist/server/action-handler.d.ts.map +1 -1
  340. package/dist/server/actions.d.ts +6 -14
  341. package/dist/server/actions.d.ts.map +1 -1
  342. package/dist/server/als-registry.d.ts +70 -11
  343. package/dist/server/als-registry.d.ts.map +1 -1
  344. package/dist/server/asset-headers.d.ts +1 -15
  345. package/dist/server/asset-headers.d.ts.map +1 -1
  346. package/dist/server/body-limits.d.ts.map +1 -1
  347. package/dist/server/build-manifest.d.ts +8 -2
  348. package/dist/server/build-manifest.d.ts.map +1 -1
  349. package/dist/server/coalesce-tick.d.ts +40 -0
  350. package/dist/server/coalesce-tick.d.ts.map +1 -0
  351. package/dist/server/cookie-context.d.ts +170 -0
  352. package/dist/server/cookie-context.d.ts.map +1 -0
  353. package/dist/server/cookie-parsing.d.ts +51 -0
  354. package/dist/server/cookie-parsing.d.ts.map +1 -0
  355. package/dist/server/csrf.d.ts +3 -2
  356. package/dist/server/csrf.d.ts.map +1 -1
  357. package/dist/server/default-logger.d.ts +22 -0
  358. package/dist/server/default-logger.d.ts.map +1 -0
  359. package/dist/server/deny-boundary.d.ts +90 -0
  360. package/dist/server/deny-boundary.d.ts.map +1 -0
  361. package/dist/server/deny-renderer.d.ts +1 -1
  362. package/dist/server/deny-renderer.d.ts.map +1 -1
  363. package/dist/server/dev-source-map.d.ts +22 -0
  364. package/dist/server/dev-source-map.d.ts.map +1 -0
  365. package/dist/server/early-hints-sender.d.ts.map +1 -1
  366. package/dist/server/early-hints.d.ts +13 -11
  367. package/dist/server/early-hints.d.ts.map +1 -1
  368. package/dist/server/error-boundary-wrapper.d.ts +7 -1
  369. package/dist/server/error-boundary-wrapper.d.ts.map +1 -1
  370. package/dist/server/fallback-error.d.ts +12 -7
  371. package/dist/server/fallback-error.d.ts.map +1 -1
  372. package/dist/server/flight-injection-state.d.ts +66 -0
  373. package/dist/server/flight-injection-state.d.ts.map +1 -0
  374. package/dist/server/flight-scripts.d.ts +42 -0
  375. package/dist/server/flight-scripts.d.ts.map +1 -0
  376. package/dist/server/flush.d.ts.map +1 -1
  377. package/dist/server/form-data.d.ts +29 -0
  378. package/dist/server/form-data.d.ts.map +1 -1
  379. package/dist/server/html-injector-core.d.ts +213 -0
  380. package/dist/server/html-injector-core.d.ts.map +1 -0
  381. package/dist/server/html-injectors.d.ts +81 -41
  382. package/dist/server/html-injectors.d.ts.map +1 -1
  383. package/dist/server/index.d.ts +10 -46
  384. package/dist/server/index.d.ts.map +1 -1
  385. package/dist/server/index.js +170 -2911
  386. package/dist/server/index.js.map +1 -1
  387. package/dist/server/internal.d.ts +48 -0
  388. package/dist/server/internal.d.ts.map +1 -0
  389. package/dist/server/internal.js +3126 -0
  390. package/dist/server/internal.js.map +1 -0
  391. package/dist/server/logger.d.ts +39 -7
  392. package/dist/server/logger.d.ts.map +1 -1
  393. package/dist/server/metadata-routes.d.ts +23 -7
  394. package/dist/server/metadata-routes.d.ts.map +1 -1
  395. package/dist/server/middleware-runner.d.ts +36 -4
  396. package/dist/server/middleware-runner.d.ts.map +1 -1
  397. package/dist/server/node-stream-transforms.d.ts +112 -0
  398. package/dist/server/node-stream-transforms.d.ts.map +1 -0
  399. package/dist/server/param-coercion.d.ts +54 -0
  400. package/dist/server/param-coercion.d.ts.map +1 -0
  401. package/dist/server/pipeline-helpers.d.ts +95 -0
  402. package/dist/server/pipeline-helpers.d.ts.map +1 -0
  403. package/dist/server/pipeline-interception.d.ts +1 -1
  404. package/dist/server/pipeline-interception.d.ts.map +1 -1
  405. package/dist/server/pipeline-metadata.d.ts +6 -0
  406. package/dist/server/pipeline-metadata.d.ts.map +1 -1
  407. package/dist/server/pipeline-outcome.d.ts +49 -0
  408. package/dist/server/pipeline-outcome.d.ts.map +1 -0
  409. package/dist/server/pipeline-phases.d.ts +56 -0
  410. package/dist/server/pipeline-phases.d.ts.map +1 -0
  411. package/dist/server/pipeline.d.ts +111 -19
  412. package/dist/server/pipeline.d.ts.map +1 -1
  413. package/dist/server/port-resolution.d.ts +117 -0
  414. package/dist/server/port-resolution.d.ts.map +1 -0
  415. package/dist/server/primitives.d.ts +74 -20
  416. package/dist/server/primitives.d.ts.map +1 -1
  417. package/dist/server/render-timeout.d.ts +51 -0
  418. package/dist/server/render-timeout.d.ts.map +1 -0
  419. package/dist/server/request-context.d.ts +62 -107
  420. package/dist/server/request-context.d.ts.map +1 -1
  421. package/dist/server/route-element-builder.d.ts +28 -2
  422. package/dist/server/route-element-builder.d.ts.map +1 -1
  423. package/dist/server/route-handler.d.ts.map +1 -1
  424. package/dist/server/route-matcher.d.ts +25 -36
  425. package/dist/server/route-matcher.d.ts.map +1 -1
  426. package/dist/server/rsc-entry/action-middleware-runner.d.ts +66 -0
  427. package/dist/server/rsc-entry/action-middleware-runner.d.ts.map +1 -0
  428. package/dist/server/rsc-entry/api-handler.d.ts +12 -3
  429. package/dist/server/rsc-entry/api-handler.d.ts.map +1 -1
  430. package/dist/server/rsc-entry/error-renderer.d.ts +26 -13
  431. package/dist/server/rsc-entry/error-renderer.d.ts.map +1 -1
  432. package/dist/server/rsc-entry/helpers.d.ts +50 -6
  433. package/dist/server/rsc-entry/helpers.d.ts.map +1 -1
  434. package/dist/server/rsc-entry/index.d.ts +19 -8
  435. package/dist/server/rsc-entry/index.d.ts.map +1 -1
  436. package/dist/server/rsc-entry/render-route.d.ts +50 -0
  437. package/dist/server/rsc-entry/render-route.d.ts.map +1 -0
  438. package/dist/server/rsc-entry/revalidate-renderer.d.ts +108 -0
  439. package/dist/server/rsc-entry/revalidate-renderer.d.ts.map +1 -0
  440. package/dist/server/rsc-entry/rsc-payload.d.ts +3 -3
  441. package/dist/server/rsc-entry/rsc-payload.d.ts.map +1 -1
  442. package/dist/server/rsc-entry/rsc-stream.d.ts +17 -1
  443. package/dist/server/rsc-entry/rsc-stream.d.ts.map +1 -1
  444. package/dist/server/rsc-entry/ssr-bridge.d.ts +5 -1
  445. package/dist/server/rsc-entry/ssr-bridge.d.ts.map +1 -1
  446. package/dist/server/rsc-entry/ssr-renderer.d.ts +34 -4
  447. package/dist/server/rsc-entry/ssr-renderer.d.ts.map +1 -1
  448. package/dist/server/rsc-entry/wrap-action-dispatch.d.ts +119 -0
  449. package/dist/server/rsc-entry/wrap-action-dispatch.d.ts.map +1 -0
  450. package/dist/server/safe-load.d.ts +46 -0
  451. package/dist/server/safe-load.d.ts.map +1 -0
  452. package/dist/server/sensitive-fields.d.ts +74 -0
  453. package/dist/server/sensitive-fields.d.ts.map +1 -0
  454. package/dist/server/sitemap-generator.d.ts +129 -0
  455. package/dist/server/sitemap-generator.d.ts.map +1 -0
  456. package/dist/server/sitemap-handler.d.ts +22 -0
  457. package/dist/server/sitemap-handler.d.ts.map +1 -0
  458. package/dist/server/slot-resolver.d.ts +1 -1
  459. package/dist/server/slot-resolver.d.ts.map +1 -1
  460. package/dist/server/ssr-bridge-types.d.ts +121 -0
  461. package/dist/server/ssr-bridge-types.d.ts.map +1 -0
  462. package/dist/server/ssr-entry.d.ts +2 -43
  463. package/dist/server/ssr-entry.d.ts.map +1 -1
  464. package/dist/server/ssr-render.d.ts +64 -21
  465. package/dist/server/ssr-render.d.ts.map +1 -1
  466. package/dist/server/ssr-wrappers.d.ts +50 -0
  467. package/dist/server/ssr-wrappers.d.ts.map +1 -0
  468. package/dist/server/state-tree-diff.d.ts +12 -5
  469. package/dist/server/state-tree-diff.d.ts.map +1 -1
  470. package/dist/server/status-code-resolver.d.ts +16 -11
  471. package/dist/server/status-code-resolver.d.ts.map +1 -1
  472. package/dist/server/stream-utils.d.ts +36 -0
  473. package/dist/server/stream-utils.d.ts.map +1 -0
  474. package/dist/server/tracing.d.ts +5 -5
  475. package/dist/server/tracing.d.ts.map +1 -1
  476. package/dist/server/tree-builder.d.ts +62 -30
  477. package/dist/server/tree-builder.d.ts.map +1 -1
  478. package/dist/server/tree-match.d.ts +49 -0
  479. package/dist/server/tree-match.d.ts.map +1 -0
  480. package/dist/server/types.d.ts +71 -6
  481. package/dist/server/types.d.ts.map +1 -1
  482. package/dist/server/utils/escape-html.d.ts +14 -0
  483. package/dist/server/utils/escape-html.d.ts.map +1 -0
  484. package/dist/server/version-skew.d.ts +61 -0
  485. package/dist/server/version-skew.d.ts.map +1 -0
  486. package/dist/shared/href-validation.d.ts +38 -0
  487. package/dist/shared/href-validation.d.ts.map +1 -0
  488. package/dist/shared/merge-search-params.d.ts +22 -0
  489. package/dist/shared/merge-search-params.d.ts.map +1 -0
  490. package/dist/shims/font-google.d.ts +1 -1
  491. package/dist/shims/font-google.d.ts.map +1 -1
  492. package/dist/shims/font-google.js +42 -0
  493. package/dist/shims/font-google.js.map +1 -0
  494. package/dist/shims/font-local.d.ts +26 -0
  495. package/dist/shims/font-local.d.ts.map +1 -0
  496. package/dist/shims/font-local.js +20 -0
  497. package/dist/shims/font-local.js.map +1 -0
  498. package/dist/shims/headers.d.ts +2 -1
  499. package/dist/shims/headers.d.ts.map +1 -1
  500. package/dist/shims/image.d.ts +1 -1
  501. package/dist/shims/navigation-client.d.ts +3 -1
  502. package/dist/shims/navigation-client.d.ts.map +1 -1
  503. package/dist/shims/navigation.d.ts +11 -5
  504. package/dist/shims/navigation.d.ts.map +1 -1
  505. package/dist/utils/state-machine.d.ts +80 -0
  506. package/dist/utils/state-machine.d.ts.map +1 -0
  507. package/package.json +63 -22
  508. package/src/adapters/build-output-helper.ts +139 -0
  509. package/src/adapters/cloudflare-dev.ts +177 -0
  510. package/src/adapters/cloudflare-kv-cache.ts +142 -0
  511. package/src/adapters/cloudflare.ts +350 -76
  512. package/src/adapters/compress-module.ts +24 -4
  513. package/src/adapters/nitro.ts +147 -60
  514. package/src/adapters/shared.ts +40 -0
  515. package/src/adapters/wrangler.d.ts +7 -0
  516. package/src/cache/cache-api.ts +39 -0
  517. package/src/cache/handler-store.ts +68 -0
  518. package/src/cache/index.ts +81 -18
  519. package/src/cache/singleflight.ts +62 -4
  520. package/src/cache/sizeof.ts +33 -0
  521. package/src/cache/timber-cache.ts +52 -24
  522. package/src/cli-schema-sync.ts +295 -0
  523. package/src/cli.ts +76 -8
  524. package/src/client/browser-dev.ts +153 -1
  525. package/src/client/browser-entry/action-dispatch.ts +125 -0
  526. package/src/client/browser-entry/hmr.ts +81 -0
  527. package/src/client/browser-entry/hydrate.ts +153 -0
  528. package/src/client/browser-entry/index.ts +151 -0
  529. package/src/client/browser-entry/post-hydration.ts +113 -0
  530. package/src/client/browser-entry/router-init.ts +219 -0
  531. package/src/client/browser-entry/rsc-stream.ts +157 -0
  532. package/src/client/browser-entry/scroll.ts +27 -0
  533. package/src/client/error-boundary.tsx +99 -22
  534. package/src/client/error-reconstituter.tsx +65 -0
  535. package/src/client/form.tsx +31 -32
  536. package/src/client/history.ts +26 -4
  537. package/src/client/index.ts +67 -45
  538. package/src/client/internal.ts +58 -0
  539. package/src/client/link-pending-store.ts +116 -0
  540. package/src/client/link.tsx +343 -150
  541. package/src/client/nav-link-store.ts +37 -0
  542. package/src/client/navigation-api-types.ts +112 -0
  543. package/src/client/navigation-api.ts +338 -0
  544. package/src/client/navigation-context.ts +35 -7
  545. package/src/client/navigation-root.tsx +347 -0
  546. package/src/client/nuqs-adapter.tsx +16 -3
  547. package/src/client/router-ref.ts +1 -1
  548. package/src/client/router.ts +418 -128
  549. package/src/client/rsc-fetch.ts +208 -10
  550. package/src/client/segment-cache.ts +6 -3
  551. package/src/client/segment-outlet.tsx +77 -0
  552. package/src/client/segment-update-context.ts +42 -0
  553. package/src/client/shallow-url.ts +22 -0
  554. package/src/client/ssr-data.ts +13 -5
  555. package/src/client/stale-reload.ts +72 -3
  556. package/src/client/state.ts +2 -2
  557. package/src/client/top-loader.tsx +11 -9
  558. package/src/client/use-cookie.ts +31 -2
  559. package/src/client/use-link-status.ts +7 -7
  560. package/src/client/use-pathname.ts +1 -0
  561. package/src/client/use-pending-navigation.ts +40 -0
  562. package/src/client/use-query-states.ts +9 -3
  563. package/src/client/use-router.ts +4 -1
  564. package/src/client/use-search-params.ts +26 -44
  565. package/src/client/{use-params.ts → use-segment-params.ts} +9 -6
  566. package/src/codec.ts +147 -0
  567. package/src/config-types.ts +292 -0
  568. package/src/config-validation.ts +303 -0
  569. package/src/content/index.ts +5 -13
  570. package/src/cookies/define-cookie.ts +233 -53
  571. package/src/cookies/index.ts +12 -1
  572. package/src/cookies/json-cookie.ts +105 -0
  573. package/src/cookies/validation.ts +192 -0
  574. package/src/dev-tools/404-page.ts +387 -0
  575. package/src/dev-tools/browser-logs.ts +291 -0
  576. package/src/dev-tools/error-page.ts +507 -0
  577. package/src/dev-tools/holding-server.ts +187 -0
  578. package/src/dev-tools/index.ts +90 -0
  579. package/src/dev-tools/instrumentation.ts +176 -0
  580. package/src/{plugins/dev-logs.ts → dev-tools/logs.ts} +9 -5
  581. package/src/dev-tools/overlay.ts +469 -0
  582. package/src/dev-tools/stack-classifier.ts +75 -0
  583. package/src/dev-tools/terminal.ts +183 -0
  584. package/src/{server/dev-warnings.ts → dev-tools/warnings.ts} +5 -50
  585. package/src/fonts/ast.ts +525 -16
  586. package/src/fonts/bundle.ts +131 -0
  587. package/src/fonts/dev-middleware.ts +74 -0
  588. package/src/fonts/local.ts +3 -3
  589. package/src/fonts/pipeline.ts +337 -0
  590. package/src/fonts/transform.ts +317 -0
  591. package/src/fonts/types.ts +52 -1
  592. package/src/fonts/virtual-modules.ts +235 -0
  593. package/src/index.ts +415 -345
  594. package/src/params/codec-registry.ts +34 -0
  595. package/src/params/define-schema.ts +115 -0
  596. package/src/params/index.ts +17 -0
  597. package/src/params/resolve-schema.ts +116 -0
  598. package/src/plugin-context.ts +247 -0
  599. package/src/plugins/adapter-build.ts +98 -4
  600. package/src/plugins/build-manifest.ts +168 -23
  601. package/src/plugins/build-report.ts +16 -25
  602. package/src/plugins/cache.ts +180 -0
  603. package/src/plugins/client-chunks.ts +113 -0
  604. package/src/plugins/cloudflare-wasm.ts +103 -0
  605. package/src/plugins/content.ts +1 -1
  606. package/src/plugins/dev-server.ts +179 -37
  607. package/src/plugins/entries.ts +110 -8
  608. package/src/plugins/fonts.ts +167 -655
  609. package/src/plugins/mdx.ts +47 -10
  610. package/src/plugins/routing.ts +386 -47
  611. package/src/plugins/server-bundle.ts +59 -3
  612. package/src/plugins/shims.ts +136 -35
  613. package/src/plugins/static-build.ts +15 -89
  614. package/src/routing/codegen-shared.ts +115 -0
  615. package/src/routing/codegen-types.ts +61 -0
  616. package/src/routing/codegen.ts +321 -177
  617. package/src/routing/convention-lint.ts +357 -0
  618. package/src/routing/index.ts +10 -1
  619. package/src/routing/interception.ts +1 -1
  620. package/src/routing/link-codegen.ts +310 -0
  621. package/src/routing/scanner.ts +165 -110
  622. package/src/routing/schema-validation.ts +149 -0
  623. package/src/routing/segment-classify.ts +188 -0
  624. package/src/routing/segment-codegen.ts +98 -0
  625. package/src/routing/types.ts +78 -25
  626. package/src/routing/walkers.ts +90 -0
  627. package/src/rsc-runtime/rsc.ts +2 -0
  628. package/src/rsc-runtime/ssr.ts +50 -0
  629. package/src/rsc-runtime/vendor-types.d.ts +7 -0
  630. package/src/{search-params/codecs.ts → schema-bridge.ts} +60 -22
  631. package/src/search-params/define.ts +538 -0
  632. package/src/search-params/index.ts +14 -20
  633. package/src/search-params/registry.ts +2 -2
  634. package/src/search-params/wrappers.ts +92 -0
  635. package/src/segment-params/define.ts +309 -0
  636. package/src/segment-params/index.ts +9 -0
  637. package/src/server/access-gate.tsx +76 -34
  638. package/src/server/action-client.ts +119 -28
  639. package/src/server/action-encryption.ts +144 -0
  640. package/src/server/action-handler.ts +112 -14
  641. package/src/server/actions.ts +34 -26
  642. package/src/server/als-registry.ts +108 -20
  643. package/src/server/asset-headers.ts +8 -34
  644. package/src/server/body-limits.ts +10 -2
  645. package/src/server/build-manifest.ts +17 -4
  646. package/src/server/coalesce-tick.ts +75 -0
  647. package/src/server/compress.ts +25 -7
  648. package/src/server/cookie-context.ts +473 -0
  649. package/src/server/cookie-parsing.ts +135 -0
  650. package/src/server/csrf.ts +39 -6
  651. package/src/server/default-logger.ts +99 -0
  652. package/src/server/deny-boundary.ts +218 -0
  653. package/src/server/deny-renderer.ts +32 -52
  654. package/src/server/dev-source-map.ts +31 -0
  655. package/src/server/early-hints-sender.ts +3 -2
  656. package/src/server/early-hints.ts +35 -27
  657. package/src/server/error-boundary-wrapper.ts +74 -22
  658. package/src/server/fallback-error.ts +74 -102
  659. package/src/server/flight-injection-state.ts +113 -0
  660. package/src/server/flight-scripts.ts +62 -0
  661. package/src/server/flush.ts +2 -1
  662. package/src/server/form-data.ts +101 -5
  663. package/src/server/html-injector-core.ts +418 -0
  664. package/src/server/html-injectors.ts +238 -223
  665. package/src/server/index.ts +29 -183
  666. package/src/server/internal.ts +182 -0
  667. package/src/server/logger.ts +67 -36
  668. package/src/server/metadata-routes.ts +44 -19
  669. package/src/server/middleware-runner.ts +75 -4
  670. package/src/server/node-stream-transforms.ts +361 -0
  671. package/src/server/param-coercion.ts +206 -0
  672. package/src/server/pipeline-helpers.ts +204 -0
  673. package/src/server/pipeline-interception.ts +32 -18
  674. package/src/server/pipeline-metadata.ts +13 -0
  675. package/src/server/pipeline-outcome.ts +197 -0
  676. package/src/server/pipeline-phases.ts +527 -0
  677. package/src/server/pipeline.ts +201 -382
  678. package/src/server/port-resolution.ts +215 -0
  679. package/src/server/primitives.ts +130 -46
  680. package/src/server/render-timeout.ts +108 -0
  681. package/src/server/request-context.ts +168 -337
  682. package/src/server/route-element-builder.ts +437 -208
  683. package/src/server/route-handler.ts +31 -4
  684. package/src/server/route-matcher.ts +128 -277
  685. package/src/server/rsc-entry/action-middleware-runner.ts +167 -0
  686. package/src/server/rsc-entry/api-handler.ts +69 -32
  687. package/src/server/rsc-entry/error-renderer.ts +316 -89
  688. package/src/server/rsc-entry/helpers.ts +155 -26
  689. package/src/server/rsc-entry/index.ts +283 -329
  690. package/src/server/rsc-entry/render-route.ts +313 -0
  691. package/src/server/rsc-entry/revalidate-renderer.ts +344 -0
  692. package/src/server/rsc-entry/rsc-payload.ts +65 -22
  693. package/src/server/rsc-entry/rsc-stream.ts +85 -13
  694. package/src/server/rsc-entry/ssr-bridge.ts +18 -5
  695. package/src/server/rsc-entry/ssr-renderer.ts +271 -41
  696. package/src/server/rsc-entry/wrap-action-dispatch.ts +449 -0
  697. package/src/server/safe-load.ts +60 -0
  698. package/src/server/sensitive-fields.ts +230 -0
  699. package/src/server/sitemap-generator.ts +338 -0
  700. package/src/server/sitemap-handler.ts +148 -0
  701. package/src/server/slot-resolver.ts +234 -246
  702. package/src/server/ssr-bridge-types.ts +124 -0
  703. package/src/server/ssr-entry.ts +217 -78
  704. package/src/server/ssr-render.ts +344 -71
  705. package/src/server/ssr-wrappers.tsx +141 -0
  706. package/src/server/state-tree-diff.ts +30 -23
  707. package/src/server/status-code-resolver.ts +112 -128
  708. package/src/server/stream-utils.ts +213 -0
  709. package/src/server/tracing.ts +21 -10
  710. package/src/server/tree-builder.ts +204 -90
  711. package/src/server/tree-match.ts +210 -0
  712. package/src/server/types.ts +78 -9
  713. package/src/server/utils/escape-html.ts +20 -0
  714. package/src/server/version-skew.ts +104 -0
  715. package/src/shared/href-validation.ts +127 -0
  716. package/src/shared/merge-search-params.ts +55 -0
  717. package/src/shims/font-google.ts +1 -1
  718. package/src/shims/font-local.ts +34 -0
  719. package/src/shims/headers.ts +5 -1
  720. package/src/shims/navigation-client.ts +4 -3
  721. package/src/shims/navigation.ts +14 -7
  722. package/src/utils/state-machine.ts +111 -0
  723. package/LICENSE +0 -8
  724. package/dist/_chunks/als-registry-B7DbZ2hS.js +0 -41
  725. package/dist/_chunks/als-registry-B7DbZ2hS.js.map +0 -1
  726. package/dist/_chunks/debug-B3Gypr3D.js +0 -108
  727. package/dist/_chunks/debug-B3Gypr3D.js.map +0 -1
  728. package/dist/_chunks/format-RyoGQL74.js.map +0 -1
  729. package/dist/_chunks/interception-BOoWmLUA.js +0 -676
  730. package/dist/_chunks/interception-BOoWmLUA.js.map +0 -1
  731. package/dist/_chunks/metadata-routes-Cjmvi3rQ.js.map +0 -1
  732. package/dist/_chunks/request-context-BQUC8PHn.js +0 -330
  733. package/dist/_chunks/request-context-BQUC8PHn.js.map +0 -1
  734. package/dist/_chunks/ssr-data-MjmprTmO.js.map +0 -1
  735. package/dist/_chunks/tracing-CemImE6h.js +0 -187
  736. package/dist/_chunks/tracing-CemImE6h.js.map +0 -1
  737. package/dist/_chunks/use-cookie-DX-l1_5E.js +0 -91
  738. package/dist/_chunks/use-cookie-DX-l1_5E.js.map +0 -1
  739. package/dist/_chunks/use-query-states-D5KaffOK.js.map +0 -1
  740. package/dist/cache/register-cached-function.d.ts +0 -17
  741. package/dist/cache/register-cached-function.d.ts.map +0 -1
  742. package/dist/client/browser-entry.d.ts +0 -21
  743. package/dist/client/browser-entry.d.ts.map +0 -1
  744. package/dist/client/link-status-provider.d.ts +0 -11
  745. package/dist/client/link-status-provider.d.ts.map +0 -1
  746. package/dist/client/segment-merger.d.ts +0 -119
  747. package/dist/client/segment-merger.d.ts.map +0 -1
  748. package/dist/client/transition-root.d.ts.map +0 -1
  749. package/dist/client/use-navigation-pending.d.ts +0 -26
  750. package/dist/client/use-navigation-pending.d.ts.map +0 -1
  751. package/dist/client/use-params.d.ts.map +0 -1
  752. package/dist/plugins/cache-transform.d.ts +0 -36
  753. package/dist/plugins/cache-transform.d.ts.map +0 -1
  754. package/dist/plugins/dev-error-overlay.d.ts +0 -60
  755. package/dist/plugins/dev-error-overlay.d.ts.map +0 -1
  756. package/dist/plugins/dev-logs.d.ts.map +0 -1
  757. package/dist/plugins/dynamic-transform.d.ts +0 -72
  758. package/dist/plugins/dynamic-transform.d.ts.map +0 -1
  759. package/dist/plugins/server-action-exports.d.ts +0 -26
  760. package/dist/plugins/server-action-exports.d.ts.map +0 -1
  761. package/dist/routing/status-file-lint.d.ts +0 -33
  762. package/dist/routing/status-file-lint.d.ts.map +0 -1
  763. package/dist/search-params/analyze.d.ts +0 -54
  764. package/dist/search-params/analyze.d.ts.map +0 -1
  765. package/dist/search-params/builtin-codecs.d.ts +0 -105
  766. package/dist/search-params/builtin-codecs.d.ts.map +0 -1
  767. package/dist/search-params/codecs.d.ts +0 -53
  768. package/dist/search-params/codecs.d.ts.map +0 -1
  769. package/dist/search-params/create.d.ts +0 -106
  770. package/dist/search-params/create.d.ts.map +0 -1
  771. package/dist/server/dev-fetch-instrumentation.d.ts +0 -22
  772. package/dist/server/dev-fetch-instrumentation.d.ts.map +0 -1
  773. package/dist/server/dev-logger.d.ts.map +0 -1
  774. package/dist/server/dev-span-processor.d.ts.map +0 -1
  775. package/dist/server/dev-warnings.d.ts.map +0 -1
  776. package/dist/server/manifest-status-resolver.d.ts +0 -58
  777. package/dist/server/manifest-status-resolver.d.ts.map +0 -1
  778. package/dist/server/prerender.d.ts +0 -77
  779. package/dist/server/prerender.d.ts.map +0 -1
  780. package/dist/utils/directive-parser.d.ts +0 -70
  781. package/dist/utils/directive-parser.d.ts.map +0 -1
  782. package/src/cache/register-cached-function.ts +0 -103
  783. package/src/client/browser-entry.ts +0 -678
  784. package/src/client/link-status-provider.tsx +0 -30
  785. package/src/client/segment-merger.ts +0 -339
  786. package/src/client/transition-root.tsx +0 -166
  787. package/src/client/use-navigation-pending.ts +0 -38
  788. package/src/plugins/cache-transform.ts +0 -199
  789. package/src/plugins/dev-error-overlay.ts +0 -230
  790. package/src/plugins/dynamic-transform.ts +0 -161
  791. package/src/plugins/server-action-exports.ts +0 -220
  792. package/src/routing/status-file-lint.ts +0 -112
  793. package/src/search-params/analyze.ts +0 -192
  794. package/src/search-params/builtin-codecs.ts +0 -228
  795. package/src/search-params/create.ts +0 -321
  796. package/src/server/dev-fetch-instrumentation.ts +0 -96
  797. package/src/server/dev-span-processor.ts +0 -78
  798. package/src/server/manifest-status-resolver.ts +0 -215
  799. package/src/server/prerender.ts +0 -139
  800. package/src/utils/directive-parser.ts +0 -529
  801. /package/src/{server/dev-logger.ts → dev-tools/logger.ts} +0 -0
@@ -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,40 +187,21 @@ 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
203
  await writeFile(join(outDir, '_compress.mjs'), generateCompressModule());
215
204
 
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(() => {});
220
-
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.
223
207
  // This must be top-level code, not an import, because rollup tree-shakes
@@ -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,6 +257,7 @@ export function generateNitroEntry(
273
257
  buildDir: string,
274
258
  outDir: string,
275
259
  preset: NitroPreset,
260
+ compress = true,
276
261
  hasManifestInit = false
277
262
  ): string {
278
263
  // The RSC entry is the main request handler — it exports the fetch handler as default.
@@ -338,12 +323,14 @@ export function generateNitroEntry(
338
323
  // Import runWithWaitUntil only when the preset supports it.
339
324
  const waitUntilImport = supportsWaitUntil ? ', runWithWaitUntil' : '';
340
325
 
326
+ const compressImport = compress ? "import { compressResponse } from './_compress.mjs'\n" : '';
327
+ const compressCall = compress ? 'compressResponse(webRequest, webResponse)' : 'webResponse';
328
+
341
329
  return `// Generated by @timber-js/app/adapters/nitro
342
330
  // Do not edit — this file is regenerated on each build.
343
331
 
344
332
  ${manifestImport}import handler, { runWithEarlyHintsSender${waitUntilImport} } from '${serverEntryRelative}'
345
- import { compressResponse } from './_compress.mjs'
346
-
333
+ ${compressImport}
347
334
  // Set TIMBER_RUNTIME for instrumentation.ts conditional SDK initialization.
348
335
  // See design/25-production-deployments.md §"TIMBER_RUNTIME".
349
336
  process.env.TIMBER_RUNTIME = '${runtimeName}'
@@ -357,7 +344,7 @@ export default async function timberHandler(event) {
357
344
  // h3 v2: event.req is the Web Request
358
345
  const webRequest = event.req
359
346
  ${handlerCall}
360
- return compressResponse(webRequest, webResponse)
347
+ return ${compressCall}
361
348
  }
362
349
  `;
363
350
  }
@@ -377,6 +364,7 @@ export function generateNitroConfig(
377
364
  // See design/25-production-deployments.md §"CDN / Edge Cache"
378
365
  routeRules: {
379
366
  '/assets/**': { headers: { 'Cache-Control': IMMUTABLE_CACHE } },
367
+ '/_timber/fonts/**': { headers: { 'Cache-Control': IMMUTABLE_CACHE } },
380
368
  },
381
369
  ...presetConfig.extraConfig,
382
370
  ...userConfig,
@@ -465,11 +453,25 @@ const MIME_TYPES = {
465
453
  };
466
454
 
467
455
  const publicDir = join(__dirname, '${publicDir}');
468
- const port = parseInt(process.env.PORT || '3000', 10);
456
+
457
+ // Port resolution (TIM-842):
458
+ // - Default to 3000
459
+ // - If PORT env var is set, honor it strictly (fail loudly on conflict)
460
+ // - Otherwise auto-bump from 3000 until a free port is found
461
+ // Mirrors the dev server behavior so timber dev/preview/production all
462
+ // behave the same way around port selection.
463
+ const envPort = process.env.PORT ? parseInt(process.env.PORT, 10) : null;
464
+ const portIsExplicit = envPort != null && Number.isFinite(envPort) && envPort > 0;
465
+ const startPort = portIsExplicit ? envPort : 3000;
469
466
  const host = process.env.HOST || process.env.HOSTNAME || 'localhost';
470
467
 
468
+ // Set after listenWithBump() resolves so request handlers can build
469
+ // absolute URLs from the actual bound port (which may differ from
470
+ // startPort after an auto-bump).
471
+ let boundPort = startPort;
472
+
471
473
  const server = createServer(async (req, res) => {
472
- const url = new URL(req.url || '/', \`http://\${host}:\${port}\`);
474
+ const url = new URL(req.url || '/', \`http://\${host}:\${boundPort}\`);
473
475
 
474
476
  // Try serving static files from the public directory first.
475
477
  const filePath = join(publicDir, url.pathname);
@@ -482,7 +484,9 @@ const server = createServer(async (req, res) => {
482
484
  const contentType = MIME_TYPES[ext] || 'application/octet-stream';
483
485
  const body = await readFile(filePath);
484
486
  // Hashed assets get immutable cache, others get short cache.
485
- const cacheControl = url.pathname.startsWith('/assets/')
487
+ const isImmutable =
488
+ url.pathname.startsWith('/assets/') || url.pathname.startsWith('/_timber/fonts/');
489
+ const cacheControl = isImmutable
486
490
  ? 'public, max-age=31536000, immutable'
487
491
  : 'public, max-age=3600, must-revalidate';
488
492
  res.writeHead(200, {
@@ -540,18 +544,64 @@ const server = createServer(async (req, res) => {
540
544
  const webResponse = compressResponse(webRequest, rawResponse);
541
545
 
542
546
  // Write the response back to the Node response.
543
- res.writeHead(webResponse.status, Object.fromEntries(webResponse.headers.entries()));
547
+ //
548
+ // Set-Cookie needs special handling: Headers.entries() joins multiple
549
+ // Set-Cookie values with ", " into a single entry, but each cookie must
550
+ // be its own header per RFC 6265 §4.1. Object.fromEntries() would then
551
+ // collapse them into one malformed Set-Cookie header that browsers reject
552
+ // (or only honor partially). Use getSetCookie() to preserve individual
553
+ // values, and pass them as an array — Node's writeHead accepts
554
+ // Record<string, string | string[]> and emits one header per array entry.
555
+ //
556
+ // Without this, EVERY cookie set by the framework on Node—/Nitro deployments
557
+ // is silently dropped: defineCookie().setCookie() in actions, middleware
558
+ // cookie writes, the framework's own session cookies, all of it. See
559
+ // LOCAL-741.
560
+ const responseHeaders: Record<string, string | string[]> = {};
561
+ webResponse.headers.forEach((value, key) => {
562
+ if (key.toLowerCase() !== 'set-cookie') {
563
+ responseHeaders[key] = value;
564
+ }
565
+ });
566
+ const setCookies = webResponse.headers.getSetCookie();
567
+ if (setCookies.length > 0) {
568
+ responseHeaders['set-cookie'] = setCookies;
569
+ }
570
+ res.writeHead(webResponse.status, responseHeaders);
544
571
 
545
572
  if (webResponse.body) {
546
573
  const reader = webResponse.body.getReader();
547
- const pump = async () => {
574
+
575
+ // Cancel the reader when the client disconnects. This causes any
576
+ // pending reader.read() to reject, breaking the pump loop. Critical
577
+ // for SSE and other infinite streams — without this, disconnected
578
+ // clients leak readers.
579
+ let clientDisconnected = false;
580
+ const onClose = () => {
581
+ clientDisconnected = true;
582
+ reader.cancel('Client disconnected').catch(() => {});
583
+ };
584
+ res.on('close', onClose);
585
+
586
+ try {
548
587
  while (true) {
549
588
  const { done, value } = await reader.read();
550
- if (done) { res.end(); return; }
589
+ if (done) break;
551
590
  res.write(value);
552
591
  }
553
- };
554
- await pump();
592
+ } catch (err) {
593
+ // reader.cancel() from the close handler causes read() to reject.
594
+ // This is expected on client disconnect — not an error.
595
+ if (!clientDisconnected) {
596
+ throw err;
597
+ }
598
+ } finally {
599
+ res.off('close', onClose);
600
+ reader.releaseLock();
601
+ if (!res.writableEnded) {
602
+ res.end();
603
+ }
604
+ }
555
605
  } else {
556
606
  res.end();
557
607
  }
@@ -564,13 +614,49 @@ const server = createServer(async (req, res) => {
564
614
  }
565
615
  });
566
616
 
567
- server.listen(port, host, () => {
617
+ function listenWithBump(port, attempt = 0) {
618
+ return new Promise((resolveListen, rejectListen) => {
619
+ const onError = (err) => {
620
+ server.removeListener('listening', onListening);
621
+ if (err && err.code === 'EADDRINUSE' && !portIsExplicit && attempt < 100) {
622
+ if (attempt === 0) {
623
+ console.log(\` [timber] Port \${port} in use, trying \${port + 1}...\`);
624
+ }
625
+ listenWithBump(port + 1, attempt + 1).then(resolveListen, rejectListen);
626
+ return;
627
+ }
628
+ rejectListen(err);
629
+ };
630
+ const onListening = () => {
631
+ server.removeListener('error', onError);
632
+ resolveListen(port);
633
+ };
634
+ server.once('error', onError);
635
+ server.once('listening', onListening);
636
+ server.listen(port, host);
637
+ });
638
+ }
639
+
640
+ try {
641
+ boundPort = await listenWithBump(startPort);
642
+ if (boundPort !== startPort) {
643
+ console.log();
644
+ console.log(\` [timber] Port \${startPort} in use, using \${boundPort}\`);
645
+ }
568
646
  console.log();
569
647
  console.log(' ⚡ timber preview server running at:');
570
648
  console.log();
571
- console.log(\` ➜ http://\${host}:\${port}\`);
649
+ console.log(\` ➜ http://\${host}:\${boundPort}\`);
572
650
  console.log();
573
- });
651
+ } catch (err) {
652
+ if (err && err.code === 'EADDRINUSE') {
653
+ console.error(\`[timber] Port \${startPort} is already in use. \` +
654
+ 'Set PORT to a free port, or unset PORT to auto-pick.');
655
+ } else {
656
+ console.error('[timber] Failed to start preview server:', err);
657
+ }
658
+ process.exit(1);
659
+ }
574
660
  `;
575
661
  }
576
662
 
@@ -628,6 +714,7 @@ async function runNitroBuild(
628
714
  output: { dir: join(nitroDir, presetConfig.outputDir) },
629
715
  routeRules: {
630
716
  '/assets/**': { headers: { 'Cache-Control': IMMUTABLE_CACHE } },
717
+ '/_timber/fonts/**': { headers: { 'Cache-Control': IMMUTABLE_CACHE } },
631
718
  },
632
719
  // Don't bundle the timber RSC/SSR build output — it has its own
633
720
  // internal file references that nitro's bundler can't follow.
@@ -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,39 @@
1
+ import type { CacheOptions } from './index';
2
+ import { createCache } from './timber-cache';
3
+ import { getCacheHandler } from './handler-store';
4
+
5
+ /**
6
+ * Public caching API: `cache(fn, opts)`.
7
+ *
8
+ * Wraps an async function with cross-request caching. Uses the configured
9
+ * cache handler (defaults to MemoryCacheHandler, overridable via timber.config.ts).
10
+ *
11
+ * ```ts
12
+ * import { cache } from '@timber-js/app/cache';
13
+ *
14
+ * const getUser = cache(
15
+ * async (id: string) => db.users.findUnique({ where: { id } }),
16
+ * { ttl: 60, tags: (id) => [`user:${id}`] }
17
+ * );
18
+ * ```
19
+ */
20
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
21
+ export function cache<Fn extends (...args: any[]) => Promise<any>>(
22
+ fn: Fn,
23
+ opts: CacheOptions<Fn>,
24
+ stableId?: string
25
+ ): Fn {
26
+ return createCache(fn, opts, getCacheHandler(), stableId);
27
+ }
28
+
29
+ /**
30
+ * Invalidate cache entries by tag or key.
31
+ *
32
+ * ```ts
33
+ * cache.invalidate({ tag: 'products' });
34
+ * cache.invalidate({ key: 'user:abc' });
35
+ * ```
36
+ */
37
+ cache.invalidate = async function invalidate(opts: { key?: string; tag?: string }): Promise<void> {
38
+ await getCacheHandler().invalidate(opts);
39
+ };
@@ -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
+ }
@@ -1,5 +1,7 @@
1
1
  // @timber-js/app/cache — Caching primitives
2
2
 
3
+ import { estimateByteSize } from './sizeof.js';
4
+
3
5
  export interface CacheHandler {
4
6
  get(key: string): Promise<{ value: unknown; stale: boolean } | null>;
5
7
  set(key: string, value: unknown, opts: { ttl: number; tags: string[] }): Promise<void>;
@@ -12,19 +14,40 @@ export interface CacheOptions<Fn extends (...args: any[]) => any> {
12
14
  key?: (...args: Parameters<Fn>) => string;
13
15
  staleWhileRevalidate?: boolean;
14
16
  tags?: string[] | ((...args: Parameters<Fn>) => string[]);
17
+ /** Timeout (ms) for singleflight-coalesced calls. Prevents hung fn() from
18
+ * permanently blocking all future callers for the same cache key. See TIM-518. */
19
+ timeoutMs?: number;
15
20
  }
16
21
 
17
22
  export interface MemoryCacheHandlerOptions {
18
23
  /** Maximum number of entries. Oldest accessed entries are evicted first. Default: 1000. */
24
+ maxEntries?: number;
25
+ /**
26
+ * @deprecated Use `maxEntries` instead. Will be removed in a future release.
27
+ * Alias for `maxEntries` — maximum number of entries (not bytes).
28
+ */
19
29
  maxSize?: number;
30
+ /** Maximum total byte budget for all cached values. Oldest entries are evicted when exceeded. Default: no limit. */
31
+ maxBytes?: number;
32
+ /** Maximum byte size for a single cache entry. Entries exceeding this are silently dropped. Default: no limit. */
33
+ maxEntryBytes?: number;
20
34
  }
21
35
 
22
36
  export class MemoryCacheHandler implements CacheHandler {
23
- private store = new Map<string, { value: unknown; expiresAt: number; tags: string[] }>();
24
- private maxSize: number;
37
+ private store = new Map<
38
+ string,
39
+ { value: unknown; expiresAt: number; tags: string[]; byteSize: number }
40
+ >();
41
+ private maxEntries: number;
42
+ private maxBytes: number | undefined;
43
+ private maxEntryBytes: number | undefined;
44
+ private currentBytes = 0;
25
45
 
26
46
  constructor(opts?: MemoryCacheHandlerOptions) {
27
- this.maxSize = opts?.maxSize ?? 1000;
47
+ // maxEntries takes precedence over deprecated maxSize
48
+ this.maxEntries = opts?.maxEntries ?? opts?.maxSize ?? 1000;
49
+ this.maxBytes = opts?.maxBytes;
50
+ this.maxEntryBytes = opts?.maxEntryBytes;
28
51
  }
29
52
 
30
53
  async get(key: string) {
@@ -40,18 +63,33 @@ export class MemoryCacheHandler implements CacheHandler {
40
63
  }
41
64
 
42
65
  async set(key: string, value: unknown, opts: { ttl: number; tags: string[] }) {
43
- // If key already exists, delete first to refresh insertion order
66
+ const byteSize = estimateByteSize(value);
67
+
68
+ // Reject entries exceeding per-entry byte limit
69
+ if (this.maxEntryBytes !== undefined && byteSize > this.maxEntryBytes) {
70
+ return;
71
+ }
72
+
73
+ // If key already exists, delete first to refresh insertion order and reclaim bytes
44
74
  if (this.store.has(key)) {
75
+ const existing = this.store.get(key)!;
76
+ this.currentBytes -= existing.byteSize;
45
77
  this.store.delete(key);
46
78
  }
47
79
 
48
- // Evict oldest entries (front of Map) if at capacity
49
- while (this.store.size >= this.maxSize) {
50
- const oldest = this.store.keys().next().value;
51
- if (oldest !== undefined) {
52
- this.store.delete(oldest);
53
- } else {
54
- break;
80
+ // Evict oldest entries (front of Map) if at entry count capacity
81
+ while (this.store.size >= this.maxEntries) {
82
+ this.evictOldest();
83
+ }
84
+
85
+ // Evict oldest entries if byte budget would be exceeded
86
+ if (this.maxBytes !== undefined) {
87
+ while (this.currentBytes + byteSize > this.maxBytes && this.store.size > 0) {
88
+ this.evictOldest();
89
+ }
90
+ // If the single entry exceeds the total byte budget, don't store it
91
+ if (this.currentBytes + byteSize > this.maxBytes) {
92
+ return;
55
93
  }
56
94
  }
57
95
 
@@ -59,16 +97,23 @@ export class MemoryCacheHandler implements CacheHandler {
59
97
  value,
60
98
  expiresAt: Date.now() + opts.ttl * 1000,
61
99
  tags: opts.tags,
100
+ byteSize,
62
101
  });
102
+ this.currentBytes += byteSize;
63
103
  }
64
104
 
65
105
  async invalidate(opts: { key?: string; tag?: string }) {
66
106
  if (opts.key) {
67
- this.store.delete(opts.key);
107
+ const entry = this.store.get(opts.key);
108
+ if (entry) {
109
+ this.currentBytes -= entry.byteSize;
110
+ this.store.delete(opts.key);
111
+ }
68
112
  }
69
113
  if (opts.tag) {
70
114
  for (const [key, entry] of this.store) {
71
115
  if (entry.tags.includes(opts.tag)) {
116
+ this.currentBytes -= entry.byteSize;
72
117
  this.store.delete(key);
73
118
  }
74
119
  }
@@ -79,13 +124,31 @@ export class MemoryCacheHandler implements CacheHandler {
79
124
  get size(): number {
80
125
  return this.store.size;
81
126
  }
127
+
128
+ /** Estimated total byte size of all cached values. */
129
+ get bytes(): number {
130
+ return this.currentBytes;
131
+ }
132
+
133
+ /** Evict the oldest entry (front of Map). */
134
+ private evictOldest(): void {
135
+ const oldest = this.store.keys().next().value;
136
+ if (oldest !== undefined) {
137
+ const entry = this.store.get(oldest)!;
138
+ this.currentBytes -= entry.byteSize;
139
+ this.store.delete(oldest);
140
+ }
141
+ }
82
142
  }
83
143
 
84
144
  export { RedisCacheHandler } from './redis-handler';
85
145
  export type { RedisClient } from './redis-handler';
86
- export { createCache } from './timber-cache';
87
- export { registerCachedFunction } from './register-cached-function';
88
- export type { RegisterCachedFunctionOptions } from './register-cached-function';
89
- export { stableStringify } from './stable-stringify';
90
- export { createSingleflight } from './singleflight';
91
- export type { Singleflight } from './singleflight';
146
+ export { cache } from './cache-api';
147
+ export { setCacheHandler, getCacheHandler } from './handler-store';
148
+ // NOTE: registerCachedFunction (runtime for 'use cache' directive) removed.
149
+ // Future feature pending design doc. See design/06-caching.md.
150
+ export { estimateByteSize } from './sizeof';
151
+ // stableStringify, createSingleflight, and SingleflightTimeoutError are
152
+ // internal utilities used by the cache implementation. They are not
153
+ // re-exported here — import directly from the source files if needed
154
+ // within the package. See TIM-720.