@ecopages/core 0.2.0-beta.4 → 0.2.0-beta.40

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 (611) hide show
  1. package/README.md +40 -9
  2. package/package.json +371 -33
  3. package/src/adapters/README.md +6 -2
  4. package/src/adapters/abstract/application-adapter.d.ts +115 -6
  5. package/src/adapters/abstract/application-adapter.js +261 -120
  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 +16 -2
  10. package/src/adapters/abstract/server-adapter.js +22 -14
  11. package/src/adapters/abstract/ws-pattern-matcher.d.ts +12 -0
  12. package/src/adapters/abstract/ws-pattern-matcher.js +28 -0
  13. package/src/adapters/bun/bun-user-websocket-lifecycle.d.ts +22 -0
  14. package/src/adapters/bun/bun-user-websocket-lifecycle.js +93 -0
  15. package/src/adapters/bun/client-bridge.d.ts +1 -0
  16. package/src/adapters/bun/client-bridge.js +51 -47
  17. package/src/adapters/bun/create-app.d.ts +9 -6
  18. package/src/adapters/bun/create-app.js +171 -130
  19. package/src/adapters/bun/hmr-manager.d.ts +1 -1
  20. package/src/adapters/bun/hmr-manager.js +62 -57
  21. package/src/adapters/bun/index.d.ts +1 -1
  22. package/src/adapters/bun/index.js +2 -8
  23. package/src/adapters/bun/runtime-host.d.ts +1 -1
  24. package/src/adapters/bun/runtime-host.js +61 -54
  25. package/src/adapters/bun/server-adapter.d.ts +91 -41
  26. package/src/adapters/bun/server-adapter.js +566 -426
  27. package/src/adapters/bun/static-preview-host.d.ts +1 -1
  28. package/src/adapters/bun/static-preview-host.js +43 -41
  29. package/src/adapters/create-app.d.ts +13 -11
  30. package/src/adapters/create-app.js +11 -63
  31. package/src/adapters/index.d.ts +2 -2
  32. package/src/adapters/index.js +2 -8
  33. package/src/adapters/node/create-app.d.ts +8 -3
  34. package/src/adapters/node/create-app.js +126 -84
  35. package/src/adapters/node/http-request-bridge.js +147 -106
  36. package/src/adapters/node/node-client-bridge.d.ts +1 -0
  37. package/src/adapters/node/node-client-bridge.js +62 -61
  38. package/src/adapters/node/node-hmr-manager.d.ts +1 -1
  39. package/src/adapters/node/node-hmr-manager.js +58 -48
  40. package/src/adapters/node/runtime-host.d.ts +1 -1
  41. package/src/adapters/node/runtime-host.js +96 -89
  42. package/src/adapters/node/server-adapter-dependencies.js +18 -17
  43. package/src/adapters/node/server-adapter.d.ts +63 -23
  44. package/src/adapters/node/server-adapter.js +346 -297
  45. package/src/adapters/node/static-content-server.d.ts +1 -0
  46. package/src/adapters/node/static-content-server.js +172 -183
  47. package/src/adapters/node/static-preview-host.d.ts +1 -1
  48. package/src/adapters/node/static-preview-host.js +88 -64
  49. package/src/adapters/shared/hmr/dev-transform-entrypoint-registry.d.ts +16 -0
  50. package/src/adapters/shared/hmr/dev-transform-entrypoint-registry.js +32 -0
  51. package/src/adapters/shared/{hmr-html-response.d.ts → hmr/hmr-html-response.d.ts} +2 -2
  52. package/src/adapters/shared/hmr/hmr-html-response.js +50 -0
  53. package/src/adapters/shared/hmr/shared-hmr-manager.d.ts +92 -0
  54. package/src/adapters/shared/hmr/shared-hmr-manager.js +446 -0
  55. package/src/adapters/shared/http/api-request-pipeline.d.ts +23 -0
  56. package/src/adapters/shared/http/api-request-pipeline.js +132 -0
  57. package/src/adapters/shared/{api-response.d.ts → http/api-response.d.ts} +1 -1
  58. package/src/adapters/shared/http/api-response.js +79 -0
  59. package/src/adapters/shared/http/create-body-response.d.ts +12 -0
  60. package/src/adapters/shared/http/create-body-response.js +26 -0
  61. package/src/adapters/shared/http/define-api-handler.d.ts +90 -0
  62. package/src/adapters/shared/http/define-api-handler.js +49 -0
  63. package/src/adapters/shared/{explicit-static-render-preparation.d.ts → http/explicit-static-render-preparation.d.ts} +3 -3
  64. package/src/adapters/shared/http/explicit-static-render-preparation.js +29 -0
  65. package/src/adapters/shared/{explicit-static-route-matcher.d.ts → http/explicit-static-route-matcher.d.ts} +3 -9
  66. package/src/adapters/shared/http/explicit-static-route-matcher.js +59 -0
  67. package/src/adapters/shared/{file-route-middleware-pipeline.d.ts → http/file-route-middleware-pipeline.d.ts} +2 -2
  68. package/src/adapters/shared/http/file-route-middleware-pipeline.js +84 -0
  69. package/src/adapters/shared/{fs-server-response-factory.d.ts → http/fs-server-response-factory.d.ts} +7 -2
  70. package/src/adapters/shared/http/fs-server-response-factory.js +106 -0
  71. package/src/adapters/shared/{fs-server-response-matcher.d.ts → http/fs-server-response-matcher.d.ts} +25 -5
  72. package/src/adapters/shared/http/fs-server-response-matcher.js +258 -0
  73. package/src/adapters/shared/http/run-middleware-chain.d.ts +5 -0
  74. package/src/adapters/shared/http/run-middleware-chain.js +17 -0
  75. package/src/adapters/shared/{application-adapter.d.ts → runtime/application-adapter.d.ts} +2 -2
  76. package/src/adapters/shared/runtime/application-adapter.js +75 -0
  77. package/src/adapters/shared/runtime/collect-dev-prewarm-plan.d.ts +11 -0
  78. package/src/adapters/shared/runtime/collect-dev-prewarm-plan.js +29 -0
  79. package/src/adapters/shared/runtime/copy-runtime-public-dir.d.ts +6 -0
  80. package/src/adapters/shared/runtime/copy-runtime-public-dir.js +27 -0
  81. package/src/adapters/shared/runtime/dev-static-route-prewarm.d.ts +16 -0
  82. package/src/adapters/shared/runtime/dev-static-route-prewarm.js +66 -0
  83. package/src/adapters/shared/runtime/port-manager.d.ts +116 -0
  84. package/src/adapters/shared/runtime/port-manager.js +226 -0
  85. package/src/adapters/shared/{render-context.d.ts → runtime/render-context.d.ts} +2 -2
  86. package/src/adapters/shared/runtime/render-context.js +99 -0
  87. package/src/adapters/shared/{runtime-app-bootstrap.d.ts → runtime/runtime-app-bootstrap.d.ts} +4 -3
  88. package/src/adapters/shared/runtime/runtime-app-bootstrap.js +38 -0
  89. package/src/adapters/shared/runtime/runtime-server-lifecycle.d.ts +45 -0
  90. package/src/adapters/shared/runtime/runtime-server-lifecycle.js +71 -0
  91. package/src/adapters/shared/{server-adapter.d.ts → runtime/server-adapter.d.ts} +31 -50
  92. package/src/adapters/shared/runtime/server-adapter.js +301 -0
  93. package/src/adapters/shared/{server-route-handler.d.ts → runtime/server-route-handler.d.ts} +6 -33
  94. package/src/adapters/shared/runtime/server-route-handler.js +77 -0
  95. package/src/adapters/shared/{server-static-builder.d.ts → runtime/server-static-builder.d.ts} +27 -35
  96. package/src/adapters/shared/runtime/server-static-builder.js +172 -0
  97. package/src/adapters/shared/{static-preview-host.d.ts → runtime/static-preview-host.d.ts} +6 -1
  98. package/src/adapters/shared/ws/node-http-websocket-upgrades.d.ts +21 -0
  99. package/src/adapters/shared/ws/node-http-websocket-upgrades.js +109 -0
  100. package/src/adapters/shared/ws/websocket-lifecycle.d.ts +24 -0
  101. package/src/adapters/shared/ws/websocket-lifecycle.js +62 -0
  102. package/src/build/README.md +191 -31
  103. package/src/build/app-build-manifest-runtime.d.ts +39 -0
  104. package/src/build/app-build-manifest-runtime.js +145 -0
  105. package/src/build/browser/browser-runtime-manifest.js +58 -0
  106. package/src/build/browser/browser-runtime-plugin-helpers.js +34 -0
  107. package/src/build/{browser-runtime-plugin.d.ts → browser/browser-runtime-plugin.d.ts} +1 -1
  108. package/src/build/browser/browser-runtime-plugin.js +216 -0
  109. package/src/build/browser/jsx-ownership-plugins.d.ts +24 -0
  110. package/src/build/browser/jsx-ownership-plugins.js +55 -0
  111. package/src/build/browser/lit-static-render-worker-context.d.ts +2 -0
  112. package/src/build/browser/lit-static-render-worker-context.js +4 -0
  113. package/src/build/build-adapter.d.ts +29 -334
  114. package/src/build/build-adapter.js +273 -237
  115. package/src/build/cache/build-input-fingerprint.d.ts +28 -0
  116. package/src/build/cache/build-input-fingerprint.js +33 -0
  117. package/src/build/cache/cache-constants.d.ts +4 -0
  118. package/src/build/cache/cache-constants.js +4 -0
  119. package/src/build/cache/cache-keys.d.ts +22 -0
  120. package/src/build/cache/cache-keys.js +71 -0
  121. package/src/build/cache/pages-unified-graph-build.d.ts +31 -0
  122. package/src/build/cache/pages-unified-graph-build.js +199 -0
  123. package/src/build/cache/production-build-cache.d.ts +21 -0
  124. package/src/build/cache/production-build-cache.js +56 -0
  125. package/src/build/cache/server-entry-build-cache.d.ts +43 -0
  126. package/src/build/cache/server-entry-build-cache.js +153 -0
  127. package/src/build/contracts/build-contracts.d.ts +96 -0
  128. package/src/build/contracts/build-contracts.js +1 -0
  129. package/src/build/contracts/build-manifest.d.ts +90 -0
  130. package/src/build/contracts/build-manifest.js +64 -0
  131. package/src/build/contracts/build-types.js +1 -0
  132. package/src/build/contracts/content-virtual-modules.d.ts +12 -0
  133. package/src/build/contracts/content-virtual-modules.js +29 -0
  134. package/src/build/{rolldown-adapter-helpers.d.ts → rolldown/rolldown-adapter-helpers.d.ts} +32 -9
  135. package/src/build/rolldown/rolldown-adapter-helpers.js +458 -0
  136. package/src/build/{rolldown-build-adapter.d.ts → rolldown/rolldown-build-adapter.d.ts} +3 -7
  137. package/src/build/rolldown/rolldown-build-adapter.js +57 -0
  138. package/src/build/rolldown/rolldown-build-invocation-metrics.d.ts +12 -0
  139. package/src/build/rolldown/rolldown-build-invocation-metrics.js +39 -0
  140. package/src/build/{rolldown-plugin-bridge.d.ts → rolldown/rolldown-plugin-bridge.d.ts} +16 -2
  141. package/src/build/rolldown/rolldown-plugin-bridge.js +284 -0
  142. package/src/build/rolldown/rolldown-source-transform-pass.d.ts +15 -0
  143. package/src/build/rolldown/rolldown-source-transform-pass.js +70 -0
  144. package/src/build/rolldown/runtime-build-output-normalizer.d.ts +10 -0
  145. package/src/build/rolldown/runtime-build-output-normalizer.js +253 -0
  146. package/src/build/rolldown/server-side-css-shim-plugin.js +58 -0
  147. package/src/build/runtime/build-profile-options.d.ts +7 -0
  148. package/src/build/runtime/build-profile-options.js +37 -0
  149. package/src/build/runtime/build-request-identity.d.ts +17 -0
  150. package/src/build/runtime/build-request-identity.js +79 -0
  151. package/src/build/runtime/build-request-policy.d.ts +58 -0
  152. package/src/build/runtime/build-request-policy.js +84 -0
  153. package/src/build/runtime/build-runtime.d.ts +28 -0
  154. package/src/build/runtime/build-runtime.js +75 -0
  155. package/src/build/runtime/deduping-build-executor.d.ts +21 -0
  156. package/src/build/runtime/deduping-build-executor.js +40 -0
  157. package/src/build/runtime/parallel-build-executor.d.ts +21 -0
  158. package/src/build/runtime/parallel-build-executor.js +60 -0
  159. package/src/build/{serialized-build-executor.d.ts → runtime/serialized-build-executor.d.ts} +1 -1
  160. package/src/build/runtime/serialized-build-executor.js +79 -0
  161. package/src/cache/index.d.ts +2 -1
  162. package/src/cache/index.js +7 -6
  163. package/src/cache/module-parse-cache.d.ts +5 -0
  164. package/src/cache/module-parse-cache.js +122 -67
  165. package/src/cache/module-transform-profiler.d.ts +8 -0
  166. package/src/cache/module-transform-profiler.js +8 -0
  167. package/src/client/navigation-scripts/classification.d.ts +16 -0
  168. package/src/client/navigation-scripts/classification.js +49 -0
  169. package/src/client/navigation-scripts/index.d.ts +3 -0
  170. package/src/client/navigation-scripts/index.js +3 -0
  171. package/src/client/navigation-scripts/navigation-scripts.test.browser.d.ts +1 -0
  172. package/src/client/navigation-scripts/navigation-scripts.test.browser.js +61 -0
  173. package/src/client/navigation-scripts/registry.d.ts +11 -0
  174. package/src/client/navigation-scripts/registry.js +16 -0
  175. package/src/client/navigation-scripts/rerun-queue.d.ts +37 -0
  176. package/src/client/navigation-scripts/rerun-queue.js +90 -0
  177. package/src/client/scroll.d.ts +17 -0
  178. package/src/client/scroll.js +33 -0
  179. package/src/client/scroll.test.browser.d.ts +1 -0
  180. package/src/client/scroll.test.browser.js +31 -0
  181. package/src/client/view-transitions.d.ts +32 -0
  182. package/src/client/view-transitions.js +120 -0
  183. package/src/client/view-transitions.test.browser.d.ts +1 -0
  184. package/src/client/view-transitions.test.browser.js +56 -0
  185. package/src/config/config-builder.d.ts +40 -10
  186. package/src/config/config-builder.js +647 -600
  187. package/src/config/constants.d.ts +1 -0
  188. package/src/config/constants.js +44 -23
  189. package/src/declarations.d.ts +1 -0
  190. package/src/dev/README.md +24 -0
  191. package/src/dev/client-bridge-registry.d.ts +5 -0
  192. package/src/dev/client-bridge-registry.js +10 -0
  193. package/src/dev/dev-client-ownership.d.ts +7 -0
  194. package/src/dev/dev-client-ownership.js +8 -0
  195. package/src/dev/hmr-manager-registry.d.ts +8 -0
  196. package/src/dev/hmr-manager-registry.js +10 -0
  197. package/src/dev/host-runtime.d.ts +3 -0
  198. package/src/dev/host-runtime.js +25 -23
  199. package/src/dev/runtime-server-started-message.d.ts +2 -0
  200. package/src/dev/runtime-server-started-message.js +3 -0
  201. package/src/dev/sc-server.js +106 -103
  202. package/src/dev/transform-server/dev-transform-bundler.d.ts +24 -0
  203. package/src/dev/transform-server/dev-transform-bundler.js +79 -0
  204. package/src/dev/transform-server/dev-transform-externalize-plugin.d.ts +12 -0
  205. package/src/dev/transform-server/dev-transform-externalize-plugin.js +29 -0
  206. package/src/dev/transform-server/dev-transform-import-rewriter.d.ts +16 -0
  207. package/src/dev/transform-server/dev-transform-import-rewriter.js +126 -0
  208. package/src/dev/transform-server/dev-transform-module-kind.d.ts +13 -0
  209. package/src/dev/transform-server/dev-transform-module-kind.js +17 -0
  210. package/src/dev/transform-server/dev-transform-runtime-specifiers.d.ts +5 -0
  211. package/src/dev/transform-server/dev-transform-runtime-specifiers.js +16 -0
  212. package/src/dev/transform-server/dev-transform-server.d.ts +41 -0
  213. package/src/dev/transform-server/dev-transform-server.js +191 -0
  214. package/src/dev/transform-server/dev-transform-url.d.ts +13 -0
  215. package/src/dev/transform-server/dev-transform-url.js +58 -0
  216. package/src/dev/transform-server/dev-transform-vendor-registry.d.ts +28 -0
  217. package/src/dev/transform-server/dev-transform-vendor-registry.js +158 -0
  218. package/src/dev/transform-server/index.d.ts +6 -0
  219. package/src/dev/transform-server/index.js +4 -0
  220. package/src/dev/transform-server/types.d.ts +15 -0
  221. package/src/dev/transform-server/types.js +1 -0
  222. package/src/dev-toolbar/README.md +52 -0
  223. package/src/dev-toolbar/define-dev-tool.d.ts +21 -0
  224. package/src/dev-toolbar/define-dev-tool.js +9 -0
  225. package/src/dev-toolbar/dev-toolbar-config.d.ts +25 -0
  226. package/src/dev-toolbar/dev-toolbar-config.js +19 -0
  227. package/src/dev-toolbar/dev-toolbar-host.d.ts +49 -0
  228. package/src/dev-toolbar/dev-toolbar-host.js +117 -0
  229. package/src/dev-toolbar/dev-toolbar-html-response.d.ts +11 -0
  230. package/src/dev-toolbar/dev-toolbar-html-response.js +14 -0
  231. package/src/dev-toolbar/dev-toolbar-manifest-contract.d.ts +22 -0
  232. package/src/dev-toolbar/dev-toolbar-manifest-contract.js +2 -0
  233. package/src/dev-toolbar/dev-toolbar-manifest.d.ts +15 -0
  234. package/src/dev-toolbar/dev-toolbar-manifest.js +52 -0
  235. package/src/dev-toolbar/dev-toolbar-package.d.ts +34 -0
  236. package/src/dev-toolbar/dev-toolbar-package.js +78 -0
  237. package/src/dev-toolbar/dev-toolbar-runtime-paths.d.ts +10 -0
  238. package/src/dev-toolbar/dev-toolbar-runtime-paths.js +13 -0
  239. package/src/diagnostics/request-build-dedupe.d.ts +18 -0
  240. package/src/diagnostics/request-build-dedupe.js +39 -0
  241. package/src/diagnostics/request-pipeline-metrics.d.ts +38 -0
  242. package/src/diagnostics/request-pipeline-metrics.js +121 -0
  243. package/src/diagnostics/startup-trace.d.ts +81 -0
  244. package/src/diagnostics/startup-trace.js +281 -0
  245. package/src/eco/README.md +17 -0
  246. package/src/eco/component-identity.d.ts +13 -0
  247. package/src/eco/component-identity.js +18 -0
  248. package/src/eco/eco-declared-component.d.ts +15 -0
  249. package/src/eco/eco-declared-component.js +23 -0
  250. package/src/eco/eco.browser.js +63 -70
  251. package/src/eco/eco.js +163 -97
  252. package/src/eco/eco.types.d.ts +47 -8
  253. package/src/eco/eco.types.js +5 -0
  254. package/src/eco/eco.utils.d.ts +1 -1
  255. package/src/eco/eco.utils.js +1 -10
  256. package/src/eco/global-injector-map.js +55 -41
  257. package/src/eco/lazy-injector-map.js +90 -60
  258. package/src/eco/module-dependencies.js +52 -44
  259. package/src/eco/page-layout-normalization.d.ts +21 -0
  260. package/src/eco/page-layout-normalization.js +69 -0
  261. package/src/env.d.ts +2 -0
  262. package/src/errors/http-error.d.ts +8 -0
  263. package/src/errors/http-error.js +66 -49
  264. package/src/errors/index.d.ts +1 -0
  265. package/src/errors/index.js +3 -6
  266. package/src/errors/locals-access-error.js +5 -8
  267. package/src/errors/undeclared-component-dependency-error.d.ts +11 -0
  268. package/src/errors/undeclared-component-dependency-error.js +17 -0
  269. package/src/global/app-logger.js +3 -6
  270. package/src/hmr/README.md +21 -0
  271. package/src/hmr/client/hmr-runtime.js +119 -110
  272. package/src/hmr/client/module-update.d.ts +13 -0
  273. package/src/hmr/client/module-update.js +39 -0
  274. package/src/hmr/hmr-asset-paths.d.ts +14 -0
  275. package/src/hmr/hmr-asset-paths.js +22 -0
  276. package/src/hmr/hmr-entrypoint-output.d.ts +21 -0
  277. package/src/hmr/hmr-entrypoint-output.js +34 -0
  278. package/src/hmr/hmr-file-change-prep.d.ts +10 -0
  279. package/src/hmr/hmr-file-change-prep.js +14 -0
  280. package/src/hmr/hmr-registered-entrypoints-context.d.ts +7 -0
  281. package/src/hmr/hmr-registered-entrypoints-context.js +1 -0
  282. package/src/hmr/hmr-runtime-paths.d.ts +10 -0
  283. package/src/hmr/hmr-runtime-paths.js +13 -0
  284. package/src/hmr/hmr-strategy.d.ts +9 -0
  285. package/src/hmr/hmr-strategy.js +113 -42
  286. package/src/hmr/strategies/default-hmr-strategy.js +55 -33
  287. package/src/hmr/strategies/js-hmr-strategy.d.ts +6 -97
  288. package/src/hmr/strategies/js-hmr-strategy.js +107 -167
  289. package/src/hmr/strategies/server-rendered-template-hmr-strategy.d.ts +17 -0
  290. package/src/hmr/strategies/server-rendered-template-hmr-strategy.js +35 -0
  291. package/src/index.browser.d.ts +1 -0
  292. package/src/index.browser.js +2 -4
  293. package/src/index.d.ts +4 -1
  294. package/src/index.js +7 -21
  295. package/src/integrations/ghtml/ghtml-renderer.d.ts +2 -6
  296. package/src/integrations/ghtml/ghtml-renderer.js +12 -56
  297. package/src/integrations/ghtml/ghtml.constants.js +1 -4
  298. package/src/integrations/ghtml/ghtml.plugin.d.ts +3 -16
  299. package/src/integrations/ghtml/ghtml.plugin.js +10 -20
  300. package/src/islands/README.md +25 -0
  301. package/src/islands/island-host.d.ts +37 -0
  302. package/src/islands/island-host.js +55 -0
  303. package/src/plugins/README.md +2 -1
  304. package/src/plugins/alias-resolver-cache.d.ts +6 -9
  305. package/src/plugins/alias-resolver-cache.js +114 -97
  306. package/src/plugins/alias-resolver-plugin.d.ts +3 -3
  307. package/src/plugins/alias-resolver-plugin.js +35 -62
  308. package/src/plugins/define-integration.d.ts +26 -0
  309. package/src/plugins/define-integration.js +20 -0
  310. package/src/plugins/eco-component-meta-plugin.d.ts +6 -102
  311. package/src/plugins/eco-component-meta-plugin.js +120 -162
  312. package/src/plugins/foreign-jsx-override-plugin.d.ts +1 -1
  313. package/src/plugins/foreign-jsx-override-plugin.js +49 -37
  314. package/src/plugins/integration-plugin.d.ts +43 -14
  315. package/src/plugins/integration-plugin.js +212 -190
  316. package/src/plugins/jsx-import-source.utils.d.ts +8 -0
  317. package/src/plugins/jsx-import-source.utils.js +21 -0
  318. package/src/plugins/processor.d.ts +71 -12
  319. package/src/plugins/processor.js +168 -130
  320. package/src/plugins/runtime-capability.js +1 -0
  321. package/src/plugins/source-transform.d.ts +32 -1
  322. package/src/plugins/source-transform.js +112 -60
  323. package/src/plugins/tsconfig-import-resolver.d.ts +35 -0
  324. package/src/plugins/tsconfig-import-resolver.js +235 -0
  325. package/src/route-renderer/GRAPH.md +26 -32
  326. package/src/route-renderer/README.md +54 -33
  327. package/src/route-renderer/orchestration/document-shell/document-shell-render.service.d.ts +107 -0
  328. package/src/route-renderer/orchestration/document-shell/document-shell-render.service.js +155 -0
  329. package/src/route-renderer/orchestration/document-shell/layout-shell-props.service.d.ts +20 -0
  330. package/src/route-renderer/orchestration/document-shell/layout-shell-props.service.js +37 -0
  331. package/src/route-renderer/orchestration/{component-render-context.d.ts → foreign-child/component-render-context.d.ts} +8 -15
  332. package/src/route-renderer/orchestration/foreign-child/component-render-context.js +196 -0
  333. package/src/route-renderer/orchestration/{render-output.utils.d.ts → foreign-child/foreign-child-output.utils.d.ts} +17 -7
  334. package/src/route-renderer/orchestration/foreign-child/foreign-child-output.utils.js +191 -0
  335. package/src/route-renderer/orchestration/{foreign-subtree-execution.service.d.ts → foreign-child/foreign-subtree-execution.service.d.ts} +64 -34
  336. package/src/route-renderer/orchestration/foreign-child/foreign-subtree-execution.service.js +354 -0
  337. package/src/route-renderer/orchestration/foreign-child/owning-renderer-resolution.d.ts +19 -0
  338. package/src/route-renderer/orchestration/foreign-child/owning-renderer-resolution.js +36 -0
  339. package/src/route-renderer/orchestration/integration-renderer.d.ts +41 -151
  340. package/src/route-renderer/orchestration/integration-renderer.js +798 -988
  341. package/src/route-renderer/orchestration/integration-renderer.test-fixtures.d.ts +75 -0
  342. package/src/route-renderer/orchestration/integration-renderer.test-fixtures.js +173 -0
  343. package/src/route-renderer/orchestration/ownership-graph/component-graph-collectors.d.ts +10 -0
  344. package/src/route-renderer/orchestration/ownership-graph/component-graph-collectors.js +132 -0
  345. package/src/route-renderer/orchestration/ownership-graph/component-graph.d.ts +34 -0
  346. package/src/route-renderer/orchestration/ownership-graph/component-graph.js +89 -0
  347. package/src/route-renderer/orchestration/{ownership-validation.service.d.ts → ownership-graph/ownership-validation.service.d.ts} +6 -2
  348. package/src/route-renderer/orchestration/ownership-graph/ownership-validation.service.js +77 -0
  349. package/src/route-renderer/orchestration/page-browser-graph/global-injector-assets.service.d.ts +7 -0
  350. package/src/route-renderer/orchestration/page-browser-graph/global-injector-assets.service.js +30 -0
  351. package/src/route-renderer/orchestration/page-browser-graph/grouped-graph-build-plan.d.ts +15 -0
  352. package/src/route-renderer/orchestration/page-browser-graph/grouped-graph-build-plan.js +9 -0
  353. package/src/route-renderer/orchestration/page-browser-graph/page-browser-graph-contribution.merge.d.ts +5 -0
  354. package/src/route-renderer/orchestration/page-browser-graph/page-browser-graph-contribution.merge.js +30 -0
  355. package/src/route-renderer/orchestration/page-browser-graph/page-browser-graph-merge.utils.d.ts +12 -0
  356. package/src/route-renderer/orchestration/page-browser-graph/page-browser-graph-merge.utils.js +32 -0
  357. package/src/route-renderer/orchestration/page-browser-graph/page-browser-graph-session.d.ts +126 -0
  358. package/src/route-renderer/orchestration/page-browser-graph/page-browser-graph-session.js +542 -0
  359. package/src/route-renderer/orchestration/page-browser-graph/page-browser-graph.service.d.ts +47 -0
  360. package/src/route-renderer/orchestration/page-browser-graph/page-browser-graph.service.js +232 -0
  361. package/src/route-renderer/orchestration/{processed-asset-dedupe.d.ts → page-browser-graph/processed-asset-dedupe.d.ts} +1 -1
  362. package/src/route-renderer/orchestration/page-browser-graph/processed-asset-dedupe.js +23 -0
  363. package/src/route-renderer/orchestration/page-browser-graph/route-instance-key.d.ts +29 -0
  364. package/src/route-renderer/orchestration/page-browser-graph/route-instance-key.js +54 -0
  365. package/src/route-renderer/orchestration/route-pipeline/integration-route-render-adapter.d.ts +38 -0
  366. package/src/route-renderer/orchestration/route-pipeline/integration-route-render-adapter.js +26 -0
  367. package/src/route-renderer/orchestration/route-pipeline/marker-artifact.utils.d.ts +6 -0
  368. package/src/route-renderer/orchestration/route-pipeline/marker-artifact.utils.js +25 -0
  369. package/src/route-renderer/orchestration/route-pipeline/robots-meta.contribution.d.ts +15 -0
  370. package/src/route-renderer/orchestration/route-pipeline/robots-meta.contribution.js +43 -0
  371. package/src/route-renderer/orchestration/route-pipeline/route-html-finalization.service.d.ts +25 -0
  372. package/src/route-renderer/orchestration/route-pipeline/route-html-finalization.service.js +44 -0
  373. package/src/route-renderer/orchestration/route-pipeline/route-prepared-options.builder.d.ts +26 -0
  374. package/src/route-renderer/orchestration/route-pipeline/route-prepared-options.builder.js +49 -0
  375. package/src/route-renderer/orchestration/route-pipeline/route-prepared-options.utils.d.ts +4 -0
  376. package/src/route-renderer/orchestration/route-pipeline/route-prepared-options.utils.js +30 -0
  377. package/src/route-renderer/orchestration/{route-render-orchestrator.d.ts → route-pipeline/route-render-orchestrator.d.ts} +24 -54
  378. package/src/route-renderer/orchestration/route-pipeline/route-render-orchestrator.js +215 -0
  379. package/src/route-renderer/orchestration/string-markup-renderer.d.ts +14 -0
  380. package/src/route-renderer/orchestration/string-markup-renderer.js +52 -0
  381. package/src/route-renderer/page-loading/component-dependency-collection.js +121 -121
  382. package/src/route-renderer/page-loading/declared-asset-collection.js +66 -94
  383. package/src/route-renderer/page-loading/dependency-resolver.js +101 -104
  384. package/src/route-renderer/page-loading/ecopages-virtual-imports.d.ts +1 -0
  385. package/src/route-renderer/page-loading/ecopages-virtual-imports.js +64 -51
  386. package/src/route-renderer/page-loading/file-scoped-dependency-components.d.ts +42 -0
  387. package/src/route-renderer/page-loading/file-scoped-dependency-components.js +94 -0
  388. package/src/route-renderer/page-loading/lazy-entry-collection.js +75 -98
  389. package/src/route-renderer/page-loading/lazy-trigger-planning.js +47 -36
  390. package/src/route-renderer/page-loading/module-declaration-aggregation.js +39 -28
  391. package/src/route-renderer/page-loading/module-declaration-scripts.js +10 -15
  392. package/src/route-renderer/page-loading/page-dependency-bundling.js +156 -113
  393. package/src/route-renderer/page-loading/page-module-loader.d.ts +2 -1
  394. package/src/route-renderer/page-loading/page-module-loader.js +136 -124
  395. package/src/route-renderer/page-loading/resolved-page-dependencies.d.ts +12 -0
  396. package/src/route-renderer/page-loading/resolved-page-dependencies.js +38 -0
  397. package/src/route-renderer/route-renderer.js +74 -76
  398. package/src/router/README.md +31 -0
  399. package/src/router/client/link-intent.d.ts +11 -21
  400. package/src/router/client/link-intent.js +56 -30
  401. package/src/router/client/link-intent.test.browser.js +50 -39
  402. package/src/router/client/link-navigation-policy.d.ts +45 -0
  403. package/src/router/client/link-navigation-policy.js +122 -0
  404. package/src/router/client/link-navigation-policy.test.browser.d.ts +1 -0
  405. package/src/router/client/link-navigation-policy.test.browser.js +82 -0
  406. package/src/router/client/navigation-coordinator.d.ts +1 -1
  407. package/src/router/client/navigation-coordinator.js +235 -201
  408. package/src/router/client/navigation-lifecycle.d.ts +55 -0
  409. package/src/router/client/navigation-lifecycle.js +50 -0
  410. package/src/router/client/navigation-lifecycle.test.browser.d.ts +1 -0
  411. package/src/router/client/navigation-lifecycle.test.browser.js +118 -0
  412. package/src/router/server/route-registry.js +237 -242
  413. package/src/services/README.md +5 -0
  414. package/src/services/assets/asset-processing-service/asset-dependency-keys.d.ts +13 -0
  415. package/src/services/assets/asset-processing-service/asset-dependency-keys.js +64 -50
  416. package/src/services/assets/asset-processing-service/asset-processing.service.d.ts +7 -1
  417. package/src/services/assets/asset-processing-service/asset-processing.service.js +308 -268
  418. package/src/services/assets/asset-processing-service/asset.factory.js +78 -81
  419. package/src/services/assets/asset-processing-service/assets.types.d.ts +1 -1
  420. package/src/services/assets/asset-processing-service/assets.types.js +1 -0
  421. package/src/services/assets/asset-processing-service/browser-runtime-asset.factory.d.ts +2 -1
  422. package/src/services/assets/asset-processing-service/browser-runtime-asset.factory.js +57 -45
  423. package/src/services/assets/asset-processing-service/browser-runtime-entry-resolution.d.ts +52 -0
  424. package/src/services/assets/asset-processing-service/browser-runtime-entry-resolution.js +115 -0
  425. package/src/services/assets/asset-processing-service/browser-runtime-entry.factory.d.ts +4 -2
  426. package/src/services/assets/asset-processing-service/browser-runtime-entry.factory.js +53 -38
  427. package/src/services/assets/asset-processing-service/finalize-processed-asset.d.ts +3 -0
  428. package/src/services/assets/asset-processing-service/finalize-processed-asset.js +5 -0
  429. package/src/services/assets/asset-processing-service/grouped-content-bundles.d.ts +2 -1
  430. package/src/services/assets/asset-processing-service/grouped-content-bundles.js +85 -60
  431. package/src/services/assets/asset-processing-service/index.d.ts +2 -0
  432. package/src/services/assets/asset-processing-service/index.js +8 -6
  433. package/src/services/assets/asset-processing-service/inline-content-script-body.d.ts +11 -0
  434. package/src/services/assets/asset-processing-service/inline-content-script-body.js +23 -0
  435. package/src/services/assets/asset-processing-service/materialize-content-script-asset.d.ts +9 -0
  436. package/src/services/assets/asset-processing-service/materialize-content-script-asset.js +22 -0
  437. package/src/services/assets/asset-processing-service/page-package.js +70 -72
  438. package/src/services/assets/asset-processing-service/processor.interface.js +7 -5
  439. package/src/services/assets/asset-processing-service/processor.registry.js +11 -14
  440. package/src/services/assets/asset-processing-service/processors/base/base-processor.js +59 -62
  441. package/src/services/assets/asset-processing-service/processors/base/base-script-processor.d.ts +0 -2
  442. package/src/services/assets/asset-processing-service/processors/base/base-script-processor.js +102 -130
  443. package/src/services/assets/asset-processing-service/processors/index.js +5 -5
  444. package/src/services/assets/asset-processing-service/processors/script/content-script.processor.d.ts +8 -0
  445. package/src/services/assets/asset-processing-service/processors/script/content-script.processor.js +111 -111
  446. package/src/services/assets/asset-processing-service/processors/script/file-script.processor.d.ts +0 -1
  447. package/src/services/assets/asset-processing-service/processors/script/file-script.processor.js +95 -94
  448. package/src/services/assets/asset-processing-service/processors/script/node-module-script.processor.js +136 -121
  449. package/src/services/assets/asset-processing-service/processors/stylesheet/content-stylesheet.processor.d.ts +0 -3
  450. package/src/services/assets/asset-processing-service/processors/stylesheet/content-stylesheet.processor.js +26 -57
  451. package/src/services/assets/asset-processing-service/processors/stylesheet/file-stylesheet.processor.d.ts +0 -3
  452. package/src/services/assets/asset-processing-service/processors/stylesheet/file-stylesheet.processor.js +33 -67
  453. package/src/services/assets/asset-processing-service/processors/stylesheet/stylesheet-processor-pipeline.d.ts +2 -0
  454. package/src/services/assets/asset-processing-service/processors/stylesheet/stylesheet-processor-pipeline.js +44 -0
  455. package/src/services/assets/asset-processing-service/resolve-integration-plugin.d.ts +4 -0
  456. package/src/services/assets/asset-processing-service/resolve-integration-plugin.js +15 -0
  457. package/src/services/assets/asset-processing-service/ungrouped-dependency-processing.d.ts +0 -1
  458. package/src/services/assets/asset-processing-service/ungrouped-dependency-processing.js +27 -44
  459. package/src/services/assets/browser-bundle.service.d.ts +28 -30
  460. package/src/services/assets/browser-bundle.service.js +54 -40
  461. package/src/services/cache/cache.types.d.ts +4 -2
  462. package/src/services/cache/cache.types.js +5 -0
  463. package/src/services/cache/html-page-cache-dependency-index.d.ts +34 -0
  464. package/src/services/cache/html-page-cache-dependency-index.js +88 -0
  465. package/src/services/cache/index.d.ts +2 -0
  466. package/src/services/cache/index.js +8 -7
  467. package/src/services/cache/memory-cache-store.js +101 -89
  468. package/src/services/cache/page-cache-service.d.ts +31 -1
  469. package/src/services/cache/page-cache-service.js +237 -150
  470. package/src/services/cache/page-request-cache-coordinator.service.js +106 -102
  471. package/src/services/html/html-rewriter-provider.service.js +61 -61
  472. package/src/services/html/html-transformer.service.d.ts +1 -1
  473. package/src/services/html/html-transformer.service.js +249 -266
  474. package/src/services/invalidation/development-invalidation.service.d.ts +25 -2
  475. package/src/services/invalidation/development-invalidation.service.js +239 -175
  476. package/src/services/module-loading/README.md +52 -0
  477. package/src/services/module-loading/app-module-loader.service.js +1 -0
  478. package/src/services/module-loading/app-server-module-transpiler.service.d.ts +8 -0
  479. package/src/services/module-loading/app-server-module-transpiler.service.js +103 -118
  480. package/src/services/module-loading/collection-server-module-build.service.d.ts +19 -0
  481. package/src/services/module-loading/collection-server-module-build.service.js +83 -0
  482. package/src/services/module-loading/host-module-loader-registry.js +6 -11
  483. package/src/services/module-loading/module-loading-types.js +1 -0
  484. package/src/services/module-loading/page-module-import.service.d.ts +11 -13
  485. package/src/services/module-loading/page-module-import.service.js +222 -184
  486. package/src/services/module-loading/route-module-build-cache-registry.d.ts +24 -0
  487. package/src/services/module-loading/route-module-build-cache-registry.js +51 -0
  488. package/src/services/module-loading/route-module-build-cache.d.ts +4 -0
  489. package/src/services/module-loading/route-module-build-cache.js +3 -0
  490. package/src/services/module-loading/route-module-build-cache.store.d.ts +57 -0
  491. package/src/services/module-loading/route-module-build-cache.store.js +202 -0
  492. package/src/services/module-loading/route-module-build-manifest.d.ts +57 -0
  493. package/src/services/module-loading/route-module-build-manifest.js +60 -0
  494. package/src/services/module-loading/route-module-dependency-hasher.d.ts +81 -0
  495. package/src/services/module-loading/route-module-dependency-hasher.js +148 -0
  496. package/src/services/module-loading/server-module-transpiler.service.d.ts +1 -3
  497. package/src/services/module-loading/server-module-transpiler.service.js +65 -62
  498. package/src/services/module-loading/source-module-support.js +15 -7
  499. package/src/services/runtime-state/dev-graph.service.js +165 -157
  500. package/src/services/runtime-state/entrypoint-dependency-graph.service.js +85 -76
  501. package/src/services/runtime-state/server-invalidation-state.service.js +38 -30
  502. package/src/services/validation/schema-validation-service.d.ts +1 -4
  503. package/src/services/validation/schema-validation-service.js +156 -95
  504. package/src/services/validation/standard-schema.types.d.ts +9 -62
  505. package/src/services/validation/standard-schema.types.js +1 -0
  506. package/src/services/validation/validate-standard-schema.d.ts +7 -0
  507. package/src/services/validation/validate-standard-schema.js +14 -0
  508. package/src/static-site-generator/README.md +41 -0
  509. package/src/static-site-generator/production-page-browser-graph-prebuild.d.ts +32 -0
  510. package/src/static-site-generator/production-page-browser-graph-prebuild.js +57 -0
  511. package/src/static-site-generator/sitemap-routes.d.ts +14 -0
  512. package/src/static-site-generator/sitemap-routes.js +36 -0
  513. package/src/static-site-generator/sitemap.d.ts +15 -0
  514. package/src/static-site-generator/sitemap.js +42 -0
  515. package/src/static-site-generator/static-build-invalidation.d.ts +10 -0
  516. package/src/static-site-generator/static-build-invalidation.js +37 -0
  517. package/src/static-site-generator/static-export-context.d.ts +30 -0
  518. package/src/static-site-generator/static-export-context.js +1 -0
  519. package/src/static-site-generator/static-site-generator.d.ts +43 -25
  520. package/src/static-site-generator/static-site-generator.js +536 -294
  521. package/src/types/internal-types.d.ts +59 -13
  522. package/src/types/internal-types.js +1 -0
  523. package/src/types/public-types.d.ts +310 -95
  524. package/src/types/public-types.js +1 -0
  525. package/src/utils/deep-merge.js +39 -26
  526. package/src/utils/ecopages-route-info.d.ts +26 -0
  527. package/src/utils/ecopages-route-info.js +30 -0
  528. package/src/utils/hash.js +3 -6
  529. package/src/utils/html-escaping.d.ts +7 -0
  530. package/src/utils/html-escaping.js +22 -5
  531. package/src/utils/html.js +1 -4
  532. package/src/utils/invariant.js +11 -10
  533. package/src/utils/locals-utils.js +32 -22
  534. package/src/utils/parse-cli-args.d.ts +2 -0
  535. package/src/utils/parse-cli-args.js +73 -59
  536. package/src/utils/path-pattern.d.ts +23 -0
  537. package/src/utils/path-pattern.js +42 -0
  538. package/src/utils/path-utils.module.js +8 -11
  539. package/src/utils/resolve-entry-file.js +70 -38
  540. package/src/utils/resolve-work-dir.js +23 -27
  541. package/src/utils/runtime.js +24 -33
  542. package/src/utils/server-utils.module.d.ts +3 -2
  543. package/src/utils/server-utils.module.js +60 -53
  544. package/src/utils/static-file-extensions.d.ts +12 -0
  545. package/src/utils/static-file-extensions.js +54 -0
  546. package/src/watchers/project-watcher-ignore.d.ts +11 -0
  547. package/src/watchers/project-watcher-ignore.js +17 -0
  548. package/src/watchers/project-watcher.d.ts +29 -6
  549. package/src/watchers/project-watcher.js +402 -257
  550. package/src/watchers/project-watcher.test-helpers.js +45 -50
  551. package/src/adapters/shared/api-response.js +0 -96
  552. package/src/adapters/shared/application-adapter.js +0 -90
  553. package/src/adapters/shared/define-api-handler.d.ts +0 -25
  554. package/src/adapters/shared/define-api-handler.js +0 -15
  555. package/src/adapters/shared/explicit-static-render-preparation.js +0 -26
  556. package/src/adapters/shared/explicit-static-route-matcher.js +0 -101
  557. package/src/adapters/shared/file-route-middleware-pipeline.js +0 -90
  558. package/src/adapters/shared/fs-server-response-factory.js +0 -81
  559. package/src/adapters/shared/fs-server-response-matcher.js +0 -186
  560. package/src/adapters/shared/hmr-entrypoint-registrar.d.ts +0 -55
  561. package/src/adapters/shared/hmr-entrypoint-registrar.js +0 -87
  562. package/src/adapters/shared/hmr-html-response.js +0 -33
  563. package/src/adapters/shared/render-context.js +0 -93
  564. package/src/adapters/shared/runtime-app-bootstrap.js +0 -46
  565. package/src/adapters/shared/runtime-host.js +0 -0
  566. package/src/adapters/shared/server-adapter.js +0 -436
  567. package/src/adapters/shared/server-route-handler.js +0 -111
  568. package/src/adapters/shared/server-static-builder.js +0 -162
  569. package/src/adapters/shared/shared-hmr-manager.d.ts +0 -59
  570. package/src/adapters/shared/shared-hmr-manager.js +0 -241
  571. package/src/adapters/shared/static-preview-host.js +0 -0
  572. package/src/build/browser-runtime-manifest.js +0 -61
  573. package/src/build/browser-runtime-plugin-helpers.js +0 -14
  574. package/src/build/browser-runtime-plugin.js +0 -173
  575. package/src/build/build-manifest.d.ts +0 -33
  576. package/src/build/build-manifest.js +0 -49
  577. package/src/build/build-types.js +0 -0
  578. package/src/build/rolldown-adapter-helpers.js +0 -265
  579. package/src/build/rolldown-build-adapter.js +0 -65
  580. package/src/build/rolldown-dev-build-adapter.d.ts +0 -82
  581. package/src/build/rolldown-dev-build-adapter.js +0 -166
  582. package/src/build/rolldown-plugin-bridge.js +0 -199
  583. package/src/build/runtime-build-executor.d.ts +0 -21
  584. package/src/build/runtime-build-executor.js +0 -19
  585. package/src/build/runtime-build-output-normalizer.d.ts +0 -3
  586. package/src/build/runtime-build-output-normalizer.js +0 -111
  587. package/src/build/serialized-build-executor.js +0 -63
  588. package/src/build/server-side-css-shim-plugin.js +0 -35
  589. package/src/hmr/hmr.postcss.test.e2e.js +0 -31
  590. package/src/hmr/hmr.test.e2e.js +0 -43
  591. package/src/route-renderer/orchestration/component-render-context.js +0 -147
  592. package/src/route-renderer/orchestration/declared-ownership-graph.d.ts +0 -18
  593. package/src/route-renderer/orchestration/declared-ownership-graph.js +0 -34
  594. package/src/route-renderer/orchestration/foreign-subtree-execution.service.js +0 -233
  595. package/src/route-renderer/orchestration/ownership-planning.service.d.ts +0 -24
  596. package/src/route-renderer/orchestration/ownership-planning.service.js +0 -63
  597. package/src/route-renderer/orchestration/ownership-validation.service.js +0 -53
  598. package/src/route-renderer/orchestration/processed-asset-dedupe.js +0 -27
  599. package/src/route-renderer/orchestration/queued-foreign-subtree-resolution.service.d.ts +0 -91
  600. package/src/route-renderer/orchestration/queued-foreign-subtree-resolution.service.js +0 -170
  601. package/src/route-renderer/orchestration/render-output.utils.js +0 -171
  602. package/src/route-renderer/orchestration/route-render-orchestrator.js +0 -577
  603. package/src/route-renderer/orchestration/template-serialization.d.ts +0 -38
  604. package/src/route-renderer/orchestration/template-serialization.js +0 -45
  605. /package/src/adapters/shared/{runtime-host.d.ts → runtime/runtime-host.d.ts} +0 -0
  606. /package/src/{hmr/hmr.postcss.test.e2e.d.ts → adapters/shared/runtime/runtime-host.js} +0 -0
  607. /package/src/{hmr/hmr.test.e2e.d.ts → adapters/shared/runtime/static-preview-host.js} +0 -0
  608. /package/src/build/{browser-runtime-manifest.d.ts → browser/browser-runtime-manifest.d.ts} +0 -0
  609. /package/src/build/{browser-runtime-plugin-helpers.d.ts → browser/browser-runtime-plugin-helpers.d.ts} +0 -0
  610. /package/src/build/{build-types.d.ts → contracts/build-types.d.ts} +0 -0
  611. /package/src/build/{server-side-css-shim-plugin.d.ts → rolldown/server-side-css-shim-plugin.d.ts} +0 -0
@@ -1,313 +1,362 @@
1
- import { createServer } from "node:http";
2
- import path from "node:path";
3
- import { fileSystem } from "@ecopages/file-system";
4
- import { getAppBrowserBuildPlugins, setupAppRuntimePlugins } from "../../build/build-adapter.js";
5
- import { installAppRuntimeBuildExecutor } from "../../build/runtime-build-executor.js";
6
- import { RESOLVED_ASSETS_DIR } from "../../config/constants.js";
7
- import { appLogger } from "../../global/app-logger.js";
8
- import { NodeClientBridge } from "./node-client-bridge.js";
9
- import { NodeHmrManager } from "./node-hmr-manager.js";
10
- import { ProjectWatcher } from "../../watchers/project-watcher.js";
11
- import { StaticSiteGenerator } from "../../static-site-generator/static-site-generator.js";
12
- import { SharedServerAdapter } from "../shared/server-adapter.js";
13
- import { ServerStaticBuilder } from "../shared/server-static-builder.js";
14
- import { DEFAULT_ECOPAGES_HOSTNAME, DEFAULT_ECOPAGES_PORT } from "../../config/constants.js";
15
- import {
16
- injectHmrRuntimeIntoHtmlResponse,
17
- isHtmlResponse,
18
- shouldInjectHmrHtmlResponse
19
- } from "../shared/hmr-html-response.js";
20
- import { resolveServeRuntimeOrigin } from "../shared/runtime-app-bootstrap.js";
21
- import { NodeClientAbortError, NodeHttpRequestBridge } from "./http-request-bridge.js";
22
- import { NodeStaticPreviewHost } from "./static-preview-host.js";
23
- import { DefaultNodeServerDevRuntimeFactory } from "./server-adapter-dependencies.js";
24
- class NodeServerAdapter extends SharedServerAdapter {
25
- serverInstance = null;
26
- initialized = false;
27
- apiHandlers;
28
- staticRoutes;
29
- errorHandler;
30
- bridge = null;
31
- hmrManager = null;
32
- previewHost;
33
- requestBridge;
34
- devRuntimeFactory;
35
- shouldInjectHmrScript() {
36
- return shouldInjectHmrHtmlResponse(this.options?.watch === true, this.hmrManager ?? void 0);
37
- }
38
- isHtmlResponse(response) {
39
- return isHtmlResponse(response);
40
- }
41
- async maybeInjectHmrScript(response) {
42
- if (this.shouldInjectHmrScript() && this.isHtmlResponse(response)) {
43
- return injectHmrRuntimeIntoHtmlResponse(response);
1
+ import {} from 'node:http';
2
+ import path from 'node:path';
3
+ import { fileSystem } from '@ecopages/file-system';
4
+ import { setupAppRuntimePlugins } from '../../build/build-adapter.js';
5
+ import { installBuildRuntime } from '../../build/runtime/build-runtime.js';
6
+ import { appLogger } from '../../global/app-logger.js';
7
+ import { NodeClientBridge } from './node-client-bridge.js';
8
+ import { NodeHmrManager } from './node-hmr-manager.js';
9
+ import { ProjectWatcher } from '../../watchers/project-watcher.js';
10
+ import { attachNodeHttpWebSocketUpgrades, } from '../shared/ws/node-http-websocket-upgrades.js';
11
+ import { StaticSiteGenerator } from '../../static-site-generator/static-site-generator.js';
12
+ import { SharedServerAdapter } from '../shared/runtime/server-adapter.js';
13
+ import { ServerStaticBuilder } from '../shared/runtime/server-static-builder.js';
14
+ import { DEFAULT_ECOPAGES_HOSTNAME, DEFAULT_ECOPAGES_PORT } from '../../config/constants.js';
15
+ import { attachHmrToIntegrations, disposeDevResources, prepareRuntimePublicDir, startDevWarmup, } from '../shared/runtime/runtime-server-lifecycle.js';
16
+ import { resolveServeRuntimeOrigin } from '../shared/runtime/runtime-app-bootstrap.js';
17
+ import { NodeClientAbortError, NodeHttpRequestBridge } from './http-request-bridge.js';
18
+ import { NodeStaticPreviewHost } from './static-preview-host.js';
19
+ import { DefaultNodeServerDevRuntimeFactory } from './server-adapter-dependencies.js';
20
+ /**
21
+ * Node.js HTTP server adapter for the Ecopages runtime.
22
+ *
23
+ * `NodeServerAdapter` bridges the Node.js `http` module and the Ecopages
24
+ * `SharedServerAdapter` abstraction, translating between Node's
25
+ * `IncomingMessage`/`ServerResponse` API and the platform-agnostic Web
26
+ * `Request`/`Response` model.
27
+ *
28
+ * Lifecycle:
29
+ * 1. `createAdapter()` — calls `initialize()` and returns the public adapter result.
30
+ * 2. `completeInitialization(server)` — called once the HTTP server is listening.
31
+ * Conditionally wires HMR, WebSocket upgrades, and the file watcher when
32
+ * `options.watch` is `true`.
33
+ * 3. `handleRequest(request)` — delegates to `handleSharedRequest` for routing;
34
+ * intercepts `ClientAbortError` to return 499 instead of 500.
35
+ * 4. `buildStatic()` — spins up an ephemeral runtime server, generates all static
36
+ * pages against it, then tears it down.
37
+ *
38
+ * @see SharedServerAdapter for routing, caching and response handler logic.
39
+ */
40
+ export class NodeServerAdapter extends SharedServerAdapter {
41
+ serverInstance = null;
42
+ initialized = false;
43
+ apiHandlers;
44
+ staticRoutes;
45
+ errorHandler;
46
+ bridge = null;
47
+ hmrManager = null;
48
+ projectWatcher = null;
49
+ adapterDisposed = false;
50
+ deferRuntimeAssetSetup;
51
+ allowPortFallback;
52
+ previewHost;
53
+ requestBridge;
54
+ devRuntimeFactory;
55
+ /**
56
+ * Reference to the application-level WebSocket handlers map.
57
+ *
58
+ * @remarks
59
+ * This is a reference to the map owned by `AbstractApplicationAdapter`,
60
+ * passed in via the constructor. The Node adapter reads from it to wire
61
+ * WebSocket upgrades for user-registered patterns.
62
+ */
63
+ websocketHandlers = new Map();
64
+ /**
65
+ * Wires user WebSocket routes onto a foreign Node HTTP server.
66
+ *
67
+ * Host integrations such as the Vite plugin call this so `app.websocket()`
68
+ * handlers work while HTTP is still served by the host dev server.
69
+ */
70
+ attachUserWebSocketUpgrades(server, options) {
71
+ attachNodeHttpWebSocketUpgrades(server, {
72
+ runtimeOrigin: this.runtimeOrigin,
73
+ websocketHandlers: this.websocketHandlers,
74
+ passthroughUnmatched: options?.passthroughUnmatched,
75
+ });
44
76
  }
45
- return response;
46
- }
47
- constructor(options) {
48
- super(options);
49
- this.apiHandlers = options.apiHandlers || [];
50
- this.staticRoutes = options.staticRoutes || [];
51
- this.errorHandler = options.errorHandler;
52
- this.previewHost = options.previewHost;
53
- this.requestBridge = options.requestBridge;
54
- this.devRuntimeFactory = options.devRuntimeFactory;
55
- }
56
- /**
57
- * Prepares the adapter for use.
58
- *
59
- * Order is intentional:
60
- * 1. **Loaders** are registered first so processors and integrations can
61
- * reference loader-provided file types in their own plugins.
62
- * 2. **Public dir** is copied before any build so static assets are in `distDir`
63
- * before the first request arrives.
64
- * 3. **Plugins** (processors, then integrations) are set up after the public dir
65
- * is in place so they can safely reference dist-relative paths.
66
- * 4. **Router** is initialised last because it may depend on files written by
67
- * processors during their `setup()` calls.
68
- */
69
- async initialize() {
70
- installAppRuntimeBuildExecutor(this.appConfig);
71
- this.prepareRuntimePublicDir();
72
- await setupAppRuntimePlugins({
73
- appConfig: this.appConfig,
74
- runtimeOrigin: this.runtimeOrigin,
75
- hmrManager: this.hmrManager ?? void 0
76
- });
77
- await this.initializeSharedRouteHandling({
78
- staticRoutes: this.staticRoutes,
79
- hmrManager: this.hmrManager ?? void 0
80
- });
81
- this.staticSiteGenerator = new StaticSiteGenerator({ appConfig: this.appConfig });
82
- this.staticBuilder = new ServerStaticBuilder({
83
- appConfig: this.appConfig,
84
- staticSiteGenerator: this.staticSiteGenerator,
85
- serveOptions: this.serveOptions,
86
- apiHandlers: this.apiHandlers
87
- });
88
- this.initialized = true;
89
- }
90
- prepareRuntimePublicDir() {
91
- const srcPublicDir = path.join(this.appConfig.rootDir, this.appConfig.srcDir, this.appConfig.publicDir);
92
- if (fileSystem.exists(srcPublicDir)) {
93
- fileSystem.copyDir(srcPublicDir, path.join(this.appConfig.rootDir, this.appConfig.distDir));
77
+ wireUserWebSocketUpgrades(server, preflight) {
78
+ attachNodeHttpWebSocketUpgrades(server, {
79
+ runtimeOrigin: this.runtimeOrigin,
80
+ websocketHandlers: this.websocketHandlers,
81
+ passthroughUnmatched: false,
82
+ preflight,
83
+ });
94
84
  }
95
- fileSystem.ensureDir(path.join(this.appConfig.absolutePaths.distDir, RESOLVED_ASSETS_DIR));
96
- }
97
- getServerOptions() {
98
- return {
99
- ...this.serveOptions
100
- };
101
- }
102
- async buildStatic(options) {
103
- if (!this.initialized) {
104
- await this.initialize();
85
+ /**
86
+ * @remarks
87
+ * `previewHost`, `requestBridge`, and `devRuntimeFactory` are optional on the
88
+ * public {@link NodeServerAdapterParams} so factory callers can omit them, but
89
+ * they are mandatory by the time the concrete adapter is constructed —
90
+ * {@link createNodeServerAdapter} fills in Node-specific defaults first. The
91
+ * constructor signature makes that invariant explicit instead of relying on
92
+ * non-null assertions.
93
+ */
94
+ constructor(options) {
95
+ super(options);
96
+ this.deferRuntimeAssetSetup = options.deferRuntimeAssetSetup === true;
97
+ this.allowPortFallback = options.allowPortFallback !== false;
98
+ this.apiHandlers = options.apiHandlers || [];
99
+ this.staticRoutes = options.staticRoutes || [];
100
+ this.errorHandler = options.errorHandler;
101
+ this.previewHost = options.previewHost;
102
+ this.requestBridge = options.requestBridge;
103
+ this.devRuntimeFactory = options.devRuntimeFactory;
104
+ if (options.websocketHandlers) {
105
+ this.websocketHandlers = options.websocketHandlers;
106
+ }
107
+ this.hostOwnsDevClient = options.hostOwnsDevClient === true;
105
108
  }
106
- const buildServer = await this.startBuildRuntimeServer();
107
- const buildRuntimeOrigin = this.getListeningServerOrigin(buildServer);
108
- try {
109
- await this.staticBuilder.build(
110
- { preview: false, baseUrl: buildRuntimeOrigin },
111
- {
112
- router: this.router,
113
- routeRendererFactory: this.routeRendererFactory,
114
- staticRoutes: this.staticRoutes
109
+ /**
110
+ * Prepares the adapter for use.
111
+ *
112
+ * Order is intentional:
113
+ * 1. **Loaders** are registered first so processors and integrations can
114
+ * reference loader-provided file types in their own plugins.
115
+ * 2. **Public dir** is copied before any build so static assets are in `distDir`
116
+ * before the first request arrives.
117
+ * 3. **Plugins** (processors, then integrations) are set up after the public dir
118
+ * is in place so they can safely reference dist-relative paths.
119
+ * 4. **Router** is initialised last because it may depend on files written by
120
+ * processors during their `setup()` calls.
121
+ */
122
+ async initialize() {
123
+ installBuildRuntime(this.appConfig);
124
+ prepareRuntimePublicDir(this.appConfig);
125
+ if (!this.deferRuntimeAssetSetup) {
126
+ await setupAppRuntimePlugins({
127
+ appConfig: this.appConfig,
128
+ runtimeOrigin: this.runtimeOrigin,
129
+ });
115
130
  }
116
- );
117
- } finally {
118
- await this.stopBuildRuntimeServer(buildServer);
131
+ await this.initializeSharedRouteHandling({
132
+ staticRoutes: this.staticRoutes,
133
+ hmrManager: this.hmrManager ?? undefined,
134
+ });
135
+ this.staticSiteGenerator = new StaticSiteGenerator({ appConfig: this.appConfig });
136
+ this.staticBuilder = new ServerStaticBuilder({
137
+ appConfig: this.appConfig,
138
+ staticSiteGenerator: this.staticSiteGenerator,
139
+ serveOptions: this.serveOptions,
140
+ runtimeOrigin: this.runtimeOrigin,
141
+ needsServerBundle: this.apiHandlers.length > 0 || this.websocketHandlers.size > 0,
142
+ hmrManager: this.hmrManager ?? undefined,
143
+ });
144
+ this.initialized = true;
119
145
  }
120
- if (!options?.preview) {
121
- return;
146
+ getServerOptions() {
147
+ return {
148
+ ...this.serveOptions,
149
+ };
122
150
  }
123
- await this.previewHost.start({
124
- appConfig: this.appConfig,
125
- hostname: String(this.serveOptions.hostname || DEFAULT_ECOPAGES_HOSTNAME),
126
- port: Number(this.serveOptions.port || DEFAULT_ECOPAGES_PORT)
127
- });
128
- const previewHostname = this.serveOptions.hostname || DEFAULT_ECOPAGES_HOSTNAME;
129
- const previewPort = this.serveOptions.port || DEFAULT_ECOPAGES_PORT;
130
- appLogger.info(`Preview running at http://${previewHostname}:${previewPort}`);
131
- }
132
- async startBuildRuntimeServer() {
133
- const hostname = String(this.serveOptions.hostname || DEFAULT_ECOPAGES_HOSTNAME);
134
- const port = 0;
135
- const server = createServer(async (req, res) => {
136
- try {
137
- const webRequest = this.requestBridge.createWebRequest(req, this.runtimeOrigin);
138
- const response = await this.handleRequest(webRequest);
139
- await this.requestBridge.sendNodeResponse(res, response);
140
- } catch (error) {
141
- if (error instanceof NodeClientAbortError) {
142
- return;
151
+ async buildStatic(options) {
152
+ if (!this.initialized) {
153
+ await this.initialize();
143
154
  }
144
- appLogger.error("Node static build runtime request failed", error);
145
- res.statusCode = 500;
146
- res.end("Internal Server Error");
147
- }
148
- });
149
- await new Promise((resolve, reject) => {
150
- server.once("error", reject);
151
- server.listen(port, hostname, () => {
152
- server.off("error", reject);
153
- resolve();
154
- });
155
- });
156
- this.serverInstance = server;
157
- appLogger.info(`Server running at ${this.getListeningServerOrigin(server)}`);
158
- return server;
159
- }
160
- getListeningServerOrigin(server) {
161
- const address = server.address();
162
- const hostname = String(this.serveOptions.hostname || DEFAULT_ECOPAGES_HOSTNAME);
163
- if (!address || typeof address === "string") {
164
- throw new Error("Build runtime server did not expose a numeric listening port");
155
+ const baseUrl = resolveServeRuntimeOrigin(this.serveOptions);
156
+ await this.staticBuilder.build({ baseUrl, force: options?.force }, {
157
+ router: this.router,
158
+ routeRendererFactory: this.routeRendererFactory,
159
+ staticRoutes: this.staticRoutes,
160
+ });
161
+ if (!options?.preview) {
162
+ return undefined;
163
+ }
164
+ return this.startPreviewServer();
165
165
  }
166
- return `http://${hostname}:${address.port}`;
167
- }
168
- /**
169
- * Gracefully shuts down the ephemeral build runtime server.
170
- *
171
- * `closeAllConnections()` is called *before* `close()` because `server.close()`
172
- * only stops accepting new connections — it waits for existing keep-alive
173
- * connections to finish naturally, which can stall the build indefinitely.
174
- * `closeAllConnections()` force-closes any lingering sockets immediately so
175
- * the `close()` callback fires promptly.
176
- *
177
- * The `NodeClientBridge` heartbeat is also destroyed here so its `setInterval`
178
- * does not prevent the Node.js process from exiting cleanly after the build.
179
- */
180
- async stopBuildRuntimeServer(server) {
181
- await new Promise((resolve, reject) => {
182
- server.close((error) => {
183
- if (error) {
184
- reject(error);
185
- return;
166
+ /**
167
+ * Serves an existing static export without running SSG. Used by e2e preview
168
+ * launchers after a shared prewarm build.
169
+ */
170
+ async servePreviewOnly() {
171
+ if (!this.initialized) {
172
+ await this.initialize();
186
173
  }
187
- resolve();
188
- });
189
- server.closeAllConnections();
190
- });
191
- if (this.serverInstance === server) {
192
- this.serverInstance = null;
174
+ const distPath = path.join(this.appConfig.rootDir, this.appConfig.distDir);
175
+ if (!fileSystem.exists(distPath)) {
176
+ throw new Error(`Cannot serve preview without building first: dist directory "${this.appConfig.distDir}" not found in "${this.appConfig.rootDir}".`);
177
+ }
178
+ return this.startPreviewServer();
193
179
  }
194
- this.bridge?.destroy();
195
- this.bridge = null;
196
- }
197
- async createAdapter() {
198
- await this.initialize();
199
- return {
200
- getServerOptions: this.getServerOptions.bind(this),
201
- buildStatic: this.buildStatic.bind(this),
202
- completeInitialization: this.completeInitialization.bind(this),
203
- handleRequest: this.handleRequest.bind(this)
204
- };
205
- }
206
- /**
207
- * Handles a single incoming Web `Request` and returns a Web `Response`.
208
- *
209
- * Delegates to `handleSharedRequest` for all routing, caching, and response
210
- * handler logic. The only Node-specific concern here is translating a
211
- * `ClientAbortError` — which the body `ReadableStream` raises when the
212
- * underlying socket closes early — into a 499 response so it does not
213
- * incorrectly surface as a 500 in application logs.
214
- */
215
- async handleRequest(request) {
216
- if (!this.initialized) {
217
- throw new Error("Node server adapter is not initialized. Call createAdapter() first.");
180
+ async startPreviewServer() {
181
+ const activePreviewPort = await this.previewHost.start({
182
+ appConfig: this.appConfig,
183
+ hostname: String(this.serveOptions.hostname || DEFAULT_ECOPAGES_HOSTNAME),
184
+ port: Number(this.serveOptions.port || DEFAULT_ECOPAGES_PORT),
185
+ allowPortFallback: this.allowPortFallback,
186
+ });
187
+ if (!activePreviewPort) {
188
+ return undefined;
189
+ }
190
+ const previewHostname = this.serveOptions.hostname || DEFAULT_ECOPAGES_HOSTNAME;
191
+ return `http://${previewHostname}:${activePreviewPort}`;
218
192
  }
219
- try {
220
- const response = await this.handleSharedRequest(request, {
221
- apiHandlers: this.apiHandlers,
222
- errorHandler: this.errorHandler,
223
- serverInstance: this.serverInstance,
224
- hmrManager: this.hmrManager
225
- });
226
- return await this.maybeInjectHmrScript(response);
227
- } catch (error) {
228
- if (error instanceof NodeClientAbortError) {
229
- return new Response(null, { status: 499 });
230
- }
231
- throw error;
193
+ async createAdapter() {
194
+ await this.initialize();
195
+ return {
196
+ getServerOptions: this.getServerOptions.bind(this),
197
+ buildStatic: this.buildStatic.bind(this),
198
+ servePreviewOnly: this.servePreviewOnly.bind(this),
199
+ completeInitialization: this.completeInitialization.bind(this),
200
+ handleRequest: this.handleRequest.bind(this),
201
+ attachUserWebSocketUpgrades: this.attachUserWebSocketUpgrades.bind(this),
202
+ listStaticGenerationRoutes: (input) => this.router.listStaticGenerationRoutes(input),
203
+ dispose: this.dispose.bind(this),
204
+ };
232
205
  }
233
- }
234
- /**
235
- * Called once the HTTP server is bound and listening.
236
- *
237
- * When `options.watch` is `true` this method wires the full HMR pipeline:
238
- * - A `WebSocketServer` is attached to the existing HTTP server via the
239
- * `upgrade` event (no separate port needed).
240
- * - `NodeClientBridge` tracks active WebSocket connections and handles
241
- * broadcast + heartbeat cleanup.
242
- * - `NodeHmrManager` watches the filesystem and triggers incremental
243
- * rebuilds, notifying connected clients via the bridge.
244
- * - Shared watcher bootstrapping listens for route-level file changes and
245
- * refreshes the router and response handlers when pages are added or removed.
246
- *
247
- * WebSocket upgrade requests that do not target `/_hmr` are rejected with an
248
- * immediate socket destroy to prevent unhandled upgrade leaks.
249
- */
250
- async completeInitialization(server) {
251
- this.serverInstance = server;
252
- if (this.options?.watch) {
253
- const devRuntime = this.devRuntimeFactory.create({ appConfig: this.appConfig });
254
- const wss = devRuntime.websocketServer;
255
- this.bridge = devRuntime.bridge;
256
- this.hmrManager = devRuntime.hmrManager;
257
- this.hmrManager.setEnabled(true);
258
- await this.hmrManager.buildRuntime();
259
- server.on("upgrade", (req, socket, head) => {
260
- const url = new URL(req.url ?? "/", this.runtimeOrigin);
261
- if (url.pathname === "/_hmr") {
262
- wss.handleUpgrade(req, socket, head, (ws) => {
263
- this.bridge.subscribe(ws);
264
- ws.on("close", () => this.bridge.unsubscribe(ws));
265
- ws.on("error", (err) => appLogger.error("[HMR] WebSocket error:", err));
266
- });
267
- } else {
268
- socket.destroy();
206
+ /**
207
+ * Releases dev-time resources owned by the adapter.
208
+ *
209
+ * @remarks
210
+ * Safe to call multiple times. Does not stop the bound HTTP server — callers
211
+ * should shut down transport through the runtime host before disposing.
212
+ */
213
+ async dispose() {
214
+ if (this.adapterDisposed) {
215
+ return;
269
216
  }
270
- });
271
- const browserBuildPlugins = getAppBrowserBuildPlugins(this.appConfig);
272
- this.hmrManager.setPlugins(browserBuildPlugins);
273
- for (const integration of this.appConfig.integrations) {
274
- integration.setHmrManager(this.hmrManager);
275
- }
276
- this.configureSharedResponseHandlers(this.staticRoutes, this.hmrManager);
277
- const watcher = new ProjectWatcher({
278
- config: this.appConfig,
279
- refreshRouterRoutesCallback: this.createSharedWatchRefreshCallback({
280
- staticRoutes: this.staticRoutes,
281
- hmrManager: this.hmrManager
282
- }),
283
- hmrManager: this.hmrManager,
284
- bridge: this.bridge
285
- });
286
- await watcher.createWatcherSubscription();
217
+ this.adapterDisposed = true;
218
+ await disposeDevResources({
219
+ projectWatcher: this.projectWatcher,
220
+ appConfig: this.appConfig,
221
+ hmrManager: this.hmrManager,
222
+ bridge: this.bridge,
223
+ previewHost: this.previewHost,
224
+ });
225
+ this.projectWatcher = null;
226
+ this.hmrManager = null;
227
+ this.bridge = null;
228
+ }
229
+ /**
230
+ * Handles a single incoming Web `Request` and returns a Web `Response`.
231
+ *
232
+ * Delegates to `handleSharedRequest` for all routing, caching, and response
233
+ * handler logic. The only Node-specific concern here is translating a
234
+ * `ClientAbortError` — which the body `ReadableStream` raises when the
235
+ * underlying socket closes early — into a 499 response so it does not
236
+ * incorrectly surface as a 500 in application logs.
237
+ */
238
+ async handleRequest(request) {
239
+ if (!this.initialized) {
240
+ throw new Error('Node server adapter is not initialized. Call createAdapter() first.');
241
+ }
242
+ try {
243
+ const response = await this.handleSharedRequest(request, {
244
+ apiHandlers: this.apiHandlers,
245
+ errorHandler: this.errorHandler,
246
+ serverInstance: this.serverInstance,
247
+ hmrManager: this.hmrManager ?? undefined,
248
+ });
249
+ return response;
250
+ }
251
+ catch (error) {
252
+ if (error instanceof NodeClientAbortError) {
253
+ /**
254
+ * The client disconnected before the response was sent (killed tab,
255
+ * network drop, or programmatic abort). This is a normal browser behaviour,
256
+ * not a server fault. Return 499 (Client Closed Request) silently so the
257
+ * error does not surface in application logs as a 500.
258
+ */
259
+ return new Response(null, { status: 499 });
260
+ }
261
+ throw error;
262
+ }
263
+ }
264
+ /**
265
+ * Called once the HTTP server is bound and listening.
266
+ *
267
+ * When `options.watch` is `true` this method wires the full HMR pipeline:
268
+ * - A `WebSocketServer` is attached to the existing HTTP server via the
269
+ * `upgrade` event (no separate port needed).
270
+ * - `NodeClientBridge` tracks active WebSocket connections and handles
271
+ * broadcast + heartbeat cleanup.
272
+ * - `NodeHmrManager` watches the filesystem and triggers incremental
273
+ * rebuilds, notifying connected clients via the bridge.
274
+ * - Shared watcher bootstrapping listens for route-level file changes and
275
+ * refreshes the router and response handlers when pages are added or removed.
276
+ *
277
+ * WebSocket upgrade requests that do not match a known path are rejected with an
278
+ * immediate socket destroy to prevent unhandled upgrade leaks.
279
+ */
280
+ async completeInitialization(server) {
281
+ this.serverInstance = server;
282
+ const hasUserWs = this.websocketHandlers.size > 0;
283
+ if (this.options?.watch) {
284
+ const devRuntime = this.devRuntimeFactory.create({ appConfig: this.appConfig });
285
+ const wss = devRuntime.websocketServer;
286
+ this.bridge = devRuntime.bridge;
287
+ this.hmrManager = devRuntime.hmrManager;
288
+ this.hmrManager.setEnabled(true);
289
+ await this.hmrManager.ensureRuntimeReady();
290
+ const hmrPreflight = (req, socket, head) => {
291
+ const url = new URL(req.url ?? '/', this.runtimeOrigin);
292
+ if (url.pathname !== '/_hmr')
293
+ return false;
294
+ wss.handleUpgrade(req, socket, head, (ws) => {
295
+ this.bridge.subscribe(ws);
296
+ ws.on('close', () => this.bridge.unsubscribe(ws));
297
+ ws.on('error', (err) => appLogger.error('[HMR] WebSocket error:', err));
298
+ });
299
+ return true;
300
+ };
301
+ if (hasUserWs) {
302
+ this.wireUserWebSocketUpgrades(server, hmrPreflight);
303
+ }
304
+ else {
305
+ server.on('upgrade', (req, socket, head) => {
306
+ if (!hmrPreflight(req, socket, head)) {
307
+ socket.destroy();
308
+ }
309
+ });
310
+ }
311
+ attachHmrToIntegrations(this.appConfig, this.hmrManager);
312
+ startDevWarmup({
313
+ appConfig: this.appConfig,
314
+ runtimeOrigin: this.runtimeOrigin,
315
+ });
316
+ this.configureSharedResponseHandlers(this.staticRoutes, this.hmrManager);
317
+ await this.startDevStaticRoutePrewarmWhenReady();
318
+ const watcher = new ProjectWatcher({
319
+ config: this.appConfig,
320
+ refreshRouterRoutesCallback: this.createSharedWatchRefreshCallback({
321
+ staticRoutes: this.staticRoutes,
322
+ hmrManager: this.hmrManager ?? undefined,
323
+ }),
324
+ hmrManager: this.hmrManager ?? undefined,
325
+ bridge: this.bridge,
326
+ hostOwnsDevClient: this.hostOwnsDevClient,
327
+ });
328
+ this.projectWatcher = watcher;
329
+ await watcher.createWatcherSubscription();
330
+ }
331
+ else if (hasUserWs) {
332
+ this.wireUserWebSocketUpgrades(server);
333
+ }
334
+ appLogger.debug('Node server adapter initialization completed', {
335
+ apiHandlers: this.apiHandlers.length,
336
+ staticRoutes: this.staticRoutes.length,
337
+ hasErrorHandler: !!this.errorHandler,
338
+ hmrEnabled: !!this.hmrManager?.isEnabled(),
339
+ });
287
340
  }
288
- appLogger.debug("Node server adapter initialization completed", {
289
- apiHandlers: this.apiHandlers.length,
290
- staticRoutes: this.staticRoutes.length,
291
- hasErrorHandler: !!this.errorHandler,
292
- hmrEnabled: !!this.hmrManager?.isEnabled()
293
- });
294
- }
295
341
  }
296
- async function createNodeServerAdapter(params) {
297
- const runtimeOrigin = params.runtimeOrigin ?? resolveServeRuntimeOrigin(params.serveOptions);
298
- const previewHost = params.previewHost ?? new NodeStaticPreviewHost();
299
- const requestBridge = params.requestBridge ?? new NodeHttpRequestBridge();
300
- const devRuntimeFactory = params.devRuntimeFactory ?? new DefaultNodeServerDevRuntimeFactory();
301
- const adapter = new NodeServerAdapter({
302
- ...params,
303
- runtimeOrigin,
304
- previewHost,
305
- requestBridge,
306
- devRuntimeFactory
307
- });
308
- return adapter.createAdapter();
342
+ /**
343
+ * Factory function that creates and fully initialises a `NodeServerAdapter`.
344
+ *
345
+ * `runtimeOrigin` is derived from `serveOptions` when not explicitly provided,
346
+ * so callers only need to set it when the server is behind a reverse proxy that
347
+ * changes the effective host or port.
348
+ */
349
+ export async function createNodeServerAdapter(params) {
350
+ const runtimeOrigin = params.runtimeOrigin ?? resolveServeRuntimeOrigin(params.serveOptions);
351
+ const previewHost = params.previewHost ?? new NodeStaticPreviewHost();
352
+ const requestBridge = params.requestBridge ?? new NodeHttpRequestBridge();
353
+ const devRuntimeFactory = params.devRuntimeFactory ?? new DefaultNodeServerDevRuntimeFactory();
354
+ const adapter = new NodeServerAdapter({
355
+ ...params,
356
+ runtimeOrigin,
357
+ previewHost,
358
+ requestBridge,
359
+ devRuntimeFactory,
360
+ });
361
+ return adapter.createAdapter();
309
362
  }
310
- export {
311
- NodeServerAdapter,
312
- createNodeServerAdapter
313
- };