@ecopages/core 0.2.0-alpha.9 → 0.2.1-beta.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 (471) hide show
  1. package/README.md +79 -28
  2. package/package.json +94 -116
  3. package/src/adapters/README.md +2 -2
  4. package/src/adapters/abstract/application-adapter.d.ts +28 -2
  5. package/src/adapters/abstract/application-adapter.js +14 -2
  6. package/src/adapters/abstract/router-adapter.d.ts +1 -1
  7. package/src/adapters/abstract/server-adapter.d.ts +2 -2
  8. package/src/adapters/bun/client-bridge.d.ts +1 -1
  9. package/src/adapters/bun/create-app.d.ts +12 -12
  10. package/src/adapters/bun/create-app.js +64 -41
  11. package/src/adapters/bun/hmr-manager.d.ts +19 -115
  12. package/src/adapters/bun/hmr-manager.js +25 -301
  13. package/src/adapters/bun/index.d.ts +1 -1
  14. package/src/adapters/bun/index.js +2 -2
  15. package/src/adapters/bun/runtime-host.d.ts +52 -0
  16. package/src/adapters/bun/runtime-host.js +56 -0
  17. package/src/adapters/bun/server-adapter.d.ts +100 -32
  18. package/src/adapters/bun/server-adapter.js +142 -65
  19. package/src/adapters/bun/static-preview-host.d.ts +28 -0
  20. package/src/adapters/bun/static-preview-host.js +45 -0
  21. package/src/{create-app.d.ts → adapters/create-app.d.ts} +9 -6
  22. package/src/{create-app.js → adapters/create-app.js} +4 -4
  23. package/src/adapters/index.d.ts +1 -5
  24. package/src/adapters/index.js +1 -7
  25. package/src/adapters/node/create-app.d.ts +15 -12
  26. package/src/adapters/node/create-app.js +34 -85
  27. package/src/adapters/node/http-request-bridge.d.ts +57 -0
  28. package/src/adapters/node/http-request-bridge.js +118 -0
  29. package/src/adapters/node/node-client-bridge.d.ts +1 -1
  30. package/src/adapters/node/node-hmr-manager.d.ts +22 -103
  31. package/src/adapters/node/node-hmr-manager.js +26 -289
  32. package/src/adapters/node/runtime-host.d.ts +57 -0
  33. package/src/adapters/node/runtime-host.js +92 -0
  34. package/src/adapters/node/server-adapter-dependencies.d.ts +19 -0
  35. package/src/adapters/node/server-adapter-dependencies.js +18 -0
  36. package/src/adapters/node/server-adapter.d.ts +19 -42
  37. package/src/adapters/node/server-adapter.js +94 -139
  38. package/src/adapters/node/static-content-server.d.ts +1 -1
  39. package/src/adapters/node/static-content-server.js +1 -1
  40. package/src/adapters/node/static-preview-host.d.ts +55 -0
  41. package/src/adapters/node/static-preview-host.js +68 -0
  42. package/src/adapters/shared/application-adapter.d.ts +1 -1
  43. package/src/adapters/shared/define-api-handler.d.ts +1 -1
  44. package/src/adapters/shared/explicit-static-render-preparation.d.ts +25 -0
  45. package/src/adapters/shared/explicit-static-render-preparation.js +26 -0
  46. package/src/adapters/shared/explicit-static-route-matcher.d.ts +7 -4
  47. package/src/adapters/shared/explicit-static-route-matcher.js +14 -16
  48. package/src/adapters/shared/file-route-middleware-pipeline.d.ts +7 -10
  49. package/src/adapters/shared/file-route-middleware-pipeline.js +2 -11
  50. package/src/adapters/shared/fs-server-response-factory.d.ts +14 -10
  51. package/src/adapters/shared/fs-server-response-factory.js +11 -27
  52. package/src/adapters/shared/fs-server-response-matcher.d.ts +18 -18
  53. package/src/adapters/shared/fs-server-response-matcher.js +72 -46
  54. package/src/adapters/shared/hmr-entrypoint-registrar.js +1 -1
  55. package/src/adapters/shared/hmr-html-response.d.ts +1 -1
  56. package/src/adapters/shared/hmr-html-response.js +4 -3
  57. package/src/adapters/shared/render-context.d.ts +5 -3
  58. package/src/adapters/shared/render-context.js +24 -1
  59. package/src/adapters/shared/runtime-app-bootstrap.d.ts +26 -0
  60. package/src/adapters/shared/runtime-app-bootstrap.js +46 -0
  61. package/src/adapters/shared/runtime-host.d.ts +12 -0
  62. package/src/adapters/shared/server-adapter.d.ts +22 -11
  63. package/src/adapters/shared/server-adapter.js +183 -133
  64. package/src/adapters/shared/server-route-handler.d.ts +5 -5
  65. package/src/adapters/shared/server-route-handler.js +4 -4
  66. package/src/adapters/shared/server-static-builder.d.ts +8 -7
  67. package/src/adapters/shared/server-static-builder.js +6 -5
  68. package/src/adapters/shared/shared-hmr-manager.d.ts +59 -0
  69. package/src/adapters/shared/shared-hmr-manager.js +241 -0
  70. package/src/adapters/shared/static-preview-host.d.ts +10 -0
  71. package/src/build/README.md +57 -67
  72. package/src/build/browser-runtime-manifest.d.ts +31 -0
  73. package/src/build/browser-runtime-manifest.js +61 -0
  74. package/src/build/browser-runtime-plugin-helpers.d.ts +26 -0
  75. package/src/build/browser-runtime-plugin-helpers.js +14 -0
  76. package/src/build/browser-runtime-plugin.d.ts +78 -0
  77. package/src/build/browser-runtime-plugin.js +173 -0
  78. package/src/build/build-adapter.d.ts +384 -63
  79. package/src/build/build-adapter.js +129 -54
  80. package/src/build/build-manifest.d.ts +6 -0
  81. package/src/build/build-manifest.js +21 -2
  82. package/src/build/build-types.d.ts +2 -2
  83. package/src/build/rolldown-adapter-helpers.d.ts +58 -0
  84. package/src/build/rolldown-adapter-helpers.js +265 -0
  85. package/src/build/rolldown-build-adapter.d.ts +28 -0
  86. package/src/build/rolldown-build-adapter.js +65 -0
  87. package/src/build/rolldown-dev-build-adapter.d.ts +82 -0
  88. package/src/build/rolldown-dev-build-adapter.js +166 -0
  89. package/src/build/rolldown-plugin-bridge.d.ts +59 -0
  90. package/src/build/rolldown-plugin-bridge.js +199 -0
  91. package/src/build/runtime-build-executor.d.ts +15 -7
  92. package/src/build/runtime-build-executor.js +8 -9
  93. package/src/build/runtime-build-output-normalizer.d.ts +3 -0
  94. package/src/build/runtime-build-output-normalizer.js +111 -0
  95. package/src/build/serialized-build-executor.d.ts +64 -0
  96. package/src/build/serialized-build-executor.js +63 -0
  97. package/src/build/server-side-css-shim-plugin.d.ts +41 -0
  98. package/src/build/server-side-css-shim-plugin.js +35 -0
  99. package/src/cache/index.d.ts +6 -0
  100. package/src/cache/index.js +6 -0
  101. package/src/cache/module-parse-cache.d.ts +65 -0
  102. package/src/cache/module-parse-cache.js +75 -0
  103. package/src/config/README.md +5 -2
  104. package/src/config/config-builder.d.ts +41 -13
  105. package/src/config/config-builder.js +62 -24
  106. package/src/declarations.d.ts +1 -1
  107. package/src/dev/host-runtime.d.ts +10 -0
  108. package/src/dev/host-runtime.js +24 -0
  109. package/src/dev/sc-server.d.ts +1 -1
  110. package/src/dev/sc-server.js +1 -1
  111. package/src/eco/eco.browser.d.ts +2 -0
  112. package/src/eco/eco.browser.js +88 -0
  113. package/src/eco/eco.js +50 -45
  114. package/src/eco/eco.types.d.ts +60 -8
  115. package/src/eco/eco.utils.d.ts +1 -40
  116. package/src/eco/eco.utils.js +5 -35
  117. package/src/eco/global-injector-map.d.ts +3 -3
  118. package/src/eco/global-injector-map.js +2 -2
  119. package/src/eco/lazy-injector-map.d.ts +2 -2
  120. package/src/errors/index.d.ts +1 -0
  121. package/src/errors/index.js +3 -1
  122. package/src/hmr/client/hmr-runtime.js +9 -1
  123. package/src/hmr/hmr-strategy.d.ts +16 -13
  124. package/src/hmr/hmr-strategy.js +22 -7
  125. package/src/hmr/strategies/default-hmr-strategy.d.ts +2 -2
  126. package/src/hmr/strategies/default-hmr-strategy.js +1 -1
  127. package/src/hmr/strategies/js-hmr-strategy.d.ts +4 -9
  128. package/src/hmr/strategies/js-hmr-strategy.js +5 -10
  129. package/src/index.browser.d.ts +2 -2
  130. package/src/index.browser.js +1 -1
  131. package/src/index.d.ts +3 -2
  132. package/src/index.js +15 -4
  133. package/src/integrations/ghtml/ghtml-renderer.d.ts +2 -1
  134. package/src/integrations/ghtml/ghtml-renderer.js +24 -29
  135. package/src/integrations/ghtml/ghtml.constants.d.ts +1 -0
  136. package/src/integrations/ghtml/ghtml.constants.js +4 -0
  137. package/src/integrations/ghtml/ghtml.plugin.d.ts +2 -6
  138. package/src/integrations/ghtml/ghtml.plugin.js +3 -4
  139. package/src/plugins/README.md +1 -0
  140. package/src/plugins/alias-resolver-cache.d.ts +68 -0
  141. package/src/plugins/alias-resolver-cache.js +106 -0
  142. package/src/plugins/alias-resolver-plugin.d.ts +5 -1
  143. package/src/plugins/alias-resolver-plugin.js +19 -7
  144. package/src/plugins/eco-component-meta-plugin.d.ts +12 -1
  145. package/src/plugins/eco-component-meta-plugin.js +43 -25
  146. package/src/plugins/foreign-jsx-override-plugin.d.ts +33 -0
  147. package/src/plugins/foreign-jsx-override-plugin.js +41 -0
  148. package/src/plugins/integration-plugin.d.ts +136 -42
  149. package/src/plugins/integration-plugin.js +99 -31
  150. package/src/plugins/processor.d.ts +4 -2
  151. package/src/plugins/processor.js +8 -3
  152. package/src/plugins/source-transform.d.ts +46 -0
  153. package/src/plugins/source-transform.js +71 -0
  154. package/src/route-renderer/GRAPH.md +80 -318
  155. package/src/route-renderer/README.md +74 -78
  156. package/src/route-renderer/orchestration/component-render-context.d.ts +97 -0
  157. package/src/route-renderer/orchestration/component-render-context.js +147 -0
  158. package/src/route-renderer/orchestration/declared-ownership-graph.d.ts +18 -0
  159. package/src/route-renderer/orchestration/declared-ownership-graph.js +34 -0
  160. package/src/route-renderer/orchestration/foreign-subtree-execution.service.d.ts +110 -0
  161. package/src/route-renderer/orchestration/foreign-subtree-execution.service.js +233 -0
  162. package/src/route-renderer/orchestration/integration-renderer.d.ts +290 -128
  163. package/src/route-renderer/orchestration/integration-renderer.js +660 -258
  164. package/src/route-renderer/orchestration/ownership-planning.service.d.ts +24 -0
  165. package/src/route-renderer/orchestration/ownership-planning.service.js +63 -0
  166. package/src/route-renderer/orchestration/ownership-validation.service.d.ts +29 -0
  167. package/src/route-renderer/orchestration/ownership-validation.service.js +53 -0
  168. package/src/route-renderer/orchestration/processed-asset-dedupe.d.ts +3 -0
  169. package/src/route-renderer/orchestration/processed-asset-dedupe.js +27 -0
  170. package/src/route-renderer/orchestration/queued-foreign-subtree-resolution.service.d.ts +91 -0
  171. package/src/route-renderer/orchestration/queued-foreign-subtree-resolution.service.js +170 -0
  172. package/src/route-renderer/orchestration/render-output.utils.d.ts +66 -0
  173. package/src/route-renderer/orchestration/render-output.utils.js +171 -0
  174. package/src/route-renderer/orchestration/route-render-orchestrator.d.ts +156 -0
  175. package/src/route-renderer/orchestration/route-render-orchestrator.js +577 -0
  176. package/src/route-renderer/orchestration/template-serialization.d.ts +38 -0
  177. package/src/route-renderer/orchestration/template-serialization.js +45 -0
  178. package/src/route-renderer/page-loading/component-dependency-collection.d.ts +37 -0
  179. package/src/route-renderer/page-loading/component-dependency-collection.js +132 -0
  180. package/src/route-renderer/page-loading/declared-asset-collection.d.ts +24 -0
  181. package/src/route-renderer/page-loading/declared-asset-collection.js +106 -0
  182. package/src/route-renderer/page-loading/dependency-resolver.d.ts +2 -2
  183. package/src/route-renderer/page-loading/dependency-resolver.js +27 -354
  184. package/src/route-renderer/page-loading/ecopages-virtual-imports.d.ts +11 -0
  185. package/src/route-renderer/page-loading/ecopages-virtual-imports.js +57 -0
  186. package/src/route-renderer/page-loading/lazy-entry-collection.d.ts +45 -0
  187. package/src/route-renderer/page-loading/lazy-entry-collection.js +105 -0
  188. package/src/route-renderer/page-loading/lazy-trigger-planning.d.ts +19 -0
  189. package/src/route-renderer/page-loading/lazy-trigger-planning.js +40 -0
  190. package/src/route-renderer/page-loading/module-declaration-aggregation.d.ts +5 -0
  191. package/src/route-renderer/page-loading/module-declaration-aggregation.js +33 -0
  192. package/src/route-renderer/page-loading/module-declaration-scripts.d.ts +3 -0
  193. package/src/route-renderer/page-loading/module-declaration-scripts.js +18 -0
  194. package/src/route-renderer/page-loading/page-dependency-bundling.d.ts +13 -0
  195. package/src/route-renderer/page-loading/page-dependency-bundling.js +137 -0
  196. package/src/route-renderer/page-loading/page-module-loader.d.ts +7 -4
  197. package/src/route-renderer/page-loading/page-module-loader.js +8 -5
  198. package/src/route-renderer/route-renderer.d.ts +31 -23
  199. package/src/route-renderer/route-renderer.js +17 -24
  200. package/src/router/README.md +76 -8
  201. package/src/router/client/navigation-coordinator.d.ts +20 -0
  202. package/src/router/client/navigation-coordinator.js +2 -2
  203. package/src/router/server/route-registry.d.ts +78 -0
  204. package/src/router/server/route-registry.js +262 -0
  205. package/src/services/README.md +1 -2
  206. package/src/services/assets/asset-processing-service/asset-dependency-keys.d.ts +3 -0
  207. package/src/services/assets/asset-processing-service/asset-dependency-keys.js +56 -0
  208. package/src/services/assets/asset-processing-service/asset-processing.service.d.ts +3 -20
  209. package/src/services/assets/asset-processing-service/asset-processing.service.js +52 -98
  210. package/src/services/assets/asset-processing-service/asset.factory.d.ts +1 -1
  211. package/src/services/assets/asset-processing-service/asset.factory.js +2 -2
  212. package/src/services/assets/asset-processing-service/assets.types.d.ts +14 -0
  213. package/src/services/assets/asset-processing-service/browser-runtime-asset.factory.d.ts +2 -0
  214. package/src/services/assets/asset-processing-service/browser-runtime-asset.factory.js +1 -0
  215. package/src/services/assets/asset-processing-service/grouped-content-bundles.d.ts +30 -0
  216. package/src/services/assets/asset-processing-service/grouped-content-bundles.js +65 -0
  217. package/src/services/assets/asset-processing-service/index.d.ts +6 -5
  218. package/src/services/assets/asset-processing-service/index.js +6 -5
  219. package/src/services/assets/asset-processing-service/page-package.d.ts +6 -0
  220. package/src/services/assets/asset-processing-service/page-package.js +80 -0
  221. package/src/services/assets/asset-processing-service/processor.interface.d.ts +2 -2
  222. package/src/services/assets/asset-processing-service/processor.registry.d.ts +2 -2
  223. package/src/services/assets/asset-processing-service/processors/base/base-processor.d.ts +1 -1
  224. package/src/services/assets/asset-processing-service/processors/base/base-processor.js +3 -2
  225. package/src/services/assets/asset-processing-service/processors/base/base-script-processor.d.ts +10 -5
  226. package/src/services/assets/asset-processing-service/processors/base/base-script-processor.js +69 -5
  227. package/src/services/assets/asset-processing-service/processors/index.d.ts +5 -5
  228. package/src/services/assets/asset-processing-service/processors/index.js +5 -5
  229. package/src/services/assets/asset-processing-service/processors/script/content-script.processor.d.ts +3 -2
  230. package/src/services/assets/asset-processing-service/processors/script/content-script.processor.js +66 -3
  231. package/src/services/assets/asset-processing-service/processors/script/file-script.processor.d.ts +4 -3
  232. package/src/services/assets/asset-processing-service/processors/script/file-script.processor.js +27 -6
  233. package/src/services/assets/asset-processing-service/processors/script/node-module-script.processor.d.ts +38 -3
  234. package/src/services/assets/asset-processing-service/processors/script/node-module-script.processor.js +57 -6
  235. package/src/services/assets/asset-processing-service/processors/stylesheet/content-stylesheet.processor.d.ts +5 -2
  236. package/src/services/assets/asset-processing-service/processors/stylesheet/content-stylesheet.processor.js +39 -5
  237. package/src/services/assets/asset-processing-service/processors/stylesheet/file-stylesheet.processor.d.ts +2 -2
  238. package/src/services/assets/asset-processing-service/processors/stylesheet/file-stylesheet.processor.js +5 -2
  239. package/src/services/assets/asset-processing-service/ungrouped-dependency-processing.d.ts +18 -0
  240. package/src/services/assets/asset-processing-service/ungrouped-dependency-processing.js +45 -0
  241. package/src/services/assets/browser-bundle.service.d.ts +44 -3
  242. package/src/services/assets/browser-bundle.service.js +15 -7
  243. package/src/services/html/html-rewriter-provider.service.d.ts +3 -0
  244. package/src/services/html/html-rewriter-provider.service.js +4 -1
  245. package/src/services/html/html-transformer.service.d.ts +22 -3
  246. package/src/services/html/html-transformer.service.js +101 -35
  247. package/src/services/invalidation/development-invalidation.service.d.ts +1 -1
  248. package/src/services/invalidation/development-invalidation.service.js +1 -0
  249. package/src/services/module-loading/app-module-loader.service.d.ts +7 -0
  250. package/src/services/module-loading/app-module-loader.service.js +0 -0
  251. package/src/services/module-loading/app-server-module-transpiler.service.d.ts +9 -1
  252. package/src/services/module-loading/app-server-module-transpiler.service.js +102 -6
  253. package/src/services/module-loading/host-module-loader-registry.d.ts +4 -0
  254. package/src/services/module-loading/host-module-loader-registry.js +15 -0
  255. package/src/services/module-loading/module-loading-types.d.ts +2 -0
  256. package/src/services/module-loading/module-loading-types.js +0 -0
  257. package/src/services/module-loading/page-module-import.service.d.ts +32 -8
  258. package/src/services/module-loading/page-module-import.service.js +83 -22
  259. package/src/services/module-loading/server-module-transpiler.service.d.ts +8 -14
  260. package/src/services/module-loading/server-module-transpiler.service.js +5 -2
  261. package/src/services/module-loading/source-module-support.d.ts +5 -0
  262. package/src/services/module-loading/source-module-support.js +8 -0
  263. package/src/services/runtime-state/dev-graph.service.d.ts +6 -6
  264. package/src/services/runtime-state/dev-graph.service.js +10 -10
  265. package/src/services/runtime-state/entrypoint-dependency-graph.service.d.ts +1 -1
  266. package/src/services/runtime-state/server-invalidation-state.service.d.ts +1 -1
  267. package/src/static-site-generator/static-site-generator.d.ts +23 -28
  268. package/src/static-site-generator/static-site-generator.js +119 -156
  269. package/src/{internal-types.d.ts → types/internal-types.d.ts} +34 -23
  270. package/src/types/internal-types.js +0 -0
  271. package/src/{public-types.d.ts → types/public-types.d.ts} +195 -37
  272. package/src/types/public-types.js +0 -0
  273. package/src/utils/html-escaping.d.ts +7 -0
  274. package/src/utils/html-escaping.js +6 -0
  275. package/src/utils/locals-utils.d.ts +1 -1
  276. package/src/utils/parse-cli-args.d.ts +4 -1
  277. package/src/utils/parse-cli-args.js +16 -1
  278. package/src/utils/resolve-work-dir.js +1 -1
  279. package/src/watchers/project-watcher.d.ts +4 -4
  280. package/src/watchers/project-watcher.js +35 -41
  281. package/src/watchers/project-watcher.test-helpers.d.ts +2 -2
  282. package/src/watchers/project-watcher.test-helpers.js +5 -5
  283. package/CHANGELOG.md +0 -31
  284. package/src/adapters/abstract/application-adapter.ts +0 -337
  285. package/src/adapters/abstract/router-adapter.ts +0 -30
  286. package/src/adapters/abstract/server-adapter.ts +0 -79
  287. package/src/adapters/bun/client-bridge.ts +0 -62
  288. package/src/adapters/bun/create-app.ts +0 -189
  289. package/src/adapters/bun/hmr-manager.ts +0 -409
  290. package/src/adapters/bun/index.ts +0 -2
  291. package/src/adapters/bun/server-adapter.ts +0 -499
  292. package/src/adapters/bun/server-lifecycle.d.ts +0 -63
  293. package/src/adapters/bun/server-lifecycle.js +0 -92
  294. package/src/adapters/bun/server-lifecycle.ts +0 -124
  295. package/src/adapters/index.ts +0 -6
  296. package/src/adapters/node/bootstrap-dependency-resolver.d.ts +0 -44
  297. package/src/adapters/node/bootstrap-dependency-resolver.js +0 -172
  298. package/src/adapters/node/bootstrap-dependency-resolver.ts +0 -301
  299. package/src/adapters/node/create-app.ts +0 -179
  300. package/src/adapters/node/index.d.ts +0 -6
  301. package/src/adapters/node/index.js +0 -11
  302. package/src/adapters/node/index.ts +0 -16
  303. package/src/adapters/node/node-client-bridge.ts +0 -79
  304. package/src/adapters/node/node-hmr-manager.ts +0 -381
  305. package/src/adapters/node/runtime-adapter.d.ts +0 -46
  306. package/src/adapters/node/runtime-adapter.js +0 -306
  307. package/src/adapters/node/runtime-adapter.ts +0 -439
  308. package/src/adapters/node/server-adapter.ts +0 -488
  309. package/src/adapters/node/static-content-server.ts +0 -239
  310. package/src/adapters/node/write-runtime-manifest.d.ts +0 -26
  311. package/src/adapters/node/write-runtime-manifest.js +0 -12
  312. package/src/adapters/node/write-runtime-manifest.ts +0 -38
  313. package/src/adapters/shared/api-response.ts +0 -104
  314. package/src/adapters/shared/application-adapter.ts +0 -199
  315. package/src/adapters/shared/define-api-handler.ts +0 -66
  316. package/src/adapters/shared/explicit-static-route-matcher.ts +0 -140
  317. package/src/adapters/shared/file-route-middleware-pipeline.ts +0 -127
  318. package/src/adapters/shared/fs-server-response-factory.ts +0 -118
  319. package/src/adapters/shared/fs-server-response-matcher.ts +0 -205
  320. package/src/adapters/shared/hmr-entrypoint-registrar.ts +0 -149
  321. package/src/adapters/shared/hmr-html-response.ts +0 -52
  322. package/src/adapters/shared/render-context.ts +0 -120
  323. package/src/adapters/shared/runtime-bootstrap.d.ts +0 -38
  324. package/src/adapters/shared/runtime-bootstrap.js +0 -43
  325. package/src/adapters/shared/runtime-bootstrap.ts +0 -79
  326. package/src/adapters/shared/server-adapter.ts +0 -489
  327. package/src/adapters/shared/server-route-handler.ts +0 -153
  328. package/src/adapters/shared/server-static-builder.ts +0 -166
  329. package/src/build/build-adapter.ts +0 -361
  330. package/src/build/build-manifest.ts +0 -54
  331. package/src/build/build-types.ts +0 -83
  332. package/src/build/dev-build-coordinator.d.ts +0 -74
  333. package/src/build/dev-build-coordinator.js +0 -161
  334. package/src/build/dev-build-coordinator.ts +0 -221
  335. package/src/build/esbuild-build-adapter.d.ts +0 -72
  336. package/src/build/esbuild-build-adapter.js +0 -422
  337. package/src/build/esbuild-build-adapter.ts +0 -559
  338. package/src/build/runtime-build-executor.ts +0 -34
  339. package/src/build/runtime-specifier-alias-plugin.d.ts +0 -15
  340. package/src/build/runtime-specifier-alias-plugin.js +0 -31
  341. package/src/build/runtime-specifier-alias-plugin.ts +0 -58
  342. package/src/config/config-builder.ts +0 -706
  343. package/src/constants.ts +0 -54
  344. package/src/create-app.ts +0 -87
  345. package/src/dev/sc-server.ts +0 -143
  346. package/src/eco/component-render-context.d.ts +0 -105
  347. package/src/eco/component-render-context.js +0 -87
  348. package/src/eco/component-render-context.ts +0 -224
  349. package/src/eco/eco.ts +0 -242
  350. package/src/eco/eco.types.ts +0 -221
  351. package/src/eco/eco.utils.ts +0 -89
  352. package/src/eco/global-injector-map.ts +0 -112
  353. package/src/eco/lazy-injector-map.ts +0 -120
  354. package/src/eco/module-dependencies.ts +0 -75
  355. package/src/errors/http-error.ts +0 -72
  356. package/src/errors/index.ts +0 -2
  357. package/src/errors/locals-access-error.ts +0 -7
  358. package/src/global/app-logger.ts +0 -4
  359. package/src/hmr/client/hmr-runtime.ts +0 -152
  360. package/src/hmr/hmr-strategy.ts +0 -172
  361. package/src/hmr/hmr.postcss.test.e2e.ts +0 -41
  362. package/src/hmr/hmr.test.e2e.ts +0 -66
  363. package/src/hmr/strategies/default-hmr-strategy.ts +0 -60
  364. package/src/hmr/strategies/js-hmr-strategy.ts +0 -320
  365. package/src/index.browser.ts +0 -3
  366. package/src/index.ts +0 -5
  367. package/src/integrations/ghtml/ghtml-renderer.ts +0 -96
  368. package/src/integrations/ghtml/ghtml.plugin.ts +0 -32
  369. package/src/internal-types.ts +0 -232
  370. package/src/plugins/alias-resolver-plugin.ts +0 -63
  371. package/src/plugins/eco-component-meta-plugin.ts +0 -481
  372. package/src/plugins/integration-plugin.ts +0 -226
  373. package/src/plugins/processor.ts +0 -240
  374. package/src/plugins/runtime-capability.ts +0 -14
  375. package/src/public-types.ts +0 -1317
  376. package/src/route-renderer/component-graph/component-graph-executor.d.ts +0 -32
  377. package/src/route-renderer/component-graph/component-graph-executor.js +0 -31
  378. package/src/route-renderer/component-graph/component-graph-executor.ts +0 -84
  379. package/src/route-renderer/component-graph/component-graph.d.ts +0 -42
  380. package/src/route-renderer/component-graph/component-graph.js +0 -72
  381. package/src/route-renderer/component-graph/component-graph.ts +0 -159
  382. package/src/route-renderer/component-graph/component-marker.d.ts +0 -52
  383. package/src/route-renderer/component-graph/component-marker.js +0 -46
  384. package/src/route-renderer/component-graph/component-marker.ts +0 -117
  385. package/src/route-renderer/component-graph/component-reference.d.ts +0 -10
  386. package/src/route-renderer/component-graph/component-reference.js +0 -19
  387. package/src/route-renderer/component-graph/component-reference.ts +0 -29
  388. package/src/route-renderer/component-graph/marker-graph-resolver.d.ts +0 -77
  389. package/src/route-renderer/component-graph/marker-graph-resolver.js +0 -95
  390. package/src/route-renderer/component-graph/marker-graph-resolver.ts +0 -155
  391. package/src/route-renderer/orchestration/integration-renderer.ts +0 -790
  392. package/src/route-renderer/orchestration/render-execution.service.d.ts +0 -103
  393. package/src/route-renderer/orchestration/render-execution.service.js +0 -121
  394. package/src/route-renderer/orchestration/render-execution.service.ts +0 -230
  395. package/src/route-renderer/orchestration/render-preparation.service.d.ts +0 -121
  396. package/src/route-renderer/orchestration/render-preparation.service.js +0 -332
  397. package/src/route-renderer/orchestration/render-preparation.service.ts +0 -476
  398. package/src/route-renderer/page-loading/dependency-resolver.ts +0 -612
  399. package/src/route-renderer/page-loading/page-module-loader.ts +0 -181
  400. package/src/route-renderer/route-renderer.ts +0 -115
  401. package/src/router/client/link-intent.test.browser.ts +0 -51
  402. package/src/router/client/link-intent.ts +0 -92
  403. package/src/router/client/navigation-coordinator.ts +0 -433
  404. package/src/router/server/fs-router-scanner.d.ts +0 -41
  405. package/src/router/server/fs-router-scanner.js +0 -156
  406. package/src/router/server/fs-router-scanner.ts +0 -219
  407. package/src/router/server/fs-router.d.ts +0 -26
  408. package/src/router/server/fs-router.js +0 -100
  409. package/src/router/server/fs-router.ts +0 -122
  410. package/src/services/assets/asset-processing-service/asset-processing.service.ts +0 -401
  411. package/src/services/assets/asset-processing-service/asset.factory.ts +0 -105
  412. package/src/services/assets/asset-processing-service/assets.types.ts +0 -113
  413. package/src/services/assets/asset-processing-service/browser-runtime-asset.factory.ts +0 -95
  414. package/src/services/assets/asset-processing-service/browser-runtime-entry.factory.ts +0 -78
  415. package/src/services/assets/asset-processing-service/index.ts +0 -5
  416. package/src/services/assets/asset-processing-service/processor.interface.ts +0 -27
  417. package/src/services/assets/asset-processing-service/processor.registry.ts +0 -18
  418. package/src/services/assets/asset-processing-service/processors/base/base-processor.ts +0 -82
  419. package/src/services/assets/asset-processing-service/processors/base/base-script-processor.ts +0 -95
  420. package/src/services/assets/asset-processing-service/processors/index.ts +0 -5
  421. package/src/services/assets/asset-processing-service/processors/script/content-script.processor.ts +0 -66
  422. package/src/services/assets/asset-processing-service/processors/script/file-script.processor.ts +0 -88
  423. package/src/services/assets/asset-processing-service/processors/script/node-module-script.processor.ts +0 -85
  424. package/src/services/assets/asset-processing-service/processors/stylesheet/content-stylesheet.processor.ts +0 -27
  425. package/src/services/assets/asset-processing-service/processors/stylesheet/file-stylesheet.processor.ts +0 -80
  426. package/src/services/assets/browser-bundle.service.ts +0 -53
  427. package/src/services/cache/cache.types.ts +0 -126
  428. package/src/services/cache/index.ts +0 -18
  429. package/src/services/cache/memory-cache-store.ts +0 -130
  430. package/src/services/cache/page-cache-service.ts +0 -202
  431. package/src/services/cache/page-request-cache-coordinator.service.ts +0 -131
  432. package/src/services/html/html-rewriter-provider.service.ts +0 -103
  433. package/src/services/html/html-transformer.service.ts +0 -279
  434. package/src/services/invalidation/development-invalidation.service.ts +0 -261
  435. package/src/services/module-loading/app-server-module-transpiler.service.ts +0 -52
  436. package/src/services/module-loading/page-module-import.service.ts +0 -200
  437. package/src/services/module-loading/server-loader.service.d.ts +0 -96
  438. package/src/services/module-loading/server-loader.service.js +0 -32
  439. package/src/services/module-loading/server-loader.service.ts +0 -130
  440. package/src/services/module-loading/server-module-transpiler.service.ts +0 -105
  441. package/src/services/runtime-manifest/node-runtime-manifest.service.d.ts +0 -35
  442. package/src/services/runtime-manifest/node-runtime-manifest.service.js +0 -60
  443. package/src/services/runtime-manifest/node-runtime-manifest.service.ts +0 -101
  444. package/src/services/runtime-state/dev-graph.service.ts +0 -217
  445. package/src/services/runtime-state/entrypoint-dependency-graph.service.ts +0 -136
  446. package/src/services/runtime-state/runtime-specifier-registry.service.d.ts +0 -69
  447. package/src/services/runtime-state/runtime-specifier-registry.service.js +0 -37
  448. package/src/services/runtime-state/runtime-specifier-registry.service.ts +0 -96
  449. package/src/services/runtime-state/server-invalidation-state.service.ts +0 -68
  450. package/src/services/validation/schema-validation-service.ts +0 -204
  451. package/src/services/validation/standard-schema.types.ts +0 -68
  452. package/src/static-site-generator/static-site-generator.ts +0 -462
  453. package/src/utils/css.d.ts +0 -1
  454. package/src/utils/css.js +0 -7
  455. package/src/utils/css.ts +0 -5
  456. package/src/utils/deep-merge.ts +0 -47
  457. package/src/utils/hash.ts +0 -5
  458. package/src/utils/html.ts +0 -1
  459. package/src/utils/invariant.ts +0 -15
  460. package/src/utils/locals-utils.ts +0 -37
  461. package/src/utils/parse-cli-args.ts +0 -83
  462. package/src/utils/path-utils.module.ts +0 -14
  463. package/src/utils/resolve-work-dir.ts +0 -45
  464. package/src/utils/runtime.ts +0 -44
  465. package/src/utils/server-utils.module.ts +0 -67
  466. package/src/watchers/project-watcher.test-helpers.ts +0 -41
  467. package/src/watchers/project-watcher.ts +0 -363
  468. /package/src/{internal-types.js → adapters/shared/runtime-host.js} +0 -0
  469. /package/src/{public-types.js → adapters/shared/static-preview-host.js} +0 -0
  470. /package/src/{constants.d.ts → config/constants.d.ts} +0 -0
  471. /package/src/{constants.js → config/constants.js} +0 -0
@@ -1,310 +1,47 @@
1
- import fs from "node:fs";
2
- import path from "node:path";
3
- import { RESOLVED_ASSETS_DIR } from "../../constants.js";
4
- import { getAppBuildExecutor } from "../../build/build-adapter.js";
5
- import { fileSystem } from "@ecopages/file-system";
6
- import { HmrStrategyType } from "../../hmr/hmr-strategy.js";
7
- import { DefaultHmrStrategy } from "../../hmr/strategies/default-hmr-strategy.js";
8
- import { JsHmrStrategy } from "../../hmr/strategies/js-hmr-strategy.js";
9
1
  import { appLogger } from "../../global/app-logger.js";
10
- import { HmrEntrypointRegistrar } from "../shared/hmr-entrypoint-registrar.js";
11
- import { BrowserBundleService } from "../../services/assets/browser-bundle.service.js";
12
- import { getAppServerModuleTranspiler } from "../../services/module-loading/app-server-module-transpiler.service.js";
13
2
  import {
14
- getAppEntrypointDependencyGraph,
15
- InMemoryEntrypointDependencyGraph,
16
- setAppEntrypointDependencyGraph
3
+ InMemoryEntrypointDependencyGraph
17
4
  } from "../../services/runtime-state/entrypoint-dependency-graph.service.js";
18
- import { getAppRuntimeSpecifierRegistry } from "../../services/runtime-state/runtime-specifier-registry.service.js";
19
- import { resolveInternalExecutionDir, resolveInternalWorkDir } from "../../utils/resolve-work-dir.js";
20
- class NodeHmrManager {
21
- static entrypointRegistrationTimeoutMs = 4e3;
22
- appConfig;
23
- bridge;
24
- watchers = /* @__PURE__ */ new Map();
25
- watchedFiles = /* @__PURE__ */ new Map();
26
- entrypointRegistrations = /* @__PURE__ */ new Map();
27
- distDir;
28
- plugins = [];
29
- enabled = true;
30
- strategies = [];
31
- entrypointRegistrar;
32
- browserBundleService;
33
- entrypointDependencyGraph;
34
- runtimeSpecifierRegistry;
35
- serverModuleTranspiler;
36
- constructor({ appConfig, bridge }) {
37
- this.appConfig = appConfig;
38
- this.bridge = bridge;
39
- this.distDir = path.join(resolveInternalWorkDir(this.appConfig), RESOLVED_ASSETS_DIR, "_hmr");
40
- this.entrypointRegistrar = new HmrEntrypointRegistrar({
41
- srcDir: this.appConfig.absolutePaths.srcDir,
42
- distDir: this.distDir,
43
- entrypointRegistrations: this.entrypointRegistrations,
44
- watchedFiles: this.watchedFiles,
45
- clearFailedRegistration: (entrypointPath) => this.clearFailedEntrypointRegistration(entrypointPath),
46
- registrationTimeoutMs: NodeHmrManager.entrypointRegistrationTimeoutMs
47
- });
48
- this.browserBundleService = new BrowserBundleService(appConfig);
49
- const existingEntrypointDependencyGraph = getAppEntrypointDependencyGraph(appConfig);
50
- this.entrypointDependencyGraph = existingEntrypointDependencyGraph instanceof InMemoryEntrypointDependencyGraph ? existingEntrypointDependencyGraph : new InMemoryEntrypointDependencyGraph();
51
- setAppEntrypointDependencyGraph(this.appConfig, this.entrypointDependencyGraph);
52
- this.runtimeSpecifierRegistry = getAppRuntimeSpecifierRegistry(this.appConfig);
53
- this.serverModuleTranspiler = getAppServerModuleTranspiler(this.appConfig);
54
- this.cleanDistDir();
55
- this.initializeStrategies();
56
- }
57
- /**
58
- * Ensures the HMR output directory exists.
59
- *
60
- * This must not remove the directory because multiple app processes
61
- * can share the same dist path during e2e runs.
62
- */
63
- cleanDistDir() {
64
- fileSystem.ensureDir(this.distDir);
65
- }
66
- /**
67
- * Returns whether the generic JS strategy is allowed to rebuild an entrypoint.
68
- *
69
- * @remarks
70
- * Higher-priority integration strategies own framework page entrypoints. When
71
- * one of them matches, the generic JS strategy must stay out of the way so a
72
- * shared dependency invalidation does not overwrite framework-specific output.
73
- */
74
- shouldJsStrategyProcessEntrypoint(entrypointPath) {
75
- return !this.strategies.some((strategy) => {
76
- if (strategy.type !== HmrStrategyType.INTEGRATION || strategy.priority <= HmrStrategyType.SCRIPT) {
77
- return false;
78
- }
79
- try {
80
- return strategy.matches(entrypointPath);
81
- } catch (error) {
82
- appLogger.error(error);
83
- return false;
84
- }
85
- });
86
- }
87
- initializeStrategies() {
88
- const jsContext = {
89
- getWatchedFiles: () => this.watchedFiles,
90
- getSpecifierMap: () => this.runtimeSpecifierRegistry.getAll(),
91
- getDistDir: () => this.distDir,
92
- getPlugins: () => this.plugins,
93
- getSrcDir: () => this.appConfig.absolutePaths.srcDir,
94
- getPagesDir: () => this.appConfig.absolutePaths.pagesDir,
95
- getLayoutsDir: () => this.appConfig.absolutePaths.layoutsDir,
96
- getTemplateExtensions: () => this.appConfig.templatesExt,
97
- getBrowserBundleService: () => this.browserBundleService,
98
- getEntrypointDependencyGraph: () => this.entrypointDependencyGraph,
99
- shouldProcessEntrypoint: (entrypointPath) => this.shouldJsStrategyProcessEntrypoint(entrypointPath)
100
- };
101
- this.strategies = [new JsHmrStrategy(jsContext), new DefaultHmrStrategy()];
102
- }
103
- registerStrategy(strategy) {
104
- this.strategies.push(strategy);
105
- }
106
- setPlugins(plugins) {
107
- this.plugins = [...plugins];
108
- }
109
- setEnabled(enabled) {
110
- this.enabled = enabled;
111
- }
112
- isEnabled() {
113
- return this.enabled;
114
- }
115
- /**
116
- * Registers runtime bare-specifier mappings exposed by integrations.
117
- *
118
- * @remarks
119
- * These mappings are consumed by framework-owned HMR strategies such as the
120
- * React integration strategy when they rewrite browser bundles. The registry
121
- * stays generic so the same mappings can support broader import-map-style
122
- * runtime features later without moving integration semantics into core.
123
- */
124
- registerSpecifierMap(map) {
125
- this.runtimeSpecifierRegistry.register(map);
126
- }
127
- async buildRuntime() {
128
- const runtimeSource = path.resolve(import.meta.dirname, "../../hmr/client/hmr-runtime.js");
129
- try {
130
- const result = await this.browserBundleService.bundle({
131
- profile: "hmr-runtime",
132
- entrypoints: [runtimeSource],
133
- outdir: this.distDir,
134
- naming: "_hmr_runtime.js",
135
- minify: false,
136
- plugins: this.plugins
137
- });
138
- if (!result.success) {
139
- this.enabled = false;
140
- appLogger.error("[HMR] Failed to build runtime script; continuing with HMR disabled.", result.logs);
141
- }
142
- } catch (error) {
143
- this.enabled = false;
144
- appLogger.error("[HMR] Failed to build runtime script; continuing with HMR disabled.", error);
145
- }
146
- }
147
- getRuntimePath() {
148
- return path.join(this.distDir, "_hmr_runtime.js");
149
- }
150
- broadcast(event) {
151
- appLogger.debug(
152
- `[HMR] Broadcasting ${event.type} event, path=${event.path || "all"}, subscribers=${this.bridge.subscriberCount}`
153
- );
154
- this.bridge.broadcast(event);
155
- }
156
- async handleFileChange(filePath, options = {}) {
157
- const sorted = [...this.strategies].sort((a, b) => b.priority - a.priority);
158
- const strategy = sorted.find((s) => {
159
- try {
160
- return s.matches(filePath);
161
- } catch (err) {
162
- appLogger.error(err);
163
- return false;
164
- }
165
- });
166
- if (!strategy) {
167
- appLogger.warn(`[HMR] No strategy found for ${filePath}`);
168
- return;
169
- }
170
- appLogger.debug(`[NodeHmrManager] Selected strategy: ${strategy.constructor.name}`);
171
- const action = await strategy.process(filePath);
172
- const shouldBroadcast = options.broadcast ?? true;
173
- if (shouldBroadcast && action.type === "broadcast") {
174
- if (action.events) {
175
- for (const event of action.events) {
176
- this.broadcast(event);
177
- }
178
- }
179
- }
180
- }
181
- getOutputUrl(entrypointPath) {
182
- return this.watchedFiles.get(entrypointPath);
183
- }
184
- getWatchedFiles() {
185
- return this.watchedFiles;
186
- }
187
- getSpecifierMap() {
188
- return this.runtimeSpecifierRegistry.getAll();
189
- }
190
- getDistDir() {
191
- return this.distDir;
192
- }
193
- getPlugins() {
194
- return this.plugins;
195
- }
196
- getDefaultContext() {
197
- return {
198
- getWatchedFiles: () => this.watchedFiles,
199
- getSpecifierMap: () => this.runtimeSpecifierRegistry.getAll(),
200
- getDistDir: () => this.distDir,
201
- getPlugins: () => this.plugins,
202
- getSrcDir: () => this.appConfig.absolutePaths.srcDir,
203
- getLayoutsDir: () => this.appConfig.absolutePaths.layoutsDir,
204
- getPagesDir: () => this.appConfig.absolutePaths.pagesDir,
205
- getBuildExecutor: () => getAppBuildExecutor(this.appConfig),
206
- getBrowserBundleService: () => this.browserBundleService,
207
- importServerModule: async (filePath) => await this.serverModuleTranspiler.importModule({
208
- filePath,
209
- outdir: path.join(resolveInternalExecutionDir(this.appConfig), ".server-modules"),
210
- externalPackages: true
211
- })
212
- };
213
- }
214
- clearFailedEntrypointRegistration(entrypointPath) {
215
- this.watchedFiles.delete(entrypointPath);
216
- this.entrypointDependencyGraph.clearEntrypointDependencies(entrypointPath);
217
- }
5
+ import { SharedHmrManager } from "../shared/shared-hmr-manager.js";
6
+ class NodeHmrManager extends SharedHmrManager {
218
7
  /**
219
- * Registers one integration-owned page entrypoint.
8
+ * Creates the Node HMR manager over the shared coordination pipeline.
220
9
  *
221
10
  * @remarks
222
- * Concurrent callers share one in-flight registration. The registration is
223
- * removed from the dedupe map once it resolves or fails so later requests do
224
- * not inherit stale state.
11
+ * Unlike Bun, Node keeps websocket subscription wiring in the server adapter,
12
+ * so this manager only specializes the shared manager where runtime behavior
13
+ * actually differs: dependency-graph storage, missing-file tolerance, and how
14
+ * runtime bundle failures disable HMR.
225
15
  */
226
- async registerEntrypoint(entrypointPath) {
227
- return await this.entrypointRegistrar.registerEntrypoint(entrypointPath, {
228
- emit: async (normalizedEntrypoint, outputPath) => await this.emitStrictEntrypoint(normalizedEntrypoint, outputPath),
229
- getMissingOutputError: (normalizedEntrypoint, outputPath) => new Error(
230
- `[HMR] Integration failed to emit entrypoint ${normalizedEntrypoint} to ${outputPath}. Page entrypoints must be produced by their owning integration.`
231
- )
232
- });
233
- }
234
- /**
235
- * Registers one generic script entrypoint.
236
- *
237
- * @remarks
238
- * This path is intentionally separate from page entrypoints so non-framework
239
- * scripts can still use the generic build fallback without weakening the page
240
- * ownership contract.
241
- */
242
- async registerScriptEntrypoint(entrypointPath) {
243
- return await this.entrypointRegistrar.registerEntrypoint(entrypointPath, {
244
- emit: async (normalizedEntrypoint, outputPath) => await this.emitScriptEntrypoint(normalizedEntrypoint, outputPath),
245
- getMissingOutputError: (normalizedEntrypoint) => new Error(`[HMR] Failed to register script entrypoint: ${normalizedEntrypoint}`)
246
- });
16
+ constructor({ appConfig, bridge }) {
17
+ super({ appConfig, bridge });
247
18
  }
248
19
  /**
249
- * Performs strict integration-owned entrypoint registration for one normalized source path.
250
- *
251
- * @remarks
252
- * The flow is:
253
- * 1. Reserve the output URL in the watched map.
254
- * 2. Remove any stale emitted file from an earlier process or failed build.
255
- * 3. Let the strategy chain try to emit the entrypoint without broadcasting.
256
- * 4. Fail if the owning integration did not emit the expected output.
20
+ * Reuses the shared in-memory dependency graph when the app already has one and
21
+ * otherwise creates the default Node development graph.
257
22
  */
258
- async emitStrictEntrypoint(entrypointPath, _outputPath) {
259
- await this.handleFileChange(entrypointPath, { broadcast: false });
23
+ createEntrypointDependencyGraph(existingEntrypointDependencyGraph) {
24
+ return existingEntrypointDependencyGraph instanceof InMemoryEntrypointDependencyGraph ? existingEntrypointDependencyGraph : new InMemoryEntrypointDependencyGraph();
260
25
  }
261
26
  /**
262
- * Performs registration for a generic script asset.
27
+ * Tells the shared HMR manager to ignore missing-file events during Node watch
28
+ * mode.
263
29
  *
264
30
  * @remarks
265
- * The manager first gives registered strategies a chance to emit the file so
266
- * processor-owned or integration-owned behavior can still participate. Only
267
- * when no output exists does it issue the generic build.
31
+ * Node file watching can briefly report remove-and-recreate sequences while a
32
+ * file is being rewritten. Treating those transient gaps as fatal would disable
33
+ * otherwise healthy development sessions.
268
34
  */
269
- async emitScriptEntrypoint(entrypointPath, outputPath) {
270
- const naming = path.relative(this.distDir, outputPath).split(path.sep).join("/");
271
- await this.handleFileChange(entrypointPath, { broadcast: false });
272
- if (!fileSystem.exists(outputPath)) {
273
- const buildResult = await this.browserBundleService.bundle({
274
- profile: "hmr-entrypoint",
275
- entrypoints: [entrypointPath],
276
- outdir: this.distDir,
277
- naming,
278
- minify: false,
279
- plugins: this.plugins
280
- });
281
- if (!buildResult.success) {
282
- appLogger.error(
283
- `[HMR] Generic script entrypoint build failed for ${entrypointPath}:`,
284
- buildResult.logs
285
- );
286
- }
287
- }
35
+ shouldSkipMissingFileChange(_filePath) {
36
+ return true;
288
37
  }
289
38
  /**
290
- * Stops active watchers and releases retained registration state.
291
- *
292
- * @remarks
293
- * The manager intentionally does not remove emitted `_hmr` files from disk
294
- * because multiple app processes may share the same dist directory during test
295
- * runs. It does clear in-memory indexes so old entrypoints, dependencies, and
296
- * specifier maps cannot leak across a reused manager instance.
39
+ * Disables HMR after a runtime bundle failure so the Node dev server can keep
40
+ * serving requests without repeatedly emitting broken updates.
297
41
  */
298
- stop() {
299
- this.entrypointRegistrations.clear();
300
- for (const watcher of this.watchers.values()) {
301
- watcher.close();
302
- }
303
- this.watchers.clear();
304
- this.watchedFiles.clear();
305
- this.runtimeSpecifierRegistry.clear();
306
- this.entrypointDependencyGraph.reset();
307
- this.plugins = [];
42
+ onRuntimeBundleFailure(error) {
43
+ this.enabled = false;
44
+ appLogger.error("[HMR] Failed to build runtime script; continuing with HMR disabled.", error);
308
45
  }
309
46
  }
310
47
  export {
@@ -0,0 +1,57 @@
1
+ import { createServer, type Server as NodeServerInstance } from 'node:http';
2
+ import type { RuntimeHost, RuntimeHostStartOptions } from '../shared/runtime-host.js';
3
+ import { NodeHttpRequestBridge } from './http-request-bridge.js';
4
+ type NodeServerFactory = typeof createServer;
5
+ /**
6
+ * Node runtime host that binds the shared Web-request pipeline onto a concrete
7
+ * Node HTTP server.
8
+ *
9
+ * @remarks
10
+ * The host owns only transport concerns: creating the Node listener, converting
11
+ * requests through `NodeHttpRequestBridge`, and handling socket-level failures.
12
+ * Routing and rendering remain in the shared server adapter.
13
+ */
14
+ export declare class NodeRuntimeHost implements RuntimeHost<NodeServerInstance, {
15
+ port?: number;
16
+ hostname?: string;
17
+ }> {
18
+ private readonly requestBridge;
19
+ private readonly serverFactory;
20
+ /**
21
+ * Creates a Node runtime host with injectable request bridging and server
22
+ * creation seams for tests and alternate hosts.
23
+ */
24
+ constructor(requestBridge: NodeHttpRequestBridge, serverFactory?: NodeServerFactory);
25
+ /**
26
+ * Starts the Node HTTP server and wires each request through the shared Web
27
+ * request pipeline.
28
+ *
29
+ * @remarks
30
+ * Client disconnects are treated as normal aborts and do not trigger adapter
31
+ * error logging or the runtime host's `onError` callback.
32
+ */
33
+ start(options: RuntimeHostStartOptions<{
34
+ port?: number;
35
+ hostname?: string;
36
+ }>): Promise<NodeServerInstance>;
37
+ /**
38
+ * Stops the Node HTTP server and, by default, force-closes any remaining open
39
+ * connections.
40
+ */
41
+ stop(server: NodeServerInstance, options?: {
42
+ force?: boolean;
43
+ }): Promise<void>;
44
+ /**
45
+ * Resolves the public runtime origin from the bound Node listener.
46
+ *
47
+ * @remarks
48
+ * The host preserves the configured hostname rather than echoing the raw socket
49
+ * address because users care about the requested host contract, not the local
50
+ * bind interface that Node chose internally.
51
+ */
52
+ getOrigin(server: NodeServerInstance, fallbackServeOptions: {
53
+ port?: number;
54
+ hostname?: string;
55
+ }): string;
56
+ }
57
+ export {};
@@ -0,0 +1,92 @@
1
+ import { createServer } from "node:http";
2
+ import { DEFAULT_ECOPAGES_HOSTNAME, DEFAULT_ECOPAGES_PORT } from "../../config/constants.js";
3
+ import { appLogger } from "../../global/app-logger.js";
4
+ import { resolveServeRuntimeOrigin } from "../shared/runtime-app-bootstrap.js";
5
+ import { isNodeClientAbortError, NodeHttpRequestBridge } from "./http-request-bridge.js";
6
+ class NodeRuntimeHost {
7
+ /**
8
+ * Creates a Node runtime host with injectable request bridging and server
9
+ * creation seams for tests and alternate hosts.
10
+ */
11
+ constructor(requestBridge, serverFactory = createServer) {
12
+ this.requestBridge = requestBridge;
13
+ this.serverFactory = serverFactory;
14
+ }
15
+ requestBridge;
16
+ serverFactory;
17
+ /**
18
+ * Starts the Node HTTP server and wires each request through the shared Web
19
+ * request pipeline.
20
+ *
21
+ * @remarks
22
+ * Client disconnects are treated as normal aborts and do not trigger adapter
23
+ * error logging or the runtime host's `onError` callback.
24
+ */
25
+ async start(options) {
26
+ const hostname = String(options.serveOptions.hostname ?? DEFAULT_ECOPAGES_HOSTNAME);
27
+ const port = Number(options.serveOptions.port ?? DEFAULT_ECOPAGES_PORT);
28
+ const runtimeOrigin = resolveServeRuntimeOrigin({ hostname, port });
29
+ const server = this.serverFactory(async (req, res) => {
30
+ try {
31
+ const webRequest = this.requestBridge.createWebRequest(req, runtimeOrigin);
32
+ const response = await options.handleRequest(webRequest);
33
+ await this.requestBridge.sendNodeResponse(res, response);
34
+ } catch (error) {
35
+ if (isNodeClientAbortError(error)) {
36
+ return;
37
+ }
38
+ appLogger.error("Node server adapter request failed", error);
39
+ res.statusCode = 500;
40
+ res.end("Internal Server Error");
41
+ await options.onError(error instanceof Error ? error : new Error(String(error)));
42
+ }
43
+ });
44
+ await new Promise((resolve) => {
45
+ server.listen(port, hostname, () => resolve());
46
+ });
47
+ return server;
48
+ }
49
+ /**
50
+ * Stops the Node HTTP server and, by default, force-closes any remaining open
51
+ * connections.
52
+ */
53
+ async stop(server, options) {
54
+ await new Promise((resolve, reject) => {
55
+ server.close((error) => {
56
+ if (error) {
57
+ reject(error);
58
+ return;
59
+ }
60
+ resolve();
61
+ });
62
+ if (options?.force ?? true) {
63
+ server.closeAllConnections();
64
+ }
65
+ });
66
+ }
67
+ /**
68
+ * Resolves the public runtime origin from the bound Node listener.
69
+ *
70
+ * @remarks
71
+ * The host preserves the configured hostname rather than echoing the raw socket
72
+ * address because users care about the requested host contract, not the local
73
+ * bind interface that Node chose internally.
74
+ */
75
+ getOrigin(server, fallbackServeOptions) {
76
+ const address = server.address();
77
+ const fallbackHostname = fallbackServeOptions.hostname ?? DEFAULT_ECOPAGES_HOSTNAME;
78
+ if (address && typeof address === "object") {
79
+ return resolveServeRuntimeOrigin({
80
+ hostname: fallbackHostname,
81
+ port: address.port
82
+ });
83
+ }
84
+ return resolveServeRuntimeOrigin({
85
+ hostname: fallbackHostname,
86
+ port: fallbackServeOptions.port
87
+ });
88
+ }
89
+ }
90
+ export {
91
+ NodeRuntimeHost
92
+ };
@@ -0,0 +1,19 @@
1
+ import { WebSocketServer } from 'ws';
2
+ import type { EcoPagesAppConfig } from '../../types/internal-types.js';
3
+ import { NodeClientBridge } from './node-client-bridge.js';
4
+ import { NodeHmrManager } from './node-hmr-manager.js';
5
+ export interface NodeServerDevRuntime {
6
+ websocketServer: WebSocketServer;
7
+ bridge: NodeClientBridge;
8
+ hmrManager: NodeHmrManager;
9
+ }
10
+ export interface NodeServerDevRuntimeFactory {
11
+ create(options: {
12
+ appConfig: EcoPagesAppConfig;
13
+ }): NodeServerDevRuntime;
14
+ }
15
+ export declare class DefaultNodeServerDevRuntimeFactory implements NodeServerDevRuntimeFactory {
16
+ create(options: {
17
+ appConfig: EcoPagesAppConfig;
18
+ }): NodeServerDevRuntime;
19
+ }
@@ -0,0 +1,18 @@
1
+ import { WebSocketServer } from "ws";
2
+ import { NodeClientBridge } from "./node-client-bridge.js";
3
+ import { NodeHmrManager } from "./node-hmr-manager.js";
4
+ class DefaultNodeServerDevRuntimeFactory {
5
+ create(options) {
6
+ const websocketServer = new WebSocketServer({ noServer: true });
7
+ const bridge = new NodeClientBridge();
8
+ const hmrManager = new NodeHmrManager({ appConfig: options.appConfig, bridge });
9
+ return {
10
+ websocketServer,
11
+ bridge,
12
+ hmrManager
13
+ };
14
+ }
15
+ }
16
+ export {
17
+ DefaultNodeServerDevRuntimeFactory
18
+ };
@@ -1,8 +1,11 @@
1
1
  import { type Server as NodeHttpServer } from 'node:http';
2
- import type { EcoPagesAppConfig } from '../../internal-types.js';
3
- import type { ApiHandler, ErrorHandler, StaticRoute } from '../../public-types.js';
2
+ import type { EcoPagesAppConfig } from '../../types/internal-types.js';
3
+ import type { ApiHandler, ErrorHandler, StaticRoute } from '../../types/public-types.js';
4
4
  import { SharedServerAdapter } from '../shared/server-adapter.js';
5
5
  import type { ServerAdapterResult } from '../abstract/server-adapter.js';
6
+ import { NodeHttpRequestBridge } from './http-request-bridge.js';
7
+ import type { StaticPreviewHost } from '../shared/static-preview-host.js';
8
+ import { type NodeServerDevRuntimeFactory } from './server-adapter-dependencies.js';
6
9
  export type NodeServerInstance = NodeHttpServer;
7
10
  export type NodeServeAdapterServerOptions = {
8
11
  port?: number;
@@ -19,6 +22,9 @@ export interface NodeServerAdapterParams {
19
22
  options?: {
20
23
  watch?: boolean;
21
24
  };
25
+ previewHost?: StaticPreviewHost;
26
+ requestBridge?: NodeHttpRequestBridge;
27
+ devRuntimeFactory?: NodeServerDevRuntimeFactory;
22
28
  }
23
29
  export interface NodeServerAdapterResult extends ServerAdapterResult {
24
30
  completeInitialization: (server: NodeServerInstance) => Promise<void>;
@@ -50,9 +56,14 @@ export declare class NodeServerAdapter extends SharedServerAdapter<NodeServerAda
50
56
  private apiHandlers;
51
57
  private staticRoutes;
52
58
  private errorHandler?;
53
- private previewServer;
54
59
  private bridge;
55
60
  private hmrManager;
61
+ private readonly previewHost;
62
+ private readonly requestBridge;
63
+ private readonly devRuntimeFactory;
64
+ private shouldInjectHmrScript;
65
+ private isHtmlResponse;
66
+ private maybeInjectHmrScript;
56
67
  constructor(options: NodeServerAdapterParams);
57
68
  /**
58
69
  * Prepares the adapter for use.
@@ -68,47 +79,13 @@ export declare class NodeServerAdapter extends SharedServerAdapter<NodeServerAda
68
79
  * processors during their `setup()` calls.
69
80
  */
70
81
  initialize(): Promise<void>;
82
+ private prepareRuntimePublicDir;
71
83
  getServerOptions(): NodeServeAdapterServerOptions;
72
84
  buildStatic(options?: {
73
85
  preview?: boolean;
74
86
  }): Promise<void>;
75
- /**
76
- * Converts a Node.js `IncomingMessage` into a Web API `Request`.
77
- *
78
- * Multi-value headers (e.g. `set-cookie`) are appended individually so no
79
- * value is silently dropped.
80
- *
81
- * For methods that carry a body (`POST`, `PUT`, `PATCH`, …), the raw
82
- * `IncomingMessage` stream is wrapped in a `ReadableStream` rather than
83
- * cast directly to `BodyInit`. See the inline doc block inside the `if`
84
- * branch for the rationale (client-abort handling).
85
- *
86
- * `duplex: 'half'` is required by the `fetch` spec when a streaming body is
87
- * provided — without it Node.js 18+ throws a `TypeError`.
88
- */
89
- private createWebRequest;
90
- /**
91
- * Writes a Web `Response` back to a Node.js `ServerResponse`.
92
- *
93
- * The entire body is buffered via `arrayBuffer()` before writing. This is
94
- * intentional for the current use-case (SSR pages and API routes), where
95
- * responses are typically small and fully materialised. Streaming responses
96
- * are not yet supported.
97
- */
98
- private sendNodeResponse;
99
- /**
100
- * Starts an ephemeral HTTP server used *only* during a static site generation
101
- * run.
102
- *
103
- * Static generation works by having the `StaticSiteGenerator` issue real HTTP
104
- * requests to a live server for each route, capturing the rendered HTML. This
105
- * approach reuses the normal request pipeline (middleware, caching, API
106
- * handlers) without any special-casing for the build path.
107
- *
108
- * The server is torn down immediately after generation completes via
109
- * `stopBuildRuntimeServer`, so it never overlaps with the actual dev/prod server.
110
- */
111
87
  private startBuildRuntimeServer;
88
+ private getListeningServerOrigin;
112
89
  /**
113
90
  * Gracefully shuts down the ephemeral build runtime server.
114
91
  *
@@ -132,7 +109,7 @@ export declare class NodeServerAdapter extends SharedServerAdapter<NodeServerAda
132
109
  * underlying socket closes early — into a 499 response so it does not
133
110
  * incorrectly surface as a 500 in application logs.
134
111
  */
135
- handleRequest(_request: Request): Promise<Response>;
112
+ handleRequest(request: Request): Promise<Response>;
136
113
  /**
137
114
  * Called once the HTTP server is bound and listening.
138
115
  *
@@ -141,7 +118,7 @@ export declare class NodeServerAdapter extends SharedServerAdapter<NodeServerAda
141
118
  * `upgrade` event (no separate port needed).
142
119
  * - `NodeClientBridge` tracks active WebSocket connections and handles
143
120
  * broadcast + heartbeat cleanup.
144
- * - `NodeHmrManager` watches the filesystem and triggers incremental esbuild
121
+ * - `NodeHmrManager` watches the filesystem and triggers incremental
145
122
  * rebuilds, notifying connected clients via the bridge.
146
123
  * - Shared watcher bootstrapping listens for route-level file changes and
147
124
  * refreshes the router and response handlers when pages are added or removed.
@@ -149,7 +126,7 @@ export declare class NodeServerAdapter extends SharedServerAdapter<NodeServerAda
149
126
  * WebSocket upgrade requests that do not target `/_hmr` are rejected with an
150
127
  * immediate socket destroy to prevent unhandled upgrade leaks.
151
128
  */
152
- completeInitialization(_server: NodeServerInstance): Promise<void>;
129
+ completeInitialization(server: NodeServerInstance): Promise<void>;
153
130
  }
154
131
  /**
155
132
  * Factory function that creates and fully initialises a `NodeServerAdapter`.