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

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 (998) hide show
  1. package/LICENSE +8 -0
  2. package/agent-skill.md +344 -0
  3. package/dist/_chunks/actions-cjklt63G.js +317 -0
  4. package/dist/_chunks/actions-cjklt63G.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-CzYUlgXA.js +1125 -0
  8. package/dist/_chunks/cache-api-CzYUlgXA.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-NfLbLnDw.js +638 -0
  12. package/dist/_chunks/cli-schema-sync-NfLbLnDw.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-B_O6-mdJ.js +1485 -0
  28. package/dist/_chunks/logger-B_O6-mdJ.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-9mz9T7mb.js +988 -0
  56. package/dist/_chunks/walkers-9mz9T7mb.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 +337 -64
  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 +144 -152
  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/adapters/types.d.ts +0 -6
  80. package/dist/adapters/types.d.ts.map +1 -1
  81. package/dist/cache/cache-api.d.ts +26 -0
  82. package/dist/cache/cache-api.d.ts.map +1 -0
  83. package/dist/cache/handler-store.d.ts +33 -0
  84. package/dist/cache/handler-store.d.ts.map +1 -0
  85. package/dist/cache/index.d.ts +27 -7
  86. package/dist/cache/index.d.ts.map +1 -1
  87. package/dist/cache/index.js +3 -326
  88. package/dist/cache/invalidation-epoch.d.ts +43 -0
  89. package/dist/cache/invalidation-epoch.d.ts.map +1 -0
  90. package/dist/cache/redis-handler.d.ts +97 -8
  91. package/dist/cache/redis-handler.d.ts.map +1 -1
  92. package/dist/cache/singleflight.d.ts +19 -2
  93. package/dist/cache/singleflight.d.ts.map +1 -1
  94. package/dist/cache/sizeof.d.ts +22 -0
  95. package/dist/cache/sizeof.d.ts.map +1 -0
  96. package/dist/cache/stable-stringify.d.ts +9 -0
  97. package/dist/cache/stable-stringify.d.ts.map +1 -1
  98. package/dist/cache/store.d.ts +53 -0
  99. package/dist/cache/store.d.ts.map +1 -0
  100. package/dist/cache/stores/cloudflare-kv.d.ts +38 -0
  101. package/dist/cache/stores/cloudflare-kv.d.ts.map +1 -0
  102. package/dist/cache/stores/cloudflare-kv.js +29 -0
  103. package/dist/cache/stores/cloudflare-kv.js.map +1 -0
  104. package/dist/cache/stores/memory.d.ts +42 -0
  105. package/dist/cache/stores/memory.d.ts.map +1 -0
  106. package/dist/cache/stores/memory.js +90 -0
  107. package/dist/cache/stores/memory.js.map +1 -0
  108. package/dist/cache/stores/redis.d.ts +69 -0
  109. package/dist/cache/stores/redis.d.ts.map +1 -0
  110. package/dist/cache/stores/redis.js +35 -0
  111. package/dist/cache/stores/redis.js.map +1 -0
  112. package/dist/cache/stores/vercel.d.ts +36 -0
  113. package/dist/cache/stores/vercel.d.ts.map +1 -0
  114. package/dist/cache/stores/vercel.js +33 -0
  115. package/dist/cache/stores/vercel.js.map +1 -0
  116. package/dist/cache/tag-aware-handler.d.ts +51 -0
  117. package/dist/cache/tag-aware-handler.d.ts.map +1 -0
  118. package/dist/cache/timber-cache.d.ts +20 -10
  119. package/dist/cache/timber-cache.d.ts.map +1 -1
  120. package/dist/cdn/cloudflare-purge.d.ts +23 -0
  121. package/dist/cdn/cloudflare-purge.d.ts.map +1 -0
  122. package/dist/cdn/fastly-purge.d.ts +25 -0
  123. package/dist/cdn/fastly-purge.d.ts.map +1 -0
  124. package/dist/cdn/headers.d.ts +97 -0
  125. package/dist/cdn/headers.d.ts.map +1 -0
  126. package/dist/cdn/index.d.ts +5 -0
  127. package/dist/cdn/index.d.ts.map +1 -0
  128. package/dist/cdn/purge-store.d.ts +23 -0
  129. package/dist/cdn/purge-store.d.ts.map +1 -0
  130. package/dist/cdn/workers-cache-purge.d.ts +16 -0
  131. package/dist/cdn/workers-cache-purge.d.ts.map +1 -0
  132. package/dist/cli-schema-sync.d.ts +59 -0
  133. package/dist/cli-schema-sync.d.ts.map +1 -0
  134. package/dist/cli.d.ts +34 -2
  135. package/dist/cli.d.ts.map +1 -1
  136. package/dist/cli.js +107 -33
  137. package/dist/cli.js.map +1 -1
  138. package/dist/client/browser-dev.d.ts +37 -1
  139. package/dist/client/browser-dev.d.ts.map +1 -1
  140. package/dist/client/browser-entry/action-dispatch.d.ts +17 -0
  141. package/dist/client/browser-entry/action-dispatch.d.ts.map +1 -0
  142. package/dist/client/browser-entry/hmr.d.ts +21 -0
  143. package/dist/client/browser-entry/hmr.d.ts.map +1 -0
  144. package/dist/client/browser-entry/hydrate.d.ts +46 -0
  145. package/dist/client/browser-entry/hydrate.d.ts.map +1 -0
  146. package/dist/client/browser-entry/index.d.ts +29 -0
  147. package/dist/client/browser-entry/index.d.ts.map +1 -0
  148. package/dist/client/browser-entry/post-hydration.d.ts +26 -0
  149. package/dist/client/browser-entry/post-hydration.d.ts.map +1 -0
  150. package/dist/client/browser-entry/router-init.d.ts +26 -0
  151. package/dist/client/browser-entry/router-init.d.ts.map +1 -0
  152. package/dist/client/browser-entry/rsc-stream.d.ts +24 -0
  153. package/dist/client/browser-entry/rsc-stream.d.ts.map +1 -0
  154. package/dist/client/browser-entry/scroll.d.ts +28 -0
  155. package/dist/client/browser-entry/scroll.d.ts.map +1 -0
  156. package/dist/client/child-segment-context.d.ts +22 -0
  157. package/dist/client/child-segment-context.d.ts.map +1 -0
  158. package/dist/client/child-segment-outlet.d.ts +18 -0
  159. package/dist/client/child-segment-outlet.d.ts.map +1 -0
  160. package/dist/client/child-segment-provider.d.ts +21 -0
  161. package/dist/client/child-segment-provider.d.ts.map +1 -0
  162. package/dist/client/error-boundary.d.ts +12 -5
  163. package/dist/client/error-boundary.d.ts.map +1 -1
  164. package/dist/client/error-boundary.js +47 -10
  165. package/dist/client/error-boundary.js.map +1 -1
  166. package/dist/client/error-reconstituter.d.ts +61 -0
  167. package/dist/client/error-reconstituter.d.ts.map +1 -0
  168. package/dist/client/form.d.ts +16 -27
  169. package/dist/client/form.d.ts.map +1 -1
  170. package/dist/client/history.d.ts +11 -6
  171. package/dist/client/history.d.ts.map +1 -1
  172. package/dist/client/index.d.ts +10 -24
  173. package/dist/client/index.d.ts.map +1 -1
  174. package/dist/client/index.js +182 -1134
  175. package/dist/client/index.js.map +1 -1
  176. package/dist/client/internal.d.ts +19 -0
  177. package/dist/client/internal.d.ts.map +1 -0
  178. package/dist/client/internal.js +825 -0
  179. package/dist/client/internal.js.map +1 -0
  180. package/dist/client/link.d.ts +69 -60
  181. package/dist/client/link.d.ts.map +1 -1
  182. package/dist/client/navigation-api.d.ts +120 -0
  183. package/dist/client/navigation-api.d.ts.map +1 -0
  184. package/dist/client/navigation-context.d.ts +3 -2
  185. package/dist/client/navigation-context.d.ts.map +1 -1
  186. package/dist/client/navigation-root.d.ts +119 -0
  187. package/dist/client/navigation-root.d.ts.map +1 -0
  188. package/dist/client/nuqs-adapter.d.ts +1 -1
  189. package/dist/client/nuqs-adapter.d.ts.map +1 -1
  190. package/dist/client/router-ref.d.ts +1 -1
  191. package/dist/client/router.d.ts +87 -14
  192. package/dist/client/router.d.ts.map +1 -1
  193. package/dist/client/rsc-fetch.d.ts +47 -14
  194. package/dist/client/rsc-fetch.d.ts.map +1 -1
  195. package/dist/client/segment-cache.d.ts +4 -4
  196. package/dist/client/segment-cache.d.ts.map +1 -1
  197. package/dist/client/segment-outlet.d.ts +49 -0
  198. package/dist/client/segment-outlet.d.ts.map +1 -0
  199. package/dist/client/segment-update-context.d.ts +21 -0
  200. package/dist/client/segment-update-context.d.ts.map +1 -0
  201. package/dist/client/shallow-url.d.ts +10 -0
  202. package/dist/client/shallow-url.d.ts.map +1 -0
  203. package/dist/client/ssr-data.d.ts +13 -4
  204. package/dist/client/ssr-data.d.ts.map +1 -1
  205. package/dist/client/state.d.ts +1 -1
  206. package/dist/client/top-loader.d.ts +5 -5
  207. package/dist/client/top-loader.d.ts.map +1 -1
  208. package/dist/client/use-cookie.d.ts +12 -0
  209. package/dist/client/use-cookie.d.ts.map +1 -1
  210. package/dist/client/use-link-status.d.ts +5 -5
  211. package/dist/client/use-link-status.d.ts.map +1 -1
  212. package/dist/client/use-pathname.d.ts.map +1 -1
  213. package/dist/client/use-pending-navigation.d.ts +23 -0
  214. package/dist/client/use-pending-navigation.d.ts.map +1 -0
  215. package/dist/client/use-query-states.d.ts +1 -1
  216. package/dist/client/use-query-states.d.ts.map +1 -1
  217. package/dist/client/use-router.d.ts +1 -1
  218. package/dist/client/use-router.d.ts.map +1 -1
  219. package/dist/client/use-search-params.d.ts +12 -5
  220. package/dist/client/use-search-params.d.ts.map +1 -1
  221. package/dist/client/{use-params.d.ts → use-segment-params.d.ts} +8 -6
  222. package/dist/client/use-segment-params.d.ts.map +1 -0
  223. package/dist/codec.d.ts +69 -0
  224. package/dist/codec.d.ts.map +1 -0
  225. package/dist/codec.js +75 -0
  226. package/dist/codec.js.map +1 -0
  227. package/dist/config-types.d.ts +304 -0
  228. package/dist/config-types.d.ts.map +1 -0
  229. package/dist/config-validation.d.ts +51 -0
  230. package/dist/config-validation.d.ts.map +1 -0
  231. package/dist/content/index.d.ts +1 -10
  232. package/dist/content/index.d.ts.map +1 -1
  233. package/dist/content/index.js +0 -2
  234. package/dist/cookies/define-cookie.d.ts +58 -25
  235. package/dist/cookies/define-cookie.d.ts.map +1 -1
  236. package/dist/cookies/index.d.ts +2 -1
  237. package/dist/cookies/index.d.ts.map +1 -1
  238. package/dist/cookies/index.js +257 -36
  239. package/dist/cookies/index.js.map +1 -1
  240. package/dist/cookies/json-cookie.d.ts +64 -0
  241. package/dist/cookies/json-cookie.d.ts.map +1 -0
  242. package/dist/cookies/validation.d.ts +34 -0
  243. package/dist/cookies/validation.d.ts.map +1 -0
  244. package/dist/dev-tools/404-page.d.ts +50 -0
  245. package/dist/dev-tools/404-page.d.ts.map +1 -0
  246. package/dist/dev-tools/browser-logs.d.ts +40 -0
  247. package/dist/dev-tools/browser-logs.d.ts.map +1 -0
  248. package/dist/dev-tools/dev-page-shell.d.ts +78 -0
  249. package/dist/dev-tools/dev-page-shell.d.ts.map +1 -0
  250. package/dist/dev-tools/error-page.d.ts +32 -0
  251. package/dist/dev-tools/error-page.d.ts.map +1 -0
  252. package/dist/dev-tools/holding-server.d.ts +54 -0
  253. package/dist/dev-tools/holding-server.d.ts.map +1 -0
  254. package/dist/dev-tools/hydration-overlay.d.ts +11 -0
  255. package/dist/dev-tools/hydration-overlay.d.ts.map +1 -0
  256. package/dist/dev-tools/index.d.ts +31 -0
  257. package/dist/dev-tools/index.d.ts.map +1 -0
  258. package/dist/dev-tools/instrumentation.d.ts +59 -0
  259. package/dist/dev-tools/instrumentation.d.ts.map +1 -0
  260. package/dist/{server/dev-logger.d.ts → dev-tools/logger.d.ts} +1 -1
  261. package/dist/dev-tools/logger.d.ts.map +1 -0
  262. package/dist/{plugins/dev-logs.d.ts → dev-tools/logs.d.ts} +2 -2
  263. package/dist/dev-tools/logs.d.ts.map +1 -0
  264. package/dist/dev-tools/overlay.d.ts +91 -0
  265. package/dist/dev-tools/overlay.d.ts.map +1 -0
  266. package/dist/dev-tools/stack-classifier.d.ts +34 -0
  267. package/dist/dev-tools/stack-classifier.d.ts.map +1 -0
  268. package/dist/dev-tools/terminal.d.ts +28 -0
  269. package/dist/dev-tools/terminal.d.ts.map +1 -0
  270. package/dist/fonts/ast-walk.d.ts +68 -0
  271. package/dist/fonts/ast-walk.d.ts.map +1 -0
  272. package/dist/fonts/ast.d.ts +110 -6
  273. package/dist/fonts/ast.d.ts.map +1 -1
  274. package/dist/fonts/bundle.d.ts +50 -0
  275. package/dist/fonts/bundle.d.ts.map +1 -0
  276. package/dist/fonts/dev-middleware.d.ts +22 -0
  277. package/dist/fonts/dev-middleware.d.ts.map +1 -0
  278. package/dist/fonts/fallbacks.d.ts +0 -7
  279. package/dist/fonts/fallbacks.d.ts.map +1 -1
  280. package/dist/fonts/google.d.ts +4 -2
  281. package/dist/fonts/google.d.ts.map +1 -1
  282. package/dist/fonts/local.d.ts +4 -4
  283. package/dist/fonts/local.d.ts.map +1 -1
  284. package/dist/fonts/paths.d.ts +43 -0
  285. package/dist/fonts/paths.d.ts.map +1 -0
  286. package/dist/fonts/pipeline.d.ts +158 -0
  287. package/dist/fonts/pipeline.d.ts.map +1 -0
  288. package/dist/fonts/transform.d.ts +82 -0
  289. package/dist/fonts/transform.d.ts.map +1 -0
  290. package/dist/fonts/types.d.ts +47 -1
  291. package/dist/fonts/types.d.ts.map +1 -1
  292. package/dist/fonts/virtual-modules.d.ts +77 -0
  293. package/dist/fonts/virtual-modules.d.ts.map +1 -0
  294. package/dist/index.d.ts +46 -180
  295. package/dist/index.d.ts.map +1 -1
  296. package/dist/index.js +8471 -14108
  297. package/dist/index.js.map +1 -1
  298. package/dist/params/codec-registry.d.ts +26 -0
  299. package/dist/params/codec-registry.d.ts.map +1 -0
  300. package/dist/params/define-schema.d.ts +81 -0
  301. package/dist/params/define-schema.d.ts.map +1 -0
  302. package/dist/params/index.d.ts +5 -0
  303. package/dist/params/index.d.ts.map +1 -0
  304. package/dist/params/index.js +34 -0
  305. package/dist/params/index.js.map +1 -0
  306. package/dist/params/resolve-schema.d.ts +34 -0
  307. package/dist/params/resolve-schema.d.ts.map +1 -0
  308. package/dist/plugin-context.d.ts +190 -0
  309. package/dist/plugin-context.d.ts.map +1 -0
  310. package/dist/plugins/adapter-build.d.ts +20 -1
  311. package/dist/plugins/adapter-build.d.ts.map +1 -1
  312. package/dist/plugins/build-manifest.d.ts +7 -3
  313. package/dist/plugins/build-manifest.d.ts.map +1 -1
  314. package/dist/plugins/build-report.d.ts +43 -7
  315. package/dist/plugins/build-report.d.ts.map +1 -1
  316. package/dist/plugins/cache.d.ts +64 -0
  317. package/dist/plugins/cache.d.ts.map +1 -0
  318. package/dist/plugins/callsite-ast.d.ts +117 -0
  319. package/dist/plugins/callsite-ast.d.ts.map +1 -0
  320. package/dist/plugins/callsite-jsx.d.ts +35 -0
  321. package/dist/plugins/callsite-jsx.d.ts.map +1 -0
  322. package/dist/plugins/chunks.d.ts +11 -4
  323. package/dist/plugins/chunks.d.ts.map +1 -1
  324. package/dist/plugins/client-chunks.d.ts +40 -0
  325. package/dist/plugins/client-chunks.d.ts.map +1 -0
  326. package/dist/plugins/cloudflare-wasm.d.ts +21 -0
  327. package/dist/plugins/cloudflare-wasm.d.ts.map +1 -0
  328. package/dist/plugins/content.d.ts +1 -1
  329. package/dist/plugins/content.d.ts.map +1 -1
  330. package/dist/plugins/dev-server.d.ts +17 -1
  331. package/dist/plugins/dev-server.d.ts.map +1 -1
  332. package/dist/plugins/entries.d.ts +1 -1
  333. package/dist/plugins/entries.d.ts.map +1 -1
  334. package/dist/plugins/fonts.d.ts +16 -73
  335. package/dist/plugins/fonts.d.ts.map +1 -1
  336. package/dist/plugins/mdx.d.ts +1 -1
  337. package/dist/plugins/mdx.d.ts.map +1 -1
  338. package/dist/plugins/prebuilt-capture.d.ts +60 -0
  339. package/dist/plugins/prebuilt-capture.d.ts.map +1 -0
  340. package/dist/plugins/prebuilt.d.ts +82 -0
  341. package/dist/plugins/prebuilt.d.ts.map +1 -0
  342. package/dist/plugins/prerender-sugar.d.ts +42 -0
  343. package/dist/plugins/prerender-sugar.d.ts.map +1 -0
  344. package/dist/plugins/routing.d.ts +1 -1
  345. package/dist/plugins/routing.d.ts.map +1 -1
  346. package/dist/plugins/server-bundle.d.ts.map +1 -1
  347. package/dist/plugins/shims.d.ts +29 -5
  348. package/dist/plugins/shims.d.ts.map +1 -1
  349. package/dist/plugins/static-build.d.ts +5 -26
  350. package/dist/plugins/static-build.d.ts.map +1 -1
  351. package/dist/routing/codegen-shared.d.ts +67 -0
  352. package/dist/routing/codegen-shared.d.ts.map +1 -0
  353. package/dist/routing/codegen-types.d.ts +64 -0
  354. package/dist/routing/codegen-types.d.ts.map +1 -0
  355. package/dist/routing/codegen.d.ts +7 -2
  356. package/dist/routing/codegen.d.ts.map +1 -1
  357. package/dist/routing/convention-lint.d.ts +41 -0
  358. package/dist/routing/convention-lint.d.ts.map +1 -0
  359. package/dist/routing/export-detect.d.ts +56 -0
  360. package/dist/routing/export-detect.d.ts.map +1 -0
  361. package/dist/routing/file-cache.d.ts +8 -0
  362. package/dist/routing/file-cache.d.ts.map +1 -0
  363. package/dist/routing/index.d.ts +7 -1
  364. package/dist/routing/index.d.ts.map +1 -1
  365. package/dist/routing/index.js +4 -2
  366. package/dist/routing/interception.d.ts +0 -5
  367. package/dist/routing/interception.d.ts.map +1 -1
  368. package/dist/routing/link-codegen.d.ts +90 -0
  369. package/dist/routing/link-codegen.d.ts.map +1 -0
  370. package/dist/routing/manifest-codegen.d.ts +32 -0
  371. package/dist/routing/manifest-codegen.d.ts.map +1 -0
  372. package/dist/routing/scanner.d.ts +1 -10
  373. package/dist/routing/scanner.d.ts.map +1 -1
  374. package/dist/routing/schema-validation.d.ts +35 -0
  375. package/dist/routing/schema-validation.d.ts.map +1 -0
  376. package/dist/routing/segment-classify.d.ts +75 -0
  377. package/dist/routing/segment-classify.d.ts.map +1 -0
  378. package/dist/routing/segment-codegen.d.ts +38 -0
  379. package/dist/routing/segment-codegen.d.ts.map +1 -0
  380. package/dist/routing/types.d.ts +77 -25
  381. package/dist/routing/types.d.ts.map +1 -1
  382. package/dist/routing/walkers.d.ts +51 -0
  383. package/dist/routing/walkers.d.ts.map +1 -0
  384. package/dist/rsc-runtime/rsc.d.ts +1 -1
  385. package/dist/rsc-runtime/rsc.d.ts.map +1 -1
  386. package/dist/rsc-runtime/ssr.d.ts +12 -0
  387. package/dist/rsc-runtime/ssr.d.ts.map +1 -1
  388. package/dist/schema-bridge.d.ts +91 -0
  389. package/dist/schema-bridge.d.ts.map +1 -0
  390. package/dist/search-params/define.d.ts +157 -0
  391. package/dist/search-params/define.d.ts.map +1 -0
  392. package/dist/search-params/index.d.ts +4 -7
  393. package/dist/search-params/index.d.ts.map +1 -1
  394. package/dist/search-params/index.js +37 -440
  395. package/dist/search-params/index.js.map +1 -1
  396. package/dist/search-params/registry.d.ts +2 -2
  397. package/dist/search-params/registry.d.ts.map +1 -1
  398. package/dist/search-params/wrappers.d.ts +53 -0
  399. package/dist/search-params/wrappers.d.ts.map +1 -0
  400. package/dist/segment-params/define.d.ts +89 -0
  401. package/dist/segment-params/define.d.ts.map +1 -0
  402. package/dist/segment-params/index.d.ts +3 -0
  403. package/dist/segment-params/index.d.ts.map +1 -0
  404. package/dist/segment-params/index.js +2 -0
  405. package/dist/server/access-gate.d.ts +8 -3
  406. package/dist/server/access-gate.d.ts.map +1 -1
  407. package/dist/server/action-client.d.ts +41 -6
  408. package/dist/server/action-client.d.ts.map +1 -1
  409. package/dist/server/action-encryption.d.ts +76 -0
  410. package/dist/server/action-encryption.d.ts.map +1 -0
  411. package/dist/server/action-handler.d.ts +35 -1
  412. package/dist/server/action-handler.d.ts.map +1 -1
  413. package/dist/server/actions.d.ts +6 -30
  414. package/dist/server/actions.d.ts.map +1 -1
  415. package/dist/server/als-registry.d.ts +86 -11
  416. package/dist/server/als-registry.d.ts.map +1 -1
  417. package/dist/server/asset-headers.d.ts +8 -18
  418. package/dist/server/asset-headers.d.ts.map +1 -1
  419. package/dist/server/body-limits.d.ts.map +1 -1
  420. package/dist/server/build-manifest.d.ts +6 -29
  421. package/dist/server/build-manifest.d.ts.map +1 -1
  422. package/dist/server/canonicalize.d.ts +10 -0
  423. package/dist/server/canonicalize.d.ts.map +1 -1
  424. package/dist/server/coalesce-tick.d.ts +40 -0
  425. package/dist/server/coalesce-tick.d.ts.map +1 -0
  426. package/dist/server/cookie-context.d.ts +170 -0
  427. package/dist/server/cookie-context.d.ts.map +1 -0
  428. package/dist/server/cookie-parsing.d.ts +65 -0
  429. package/dist/server/cookie-parsing.d.ts.map +1 -0
  430. package/dist/server/csrf.d.ts +3 -2
  431. package/dist/server/csrf.d.ts.map +1 -1
  432. package/dist/server/default-logger.d.ts +22 -0
  433. package/dist/server/default-logger.d.ts.map +1 -0
  434. package/dist/server/deny-boundary.d.ts +115 -0
  435. package/dist/server/deny-boundary.d.ts.map +1 -0
  436. package/dist/server/deny-renderer.d.ts +2 -2
  437. package/dist/server/deny-renderer.d.ts.map +1 -1
  438. package/dist/server/dev-source-map.d.ts +22 -0
  439. package/dist/server/dev-source-map.d.ts.map +1 -0
  440. package/dist/server/early-hints-sender.d.ts.map +1 -1
  441. package/dist/server/early-hints.d.ts +13 -11
  442. package/dist/server/early-hints.d.ts.map +1 -1
  443. package/dist/server/error-boundary-wrapper.d.ts +7 -1
  444. package/dist/server/error-boundary-wrapper.d.ts.map +1 -1
  445. package/dist/server/fallback-error.d.ts +12 -7
  446. package/dist/server/fallback-error.d.ts.map +1 -1
  447. package/dist/server/flight-injection-state.d.ts +66 -0
  448. package/dist/server/flight-injection-state.d.ts.map +1 -0
  449. package/dist/server/flight-scripts.d.ts +42 -0
  450. package/dist/server/flight-scripts.d.ts.map +1 -0
  451. package/dist/server/form-data.d.ts +41 -0
  452. package/dist/server/form-data.d.ts.map +1 -1
  453. package/dist/server/html-injector-core.d.ts +221 -0
  454. package/dist/server/html-injector-core.d.ts.map +1 -0
  455. package/dist/server/html-injectors.d.ts +82 -41
  456. package/dist/server/html-injectors.d.ts.map +1 -1
  457. package/dist/server/index.d.ts +11 -47
  458. package/dist/server/index.d.ts.map +1 -1
  459. package/dist/server/index.js +170 -2911
  460. package/dist/server/index.js.map +1 -1
  461. package/dist/server/internal.d.ts +49 -0
  462. package/dist/server/internal.d.ts.map +1 -0
  463. package/dist/server/internal.js +3652 -0
  464. package/dist/server/internal.js.map +1 -0
  465. package/dist/server/logger.d.ts +39 -7
  466. package/dist/server/logger.d.ts.map +1 -1
  467. package/dist/server/metadata-routes.d.ts +23 -7
  468. package/dist/server/metadata-routes.d.ts.map +1 -1
  469. package/dist/server/middleware-runner.d.ts +36 -4
  470. package/dist/server/middleware-runner.d.ts.map +1 -1
  471. package/dist/server/node-stream-transforms.d.ts +119 -0
  472. package/dist/server/node-stream-transforms.d.ts.map +1 -0
  473. package/dist/server/param-coercion.d.ts +54 -0
  474. package/dist/server/param-coercion.d.ts.map +1 -0
  475. package/dist/server/pipeline-helpers.d.ts +95 -0
  476. package/dist/server/pipeline-helpers.d.ts.map +1 -0
  477. package/dist/server/pipeline-interception.d.ts +1 -1
  478. package/dist/server/pipeline-interception.d.ts.map +1 -1
  479. package/dist/server/pipeline-metadata.d.ts +6 -0
  480. package/dist/server/pipeline-metadata.d.ts.map +1 -1
  481. package/dist/server/pipeline-outcome.d.ts +49 -0
  482. package/dist/server/pipeline-outcome.d.ts.map +1 -0
  483. package/dist/server/pipeline-phases.d.ts +56 -0
  484. package/dist/server/pipeline-phases.d.ts.map +1 -0
  485. package/dist/server/pipeline.d.ts +122 -19
  486. package/dist/server/pipeline.d.ts.map +1 -1
  487. package/dist/server/port-resolution.d.ts +117 -0
  488. package/dist/server/port-resolution.d.ts.map +1 -0
  489. package/dist/server/prebuilt/cache-key.d.ts +58 -0
  490. package/dist/server/prebuilt/cache-key.d.ts.map +1 -0
  491. package/dist/server/prebuilt/capture-state.d.ts +57 -0
  492. package/dist/server/prebuilt/capture-state.d.ts.map +1 -0
  493. package/dist/server/prebuilt/manifest-tag-index.d.ts +27 -0
  494. package/dist/server/prebuilt/manifest-tag-index.d.ts.map +1 -0
  495. package/dist/server/prebuilt/overlay.d.ts +100 -0
  496. package/dist/server/prebuilt/overlay.d.ts.map +1 -0
  497. package/dist/server/prebuilt/payload-source.d.ts +78 -0
  498. package/dist/server/prebuilt/payload-source.d.ts.map +1 -0
  499. package/dist/server/prebuilt/synthetic-store.d.ts +66 -0
  500. package/dist/server/prebuilt/synthetic-store.d.ts.map +1 -0
  501. package/dist/server/prebuilt-builder.d.ts +120 -0
  502. package/dist/server/prebuilt-builder.d.ts.map +1 -0
  503. package/dist/server/prebuilt-runtime.d.ts +101 -0
  504. package/dist/server/prebuilt-runtime.d.ts.map +1 -0
  505. package/dist/server/primitives.d.ts +88 -43
  506. package/dist/server/primitives.d.ts.map +1 -1
  507. package/dist/server/render-timeout.d.ts +51 -0
  508. package/dist/server/render-timeout.d.ts.map +1 -0
  509. package/dist/server/render-utils.d.ts +25 -0
  510. package/dist/server/render-utils.d.ts.map +1 -0
  511. package/dist/server/request-context.d.ts +62 -107
  512. package/dist/server/request-context.d.ts.map +1 -1
  513. package/dist/server/route-element-builder.d.ts +46 -25
  514. package/dist/server/route-element-builder.d.ts.map +1 -1
  515. package/dist/server/route-handler.d.ts.map +1 -1
  516. package/dist/server/route-matcher.d.ts +25 -36
  517. package/dist/server/route-matcher.d.ts.map +1 -1
  518. package/dist/server/rsc-entry/action-middleware-runner.d.ts +66 -0
  519. package/dist/server/rsc-entry/action-middleware-runner.d.ts.map +1 -0
  520. package/dist/server/rsc-entry/api-handler.d.ts +12 -3
  521. package/dist/server/rsc-entry/api-handler.d.ts.map +1 -1
  522. package/dist/server/rsc-entry/error-renderer.d.ts +26 -13
  523. package/dist/server/rsc-entry/error-renderer.d.ts.map +1 -1
  524. package/dist/server/rsc-entry/helpers.d.ts +51 -28
  525. package/dist/server/rsc-entry/helpers.d.ts.map +1 -1
  526. package/dist/server/rsc-entry/index.d.ts +28 -6
  527. package/dist/server/rsc-entry/index.d.ts.map +1 -1
  528. package/dist/server/rsc-entry/render-route.d.ts +50 -0
  529. package/dist/server/rsc-entry/render-route.d.ts.map +1 -0
  530. package/dist/server/rsc-entry/revalidate-renderer.d.ts +108 -0
  531. package/dist/server/rsc-entry/revalidate-renderer.d.ts.map +1 -0
  532. package/dist/server/rsc-entry/rsc-payload.d.ts +5 -6
  533. package/dist/server/rsc-entry/rsc-payload.d.ts.map +1 -1
  534. package/dist/server/rsc-entry/rsc-stream.d.ts +17 -1
  535. package/dist/server/rsc-entry/rsc-stream.d.ts.map +1 -1
  536. package/dist/server/rsc-entry/ssr-bridge.d.ts +5 -1
  537. package/dist/server/rsc-entry/ssr-bridge.d.ts.map +1 -1
  538. package/dist/server/rsc-entry/ssr-renderer.d.ts +34 -4
  539. package/dist/server/rsc-entry/ssr-renderer.d.ts.map +1 -1
  540. package/dist/server/rsc-entry/wrap-action-dispatch.d.ts +119 -0
  541. package/dist/server/rsc-entry/wrap-action-dispatch.d.ts.map +1 -0
  542. package/dist/server/safe-load.d.ts +46 -0
  543. package/dist/server/safe-load.d.ts.map +1 -0
  544. package/dist/server/sensitive-fields.d.ts +74 -0
  545. package/dist/server/sensitive-fields.d.ts.map +1 -0
  546. package/dist/server/sitemap-generator.d.ts +129 -0
  547. package/dist/server/sitemap-generator.d.ts.map +1 -0
  548. package/dist/server/sitemap-handler.d.ts +22 -0
  549. package/dist/server/sitemap-handler.d.ts.map +1 -0
  550. package/dist/server/slot-resolver.d.ts +7 -5
  551. package/dist/server/slot-resolver.d.ts.map +1 -1
  552. package/dist/server/ssr-bridge-types.d.ts +121 -0
  553. package/dist/server/ssr-bridge-types.d.ts.map +1 -0
  554. package/dist/server/ssr-entry.d.ts +2 -43
  555. package/dist/server/ssr-entry.d.ts.map +1 -1
  556. package/dist/server/ssr-render.d.ts +64 -21
  557. package/dist/server/ssr-render.d.ts.map +1 -1
  558. package/dist/server/ssr-wrappers.d.ts +50 -0
  559. package/dist/server/ssr-wrappers.d.ts.map +1 -0
  560. package/dist/server/state-tree-diff.d.ts +12 -5
  561. package/dist/server/state-tree-diff.d.ts.map +1 -1
  562. package/dist/server/status-code-resolver.d.ts +22 -11
  563. package/dist/server/status-code-resolver.d.ts.map +1 -1
  564. package/dist/server/stream-utils.d.ts +47 -0
  565. package/dist/server/stream-utils.d.ts.map +1 -0
  566. package/dist/server/tracing.d.ts +44 -9
  567. package/dist/server/tracing.d.ts.map +1 -1
  568. package/dist/server/tree-builder.d.ts +62 -30
  569. package/dist/server/tree-builder.d.ts.map +1 -1
  570. package/dist/server/tree-match.d.ts +49 -0
  571. package/dist/server/tree-match.d.ts.map +1 -0
  572. package/dist/server/types.d.ts +71 -6
  573. package/dist/server/types.d.ts.map +1 -1
  574. package/dist/server/utils/escape-html.d.ts +14 -0
  575. package/dist/server/utils/escape-html.d.ts.map +1 -0
  576. package/dist/server/utils/mdx-file.d.ts +15 -0
  577. package/dist/server/utils/mdx-file.d.ts.map +1 -0
  578. package/dist/server/version-skew.d.ts +61 -0
  579. package/dist/server/version-skew.d.ts.map +1 -0
  580. package/dist/server/workers-cache-bridge.d.ts +26 -0
  581. package/dist/server/workers-cache-bridge.d.ts.map +1 -0
  582. package/dist/shared/href-validation.d.ts +49 -0
  583. package/dist/shared/href-validation.d.ts.map +1 -0
  584. package/dist/shared/merge-search-params.d.ts +22 -0
  585. package/dist/shared/merge-search-params.d.ts.map +1 -0
  586. package/dist/shared/redirect-type.d.ts +17 -0
  587. package/dist/shared/redirect-type.d.ts.map +1 -0
  588. package/dist/shims/font-google.d.ts +1 -1
  589. package/dist/shims/font-google.d.ts.map +1 -1
  590. package/dist/shims/font-google.js +42 -0
  591. package/dist/shims/font-google.js.map +1 -0
  592. package/dist/shims/font-local.d.ts +26 -0
  593. package/dist/shims/font-local.d.ts.map +1 -0
  594. package/dist/shims/font-local.js +20 -0
  595. package/dist/shims/font-local.js.map +1 -0
  596. package/dist/shims/headers.d.ts +53 -1
  597. package/dist/shims/headers.d.ts.map +1 -1
  598. package/dist/shims/image.d.ts +16 -16
  599. package/dist/shims/navigation-client.d.ts +35 -11
  600. package/dist/shims/navigation-client.d.ts.map +1 -1
  601. package/dist/shims/navigation.d.ts +11 -5
  602. package/dist/shims/navigation.d.ts.map +1 -1
  603. package/dist/utils/state-machine.d.ts +80 -0
  604. package/dist/utils/state-machine.d.ts.map +1 -0
  605. package/docs/api/30-api-server.mdx +233 -0
  606. package/docs/api/31-api-client.mdx +161 -0
  607. package/docs/api/32-api-cache.mdx +199 -0
  608. package/docs/api/33-api-search-params.mdx +141 -0
  609. package/docs/api/34-api-config.mdx +189 -0
  610. package/docs/api/35-api-typescript.mdx +170 -0
  611. package/docs/api/36-cli.mdx +143 -0
  612. package/docs/learn/00-introduction.mdx +76 -0
  613. package/docs/learn/01-quick-start.mdx +94 -0
  614. package/docs/learn/02-pages-and-layouts.mdx +147 -0
  615. package/docs/learn/03-fetching-data.mdx +211 -0
  616. package/docs/learn/03b-access-control.mdx +130 -0
  617. package/docs/learn/04-loading-states.mdx +67 -0
  618. package/docs/learn/04b-the-flush-point.mdx +115 -0
  619. package/docs/learn/05-typed-params.mdx +275 -0
  620. package/docs/learn/06-forms-and-actions.mdx +146 -0
  621. package/docs/learn/07-typed-routes.mdx +127 -0
  622. package/docs/learn/08-streaming.mdx +146 -0
  623. package/docs/learn/09-caching.mdx +136 -0
  624. package/docs/learn/10-middleware.mdx +157 -0
  625. package/docs/learn/11-error-handling.mdx +156 -0
  626. package/docs/learn/12-client-navigation.mdx +168 -0
  627. package/docs/learn/13-configuration.mdx +145 -0
  628. package/docs/learn/14-deploying.mdx +264 -0
  629. package/docs/more/01-advanced-routing.mdx +139 -0
  630. package/docs/more/02-advanced-forms.mdx +137 -0
  631. package/docs/more/03-coming-from-nextjs.mdx +186 -0
  632. package/docs/more/04-metadata-and-fonts.mdx +193 -0
  633. package/docs/more/04b-mdx.mdx +209 -0
  634. package/docs/more/05-content-collections.mdx +90 -0
  635. package/docs/more/06-instrumentation.mdx +214 -0
  636. package/docs/more/07-security.mdx +129 -0
  637. package/docs/more/08-developer-experience.mdx +134 -0
  638. package/docs/more/40-why-timber.mdx +50 -0
  639. package/docs/more/41-timber-vs-nextjs.mdx +81 -0
  640. package/docs/more/42-timber-vs-others.mdx +68 -0
  641. package/docs/more/50-ai-agent-instructions.mdx +169 -0
  642. package/llms.txt +55 -0
  643. package/package.json +103 -26
  644. package/src/adapters/build-output-helper.ts +199 -0
  645. package/src/adapters/cloudflare-dev.ts +177 -0
  646. package/src/adapters/cloudflare-kv-cache.ts +179 -0
  647. package/src/adapters/cloudflare.ts +571 -118
  648. package/src/adapters/compress-module.ts +27 -92
  649. package/src/adapters/nitro.ts +131 -107
  650. package/src/adapters/raw-imports.d.ts +5 -0
  651. package/src/adapters/shared.ts +68 -0
  652. package/src/adapters/types.ts +0 -7
  653. package/src/adapters/wrangler.d.ts +7 -0
  654. package/src/cache/cache-api.ts +107 -0
  655. package/src/cache/handler-store.ts +76 -0
  656. package/src/cache/index.ts +88 -18
  657. package/src/cache/invalidation-epoch.ts +93 -0
  658. package/src/cache/redis-handler.ts +122 -15
  659. package/src/cache/singleflight.ts +64 -6
  660. package/src/cache/sizeof.ts +33 -0
  661. package/src/cache/stable-stringify.ts +65 -2
  662. package/src/cache/store.ts +71 -0
  663. package/src/cache/stores/cloudflare-kv.ts +52 -0
  664. package/src/cache/stores/memory.ts +125 -0
  665. package/src/cache/stores/redis.ts +97 -0
  666. package/src/cache/stores/vercel.ts +59 -0
  667. package/src/cache/tag-aware-handler.ts +233 -0
  668. package/src/cache/timber-cache.ts +142 -36
  669. package/src/cdn/cloudflare-purge.ts +50 -0
  670. package/src/cdn/fastly-purge.ts +63 -0
  671. package/src/cdn/headers.ts +153 -0
  672. package/src/cdn/index.ts +17 -0
  673. package/src/cdn/purge-store.ts +34 -0
  674. package/src/cdn/workers-cache-purge.ts +30 -0
  675. package/src/cli-schema-sync.ts +388 -0
  676. package/src/cli.ts +157 -34
  677. package/src/client/browser-dev.ts +156 -1
  678. package/src/client/browser-entry/action-dispatch.ts +124 -0
  679. package/src/client/browser-entry/hmr.ts +70 -0
  680. package/src/client/browser-entry/hydrate.ts +187 -0
  681. package/src/client/browser-entry/index.ts +111 -0
  682. package/src/client/browser-entry/post-hydration.ts +103 -0
  683. package/src/client/browser-entry/router-init.ts +287 -0
  684. package/src/client/browser-entry/rsc-stream.ts +157 -0
  685. package/src/client/browser-entry/scroll.ts +50 -0
  686. package/src/client/child-segment-context.ts +40 -0
  687. package/src/client/child-segment-outlet.tsx +25 -0
  688. package/src/client/child-segment-provider.tsx +27 -0
  689. package/src/client/error-boundary.tsx +127 -22
  690. package/src/client/error-reconstituter.tsx +79 -0
  691. package/src/client/form.tsx +31 -32
  692. package/src/client/history.ts +11 -7
  693. package/src/client/index.ts +67 -45
  694. package/src/client/internal.ts +58 -0
  695. package/src/client/link.tsx +346 -150
  696. package/src/client/navigation-api.ts +341 -0
  697. package/src/client/navigation-context.ts +15 -7
  698. package/src/client/navigation-root.tsx +355 -0
  699. package/src/client/nuqs-adapter.tsx +16 -3
  700. package/src/client/router-ref.ts +1 -1
  701. package/src/client/router.ts +482 -166
  702. package/src/client/rsc-fetch.ts +214 -33
  703. package/src/client/segment-cache.ts +7 -7
  704. package/src/client/segment-outlet.tsx +77 -0
  705. package/src/client/segment-update-context.ts +42 -0
  706. package/src/client/shallow-url.ts +22 -0
  707. package/src/client/ssr-data.ts +13 -5
  708. package/src/client/state.ts +2 -2
  709. package/src/client/top-loader.tsx +11 -9
  710. package/src/client/use-cookie.ts +60 -15
  711. package/src/client/use-link-status.ts +7 -7
  712. package/src/client/use-pathname.ts +1 -0
  713. package/src/client/use-pending-navigation.ts +40 -0
  714. package/src/client/use-query-states.ts +9 -3
  715. package/src/client/use-router.ts +4 -1
  716. package/src/client/use-search-params.ts +31 -44
  717. package/src/client/{use-params.ts → use-segment-params.ts} +9 -6
  718. package/src/codec.ts +147 -0
  719. package/src/config-types.ts +302 -0
  720. package/src/config-validation.ts +328 -0
  721. package/src/content/index.ts +5 -13
  722. package/src/cookies/define-cookie.ts +217 -53
  723. package/src/cookies/index.ts +12 -1
  724. package/src/cookies/json-cookie.ts +105 -0
  725. package/src/cookies/validation.ts +192 -0
  726. package/src/dev-tools/404-page.ts +286 -0
  727. package/src/dev-tools/browser-logs.ts +55 -0
  728. package/src/dev-tools/dev-page-shell.ts +260 -0
  729. package/src/dev-tools/error-page.ts +331 -0
  730. package/src/dev-tools/holding-server.ts +187 -0
  731. package/src/dev-tools/hydration-overlay.ts +158 -0
  732. package/src/dev-tools/index.ts +83 -0
  733. package/src/dev-tools/instrumentation.ts +213 -0
  734. package/src/{server/dev-logger.ts → dev-tools/logger.ts} +33 -51
  735. package/src/{plugins/dev-logs.ts → dev-tools/logs.ts} +9 -5
  736. package/src/dev-tools/overlay.ts +469 -0
  737. package/src/dev-tools/stack-classifier.ts +75 -0
  738. package/src/dev-tools/terminal.ts +182 -0
  739. package/src/fonts/ast-walk.ts +235 -0
  740. package/src/fonts/ast.ts +477 -126
  741. package/src/fonts/bundle.ts +138 -0
  742. package/src/fonts/dev-middleware.ts +85 -0
  743. package/src/fonts/fallbacks.ts +0 -23
  744. package/src/fonts/google.ts +63 -8
  745. package/src/fonts/local.ts +9 -8
  746. package/src/fonts/paths.ts +58 -0
  747. package/src/fonts/pipeline.ts +316 -0
  748. package/src/fonts/transform.ts +305 -0
  749. package/src/fonts/types.ts +52 -1
  750. package/src/fonts/virtual-modules.ts +179 -0
  751. package/src/index.ts +431 -352
  752. package/src/params/codec-registry.ts +34 -0
  753. package/src/params/define-schema.ts +115 -0
  754. package/src/params/index.ts +17 -0
  755. package/src/params/resolve-schema.ts +84 -0
  756. package/src/plugin-context.ts +378 -0
  757. package/src/plugins/adapter-build.ts +98 -4
  758. package/src/plugins/build-manifest.ts +168 -23
  759. package/src/plugins/build-report.ts +253 -35
  760. package/src/plugins/cache.ts +229 -0
  761. package/src/plugins/callsite-ast.ts +472 -0
  762. package/src/plugins/callsite-jsx.ts +243 -0
  763. package/src/plugins/chunks.ts +74 -5
  764. package/src/plugins/client-chunks.ts +144 -0
  765. package/src/plugins/cloudflare-wasm.ts +141 -0
  766. package/src/plugins/content.ts +1 -1
  767. package/src/plugins/dev-server.ts +293 -46
  768. package/src/plugins/entries.ts +129 -8
  769. package/src/plugins/fonts.ts +199 -664
  770. package/src/plugins/mdx.ts +47 -10
  771. package/src/plugins/prebuilt-capture.ts +217 -0
  772. package/src/plugins/prebuilt.ts +700 -0
  773. package/src/plugins/prerender-sugar.ts +329 -0
  774. package/src/plugins/routing.ts +237 -241
  775. package/src/plugins/server-bundle.ts +97 -12
  776. package/src/plugins/shims.ts +241 -64
  777. package/src/plugins/static-build.ts +15 -90
  778. package/src/routing/codegen-shared.ts +115 -0
  779. package/src/routing/codegen-types.ts +65 -0
  780. package/src/routing/codegen.ts +360 -178
  781. package/src/routing/convention-lint.ts +394 -0
  782. package/src/routing/export-detect.ts +304 -0
  783. package/src/routing/file-cache.ts +23 -0
  784. package/src/routing/index.ts +10 -1
  785. package/src/routing/interception.ts +3 -22
  786. package/src/routing/link-codegen.ts +310 -0
  787. package/src/routing/manifest-codegen.ts +281 -0
  788. package/src/routing/scanner.ts +248 -188
  789. package/src/routing/schema-validation.ts +149 -0
  790. package/src/routing/segment-classify.ts +188 -0
  791. package/src/routing/segment-codegen.ts +98 -0
  792. package/src/routing/types.ts +78 -25
  793. package/src/routing/walkers.ts +90 -0
  794. package/src/rsc-runtime/rsc.ts +9 -0
  795. package/src/rsc-runtime/ssr.ts +50 -0
  796. package/src/rsc-runtime/vendor-types.d.ts +7 -0
  797. package/src/schema-bridge.ts +252 -0
  798. package/src/search-params/define.ts +570 -0
  799. package/src/search-params/index.ts +14 -20
  800. package/src/search-params/registry.ts +2 -2
  801. package/src/search-params/wrappers.ts +110 -0
  802. package/src/segment-params/define.ts +249 -0
  803. package/src/segment-params/index.ts +9 -0
  804. package/src/server/access-gate.tsx +84 -34
  805. package/src/server/action-client.ts +119 -28
  806. package/src/server/action-encryption.ts +144 -0
  807. package/src/server/action-handler.ts +123 -33
  808. package/src/server/actions.ts +48 -54
  809. package/src/server/als-registry.ts +130 -20
  810. package/src/server/asset-headers.ts +15 -37
  811. package/src/server/body-limits.ts +10 -2
  812. package/src/server/build-manifest.ts +13 -56
  813. package/src/server/canonicalize.ts +6 -3
  814. package/src/server/coalesce-tick.ts +75 -0
  815. package/src/server/compress.ts +34 -7
  816. package/src/server/cookie-context.ts +484 -0
  817. package/src/server/cookie-parsing.ts +163 -0
  818. package/src/server/csrf.ts +39 -6
  819. package/src/server/default-logger.ts +99 -0
  820. package/src/server/deny-boundary.ts +311 -0
  821. package/src/server/deny-renderer.ts +85 -77
  822. package/src/server/dev-source-map.ts +31 -0
  823. package/src/server/early-hints-sender.ts +3 -2
  824. package/src/server/early-hints.ts +37 -27
  825. package/src/server/error-boundary-wrapper.ts +61 -22
  826. package/src/server/fallback-error.ts +79 -102
  827. package/src/server/flight-injection-state.ts +113 -0
  828. package/src/server/flight-scripts.ts +62 -0
  829. package/src/server/form-data.ts +124 -12
  830. package/src/server/html-injector-core.ts +437 -0
  831. package/src/server/html-injectors.ts +267 -254
  832. package/src/server/index.ts +31 -185
  833. package/src/server/internal.ts +181 -0
  834. package/src/server/logger.ts +72 -36
  835. package/src/server/metadata-routes.ts +44 -19
  836. package/src/server/middleware-runner.ts +75 -4
  837. package/src/server/node-stream-transforms.ts +331 -0
  838. package/src/server/param-coercion.ts +206 -0
  839. package/src/server/pipeline-helpers.ts +204 -0
  840. package/src/server/pipeline-interception.ts +32 -18
  841. package/src/server/pipeline-metadata.ts +14 -0
  842. package/src/server/pipeline-outcome.ts +197 -0
  843. package/src/server/pipeline-phases.ts +538 -0
  844. package/src/server/pipeline.ts +226 -382
  845. package/src/server/port-resolution.ts +215 -0
  846. package/src/server/prebuilt/cache-key.ts +224 -0
  847. package/src/server/prebuilt/capture-state.ts +89 -0
  848. package/src/server/prebuilt/manifest-tag-index.ts +46 -0
  849. package/src/server/prebuilt/overlay.ts +256 -0
  850. package/src/server/prebuilt/payload-source.ts +201 -0
  851. package/src/server/prebuilt/synthetic-store.ts +121 -0
  852. package/src/server/prebuilt-builder.ts +774 -0
  853. package/src/server/prebuilt-runtime.ts +731 -0
  854. package/src/server/primitives.ts +160 -83
  855. package/src/server/render-timeout.ts +108 -0
  856. package/src/server/render-utils.ts +31 -0
  857. package/src/server/request-context.ts +168 -337
  858. package/src/server/route-element-builder.ts +548 -233
  859. package/src/server/route-handler.ts +31 -4
  860. package/src/server/route-matcher.ts +144 -277
  861. package/src/server/rsc-entry/action-middleware-runner.ts +167 -0
  862. package/src/server/rsc-entry/api-handler.ts +69 -32
  863. package/src/server/rsc-entry/error-renderer.ts +306 -89
  864. package/src/server/rsc-entry/helpers.ts +160 -76
  865. package/src/server/rsc-entry/index.ts +394 -330
  866. package/src/server/rsc-entry/render-route.ts +288 -0
  867. package/src/server/rsc-entry/revalidate-renderer.ts +349 -0
  868. package/src/server/rsc-entry/rsc-payload.ts +74 -35
  869. package/src/server/rsc-entry/rsc-stream.ts +85 -13
  870. package/src/server/rsc-entry/ssr-bridge.ts +18 -5
  871. package/src/server/rsc-entry/ssr-renderer.ts +273 -43
  872. package/src/server/rsc-entry/wrap-action-dispatch.ts +449 -0
  873. package/src/server/safe-load.ts +60 -0
  874. package/src/server/sensitive-fields.ts +230 -0
  875. package/src/server/server-only-guard-noop.js +3 -0
  876. package/src/server/sitemap-generator.ts +344 -0
  877. package/src/server/sitemap-handler.ts +157 -0
  878. package/src/server/slot-resolver.ts +258 -257
  879. package/src/server/ssr-bridge-types.ts +124 -0
  880. package/src/server/ssr-entry.ts +206 -78
  881. package/src/server/ssr-render.ts +345 -82
  882. package/src/server/ssr-wrappers.tsx +141 -0
  883. package/src/server/state-tree-diff.ts +30 -23
  884. package/src/server/status-code-resolver.ts +115 -130
  885. package/src/server/stream-utils.ts +286 -0
  886. package/src/server/tracing.ts +126 -14
  887. package/src/server/tree-builder.ts +204 -90
  888. package/src/server/tree-match.ts +220 -0
  889. package/src/server/types.ts +78 -9
  890. package/src/server/utils/escape-html.ts +20 -0
  891. package/src/server/utils/mdx-file.ts +22 -0
  892. package/src/server/version-skew.ts +104 -0
  893. package/src/server/workers-cache-bridge.ts +33 -0
  894. package/src/shared/href-validation.ts +159 -0
  895. package/src/shared/merge-search-params.ts +55 -0
  896. package/src/shared/redirect-type.ts +17 -0
  897. package/src/shims/font-google.ts +1 -1
  898. package/src/shims/font-local.ts +34 -0
  899. package/src/shims/headers.ts +122 -1
  900. package/src/shims/navigation-client.ts +51 -29
  901. package/src/shims/navigation.ts +14 -7
  902. package/src/utils/state-machine.ts +111 -0
  903. package/dist/_chunks/als-registry-B7DbZ2hS.js +0 -41
  904. package/dist/_chunks/als-registry-B7DbZ2hS.js.map +0 -1
  905. package/dist/_chunks/debug-B3Gypr3D.js +0 -108
  906. package/dist/_chunks/debug-B3Gypr3D.js.map +0 -1
  907. package/dist/_chunks/format-RyoGQL74.js +0 -164
  908. package/dist/_chunks/format-RyoGQL74.js.map +0 -1
  909. package/dist/_chunks/interception-BOoWmLUA.js +0 -676
  910. package/dist/_chunks/interception-BOoWmLUA.js.map +0 -1
  911. package/dist/_chunks/metadata-routes-Cjmvi3rQ.js.map +0 -1
  912. package/dist/_chunks/request-context-BQUC8PHn.js +0 -330
  913. package/dist/_chunks/request-context-BQUC8PHn.js.map +0 -1
  914. package/dist/_chunks/ssr-data-MjmprTmO.js.map +0 -1
  915. package/dist/_chunks/tracing-CemImE6h.js +0 -187
  916. package/dist/_chunks/tracing-CemImE6h.js.map +0 -1
  917. package/dist/_chunks/use-cookie-DX-l1_5E.js +0 -91
  918. package/dist/_chunks/use-cookie-DX-l1_5E.js.map +0 -1
  919. package/dist/_chunks/use-query-states-D5KaffOK.js.map +0 -1
  920. package/dist/cache/index.js.map +0 -1
  921. package/dist/cache/register-cached-function.d.ts +0 -17
  922. package/dist/cache/register-cached-function.d.ts.map +0 -1
  923. package/dist/client/browser-entry.d.ts +0 -21
  924. package/dist/client/browser-entry.d.ts.map +0 -1
  925. package/dist/client/head.d.ts +0 -16
  926. package/dist/client/head.d.ts.map +0 -1
  927. package/dist/client/link-status-provider.d.ts +0 -11
  928. package/dist/client/link-status-provider.d.ts.map +0 -1
  929. package/dist/client/segment-merger.d.ts +0 -119
  930. package/dist/client/segment-merger.d.ts.map +0 -1
  931. package/dist/client/stale-reload.d.ts +0 -44
  932. package/dist/client/stale-reload.d.ts.map +0 -1
  933. package/dist/client/transition-root.d.ts +0 -74
  934. package/dist/client/transition-root.d.ts.map +0 -1
  935. package/dist/client/use-navigation-pending.d.ts +0 -26
  936. package/dist/client/use-navigation-pending.d.ts.map +0 -1
  937. package/dist/client/use-params.d.ts.map +0 -1
  938. package/dist/plugins/cache-transform.d.ts +0 -36
  939. package/dist/plugins/cache-transform.d.ts.map +0 -1
  940. package/dist/plugins/dev-error-overlay.d.ts +0 -60
  941. package/dist/plugins/dev-error-overlay.d.ts.map +0 -1
  942. package/dist/plugins/dev-logs.d.ts.map +0 -1
  943. package/dist/plugins/dynamic-transform.d.ts +0 -72
  944. package/dist/plugins/dynamic-transform.d.ts.map +0 -1
  945. package/dist/plugins/server-action-exports.d.ts +0 -26
  946. package/dist/plugins/server-action-exports.d.ts.map +0 -1
  947. package/dist/routing/status-file-lint.d.ts +0 -33
  948. package/dist/routing/status-file-lint.d.ts.map +0 -1
  949. package/dist/search-params/analyze.d.ts +0 -54
  950. package/dist/search-params/analyze.d.ts.map +0 -1
  951. package/dist/search-params/builtin-codecs.d.ts +0 -105
  952. package/dist/search-params/builtin-codecs.d.ts.map +0 -1
  953. package/dist/search-params/codecs.d.ts +0 -53
  954. package/dist/search-params/codecs.d.ts.map +0 -1
  955. package/dist/search-params/create.d.ts +0 -106
  956. package/dist/search-params/create.d.ts.map +0 -1
  957. package/dist/server/client-module-map.d.ts +0 -47
  958. package/dist/server/client-module-map.d.ts.map +0 -1
  959. package/dist/server/dev-fetch-instrumentation.d.ts +0 -22
  960. package/dist/server/dev-fetch-instrumentation.d.ts.map +0 -1
  961. package/dist/server/dev-logger.d.ts.map +0 -1
  962. package/dist/server/dev-span-processor.d.ts +0 -29
  963. package/dist/server/dev-span-processor.d.ts.map +0 -1
  964. package/dist/server/dev-warnings.d.ts +0 -129
  965. package/dist/server/dev-warnings.d.ts.map +0 -1
  966. package/dist/server/flush.d.ts +0 -74
  967. package/dist/server/flush.d.ts.map +0 -1
  968. package/dist/server/manifest-status-resolver.d.ts +0 -58
  969. package/dist/server/manifest-status-resolver.d.ts.map +0 -1
  970. package/dist/server/prerender.d.ts +0 -77
  971. package/dist/server/prerender.d.ts.map +0 -1
  972. package/dist/utils/directive-parser.d.ts +0 -70
  973. package/dist/utils/directive-parser.d.ts.map +0 -1
  974. package/src/cache/register-cached-function.ts +0 -103
  975. package/src/client/browser-entry.ts +0 -678
  976. package/src/client/head.ts +0 -61
  977. package/src/client/link-status-provider.tsx +0 -30
  978. package/src/client/segment-merger.ts +0 -339
  979. package/src/client/stale-reload.ts +0 -87
  980. package/src/client/transition-root.tsx +0 -166
  981. package/src/client/use-navigation-pending.ts +0 -38
  982. package/src/plugins/cache-transform.ts +0 -199
  983. package/src/plugins/dev-error-overlay.ts +0 -230
  984. package/src/plugins/dynamic-transform.ts +0 -161
  985. package/src/plugins/server-action-exports.ts +0 -220
  986. package/src/routing/status-file-lint.ts +0 -112
  987. package/src/search-params/analyze.ts +0 -192
  988. package/src/search-params/builtin-codecs.ts +0 -228
  989. package/src/search-params/codecs.ts +0 -153
  990. package/src/search-params/create.ts +0 -321
  991. package/src/server/client-module-map.ts +0 -58
  992. package/src/server/dev-fetch-instrumentation.ts +0 -96
  993. package/src/server/dev-span-processor.ts +0 -78
  994. package/src/server/dev-warnings.ts +0 -283
  995. package/src/server/flush.ts +0 -182
  996. package/src/server/manifest-status-resolver.ts +0 -215
  997. package/src/server/prerender.ts +0 -139
  998. package/src/utils/directive-parser.ts +0 -529
@@ -0,0 +1,700 @@
1
+ /**
2
+ * timber-prebuilt — Vite plugin that detects `cache.component(...)` call
3
+ * sites and rewrites them to `__prebuilt(stableId, component, options)`.
4
+ *
5
+ * `timber.cache.component(Component, { prerender: true })` is a build-time
6
+ * transform, not a runtime function (design/44-render-at-build-time.md
7
+ * §Registration, surface API renamed by design/45-cache-lifetimes.md). The
8
+ * rewrite registers the component in the server-side prebuilt registry under
9
+ * a stable ID that keys its cached flight payloads.
10
+ *
11
+ * Detected callsite forms (mirrors timber-cache-transform, TIM-1054):
12
+ * - named imports, including aliases:
13
+ * `import { cache } from '@timber-js/app/cache'` + `cache.component(fn, opts)`
14
+ * - namespace imports:
15
+ * `import * as timber` + `timber.cache.component(fn, opts)`
16
+ * Computed access (`cache['component']`) is deliberately not matched — the
17
+ * untransformed call reaches the runtime `cache.component` fallback
18
+ * (cache/cache-api.ts), which warns once and renders dynamically.
19
+ *
20
+ * Matching is an ALLOWLIST of module-scope positions: the direct initializer
21
+ * of a top-level variable declarator (including exported ones) and a
22
+ * top-level `export default cache.component(...)`, with TS expression
23
+ * wrappers (`as`, `satisfies`, `!`) unwrapped. Nothing else is walked — no
24
+ * function/class/loop bodies, no params, no call arguments. Two reasons:
25
+ * (1) `__prebuilt` must register exactly once at module load time; the
26
+ * post-build capture pass walks the registry after loading modules, so a
27
+ * call inside a function registers too late to ever be prebuilt, and a call
28
+ * in a loop would re-register per iteration. (2) Name-based callee matching
29
+ * is only shadow-proof in these positions — nested scopes can rebind `cache`
30
+ * (`function render(cache) {...}`, `for (const cache of caches) ...`), and
31
+ * rewriting those would corrupt user code; a top-level declarator initializer
32
+ * cannot see a shadow of an import binding (redeclaration error). Calls in
33
+ * other positions fall back to the runtime path like other untraceable forms.
34
+ *
35
+ * The rewrite per mode:
36
+ * production: cache.component(fn, opts) → __prebuilt("<id>", fn, opts)
37
+ * dev: cache.component(fn, opts) → __prebuiltDev("<name>", fn, opts)
38
+ *
39
+ * with `import { __prebuilt } from '#server-internal'` prepended. In dev the
40
+ * wrapper is a no-op that logs once per component and renders dynamically —
41
+ * no caching, no markers (design/44 §Dev Mode).
42
+ *
43
+ * Component identity: `<name>_<hash16>`, e.g. `blogbody_a1b2c3d4e5f6a7b8`.
44
+ * The name prefix is the declaring variable's name (lowercased, for legible
45
+ * manifest keys and log lines); the hash is the same content-derived callsite
46
+ * scheme as the data cache transform (callsite-ast.ts) — deterministic across
47
+ * builds for unchanged calls, immune to inserting/reordering other calls, and
48
+ * fresh when the component or its options change. Component cache entries are
49
+ * per-deploy (design/45 §Per-deploy namespacing) so cross-deploy ID reuse is
50
+ * not a poisoning vector, but content-derived IDs keep prebuilt artifacts
51
+ * addressable across incremental edits for free.
52
+ *
53
+ * The transform is skipped in the client environment: server components never
54
+ * execute there, and `#server-internal` resolves to an empty stub in the
55
+ * client bundle (plugins/shims.ts).
56
+ *
57
+ * See TIM-1118, design/44-render-at-build-time.md, design/45-cache-lifetimes.md.
58
+ */
59
+
60
+ import { readFileSync } from 'node:fs';
61
+ import { relative } from 'node:path';
62
+ import MagicString from 'magic-string';
63
+ import { parseAst } from 'vite';
64
+ import type { Plugin } from 'vite';
65
+ import type { PluginContext } from '../plugin-context.js';
66
+ import type { SegmentNode } from '../routing/types.js';
67
+ import {
68
+ CACHE_MODULE_SOURCES,
69
+ findImportBindings,
70
+ generateStableCallsiteId,
71
+ } from './callsite-ast.js';
72
+ import { collectJsxUsages, recordCallSiteProps } from './callsite-jsx.js';
73
+ import { cleanPrebuiltDir, runPrebuiltCapture } from './prebuilt-capture.js';
74
+ import type {
75
+ CallExpressionNode,
76
+ IdentifierNode,
77
+ ImportBindings,
78
+ MemberExpressionNode,
79
+ PositionedNode,
80
+ ProgramNode,
81
+ } from './callsite-ast.js';
82
+
83
+ /**
84
+ * Is this callee `cache.component` (named import, aliases included) or
85
+ * `ns.cache.component` (namespace import)? Computed access is not matched.
86
+ */
87
+ function isCacheComponentCallee(callee: PositionedNode, bindings: ImportBindings): boolean {
88
+ if (callee.type !== 'MemberExpression') return false;
89
+ const member = callee as unknown as MemberExpressionNode;
90
+ if (
91
+ member.computed ||
92
+ member.property.type !== 'Identifier' ||
93
+ (member.property as IdentifierNode).name !== 'component'
94
+ ) {
95
+ return false;
96
+ }
97
+ // cache.component — object is a named-import binding of `cache`
98
+ if (member.object.type === 'Identifier') {
99
+ return bindings.named.has((member.object as IdentifierNode).name);
100
+ }
101
+ // ns.cache.component — object is `ns.cache` on a namespace import
102
+ if (member.object.type === 'MemberExpression') {
103
+ const inner = member.object as unknown as MemberExpressionNode;
104
+ return (
105
+ !inner.computed &&
106
+ inner.object.type === 'Identifier' &&
107
+ bindings.namespaces.has((inner.object as IdentifierNode).name) &&
108
+ inner.property.type === 'Identifier' &&
109
+ (inner.property as IdentifierNode).name === 'cache'
110
+ );
111
+ }
112
+ return false;
113
+ }
114
+
115
+ interface VariableDeclaratorNode extends PositionedNode {
116
+ type: 'VariableDeclarator';
117
+ id: PositionedNode;
118
+ init?: PositionedNode | null;
119
+ }
120
+
121
+ /**
122
+ * Offset where an injected import may be inserted: after the directive
123
+ * prologue ('use server', 'use strict', ...). Prepending at offset 0 would
124
+ * demote a leading directive to a plain expression statement — silently
125
+ * disabling it.
126
+ */
127
+ function importInsertionOffset(program: ProgramNode): number {
128
+ for (const stmt of program.body) {
129
+ const isDirective =
130
+ stmt.type === 'ExpressionStatement' &&
131
+ typeof (stmt as { directive?: unknown }).directive === 'string';
132
+ if (!isDirective) return stmt.start;
133
+ }
134
+ // All statements are directives — no call sites can exist, but be safe.
135
+ return program.body.length > 0 ? program.body[program.body.length - 1].end : 0;
136
+ }
137
+
138
+ /** TS/paren wrappers that may sit between a declarator and the call. */
139
+ const EXPRESSION_WRAPPER_TYPES = new Set([
140
+ 'TSAsExpression',
141
+ 'TSSatisfiesExpression',
142
+ 'TSNonNullExpression',
143
+ 'ParenthesizedExpression',
144
+ ]);
145
+
146
+ function unwrapExpression(node: PositionedNode): PositionedNode {
147
+ let current = node;
148
+ while (EXPRESSION_WRAPPER_TYPES.has(current.type) && current.expression) {
149
+ current = current.expression as PositionedNode;
150
+ }
151
+ return current;
152
+ }
153
+
154
+ interface ObjectPropertyNode extends PositionedNode {
155
+ type: 'Property';
156
+ computed?: boolean;
157
+ key: PositionedNode & { name?: string; value?: unknown };
158
+ value: PositionedNode & { value?: unknown };
159
+ }
160
+
161
+ /**
162
+ * Can this call site's options put the component in the prerender tier?
163
+ *
164
+ * Runtime-tier call sites (`ttl`/`tags` without `prerender`) must do NO
165
+ * build work — recording them would make the post-build hook import the
166
+ * built RSC entry (running production startup) and load route modules for
167
+ * routes that have nothing to prerender (codex P2 on PR #836). The answer
168
+ * is static only when the options argument is an object literal:
169
+ *
170
+ * - literal with `prerender: true` → yes
171
+ * - literal with `prerender: false`/absent → no (spread-free)
172
+ * - anything else (identifier, spread, non-literal `prerender` value)
173
+ * → conservatively yes — the capture pass re-checks the real options
174
+ * at runtime and skips non-prerender registrations; over-inclusion
175
+ * costs a wasted entry load, under-inclusion would silently skip
176
+ * prerendering.
177
+ */
178
+ function mayPrerender(call: CallExpressionNode): boolean {
179
+ if (call.arguments.length < 2) return false; // no options → no lifetime → never prerender
180
+ const options = unwrapExpression(call.arguments[1] as PositionedNode);
181
+ if (options.type !== 'ObjectExpression') return true;
182
+ const properties = (options as unknown as { properties: PositionedNode[] }).properties ?? [];
183
+ // Walk in source order with last-write-wins, mirroring object-literal
184
+ // evaluation: `{ prerender: false, ...opts }` may end up prerenderable
185
+ // (the spread can override), while `{ ...opts, prerender: false }`
186
+ // is statically false (codex P2 on PR #836). Computed keys are treated
187
+ // like spreads — they may evaluate to 'prerender'.
188
+ type Verdict = 'absent' | 'true' | 'false' | 'unknown';
189
+ let verdict: Verdict = 'absent';
190
+ for (const prop of properties) {
191
+ if (prop.type === 'SpreadElement') {
192
+ verdict = 'unknown';
193
+ continue;
194
+ }
195
+ if (prop.type !== 'Property') continue;
196
+ const property = prop as ObjectPropertyNode;
197
+ if (property.computed) {
198
+ verdict = 'unknown';
199
+ continue;
200
+ }
201
+ const keyName =
202
+ property.key.type === 'Identifier'
203
+ ? property.key.name
204
+ : property.key.type === 'Literal'
205
+ ? String(property.key.value)
206
+ : undefined;
207
+ if (keyName !== 'prerender') continue;
208
+ const value = unwrapExpression(property.value);
209
+ if (value.type === 'Literal') {
210
+ verdict = (value as { value?: unknown }).value === true ? 'true' : 'false';
211
+ } else {
212
+ verdict = 'unknown'; // `prerender: flag` — not statically known
213
+ }
214
+ }
215
+ return verdict === 'true' || verdict === 'unknown';
216
+ }
217
+
218
+ interface CandidateSite {
219
+ call: CallExpressionNode;
220
+ stmt: PositionedNode;
221
+ displayName: string;
222
+ }
223
+
224
+ /**
225
+ * Collect matching call sites from the allowlisted module-scope positions:
226
+ * top-level (possibly exported) variable declarator initializers and
227
+ * `export default` expressions. Returned in source order. The display name
228
+ * is the declaring variable's name, or 'Component' for default exports.
229
+ */
230
+ function collectModuleScopeSites(program: ProgramNode, bindings: ImportBindings): CandidateSite[] {
231
+ const isMatch = (node: PositionedNode): node is CallExpressionNode =>
232
+ node.type === 'CallExpression' &&
233
+ (node as unknown as CallExpressionNode).arguments.length >= 1 &&
234
+ (node as unknown as CallExpressionNode).arguments.length <= 2 &&
235
+ isCacheComponentCallee((node as unknown as CallExpressionNode).callee, bindings);
236
+
237
+ const sites: CandidateSite[] = [];
238
+ for (const stmt of program.body) {
239
+ if (stmt.type === 'ExportDefaultDeclaration' && stmt.declaration) {
240
+ const call = unwrapExpression(stmt.declaration as PositionedNode);
241
+ if (isMatch(call)) sites.push({ call, stmt, displayName: 'Component' });
242
+ continue;
243
+ }
244
+ let decl = stmt;
245
+ if (stmt.type === 'ExportNamedDeclaration' && stmt.declaration) {
246
+ decl = stmt.declaration as PositionedNode;
247
+ }
248
+ if (decl.type !== 'VariableDeclaration' || !Array.isArray(decl.declarations)) continue;
249
+ for (const d of decl.declarations as VariableDeclaratorNode[]) {
250
+ if (!d.init) continue;
251
+ const call = unwrapExpression(d.init as PositionedNode);
252
+ if (!isMatch(call)) continue;
253
+ const displayName = d.id.type === 'Identifier' ? (d.id as IdentifierNode).name : 'Component';
254
+ sites.push({ call, stmt, displayName });
255
+ }
256
+ }
257
+ return sites;
258
+ }
259
+
260
+ /**
261
+ * Generate the stable component ID for a cache.component() call site:
262
+ * `<sanitized-name>_<content-hash16>`. Exported for testing.
263
+ */
264
+ export function generatePrebuiltId(
265
+ relativeModulePath: string,
266
+ statementText: string,
267
+ callSpanText: string,
268
+ occurrence: number,
269
+ displayName: string
270
+ ): string {
271
+ const prefix = displayName.toLowerCase().replace(/[^a-z0-9]/g, '') || 'component';
272
+ const hash = generateStableCallsiteId(
273
+ relativeModulePath,
274
+ 'component',
275
+ statementText,
276
+ callSpanText,
277
+ occurrence
278
+ );
279
+ return `${prefix}_${hash}`;
280
+ }
281
+
282
+ // ─── Route → component attribution (module-graph walk) ────────────────────
283
+
284
+ /** Rollup getModuleInfo shape (subset — static + dynamic imports). */
285
+ export interface PrebuiltModuleInfo {
286
+ importedIds: string[];
287
+ dynamicallyImportedIds?: string[];
288
+ }
289
+
290
+ /**
291
+ * Collect the prebuilt component IDs transitively reachable from a route
292
+ * file, following static AND dynamic imports. Same pattern as the
293
+ * client-reference walk in build-manifest.ts; dynamic imports are included
294
+ * because a dynamically-imported module still registers its components
295
+ * when it eventually loads — attribution over-approximating registration
296
+ * is handled at capture time (an attributed-but-unregistered component is
297
+ * reported and skipped).
298
+ */
299
+ export function collectReachablePrebuiltComponents(
300
+ entryModuleId: string,
301
+ moduleComponents: Map<string, string[]>,
302
+ getModuleInfo: (id: string) => PrebuiltModuleInfo | null
303
+ ): string[] {
304
+ const visited = new Set<string>();
305
+ const result = new Set<string>();
306
+ const stack = [entryModuleId];
307
+ while (stack.length > 0) {
308
+ const moduleId = stack.pop()!;
309
+ if (visited.has(moduleId)) continue;
310
+ visited.add(moduleId);
311
+ const ids = moduleComponents.get(moduleId);
312
+ if (ids) for (const id of ids) result.add(id);
313
+ const info = getModuleInfo(moduleId);
314
+ if (!info) continue;
315
+ for (const imported of info.importedIds) stack.push(imported);
316
+ for (const imported of info.dynamicallyImportedIds ?? []) stack.push(imported);
317
+ }
318
+ return Array.from(result);
319
+ }
320
+
321
+ /**
322
+ * Collect page and layout file paths from the scanned route tree — the
323
+ * walk roots for attribution. Slots and intercepting/private segments are
324
+ * excluded, mirroring the capture pass's route walk
325
+ * (server/prebuilt-builder.ts §collectCandidateRoutes).
326
+ */
327
+ function collectPageAndLayoutFiles(root: SegmentNode): string[] {
328
+ const files: string[] = [];
329
+ const walk = (node: SegmentNode) => {
330
+ if (node.segmentType === 'intercepting' || node.segmentType === 'private') return;
331
+ if (node.page) files.push(node.page.filePath);
332
+ if (node.layout) files.push(node.layout.filePath);
333
+ for (const child of node.children) walk(child);
334
+ };
335
+ walk(root);
336
+ return files;
337
+ }
338
+
339
+ /**
340
+ * For a route file (page/layout), check if it imports from any prebuilt-
341
+ * declaring module and extract JSX call-site props for those bindings.
342
+ * Uses `getModuleInfo` to get the RESOLVED import targets and the module's
343
+ * transformed code (available on Rollup's ModuleInfo at generateBundle).
344
+ */
345
+ function collectCrossModuleProps(
346
+ ctx: PluginContext,
347
+ moduleId: string,
348
+ getInfo: (id: string) => PrebuiltModuleInfo | null
349
+ ): void {
350
+ const bindingNames = ctx.prebuiltBindingNames!;
351
+
352
+ const info = getInfo(moduleId);
353
+ if (!info) return;
354
+
355
+ // Which of this module's imports are prebuilt-declaring modules?
356
+ // Exclude self — same-module usages are already captured in the transform.
357
+ const declaringImports = info.importedIds.filter((id) => bindingNames.has(id) && id !== moduleId);
358
+ if (declaringImports.length === 0) return;
359
+
360
+ // Collect exported binding names from reachable declaring modules.
361
+ // On collision (two declaring modules export the same name) drop the
362
+ // entry — we can't tell which import it came from without resolving the
363
+ // raw specifier, and a wrong match would produce spurious cache entries.
364
+ const exportNameToId = new Map<string, string>();
365
+ const collisions = new Set<string>();
366
+ for (const declId of declaringImports) {
367
+ const map = bindingNames.get(declId)!;
368
+ for (const [name, compId] of map) {
369
+ if (exportNameToId.has(name)) collisions.add(name);
370
+ exportNameToId.set(name, compId);
371
+ }
372
+ }
373
+ for (const name of collisions) exportNameToId.delete(name);
374
+
375
+ // Read the route file source. getModuleInfo may provide `code` on
376
+ // Vite's extended Rollup interface; fall back to reading from disk.
377
+ let source: string | null = null;
378
+ const extInfo = getInfo(moduleId) as unknown as { code?: string | null };
379
+ if (extInfo && typeof extInfo.code === 'string') {
380
+ source = extInfo.code;
381
+ } else {
382
+ try {
383
+ source = readFileSync(moduleId, 'utf8');
384
+ } catch {
385
+ return;
386
+ }
387
+ }
388
+ if (!source) return;
389
+
390
+ let program: ProgramNode;
391
+ try {
392
+ program = parseAst(source, { lang: 'tsx' }) as unknown as ProgramNode;
393
+ } catch {
394
+ return;
395
+ }
396
+
397
+ // Build local-name → componentId by matching import specifiers against
398
+ // the known exported binding names from declaring modules.
399
+ const localToComponentId = new Map<string, string>();
400
+ for (const stmt of program.body) {
401
+ if (stmt.type !== 'ImportDeclaration') continue;
402
+ const importDecl = stmt as unknown as {
403
+ specifiers: Array<{
404
+ type: string;
405
+ local: { name: string };
406
+ imported?: { name: string };
407
+ }>;
408
+ };
409
+ for (const spec of importDecl.specifiers) {
410
+ if (spec.type === 'ImportSpecifier') {
411
+ const exportedName = spec.imported?.name ?? spec.local.name;
412
+ const compId = exportNameToId.get(exportedName);
413
+ if (compId) localToComponentId.set(spec.local.name, compId);
414
+ } else if (spec.type === 'ImportDefaultSpecifier') {
415
+ // Default exports may be declared as `export default cache.component(...)`
416
+ // (recorded as 'Component') or `const X = cache.component(...); export default X`
417
+ // (recorded under the variable name 'X'). When the declaring module has
418
+ // exactly one prebuilt binding, a default import unambiguously refers to it.
419
+ const compId = exportNameToId.get('Component') ?? exportNameToId.get('default');
420
+ if (compId) {
421
+ localToComponentId.set(spec.local.name, compId);
422
+ } else if (exportNameToId.size === 1) {
423
+ const [, soleId] = [...exportNameToId.entries()][0];
424
+ localToComponentId.set(spec.local.name, soleId);
425
+ }
426
+ }
427
+ }
428
+ }
429
+ if (localToComponentId.size === 0) return;
430
+
431
+ const usages = collectJsxUsages(program, new Set(localToComponentId.keys()));
432
+ for (const [localName, propsList] of usages) {
433
+ const componentId = localToComponentId.get(localName);
434
+ if (!componentId) continue;
435
+ for (const props of propsList) {
436
+ if (props === null) continue;
437
+ recordCallSiteProps(ctx, componentId, props);
438
+ }
439
+ }
440
+ }
441
+
442
+ export function timberPrebuilt(ctx: PluginContext): Plugin {
443
+ return {
444
+ name: 'timber-prebuilt',
445
+
446
+ transform(code, id) {
447
+ // Drop this module's stale attribution first — in a long-lived
448
+ // `vite build --watch` process the plugin context outlives builds,
449
+ // and an edit that removes a module's prerender call sites must
450
+ // remove its recorded IDs even when this transform exits early
451
+ // below (codex P2 on PR #836). Re-recorded at the bottom if the
452
+ // edited module still has prerender-capable call sites.
453
+ if (!ctx.dev && this?.environment?.name === 'rsc') {
454
+ ctx.prebuiltModuleComponents?.delete(id);
455
+ }
456
+ if (!code.includes('@timber-js/app/cache') && !code.includes('timber/cache')) return;
457
+ // Skip node_modules (don't transform third-party code)
458
+ if (id.includes('node_modules')) return;
459
+ // Skip the client environment — server components never execute there
460
+ // and #server-internal resolves to an empty stub.
461
+ if (this?.environment?.name === 'client') return;
462
+
463
+ let program: ProgramNode;
464
+ try {
465
+ program = parseAst(code, { lang: 'tsx' }) as unknown as ProgramNode;
466
+ } catch {
467
+ return;
468
+ }
469
+
470
+ const bindings = findImportBindings(program, CACHE_MODULE_SOURCES, 'cache');
471
+ if (bindings.named.size === 0 && bindings.namespaces.size === 0) return;
472
+
473
+ // Allowlisted module-scope positions only — each site carries its
474
+ // enclosing statement's source text (into the ID hash) and the
475
+ // declaring variable's name (display name). Already in source order.
476
+ const callSites = collectModuleScopeSites(program, bindings);
477
+ if (callSites.length === 0) return;
478
+
479
+ const root = ctx.root || process.cwd();
480
+ const relPath = relative(root, id);
481
+ const s = new MagicString(code);
482
+ const occurrences = new Map<string, number>();
483
+ const wrapperName = ctx.dev ? '__prebuiltDev' : '__prebuilt';
484
+ const componentIds: string[] = [];
485
+
486
+ for (const { call, stmt, displayName } of callSites) {
487
+ const stmtText = code.slice(stmt.start, stmt.end);
488
+ const spanText = code.slice(call.start, call.end);
489
+ // Byte-identical (statement, call) pairs are only possible via `var`
490
+ // redeclaration; the occurrence index keeps their IDs distinct.
491
+ const dupKey = stmtText + String.fromCharCode(0) + spanText;
492
+ const occurrence = occurrences.get(dupKey) ?? 0;
493
+ occurrences.set(dupKey, occurrence + 1);
494
+
495
+ // Production gets the stable ID (keys build artifacts and cache
496
+ // entries); dev gets the display name (only used for the one-time
497
+ // "rendering dynamically" log).
498
+ const firstArg = ctx.dev
499
+ ? displayName
500
+ : generatePrebuiltId(relPath, stmtText, spanText, occurrence, displayName);
501
+ // Only prerender-capable call sites feed the capture attribution —
502
+ // runtime-tier components (ttl/tags only) must do no build work.
503
+ if (!ctx.dev && mayPrerender(call)) componentIds.push(firstArg);
504
+
505
+ s.overwrite(call.callee.start, call.callee.end, wrapperName);
506
+ s.appendLeft(call.arguments[0].start, `${JSON.stringify(firstArg)}, `);
507
+ }
508
+
509
+ // Record this module's component IDs for the RSC generateBundle
510
+ // module-graph walk (route → component attribution, TIM-1119).
511
+ if (!ctx.dev && componentIds.length > 0 && this?.environment?.name === 'rsc') {
512
+ ctx.prebuiltModuleComponents ??= new Map();
513
+ ctx.prebuiltModuleComponents.set(id, componentIds);
514
+
515
+ // Record binding name → component ID mapping for cross-module
516
+ // prop detection at generateBundle time (TIM-1142).
517
+ const bindingMap = new Map<string, string>();
518
+ let componentIdIdx = 0;
519
+ for (const { call, displayName } of callSites) {
520
+ if (!ctx.dev && mayPrerender(call)) {
521
+ bindingMap.set(displayName, componentIds[componentIdIdx++]);
522
+ }
523
+ }
524
+ // Detect `export default <identifier>` re-exports that reference
525
+ // a declared binding and add a 'default' alias so cross-module
526
+ // default imports can resolve the component ID.
527
+ for (const stmt of program.body) {
528
+ if (
529
+ stmt.type === 'ExportDefaultDeclaration' &&
530
+ stmt.declaration &&
531
+ (stmt.declaration as PositionedNode).type === 'Identifier'
532
+ ) {
533
+ const name = (stmt.declaration as PositionedNode as unknown as IdentifierNode).name;
534
+ if (bindingMap.has(name) && !bindingMap.has('default')) {
535
+ bindingMap.set('default', bindingMap.get(name)!);
536
+ }
537
+ }
538
+ }
539
+
540
+ if (bindingMap.size > 0) {
541
+ ctx.prebuiltBindingNames ??= new Map();
542
+ ctx.prebuiltBindingNames.set(id, bindingMap);
543
+ }
544
+
545
+ // Same-module JSX usages: if a prebuilt component is declared AND
546
+ // used (<BlogBody variant="full" />) in the same module, capture
547
+ // its static call-site props here (TIM-1142, design/44 §Props).
548
+ const declaredBindings = new Set(bindingMap.keys());
549
+ if (declaredBindings.size > 0) {
550
+ const usages = collectJsxUsages(program, declaredBindings);
551
+ for (const [bindingName, propsList] of usages) {
552
+ const compId = bindingMap.get(bindingName);
553
+ if (!compId) continue;
554
+ for (const props of propsList) {
555
+ if (props === null) {
556
+ // Dynamic props at this call site — warn at build time,
557
+ // this usage will always render live (design/44 §Props
558
+ // Derivation limitation).
559
+ continue;
560
+ }
561
+ recordCallSiteProps(ctx, compId, props);
562
+ }
563
+ }
564
+ }
565
+ }
566
+
567
+ s.appendLeft(
568
+ importInsertionOffset(program),
569
+ `import { ${wrapperName} } from '#server-internal';\n`
570
+ );
571
+
572
+ return {
573
+ code: s.toString(),
574
+ map: s.generateMap({ hires: 'boundary' }),
575
+ };
576
+ },
577
+
578
+ /**
579
+ * RSC environment, production: walk each route file's module graph to
580
+ * attribute prebuilt components to the routes that can render them.
581
+ * The graph walk (rather than load-order registry deltas) is what makes
582
+ * SHARED components work — a component imported by several routes is
583
+ * captured under every importing route's param combos.
584
+ */
585
+ generateBundle(
586
+ _options?: unknown,
587
+ bundle?: Record<
588
+ string,
589
+ { type: string; modules?: Record<string, unknown>; fileName?: string }
590
+ >
591
+ ) {
592
+ if (ctx.dev) return;
593
+ if (this?.environment?.name !== 'rsc') return;
594
+ // Recompute attribution from scratch every build — a stale map from
595
+ // a previous watch-mode build would otherwise keep scheduling the
596
+ // capture (and its built-entry import) for components that no
597
+ // longer exist (codex P2 on PR #836).
598
+ ctx.routePrebuiltComponents = undefined;
599
+ const moduleComponents = ctx.prebuiltModuleComponents;
600
+ if (!moduleComponents || moduleComponents.size === 0 || !ctx.routeTree) return;
601
+
602
+ const self = this as unknown as {
603
+ getModuleInfo?: (id: string) => PrebuiltModuleInfo | null;
604
+ };
605
+ const getInfo = (id: string) => self.getModuleInfo?.(id) ?? null;
606
+
607
+ const routeComponents = new Map<string, string[]>();
608
+ for (const filePath of collectPageAndLayoutFiles(ctx.routeTree.root)) {
609
+ const ids = collectReachablePrebuiltComponents(filePath, moduleComponents, getInfo);
610
+ if (ids.length > 0) routeComponents.set(filePath, ids);
611
+ }
612
+ if (routeComponents.size > 0) {
613
+ ctx.routePrebuiltComponents = routeComponents;
614
+
615
+ // Build a map of componentId → chunk fileName for declaring
616
+ // modules that aren't route files themselves (behind dynamic
617
+ // imports like import.meta.glob). The capture pass imports these
618
+ // chunks to trigger cache.component() registration.
619
+ if (bundle) {
620
+ const routeFileSet = new Set(routeComponents.keys());
621
+ const lazyChunks = new Map<string, string>();
622
+ for (const [moduleId, componentIds] of moduleComponents) {
623
+ if (routeFileSet.has(moduleId)) continue;
624
+ for (const [, chunk] of Object.entries(bundle)) {
625
+ if (chunk.type !== 'chunk' || !chunk.modules) continue;
626
+ if (moduleId in chunk.modules) {
627
+ for (const id of componentIds) lazyChunks.set(id, chunk.fileName!);
628
+ break;
629
+ }
630
+ }
631
+ }
632
+ if (lazyChunks.size > 0) ctx.prebuiltLazyChunks = lazyChunks;
633
+ }
634
+
635
+ // Cross-module call-site prop detection (TIM-1142): walk the
636
+ // module graph from each route file and scan ALL reachable modules
637
+ // for JSX usages of prebuilt components — not just the route files
638
+ // themselves. A component used in a helper (page → Shell → <BlogBody>)
639
+ // must have its props captured from wherever the JSX lives.
640
+ if (ctx.prebuiltBindingNames && ctx.prebuiltBindingNames.size > 0) {
641
+ const scannedModules = new Set<string>();
642
+ for (const filePath of routeComponents.keys()) {
643
+ const visited = new Set<string>();
644
+ const stack = [filePath];
645
+ while (stack.length > 0) {
646
+ const modId = stack.pop()!;
647
+ if (visited.has(modId)) continue;
648
+ visited.add(modId);
649
+ if (!scannedModules.has(modId)) {
650
+ scannedModules.add(modId);
651
+ collectCrossModuleProps(ctx, modId, getInfo);
652
+ }
653
+ const modInfo = getInfo(modId);
654
+ if (!modInfo) continue;
655
+ for (const imp of modInfo.importedIds) stack.push(imp);
656
+ for (const imp of modInfo.dynamicallyImportedIds ?? []) stack.push(imp);
657
+ }
658
+ }
659
+ }
660
+ } else {
661
+ // Call sites were transformed but none are reachable from any route
662
+ // file — either they live behind slots (not modeled) or the graph
663
+ // walk's module IDs diverged from the route tree's file paths. Say
664
+ // so loudly: the alternative is prerender silently doing nothing.
665
+ console.warn(
666
+ `[timber] cache.component: ${moduleComponents.size} module(s) declare prebuilt ` +
667
+ `components, but none are reachable from any page or layout — no payloads ` +
668
+ `will be prerendered`
669
+ );
670
+ }
671
+ },
672
+
673
+ /**
674
+ * Post-build capture (design/44 §Build Phase). `order: 'post'` runs
675
+ * after the RSC plugin's buildApp — all five build steps are complete —
676
+ * and BEFORE timber-adapter-build's post hook (plugin array order), so
677
+ * `prebuilt/` exists when the adapter assembles its output (TIM-1122).
678
+ */
679
+ buildApp: {
680
+ order: 'post' as const,
681
+ async handler() {
682
+ if (ctx.dev) return;
683
+ ctx.captureSummary = undefined;
684
+ // Always shed a previous build's artifacts first — even when THIS
685
+ // build captures nothing, a stale manifest must never ship.
686
+ await cleanPrebuiltDir(ctx.buildDir);
687
+ if (!ctx.routePrebuiltComponents || ctx.routePrebuiltComponents.size === 0) return;
688
+ if (ctx.config.output === 'static') {
689
+ // design/44 §output: 'static' — everything already renders at
690
+ // build time there; the wrapper is a no-op, not an error.
691
+ console.log(
692
+ `[timber] cache.component: skipped prerender capture (output: 'static' renders all components at build time)`
693
+ );
694
+ return;
695
+ }
696
+ ctx.captureSummary = await runPrebuiltCapture(ctx);
697
+ },
698
+ },
699
+ };
700
+ }