@timber-js/app 0.1.0

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 (310) hide show
  1. package/bin/timber.mjs +5 -0
  2. package/dist/_chunks/error-boundary-dj-WO5uq.js +121 -0
  3. package/dist/_chunks/error-boundary-dj-WO5uq.js.map +1 -0
  4. package/dist/_chunks/format-DNt20Kt8.js +163 -0
  5. package/dist/_chunks/format-DNt20Kt8.js.map +1 -0
  6. package/dist/_chunks/interception-DIaZN1bF.js +669 -0
  7. package/dist/_chunks/interception-DIaZN1bF.js.map +1 -0
  8. package/dist/_chunks/metadata-routes-BDnswgRO.js +141 -0
  9. package/dist/_chunks/metadata-routes-BDnswgRO.js.map +1 -0
  10. package/dist/_chunks/registry-DUIpYD_x.js +20 -0
  11. package/dist/_chunks/registry-DUIpYD_x.js.map +1 -0
  12. package/dist/_chunks/request-context-D6XHINkR.js +330 -0
  13. package/dist/_chunks/request-context-D6XHINkR.js.map +1 -0
  14. package/dist/_chunks/tracing-BtOwb8O6.js +174 -0
  15. package/dist/_chunks/tracing-BtOwb8O6.js.map +1 -0
  16. package/dist/_chunks/use-cookie-8ZlA0rr3.js +125 -0
  17. package/dist/_chunks/use-cookie-8ZlA0rr3.js.map +1 -0
  18. package/dist/adapters/cloudflare.d.ts +92 -0
  19. package/dist/adapters/cloudflare.d.ts.map +1 -0
  20. package/dist/adapters/cloudflare.js +188 -0
  21. package/dist/adapters/cloudflare.js.map +1 -0
  22. package/dist/adapters/nitro.d.ts +72 -0
  23. package/dist/adapters/nitro.d.ts.map +1 -0
  24. package/dist/adapters/nitro.js +217 -0
  25. package/dist/adapters/nitro.js.map +1 -0
  26. package/dist/adapters/types.d.ts +53 -0
  27. package/dist/adapters/types.d.ts.map +1 -0
  28. package/dist/cache/index.d.ts +52 -0
  29. package/dist/cache/index.d.ts.map +1 -0
  30. package/dist/cache/index.js +283 -0
  31. package/dist/cache/index.js.map +1 -0
  32. package/dist/cache/redis-handler.d.ts +45 -0
  33. package/dist/cache/redis-handler.d.ts.map +1 -0
  34. package/dist/cache/register-cached-function.d.ts +17 -0
  35. package/dist/cache/register-cached-function.d.ts.map +1 -0
  36. package/dist/cache/singleflight.d.ts +11 -0
  37. package/dist/cache/singleflight.d.ts.map +1 -0
  38. package/dist/cache/stable-stringify.d.ts +7 -0
  39. package/dist/cache/stable-stringify.d.ts.map +1 -0
  40. package/dist/cache/timber-cache.d.ts +21 -0
  41. package/dist/cache/timber-cache.d.ts.map +1 -0
  42. package/dist/cli.d.ts +44 -0
  43. package/dist/cli.d.ts.map +1 -0
  44. package/dist/cli.js +135 -0
  45. package/dist/cli.js.map +1 -0
  46. package/dist/client/browser-entry.d.ts +22 -0
  47. package/dist/client/browser-entry.d.ts.map +1 -0
  48. package/dist/client/error-boundary.d.ts +42 -0
  49. package/dist/client/error-boundary.d.ts.map +1 -0
  50. package/dist/client/form.d.ts +115 -0
  51. package/dist/client/form.d.ts.map +1 -0
  52. package/dist/client/head.d.ts +16 -0
  53. package/dist/client/head.d.ts.map +1 -0
  54. package/dist/client/history.d.ts +29 -0
  55. package/dist/client/history.d.ts.map +1 -0
  56. package/dist/client/index.d.ts +32 -0
  57. package/dist/client/index.d.ts.map +1 -0
  58. package/dist/client/index.js +1218 -0
  59. package/dist/client/index.js.map +1 -0
  60. package/dist/client/link-navigate-interceptor.d.ts +28 -0
  61. package/dist/client/link-navigate-interceptor.d.ts.map +1 -0
  62. package/dist/client/link-status-provider.d.ts +11 -0
  63. package/dist/client/link-status-provider.d.ts.map +1 -0
  64. package/dist/client/link.d.ts +119 -0
  65. package/dist/client/link.d.ts.map +1 -0
  66. package/dist/client/nuqs-adapter.d.ts +11 -0
  67. package/dist/client/nuqs-adapter.d.ts.map +1 -0
  68. package/dist/client/router-ref.d.ts +11 -0
  69. package/dist/client/router-ref.d.ts.map +1 -0
  70. package/dist/client/router.d.ts +85 -0
  71. package/dist/client/router.d.ts.map +1 -0
  72. package/dist/client/segment-cache.d.ts +88 -0
  73. package/dist/client/segment-cache.d.ts.map +1 -0
  74. package/dist/client/segment-context.d.ts +32 -0
  75. package/dist/client/segment-context.d.ts.map +1 -0
  76. package/dist/client/ssr-data.d.ts +64 -0
  77. package/dist/client/ssr-data.d.ts.map +1 -0
  78. package/dist/client/types.d.ts +5 -0
  79. package/dist/client/types.d.ts.map +1 -0
  80. package/dist/client/unload-guard.d.ts +18 -0
  81. package/dist/client/unload-guard.d.ts.map +1 -0
  82. package/dist/client/use-cookie.d.ts +37 -0
  83. package/dist/client/use-cookie.d.ts.map +1 -0
  84. package/dist/client/use-link-status.d.ts +35 -0
  85. package/dist/client/use-link-status.d.ts.map +1 -0
  86. package/dist/client/use-navigation-pending.d.ts +26 -0
  87. package/dist/client/use-navigation-pending.d.ts.map +1 -0
  88. package/dist/client/use-params.d.ts +50 -0
  89. package/dist/client/use-params.d.ts.map +1 -0
  90. package/dist/client/use-pathname.d.ts +20 -0
  91. package/dist/client/use-pathname.d.ts.map +1 -0
  92. package/dist/client/use-query-states.d.ts +36 -0
  93. package/dist/client/use-query-states.d.ts.map +1 -0
  94. package/dist/client/use-router.d.ts +39 -0
  95. package/dist/client/use-router.d.ts.map +1 -0
  96. package/dist/client/use-search-params.d.ts +24 -0
  97. package/dist/client/use-search-params.d.ts.map +1 -0
  98. package/dist/client/use-selected-layout-segment.d.ts +68 -0
  99. package/dist/client/use-selected-layout-segment.d.ts.map +1 -0
  100. package/dist/content/index.d.ts +11 -0
  101. package/dist/content/index.d.ts.map +1 -0
  102. package/dist/content/index.js +2 -0
  103. package/dist/cookies/define-cookie.d.ts +61 -0
  104. package/dist/cookies/define-cookie.d.ts.map +1 -0
  105. package/dist/cookies/index.d.ts +3 -0
  106. package/dist/cookies/index.d.ts.map +1 -0
  107. package/dist/cookies/index.js +82 -0
  108. package/dist/cookies/index.js.map +1 -0
  109. package/dist/fonts/ast.d.ts +38 -0
  110. package/dist/fonts/ast.d.ts.map +1 -0
  111. package/dist/fonts/css.d.ts +43 -0
  112. package/dist/fonts/css.d.ts.map +1 -0
  113. package/dist/fonts/fallbacks.d.ts +36 -0
  114. package/dist/fonts/fallbacks.d.ts.map +1 -0
  115. package/dist/fonts/google.d.ts +122 -0
  116. package/dist/fonts/google.d.ts.map +1 -0
  117. package/dist/fonts/local.d.ts +76 -0
  118. package/dist/fonts/local.d.ts.map +1 -0
  119. package/dist/fonts/types.d.ts +85 -0
  120. package/dist/fonts/types.d.ts.map +1 -0
  121. package/dist/index.d.ts +150 -0
  122. package/dist/index.d.ts.map +1 -0
  123. package/dist/index.js +14701 -0
  124. package/dist/index.js.map +1 -0
  125. package/dist/plugins/adapter-build.d.ts +18 -0
  126. package/dist/plugins/adapter-build.d.ts.map +1 -0
  127. package/dist/plugins/build-manifest.d.ts +79 -0
  128. package/dist/plugins/build-manifest.d.ts.map +1 -0
  129. package/dist/plugins/build-report.d.ts +63 -0
  130. package/dist/plugins/build-report.d.ts.map +1 -0
  131. package/dist/plugins/cache-transform.d.ts +36 -0
  132. package/dist/plugins/cache-transform.d.ts.map +1 -0
  133. package/dist/plugins/chunks.d.ts +45 -0
  134. package/dist/plugins/chunks.d.ts.map +1 -0
  135. package/dist/plugins/content.d.ts +19 -0
  136. package/dist/plugins/content.d.ts.map +1 -0
  137. package/dist/plugins/dev-error-overlay.d.ts +60 -0
  138. package/dist/plugins/dev-error-overlay.d.ts.map +1 -0
  139. package/dist/plugins/dev-logs.d.ts +46 -0
  140. package/dist/plugins/dev-logs.d.ts.map +1 -0
  141. package/dist/plugins/dev-server.d.ts +22 -0
  142. package/dist/plugins/dev-server.d.ts.map +1 -0
  143. package/dist/plugins/dynamic-transform.d.ts +72 -0
  144. package/dist/plugins/dynamic-transform.d.ts.map +1 -0
  145. package/dist/plugins/entries.d.ts +21 -0
  146. package/dist/plugins/entries.d.ts.map +1 -0
  147. package/dist/plugins/fonts.d.ts +77 -0
  148. package/dist/plugins/fonts.d.ts.map +1 -0
  149. package/dist/plugins/mdx.d.ts +21 -0
  150. package/dist/plugins/mdx.d.ts.map +1 -0
  151. package/dist/plugins/react-prod.d.ts +18 -0
  152. package/dist/plugins/react-prod.d.ts.map +1 -0
  153. package/dist/plugins/routing.d.ts +13 -0
  154. package/dist/plugins/routing.d.ts.map +1 -0
  155. package/dist/plugins/server-action-exports.d.ts +26 -0
  156. package/dist/plugins/server-action-exports.d.ts.map +1 -0
  157. package/dist/plugins/server-bundle.d.ts +15 -0
  158. package/dist/plugins/server-bundle.d.ts.map +1 -0
  159. package/dist/plugins/shims.d.ts +18 -0
  160. package/dist/plugins/shims.d.ts.map +1 -0
  161. package/dist/plugins/static-build.d.ts +55 -0
  162. package/dist/plugins/static-build.d.ts.map +1 -0
  163. package/dist/routing/codegen.d.ts +29 -0
  164. package/dist/routing/codegen.d.ts.map +1 -0
  165. package/dist/routing/index.d.ts +8 -0
  166. package/dist/routing/index.d.ts.map +1 -0
  167. package/dist/routing/index.js +2 -0
  168. package/dist/routing/interception.d.ts +46 -0
  169. package/dist/routing/interception.d.ts.map +1 -0
  170. package/dist/routing/scanner.d.ts +28 -0
  171. package/dist/routing/scanner.d.ts.map +1 -0
  172. package/dist/routing/status-file-lint.d.ts +33 -0
  173. package/dist/routing/status-file-lint.d.ts.map +1 -0
  174. package/dist/routing/types.d.ts +81 -0
  175. package/dist/routing/types.d.ts.map +1 -0
  176. package/dist/search-params/analyze.d.ts +54 -0
  177. package/dist/search-params/analyze.d.ts.map +1 -0
  178. package/dist/search-params/codecs.d.ts +53 -0
  179. package/dist/search-params/codecs.d.ts.map +1 -0
  180. package/dist/search-params/create.d.ts +106 -0
  181. package/dist/search-params/create.d.ts.map +1 -0
  182. package/dist/search-params/index.d.ts +7 -0
  183. package/dist/search-params/index.d.ts.map +1 -0
  184. package/dist/search-params/index.js +300 -0
  185. package/dist/search-params/index.js.map +1 -0
  186. package/dist/search-params/registry.d.ts +20 -0
  187. package/dist/search-params/registry.d.ts.map +1 -0
  188. package/dist/server/access-gate.d.ts +42 -0
  189. package/dist/server/access-gate.d.ts.map +1 -0
  190. package/dist/server/action-client.d.ts +190 -0
  191. package/dist/server/action-client.d.ts.map +1 -0
  192. package/dist/server/action-handler.d.ts +48 -0
  193. package/dist/server/action-handler.d.ts.map +1 -0
  194. package/dist/server/actions.d.ts +108 -0
  195. package/dist/server/actions.d.ts.map +1 -0
  196. package/dist/server/asset-headers.d.ts +42 -0
  197. package/dist/server/asset-headers.d.ts.map +1 -0
  198. package/dist/server/body-limits.d.ts +30 -0
  199. package/dist/server/body-limits.d.ts.map +1 -0
  200. package/dist/server/build-manifest.d.ts +120 -0
  201. package/dist/server/build-manifest.d.ts.map +1 -0
  202. package/dist/server/canonicalize.d.ts +30 -0
  203. package/dist/server/canonicalize.d.ts.map +1 -0
  204. package/dist/server/client-module-map.d.ts +47 -0
  205. package/dist/server/client-module-map.d.ts.map +1 -0
  206. package/dist/server/csrf.d.ts +34 -0
  207. package/dist/server/csrf.d.ts.map +1 -0
  208. package/dist/server/deny-renderer.d.ts +49 -0
  209. package/dist/server/deny-renderer.d.ts.map +1 -0
  210. package/dist/server/dev-logger.d.ts +44 -0
  211. package/dist/server/dev-logger.d.ts.map +1 -0
  212. package/dist/server/dev-span-processor.d.ts +29 -0
  213. package/dist/server/dev-span-processor.d.ts.map +1 -0
  214. package/dist/server/dev-warnings.d.ts +129 -0
  215. package/dist/server/dev-warnings.d.ts.map +1 -0
  216. package/dist/server/early-hints-sender.d.ts +38 -0
  217. package/dist/server/early-hints-sender.d.ts.map +1 -0
  218. package/dist/server/early-hints.d.ts +83 -0
  219. package/dist/server/early-hints.d.ts.map +1 -0
  220. package/dist/server/error-boundary-wrapper.d.ts +17 -0
  221. package/dist/server/error-boundary-wrapper.d.ts.map +1 -0
  222. package/dist/server/error-formatter.d.ts +17 -0
  223. package/dist/server/error-formatter.d.ts.map +1 -0
  224. package/dist/server/flush.d.ts +74 -0
  225. package/dist/server/flush.d.ts.map +1 -0
  226. package/dist/server/form-data.d.ts +60 -0
  227. package/dist/server/form-data.d.ts.map +1 -0
  228. package/dist/server/form-flash.d.ts +78 -0
  229. package/dist/server/form-flash.d.ts.map +1 -0
  230. package/dist/server/html-injectors.d.ts +101 -0
  231. package/dist/server/html-injectors.d.ts.map +1 -0
  232. package/dist/server/index.d.ts +54 -0
  233. package/dist/server/index.d.ts.map +1 -0
  234. package/dist/server/index.js +2925 -0
  235. package/dist/server/index.js.map +1 -0
  236. package/dist/server/instrumentation.d.ts +61 -0
  237. package/dist/server/instrumentation.d.ts.map +1 -0
  238. package/dist/server/logger.d.ts +83 -0
  239. package/dist/server/logger.d.ts.map +1 -0
  240. package/dist/server/manifest-status-resolver.d.ts +58 -0
  241. package/dist/server/manifest-status-resolver.d.ts.map +1 -0
  242. package/dist/server/metadata-render.d.ts +20 -0
  243. package/dist/server/metadata-render.d.ts.map +1 -0
  244. package/dist/server/metadata-routes.d.ts +67 -0
  245. package/dist/server/metadata-routes.d.ts.map +1 -0
  246. package/dist/server/metadata.d.ts +67 -0
  247. package/dist/server/metadata.d.ts.map +1 -0
  248. package/dist/server/middleware-runner.d.ts +21 -0
  249. package/dist/server/middleware-runner.d.ts.map +1 -0
  250. package/dist/server/nuqs-ssr-provider.d.ts +28 -0
  251. package/dist/server/nuqs-ssr-provider.d.ts.map +1 -0
  252. package/dist/server/pipeline.d.ts +81 -0
  253. package/dist/server/pipeline.d.ts.map +1 -0
  254. package/dist/server/prerender.d.ts +77 -0
  255. package/dist/server/prerender.d.ts.map +1 -0
  256. package/dist/server/primitives.d.ts +131 -0
  257. package/dist/server/primitives.d.ts.map +1 -0
  258. package/dist/server/proxy.d.ts +23 -0
  259. package/dist/server/proxy.d.ts.map +1 -0
  260. package/dist/server/request-context.d.ts +175 -0
  261. package/dist/server/request-context.d.ts.map +1 -0
  262. package/dist/server/route-element-builder.d.ts +66 -0
  263. package/dist/server/route-element-builder.d.ts.map +1 -0
  264. package/dist/server/route-handler.d.ts +35 -0
  265. package/dist/server/route-handler.d.ts.map +1 -0
  266. package/dist/server/route-matcher.d.ts +78 -0
  267. package/dist/server/route-matcher.d.ts.map +1 -0
  268. package/dist/server/rsc-entry/api-handler.d.ts +11 -0
  269. package/dist/server/rsc-entry/api-handler.d.ts.map +1 -0
  270. package/dist/server/rsc-entry/error-renderer.d.ts +30 -0
  271. package/dist/server/rsc-entry/error-renderer.d.ts.map +1 -0
  272. package/dist/server/rsc-entry/helpers.d.ts +73 -0
  273. package/dist/server/rsc-entry/helpers.d.ts.map +1 -0
  274. package/dist/server/rsc-entry/index.d.ts +11 -0
  275. package/dist/server/rsc-entry/index.d.ts.map +1 -0
  276. package/dist/server/rsc-entry/ssr-bridge.d.ts +6 -0
  277. package/dist/server/rsc-entry/ssr-bridge.d.ts.map +1 -0
  278. package/dist/server/slot-resolver.d.ts +34 -0
  279. package/dist/server/slot-resolver.d.ts.map +1 -0
  280. package/dist/server/ssr-entry.d.ts +73 -0
  281. package/dist/server/ssr-entry.d.ts.map +1 -0
  282. package/dist/server/ssr-render.d.ts +67 -0
  283. package/dist/server/ssr-render.d.ts.map +1 -0
  284. package/dist/server/status-code-resolver.d.ts +77 -0
  285. package/dist/server/status-code-resolver.d.ts.map +1 -0
  286. package/dist/server/tracing.d.ts +99 -0
  287. package/dist/server/tracing.d.ts.map +1 -0
  288. package/dist/server/tree-builder.d.ts +116 -0
  289. package/dist/server/tree-builder.d.ts.map +1 -0
  290. package/dist/server/types.d.ts +231 -0
  291. package/dist/server/types.d.ts.map +1 -0
  292. package/dist/shims/font-google.d.ts +41 -0
  293. package/dist/shims/font-google.d.ts.map +1 -0
  294. package/dist/shims/headers.d.ts +11 -0
  295. package/dist/shims/headers.d.ts.map +1 -0
  296. package/dist/shims/image.d.ts +328 -0
  297. package/dist/shims/image.d.ts.map +1 -0
  298. package/dist/shims/link.d.ts +9 -0
  299. package/dist/shims/link.d.ts.map +1 -0
  300. package/dist/shims/navigation-client.d.ts +25 -0
  301. package/dist/shims/navigation-client.d.ts.map +1 -0
  302. package/dist/shims/navigation.d.ts +25 -0
  303. package/dist/shims/navigation.d.ts.map +1 -0
  304. package/dist/utils/directive-parser.d.ts +70 -0
  305. package/dist/utils/directive-parser.d.ts.map +1 -0
  306. package/dist/utils/format.d.ts +6 -0
  307. package/dist/utils/format.d.ts.map +1 -0
  308. package/dist/utils/startup-timer.d.ts +34 -0
  309. package/dist/utils/startup-timer.d.ts.map +1 -0
  310. package/package.json +140 -0
@@ -0,0 +1,34 @@
1
+ /**
2
+ * CSRF protection — Origin header validation.
3
+ *
4
+ * Auto-derived from the Host header for single-origin deployments.
5
+ * Configurable via allowedOrigins for multi-origin setups.
6
+ * Disable with csrf: false (not recommended outside local dev).
7
+ *
8
+ * See design/08-forms-and-actions.md §"CSRF Protection"
9
+ * See design/13-security.md §"Security Testing Checklist" #6
10
+ */
11
+ export interface CsrfConfig {
12
+ /** Explicit list of allowed origins. Replaces Host-based auto-derivation. */
13
+ allowedOrigins?: string[];
14
+ /** Set to false to disable CSRF validation entirely. */
15
+ csrf?: boolean;
16
+ }
17
+ export type CsrfResult = {
18
+ ok: true;
19
+ } | {
20
+ ok: false;
21
+ status: 403;
22
+ };
23
+ /**
24
+ * Validate the Origin header against the request's Host.
25
+ *
26
+ * For mutation methods (POST, PUT, PATCH, DELETE):
27
+ * - If `csrf: false`, skip validation.
28
+ * - If `allowedOrigins` is set, Origin must match one exactly (no wildcards).
29
+ * - Otherwise, Origin's host must match the request's Host header.
30
+ *
31
+ * Safe methods (GET, HEAD, OPTIONS) always pass.
32
+ */
33
+ export declare function validateCsrf(req: Request, config: CsrfConfig): CsrfResult;
34
+ //# sourceMappingURL=csrf.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"csrf.d.ts","sourceRoot":"","sources":["../../src/server/csrf.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAIH,MAAM,WAAW,UAAU;IACzB,6EAA6E;IAC7E,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,wDAAwD;IACxD,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,MAAM,MAAM,UAAU,GAAG;IAAE,EAAE,EAAE,IAAI,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,GAAG,CAAA;CAAE,CAAC;AASnE;;;;;;;;;GASG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,GAAG,UAAU,CAuCzE"}
@@ -0,0 +1,49 @@
1
+ /**
2
+ * Deny page rendering — renders status-code pages for DenySignal errors.
3
+ *
4
+ * Extracted from rsc-entry.ts to keep file sizes under 500 lines.
5
+ * Handles three rendering paths:
6
+ * 1. Component (TSX/MDX) with shell — full RSC→SSR through layout chain
7
+ * 2. Component (TSX/MDX) without shell — RSC→SSR standalone (no layouts)
8
+ * 3. JSON — raw file contents returned verbatim, no React pipeline
9
+ *
10
+ * Format selection:
11
+ * - Route handlers (route.ts) prefer JSON variants
12
+ * - Page routes prefer component variants
13
+ * - Accept: application/json on page routes falls back to JSON if no component exists
14
+ *
15
+ * See design/10-error-handling.md §"Status-Code Files"
16
+ */
17
+ import { DenySignal } from './primitives.js';
18
+ import type { ManifestSegmentNode } from './route-matcher.js';
19
+ import type { RouteMatch } from './pipeline.js';
20
+ import type { NavContext } from './ssr-entry.js';
21
+ import type { ClientBootstrapConfig } from './html-injectors.js';
22
+ /** Layout component entry for deny page wrapping. */
23
+ export interface LayoutEntry {
24
+ component: (...args: unknown[]) => unknown;
25
+ segment: ManifestSegmentNode;
26
+ }
27
+ /** Callback to create a debug channel sink for RSC rendering. */
28
+ export type DebugChannelFactory = () => {
29
+ readable: ReadableStream;
30
+ writable: WritableStream;
31
+ };
32
+ /** Callback to pass RSC stream to SSR for HTML rendering. */
33
+ export type CallSsrFn = (rscStream: ReadableStream<Uint8Array>, navContext: NavContext) => Promise<Response>;
34
+ /**
35
+ * Render a status-code error page for a DenySignal.
36
+ *
37
+ * Resolves the appropriate status-code file from the segment chain based
38
+ * on format preference. Returns an HTML Response (component), JSON Response,
39
+ * or bare fallback Response.
40
+ */
41
+ export declare function renderDenyPage(deny: DenySignal, segments: ManifestSegmentNode[], layoutComponents: LayoutEntry[], req: Request, match: RouteMatch, responseHeaders: Headers, clientBootstrap: ClientBootstrapConfig, createDebugChannelSink: DebugChannelFactory, callSsr: CallSsrFn): Promise<Response>;
42
+ /**
43
+ * Render a status-code error page as a raw RSC Flight stream for client navigation.
44
+ *
45
+ * Same as renderDenyPage but skips SSR — returns the RSC stream directly
46
+ * so the client can reconcile the error page into the existing DOM.
47
+ */
48
+ export declare function renderDenyPageAsRsc(deny: DenySignal, segments: ManifestSegmentNode[], layoutComponents: LayoutEntry[], responseHeaders: Headers, createDebugChannelSink: DebugChannelFactory): Promise<Response>;
49
+ //# sourceMappingURL=deny-renderer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deny-renderer.d.ts","sourceRoot":"","sources":["../../src/server/deny-renderer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAKH,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAI7C,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAC9D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAMjE,qDAAqD;AACrD,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,OAAO,CAAC;IAC3C,OAAO,EAAE,mBAAmB,CAAC;CAC9B;AAED,iEAAiE;AACjE,MAAM,MAAM,mBAAmB,GAAG,MAAM;IACtC,QAAQ,EAAE,cAAc,CAAC;IACzB,QAAQ,EAAE,cAAc,CAAC;CAC1B,CAAC;AAEF,6DAA6D;AAC7D,MAAM,MAAM,SAAS,GAAG,CACtB,SAAS,EAAE,cAAc,CAAC,UAAU,CAAC,EACrC,UAAU,EAAE,UAAU,KACnB,OAAO,CAAC,QAAQ,CAAC,CAAC;AAUvB;;;;;;GAMG;AACH,wBAAsB,cAAc,CAClC,IAAI,EAAE,UAAU,EAChB,QAAQ,EAAE,mBAAmB,EAAE,EAC/B,gBAAgB,EAAE,WAAW,EAAE,EAC/B,GAAG,EAAE,OAAO,EACZ,KAAK,EAAE,UAAU,EACjB,eAAe,EAAE,OAAO,EACxB,eAAe,EAAE,qBAAqB,EACtC,sBAAsB,EAAE,mBAAmB,EAC3C,OAAO,EAAE,SAAS,GACjB,OAAO,CAAC,QAAQ,CAAC,CA6GnB;AAED;;;;;GAKG;AACH,wBAAsB,mBAAmB,CACvC,IAAI,EAAE,UAAU,EAChB,QAAQ,EAAE,mBAAmB,EAAE,EAC/B,gBAAgB,EAAE,WAAW,EAAE,EAC/B,eAAe,EAAE,OAAO,EACxB,sBAAsB,EAAE,mBAAmB,GAC1C,OAAO,CAAC,QAAQ,CAAC,CAgDnB"}
@@ -0,0 +1,44 @@
1
+ /**
2
+ * Dev logger — structured console output for every request in dev mode.
3
+ *
4
+ * Formats OTEL span trees into indented tree output for stderr. Spans are
5
+ * the single source of truth — no separate event system needed.
6
+ *
7
+ * Supports five modes:
8
+ * - tree (default) — indented tree per request
9
+ * - verbose — detailed tree showing every component render
10
+ * - summary — one line per request
11
+ * - json — chronological NDJSON dump of all spans
12
+ * - quiet — no output
13
+ *
14
+ * Design doc: 21-dev-server.md §"Dev Logging", 17-logging.md §"Dev Logging"
15
+ */
16
+ import type { ReadableSpan } from '@opentelemetry/sdk-trace-base';
17
+ export type DevLogMode = 'tree' | 'verbose' | 'summary' | 'json' | 'quiet';
18
+ export interface DevLoggerConfig {
19
+ /** Logging mode. Default: 'tree'. */
20
+ mode?: DevLogMode;
21
+ /** Threshold in ms to highlight slow phases. Default: 200. */
22
+ slowPhaseMs?: number;
23
+ }
24
+ /**
25
+ * Resolve the effective log mode from environment variables and config.
26
+ * Environment variables override config file values per 21-dev-server.md.
27
+ */
28
+ export declare function resolveLogMode(config?: DevLoggerConfig): DevLogMode;
29
+ /**
30
+ * Format spans as a full indented tree string for stderr.
31
+ */
32
+ export declare function formatSpanTree(spans: ReadableSpan[], config?: DevLoggerConfig): string;
33
+ /**
34
+ * Format spans as a one-line summary.
35
+ */
36
+ export declare function formatSpanSummary(spans: ReadableSpan[], _config?: DevLoggerConfig): string;
37
+ /**
38
+ * Format spans as chronological NDJSON for json mode.
39
+ *
40
+ * Each span is one JSON line, ordered by start time. Useful for piping
41
+ * to jq or feeding into external trace analysis tools.
42
+ */
43
+ export declare function formatJson(spans: ReadableSpan[]): string;
44
+ //# sourceMappingURL=dev-logger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dev-logger.d.ts","sourceRoot":"","sources":["../../src/server/dev-logger.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAIlE,MAAM,MAAM,UAAU,GAAG,MAAM,GAAG,SAAS,GAAG,SAAS,GAAG,MAAM,GAAG,OAAO,CAAC;AAE3E,MAAM,WAAW,eAAe;IAC9B,qCAAqC;IACrC,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB,8DAA8D;IAC9D,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AA8LD;;;GAGG;AACH,wBAAgB,cAAc,CAAC,MAAM,CAAC,EAAE,eAAe,GAAG,UAAU,CAMnE;AAID;;GAEG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,YAAY,EAAE,EAAE,MAAM,CAAC,EAAE,eAAe,GAAG,MAAM,CAgDtF;AA6DD;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,YAAY,EAAE,EAAE,OAAO,CAAC,EAAE,eAAe,GAAG,MAAM,CAc1F;AAED;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,YAAY,EAAE,GAAG,MAAM,CA6BxD"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * DevSpanProcessor — Custom OTEL SpanProcessor that drives dev log output.
3
+ *
4
+ * Collects completed spans per-request (correlated by trace ID). When the
5
+ * root span (http.server.request) ends, all child spans are already collected
6
+ * (child spans end before parent in OTEL). The processor formats the span
7
+ * tree and writes it to stderr.
8
+ *
9
+ * This replaces the old DevLogEmitter/DevLogEvents system. OTEL spans are
10
+ * now the single source of truth for dev logging — no more parallel event
11
+ * systems that can drift.
12
+ *
13
+ * Design doc: 17-logging.md §"Dev Logging", 21-dev-server.md §"Dev Logging"
14
+ */
15
+ import type { SpanProcessor, ReadableSpan } from '@opentelemetry/sdk-trace-base';
16
+ import type { Span, Context } from '@opentelemetry/api';
17
+ import { type DevLoggerConfig } from './dev-logger.js';
18
+ export declare class DevSpanProcessor implements SpanProcessor {
19
+ private spansByTrace;
20
+ private mode;
21
+ private config;
22
+ constructor(config: DevLoggerConfig);
23
+ onStart(_span: Span, _context: Context): void;
24
+ onEnd(span: ReadableSpan): void;
25
+ private format;
26
+ shutdown(): Promise<void>;
27
+ forceFlush(): Promise<void>;
28
+ }
29
+ //# sourceMappingURL=dev-span-processor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dev-span-processor.d.ts","sourceRoot":"","sources":["../../src/server/dev-span-processor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AACjF,OAAO,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAKL,KAAK,eAAe,EACrB,MAAM,iBAAiB,CAAC;AAEzB,qBAAa,gBAAiB,YAAW,aAAa;IACpD,OAAO,CAAC,YAAY,CAAqC;IACzD,OAAO,CAAC,IAAI,CAAa;IACzB,OAAO,CAAC,MAAM,CAAkB;gBAEpB,MAAM,EAAE,eAAe;IAKnC,OAAO,CAAC,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,GAAG,IAAI;IAI7C,KAAK,CAAC,IAAI,EAAE,YAAY,GAAG,IAAI;IAqB/B,OAAO,CAAC,MAAM;IAUR,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAIzB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;CAGlC"}
@@ -0,0 +1,129 @@
1
+ /**
2
+ * Dev-mode warnings for common timber.js misuse patterns.
3
+ *
4
+ * These fire in development only and are stripped from production builds.
5
+ * Each warning targets a specific misuse identified during design review.
6
+ *
7
+ * Warnings are deduplicated by warningId:filePath:line so the same warning
8
+ * is only emitted once per dev session (per unique source location).
9
+ *
10
+ * Warnings are written to stderr and, when a Vite dev server is available,
11
+ * forwarded to the browser console via Vite's WebSocket.
12
+ *
13
+ * See design/21-dev-server.md §"Dev-Mode Warnings"
14
+ * See design/11-platform.md §"Dev Mode"
15
+ */
16
+ import type { ViteDevServer } from 'vite';
17
+ export declare const WarningId: {
18
+ readonly SUSPENSE_WRAPS_CHILDREN: "SUSPENSE_WRAPS_CHILDREN";
19
+ readonly DENY_IN_SUSPENSE: "DENY_IN_SUSPENSE";
20
+ readonly REDIRECT_IN_SUSPENSE: "REDIRECT_IN_SUSPENSE";
21
+ readonly REDIRECT_IN_ACCESS: "REDIRECT_IN_ACCESS";
22
+ readonly STATIC_REQUEST_API: "STATIC_REQUEST_API";
23
+ readonly CACHE_REQUEST_PROPS: "CACHE_REQUEST_PROPS";
24
+ readonly SLOW_SLOT_NO_SUSPENSE: "SLOW_SLOT_NO_SUSPENSE";
25
+ };
26
+ export type WarningId = (typeof WarningId)[keyof typeof WarningId];
27
+ /** Configuration for dev warning behavior. */
28
+ export interface DevWarningConfig {
29
+ /** Threshold in ms for "slow slot" warnings. Default: 200. */
30
+ slowSlotThresholdMs?: number;
31
+ }
32
+ /**
33
+ * Register the Vite dev server for browser console forwarding.
34
+ * Called by timber-dev-server during configureServer.
35
+ */
36
+ export declare function setViteServer(server: ViteDevServer | null): void;
37
+ /**
38
+ * Warn when a layout wraps {children} in <Suspense>.
39
+ *
40
+ * This defers the page content — the primary resource — behind a fallback.
41
+ * The page's data fetches won't affect the HTTP status code because they
42
+ * resolve after onShellReady. If the page calls deny(404), the status code
43
+ * is already committed as 200.
44
+ *
45
+ * @param layoutFile - Relative path to the layout file (e.g., "app/(dashboard)/layout.tsx")
46
+ */
47
+ export declare function warnSuspenseWrappingChildren(layoutFile: string): void;
48
+ /**
49
+ * Warn when deny() is called inside a Suspense boundary.
50
+ *
51
+ * After the shell has flushed and the status code is committed, deny()
52
+ * cannot change the HTTP response. The signal will be caught by the nearest
53
+ * error boundary instead of producing a correct status code.
54
+ *
55
+ * @param file - Relative path to the file
56
+ * @param line - Line number where deny() was called
57
+ */
58
+ export declare function warnDenyInSuspense(file: string, line?: number): void;
59
+ /**
60
+ * Warn when redirect() is called inside a Suspense boundary.
61
+ *
62
+ * This will perform a client-side navigation instead of an HTTP redirect.
63
+ *
64
+ * @param file - Relative path to the file
65
+ * @param line - Line number where redirect() was called
66
+ */
67
+ export declare function warnRedirectInSuspense(file: string, line?: number): void;
68
+ /**
69
+ * Warn when redirect() is called in a slot's access.ts.
70
+ *
71
+ * Slots use deny() for graceful degradation. Redirecting from a slot would
72
+ * redirect the entire page, breaking the contract that slot failure is
73
+ * isolated to the slot.
74
+ *
75
+ * @param accessFile - Relative path to the access.ts file
76
+ * @param line - Line number where redirect() was called
77
+ */
78
+ export declare function warnRedirectInAccess(accessFile: string, line?: number): void;
79
+ /**
80
+ * Warn when cookies() or headers() is called during a static build.
81
+ *
82
+ * In output: 'static' mode, there is no per-request context — these APIs
83
+ * read build-time values only. This is almost always a mistake.
84
+ *
85
+ * @param api - The dynamic API name ("cookies" or "headers")
86
+ * @param file - Relative path to the file calling the API
87
+ */
88
+ export declare function warnStaticRequestApi(api: 'cookies' | 'headers', file: string): void;
89
+ /**
90
+ * Warn when a "use cache" component receives request-specific props.
91
+ *
92
+ * Cached components should not depend on per-request data — a userId or
93
+ * sessionId in the props means the cache will either be ineffective
94
+ * (key per user) or dangerous (serve one user's data to another).
95
+ *
96
+ * @param componentName - Name of the cached component
97
+ * @param propName - Name of the suspicious prop
98
+ * @param file - Relative path to the component file
99
+ * @param line - Line number
100
+ */
101
+ export declare function warnCacheRequestProps(componentName: string, propName: string, file: string, line?: number): void;
102
+ /**
103
+ * Warn when a parallel slot resolves slowly without a <Suspense> wrapper.
104
+ *
105
+ * A slow slot without Suspense blocks onShellReady — and therefore the
106
+ * status code commit — for the entire page. Wrapping it in <Suspense>
107
+ * lets the shell flush without waiting for the slot.
108
+ *
109
+ * @param slotName - The slot name (e.g., "@admin")
110
+ * @param durationMs - How long the slot took to resolve
111
+ */
112
+ export declare function warnSlowSlotWithoutSuspense(slotName: string, durationMs: number): void;
113
+ /** @deprecated Use warnStaticRequestApi instead */
114
+ export declare const warnDynamicApiInStaticBuild: typeof warnStaticRequestApi;
115
+ /** @deprecated Use warnRedirectInAccess instead */
116
+ export declare function warnRedirectInSlotAccess(slotName: string): void;
117
+ /** @deprecated Use warnDenyInSuspense / warnRedirectInSuspense instead */
118
+ export declare function warnDenyAfterFlush(signal: 'deny' | 'redirect'): void;
119
+ /**
120
+ * Reset emitted warnings. For testing only.
121
+ * @internal
122
+ */
123
+ export declare function _resetWarnings(): void;
124
+ /**
125
+ * Get the set of emitted dedup keys. For testing only.
126
+ * @internal
127
+ */
128
+ export declare function _getEmitted(): ReadonlySet<string>;
129
+ //# sourceMappingURL=dev-warnings.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dev-warnings.d.ts","sourceRoot":"","sources":["../../src/server/dev-warnings.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,MAAM,CAAC;AAI1C,eAAO,MAAM,SAAS;;;;;;;;CAQZ,CAAC;AAEX,MAAM,MAAM,SAAS,GAAG,CAAC,OAAO,SAAS,CAAC,CAAC,MAAM,OAAO,SAAS,CAAC,CAAC;AAInE,8CAA8C;AAC9C,MAAM,WAAW,gBAAgB;IAC/B,8DAA8D;IAC9D,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAC9B;AASD;;;GAGG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,aAAa,GAAG,IAAI,GAAG,IAAI,CAEhE;AA0CD;;;;;;;;;GASG;AACH,wBAAgB,4BAA4B,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CASrE;AAED;;;;;;;;;GASG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAUpE;AAED;;;;;;;GAOG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CASxE;AAED;;;;;;;;;GASG;AACH,wBAAgB,oBAAoB,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAU5E;AAED;;;;;;;;GAQG;AACH,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,SAAS,GAAG,SAAS,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAQnF;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,qBAAqB,CACnC,aAAa,EAAE,MAAM,EACrB,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,EACZ,IAAI,CAAC,EAAE,MAAM,GACZ,IAAI,CASN;AAED;;;;;;;;;GASG;AACH,wBAAgB,2BAA2B,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI,CAQtF;AAID,mDAAmD;AACnD,eAAO,MAAM,2BAA2B,6BAAuB,CAAC;AAEhE,mDAAmD;AACnD,wBAAgB,wBAAwB,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAE/D;AAED,0EAA0E;AAC1E,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI,CAMpE;AAID;;;GAGG;AACH,wBAAgB,cAAc,IAAI,IAAI,CAErC;AAED;;;GAGG;AACH,wBAAgB,WAAW,IAAI,WAAW,CAAC,MAAM,CAAC,CAEjD"}
@@ -0,0 +1,38 @@
1
+ /**
2
+ * Per-request 103 Early Hints sender — ALS bridge for platform adapters.
3
+ *
4
+ * The pipeline collects Link headers for CSS, fonts, and JS chunks at
5
+ * route-match time. On platforms that support it (Node.js v18.11+, Bun),
6
+ * the adapter can send these as a 103 Early Hints interim response before
7
+ * the final response is ready.
8
+ *
9
+ * This module provides an ALS-based bridge: the generated entry point
10
+ * (e.g., the Nitro entry) wraps the handler with `runWithEarlyHintsSender`,
11
+ * binding a per-request sender function. The pipeline calls
12
+ * `sendEarlyHints103()` to fire the 103 if a sender is available.
13
+ *
14
+ * On platforms where 103 is handled at the CDN level (e.g., Cloudflare
15
+ * converts Link headers into 103 automatically), no sender is installed
16
+ * and `sendEarlyHints103()` is a no-op.
17
+ *
18
+ * Design doc: 02-rendering-pipeline.md §"Early Hints (103)"
19
+ */
20
+ /** Function that sends Link header values as a 103 Early Hints response. */
21
+ export type EarlyHintsSenderFn = (links: string[]) => void;
22
+ /**
23
+ * Run a function with a per-request early hints sender installed.
24
+ *
25
+ * Called by generated entry points (e.g., Nitro node-server/bun) to
26
+ * bind the platform's writeEarlyHints capability for the request duration.
27
+ */
28
+ export declare function runWithEarlyHintsSender<T>(sender: EarlyHintsSenderFn, fn: () => T): T;
29
+ /**
30
+ * Send collected Link headers as a 103 Early Hints response.
31
+ *
32
+ * No-op if no sender is installed for the current request (e.g., on
33
+ * Cloudflare where the CDN handles 103 automatically, or in dev mode).
34
+ *
35
+ * Non-fatal: errors from the sender are caught and silently ignored.
36
+ */
37
+ export declare function sendEarlyHints103(links: string[]): void;
38
+ //# sourceMappingURL=early-hints-sender.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"early-hints-sender.d.ts","sourceRoot":"","sources":["../../src/server/early-hints-sender.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAIH,4EAA4E;AAC5E,MAAM,MAAM,kBAAkB,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,IAAI,CAAC;AAI3D;;;;;GAKG;AACH,wBAAgB,uBAAuB,CAAC,CAAC,EAAE,MAAM,EAAE,kBAAkB,EAAE,EAAE,EAAE,MAAM,CAAC,GAAG,CAAC,CAErF;AAED;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,CASvD"}
@@ -0,0 +1,83 @@
1
+ /**
2
+ * 103 Early Hints utilities.
3
+ *
4
+ * Early Hints are sent before the final response to let the browser
5
+ * start fetching critical resources (CSS, fonts, JS) while the server
6
+ * is still rendering.
7
+ *
8
+ * The framework collects hints from two sources:
9
+ * 1. Build manifest — CSS, fonts, and JS chunks known at route-match time
10
+ * 2. ctx.earlyHints() — explicit hints added by middleware or route handlers
11
+ *
12
+ * Both are emitted as Link headers. Cloudflare CDN automatically converts
13
+ * Link headers into 103 Early Hints responses.
14
+ *
15
+ * Design docs: 02-rendering-pipeline.md §"Early Hints (103)"
16
+ */
17
+ import type { BuildManifest } from './build-manifest.js';
18
+ /** Minimal segment shape needed for early hint collection. */
19
+ interface SegmentWithFiles {
20
+ layout?: {
21
+ filePath: string;
22
+ };
23
+ page?: {
24
+ filePath: string;
25
+ };
26
+ }
27
+ /**
28
+ * A single Link header hint for 103 Early Hints.
29
+ *
30
+ * ```ts
31
+ * ctx.earlyHints([
32
+ * { href: '/styles/critical.css', rel: 'preload', as: 'style' },
33
+ * { href: 'https://fonts.googleapis.com', rel: 'preconnect' },
34
+ * ])
35
+ * ```
36
+ */
37
+ export interface EarlyHint {
38
+ /** The resource URL (absolute or root-relative). */
39
+ href: string;
40
+ /** Link relation — `preload`, `modulepreload`, or `preconnect`. */
41
+ rel: 'preload' | 'modulepreload' | 'preconnect';
42
+ /** Resource type for `preload` hints (omit for `modulepreload` / `preconnect`). */
43
+ as?: 'style' | 'script' | 'font' | 'image' | 'fetch' | 'document';
44
+ /** Crossorigin attribute — required for font preloads per spec. */
45
+ crossOrigin?: 'anonymous' | 'use-credentials';
46
+ /** Fetch priority hint — `high`, `low`, or `auto`. */
47
+ fetchPriority?: 'high' | 'low' | 'auto';
48
+ }
49
+ /**
50
+ * Format a single EarlyHint as a Link header value.
51
+ *
52
+ * Examples:
53
+ * `</styles/root.css>; rel=preload; as=style`
54
+ * `</fonts/inter.woff2>; rel=preload; as=font; crossorigin=anonymous`
55
+ * `</_timber/client.js>; rel=modulepreload`
56
+ * `<https://fonts.googleapis.com>; rel=preconnect`
57
+ */
58
+ export declare function formatLinkHeader(hint: EarlyHint): string;
59
+ /** Options for early hint collection. */
60
+ export interface EarlyHintOptions {
61
+ /** Skip JS modulepreload hints (e.g. when client JavaScript is disabled). */
62
+ skipJs?: boolean;
63
+ }
64
+ /**
65
+ * Collect all Link header strings for a matched route's segment chain.
66
+ *
67
+ * Walks the build manifest to emit hints for:
68
+ * - CSS stylesheets (rel=preload; as=style)
69
+ * - Font assets (rel=preload; as=font; crossorigin)
70
+ * - JS modulepreload hints (rel=modulepreload) — unless skipJs is set
71
+ *
72
+ * Also emits global CSS from the `_global` manifest key. Route files
73
+ * are server components that don't appear in the client bundle, so
74
+ * per-route CSS keying doesn't work with the RSC plugin. The `_global`
75
+ * key contains all CSS assets from the client build — fine for early
76
+ * hints since they're just prefetch signals.
77
+ *
78
+ * Returns formatted Link header strings, deduplicated, root → leaf order.
79
+ * Returns an empty array in dev mode (manifest is empty).
80
+ */
81
+ export declare function collectEarlyHintHeaders(segments: SegmentWithFiles[], manifest: BuildManifest, options?: EarlyHintOptions): string[];
82
+ export {};
83
+ //# sourceMappingURL=early-hints.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"early-hints.d.ts","sourceRoot":"","sources":["../../src/server/early-hints.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAOH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEzD,8DAA8D;AAC9D,UAAU,gBAAgB;IACxB,MAAM,CAAC,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC;IAC9B,IAAI,CAAC,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC;CAC7B;AAID;;;;;;;;;GASG;AACH,MAAM,WAAW,SAAS;IACxB,oDAAoD;IACpD,IAAI,EAAE,MAAM,CAAC;IACb,mEAAmE;IACnE,GAAG,EAAE,SAAS,GAAG,eAAe,GAAG,YAAY,CAAC;IAChD,mFAAmF;IACnF,EAAE,CAAC,EAAE,OAAO,GAAG,QAAQ,GAAG,MAAM,GAAG,OAAO,GAAG,OAAO,GAAG,UAAU,CAAC;IAClE,mEAAmE;IACnE,WAAW,CAAC,EAAE,WAAW,GAAG,iBAAiB,CAAC;IAC9C,sDAAsD;IACtD,aAAa,CAAC,EAAE,MAAM,GAAG,KAAK,GAAG,MAAM,CAAC;CACzC;AAID;;;;;;;;GAQG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,SAAS,GAAG,MAAM,CAMxD;AAID,yCAAyC;AACzC,MAAM,WAAW,gBAAgB;IAC/B,6EAA6E;IAC7E,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,uBAAuB,CACrC,QAAQ,EAAE,gBAAgB,EAAE,EAC5B,QAAQ,EAAE,aAAa,EACvB,OAAO,CAAC,EAAE,gBAAgB,GACzB,MAAM,EAAE,CAsCV"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Error boundary wrapper — wraps a React element in error boundaries from a route segment.
3
+ *
4
+ * Extracted to allow reuse by both rsc-entry.ts and route-element-builder.ts.
5
+ * See design/10-error-handling.md.
6
+ */
7
+ import type { ManifestSegmentNode } from './route-matcher.js';
8
+ /**
9
+ * Wrap an element in error boundaries defined by a route segment.
10
+ *
11
+ * Processing order (innermost to outermost):
12
+ * 1. Specific status files (e.g., 404.tsx, 500.tsx) — highest priority at runtime
13
+ * 2. Category catch-alls (4xx.tsx, 5xx.tsx)
14
+ * 3. error.tsx — catches anything not matched by status files
15
+ */
16
+ export declare function wrapSegmentWithErrorBoundaries(segment: ManifestSegmentNode, element: React.ReactElement, h: (...args: unknown[]) => React.ReactElement): Promise<React.ReactElement>;
17
+ //# sourceMappingURL=error-boundary-wrapper.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"error-boundary-wrapper.d.ts","sourceRoot":"","sources":["../../src/server/error-boundary-wrapper.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAE9D;;;;;;;GAOG;AACH,wBAAsB,8BAA8B,CAClD,OAAO,EAAE,mBAAmB,EAC5B,OAAO,EAAE,KAAK,CAAC,YAAY,EAC3B,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,KAAK,CAAC,YAAY,GAC5C,OAAO,CAAC,KAAK,CAAC,YAAY,CAAC,CA8C7B"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Error Formatter — rewrites SSR/RSC error messages to surface user code.
3
+ *
4
+ * When React or Vite throw errors during SSR, stack traces reference
5
+ * vendored dependency paths (e.g. `.vite/deps_ssr/@vitejs_plugin-rsc_vendor_...`)
6
+ * and mangled export names (`__vite_ssr_export_default__`). This module
7
+ * rewrites error messages and stack traces to point at user code instead.
8
+ *
9
+ * Dev-only — in production, errors go through the structured logger
10
+ * without formatting.
11
+ */
12
+ /**
13
+ * Rewrite an error's message and stack to replace internal Vite paths
14
+ * and mangled names with human-readable labels.
15
+ */
16
+ export declare function formatSsrError(error: unknown): string;
17
+ //# sourceMappingURL=error-formatter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"error-formatter.d.ts","sourceRoot":"","sources":["../../src/server/error-formatter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAyCH;;;GAGG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CA6CrD"}
@@ -0,0 +1,74 @@
1
+ /**
2
+ * Flush controller for timber.js rendering.
3
+ *
4
+ * Holds the response until `onShellReady` fires, then commits the HTTP status
5
+ * code and flushes the shell. Render-phase signals (deny, redirect, unhandled
6
+ * throws) caught before flush produce correct HTTP status codes.
7
+ *
8
+ * See design/02-rendering-pipeline.md §"The Flush Point" and §"The Hold Window"
9
+ */
10
+ /** The readable stream from React's renderToReadableStream. */
11
+ export interface ReactRenderStream {
12
+ /** The underlying ReadableStream of HTML bytes. */
13
+ readable: ReadableStream<Uint8Array>;
14
+ /** Resolves when the shell has finished rendering (all non-Suspense content). */
15
+ allReady?: Promise<void>;
16
+ }
17
+ /** Options for the flush controller. */
18
+ export interface FlushOptions {
19
+ /** Response headers to include (from middleware.ts, proxy.ts, etc.). */
20
+ responseHeaders?: Headers;
21
+ /** Default status code when rendering succeeds. Default: 200. */
22
+ defaultStatus?: number;
23
+ }
24
+ /** Result of the flush process. */
25
+ export interface FlushResult {
26
+ /** The final HTTP Response. */
27
+ response: Response;
28
+ /** The status code committed. */
29
+ status: number;
30
+ /** Whether the response was a redirect. */
31
+ isRedirect: boolean;
32
+ /** Whether the response was a denial. */
33
+ isDenial: boolean;
34
+ }
35
+ /**
36
+ * A function that performs the React render.
37
+ *
38
+ * The flush controller calls this, catches any signals thrown during the
39
+ * synchronous shell render (before onShellReady), and produces the
40
+ * correct HTTP response.
41
+ *
42
+ * Must return an object with:
43
+ * - `stream`: The ReadableStream from renderToReadableStream
44
+ * - `shellReady`: A Promise that resolves when onShellReady fires
45
+ */
46
+ export interface RenderResult {
47
+ /** The HTML byte stream. */
48
+ stream: ReadableStream<Uint8Array>;
49
+ /** Resolves when the shell is ready (all non-Suspense content rendered). */
50
+ shellReady: Promise<void>;
51
+ }
52
+ export type RenderFn = () => RenderResult | Promise<RenderResult>;
53
+ /**
54
+ * Execute a render and hold the response until the shell is ready.
55
+ *
56
+ * The flush controller:
57
+ * 1. Calls the render function to start renderToReadableStream
58
+ * 2. Waits for shellReady (onShellReady)
59
+ * 3. If a render-phase signal was thrown (deny, redirect, error), produces
60
+ * the correct HTTP status code
61
+ * 4. If the shell rendered successfully, commits the status and streams
62
+ *
63
+ * Render-phase signals caught before flush:
64
+ * - `DenySignal` → HTTP 4xx with appropriate status code
65
+ * - `RedirectSignal` → HTTP 3xx with Location header
66
+ * - `RenderError` → HTTP status from error (default 500)
67
+ * - Unhandled error → HTTP 500
68
+ *
69
+ * @param renderFn - Function that starts the React render.
70
+ * @param options - Flush configuration.
71
+ * @returns The committed HTTP Response.
72
+ */
73
+ export declare function flushResponse(renderFn: RenderFn, options?: FlushOptions): Promise<FlushResult>;
74
+ //# sourceMappingURL=flush.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"flush.d.ts","sourceRoot":"","sources":["../../src/server/flush.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAMH,+DAA+D;AAC/D,MAAM,WAAW,iBAAiB;IAChC,mDAAmD;IACnD,QAAQ,EAAE,cAAc,CAAC,UAAU,CAAC,CAAC;IACrC,iFAAiF;IACjF,QAAQ,CAAC,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;CAC1B;AAED,wCAAwC;AACxC,MAAM,WAAW,YAAY;IAC3B,wEAAwE;IACxE,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,iEAAiE;IACjE,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,mCAAmC;AACnC,MAAM,WAAW,WAAW;IAC1B,+BAA+B;IAC/B,QAAQ,EAAE,QAAQ,CAAC;IACnB,iCAAiC;IACjC,MAAM,EAAE,MAAM,CAAC;IACf,2CAA2C;IAC3C,UAAU,EAAE,OAAO,CAAC;IACpB,yCAAyC;IACzC,QAAQ,EAAE,OAAO,CAAC;CACnB;AAID;;;;;;;;;;GAUG;AACH,MAAM,WAAW,YAAY;IAC3B,4BAA4B;IAC5B,MAAM,EAAE,cAAc,CAAC,UAAU,CAAC,CAAC;IACnC,4EAA4E;IAC5E,UAAU,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;CAC3B;AAED,MAAM,MAAM,QAAQ,GAAG,MAAM,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;AAIlE;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAsB,aAAa,CACjC,QAAQ,EAAE,QAAQ,EAClB,OAAO,GAAE,YAAiB,GACzB,OAAO,CAAC,WAAW,CAAC,CAiCtB"}
@@ -0,0 +1,60 @@
1
+ /**
2
+ * FormData preprocessing — schema-agnostic conversion of FormData to typed objects.
3
+ *
4
+ * FormData is all strings. Schema validation expects typed values. This module
5
+ * bridges the gap with intelligent coercion that runs *before* schema validation.
6
+ *
7
+ * Inspired by zod-form-data, but schema-agnostic — works with any Standard Schema
8
+ * library (Zod, Valibot, ArkType).
9
+ *
10
+ * See design/08-forms-and-actions.md §"parseFormData() and coerce helpers"
11
+ */
12
+ /**
13
+ * Convert FormData into a plain object with intelligent coercion.
14
+ *
15
+ * Handles:
16
+ * - **Duplicate keys → arrays**: `tags=js&tags=ts` → `{ tags: ["js", "ts"] }`
17
+ * - **Nested dot-paths**: `user.name=Alice` → `{ user: { name: "Alice" } }`
18
+ * - **Empty strings → undefined**: Enables `.optional()` semantics in schemas
19
+ * - **Empty Files → undefined**: File inputs with no selection become `undefined`
20
+ * - **Strips `$ACTION_*` fields**: React's internal hidden fields are excluded
21
+ */
22
+ export declare function parseFormData(formData: FormData): Record<string, unknown>;
23
+ /**
24
+ * Schema-agnostic coercion primitives for common FormData patterns.
25
+ *
26
+ * These are plain transform functions — they compose with any schema library's
27
+ * `transform`/`preprocess` pipeline:
28
+ *
29
+ * ```ts
30
+ * // Zod
31
+ * z.preprocess(coerce.number, z.number())
32
+ * // Valibot
33
+ * v.pipe(v.unknown(), v.transform(coerce.number), v.number())
34
+ * ```
35
+ */
36
+ export declare const coerce: {
37
+ /**
38
+ * Coerce a string to a number.
39
+ * - `"42"` → `42`
40
+ * - `"3.14"` → `3.14`
41
+ * - `""` / `undefined` / `null` → `undefined`
42
+ * - Non-numeric strings → `undefined` (schema validation will catch this)
43
+ */
44
+ number(value: unknown): number | undefined;
45
+ /**
46
+ * Coerce a checkbox value to a boolean.
47
+ * HTML checkboxes submit "on" when checked and are absent when unchecked.
48
+ * - `"on"` / any truthy string → `true`
49
+ * - `undefined` / `null` / `""` → `false`
50
+ */
51
+ checkbox(value: unknown): boolean;
52
+ /**
53
+ * Parse a JSON string into an object.
54
+ * - Valid JSON string → parsed object
55
+ * - `""` / `undefined` / `null` → `undefined`
56
+ * - Invalid JSON → `undefined` (schema validation will catch this)
57
+ */
58
+ json(value: unknown): unknown;
59
+ };
60
+ //# sourceMappingURL=form-data.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"form-data.d.ts","sourceRoot":"","sources":["../../src/server/form-data.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAIH;;;;;;;;;GASG;AACH,wBAAgB,aAAa,CAAC,QAAQ,EAAE,QAAQ,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAoBzE;AAyED;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,MAAM;IACjB;;;;;;OAMG;kBACW,OAAO,GAAG,MAAM,GAAG,SAAS;IAS1C;;;;;OAKG;oBACa,OAAO,GAAG,OAAO;IAOjC;;;;;OAKG;gBACS,OAAO,GAAG,OAAO;CAS9B,CAAC"}