@timber-js/app 0.2.0-alpha.8 → 0.2.0-alpha.81

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 (571) hide show
  1. package/LICENSE +8 -0
  2. package/dist/_chunks/actions-Dg-ANYHb.js +421 -0
  3. package/dist/_chunks/actions-Dg-ANYHb.js.map +1 -0
  4. package/dist/_chunks/{als-registry-B7DbZ2hS.js → als-registry-HS0LGUl2.js} +1 -1
  5. package/dist/_chunks/als-registry-HS0LGUl2.js.map +1 -0
  6. package/dist/_chunks/chunk-DYhsFzuS.js +33 -0
  7. package/dist/_chunks/{debug-gwlJkDuf.js → debug-ECi_61pb.js} +2 -2
  8. package/dist/_chunks/debug-ECi_61pb.js.map +1 -0
  9. package/dist/_chunks/define-C77ScO0m.js +106 -0
  10. package/dist/_chunks/define-C77ScO0m.js.map +1 -0
  11. package/dist/_chunks/define-CZqDwhSu.js +199 -0
  12. package/dist/_chunks/define-CZqDwhSu.js.map +1 -0
  13. package/dist/_chunks/define-cookie-C2IkoFGN.js +94 -0
  14. package/dist/_chunks/define-cookie-C2IkoFGN.js.map +1 -0
  15. package/dist/_chunks/{format-DviM89f0.js → dev-warnings-DpGRGoDi.js} +5 -44
  16. package/dist/_chunks/dev-warnings-DpGRGoDi.js.map +1 -0
  17. package/dist/_chunks/format-CYBGxKtc.js +14 -0
  18. package/dist/_chunks/format-CYBGxKtc.js.map +1 -0
  19. package/dist/_chunks/{interception-BOoWmLUA.js → interception-Dpn_UfAD.js} +171 -97
  20. package/dist/_chunks/interception-Dpn_UfAD.js.map +1 -0
  21. package/dist/_chunks/merge-search-params-Cm_KIWDX.js +41 -0
  22. package/dist/_chunks/merge-search-params-Cm_KIWDX.js.map +1 -0
  23. package/dist/_chunks/{metadata-routes-Cjmvi3rQ.js → metadata-routes-DS3eKNmf.js} +1 -1
  24. package/dist/_chunks/{metadata-routes-Cjmvi3rQ.js.map → metadata-routes-DS3eKNmf.js.map} +1 -1
  25. package/dist/_chunks/request-context-qMsWgy9C.js +478 -0
  26. package/dist/_chunks/request-context-qMsWgy9C.js.map +1 -0
  27. package/dist/_chunks/schema-bridge-C3xl_vfb.js +86 -0
  28. package/dist/_chunks/schema-bridge-C3xl_vfb.js.map +1 -0
  29. package/dist/_chunks/segment-classify-BDNn6EzD.js +65 -0
  30. package/dist/_chunks/segment-classify-BDNn6EzD.js.map +1 -0
  31. package/dist/_chunks/segment-context-fHFLF1PE.js +34 -0
  32. package/dist/_chunks/segment-context-fHFLF1PE.js.map +1 -0
  33. package/dist/_chunks/{ssr-data-MjmprTmO.js → ssr-data-DzuI0bIV.js} +1 -1
  34. package/dist/_chunks/{ssr-data-MjmprTmO.js.map → ssr-data-DzuI0bIV.js.map} +1 -1
  35. package/dist/_chunks/stale-reload-BX5gL1r-.js +64 -0
  36. package/dist/_chunks/stale-reload-BX5gL1r-.js.map +1 -0
  37. package/dist/_chunks/{tracing-CemImE6h.js → tracing-CCYbKn5n.js} +60 -9
  38. package/dist/_chunks/tracing-CCYbKn5n.js.map +1 -0
  39. package/dist/_chunks/use-params-Br9YSUFV.js +295 -0
  40. package/dist/_chunks/use-params-Br9YSUFV.js.map +1 -0
  41. package/dist/_chunks/{use-query-states-D5KaffOK.js → use-query-states-Lo_s_pw2.js} +4 -4
  42. package/dist/_chunks/use-query-states-Lo_s_pw2.js.map +1 -0
  43. package/dist/adapters/cloudflare-dev.d.ts +109 -0
  44. package/dist/adapters/cloudflare-dev.d.ts.map +1 -0
  45. package/dist/adapters/cloudflare-dev.js +73 -0
  46. package/dist/adapters/cloudflare-dev.js.map +1 -0
  47. package/dist/adapters/cloudflare-kv-cache.d.ts +64 -0
  48. package/dist/adapters/cloudflare-kv-cache.d.ts.map +1 -0
  49. package/dist/adapters/cloudflare-kv-cache.js +95 -0
  50. package/dist/adapters/cloudflare-kv-cache.js.map +1 -0
  51. package/dist/adapters/cloudflare.d.ts +148 -12
  52. package/dist/adapters/cloudflare.d.ts.map +1 -1
  53. package/dist/adapters/cloudflare.js +135 -11
  54. package/dist/adapters/cloudflare.js.map +1 -1
  55. package/dist/adapters/compress-module.d.ts.map +1 -1
  56. package/dist/adapters/nitro.d.ts +17 -1
  57. package/dist/adapters/nitro.d.ts.map +1 -1
  58. package/dist/adapters/nitro.js +56 -13
  59. package/dist/adapters/nitro.js.map +1 -1
  60. package/dist/cache/cache-api.d.ts +24 -0
  61. package/dist/cache/cache-api.d.ts.map +1 -0
  62. package/dist/cache/handler-store.d.ts +31 -0
  63. package/dist/cache/handler-store.d.ts.map +1 -0
  64. package/dist/cache/index.d.ts +23 -7
  65. package/dist/cache/index.d.ts.map +1 -1
  66. package/dist/cache/index.js +142 -80
  67. package/dist/cache/index.js.map +1 -1
  68. package/dist/cache/singleflight.d.ts +18 -1
  69. package/dist/cache/singleflight.d.ts.map +1 -1
  70. package/dist/cache/sizeof.d.ts +22 -0
  71. package/dist/cache/sizeof.d.ts.map +1 -0
  72. package/dist/cache/timber-cache.d.ts +1 -1
  73. package/dist/cache/timber-cache.d.ts.map +1 -1
  74. package/dist/cli.d.ts +6 -1
  75. package/dist/cli.d.ts.map +1 -1
  76. package/dist/cli.js +8 -3
  77. package/dist/cli.js.map +1 -1
  78. package/dist/client/browser-dev.d.ts +27 -1
  79. package/dist/client/browser-dev.d.ts.map +1 -1
  80. package/dist/client/browser-entry/action-dispatch.d.ts +17 -0
  81. package/dist/client/browser-entry/action-dispatch.d.ts.map +1 -0
  82. package/dist/client/browser-entry/hmr.d.ts +21 -0
  83. package/dist/client/browser-entry/hmr.d.ts.map +1 -0
  84. package/dist/client/browser-entry/hydrate.d.ts +46 -0
  85. package/dist/client/browser-entry/hydrate.d.ts.map +1 -0
  86. package/dist/client/browser-entry/index.d.ts +30 -0
  87. package/dist/client/browser-entry/index.d.ts.map +1 -0
  88. package/dist/client/browser-entry/post-hydration.d.ts +26 -0
  89. package/dist/client/browser-entry/post-hydration.d.ts.map +1 -0
  90. package/dist/client/browser-entry/router-init.d.ts +23 -0
  91. package/dist/client/browser-entry/router-init.d.ts.map +1 -0
  92. package/dist/client/browser-entry/rsc-stream.d.ts +24 -0
  93. package/dist/client/browser-entry/rsc-stream.d.ts.map +1 -0
  94. package/dist/client/browser-entry/scroll.d.ts +19 -0
  95. package/dist/client/browser-entry/scroll.d.ts.map +1 -0
  96. package/dist/client/error-boundary.d.ts +12 -5
  97. package/dist/client/error-boundary.d.ts.map +1 -1
  98. package/dist/client/error-boundary.js +10 -4
  99. package/dist/client/error-boundary.js.map +1 -1
  100. package/dist/client/error-reconstituter.d.ts +54 -0
  101. package/dist/client/error-reconstituter.d.ts.map +1 -0
  102. package/dist/client/form.d.ts +3 -3
  103. package/dist/client/form.d.ts.map +1 -1
  104. package/dist/client/history.d.ts +19 -4
  105. package/dist/client/history.d.ts.map +1 -1
  106. package/dist/client/index.d.ts +7 -21
  107. package/dist/client/index.d.ts.map +1 -1
  108. package/dist/client/index.js +210 -1017
  109. package/dist/client/index.js.map +1 -1
  110. package/dist/client/internal.d.ts +18 -0
  111. package/dist/client/internal.d.ts.map +1 -0
  112. package/dist/client/internal.js +890 -0
  113. package/dist/client/internal.js.map +1 -0
  114. package/dist/client/link-pending-store.d.ts +63 -0
  115. package/dist/client/link-pending-store.d.ts.map +1 -0
  116. package/dist/client/link.d.ts +90 -32
  117. package/dist/client/link.d.ts.map +1 -1
  118. package/dist/client/nav-link-store.d.ts +36 -0
  119. package/dist/client/nav-link-store.d.ts.map +1 -0
  120. package/dist/client/navigation-api-types.d.ts +90 -0
  121. package/dist/client/navigation-api-types.d.ts.map +1 -0
  122. package/dist/client/navigation-api.d.ts +115 -0
  123. package/dist/client/navigation-api.d.ts.map +1 -0
  124. package/dist/client/navigation-context.d.ts +13 -2
  125. package/dist/client/navigation-context.d.ts.map +1 -1
  126. package/dist/client/{transition-root.d.ts → navigation-root.d.ts} +42 -8
  127. package/dist/client/navigation-root.d.ts.map +1 -0
  128. package/dist/client/nuqs-adapter.d.ts.map +1 -1
  129. package/dist/client/router-ref.d.ts +1 -1
  130. package/dist/client/router.d.ts +70 -4
  131. package/dist/client/router.d.ts.map +1 -1
  132. package/dist/client/rsc-fetch.d.ts +38 -3
  133. package/dist/client/rsc-fetch.d.ts.map +1 -1
  134. package/dist/client/segment-cache.d.ts +1 -1
  135. package/dist/client/segment-cache.d.ts.map +1 -1
  136. package/dist/client/segment-outlet.d.ts +63 -0
  137. package/dist/client/segment-outlet.d.ts.map +1 -0
  138. package/dist/client/ssr-data.d.ts +13 -4
  139. package/dist/client/ssr-data.d.ts.map +1 -1
  140. package/dist/client/stale-reload.d.ts +15 -0
  141. package/dist/client/stale-reload.d.ts.map +1 -1
  142. package/dist/client/top-loader.d.ts +5 -5
  143. package/dist/client/top-loader.d.ts.map +1 -1
  144. package/dist/client/use-link-status.d.ts +5 -5
  145. package/dist/client/use-link-status.d.ts.map +1 -1
  146. package/dist/client/use-params.d.ts +6 -4
  147. package/dist/client/use-params.d.ts.map +1 -1
  148. package/dist/client/{use-navigation-pending.d.ts → use-pending-navigation.d.ts} +4 -4
  149. package/dist/client/use-pending-navigation.d.ts.map +1 -0
  150. package/dist/client/use-query-states.d.ts +1 -1
  151. package/dist/client/use-query-states.d.ts.map +1 -1
  152. package/dist/client/use-router.d.ts +1 -1
  153. package/dist/codec.d.ts +33 -0
  154. package/dist/codec.d.ts.map +1 -0
  155. package/dist/codec.js +2 -0
  156. package/dist/config-types.d.ts +227 -0
  157. package/dist/config-types.d.ts.map +1 -0
  158. package/dist/content/index.d.ts +1 -10
  159. package/dist/content/index.d.ts.map +1 -1
  160. package/dist/content/index.js +0 -2
  161. package/dist/cookies/define-cookie.d.ts +35 -14
  162. package/dist/cookies/define-cookie.d.ts.map +1 -1
  163. package/dist/cookies/index.js +1 -83
  164. package/dist/fonts/css.d.ts +1 -0
  165. package/dist/fonts/css.d.ts.map +1 -1
  166. package/dist/index.d.ts +45 -192
  167. package/dist/index.d.ts.map +1 -1
  168. package/dist/index.js +12357 -11925
  169. package/dist/index.js.map +1 -1
  170. package/dist/plugin-context.d.ts +107 -0
  171. package/dist/plugin-context.d.ts.map +1 -0
  172. package/dist/plugins/adapter-build.d.ts +1 -1
  173. package/dist/plugins/adapter-build.d.ts.map +1 -1
  174. package/dist/plugins/build-manifest.d.ts +2 -2
  175. package/dist/plugins/build-manifest.d.ts.map +1 -1
  176. package/dist/plugins/build-report.d.ts +3 -3
  177. package/dist/plugins/build-report.d.ts.map +1 -1
  178. package/dist/plugins/client-chunks.d.ts +32 -0
  179. package/dist/plugins/client-chunks.d.ts.map +1 -0
  180. package/dist/plugins/content.d.ts +1 -1
  181. package/dist/plugins/content.d.ts.map +1 -1
  182. package/dist/plugins/dev-browser-logs.d.ts +84 -0
  183. package/dist/plugins/dev-browser-logs.d.ts.map +1 -0
  184. package/dist/plugins/dev-error-overlay.d.ts +26 -1
  185. package/dist/plugins/dev-error-overlay.d.ts.map +1 -1
  186. package/dist/plugins/dev-logs.d.ts +1 -1
  187. package/dist/plugins/dev-logs.d.ts.map +1 -1
  188. package/dist/plugins/dev-server.d.ts +1 -1
  189. package/dist/plugins/dev-server.d.ts.map +1 -1
  190. package/dist/plugins/entries.d.ts +1 -1
  191. package/dist/plugins/entries.d.ts.map +1 -1
  192. package/dist/plugins/fonts.d.ts +19 -5
  193. package/dist/plugins/fonts.d.ts.map +1 -1
  194. package/dist/plugins/mdx.d.ts +1 -1
  195. package/dist/plugins/mdx.d.ts.map +1 -1
  196. package/dist/plugins/routing.d.ts +1 -1
  197. package/dist/plugins/routing.d.ts.map +1 -1
  198. package/dist/plugins/server-bundle.d.ts.map +1 -1
  199. package/dist/plugins/shims.d.ts +6 -5
  200. package/dist/plugins/shims.d.ts.map +1 -1
  201. package/dist/plugins/static-build.d.ts +4 -4
  202. package/dist/plugins/static-build.d.ts.map +1 -1
  203. package/dist/routing/codegen.d.ts +2 -2
  204. package/dist/routing/codegen.d.ts.map +1 -1
  205. package/dist/routing/index.d.ts +2 -0
  206. package/dist/routing/index.d.ts.map +1 -1
  207. package/dist/routing/index.js +3 -2
  208. package/dist/routing/scanner.d.ts.map +1 -1
  209. package/dist/routing/segment-classify.d.ts +46 -0
  210. package/dist/routing/segment-classify.d.ts.map +1 -0
  211. package/dist/routing/status-file-lint.d.ts +2 -1
  212. package/dist/routing/status-file-lint.d.ts.map +1 -1
  213. package/dist/routing/types.d.ts +16 -4
  214. package/dist/routing/types.d.ts.map +1 -1
  215. package/dist/rsc-runtime/rsc.d.ts +1 -1
  216. package/dist/rsc-runtime/rsc.d.ts.map +1 -1
  217. package/dist/rsc-runtime/ssr.d.ts +12 -0
  218. package/dist/rsc-runtime/ssr.d.ts.map +1 -1
  219. package/dist/schema-bridge.d.ts +76 -0
  220. package/dist/schema-bridge.d.ts.map +1 -0
  221. package/dist/search-params/define.d.ts +139 -0
  222. package/dist/search-params/define.d.ts.map +1 -0
  223. package/dist/search-params/index.d.ts +4 -7
  224. package/dist/search-params/index.d.ts.map +1 -1
  225. package/dist/search-params/index.js +32 -441
  226. package/dist/search-params/index.js.map +1 -1
  227. package/dist/search-params/registry.d.ts +2 -2
  228. package/dist/search-params/registry.d.ts.map +1 -1
  229. package/dist/search-params/wrappers.d.ts +53 -0
  230. package/dist/search-params/wrappers.d.ts.map +1 -0
  231. package/dist/segment-params/define.d.ts +78 -0
  232. package/dist/segment-params/define.d.ts.map +1 -0
  233. package/dist/segment-params/index.d.ts +3 -0
  234. package/dist/segment-params/index.d.ts.map +1 -0
  235. package/dist/segment-params/index.js +2 -0
  236. package/dist/server/access-gate.d.ts +4 -0
  237. package/dist/server/access-gate.d.ts.map +1 -1
  238. package/dist/server/action-client.d.ts +25 -6
  239. package/dist/server/action-client.d.ts.map +1 -1
  240. package/dist/server/action-encryption.d.ts +76 -0
  241. package/dist/server/action-encryption.d.ts.map +1 -0
  242. package/dist/server/action-handler.d.ts.map +1 -1
  243. package/dist/server/actions.d.ts +3 -6
  244. package/dist/server/actions.d.ts.map +1 -1
  245. package/dist/server/als-registry.d.ts +32 -4
  246. package/dist/server/als-registry.d.ts.map +1 -1
  247. package/dist/server/build-manifest.d.ts +2 -2
  248. package/dist/server/build-manifest.d.ts.map +1 -1
  249. package/dist/server/debug.d.ts +1 -1
  250. package/dist/server/default-logger.d.ts +22 -0
  251. package/dist/server/default-logger.d.ts.map +1 -0
  252. package/dist/server/deny-page-resolver.d.ts +52 -0
  253. package/dist/server/deny-page-resolver.d.ts.map +1 -0
  254. package/dist/server/deny-renderer.d.ts.map +1 -1
  255. package/dist/server/dev-holding-server.d.ts +52 -0
  256. package/dist/server/dev-holding-server.d.ts.map +1 -0
  257. package/dist/server/dev-warnings.d.ts +1 -21
  258. package/dist/server/dev-warnings.d.ts.map +1 -1
  259. package/dist/server/early-hints.d.ts +13 -5
  260. package/dist/server/early-hints.d.ts.map +1 -1
  261. package/dist/server/error-boundary-wrapper.d.ts +7 -1
  262. package/dist/server/error-boundary-wrapper.d.ts.map +1 -1
  263. package/dist/server/fallback-error.d.ts +4 -3
  264. package/dist/server/fallback-error.d.ts.map +1 -1
  265. package/dist/server/flight-injection-state.d.ts +66 -0
  266. package/dist/server/flight-injection-state.d.ts.map +1 -0
  267. package/dist/server/flight-scripts.d.ts +42 -0
  268. package/dist/server/flight-scripts.d.ts.map +1 -0
  269. package/dist/server/flush.d.ts.map +1 -1
  270. package/dist/server/form-data.d.ts +29 -0
  271. package/dist/server/form-data.d.ts.map +1 -1
  272. package/dist/server/html-injectors.d.ts +51 -11
  273. package/dist/server/html-injectors.d.ts.map +1 -1
  274. package/dist/server/index.d.ts +5 -43
  275. package/dist/server/index.d.ts.map +1 -1
  276. package/dist/server/index.js +37 -2798
  277. package/dist/server/index.js.map +1 -1
  278. package/dist/server/internal.d.ts +46 -0
  279. package/dist/server/internal.d.ts.map +1 -0
  280. package/dist/server/internal.js +2883 -0
  281. package/dist/server/internal.js.map +1 -0
  282. package/dist/server/logger.d.ts +25 -7
  283. package/dist/server/logger.d.ts.map +1 -1
  284. package/dist/server/middleware-runner.d.ts +19 -4
  285. package/dist/server/middleware-runner.d.ts.map +1 -1
  286. package/dist/server/node-stream-transforms.d.ts +113 -0
  287. package/dist/server/node-stream-transforms.d.ts.map +1 -0
  288. package/dist/server/page-deny-boundary.d.ts +31 -0
  289. package/dist/server/page-deny-boundary.d.ts.map +1 -0
  290. package/dist/server/pipeline-interception.d.ts +1 -1
  291. package/dist/server/pipeline-interception.d.ts.map +1 -1
  292. package/dist/server/pipeline-metadata.d.ts +6 -0
  293. package/dist/server/pipeline-metadata.d.ts.map +1 -1
  294. package/dist/server/pipeline.d.ts +42 -10
  295. package/dist/server/pipeline.d.ts.map +1 -1
  296. package/dist/server/primitives.d.ts +69 -18
  297. package/dist/server/primitives.d.ts.map +1 -1
  298. package/dist/server/render-timeout.d.ts +51 -0
  299. package/dist/server/render-timeout.d.ts.map +1 -0
  300. package/dist/server/request-context.d.ts +112 -43
  301. package/dist/server/request-context.d.ts.map +1 -1
  302. package/dist/server/route-element-builder.d.ts +27 -1
  303. package/dist/server/route-element-builder.d.ts.map +1 -1
  304. package/dist/server/route-handler.d.ts.map +1 -1
  305. package/dist/server/route-matcher.d.ts +9 -2
  306. package/dist/server/route-matcher.d.ts.map +1 -1
  307. package/dist/server/rsc-entry/api-handler.d.ts +2 -2
  308. package/dist/server/rsc-entry/api-handler.d.ts.map +1 -1
  309. package/dist/server/rsc-entry/error-renderer.d.ts +26 -13
  310. package/dist/server/rsc-entry/error-renderer.d.ts.map +1 -1
  311. package/dist/server/rsc-entry/helpers.d.ts +48 -5
  312. package/dist/server/rsc-entry/helpers.d.ts.map +1 -1
  313. package/dist/server/rsc-entry/index.d.ts +8 -3
  314. package/dist/server/rsc-entry/index.d.ts.map +1 -1
  315. package/dist/server/rsc-entry/rsc-payload.d.ts +3 -3
  316. package/dist/server/rsc-entry/rsc-payload.d.ts.map +1 -1
  317. package/dist/server/rsc-entry/rsc-stream.d.ts +4 -1
  318. package/dist/server/rsc-entry/rsc-stream.d.ts.map +1 -1
  319. package/dist/server/rsc-entry/ssr-bridge.d.ts +1 -1
  320. package/dist/server/rsc-entry/ssr-bridge.d.ts.map +1 -1
  321. package/dist/server/rsc-entry/ssr-renderer.d.ts +19 -4
  322. package/dist/server/rsc-entry/ssr-renderer.d.ts.map +1 -1
  323. package/dist/server/safe-load.d.ts +46 -0
  324. package/dist/server/safe-load.d.ts.map +1 -0
  325. package/dist/server/sitemap-generator.d.ts +129 -0
  326. package/dist/server/sitemap-generator.d.ts.map +1 -0
  327. package/dist/server/sitemap-handler.d.ts +22 -0
  328. package/dist/server/sitemap-handler.d.ts.map +1 -0
  329. package/dist/server/slot-resolver.d.ts +1 -1
  330. package/dist/server/slot-resolver.d.ts.map +1 -1
  331. package/dist/server/ssr-entry.d.ts +22 -0
  332. package/dist/server/ssr-entry.d.ts.map +1 -1
  333. package/dist/server/ssr-render.d.ts +39 -21
  334. package/dist/server/ssr-render.d.ts.map +1 -1
  335. package/dist/server/ssr-wrappers.d.ts +50 -0
  336. package/dist/server/ssr-wrappers.d.ts.map +1 -0
  337. package/dist/server/status-code-resolver.d.ts +1 -1
  338. package/dist/server/status-code-resolver.d.ts.map +1 -1
  339. package/dist/server/stream-utils.d.ts +36 -0
  340. package/dist/server/stream-utils.d.ts.map +1 -0
  341. package/dist/server/tracing.d.ts +4 -4
  342. package/dist/server/tracing.d.ts.map +1 -1
  343. package/dist/server/tree-builder.d.ts +22 -19
  344. package/dist/server/tree-builder.d.ts.map +1 -1
  345. package/dist/server/types.d.ts +1 -4
  346. package/dist/server/types.d.ts.map +1 -1
  347. package/dist/server/version-skew.d.ts +61 -0
  348. package/dist/server/version-skew.d.ts.map +1 -0
  349. package/dist/shared/merge-search-params.d.ts +22 -0
  350. package/dist/shared/merge-search-params.d.ts.map +1 -0
  351. package/dist/shims/font-google.d.ts +1 -1
  352. package/dist/shims/font-google.d.ts.map +1 -1
  353. package/dist/shims/font-google.js +42 -0
  354. package/dist/shims/font-google.js.map +1 -0
  355. package/dist/shims/font-local.d.ts +26 -0
  356. package/dist/shims/font-local.d.ts.map +1 -0
  357. package/dist/shims/font-local.js +20 -0
  358. package/dist/shims/font-local.js.map +1 -0
  359. package/dist/shims/headers.d.ts +2 -1
  360. package/dist/shims/headers.d.ts.map +1 -1
  361. package/dist/shims/navigation-client.d.ts +1 -1
  362. package/dist/shims/navigation-client.d.ts.map +1 -1
  363. package/dist/shims/navigation.d.ts +3 -2
  364. package/dist/shims/navigation.d.ts.map +1 -1
  365. package/dist/utils/directive-parser.d.ts +5 -2
  366. package/dist/utils/directive-parser.d.ts.map +1 -1
  367. package/dist/utils/state-machine.d.ts +80 -0
  368. package/dist/utils/state-machine.d.ts.map +1 -0
  369. package/package.json +56 -22
  370. package/src/adapters/cloudflare-dev.ts +177 -0
  371. package/src/adapters/cloudflare-kv-cache.ts +142 -0
  372. package/src/adapters/cloudflare.ts +342 -28
  373. package/src/adapters/compress-module.ts +24 -4
  374. package/src/adapters/nitro.ts +52 -8
  375. package/src/adapters/wrangler.d.ts +7 -0
  376. package/src/cache/cache-api.ts +38 -0
  377. package/src/cache/handler-store.ts +68 -0
  378. package/src/cache/index.ts +81 -18
  379. package/src/cache/singleflight.ts +62 -4
  380. package/src/cache/sizeof.ts +31 -0
  381. package/src/cache/timber-cache.ts +24 -20
  382. package/src/cli.ts +16 -6
  383. package/src/client/browser-dev.ts +128 -1
  384. package/src/client/browser-entry/action-dispatch.ts +116 -0
  385. package/src/client/browser-entry/hmr.ts +81 -0
  386. package/src/client/browser-entry/hydrate.ts +145 -0
  387. package/src/client/browser-entry/index.ts +138 -0
  388. package/src/client/browser-entry/post-hydration.ts +119 -0
  389. package/src/client/browser-entry/router-init.ts +193 -0
  390. package/src/client/browser-entry/rsc-stream.ts +157 -0
  391. package/src/client/browser-entry/scroll.ts +27 -0
  392. package/src/client/error-boundary.tsx +48 -16
  393. package/src/client/error-reconstituter.tsx +65 -0
  394. package/src/client/form.tsx +9 -7
  395. package/src/client/history.ts +26 -4
  396. package/src/client/index.ts +19 -38
  397. package/src/client/internal.ts +57 -0
  398. package/src/client/link-pending-store.ts +111 -0
  399. package/src/client/link.tsx +329 -97
  400. package/src/client/nav-link-store.ts +47 -0
  401. package/src/client/navigation-api-types.ts +112 -0
  402. package/src/client/navigation-api.ts +332 -0
  403. package/src/client/navigation-context.ts +31 -6
  404. package/src/client/navigation-root.tsx +342 -0
  405. package/src/client/nuqs-adapter.tsx +16 -3
  406. package/src/client/router-ref.ts +1 -1
  407. package/src/client/router.ts +299 -72
  408. package/src/client/rsc-fetch.ts +97 -8
  409. package/src/client/segment-cache.ts +1 -1
  410. package/src/client/segment-outlet.tsx +86 -0
  411. package/src/client/ssr-data.ts +13 -5
  412. package/src/client/stale-reload.ts +72 -3
  413. package/src/client/top-loader.tsx +16 -8
  414. package/src/client/use-link-status.ts +7 -7
  415. package/src/client/use-params.ts +7 -5
  416. package/src/client/{use-navigation-pending.ts → use-pending-navigation.ts} +6 -6
  417. package/src/client/use-query-states.ts +3 -3
  418. package/src/client/use-router.ts +1 -1
  419. package/src/codec.ts +49 -0
  420. package/src/config-types.ts +225 -0
  421. package/src/content/index.ts +5 -13
  422. package/src/cookies/define-cookie.ts +78 -25
  423. package/src/cookies/index.ts +8 -0
  424. package/src/fonts/css.ts +2 -1
  425. package/src/index.ts +295 -354
  426. package/src/plugin-context.ts +240 -0
  427. package/src/plugins/adapter-build.ts +9 -3
  428. package/src/plugins/build-manifest.ts +13 -2
  429. package/src/plugins/build-report.ts +3 -3
  430. package/src/plugins/client-chunks.ts +65 -0
  431. package/src/plugins/content.ts +1 -1
  432. package/src/plugins/dev-browser-logs.ts +288 -0
  433. package/src/plugins/dev-error-overlay.ts +70 -1
  434. package/src/plugins/dev-logs.ts +1 -1
  435. package/src/plugins/dev-server.ts +70 -9
  436. package/src/plugins/entries.ts +71 -10
  437. package/src/plugins/fonts.ts +168 -61
  438. package/src/plugins/mdx.ts +1 -1
  439. package/src/plugins/routing.ts +57 -17
  440. package/src/plugins/server-action-exports.ts +1 -1
  441. package/src/plugins/server-bundle.ts +32 -1
  442. package/src/plugins/shims.ts +135 -35
  443. package/src/plugins/static-build.ts +17 -11
  444. package/src/routing/codegen.ts +165 -105
  445. package/src/routing/index.ts +2 -0
  446. package/src/routing/scanner.ts +93 -23
  447. package/src/routing/segment-classify.ts +89 -0
  448. package/src/routing/status-file-lint.ts +3 -2
  449. package/src/routing/types.ts +17 -4
  450. package/src/rsc-runtime/rsc.ts +2 -0
  451. package/src/rsc-runtime/ssr.ts +50 -0
  452. package/src/rsc-runtime/vendor-types.d.ts +7 -0
  453. package/src/{search-params/codecs.ts → schema-bridge.ts} +57 -20
  454. package/src/search-params/define.ts +482 -0
  455. package/src/search-params/index.ts +14 -20
  456. package/src/search-params/registry.ts +2 -2
  457. package/src/search-params/wrappers.ts +85 -0
  458. package/src/segment-params/define.ts +279 -0
  459. package/src/segment-params/index.ts +9 -0
  460. package/src/server/access-gate.tsx +70 -29
  461. package/src/server/action-client.ts +46 -11
  462. package/src/server/action-encryption.ts +144 -0
  463. package/src/server/action-handler.ts +21 -4
  464. package/src/server/actions.ts +10 -9
  465. package/src/server/als-registry.ts +34 -6
  466. package/src/server/build-manifest.ts +10 -4
  467. package/src/server/compress.ts +25 -7
  468. package/src/server/debug.ts +1 -1
  469. package/src/server/default-logger.ts +99 -0
  470. package/src/server/deny-page-resolver.ts +154 -0
  471. package/src/server/deny-renderer.ts +24 -38
  472. package/src/server/dev-holding-server.ts +185 -0
  473. package/src/server/dev-warnings.ts +4 -49
  474. package/src/server/early-hints.ts +36 -15
  475. package/src/server/error-boundary-wrapper.ts +74 -22
  476. package/src/server/fallback-error.ts +31 -15
  477. package/src/server/flight-injection-state.ts +113 -0
  478. package/src/server/flight-scripts.ts +62 -0
  479. package/src/server/flush.ts +2 -1
  480. package/src/server/form-data.ts +76 -0
  481. package/src/server/html-injectors.ts +280 -120
  482. package/src/server/index.ts +25 -177
  483. package/src/server/internal.ts +169 -0
  484. package/src/server/logger.ts +44 -36
  485. package/src/server/middleware-runner.ts +31 -4
  486. package/src/server/node-stream-transforms.ts +509 -0
  487. package/src/server/page-deny-boundary.tsx +56 -0
  488. package/src/server/pipeline-interception.ts +17 -16
  489. package/src/server/pipeline-metadata.ts +13 -0
  490. package/src/server/pipeline.ts +227 -62
  491. package/src/server/primitives.ts +111 -28
  492. package/src/server/render-timeout.ts +108 -0
  493. package/src/server/request-context.ts +293 -132
  494. package/src/server/route-element-builder.ts +283 -191
  495. package/src/server/route-handler.ts +24 -4
  496. package/src/server/route-matcher.ts +24 -20
  497. package/src/server/rsc-entry/api-handler.ts +15 -16
  498. package/src/server/rsc-entry/error-renderer.ts +300 -89
  499. package/src/server/rsc-entry/helpers.ts +134 -5
  500. package/src/server/rsc-entry/index.ts +200 -112
  501. package/src/server/rsc-entry/rsc-payload.ts +65 -18
  502. package/src/server/rsc-entry/rsc-stream.ts +65 -13
  503. package/src/server/rsc-entry/ssr-bridge.ts +14 -5
  504. package/src/server/rsc-entry/ssr-renderer.ts +168 -38
  505. package/src/server/safe-load.ts +60 -0
  506. package/src/server/sitemap-generator.ts +338 -0
  507. package/src/server/sitemap-handler.ts +126 -0
  508. package/src/server/slot-resolver.ts +244 -229
  509. package/src/server/ssr-entry.ts +211 -32
  510. package/src/server/ssr-render.ts +289 -67
  511. package/src/server/ssr-wrappers.tsx +139 -0
  512. package/src/server/status-code-resolver.ts +1 -1
  513. package/src/server/stream-utils.ts +213 -0
  514. package/src/server/tracing.ts +20 -9
  515. package/src/server/tree-builder.ts +92 -58
  516. package/src/server/types.ts +3 -6
  517. package/src/server/version-skew.ts +104 -0
  518. package/src/shared/merge-search-params.ts +55 -0
  519. package/src/shims/font-google.ts +1 -1
  520. package/src/shims/font-local.ts +34 -0
  521. package/src/shims/headers.ts +5 -1
  522. package/src/shims/navigation-client.ts +1 -1
  523. package/src/shims/navigation.ts +7 -2
  524. package/src/utils/directive-parser.ts +5 -2
  525. package/src/utils/state-machine.ts +111 -0
  526. package/dist/_chunks/als-registry-B7DbZ2hS.js.map +0 -1
  527. package/dist/_chunks/debug-gwlJkDuf.js.map +0 -1
  528. package/dist/_chunks/format-DviM89f0.js.map +0 -1
  529. package/dist/_chunks/interception-BOoWmLUA.js.map +0 -1
  530. package/dist/_chunks/request-context-DIkVh_jG.js +0 -330
  531. package/dist/_chunks/request-context-DIkVh_jG.js.map +0 -1
  532. package/dist/_chunks/tracing-CemImE6h.js.map +0 -1
  533. package/dist/_chunks/use-cookie-DX-l1_5E.js +0 -91
  534. package/dist/_chunks/use-cookie-DX-l1_5E.js.map +0 -1
  535. package/dist/_chunks/use-query-states-D5KaffOK.js.map +0 -1
  536. package/dist/cache/register-cached-function.d.ts +0 -17
  537. package/dist/cache/register-cached-function.d.ts.map +0 -1
  538. package/dist/client/browser-entry.d.ts +0 -21
  539. package/dist/client/browser-entry.d.ts.map +0 -1
  540. package/dist/client/link-status-provider.d.ts +0 -11
  541. package/dist/client/link-status-provider.d.ts.map +0 -1
  542. package/dist/client/transition-root.d.ts.map +0 -1
  543. package/dist/client/use-navigation-pending.d.ts.map +0 -1
  544. package/dist/cookies/index.js.map +0 -1
  545. package/dist/plugins/cache-transform.d.ts +0 -36
  546. package/dist/plugins/cache-transform.d.ts.map +0 -1
  547. package/dist/plugins/dynamic-transform.d.ts +0 -72
  548. package/dist/plugins/dynamic-transform.d.ts.map +0 -1
  549. package/dist/search-params/analyze.d.ts +0 -54
  550. package/dist/search-params/analyze.d.ts.map +0 -1
  551. package/dist/search-params/builtin-codecs.d.ts +0 -105
  552. package/dist/search-params/builtin-codecs.d.ts.map +0 -1
  553. package/dist/search-params/codecs.d.ts +0 -53
  554. package/dist/search-params/codecs.d.ts.map +0 -1
  555. package/dist/search-params/create.d.ts +0 -106
  556. package/dist/search-params/create.d.ts.map +0 -1
  557. package/dist/server/prerender.d.ts +0 -77
  558. package/dist/server/prerender.d.ts.map +0 -1
  559. package/dist/server/response-cache.d.ts +0 -54
  560. package/dist/server/response-cache.d.ts.map +0 -1
  561. package/src/cache/register-cached-function.ts +0 -103
  562. package/src/client/browser-entry.ts +0 -678
  563. package/src/client/link-status-provider.tsx +0 -30
  564. package/src/client/transition-root.tsx +0 -166
  565. package/src/plugins/cache-transform.ts +0 -199
  566. package/src/plugins/dynamic-transform.ts +0 -161
  567. package/src/search-params/analyze.ts +0 -192
  568. package/src/search-params/builtin-codecs.ts +0 -228
  569. package/src/search-params/create.ts +0 -321
  570. package/src/server/prerender.ts +0 -139
  571. package/src/server/response-cache.ts +0 -410
@@ -1,30 +0,0 @@
1
- 'use client';
2
-
3
- // LinkStatusProvider — client component that provides per-link pending status
4
- // via React context. Used inside <Link> to power useLinkStatus().
5
- //
6
- // Reads pendingUrl from PendingNavigationContext (provided by TransitionRoot).
7
- // The pending URL is set as an URGENT update at navigation start (shows
8
- // immediately) and cleared inside startTransition when the new tree commits
9
- // (atomic with params/pathname). This eliminates both:
10
- // 1. The delay before showing the spinner (urgent update, not deferred)
11
- // 2. The gap between spinner disappearing and active state updating (same commit)
12
-
13
- import type { ReactNode } from 'react';
14
- import { LinkStatusContext, type LinkStatus } from './use-link-status.js';
15
- import { usePendingNavigationUrl } from './navigation-context.js';
16
-
17
- const NOT_PENDING: LinkStatus = { pending: false };
18
- const IS_PENDING: LinkStatus = { pending: true };
19
-
20
- /**
21
- * Client component that reads the pending URL from PendingNavigationContext
22
- * and provides a scoped LinkStatusContext to children. Renders no extra DOM —
23
- * just a context provider around children.
24
- */
25
- export function LinkStatusProvider({ href, children }: { href: string; children?: ReactNode }) {
26
- const pendingUrl = usePendingNavigationUrl();
27
- const status = pendingUrl === href ? IS_PENDING : NOT_PENDING;
28
-
29
- return <LinkStatusContext.Provider value={status}>{children}</LinkStatusContext.Provider>;
30
- }
@@ -1,166 +0,0 @@
1
- /**
2
- * TransitionRoot — Wrapper component for transition-based rendering.
3
- *
4
- * Solves the "new boundary has no old content" problem for client-side
5
- * navigation. When React renders a completely new Suspense boundary via
6
- * root.render(), it shows the fallback immediately — root.render() is
7
- * always an urgent update regardless of startTransition.
8
- *
9
- * TransitionRoot holds the current element in React state. Navigation
10
- * updates call startTransition(() => setState(newElement)), which IS
11
- * a transition update. React keeps the old committed tree visible while
12
- * any new Suspense boundaries in the transition resolve.
13
- *
14
- * Also manages `pendingUrl` as React state with an urgent/transition split:
15
- * - Navigation START: `setPendingUrl(url)` is an urgent update — React
16
- * commits it before the next paint, showing the spinner immediately.
17
- * - Navigation END: `setPendingUrl(null)` is inside `startTransition`
18
- * alongside `setElement(newTree)` — both commit atomically, so the
19
- * spinner disappears in the same frame as the new content appears.
20
- *
21
- * See design/05-streaming.md §"deferSuspenseFor"
22
- * See design/19-client-navigation.md §"NavigationContext"
23
- */
24
-
25
- import { useState, useTransition, createElement, Fragment, type ReactNode } from 'react';
26
- import { PendingNavigationProvider } from './navigation-context.js';
27
- import { TopLoader, type TopLoaderConfig } from './top-loader.js';
28
-
29
- // ─── Module-level functions ──────────────────────────────────────
30
-
31
- /**
32
- * Module-level reference to the state setter wrapped in startTransition.
33
- * Used for non-navigation renders (applyRevalidation, popstate replay).
34
- */
35
- let _transitionRender: ((element: ReactNode) => void) | null = null;
36
-
37
- /**
38
- * Module-level reference to the navigation transition function.
39
- * Wraps a full navigation (fetch + render) in a single startTransition
40
- * with useOptimistic for the pending URL.
41
- */
42
- let _navigateTransition:
43
- | ((pendingUrl: string, perform: () => Promise<ReactNode>) => Promise<void>)
44
- | null = null;
45
-
46
- // ─── Component ───────────────────────────────────────────────────
47
-
48
- /**
49
- * Root wrapper component that enables transition-based rendering.
50
- *
51
- * Renders PendingNavigationProvider around children for the pending URL
52
- * context. The DOM tree matches the server-rendered HTML during hydration
53
- * (the provider renders no extra DOM elements).
54
- *
55
- * Usage in browser-entry.ts:
56
- * const rootEl = createElement(TransitionRoot, { initial: wrapped });
57
- * reactRoot = hydrateRoot(document, rootEl);
58
- *
59
- * Subsequent navigations:
60
- * navigateTransition(url, async () => { fetch; return wrappedElement; });
61
- *
62
- * Non-navigation renders:
63
- * transitionRender(newWrappedElement);
64
- */
65
- export function TransitionRoot({
66
- initial,
67
- topLoaderConfig,
68
- }: {
69
- initial: ReactNode;
70
- topLoaderConfig?: TopLoaderConfig;
71
- }): ReactNode {
72
- const [element, setElement] = useState<ReactNode>(initial);
73
- const [pendingUrl, setPendingUrl] = useState<string | null>(null);
74
- const [, startTransition] = useTransition();
75
-
76
- // Non-navigation render (revalidation, popstate cached replay).
77
- _transitionRender = (newElement: ReactNode) => {
78
- startTransition(() => {
79
- setElement(newElement);
80
- });
81
- };
82
-
83
- // Full navigation transition.
84
- // setPendingUrl(url) is an URGENT update — React commits it before the next
85
- // paint, so the pending spinner appears immediately when navigation starts.
86
- // Inside startTransition: the async fetch + setElement + setPendingUrl(null)
87
- // are deferred. When the transition commits, the new tree and pendingUrl=null
88
- // both apply in the same React commit — making the pending→active transition
89
- // atomic (no frame where pending is false but the old tree is still visible).
90
- _navigateTransition = (url: string, perform: () => Promise<ReactNode>) => {
91
- // Urgent: show pending state immediately
92
- setPendingUrl(url);
93
-
94
- return new Promise<void>((resolve, reject) => {
95
- startTransition(async () => {
96
- try {
97
- const newElement = await perform();
98
- setElement(newElement);
99
- // Clear pending inside the transition — commits atomically with new tree
100
- setPendingUrl(null);
101
- resolve();
102
- } catch (err) {
103
- // Clear pending on error too
104
- setPendingUrl(null);
105
- reject(err);
106
- }
107
- });
108
- });
109
- };
110
-
111
- // Inject TopLoader alongside the element tree inside PendingNavigationProvider.
112
- // The TopLoader reads pendingUrl from context to show/hide the progress bar.
113
- // It is rendered only when not explicitly disabled via config.
114
- const showTopLoader = topLoaderConfig?.enabled !== false;
115
- const children = showTopLoader
116
- ? createElement(Fragment, null, createElement(TopLoader, { config: topLoaderConfig }), element)
117
- : element;
118
- return createElement(PendingNavigationProvider, { value: pendingUrl }, children);
119
- }
120
-
121
- // ─── Public API ──────────────────────────────────────────────────
122
-
123
- /**
124
- * Trigger a transition render for non-navigation updates.
125
- * React keeps the old committed tree visible while any new Suspense
126
- * boundaries in the update resolve.
127
- *
128
- * Used for: applyRevalidation, popstate replay with cached payload.
129
- */
130
- export function transitionRender(element: ReactNode): void {
131
- if (_transitionRender) {
132
- _transitionRender(element);
133
- }
134
- }
135
-
136
- /**
137
- * Run a full navigation inside a React transition with optimistic pending URL.
138
- *
139
- * The `perform` callback runs inside `startTransition` — it should fetch the
140
- * RSC payload, update router state, and return the wrapped React element.
141
- * The pending URL shows immediately (useOptimistic urgent update) and reverts
142
- * to null when the transition commits (atomic with the new tree).
143
- *
144
- * Returns a Promise that resolves when the async work completes (note: the
145
- * React transition may not have committed yet, but all state updates are done).
146
- *
147
- * Used for: navigate(), refresh(), popstate with fetch.
148
- */
149
- export function navigateTransition(
150
- pendingUrl: string,
151
- perform: () => Promise<ReactNode>
152
- ): Promise<void> {
153
- if (_navigateTransition) {
154
- return _navigateTransition(pendingUrl, perform);
155
- }
156
- // Fallback: no TransitionRoot mounted (shouldn't happen in production)
157
- return perform().then(() => {});
158
- }
159
-
160
- /**
161
- * Check if the TransitionRoot is mounted and ready for renders.
162
- * Used by browser-entry.ts to guard against renders before hydration.
163
- */
164
- export function isTransitionRootReady(): boolean {
165
- return _transitionRender !== null;
166
- }
@@ -1,199 +0,0 @@
1
- import type { Plugin } from 'vite';
2
- import { findFunctionsWithDirective, containsDirective } from '#/utils/directive-parser.js';
3
-
4
- /**
5
- * Parse a cacheLife duration string to seconds.
6
- * Supports: '30s', '5m', '1h', '2d', '1w', or a plain number (seconds).
7
- */
8
- export function parseCacheLife(value: string | number): number {
9
- if (typeof value === 'number') return value;
10
-
11
- const match = value.match(/^(\d+)(s|m|h|d|w)$/);
12
- if (!match) {
13
- throw new Error(
14
- `Invalid cacheLife value: "${value}". Expected format: "30s", "5m", "1h", "2d", "1w", or a number.`
15
- );
16
- }
17
-
18
- const amount = parseInt(match[1], 10);
19
- const unit = match[2];
20
- const multipliers: Record<string, number> = { s: 1, m: 60, h: 3600, d: 86400, w: 604800 };
21
- return amount * multipliers[unit];
22
- }
23
-
24
- // Default TTL when no cacheLife() is specified (Infinity means cache until explicit invalidation).
25
- const DEFAULT_TTL = Infinity;
26
-
27
- export interface CacheTransformWarning {
28
- message: string;
29
- functionName: string;
30
- }
31
-
32
- interface TransformResult {
33
- code: string;
34
- map?: null;
35
- warnings?: CacheTransformWarning[];
36
- }
37
-
38
- /**
39
- * Match cacheLife() calls: cacheLife('1h'), cacheLife("5m"), cacheLife(300)
40
- */
41
- const CACHE_LIFE_PATTERN = /cacheLife\(\s*(?:'([^']+)'|"([^"]+)"|(\d+))\s*\)/;
42
-
43
- /**
44
- * Strip the 'use cache' directive and cacheLife() call from a function body.
45
- * Returns the cleaned body and the extracted TTL.
46
- */
47
- function extractCacheDirectives(body: string): { cleanBody: string; ttl: number } {
48
- let ttl = DEFAULT_TTL;
49
-
50
- // Remove 'use cache' / "use cache" directive (including optional semicolon and newline)
51
- let cleanBody = body.replace(/\s*['"]use cache['"];?\s*\n?/, '\n');
52
-
53
- // Extract and remove cacheLife() calls
54
- const lifeMatch = cleanBody.match(CACHE_LIFE_PATTERN);
55
- if (lifeMatch) {
56
- const value = lifeMatch[1] || lifeMatch[2] || parseInt(lifeMatch[3], 10);
57
- ttl = parseCacheLife(value);
58
- cleanBody = cleanBody.replace(/\s*cacheLife\([^)]*\);?\s*\n?/, '\n');
59
- }
60
-
61
- return { cleanBody, ttl };
62
- }
63
-
64
- /**
65
- * Determine if a function name is a React component (PascalCase).
66
- */
67
- function isComponentName(name: string): boolean {
68
- return /^[A-Z]/.test(name);
69
- }
70
-
71
- /**
72
- * Pattern matching page/layout file conventions in a dynamic route segment.
73
- * Matches paths like: app/[slug]/page.tsx, app/[id]/layout.ts, etc.
74
- */
75
- const DYNAMIC_ROUTE_PAGE_PATTERN = /\/\[[^\]]+\].*\/(page|layout)\.[jt]sx?$/;
76
-
77
- /**
78
- * Detect if a function declaration has Promise-typed parameters.
79
- *
80
- * Checks for common patterns:
81
- * - `params: Promise<...>`
82
- * - `{ params }: { params: Promise<...> }`
83
- * - `props: { params: Promise<...> }`
84
- */
85
- const PROMISE_PARAMS_PATTERN = /params\s*(?::|.*?:)\s*Promise\s*</;
86
-
87
- /**
88
- * Check if a 'use cache' function in a dynamic route page/layout receives
89
- * Promise-typed params, which are not serializable as cache keys.
90
- */
91
- export function detectPromiseParamsWarning(
92
- declaration: string,
93
- functionName: string,
94
- fileId: string
95
- ): CacheTransformWarning | null {
96
- if (!DYNAMIC_ROUTE_PAGE_PATTERN.test(fileId)) return null;
97
- if (!PROMISE_PARAMS_PATTERN.test(declaration)) return null;
98
-
99
- return {
100
- message:
101
- `'use cache' on "${functionName}" in "${fileId}" receives Promise params. ` +
102
- `Promise is not serializable as a cache key and will cause runtime errors. ` +
103
- `Either remove 'use cache' or await the params before using them in a separate cached function.`,
104
- functionName,
105
- };
106
- }
107
-
108
- /**
109
- * Transform source code containing 'use cache' directives into
110
- * registerCachedFunction() calls.
111
- *
112
- * Returns null if no transformations were made.
113
- */
114
- export function transformUseCache(code: string, fileId: string): TransformResult | null {
115
- if (!containsDirective(code, 'use cache')) return null;
116
-
117
- const functions = findFunctionsWithDirective(code, 'use cache');
118
- if (functions.length === 0) return null;
119
-
120
- let result = code;
121
- let needsImport = false;
122
- const warnings: CacheTransformWarning[] = [];
123
-
124
- // Process functions from end to start (sorted descending by start position)
125
- for (const fn of functions) {
126
- // Warn if function receives Promise params in a dynamic route page/layout
127
- const promiseWarning = detectPromiseParamsWarning(fn.declaration, fn.name, fileId);
128
- if (promiseWarning) warnings.push(promiseWarning);
129
- const { cleanBody, ttl } = extractCacheDirectives(fn.bodyContent);
130
- const stableId = `${fileId}#${fn.name}`;
131
- const isComponent = isComponentName(fn.name);
132
-
133
- // Build the options object
134
- const optsParts = [`ttl: ${ttl === Infinity ? 'Infinity' : ttl}`];
135
- optsParts.push(`id: '${stableId}'`);
136
- if (isComponent) {
137
- optsParts.push('isComponent: true');
138
- }
139
- const optsStr = `{ ${optsParts.join(', ')} }`;
140
-
141
- // Build the replacement
142
- let replacement: string;
143
- if (fn.isArrow) {
144
- // const Name = async (...) => { body } → const Name = registerCachedFunction(async (...) => { body }, opts)
145
- const arrowSig = fn.declaration.replace(/^(?:const|let|var)\s+\w+\s*=\s*/, '');
146
- replacement = `const ${fn.name} = registerCachedFunction(${arrowSig} {${cleanBody}}, ${optsStr})`;
147
- } else {
148
- // async function Name(...) { body } → const Name = registerCachedFunction(async function Name(...) { body }, opts)
149
- const fnDecl = fn.declaration.replace(/^(?:export\s+default\s+|export\s+)?/, '');
150
- const exportPrefix = fn.prefix.includes('default')
151
- ? 'export default '
152
- : fn.prefix.includes('export')
153
- ? 'export '
154
- : '';
155
-
156
- replacement = `${exportPrefix}const ${fn.name} = registerCachedFunction(${fnDecl} {${cleanBody}}, ${optsStr})`;
157
- }
158
-
159
- result = result.slice(0, fn.start) + replacement + result.slice(fn.end);
160
- needsImport = true;
161
- }
162
-
163
- if (needsImport) {
164
- // Add the import at the top of the file
165
- result = `import { registerCachedFunction } from '@timber-js/app/cache';\n` + result;
166
- }
167
-
168
- return { code: result, map: null, warnings: warnings.length > 0 ? warnings : undefined };
169
- }
170
-
171
- /**
172
- * Vite plugin: timber-cache
173
- *
174
- * Transforms 'use cache' directives into registerCachedFunction() calls.
175
- * Only runs in the RSC environment.
176
- */
177
- export function cacheTransformPlugin(): Plugin {
178
- return {
179
- name: 'timber-cache',
180
-
181
- transform(code, id) {
182
- // Only transform in RSC environment
183
- // Skip node_modules and non-JS/TS files
184
- if (id.includes('node_modules')) return null;
185
- if (!/\.[jt]sx?$/.test(id)) return null;
186
-
187
- // Quick bail-out: no 'use cache' directive in this file
188
- if (!containsDirective(code, 'use cache')) return null;
189
-
190
- const result = transformUseCache(code, id);
191
- if (result?.warnings) {
192
- for (const w of result.warnings) {
193
- this.warn(`[timber] ${w.message}`);
194
- }
195
- }
196
- return result;
197
- },
198
- };
199
- }
@@ -1,161 +0,0 @@
1
- /**
2
- * timber-dynamic-transform — Vite sub-plugin for 'use dynamic' directive.
3
- *
4
- * Detects `'use dynamic'` directives in server component function bodies
5
- * and transforms them into `markDynamic()` runtime calls. The directive
6
- * declares a dynamic boundary — the component and its subtree opt out of
7
- * the pre-rendered shell and render per-request.
8
- *
9
- * - In `output: 'static'` mode, `'use dynamic'` is a build error.
10
- * - In standard SSR routes (no prerender.ts), the directive is a no-op
11
- * (everything is already per-request), but the transform still runs
12
- * so the runtime can skip unnecessary work.
13
- *
14
- * Design doc: design/15-future-prerendering.md §"'use dynamic'"
15
- */
16
-
17
- import type { Plugin } from 'vite';
18
- import type { PluginContext } from '#/index.js';
19
- import { findFunctionsWithDirective, containsDirective } from '#/utils/directive-parser.js';
20
-
21
- // ---------------------------------------------------------------------------
22
- // Detection
23
- // ---------------------------------------------------------------------------
24
-
25
- /**
26
- * Quick check: does this source file contain 'use dynamic' anywhere?
27
- * Used as a fast bail-out before doing expensive AST parsing.
28
- */
29
- export function containsUseDynamic(code: string): boolean {
30
- return containsDirective(code, 'use dynamic');
31
- }
32
-
33
- // ---------------------------------------------------------------------------
34
- // Transform
35
- // ---------------------------------------------------------------------------
36
-
37
- interface TransformResult {
38
- code: string;
39
- map?: null;
40
- }
41
-
42
- /**
43
- * Find function declarations/expressions containing 'use dynamic' and
44
- * transform them into markDynamic() calls.
45
- *
46
- * Input:
47
- * ```tsx
48
- * export default async function AddToCartButton({ productId }) {
49
- * 'use dynamic'
50
- * const user = await getUser()
51
- * return <button>Add to cart</button>
52
- * }
53
- * ```
54
- *
55
- * Output:
56
- * ```tsx
57
- * import { markDynamic as __markDynamic } from '@timber-js/app/runtime';
58
- * export default async function AddToCartButton({ productId }) {
59
- * __markDynamic();
60
- * const user = await getUser()
61
- * return <button>Add to cart</button>
62
- * }
63
- * ```
64
- *
65
- * The markDynamic() call registers the component boundary as dynamic
66
- * at render time. The pre-render pass uses this to know which subtrees
67
- * to skip and leave as holes for per-request rendering.
68
- */
69
- export function transformUseDynamic(code: string): TransformResult | null {
70
- if (!containsUseDynamic(code)) return null;
71
-
72
- const functions = findFunctionsWithDirective(code, 'use dynamic');
73
- if (functions.length === 0) return null;
74
-
75
- // Replace directive strings with __markDynamic() calls, processing
76
- // from end to start to preserve source offsets
77
- let result = code;
78
- for (const fn of functions) {
79
- // Replace the directive in the body content
80
- const cleanBody = fn.bodyContent.replace(/['"]use dynamic['"];?/, '__markDynamic();');
81
- // Reconstruct: replace the body content between braces
82
- result = result.slice(0, fn.bodyStart) + cleanBody + result.slice(fn.bodyEnd);
83
- }
84
-
85
- // Add the import at the top
86
- result = `import { markDynamic as __markDynamic } from '@timber-js/app/runtime';\n` + result;
87
-
88
- return { code: result, map: null };
89
- }
90
-
91
- // ---------------------------------------------------------------------------
92
- // Static mode validation
93
- // ---------------------------------------------------------------------------
94
-
95
- /**
96
- * In `output: 'static'` mode, `'use dynamic'` is a build error.
97
- * Static mode renders everything at build time — there is no per-request
98
- * rendering to opt into.
99
- */
100
- export function validateNoDynamicInStaticMode(
101
- code: string
102
- ): { message: string; line?: number } | null {
103
- if (!containsUseDynamic(code)) return null;
104
-
105
- const functions = findFunctionsWithDirective(code, 'use dynamic');
106
- if (functions.length === 0) return null;
107
-
108
- return {
109
- message:
110
- `'use dynamic' cannot be used in static mode (output: 'static'). ` +
111
- `Static mode renders all content at build time — there is no per-request rendering. ` +
112
- `Remove the directive or switch to output: 'server'.`,
113
- line: functions[functions.length - 1].directiveLine, // First occurrence (sorted descending)
114
- };
115
- }
116
-
117
- // ---------------------------------------------------------------------------
118
- // Vite Plugin
119
- // ---------------------------------------------------------------------------
120
-
121
- /**
122
- * Create the timber-dynamic-transform Vite plugin.
123
- *
124
- * In server mode: transforms 'use dynamic' into markDynamic() calls.
125
- * In static mode: rejects 'use dynamic' as a build error.
126
- */
127
- export function timberDynamicTransform(ctx: PluginContext): Plugin {
128
- const isStatic = ctx.config.output === 'static';
129
-
130
- return {
131
- name: 'timber-dynamic-transform',
132
-
133
- transform(code: string, id: string) {
134
- // Skip node_modules
135
- if (id.includes('node_modules')) return null;
136
-
137
- // Only check files in the app directory
138
- if (!id.includes('/app/') && !id.startsWith('app/')) return null;
139
-
140
- // Only check JS/TS files
141
- if (!/\.[jt]sx?$/.test(id)) return null;
142
-
143
- // Quick bail-out
144
- if (!containsUseDynamic(code)) return null;
145
-
146
- // In static mode, 'use dynamic' is a build error
147
- if (isStatic) {
148
- const error = validateNoDynamicInStaticMode(code);
149
- if (error) {
150
- this.error(
151
- `[timber] Static mode error in ${id}${error.line ? `:${error.line}` : ''}: ${error.message}`
152
- );
153
- }
154
- return null;
155
- }
156
-
157
- // In server mode, transform the directive
158
- return transformUseDynamic(code);
159
- },
160
- };
161
- }