@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,38 +1,57 @@
1
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";
2
7
  import { appLogger } from "../../global/app-logger.js";
3
8
  import { NodeClientBridge } from "./node-client-bridge.js";
4
9
  import { NodeHmrManager } from "./node-hmr-manager.js";
10
+ import { ProjectWatcher } from "../../watchers/project-watcher.js";
5
11
  import { StaticSiteGenerator } from "../../static-site-generator/static-site-generator.js";
6
12
  import { SharedServerAdapter } from "../shared/server-adapter.js";
7
13
  import { ServerStaticBuilder } from "../shared/server-static-builder.js";
14
+ import { DEFAULT_ECOPAGES_HOSTNAME, DEFAULT_ECOPAGES_PORT } from "../../config/constants.js";
8
15
  import {
9
- bindSharedRuntimeHmrManager,
10
- initializeSharedRuntimePlugins,
11
- installSharedRuntimeBuildExecutor,
12
- prepareSharedRuntimePublicDir,
13
- startSharedProjectWatching
14
- } from "../shared/runtime-bootstrap.js";
15
- import { NodeStaticContentServer } from "./static-content-server.js";
16
- class ClientAbortError extends Error {
17
- constructor() {
18
- super("Client closed the request");
19
- this.name = "ClientAbortError";
20
- }
21
- }
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";
22
24
  class NodeServerAdapter extends SharedServerAdapter {
23
25
  serverInstance = null;
24
26
  initialized = false;
25
27
  apiHandlers;
26
28
  staticRoutes;
27
29
  errorHandler;
28
- previewServer = null;
29
30
  bridge = null;
30
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);
44
+ }
45
+ return response;
46
+ }
31
47
  constructor(options) {
32
48
  super(options);
33
49
  this.apiHandlers = options.apiHandlers || [];
34
50
  this.staticRoutes = options.staticRoutes || [];
35
51
  this.errorHandler = options.errorHandler;
52
+ this.previewHost = options.previewHost;
53
+ this.requestBridge = options.requestBridge;
54
+ this.devRuntimeFactory = options.devRuntimeFactory;
36
55
  }
37
56
  /**
38
57
  * Prepares the adapter for use.
@@ -48,11 +67,9 @@ class NodeServerAdapter extends SharedServerAdapter {
48
67
  * processors during their `setup()` calls.
49
68
  */
50
69
  async initialize() {
51
- installSharedRuntimeBuildExecutor(this.appConfig, {
52
- development: this.options?.watch === true
53
- });
54
- prepareSharedRuntimePublicDir(this.appConfig);
55
- await initializeSharedRuntimePlugins({
70
+ installAppRuntimeBuildExecutor(this.appConfig);
71
+ this.prepareRuntimePublicDir();
72
+ await setupAppRuntimePlugins({
56
73
  appConfig: this.appConfig,
57
74
  runtimeOrigin: this.runtimeOrigin,
58
75
  hmrManager: this.hmrManager ?? void 0
@@ -70,6 +87,13 @@ class NodeServerAdapter extends SharedServerAdapter {
70
87
  });
71
88
  this.initialized = true;
72
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));
94
+ }
95
+ fileSystem.ensureDir(path.join(this.appConfig.absolutePaths.distDir, RESOLVED_ASSETS_DIR));
96
+ }
73
97
  getServerOptions() {
74
98
  return {
75
99
  ...this.serveOptions
@@ -80,9 +104,10 @@ class NodeServerAdapter extends SharedServerAdapter {
80
104
  await this.initialize();
81
105
  }
82
106
  const buildServer = await this.startBuildRuntimeServer();
107
+ const buildRuntimeOrigin = this.getListeningServerOrigin(buildServer);
83
108
  try {
84
109
  await this.staticBuilder.build(
85
- { preview: false },
110
+ { preview: false, baseUrl: buildRuntimeOrigin },
86
111
  {
87
112
  router: this.router,
88
113
  routeRendererFactory: this.routeRendererFactory,
@@ -95,117 +120,27 @@ class NodeServerAdapter extends SharedServerAdapter {
95
120
  if (!options?.preview) {
96
121
  return;
97
122
  }
98
- if (this.previewServer) {
99
- await this.previewServer.stop();
100
- }
101
- this.previewServer = new NodeStaticContentServer({
123
+ await this.previewHost.start({
102
124
  appConfig: this.appConfig,
103
- options: {
104
- hostname: this.serveOptions.hostname,
105
- port: Number(this.serveOptions.port || 3e3)
106
- }
125
+ hostname: String(this.serveOptions.hostname || DEFAULT_ECOPAGES_HOSTNAME),
126
+ port: Number(this.serveOptions.port || DEFAULT_ECOPAGES_PORT)
107
127
  });
108
- await this.previewServer.start();
109
- const previewHostname = this.serveOptions.hostname || "localhost";
110
- const previewPort = this.serveOptions.port || 3e3;
128
+ const previewHostname = this.serveOptions.hostname || DEFAULT_ECOPAGES_HOSTNAME;
129
+ const previewPort = this.serveOptions.port || DEFAULT_ECOPAGES_PORT;
111
130
  appLogger.info(`Preview running at http://${previewHostname}:${previewPort}`);
112
131
  }
113
- /**
114
- * Converts a Node.js `IncomingMessage` into a Web API `Request`.
115
- *
116
- * Multi-value headers (e.g. `set-cookie`) are appended individually so no
117
- * value is silently dropped.
118
- *
119
- * For methods that carry a body (`POST`, `PUT`, `PATCH`, …), the raw
120
- * `IncomingMessage` stream is wrapped in a `ReadableStream` rather than
121
- * cast directly to `BodyInit`. See the inline doc block inside the `if`
122
- * branch for the rationale (client-abort handling).
123
- *
124
- * `duplex: 'half'` is required by the `fetch` spec when a streaming body is
125
- * provided — without it Node.js 18+ throws a `TypeError`.
126
- */
127
- createWebRequest(req) {
128
- const url = new URL(req.url ?? "/", this.runtimeOrigin);
129
- const headers = new Headers();
130
- for (const [key, value] of Object.entries(req.headers)) {
131
- if (Array.isArray(value)) {
132
- for (const item of value) {
133
- headers.append(key, item);
134
- }
135
- continue;
136
- }
137
- if (value !== void 0) {
138
- headers.set(key, value);
139
- }
140
- }
141
- const method = (req.method ?? "GET").toUpperCase();
142
- const requestInit = {
143
- method,
144
- headers
145
- };
146
- if (method !== "GET" && method !== "HEAD") {
147
- const body = new ReadableStream({
148
- start(controller) {
149
- req.on("data", (chunk) => controller.enqueue(chunk));
150
- req.once("end", () => controller.close());
151
- req.once("aborted", () => {
152
- controller.error(new ClientAbortError());
153
- });
154
- req.once("error", (err) => {
155
- const isClientAbort = err.code === "ECONNRESET";
156
- controller.error(isClientAbort ? new ClientAbortError() : err);
157
- });
158
- },
159
- cancel() {
160
- req.destroy();
161
- }
162
- });
163
- requestInit.body = body;
164
- requestInit.duplex = "half";
165
- }
166
- return new Request(url, requestInit);
167
- }
168
- /**
169
- * Writes a Web `Response` back to a Node.js `ServerResponse`.
170
- *
171
- * The entire body is buffered via `arrayBuffer()` before writing. This is
172
- * intentional for the current use-case (SSR pages and API routes), where
173
- * responses are typically small and fully materialised. Streaming responses
174
- * are not yet supported.
175
- */
176
- async sendNodeResponse(res, response) {
177
- res.statusCode = response.status;
178
- response.headers.forEach((value, key) => {
179
- res.setHeader(key, value);
180
- });
181
- if (!response.body) {
182
- res.end();
183
- return;
184
- }
185
- const body = Buffer.from(await response.arrayBuffer());
186
- res.end(body);
187
- }
188
- /**
189
- * Starts an ephemeral HTTP server used *only* during a static site generation
190
- * run.
191
- *
192
- * Static generation works by having the `StaticSiteGenerator` issue real HTTP
193
- * requests to a live server for each route, capturing the rendered HTML. This
194
- * approach reuses the normal request pipeline (middleware, caching, API
195
- * handlers) without any special-casing for the build path.
196
- *
197
- * The server is torn down immediately after generation completes via
198
- * `stopBuildRuntimeServer`, so it never overlaps with the actual dev/prod server.
199
- */
200
132
  async startBuildRuntimeServer() {
201
- const hostname = String(this.serveOptions.hostname || "localhost");
202
- const port = Number(this.serveOptions.port || 3e3);
133
+ const hostname = String(this.serveOptions.hostname || DEFAULT_ECOPAGES_HOSTNAME);
134
+ const port = 0;
203
135
  const server = createServer(async (req, res) => {
204
136
  try {
205
- const webRequest = this.createWebRequest(req);
137
+ const webRequest = this.requestBridge.createWebRequest(req, this.runtimeOrigin);
206
138
  const response = await this.handleRequest(webRequest);
207
- await this.sendNodeResponse(res, response);
139
+ await this.requestBridge.sendNodeResponse(res, response);
208
140
  } catch (error) {
141
+ if (error instanceof NodeClientAbortError) {
142
+ return;
143
+ }
209
144
  appLogger.error("Node static build runtime request failed", error);
210
145
  res.statusCode = 500;
211
146
  res.end("Internal Server Error");
@@ -219,9 +154,17 @@ class NodeServerAdapter extends SharedServerAdapter {
219
154
  });
220
155
  });
221
156
  this.serverInstance = server;
222
- appLogger.info(`Server running at http://${hostname}:${port}`);
157
+ appLogger.info(`Server running at ${this.getListeningServerOrigin(server)}`);
223
158
  return server;
224
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");
165
+ }
166
+ return `http://${hostname}:${address.port}`;
167
+ }
225
168
  /**
226
169
  * Gracefully shuts down the ephemeral build runtime server.
227
170
  *
@@ -269,19 +212,20 @@ class NodeServerAdapter extends SharedServerAdapter {
269
212
  * underlying socket closes early — into a 499 response so it does not
270
213
  * incorrectly surface as a 500 in application logs.
271
214
  */
272
- async handleRequest(_request) {
215
+ async handleRequest(request) {
273
216
  if (!this.initialized) {
274
217
  throw new Error("Node server adapter is not initialized. Call createAdapter() first.");
275
218
  }
276
219
  try {
277
- return await this.handleSharedRequest(_request, {
220
+ const response = await this.handleSharedRequest(request, {
278
221
  apiHandlers: this.apiHandlers,
279
222
  errorHandler: this.errorHandler,
280
223
  serverInstance: this.serverInstance,
281
224
  hmrManager: this.hmrManager
282
225
  });
226
+ return await this.maybeInjectHmrScript(response);
283
227
  } catch (error) {
284
- if (error instanceof ClientAbortError) {
228
+ if (error instanceof NodeClientAbortError) {
285
229
  return new Response(null, { status: 499 });
286
230
  }
287
231
  throw error;
@@ -295,7 +239,7 @@ class NodeServerAdapter extends SharedServerAdapter {
295
239
  * `upgrade` event (no separate port needed).
296
240
  * - `NodeClientBridge` tracks active WebSocket connections and handles
297
241
  * broadcast + heartbeat cleanup.
298
- * - `NodeHmrManager` watches the filesystem and triggers incremental esbuild
242
+ * - `NodeHmrManager` watches the filesystem and triggers incremental
299
243
  * rebuilds, notifying connected clients via the bridge.
300
244
  * - Shared watcher bootstrapping listens for route-level file changes and
301
245
  * refreshes the router and response handlers when pages are added or removed.
@@ -303,16 +247,16 @@ class NodeServerAdapter extends SharedServerAdapter {
303
247
  * WebSocket upgrade requests that do not target `/_hmr` are rejected with an
304
248
  * immediate socket destroy to prevent unhandled upgrade leaks.
305
249
  */
306
- async completeInitialization(_server) {
307
- this.serverInstance = _server;
250
+ async completeInitialization(server) {
251
+ this.serverInstance = server;
308
252
  if (this.options?.watch) {
309
- const { WebSocketServer } = await import("ws");
310
- const wss = new WebSocketServer({ noServer: true });
311
- this.bridge = new NodeClientBridge();
312
- this.hmrManager = new NodeHmrManager({ appConfig: this.appConfig, bridge: this.bridge });
253
+ const devRuntime = this.devRuntimeFactory.create({ appConfig: this.appConfig });
254
+ const wss = devRuntime.websocketServer;
255
+ this.bridge = devRuntime.bridge;
256
+ this.hmrManager = devRuntime.hmrManager;
313
257
  this.hmrManager.setEnabled(true);
314
258
  await this.hmrManager.buildRuntime();
315
- _server.on("upgrade", (req, socket, head) => {
259
+ server.on("upgrade", (req, socket, head) => {
316
260
  const url = new URL(req.url ?? "/", this.runtimeOrigin);
317
261
  if (url.pathname === "/_hmr") {
318
262
  wss.handleUpgrade(req, socket, head, (ws) => {
@@ -324,10 +268,14 @@ class NodeServerAdapter extends SharedServerAdapter {
324
268
  socket.destroy();
325
269
  }
326
270
  });
327
- bindSharedRuntimeHmrManager(this.appConfig, this.hmrManager);
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
+ }
328
276
  this.configureSharedResponseHandlers(this.staticRoutes, this.hmrManager);
329
- await startSharedProjectWatching({
330
- appConfig: this.appConfig,
277
+ const watcher = new ProjectWatcher({
278
+ config: this.appConfig,
331
279
  refreshRouterRoutesCallback: this.createSharedWatchRefreshCallback({
332
280
  staticRoutes: this.staticRoutes,
333
281
  hmrManager: this.hmrManager
@@ -335,6 +283,7 @@ class NodeServerAdapter extends SharedServerAdapter {
335
283
  hmrManager: this.hmrManager,
336
284
  bridge: this.bridge
337
285
  });
286
+ await watcher.createWatcherSubscription();
338
287
  }
339
288
  appLogger.debug("Node server adapter initialization completed", {
340
289
  apiHandlers: this.apiHandlers.length,
@@ -345,10 +294,16 @@ class NodeServerAdapter extends SharedServerAdapter {
345
294
  }
346
295
  }
347
296
  async function createNodeServerAdapter(params) {
348
- const runtimeOrigin = params.runtimeOrigin ?? `http://${params.serveOptions.hostname || "localhost"}:${params.serveOptions.port || 3e3}`;
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();
349
301
  const adapter = new NodeServerAdapter({
350
302
  ...params,
351
- runtimeOrigin
303
+ runtimeOrigin,
304
+ previewHost,
305
+ requestBridge,
306
+ devRuntimeFactory
352
307
  });
353
308
  return adapter.createAdapter();
354
309
  }
@@ -1,5 +1,5 @@
1
1
  import { type Server as NodeHttpServer } from 'node:http';
2
- import type { EcoPagesAppConfig } from '../../internal-types.js';
2
+ import type { EcoPagesAppConfig } from '../../types/internal-types.js';
3
3
  type NodeStaticContentServerOptions = {
4
4
  hostname?: string;
5
5
  port?: number;
@@ -1,6 +1,6 @@
1
1
  import { createServer } from "node:http";
2
2
  import { extname, join, normalize, sep } from "node:path";
3
- import { DEFAULT_ECOPAGES_HOSTNAME, DEFAULT_ECOPAGES_PORT, STATUS_MESSAGE } from "../../constants.js";
3
+ import { DEFAULT_ECOPAGES_HOSTNAME, DEFAULT_ECOPAGES_PORT, STATUS_MESSAGE } from "../../config/constants.js";
4
4
  import { fileSystem } from "@ecopages/file-system";
5
5
  import { ServerUtils } from "../../utils/server-utils.module.js";
6
6
  class NodeStaticContentServer {
@@ -0,0 +1,55 @@
1
+ import type { AddressInfo } from 'node:net';
2
+ import type { EcoPagesAppConfig } from '../../types/internal-types.js';
3
+ import type { StaticPreviewHost, StaticPreviewHostStartOptions } from '../shared/static-preview-host.js';
4
+ type NodeStaticPreviewServer = {
5
+ start(): Promise<{
6
+ address(): AddressInfo | string | null;
7
+ }>;
8
+ stop(force?: boolean): Promise<void>;
9
+ };
10
+ type NodeStaticPreviewServerFactory = new (args: {
11
+ appConfig: EcoPagesAppConfig;
12
+ options?: {
13
+ hostname?: string;
14
+ port?: number;
15
+ };
16
+ }) => NodeStaticPreviewServer;
17
+ /**
18
+ * Node preview-host wrapper that manages the lifecycle of the static preview
19
+ * server used after a build.
20
+ *
21
+ * @remarks
22
+ * The host separates preview-server construction from lifecycle control so the
23
+ * Node server adapter can restart preview serving safely across repeated build
24
+ * and preview flows.
25
+ */
26
+ export declare class NodeStaticPreviewHost implements StaticPreviewHost {
27
+ private readonly previewServerFactory;
28
+ private previewServer;
29
+ private stopPromise;
30
+ /**
31
+ * Creates the preview host with an injectable preview-server constructor.
32
+ */
33
+ constructor(previewServerFactory?: NodeStaticPreviewServerFactory);
34
+ /**
35
+ * Starts the Node preview host after fully draining any previous preview server
36
+ * shutdown that may still be in flight.
37
+ *
38
+ * @remarks
39
+ * The host only publishes a new preview server after `start()` succeeds. That
40
+ * keeps failed startup attempts from replacing the last known-good server with a
41
+ * half-initialized instance.
42
+ */
43
+ start(options: StaticPreviewHostStartOptions): Promise<number | null>;
44
+ /**
45
+ * Stops the active preview server and coalesces overlapping stop requests onto
46
+ * the same shutdown promise.
47
+ *
48
+ * @remarks
49
+ * The host keeps the server reference until shutdown succeeds. If shutdown
50
+ * fails, callers can still retry `stop()` or inspect the same live instance
51
+ * instead of losing the handle during a rejected async stop.
52
+ */
53
+ stop(force?: boolean): Promise<void>;
54
+ }
55
+ export {};
@@ -0,0 +1,68 @@
1
+ import { NodeStaticContentServer } from "./static-content-server.js";
2
+ class NodeStaticPreviewHost {
3
+ /**
4
+ * Creates the preview host with an injectable preview-server constructor.
5
+ */
6
+ constructor(previewServerFactory = NodeStaticContentServer) {
7
+ this.previewServerFactory = previewServerFactory;
8
+ }
9
+ previewServerFactory;
10
+ previewServer = null;
11
+ stopPromise = null;
12
+ /**
13
+ * Starts the Node preview host after fully draining any previous preview server
14
+ * shutdown that may still be in flight.
15
+ *
16
+ * @remarks
17
+ * The host only publishes a new preview server after `start()` succeeds. That
18
+ * keeps failed startup attempts from replacing the last known-good server with a
19
+ * half-initialized instance.
20
+ */
21
+ async start(options) {
22
+ await this.stop();
23
+ const previewServer = new this.previewServerFactory({
24
+ appConfig: options.appConfig,
25
+ options: {
26
+ hostname: options.hostname,
27
+ port: options.port
28
+ }
29
+ });
30
+ const server = await previewServer.start();
31
+ this.previewServer = previewServer;
32
+ const address = server.address();
33
+ if (address && typeof address === "object") {
34
+ return address.port;
35
+ }
36
+ return options.port;
37
+ }
38
+ /**
39
+ * Stops the active preview server and coalesces overlapping stop requests onto
40
+ * the same shutdown promise.
41
+ *
42
+ * @remarks
43
+ * The host keeps the server reference until shutdown succeeds. If shutdown
44
+ * fails, callers can still retry `stop()` or inspect the same live instance
45
+ * instead of losing the handle during a rejected async stop.
46
+ */
47
+ async stop(force = true) {
48
+ if (this.stopPromise) {
49
+ await this.stopPromise;
50
+ return;
51
+ }
52
+ if (!this.previewServer) {
53
+ return;
54
+ }
55
+ const activePreviewServer = this.previewServer;
56
+ this.stopPromise = activePreviewServer.stop(force).then(() => {
57
+ if (this.previewServer === activePreviewServer) {
58
+ this.previewServer = null;
59
+ }
60
+ }).finally(() => {
61
+ this.stopPromise = null;
62
+ });
63
+ await this.stopPromise;
64
+ }
65
+ }
66
+ export {
67
+ NodeStaticPreviewHost
68
+ };
@@ -1,4 +1,4 @@
1
- import type { ApiHandler, ApiHandlerContext, Middleware, RouteGroupBuilder, RouteOptions } from '../../public-types.js';
1
+ import type { ApiHandler, ApiHandlerContext, Middleware, RouteGroupBuilder, RouteOptions } from '../../types/public-types.js';
2
2
  import { AbstractApplicationAdapter, type ApplicationAdapterOptions, type RouteGroupDefinition, type RouteHandler } from '../abstract/application-adapter.js';
3
3
  export declare abstract class SharedApplicationAdapter<TOptions extends ApplicationAdapterOptions = ApplicationAdapterOptions, TServer = any, TRequest extends Request = Request> extends AbstractApplicationAdapter<TOptions, TServer, TRequest> {
4
4
  protected register<P extends string, TContext extends ApiHandlerContext<TRequest, TServer> = ApiHandlerContext<TRequest, TServer>>(path: P, method: ApiHandler['method'], handler: RouteHandler<TRequest, TServer, TContext>, options?: RouteOptions<TRequest, TServer, TContext>): this;
@@ -1,4 +1,4 @@
1
- import type { ApiHandler, ApiHandlerContext, Middleware, RouteSchema, TypedGroupHandlerContext } from '../../public-types.js';
1
+ import type { ApiHandler, ApiHandlerContext, Middleware, RouteSchema, TypedGroupHandlerContext } from '../../types/public-types.js';
2
2
  type UniversalContext = ApiHandlerContext<Request, unknown>;
3
3
  type SchemaHandlerContext<TSchema extends RouteSchema | undefined, TContext extends UniversalContext> = TSchema extends RouteSchema ? TypedGroupHandlerContext<TSchema, TContext> : TContext;
4
4
  export declare function defineApiHandler<TPath extends string, TSchema extends RouteSchema | undefined = undefined, TContext extends UniversalContext = UniversalContext>(handler: Omit<ApiHandler<TPath, Request, unknown>, 'handler' | 'middleware' | 'schema'> & {
@@ -0,0 +1,25 @@
1
+ import type { EcoPagesAppConfig } from '../../types/internal-types.js';
2
+ import type { EcoFunctionComponent, EcoPageComponent } from '../../types/public-types.js';
3
+ import type { ExplicitViewRenderer, ExplicitViewRendererResolver } from '../../route-renderer/route-renderer.js';
4
+ type ExplicitStaticRenderPreparationResult = {
5
+ renderer: ExplicitViewRenderer;
6
+ props: Record<string, unknown>;
7
+ view: EcoFunctionComponent<Record<string, unknown>, any>;
8
+ };
9
+ /**
10
+ * Resolves the renderer and static props needed to render one explicit static
11
+ * view at runtime or during static generation.
12
+ */
13
+ export declare function prepareExplicitStaticRender(input: {
14
+ routePath: string;
15
+ view: EcoPageComponent<any>;
16
+ params: Record<string, string | string[]>;
17
+ appConfig: EcoPagesAppConfig;
18
+ runtimeOrigin: string;
19
+ routeRendererFactory: ExplicitViewRendererResolver;
20
+ errors: {
21
+ missingIntegration(routePath: string): string;
22
+ noRendererForIntegration(integrationName: string): string;
23
+ };
24
+ }): Promise<ExplicitStaticRenderPreparationResult>;
25
+ export {};
@@ -0,0 +1,26 @@
1
+ function getViewIntegrationName(view) {
2
+ return view.config?.integration ?? view.config?.__eco?.integration;
3
+ }
4
+ async function prepareExplicitStaticRender(input) {
5
+ const integrationName = getViewIntegrationName(input.view);
6
+ if (!integrationName) {
7
+ throw new Error(input.errors.missingIntegration(input.routePath));
8
+ }
9
+ const renderer = input.routeRendererFactory.getExplicitViewRenderer(integrationName);
10
+ if (!renderer) {
11
+ throw new Error(input.errors.noRendererForIntegration(integrationName));
12
+ }
13
+ const props = input.view.staticProps ? (await input.view.staticProps({
14
+ pathname: { params: input.params },
15
+ appConfig: input.appConfig,
16
+ runtimeOrigin: input.runtimeOrigin
17
+ })).props : {};
18
+ return {
19
+ renderer,
20
+ props,
21
+ view: input.view
22
+ };
23
+ }
24
+ export {
25
+ prepareExplicitStaticRender
26
+ };
@@ -1,19 +1,22 @@
1
- import type { EcoPagesAppConfig } from '../../internal-types.js';
2
- import type { StaticRoute } from '../../public-types.js';
3
- import type { RouteRendererFactory } from '../../route-renderer/route-renderer.js';
1
+ import type { EcoPagesAppConfig } from '../../types/internal-types.js';
2
+ import type { StaticRoute } from '../../types/public-types.js';
3
+ import type { ExplicitViewRendererResolver } from '../../route-renderer/route-renderer.js';
4
4
  export declare const EXPLICIT_STATIC_ROUTE_MATCHER_ERRORS: {
5
5
  readonly missingIntegration: (routePath: string) => string;
6
6
  readonly noRendererForIntegration: (integrationName: string) => string;
7
7
  };
8
8
  export interface ExplicitStaticRouteMatcherOptions {
9
9
  appConfig: EcoPagesAppConfig;
10
- routeRendererFactory: RouteRendererFactory;
10
+ routeRendererFactory: ExplicitViewRendererResolver;
11
11
  staticRoutes: StaticRoute[];
12
12
  }
13
13
  export interface ExplicitRouteMatch {
14
14
  route: StaticRoute;
15
15
  params: Record<string, string>;
16
16
  }
17
+ /**
18
+ * Matches and renders explicit static routes declared through `app.static()`.
19
+ */
17
20
  export declare class ExplicitStaticRouteMatcher {
18
21
  private readonly appConfig;
19
22
  private readonly routeRendererFactory;
@@ -1,11 +1,9 @@
1
1
  import { appLogger } from "../../global/app-logger.js";
2
+ import { prepareExplicitStaticRender } from "./explicit-static-render-preparation.js";
2
3
  const EXPLICIT_STATIC_ROUTE_MATCHER_ERRORS = {
3
4
  missingIntegration: (routePath) => `View at ${routePath} is missing __eco.integration. Ensure it's defined with eco.page() and exported as default.`,
4
5
  noRendererForIntegration: (integrationName) => `No renderer found for integration: ${integrationName}`
5
6
  };
6
- function getViewIntegrationName(view) {
7
- return view.config?.integration ?? view.config?.__eco?.integration;
8
- }
9
7
  class ExplicitStaticRouteMatcher {
10
8
  appConfig;
11
9
  routeRendererFactory;
@@ -74,20 +72,20 @@ class ExplicitStaticRouteMatcher {
74
72
  try {
75
73
  const mod = await route.loader();
76
74
  const view = mod.default;
77
- const integrationName = getViewIntegrationName(view);
78
- if (!integrationName) {
79
- throw new Error(EXPLICIT_STATIC_ROUTE_MATCHER_ERRORS.missingIntegration(route.path));
80
- }
81
- const renderer = this.routeRendererFactory.getRendererByIntegration(integrationName);
82
- if (!renderer) {
83
- throw new Error(EXPLICIT_STATIC_ROUTE_MATCHER_ERRORS.noRendererForIntegration(integrationName));
84
- }
85
- const props = view.staticProps ? (await view.staticProps({
86
- pathname: { params },
75
+ const {
76
+ renderer,
77
+ props,
78
+ view: renderableView
79
+ } = await prepareExplicitStaticRender({
80
+ routePath: route.path,
81
+ view,
82
+ params,
87
83
  appConfig: this.appConfig,
88
- runtimeOrigin: this.appConfig.baseUrl
89
- })).props : {};
90
- return renderer.renderToResponse(view, props, {});
84
+ runtimeOrigin: this.appConfig.baseUrl,
85
+ routeRendererFactory: this.routeRendererFactory,
86
+ errors: EXPLICIT_STATIC_ROUTE_MATCHER_ERRORS
87
+ });
88
+ return renderer.renderToResponse(renderableView, props, {});
91
89
  } catch (error) {
92
90
  appLogger.error(
93
91
  `Error rendering explicit static route ${route.path}:`,