@ecopages/core 0.2.0-alpha.5 → 0.2.0-alpha.51

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 (456) hide show
  1. package/README.md +267 -14
  2. package/package.json +98 -108
  3. package/src/adapters/README.md +39 -0
  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 +30 -62
  12. package/src/adapters/bun/hmr-manager.js +30 -194
  13. package/src/adapters/bun/index.d.ts +2 -3
  14. package/src/adapters/bun/index.js +3 -3
  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 +93 -32
  18. package/src/adapters/bun/server-adapter.js +166 -89
  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 +2 -6
  24. package/src/adapters/index.js +2 -8
  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 +38 -48
  31. package/src/adapters/node/node-hmr-manager.js +31 -203
  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 +20 -72
  37. package/src/adapters/node/server-adapter.js +98 -203
  38. package/src/adapters/node/static-content-server.d.ts +37 -1
  39. package/src/adapters/node/static-content-server.js +29 -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/{define-api-handler.d.ts → 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 -13
  48. package/src/adapters/shared/file-route-middleware-pipeline.d.ts +7 -10
  49. package/src/adapters/shared/file-route-middleware-pipeline.js +3 -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 +20 -16
  53. package/src/adapters/shared/fs-server-response-matcher.js +76 -45
  54. package/src/adapters/shared/hmr-entrypoint-registrar.d.ts +55 -0
  55. package/src/adapters/shared/hmr-entrypoint-registrar.js +87 -0
  56. package/src/adapters/shared/hmr-html-response.d.ts +22 -0
  57. package/src/adapters/shared/hmr-html-response.js +33 -0
  58. package/src/adapters/shared/render-context.d.ts +5 -3
  59. package/src/adapters/shared/render-context.js +27 -3
  60. package/src/adapters/shared/runtime-app-bootstrap.d.ts +26 -0
  61. package/src/adapters/shared/runtime-app-bootstrap.js +46 -0
  62. package/src/adapters/shared/runtime-host.d.ts +12 -0
  63. package/src/adapters/shared/server-adapter.d.ts +33 -12
  64. package/src/adapters/shared/server-adapter.js +215 -132
  65. package/src/adapters/shared/server-route-handler.d.ts +5 -5
  66. package/src/adapters/shared/server-route-handler.js +7 -16
  67. package/src/adapters/shared/server-static-builder.d.ts +41 -8
  68. package/src/adapters/shared/server-static-builder.js +65 -11
  69. package/src/adapters/shared/shared-hmr-manager.d.ts +59 -0
  70. package/src/adapters/shared/shared-hmr-manager.js +240 -0
  71. package/src/adapters/shared/static-preview-host.d.ts +10 -0
  72. package/src/build/README.md +107 -0
  73. package/src/build/browser-runtime-import-rewrite-plugin.d.ts +26 -0
  74. package/src/build/browser-runtime-import-rewrite-plugin.js +162 -0
  75. package/src/build/browser-runtime-manifest.d.ts +31 -0
  76. package/src/build/browser-runtime-manifest.js +61 -0
  77. package/src/build/build-adapter.d.ts +175 -3
  78. package/src/build/build-adapter.js +633 -16
  79. package/src/build/build-manifest.d.ts +33 -0
  80. package/src/build/build-manifest.js +52 -0
  81. package/src/build/dev-build-coordinator.d.ts +72 -0
  82. package/src/build/dev-build-coordinator.js +154 -0
  83. package/src/build/esbuild-build-adapter.d.ts +16 -6
  84. package/src/build/esbuild-build-adapter.js +205 -75
  85. package/src/build/runtime-build-executor.d.ts +14 -0
  86. package/src/build/runtime-build-executor.js +22 -0
  87. package/src/build/runtime-specifier-alias-plugin.d.ts +15 -0
  88. package/src/build/runtime-specifier-alias-plugin.js +31 -0
  89. package/src/config/README.md +36 -0
  90. package/src/config/config-builder.d.ts +54 -29
  91. package/src/config/config-builder.js +256 -50
  92. package/src/{constants.d.ts → config/constants.d.ts} +13 -0
  93. package/src/{constants.js → config/constants.js} +4 -0
  94. package/src/declarations.d.ts +19 -14
  95. package/src/dev/host-runtime.d.ts +10 -0
  96. package/src/dev/host-runtime.js +24 -0
  97. package/src/dev/sc-server.d.ts +1 -1
  98. package/src/dev/sc-server.js +1 -1
  99. package/src/eco/README.md +70 -16
  100. package/src/eco/eco.browser.d.ts +2 -0
  101. package/src/eco/eco.browser.js +88 -0
  102. package/src/eco/eco.js +63 -54
  103. package/src/eco/eco.types.d.ts +69 -6
  104. package/src/eco/eco.utils.d.ts +1 -40
  105. package/src/eco/eco.utils.js +5 -35
  106. package/src/eco/global-injector-map.d.ts +3 -3
  107. package/src/eco/global-injector-map.js +2 -2
  108. package/src/eco/lazy-injector-map.d.ts +2 -2
  109. package/src/errors/index.d.ts +1 -0
  110. package/src/errors/index.js +3 -1
  111. package/src/hmr/README.md +26 -0
  112. package/src/hmr/client/hmr-runtime.d.ts +1 -6
  113. package/src/hmr/client/hmr-runtime.js +38 -7
  114. package/src/hmr/hmr-strategy.d.ts +16 -13
  115. package/src/hmr/hmr-strategy.js +22 -7
  116. package/src/hmr/hmr.postcss.test.e2e.d.ts +1 -0
  117. package/src/hmr/hmr.postcss.test.e2e.js +31 -0
  118. package/src/hmr/hmr.test.e2e.js +26 -33
  119. package/src/hmr/strategies/default-hmr-strategy.d.ts +2 -2
  120. package/src/hmr/strategies/default-hmr-strategy.js +1 -1
  121. package/src/hmr/strategies/js-hmr-strategy.d.ts +40 -42
  122. package/src/hmr/strategies/js-hmr-strategy.js +24 -43
  123. package/src/index.browser.d.ts +2 -2
  124. package/src/index.browser.js +1 -1
  125. package/src/index.d.ts +4 -3
  126. package/src/index.js +16 -5
  127. package/src/integrations/ghtml/ghtml-renderer.d.ts +3 -2
  128. package/src/integrations/ghtml/ghtml-renderer.js +27 -30
  129. package/src/integrations/ghtml/ghtml.constants.d.ts +1 -0
  130. package/src/integrations/ghtml/ghtml.constants.js +4 -0
  131. package/src/integrations/ghtml/ghtml.plugin.d.ts +2 -6
  132. package/src/integrations/ghtml/ghtml.plugin.js +3 -4
  133. package/src/plugins/README.md +35 -0
  134. package/src/plugins/alias-resolver-plugin.d.ts +1 -0
  135. package/src/plugins/alias-resolver-plugin.js +27 -5
  136. package/src/plugins/eco-component-meta-plugin.d.ts +14 -1
  137. package/src/plugins/eco-component-meta-plugin.js +42 -24
  138. package/src/plugins/foreign-jsx-override-plugin.d.ts +33 -0
  139. package/src/plugins/foreign-jsx-override-plugin.js +41 -0
  140. package/src/plugins/integration-plugin.d.ts +157 -29
  141. package/src/plugins/integration-plugin.js +115 -14
  142. package/src/plugins/processor.d.ts +17 -2
  143. package/src/plugins/processor.js +22 -3
  144. package/src/plugins/runtime-capability.d.ts +9 -0
  145. package/src/plugins/source-transform.d.ts +46 -0
  146. package/src/plugins/source-transform.js +71 -0
  147. package/src/route-renderer/GRAPH.md +83 -325
  148. package/src/route-renderer/README.md +73 -90
  149. package/src/route-renderer/orchestration/component-render-context.d.ts +97 -0
  150. package/src/route-renderer/orchestration/component-render-context.js +147 -0
  151. package/src/route-renderer/orchestration/declared-ownership-graph.d.ts +18 -0
  152. package/src/route-renderer/orchestration/declared-ownership-graph.js +34 -0
  153. package/src/route-renderer/orchestration/foreign-subtree-execution.service.d.ts +110 -0
  154. package/src/route-renderer/orchestration/foreign-subtree-execution.service.js +233 -0
  155. package/src/route-renderer/orchestration/integration-renderer.d.ts +534 -0
  156. package/src/route-renderer/orchestration/integration-renderer.js +991 -0
  157. package/src/route-renderer/orchestration/ownership-planning.service.d.ts +24 -0
  158. package/src/route-renderer/orchestration/ownership-planning.service.js +63 -0
  159. package/src/route-renderer/orchestration/ownership-validation.service.d.ts +29 -0
  160. package/src/route-renderer/orchestration/ownership-validation.service.js +53 -0
  161. package/src/route-renderer/orchestration/processed-asset-dedupe.d.ts +3 -0
  162. package/src/route-renderer/orchestration/processed-asset-dedupe.js +27 -0
  163. package/src/route-renderer/orchestration/queued-foreign-subtree-resolution.service.d.ts +91 -0
  164. package/src/route-renderer/orchestration/queued-foreign-subtree-resolution.service.js +170 -0
  165. package/src/route-renderer/orchestration/render-output.utils.d.ts +66 -0
  166. package/src/route-renderer/orchestration/render-output.utils.js +171 -0
  167. package/src/route-renderer/orchestration/route-render-orchestrator.d.ts +156 -0
  168. package/src/route-renderer/orchestration/route-render-orchestrator.js +577 -0
  169. package/src/route-renderer/orchestration/template-serialization.d.ts +38 -0
  170. package/src/route-renderer/orchestration/template-serialization.js +45 -0
  171. package/src/route-renderer/page-loading/component-dependency-collection.d.ts +37 -0
  172. package/src/route-renderer/page-loading/component-dependency-collection.js +132 -0
  173. package/src/route-renderer/page-loading/declared-asset-collection.d.ts +24 -0
  174. package/src/route-renderer/page-loading/declared-asset-collection.js +106 -0
  175. package/src/route-renderer/{dependency-resolver.d.ts → page-loading/dependency-resolver.d.ts} +15 -4
  176. package/src/route-renderer/page-loading/dependency-resolver.js +115 -0
  177. package/src/route-renderer/page-loading/ecopages-virtual-imports.d.ts +11 -0
  178. package/src/route-renderer/page-loading/ecopages-virtual-imports.js +57 -0
  179. package/src/route-renderer/page-loading/lazy-entry-collection.d.ts +45 -0
  180. package/src/route-renderer/page-loading/lazy-entry-collection.js +105 -0
  181. package/src/route-renderer/page-loading/lazy-trigger-planning.d.ts +19 -0
  182. package/src/route-renderer/page-loading/lazy-trigger-planning.js +40 -0
  183. package/src/route-renderer/page-loading/module-declaration-aggregation.d.ts +5 -0
  184. package/src/route-renderer/page-loading/module-declaration-aggregation.js +33 -0
  185. package/src/route-renderer/page-loading/module-declaration-scripts.d.ts +3 -0
  186. package/src/route-renderer/page-loading/module-declaration-scripts.js +18 -0
  187. package/src/route-renderer/page-loading/page-dependency-bundling.d.ts +13 -0
  188. package/src/route-renderer/page-loading/page-dependency-bundling.js +137 -0
  189. package/src/route-renderer/page-loading/page-module-loader.d.ts +90 -0
  190. package/src/route-renderer/{page-module-loader.js → page-loading/page-module-loader.js} +39 -14
  191. package/src/route-renderer/route-renderer.d.ts +57 -14
  192. package/src/route-renderer/route-renderer.js +30 -18
  193. package/src/router/README.md +94 -0
  194. package/src/router/client/link-intent.d.ts +53 -0
  195. package/src/router/client/link-intent.js +34 -0
  196. package/src/router/client/link-intent.test.browser.d.ts +1 -0
  197. package/src/router/client/link-intent.test.browser.js +43 -0
  198. package/src/router/client/navigation-coordinator.d.ts +169 -0
  199. package/src/router/client/navigation-coordinator.js +215 -0
  200. package/src/router/server/route-registry.d.ts +78 -0
  201. package/src/router/server/route-registry.js +262 -0
  202. package/src/services/README.md +28 -0
  203. package/src/services/assets/asset-processing-service/asset-dependency-keys.d.ts +3 -0
  204. package/src/services/assets/asset-processing-service/asset-dependency-keys.js +56 -0
  205. package/src/services/assets/asset-processing-service/asset-processing.service.d.ts +103 -0
  206. package/src/services/{asset-processing-service → assets/asset-processing-service}/asset-processing.service.js +124 -89
  207. package/src/services/{asset-processing-service → assets/asset-processing-service}/asset.factory.d.ts +1 -1
  208. package/src/services/{asset-processing-service → assets/asset-processing-service}/asset.factory.js +2 -2
  209. package/src/services/{asset-processing-service → assets/asset-processing-service}/assets.types.d.ts +16 -1
  210. package/src/services/assets/asset-processing-service/assets.types.js +0 -0
  211. package/src/services/assets/asset-processing-service/browser-runtime-asset.factory.d.ts +57 -0
  212. package/src/services/assets/asset-processing-service/browser-runtime-asset.factory.js +49 -0
  213. package/src/services/assets/asset-processing-service/browser-runtime-entry.factory.d.ts +20 -0
  214. package/src/services/assets/asset-processing-service/browser-runtime-entry.factory.js +41 -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 -0
  218. package/src/services/assets/asset-processing-service/index.js +6 -0
  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/{asset-processing-service → assets/asset-processing-service}/processor.interface.d.ts +2 -2
  222. package/src/services/{asset-processing-service → assets/asset-processing-service}/processor.registry.d.ts +2 -2
  223. package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/base/base-processor.d.ts +1 -1
  224. package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/base/base-processor.js +11 -5
  225. package/src/services/assets/asset-processing-service/processors/base/base-script-processor.d.ts +22 -0
  226. package/src/services/assets/asset-processing-service/processors/base/base-script-processor.js +136 -0
  227. package/src/services/assets/asset-processing-service/processors/index.d.ts +5 -0
  228. package/src/services/assets/asset-processing-service/processors/index.js +5 -0
  229. package/src/services/{asset-processing-service → 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 +120 -0
  231. package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/script/file-script.processor.d.ts +4 -3
  232. package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/script/file-script.processor.js +28 -7
  233. package/src/services/assets/asset-processing-service/processors/script/node-module-script.processor.d.ts +42 -0
  234. package/src/services/assets/asset-processing-service/processors/script/node-module-script.processor.js +126 -0
  235. package/src/services/{asset-processing-service → 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 +59 -0
  237. package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/stylesheet/file-stylesheet.processor.d.ts +2 -2
  238. package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/stylesheet/file-stylesheet.processor.js +9 -3
  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 +73 -0
  242. package/src/services/assets/browser-bundle.service.js +41 -0
  243. package/src/services/{page-request-cache-coordinator.service.d.ts → cache/page-request-cache-coordinator.service.d.ts} +2 -2
  244. package/src/services/{page-request-cache-coordinator.service.js → cache/page-request-cache-coordinator.service.js} +3 -1
  245. package/src/services/html/html-rewriter-provider.service.d.ts +40 -0
  246. package/src/services/html/html-rewriter-provider.service.js +68 -0
  247. package/src/services/html/html-transformer.service.d.ts +96 -0
  248. package/src/services/html/html-transformer.service.js +287 -0
  249. package/src/services/invalidation/development-invalidation.service.d.ts +74 -0
  250. package/src/services/invalidation/development-invalidation.service.js +190 -0
  251. package/src/services/module-loading/app-module-loader.service.d.ts +7 -0
  252. package/src/services/module-loading/app-module-loader.service.js +0 -0
  253. package/src/services/module-loading/app-server-module-transpiler.service.d.ts +24 -0
  254. package/src/services/module-loading/app-server-module-transpiler.service.js +151 -0
  255. package/src/services/module-loading/host-module-loader-registry.d.ts +4 -0
  256. package/src/services/module-loading/host-module-loader-registry.js +15 -0
  257. package/src/services/module-loading/module-loading-types.d.ts +2 -0
  258. package/src/services/module-loading/module-loading-types.js +0 -0
  259. package/src/services/module-loading/node-bootstrap-plugin.d.ts +38 -0
  260. package/src/services/module-loading/node-bootstrap-plugin.js +215 -0
  261. package/src/services/module-loading/page-module-import.service.d.ts +95 -0
  262. package/src/services/module-loading/page-module-import.service.js +191 -0
  263. package/src/services/module-loading/server-module-transpiler.service.d.ts +63 -0
  264. package/src/services/module-loading/server-module-transpiler.service.js +64 -0
  265. package/src/services/module-loading/source-module-support.d.ts +5 -0
  266. package/src/services/module-loading/source-module-support.js +8 -0
  267. package/src/services/runtime-state/dev-graph.service.d.ts +118 -0
  268. package/src/services/runtime-state/dev-graph.service.js +162 -0
  269. package/src/services/runtime-state/entrypoint-dependency-graph.service.d.ts +41 -0
  270. package/src/services/runtime-state/entrypoint-dependency-graph.service.js +85 -0
  271. package/src/services/runtime-state/server-invalidation-state.service.d.ts +26 -0
  272. package/src/services/runtime-state/server-invalidation-state.service.js +35 -0
  273. package/src/services/{schema-validation-service.d.ts → validation/schema-validation-service.d.ts} +1 -1
  274. package/src/static-site-generator/README.md +26 -0
  275. package/src/static-site-generator/static-site-generator.d.ts +67 -20
  276. package/src/static-site-generator/static-site-generator.js +182 -138
  277. package/src/{internal-types.d.ts → types/internal-types.d.ts} +62 -30
  278. package/src/types/internal-types.js +0 -0
  279. package/src/{public-types.d.ts → types/public-types.d.ts} +239 -31
  280. package/src/types/public-types.js +0 -0
  281. package/src/utils/html-escaping.d.ts +7 -0
  282. package/src/utils/html-escaping.js +6 -0
  283. package/src/utils/locals-utils.d.ts +1 -1
  284. package/src/utils/parse-cli-args.d.ts +4 -1
  285. package/src/utils/parse-cli-args.js +16 -1
  286. package/src/utils/resolve-work-dir.d.ts +11 -0
  287. package/src/utils/resolve-work-dir.js +31 -0
  288. package/src/watchers/project-watcher.d.ts +11 -7
  289. package/src/watchers/project-watcher.js +69 -75
  290. package/src/watchers/project-watcher.test-helpers.d.ts +2 -2
  291. package/src/watchers/project-watcher.test-helpers.js +6 -5
  292. package/CHANGELOG.md +0 -94
  293. package/src/adapters/abstract/application-adapter.ts +0 -337
  294. package/src/adapters/abstract/router-adapter.ts +0 -30
  295. package/src/adapters/abstract/server-adapter.ts +0 -79
  296. package/src/adapters/bun/client-bridge.ts +0 -62
  297. package/src/adapters/bun/create-app.ts +0 -189
  298. package/src/adapters/bun/define-api-handler.d.ts +0 -61
  299. package/src/adapters/bun/define-api-handler.ts +0 -114
  300. package/src/adapters/bun/hmr-manager.ts +0 -276
  301. package/src/adapters/bun/index.ts +0 -3
  302. package/src/adapters/bun/server-adapter.ts +0 -492
  303. package/src/adapters/bun/server-lifecycle.d.ts +0 -52
  304. package/src/adapters/bun/server-lifecycle.js +0 -120
  305. package/src/adapters/bun/server-lifecycle.ts +0 -154
  306. package/src/adapters/index.ts +0 -6
  307. package/src/adapters/node/create-app.ts +0 -179
  308. package/src/adapters/node/index.d.ts +0 -4
  309. package/src/adapters/node/index.js +0 -8
  310. package/src/adapters/node/index.ts +0 -9
  311. package/src/adapters/node/node-client-bridge.ts +0 -79
  312. package/src/adapters/node/node-hmr-manager.ts +0 -271
  313. package/src/adapters/node/server-adapter.ts +0 -561
  314. package/src/adapters/node/static-content-server.ts +0 -203
  315. package/src/adapters/shared/api-response.ts +0 -104
  316. package/src/adapters/shared/application-adapter.ts +0 -199
  317. package/src/adapters/shared/explicit-static-route-matcher.ts +0 -134
  318. package/src/adapters/shared/file-route-middleware-pipeline.ts +0 -123
  319. package/src/adapters/shared/fs-server-response-factory.ts +0 -118
  320. package/src/adapters/shared/fs-server-response-matcher.ts +0 -198
  321. package/src/adapters/shared/render-context.ts +0 -105
  322. package/src/adapters/shared/server-adapter.ts +0 -442
  323. package/src/adapters/shared/server-route-handler.ts +0 -166
  324. package/src/adapters/shared/server-static-builder.ts +0 -82
  325. package/src/build/build-adapter.ts +0 -133
  326. package/src/build/build-types.ts +0 -83
  327. package/src/build/esbuild-build-adapter.ts +0 -511
  328. package/src/config/config-builder.ts +0 -474
  329. package/src/constants.ts +0 -39
  330. package/src/create-app.ts +0 -87
  331. package/src/define-api-handler.js +0 -15
  332. package/src/define-api-handler.ts +0 -66
  333. package/src/dev/sc-server.ts +0 -143
  334. package/src/eco/component-render-context.d.ts +0 -105
  335. package/src/eco/component-render-context.js +0 -77
  336. package/src/eco/component-render-context.ts +0 -202
  337. package/src/eco/eco.ts +0 -221
  338. package/src/eco/eco.types.ts +0 -202
  339. package/src/eco/eco.utils.ts +0 -89
  340. package/src/eco/global-injector-map.ts +0 -112
  341. package/src/eco/lazy-injector-map.ts +0 -120
  342. package/src/eco/module-dependencies.ts +0 -75
  343. package/src/errors/http-error.ts +0 -72
  344. package/src/errors/index.ts +0 -2
  345. package/src/errors/locals-access-error.ts +0 -7
  346. package/src/global/app-logger.ts +0 -4
  347. package/src/hmr/client/hmr-runtime.ts +0 -121
  348. package/src/hmr/hmr-strategy.ts +0 -172
  349. package/src/hmr/hmr.test.e2e.ts +0 -75
  350. package/src/hmr/strategies/default-hmr-strategy.ts +0 -60
  351. package/src/hmr/strategies/js-hmr-strategy.ts +0 -327
  352. package/src/index.browser.ts +0 -3
  353. package/src/index.ts +0 -5
  354. package/src/integrations/ghtml/ghtml-renderer.ts +0 -93
  355. package/src/integrations/ghtml/ghtml.plugin.ts +0 -32
  356. package/src/internal-types.ts +0 -212
  357. package/src/plugins/alias-resolver-plugin.ts +0 -45
  358. package/src/plugins/eco-component-meta-plugin.ts +0 -474
  359. package/src/plugins/integration-plugin.ts +0 -184
  360. package/src/plugins/processor.ts +0 -220
  361. package/src/public-types.ts +0 -1255
  362. package/src/route-renderer/component-graph-executor.d.ts +0 -32
  363. package/src/route-renderer/component-graph-executor.js +0 -31
  364. package/src/route-renderer/component-graph-executor.ts +0 -84
  365. package/src/route-renderer/component-graph.d.ts +0 -42
  366. package/src/route-renderer/component-graph.js +0 -72
  367. package/src/route-renderer/component-graph.ts +0 -159
  368. package/src/route-renderer/component-marker.d.ts +0 -52
  369. package/src/route-renderer/component-marker.js +0 -46
  370. package/src/route-renderer/component-marker.ts +0 -117
  371. package/src/route-renderer/dependency-resolver.js +0 -428
  372. package/src/route-renderer/dependency-resolver.ts +0 -596
  373. package/src/route-renderer/html-post-processing.service.d.ts +0 -40
  374. package/src/route-renderer/html-post-processing.service.js +0 -86
  375. package/src/route-renderer/html-post-processing.service.ts +0 -103
  376. package/src/route-renderer/integration-renderer.d.ts +0 -339
  377. package/src/route-renderer/integration-renderer.js +0 -526
  378. package/src/route-renderer/integration-renderer.ts +0 -696
  379. package/src/route-renderer/marker-graph-resolver.d.ts +0 -76
  380. package/src/route-renderer/marker-graph-resolver.js +0 -93
  381. package/src/route-renderer/marker-graph-resolver.ts +0 -153
  382. package/src/route-renderer/page-module-loader.d.ts +0 -61
  383. package/src/route-renderer/page-module-loader.ts +0 -153
  384. package/src/route-renderer/render-execution.service.d.ts +0 -69
  385. package/src/route-renderer/render-execution.service.js +0 -91
  386. package/src/route-renderer/render-execution.service.ts +0 -158
  387. package/src/route-renderer/render-preparation.service.d.ts +0 -112
  388. package/src/route-renderer/render-preparation.service.js +0 -243
  389. package/src/route-renderer/render-preparation.service.ts +0 -358
  390. package/src/route-renderer/route-renderer.ts +0 -80
  391. package/src/router/fs-router-scanner.d.ts +0 -41
  392. package/src/router/fs-router-scanner.js +0 -155
  393. package/src/router/fs-router-scanner.ts +0 -217
  394. package/src/router/fs-router.d.ts +0 -26
  395. package/src/router/fs-router.js +0 -100
  396. package/src/router/fs-router.ts +0 -122
  397. package/src/services/asset-processing-service/asset-processing.service.d.ts +0 -41
  398. package/src/services/asset-processing-service/asset-processing.service.ts +0 -306
  399. package/src/services/asset-processing-service/asset.factory.ts +0 -105
  400. package/src/services/asset-processing-service/assets.types.ts +0 -112
  401. package/src/services/asset-processing-service/index.d.ts +0 -3
  402. package/src/services/asset-processing-service/index.js +0 -3
  403. package/src/services/asset-processing-service/index.ts +0 -3
  404. package/src/services/asset-processing-service/processor.interface.ts +0 -27
  405. package/src/services/asset-processing-service/processor.registry.ts +0 -18
  406. package/src/services/asset-processing-service/processors/base/base-processor.ts +0 -76
  407. package/src/services/asset-processing-service/processors/base/base-script-processor.d.ts +0 -16
  408. package/src/services/asset-processing-service/processors/base/base-script-processor.js +0 -80
  409. package/src/services/asset-processing-service/processors/base/base-script-processor.ts +0 -105
  410. package/src/services/asset-processing-service/processors/index.d.ts +0 -5
  411. package/src/services/asset-processing-service/processors/index.js +0 -5
  412. package/src/services/asset-processing-service/processors/index.ts +0 -5
  413. package/src/services/asset-processing-service/processors/script/content-script.processor.js +0 -57
  414. package/src/services/asset-processing-service/processors/script/content-script.processor.ts +0 -66
  415. package/src/services/asset-processing-service/processors/script/file-script.processor.ts +0 -88
  416. package/src/services/asset-processing-service/processors/script/node-module-script.processor.d.ts +0 -7
  417. package/src/services/asset-processing-service/processors/script/node-module-script.processor.js +0 -74
  418. package/src/services/asset-processing-service/processors/script/node-module-script.processor.ts +0 -84
  419. package/src/services/asset-processing-service/processors/stylesheet/content-stylesheet.processor.js +0 -25
  420. package/src/services/asset-processing-service/processors/stylesheet/content-stylesheet.processor.ts +0 -27
  421. package/src/services/asset-processing-service/processors/stylesheet/file-stylesheet.processor.ts +0 -77
  422. package/src/services/cache/cache.types.ts +0 -126
  423. package/src/services/cache/index.ts +0 -18
  424. package/src/services/cache/memory-cache-store.ts +0 -130
  425. package/src/services/cache/page-cache-service.ts +0 -202
  426. package/src/services/html-transformer.service.d.ts +0 -50
  427. package/src/services/html-transformer.service.js +0 -163
  428. package/src/services/html-transformer.service.ts +0 -217
  429. package/src/services/page-module-import.service.d.ts +0 -37
  430. package/src/services/page-module-import.service.js +0 -88
  431. package/src/services/page-module-import.service.ts +0 -129
  432. package/src/services/page-request-cache-coordinator.service.ts +0 -128
  433. package/src/services/schema-validation-service.ts +0 -204
  434. package/src/services/validation/standard-schema.types.ts +0 -68
  435. package/src/static-site-generator/static-site-generator.ts +0 -359
  436. package/src/utils/css.d.ts +0 -1
  437. package/src/utils/css.js +0 -7
  438. package/src/utils/css.ts +0 -5
  439. package/src/utils/deep-merge.ts +0 -47
  440. package/src/utils/hash.ts +0 -5
  441. package/src/utils/html.ts +0 -1
  442. package/src/utils/invariant.ts +0 -15
  443. package/src/utils/locals-utils.ts +0 -37
  444. package/src/utils/parse-cli-args.ts +0 -83
  445. package/src/utils/path-utils.module.ts +0 -14
  446. package/src/utils/runtime.ts +0 -44
  447. package/src/utils/server-utils.module.ts +0 -67
  448. package/src/watchers/project-watcher.test-helpers.ts +0 -40
  449. package/src/watchers/project-watcher.ts +0 -364
  450. /package/src/adapters/{bun → shared}/define-api-handler.js +0 -0
  451. /package/src/{internal-types.js → adapters/shared/runtime-host.js} +0 -0
  452. /package/src/{public-types.js → adapters/shared/static-preview-host.js} +0 -0
  453. /package/src/{services/asset-processing-service/assets.types.js → plugins/runtime-capability.js} +0 -0
  454. /package/src/services/{asset-processing-service → assets/asset-processing-service}/processor.interface.js +0 -0
  455. /package/src/services/{asset-processing-service → assets/asset-processing-service}/processor.registry.js +0 -0
  456. /package/src/services/{schema-validation-service.js → validation/schema-validation-service.js} +0 -0
@@ -1,13 +1,64 @@
1
- import { StaticContentServer } from "../../dev/sc-server";
2
- import { appLogger } from "../../global/app-logger";
1
+ import path from "node:path";
2
+ import { fileSystem } from "@ecopages/file-system";
3
+ import { DEFAULT_ECOPAGES_HOSTNAME, DEFAULT_ECOPAGES_PORT } from "../../config/constants.js";
4
+ import { StaticContentServer } from "../../dev/sc-server.js";
5
+ import { appLogger } from "../../global/app-logger.js";
3
6
  class ServerStaticBuilder {
4
7
  appConfig;
5
8
  staticSiteGenerator;
6
9
  serveOptions;
7
- constructor({ appConfig, staticSiteGenerator, serveOptions }) {
10
+ apiHandlers;
11
+ logger;
12
+ previewServerFactory;
13
+ constructor({
14
+ appConfig,
15
+ staticSiteGenerator,
16
+ serveOptions,
17
+ apiHandlers,
18
+ logger,
19
+ previewServerFactory
20
+ }) {
8
21
  this.appConfig = appConfig;
9
22
  this.staticSiteGenerator = staticSiteGenerator;
10
23
  this.serveOptions = serveOptions;
24
+ this.apiHandlers = apiHandlers ?? [];
25
+ this.logger = logger ?? appLogger;
26
+ this.previewServerFactory = previewServerFactory ?? StaticContentServer;
27
+ }
28
+ warnApiHandlersUnavailableInStaticMode() {
29
+ if (this.apiHandlers.length === 0) {
30
+ return;
31
+ }
32
+ const uniqueHandlers = Array.from(
33
+ new Set(this.apiHandlers.map((handler) => `${handler.method} ${handler.path}`))
34
+ );
35
+ const visibleHandlers = uniqueHandlers.slice(0, 5).join(", ");
36
+ const remainingCount = uniqueHandlers.length - Math.min(uniqueHandlers.length, 5);
37
+ const summary = remainingCount > 0 ? `${visibleHandlers}, +${remainingCount} more` : visibleHandlers;
38
+ this.logger.warn(
39
+ "Registered API endpoints are not available in static build or preview modes because no server runtime is started. They are excluded from the generated output.\n",
40
+ `\u27A4 ${summary}`
41
+ );
42
+ }
43
+ prepareExportDirectory() {
44
+ const exportDir = this.appConfig.absolutePaths?.distDir ?? path.join(this.appConfig.rootDir, this.appConfig.distDir);
45
+ fileSystem.ensureDir(exportDir, true);
46
+ const srcPublicDir = path.join(
47
+ this.appConfig.rootDir,
48
+ this.appConfig.srcDir ?? "src",
49
+ this.appConfig.publicDir ?? "public"
50
+ );
51
+ if (fileSystem.exists(srcPublicDir)) {
52
+ fileSystem.copyDir(srcPublicDir, exportDir);
53
+ }
54
+ }
55
+ async refreshRuntimeAssets() {
56
+ for (const processor of this.appConfig.processors.values()) {
57
+ await processor.setup();
58
+ }
59
+ for (const integration of this.appConfig.integrations) {
60
+ await integration.setup();
61
+ }
11
62
  }
12
63
  /**
13
64
  * Generates a static build of the site for deployment.
@@ -17,8 +68,11 @@ class ServerStaticBuilder {
17
68
  * @param dependencies.staticRoutes - Explicit static routes registered via app.static()
18
69
  */
19
70
  async build(options, dependencies) {
20
- const { preview = false } = options ?? {};
21
- const baseUrl = `http://${this.serveOptions.hostname || "localhost"}:${this.serveOptions.port || 3e3}`;
71
+ const { preview = false, baseUrl: explicitBaseUrl } = options ?? {};
72
+ const baseUrl = explicitBaseUrl ?? `http://${this.serveOptions.hostname || DEFAULT_ECOPAGES_HOSTNAME}:${this.serveOptions.port || DEFAULT_ECOPAGES_PORT}`;
73
+ this.warnApiHandlersUnavailableInStaticMode();
74
+ this.prepareExportDirectory();
75
+ await this.refreshRuntimeAssets();
22
76
  await this.staticSiteGenerator.run({
23
77
  router: dependencies.router,
24
78
  baseUrl,
@@ -26,18 +80,18 @@ class ServerStaticBuilder {
26
80
  staticRoutes: dependencies.staticRoutes
27
81
  });
28
82
  if (!preview) {
29
- appLogger.info("Build completed");
83
+ this.logger.info("Build completed");
30
84
  return;
31
85
  }
32
- const previewPort = this.serveOptions.port || 3e3;
33
- const { server } = StaticContentServer.createServer({
86
+ const previewPort = this.serveOptions.port || DEFAULT_ECOPAGES_PORT;
87
+ const { server } = this.previewServerFactory.createServer({
34
88
  appConfig: this.appConfig,
35
89
  options: { port: Number(previewPort) }
36
90
  });
37
- if (server) {
38
- appLogger.info(`Preview running at http://localhost:${server.port}`);
91
+ if (server?.port) {
92
+ this.logger.info(`Preview running at http://localhost:${server.port}`);
39
93
  } else {
40
- appLogger.error("Failed to start preview server");
94
+ this.logger.error("Failed to start preview server");
41
95
  }
42
96
  }
43
97
  }
@@ -0,0 +1,59 @@
1
+ import fs from 'node:fs';
2
+ import type { DefaultHmrContext, EcoPagesAppConfig, IHmrManager, IClientBridge } from '../../types/internal-types.js';
3
+ import type { EcoBuildPlugin } from '../../build/build-types.js';
4
+ import { type HmrStrategy } from '../../hmr/hmr-strategy.js';
5
+ import type { ClientBridgeEvent } from '../../types/public-types.js';
6
+ import { HmrEntrypointRegistrar } from './hmr-entrypoint-registrar.js';
7
+ import { BrowserBundleService } from '../../services/assets/browser-bundle.service.js';
8
+ import { type EntrypointDependencyGraph } from '../../services/runtime-state/entrypoint-dependency-graph.service.js';
9
+ import type { ServerModuleTranspiler } from '../../services/module-loading/server-module-transpiler.service.js';
10
+ type HandleFileChangeOptions = {
11
+ broadcast?: boolean;
12
+ };
13
+ type SharedHmrManagerParams = {
14
+ appConfig: EcoPagesAppConfig;
15
+ bridge: IClientBridge;
16
+ registrationTimeoutMs?: number;
17
+ };
18
+ export declare abstract class SharedHmrManager implements IHmrManager {
19
+ readonly appConfig: EcoPagesAppConfig;
20
+ protected readonly bridge: IClientBridge;
21
+ protected watchers: Map<string, fs.FSWatcher>;
22
+ protected watchedFiles: Map<string, string>;
23
+ protected entrypointRegistrations: Map<string, Promise<string>>;
24
+ protected distDir: string;
25
+ protected plugins: EcoBuildPlugin[];
26
+ protected enabled: boolean;
27
+ protected strategies: HmrStrategy[];
28
+ protected readonly entrypointRegistrar: HmrEntrypointRegistrar;
29
+ protected readonly browserBundleService: BrowserBundleService;
30
+ protected readonly entrypointDependencyGraph: EntrypointDependencyGraph;
31
+ protected readonly serverModuleTranspiler: ServerModuleTranspiler;
32
+ constructor({ appConfig, bridge, registrationTimeoutMs }: SharedHmrManagerParams);
33
+ protected abstract createEntrypointDependencyGraph(existingEntrypointDependencyGraph: EntrypointDependencyGraph): EntrypointDependencyGraph;
34
+ protected shouldSkipMissingFileChange(_filePath: string): boolean;
35
+ protected onRuntimeBundleFailure(error: unknown): void;
36
+ protected ensureDistDir(): void;
37
+ protected shouldJsStrategyProcessEntrypoint(entrypointPath: string): boolean;
38
+ protected initializeStrategies(): void;
39
+ registerStrategy(strategy: HmrStrategy): void;
40
+ setPlugins(plugins: EcoBuildPlugin[]): void;
41
+ setEnabled(enabled: boolean): void;
42
+ isEnabled(): boolean;
43
+ buildRuntime(): Promise<void>;
44
+ getRuntimePath(): string;
45
+ broadcast(event: ClientBridgeEvent): void;
46
+ handleFileChange(filePath: string, options?: HandleFileChangeOptions): Promise<void>;
47
+ getOutputUrl(entrypointPath: string): string | undefined;
48
+ getWatchedFiles(): Map<string, string>;
49
+ getDistDir(): string;
50
+ getPlugins(): EcoBuildPlugin[];
51
+ getDefaultContext(): DefaultHmrContext;
52
+ protected clearFailedEntrypointRegistration(entrypointPath: string): void;
53
+ registerEntrypoint(entrypointPath: string): Promise<string>;
54
+ registerScriptEntrypoint(entrypointPath: string): Promise<string>;
55
+ protected emitStrictEntrypoint(entrypointPath: string): Promise<void>;
56
+ protected emitScriptEntrypoint(entrypointPath: string, outputPath: string): Promise<void>;
57
+ stop(): void;
58
+ }
59
+ export {};
@@ -0,0 +1,240 @@
1
+ import fs from "node:fs";
2
+ import path from "node:path";
3
+ import { fileURLToPath } from "node:url";
4
+ import { RESOLVED_ASSETS_DIR } from "../../config/constants.js";
5
+ import { getAppBuildExecutor } from "../../build/build-adapter.js";
6
+ import { fileSystem } from "@ecopages/file-system";
7
+ import { HmrStrategyType } from "../../hmr/hmr-strategy.js";
8
+ import { DefaultHmrStrategy } from "../../hmr/strategies/default-hmr-strategy.js";
9
+ import { JsHmrStrategy } from "../../hmr/strategies/js-hmr-strategy.js";
10
+ import { appLogger } from "../../global/app-logger.js";
11
+ import { HmrEntrypointRegistrar } from "./hmr-entrypoint-registrar.js";
12
+ import { BrowserBundleService } from "../../services/assets/browser-bundle.service.js";
13
+ import { getAppServerModuleTranspiler } from "../../services/module-loading/app-server-module-transpiler.service.js";
14
+ import {
15
+ getAppEntrypointDependencyGraph,
16
+ setAppEntrypointDependencyGraph
17
+ } from "../../services/runtime-state/entrypoint-dependency-graph.service.js";
18
+ import { resolveInternalExecutionDir, resolveInternalWorkDir } from "../../utils/resolve-work-dir.js";
19
+ class SharedHmrManager {
20
+ appConfig;
21
+ bridge;
22
+ watchers = /* @__PURE__ */ new Map();
23
+ watchedFiles = /* @__PURE__ */ new Map();
24
+ entrypointRegistrations = /* @__PURE__ */ new Map();
25
+ distDir;
26
+ plugins = [];
27
+ enabled = true;
28
+ strategies = [];
29
+ entrypointRegistrar;
30
+ browserBundleService;
31
+ entrypointDependencyGraph;
32
+ serverModuleTranspiler;
33
+ constructor({ appConfig, bridge, registrationTimeoutMs = 4e3 }) {
34
+ this.appConfig = appConfig;
35
+ this.bridge = bridge;
36
+ this.distDir = path.join(resolveInternalWorkDir(this.appConfig), RESOLVED_ASSETS_DIR, "_hmr");
37
+ this.entrypointRegistrar = new HmrEntrypointRegistrar({
38
+ srcDir: this.appConfig.absolutePaths.srcDir,
39
+ distDir: this.distDir,
40
+ entrypointRegistrations: this.entrypointRegistrations,
41
+ watchedFiles: this.watchedFiles,
42
+ clearFailedRegistration: (entrypointPath) => this.clearFailedEntrypointRegistration(entrypointPath),
43
+ registrationTimeoutMs
44
+ });
45
+ this.browserBundleService = new BrowserBundleService(appConfig);
46
+ this.entrypointDependencyGraph = this.createEntrypointDependencyGraph(
47
+ getAppEntrypointDependencyGraph(appConfig)
48
+ );
49
+ setAppEntrypointDependencyGraph(this.appConfig, this.entrypointDependencyGraph);
50
+ this.serverModuleTranspiler = getAppServerModuleTranspiler(this.appConfig);
51
+ this.ensureDistDir();
52
+ this.initializeStrategies();
53
+ }
54
+ shouldSkipMissingFileChange(_filePath) {
55
+ return false;
56
+ }
57
+ onRuntimeBundleFailure(error) {
58
+ appLogger.error("[HMR] Failed to build runtime script:", error);
59
+ }
60
+ ensureDistDir() {
61
+ fileSystem.ensureDir(this.distDir);
62
+ }
63
+ shouldJsStrategyProcessEntrypoint(entrypointPath) {
64
+ return !this.strategies.some((strategy) => {
65
+ if (strategy.type !== HmrStrategyType.INTEGRATION || strategy.priority <= HmrStrategyType.SCRIPT) {
66
+ return false;
67
+ }
68
+ try {
69
+ return strategy.matches(entrypointPath);
70
+ } catch (error) {
71
+ appLogger.error(error);
72
+ return false;
73
+ }
74
+ });
75
+ }
76
+ initializeStrategies() {
77
+ const jsContext = {
78
+ getWatchedFiles: () => this.watchedFiles,
79
+ getDistDir: () => this.distDir,
80
+ getPlugins: () => this.plugins,
81
+ getSrcDir: () => this.appConfig.absolutePaths.srcDir,
82
+ getPagesDir: () => this.appConfig.absolutePaths.pagesDir,
83
+ getLayoutsDir: () => this.appConfig.absolutePaths.layoutsDir,
84
+ getTemplateExtensions: () => this.appConfig.templatesExt,
85
+ getBrowserBundleService: () => this.browserBundleService,
86
+ getEntrypointDependencyGraph: () => this.entrypointDependencyGraph,
87
+ shouldProcessEntrypoint: (entrypointPath) => this.shouldJsStrategyProcessEntrypoint(entrypointPath)
88
+ };
89
+ this.strategies = [new JsHmrStrategy(jsContext), new DefaultHmrStrategy()];
90
+ }
91
+ registerStrategy(strategy) {
92
+ this.strategies.push(strategy);
93
+ }
94
+ setPlugins(plugins) {
95
+ this.plugins = [...plugins];
96
+ }
97
+ setEnabled(enabled) {
98
+ this.enabled = enabled;
99
+ }
100
+ isEnabled() {
101
+ return this.enabled;
102
+ }
103
+ async buildRuntime() {
104
+ const runtimeSource = fileURLToPath(import.meta.resolve("@ecopages/core/hmr/client/hmr-runtime"));
105
+ try {
106
+ const result = await this.browserBundleService.bundle({
107
+ profile: "hmr-runtime",
108
+ entrypoints: [runtimeSource],
109
+ outdir: this.distDir,
110
+ naming: "_hmr_runtime.js",
111
+ minify: false,
112
+ plugins: this.plugins
113
+ });
114
+ if (!result.success) {
115
+ this.onRuntimeBundleFailure(result.logs);
116
+ }
117
+ } catch (error) {
118
+ this.onRuntimeBundleFailure(error);
119
+ }
120
+ }
121
+ getRuntimePath() {
122
+ return path.join(this.distDir, "_hmr_runtime.js");
123
+ }
124
+ broadcast(event) {
125
+ appLogger.debug(
126
+ `[HMR] Broadcasting ${event.type} event, path=${event.path || "all"}, subscribers=${this.bridge.subscriberCount}`
127
+ );
128
+ this.bridge.broadcast(event);
129
+ }
130
+ async handleFileChange(filePath, options = {}) {
131
+ if (this.shouldSkipMissingFileChange(filePath) && !fileSystem.exists(filePath)) {
132
+ appLogger.debug(`[${this.constructor.name}] Skipping missing file change: ${filePath}`);
133
+ this.clearFailedEntrypointRegistration(filePath);
134
+ return;
135
+ }
136
+ const sorted = [...this.strategies].sort((a, b) => b.priority - a.priority);
137
+ const strategy = sorted.find((candidate) => {
138
+ try {
139
+ return candidate.matches(filePath);
140
+ } catch (error) {
141
+ appLogger.error(error);
142
+ return false;
143
+ }
144
+ });
145
+ if (!strategy) {
146
+ appLogger.warn(`[HMR] No strategy found for ${filePath}`);
147
+ return;
148
+ }
149
+ appLogger.debug(`[${this.constructor.name}] Selected strategy: ${strategy.constructor.name}`);
150
+ const action = await strategy.process(filePath);
151
+ const shouldBroadcast = options.broadcast ?? true;
152
+ if (shouldBroadcast && action.type === "broadcast" && action.events) {
153
+ for (const event of action.events) {
154
+ this.broadcast(event);
155
+ }
156
+ }
157
+ }
158
+ getOutputUrl(entrypointPath) {
159
+ return this.watchedFiles.get(entrypointPath);
160
+ }
161
+ getWatchedFiles() {
162
+ return this.watchedFiles;
163
+ }
164
+ getDistDir() {
165
+ return this.distDir;
166
+ }
167
+ getPlugins() {
168
+ return this.plugins;
169
+ }
170
+ getDefaultContext() {
171
+ return {
172
+ getWatchedFiles: () => this.watchedFiles,
173
+ getDistDir: () => this.distDir,
174
+ getPlugins: () => this.plugins,
175
+ getSrcDir: () => this.appConfig.absolutePaths.srcDir,
176
+ getLayoutsDir: () => this.appConfig.absolutePaths.layoutsDir,
177
+ getPagesDir: () => this.appConfig.absolutePaths.pagesDir,
178
+ getBuildExecutor: () => getAppBuildExecutor(this.appConfig),
179
+ getBrowserBundleService: () => this.browserBundleService,
180
+ importServerModule: async (filePath) => await this.serverModuleTranspiler.importModule({
181
+ filePath,
182
+ outdir: path.join(resolveInternalExecutionDir(this.appConfig), ".server-modules"),
183
+ externalPackages: true
184
+ })
185
+ };
186
+ }
187
+ clearFailedEntrypointRegistration(entrypointPath) {
188
+ this.watchedFiles.delete(entrypointPath);
189
+ this.entrypointDependencyGraph.clearEntrypointDependencies(entrypointPath);
190
+ }
191
+ async registerEntrypoint(entrypointPath) {
192
+ return await this.entrypointRegistrar.registerEntrypoint(entrypointPath, {
193
+ emit: async (normalizedEntrypoint) => await this.emitStrictEntrypoint(normalizedEntrypoint),
194
+ getMissingOutputError: (normalizedEntrypoint, outputPath) => new Error(
195
+ `[HMR] Integration failed to emit entrypoint ${normalizedEntrypoint} to ${outputPath}. Page entrypoints must be produced by their owning integration.`
196
+ )
197
+ });
198
+ }
199
+ async registerScriptEntrypoint(entrypointPath) {
200
+ return await this.entrypointRegistrar.registerEntrypoint(entrypointPath, {
201
+ emit: async (normalizedEntrypoint, outputPath) => await this.emitScriptEntrypoint(normalizedEntrypoint, outputPath),
202
+ getMissingOutputError: (normalizedEntrypoint) => new Error(`[HMR] Failed to register script entrypoint: ${normalizedEntrypoint}`)
203
+ });
204
+ }
205
+ async emitStrictEntrypoint(entrypointPath) {
206
+ await this.handleFileChange(entrypointPath, { broadcast: false });
207
+ }
208
+ async emitScriptEntrypoint(entrypointPath, outputPath) {
209
+ const naming = path.relative(this.distDir, outputPath).split(path.sep).join("/");
210
+ const buildResult = await this.browserBundleService.bundle({
211
+ profile: "hmr-entrypoint",
212
+ entrypoints: [entrypointPath],
213
+ outdir: this.distDir,
214
+ naming,
215
+ minify: false,
216
+ plugins: this.plugins
217
+ });
218
+ if (!buildResult.success) {
219
+ appLogger.error(`[HMR] Generic script entrypoint build failed for ${entrypointPath}:`, buildResult.logs);
220
+ return;
221
+ }
222
+ const entrypointDependencies = buildResult.dependencyGraph?.entrypoints?.[entrypointPath];
223
+ if (entrypointDependencies) {
224
+ this.entrypointDependencyGraph.setEntrypointDependencies(entrypointPath, entrypointDependencies);
225
+ }
226
+ }
227
+ stop() {
228
+ this.entrypointRegistrations.clear();
229
+ for (const watcher of this.watchers.values()) {
230
+ watcher.close();
231
+ }
232
+ this.watchers.clear();
233
+ this.watchedFiles.clear();
234
+ this.entrypointDependencyGraph.reset();
235
+ this.plugins = [];
236
+ }
237
+ }
238
+ export {
239
+ SharedHmrManager
240
+ };
@@ -0,0 +1,10 @@
1
+ import type { EcoPagesAppConfig } from '../../types/internal-types.js';
2
+ export interface StaticPreviewHost {
3
+ start(options: StaticPreviewHostStartOptions): Promise<number | null>;
4
+ stop(force?: boolean): Promise<void>;
5
+ }
6
+ export interface StaticPreviewHostStartOptions {
7
+ appConfig: EcoPagesAppConfig;
8
+ hostname: string;
9
+ port: number;
10
+ }
@@ -0,0 +1,107 @@
1
+ # Build Layer
2
+
3
+ This directory contains the runtime-neutral build contract used across Ecopages, the Bun-native adapter that currently uses esbuild under the hood, and the explicit host-owned Vite compatibility boundary.
4
+
5
+ ## Files
6
+
7
+ - `build-adapter.ts`: shared build interfaces, explicit Bun-native versus Vite-host ownership helpers, app-owned adapter/executor helpers, and compatibility fallback helpers for older Bun-native call paths.
8
+ - `build-types.ts`: plugin bridge types used by integrations and processors.
9
+ - `esbuild-build-adapter.ts`: the concrete Bun-native adapter implementation. It is compatibility infrastructure, not strategic architecture.
10
+ - `dev-build-coordinator.ts`: development-only orchestration around the temporary Bun-native esbuild backend.
11
+ - `*.test.ts`: focused regression coverage for plain builds and development serialization and recovery.
12
+
13
+ ## Responsibilities
14
+
15
+ The build layer is intentionally split into two parts.
16
+
17
+ `BuildExecutor` is the runtime-facing contract.
18
+
19
+ - It is the narrow facade stored on `appConfig.runtime.buildExecutor`.
20
+ - It answers only how a given app instance should execute builds right now.
21
+ - the Bun-native adapter satisfies this contract directly in plain flows.
22
+ - `DevBuildCoordinator` also satisfies this contract by wrapping the temporary Bun-native esbuild adapter with development-only serialization and recovery policy.
23
+
24
+ `EsbuildBuildAdapter` is the current Bun-native backend. It knows how to:
25
+
26
+ - load the esbuild module
27
+ - translate Ecopages `BuildOptions` into esbuild options
28
+ - bridge Ecopages build plugins into esbuild hooks
29
+ - normalize build output, logs, and dependency graph metadata
30
+ - detect the subset of runtime faults that mean the esbuild worker protocol is corrupted
31
+
32
+ `ViteHostBuildAdapter` is a boundary marker, not a real backend. It exists so app/runtime state can represent that Vite owns host-side build execution instead of silently falling back to a framework-owned esbuild path.
33
+
34
+ `DevBuildCoordinator` is the development policy layer. It exists because one app/runtime can have many build callers during dev mode, including:
35
+
36
+ - page module imports
37
+ - HMR entrypoint builds
38
+ - script and asset processors
39
+ - React integration build paths
40
+
41
+ Those callers must not race each other against one long-lived esbuild worker. The coordinator therefore owns temporary compatibility policy for the Bun-native path:
42
+
43
+ - serialized access to the shared adapter in development
44
+ - recycling warm Node-target esbuild sessions between builds
45
+ - recovery from known esbuild worker protocol faults
46
+
47
+ ## Default Flow
48
+
49
+ Each `EcoPagesAppConfig` owns explicit build ownership, a build adapter, a build manifest, and a `buildExecutor` in `appConfig.runtime`. `ConfigBuilder.build()` now creates that app-owned build state up front so later runtime startup can reuse it rather than mutating a shared adapter.
50
+
51
+ When a Bun server adapter starts in watch mode, it replaces that executor with a per-app `DevBuildCoordinator`. Vite-hosted flows should not use that coordinator; the host owns watch, graph, and HMR policy there. Build consumers then either call the executor directly or pass it explicitly to the top-level `build()` helper.
52
+
53
+ The exported `defaultBuildAdapter` and top-level `getTranspileOptions()` helper are compatibility fallbacks only. New runtime code should prefer app-owned access through `getAppBuildAdapter()`, `getAppBuildExecutor()`, and `getAppTranspileOptions()`.
54
+
55
+ The same rule applies to source-module loading: host-owned import behavior must be injected through abstract runtime state rather than imported directly into core services.
56
+
57
+ Plugins are part of app-owned manifest or per-build input now. The source build contract no longer exposes adapter-level plugin registration, which keeps build composition scoped to an app/runtime instance instead of leaking across instances.
58
+
59
+ HMR callers follow the same ownership model. Integration-specific runtime aliasing stays with the integration that owns those specifiers, rather than in generic core HMR bundling.
60
+
61
+ ## Orchestration Diagram
62
+
63
+ ```mermaid
64
+ flowchart TD
65
+ Config["ConfigBuilder.build()"] --> DefaultExec["appConfig.runtime.buildExecutor = createAppBuildExecutor(app adapter, manifest)"]
66
+ Adapter["Server adapter initialize() in watch mode"] --> DevExec["appConfig.runtime.buildExecutor = DevBuildCoordinator"]
67
+ Caller["Any build caller with app/runtime context"] --> Build["executor.build(options) or build(options, executor)"]
68
+ Build --> Executor["BuildExecutor"]
69
+ Executor --> Coordinator["DevBuildCoordinator.build()"]
70
+ Coordinator --> Backend["EsbuildBuildAdapter.buildOrThrow()"]
71
+ Executor -->|plain flow| Direct["EsbuildBuildAdapter.build()"]
72
+ Backend --> Result["BuildResult"]
73
+ Direct --> Result["BuildResult"]
74
+ Result --> Browser["Browser consumes emitted bundle directly"]
75
+ ```
76
+
77
+ ## Recovery Model
78
+
79
+ The recovery path is narrow on purpose. The coordinator only treats an error as recoverable when `EsbuildBuildAdapter.isEsbuildProtocolError()` matches one of the known worker-protocol failure signatures.
80
+
81
+ When that happens, recovery does three things in order:
82
+
83
+ 1. Reset the serialized queue so future builds are not stuck behind a wedged promise.
84
+ 2. Stop the current esbuild service instance.
85
+ 3. Increment the esbuild module generation so the next import gets a fresh worker instance.
86
+
87
+ After that reset, the coordinator retries the failed build once.
88
+
89
+ ## Why Explicit App Ownership
90
+
91
+ There are many build callsites across core and integrations. The coordinator still needs to stay centralized for the remaining Bun-native compatibility path, but process-global installation hid the real dependency and tied behavior to startup order.
92
+
93
+ The explicit app-owned executor model keeps the design honest:
94
+
95
+ - each app/runtime owns its own build executor
96
+ - development policy stays in one place (`DevBuildCoordinator`) for the remaining Bun-native path only
97
+ - callers with app context use that executor explicitly instead of consulting global state
98
+ - tests can still instantiate `EsbuildBuildAdapter`, `ViteHostBuildAdapter`, or `DevBuildCoordinator` directly when they want the raw ownership boundary or compatibility backend only
99
+
100
+ ## Testing Strategy
101
+
102
+ The build tests are split by concern.
103
+
104
+ - `build-adapter.test.ts` verifies plain backend behavior and plugin bridging.
105
+ - `build-adapter-serialization.test.ts` verifies development orchestration behavior such as serialization, warm-session recycling, and protocol-fault recovery.
106
+
107
+ If you change the build orchestration rules, update the coordinator tests first. If you change esbuild option mapping or plugin behavior, update the backend tests first.
@@ -0,0 +1,26 @@
1
+ import type { EcoBuildPlugin } from './build-types.js';
2
+ import { type BrowserRuntimeManifest } from './browser-runtime-manifest.js';
3
+ export declare const DEFAULT_BROWSER_RUNTIME_IMPORT_REWRITE_PLUGIN_NAME = "browser-runtime-import-rewrite";
4
+ export type CreateBrowserRuntimeImportRewritePluginOptions = {
5
+ /** Stable build plugin name used for deduplication and selective exclusion. */
6
+ name?: string;
7
+ /** Manifest containing specifier-to-public-URL runtime asset mappings. */
8
+ manifest: BrowserRuntimeManifest;
9
+ };
10
+ /**
11
+ * Rewrites static ESM import/export specifiers and string-literal dynamic imports
12
+ * from manifest-owned runtime specifiers to concrete browser public URLs.
13
+ */
14
+ export declare function rewriteBrowserRuntimeImports(code: string, specifierMap: ReadonlyMap<string, string>, filePath?: string): string;
15
+ export declare function getBrowserRuntimeImportRewriteMap(plugin: EcoBuildPlugin): ReadonlyMap<string, string> | undefined;
16
+ export declare function collectBrowserRuntimeImportRewriteMap(plugins: EcoBuildPlugin[] | undefined): ReadonlyMap<string, string>;
17
+ /**
18
+ * Creates a build plugin that applies browser runtime manifest import rewrites
19
+ * before the bundler resolves source modules.
20
+ *
21
+ * @remarks
22
+ * This is the migration path away from browser import-map-style runtime aliases:
23
+ * generated and authored browser modules can keep importing manifest-owned
24
+ * specifiers, while the build turns those specifiers into concrete public URLs.
25
+ */
26
+ export declare function createBrowserRuntimeImportRewritePlugin(options: CreateBrowserRuntimeImportRewritePluginOptions): EcoBuildPlugin | null;