@timber-js/app 0.2.0-alpha.5 → 0.2.0-alpha.51

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 (334) hide show
  1. package/LICENSE +8 -0
  2. package/dist/_chunks/{als-registry-B7DbZ2hS.js → als-registry-Ba7URUIn.js} +1 -1
  3. package/dist/_chunks/als-registry-Ba7URUIn.js.map +1 -0
  4. package/dist/_chunks/chunk-DYhsFzuS.js +33 -0
  5. package/dist/_chunks/{debug-gwlJkDuf.js → debug-ECi_61pb.js} +2 -2
  6. package/dist/_chunks/debug-ECi_61pb.js.map +1 -0
  7. package/dist/_chunks/define-TK8C1M3x.js +279 -0
  8. package/dist/_chunks/define-TK8C1M3x.js.map +1 -0
  9. package/dist/_chunks/define-cookie-k9btcEfI.js +93 -0
  10. package/dist/_chunks/define-cookie-k9btcEfI.js.map +1 -0
  11. package/dist/_chunks/error-boundary-B9vT_YK_.js +211 -0
  12. package/dist/_chunks/error-boundary-B9vT_YK_.js.map +1 -0
  13. package/dist/_chunks/{format-DviM89f0.js → format-cX7wzEp2.js} +2 -2
  14. package/dist/_chunks/{format-DviM89f0.js.map → format-cX7wzEp2.js.map} +1 -1
  15. package/dist/_chunks/{interception-BOoWmLUA.js → interception-D2djYaIm.js} +112 -77
  16. package/dist/_chunks/interception-D2djYaIm.js.map +1 -0
  17. package/dist/_chunks/{metadata-routes-Cjmvi3rQ.js → metadata-routes-BU684ls2.js} +1 -1
  18. package/dist/_chunks/{metadata-routes-Cjmvi3rQ.js.map → metadata-routes-BU684ls2.js.map} +1 -1
  19. package/dist/_chunks/{request-context-DIkVh_jG.js → request-context-0h-6Voad.js} +95 -69
  20. package/dist/_chunks/request-context-0h-6Voad.js.map +1 -0
  21. package/dist/_chunks/segment-context-DBn-nrMN.js +69 -0
  22. package/dist/_chunks/segment-context-DBn-nrMN.js.map +1 -0
  23. package/dist/_chunks/stale-reload-4L-_skC7.js +47 -0
  24. package/dist/_chunks/stale-reload-4L-_skC7.js.map +1 -0
  25. package/dist/_chunks/{tracing-Cwn7697K.js → tracing-JI4cYUdz.js} +17 -3
  26. package/dist/_chunks/{tracing-Cwn7697K.js.map → tracing-JI4cYUdz.js.map} +1 -1
  27. package/dist/_chunks/{use-query-states-D5KaffOK.js → use-query-states-wEXY2JQB.js} +1 -1
  28. package/dist/_chunks/{use-query-states-D5KaffOK.js.map → use-query-states-wEXY2JQB.js.map} +1 -1
  29. package/dist/_chunks/wrappers-C9XPg7-U.js +63 -0
  30. package/dist/_chunks/wrappers-C9XPg7-U.js.map +1 -0
  31. package/dist/adapters/compress-module.d.ts.map +1 -1
  32. package/dist/adapters/nitro.d.ts +17 -1
  33. package/dist/adapters/nitro.d.ts.map +1 -1
  34. package/dist/adapters/nitro.js +56 -13
  35. package/dist/adapters/nitro.js.map +1 -1
  36. package/dist/cache/fast-hash.d.ts +22 -0
  37. package/dist/cache/fast-hash.d.ts.map +1 -0
  38. package/dist/cache/index.d.ts +5 -2
  39. package/dist/cache/index.d.ts.map +1 -1
  40. package/dist/cache/index.js +90 -20
  41. package/dist/cache/index.js.map +1 -1
  42. package/dist/cache/register-cached-function.d.ts.map +1 -1
  43. package/dist/cache/singleflight.d.ts +18 -1
  44. package/dist/cache/singleflight.d.ts.map +1 -1
  45. package/dist/cache/timber-cache.d.ts +1 -1
  46. package/dist/cache/timber-cache.d.ts.map +1 -1
  47. package/dist/client/error-boundary.d.ts +10 -1
  48. package/dist/client/error-boundary.d.ts.map +1 -1
  49. package/dist/client/error-boundary.js +1 -125
  50. package/dist/client/index.d.ts +3 -2
  51. package/dist/client/index.d.ts.map +1 -1
  52. package/dist/client/index.js +213 -93
  53. package/dist/client/index.js.map +1 -1
  54. package/dist/client/link.d.ts +22 -8
  55. package/dist/client/link.d.ts.map +1 -1
  56. package/dist/client/navigation-context.d.ts +2 -2
  57. package/dist/client/router.d.ts +25 -3
  58. package/dist/client/router.d.ts.map +1 -1
  59. package/dist/client/rsc-fetch.d.ts +23 -2
  60. package/dist/client/rsc-fetch.d.ts.map +1 -1
  61. package/dist/client/segment-cache.d.ts +1 -1
  62. package/dist/client/segment-cache.d.ts.map +1 -1
  63. package/dist/client/segment-context.d.ts +1 -1
  64. package/dist/client/segment-context.d.ts.map +1 -1
  65. package/dist/client/segment-merger.d.ts.map +1 -1
  66. package/dist/client/stale-reload.d.ts +15 -0
  67. package/dist/client/stale-reload.d.ts.map +1 -1
  68. package/dist/client/top-loader.d.ts +1 -1
  69. package/dist/client/top-loader.d.ts.map +1 -1
  70. package/dist/client/transition-root.d.ts +1 -1
  71. package/dist/client/transition-root.d.ts.map +1 -1
  72. package/dist/client/use-params.d.ts +2 -2
  73. package/dist/client/use-params.d.ts.map +1 -1
  74. package/dist/client/use-query-states.d.ts +1 -1
  75. package/dist/codec.d.ts +21 -0
  76. package/dist/codec.d.ts.map +1 -0
  77. package/dist/cookies/define-cookie.d.ts +33 -12
  78. package/dist/cookies/define-cookie.d.ts.map +1 -1
  79. package/dist/cookies/index.js +1 -83
  80. package/dist/fonts/css.d.ts +1 -0
  81. package/dist/fonts/css.d.ts.map +1 -1
  82. package/dist/index.d.ts +112 -35
  83. package/dist/index.d.ts.map +1 -1
  84. package/dist/index.js +467 -246
  85. package/dist/index.js.map +1 -1
  86. package/dist/params/define.d.ts +76 -0
  87. package/dist/params/define.d.ts.map +1 -0
  88. package/dist/params/index.d.ts +8 -0
  89. package/dist/params/index.d.ts.map +1 -0
  90. package/dist/params/index.js +105 -0
  91. package/dist/params/index.js.map +1 -0
  92. package/dist/plugins/adapter-build.d.ts.map +1 -1
  93. package/dist/plugins/build-manifest.d.ts.map +1 -1
  94. package/dist/plugins/client-chunks.d.ts +32 -0
  95. package/dist/plugins/client-chunks.d.ts.map +1 -0
  96. package/dist/plugins/dev-error-overlay.d.ts +26 -1
  97. package/dist/plugins/dev-error-overlay.d.ts.map +1 -1
  98. package/dist/plugins/entries.d.ts.map +1 -1
  99. package/dist/plugins/fonts.d.ts +7 -0
  100. package/dist/plugins/fonts.d.ts.map +1 -1
  101. package/dist/plugins/routing.d.ts.map +1 -1
  102. package/dist/plugins/server-bundle.d.ts.map +1 -1
  103. package/dist/plugins/static-build.d.ts.map +1 -1
  104. package/dist/routing/codegen.d.ts +2 -2
  105. package/dist/routing/codegen.d.ts.map +1 -1
  106. package/dist/routing/index.js +1 -1
  107. package/dist/routing/scanner.d.ts.map +1 -1
  108. package/dist/routing/status-file-lint.d.ts +2 -1
  109. package/dist/routing/status-file-lint.d.ts.map +1 -1
  110. package/dist/routing/types.d.ts +6 -4
  111. package/dist/routing/types.d.ts.map +1 -1
  112. package/dist/rsc-runtime/rsc.d.ts +1 -1
  113. package/dist/rsc-runtime/rsc.d.ts.map +1 -1
  114. package/dist/rsc-runtime/ssr.d.ts +12 -0
  115. package/dist/rsc-runtime/ssr.d.ts.map +1 -1
  116. package/dist/search-params/codecs.d.ts +1 -1
  117. package/dist/search-params/define.d.ts +159 -0
  118. package/dist/search-params/define.d.ts.map +1 -0
  119. package/dist/search-params/index.d.ts +4 -5
  120. package/dist/search-params/index.d.ts.map +1 -1
  121. package/dist/search-params/index.js +4 -474
  122. package/dist/search-params/registry.d.ts +1 -1
  123. package/dist/search-params/wrappers.d.ts +53 -0
  124. package/dist/search-params/wrappers.d.ts.map +1 -0
  125. package/dist/server/access-gate.d.ts +4 -0
  126. package/dist/server/access-gate.d.ts.map +1 -1
  127. package/dist/server/action-client.d.ts.map +1 -1
  128. package/dist/server/action-encryption.d.ts +76 -0
  129. package/dist/server/action-encryption.d.ts.map +1 -0
  130. package/dist/server/action-handler.d.ts.map +1 -1
  131. package/dist/server/als-registry.d.ts +18 -4
  132. package/dist/server/als-registry.d.ts.map +1 -1
  133. package/dist/server/build-manifest.d.ts +2 -2
  134. package/dist/server/build-manifest.d.ts.map +1 -1
  135. package/dist/server/debug.d.ts +1 -1
  136. package/dist/server/default-logger.d.ts +22 -0
  137. package/dist/server/default-logger.d.ts.map +1 -0
  138. package/dist/server/deny-renderer.d.ts.map +1 -1
  139. package/dist/server/early-hints.d.ts +13 -5
  140. package/dist/server/early-hints.d.ts.map +1 -1
  141. package/dist/server/error-boundary-wrapper.d.ts +4 -0
  142. package/dist/server/error-boundary-wrapper.d.ts.map +1 -1
  143. package/dist/server/flight-injection-state.d.ts +66 -0
  144. package/dist/server/flight-injection-state.d.ts.map +1 -0
  145. package/dist/server/flight-scripts.d.ts +39 -0
  146. package/dist/server/flight-scripts.d.ts.map +1 -0
  147. package/dist/server/flush.d.ts.map +1 -1
  148. package/dist/server/form-data.d.ts +29 -0
  149. package/dist/server/form-data.d.ts.map +1 -1
  150. package/dist/server/html-injectors.d.ts +51 -11
  151. package/dist/server/html-injectors.d.ts.map +1 -1
  152. package/dist/server/index.d.ts +4 -2
  153. package/dist/server/index.d.ts.map +1 -1
  154. package/dist/server/index.js +1974 -1648
  155. package/dist/server/index.js.map +1 -1
  156. package/dist/server/logger.d.ts +24 -7
  157. package/dist/server/logger.d.ts.map +1 -1
  158. package/dist/server/node-stream-transforms.d.ts +113 -0
  159. package/dist/server/node-stream-transforms.d.ts.map +1 -0
  160. package/dist/server/pipeline.d.ts +7 -4
  161. package/dist/server/pipeline.d.ts.map +1 -1
  162. package/dist/server/primitives.d.ts +30 -3
  163. package/dist/server/primitives.d.ts.map +1 -1
  164. package/dist/server/render-timeout.d.ts +51 -0
  165. package/dist/server/render-timeout.d.ts.map +1 -0
  166. package/dist/server/request-context.d.ts +65 -38
  167. package/dist/server/request-context.d.ts.map +1 -1
  168. package/dist/server/route-element-builder.d.ts +7 -0
  169. package/dist/server/route-element-builder.d.ts.map +1 -1
  170. package/dist/server/route-handler.d.ts.map +1 -1
  171. package/dist/server/route-matcher.d.ts +2 -2
  172. package/dist/server/route-matcher.d.ts.map +1 -1
  173. package/dist/server/rsc-entry/error-renderer.d.ts.map +1 -1
  174. package/dist/server/rsc-entry/helpers.d.ts +46 -3
  175. package/dist/server/rsc-entry/helpers.d.ts.map +1 -1
  176. package/dist/server/rsc-entry/index.d.ts +6 -1
  177. package/dist/server/rsc-entry/index.d.ts.map +1 -1
  178. package/dist/server/rsc-entry/rsc-payload.d.ts.map +1 -1
  179. package/dist/server/rsc-entry/rsc-stream.d.ts +9 -0
  180. package/dist/server/rsc-entry/rsc-stream.d.ts.map +1 -1
  181. package/dist/server/rsc-entry/ssr-renderer.d.ts.map +1 -1
  182. package/dist/server/slot-resolver.d.ts +1 -1
  183. package/dist/server/slot-resolver.d.ts.map +1 -1
  184. package/dist/server/ssr-entry.d.ts +22 -0
  185. package/dist/server/ssr-entry.d.ts.map +1 -1
  186. package/dist/server/ssr-render.d.ts +39 -21
  187. package/dist/server/ssr-render.d.ts.map +1 -1
  188. package/dist/server/ssr-wrappers.d.ts +50 -0
  189. package/dist/server/ssr-wrappers.d.ts.map +1 -0
  190. package/dist/server/tracing.d.ts +10 -0
  191. package/dist/server/tracing.d.ts.map +1 -1
  192. package/dist/server/tree-builder.d.ts +19 -12
  193. package/dist/server/tree-builder.d.ts.map +1 -1
  194. package/dist/server/types.d.ts +1 -3
  195. package/dist/server/types.d.ts.map +1 -1
  196. package/dist/server/version-skew.d.ts +61 -0
  197. package/dist/server/version-skew.d.ts.map +1 -0
  198. package/dist/server/waituntil-bridge.d.ts.map +1 -1
  199. package/dist/shared/merge-search-params.d.ts +22 -0
  200. package/dist/shared/merge-search-params.d.ts.map +1 -0
  201. package/dist/shims/navigation-client.d.ts +1 -1
  202. package/dist/shims/navigation-client.d.ts.map +1 -1
  203. package/dist/shims/navigation.d.ts +1 -1
  204. package/dist/shims/navigation.d.ts.map +1 -1
  205. package/dist/utils/state-machine.d.ts +80 -0
  206. package/dist/utils/state-machine.d.ts.map +1 -0
  207. package/package.json +17 -14
  208. package/src/adapters/compress-module.ts +24 -4
  209. package/src/adapters/nitro.ts +58 -9
  210. package/src/cache/fast-hash.ts +34 -0
  211. package/src/cache/index.ts +5 -2
  212. package/src/cache/register-cached-function.ts +7 -3
  213. package/src/cache/singleflight.ts +62 -4
  214. package/src/cache/timber-cache.ts +40 -29
  215. package/src/cli.ts +0 -0
  216. package/src/client/browser-entry.ts +133 -93
  217. package/src/client/error-boundary.tsx +18 -1
  218. package/src/client/index.ts +10 -1
  219. package/src/client/link.tsx +78 -19
  220. package/src/client/navigation-context.ts +2 -2
  221. package/src/client/router.ts +105 -60
  222. package/src/client/rsc-fetch.ts +63 -2
  223. package/src/client/segment-cache.ts +1 -1
  224. package/src/client/segment-context.ts +6 -1
  225. package/src/client/segment-merger.ts +2 -8
  226. package/src/client/stale-reload.ts +32 -6
  227. package/src/client/top-loader.tsx +10 -9
  228. package/src/client/transition-root.tsx +7 -1
  229. package/src/client/use-params.ts +3 -3
  230. package/src/client/use-query-states.ts +1 -1
  231. package/src/codec.ts +21 -0
  232. package/src/cookies/define-cookie.ts +69 -18
  233. package/src/fonts/css.ts +2 -1
  234. package/src/index.ts +280 -85
  235. package/src/params/define.ts +260 -0
  236. package/src/params/index.ts +28 -0
  237. package/src/plugins/adapter-build.ts +6 -0
  238. package/src/plugins/build-manifest.ts +11 -0
  239. package/src/plugins/client-chunks.ts +65 -0
  240. package/src/plugins/dev-error-overlay.ts +70 -1
  241. package/src/plugins/dev-server.ts +38 -4
  242. package/src/plugins/entries.ts +5 -7
  243. package/src/plugins/fonts.ts +93 -42
  244. package/src/plugins/routing.ts +40 -14
  245. package/src/plugins/server-bundle.ts +32 -1
  246. package/src/plugins/shims.ts +1 -1
  247. package/src/plugins/static-build.ts +8 -4
  248. package/src/routing/codegen.ts +109 -88
  249. package/src/routing/scanner.ts +55 -6
  250. package/src/routing/status-file-lint.ts +2 -1
  251. package/src/routing/types.ts +7 -4
  252. package/src/rsc-runtime/rsc.ts +2 -0
  253. package/src/rsc-runtime/ssr.ts +50 -0
  254. package/src/rsc-runtime/vendor-types.d.ts +7 -0
  255. package/src/search-params/codecs.ts +1 -1
  256. package/src/search-params/define.ts +518 -0
  257. package/src/search-params/index.ts +12 -18
  258. package/src/search-params/registry.ts +1 -1
  259. package/src/search-params/wrappers.ts +85 -0
  260. package/src/server/access-gate.tsx +40 -9
  261. package/src/server/action-client.ts +7 -1
  262. package/src/server/action-encryption.ts +144 -0
  263. package/src/server/action-handler.ts +19 -2
  264. package/src/server/als-registry.ts +18 -4
  265. package/src/server/build-manifest.ts +16 -5
  266. package/src/server/compress.ts +25 -7
  267. package/src/server/debug.ts +1 -1
  268. package/src/server/default-logger.ts +98 -0
  269. package/src/server/deny-renderer.ts +2 -1
  270. package/src/server/early-hints.ts +36 -15
  271. package/src/server/error-boundary-wrapper.ts +57 -14
  272. package/src/server/flight-injection-state.ts +113 -0
  273. package/src/server/flight-scripts.ts +59 -0
  274. package/src/server/flush.ts +2 -1
  275. package/src/server/form-data.ts +76 -0
  276. package/src/server/html-injectors.ts +261 -117
  277. package/src/server/index.ts +9 -4
  278. package/src/server/logger.ts +38 -35
  279. package/src/server/node-stream-transforms.ts +504 -0
  280. package/src/server/pipeline.ts +131 -39
  281. package/src/server/primitives.ts +47 -5
  282. package/src/server/render-timeout.ts +108 -0
  283. package/src/server/request-context.ts +119 -119
  284. package/src/server/route-element-builder.ts +106 -114
  285. package/src/server/route-handler.ts +2 -1
  286. package/src/server/route-matcher.ts +2 -2
  287. package/src/server/rsc-entry/error-renderer.ts +5 -3
  288. package/src/server/rsc-entry/helpers.ts +122 -3
  289. package/src/server/rsc-entry/index.ts +108 -43
  290. package/src/server/rsc-entry/rsc-payload.ts +52 -12
  291. package/src/server/rsc-entry/rsc-stream.ts +49 -12
  292. package/src/server/rsc-entry/ssr-renderer.ts +40 -13
  293. package/src/server/slot-resolver.ts +222 -217
  294. package/src/server/ssr-entry.ts +209 -30
  295. package/src/server/ssr-render.ts +289 -67
  296. package/src/server/ssr-wrappers.tsx +139 -0
  297. package/src/server/tracing.ts +23 -0
  298. package/src/server/tree-builder.ts +91 -57
  299. package/src/server/types.ts +1 -3
  300. package/src/server/version-skew.ts +104 -0
  301. package/src/server/waituntil-bridge.ts +4 -1
  302. package/src/shared/merge-search-params.ts +48 -0
  303. package/src/shims/navigation-client.ts +1 -1
  304. package/src/shims/navigation.ts +1 -1
  305. package/src/utils/state-machine.ts +111 -0
  306. package/dist/_chunks/als-registry-B7DbZ2hS.js.map +0 -1
  307. package/dist/_chunks/debug-gwlJkDuf.js.map +0 -1
  308. package/dist/_chunks/interception-BOoWmLUA.js.map +0 -1
  309. package/dist/_chunks/request-context-DIkVh_jG.js.map +0 -1
  310. package/dist/_chunks/ssr-data-MjmprTmO.js +0 -88
  311. package/dist/_chunks/ssr-data-MjmprTmO.js.map +0 -1
  312. package/dist/_chunks/use-cookie-DX-l1_5E.js +0 -91
  313. package/dist/_chunks/use-cookie-DX-l1_5E.js.map +0 -1
  314. package/dist/client/error-boundary.js.map +0 -1
  315. package/dist/cookies/index.js.map +0 -1
  316. package/dist/plugins/dynamic-transform.d.ts +0 -72
  317. package/dist/plugins/dynamic-transform.d.ts.map +0 -1
  318. package/dist/search-params/analyze.d.ts +0 -54
  319. package/dist/search-params/analyze.d.ts.map +0 -1
  320. package/dist/search-params/builtin-codecs.d.ts +0 -105
  321. package/dist/search-params/builtin-codecs.d.ts.map +0 -1
  322. package/dist/search-params/create.d.ts +0 -106
  323. package/dist/search-params/create.d.ts.map +0 -1
  324. package/dist/search-params/index.js.map +0 -1
  325. package/dist/server/prerender.d.ts +0 -77
  326. package/dist/server/prerender.d.ts.map +0 -1
  327. package/dist/server/response-cache.d.ts +0 -53
  328. package/dist/server/response-cache.d.ts.map +0 -1
  329. package/src/plugins/dynamic-transform.ts +0 -161
  330. package/src/search-params/analyze.ts +0 -192
  331. package/src/search-params/builtin-codecs.ts +0 -228
  332. package/src/search-params/create.ts +0 -321
  333. package/src/server/prerender.ts +0 -139
  334. package/src/server/response-cache.ts +0 -277
@@ -2,36 +2,42 @@
2
2
  * defineCookie — typed cookie definitions.
3
3
  *
4
4
  * Bundles name + codec + options into a reusable CookieDefinition<T>
5
- * with .get(), .set(), .delete() server methods and a .useCookie() client hook.
5
+ * with async .getCookie(), .setCookie(), .deleteCookie() server methods
6
+ * and a sync .useCookie() client hook.
7
+ *
8
+ * Server methods are async to future-proof the API for v2 features
9
+ * (signed cookies via crypto.subtle, encrypted cookies, external stores).
6
10
  *
7
11
  * Reuses the SearchParamCodec protocol via fromSchema() bridge.
8
12
  * Validation on read returns the codec default (never throws).
9
13
  *
14
+ * IMPORTANT: This module must NOT have top-level value imports from either
15
+ * server or client modules. Server methods lazy-import request-context;
16
+ * useCookie() lazy-imports use-cookie. This ensures:
17
+ * - Client bundles don't pull in ALS/server code
18
+ * - RSC bundles don't pull in useSyncExternalStore/client code
19
+ * - Tree-shaking is not required for correctness
20
+ *
10
21
  * See design/29-cookies.md §"Typed Cookies with Schema Validation"
11
22
  */
12
23
 
13
- import { cookies } from '#/server/request-context.js';
14
24
  import type { CookieOptions } from '#/server/request-context.js';
15
- import { useCookie as useRawCookie } from '#/client/use-cookie.js';
16
25
  import type { ClientCookieOptions } from '#/client/use-cookie.js';
17
26
 
18
27
  // ─── Types ────────────────────────────────────────────────────────────────
19
28
 
29
+ import type { Codec } from '#/codec.js';
30
+
20
31
  /**
21
32
  * A codec that converts between string cookie values and typed values.
22
- * Intentionally identical to SearchParamCodec<T>.
33
+ * Type alias for the shared Codec<T> protocol.
23
34
  */
24
- export interface CookieCodec<T> {
25
- parse(value: string | string[] | undefined): T;
26
- serialize(value: T): string | null;
27
- }
35
+ export type CookieCodec<T> = Codec<T>;
28
36
 
29
37
  /** Options for defineCookie: codec + CookieOptions merged. */
30
- export interface DefineCookieOptions<T> extends Omit<CookieOptions, 'signed'> {
38
+ export interface DefineCookieOptions<T> extends CookieOptions {
31
39
  /** Codec for parsing/serializing the cookie value. */
32
40
  codec: CookieCodec<T>;
33
- /** Sign the cookie with HMAC-SHA256. */
34
- signed?: boolean;
35
41
  }
36
42
 
37
43
  /** A fully typed cookie definition with server and client methods. */
@@ -44,16 +50,49 @@ export interface CookieDefinition<T> {
44
50
  readonly codec: CookieCodec<T>;
45
51
 
46
52
  /** Server: read the typed value from the current request. */
47
- get(): T;
53
+ getCookie(): Promise<T>;
48
54
  /** Server: set the typed value on the response. */
49
- set(value: T): void;
55
+ setCookie(value: T): Promise<void>;
50
56
  /** Server: delete the cookie. */
51
- delete(): void;
57
+ deleteCookie(): Promise<void>;
52
58
 
53
59
  /** Client: React hook for reading/writing this cookie. Returns [value, setter, deleter]. */
54
60
  useCookie(): [T, (value: T) => void, () => void];
55
61
  }
56
62
 
63
+ // ─── Lazy Module References ───────────────────────────────────────────────
64
+ //
65
+ // These are resolved on first use, not at module load time. This prevents
66
+ // the server module graph from pulling in client code and vice versa.
67
+ // The dynamic import() in server methods is natural (they're async).
68
+ // For useCookie() (sync), we cache the module reference after first load.
69
+
70
+ let _useCookieModule: typeof import('#/client/use-cookie.js') | undefined;
71
+
72
+ function getUseCookieModule(): typeof import('#/client/use-cookie.js') {
73
+ if (!_useCookieModule) {
74
+ // In the client/SSR environment, this module is already in the module
75
+ // graph (imported by the client entry). The throw is a safeguard —
76
+ // if useCookie() is somehow called before the module is available,
77
+ // the developer gets a clear error instead of a silent failure.
78
+ throw new Error(
79
+ '[timber] defineCookie().useCookie() requires @timber-js/app/client to be loaded. ' +
80
+ 'This hook can only be used in client components.'
81
+ );
82
+ }
83
+ return _useCookieModule;
84
+ }
85
+
86
+ /**
87
+ * Register the client cookie module. Called by the client entry to wire
88
+ * up the lazy reference without a top-level import.
89
+ *
90
+ * @internal — framework use only
91
+ */
92
+ export function _registerUseCookieModule(mod: typeof import('#/client/use-cookie.js')): void {
93
+ _useCookieModule = mod;
94
+ }
95
+
57
96
  // ─── Factory ──────────────────────────────────────────────────────────────
58
97
 
59
98
  /**
@@ -69,6 +108,13 @@ export interface CookieDefinition<T> {
69
108
  * httpOnly: false,
70
109
  * maxAge: 60 * 60 * 24 * 365,
71
110
  * });
111
+ *
112
+ * // Server
113
+ * const theme = await themeCookie.getCookie();
114
+ * await themeCookie.setCookie('dark');
115
+ *
116
+ * // Client
117
+ * const [theme, setTheme] = themeCookie.useCookie();
72
118
  * ```
73
119
  */
74
120
  export function defineCookie<T>(
@@ -83,13 +129,15 @@ export function defineCookie<T>(
83
129
  options: resolvedOptions,
84
130
  codec,
85
131
 
86
- get(): T {
132
+ async getCookie(): Promise<T> {
133
+ const { cookies } = await import('#/server/request-context.js');
87
134
  const jar = cookies();
88
- const raw = resolvedOptions.signed ? jar.getSigned(name) : jar.get(name);
135
+ const raw = jar.get(name);
89
136
  return codec.parse(raw);
90
137
  },
91
138
 
92
- set(value: T): void {
139
+ async setCookie(value: T): Promise<void> {
140
+ const { cookies } = await import('#/server/request-context.js');
93
141
  const serialized = codec.serialize(value);
94
142
  if (serialized === null) {
95
143
  cookies().delete(name, {
@@ -101,7 +149,8 @@ export function defineCookie<T>(
101
149
  }
102
150
  },
103
151
 
104
- delete(): void {
152
+ async deleteCookie(): Promise<void> {
153
+ const { cookies } = await import('#/server/request-context.js');
105
154
  cookies().delete(name, {
106
155
  path: resolvedOptions.path,
107
156
  domain: resolvedOptions.domain,
@@ -109,6 +158,8 @@ export function defineCookie<T>(
109
158
  },
110
159
 
111
160
  useCookie(): [T, (value: T) => void, () => void] {
161
+ const { useCookie: useRawCookie } = getUseCookieModule();
162
+
112
163
  // Extract client-safe options (no httpOnly — client cookies can't be httpOnly)
113
164
  const clientOpts: ClientCookieOptions = {
114
165
  path: resolvedOptions.path,
package/src/fonts/css.ts CHANGED
@@ -39,6 +39,7 @@ export function generateFontFaces(descriptors: FontFaceDescriptor[]): string {
39
39
  * ```css
40
40
  * .timber-font-inter {
41
41
  * --font-sans: 'Inter', 'Inter Fallback', system-ui, sans-serif;
42
+ * font-family: 'Inter', 'Inter Fallback', system-ui, sans-serif;
42
43
  * }
43
44
  * ```
44
45
  */
@@ -47,7 +48,7 @@ export function generateVariableClass(
47
48
  variable: string,
48
49
  fontFamily: string
49
50
  ): string {
50
- return `.${className} {\n ${variable}: ${fontFamily};\n}`;
51
+ return `.${className} {\n ${variable}: ${fontFamily};\n font-family: ${fontFamily};\n}`;
51
52
  }
52
53
 
53
54
  /**