@ecopages/core 0.2.0-beta.9 → 0.2.0-rc.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 (624) hide show
  1. package/README.md +42 -13
  2. package/package.json +360 -57
  3. package/src/adapters/README.md +6 -2
  4. package/src/adapters/abstract/application-adapter.d.ts +57 -5
  5. package/src/adapters/abstract/application-adapter.js +261 -203
  6. package/src/adapters/abstract/router-adapter.js +12 -4
  7. package/src/adapters/abstract/segment-path-matcher.d.ts +6 -0
  8. package/src/adapters/abstract/segment-path-matcher.js +147 -0
  9. package/src/adapters/abstract/server-adapter.d.ts +13 -2
  10. package/src/adapters/abstract/server-adapter.js +22 -14
  11. package/src/adapters/abstract/ws-pattern-matcher.d.ts +2 -50
  12. package/src/adapters/abstract/ws-pattern-matcher.js +24 -57
  13. package/src/adapters/bun/bun-user-websocket-lifecycle.js +93 -0
  14. package/src/adapters/bun/client-bridge.js +51 -50
  15. package/src/adapters/bun/create-app.d.ts +4 -6
  16. package/src/adapters/bun/create-app.js +169 -154
  17. package/src/adapters/bun/hmr-manager.d.ts +2 -3
  18. package/src/adapters/bun/hmr-manager.js +62 -57
  19. package/src/adapters/bun/index.d.ts +1 -1
  20. package/src/adapters/bun/index.js +2 -8
  21. package/src/adapters/bun/runtime-host.d.ts +1 -1
  22. package/src/adapters/bun/runtime-host.js +61 -54
  23. package/src/adapters/bun/server-adapter.d.ts +34 -53
  24. package/src/adapters/bun/server-adapter.js +557 -637
  25. package/src/adapters/bun/static-preview-host.d.ts +1 -1
  26. package/src/adapters/bun/static-preview-host.js +43 -41
  27. package/src/adapters/create-app.d.ts +1 -12
  28. package/src/adapters/create-app.js +11 -72
  29. package/src/adapters/index.d.ts +2 -2
  30. package/src/adapters/index.js +2 -8
  31. package/src/adapters/node/create-app.d.ts +4 -3
  32. package/src/adapters/node/create-app.js +123 -98
  33. package/src/adapters/node/http-request-bridge.js +147 -106
  34. package/src/adapters/node/node-client-bridge.js +62 -64
  35. package/src/adapters/node/node-hmr-manager.d.ts +2 -3
  36. package/src/adapters/node/node-hmr-manager.js +58 -48
  37. package/src/adapters/node/runtime-host.d.ts +1 -1
  38. package/src/adapters/node/runtime-host.js +96 -89
  39. package/src/adapters/node/server-adapter-dependencies.js +18 -17
  40. package/src/adapters/node/server-adapter.d.ts +28 -8
  41. package/src/adapters/node/server-adapter.js +349 -302
  42. package/src/adapters/node/static-content-server.js +172 -186
  43. package/src/adapters/node/static-preview-host.d.ts +1 -1
  44. package/src/adapters/node/static-preview-host.js +88 -64
  45. package/src/adapters/shared/hmr/dev-transform-entrypoint-registry.d.ts +16 -0
  46. package/src/adapters/shared/hmr/dev-transform-entrypoint-registry.js +32 -0
  47. package/src/adapters/shared/{hmr-html-response.d.ts → hmr/hmr-html-response.d.ts} +2 -2
  48. package/src/adapters/shared/hmr/hmr-html-response.js +50 -0
  49. package/src/adapters/shared/hmr/shared-hmr-manager.d.ts +92 -0
  50. package/src/adapters/shared/hmr/shared-hmr-manager.js +446 -0
  51. package/src/adapters/shared/http/api-request-pipeline.d.ts +23 -0
  52. package/src/adapters/shared/http/api-request-pipeline.js +132 -0
  53. package/src/adapters/shared/{api-response.d.ts → http/api-response.d.ts} +1 -1
  54. package/src/adapters/shared/http/api-response.js +79 -0
  55. package/src/adapters/shared/http/create-body-response.d.ts +12 -0
  56. package/src/adapters/shared/http/create-body-response.js +26 -0
  57. package/src/adapters/shared/http/define-api-handler.d.ts +90 -0
  58. package/src/adapters/shared/http/define-api-handler.js +49 -0
  59. package/src/adapters/shared/{explicit-static-render-preparation.d.ts → http/explicit-static-render-preparation.d.ts} +3 -3
  60. package/src/adapters/shared/http/explicit-static-render-preparation.js +29 -0
  61. package/src/adapters/shared/{explicit-static-route-matcher.d.ts → http/explicit-static-route-matcher.d.ts} +3 -9
  62. package/src/adapters/shared/http/explicit-static-route-matcher.js +59 -0
  63. package/src/adapters/shared/{file-route-middleware-pipeline.d.ts → http/file-route-middleware-pipeline.d.ts} +2 -2
  64. package/src/adapters/shared/http/file-route-middleware-pipeline.js +84 -0
  65. package/src/adapters/shared/{fs-server-response-factory.d.ts → http/fs-server-response-factory.d.ts} +7 -2
  66. package/src/adapters/shared/http/fs-server-response-factory.js +106 -0
  67. package/src/adapters/shared/{fs-server-response-matcher.d.ts → http/fs-server-response-matcher.d.ts} +25 -5
  68. package/src/adapters/shared/http/fs-server-response-matcher.js +260 -0
  69. package/src/adapters/shared/http/run-middleware-chain.d.ts +5 -0
  70. package/src/adapters/shared/http/run-middleware-chain.js +17 -0
  71. package/src/adapters/shared/{application-adapter.d.ts → runtime/application-adapter.d.ts} +2 -2
  72. package/src/adapters/shared/runtime/application-adapter.js +75 -0
  73. package/src/adapters/shared/runtime/collect-dev-prewarm-plan.d.ts +11 -0
  74. package/src/adapters/shared/runtime/collect-dev-prewarm-plan.js +29 -0
  75. package/src/adapters/shared/runtime/copy-runtime-public-dir.js +27 -0
  76. package/src/adapters/shared/runtime/dev-static-route-prewarm.d.ts +16 -0
  77. package/src/adapters/shared/runtime/dev-static-route-prewarm.js +66 -0
  78. package/src/adapters/shared/runtime/port-manager.d.ts +116 -0
  79. package/src/adapters/shared/runtime/port-manager.js +226 -0
  80. package/src/adapters/shared/{render-context.d.ts → runtime/render-context.d.ts} +2 -2
  81. package/src/adapters/shared/runtime/render-context.js +99 -0
  82. package/src/adapters/shared/{runtime-app-bootstrap.d.ts → runtime/runtime-app-bootstrap.d.ts} +4 -2
  83. package/src/adapters/shared/runtime/runtime-app-bootstrap.js +38 -0
  84. package/src/adapters/shared/runtime/runtime-server-lifecycle.d.ts +45 -0
  85. package/src/adapters/shared/runtime/runtime-server-lifecycle.js +71 -0
  86. package/src/adapters/shared/{server-adapter.d.ts → runtime/server-adapter.d.ts} +31 -50
  87. package/src/adapters/shared/runtime/server-adapter.js +301 -0
  88. package/src/adapters/shared/{server-route-handler.d.ts → runtime/server-route-handler.d.ts} +6 -33
  89. package/src/adapters/shared/runtime/server-route-handler.js +77 -0
  90. package/src/adapters/shared/{server-static-builder.d.ts → runtime/server-static-builder.d.ts} +26 -31
  91. package/src/adapters/shared/runtime/server-static-builder.js +172 -0
  92. package/src/adapters/shared/{static-preview-host.d.ts → runtime/static-preview-host.d.ts} +6 -1
  93. package/src/adapters/shared/{node-http-websocket-upgrades.d.ts → ws/node-http-websocket-upgrades.d.ts} +1 -1
  94. package/src/adapters/shared/ws/node-http-websocket-upgrades.js +109 -0
  95. package/src/adapters/shared/ws/websocket-lifecycle.d.ts +24 -0
  96. package/src/adapters/shared/ws/websocket-lifecycle.js +62 -0
  97. package/src/build/README.md +165 -45
  98. package/src/build/app-build-manifest-runtime.d.ts +39 -0
  99. package/src/build/app-build-manifest-runtime.js +145 -0
  100. package/src/build/{browser-runtime-manifest.d.ts → browser/browser-runtime-manifest.d.ts} +4 -0
  101. package/src/build/browser/browser-runtime-manifest.js +65 -0
  102. package/src/build/{browser-runtime-plugin-helpers.d.ts → browser/browser-runtime-plugin-helpers.d.ts} +3 -5
  103. package/src/build/browser/browser-runtime-plugin-helpers.js +32 -0
  104. package/src/build/{browser-runtime-plugin.d.ts → browser/browser-runtime-plugin.d.ts} +12 -13
  105. package/src/build/browser/browser-runtime-plugin.js +218 -0
  106. package/src/build/browser/jsx-ownership-plugins.d.ts +24 -0
  107. package/src/build/browser/jsx-ownership-plugins.js +55 -0
  108. package/src/build/browser/lit-static-render-worker-context.d.ts +2 -0
  109. package/src/build/browser/lit-static-render-worker-context.js +4 -0
  110. package/src/build/build-adapter.d.ts +25 -355
  111. package/src/build/build-adapter.js +258 -265
  112. package/src/build/{build-input-fingerprint.d.ts → cache/build-input-fingerprint.d.ts} +3 -3
  113. package/src/build/cache/build-input-fingerprint.js +33 -0
  114. package/src/build/cache/cache-constants.d.ts +4 -0
  115. package/src/build/cache/cache-constants.js +4 -0
  116. package/src/build/cache/cache-keys.d.ts +22 -0
  117. package/src/build/cache/cache-keys.js +71 -0
  118. package/src/build/{pages-unified-graph-build.d.ts → cache/pages-unified-graph-build.d.ts} +1 -1
  119. package/src/build/cache/pages-unified-graph-build.js +199 -0
  120. package/src/build/cache/production-build-cache.d.ts +21 -0
  121. package/src/build/cache/production-build-cache.js +56 -0
  122. package/src/build/{server-entry-build-cache.d.ts → cache/server-entry-build-cache.d.ts} +3 -4
  123. package/src/build/cache/server-entry-build-cache.js +153 -0
  124. package/src/build/contracts/build-contracts.d.ts +96 -0
  125. package/src/build/contracts/build-contracts.js +1 -0
  126. package/src/build/contracts/build-manifest.d.ts +90 -0
  127. package/src/build/contracts/build-manifest.js +64 -0
  128. package/src/build/contracts/build-types.js +1 -0
  129. package/src/build/contracts/content-virtual-modules.d.ts +12 -0
  130. package/src/build/contracts/content-virtual-modules.js +29 -0
  131. package/src/build/{rolldown-adapter-helpers.d.ts → rolldown/rolldown-adapter-helpers.d.ts} +32 -9
  132. package/src/build/rolldown/rolldown-adapter-helpers.js +463 -0
  133. package/src/build/{rolldown-build-adapter.d.ts → rolldown/rolldown-build-adapter.d.ts} +3 -7
  134. package/src/build/rolldown/rolldown-build-adapter.js +57 -0
  135. package/src/build/{rolldown-build-invocation-metrics.d.ts → rolldown/rolldown-build-invocation-metrics.d.ts} +1 -1
  136. package/src/build/rolldown/rolldown-build-invocation-metrics.js +39 -0
  137. package/src/build/{rolldown-plugin-bridge.d.ts → rolldown/rolldown-plugin-bridge.d.ts} +7 -2
  138. package/src/build/rolldown/rolldown-plugin-bridge.js +284 -0
  139. package/src/build/{rolldown-source-transform-pass.d.ts → rolldown/rolldown-source-transform-pass.d.ts} +1 -1
  140. package/src/build/rolldown/rolldown-source-transform-pass.js +70 -0
  141. package/src/build/rolldown/runtime-build-output-normalizer.js +253 -0
  142. package/src/build/rolldown/server-side-css-shim-plugin.js +58 -0
  143. package/src/build/runtime/build-profile-options.d.ts +7 -0
  144. package/src/build/runtime/build-profile-options.js +37 -0
  145. package/src/build/runtime/build-request-identity.d.ts +17 -0
  146. package/src/build/runtime/build-request-identity.js +79 -0
  147. package/src/build/runtime/build-request-policy.d.ts +58 -0
  148. package/src/build/runtime/build-request-policy.js +84 -0
  149. package/src/build/runtime/build-runtime.d.ts +28 -0
  150. package/src/build/runtime/build-runtime.js +75 -0
  151. package/src/build/runtime/deduping-build-executor.d.ts +21 -0
  152. package/src/build/runtime/deduping-build-executor.js +40 -0
  153. package/src/build/{parallel-build-executor.d.ts → runtime/parallel-build-executor.d.ts} +1 -1
  154. package/src/build/runtime/parallel-build-executor.js +60 -0
  155. package/src/build/{serialized-build-executor.d.ts → runtime/serialized-build-executor.d.ts} +1 -1
  156. package/src/build/runtime/serialized-build-executor.js +79 -0
  157. package/src/cache/index.d.ts +2 -1
  158. package/src/cache/index.js +7 -6
  159. package/src/cache/module-parse-cache.d.ts +5 -0
  160. package/src/cache/module-parse-cache.js +122 -67
  161. package/src/cache/module-transform-profiler.d.ts +8 -0
  162. package/src/cache/module-transform-profiler.js +8 -0
  163. package/src/client/navigation-scripts/classification.d.ts +16 -0
  164. package/src/client/navigation-scripts/classification.js +49 -0
  165. package/src/client/navigation-scripts/index.d.ts +3 -0
  166. package/src/client/navigation-scripts/index.js +3 -0
  167. package/src/client/navigation-scripts/navigation-scripts.test.browser.d.ts +1 -0
  168. package/src/client/navigation-scripts/navigation-scripts.test.browser.js +61 -0
  169. package/src/client/navigation-scripts/registry.d.ts +11 -0
  170. package/src/client/navigation-scripts/registry.js +16 -0
  171. package/src/client/navigation-scripts/rerun-queue.d.ts +37 -0
  172. package/src/client/navigation-scripts/rerun-queue.js +90 -0
  173. package/src/client/scroll.d.ts +17 -0
  174. package/src/client/scroll.js +33 -0
  175. package/src/client/scroll.test.browser.d.ts +1 -0
  176. package/src/client/scroll.test.browser.js +31 -0
  177. package/src/client/view-transitions.d.ts +32 -0
  178. package/src/client/view-transitions.js +120 -0
  179. package/src/client/view-transitions.test.browser.d.ts +1 -0
  180. package/src/client/view-transitions.test.browser.js +56 -0
  181. package/src/config/README.md +1 -1
  182. package/src/config/config-builder.d.ts +40 -20
  183. package/src/config/config-builder.js +645 -610
  184. package/src/config/constants.d.ts +1 -0
  185. package/src/config/constants.js +44 -23
  186. package/src/declarations.d.ts +1 -0
  187. package/src/dev/README.md +24 -0
  188. package/src/dev/client-bridge-registry.d.ts +5 -0
  189. package/src/dev/client-bridge-registry.js +10 -0
  190. package/src/dev/dev-client-ownership.d.ts +7 -0
  191. package/src/dev/dev-client-ownership.js +8 -0
  192. package/src/dev/hmr-manager-registry.d.ts +8 -0
  193. package/src/dev/hmr-manager-registry.js +10 -0
  194. package/src/dev/host-runtime.d.ts +3 -0
  195. package/src/dev/host-runtime.js +25 -23
  196. package/src/dev/runtime-server-started-message.d.ts +2 -0
  197. package/src/dev/runtime-server-started-message.js +3 -0
  198. package/src/dev/sc-server.js +106 -103
  199. package/src/dev/transform-server/dev-transform-bundler.d.ts +24 -0
  200. package/src/dev/transform-server/dev-transform-bundler.js +79 -0
  201. package/src/dev/transform-server/dev-transform-externalize-plugin.d.ts +12 -0
  202. package/src/dev/transform-server/dev-transform-externalize-plugin.js +29 -0
  203. package/src/dev/transform-server/dev-transform-import-rewriter.d.ts +16 -0
  204. package/src/dev/transform-server/dev-transform-import-rewriter.js +127 -0
  205. package/src/dev/transform-server/dev-transform-module-kind.d.ts +13 -0
  206. package/src/dev/transform-server/dev-transform-module-kind.js +17 -0
  207. package/src/dev/transform-server/dev-transform-runtime-specifiers.d.ts +5 -0
  208. package/src/dev/transform-server/dev-transform-runtime-specifiers.js +16 -0
  209. package/src/dev/transform-server/dev-transform-server.d.ts +41 -0
  210. package/src/dev/transform-server/dev-transform-server.js +191 -0
  211. package/src/dev/transform-server/dev-transform-url.d.ts +13 -0
  212. package/src/dev/transform-server/dev-transform-url.js +58 -0
  213. package/src/dev/transform-server/dev-transform-vendor-registry.d.ts +28 -0
  214. package/src/dev/transform-server/dev-transform-vendor-registry.js +166 -0
  215. package/src/dev/transform-server/index.d.ts +6 -0
  216. package/src/dev/transform-server/index.js +4 -0
  217. package/src/dev/transform-server/types.d.ts +15 -0
  218. package/src/dev/transform-server/types.js +1 -0
  219. package/src/dev-toolbar/README.md +52 -0
  220. package/src/dev-toolbar/define-dev-tool.d.ts +21 -0
  221. package/src/dev-toolbar/define-dev-tool.js +9 -0
  222. package/src/dev-toolbar/dev-toolbar-config.d.ts +25 -0
  223. package/src/dev-toolbar/dev-toolbar-config.js +19 -0
  224. package/src/dev-toolbar/dev-toolbar-host.d.ts +49 -0
  225. package/src/dev-toolbar/dev-toolbar-host.js +117 -0
  226. package/src/dev-toolbar/dev-toolbar-html-response.d.ts +11 -0
  227. package/src/dev-toolbar/dev-toolbar-html-response.js +14 -0
  228. package/src/dev-toolbar/dev-toolbar-manifest-contract.d.ts +22 -0
  229. package/src/dev-toolbar/dev-toolbar-manifest-contract.js +2 -0
  230. package/src/dev-toolbar/dev-toolbar-manifest.d.ts +15 -0
  231. package/src/dev-toolbar/dev-toolbar-manifest.js +52 -0
  232. package/src/dev-toolbar/dev-toolbar-package.d.ts +34 -0
  233. package/src/dev-toolbar/dev-toolbar-package.js +78 -0
  234. package/src/dev-toolbar/dev-toolbar-runtime-paths.d.ts +10 -0
  235. package/src/dev-toolbar/dev-toolbar-runtime-paths.js +13 -0
  236. package/src/diagnostics/request-build-dedupe.d.ts +18 -0
  237. package/src/diagnostics/request-build-dedupe.js +39 -0
  238. package/src/diagnostics/request-pipeline-metrics.d.ts +38 -0
  239. package/src/diagnostics/request-pipeline-metrics.js +121 -0
  240. package/src/diagnostics/startup-trace.d.ts +81 -0
  241. package/src/diagnostics/startup-trace.js +281 -0
  242. package/src/eco/README.md +17 -0
  243. package/src/eco/component-identity.d.ts +13 -0
  244. package/src/eco/component-identity.js +18 -0
  245. package/src/eco/eco-declared-component.d.ts +15 -0
  246. package/src/eco/eco-declared-component.js +23 -0
  247. package/src/eco/eco.browser.js +63 -70
  248. package/src/eco/eco.js +163 -97
  249. package/src/eco/eco.types.d.ts +47 -8
  250. package/src/eco/eco.types.js +5 -0
  251. package/src/eco/eco.utils.d.ts +1 -1
  252. package/src/eco/eco.utils.js +1 -10
  253. package/src/eco/global-injector-map.js +55 -41
  254. package/src/eco/lazy-injector-map.js +90 -60
  255. package/src/eco/module-dependencies.js +52 -44
  256. package/src/eco/page-layout-normalization.d.ts +21 -0
  257. package/src/eco/page-layout-normalization.js +69 -0
  258. package/src/env.d.ts +2 -0
  259. package/src/errors/http-error.d.ts +8 -0
  260. package/src/errors/http-error.js +66 -49
  261. package/src/errors/index.d.ts +1 -0
  262. package/src/errors/index.js +3 -6
  263. package/src/errors/locals-access-error.js +5 -8
  264. package/src/errors/undeclared-component-dependency-error.d.ts +11 -0
  265. package/src/errors/undeclared-component-dependency-error.js +17 -0
  266. package/src/global/app-logger.js +3 -6
  267. package/src/hmr/README.md +21 -0
  268. package/src/hmr/client/hmr-runtime.js +119 -110
  269. package/src/hmr/client/module-update.d.ts +13 -0
  270. package/src/hmr/client/module-update.js +39 -0
  271. package/src/hmr/hmr-asset-paths.d.ts +14 -0
  272. package/src/hmr/hmr-asset-paths.js +22 -0
  273. package/src/hmr/hmr-entrypoint-output.d.ts +21 -0
  274. package/src/hmr/hmr-entrypoint-output.js +34 -0
  275. package/src/hmr/hmr-file-change-prep.d.ts +10 -0
  276. package/src/hmr/hmr-file-change-prep.js +14 -0
  277. package/src/hmr/hmr-registered-entrypoints-context.d.ts +7 -0
  278. package/src/hmr/hmr-registered-entrypoints-context.js +1 -0
  279. package/src/hmr/hmr-runtime-paths.d.ts +10 -0
  280. package/src/hmr/hmr-runtime-paths.js +13 -0
  281. package/src/hmr/hmr-strategy.d.ts +9 -0
  282. package/src/hmr/hmr-strategy.js +113 -42
  283. package/src/hmr/strategies/default-hmr-strategy.js +55 -33
  284. package/src/hmr/strategies/js-hmr-strategy.d.ts +6 -97
  285. package/src/hmr/strategies/js-hmr-strategy.js +107 -167
  286. package/src/hmr/strategies/server-rendered-template-hmr-strategy.d.ts +17 -0
  287. package/src/hmr/strategies/server-rendered-template-hmr-strategy.js +35 -0
  288. package/src/index.browser.d.ts +1 -0
  289. package/src/index.browser.js +2 -4
  290. package/src/index.d.ts +4 -1
  291. package/src/index.js +7 -21
  292. package/src/islands/README.md +25 -0
  293. package/src/islands/island-host.d.ts +37 -0
  294. package/src/islands/island-host.js +55 -0
  295. package/src/plugins/README.md +2 -1
  296. package/src/plugins/alias-resolver-cache.d.ts +6 -9
  297. package/src/plugins/alias-resolver-cache.js +114 -97
  298. package/src/plugins/alias-resolver-plugin.d.ts +3 -3
  299. package/src/plugins/alias-resolver-plugin.js +35 -62
  300. package/src/plugins/define-integration.d.ts +26 -0
  301. package/src/plugins/define-integration.js +20 -0
  302. package/src/plugins/eco-component-meta-plugin.d.ts +6 -102
  303. package/src/plugins/eco-component-meta-plugin.js +123 -162
  304. package/src/plugins/foreign-jsx-override-plugin.d.ts +1 -1
  305. package/src/plugins/foreign-jsx-override-plugin.js +49 -37
  306. package/src/plugins/integration-plugin.d.ts +24 -6
  307. package/src/plugins/integration-plugin.js +212 -195
  308. package/src/plugins/jsx-import-source.utils.d.ts +8 -0
  309. package/src/plugins/jsx-import-source.utils.js +21 -0
  310. package/src/plugins/package-specifier.d.ts +12 -0
  311. package/src/plugins/package-specifier.js +33 -0
  312. package/src/plugins/processor.d.ts +66 -12
  313. package/src/plugins/processor.js +168 -137
  314. package/src/plugins/runtime-capability.js +1 -0
  315. package/src/plugins/source-transform.d.ts +1 -1
  316. package/src/plugins/source-transform.js +109 -79
  317. package/src/plugins/tsconfig-import-resolver.d.ts +37 -0
  318. package/src/plugins/tsconfig-import-resolver.js +262 -0
  319. package/src/route-renderer/GRAPH.md +24 -30
  320. package/src/route-renderer/README.md +52 -32
  321. package/src/route-renderer/orchestration/document-shell/document-shell-render.service.d.ts +107 -0
  322. package/src/route-renderer/orchestration/document-shell/document-shell-render.service.js +155 -0
  323. package/src/route-renderer/orchestration/document-shell/layout-shell-props.service.d.ts +20 -0
  324. package/src/route-renderer/orchestration/document-shell/layout-shell-props.service.js +37 -0
  325. package/src/route-renderer/orchestration/{component-render-context.d.ts → foreign-child/component-render-context.d.ts} +8 -15
  326. package/src/route-renderer/orchestration/foreign-child/component-render-context.js +196 -0
  327. package/src/route-renderer/orchestration/{render-output.utils.d.ts → foreign-child/foreign-child-output.utils.d.ts} +20 -7
  328. package/src/route-renderer/orchestration/foreign-child/foreign-child-output.utils.js +195 -0
  329. package/src/route-renderer/orchestration/{foreign-subtree-execution.service.d.ts → foreign-child/foreign-subtree-execution.service.d.ts} +64 -34
  330. package/src/route-renderer/orchestration/foreign-child/foreign-subtree-execution.service.js +354 -0
  331. package/src/route-renderer/orchestration/foreign-child/owning-renderer-resolution.d.ts +19 -0
  332. package/src/route-renderer/orchestration/foreign-child/owning-renderer-resolution.js +36 -0
  333. package/src/route-renderer/orchestration/integration-renderer.d.ts +37 -153
  334. package/src/route-renderer/orchestration/integration-renderer.js +803 -1008
  335. package/src/route-renderer/orchestration/integration-renderer.test-fixtures.d.ts +75 -0
  336. package/src/route-renderer/orchestration/integration-renderer.test-fixtures.js +173 -0
  337. package/src/route-renderer/orchestration/ownership-graph/component-graph-collectors.d.ts +10 -0
  338. package/src/route-renderer/orchestration/ownership-graph/component-graph-collectors.js +132 -0
  339. package/src/route-renderer/orchestration/ownership-graph/component-graph.d.ts +34 -0
  340. package/src/route-renderer/orchestration/ownership-graph/component-graph.js +89 -0
  341. package/src/route-renderer/orchestration/{ownership-validation.service.d.ts → ownership-graph/ownership-validation.service.d.ts} +6 -2
  342. package/src/route-renderer/orchestration/ownership-graph/ownership-validation.service.js +77 -0
  343. package/src/route-renderer/orchestration/page-browser-graph/global-injector-assets.service.d.ts +7 -0
  344. package/src/route-renderer/orchestration/page-browser-graph/global-injector-assets.service.js +30 -0
  345. package/src/route-renderer/orchestration/page-browser-graph/grouped-graph-build-plan.d.ts +15 -0
  346. package/src/route-renderer/orchestration/page-browser-graph/grouped-graph-build-plan.js +9 -0
  347. package/src/route-renderer/orchestration/page-browser-graph/page-browser-graph-contribution.merge.d.ts +5 -0
  348. package/src/route-renderer/orchestration/page-browser-graph/page-browser-graph-contribution.merge.js +30 -0
  349. package/src/route-renderer/orchestration/page-browser-graph/page-browser-graph-merge.utils.d.ts +12 -0
  350. package/src/route-renderer/orchestration/page-browser-graph/page-browser-graph-merge.utils.js +32 -0
  351. package/src/route-renderer/orchestration/page-browser-graph/page-browser-graph-session.d.ts +126 -0
  352. package/src/route-renderer/orchestration/page-browser-graph/page-browser-graph-session.js +542 -0
  353. package/src/route-renderer/orchestration/page-browser-graph/page-browser-graph.service.d.ts +47 -0
  354. package/src/route-renderer/orchestration/page-browser-graph/page-browser-graph.service.js +248 -0
  355. package/src/route-renderer/orchestration/{processed-asset-dedupe.d.ts → page-browser-graph/processed-asset-dedupe.d.ts} +1 -1
  356. package/src/route-renderer/orchestration/page-browser-graph/processed-asset-dedupe.js +23 -0
  357. package/src/route-renderer/orchestration/page-browser-graph/route-instance-key.d.ts +29 -0
  358. package/src/route-renderer/orchestration/page-browser-graph/route-instance-key.js +54 -0
  359. package/src/route-renderer/orchestration/route-pipeline/integration-route-render-adapter.d.ts +38 -0
  360. package/src/route-renderer/orchestration/route-pipeline/integration-route-render-adapter.js +26 -0
  361. package/src/route-renderer/orchestration/route-pipeline/marker-artifact.utils.d.ts +6 -0
  362. package/src/route-renderer/orchestration/route-pipeline/marker-artifact.utils.js +25 -0
  363. package/src/route-renderer/orchestration/route-pipeline/robots-meta.contribution.d.ts +15 -0
  364. package/src/route-renderer/orchestration/route-pipeline/robots-meta.contribution.js +43 -0
  365. package/src/route-renderer/orchestration/route-pipeline/route-html-finalization.service.d.ts +25 -0
  366. package/src/route-renderer/orchestration/route-pipeline/route-html-finalization.service.js +44 -0
  367. package/src/route-renderer/orchestration/route-pipeline/route-prepared-options.builder.d.ts +26 -0
  368. package/src/route-renderer/orchestration/route-pipeline/route-prepared-options.builder.js +44 -0
  369. package/src/route-renderer/orchestration/route-pipeline/route-prepared-options.utils.d.ts +4 -0
  370. package/src/route-renderer/orchestration/route-pipeline/route-prepared-options.utils.js +30 -0
  371. package/src/route-renderer/orchestration/{route-render-orchestrator.d.ts → route-pipeline/route-render-orchestrator.d.ts} +24 -54
  372. package/src/route-renderer/orchestration/route-pipeline/route-render-orchestrator.js +215 -0
  373. package/src/{integrations/ghtml/ghtml-renderer.d.ts → route-renderer/orchestration/string-markup-renderer.d.ts} +8 -10
  374. package/src/route-renderer/orchestration/string-markup-renderer.js +52 -0
  375. package/src/route-renderer/page-loading/component-dependency-collection.js +121 -121
  376. package/src/route-renderer/page-loading/declared-asset-collection.js +66 -94
  377. package/src/route-renderer/page-loading/dependency-resolver.js +101 -104
  378. package/src/route-renderer/page-loading/ecopages-virtual-imports.d.ts +1 -0
  379. package/src/route-renderer/page-loading/ecopages-virtual-imports.js +64 -51
  380. package/src/route-renderer/page-loading/file-scoped-dependency-components.d.ts +42 -0
  381. package/src/route-renderer/page-loading/file-scoped-dependency-components.js +94 -0
  382. package/src/route-renderer/page-loading/lazy-entry-collection.js +75 -98
  383. package/src/route-renderer/page-loading/lazy-trigger-planning.js +47 -36
  384. package/src/route-renderer/page-loading/module-declaration-aggregation.js +39 -28
  385. package/src/route-renderer/page-loading/module-declaration-scripts.js +10 -15
  386. package/src/route-renderer/page-loading/page-dependency-bundling.js +156 -113
  387. package/src/route-renderer/page-loading/page-module-loader.d.ts +2 -1
  388. package/src/route-renderer/page-loading/page-module-loader.js +136 -124
  389. package/src/route-renderer/page-loading/resolved-page-dependencies.d.ts +12 -0
  390. package/src/route-renderer/page-loading/resolved-page-dependencies.js +38 -0
  391. package/src/route-renderer/route-renderer.js +74 -76
  392. package/src/router/README.md +31 -0
  393. package/src/router/client/link-intent.d.ts +11 -21
  394. package/src/router/client/link-intent.js +56 -30
  395. package/src/router/client/link-intent.test.browser.js +50 -39
  396. package/src/router/client/link-navigation-policy.d.ts +45 -0
  397. package/src/router/client/link-navigation-policy.js +122 -0
  398. package/src/router/client/link-navigation-policy.test.browser.d.ts +1 -0
  399. package/src/router/client/link-navigation-policy.test.browser.js +82 -0
  400. package/src/router/client/navigation-coordinator.d.ts +1 -1
  401. package/src/router/client/navigation-coordinator.js +235 -211
  402. package/src/router/client/navigation-lifecycle.d.ts +55 -0
  403. package/src/router/client/navigation-lifecycle.js +50 -0
  404. package/src/router/client/navigation-lifecycle.test.browser.d.ts +1 -0
  405. package/src/router/client/navigation-lifecycle.test.browser.js +118 -0
  406. package/src/router/server/route-registry.js +237 -242
  407. package/src/services/README.md +5 -0
  408. package/src/services/assets/asset-processing-service/asset-dependency-keys.d.ts +13 -0
  409. package/src/services/assets/asset-processing-service/asset-dependency-keys.js +64 -50
  410. package/src/services/assets/asset-processing-service/asset-processing.service.d.ts +12 -1
  411. package/src/services/assets/asset-processing-service/asset-processing.service.js +335 -268
  412. package/src/services/assets/asset-processing-service/asset.factory.js +78 -81
  413. package/src/services/assets/asset-processing-service/assets.types.d.ts +1 -1
  414. package/src/services/assets/asset-processing-service/assets.types.js +1 -0
  415. package/src/services/assets/asset-processing-service/browser-runtime-asset.factory.d.ts +1 -1
  416. package/src/services/assets/asset-processing-service/browser-runtime-asset.factory.js +57 -46
  417. package/src/services/assets/asset-processing-service/browser-runtime-entry-resolution.d.ts +52 -0
  418. package/src/services/assets/asset-processing-service/browser-runtime-entry-resolution.js +115 -0
  419. package/src/services/assets/asset-processing-service/browser-runtime-entry.factory.js +53 -58
  420. package/src/services/assets/asset-processing-service/finalize-processed-asset.d.ts +3 -0
  421. package/src/services/assets/asset-processing-service/finalize-processed-asset.js +5 -0
  422. package/src/services/assets/asset-processing-service/grouped-content-bundles.d.ts +2 -1
  423. package/src/services/assets/asset-processing-service/grouped-content-bundles.js +85 -60
  424. package/src/services/assets/asset-processing-service/index.d.ts +2 -0
  425. package/src/services/assets/asset-processing-service/index.js +8 -6
  426. package/src/services/assets/asset-processing-service/inline-content-script-body.d.ts +11 -0
  427. package/src/services/assets/asset-processing-service/inline-content-script-body.js +23 -0
  428. package/src/services/assets/asset-processing-service/materialize-content-script-asset.d.ts +9 -0
  429. package/src/services/assets/asset-processing-service/materialize-content-script-asset.js +22 -0
  430. package/src/services/assets/asset-processing-service/page-package.js +70 -72
  431. package/src/services/assets/asset-processing-service/processor.interface.js +7 -5
  432. package/src/services/assets/asset-processing-service/processor.registry.js +11 -14
  433. package/src/services/assets/asset-processing-service/processors/base/base-processor.js +59 -62
  434. package/src/services/assets/asset-processing-service/processors/base/base-script-processor.d.ts +0 -2
  435. package/src/services/assets/asset-processing-service/processors/base/base-script-processor.js +102 -130
  436. package/src/services/assets/asset-processing-service/processors/index.js +5 -5
  437. package/src/services/assets/asset-processing-service/processors/script/content-script.processor.d.ts +8 -0
  438. package/src/services/assets/asset-processing-service/processors/script/content-script.processor.js +111 -111
  439. package/src/services/assets/asset-processing-service/processors/script/file-script.processor.d.ts +0 -1
  440. package/src/services/assets/asset-processing-service/processors/script/file-script.processor.js +95 -94
  441. package/src/services/assets/asset-processing-service/processors/script/node-module-script.processor.js +136 -135
  442. package/src/services/assets/asset-processing-service/processors/stylesheet/content-stylesheet.processor.d.ts +0 -3
  443. package/src/services/assets/asset-processing-service/processors/stylesheet/content-stylesheet.processor.js +26 -57
  444. package/src/services/assets/asset-processing-service/processors/stylesheet/file-stylesheet.processor.d.ts +0 -3
  445. package/src/services/assets/asset-processing-service/processors/stylesheet/file-stylesheet.processor.js +33 -67
  446. package/src/services/assets/asset-processing-service/processors/stylesheet/stylesheet-processor-pipeline.d.ts +2 -0
  447. package/src/services/assets/asset-processing-service/processors/stylesheet/stylesheet-processor-pipeline.js +44 -0
  448. package/src/services/assets/asset-processing-service/resolve-integration-plugin.d.ts +4 -0
  449. package/src/services/assets/asset-processing-service/resolve-integration-plugin.js +15 -0
  450. package/src/services/assets/asset-processing-service/ungrouped-dependency-processing.d.ts +0 -1
  451. package/src/services/assets/asset-processing-service/ungrouped-dependency-processing.js +27 -44
  452. package/src/services/assets/browser-bundle.service.d.ts +27 -31
  453. package/src/services/assets/browser-bundle.service.js +54 -49
  454. package/src/services/assets/browser-runtime-asset-generation.d.ts +17 -0
  455. package/src/services/assets/browser-runtime-asset-generation.js +28 -0
  456. package/src/services/cache/cache.types.d.ts +4 -2
  457. package/src/services/cache/cache.types.js +5 -0
  458. package/src/services/cache/html-page-cache-dependency-index.d.ts +34 -0
  459. package/src/services/cache/html-page-cache-dependency-index.js +88 -0
  460. package/src/services/cache/index.d.ts +2 -0
  461. package/src/services/cache/index.js +8 -7
  462. package/src/services/cache/memory-cache-store.js +101 -89
  463. package/src/services/cache/page-cache-service.d.ts +31 -1
  464. package/src/services/cache/page-cache-service.js +237 -150
  465. package/src/services/cache/page-request-cache-coordinator.service.d.ts +2 -1
  466. package/src/services/cache/page-request-cache-coordinator.service.js +112 -102
  467. package/src/services/html/html-rewriter-provider.service.js +61 -61
  468. package/src/services/html/html-transformer.service.js +249 -266
  469. package/src/services/invalidation/development-invalidation.service.d.ts +15 -1
  470. package/src/services/invalidation/development-invalidation.service.js +241 -204
  471. package/src/services/module-loading/README.md +9 -6
  472. package/src/services/module-loading/app-module-loader.service.js +1 -0
  473. package/src/services/module-loading/app-server-module-transpiler.service.d.ts +8 -0
  474. package/src/services/module-loading/app-server-module-transpiler.service.js +104 -106
  475. package/src/services/module-loading/collection-server-module-build.service.d.ts +19 -0
  476. package/src/services/module-loading/collection-server-module-build.service.js +83 -0
  477. package/src/services/module-loading/host-module-loader-registry.js +6 -11
  478. package/src/services/module-loading/module-loading-types.js +1 -0
  479. package/src/services/module-loading/page-module-import.service.d.ts +7 -12
  480. package/src/services/module-loading/page-module-import.service.js +232 -206
  481. package/src/services/module-loading/route-module-build-cache-registry.d.ts +2 -0
  482. package/src/services/module-loading/route-module-build-cache-registry.js +59 -33
  483. package/src/services/module-loading/route-module-build-cache.js +3 -38
  484. package/src/services/module-loading/route-module-build-cache.store.d.ts +10 -0
  485. package/src/services/module-loading/route-module-build-cache.store.js +213 -196
  486. package/src/services/module-loading/route-module-build-manifest.d.ts +10 -14
  487. package/src/services/module-loading/route-module-build-manifest.js +54 -118
  488. package/src/services/module-loading/route-module-dependency-hasher.d.ts +2 -2
  489. package/src/services/module-loading/route-module-dependency-hasher.js +136 -109
  490. package/src/services/module-loading/server-module-transpiler.service.d.ts +1 -3
  491. package/src/services/module-loading/server-module-transpiler.service.js +65 -62
  492. package/src/services/module-loading/source-module-support.js +15 -7
  493. package/src/services/runtime-state/dev-graph.service.js +165 -157
  494. package/src/services/runtime-state/entrypoint-dependency-graph.service.js +85 -76
  495. package/src/services/runtime-state/server-invalidation-state.service.js +38 -30
  496. package/src/services/validation/schema-validation-service.d.ts +1 -4
  497. package/src/services/validation/schema-validation-service.js +156 -95
  498. package/src/services/validation/standard-schema.types.d.ts +9 -62
  499. package/src/services/validation/standard-schema.types.js +1 -0
  500. package/src/services/validation/validate-standard-schema.d.ts +7 -0
  501. package/src/services/validation/validate-standard-schema.js +14 -0
  502. package/src/static-site-generator/README.md +10 -2
  503. package/src/static-site-generator/production-page-browser-graph-prebuild.d.ts +32 -0
  504. package/src/static-site-generator/production-page-browser-graph-prebuild.js +57 -0
  505. package/src/static-site-generator/sitemap-routes.d.ts +14 -0
  506. package/src/static-site-generator/sitemap-routes.js +36 -0
  507. package/src/static-site-generator/sitemap.d.ts +15 -0
  508. package/src/static-site-generator/sitemap.js +42 -0
  509. package/src/static-site-generator/static-build-invalidation.d.ts +2 -2
  510. package/src/static-site-generator/static-build-invalidation.js +33 -74
  511. package/src/static-site-generator/static-export-context.d.ts +9 -1
  512. package/src/static-site-generator/static-export-context.js +1 -0
  513. package/src/static-site-generator/static-site-generator.d.ts +27 -6
  514. package/src/static-site-generator/static-site-generator.js +528 -389
  515. package/src/types/internal-types.d.ts +55 -17
  516. package/src/types/internal-types.js +1 -0
  517. package/src/types/public-types.d.ts +236 -95
  518. package/src/types/public-types.js +1 -0
  519. package/src/utils/deep-merge.js +39 -26
  520. package/src/utils/ecopages-route-info.d.ts +26 -0
  521. package/src/utils/ecopages-route-info.js +30 -0
  522. package/src/utils/hash.js +3 -6
  523. package/src/utils/html-escaping.d.ts +7 -0
  524. package/src/utils/html-escaping.js +22 -5
  525. package/src/utils/invariant.js +11 -10
  526. package/src/utils/locals-utils.js +32 -22
  527. package/src/utils/parse-cli-args.d.ts +1 -0
  528. package/src/utils/parse-cli-args.js +73 -62
  529. package/src/utils/path-pattern.d.ts +23 -0
  530. package/src/utils/path-pattern.js +42 -0
  531. package/src/utils/path-utils.module.js +8 -11
  532. package/src/utils/resolve-entry-file.js +70 -38
  533. package/src/utils/resolve-work-dir.js +23 -27
  534. package/src/utils/runtime.js +24 -33
  535. package/src/utils/server-utils.module.d.ts +3 -2
  536. package/src/utils/server-utils.module.js +60 -53
  537. package/src/utils/static-file-extensions.d.ts +12 -0
  538. package/src/utils/static-file-extensions.js +54 -0
  539. package/src/watchers/project-watcher-ignore.d.ts +11 -0
  540. package/src/watchers/project-watcher-ignore.js +17 -0
  541. package/src/watchers/project-watcher.d.ts +21 -6
  542. package/src/watchers/project-watcher.js +402 -277
  543. package/src/watchers/project-watcher.test-helpers.js +45 -50
  544. package/src/adapters/shared/api-response.js +0 -96
  545. package/src/adapters/shared/application-adapter.js +0 -90
  546. package/src/adapters/shared/bun-user-websocket-lifecycle.js +0 -102
  547. package/src/adapters/shared/copy-runtime-public-dir.js +0 -24
  548. package/src/adapters/shared/define-api-handler.d.ts +0 -25
  549. package/src/adapters/shared/define-api-handler.js +0 -15
  550. package/src/adapters/shared/explicit-static-render-preparation.js +0 -26
  551. package/src/adapters/shared/explicit-static-route-matcher.js +0 -101
  552. package/src/adapters/shared/file-route-middleware-pipeline.js +0 -90
  553. package/src/adapters/shared/fs-server-response-factory.js +0 -81
  554. package/src/adapters/shared/fs-server-response-matcher.js +0 -186
  555. package/src/adapters/shared/hmr-entrypoint-registrar.d.ts +0 -55
  556. package/src/adapters/shared/hmr-entrypoint-registrar.js +0 -87
  557. package/src/adapters/shared/hmr-html-response.js +0 -33
  558. package/src/adapters/shared/node-http-websocket-upgrades.js +0 -125
  559. package/src/adapters/shared/render-context.js +0 -93
  560. package/src/adapters/shared/runtime-app-bootstrap.js +0 -41
  561. package/src/adapters/shared/runtime-host.js +0 -0
  562. package/src/adapters/shared/server-adapter.js +0 -436
  563. package/src/adapters/shared/server-route-handler.js +0 -111
  564. package/src/adapters/shared/server-static-builder.js +0 -202
  565. package/src/adapters/shared/shared-hmr-manager.d.ts +0 -61
  566. package/src/adapters/shared/shared-hmr-manager.js +0 -273
  567. package/src/adapters/shared/static-preview-host.js +0 -0
  568. package/src/adapters/shared/websocket-lifecycle.d.ts +0 -3
  569. package/src/adapters/shared/websocket-lifecycle.js +0 -19
  570. package/src/build/browser-runtime-manifest.js +0 -61
  571. package/src/build/browser-runtime-plugin-helpers.js +0 -14
  572. package/src/build/browser-runtime-plugin.js +0 -173
  573. package/src/build/build-input-fingerprint.js +0 -31
  574. package/src/build/build-manifest.d.ts +0 -33
  575. package/src/build/build-manifest.js +0 -49
  576. package/src/build/build-types.js +0 -0
  577. package/src/build/jsx-ownership-plugins.d.ts +0 -10
  578. package/src/build/jsx-ownership-plugins.js +0 -17
  579. package/src/build/pages-unified-graph-build.js +0 -208
  580. package/src/build/parallel-build-executor.js +0 -52
  581. package/src/build/rolldown-adapter-helpers.js +0 -310
  582. package/src/build/rolldown-build-adapter.js +0 -67
  583. package/src/build/rolldown-build-invocation-metrics.js +0 -43
  584. package/src/build/rolldown-dev-build-adapter.d.ts +0 -82
  585. package/src/build/rolldown-dev-build-adapter.js +0 -182
  586. package/src/build/rolldown-plugin-bridge.js +0 -211
  587. package/src/build/rolldown-source-transform-pass.js +0 -58
  588. package/src/build/runtime-build-executor.d.ts +0 -15
  589. package/src/build/runtime-build-executor.js +0 -43
  590. package/src/build/runtime-build-output-normalizer.js +0 -203
  591. package/src/build/serialized-build-executor.js +0 -63
  592. package/src/build/server-entry-build-cache.js +0 -169
  593. package/src/build/server-side-css-shim-plugin.js +0 -35
  594. package/src/hmr/hmr.postcss.test.e2e.js +0 -31
  595. package/src/hmr/hmr.test.e2e.js +0 -54
  596. package/src/integrations/ghtml/ghtml-renderer.js +0 -57
  597. package/src/integrations/ghtml/ghtml.constants.d.ts +0 -1
  598. package/src/integrations/ghtml/ghtml.constants.js +0 -4
  599. package/src/integrations/ghtml/ghtml.plugin.d.ts +0 -16
  600. package/src/integrations/ghtml/ghtml.plugin.js +0 -20
  601. package/src/route-renderer/orchestration/component-render-context.js +0 -147
  602. package/src/route-renderer/orchestration/declared-ownership-graph.d.ts +0 -18
  603. package/src/route-renderer/orchestration/declared-ownership-graph.js +0 -34
  604. package/src/route-renderer/orchestration/foreign-subtree-execution.service.js +0 -231
  605. package/src/route-renderer/orchestration/ownership-planning.service.d.ts +0 -24
  606. package/src/route-renderer/orchestration/ownership-planning.service.js +0 -63
  607. package/src/route-renderer/orchestration/ownership-validation.service.js +0 -53
  608. package/src/route-renderer/orchestration/processed-asset-dedupe.js +0 -27
  609. package/src/route-renderer/orchestration/queued-foreign-subtree-resolution.service.d.ts +0 -91
  610. package/src/route-renderer/orchestration/queued-foreign-subtree-resolution.service.js +0 -170
  611. package/src/route-renderer/orchestration/render-output.utils.js +0 -175
  612. package/src/route-renderer/orchestration/route-render-orchestrator.js +0 -578
  613. package/src/route-renderer/orchestration/template-serialization.d.ts +0 -38
  614. package/src/route-renderer/orchestration/template-serialization.js +0 -45
  615. package/src/utils/html.d.ts +0 -1
  616. package/src/utils/html.js +0 -4
  617. /package/src/adapters/{shared → bun}/bun-user-websocket-lifecycle.d.ts +0 -0
  618. /package/src/adapters/shared/{copy-runtime-public-dir.d.ts → runtime/copy-runtime-public-dir.d.ts} +0 -0
  619. /package/src/adapters/shared/{runtime-host.d.ts → runtime/runtime-host.d.ts} +0 -0
  620. /package/src/{hmr/hmr.postcss.test.e2e.d.ts → adapters/shared/runtime/runtime-host.js} +0 -0
  621. /package/src/{hmr/hmr.test.e2e.d.ts → adapters/shared/runtime/static-preview-host.js} +0 -0
  622. /package/src/build/{build-types.d.ts → contracts/build-types.d.ts} +0 -0
  623. /package/src/build/{runtime-build-output-normalizer.d.ts → rolldown/runtime-build-output-normalizer.d.ts} +0 -0
  624. /package/src/build/{server-side-css-shim-plugin.d.ts → rolldown/server-side-css-shim-plugin.d.ts} +0 -0
@@ -1,670 +1,590 @@
1
- import path from "node:path";
2
- import { DEFAULT_ECOPAGES_HOSTNAME, DEFAULT_ECOPAGES_PORT } from "../../config/constants.js";
3
- import { RESOLVED_ASSETS_DIR } from "../../config/constants.js";
4
- import { appLogger } from "../../global/app-logger.js";
5
- import { HttpError } from "../../errors/http-error.js";
6
- import { createRequire } from "../../utils/locals-utils.js";
7
- import { findWebSocketRoute } from "../abstract/ws-pattern-matcher.js";
8
- import { fileSystem } from "@ecopages/file-system";
9
- import { getAppBrowserBuildPlugins, setupAppRuntimePlugins } from "../../build/build-adapter.js";
10
- import { installAppRuntimeBuildExecutor } from "../../build/runtime-build-executor.js";
11
- import { StaticSiteGenerator } from "../../static-site-generator/static-site-generator.js";
12
- import { ProjectWatcher } from "../../watchers/project-watcher.js";
13
- import { SharedServerAdapter } from "../shared/server-adapter.js";
14
- import { ApiResponseBuilder } from "../shared/api-response.js";
15
- import { ServerStaticBuilder } from "../shared/server-static-builder.js";
16
- import {
17
- injectHmrRuntimeIntoHtmlResponse,
18
- isHtmlResponse,
19
- shouldInjectHmrHtmlResponse
20
- } from "../shared/hmr-html-response.js";
21
- import { attachNodeHttpWebSocketUpgrades } from "../shared/node-http-websocket-upgrades.js";
22
- import { createBunUserWebSocketLifecycle } from "../shared/bun-user-websocket-lifecycle.js";
23
- import { resolveServeRuntimeOrigin } from "../shared/runtime-app-bootstrap.js";
24
- import { copyRuntimePublicDirIfChanged } from "../shared/copy-runtime-public-dir.js";
25
- import { ClientBridge } from "./client-bridge.js";
26
- import { HmrManager } from "./hmr-manager.js";
27
- import { BunStaticPreviewHost } from "./static-preview-host.js";
28
- class BunServerAdapter extends SharedServerAdapter {
29
- apiHandlers;
30
- staticRoutes;
31
- errorHandler;
32
- bridge;
33
- hmrManager;
34
- initializationPromise = null;
35
- fullyInitialized = false;
36
- projectWatcher = null;
37
- adapterDisposed = false;
38
- previewHost;
39
- /**
40
- * Reference to the application-level WebSocket handlers map.
41
- *
42
- * @remarks
43
- * This is a reference to the map owned by `AbstractApplicationAdapter`,
44
- * passed in via the constructor. The Bun adapter reads from it to wire
45
- * WebSocket upgrades for user-registered patterns.
46
- */
47
- websocketHandlers = /* @__PURE__ */ new Map();
48
- /**
49
- * Adapts a Bun ServerWebSocket to the public EcopagesSocket interface.
50
- *
51
- * @remarks
52
- * This is the single source of truth for the Bun→public type adaptation.
53
- * Both the HMR and production branches use this helper to ensure consistency.
54
- *
55
- * @param ws - The raw Bun ServerWebSocket
56
- * @param kind - The registered route pattern
57
- * @param params - Dynamic path parameters
58
- * @param search - Query string parameters
59
- * @param context - The resolved per-connection context
60
- * @returns An EcopagesSocket view
61
- */
62
- adaptBunWebSocket(ws, kind, params, search, context) {
63
- return {
64
- kind,
65
- params,
66
- search,
67
- context,
68
- send: (message) => {
69
- if (typeof message === "string") {
70
- ws.send(message);
71
- } else if (message instanceof Blob) {
72
- void message.arrayBuffer().then((buf) => ws.send(new Uint8Array(buf)));
73
- } else if (message instanceof ArrayBuffer) {
74
- ws.send(new Uint8Array(message));
75
- } else if (ArrayBuffer.isView(message)) {
76
- ws.send(new Uint8Array(message.buffer, message.byteOffset, message.byteLength));
77
- } else {
78
- ws.send(message);
1
+ import path from 'node:path';
2
+ import { DEFAULT_ECOPAGES_HOSTNAME, DEFAULT_ECOPAGES_PORT } from '../../config/constants.js';
3
+ import { appLogger } from '../../global/app-logger.js';
4
+ import { HttpError } from '../../errors/http-error.js';
5
+ import { createRequire } from '../../utils/locals-utils.js';
6
+ import { findWebSocketRoute } from '../abstract/ws-pattern-matcher.js';
7
+ import { fileSystem } from '@ecopages/file-system';
8
+ import { setupAppRuntimePlugins } from '../../build/build-adapter.js';
9
+ import { installBuildRuntime } from '../../build/runtime/build-runtime.js';
10
+ import { StaticSiteGenerator } from '../../static-site-generator/static-site-generator.js';
11
+ import { ProjectWatcher } from '../../watchers/project-watcher.js';
12
+ import { SharedServerAdapter } from '../shared/runtime/server-adapter.js';
13
+ import { ApiResponseBuilder } from '../shared/http/api-response.js';
14
+ import { ServerStaticBuilder } from '../shared/runtime/server-static-builder.js';
15
+ import { attachNodeHttpWebSocketUpgrades } from '../shared/ws/node-http-websocket-upgrades.js';
16
+ import { createBunUserWebSocketLifecycle } from './bun-user-websocket-lifecycle.js';
17
+ import { createEcopagesSocket } from '../shared/ws/websocket-lifecycle.js';
18
+ import { resolveServeRuntimeOrigin } from '../shared/runtime/runtime-app-bootstrap.js';
19
+ import { attachHmrToIntegrations, disposeDevResources, prepareRuntimePublicDir, startDevWarmup, } from '../shared/runtime/runtime-server-lifecycle.js';
20
+ import { ClientBridge } from './client-bridge.js';
21
+ import { setAppDevClientBridge } from '../../dev/client-bridge-registry.js';
22
+ import { setAppHmrManager } from '../../dev/hmr-manager-registry.js';
23
+ import { HmrManager } from './hmr-manager.js';
24
+ import { BunStaticPreviewHost } from './static-preview-host.js';
25
+ /**
26
+ * Bun transport adapter that wires shared Ecopages request handling onto a live
27
+ * `Bun.serve()` runtime.
28
+ *
29
+ * @remarks
30
+ * The adapter owns Bun-specific concerns that do not exist in the shared server
31
+ * abstraction: websocket-backed HMR transport, runtime plugin registration, and
32
+ * preview-host startup for static builds. Routing, rendering, and response
33
+ * composition still delegate to the shared server adapter base.
34
+ */
35
+ export class BunServerAdapter extends SharedServerAdapter {
36
+ apiHandlers;
37
+ staticRoutes;
38
+ errorHandler;
39
+ bridge;
40
+ hmrManager;
41
+ initializationPromise = null;
42
+ fullyInitialized = false;
43
+ projectWatcher = null;
44
+ adapterDisposed = false;
45
+ deferRuntimeAssetSetup;
46
+ allowPortFallback;
47
+ previewHost;
48
+ /**
49
+ * Reference to the application-level WebSocket handlers map.
50
+ *
51
+ * @remarks
52
+ * This is a reference to the map owned by `AbstractApplicationAdapter`,
53
+ * passed in via the constructor. The Bun adapter reads from it to wire
54
+ * WebSocket upgrades for user-registered patterns.
55
+ */
56
+ websocketHandlers = new Map();
57
+ registerBunRuntimePlugin(plugin) {
58
+ Bun.plugin(plugin);
59
+ }
60
+ adaptBunWebSocket(ws, kind, params, search, context) {
61
+ return createEcopagesSocket({
62
+ send: (data) => ws.send(data),
63
+ close: (code, reason) => ws.close(code, reason),
64
+ }, { kind, params, search, context });
65
+ }
66
+ /**
67
+ * Resolves the per-connection context for a Bun user connection.
68
+ *
69
+ * @remarks
70
+ * `context()` is invoked exactly once per accepted connection. Its
71
+ * resolved value is shared by all subsequent lifecycle hooks. If
72
+ * `context()` throws, the connection is closed immediately with code
73
+ * 1011 (server error) and the error is logged.
74
+ *
75
+ * @param request - The original upgrade request (best-effort reconstructed)
76
+ * @param handler - The registered handler
77
+ * @param kind - The registered route pattern
78
+ * @param params - Dynamic path parameters
79
+ * @param search - Query string parameters
80
+ * @returns The resolved per-connection context
81
+ */
82
+ async resolveBunContext(request, handler, kind, params, search) {
83
+ if (!handler.context) {
84
+ return undefined;
79
85
  }
80
- },
81
- sendStream: async (stream) => {
82
- const reader = stream.getReader();
83
86
  try {
84
- while (true) {
85
- const { value, done } = await reader.read();
86
- if (done) break;
87
- if (value) ws.send(value);
88
- }
89
- } finally {
90
- reader.releaseLock();
87
+ return (await handler.context({ request, kind, params, search }));
88
+ }
89
+ catch (error) {
90
+ appLogger.error(`[WS:${kind}] context() failed; closing connection.`, error);
91
+ throw error;
91
92
  }
92
- },
93
- close: (code, reason) => ws.close(code, reason)
94
- };
95
- }
96
- /**
97
- * Resolves the per-connection context for a Bun user connection.
98
- *
99
- * @remarks
100
- * `context()` is invoked exactly once per accepted connection. Its
101
- * resolved value is shared by all subsequent lifecycle hooks. If
102
- * `context()` throws, the connection is closed immediately with code
103
- * 1011 (server error) and the error is logged.
104
- *
105
- * @param request - The original upgrade request (best-effort reconstructed)
106
- * @param handler - The registered handler
107
- * @param kind - The registered route pattern
108
- * @param params - Dynamic path parameters
109
- * @param search - Query string parameters
110
- * @returns The resolved per-connection context
111
- */
112
- async resolveBunContext(request, handler, kind, params, search) {
113
- if (!handler.context) {
114
- return void 0;
115
- }
116
- try {
117
- return await handler.context({ request, kind, params, search });
118
- } catch (error) {
119
- appLogger.error(`[WS:${kind}] context() failed; closing connection.`, error);
120
- throw error;
121
93
  }
122
- }
123
- /**
124
- * Creates a Bun server adapter with already-resolved runtime collaborators.
125
- *
126
- * @remarks
127
- * The public params interface keeps `hmrManager`, `bridge`, and `previewHost`
128
- * optional so factory callers can omit them. By the time the concrete adapter
129
- * is constructed, those collaborators are mandatory because the adapter cannot
130
- * initialize Bun HMR or preview flows without them.
131
- */
132
- constructor({
133
- appConfig,
134
- runtimeOrigin,
135
- serveOptions,
136
- apiHandlers,
137
- staticRoutes,
138
- errorHandler,
139
- websocketHandlers,
140
- options,
141
- hmrManager,
142
- bridge,
143
- previewHost
144
- }) {
145
- super({ appConfig, runtimeOrigin, serveOptions, options });
146
- this.apiHandlers = apiHandlers || [];
147
- this.staticRoutes = staticRoutes || [];
148
- this.errorHandler = errorHandler;
149
- this.bridge = bridge;
150
- this.hmrManager = hmrManager;
151
- this.previewHost = previewHost;
152
- if (websocketHandlers) {
153
- this.websocketHandlers = websocketHandlers;
94
+ /**
95
+ * Creates a Bun server adapter with already-resolved runtime collaborators.
96
+ *
97
+ * @remarks
98
+ * The public params interface keeps `hmrManager`, `bridge`, and `previewHost`
99
+ * optional so factory callers can omit them. By the time the concrete adapter
100
+ * is constructed, those collaborators are mandatory because the adapter cannot
101
+ * initialize Bun HMR or preview flows without them.
102
+ */
103
+ constructor({ appConfig, runtimeOrigin, serveOptions, apiHandlers, staticRoutes, errorHandler, websocketHandlers, options, hostOwnsDevClient, deferRuntimeAssetSetup, allowPortFallback, hmrManager, bridge, previewHost, }) {
104
+ super({ appConfig, runtimeOrigin, serveOptions, options });
105
+ this.deferRuntimeAssetSetup = deferRuntimeAssetSetup === true;
106
+ this.allowPortFallback = allowPortFallback !== false;
107
+ this.apiHandlers = apiHandlers || [];
108
+ this.staticRoutes = staticRoutes || [];
109
+ this.errorHandler = errorHandler;
110
+ this.bridge = bridge;
111
+ this.hmrManager = hmrManager;
112
+ this.previewHost = previewHost;
113
+ this.hostOwnsDevClient = hostOwnsDevClient === true;
114
+ if (websocketHandlers) {
115
+ this.websocketHandlers = websocketHandlers;
116
+ }
154
117
  }
155
- }
156
- /**
157
- * Wires user WebSocket routes onto a Node HTTP server used by host integrations.
158
- */
159
- attachUserWebSocketUpgrades(server, options) {
160
- attachNodeHttpWebSocketUpgrades(server, {
161
- runtimeOrigin: this.runtimeOrigin,
162
- websocketHandlers: this.websocketHandlers,
163
- passthroughUnmatched: options?.passthroughUnmatched
164
- });
165
- }
166
- /**
167
- * Returns whether adapter-level HTML responses still need HMR runtime injection.
168
- *
169
- * @remarks
170
- * Filesystem-routed pages are wrapped later in the shared route layer. This
171
- * adapter-level check exists for explicit API handlers that return HTML and
172
- * would otherwise bypass the route wrapper entirely.
173
- */
174
- shouldInjectHmrScript() {
175
- return shouldInjectHmrHtmlResponse(this.options?.watch === true, this.hmrManager);
176
- }
177
- /**
178
- * Delegates the HTML-response test to the shared response helper used by both
179
- * adapters.
180
- */
181
- isHtmlResponse(response) {
182
- return isHtmlResponse(response);
183
- }
184
- /**
185
- * Injects HMR script into HTML responses in development mode.
186
- * Ensures explicit API handlers that return HTML get auto-reload capability.
187
- */
188
- async maybeInjectHmrScript(response) {
189
- if (this.shouldInjectHmrScript() && this.isHtmlResponse(response)) {
190
- return injectHmrRuntimeIntoHtmlResponse(response);
118
+ /**
119
+ * Wires user WebSocket routes onto a Node HTTP server used by host integrations.
120
+ */
121
+ attachUserWebSocketUpgrades(server, options) {
122
+ attachNodeHttpWebSocketUpgrades(server, {
123
+ runtimeOrigin: this.runtimeOrigin,
124
+ websocketHandlers: this.websocketHandlers,
125
+ passthroughUnmatched: options?.passthroughUnmatched,
126
+ });
191
127
  }
192
- return response;
193
- }
194
- /**
195
- * Initializes the server adapter's core runtime components.
196
- */
197
- async initialize() {
198
- installAppRuntimeBuildExecutor(this.appConfig);
199
- this.staticSiteGenerator = new StaticSiteGenerator({ appConfig: this.appConfig });
200
- if (this.options?.watch) {
201
- await this.hmrManager.buildRuntime();
128
+ /**
129
+ * Initializes the server adapter's core runtime components.
130
+ */
131
+ async initialize() {
132
+ installBuildRuntime(this.appConfig);
133
+ this.staticSiteGenerator = new StaticSiteGenerator({ appConfig: this.appConfig });
134
+ prepareRuntimePublicDir(this.appConfig);
135
+ const staticBuilderOptions = {
136
+ appConfig: this.appConfig,
137
+ staticSiteGenerator: this.staticSiteGenerator,
138
+ serveOptions: this.serveOptions,
139
+ runtimeOrigin: this.runtimeOrigin,
140
+ needsServerBundle: this.apiHandlers.length > 0 || this.websocketHandlers.size > 0,
141
+ hmrManager: this.hmrManager,
142
+ onRuntimePlugin: (plugin) => {
143
+ this.registerBunRuntimePlugin(plugin);
144
+ },
145
+ };
146
+ this.staticBuilder = new ServerStaticBuilder(staticBuilderOptions);
147
+ if (!this.deferRuntimeAssetSetup) {
148
+ await this.initializeRuntimePlugins({ watch: this.options?.watch });
149
+ }
150
+ if (this.options?.watch) {
151
+ await this.hmrManager.ensureRuntimeReady();
152
+ }
202
153
  }
203
- this.prepareRuntimePublicDir();
204
- const staticBuilderOptions = {
205
- appConfig: this.appConfig,
206
- staticSiteGenerator: this.staticSiteGenerator,
207
- serveOptions: this.serveOptions,
208
- apiHandlers: this.apiHandlers
209
- };
210
- this.staticBuilder = new ServerStaticBuilder(staticBuilderOptions);
211
- await this.initializeRuntimePlugins({ watch: this.options?.watch });
212
- }
213
- /**
214
- * Copies the source `public` directory into the runtime output and ensures the
215
- * HMR assets directory exists before any runtime bundles are emitted.
216
- */
217
- prepareRuntimePublicDir() {
218
- const srcPublicDir = path.join(this.appConfig.rootDir, this.appConfig.srcDir, this.appConfig.publicDir);
219
- if (fileSystem.exists(srcPublicDir)) {
220
- copyRuntimePublicDirIfChanged(srcPublicDir, path.join(this.appConfig.rootDir, this.appConfig.distDir));
154
+ /**
155
+ * Registers runtime plugins and propagates the final HMR manager into each
156
+ * integration.
157
+ *
158
+ * @remarks
159
+ * This is where Bun's runtime-plugin registration path meets the integration
160
+ * lifecycle. A failure here leaves the runtime partially bootstrapped, so the
161
+ * method logs the underlying error and rethrows instead of trying to limp on.
162
+ */
163
+ async initializeRuntimePlugins(options) {
164
+ try {
165
+ this.hmrManager.setEnabled(Boolean(options?.watch));
166
+ await setupAppRuntimePlugins({
167
+ appConfig: this.appConfig,
168
+ runtimeOrigin: this.runtimeOrigin,
169
+ onRuntimePlugin: (plugin) => {
170
+ this.registerBunRuntimePlugin(plugin);
171
+ },
172
+ });
173
+ if (options?.watch) {
174
+ attachHmrToIntegrations(this.appConfig, this.hmrManager);
175
+ }
176
+ }
177
+ catch (error) {
178
+ appLogger.error(`Failed to initialize plugins: ${error instanceof Error ? error.message : String(error)}`);
179
+ throw error;
180
+ }
221
181
  }
222
- fileSystem.ensureDir(path.join(this.appConfig.absolutePaths.distDir, RESOLVED_ASSETS_DIR));
223
- }
224
- /**
225
- * Registers runtime plugins and propagates the final HMR manager into each
226
- * integration.
227
- *
228
- * @remarks
229
- * This is where Bun's runtime-plugin registration path meets the integration
230
- * lifecycle. A failure here leaves the runtime partially bootstrapped, so the
231
- * method logs the underlying error and rethrows instead of trying to limp on.
232
- */
233
- async initializeRuntimePlugins(options) {
234
- try {
235
- this.hmrManager.setEnabled(Boolean(options?.watch));
236
- await setupAppRuntimePlugins({
237
- appConfig: this.appConfig,
238
- runtimeOrigin: this.runtimeOrigin,
239
- hmrManager: this.hmrManager,
240
- onRuntimePlugin: (plugin) => {
241
- Bun.plugin(plugin);
182
+ /**
183
+ * Rebuilds the shared routing state and hot-reloads the live Bun server when a
184
+ * watched route file changes.
185
+ */
186
+ async refreshRouterRoutes() {
187
+ if (!this.serverInstance || typeof this.serverInstance.reload !== 'function') {
188
+ appLogger.error('Server instance is not available for reloading');
189
+ return;
242
190
  }
243
- });
244
- const browserBuildPlugins = getAppBrowserBuildPlugins(this.appConfig);
245
- this.hmrManager.setPlugins(browserBuildPlugins);
246
- for (const integration of this.appConfig.integrations) {
247
- integration.setHmrManager(this.hmrManager);
248
- }
249
- } catch (error) {
250
- appLogger.error(`Failed to initialize plugins: ${error instanceof Error ? error.message : String(error)}`);
251
- throw error;
191
+ await this.createSharedWatchRefreshCallback({
192
+ staticRoutes: this.staticRoutes,
193
+ hmrManager: this.hmrManager,
194
+ onRoutesReady: () => {
195
+ const options = this.getServerOptions({ enableHmr: true });
196
+ this.serverInstance.reload(options);
197
+ appLogger.debug('Server routes updated with dynamic routes');
198
+ },
199
+ onError: (error) => {
200
+ this.hmrManager.broadcast({ type: 'error', message: error.message });
201
+ appLogger.error('Failed to refresh router routes:', error);
202
+ },
203
+ })();
252
204
  }
253
- }
254
- /**
255
- * Rebuilds the shared routing state and hot-reloads the live Bun server when a
256
- * watched route file changes.
257
- */
258
- async refreshRouterRoutes() {
259
- if (!this.serverInstance || typeof this.serverInstance.reload !== "function") {
260
- appLogger.error("Server instance is not available for reloading");
261
- return;
205
+ async watch() {
206
+ const watcher = new ProjectWatcher({
207
+ config: this.appConfig,
208
+ refreshRouterRoutesCallback: this.refreshRouterRoutes.bind(this),
209
+ hmrManager: this.hmrManager,
210
+ bridge: this.bridge,
211
+ hostOwnsDevClient: this.hostOwnsDevClient,
212
+ });
213
+ this.projectWatcher = watcher;
214
+ await watcher.createWatcherSubscription();
262
215
  }
263
- await this.createSharedWatchRefreshCallback({
264
- staticRoutes: this.staticRoutes,
265
- hmrManager: this.hmrManager,
266
- onRoutesReady: () => {
267
- const options = this.getServerOptions({ enableHmr: true });
268
- this.serverInstance.reload(options);
269
- appLogger.debug("Server routes updated with dynamic routes");
270
- },
271
- onError: (error) => {
272
- this.hmrManager.broadcast({ type: "error", message: error.message });
273
- appLogger.error("Failed to refresh router routes:", error);
274
- }
275
- })();
276
- }
277
- async watch() {
278
- const watcher = new ProjectWatcher({
279
- config: this.appConfig,
280
- refreshRouterRoutesCallback: this.refreshRouterRoutes.bind(this),
281
- hmrManager: this.hmrManager,
282
- bridge: this.bridge
283
- });
284
- this.projectWatcher = watcher;
285
- await watcher.createWatcherSubscription();
286
- }
287
- /**
288
- * Builds the `Bun.serve()` options for the current adapter state.
289
- *
290
- * @remarks
291
- * When HMR is enabled the websocket dispatcher merges HMR and user handlers,
292
- * routing by the `kind` field embedded in socket data at upgrade time.
293
- * This prevents user-registered websocket handlers from being silently overwritten
294
- * by the HMR handler in development mode.
295
- *
296
- * User WebSocket paths are intercepted in the fetch handler via the pattern matcher.
297
- * The upgrade happens implicitly — no manual GET route registration needed.
298
- */
299
- getServerOptions({ enableHmr = false } = {}) {
300
- appLogger.debug(`[BunServerAdapter] getServerOptions called with enableHmr: ${enableHmr}`);
301
- const serverOptions = this.buildServerSettings();
302
- if (enableHmr) {
303
- const originalFetch = serverOptions.fetch;
304
- const hmrHandler = this.hmrManager.getWebSocketHandler();
305
- const hmrManager = this.hmrManager;
306
- const matchRoute = (pathname) => findWebSocketRoute(this.websocketHandlers, pathname);
307
- const userLifecycle = createBunUserWebSocketLifecycle({
308
- runtimeOrigin: this.runtimeOrigin,
309
- userHandlers: this.websocketHandlers,
310
- resolveContext: this.resolveBunContext.bind(this),
311
- adaptSocket: (ws, kind, params, search, context) => this.adaptBunWebSocket(ws, kind, params, search, context)
312
- });
313
- serverOptions.development = true;
314
- serverOptions.websocket = {
315
- open(ws) {
316
- const kind = ws.data?.kind ?? "__hmr__";
317
- if (kind === "__hmr__") {
318
- hmrHandler.open?.(ws);
319
- return;
320
- }
321
- userLifecycle.open(ws);
322
- },
323
- message(ws, msg) {
324
- const kind = ws.data?.kind ?? "__hmr__";
325
- if (kind === "__hmr__") {
326
- hmrHandler.message?.(ws, msg);
327
- return;
328
- }
329
- userLifecycle.message(ws, msg);
330
- },
331
- close(ws, code, reason) {
332
- const kind = ws.data?.kind ?? "__hmr__";
333
- if (kind === "__hmr__") {
334
- hmrHandler.close?.(ws, code, reason);
335
- return;
336
- }
337
- userLifecycle.close(ws, code, reason);
338
- },
339
- error(ws, error) {
340
- const kind = ws.data?.kind ?? "__hmr__";
341
- if (kind === "__hmr__") {
342
- appLogger.error("[HMR] WebSocket error:", error);
343
- return;
344
- }
345
- userLifecycle.error(ws, error);
216
+ /**
217
+ * Builds the `Bun.serve()` options for the current adapter state.
218
+ *
219
+ * @remarks
220
+ * When HMR is enabled the websocket dispatcher merges HMR and user handlers,
221
+ * routing by the `kind` field embedded in socket data at upgrade time.
222
+ * This prevents user-registered websocket handlers from being silently overwritten
223
+ * by the HMR handler in development mode.
224
+ *
225
+ * User WebSocket paths are intercepted in the fetch handler via the pattern matcher.
226
+ * The upgrade happens implicitly — no manual GET route registration needed.
227
+ */
228
+ getServerOptions({ enableHmr = false } = {}) {
229
+ appLogger.debug(`[BunServerAdapter] getServerOptions called with enableHmr: ${enableHmr}`);
230
+ const serverOptions = this.buildServerSettings();
231
+ const hasUserWs = this.websocketHandlers.size > 0;
232
+ if (!enableHmr && !hasUserWs) {
233
+ return serverOptions;
346
234
  }
347
- };
348
- serverOptions.fetch = async function(request, _server) {
349
- const url = new URL(request.url);
350
- appLogger.debug(`[HMR] Request: ${url.pathname}`);
351
- if (url.pathname === "/_hmr") {
352
- const success = this.upgrade(request, {
353
- data: { kind: "__hmr__", params: {}, search: {} }
354
- });
355
- if (success) return;
356
- return new Response("WebSocket upgrade failed", { status: 400 });
235
+ const userLifecycle = this.createBunUserLifecycle();
236
+ if (enableHmr) {
237
+ serverOptions.development = true;
238
+ serverOptions.websocket = this.createHmrAwareWebSocketHandler(userLifecycle);
357
239
  }
358
- if (url.pathname === "/_hmr_runtime.js") {
359
- appLogger.debug(`[HMR] Serving runtime from ${hmrManager.getRuntimePath()}`);
360
- return new Response(fileSystem.readFileAsBuffer(hmrManager.getRuntimePath()), {
361
- headers: { "Content-Type": "application/javascript" }
362
- });
240
+ else {
241
+ serverOptions.websocket = userLifecycle;
363
242
  }
364
- const wsMatch = matchRoute(url.pathname);
365
- if (wsMatch && request.headers.get("upgrade")?.toLowerCase() === "websocket") {
366
- const search = Object.fromEntries(url.searchParams.entries());
367
- const success = this.upgrade(request, {
368
- data: {
369
- kind: wsMatch.kind,
370
- params: wsMatch.params,
371
- search,
372
- upgradeUrl: request.url
243
+ serverOptions.fetch = this.wrapFetchWithWebSocketUpgrades(serverOptions.fetch, {
244
+ serveHmrEndpoints: enableHmr,
245
+ });
246
+ return serverOptions;
247
+ }
248
+ createBunUserLifecycle() {
249
+ return createBunUserWebSocketLifecycle({
250
+ runtimeOrigin: this.runtimeOrigin,
251
+ userHandlers: this.websocketHandlers,
252
+ resolveContext: this.resolveBunContext.bind(this),
253
+ adaptSocket: (ws, kind, params, search, context) => this.adaptBunWebSocket(ws, kind, params, search, context),
254
+ });
255
+ }
256
+ /**
257
+ * @remarks
258
+ * HMR and user sockets share one Bun `websocket` handler. Upgrade tags HMR
259
+ * connections with `kind: '__hmr__'`; everything else routes to the user lifecycle.
260
+ */
261
+ createHmrAwareWebSocketHandler(userLifecycle) {
262
+ const hmrHandler = this.hmrManager.getWebSocketHandler();
263
+ const isHmrSocket = (ws) => (ws.data?.kind ?? '__hmr__') === '__hmr__';
264
+ return {
265
+ open(ws) {
266
+ if (isHmrSocket(ws))
267
+ return void hmrHandler.open?.(ws);
268
+ userLifecycle.open(ws);
269
+ },
270
+ message(ws, msg) {
271
+ if (isHmrSocket(ws))
272
+ return void hmrHandler.message?.(ws, msg);
273
+ userLifecycle.message(ws, msg);
274
+ },
275
+ close(ws, code, reason) {
276
+ if (isHmrSocket(ws))
277
+ return void hmrHandler.close?.(ws, code, reason);
278
+ userLifecycle.close(ws, code, reason);
279
+ },
280
+ error(ws, error) {
281
+ if (isHmrSocket(ws))
282
+ return void appLogger.error('[HMR] WebSocket error:', error);
283
+ userLifecycle.error(ws, error);
284
+ },
285
+ };
286
+ }
287
+ /**
288
+ * @remarks
289
+ * When `serveHmrEndpoints` is set, `/_hmr` is checked before user websocket
290
+ * patterns so HMR upgrades are never captured by app routes. Runtime assets are
291
+ * served by `SharedServerAdapter.handleSharedRequest` via `tryHandleAssetRequest`.
292
+ * Production mode with only user handlers skips the HMR branch entirely.
293
+ */
294
+ wrapFetchWithWebSocketUpgrades(originalFetch, { serveHmrEndpoints }) {
295
+ const matchRoute = (pathname) => findWebSocketRoute(this.websocketHandlers, pathname);
296
+ return async function (request, server) {
297
+ const url = new URL(request.url);
298
+ if (serveHmrEndpoints) {
299
+ if (url.pathname === '/_hmr') {
300
+ const success = this.upgrade(request, { data: { kind: '__hmr__', params: {}, search: {} } });
301
+ return success ? undefined : new Response('WebSocket upgrade failed', { status: 400 });
302
+ }
373
303
  }
374
- });
375
- if (success) return;
376
- return new Response("WebSocket upgrade failed", { status: 400 });
377
- }
378
- let response;
379
- if (originalFetch) {
380
- const res = await originalFetch.call(this, request, this);
381
- response = res instanceof Response ? res : new Response("Not Found", { status: 404 });
382
- } else {
383
- response = new Response("Not Found", { status: 404 });
384
- }
385
- return response;
386
- };
387
- } else if (this.websocketHandlers.size > 0) {
388
- const matchRoute = (pathname) => findWebSocketRoute(this.websocketHandlers, pathname);
389
- const userLifecycle = createBunUserWebSocketLifecycle({
390
- runtimeOrigin: this.runtimeOrigin,
391
- userHandlers: this.websocketHandlers,
392
- resolveContext: this.resolveBunContext.bind(this),
393
- adaptSocket: (ws, kind, params, search, context) => this.adaptBunWebSocket(ws, kind, params, search, context)
394
- });
395
- serverOptions.websocket = userLifecycle;
396
- const originalFetch = serverOptions.fetch;
397
- serverOptions.fetch = async function(request, _server) {
398
- const url = new URL(request.url);
399
- const wsMatch = matchRoute(url.pathname);
400
- if (wsMatch && request.headers.get("upgrade")?.toLowerCase() === "websocket") {
401
- const search = Object.fromEntries(url.searchParams.entries());
402
- const success = this.upgrade(request, {
403
- data: {
404
- kind: wsMatch.kind,
405
- params: wsMatch.params,
406
- search,
407
- upgradeUrl: request.url
304
+ const wsMatch = matchRoute(url.pathname);
305
+ if (wsMatch && request.headers.get('upgrade')?.toLowerCase() === 'websocket') {
306
+ const search = Object.fromEntries(url.searchParams.entries());
307
+ const success = this.upgrade(request, {
308
+ data: { kind: wsMatch.kind, params: wsMatch.params, search, upgradeUrl: request.url },
309
+ });
310
+ return success ? undefined : new Response('WebSocket upgrade failed', { status: 400 });
311
+ }
312
+ if (!originalFetch) {
313
+ return new Response('Not Found', { status: 404 });
408
314
  }
409
- });
410
- if (success) return;
411
- return new Response("WebSocket upgrade failed", { status: 400 });
315
+ const res = await originalFetch.call(this, request, server);
316
+ return res instanceof Response ? res : new Response('Not Found', { status: 404 });
317
+ };
318
+ }
319
+ /**
320
+ * Composes the base Bun server settings that all runtime modes build from.
321
+ *
322
+ * @remarks
323
+ * This method centralizes the Bun-specific error boundary. It preserves the
324
+ * shared route pipeline while still allowing adapter-level custom error-handler
325
+ * execution and `HttpError` passthrough.
326
+ */
327
+ buildServerSettings() {
328
+ const serverOptions = { ...this.serveOptions };
329
+ const handleNoMatch = this.handleNoMatch.bind(this);
330
+ const waitForInit = this.waitForInitialization.bind(this);
331
+ const handleReq = this.handleRequest.bind(this);
332
+ const errorHandler = this.errorHandler;
333
+ const getCacheService = () => this.getCacheService();
334
+ const getRenderContext = () => this.getRenderContext();
335
+ appLogger.debug(`[BunServerAdapter] Building server settings`);
336
+ const finalOptions = {
337
+ ...serverOptions,
338
+ async fetch(request, _server) {
339
+ try {
340
+ await waitForInit();
341
+ return await handleReq(request);
342
+ }
343
+ catch (error) {
344
+ if (error instanceof Response)
345
+ return error;
346
+ if (errorHandler) {
347
+ try {
348
+ const locals = {};
349
+ const context = {
350
+ request,
351
+ params: {},
352
+ response: new ApiResponseBuilder(),
353
+ server: _server,
354
+ locals,
355
+ require: createRequire(() => locals),
356
+ services: {
357
+ cache: getCacheService(),
358
+ },
359
+ ...getRenderContext(),
360
+ };
361
+ return await errorHandler(error, context);
362
+ }
363
+ catch (handlerError) {
364
+ appLogger.error(`[ecopages] Error in custom error handler: ${handlerError}`);
365
+ }
366
+ }
367
+ if (error instanceof HttpError)
368
+ return error.toResponse();
369
+ appLogger.error(`[ecopages] Error handling request: ${error}`);
370
+ return new Response('Internal Server Error', { status: 500 });
371
+ }
372
+ },
373
+ error(error) {
374
+ appLogger.error(`[ecopages] Error handling request: ${error}`);
375
+ return handleNoMatch(new Request('http://localhost'));
376
+ },
377
+ };
378
+ return finalOptions;
379
+ }
380
+ /**
381
+ * Generates a static build of the site for deployment.
382
+ * @param options.preview - If true, starts a preview server after build
383
+ */
384
+ async buildStatic(options) {
385
+ if (!this.fullyInitialized) {
386
+ await this.initializeSharedRouteHandling({
387
+ staticRoutes: this.staticRoutes,
388
+ hmrManager: this.hmrManager,
389
+ });
412
390
  }
413
- let response;
414
- if (originalFetch) {
415
- const res = await originalFetch.call(this, request, this);
416
- response = res instanceof Response ? res : new Response("Not Found", { status: 404 });
417
- } else {
418
- response = new Response("Not Found", { status: 404 });
391
+ const buildRuntimeOrigin = resolveServeRuntimeOrigin(this.serveOptions);
392
+ await this.staticBuilder.build({ baseUrl: buildRuntimeOrigin, force: options?.force }, {
393
+ router: this.router,
394
+ routeRendererFactory: this.routeRendererFactory,
395
+ staticRoutes: this.staticRoutes,
396
+ });
397
+ if (!options?.preview) {
398
+ return undefined;
419
399
  }
420
- return response;
421
- };
400
+ return this.startPreviewServer();
422
401
  }
423
- return serverOptions;
424
- }
425
- /**
426
- * Helper method to retrieve and parse the request body.
427
- * Handles JSON and plain text content types.
428
- * For FormData (multipart/form-data, x-www-form-urlencoded), use ctx.request.formData() directly.
429
- * Returns undefined for unsupported content types.
430
- */
431
- async retrieveBodyFromRequest(request) {
432
- const contentType = request.headers.get("Content-Type") || "";
433
- if (contentType.includes("application/json")) {
434
- return await request.json();
402
+ /**
403
+ * Serves an existing static export without running SSG. Used by e2e preview
404
+ * launchers after a shared prewarm build.
405
+ */
406
+ async servePreviewOnly() {
407
+ if (!this.fullyInitialized) {
408
+ await this.initializeSharedRouteHandling({
409
+ staticRoutes: this.staticRoutes,
410
+ hmrManager: this.hmrManager,
411
+ });
412
+ }
413
+ const distPath = path.join(this.appConfig.rootDir, this.appConfig.distDir);
414
+ if (!fileSystem.exists(distPath)) {
415
+ throw new Error(`Cannot serve preview without building first: dist directory "${this.appConfig.distDir}" not found in "${this.appConfig.rootDir}".`);
416
+ }
417
+ return this.startPreviewServer();
435
418
  }
436
- if (contentType.includes("text/plain")) {
437
- return await request.text();
419
+ async startPreviewServer() {
420
+ const previewHostname = this.serveOptions.hostname || DEFAULT_ECOPAGES_HOSTNAME;
421
+ const previewPort = Number(this.serveOptions.port || DEFAULT_ECOPAGES_PORT);
422
+ const activePreviewPort = await this.previewHost.start({
423
+ appConfig: this.appConfig,
424
+ hostname: String(previewHostname),
425
+ port: previewPort,
426
+ allowPortFallback: this.allowPortFallback,
427
+ });
428
+ if (!activePreviewPort) {
429
+ return undefined;
430
+ }
431
+ return `http://${previewHostname}:${activePreviewPort}`;
438
432
  }
439
- return void 0;
440
- }
441
- /**
442
- * Composes the base Bun server settings that all runtime modes build from.
443
- *
444
- * @remarks
445
- * This method centralizes the Bun-specific error boundary. It preserves the
446
- * shared route pipeline while still allowing adapter-level custom error-handler
447
- * execution and `HttpError` passthrough.
448
- */
449
- buildServerSettings() {
450
- const serverOptions = { ...this.serveOptions };
451
- const handleNoMatch = this.handleNoMatch.bind(this);
452
- const waitForInit = this.waitForInitialization.bind(this);
453
- const handleReq = this.handleRequest.bind(this);
454
- const errorHandler = this.errorHandler;
455
- const getCacheService = () => this.getCacheService();
456
- const getRenderContext = () => this.getRenderContext();
457
- appLogger.debug(`[BunServerAdapter] Building server settings`);
458
- const finalOptions = {
459
- ...serverOptions,
460
- async fetch(request, _server) {
461
- try {
462
- await waitForInit();
463
- return await handleReq(request);
464
- } catch (error) {
465
- if (error instanceof Response) return error;
466
- if (errorHandler) {
467
- try {
468
- const locals = {};
469
- const context = {
470
- request,
471
- params: {},
472
- response: new ApiResponseBuilder(),
473
- server: _server,
474
- locals,
475
- require: createRequire(() => locals),
476
- services: {
477
- cache: getCacheService()
478
- },
479
- ...getRenderContext()
480
- };
481
- return await errorHandler(error, context);
482
- } catch (handlerError) {
483
- appLogger.error(`[ecopages] Error in custom error handler: ${handlerError}`);
433
+ /**
434
+ * Initializes the server with dynamic routes after server creation.
435
+ * Must be called before handling any requests.
436
+ * @param server - The Bun server instance
437
+ */
438
+ async completeInitialization(server) {
439
+ if (this.fullyInitialized) {
440
+ if (server && !this.serverInstance) {
441
+ this.serverInstance = server;
484
442
  }
485
- }
486
- if (error instanceof HttpError) return error.toResponse();
487
- appLogger.error(`[ecopages] Error handling request: ${error}`);
488
- return new Response("Internal Server Error", { status: 500 });
443
+ return;
489
444
  }
490
- },
491
- error(error) {
492
- appLogger.error(`[ecopages] Error handling request: ${error}`);
493
- return handleNoMatch(new Request("http://localhost"));
494
- }
495
- };
496
- return finalOptions;
497
- }
498
- /**
499
- * Generates a static build of the site for deployment.
500
- * @param options.preview - If true, starts a preview server after build
501
- */
502
- async buildStatic(options) {
503
- if (!this.fullyInitialized) {
504
- await this.initializeSharedRouteHandling({
505
- staticRoutes: this.staticRoutes,
506
- hmrManager: this.hmrManager
507
- });
508
- }
509
- const buildRuntimeOrigin = resolveServeRuntimeOrigin(this.serveOptions);
510
- await this.staticBuilder.build(
511
- { ...options, preview: false, baseUrl: buildRuntimeOrigin },
512
- {
513
- router: this.router,
514
- routeRendererFactory: this.routeRendererFactory,
515
- staticRoutes: this.staticRoutes
516
- }
517
- );
518
- if (!options?.preview) {
519
- return;
520
- }
521
- const previewHostname = this.serveOptions.hostname || DEFAULT_ECOPAGES_HOSTNAME;
522
- const previewPort = Number(this.serveOptions.port || DEFAULT_ECOPAGES_PORT);
523
- const activePreviewPort = await this.previewHost.start({
524
- appConfig: this.appConfig,
525
- hostname: String(previewHostname),
526
- port: previewPort
527
- });
528
- if (activePreviewPort) {
529
- appLogger.info(`Preview running at http://${previewHostname}:${activePreviewPort}`);
530
- return;
445
+ if (!this.initializationPromise) {
446
+ this.initializationPromise = this._performInitialization(server ?? null);
447
+ }
448
+ return this.initializationPromise;
531
449
  }
532
- }
533
- /**
534
- * Initializes the server with dynamic routes after server creation.
535
- * Must be called before handling any requests.
536
- * @param server - The Bun server instance
537
- */
538
- async completeInitialization(server) {
539
- if (this.fullyInitialized) {
540
- if (server && !this.serverInstance) {
450
+ /**
451
+ * Performs the one-time post-bind initialization path for Bun servers.
452
+ *
453
+ * @remarks
454
+ * This is intentionally split from `initialize()` because shared route handling
455
+ * and file watching need the live server instance to exist before Bun can
456
+ * reload updated route handlers in place.
457
+ */
458
+ async _performInitialization(server) {
541
459
  this.serverInstance = server;
542
- }
543
- return;
460
+ appLogger.debug('Completing server initialization with dynamic routes');
461
+ await this.initializeSharedRouteHandling({
462
+ staticRoutes: this.staticRoutes,
463
+ hmrManager: this.hmrManager,
464
+ });
465
+ if (this.options?.watch) {
466
+ await this.hmrManager.ensureRuntimeReady();
467
+ startDevWarmup({
468
+ appConfig: this.appConfig,
469
+ runtimeOrigin: this.runtimeOrigin,
470
+ });
471
+ await this.startDevStaticRoutePrewarmWhenReady();
472
+ }
473
+ this.fullyInitialized = true;
474
+ if (this.options?.watch)
475
+ await this.watch();
476
+ if (server && typeof server.reload === 'function') {
477
+ const updatedOptions = this.getServerOptions(this.options?.watch ? { enableHmr: true } : undefined);
478
+ server.reload(updatedOptions);
479
+ appLogger.debug('Server routes updated with dynamic routes');
480
+ }
544
481
  }
545
- if (!this.initializationPromise) {
546
- this.initializationPromise = this._performInitialization(server ?? null);
482
+ /**
483
+ * Creates and initializes the Bun server adapter.
484
+ * @returns Configured adapter with server methods
485
+ */
486
+ async createAdapter() {
487
+ await this.initialize();
488
+ return {
489
+ getServerOptions: this.getServerOptions.bind(this),
490
+ buildStatic: this.buildStatic.bind(this),
491
+ servePreviewOnly: this.servePreviewOnly.bind(this),
492
+ completeInitialization: this.completeInitialization.bind(this),
493
+ handleRequest: this.handleRequest.bind(this),
494
+ attachUserWebSocketUpgrades: this.attachUserWebSocketUpgrades.bind(this),
495
+ listStaticGenerationRoutes: (input) => this.router.listStaticGenerationRoutes(input),
496
+ dispose: this.dispose.bind(this),
497
+ };
547
498
  }
548
- return this.initializationPromise;
549
- }
550
- /**
551
- * Performs the one-time post-bind initialization path for Bun servers.
552
- *
553
- * @remarks
554
- * This is intentionally split from `initialize()` because shared route handling
555
- * and file watching need the live server instance to exist before Bun can
556
- * reload updated route handlers in place.
557
- */
558
- async _performInitialization(server) {
559
- this.serverInstance = server;
560
- appLogger.debug("Completing server initialization with dynamic routes");
561
- await this.initializeSharedRouteHandling({
562
- staticRoutes: this.staticRoutes,
563
- hmrManager: this.hmrManager
564
- });
565
- this.fullyInitialized = true;
566
- if (this.options?.watch) await this.watch();
567
- if (server && typeof server.reload === "function") {
568
- const updatedOptions = this.getServerOptions(this.options?.watch ? { enableHmr: true } : void 0);
569
- server.reload(updatedOptions);
570
- appLogger.debug("Server routes updated with dynamic routes");
499
+ /**
500
+ * Releases dev-time resources owned by the adapter.
501
+ *
502
+ * @remarks
503
+ * Safe to call multiple times. Does not stop the bound Bun server — callers
504
+ * should shut down transport through the runtime host before disposing.
505
+ */
506
+ async dispose() {
507
+ if (this.adapterDisposed) {
508
+ return;
509
+ }
510
+ this.adapterDisposed = true;
511
+ await disposeDevResources({
512
+ projectWatcher: this.projectWatcher,
513
+ appConfig: this.appConfig,
514
+ hmrManager: this.hmrManager,
515
+ bridge: this.bridge,
516
+ previewHost: this.previewHost,
517
+ });
518
+ this.projectWatcher = null;
519
+ }
520
+ /**
521
+ * Handles HTTP requests by passing them securely to the shared core router adapter.
522
+ *
523
+ * @remarks
524
+ * HMR HTML injection for API and page responses is owned by
525
+ * `SharedServerAdapter.handleSharedRequest`. This method only maps the
526
+ * request into the shared pipeline.
527
+ */
528
+ async handleRequest(request) {
529
+ const response = await this.handleSharedRequest(request, {
530
+ apiHandlers: this.apiHandlers,
531
+ errorHandler: this.errorHandler,
532
+ serverInstance: this.serverInstance,
533
+ hmrManager: this.hmrManager,
534
+ });
535
+ return response;
571
536
  }
572
- }
573
- /**
574
- * Creates and initializes the Bun server adapter.
575
- * @returns Configured adapter with server methods
576
- */
577
- async createAdapter() {
578
- await this.initialize();
579
- return {
580
- getServerOptions: this.getServerOptions.bind(this),
581
- buildStatic: this.buildStatic.bind(this),
582
- completeInitialization: this.completeInitialization.bind(this),
583
- handleRequest: this.handleRequest.bind(this),
584
- attachUserWebSocketUpgrades: this.attachUserWebSocketUpgrades.bind(this),
585
- dispose: this.dispose.bind(this)
586
- };
587
- }
588
- /**
589
- * Releases dev-time resources owned by the adapter.
590
- *
591
- * @remarks
592
- * Safe to call multiple times. Does not stop the bound Bun server — callers
593
- * should shut down transport through the runtime host before disposing.
594
- */
595
- async dispose() {
596
- if (this.adapterDisposed) {
597
- return;
537
+ /**
538
+ * Ensures server initialization completes before request handling.
539
+ * Prevents race conditions during startup.
540
+ */
541
+ async waitForInitialization() {
542
+ if (this.fullyInitialized) {
543
+ return;
544
+ }
545
+ if (this.initializationPromise) {
546
+ return this.initializationPromise;
547
+ }
548
+ throw new Error('Server not initialized. Call completeInitialization() first.');
598
549
  }
599
- this.adapterDisposed = true;
600
- await this.projectWatcher?.close();
601
- this.projectWatcher = null;
602
- this.hmrManager?.stop();
603
- this.bridge?.destroy();
604
- await this.previewHost.stop();
605
- }
606
- /**
607
- * Handles HTTP requests by passing them securely to the shared core router adapter.
608
- *
609
- * @remarks
610
- * Filesystem page responses are wrapped by `ServerRouteHandler`. This
611
- * adapter-level pass only covers HTML returned by explicit API handlers,
612
- * which bypass that route-layer wrapper and would otherwise miss the
613
- * dev HMR runtime — so the HMR script injection happens here, after
614
- * the shared handler runs.
615
- */
616
- async handleRequest(request) {
617
- const response = await this.handleSharedRequest(request, {
618
- apiHandlers: this.apiHandlers,
619
- errorHandler: this.errorHandler,
620
- serverInstance: this.serverInstance,
621
- hmrManager: this.hmrManager
622
- });
623
- return await this.maybeInjectHmrScript(response);
624
- }
625
- /**
626
- * Ensures server initialization completes before request handling.
627
- * Prevents race conditions during startup.
628
- */
629
- async waitForInitialization() {
630
- if (this.fullyInitialized) {
631
- return;
550
+ /**
551
+ * Handles HTTP requests from the router adapter.
552
+ */
553
+ async handleResponse(request) {
554
+ await this.waitForInitialization();
555
+ return this.routeHandler.handleResponse(request);
632
556
  }
633
- if (this.initializationPromise) {
634
- return this.initializationPromise;
557
+ /**
558
+ * Handles requests that do not match any routes.
559
+ */
560
+ async handleNoMatch(request) {
561
+ await this.waitForInitialization();
562
+ return this.routeHandler.handleNoMatch(request);
635
563
  }
636
- throw new Error("Server not initialized. Call completeInitialization() first.");
637
- }
638
- /**
639
- * Handles HTTP requests from the router adapter.
640
- */
641
- async handleResponse(request) {
642
- await this.waitForInitialization();
643
- return this.routeHandler.handleResponse(request);
644
- }
645
- /**
646
- * Handles requests that do not match any routes.
647
- */
648
- async handleNoMatch(request) {
649
- await this.waitForInitialization();
650
- return this.routeHandler.handleNoMatch(request);
651
- }
652
564
  }
653
- async function createBunServerAdapter(params) {
654
- const runtimeOrigin = params.runtimeOrigin ?? resolveServeRuntimeOrigin(params.serveOptions);
655
- const bridge = params.bridge ?? new ClientBridge();
656
- const hmrManager = params.hmrManager ?? new HmrManager({ appConfig: params.appConfig, bridge });
657
- const previewHost = params.previewHost ?? new BunStaticPreviewHost();
658
- const adapter = new BunServerAdapter({
659
- ...params,
660
- runtimeOrigin,
661
- bridge,
662
- hmrManager,
663
- previewHost
664
- });
665
- return adapter.createAdapter();
565
+ /**
566
+ * Creates the Bun server adapter and fills in the runtime-specific collaborators
567
+ * that Bun callers usually leave implicit.
568
+ *
569
+ * @remarks
570
+ * This is the canonical entry point for Bun server-adapter construction. It
571
+ * guarantees that the concrete adapter receives a Bun websocket bridge, HMR
572
+ * manager, and preview host even though those dependencies are optional on the
573
+ * public params type.
574
+ */
575
+ export async function createBunServerAdapter(params) {
576
+ const runtimeOrigin = params.runtimeOrigin ?? resolveServeRuntimeOrigin(params.serveOptions);
577
+ const bridge = params.bridge ?? new ClientBridge();
578
+ const hmrManager = params.hmrManager ?? new HmrManager({ appConfig: params.appConfig, bridge });
579
+ setAppDevClientBridge(params.appConfig, bridge);
580
+ setAppHmrManager(params.appConfig, hmrManager);
581
+ const previewHost = params.previewHost ?? new BunStaticPreviewHost();
582
+ const adapter = new BunServerAdapter({
583
+ ...params,
584
+ runtimeOrigin,
585
+ bridge,
586
+ hmrManager,
587
+ previewHost,
588
+ });
589
+ return adapter.createAdapter();
666
590
  }
667
- export {
668
- BunServerAdapter,
669
- createBunServerAdapter
670
- };