@timber-js/app 0.2.0-alpha.16 → 0.2.0-alpha.160

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 (985) hide show
  1. package/LICENSE +8 -0
  2. package/agent-skill.md +344 -0
  3. package/dist/_chunks/actions-C9yAuoX3.js +314 -0
  4. package/dist/_chunks/actions-C9yAuoX3.js.map +1 -0
  5. package/dist/_chunks/build-output-helper-DF5uScqS.js +158 -0
  6. package/dist/_chunks/build-output-helper-DF5uScqS.js.map +1 -0
  7. package/dist/_chunks/cache-api-swbefQ6F.js +1125 -0
  8. package/dist/_chunks/cache-api-swbefQ6F.js.map +1 -0
  9. package/dist/_chunks/{metadata-routes-Cjmvi3rQ.js → canonicalize-P41GR6tY.js} +94 -18
  10. package/dist/_chunks/canonicalize-P41GR6tY.js.map +1 -0
  11. package/dist/_chunks/cli-schema-sync-BhYDz_-x.js +638 -0
  12. package/dist/_chunks/cli-schema-sync-BhYDz_-x.js.map +1 -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/dist-BA3u1z3W.js +423 -0
  20. package/dist/_chunks/dist-BA3u1z3W.js.map +1 -0
  21. package/dist/_chunks/fast-hash-D6hIVt1Y.js +36 -0
  22. package/dist/_chunks/fast-hash-D6hIVt1Y.js.map +1 -0
  23. package/dist/_chunks/format-CfwjgPz9.js +14 -0
  24. package/dist/_chunks/format-CfwjgPz9.js.map +1 -0
  25. package/dist/_chunks/href-validation-CMc5JRls.js +141 -0
  26. package/dist/_chunks/href-validation-CMc5JRls.js.map +1 -0
  27. package/dist/_chunks/logger-CPoQkGK6.js +1523 -0
  28. package/dist/_chunks/logger-CPoQkGK6.js.map +1 -0
  29. package/dist/_chunks/navigation-root-bUDZLw74.js +124 -0
  30. package/dist/_chunks/navigation-root-bUDZLw74.js.map +1 -0
  31. package/dist/_chunks/plugin-context-DeAxFRMq.js +280 -0
  32. package/dist/_chunks/plugin-context-DeAxFRMq.js.map +1 -0
  33. package/dist/_chunks/registry-DbJPKoBp.js +20 -0
  34. package/dist/_chunks/registry-DbJPKoBp.js.map +1 -0
  35. package/dist/_chunks/resolve-schema-3iUvBV5T.js +50 -0
  36. package/dist/_chunks/resolve-schema-3iUvBV5T.js.map +1 -0
  37. package/dist/_chunks/router-ref-CtmF-aPv.js +28 -0
  38. package/dist/_chunks/router-ref-CtmF-aPv.js.map +1 -0
  39. package/dist/_chunks/schema-bridge-BY3QLBL7.js +119 -0
  40. package/dist/_chunks/schema-bridge-BY3QLBL7.js.map +1 -0
  41. package/dist/_chunks/segment-classify-CDDRVKs7.js +137 -0
  42. package/dist/_chunks/segment-classify-CDDRVKs7.js.map +1 -0
  43. package/dist/_chunks/segment-context-ZDnXDkbz.js +34 -0
  44. package/dist/_chunks/segment-context-ZDnXDkbz.js.map +1 -0
  45. package/dist/_chunks/sizeof-lXffQ1Vr.js +35 -0
  46. package/dist/_chunks/sizeof-lXffQ1Vr.js.map +1 -0
  47. package/dist/_chunks/{ssr-data-MjmprTmO.js → ssr-data-BOWsq18U.js} +1 -1
  48. package/dist/_chunks/ssr-data-BOWsq18U.js.map +1 -0
  49. package/dist/_chunks/tree-match-D2l830j2.js +102 -0
  50. package/dist/_chunks/tree-match-D2l830j2.js.map +1 -0
  51. package/dist/_chunks/{use-query-states-D5KaffOK.js → use-query-states-CbeQmext.js} +7 -20
  52. package/dist/_chunks/use-query-states-CbeQmext.js.map +1 -0
  53. package/dist/_chunks/use-segment-params-D1CzlgBo.js +151 -0
  54. package/dist/_chunks/use-segment-params-D1CzlgBo.js.map +1 -0
  55. package/dist/_chunks/walkers-c8aReVgo.js +988 -0
  56. package/dist/_chunks/walkers-c8aReVgo.js.map +1 -0
  57. package/dist/adapters/build-output-helper.d.ts +29 -0
  58. package/dist/adapters/build-output-helper.d.ts.map +1 -0
  59. package/dist/adapters/cloudflare-dev.d.ts +109 -0
  60. package/dist/adapters/cloudflare-dev.d.ts.map +1 -0
  61. package/dist/adapters/cloudflare-dev.js +73 -0
  62. package/dist/adapters/cloudflare-dev.js.map +1 -0
  63. package/dist/adapters/cloudflare-kv-cache.d.ts +64 -0
  64. package/dist/adapters/cloudflare-kv-cache.d.ts.map +1 -0
  65. package/dist/adapters/cloudflare-kv-cache.js +117 -0
  66. package/dist/adapters/cloudflare-kv-cache.js.map +1 -0
  67. package/dist/adapters/cloudflare.d.ts +177 -20
  68. package/dist/adapters/cloudflare.d.ts.map +1 -1
  69. package/dist/adapters/cloudflare.js +342 -67
  70. package/dist/adapters/cloudflare.js.map +1 -1
  71. package/dist/adapters/compress-module.d.ts +5 -4
  72. package/dist/adapters/compress-module.d.ts.map +1 -1
  73. package/dist/adapters/nitro.d.ts +1 -3
  74. package/dist/adapters/nitro.d.ts.map +1 -1
  75. package/dist/adapters/nitro.js +143 -144
  76. package/dist/adapters/nitro.js.map +1 -1
  77. package/dist/adapters/shared.d.ts +6 -0
  78. package/dist/adapters/shared.d.ts.map +1 -0
  79. package/dist/cache/cache-api.d.ts +26 -0
  80. package/dist/cache/cache-api.d.ts.map +1 -0
  81. package/dist/cache/handler-store.d.ts +33 -0
  82. package/dist/cache/handler-store.d.ts.map +1 -0
  83. package/dist/cache/index.d.ts +27 -7
  84. package/dist/cache/index.d.ts.map +1 -1
  85. package/dist/cache/index.js +3 -326
  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 +97 -8
  89. package/dist/cache/redis-handler.d.ts.map +1 -1
  90. package/dist/cache/singleflight.d.ts +19 -2
  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/store.d.ts +53 -0
  97. package/dist/cache/store.d.ts.map +1 -0
  98. package/dist/cache/stores/cloudflare-kv.d.ts +38 -0
  99. package/dist/cache/stores/cloudflare-kv.d.ts.map +1 -0
  100. package/dist/cache/stores/cloudflare-kv.js +29 -0
  101. package/dist/cache/stores/cloudflare-kv.js.map +1 -0
  102. package/dist/cache/stores/memory.d.ts +42 -0
  103. package/dist/cache/stores/memory.d.ts.map +1 -0
  104. package/dist/cache/stores/memory.js +90 -0
  105. package/dist/cache/stores/memory.js.map +1 -0
  106. package/dist/cache/stores/redis.d.ts +69 -0
  107. package/dist/cache/stores/redis.d.ts.map +1 -0
  108. package/dist/cache/stores/redis.js +35 -0
  109. package/dist/cache/stores/redis.js.map +1 -0
  110. package/dist/cache/stores/vercel.d.ts +36 -0
  111. package/dist/cache/stores/vercel.d.ts.map +1 -0
  112. package/dist/cache/stores/vercel.js +33 -0
  113. package/dist/cache/stores/vercel.js.map +1 -0
  114. package/dist/cache/tag-aware-handler.d.ts +51 -0
  115. package/dist/cache/tag-aware-handler.d.ts.map +1 -0
  116. package/dist/cache/timber-cache.d.ts +20 -10
  117. package/dist/cache/timber-cache.d.ts.map +1 -1
  118. package/dist/cdn/cloudflare-purge.d.ts +23 -0
  119. package/dist/cdn/cloudflare-purge.d.ts.map +1 -0
  120. package/dist/cdn/fastly-purge.d.ts +25 -0
  121. package/dist/cdn/fastly-purge.d.ts.map +1 -0
  122. package/dist/cdn/headers.d.ts +97 -0
  123. package/dist/cdn/headers.d.ts.map +1 -0
  124. package/dist/cdn/index.d.ts +5 -0
  125. package/dist/cdn/index.d.ts.map +1 -0
  126. package/dist/cdn/purge-store.d.ts +23 -0
  127. package/dist/cdn/purge-store.d.ts.map +1 -0
  128. package/dist/cdn/workers-cache-purge.d.ts +16 -0
  129. package/dist/cdn/workers-cache-purge.d.ts.map +1 -0
  130. package/dist/cli-schema-sync.d.ts +59 -0
  131. package/dist/cli-schema-sync.d.ts.map +1 -0
  132. package/dist/cli.d.ts +34 -2
  133. package/dist/cli.d.ts.map +1 -1
  134. package/dist/cli.js +107 -33
  135. package/dist/cli.js.map +1 -1
  136. package/dist/client/browser-dev.d.ts +37 -1
  137. package/dist/client/browser-dev.d.ts.map +1 -1
  138. package/dist/client/browser-entry/action-dispatch.d.ts +17 -0
  139. package/dist/client/browser-entry/action-dispatch.d.ts.map +1 -0
  140. package/dist/client/browser-entry/hmr.d.ts +21 -0
  141. package/dist/client/browser-entry/hmr.d.ts.map +1 -0
  142. package/dist/client/browser-entry/hydrate.d.ts +46 -0
  143. package/dist/client/browser-entry/hydrate.d.ts.map +1 -0
  144. package/dist/client/browser-entry/index.d.ts +29 -0
  145. package/dist/client/browser-entry/index.d.ts.map +1 -0
  146. package/dist/client/browser-entry/post-hydration.d.ts +26 -0
  147. package/dist/client/browser-entry/post-hydration.d.ts.map +1 -0
  148. package/dist/client/browser-entry/router-init.d.ts +26 -0
  149. package/dist/client/browser-entry/router-init.d.ts.map +1 -0
  150. package/dist/client/browser-entry/rsc-stream.d.ts +24 -0
  151. package/dist/client/browser-entry/rsc-stream.d.ts.map +1 -0
  152. package/dist/client/browser-entry/scroll.d.ts +28 -0
  153. package/dist/client/browser-entry/scroll.d.ts.map +1 -0
  154. package/dist/client/error-boundary.d.ts +12 -5
  155. package/dist/client/error-boundary.d.ts.map +1 -1
  156. package/dist/client/error-boundary.js +47 -10
  157. package/dist/client/error-boundary.js.map +1 -1
  158. package/dist/client/error-reconstituter.d.ts +61 -0
  159. package/dist/client/error-reconstituter.d.ts.map +1 -0
  160. package/dist/client/form.d.ts +16 -27
  161. package/dist/client/form.d.ts.map +1 -1
  162. package/dist/client/history.d.ts +11 -6
  163. package/dist/client/history.d.ts.map +1 -1
  164. package/dist/client/index.d.ts +10 -24
  165. package/dist/client/index.d.ts.map +1 -1
  166. package/dist/client/index.js +182 -1134
  167. package/dist/client/index.js.map +1 -1
  168. package/dist/client/internal.d.ts +19 -0
  169. package/dist/client/internal.d.ts.map +1 -0
  170. package/dist/client/internal.js +825 -0
  171. package/dist/client/internal.js.map +1 -0
  172. package/dist/client/link.d.ts +69 -60
  173. package/dist/client/link.d.ts.map +1 -1
  174. package/dist/client/navigation-api.d.ts +120 -0
  175. package/dist/client/navigation-api.d.ts.map +1 -0
  176. package/dist/client/navigation-context.d.ts +3 -2
  177. package/dist/client/navigation-context.d.ts.map +1 -1
  178. package/dist/client/navigation-root.d.ts +119 -0
  179. package/dist/client/navigation-root.d.ts.map +1 -0
  180. package/dist/client/nuqs-adapter.d.ts +1 -1
  181. package/dist/client/nuqs-adapter.d.ts.map +1 -1
  182. package/dist/client/router-ref.d.ts +1 -1
  183. package/dist/client/router.d.ts +87 -14
  184. package/dist/client/router.d.ts.map +1 -1
  185. package/dist/client/rsc-fetch.d.ts +47 -14
  186. package/dist/client/rsc-fetch.d.ts.map +1 -1
  187. package/dist/client/segment-cache.d.ts +4 -4
  188. package/dist/client/segment-cache.d.ts.map +1 -1
  189. package/dist/client/segment-outlet.d.ts +49 -0
  190. package/dist/client/segment-outlet.d.ts.map +1 -0
  191. package/dist/client/segment-update-context.d.ts +21 -0
  192. package/dist/client/segment-update-context.d.ts.map +1 -0
  193. package/dist/client/shallow-url.d.ts +10 -0
  194. package/dist/client/shallow-url.d.ts.map +1 -0
  195. package/dist/client/ssr-data.d.ts +13 -4
  196. package/dist/client/ssr-data.d.ts.map +1 -1
  197. package/dist/client/state.d.ts +1 -1
  198. package/dist/client/top-loader.d.ts +5 -5
  199. package/dist/client/top-loader.d.ts.map +1 -1
  200. package/dist/client/use-cookie.d.ts +12 -0
  201. package/dist/client/use-cookie.d.ts.map +1 -1
  202. package/dist/client/use-link-status.d.ts +5 -5
  203. package/dist/client/use-link-status.d.ts.map +1 -1
  204. package/dist/client/use-pathname.d.ts.map +1 -1
  205. package/dist/client/use-pending-navigation.d.ts +23 -0
  206. package/dist/client/use-pending-navigation.d.ts.map +1 -0
  207. package/dist/client/use-query-states.d.ts +1 -1
  208. package/dist/client/use-query-states.d.ts.map +1 -1
  209. package/dist/client/use-router.d.ts +1 -1
  210. package/dist/client/use-router.d.ts.map +1 -1
  211. package/dist/client/use-search-params.d.ts +12 -5
  212. package/dist/client/use-search-params.d.ts.map +1 -1
  213. package/dist/client/{use-params.d.ts → use-segment-params.d.ts} +8 -6
  214. package/dist/client/use-segment-params.d.ts.map +1 -0
  215. package/dist/codec.d.ts +69 -0
  216. package/dist/codec.d.ts.map +1 -0
  217. package/dist/codec.js +75 -0
  218. package/dist/codec.js.map +1 -0
  219. package/dist/config-types.d.ts +304 -0
  220. package/dist/config-types.d.ts.map +1 -0
  221. package/dist/config-validation.d.ts +51 -0
  222. package/dist/config-validation.d.ts.map +1 -0
  223. package/dist/content/index.d.ts +1 -10
  224. package/dist/content/index.d.ts.map +1 -1
  225. package/dist/content/index.js +0 -2
  226. package/dist/cookies/define-cookie.d.ts +58 -25
  227. package/dist/cookies/define-cookie.d.ts.map +1 -1
  228. package/dist/cookies/index.d.ts +2 -1
  229. package/dist/cookies/index.d.ts.map +1 -1
  230. package/dist/cookies/index.js +253 -36
  231. package/dist/cookies/index.js.map +1 -1
  232. package/dist/cookies/json-cookie.d.ts +64 -0
  233. package/dist/cookies/json-cookie.d.ts.map +1 -0
  234. package/dist/cookies/validation.d.ts +34 -0
  235. package/dist/cookies/validation.d.ts.map +1 -0
  236. package/dist/dev-tools/404-page.d.ts +50 -0
  237. package/dist/dev-tools/404-page.d.ts.map +1 -0
  238. package/dist/dev-tools/browser-logs.d.ts +40 -0
  239. package/dist/dev-tools/browser-logs.d.ts.map +1 -0
  240. package/dist/dev-tools/dev-page-shell.d.ts +78 -0
  241. package/dist/dev-tools/dev-page-shell.d.ts.map +1 -0
  242. package/dist/dev-tools/error-page.d.ts +32 -0
  243. package/dist/dev-tools/error-page.d.ts.map +1 -0
  244. package/dist/dev-tools/holding-server.d.ts +54 -0
  245. package/dist/dev-tools/holding-server.d.ts.map +1 -0
  246. package/dist/dev-tools/hydration-overlay.d.ts +11 -0
  247. package/dist/dev-tools/hydration-overlay.d.ts.map +1 -0
  248. package/dist/dev-tools/index.d.ts +31 -0
  249. package/dist/dev-tools/index.d.ts.map +1 -0
  250. package/dist/dev-tools/instrumentation.d.ts +59 -0
  251. package/dist/dev-tools/instrumentation.d.ts.map +1 -0
  252. package/dist/{server/dev-logger.d.ts → dev-tools/logger.d.ts} +1 -1
  253. package/dist/dev-tools/logger.d.ts.map +1 -0
  254. package/dist/{plugins/dev-logs.d.ts → dev-tools/logs.d.ts} +2 -2
  255. package/dist/dev-tools/logs.d.ts.map +1 -0
  256. package/dist/dev-tools/overlay.d.ts +91 -0
  257. package/dist/dev-tools/overlay.d.ts.map +1 -0
  258. package/dist/dev-tools/stack-classifier.d.ts +34 -0
  259. package/dist/dev-tools/stack-classifier.d.ts.map +1 -0
  260. package/dist/dev-tools/terminal.d.ts +28 -0
  261. package/dist/dev-tools/terminal.d.ts.map +1 -0
  262. package/dist/fonts/ast-walk.d.ts +68 -0
  263. package/dist/fonts/ast-walk.d.ts.map +1 -0
  264. package/dist/fonts/ast.d.ts +110 -6
  265. package/dist/fonts/ast.d.ts.map +1 -1
  266. package/dist/fonts/bundle.d.ts +50 -0
  267. package/dist/fonts/bundle.d.ts.map +1 -0
  268. package/dist/fonts/dev-middleware.d.ts +22 -0
  269. package/dist/fonts/dev-middleware.d.ts.map +1 -0
  270. package/dist/fonts/fallbacks.d.ts +0 -7
  271. package/dist/fonts/fallbacks.d.ts.map +1 -1
  272. package/dist/fonts/google.d.ts +4 -2
  273. package/dist/fonts/google.d.ts.map +1 -1
  274. package/dist/fonts/local.d.ts +4 -4
  275. package/dist/fonts/local.d.ts.map +1 -1
  276. package/dist/fonts/paths.d.ts +43 -0
  277. package/dist/fonts/paths.d.ts.map +1 -0
  278. package/dist/fonts/pipeline.d.ts +158 -0
  279. package/dist/fonts/pipeline.d.ts.map +1 -0
  280. package/dist/fonts/transform.d.ts +82 -0
  281. package/dist/fonts/transform.d.ts.map +1 -0
  282. package/dist/fonts/types.d.ts +47 -1
  283. package/dist/fonts/types.d.ts.map +1 -1
  284. package/dist/fonts/virtual-modules.d.ts +77 -0
  285. package/dist/fonts/virtual-modules.d.ts.map +1 -0
  286. package/dist/index.d.ts +46 -180
  287. package/dist/index.d.ts.map +1 -1
  288. package/dist/index.js +7807 -13691
  289. package/dist/index.js.map +1 -1
  290. package/dist/params/codec-registry.d.ts +26 -0
  291. package/dist/params/codec-registry.d.ts.map +1 -0
  292. package/dist/params/define-schema.d.ts +81 -0
  293. package/dist/params/define-schema.d.ts.map +1 -0
  294. package/dist/params/index.d.ts +5 -0
  295. package/dist/params/index.d.ts.map +1 -0
  296. package/dist/params/index.js +34 -0
  297. package/dist/params/index.js.map +1 -0
  298. package/dist/params/resolve-schema.d.ts +34 -0
  299. package/dist/params/resolve-schema.d.ts.map +1 -0
  300. package/dist/plugin-context.d.ts +190 -0
  301. package/dist/plugin-context.d.ts.map +1 -0
  302. package/dist/plugins/adapter-build.d.ts +20 -1
  303. package/dist/plugins/adapter-build.d.ts.map +1 -1
  304. package/dist/plugins/build-manifest.d.ts +7 -3
  305. package/dist/plugins/build-manifest.d.ts.map +1 -1
  306. package/dist/plugins/build-report.d.ts +43 -7
  307. package/dist/plugins/build-report.d.ts.map +1 -1
  308. package/dist/plugins/cache.d.ts +64 -0
  309. package/dist/plugins/cache.d.ts.map +1 -0
  310. package/dist/plugins/callsite-ast.d.ts +95 -0
  311. package/dist/plugins/callsite-ast.d.ts.map +1 -0
  312. package/dist/plugins/callsite-jsx.d.ts +35 -0
  313. package/dist/plugins/callsite-jsx.d.ts.map +1 -0
  314. package/dist/plugins/chunks.d.ts +11 -4
  315. package/dist/plugins/chunks.d.ts.map +1 -1
  316. package/dist/plugins/client-chunks.d.ts +40 -0
  317. package/dist/plugins/client-chunks.d.ts.map +1 -0
  318. package/dist/plugins/cloudflare-wasm.d.ts +21 -0
  319. package/dist/plugins/cloudflare-wasm.d.ts.map +1 -0
  320. package/dist/plugins/content.d.ts +1 -1
  321. package/dist/plugins/content.d.ts.map +1 -1
  322. package/dist/plugins/dev-server.d.ts +17 -1
  323. package/dist/plugins/dev-server.d.ts.map +1 -1
  324. package/dist/plugins/entries.d.ts +1 -1
  325. package/dist/plugins/entries.d.ts.map +1 -1
  326. package/dist/plugins/fonts.d.ts +16 -73
  327. package/dist/plugins/fonts.d.ts.map +1 -1
  328. package/dist/plugins/mdx.d.ts +1 -1
  329. package/dist/plugins/mdx.d.ts.map +1 -1
  330. package/dist/plugins/prebuilt-capture.d.ts +60 -0
  331. package/dist/plugins/prebuilt-capture.d.ts.map +1 -0
  332. package/dist/plugins/prebuilt.d.ts +82 -0
  333. package/dist/plugins/prebuilt.d.ts.map +1 -0
  334. package/dist/plugins/prerender-sugar.d.ts +42 -0
  335. package/dist/plugins/prerender-sugar.d.ts.map +1 -0
  336. package/dist/plugins/routing.d.ts +1 -1
  337. package/dist/plugins/routing.d.ts.map +1 -1
  338. package/dist/plugins/server-bundle.d.ts.map +1 -1
  339. package/dist/plugins/shims.d.ts +29 -5
  340. package/dist/plugins/shims.d.ts.map +1 -1
  341. package/dist/plugins/static-build.d.ts +5 -26
  342. package/dist/plugins/static-build.d.ts.map +1 -1
  343. package/dist/routing/codegen-shared.d.ts +67 -0
  344. package/dist/routing/codegen-shared.d.ts.map +1 -0
  345. package/dist/routing/codegen-types.d.ts +64 -0
  346. package/dist/routing/codegen-types.d.ts.map +1 -0
  347. package/dist/routing/codegen.d.ts +7 -2
  348. package/dist/routing/codegen.d.ts.map +1 -1
  349. package/dist/routing/convention-lint.d.ts +41 -0
  350. package/dist/routing/convention-lint.d.ts.map +1 -0
  351. package/dist/routing/export-detect.d.ts +56 -0
  352. package/dist/routing/export-detect.d.ts.map +1 -0
  353. package/dist/routing/file-cache.d.ts +8 -0
  354. package/dist/routing/file-cache.d.ts.map +1 -0
  355. package/dist/routing/index.d.ts +7 -1
  356. package/dist/routing/index.d.ts.map +1 -1
  357. package/dist/routing/index.js +4 -2
  358. package/dist/routing/interception.d.ts +0 -5
  359. package/dist/routing/interception.d.ts.map +1 -1
  360. package/dist/routing/link-codegen.d.ts +90 -0
  361. package/dist/routing/link-codegen.d.ts.map +1 -0
  362. package/dist/routing/manifest-codegen.d.ts +32 -0
  363. package/dist/routing/manifest-codegen.d.ts.map +1 -0
  364. package/dist/routing/scanner.d.ts +1 -10
  365. package/dist/routing/scanner.d.ts.map +1 -1
  366. package/dist/routing/schema-validation.d.ts +35 -0
  367. package/dist/routing/schema-validation.d.ts.map +1 -0
  368. package/dist/routing/segment-classify.d.ts +75 -0
  369. package/dist/routing/segment-classify.d.ts.map +1 -0
  370. package/dist/routing/segment-codegen.d.ts +38 -0
  371. package/dist/routing/segment-codegen.d.ts.map +1 -0
  372. package/dist/routing/types.d.ts +77 -25
  373. package/dist/routing/types.d.ts.map +1 -1
  374. package/dist/routing/walkers.d.ts +51 -0
  375. package/dist/routing/walkers.d.ts.map +1 -0
  376. package/dist/rsc-runtime/rsc.d.ts +1 -1
  377. package/dist/rsc-runtime/rsc.d.ts.map +1 -1
  378. package/dist/rsc-runtime/ssr.d.ts +12 -0
  379. package/dist/rsc-runtime/ssr.d.ts.map +1 -1
  380. package/dist/schema-bridge.d.ts +91 -0
  381. package/dist/schema-bridge.d.ts.map +1 -0
  382. package/dist/search-params/define.d.ts +157 -0
  383. package/dist/search-params/define.d.ts.map +1 -0
  384. package/dist/search-params/index.d.ts +4 -7
  385. package/dist/search-params/index.d.ts.map +1 -1
  386. package/dist/search-params/index.js +37 -440
  387. package/dist/search-params/index.js.map +1 -1
  388. package/dist/search-params/registry.d.ts +2 -2
  389. package/dist/search-params/registry.d.ts.map +1 -1
  390. package/dist/search-params/wrappers.d.ts +53 -0
  391. package/dist/search-params/wrappers.d.ts.map +1 -0
  392. package/dist/segment-params/define.d.ts +89 -0
  393. package/dist/segment-params/define.d.ts.map +1 -0
  394. package/dist/segment-params/index.d.ts +3 -0
  395. package/dist/segment-params/index.d.ts.map +1 -0
  396. package/dist/segment-params/index.js +2 -0
  397. package/dist/server/access-gate.d.ts +8 -3
  398. package/dist/server/access-gate.d.ts.map +1 -1
  399. package/dist/server/action-client.d.ts +41 -6
  400. package/dist/server/action-client.d.ts.map +1 -1
  401. package/dist/server/action-encryption.d.ts +76 -0
  402. package/dist/server/action-encryption.d.ts.map +1 -0
  403. package/dist/server/action-handler.d.ts +35 -1
  404. package/dist/server/action-handler.d.ts.map +1 -1
  405. package/dist/server/actions.d.ts +6 -30
  406. package/dist/server/actions.d.ts.map +1 -1
  407. package/dist/server/als-registry.d.ts +85 -11
  408. package/dist/server/als-registry.d.ts.map +1 -1
  409. package/dist/server/asset-headers.d.ts +8 -18
  410. package/dist/server/asset-headers.d.ts.map +1 -1
  411. package/dist/server/body-limits.d.ts.map +1 -1
  412. package/dist/server/build-manifest.d.ts +6 -29
  413. package/dist/server/build-manifest.d.ts.map +1 -1
  414. package/dist/server/canonicalize.d.ts +10 -0
  415. package/dist/server/canonicalize.d.ts.map +1 -1
  416. package/dist/server/coalesce-tick.d.ts +40 -0
  417. package/dist/server/coalesce-tick.d.ts.map +1 -0
  418. package/dist/server/cookie-context.d.ts +170 -0
  419. package/dist/server/cookie-context.d.ts.map +1 -0
  420. package/dist/server/cookie-parsing.d.ts +65 -0
  421. package/dist/server/cookie-parsing.d.ts.map +1 -0
  422. package/dist/server/csrf.d.ts +3 -2
  423. package/dist/server/csrf.d.ts.map +1 -1
  424. package/dist/server/default-logger.d.ts +22 -0
  425. package/dist/server/default-logger.d.ts.map +1 -0
  426. package/dist/server/deny-boundary.d.ts +115 -0
  427. package/dist/server/deny-boundary.d.ts.map +1 -0
  428. package/dist/server/deny-renderer.d.ts +2 -2
  429. package/dist/server/deny-renderer.d.ts.map +1 -1
  430. package/dist/server/dev-source-map.d.ts +22 -0
  431. package/dist/server/dev-source-map.d.ts.map +1 -0
  432. package/dist/server/early-hints-sender.d.ts.map +1 -1
  433. package/dist/server/early-hints.d.ts +13 -11
  434. package/dist/server/early-hints.d.ts.map +1 -1
  435. package/dist/server/error-boundary-wrapper.d.ts +7 -1
  436. package/dist/server/error-boundary-wrapper.d.ts.map +1 -1
  437. package/dist/server/fallback-error.d.ts +12 -7
  438. package/dist/server/fallback-error.d.ts.map +1 -1
  439. package/dist/server/flight-injection-state.d.ts +66 -0
  440. package/dist/server/flight-injection-state.d.ts.map +1 -0
  441. package/dist/server/flight-scripts.d.ts +42 -0
  442. package/dist/server/flight-scripts.d.ts.map +1 -0
  443. package/dist/server/form-data.d.ts +41 -0
  444. package/dist/server/form-data.d.ts.map +1 -1
  445. package/dist/server/html-injector-core.d.ts +221 -0
  446. package/dist/server/html-injector-core.d.ts.map +1 -0
  447. package/dist/server/html-injectors.d.ts +82 -41
  448. package/dist/server/html-injectors.d.ts.map +1 -1
  449. package/dist/server/index.d.ts +10 -46
  450. package/dist/server/index.d.ts.map +1 -1
  451. package/dist/server/index.js +170 -2911
  452. package/dist/server/index.js.map +1 -1
  453. package/dist/server/internal.d.ts +49 -0
  454. package/dist/server/internal.d.ts.map +1 -0
  455. package/dist/server/internal.js +3577 -0
  456. package/dist/server/internal.js.map +1 -0
  457. package/dist/server/logger.d.ts +39 -7
  458. package/dist/server/logger.d.ts.map +1 -1
  459. package/dist/server/metadata-routes.d.ts +23 -7
  460. package/dist/server/metadata-routes.d.ts.map +1 -1
  461. package/dist/server/middleware-runner.d.ts +36 -4
  462. package/dist/server/middleware-runner.d.ts.map +1 -1
  463. package/dist/server/node-stream-transforms.d.ts +119 -0
  464. package/dist/server/node-stream-transforms.d.ts.map +1 -0
  465. package/dist/server/param-coercion.d.ts +54 -0
  466. package/dist/server/param-coercion.d.ts.map +1 -0
  467. package/dist/server/pipeline-helpers.d.ts +95 -0
  468. package/dist/server/pipeline-helpers.d.ts.map +1 -0
  469. package/dist/server/pipeline-interception.d.ts +1 -1
  470. package/dist/server/pipeline-interception.d.ts.map +1 -1
  471. package/dist/server/pipeline-metadata.d.ts +6 -0
  472. package/dist/server/pipeline-metadata.d.ts.map +1 -1
  473. package/dist/server/pipeline-outcome.d.ts +49 -0
  474. package/dist/server/pipeline-outcome.d.ts.map +1 -0
  475. package/dist/server/pipeline-phases.d.ts +56 -0
  476. package/dist/server/pipeline-phases.d.ts.map +1 -0
  477. package/dist/server/pipeline.d.ts +122 -19
  478. package/dist/server/pipeline.d.ts.map +1 -1
  479. package/dist/server/port-resolution.d.ts +117 -0
  480. package/dist/server/port-resolution.d.ts.map +1 -0
  481. package/dist/server/prebuilt/cache-key.d.ts +58 -0
  482. package/dist/server/prebuilt/cache-key.d.ts.map +1 -0
  483. package/dist/server/prebuilt/capture-state.d.ts +57 -0
  484. package/dist/server/prebuilt/capture-state.d.ts.map +1 -0
  485. package/dist/server/prebuilt/manifest-tag-index.d.ts +27 -0
  486. package/dist/server/prebuilt/manifest-tag-index.d.ts.map +1 -0
  487. package/dist/server/prebuilt/overlay.d.ts +100 -0
  488. package/dist/server/prebuilt/overlay.d.ts.map +1 -0
  489. package/dist/server/prebuilt/payload-source.d.ts +78 -0
  490. package/dist/server/prebuilt/payload-source.d.ts.map +1 -0
  491. package/dist/server/prebuilt/synthetic-store.d.ts +66 -0
  492. package/dist/server/prebuilt/synthetic-store.d.ts.map +1 -0
  493. package/dist/server/prebuilt-builder.d.ts +120 -0
  494. package/dist/server/prebuilt-builder.d.ts.map +1 -0
  495. package/dist/server/prebuilt-runtime.d.ts +101 -0
  496. package/dist/server/prebuilt-runtime.d.ts.map +1 -0
  497. package/dist/server/primitives.d.ts +83 -31
  498. package/dist/server/primitives.d.ts.map +1 -1
  499. package/dist/server/render-timeout.d.ts +51 -0
  500. package/dist/server/render-timeout.d.ts.map +1 -0
  501. package/dist/server/render-utils.d.ts +25 -0
  502. package/dist/server/render-utils.d.ts.map +1 -0
  503. package/dist/server/request-context.d.ts +62 -107
  504. package/dist/server/request-context.d.ts.map +1 -1
  505. package/dist/server/route-element-builder.d.ts +39 -25
  506. package/dist/server/route-element-builder.d.ts.map +1 -1
  507. package/dist/server/route-handler.d.ts.map +1 -1
  508. package/dist/server/route-matcher.d.ts +25 -36
  509. package/dist/server/route-matcher.d.ts.map +1 -1
  510. package/dist/server/rsc-entry/action-middleware-runner.d.ts +66 -0
  511. package/dist/server/rsc-entry/action-middleware-runner.d.ts.map +1 -0
  512. package/dist/server/rsc-entry/api-handler.d.ts +12 -3
  513. package/dist/server/rsc-entry/api-handler.d.ts.map +1 -1
  514. package/dist/server/rsc-entry/error-renderer.d.ts +26 -13
  515. package/dist/server/rsc-entry/error-renderer.d.ts.map +1 -1
  516. package/dist/server/rsc-entry/helpers.d.ts +51 -28
  517. package/dist/server/rsc-entry/helpers.d.ts.map +1 -1
  518. package/dist/server/rsc-entry/index.d.ts +30 -8
  519. package/dist/server/rsc-entry/index.d.ts.map +1 -1
  520. package/dist/server/rsc-entry/render-route.d.ts +50 -0
  521. package/dist/server/rsc-entry/render-route.d.ts.map +1 -0
  522. package/dist/server/rsc-entry/revalidate-renderer.d.ts +108 -0
  523. package/dist/server/rsc-entry/revalidate-renderer.d.ts.map +1 -0
  524. package/dist/server/rsc-entry/rsc-payload.d.ts +5 -6
  525. package/dist/server/rsc-entry/rsc-payload.d.ts.map +1 -1
  526. package/dist/server/rsc-entry/rsc-stream.d.ts +17 -1
  527. package/dist/server/rsc-entry/rsc-stream.d.ts.map +1 -1
  528. package/dist/server/rsc-entry/ssr-bridge.d.ts +5 -1
  529. package/dist/server/rsc-entry/ssr-bridge.d.ts.map +1 -1
  530. package/dist/server/rsc-entry/ssr-renderer.d.ts +34 -4
  531. package/dist/server/rsc-entry/ssr-renderer.d.ts.map +1 -1
  532. package/dist/server/rsc-entry/wrap-action-dispatch.d.ts +119 -0
  533. package/dist/server/rsc-entry/wrap-action-dispatch.d.ts.map +1 -0
  534. package/dist/server/safe-load.d.ts +46 -0
  535. package/dist/server/safe-load.d.ts.map +1 -0
  536. package/dist/server/sensitive-fields.d.ts +74 -0
  537. package/dist/server/sensitive-fields.d.ts.map +1 -0
  538. package/dist/server/sitemap-generator.d.ts +129 -0
  539. package/dist/server/sitemap-generator.d.ts.map +1 -0
  540. package/dist/server/sitemap-handler.d.ts +22 -0
  541. package/dist/server/sitemap-handler.d.ts.map +1 -0
  542. package/dist/server/slot-resolver.d.ts +7 -5
  543. package/dist/server/slot-resolver.d.ts.map +1 -1
  544. package/dist/server/ssr-bridge-types.d.ts +121 -0
  545. package/dist/server/ssr-bridge-types.d.ts.map +1 -0
  546. package/dist/server/ssr-entry.d.ts +2 -43
  547. package/dist/server/ssr-entry.d.ts.map +1 -1
  548. package/dist/server/ssr-render.d.ts +64 -21
  549. package/dist/server/ssr-render.d.ts.map +1 -1
  550. package/dist/server/ssr-wrappers.d.ts +50 -0
  551. package/dist/server/ssr-wrappers.d.ts.map +1 -0
  552. package/dist/server/state-tree-diff.d.ts +12 -5
  553. package/dist/server/state-tree-diff.d.ts.map +1 -1
  554. package/dist/server/status-code-resolver.d.ts +22 -11
  555. package/dist/server/status-code-resolver.d.ts.map +1 -1
  556. package/dist/server/stream-utils.d.ts +47 -0
  557. package/dist/server/stream-utils.d.ts.map +1 -0
  558. package/dist/server/tracing.d.ts +44 -9
  559. package/dist/server/tracing.d.ts.map +1 -1
  560. package/dist/server/tree-builder.d.ts +62 -30
  561. package/dist/server/tree-builder.d.ts.map +1 -1
  562. package/dist/server/tree-match.d.ts +49 -0
  563. package/dist/server/tree-match.d.ts.map +1 -0
  564. package/dist/server/types.d.ts +71 -6
  565. package/dist/server/types.d.ts.map +1 -1
  566. package/dist/server/utils/escape-html.d.ts +14 -0
  567. package/dist/server/utils/escape-html.d.ts.map +1 -0
  568. package/dist/server/utils/mdx-file.d.ts +15 -0
  569. package/dist/server/utils/mdx-file.d.ts.map +1 -0
  570. package/dist/server/version-skew.d.ts +61 -0
  571. package/dist/server/version-skew.d.ts.map +1 -0
  572. package/dist/server/workers-cache-bridge.d.ts +26 -0
  573. package/dist/server/workers-cache-bridge.d.ts.map +1 -0
  574. package/dist/shared/href-validation.d.ts +49 -0
  575. package/dist/shared/href-validation.d.ts.map +1 -0
  576. package/dist/shared/merge-search-params.d.ts +22 -0
  577. package/dist/shared/merge-search-params.d.ts.map +1 -0
  578. package/dist/shared/redirect-type.d.ts +17 -0
  579. package/dist/shared/redirect-type.d.ts.map +1 -0
  580. package/dist/shims/font-google.d.ts +1 -1
  581. package/dist/shims/font-google.d.ts.map +1 -1
  582. package/dist/shims/font-google.js +42 -0
  583. package/dist/shims/font-google.js.map +1 -0
  584. package/dist/shims/font-local.d.ts +26 -0
  585. package/dist/shims/font-local.d.ts.map +1 -0
  586. package/dist/shims/font-local.js +20 -0
  587. package/dist/shims/font-local.js.map +1 -0
  588. package/dist/shims/headers.d.ts +53 -1
  589. package/dist/shims/headers.d.ts.map +1 -1
  590. package/dist/shims/image.d.ts +16 -16
  591. package/dist/shims/navigation-client.d.ts +35 -11
  592. package/dist/shims/navigation-client.d.ts.map +1 -1
  593. package/dist/shims/navigation.d.ts +11 -5
  594. package/dist/shims/navigation.d.ts.map +1 -1
  595. package/dist/utils/state-machine.d.ts +80 -0
  596. package/dist/utils/state-machine.d.ts.map +1 -0
  597. package/docs/api/30-api-server.mdx +233 -0
  598. package/docs/api/31-api-client.mdx +161 -0
  599. package/docs/api/32-api-cache.mdx +199 -0
  600. package/docs/api/33-api-search-params.mdx +141 -0
  601. package/docs/api/34-api-config.mdx +189 -0
  602. package/docs/api/35-api-typescript.mdx +170 -0
  603. package/docs/api/36-cli.mdx +143 -0
  604. package/docs/learn/00-introduction.mdx +76 -0
  605. package/docs/learn/01-quick-start.mdx +94 -0
  606. package/docs/learn/02-pages-and-layouts.mdx +147 -0
  607. package/docs/learn/03-fetching-data.mdx +211 -0
  608. package/docs/learn/03b-access-control.mdx +130 -0
  609. package/docs/learn/04-loading-states.mdx +67 -0
  610. package/docs/learn/04b-the-flush-point.mdx +115 -0
  611. package/docs/learn/05-typed-params.mdx +275 -0
  612. package/docs/learn/06-forms-and-actions.mdx +146 -0
  613. package/docs/learn/07-typed-routes.mdx +127 -0
  614. package/docs/learn/08-streaming.mdx +146 -0
  615. package/docs/learn/09-caching.mdx +136 -0
  616. package/docs/learn/10-middleware.mdx +157 -0
  617. package/docs/learn/11-error-handling.mdx +156 -0
  618. package/docs/learn/12-client-navigation.mdx +168 -0
  619. package/docs/learn/13-configuration.mdx +145 -0
  620. package/docs/learn/14-deploying.mdx +264 -0
  621. package/docs/more/01-advanced-routing.mdx +139 -0
  622. package/docs/more/02-advanced-forms.mdx +137 -0
  623. package/docs/more/03-coming-from-nextjs.mdx +186 -0
  624. package/docs/more/04-metadata-and-fonts.mdx +193 -0
  625. package/docs/more/04b-mdx.mdx +209 -0
  626. package/docs/more/05-content-collections.mdx +90 -0
  627. package/docs/more/06-instrumentation.mdx +214 -0
  628. package/docs/more/07-security.mdx +129 -0
  629. package/docs/more/08-developer-experience.mdx +134 -0
  630. package/docs/more/40-why-timber.mdx +50 -0
  631. package/docs/more/41-timber-vs-nextjs.mdx +81 -0
  632. package/docs/more/42-timber-vs-others.mdx +68 -0
  633. package/docs/more/50-ai-agent-instructions.mdx +169 -0
  634. package/llms.txt +55 -0
  635. package/package.json +102 -26
  636. package/src/adapters/build-output-helper.ts +199 -0
  637. package/src/adapters/cloudflare-dev.ts +177 -0
  638. package/src/adapters/cloudflare-kv-cache.ts +179 -0
  639. package/src/adapters/cloudflare.ts +594 -119
  640. package/src/adapters/compress-module.ts +27 -92
  641. package/src/adapters/nitro.ts +131 -96
  642. package/src/adapters/raw-imports.d.ts +5 -0
  643. package/src/adapters/shared.ts +68 -0
  644. package/src/adapters/wrangler.d.ts +7 -0
  645. package/src/cache/cache-api.ts +107 -0
  646. package/src/cache/handler-store.ts +76 -0
  647. package/src/cache/index.ts +88 -18
  648. package/src/cache/invalidation-epoch.ts +93 -0
  649. package/src/cache/redis-handler.ts +122 -15
  650. package/src/cache/singleflight.ts +64 -6
  651. package/src/cache/sizeof.ts +33 -0
  652. package/src/cache/stable-stringify.ts +65 -2
  653. package/src/cache/store.ts +71 -0
  654. package/src/cache/stores/cloudflare-kv.ts +52 -0
  655. package/src/cache/stores/memory.ts +125 -0
  656. package/src/cache/stores/redis.ts +97 -0
  657. package/src/cache/stores/vercel.ts +59 -0
  658. package/src/cache/tag-aware-handler.ts +233 -0
  659. package/src/cache/timber-cache.ts +142 -36
  660. package/src/cdn/cloudflare-purge.ts +50 -0
  661. package/src/cdn/fastly-purge.ts +63 -0
  662. package/src/cdn/headers.ts +153 -0
  663. package/src/cdn/index.ts +17 -0
  664. package/src/cdn/purge-store.ts +34 -0
  665. package/src/cdn/workers-cache-purge.ts +30 -0
  666. package/src/cli-schema-sync.ts +388 -0
  667. package/src/cli.ts +157 -34
  668. package/src/client/browser-dev.ts +156 -1
  669. package/src/client/browser-entry/action-dispatch.ts +124 -0
  670. package/src/client/browser-entry/hmr.ts +70 -0
  671. package/src/client/browser-entry/hydrate.ts +187 -0
  672. package/src/client/browser-entry/index.ts +111 -0
  673. package/src/client/browser-entry/post-hydration.ts +103 -0
  674. package/src/client/browser-entry/router-init.ts +287 -0
  675. package/src/client/browser-entry/rsc-stream.ts +157 -0
  676. package/src/client/browser-entry/scroll.ts +50 -0
  677. package/src/client/error-boundary.tsx +127 -22
  678. package/src/client/error-reconstituter.tsx +79 -0
  679. package/src/client/form.tsx +31 -32
  680. package/src/client/history.ts +11 -7
  681. package/src/client/index.ts +67 -45
  682. package/src/client/internal.ts +58 -0
  683. package/src/client/link.tsx +346 -150
  684. package/src/client/navigation-api.ts +341 -0
  685. package/src/client/navigation-context.ts +15 -7
  686. package/src/client/navigation-root.tsx +355 -0
  687. package/src/client/nuqs-adapter.tsx +16 -3
  688. package/src/client/router-ref.ts +1 -1
  689. package/src/client/router.ts +482 -166
  690. package/src/client/rsc-fetch.ts +214 -33
  691. package/src/client/segment-cache.ts +7 -7
  692. package/src/client/segment-outlet.tsx +77 -0
  693. package/src/client/segment-update-context.ts +42 -0
  694. package/src/client/shallow-url.ts +22 -0
  695. package/src/client/ssr-data.ts +13 -5
  696. package/src/client/state.ts +2 -2
  697. package/src/client/top-loader.tsx +11 -9
  698. package/src/client/use-cookie.ts +49 -14
  699. package/src/client/use-link-status.ts +7 -7
  700. package/src/client/use-pathname.ts +1 -0
  701. package/src/client/use-pending-navigation.ts +40 -0
  702. package/src/client/use-query-states.ts +9 -3
  703. package/src/client/use-router.ts +4 -1
  704. package/src/client/use-search-params.ts +31 -44
  705. package/src/client/{use-params.ts → use-segment-params.ts} +9 -6
  706. package/src/codec.ts +147 -0
  707. package/src/config-types.ts +302 -0
  708. package/src/config-validation.ts +328 -0
  709. package/src/content/index.ts +5 -13
  710. package/src/cookies/define-cookie.ts +217 -53
  711. package/src/cookies/index.ts +12 -1
  712. package/src/cookies/json-cookie.ts +105 -0
  713. package/src/cookies/validation.ts +192 -0
  714. package/src/dev-tools/404-page.ts +286 -0
  715. package/src/dev-tools/browser-logs.ts +55 -0
  716. package/src/dev-tools/dev-page-shell.ts +260 -0
  717. package/src/dev-tools/error-page.ts +331 -0
  718. package/src/dev-tools/holding-server.ts +187 -0
  719. package/src/dev-tools/hydration-overlay.ts +158 -0
  720. package/src/dev-tools/index.ts +83 -0
  721. package/src/dev-tools/instrumentation.ts +213 -0
  722. package/src/{server/dev-logger.ts → dev-tools/logger.ts} +33 -51
  723. package/src/{plugins/dev-logs.ts → dev-tools/logs.ts} +9 -5
  724. package/src/dev-tools/overlay.ts +469 -0
  725. package/src/dev-tools/stack-classifier.ts +75 -0
  726. package/src/dev-tools/terminal.ts +182 -0
  727. package/src/fonts/ast-walk.ts +235 -0
  728. package/src/fonts/ast.ts +477 -126
  729. package/src/fonts/bundle.ts +138 -0
  730. package/src/fonts/dev-middleware.ts +85 -0
  731. package/src/fonts/fallbacks.ts +0 -23
  732. package/src/fonts/google.ts +63 -8
  733. package/src/fonts/local.ts +9 -8
  734. package/src/fonts/paths.ts +58 -0
  735. package/src/fonts/pipeline.ts +316 -0
  736. package/src/fonts/transform.ts +305 -0
  737. package/src/fonts/types.ts +52 -1
  738. package/src/fonts/virtual-modules.ts +179 -0
  739. package/src/index.ts +431 -352
  740. package/src/params/codec-registry.ts +34 -0
  741. package/src/params/define-schema.ts +115 -0
  742. package/src/params/index.ts +17 -0
  743. package/src/params/resolve-schema.ts +84 -0
  744. package/src/plugin-context.ts +378 -0
  745. package/src/plugins/adapter-build.ts +98 -4
  746. package/src/plugins/build-manifest.ts +168 -23
  747. package/src/plugins/build-report.ts +253 -35
  748. package/src/plugins/cache.ts +186 -0
  749. package/src/plugins/callsite-ast.ts +167 -0
  750. package/src/plugins/callsite-jsx.ts +243 -0
  751. package/src/plugins/chunks.ts +74 -5
  752. package/src/plugins/client-chunks.ts +144 -0
  753. package/src/plugins/cloudflare-wasm.ts +141 -0
  754. package/src/plugins/content.ts +1 -1
  755. package/src/plugins/dev-server.ts +293 -46
  756. package/src/plugins/entries.ts +129 -8
  757. package/src/plugins/fonts.ts +191 -664
  758. package/src/plugins/mdx.ts +47 -10
  759. package/src/plugins/prebuilt-capture.ts +210 -0
  760. package/src/plugins/prebuilt.ts +700 -0
  761. package/src/plugins/prerender-sugar.ts +329 -0
  762. package/src/plugins/routing.ts +237 -241
  763. package/src/plugins/server-bundle.ts +97 -12
  764. package/src/plugins/shims.ts +217 -64
  765. package/src/plugins/static-build.ts +15 -90
  766. package/src/routing/codegen-shared.ts +115 -0
  767. package/src/routing/codegen-types.ts +65 -0
  768. package/src/routing/codegen.ts +360 -178
  769. package/src/routing/convention-lint.ts +394 -0
  770. package/src/routing/export-detect.ts +304 -0
  771. package/src/routing/file-cache.ts +23 -0
  772. package/src/routing/index.ts +10 -1
  773. package/src/routing/interception.ts +3 -22
  774. package/src/routing/link-codegen.ts +310 -0
  775. package/src/routing/manifest-codegen.ts +281 -0
  776. package/src/routing/scanner.ts +248 -188
  777. package/src/routing/schema-validation.ts +149 -0
  778. package/src/routing/segment-classify.ts +188 -0
  779. package/src/routing/segment-codegen.ts +98 -0
  780. package/src/routing/types.ts +78 -25
  781. package/src/routing/walkers.ts +90 -0
  782. package/src/rsc-runtime/rsc.ts +9 -0
  783. package/src/rsc-runtime/ssr.ts +50 -0
  784. package/src/rsc-runtime/vendor-types.d.ts +7 -0
  785. package/src/schema-bridge.ts +252 -0
  786. package/src/search-params/define.ts +570 -0
  787. package/src/search-params/index.ts +14 -20
  788. package/src/search-params/registry.ts +2 -2
  789. package/src/search-params/wrappers.ts +110 -0
  790. package/src/segment-params/define.ts +249 -0
  791. package/src/segment-params/index.ts +9 -0
  792. package/src/server/access-gate.tsx +84 -34
  793. package/src/server/action-client.ts +119 -28
  794. package/src/server/action-encryption.ts +144 -0
  795. package/src/server/action-handler.ts +123 -33
  796. package/src/server/actions.ts +39 -54
  797. package/src/server/als-registry.ts +129 -20
  798. package/src/server/asset-headers.ts +15 -37
  799. package/src/server/body-limits.ts +10 -2
  800. package/src/server/build-manifest.ts +13 -56
  801. package/src/server/canonicalize.ts +6 -3
  802. package/src/server/coalesce-tick.ts +75 -0
  803. package/src/server/compress.ts +34 -7
  804. package/src/server/cookie-context.ts +484 -0
  805. package/src/server/cookie-parsing.ts +163 -0
  806. package/src/server/csrf.ts +39 -6
  807. package/src/server/default-logger.ts +99 -0
  808. package/src/server/deny-boundary.ts +311 -0
  809. package/src/server/deny-renderer.ts +85 -77
  810. package/src/server/dev-source-map.ts +31 -0
  811. package/src/server/early-hints-sender.ts +3 -2
  812. package/src/server/early-hints.ts +37 -27
  813. package/src/server/error-boundary-wrapper.ts +61 -22
  814. package/src/server/fallback-error.ts +79 -102
  815. package/src/server/flight-injection-state.ts +113 -0
  816. package/src/server/flight-scripts.ts +62 -0
  817. package/src/server/form-data.ts +124 -12
  818. package/src/server/html-injector-core.ts +437 -0
  819. package/src/server/html-injectors.ts +267 -254
  820. package/src/server/index.ts +29 -183
  821. package/src/server/internal.ts +181 -0
  822. package/src/server/logger.ts +72 -36
  823. package/src/server/metadata-routes.ts +44 -19
  824. package/src/server/middleware-runner.ts +75 -4
  825. package/src/server/node-stream-transforms.ts +331 -0
  826. package/src/server/param-coercion.ts +206 -0
  827. package/src/server/pipeline-helpers.ts +204 -0
  828. package/src/server/pipeline-interception.ts +32 -18
  829. package/src/server/pipeline-metadata.ts +14 -0
  830. package/src/server/pipeline-outcome.ts +197 -0
  831. package/src/server/pipeline-phases.ts +538 -0
  832. package/src/server/pipeline.ts +226 -382
  833. package/src/server/port-resolution.ts +215 -0
  834. package/src/server/prebuilt/cache-key.ts +224 -0
  835. package/src/server/prebuilt/capture-state.ts +89 -0
  836. package/src/server/prebuilt/manifest-tag-index.ts +46 -0
  837. package/src/server/prebuilt/overlay.ts +256 -0
  838. package/src/server/prebuilt/payload-source.ts +201 -0
  839. package/src/server/prebuilt/synthetic-store.ts +121 -0
  840. package/src/server/prebuilt-builder.ts +696 -0
  841. package/src/server/prebuilt-runtime.ts +708 -0
  842. package/src/server/primitives.ts +155 -63
  843. package/src/server/render-timeout.ts +108 -0
  844. package/src/server/render-utils.ts +31 -0
  845. package/src/server/request-context.ts +168 -337
  846. package/src/server/route-element-builder.ts +523 -233
  847. package/src/server/route-handler.ts +31 -4
  848. package/src/server/route-matcher.ts +144 -277
  849. package/src/server/rsc-entry/action-middleware-runner.ts +167 -0
  850. package/src/server/rsc-entry/api-handler.ts +69 -32
  851. package/src/server/rsc-entry/error-renderer.ts +306 -89
  852. package/src/server/rsc-entry/helpers.ts +160 -76
  853. package/src/server/rsc-entry/index.ts +393 -329
  854. package/src/server/rsc-entry/render-route.ts +284 -0
  855. package/src/server/rsc-entry/revalidate-renderer.ts +349 -0
  856. package/src/server/rsc-entry/rsc-payload.ts +72 -33
  857. package/src/server/rsc-entry/rsc-stream.ts +85 -13
  858. package/src/server/rsc-entry/ssr-bridge.ts +18 -5
  859. package/src/server/rsc-entry/ssr-renderer.ts +273 -43
  860. package/src/server/rsc-entry/wrap-action-dispatch.ts +449 -0
  861. package/src/server/safe-load.ts +60 -0
  862. package/src/server/sensitive-fields.ts +230 -0
  863. package/src/server/sitemap-generator.ts +344 -0
  864. package/src/server/sitemap-handler.ts +157 -0
  865. package/src/server/slot-resolver.ts +258 -257
  866. package/src/server/ssr-bridge-types.ts +124 -0
  867. package/src/server/ssr-entry.ts +206 -78
  868. package/src/server/ssr-render.ts +345 -82
  869. package/src/server/ssr-wrappers.tsx +141 -0
  870. package/src/server/state-tree-diff.ts +30 -23
  871. package/src/server/status-code-resolver.ts +115 -130
  872. package/src/server/stream-utils.ts +286 -0
  873. package/src/server/tracing.ts +126 -14
  874. package/src/server/tree-builder.ts +204 -90
  875. package/src/server/tree-match.ts +220 -0
  876. package/src/server/types.ts +78 -9
  877. package/src/server/utils/escape-html.ts +20 -0
  878. package/src/server/utils/mdx-file.ts +22 -0
  879. package/src/server/version-skew.ts +104 -0
  880. package/src/server/workers-cache-bridge.ts +33 -0
  881. package/src/shared/href-validation.ts +159 -0
  882. package/src/shared/merge-search-params.ts +55 -0
  883. package/src/shared/redirect-type.ts +17 -0
  884. package/src/shims/font-google.ts +1 -1
  885. package/src/shims/font-local.ts +34 -0
  886. package/src/shims/headers.ts +122 -1
  887. package/src/shims/navigation-client.ts +51 -29
  888. package/src/shims/navigation.ts +14 -7
  889. package/src/utils/state-machine.ts +111 -0
  890. package/dist/_chunks/als-registry-B7DbZ2hS.js +0 -41
  891. package/dist/_chunks/als-registry-B7DbZ2hS.js.map +0 -1
  892. package/dist/_chunks/debug-B3Gypr3D.js +0 -108
  893. package/dist/_chunks/debug-B3Gypr3D.js.map +0 -1
  894. package/dist/_chunks/format-RyoGQL74.js +0 -164
  895. package/dist/_chunks/format-RyoGQL74.js.map +0 -1
  896. package/dist/_chunks/interception-BOoWmLUA.js +0 -676
  897. package/dist/_chunks/interception-BOoWmLUA.js.map +0 -1
  898. package/dist/_chunks/metadata-routes-Cjmvi3rQ.js.map +0 -1
  899. package/dist/_chunks/request-context-BQUC8PHn.js +0 -330
  900. package/dist/_chunks/request-context-BQUC8PHn.js.map +0 -1
  901. package/dist/_chunks/ssr-data-MjmprTmO.js.map +0 -1
  902. package/dist/_chunks/tracing-CemImE6h.js +0 -187
  903. package/dist/_chunks/tracing-CemImE6h.js.map +0 -1
  904. package/dist/_chunks/use-cookie-DX-l1_5E.js +0 -91
  905. package/dist/_chunks/use-cookie-DX-l1_5E.js.map +0 -1
  906. package/dist/_chunks/use-query-states-D5KaffOK.js.map +0 -1
  907. package/dist/cache/index.js.map +0 -1
  908. package/dist/cache/register-cached-function.d.ts +0 -17
  909. package/dist/cache/register-cached-function.d.ts.map +0 -1
  910. package/dist/client/browser-entry.d.ts +0 -21
  911. package/dist/client/browser-entry.d.ts.map +0 -1
  912. package/dist/client/head.d.ts +0 -16
  913. package/dist/client/head.d.ts.map +0 -1
  914. package/dist/client/link-status-provider.d.ts +0 -11
  915. package/dist/client/link-status-provider.d.ts.map +0 -1
  916. package/dist/client/segment-merger.d.ts +0 -119
  917. package/dist/client/segment-merger.d.ts.map +0 -1
  918. package/dist/client/stale-reload.d.ts +0 -44
  919. package/dist/client/stale-reload.d.ts.map +0 -1
  920. package/dist/client/transition-root.d.ts +0 -74
  921. package/dist/client/transition-root.d.ts.map +0 -1
  922. package/dist/client/use-navigation-pending.d.ts +0 -26
  923. package/dist/client/use-navigation-pending.d.ts.map +0 -1
  924. package/dist/client/use-params.d.ts.map +0 -1
  925. package/dist/plugins/cache-transform.d.ts +0 -36
  926. package/dist/plugins/cache-transform.d.ts.map +0 -1
  927. package/dist/plugins/dev-error-overlay.d.ts +0 -60
  928. package/dist/plugins/dev-error-overlay.d.ts.map +0 -1
  929. package/dist/plugins/dev-logs.d.ts.map +0 -1
  930. package/dist/plugins/dynamic-transform.d.ts +0 -72
  931. package/dist/plugins/dynamic-transform.d.ts.map +0 -1
  932. package/dist/plugins/server-action-exports.d.ts +0 -26
  933. package/dist/plugins/server-action-exports.d.ts.map +0 -1
  934. package/dist/routing/status-file-lint.d.ts +0 -33
  935. package/dist/routing/status-file-lint.d.ts.map +0 -1
  936. package/dist/search-params/analyze.d.ts +0 -54
  937. package/dist/search-params/analyze.d.ts.map +0 -1
  938. package/dist/search-params/builtin-codecs.d.ts +0 -105
  939. package/dist/search-params/builtin-codecs.d.ts.map +0 -1
  940. package/dist/search-params/codecs.d.ts +0 -53
  941. package/dist/search-params/codecs.d.ts.map +0 -1
  942. package/dist/search-params/create.d.ts +0 -106
  943. package/dist/search-params/create.d.ts.map +0 -1
  944. package/dist/server/client-module-map.d.ts +0 -47
  945. package/dist/server/client-module-map.d.ts.map +0 -1
  946. package/dist/server/dev-fetch-instrumentation.d.ts +0 -22
  947. package/dist/server/dev-fetch-instrumentation.d.ts.map +0 -1
  948. package/dist/server/dev-logger.d.ts.map +0 -1
  949. package/dist/server/dev-span-processor.d.ts +0 -29
  950. package/dist/server/dev-span-processor.d.ts.map +0 -1
  951. package/dist/server/dev-warnings.d.ts +0 -129
  952. package/dist/server/dev-warnings.d.ts.map +0 -1
  953. package/dist/server/flush.d.ts +0 -74
  954. package/dist/server/flush.d.ts.map +0 -1
  955. package/dist/server/manifest-status-resolver.d.ts +0 -58
  956. package/dist/server/manifest-status-resolver.d.ts.map +0 -1
  957. package/dist/server/prerender.d.ts +0 -77
  958. package/dist/server/prerender.d.ts.map +0 -1
  959. package/dist/utils/directive-parser.d.ts +0 -70
  960. package/dist/utils/directive-parser.d.ts.map +0 -1
  961. package/src/cache/register-cached-function.ts +0 -103
  962. package/src/client/browser-entry.ts +0 -678
  963. package/src/client/head.ts +0 -61
  964. package/src/client/link-status-provider.tsx +0 -30
  965. package/src/client/segment-merger.ts +0 -339
  966. package/src/client/stale-reload.ts +0 -87
  967. package/src/client/transition-root.tsx +0 -166
  968. package/src/client/use-navigation-pending.ts +0 -38
  969. package/src/plugins/cache-transform.ts +0 -199
  970. package/src/plugins/dev-error-overlay.ts +0 -230
  971. package/src/plugins/dynamic-transform.ts +0 -161
  972. package/src/plugins/server-action-exports.ts +0 -220
  973. package/src/routing/status-file-lint.ts +0 -112
  974. package/src/search-params/analyze.ts +0 -192
  975. package/src/search-params/builtin-codecs.ts +0 -228
  976. package/src/search-params/codecs.ts +0 -153
  977. package/src/search-params/create.ts +0 -321
  978. package/src/server/client-module-map.ts +0 -58
  979. package/src/server/dev-fetch-instrumentation.ts +0 -96
  980. package/src/server/dev-span-processor.ts +0 -78
  981. package/src/server/dev-warnings.ts +0 -283
  982. package/src/server/flush.ts +0 -182
  983. package/src/server/manifest-status-resolver.ts +0 -215
  984. package/src/server/prerender.ts +0 -139
  985. package/src/utils/directive-parser.ts +0 -529
@@ -0,0 +1,708 @@
1
+ /**
2
+ * Prebuilt component runtime — registration target for the timber-prebuilt
3
+ * transform (plugins/prebuilt.ts) and the request-time half of
4
+ * cache.component (TIM-1140).
5
+ *
6
+ * `cache.component(fn, opts)` call sites are rewritten at build time to
7
+ * `__prebuilt(stableId, fn, opts)` (production) or `__prebuiltDev(name, fn)`
8
+ * (dev). Both are exported via #server-internal — they are framework
9
+ * plumbing, never called by user code directly.
10
+ *
11
+ * Cache hits are served by FLIGHT REVIVAL: the cached `.flight` payload is
12
+ * decoded back into React elements inside the RSC environment with
13
+ * `createFromReadableStream` (the flight client running in the flight
14
+ * server — plugin-rsc wires the server-decode manifest so client
15
+ * references revive as re-serializable reference proxies). The revived
16
+ * element is returned from the wrapper and the outer render re-serializes
17
+ * it like any other subtree. This is the same mechanism as Next.js
18
+ * `"use cache"` (next/src/server/use-cache/use-cache-wrapper.ts).
19
+ *
20
+ * What a hit skips: all user work — data fetching, MDX compilation, the
21
+ * component function itself never runs. What it re-pays: React
22
+ * re-serializes the already-resolved tree (cost proportional to payload
23
+ * size, not to data latency). The alternative — splicing raw payload bytes
24
+ * into the outer stream — avoids re-serialization but requires byte-level
25
+ * coupling to the flight wire format (row framing, ID rebasing, marker
26
+ * detection); it was implemented and reviewed on PR #835 and deliberately
27
+ * replaced by revival. See design/44-render-at-build-time.md
28
+ * §Request-Time Injection.
29
+ *
30
+ * Misses render the original component live via the wrapper's own closure,
31
+ * inside the React pass — segment params from ALS, deny()/redirect()
32
+ * signals, Suspense, and error boundaries behave exactly as an unwrapped
33
+ * component. `fallbackOnMissingSegmentParams: false` throws instead.
34
+ */
35
+
36
+ import { createElement } from 'react';
37
+
38
+ import { requestContextAls, type RequestContextStore } from './als-registry.js';
39
+ import { computeComponentCacheKey, tryCanonicalize } from './prebuilt/cache-key.js';
40
+ import {
41
+ isCaptureActive,
42
+ noteWrapperRender,
43
+ beginCapture,
44
+ endCapture,
45
+ } from './prebuilt/capture-state.js';
46
+ import {
47
+ hasPrebuiltPayloadSource,
48
+ lookupPrebuiltPayload,
49
+ getManifestEntry,
50
+ isParamIndependent,
51
+ } from './prebuilt/payload-source.js';
52
+ import { lookupOverlay, storeOverlayEntry, overlayKey } from './prebuilt/overlay.js';
53
+ import { getWaitUntil } from './waituntil-bridge.js';
54
+ import { createSingleflight } from '../cache/singleflight.js';
55
+ import {
56
+ currentInvalidationEpoch,
57
+ wasInvalidatedSince,
58
+ lastInvalidationEpochFor,
59
+ } from '../cache/invalidation-epoch.js';
60
+
61
+ /** Default timeout for component re-renders (overridden by renderTimeoutMs). */
62
+ const DEFAULT_COMPONENT_TIMEOUT_MS = 30_000;
63
+
64
+ /** Singleflight for component re-renders (inline and background). */
65
+ let componentSingleflight = createSingleflight({ timeoutMs: DEFAULT_COMPONENT_TIMEOUT_MS });
66
+ let componentTimeoutMs = DEFAULT_COMPONENT_TIMEOUT_MS;
67
+
68
+ /**
69
+ * Set the timeout for component re-render captures. Called at boot from
70
+ * the RSC entry with renderTimeoutMs from timber.config.ts.
71
+ */
72
+ export function setComponentRefreshTimeout(timeoutMs: number): void {
73
+ componentTimeoutMs = timeoutMs;
74
+ componentSingleflight = createSingleflight({ timeoutMs });
75
+ }
76
+
77
+ let warnedNoWaitUntil = false;
78
+
79
+ /**
80
+ * Options captured from the `cache.component(fn, opts)` call site.
81
+ *
82
+ * `prerender`/`ttl`/`tags` (design/45) are carried through untouched — the
83
+ * build phase (TIM-1119) and runtime overlay (design/45 phase 3) consume
84
+ * them.
85
+ */
86
+ export interface PrebuiltComponentOptions {
87
+ /** Populate the cache at build time via generateStaticSegmentParams. */
88
+ prerender?: boolean;
89
+ /** Runtime freshness window, seconds (design/45 runtime tier). */
90
+ ttl?: number;
91
+ /** Runtime invalidation tags (design/45 runtime tier). */
92
+ tags?: string[] | ((props: Record<string, unknown>) => string[]);
93
+ /** Serve stale while a background re-render refreshes (design/45 §SWR). */
94
+ staleWhileRevalidate?: boolean;
95
+ /**
96
+ * On a cache miss, render the component live (default: true). When false,
97
+ * a miss throws instead — for sites that must never render unknown params
98
+ * dynamically. See design/44 §fallbackOnMissingSegmentParams.
99
+ */
100
+ fallbackOnMissingSegmentParams?: boolean;
101
+ }
102
+
103
+ /** An async server component: props in, renderable out. */
104
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
105
+ type ServerComponent = (props: any) => unknown;
106
+
107
+ /**
108
+ * View of a ServerComponent that satisfies createElement's overloads.
109
+ * Server components legitimately return `unknown` from the framework's
110
+ * perspective (promises, elements, strings, …) — React renders whatever
111
+ * comes back; the narrowing exists only to cross createElement's
112
+ * ReactNode-typed signature.
113
+ */
114
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
115
+ type RenderableComponent = (props: any) => React.ReactNode;
116
+
117
+ export interface PrebuiltRegistration {
118
+ id: string;
119
+ component: ServerComponent;
120
+ options: PrebuiltComponentOptions;
121
+ }
122
+
123
+ /**
124
+ * Server-side component registry, keyed by stable component ID. Populated at
125
+ * module load time by `__prebuilt` calls; consumed by the post-build capture
126
+ * pass (TIM-1119). Never serialized — component functions are not
127
+ * Flight-serializable.
128
+ */
129
+ const registry = new Map<string, PrebuiltRegistration>();
130
+
131
+ /**
132
+ * Resolve the params the cache key may faithfully hash, or null if this
133
+ * render is unkeyable.
134
+ *
135
+ * A wrapper rendered inside a parallel slot reads params merged with that
136
+ * slot's overrides (`getSegmentParams`: `{...segmentParams, ...slotParams}`)
137
+ * — but the cache key hashes only the route-level params, and the wrapper
138
+ * cannot know which slot it renders under. The route params are usable
139
+ * only when every slot's merged view canonicalizes identically to them;
140
+ * otherwise two renders with the same key could see different effective
141
+ * inputs and a hit could serve the WRONG cached subtree — so the render
142
+ * goes live: slower, never wrong. (Build-time capture doesn't model slot
143
+ * params either, so a divergent request could never have a faithful
144
+ * entry. Codex review on PR #835; revisit with segment-path-scoped keys
145
+ * if slot-scoped prebuilt is ever needed.)
146
+ *
147
+ * Comparison happens through `tryCanonicalize` — the same single
148
+ * definition of value equality the cache key uses — so anything it
149
+ * cannot represent faithfully (bigint-coerced codec params, accessors,
150
+ * aliases, …) is unkeyable here too, and this guard can never throw.
151
+ */
152
+ function resolveKeyParams(store: {
153
+ segmentParams?: Record<string, string | string[]>;
154
+ slotParamsMap?: Map<string, Record<string, string | string[]>>;
155
+ }): Record<string, string | string[]> | null {
156
+ const main = store.segmentParams ?? {};
157
+ const map = store.slotParamsMap;
158
+ if (!map || map.size === 0) return main;
159
+ // Spread before canonicalizing: param records are framework-produced
160
+ // Object.create(null) objects (prototype-pollution defense) — normalize
161
+ // the records themselves, let nested values face the full allowlist.
162
+ const mainCanonical = tryCanonicalize({ ...main });
163
+ if (mainCanonical === null) return null;
164
+ for (const slotParams of map.values()) {
165
+ const merged = tryCanonicalize({ ...main, ...slotParams });
166
+ if (merged === null || merged !== mainCanonical) return null;
167
+ }
168
+ return main;
169
+ }
170
+
171
+ /** Wrap payload bytes as a single-chunk ReadableStream for the decoder. */
172
+ function bytesToStream(bytes: Uint8Array): ReadableStream<Uint8Array> {
173
+ return new ReadableStream<Uint8Array>({
174
+ start(controller) {
175
+ controller.enqueue(bytes);
176
+ controller.close();
177
+ },
178
+ });
179
+ }
180
+
181
+ /** Whether the component has a runtime lifetime (ttl or tags). */
182
+ function hasRuntimeLifetime(options: PrebuiltComponentOptions): boolean {
183
+ return options.ttl !== undefined || (options.tags !== undefined && options.tags !== null);
184
+ }
185
+
186
+ /** Resolve tags from options (may be static array or function of props). */
187
+ function resolveTags(options: PrebuiltComponentOptions, props: Record<string, unknown>): string[] {
188
+ if (!options.tags) return [];
189
+ if (Array.isArray(options.tags)) return options.tags;
190
+ return options.tags(props);
191
+ }
192
+
193
+ // ─── RSC function injection ─────────────────────────────────────────────
194
+ // The flight client/server is only resolvable in the RSC environment
195
+ // (react-server condition). The RSC entry wires these at boot via
196
+ // setRscFunctions(); tests inject mocks directly. Same pattern as
197
+ // setCacheHandler / setPrebuiltPayloadSource.
198
+
199
+ interface RscFunctions {
200
+ createFromReadableStream: (stream: ReadableStream<Uint8Array>) => Promise<unknown>;
201
+ renderToReadableStream: (
202
+ element: unknown,
203
+ options?: { onError?: (error: unknown) => string }
204
+ ) => ReadableStream<Uint8Array>;
205
+ }
206
+
207
+ let rscFns: RscFunctions | null = null;
208
+
209
+ /**
210
+ * Wire the RSC flight client/server functions. Called once at server
211
+ * startup from the RSC entry module.
212
+ */
213
+ export function setRscFunctions(fns: RscFunctions): void {
214
+ rscFns = fns;
215
+ }
216
+
217
+ function requireRscFunctions(): RscFunctions {
218
+ if (!rscFns) {
219
+ throw new Error('[timber] RSC functions not wired — setRscFunctions() must be called at boot');
220
+ }
221
+ return rscFns;
222
+ }
223
+
224
+ /**
225
+ * Revive flight payload bytes into a React element.
226
+ * Returns null on any failure (corrupt payload, missing decoder).
227
+ */
228
+ async function revivePayload(
229
+ id: string,
230
+ payload: Uint8Array,
231
+ outcome: string
232
+ ): Promise<{ element: unknown } | null> {
233
+ try {
234
+ const { createFromReadableStream } = requireRscFunctions();
235
+ const element: unknown = await createFromReadableStream(bytesToStream(payload));
236
+ return { element };
237
+ } catch (error) {
238
+ console.error(`[timber] failed to revive prebuilt payload for "${id}" — ${outcome}:`, error);
239
+ return null;
240
+ }
241
+ }
242
+
243
+ /** Ceiling on component re-render capture (design/13 A2). Uses configured renderTimeoutMs. */
244
+ function getCaptureTimeoutMs(): number {
245
+ return componentTimeoutMs;
246
+ }
247
+
248
+ // ─── Key-discipline warnings (design/45 §Enforcement) ───────────────────
249
+
250
+ export const keyDisciplineWarned = new Set<string>();
251
+
252
+ const REQUEST_CONTEXT_FIELDS: Record<string, string> = {
253
+ headers: 'headers()',
254
+ parsedCookies: 'cookies()',
255
+ searchParams: 'searchParams',
256
+ };
257
+
258
+ /**
259
+ * Wrap a store with a proxy that records per-request field access.
260
+ * The proxy forwards all reads/writes transparently — it only observes.
261
+ */
262
+ function createKeyDisciplineProxy(store: RequestContextStore): {
263
+ proxy: RequestContextStore;
264
+ accessedApis: Set<string>;
265
+ } {
266
+ const accessedApis = new Set<string>();
267
+ const proxy = new Proxy(store, {
268
+ get(target, prop, receiver) {
269
+ const api = REQUEST_CONTEXT_FIELDS[prop as string];
270
+ if (api) accessedApis.add(api);
271
+ return Reflect.get(target, prop, receiver);
272
+ },
273
+ });
274
+ return { proxy, accessedApis };
275
+ }
276
+
277
+ function emitKeyDisciplineWarning(id: string, apis: Set<string>): void {
278
+ if (keyDisciplineWarned.has(id)) return;
279
+ keyDisciplineWarned.add(id);
280
+ const apiList = Array.from(apis).join(', ');
281
+ console.warn(
282
+ `[timber] cache.component key-discipline warning: "${id}" reads ${apiList} ` +
283
+ `but the cache key is computed from props and segment params only. ` +
284
+ `If the output varies by ${apiList}, different users may see each ` +
285
+ `other's cached content. Either pass request-derived values as ` +
286
+ `props (included in the cache key) or remove the ${apiList} call.`
287
+ );
288
+ }
289
+
290
+ /**
291
+ * Render a component in isolation and capture its flight payload bytes.
292
+ * Used for inline re-renders (tombstone/miss) and SWR background re-renders.
293
+ *
294
+ * The stream read is timeout-guarded and the reader is cancelled on
295
+ * expiry (design/13 A2, A3).
296
+ */
297
+ async function captureComponentPayload(
298
+ id: string,
299
+ component: ServerComponent,
300
+ props: Record<string, unknown>
301
+ ): Promise<Uint8Array> {
302
+ const { renderToReadableStream } = requireRscFunctions();
303
+ const element = createElement(component as RenderableComponent, props);
304
+ // Activate capture state so nested cache.component wrappers render live
305
+ // (bake flat into this entry) per design/45 §Nesting Semantics.
306
+ // beginCapture/endCapture MUST be in the same try/finally to prevent
307
+ // leaked capture state on early throws.
308
+ let renderErrored = false;
309
+
310
+ // Key-discipline diagnostic (design/45 §Enforcement): proxy the ALS
311
+ // store to detect request-context reads during the capture render.
312
+ // The proxy is transparent — it never blocks or throws; it only observes.
313
+ const store = requestContextAls.getStore();
314
+ const discipline = store && !keyDisciplineWarned.has(id) ? createKeyDisciplineProxy(store) : null;
315
+
316
+ const doCapture = async (): Promise<Uint8Array> => {
317
+ beginCapture(id);
318
+ try {
319
+ const stream: ReadableStream<Uint8Array> = renderToReadableStream(element, {
320
+ onError() {
321
+ renderErrored = true;
322
+ return '';
323
+ },
324
+ });
325
+ const reader = stream.getReader();
326
+ const chunks: Uint8Array[] = [];
327
+ let totalLength = 0;
328
+ const deadline = Date.now() + getCaptureTimeoutMs();
329
+ try {
330
+ for (;;) {
331
+ const remaining = deadline - Date.now();
332
+ if (remaining <= 0) {
333
+ throw new Error(
334
+ `[timber] component re-render capture exceeded ${getCaptureTimeoutMs()}ms`
335
+ );
336
+ }
337
+ let timer: ReturnType<typeof setTimeout> | undefined;
338
+ const { done, value } = await Promise.race([
339
+ reader.read(),
340
+ new Promise<never>((_, reject) => {
341
+ timer = setTimeout(
342
+ () => reject(new Error(`[timber] component re-render stream read timed out`)),
343
+ remaining
344
+ );
345
+ }),
346
+ ]);
347
+ clearTimeout(timer);
348
+ if (done) break;
349
+ chunks.push(value);
350
+ totalLength += value.byteLength;
351
+ }
352
+ } finally {
353
+ reader.cancel().catch(() => {});
354
+ }
355
+ if (renderErrored) {
356
+ throw new Error('[timber] component re-render produced error rows — not caching');
357
+ }
358
+ const result = new Uint8Array(totalLength);
359
+ let offset = 0;
360
+ for (const chunk of chunks) {
361
+ result.set(chunk, offset);
362
+ offset += chunk.byteLength;
363
+ }
364
+ return result;
365
+ } finally {
366
+ endCapture();
367
+ }
368
+ };
369
+
370
+ const bytes = discipline
371
+ ? await requestContextAls.run(discipline.proxy, doCapture)
372
+ : await doCapture();
373
+
374
+ if (discipline && discipline.accessedApis.size > 0) {
375
+ emitKeyDisciplineWarning(id, discipline.accessedApis);
376
+ }
377
+
378
+ return bytes;
379
+ }
380
+
381
+ /**
382
+ * Inline re-render: capture flight bytes, store in overlay, revive for
383
+ * the current request. Singleflight-coalesced by overlay key.
384
+ */
385
+ async function inlineRerender(
386
+ id: string,
387
+ component: ServerComponent,
388
+ props: Record<string, unknown>,
389
+ cacheKey: string,
390
+ options: PrebuiltComponentOptions,
391
+ hasSeed: boolean,
392
+ outcome: string
393
+ ): Promise<{ element: unknown } | null> {
394
+ const tags = resolveTags(options, props);
395
+ const oKey = overlayKey(id, cacheKey);
396
+ const sfKey = `prebuilt:${id}:${cacheKey}\0${lastInvalidationEpochFor(oKey, tags)}`;
397
+
398
+ try {
399
+ const payload = await componentSingleflight.do(sfKey, async (signal) => {
400
+ const startEpoch = currentInvalidationEpoch();
401
+ const bytes = await captureComponentPayload(id, component, props);
402
+ // Skip the store if aborted (singleflight timeout) or if the
403
+ // key/tags were invalidated while rendering (TIM-1028 guard).
404
+ if (
405
+ !signal.aborted &&
406
+ hasRuntimeLifetime(options) &&
407
+ !wasInvalidatedSince(startEpoch, oKey, tags)
408
+ ) {
409
+ await storeOverlayEntry(id, cacheKey, bytes, {
410
+ ttl: options.ttl,
411
+ tags,
412
+ hasSeed,
413
+ });
414
+ }
415
+ return bytes;
416
+ });
417
+ return await revivePayload(id, payload, outcome);
418
+ } catch (error) {
419
+ console.error(`[timber] cache.component re-render failed for "${id}" — ${outcome}:`, error);
420
+ return null;
421
+ }
422
+ }
423
+
424
+ /**
425
+ * Snapshot the request context values needed for a background re-render.
426
+ * Creates a FRESH store with copied values — the original ALS store is
427
+ * not referenced after capture.
428
+ */
429
+ function snapshotRequestContext(store: RequestContextStore): RequestContextStore {
430
+ return {
431
+ headers: new Headers(store.headers),
432
+ originalHeaders: new Headers(store.originalHeaders),
433
+ cookieHeader: store.cookieHeader,
434
+ parsedCookies: store.parsedCookies ? new Map(store.parsedCookies) : undefined,
435
+ searchParams: new URLSearchParams(store.searchParams),
436
+ searchString: store.searchString,
437
+ segmentParams: store.segmentParams ? { ...store.segmentParams } : undefined,
438
+ cookieJar: new Map(),
439
+ flushed: false,
440
+ mutableContext: false,
441
+ };
442
+ }
443
+
444
+ /**
445
+ * Kick off a background re-render via waitUntil. The re-render runs inside
446
+ * a fresh ALS scope with snapshotted request context.
447
+ */
448
+ function backgroundRerender(
449
+ id: string,
450
+ component: ServerComponent,
451
+ props: Record<string, unknown>,
452
+ cacheKey: string,
453
+ options: PrebuiltComponentOptions,
454
+ hasSeed: boolean,
455
+ snapshot: RequestContextStore
456
+ ): void {
457
+ const waitUntil = getWaitUntil();
458
+ const tags = resolveTags(options, props);
459
+ const oKey = overlayKey(id, cacheKey);
460
+ const startEpoch = currentInvalidationEpoch();
461
+ const sfKey = `prebuilt-bg:${id}:${cacheKey}\0${lastInvalidationEpochFor(oKey, tags)}`;
462
+
463
+ const work = requestContextAls.run(snapshot, () =>
464
+ componentSingleflight
465
+ .do(sfKey, async (signal) => {
466
+ const bytes = await captureComponentPayload(id, component, props);
467
+ if (!signal.aborted && !wasInvalidatedSince(startEpoch, oKey, tags)) {
468
+ await storeOverlayEntry(id, cacheKey, bytes, {
469
+ ttl: options.ttl,
470
+ tags,
471
+ hasSeed,
472
+ });
473
+ }
474
+ })
475
+ .catch((error) => {
476
+ console.error(`[timber] cache.component background re-render failed for "${id}":`, error);
477
+ })
478
+ );
479
+
480
+ if (waitUntil) {
481
+ waitUntil(work);
482
+ } else if (!warnedNoWaitUntil) {
483
+ warnedNoWaitUntil = true;
484
+ console.warn(
485
+ '[timber] cache.component SWR background re-render has no waitUntil — ' +
486
+ 'the re-render may be killed when the handler returns on serverless platforms. ' +
487
+ 'Ensure the adapter wires runWithWaitUntil().'
488
+ );
489
+ }
490
+ }
491
+
492
+ /**
493
+ * Try to serve this render from the prebuilt cache: overlay → artifact →
494
+ * live render. Handles ISR (SWR, tombstones, re-renders) per design/45.
495
+ *
496
+ * Null on any miss — the caller renders live.
497
+ */
498
+ async function tryRevivePayload(
499
+ id: string,
500
+ options: PrebuiltComponentOptions,
501
+ props: Record<string, unknown>
502
+ ): Promise<{ element: unknown } | null> {
503
+ const hasSource = hasPrebuiltPayloadSource();
504
+ const hasRuntime = hasRuntimeLifetime(options);
505
+ if (!hasSource && !hasRuntime) return null;
506
+
507
+ const store = requestContextAls.getStore();
508
+ if (!store) return null;
509
+ const paramIndep = options.prerender ? await isParamIndependent(id) : false;
510
+ const keyParams = paramIndep ? {} : resolveKeyParams(store);
511
+ if (keyParams === null) return null;
512
+
513
+ const cacheKey = computeComponentCacheKey(props ?? {}, keyParams);
514
+ if (cacheKey === null) return null;
515
+
516
+ const outcome =
517
+ options.fallbackOnMissingSegmentParams === false
518
+ ? 'failing the render (fallbackOnMissingSegmentParams: false)'
519
+ : 'rendering dynamically';
520
+
521
+ const registration = registry.get(id);
522
+ const component = registration?.component;
523
+
524
+ // ─── Step 1: Check overlay (CacheHandler) ─────────────────────────
525
+ if (hasRuntime) {
526
+ const overlayResult = await lookupOverlay(id, cacheKey);
527
+ if (overlayResult) {
528
+ const overlayHasSeed = overlayResult.record?.s ?? false;
529
+ if (overlayResult.kind === 'tombstone') {
530
+ if (component) {
531
+ return await inlineRerender(id, component, props, cacheKey, options, true, outcome);
532
+ }
533
+ return null;
534
+ }
535
+ if (overlayResult.kind === 'fresh' && overlayResult.payload) {
536
+ return await revivePayload(id, overlayResult.payload, outcome);
537
+ }
538
+ if (overlayResult.kind === 'stale' && overlayResult.payload) {
539
+ if (options.staleWhileRevalidate && component) {
540
+ backgroundRerender(
541
+ id,
542
+ component,
543
+ props,
544
+ cacheKey,
545
+ options,
546
+ overlayHasSeed,
547
+ snapshotRequestContext(store)
548
+ );
549
+ return await revivePayload(id, overlayResult.payload, outcome);
550
+ }
551
+ if (component) {
552
+ return await inlineRerender(
553
+ id,
554
+ component,
555
+ props,
556
+ cacheKey,
557
+ options,
558
+ overlayHasSeed,
559
+ outcome
560
+ );
561
+ }
562
+ return null;
563
+ }
564
+ }
565
+ }
566
+
567
+ // ─── Step 2: Check build artifact ─────────────────────────────────
568
+ if (hasSource) {
569
+ const artifactPayload = await lookupPrebuiltPayload(id, cacheKey);
570
+ if (artifactPayload !== null) {
571
+ // Check seed freshness when the component has a TTL.
572
+ if (options.ttl !== undefined) {
573
+ const entry = await getManifestEntry(id, cacheKey);
574
+ const buildTs = entry?.buildTimestamp ?? 0;
575
+ const seedAge = (Date.now() - buildTs) / 1000;
576
+ if (seedAge > options.ttl) {
577
+ // Stale seed
578
+ if (options.staleWhileRevalidate && component) {
579
+ backgroundRerender(
580
+ id,
581
+ component,
582
+ props,
583
+ cacheKey,
584
+ options,
585
+ true,
586
+ snapshotRequestContext(store)
587
+ );
588
+ return await revivePayload(id, artifactPayload, outcome);
589
+ }
590
+ if (component) {
591
+ return await inlineRerender(id, component, props, cacheKey, options, true, outcome);
592
+ }
593
+ // No component in registry — can't re-render; fall through to
594
+ // live render via the wrapper (design/45 step 3).
595
+ return null;
596
+ }
597
+ }
598
+ // Fresh seed (or no TTL — immutable until redeploy)
599
+ return await revivePayload(id, artifactPayload, outcome);
600
+ }
601
+
602
+ // Manifest miss
603
+ if (options.prerender) {
604
+ console.warn(
605
+ `[timber] cache.component cache miss: "${id}" with params ${JSON.stringify(
606
+ store.segmentParams ?? {}
607
+ )} — ${outcome}`
608
+ );
609
+ }
610
+ }
611
+
612
+ // ─── Step 3: Full miss with runtime lifetime — inline re-render ───
613
+ // Skip when fallbackOnMissingSegmentParams is false — that option means
614
+ // "only prebuilt content", so an unenumerated miss must throw (the
615
+ // wrapper handles the throw after we return null).
616
+ if (hasRuntime && component && options.fallbackOnMissingSegmentParams !== false) {
617
+ return await inlineRerender(id, component, props, cacheKey, options, false, outcome);
618
+ }
619
+
620
+ return null;
621
+ }
622
+
623
+ /**
624
+ * Production wrapper injected by the timber-prebuilt transform. Registers
625
+ * the component under its stable ID and returns a wrapper component that
626
+ * either revives the cached payload (hit) or renders the original
627
+ * component live (miss).
628
+ */
629
+ export function __prebuilt<C extends ServerComponent>(
630
+ id: string,
631
+ component: C,
632
+ options: PrebuiltComponentOptions = {}
633
+ ): C {
634
+ registry.set(id, { id, component, options });
635
+
636
+ const wrapper = async (props: Parameters<C>[0]) => {
637
+ // Build-time only: report this render to the active capture pass —
638
+ // cycle detection (throws) and nesting-clamp warnings (design/45
639
+ // §Nesting Semantics). A single null-check at request time.
640
+ noteWrapperRender(id, options);
641
+ if (isCaptureActive()) {
642
+ // Nested wrapper inside a build-time capture: render live so the
643
+ // subtree bakes flat into the enclosing entry (design/45 §Nesting).
644
+ // This deliberately bypasses fallbackOnMissingSegmentParams: false —
645
+ // that option means "never serve non-prebuilt content", and a
646
+ // build-time render IS prebuilt content; throwing here would
647
+ // spuriously fail the outer entry (codex P2 on PR #836).
648
+ return createElement(component as RenderableComponent, props as Record<string, unknown>);
649
+ }
650
+ const revived = await tryRevivePayload(id, options, props as Record<string, unknown>);
651
+ if (revived !== null) {
652
+ return revived.element;
653
+ }
654
+ if (options.fallbackOnMissingSegmentParams === false) {
655
+ throw new Error(
656
+ `[timber] cache.component "${id}": no prebuilt payload for the current params and fallbackOnMissingSegmentParams is false`
657
+ );
658
+ }
659
+ // Return an ELEMENT — React invokes the component itself, with its
660
+ // render dispatcher active. Calling component(props) here would run
661
+ // it after this wrapper's await, outside a dispatcher frame, breaking
662
+ // sync server components that call use() (codex review on PR #835).
663
+ return createElement(component as RenderableComponent, props as Record<string, unknown>);
664
+ };
665
+ Object.defineProperty(wrapper, 'name', { value: `Prebuilt(${id})` });
666
+ // Double cast, deliberately: C's return type may be narrower than the
667
+ // wrapper's (a sync component wrapped by an async function, or a revived
668
+ // subtree in place of C's exact JSX type). Callers only ever *render*
669
+ // the result — React treats any component returning ReactNode-compatible
670
+ // values identically — so widening through `unknown` is safe here and a
671
+ // direct cast would be rejected by the compiler for exactly the
672
+ // difference we intend.
673
+ return wrapper as unknown as C;
674
+ }
675
+
676
+ /** Look up a registration by stable component ID. */
677
+ export function getPrebuiltRegistration(id: string): PrebuiltRegistration | undefined {
678
+ return registry.get(id);
679
+ }
680
+
681
+ /** All registrations, for the post-build capture pass (TIM-1119). */
682
+ export function getPrebuiltRegistry(): ReadonlyMap<string, PrebuiltRegistration> {
683
+ return registry;
684
+ }
685
+
686
+ /**
687
+ * Dev-mode wrapper injected by the timber-prebuilt transform: a no-op that
688
+ * renders the component dynamically on every request, logging once per
689
+ * component on first render so the production behavior difference is visible.
690
+ * See design/44 §Dev Mode.
691
+ */
692
+ export function __prebuiltDev<C extends ServerComponent>(
693
+ name: string,
694
+ component: C,
695
+ _options?: PrebuiltComponentOptions
696
+ ): C {
697
+ let logged = false;
698
+ const wrapper = (props: Parameters<C>[0]) => {
699
+ if (!logged) {
700
+ logged = true;
701
+ console.log(`[timber] cache.component: "${name}" — rendering dynamically (dev mode)`);
702
+ }
703
+ // Element, not a direct call — same dispatcher reasoning as the
704
+ // production wrapper's live fallback.
705
+ return createElement(component as RenderableComponent, props as Record<string, unknown>);
706
+ };
707
+ return wrapper as C;
708
+ }