@timber-js/app 0.2.0-alpha.10 → 0.2.0-alpha.101

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 (729) hide show
  1. package/LICENSE +8 -0
  2. package/dist/_chunks/actions-BsfxK6yu.js +1061 -0
  3. package/dist/_chunks/actions-BsfxK6yu.js.map +1 -0
  4. package/dist/_chunks/build-output-helper-DXnW0qjz.js +61 -0
  5. package/dist/_chunks/build-output-helper-DXnW0qjz.js.map +1 -0
  6. package/dist/_chunks/chunk-Cfpv9whK.js +32 -0
  7. package/dist/_chunks/define-B-Q_UMOD.js +195 -0
  8. package/dist/_chunks/define-B-Q_UMOD.js.map +1 -0
  9. package/dist/_chunks/define-cookie-BjpIt4UC.js +194 -0
  10. package/dist/_chunks/define-cookie-BjpIt4UC.js.map +1 -0
  11. package/dist/_chunks/define-k32T6NL2.js +123 -0
  12. package/dist/_chunks/define-k32T6NL2.js.map +1 -0
  13. package/dist/_chunks/format-Bcn-Iv1x.js +14 -0
  14. package/dist/_chunks/format-Bcn-Iv1x.js.map +1 -0
  15. package/dist/_chunks/handler-store-B-lqaGyh.js +54 -0
  16. package/dist/_chunks/handler-store-B-lqaGyh.js.map +1 -0
  17. package/dist/_chunks/logger-0m8MsKdc.js +291 -0
  18. package/dist/_chunks/logger-0m8MsKdc.js.map +1 -0
  19. package/dist/_chunks/merge-search-params-BphMdht_.js +122 -0
  20. package/dist/_chunks/merge-search-params-BphMdht_.js.map +1 -0
  21. package/dist/_chunks/{metadata-routes-Cjmvi3rQ.js → metadata-routes-BU684ls2.js} +1 -1
  22. package/dist/_chunks/{metadata-routes-Cjmvi3rQ.js.map → metadata-routes-BU684ls2.js.map} +1 -1
  23. package/dist/_chunks/navigation-root-yx917rG0.js +96 -0
  24. package/dist/_chunks/navigation-root-yx917rG0.js.map +1 -0
  25. package/dist/_chunks/registry-I2ss-lvy.js +20 -0
  26. package/dist/_chunks/registry-I2ss-lvy.js.map +1 -0
  27. package/dist/_chunks/router-ref-h3-UaCQv.js +28 -0
  28. package/dist/_chunks/router-ref-h3-UaCQv.js.map +1 -0
  29. package/dist/_chunks/schema-bridge-Cxu4l-7p.js +86 -0
  30. package/dist/_chunks/schema-bridge-Cxu4l-7p.js.map +1 -0
  31. package/dist/_chunks/segment-classify-BjfuctV2.js +137 -0
  32. package/dist/_chunks/segment-classify-BjfuctV2.js.map +1 -0
  33. package/dist/_chunks/segment-context-Dx_OizxD.js +34 -0
  34. package/dist/_chunks/segment-context-Dx_OizxD.js.map +1 -0
  35. package/dist/_chunks/{ssr-data-MjmprTmO.js → ssr-data-B4CdH7rE.js} +1 -1
  36. package/dist/_chunks/ssr-data-B4CdH7rE.js.map +1 -0
  37. package/dist/_chunks/stale-reload-Bab885FO.js +64 -0
  38. package/dist/_chunks/stale-reload-Bab885FO.js.map +1 -0
  39. package/dist/_chunks/tracing-C8V-YGsP.js +329 -0
  40. package/dist/_chunks/tracing-C8V-YGsP.js.map +1 -0
  41. package/dist/_chunks/{use-query-states-D5KaffOK.js → use-query-states-B2XTqxDR.js} +7 -20
  42. package/dist/_chunks/use-query-states-B2XTqxDR.js.map +1 -0
  43. package/dist/_chunks/use-segment-params-DlsOX1YS.js +185 -0
  44. package/dist/_chunks/use-segment-params-DlsOX1YS.js.map +1 -0
  45. package/dist/_chunks/walkers-Tg0Alwcg.js +850 -0
  46. package/dist/_chunks/walkers-Tg0Alwcg.js.map +1 -0
  47. package/dist/_chunks/{format-DviM89f0.js → warnings-Cg47l5sk.js} +6 -45
  48. package/dist/_chunks/warnings-Cg47l5sk.js.map +1 -0
  49. package/dist/adapters/build-output-helper.d.ts +28 -0
  50. package/dist/adapters/build-output-helper.d.ts.map +1 -0
  51. package/dist/adapters/cloudflare-dev.d.ts +109 -0
  52. package/dist/adapters/cloudflare-dev.d.ts.map +1 -0
  53. package/dist/adapters/cloudflare-dev.js +73 -0
  54. package/dist/adapters/cloudflare-dev.js.map +1 -0
  55. package/dist/adapters/cloudflare-kv-cache.d.ts +64 -0
  56. package/dist/adapters/cloudflare-kv-cache.d.ts.map +1 -0
  57. package/dist/adapters/cloudflare-kv-cache.js +95 -0
  58. package/dist/adapters/cloudflare-kv-cache.js.map +1 -0
  59. package/dist/adapters/cloudflare.d.ts +148 -12
  60. package/dist/adapters/cloudflare.d.ts.map +1 -1
  61. package/dist/adapters/cloudflare.js +142 -38
  62. package/dist/adapters/cloudflare.js.map +1 -1
  63. package/dist/adapters/compress-module.d.ts.map +1 -1
  64. package/dist/adapters/nitro.d.ts +17 -1
  65. package/dist/adapters/nitro.d.ts.map +1 -1
  66. package/dist/adapters/nitro.js +143 -45
  67. package/dist/adapters/nitro.js.map +1 -1
  68. package/dist/adapters/shared.d.ts +16 -0
  69. package/dist/adapters/shared.d.ts.map +1 -0
  70. package/dist/cache/cache-api.d.ts +24 -0
  71. package/dist/cache/cache-api.d.ts.map +1 -0
  72. package/dist/cache/handler-store.d.ts +31 -0
  73. package/dist/cache/handler-store.d.ts.map +1 -0
  74. package/dist/cache/index.d.ts +23 -7
  75. package/dist/cache/index.d.ts.map +1 -1
  76. package/dist/cache/index.js +150 -81
  77. package/dist/cache/index.js.map +1 -1
  78. package/dist/cache/singleflight.d.ts +18 -1
  79. package/dist/cache/singleflight.d.ts.map +1 -1
  80. package/dist/cache/sizeof.d.ts +22 -0
  81. package/dist/cache/sizeof.d.ts.map +1 -0
  82. package/dist/cache/timber-cache.d.ts +1 -1
  83. package/dist/cache/timber-cache.d.ts.map +1 -1
  84. package/dist/cli.d.ts +6 -1
  85. package/dist/cli.d.ts.map +1 -1
  86. package/dist/cli.js +8 -3
  87. package/dist/cli.js.map +1 -1
  88. package/dist/client/browser-dev.d.ts +34 -1
  89. package/dist/client/browser-dev.d.ts.map +1 -1
  90. package/dist/client/browser-entry/action-dispatch.d.ts +17 -0
  91. package/dist/client/browser-entry/action-dispatch.d.ts.map +1 -0
  92. package/dist/client/browser-entry/hmr.d.ts +21 -0
  93. package/dist/client/browser-entry/hmr.d.ts.map +1 -0
  94. package/dist/client/browser-entry/hydrate.d.ts +46 -0
  95. package/dist/client/browser-entry/hydrate.d.ts.map +1 -0
  96. package/dist/client/browser-entry/index.d.ts +30 -0
  97. package/dist/client/browser-entry/index.d.ts.map +1 -0
  98. package/dist/client/browser-entry/post-hydration.d.ts +26 -0
  99. package/dist/client/browser-entry/post-hydration.d.ts.map +1 -0
  100. package/dist/client/browser-entry/router-init.d.ts +23 -0
  101. package/dist/client/browser-entry/router-init.d.ts.map +1 -0
  102. package/dist/client/browser-entry/rsc-stream.d.ts +24 -0
  103. package/dist/client/browser-entry/rsc-stream.d.ts.map +1 -0
  104. package/dist/client/browser-entry/scroll.d.ts +19 -0
  105. package/dist/client/browser-entry/scroll.d.ts.map +1 -0
  106. package/dist/client/error-boundary.d.ts +12 -5
  107. package/dist/client/error-boundary.d.ts.map +1 -1
  108. package/dist/client/error-boundary.js +26 -5
  109. package/dist/client/error-boundary.js.map +1 -1
  110. package/dist/client/error-reconstituter.d.ts +54 -0
  111. package/dist/client/error-reconstituter.d.ts.map +1 -0
  112. package/dist/client/form.d.ts +16 -27
  113. package/dist/client/form.d.ts.map +1 -1
  114. package/dist/client/history.d.ts +19 -4
  115. package/dist/client/history.d.ts.map +1 -1
  116. package/dist/client/index.d.ts +9 -24
  117. package/dist/client/index.d.ts.map +1 -1
  118. package/dist/client/index.js +261 -1100
  119. package/dist/client/index.js.map +1 -1
  120. package/dist/client/internal.d.ts +19 -0
  121. package/dist/client/internal.d.ts.map +1 -0
  122. package/dist/client/internal.js +964 -0
  123. package/dist/client/internal.js.map +1 -0
  124. package/dist/client/link-pending-store.d.ts +63 -0
  125. package/dist/client/link-pending-store.d.ts.map +1 -0
  126. package/dist/client/link.d.ts +62 -55
  127. package/dist/client/link.d.ts.map +1 -1
  128. package/dist/client/nav-link-store.d.ts +36 -0
  129. package/dist/client/nav-link-store.d.ts.map +1 -0
  130. package/dist/client/navigation-api-types.d.ts +90 -0
  131. package/dist/client/navigation-api-types.d.ts.map +1 -0
  132. package/dist/client/navigation-api.d.ts +115 -0
  133. package/dist/client/navigation-api.d.ts.map +1 -0
  134. package/dist/client/navigation-context.d.ts +13 -2
  135. package/dist/client/navigation-context.d.ts.map +1 -1
  136. package/dist/client/{transition-root.d.ts → navigation-root.d.ts} +42 -8
  137. package/dist/client/navigation-root.d.ts.map +1 -0
  138. package/dist/client/nuqs-adapter.d.ts.map +1 -1
  139. package/dist/client/router-ref.d.ts +1 -1
  140. package/dist/client/router.d.ts +70 -4
  141. package/dist/client/router.d.ts.map +1 -1
  142. package/dist/client/rsc-fetch.d.ts +38 -3
  143. package/dist/client/rsc-fetch.d.ts.map +1 -1
  144. package/dist/client/segment-cache.d.ts +1 -1
  145. package/dist/client/segment-cache.d.ts.map +1 -1
  146. package/dist/client/segment-outlet.d.ts +63 -0
  147. package/dist/client/segment-outlet.d.ts.map +1 -0
  148. package/dist/client/ssr-data.d.ts +13 -4
  149. package/dist/client/ssr-data.d.ts.map +1 -1
  150. package/dist/client/stale-reload.d.ts +15 -0
  151. package/dist/client/stale-reload.d.ts.map +1 -1
  152. package/dist/client/state.d.ts +1 -1
  153. package/dist/client/top-loader.d.ts +5 -5
  154. package/dist/client/top-loader.d.ts.map +1 -1
  155. package/dist/client/use-cookie.d.ts +8 -0
  156. package/dist/client/use-cookie.d.ts.map +1 -1
  157. package/dist/client/use-link-status.d.ts +5 -5
  158. package/dist/client/use-link-status.d.ts.map +1 -1
  159. package/dist/client/{use-navigation-pending.d.ts → use-pending-navigation.d.ts} +4 -4
  160. package/dist/client/use-pending-navigation.d.ts.map +1 -0
  161. package/dist/client/use-query-states.d.ts +1 -1
  162. package/dist/client/use-query-states.d.ts.map +1 -1
  163. package/dist/client/use-router.d.ts +1 -1
  164. package/dist/client/{use-params.d.ts → use-segment-params.d.ts} +7 -5
  165. package/dist/client/use-segment-params.d.ts.map +1 -0
  166. package/dist/codec.d.ts +33 -0
  167. package/dist/codec.d.ts.map +1 -0
  168. package/dist/codec.js +2 -0
  169. package/dist/config-types.d.ts +294 -0
  170. package/dist/config-types.d.ts.map +1 -0
  171. package/dist/config-validation.d.ts +51 -0
  172. package/dist/config-validation.d.ts.map +1 -0
  173. package/dist/content/index.d.ts +1 -10
  174. package/dist/content/index.d.ts.map +1 -1
  175. package/dist/content/index.js +0 -2
  176. package/dist/cookies/define-cookie.d.ts +98 -25
  177. package/dist/cookies/define-cookie.d.ts.map +1 -1
  178. package/dist/cookies/index.d.ts +2 -1
  179. package/dist/cookies/index.d.ts.map +1 -1
  180. package/dist/cookies/index.js +36 -72
  181. package/dist/cookies/index.js.map +1 -1
  182. package/dist/cookies/json-cookie.d.ts +64 -0
  183. package/dist/cookies/json-cookie.d.ts.map +1 -0
  184. package/dist/cookies/validation.d.ts +46 -0
  185. package/dist/cookies/validation.d.ts.map +1 -0
  186. package/dist/dev-tools/404-page.d.ts +46 -0
  187. package/dist/dev-tools/404-page.d.ts.map +1 -0
  188. package/dist/dev-tools/browser-logs.d.ts +84 -0
  189. package/dist/dev-tools/browser-logs.d.ts.map +1 -0
  190. package/dist/dev-tools/error-page.d.ts +58 -0
  191. package/dist/dev-tools/error-page.d.ts.map +1 -0
  192. package/dist/dev-tools/holding-server.d.ts +54 -0
  193. package/dist/dev-tools/holding-server.d.ts.map +1 -0
  194. package/dist/dev-tools/index.d.ts +31 -0
  195. package/dist/dev-tools/index.d.ts.map +1 -0
  196. package/dist/{server/dev-span-processor.d.ts → dev-tools/instrumentation.d.ts} +26 -6
  197. package/dist/dev-tools/instrumentation.d.ts.map +1 -0
  198. package/dist/{server/dev-logger.d.ts → dev-tools/logger.d.ts} +1 -1
  199. package/dist/dev-tools/logger.d.ts.map +1 -0
  200. package/dist/{plugins/dev-logs.d.ts → dev-tools/logs.d.ts} +2 -2
  201. package/dist/dev-tools/logs.d.ts.map +1 -0
  202. package/dist/dev-tools/overlay.d.ts +91 -0
  203. package/dist/dev-tools/overlay.d.ts.map +1 -0
  204. package/dist/dev-tools/stack-classifier.d.ts +34 -0
  205. package/dist/dev-tools/stack-classifier.d.ts.map +1 -0
  206. package/dist/dev-tools/terminal.d.ts +28 -0
  207. package/dist/dev-tools/terminal.d.ts.map +1 -0
  208. package/dist/{server/dev-warnings.d.ts → dev-tools/warnings.d.ts} +2 -22
  209. package/dist/dev-tools/warnings.d.ts.map +1 -0
  210. package/dist/fonts/ast.d.ts +98 -6
  211. package/dist/fonts/ast.d.ts.map +1 -1
  212. package/dist/fonts/bundle.d.ts +48 -0
  213. package/dist/fonts/bundle.d.ts.map +1 -0
  214. package/dist/fonts/css.d.ts +1 -0
  215. package/dist/fonts/css.d.ts.map +1 -1
  216. package/dist/fonts/dev-middleware.d.ts +22 -0
  217. package/dist/fonts/dev-middleware.d.ts.map +1 -0
  218. package/dist/fonts/local.d.ts +1 -1
  219. package/dist/fonts/pipeline.d.ts +167 -0
  220. package/dist/fonts/pipeline.d.ts.map +1 -0
  221. package/dist/fonts/transform.d.ts +78 -0
  222. package/dist/fonts/transform.d.ts.map +1 -0
  223. package/dist/fonts/types.d.ts +45 -1
  224. package/dist/fonts/types.d.ts.map +1 -1
  225. package/dist/fonts/virtual-modules.d.ts +103 -0
  226. package/dist/fonts/virtual-modules.d.ts.map +1 -0
  227. package/dist/index.d.ts +46 -190
  228. package/dist/index.d.ts.map +1 -1
  229. package/dist/index.js +5348 -13285
  230. package/dist/index.js.map +1 -1
  231. package/dist/plugin-context.d.ts +107 -0
  232. package/dist/plugin-context.d.ts.map +1 -0
  233. package/dist/plugins/adapter-build.d.ts +1 -1
  234. package/dist/plugins/adapter-build.d.ts.map +1 -1
  235. package/dist/plugins/build-manifest.d.ts +2 -2
  236. package/dist/plugins/build-manifest.d.ts.map +1 -1
  237. package/dist/plugins/build-report.d.ts +9 -7
  238. package/dist/plugins/build-report.d.ts.map +1 -1
  239. package/dist/plugins/client-chunks.d.ts +32 -0
  240. package/dist/plugins/client-chunks.d.ts.map +1 -0
  241. package/dist/plugins/content.d.ts +1 -1
  242. package/dist/plugins/content.d.ts.map +1 -1
  243. package/dist/plugins/dev-server.d.ts +1 -1
  244. package/dist/plugins/dev-server.d.ts.map +1 -1
  245. package/dist/plugins/entries.d.ts +1 -1
  246. package/dist/plugins/entries.d.ts.map +1 -1
  247. package/dist/plugins/fonts.d.ts +17 -73
  248. package/dist/plugins/fonts.d.ts.map +1 -1
  249. package/dist/plugins/mdx.d.ts +1 -1
  250. package/dist/plugins/mdx.d.ts.map +1 -1
  251. package/dist/plugins/routing.d.ts +1 -1
  252. package/dist/plugins/routing.d.ts.map +1 -1
  253. package/dist/plugins/server-bundle.d.ts.map +1 -1
  254. package/dist/plugins/shims.d.ts +6 -5
  255. package/dist/plugins/shims.d.ts.map +1 -1
  256. package/dist/plugins/static-build.d.ts +5 -26
  257. package/dist/plugins/static-build.d.ts.map +1 -1
  258. package/dist/routing/codegen-shared.d.ts +55 -0
  259. package/dist/routing/codegen-shared.d.ts.map +1 -0
  260. package/dist/routing/codegen-types.d.ts +52 -0
  261. package/dist/routing/codegen-types.d.ts.map +1 -0
  262. package/dist/routing/codegen.d.ts +2 -2
  263. package/dist/routing/codegen.d.ts.map +1 -1
  264. package/dist/routing/convention-lint.d.ts +41 -0
  265. package/dist/routing/convention-lint.d.ts.map +1 -0
  266. package/dist/routing/index.d.ts +5 -1
  267. package/dist/routing/index.d.ts.map +1 -1
  268. package/dist/routing/index.js +3 -2
  269. package/dist/routing/link-codegen.d.ts +90 -0
  270. package/dist/routing/link-codegen.d.ts.map +1 -0
  271. package/dist/routing/scanner.d.ts +1 -10
  272. package/dist/routing/scanner.d.ts.map +1 -1
  273. package/dist/routing/segment-classify.d.ts +75 -0
  274. package/dist/routing/segment-classify.d.ts.map +1 -0
  275. package/dist/routing/types.d.ts +77 -25
  276. package/dist/routing/types.d.ts.map +1 -1
  277. package/dist/routing/walkers.d.ts +51 -0
  278. package/dist/routing/walkers.d.ts.map +1 -0
  279. package/dist/rsc-runtime/rsc.d.ts +1 -1
  280. package/dist/rsc-runtime/rsc.d.ts.map +1 -1
  281. package/dist/rsc-runtime/ssr.d.ts +12 -0
  282. package/dist/rsc-runtime/ssr.d.ts.map +1 -1
  283. package/dist/schema-bridge.d.ts +76 -0
  284. package/dist/schema-bridge.d.ts.map +1 -0
  285. package/dist/search-params/define.d.ts +157 -0
  286. package/dist/search-params/define.d.ts.map +1 -0
  287. package/dist/search-params/index.d.ts +4 -7
  288. package/dist/search-params/index.d.ts.map +1 -1
  289. package/dist/search-params/index.js +34 -441
  290. package/dist/search-params/index.js.map +1 -1
  291. package/dist/search-params/registry.d.ts +2 -2
  292. package/dist/search-params/registry.d.ts.map +1 -1
  293. package/dist/search-params/wrappers.d.ts +53 -0
  294. package/dist/search-params/wrappers.d.ts.map +1 -0
  295. package/dist/segment-params/define.d.ts +95 -0
  296. package/dist/segment-params/define.d.ts.map +1 -0
  297. package/dist/segment-params/index.d.ts +3 -0
  298. package/dist/segment-params/index.d.ts.map +1 -0
  299. package/dist/segment-params/index.js +2 -0
  300. package/dist/server/access-gate.d.ts +8 -3
  301. package/dist/server/access-gate.d.ts.map +1 -1
  302. package/dist/server/action-client.d.ts +41 -6
  303. package/dist/server/action-client.d.ts.map +1 -1
  304. package/dist/server/action-encryption.d.ts +76 -0
  305. package/dist/server/action-encryption.d.ts.map +1 -0
  306. package/dist/server/action-handler.d.ts +35 -1
  307. package/dist/server/action-handler.d.ts.map +1 -1
  308. package/dist/server/actions.d.ts +3 -6
  309. package/dist/server/actions.d.ts.map +1 -1
  310. package/dist/server/als-registry.d.ts +33 -5
  311. package/dist/server/als-registry.d.ts.map +1 -1
  312. package/dist/server/asset-headers.d.ts +1 -15
  313. package/dist/server/asset-headers.d.ts.map +1 -1
  314. package/dist/server/build-manifest.d.ts +2 -2
  315. package/dist/server/build-manifest.d.ts.map +1 -1
  316. package/dist/server/cookie-context.d.ts +170 -0
  317. package/dist/server/cookie-context.d.ts.map +1 -0
  318. package/dist/server/cookie-parsing.d.ts +51 -0
  319. package/dist/server/cookie-parsing.d.ts.map +1 -0
  320. package/dist/server/debug.d.ts +1 -1
  321. package/dist/server/default-logger.d.ts +22 -0
  322. package/dist/server/default-logger.d.ts.map +1 -0
  323. package/dist/server/deny-boundary.d.ts +90 -0
  324. package/dist/server/deny-boundary.d.ts.map +1 -0
  325. package/dist/server/deny-renderer.d.ts.map +1 -1
  326. package/dist/server/dev-source-map.d.ts +22 -0
  327. package/dist/server/dev-source-map.d.ts.map +1 -0
  328. package/dist/server/early-hints-sender.d.ts.map +1 -1
  329. package/dist/server/early-hints.d.ts +13 -5
  330. package/dist/server/early-hints.d.ts.map +1 -1
  331. package/dist/server/error-boundary-wrapper.d.ts +7 -1
  332. package/dist/server/error-boundary-wrapper.d.ts.map +1 -1
  333. package/dist/server/fallback-error.d.ts +12 -7
  334. package/dist/server/fallback-error.d.ts.map +1 -1
  335. package/dist/server/flight-injection-state.d.ts +66 -0
  336. package/dist/server/flight-injection-state.d.ts.map +1 -0
  337. package/dist/server/flight-scripts.d.ts +42 -0
  338. package/dist/server/flight-scripts.d.ts.map +1 -0
  339. package/dist/server/flush.d.ts.map +1 -1
  340. package/dist/server/form-data.d.ts +29 -0
  341. package/dist/server/form-data.d.ts.map +1 -1
  342. package/dist/server/html-injector-core.d.ts +212 -0
  343. package/dist/server/html-injector-core.d.ts.map +1 -0
  344. package/dist/server/html-injectors.d.ts +81 -41
  345. package/dist/server/html-injectors.d.ts.map +1 -1
  346. package/dist/server/index.d.ts +9 -46
  347. package/dist/server/index.d.ts.map +1 -1
  348. package/dist/server/index.js +155 -2905
  349. package/dist/server/index.js.map +1 -1
  350. package/dist/server/internal.d.ts +48 -0
  351. package/dist/server/internal.d.ts.map +1 -0
  352. package/dist/server/internal.js +2900 -0
  353. package/dist/server/internal.js.map +1 -0
  354. package/dist/server/logger.d.ts +39 -7
  355. package/dist/server/logger.d.ts.map +1 -1
  356. package/dist/server/middleware-runner.d.ts +36 -4
  357. package/dist/server/middleware-runner.d.ts.map +1 -1
  358. package/dist/server/node-stream-transforms.d.ts +110 -0
  359. package/dist/server/node-stream-transforms.d.ts.map +1 -0
  360. package/dist/server/param-coercion.d.ts +26 -0
  361. package/dist/server/param-coercion.d.ts.map +1 -0
  362. package/dist/server/pipeline-helpers.d.ts +95 -0
  363. package/dist/server/pipeline-helpers.d.ts.map +1 -0
  364. package/dist/server/pipeline-interception.d.ts +1 -1
  365. package/dist/server/pipeline-interception.d.ts.map +1 -1
  366. package/dist/server/pipeline-metadata.d.ts +6 -0
  367. package/dist/server/pipeline-metadata.d.ts.map +1 -1
  368. package/dist/server/pipeline-outcome.d.ts +49 -0
  369. package/dist/server/pipeline-outcome.d.ts.map +1 -0
  370. package/dist/server/pipeline-phases.d.ts +52 -0
  371. package/dist/server/pipeline-phases.d.ts.map +1 -0
  372. package/dist/server/pipeline.d.ts +93 -23
  373. package/dist/server/pipeline.d.ts.map +1 -1
  374. package/dist/server/port-resolution.d.ts +117 -0
  375. package/dist/server/port-resolution.d.ts.map +1 -0
  376. package/dist/server/primitives.d.ts +69 -18
  377. package/dist/server/primitives.d.ts.map +1 -1
  378. package/dist/server/render-timeout.d.ts +51 -0
  379. package/dist/server/render-timeout.d.ts.map +1 -0
  380. package/dist/server/request-context.d.ts +41 -109
  381. package/dist/server/request-context.d.ts.map +1 -1
  382. package/dist/server/route-element-builder.d.ts +27 -1
  383. package/dist/server/route-element-builder.d.ts.map +1 -1
  384. package/dist/server/route-handler.d.ts.map +1 -1
  385. package/dist/server/route-matcher.d.ts +21 -34
  386. package/dist/server/route-matcher.d.ts.map +1 -1
  387. package/dist/server/rsc-entry/action-middleware-runner.d.ts +66 -0
  388. package/dist/server/rsc-entry/action-middleware-runner.d.ts.map +1 -0
  389. package/dist/server/rsc-entry/api-handler.d.ts +2 -2
  390. package/dist/server/rsc-entry/api-handler.d.ts.map +1 -1
  391. package/dist/server/rsc-entry/error-renderer.d.ts +26 -13
  392. package/dist/server/rsc-entry/error-renderer.d.ts.map +1 -1
  393. package/dist/server/rsc-entry/helpers.d.ts +49 -6
  394. package/dist/server/rsc-entry/helpers.d.ts.map +1 -1
  395. package/dist/server/rsc-entry/index.d.ts +20 -3
  396. package/dist/server/rsc-entry/index.d.ts.map +1 -1
  397. package/dist/server/rsc-entry/render-route.d.ts +50 -0
  398. package/dist/server/rsc-entry/render-route.d.ts.map +1 -0
  399. package/dist/server/rsc-entry/rsc-payload.d.ts +3 -3
  400. package/dist/server/rsc-entry/rsc-payload.d.ts.map +1 -1
  401. package/dist/server/rsc-entry/rsc-stream.d.ts +14 -1
  402. package/dist/server/rsc-entry/rsc-stream.d.ts.map +1 -1
  403. package/dist/server/rsc-entry/ssr-bridge.d.ts +1 -1
  404. package/dist/server/rsc-entry/ssr-bridge.d.ts.map +1 -1
  405. package/dist/server/rsc-entry/ssr-renderer.d.ts +19 -4
  406. package/dist/server/rsc-entry/ssr-renderer.d.ts.map +1 -1
  407. package/dist/server/rsc-entry/wrap-action-dispatch.d.ts +119 -0
  408. package/dist/server/rsc-entry/wrap-action-dispatch.d.ts.map +1 -0
  409. package/dist/server/safe-load.d.ts +46 -0
  410. package/dist/server/safe-load.d.ts.map +1 -0
  411. package/dist/server/sensitive-fields.d.ts +74 -0
  412. package/dist/server/sensitive-fields.d.ts.map +1 -0
  413. package/dist/server/sitemap-generator.d.ts +129 -0
  414. package/dist/server/sitemap-generator.d.ts.map +1 -0
  415. package/dist/server/sitemap-handler.d.ts +22 -0
  416. package/dist/server/sitemap-handler.d.ts.map +1 -0
  417. package/dist/server/slot-resolver.d.ts +1 -1
  418. package/dist/server/slot-resolver.d.ts.map +1 -1
  419. package/dist/server/ssr-entry.d.ts +23 -0
  420. package/dist/server/ssr-entry.d.ts.map +1 -1
  421. package/dist/server/ssr-render.d.ts +39 -21
  422. package/dist/server/ssr-render.d.ts.map +1 -1
  423. package/dist/server/ssr-wrappers.d.ts +50 -0
  424. package/dist/server/ssr-wrappers.d.ts.map +1 -0
  425. package/dist/server/state-tree-diff.d.ts.map +1 -1
  426. package/dist/server/status-code-resolver.d.ts +16 -11
  427. package/dist/server/status-code-resolver.d.ts.map +1 -1
  428. package/dist/server/stream-utils.d.ts +36 -0
  429. package/dist/server/stream-utils.d.ts.map +1 -0
  430. package/dist/server/tracing.d.ts +5 -5
  431. package/dist/server/tracing.d.ts.map +1 -1
  432. package/dist/server/tree-builder.d.ts +62 -30
  433. package/dist/server/tree-builder.d.ts.map +1 -1
  434. package/dist/server/types.d.ts +49 -4
  435. package/dist/server/types.d.ts.map +1 -1
  436. package/dist/server/utils/escape-html.d.ts +14 -0
  437. package/dist/server/utils/escape-html.d.ts.map +1 -0
  438. package/dist/server/version-skew.d.ts +61 -0
  439. package/dist/server/version-skew.d.ts.map +1 -0
  440. package/dist/shared/merge-search-params.d.ts +22 -0
  441. package/dist/shared/merge-search-params.d.ts.map +1 -0
  442. package/dist/shims/font-google.d.ts +1 -1
  443. package/dist/shims/font-google.d.ts.map +1 -1
  444. package/dist/shims/font-google.js +42 -0
  445. package/dist/shims/font-google.js.map +1 -0
  446. package/dist/shims/font-local.d.ts +26 -0
  447. package/dist/shims/font-local.d.ts.map +1 -0
  448. package/dist/shims/font-local.js +20 -0
  449. package/dist/shims/font-local.js.map +1 -0
  450. package/dist/shims/headers.d.ts +2 -1
  451. package/dist/shims/headers.d.ts.map +1 -1
  452. package/dist/shims/navigation-client.d.ts +3 -1
  453. package/dist/shims/navigation-client.d.ts.map +1 -1
  454. package/dist/shims/navigation.d.ts +11 -5
  455. package/dist/shims/navigation.d.ts.map +1 -1
  456. package/dist/utils/state-machine.d.ts +80 -0
  457. package/dist/utils/state-machine.d.ts.map +1 -0
  458. package/package.json +57 -22
  459. package/src/adapters/build-output-helper.ts +77 -0
  460. package/src/adapters/cloudflare-dev.ts +177 -0
  461. package/src/adapters/cloudflare-kv-cache.ts +142 -0
  462. package/src/adapters/cloudflare.ts +350 -76
  463. package/src/adapters/compress-module.ts +24 -4
  464. package/src/adapters/nitro.ts +142 -59
  465. package/src/adapters/shared.ts +40 -0
  466. package/src/adapters/wrangler.d.ts +7 -0
  467. package/src/cache/cache-api.ts +38 -0
  468. package/src/cache/handler-store.ts +68 -0
  469. package/src/cache/index.ts +81 -18
  470. package/src/cache/singleflight.ts +62 -4
  471. package/src/cache/sizeof.ts +31 -0
  472. package/src/cache/timber-cache.ts +25 -20
  473. package/src/cli.ts +16 -6
  474. package/src/client/browser-dev.ts +153 -1
  475. package/src/client/browser-entry/action-dispatch.ts +116 -0
  476. package/src/client/browser-entry/hmr.ts +81 -0
  477. package/src/client/browser-entry/hydrate.ts +145 -0
  478. package/src/client/browser-entry/index.ts +143 -0
  479. package/src/client/browser-entry/post-hydration.ts +119 -0
  480. package/src/client/browser-entry/router-init.ts +193 -0
  481. package/src/client/browser-entry/rsc-stream.ts +157 -0
  482. package/src/client/browser-entry/scroll.ts +27 -0
  483. package/src/client/error-boundary.tsx +97 -20
  484. package/src/client/error-reconstituter.tsx +65 -0
  485. package/src/client/form.tsx +31 -32
  486. package/src/client/history.ts +26 -4
  487. package/src/client/index.ts +77 -43
  488. package/src/client/internal.ts +58 -0
  489. package/src/client/link-pending-store.ts +111 -0
  490. package/src/client/link.tsx +342 -113
  491. package/src/client/nav-link-store.ts +47 -0
  492. package/src/client/navigation-api-types.ts +112 -0
  493. package/src/client/navigation-api.ts +332 -0
  494. package/src/client/navigation-context.ts +31 -6
  495. package/src/client/navigation-root.tsx +342 -0
  496. package/src/client/nuqs-adapter.tsx +16 -3
  497. package/src/client/router-ref.ts +1 -1
  498. package/src/client/router.ts +300 -73
  499. package/src/client/rsc-fetch.ts +112 -8
  500. package/src/client/segment-cache.ts +1 -1
  501. package/src/client/segment-outlet.tsx +86 -0
  502. package/src/client/ssr-data.ts +13 -5
  503. package/src/client/stale-reload.ts +72 -3
  504. package/src/client/state.ts +2 -2
  505. package/src/client/top-loader.tsx +18 -6
  506. package/src/client/use-cookie.ts +29 -0
  507. package/src/client/use-link-status.ts +7 -7
  508. package/src/client/{use-navigation-pending.ts → use-pending-navigation.ts} +6 -6
  509. package/src/client/use-query-states.ts +9 -3
  510. package/src/client/use-router.ts +1 -1
  511. package/src/client/{use-params.ts → use-segment-params.ts} +7 -5
  512. package/src/codec.ts +45 -0
  513. package/src/config-types.ts +292 -0
  514. package/src/config-validation.ts +303 -0
  515. package/src/content/index.ts +5 -13
  516. package/src/cookies/define-cookie.ts +301 -55
  517. package/src/cookies/index.ts +12 -1
  518. package/src/cookies/json-cookie.ts +105 -0
  519. package/src/cookies/validation.ts +134 -0
  520. package/src/dev-tools/404-page.ts +387 -0
  521. package/src/dev-tools/browser-logs.ts +288 -0
  522. package/src/dev-tools/error-page.ts +509 -0
  523. package/src/dev-tools/holding-server.ts +187 -0
  524. package/src/dev-tools/index.ts +90 -0
  525. package/src/dev-tools/instrumentation.ts +176 -0
  526. package/src/{plugins/dev-logs.ts → dev-tools/logs.ts} +3 -3
  527. package/src/dev-tools/overlay.ts +456 -0
  528. package/src/dev-tools/stack-classifier.ts +75 -0
  529. package/src/dev-tools/terminal.ts +183 -0
  530. package/src/{server/dev-warnings.ts → dev-tools/warnings.ts} +5 -50
  531. package/src/fonts/ast.ts +488 -16
  532. package/src/fonts/bundle.ts +142 -0
  533. package/src/fonts/css.ts +2 -1
  534. package/src/fonts/dev-middleware.ts +74 -0
  535. package/src/fonts/local.ts +1 -1
  536. package/src/fonts/pipeline.ts +314 -0
  537. package/src/fonts/transform.ts +317 -0
  538. package/src/fonts/types.ts +50 -1
  539. package/src/fonts/virtual-modules.ts +227 -0
  540. package/src/index.ts +390 -358
  541. package/src/plugin-context.ts +240 -0
  542. package/src/plugins/adapter-build.ts +12 -4
  543. package/src/plugins/build-manifest.ts +13 -2
  544. package/src/plugins/build-report.ts +16 -25
  545. package/src/plugins/client-chunks.ts +65 -0
  546. package/src/plugins/content.ts +1 -1
  547. package/src/plugins/dev-server.ts +162 -30
  548. package/src/plugins/entries.ts +111 -10
  549. package/src/plugins/fonts.ts +155 -654
  550. package/src/plugins/mdx.ts +43 -10
  551. package/src/plugins/routing.ts +217 -44
  552. package/src/plugins/server-bundle.ts +32 -1
  553. package/src/plugins/shims.ts +136 -35
  554. package/src/plugins/static-build.ts +15 -89
  555. package/src/routing/codegen-shared.ts +98 -0
  556. package/src/routing/codegen-types.ts +53 -0
  557. package/src/routing/codegen.ts +143 -176
  558. package/src/routing/convention-lint.ts +357 -0
  559. package/src/routing/index.ts +5 -1
  560. package/src/routing/interception.ts +1 -1
  561. package/src/routing/link-codegen.ts +294 -0
  562. package/src/routing/scanner.ts +107 -110
  563. package/src/routing/segment-classify.ts +188 -0
  564. package/src/routing/types.ts +78 -25
  565. package/src/routing/walkers.ts +90 -0
  566. package/src/rsc-runtime/rsc.ts +2 -0
  567. package/src/rsc-runtime/ssr.ts +50 -0
  568. package/src/rsc-runtime/vendor-types.d.ts +7 -0
  569. package/src/{search-params/codecs.ts → schema-bridge.ts} +57 -20
  570. package/src/search-params/define.ts +538 -0
  571. package/src/search-params/index.ts +14 -20
  572. package/src/search-params/registry.ts +2 -2
  573. package/src/search-params/wrappers.ts +92 -0
  574. package/src/segment-params/define.ts +332 -0
  575. package/src/segment-params/index.ts +9 -0
  576. package/src/server/access-gate.tsx +76 -34
  577. package/src/server/action-client.ts +88 -15
  578. package/src/server/action-encryption.ts +144 -0
  579. package/src/server/action-handler.ts +112 -14
  580. package/src/server/actions.ts +10 -9
  581. package/src/server/als-registry.ts +35 -7
  582. package/src/server/asset-headers.ts +8 -34
  583. package/src/server/build-manifest.ts +10 -4
  584. package/src/server/compress.ts +25 -7
  585. package/src/server/cookie-context.ts +468 -0
  586. package/src/server/cookie-parsing.ts +135 -0
  587. package/src/server/debug.ts +1 -1
  588. package/src/server/default-logger.ts +99 -0
  589. package/src/server/deny-boundary.ts +218 -0
  590. package/src/server/deny-renderer.ts +31 -50
  591. package/src/server/dev-source-map.ts +31 -0
  592. package/src/server/early-hints-sender.ts +3 -2
  593. package/src/server/early-hints.ts +36 -15
  594. package/src/server/error-boundary-wrapper.ts +74 -22
  595. package/src/server/fallback-error.ts +74 -102
  596. package/src/server/flight-injection-state.ts +113 -0
  597. package/src/server/flight-scripts.ts +62 -0
  598. package/src/server/flush.ts +2 -1
  599. package/src/server/form-data.ts +76 -0
  600. package/src/server/html-injector-core.ts +403 -0
  601. package/src/server/html-injectors.ts +244 -223
  602. package/src/server/index.ts +31 -184
  603. package/src/server/internal.ts +176 -0
  604. package/src/server/logger.ts +67 -36
  605. package/src/server/middleware-runner.ts +75 -4
  606. package/src/server/node-stream-transforms.ts +369 -0
  607. package/src/server/param-coercion.ts +76 -0
  608. package/src/server/pipeline-helpers.ts +204 -0
  609. package/src/server/pipeline-interception.ts +17 -16
  610. package/src/server/pipeline-metadata.ts +13 -0
  611. package/src/server/pipeline-outcome.ts +167 -0
  612. package/src/server/pipeline-phases.ts +409 -0
  613. package/src/server/pipeline.ts +128 -394
  614. package/src/server/port-resolution.ts +215 -0
  615. package/src/server/primitives.ts +111 -28
  616. package/src/server/render-timeout.ts +108 -0
  617. package/src/server/request-context.ts +94 -338
  618. package/src/server/route-element-builder.ts +288 -192
  619. package/src/server/route-handler.ts +24 -4
  620. package/src/server/route-matcher.ts +44 -65
  621. package/src/server/rsc-entry/action-middleware-runner.ts +167 -0
  622. package/src/server/rsc-entry/api-handler.ts +16 -17
  623. package/src/server/rsc-entry/error-renderer.ts +305 -89
  624. package/src/server/rsc-entry/helpers.ts +136 -12
  625. package/src/server/rsc-entry/index.ts +312 -341
  626. package/src/server/rsc-entry/render-route.ts +304 -0
  627. package/src/server/rsc-entry/rsc-payload.ts +65 -18
  628. package/src/server/rsc-entry/rsc-stream.ts +81 -13
  629. package/src/server/rsc-entry/ssr-bridge.ts +14 -5
  630. package/src/server/rsc-entry/ssr-renderer.ts +171 -38
  631. package/src/server/rsc-entry/wrap-action-dispatch.ts +449 -0
  632. package/src/server/safe-load.ts +60 -0
  633. package/src/server/sensitive-fields.ts +230 -0
  634. package/src/server/sitemap-generator.ts +338 -0
  635. package/src/server/sitemap-handler.ts +126 -0
  636. package/src/server/slot-resolver.ts +245 -230
  637. package/src/server/ssr-entry.ts +215 -32
  638. package/src/server/ssr-render.ts +289 -67
  639. package/src/server/ssr-wrappers.tsx +139 -0
  640. package/src/server/state-tree-diff.ts +4 -1
  641. package/src/server/status-code-resolver.ts +112 -128
  642. package/src/server/stream-utils.ts +213 -0
  643. package/src/server/tracing.ts +21 -10
  644. package/src/server/tree-builder.ts +202 -90
  645. package/src/server/types.ts +55 -6
  646. package/src/server/utils/escape-html.ts +20 -0
  647. package/src/server/version-skew.ts +104 -0
  648. package/src/shared/merge-search-params.ts +55 -0
  649. package/src/shims/font-google.ts +1 -1
  650. package/src/shims/font-local.ts +34 -0
  651. package/src/shims/headers.ts +5 -1
  652. package/src/shims/navigation-client.ts +4 -3
  653. package/src/shims/navigation.ts +14 -7
  654. package/src/utils/state-machine.ts +111 -0
  655. package/dist/_chunks/als-registry-B7DbZ2hS.js +0 -41
  656. package/dist/_chunks/als-registry-B7DbZ2hS.js.map +0 -1
  657. package/dist/_chunks/debug-gwlJkDuf.js +0 -108
  658. package/dist/_chunks/debug-gwlJkDuf.js.map +0 -1
  659. package/dist/_chunks/format-DviM89f0.js.map +0 -1
  660. package/dist/_chunks/interception-BOoWmLUA.js +0 -676
  661. package/dist/_chunks/interception-BOoWmLUA.js.map +0 -1
  662. package/dist/_chunks/request-context-DIkVh_jG.js +0 -330
  663. package/dist/_chunks/request-context-DIkVh_jG.js.map +0 -1
  664. package/dist/_chunks/ssr-data-MjmprTmO.js.map +0 -1
  665. package/dist/_chunks/tracing-CemImE6h.js +0 -187
  666. package/dist/_chunks/tracing-CemImE6h.js.map +0 -1
  667. package/dist/_chunks/use-cookie-DX-l1_5E.js +0 -91
  668. package/dist/_chunks/use-cookie-DX-l1_5E.js.map +0 -1
  669. package/dist/_chunks/use-query-states-D5KaffOK.js.map +0 -1
  670. package/dist/cache/register-cached-function.d.ts +0 -17
  671. package/dist/cache/register-cached-function.d.ts.map +0 -1
  672. package/dist/client/browser-entry.d.ts +0 -21
  673. package/dist/client/browser-entry.d.ts.map +0 -1
  674. package/dist/client/link-status-provider.d.ts +0 -11
  675. package/dist/client/link-status-provider.d.ts.map +0 -1
  676. package/dist/client/transition-root.d.ts.map +0 -1
  677. package/dist/client/use-navigation-pending.d.ts.map +0 -1
  678. package/dist/client/use-params.d.ts.map +0 -1
  679. package/dist/plugins/cache-transform.d.ts +0 -36
  680. package/dist/plugins/cache-transform.d.ts.map +0 -1
  681. package/dist/plugins/dev-error-overlay.d.ts +0 -60
  682. package/dist/plugins/dev-error-overlay.d.ts.map +0 -1
  683. package/dist/plugins/dev-logs.d.ts.map +0 -1
  684. package/dist/plugins/dynamic-transform.d.ts +0 -72
  685. package/dist/plugins/dynamic-transform.d.ts.map +0 -1
  686. package/dist/plugins/server-action-exports.d.ts +0 -26
  687. package/dist/plugins/server-action-exports.d.ts.map +0 -1
  688. package/dist/routing/status-file-lint.d.ts +0 -33
  689. package/dist/routing/status-file-lint.d.ts.map +0 -1
  690. package/dist/search-params/analyze.d.ts +0 -54
  691. package/dist/search-params/analyze.d.ts.map +0 -1
  692. package/dist/search-params/builtin-codecs.d.ts +0 -105
  693. package/dist/search-params/builtin-codecs.d.ts.map +0 -1
  694. package/dist/search-params/codecs.d.ts +0 -53
  695. package/dist/search-params/codecs.d.ts.map +0 -1
  696. package/dist/search-params/create.d.ts +0 -106
  697. package/dist/search-params/create.d.ts.map +0 -1
  698. package/dist/server/dev-fetch-instrumentation.d.ts +0 -22
  699. package/dist/server/dev-fetch-instrumentation.d.ts.map +0 -1
  700. package/dist/server/dev-logger.d.ts.map +0 -1
  701. package/dist/server/dev-span-processor.d.ts.map +0 -1
  702. package/dist/server/dev-warnings.d.ts.map +0 -1
  703. package/dist/server/manifest-status-resolver.d.ts +0 -58
  704. package/dist/server/manifest-status-resolver.d.ts.map +0 -1
  705. package/dist/server/prerender.d.ts +0 -77
  706. package/dist/server/prerender.d.ts.map +0 -1
  707. package/dist/server/response-cache.d.ts +0 -54
  708. package/dist/server/response-cache.d.ts.map +0 -1
  709. package/dist/utils/directive-parser.d.ts +0 -70
  710. package/dist/utils/directive-parser.d.ts.map +0 -1
  711. package/src/cache/register-cached-function.ts +0 -103
  712. package/src/client/browser-entry.ts +0 -678
  713. package/src/client/link-status-provider.tsx +0 -30
  714. package/src/client/transition-root.tsx +0 -166
  715. package/src/plugins/cache-transform.ts +0 -199
  716. package/src/plugins/dev-error-overlay.ts +0 -230
  717. package/src/plugins/dynamic-transform.ts +0 -161
  718. package/src/plugins/server-action-exports.ts +0 -220
  719. package/src/routing/status-file-lint.ts +0 -112
  720. package/src/search-params/analyze.ts +0 -192
  721. package/src/search-params/builtin-codecs.ts +0 -228
  722. package/src/search-params/create.ts +0 -321
  723. package/src/server/dev-fetch-instrumentation.ts +0 -96
  724. package/src/server/dev-span-processor.ts +0 -78
  725. package/src/server/manifest-status-resolver.ts +0 -215
  726. package/src/server/prerender.ts +0 -139
  727. package/src/server/response-cache.ts +0 -410
  728. package/src/utils/directive-parser.ts +0 -529
  729. /package/src/{server/dev-logger.ts → dev-tools/logger.ts} +0 -0
@@ -0,0 +1,509 @@
1
+ /**
2
+ * Dev error page — self-contained HTML error page for dev server 500s.
3
+ *
4
+ * Generates a styled, self-contained HTML page when the RSC pipeline fails
5
+ * and the Vite error overlay can't fire (e.g., first page load before HMR
6
+ * WebSocket connects, RSC entry module crash, early pipeline errors).
7
+ *
8
+ * This is NOT a replacement for Vite's error overlay — it's the fallback
9
+ * for when the overlay's transport (WebSocket) isn't available yet.
10
+ *
11
+ * Dev-only: this module is only imported by dev-server.ts (apply: 'serve').
12
+ * It is never included in production builds.
13
+ *
14
+ * Design doc: 21-dev-server.md §"Error Overlay"
15
+ */
16
+
17
+ import {
18
+ extractComponentStack,
19
+ parseFirstAppFrame,
20
+ type ErrorPhase,
21
+ } from './overlay.js';
22
+ import { classifyStack } from './stack-classifier.js';
23
+ import { escapeHtml } from '../server/utils/escape-html.js';
24
+
25
+ // ─── Phase Labels ───────────────────────────────────────────────────────────
26
+
27
+ const PHASE_LABELS: Record<ErrorPhase, string> = {
28
+ 'module-transform': 'Module Transform',
29
+ 'proxy': 'Proxy',
30
+ 'middleware': 'Middleware',
31
+ 'access': 'Access Check',
32
+ 'render': 'RSC Render',
33
+ 'handler': 'Route Handler',
34
+ };
35
+
36
+ const PHASE_HINTS: Record<ErrorPhase, string> = {
37
+ 'module-transform':
38
+ 'This error occurred while Vite was transforming a module. Check for syntax errors or missing imports.',
39
+ 'proxy': 'This error occurred in proxy.ts. Check your proxy configuration.',
40
+ 'middleware':
41
+ 'This error occurred in a middleware.ts file. Check the middleware function for unhandled exceptions.',
42
+ 'access': 'This error occurred in an access.ts file. Check your access control logic.',
43
+ 'render':
44
+ 'This error occurred while rendering a server component. Check the component for runtime errors.',
45
+ 'handler': 'This error occurred in a route handler (route.ts). Check the handler function.',
46
+ };
47
+
48
+ // ─── Source Context ─────────────────────────────────────────────────────────
49
+
50
+ /**
51
+ * Try to read a few lines of source code around the error location.
52
+ * Returns null if the file can't be read (e.g., virtual modules).
53
+ */
54
+ function readSourceContext(
55
+ filePath: string,
56
+ line: number,
57
+ contextLines = 3
58
+ ): { lines: Array<{ num: number; text: string; highlight: boolean }>; startLine: number } | null {
59
+ try {
60
+ const { readFileSync } = require('node:fs');
61
+ const content = readFileSync(filePath, 'utf-8');
62
+ const allLines = content.split('\n');
63
+
64
+ const start = Math.max(0, line - 1 - contextLines);
65
+ const end = Math.min(allLines.length, line + contextLines);
66
+
67
+ return {
68
+ startLine: start + 1,
69
+ lines: allLines.slice(start, end).map((text: string, i: number) => ({
70
+ num: start + 1 + i,
71
+ text,
72
+ highlight: start + 1 + i === line,
73
+ })),
74
+ };
75
+ } catch {
76
+ return null;
77
+ }
78
+ }
79
+
80
+ // HTML escaping provided by server/utils/escape-html.ts
81
+ const esc = escapeHtml;
82
+
83
+ /**
84
+ * Escape a JSON string for safe embedding in an HTML `<script>` block.
85
+ *
86
+ * `JSON.stringify` does not escape `</script>`, so error text containing
87
+ * that sequence breaks out of the script block — an XSS vector.
88
+ * We replace all `<` with `\u003c` which is valid in JSON strings and
89
+ * prevents the HTML parser from seeing a closing `</script>` tag.
90
+ *
91
+ * Security: TIM-788
92
+ */
93
+ function escJsonForScript(json: string): string {
94
+ return json.replace(/</g, '\\u003c');
95
+ }
96
+
97
+ // ─── HMR Options ────────────────────────────────────────────────────────────
98
+
99
+ /**
100
+ * HMR connection options for the dev error page auto-reload WebSocket.
101
+ * Derived from Vite's resolved server config so the error page can
102
+ * connect to the correct HMR endpoint (TIM-789).
103
+ */
104
+ export interface DevErrorHmrOptions {
105
+ protocol?: string;
106
+ host?: string;
107
+ port?: number;
108
+ path?: string;
109
+ token?: string;
110
+ }
111
+
112
+ /**
113
+ * Build a WebSocket URL from Vite HMR options.
114
+ * Mirrors the logic in Vite's client.mjs for constructing the WS connection URL.
115
+ */
116
+ function buildWsUrl(opts: DevErrorHmrOptions): string {
117
+ const protocol = opts.protocol ?? 'ws';
118
+ const host = opts.host ?? 'localhost';
119
+ const port = opts.port ? `:${opts.port}` : '';
120
+ const path = opts.path ?? '';
121
+ const token = opts.token ? `?token=${opts.token}` : '';
122
+ return `${protocol}://${host}${port}${path}${token}`;
123
+ }
124
+
125
+ /**
126
+ * Extract HMR connection options from a Vite resolved config.
127
+ * Used by the dev server to pass HMR config to the error page generator
128
+ * so the auto-reload WebSocket connects to the correct endpoint.
129
+ */
130
+ export function extractHmrOptions(config: {
131
+ server?: { hmr?: { protocol?: string; host?: string; port?: number; path?: string } | boolean };
132
+ webSocketToken?: string;
133
+ }): DevErrorHmrOptions | undefined {
134
+ const hmr = config.server?.hmr;
135
+ if (hmr === false) return undefined;
136
+ const hmrOpts = typeof hmr === 'object' ? hmr : {};
137
+ const opts: DevErrorHmrOptions = {
138
+ protocol: hmrOpts.protocol,
139
+ host: hmrOpts.host,
140
+ port: hmrOpts.port,
141
+ path: hmrOpts.path,
142
+ token: config.webSocketToken,
143
+ };
144
+ // If no HMR fields were explicitly configured, return undefined so the
145
+ // error page falls back to `'ws://' + location.host` which correctly
146
+ // includes the browser's current port (TIM-805).
147
+ if (!opts.protocol && !opts.host && !opts.port && !opts.path && !opts.token) {
148
+ return undefined;
149
+ }
150
+ return opts;
151
+ }
152
+
153
+ // ─── HTML Generation ────────────────────────────────────────────────────────
154
+
155
+ /**
156
+ * Generate a self-contained HTML error page for dev server 500 responses.
157
+ *
158
+ * The page includes:
159
+ * - Error message and phase label
160
+ * - Source code context around the first app frame (if readable)
161
+ * - Component stack (for React render errors)
162
+ * - Classified stack trace (app frames highlighted, internals collapsed)
163
+ * - Copy button for the full error
164
+ * - Dark/light mode via prefers-color-scheme
165
+ * - Auto-reconnect script that watches for Vite HMR and reloads
166
+ */
167
+ export function generateDevErrorPage(
168
+ error: Error,
169
+ phase: ErrorPhase,
170
+ projectRoot: string,
171
+ hmrOptions?: DevErrorHmrOptions
172
+ ): string {
173
+ const message = error.message || 'Unknown error';
174
+ const phaseLabel = PHASE_LABELS[phase];
175
+ const phaseHint = PHASE_HINTS[phase];
176
+ const componentStack = extractComponentStack(error);
177
+ const loc = parseFirstAppFrame(error.stack ?? '', projectRoot);
178
+ const frames = error.stack ? classifyStack(error.stack, projectRoot) : [];
179
+ const appFrames = frames.filter((f) => f.type === 'app');
180
+ const internalFrameCount = frames.filter((f) => f.type !== 'app').length;
181
+
182
+ // Try to read source code context
183
+ let sourceContext: ReturnType<typeof readSourceContext> = null;
184
+ if (loc) {
185
+ sourceContext = readSourceContext(loc.file, loc.line);
186
+ }
187
+
188
+ // Relative path for display
189
+ const relPath = loc?.file.startsWith(projectRoot)
190
+ ? loc.file.slice(projectRoot.length + 1)
191
+ : loc?.file;
192
+
193
+ return `<!DOCTYPE html>
194
+ <html lang="en">
195
+ <head>
196
+ <meta charset="utf-8">
197
+ <meta name="viewport" content="width=device-width, initial-scale=1">
198
+ <title>Error — ${esc(phaseLabel)} | timber.js</title>
199
+ <style>${CSS}</style>
200
+ </head>
201
+ <body>
202
+ <div class="container">
203
+ <header class="header">
204
+ <div class="badge">${esc(phaseLabel)} Error</div>
205
+ <h1 class="message">${esc(message)}</h1>
206
+ ${phaseHint ? `<p class="hint">${esc(phaseHint)}</p>` : ''}
207
+ </header>
208
+
209
+ ${relPath ? `<div class="location">${esc(relPath)}${loc ? `:${loc.line}:${loc.column}` : ''}</div>` : ''}
210
+
211
+ ${
212
+ sourceContext
213
+ ? `<div class="source-context">
214
+ <div class="source-header">Source</div>
215
+ <pre class="source-code"><code>${sourceContext.lines
216
+ .map(
217
+ (l) =>
218
+ `<span class="source-line${l.highlight ? ' source-line-highlight' : ''}"` +
219
+ `><span class="line-num">${l.num}</span>${esc(l.text)}</span>`
220
+ )
221
+ .join('\n')}</code></pre>
222
+ </div>`
223
+ : ''
224
+ }
225
+
226
+ ${
227
+ componentStack
228
+ ? `<div class="section">
229
+ <div class="section-header">Component Stack</div>
230
+ <pre class="component-stack">${esc(componentStack.trim())}</pre>
231
+ </div>`
232
+ : ''
233
+ }
234
+
235
+ ${
236
+ appFrames.length > 0
237
+ ? `<div class="section">
238
+ <div class="section-header">Application Frames</div>
239
+ <pre class="stack">${appFrames.map((f) => esc(f.raw)).join('\n')}</pre>
240
+ </div>`
241
+ : ''
242
+ }
243
+
244
+ ${
245
+ internalFrameCount > 0
246
+ ? `<details class="section internal-frames">
247
+ <summary class="section-header clickable">${internalFrameCount} internal frame${internalFrameCount !== 1 ? 's' : ''}</summary>
248
+ <pre class="stack dimmed">${frames
249
+ .filter((f) => f.type !== 'app')
250
+ .map((f) => esc(f.raw))
251
+ .join('\n')}</pre>
252
+ </details>`
253
+ : ''
254
+ }
255
+
256
+ <div class="actions">
257
+ <button class="btn" onclick="copyError()">Copy Error</button>
258
+ </div>
259
+
260
+ <footer class="footer">
261
+ <span class="timber-logo">🪵 timber.js</span>
262
+ <span class="footer-hint">Fix the error and save — the page will reload automatically via HMR.</span>
263
+ </footer>
264
+ </div>
265
+
266
+ <script>
267
+ function copyError() {
268
+ var text = ${escJsonForScript(
269
+ JSON.stringify(
270
+ `${phaseLabel} Error: ${message}\n\n` +
271
+ (relPath ? `File: ${relPath}${loc ? `:${loc.line}:${loc.column}` : ''}\n\n` : '') +
272
+ (componentStack ? `Component Stack:\n${componentStack.trim()}\n\n` : '') +
273
+ `Stack Trace:\n${error.stack ?? ''}`
274
+ )
275
+ )};
276
+ navigator.clipboard.writeText(text).then(function() {
277
+ var btn = document.querySelector('.btn');
278
+ if (btn) { btn.textContent = 'Copied!'; setTimeout(function() { btn.textContent = 'Copy Error'; }, 1500); }
279
+ });
280
+ }
281
+
282
+ // Auto-reload when Vite HMR reconnects.
283
+ // When the developer fixes the error and saves, Vite's module graph
284
+ // invalidates. We can't rely on the normal HMR update flow (the page
285
+ // is a static error page, not a Vite-managed module), so we connect
286
+ // to Vite's WebSocket and reload on any update event.
287
+ (function() {
288
+ try {
289
+ var wsUrl = ${hmrOptions ? escJsonForScript(JSON.stringify(buildWsUrl(hmrOptions))) : "'ws://' + location.host"};
290
+ var ws = new WebSocket(wsUrl, 'vite-hmr');
291
+ ws.addEventListener('message', function(e) {
292
+ try {
293
+ var data = JSON.parse(e.data);
294
+ if (data.type === 'full-reload' || data.type === 'update' || data.type === 'connected') {
295
+ if (data.type !== 'connected') location.reload();
296
+ }
297
+ } catch(ex) {}
298
+ });
299
+ } catch(ex) {}
300
+ })();
301
+ </script>
302
+ </body>
303
+ </html>`;
304
+ }
305
+
306
+ // ─── CSS ────────────────────────────────────────────────────────────────────
307
+
308
+ const CSS = `
309
+ :root {
310
+ --bg: #fff;
311
+ --fg: #1a1a1a;
312
+ --fg-dim: #6b7280;
313
+ --border: #e5e7eb;
314
+ --badge-bg: #fef2f2;
315
+ --badge-fg: #991b1b;
316
+ --badge-border: #fecaca;
317
+ --source-bg: #fafafa;
318
+ --highlight-bg: #fef2f2;
319
+ --highlight-border: #ef4444;
320
+ --line-num: #9ca3af;
321
+ --btn-bg: #f3f4f6;
322
+ --btn-fg: #374151;
323
+ --btn-border: #d1d5db;
324
+ --link: #2563eb;
325
+ --code-font: ui-monospace, SFMono-Regular, 'SF Mono', Menlo, Consolas, 'Liberation Mono', monospace;
326
+ }
327
+
328
+ @media (prefers-color-scheme: dark) {
329
+ :root {
330
+ --bg: #0a0a0a;
331
+ --fg: #f5f5f5;
332
+ --fg-dim: #9ca3af;
333
+ --border: #27272a;
334
+ --badge-bg: #450a0a;
335
+ --badge-fg: #fca5a5;
336
+ --badge-border: #7f1d1d;
337
+ --source-bg: #18181b;
338
+ --highlight-bg: #450a0a;
339
+ --highlight-border: #dc2626;
340
+ --line-num: #6b7280;
341
+ --btn-bg: #27272a;
342
+ --btn-fg: #e5e7eb;
343
+ --btn-border: #3f3f46;
344
+ --link: #60a5fa;
345
+ }
346
+ }
347
+
348
+ * { margin: 0; padding: 0; box-sizing: border-box; }
349
+
350
+ body {
351
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;
352
+ background: var(--bg);
353
+ color: var(--fg);
354
+ line-height: 1.6;
355
+ padding: 2rem;
356
+ }
357
+
358
+ .container {
359
+ max-width: 56rem;
360
+ margin: 0 auto;
361
+ }
362
+
363
+ .header { margin-bottom: 1.5rem; }
364
+
365
+ .badge {
366
+ display: inline-block;
367
+ font-size: 0.75rem;
368
+ font-weight: 600;
369
+ text-transform: uppercase;
370
+ letter-spacing: 0.05em;
371
+ padding: 0.25rem 0.625rem;
372
+ border-radius: 0.375rem;
373
+ background: var(--badge-bg);
374
+ color: var(--badge-fg);
375
+ border: 1px solid var(--badge-border);
376
+ margin-bottom: 0.75rem;
377
+ }
378
+
379
+ .message {
380
+ font-size: 1.375rem;
381
+ font-weight: 600;
382
+ line-height: 1.3;
383
+ word-break: break-word;
384
+ }
385
+
386
+ .hint {
387
+ margin-top: 0.5rem;
388
+ color: var(--fg-dim);
389
+ font-size: 0.875rem;
390
+ }
391
+
392
+ .location {
393
+ font-family: var(--code-font);
394
+ font-size: 0.8125rem;
395
+ color: var(--link);
396
+ margin-bottom: 1rem;
397
+ padding: 0.5rem 0.75rem;
398
+ background: var(--source-bg);
399
+ border-radius: 0.375rem;
400
+ border: 1px solid var(--border);
401
+ }
402
+
403
+ .source-context {
404
+ margin-bottom: 1rem;
405
+ border: 1px solid var(--border);
406
+ border-radius: 0.5rem;
407
+ overflow: hidden;
408
+ }
409
+
410
+ .source-header, .section-header {
411
+ font-size: 0.75rem;
412
+ font-weight: 600;
413
+ text-transform: uppercase;
414
+ letter-spacing: 0.05em;
415
+ padding: 0.5rem 0.75rem;
416
+ background: var(--source-bg);
417
+ border-bottom: 1px solid var(--border);
418
+ color: var(--fg-dim);
419
+ }
420
+
421
+ .source-code {
422
+ overflow-x: auto;
423
+ font-family: var(--code-font);
424
+ font-size: 0.8125rem;
425
+ line-height: 1.7;
426
+ padding: 0;
427
+ margin: 0;
428
+ }
429
+
430
+ .source-code code {
431
+ display: block;
432
+ }
433
+
434
+ .source-line {
435
+ display: block;
436
+ padding: 0 0.75rem;
437
+ border-left: 3px solid transparent;
438
+ }
439
+
440
+ .source-line-highlight {
441
+ background: var(--highlight-bg);
442
+ border-left-color: var(--highlight-border);
443
+ }
444
+
445
+ .line-num {
446
+ display: inline-block;
447
+ width: 3rem;
448
+ text-align: right;
449
+ margin-right: 1rem;
450
+ color: var(--line-num);
451
+ user-select: none;
452
+ }
453
+
454
+ .section {
455
+ margin-bottom: 1rem;
456
+ border: 1px solid var(--border);
457
+ border-radius: 0.5rem;
458
+ overflow: hidden;
459
+ }
460
+
461
+ .clickable { cursor: pointer; }
462
+ .clickable:hover { background: var(--btn-bg); }
463
+
464
+ .component-stack, .stack {
465
+ font-family: var(--code-font);
466
+ font-size: 0.8125rem;
467
+ line-height: 1.7;
468
+ padding: 0.75rem;
469
+ overflow-x: auto;
470
+ white-space: pre;
471
+ margin: 0;
472
+ }
473
+
474
+ .dimmed { color: var(--fg-dim); }
475
+
476
+ .actions {
477
+ margin: 1.5rem 0;
478
+ }
479
+
480
+ .btn {
481
+ font-family: inherit;
482
+ font-size: 0.8125rem;
483
+ font-weight: 500;
484
+ padding: 0.5rem 1rem;
485
+ border-radius: 0.375rem;
486
+ border: 1px solid var(--btn-border);
487
+ background: var(--btn-bg);
488
+ color: var(--btn-fg);
489
+ cursor: pointer;
490
+ transition: background 0.15s;
491
+ }
492
+
493
+ .btn:hover { opacity: 0.85; }
494
+
495
+ .footer {
496
+ display: flex;
497
+ align-items: center;
498
+ gap: 0.75rem;
499
+ padding-top: 1rem;
500
+ border-top: 1px solid var(--border);
501
+ font-size: 0.75rem;
502
+ color: var(--fg-dim);
503
+ }
504
+
505
+ .timber-logo {
506
+ font-weight: 600;
507
+ white-space: nowrap;
508
+ }
509
+ `;
@@ -0,0 +1,187 @@
1
+ /**
2
+ * Dev holding server — serves a loading page while Vite initializes.
3
+ *
4
+ * When `timber dev` (or `vite dev`) starts, Vite takes several seconds
5
+ * to initialize all plugins, scan routes, and boot the RSC environment.
6
+ * During this window, the port is unbound and browsers get
7
+ * ERR_CONNECTION_REFUSED.
8
+ *
9
+ * This module creates a lightweight HTTP server that binds the port
10
+ * immediately and serves a branded holding page with auto-refresh.
11
+ * Once Vite is ready, the holding server is closed and Vite's server
12
+ * takes over the port.
13
+ *
14
+ * The holding server is started in rootSync's config() hook (the
15
+ * earliest Vite plugin lifecycle point where we know the port) and
16
+ * closed in timber-dev-server's configureServer() hook (the last
17
+ * plugin, right before Vite calls server.listen()).
18
+ *
19
+ * Browser requests (Accept: text/html) get the HTML holding page.
20
+ * API requests (Accept: application/json) get a 503 JSON response.
21
+ * All responses include Retry-After: 1.
22
+ *
23
+ * See design/21-dev-server.md, TIM-665.
24
+ */
25
+
26
+ import http from 'node:http';
27
+
28
+ // ─── Types ────────────────────────────────────────────────────────────────
29
+
30
+ export interface HoldingServer {
31
+ /**
32
+ * Start listening on the given port.
33
+ * Returns the actual bound port (useful when port is 0 for OS assignment).
34
+ */
35
+ listen(port: number): Promise<number>;
36
+
37
+ /** Gracefully close the server and stop accepting connections. */
38
+ close(): Promise<void>;
39
+ }
40
+
41
+ // ─── Holding Page HTML ────────────────────────────────────────────────────
42
+
43
+ /**
44
+ * Minimal self-contained HTML holding page.
45
+ *
46
+ * Matches the timber.js docs site theme:
47
+ * - Light mode: warm stone/grain background, timber/bark text
48
+ * - Dark mode: stone-900 background, stone-200 text
49
+ * - 🪵 timber.js branding
50
+ *
51
+ * Uses meta-refresh (1s) for auto-reload — works without JavaScript.
52
+ * Inline CSS only, no external dependencies.
53
+ */
54
+ const HOLDING_PAGE_HTML = [
55
+ '<!DOCTYPE html>',
56
+ '<html lang="en">',
57
+ '<head>',
58
+ ' <meta charset="utf-8">',
59
+ ' <meta name="viewport" content="width=device-width, initial-scale=1">',
60
+ ' <meta http-equiv="refresh" content="2">',
61
+ ' <title>timber — starting...</title>',
62
+ ' <style>',
63
+ ' *, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }',
64
+ ' body {',
65
+ ' font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;',
66
+ ' background: #fafaf9;',
67
+ ' color: #44403c;',
68
+ ' display: flex;',
69
+ ' align-items: center;',
70
+ ' justify-content: center;',
71
+ ' min-height: 100vh;',
72
+ ' -webkit-font-smoothing: antialiased;',
73
+ ' }',
74
+ ' @media (prefers-color-scheme: dark) {',
75
+ ' body { background: #1c1917; color: #e7e5e4; }',
76
+ ' .message { color: #a8a29e; }',
77
+ ' .spinner { border-color: #57534e; border-top-color: #a1887f; }',
78
+ ' .logo { color: #e7e5e4; }',
79
+ ' }',
80
+ ' .container { text-align: center; padding: 2rem; }',
81
+ ' .logo {',
82
+ ' font-size: 1.5rem;',
83
+ ' font-weight: 700;',
84
+ ' letter-spacing: -0.02em;',
85
+ ' color: #5c3d2e;',
86
+ ' margin-bottom: 1.5rem;',
87
+ ' }',
88
+ ' .message {',
89
+ ' font-size: 0.95rem;',
90
+ ' color: #78716c;',
91
+ ' margin-bottom: 2rem;',
92
+ ' }',
93
+ ' .spinner {',
94
+ ' width: 24px;',
95
+ ' height: 24px;',
96
+ ' border: 2.5px solid #d7ccc8;',
97
+ ' border-top-color: #6d4c41;',
98
+ ' border-radius: 50%;',
99
+ ' animation: spin 0.8s linear infinite;',
100
+ ' margin: 0 auto;',
101
+ ' }',
102
+ ' @keyframes spin { to { transform: rotate(360deg); } }',
103
+ ' </style>',
104
+ '</head>',
105
+ '<body>',
106
+ ' <div class="container">',
107
+ ' <div class="logo">\u{1FAB5} timber.js</div>',
108
+ ' <p class="message">Dev server starting&hellip;</p>',
109
+ ' <div class="spinner"></div>',
110
+ ' </div>',
111
+ '</body>',
112
+ '</html>',
113
+ ].join('\n');
114
+
115
+ // ─── Factory ──────────────────────────────────────────────────────────────
116
+
117
+ /**
118
+ * Create a holding HTTP server that serves a loading page during startup.
119
+ *
120
+ * Usage (inside Vite plugin):
121
+ * ```ts
122
+ * // In config() hook — earliest point where port is known.
123
+ * // Use bindWithBump() to honor the default-3000 + auto-bump policy
124
+ * // (see ../server/port-resolution.ts and TIM-842).
125
+ * const holding = createHoldingServer();
126
+ * await bindWithBump((p) => holding.listen(p), { startPort: 3000, autoBump: true });
127
+ *
128
+ * // In last plugin's configureServer() — wrap listen for seamless handoff
129
+ * const originalListen = server.listen.bind(server);
130
+ * server.listen = async (...args) => {
131
+ * await holding.close();
132
+ * return originalListen(...args);
133
+ * };
134
+ * ```
135
+ */
136
+ export function createHoldingServer(): HoldingServer {
137
+ const server = http.createServer((req, res) => {
138
+ const accept = req.headers.accept ?? '';
139
+
140
+ // API requests: JSON 503
141
+ if (accept.includes('application/json') && !accept.includes('text/html')) {
142
+ res.writeHead(503, {
143
+ 'Content-Type': 'application/json; charset=utf-8',
144
+ 'Retry-After': '1',
145
+ 'Cache-Control': 'no-store',
146
+ });
147
+ res.end(
148
+ JSON.stringify({
149
+ error: 'Service Unavailable',
150
+ message: 'timber dev server is starting — please retry shortly',
151
+ })
152
+ );
153
+ return;
154
+ }
155
+
156
+ // Browser and other requests: HTML holding page
157
+ res.writeHead(503, {
158
+ 'Content-Type': 'text/html; charset=utf-8',
159
+ 'Retry-After': '1',
160
+ 'Cache-Control': 'no-store',
161
+ });
162
+ res.end(HOLDING_PAGE_HTML);
163
+ });
164
+
165
+ return {
166
+ listen(port: number): Promise<number> {
167
+ return new Promise((resolve, reject) => {
168
+ server.once('error', reject);
169
+ server.listen(port, () => {
170
+ server.removeListener('error', reject);
171
+ const addr = server.address();
172
+ const boundPort = typeof addr === 'object' && addr ? addr.port : port;
173
+ resolve(boundPort);
174
+ });
175
+ });
176
+ },
177
+
178
+ close(): Promise<void> {
179
+ return new Promise((resolve, reject) => {
180
+ server.close((err) => {
181
+ if (err) reject(err);
182
+ else resolve();
183
+ });
184
+ });
185
+ },
186
+ };
187
+ }