@ecopages/core 0.2.0-alpha.4 → 0.2.0-alpha.6

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 (418) hide show
  1. package/README.md +213 -12
  2. package/package.json +100 -188
  3. package/src/adapters/README.md +39 -0
  4. package/src/adapters/bun/hmr-manager.test.ts +267 -0
  5. package/src/adapters/bun/hmr-manager.ts +181 -68
  6. package/src/adapters/bun/index.ts +1 -2
  7. package/src/adapters/bun/server-adapter.ts +41 -34
  8. package/src/adapters/bun/server-lifecycle.ts +40 -70
  9. package/src/adapters/index.ts +1 -1
  10. package/src/adapters/node/bootstrap-dependency-resolver.test.ts +282 -0
  11. package/src/adapters/node/bootstrap-dependency-resolver.ts +301 -0
  12. package/src/adapters/node/index.ts +7 -0
  13. package/src/adapters/node/node-client-bridge.test.ts +198 -0
  14. package/src/adapters/node/node-hmr-manager.test.ts +322 -0
  15. package/src/adapters/node/node-hmr-manager.ts +208 -116
  16. package/src/adapters/node/runtime-adapter.test.ts +868 -0
  17. package/src/adapters/node/runtime-adapter.ts +439 -0
  18. package/src/adapters/node/server-adapter.ts +31 -104
  19. package/src/adapters/node/static-content-server.test.ts +60 -0
  20. package/src/adapters/node/static-content-server.ts +36 -0
  21. package/src/adapters/node/write-runtime-manifest.ts +38 -0
  22. package/src/adapters/shared/api-response.test.ts +97 -0
  23. package/src/{define-api-handler.ts → adapters/shared/define-api-handler.ts} +1 -1
  24. package/src/adapters/shared/explicit-static-route-matcher.test.ts +381 -0
  25. package/src/adapters/shared/explicit-static-route-matcher.ts +7 -1
  26. package/src/adapters/shared/file-route-middleware-pipeline.test.ts +90 -0
  27. package/src/adapters/shared/file-route-middleware-pipeline.ts +6 -2
  28. package/src/adapters/shared/fs-server-response-factory.test.ts +187 -0
  29. package/src/adapters/shared/fs-server-response-matcher.test.ts +286 -0
  30. package/src/adapters/shared/fs-server-response-matcher.ts +17 -10
  31. package/src/adapters/shared/hmr-entrypoint-registrar.ts +149 -0
  32. package/src/adapters/shared/hmr-html-response.ts +52 -0
  33. package/src/adapters/shared/hmr-manager.contract.test.ts +196 -0
  34. package/src/adapters/shared/hmr-manager.dispatch.test.ts +220 -0
  35. package/src/adapters/shared/render-context.test.ts +146 -0
  36. package/src/adapters/shared/render-context.ts +21 -6
  37. package/src/adapters/shared/runtime-bootstrap.ts +79 -0
  38. package/src/adapters/shared/server-adapter.test.ts +77 -0
  39. package/src/adapters/shared/server-adapter.ts +51 -4
  40. package/src/adapters/shared/server-route-handler.test.ts +110 -0
  41. package/src/adapters/shared/server-route-handler.ts +5 -18
  42. package/src/adapters/shared/server-static-builder.test.ts +316 -0
  43. package/src/adapters/shared/server-static-builder.ts +92 -8
  44. package/src/build/README.md +101 -0
  45. package/src/build/build-adapter-serialization.test.ts +268 -0
  46. package/src/build/build-adapter.test.ts +815 -0
  47. package/src/build/build-adapter.ts +235 -6
  48. package/src/build/build-manifest.ts +54 -0
  49. package/src/build/dev-build-coordinator.ts +221 -0
  50. package/src/build/esbuild-build-adapter.ts +132 -83
  51. package/src/build/runtime-build-executor.ts +34 -0
  52. package/src/build/runtime-specifier-alias-plugin.test.ts +43 -0
  53. package/src/build/runtime-specifier-alias-plugin.ts +58 -0
  54. package/src/config/README.md +33 -0
  55. package/src/config/config-builder.test.ts +410 -0
  56. package/src/config/config-builder.ts +281 -49
  57. package/src/constants.ts +15 -0
  58. package/src/declarations.d.ts +18 -13
  59. package/src/eco/README.md +70 -16
  60. package/src/eco/component-render-context.ts +39 -17
  61. package/src/eco/eco.test.ts +678 -0
  62. package/src/eco/eco.ts +29 -8
  63. package/src/eco/eco.types.ts +20 -1
  64. package/src/eco/eco.utils.test.ts +124 -0
  65. package/src/eco/global-injector-map.test.ts +42 -0
  66. package/src/eco/lazy-injector-map.test.ts +66 -0
  67. package/src/eco/module-dependencies.test.ts +30 -0
  68. package/src/errors/http-error.test.ts +134 -0
  69. package/src/global/utils.test.ts +12 -0
  70. package/src/hmr/README.md +26 -0
  71. package/src/hmr/client/__screenshots__/hmr-runtime.test.browser.ts/HMR-Runtime-HMR-Server-Integration-should-have-HMR-script-injected-in-page-1.png +0 -0
  72. package/src/hmr/client/__screenshots__/hmr-runtime.test.browser.ts/HMR-Runtime-HMR-Server-Integration-should-load-fixture-app-page-1.png +0 -0
  73. package/src/hmr/client/__screenshots__/hmr-runtime.test.browser.ts/HMR-Runtime-WebSocket-Connection-should-connect-to-correct-HMR-endpoint-1.png +0 -0
  74. package/src/hmr/client/hmr-runtime.ts +38 -7
  75. package/src/hmr/hmr-strategy.test.ts +124 -0
  76. package/src/hmr/hmr.postcss.test.e2e.ts +41 -0
  77. package/src/hmr/hmr.test.e2e.ts +29 -38
  78. package/src/hmr/strategies/js-hmr-strategy.test.ts +335 -0
  79. package/src/hmr/strategies/js-hmr-strategy.ts +115 -115
  80. package/src/index.ts +1 -1
  81. package/src/integrations/ghtml/ghtml-renderer.test.ts +63 -0
  82. package/src/integrations/ghtml/ghtml-renderer.ts +4 -1
  83. package/src/internal-types.ts +39 -19
  84. package/src/plugins/README.md +34 -0
  85. package/src/plugins/alias-resolver-plugin.test.ts +41 -0
  86. package/src/plugins/alias-resolver-plugin.ts +21 -3
  87. package/src/plugins/eco-component-meta-plugin.test.ts +380 -0
  88. package/src/plugins/eco-component-meta-plugin.ts +10 -3
  89. package/src/plugins/integration-plugin.test.ts +111 -0
  90. package/src/plugins/integration-plugin.ts +45 -3
  91. package/src/plugins/processor.test.ts +148 -0
  92. package/src/plugins/processor.ts +22 -2
  93. package/src/plugins/runtime-capability.ts +14 -0
  94. package/src/public-types.ts +73 -16
  95. package/src/route-renderer/GRAPH.md +16 -20
  96. package/src/route-renderer/README.md +8 -21
  97. package/src/route-renderer/component-graph/component-graph-executor.test.ts +41 -0
  98. package/src/route-renderer/component-graph/component-graph.test.ts +63 -0
  99. package/src/route-renderer/component-graph/component-marker.test.ts +73 -0
  100. package/src/route-renderer/component-graph/component-reference.ts +29 -0
  101. package/src/route-renderer/component-graph/marker-graph-resolver.test.ts +135 -0
  102. package/src/route-renderer/{marker-graph-resolver.ts → component-graph/marker-graph-resolver.ts} +11 -9
  103. package/src/route-renderer/orchestration/integration-renderer.test.ts +936 -0
  104. package/src/route-renderer/{integration-renderer.ts → orchestration/integration-renderer.ts} +113 -19
  105. package/src/route-renderer/orchestration/render-execution.service.test.ts +97 -0
  106. package/src/route-renderer/{render-execution.service.ts → orchestration/render-execution.service.ts} +109 -37
  107. package/src/route-renderer/orchestration/render-preparation.service.test.ts +235 -0
  108. package/src/route-renderer/{render-preparation.service.ts → orchestration/render-preparation.service.ts} +127 -9
  109. package/src/route-renderer/page-loading/dependency-resolver.test.ts +345 -0
  110. package/src/route-renderer/{dependency-resolver.ts → page-loading/dependency-resolver.ts} +28 -12
  111. package/src/route-renderer/page-loading/page-module-loader.test.ts +96 -0
  112. package/src/route-renderer/{page-module-loader.ts → page-loading/page-module-loader.ts} +49 -21
  113. package/src/route-renderer/route-renderer.ts +36 -1
  114. package/src/router/README.md +26 -0
  115. package/src/router/client/link-intent.d.ts +53 -0
  116. package/src/router/client/link-intent.test.browser.ts +51 -0
  117. package/src/router/client/link-intent.ts +92 -0
  118. package/src/router/client/navigation-coordinator.test.ts +237 -0
  119. package/src/router/client/navigation-coordinator.ts +433 -0
  120. package/src/router/server/fs-router-scanner.test.ts +83 -0
  121. package/src/router/{fs-router-scanner.ts → server/fs-router-scanner.ts} +12 -10
  122. package/src/router/server/fs-router.test.ts +214 -0
  123. package/src/router/{fs-router.ts → server/fs-router.ts} +2 -2
  124. package/src/services/README.md +29 -0
  125. package/src/services/assets/asset-processing-service/asset-processing.service.test.ts +385 -0
  126. package/src/services/{asset-processing-service → assets/asset-processing-service}/asset-processing.service.ts +101 -6
  127. package/src/services/assets/asset-processing-service/asset.factory.test.ts +63 -0
  128. package/src/services/{asset-processing-service → assets/asset-processing-service}/asset.factory.ts +2 -2
  129. package/src/services/{asset-processing-service → assets/asset-processing-service}/assets.types.ts +2 -1
  130. package/src/services/assets/asset-processing-service/browser-runtime-asset.factory.test.ts +72 -0
  131. package/src/services/assets/asset-processing-service/browser-runtime-asset.factory.ts +95 -0
  132. package/src/services/assets/asset-processing-service/browser-runtime-entry.factory.test.ts +67 -0
  133. package/src/services/assets/asset-processing-service/browser-runtime-entry.factory.ts +78 -0
  134. package/src/services/{asset-processing-service → assets/asset-processing-service}/index.ts +2 -0
  135. package/src/services/{asset-processing-service → assets/asset-processing-service}/processor.interface.ts +1 -1
  136. package/src/services/assets/asset-processing-service/processors/base/base-processor.test.ts +59 -0
  137. package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/base/base-processor.ts +11 -5
  138. package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/base/base-script-processor.ts +17 -27
  139. package/src/services/assets/asset-processing-service/processors/script/file-script.processor.test.ts +286 -0
  140. package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/script/file-script.processor.ts +3 -3
  141. package/src/services/assets/asset-processing-service/processors/script/node-module-script.processor.test.ts +227 -0
  142. package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/script/node-module-script.processor.ts +5 -4
  143. package/src/services/assets/asset-processing-service/processors/stylesheet/content-stylesheet.processor.test.ts +199 -0
  144. package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/stylesheet/file-stylesheet.processor.ts +4 -1
  145. package/src/services/assets/browser-bundle.service.test.ts +36 -0
  146. package/src/services/assets/browser-bundle.service.ts +53 -0
  147. package/src/services/cache/index.ts +3 -3
  148. package/src/services/cache/memory-cache-store.test.ts +225 -0
  149. package/src/services/cache/memory-cache-store.ts +1 -1
  150. package/src/services/cache/page-cache-service.test.ts +175 -0
  151. package/src/services/cache/page-cache-service.ts +3 -3
  152. package/src/services/cache/page-request-cache-coordinator.service.test.ts +79 -0
  153. package/src/services/{page-request-cache-coordinator.service.ts → cache/page-request-cache-coordinator.service.ts} +9 -6
  154. package/src/services/html/html-rewriter-provider.service.test.ts +183 -0
  155. package/src/services/html/html-rewriter-provider.service.ts +103 -0
  156. package/src/services/html/html-transformer.service.test.ts +378 -0
  157. package/src/services/html/html-transformer.service.ts +279 -0
  158. package/src/services/invalidation/development-invalidation.service.test.ts +77 -0
  159. package/src/services/invalidation/development-invalidation.service.ts +261 -0
  160. package/src/services/module-loading/app-server-module-transpiler.service.ts +52 -0
  161. package/src/services/module-loading/page-module-import.service.test.ts +253 -0
  162. package/src/services/module-loading/page-module-import.service.ts +200 -0
  163. package/src/services/module-loading/server-loader.service.test.ts +161 -0
  164. package/src/services/module-loading/server-loader.service.ts +130 -0
  165. package/src/services/module-loading/server-module-transpiler.service.test.ts +115 -0
  166. package/src/services/module-loading/server-module-transpiler.service.ts +105 -0
  167. package/src/services/runtime-manifest/node-runtime-manifest.service.test.ts +95 -0
  168. package/src/services/runtime-manifest/node-runtime-manifest.service.ts +101 -0
  169. package/src/services/runtime-state/dev-graph.service.ts +217 -0
  170. package/src/services/runtime-state/entrypoint-dependency-graph.service.ts +136 -0
  171. package/src/services/runtime-state/runtime-specifier-registry.service.ts +96 -0
  172. package/src/services/runtime-state/server-invalidation-state.service.ts +68 -0
  173. package/src/services/validation/schema-validation-service.test.ts +223 -0
  174. package/src/services/{schema-validation-service.ts → validation/schema-validation-service.ts} +1 -1
  175. package/src/static-site-generator/README.md +26 -0
  176. package/src/static-site-generator/static-site-generator.test.ts +307 -0
  177. package/src/static-site-generator/static-site-generator.ts +109 -6
  178. package/src/utils/deep-merge.test.ts +114 -0
  179. package/src/utils/invariant.test.ts +22 -0
  180. package/src/utils/path-utils.test.ts +15 -0
  181. package/src/utils/resolve-work-dir.ts +45 -0
  182. package/src/utils/server-utils.test.ts +38 -0
  183. package/src/watchers/project-watcher.integration.test.ts +337 -0
  184. package/src/watchers/project-watcher.test-helpers.ts +1 -1
  185. package/src/watchers/project-watcher.test.ts +678 -0
  186. package/src/watchers/project-watcher.ts +130 -111
  187. package/CHANGELOG.md +0 -91
  188. package/src/adapters/abstract/application-adapter.d.ts +0 -168
  189. package/src/adapters/abstract/application-adapter.js +0 -109
  190. package/src/adapters/abstract/router-adapter.d.ts +0 -26
  191. package/src/adapters/abstract/router-adapter.js +0 -5
  192. package/src/adapters/abstract/server-adapter.d.ts +0 -69
  193. package/src/adapters/abstract/server-adapter.js +0 -15
  194. package/src/adapters/bun/client-bridge.d.ts +0 -34
  195. package/src/adapters/bun/client-bridge.js +0 -48
  196. package/src/adapters/bun/create-app.d.ts +0 -60
  197. package/src/adapters/bun/create-app.js +0 -117
  198. package/src/adapters/bun/define-api-handler.d.ts +0 -61
  199. package/src/adapters/bun/define-api-handler.js +0 -15
  200. package/src/adapters/bun/define-api-handler.ts +0 -114
  201. package/src/adapters/bun/hmr-manager.d.ts +0 -85
  202. package/src/adapters/bun/hmr-manager.js +0 -240
  203. package/src/adapters/bun/index.d.ts +0 -3
  204. package/src/adapters/bun/index.js +0 -8
  205. package/src/adapters/bun/server-adapter.d.ts +0 -155
  206. package/src/adapters/bun/server-adapter.js +0 -368
  207. package/src/adapters/bun/server-lifecycle.d.ts +0 -52
  208. package/src/adapters/bun/server-lifecycle.js +0 -120
  209. package/src/adapters/index.d.ts +0 -6
  210. package/src/adapters/index.js +0 -14
  211. package/src/adapters/node/create-app.d.ts +0 -21
  212. package/src/adapters/node/create-app.js +0 -143
  213. package/src/adapters/node/index.d.ts +0 -4
  214. package/src/adapters/node/index.js +0 -8
  215. package/src/adapters/node/node-client-bridge.d.ts +0 -26
  216. package/src/adapters/node/node-client-bridge.js +0 -66
  217. package/src/adapters/node/node-hmr-manager.d.ts +0 -63
  218. package/src/adapters/node/node-hmr-manager.js +0 -237
  219. package/src/adapters/node/server-adapter.d.ts +0 -190
  220. package/src/adapters/node/server-adapter.js +0 -420
  221. package/src/adapters/node/static-content-server.d.ts +0 -24
  222. package/src/adapters/node/static-content-server.js +0 -166
  223. package/src/adapters/shared/api-response.d.ts +0 -52
  224. package/src/adapters/shared/api-response.js +0 -96
  225. package/src/adapters/shared/application-adapter.d.ts +0 -18
  226. package/src/adapters/shared/application-adapter.js +0 -90
  227. package/src/adapters/shared/explicit-static-route-matcher.d.ts +0 -38
  228. package/src/adapters/shared/explicit-static-route-matcher.js +0 -100
  229. package/src/adapters/shared/file-route-middleware-pipeline.d.ts +0 -65
  230. package/src/adapters/shared/file-route-middleware-pipeline.js +0 -98
  231. package/src/adapters/shared/fs-server-response-factory.d.ts +0 -19
  232. package/src/adapters/shared/fs-server-response-factory.js +0 -97
  233. package/src/adapters/shared/fs-server-response-matcher.d.ts +0 -71
  234. package/src/adapters/shared/fs-server-response-matcher.js +0 -155
  235. package/src/adapters/shared/render-context.d.ts +0 -14
  236. package/src/adapters/shared/render-context.js +0 -69
  237. package/src/adapters/shared/server-adapter.d.ts +0 -87
  238. package/src/adapters/shared/server-adapter.js +0 -353
  239. package/src/adapters/shared/server-route-handler.d.ts +0 -89
  240. package/src/adapters/shared/server-route-handler.js +0 -120
  241. package/src/adapters/shared/server-static-builder.d.ts +0 -38
  242. package/src/adapters/shared/server-static-builder.js +0 -46
  243. package/src/build/build-adapter.d.ts +0 -74
  244. package/src/build/build-adapter.js +0 -54
  245. package/src/build/build-types.d.ts +0 -57
  246. package/src/build/build-types.js +0 -0
  247. package/src/build/esbuild-build-adapter.d.ts +0 -69
  248. package/src/build/esbuild-build-adapter.js +0 -390
  249. package/src/config/config-builder.d.ts +0 -227
  250. package/src/config/config-builder.js +0 -392
  251. package/src/constants.d.ts +0 -32
  252. package/src/constants.js +0 -21
  253. package/src/create-app.d.ts +0 -17
  254. package/src/create-app.js +0 -66
  255. package/src/define-api-handler.d.ts +0 -25
  256. package/src/define-api-handler.js +0 -15
  257. package/src/dev/sc-server.d.ts +0 -30
  258. package/src/dev/sc-server.js +0 -111
  259. package/src/eco/component-render-context.d.ts +0 -105
  260. package/src/eco/component-render-context.js +0 -77
  261. package/src/eco/eco.d.ts +0 -9
  262. package/src/eco/eco.js +0 -110
  263. package/src/eco/eco.types.d.ts +0 -170
  264. package/src/eco/eco.types.js +0 -0
  265. package/src/eco/eco.utils.d.ts +0 -40
  266. package/src/eco/eco.utils.js +0 -40
  267. package/src/eco/global-injector-map.d.ts +0 -16
  268. package/src/eco/global-injector-map.js +0 -80
  269. package/src/eco/lazy-injector-map.d.ts +0 -8
  270. package/src/eco/lazy-injector-map.js +0 -70
  271. package/src/eco/module-dependencies.d.ts +0 -18
  272. package/src/eco/module-dependencies.js +0 -49
  273. package/src/errors/http-error.d.ts +0 -31
  274. package/src/errors/http-error.js +0 -50
  275. package/src/errors/index.d.ts +0 -2
  276. package/src/errors/index.js +0 -4
  277. package/src/errors/locals-access-error.d.ts +0 -4
  278. package/src/errors/locals-access-error.js +0 -9
  279. package/src/global/app-logger.d.ts +0 -2
  280. package/src/global/app-logger.js +0 -6
  281. package/src/hmr/client/hmr-runtime.d.ts +0 -10
  282. package/src/hmr/client/hmr-runtime.js +0 -86
  283. package/src/hmr/hmr-strategy.d.ts +0 -159
  284. package/src/hmr/hmr-strategy.js +0 -29
  285. package/src/hmr/hmr.test.e2e.d.ts +0 -1
  286. package/src/hmr/hmr.test.e2e.js +0 -50
  287. package/src/hmr/strategies/default-hmr-strategy.d.ts +0 -43
  288. package/src/hmr/strategies/default-hmr-strategy.js +0 -34
  289. package/src/hmr/strategies/js-hmr-strategy.d.ts +0 -136
  290. package/src/hmr/strategies/js-hmr-strategy.js +0 -188
  291. package/src/index.browser.d.ts +0 -3
  292. package/src/index.browser.js +0 -4
  293. package/src/index.d.ts +0 -5
  294. package/src/index.js +0 -10
  295. package/src/integrations/ghtml/ghtml-renderer.d.ts +0 -15
  296. package/src/integrations/ghtml/ghtml-renderer.js +0 -60
  297. package/src/integrations/ghtml/ghtml.plugin.d.ts +0 -20
  298. package/src/integrations/ghtml/ghtml.plugin.js +0 -21
  299. package/src/internal-types.d.ts +0 -200
  300. package/src/internal-types.js +0 -0
  301. package/src/plugins/alias-resolver-plugin.d.ts +0 -2
  302. package/src/plugins/alias-resolver-plugin.js +0 -39
  303. package/src/plugins/eco-component-meta-plugin.d.ts +0 -95
  304. package/src/plugins/eco-component-meta-plugin.js +0 -157
  305. package/src/plugins/integration-plugin.d.ts +0 -102
  306. package/src/plugins/integration-plugin.js +0 -100
  307. package/src/plugins/processor.d.ts +0 -82
  308. package/src/plugins/processor.js +0 -122
  309. package/src/public-types.d.ts +0 -1098
  310. package/src/public-types.js +0 -0
  311. package/src/route-renderer/component-graph-executor.d.ts +0 -32
  312. package/src/route-renderer/component-graph-executor.js +0 -31
  313. package/src/route-renderer/component-graph.d.ts +0 -42
  314. package/src/route-renderer/component-graph.js +0 -72
  315. package/src/route-renderer/component-marker.d.ts +0 -52
  316. package/src/route-renderer/component-marker.js +0 -46
  317. package/src/route-renderer/dependency-resolver.d.ts +0 -24
  318. package/src/route-renderer/dependency-resolver.js +0 -428
  319. package/src/route-renderer/html-post-processing.service.d.ts +0 -40
  320. package/src/route-renderer/html-post-processing.service.js +0 -86
  321. package/src/route-renderer/html-post-processing.service.ts +0 -103
  322. package/src/route-renderer/integration-renderer.d.ts +0 -339
  323. package/src/route-renderer/integration-renderer.js +0 -526
  324. package/src/route-renderer/marker-graph-resolver.d.ts +0 -76
  325. package/src/route-renderer/marker-graph-resolver.js +0 -93
  326. package/src/route-renderer/page-module-loader.d.ts +0 -61
  327. package/src/route-renderer/page-module-loader.js +0 -102
  328. package/src/route-renderer/render-execution.service.d.ts +0 -69
  329. package/src/route-renderer/render-execution.service.js +0 -91
  330. package/src/route-renderer/render-preparation.service.d.ts +0 -112
  331. package/src/route-renderer/render-preparation.service.js +0 -243
  332. package/src/route-renderer/route-renderer.d.ts +0 -26
  333. package/src/route-renderer/route-renderer.js +0 -68
  334. package/src/router/fs-router-scanner.d.ts +0 -41
  335. package/src/router/fs-router-scanner.js +0 -155
  336. package/src/router/fs-router.d.ts +0 -26
  337. package/src/router/fs-router.js +0 -100
  338. package/src/services/asset-processing-service/asset-processing.service.d.ts +0 -41
  339. package/src/services/asset-processing-service/asset-processing.service.js +0 -250
  340. package/src/services/asset-processing-service/asset.factory.d.ts +0 -17
  341. package/src/services/asset-processing-service/asset.factory.js +0 -82
  342. package/src/services/asset-processing-service/assets.types.d.ts +0 -88
  343. package/src/services/asset-processing-service/assets.types.js +0 -0
  344. package/src/services/asset-processing-service/index.d.ts +0 -3
  345. package/src/services/asset-processing-service/index.js +0 -3
  346. package/src/services/asset-processing-service/processor.interface.d.ts +0 -22
  347. package/src/services/asset-processing-service/processor.interface.js +0 -6
  348. package/src/services/asset-processing-service/processor.registry.d.ts +0 -8
  349. package/src/services/asset-processing-service/processor.registry.js +0 -15
  350. package/src/services/asset-processing-service/processors/base/base-processor.d.ts +0 -24
  351. package/src/services/asset-processing-service/processors/base/base-processor.js +0 -59
  352. package/src/services/asset-processing-service/processors/base/base-script-processor.d.ts +0 -16
  353. package/src/services/asset-processing-service/processors/base/base-script-processor.js +0 -80
  354. package/src/services/asset-processing-service/processors/index.d.ts +0 -5
  355. package/src/services/asset-processing-service/processors/index.js +0 -5
  356. package/src/services/asset-processing-service/processors/script/content-script.processor.d.ts +0 -5
  357. package/src/services/asset-processing-service/processors/script/content-script.processor.js +0 -57
  358. package/src/services/asset-processing-service/processors/script/file-script.processor.d.ts +0 -8
  359. package/src/services/asset-processing-service/processors/script/file-script.processor.js +0 -76
  360. package/src/services/asset-processing-service/processors/script/node-module-script.processor.d.ts +0 -7
  361. package/src/services/asset-processing-service/processors/script/node-module-script.processor.js +0 -74
  362. package/src/services/asset-processing-service/processors/stylesheet/content-stylesheet.processor.d.ts +0 -5
  363. package/src/services/asset-processing-service/processors/stylesheet/content-stylesheet.processor.js +0 -25
  364. package/src/services/asset-processing-service/processors/stylesheet/file-stylesheet.processor.d.ts +0 -9
  365. package/src/services/asset-processing-service/processors/stylesheet/file-stylesheet.processor.js +0 -63
  366. package/src/services/cache/cache.types.d.ts +0 -107
  367. package/src/services/cache/cache.types.js +0 -0
  368. package/src/services/cache/index.d.ts +0 -7
  369. package/src/services/cache/index.js +0 -7
  370. package/src/services/cache/memory-cache-store.d.ts +0 -42
  371. package/src/services/cache/memory-cache-store.js +0 -98
  372. package/src/services/cache/page-cache-service.d.ts +0 -70
  373. package/src/services/cache/page-cache-service.js +0 -152
  374. package/src/services/html-transformer.service.d.ts +0 -50
  375. package/src/services/html-transformer.service.js +0 -163
  376. package/src/services/html-transformer.service.ts +0 -217
  377. package/src/services/page-module-import.service.d.ts +0 -37
  378. package/src/services/page-module-import.service.js +0 -88
  379. package/src/services/page-module-import.service.ts +0 -129
  380. package/src/services/page-request-cache-coordinator.service.d.ts +0 -75
  381. package/src/services/page-request-cache-coordinator.service.js +0 -107
  382. package/src/services/schema-validation-service.d.ts +0 -122
  383. package/src/services/schema-validation-service.js +0 -101
  384. package/src/services/validation/standard-schema.types.d.ts +0 -65
  385. package/src/services/validation/standard-schema.types.js +0 -0
  386. package/src/static-site-generator/static-site-generator.d.ts +0 -57
  387. package/src/static-site-generator/static-site-generator.js +0 -272
  388. package/src/utils/css.d.ts +0 -1
  389. package/src/utils/css.js +0 -7
  390. package/src/utils/deep-merge.d.ts +0 -14
  391. package/src/utils/deep-merge.js +0 -32
  392. package/src/utils/hash.d.ts +0 -1
  393. package/src/utils/hash.js +0 -7
  394. package/src/utils/html.d.ts +0 -1
  395. package/src/utils/html.js +0 -4
  396. package/src/utils/invariant.d.ts +0 -5
  397. package/src/utils/invariant.js +0 -11
  398. package/src/utils/locals-utils.d.ts +0 -15
  399. package/src/utils/locals-utils.js +0 -24
  400. package/src/utils/parse-cli-args.d.ts +0 -24
  401. package/src/utils/parse-cli-args.js +0 -47
  402. package/src/utils/path-utils.module.d.ts +0 -5
  403. package/src/utils/path-utils.module.js +0 -14
  404. package/src/utils/runtime.d.ts +0 -11
  405. package/src/utils/runtime.js +0 -40
  406. package/src/utils/server-utils.module.d.ts +0 -19
  407. package/src/utils/server-utils.module.js +0 -56
  408. package/src/watchers/project-watcher.d.ts +0 -125
  409. package/src/watchers/project-watcher.js +0 -265
  410. package/src/watchers/project-watcher.test-helpers.d.ts +0 -4
  411. package/src/watchers/project-watcher.test-helpers.js +0 -52
  412. /package/src/route-renderer/{component-graph-executor.ts → component-graph/component-graph-executor.ts} +0 -0
  413. /package/src/route-renderer/{component-graph.ts → component-graph/component-graph.ts} +0 -0
  414. /package/src/route-renderer/{component-marker.ts → component-graph/component-marker.ts} +0 -0
  415. /package/src/services/{asset-processing-service → assets/asset-processing-service}/processor.registry.ts +0 -0
  416. /package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/index.ts +0 -0
  417. /package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/script/content-script.processor.ts +0 -0
  418. /package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/stylesheet/content-stylesheet.processor.ts +0 -0
@@ -6,6 +6,7 @@ import type {
6
6
  } from 'esbuild';
7
7
  import path from 'node:path';
8
8
  import { createRequire } from 'node:module';
9
+ import { pathToFileURL } from 'node:url';
9
10
  import { fileSystem } from '@ecopages/file-system';
10
11
  import type {
11
12
  EcoBuildOnLoadResult,
@@ -23,6 +24,8 @@ import type {
23
24
  BuildTranspileProfile,
24
25
  } from './build-adapter.ts';
25
26
 
27
+ const esbuildRequire = createRequire(import.meta.url);
28
+
26
29
  /**
27
30
  * Provides common transpile output defaults shared across build profiles.
28
31
  */
@@ -56,17 +59,14 @@ function transpileProfileToOptions(profile: BuildTranspileProfile): BuildTranspi
56
59
  * and `module`) while delegating bundling and TypeScript/decorator transforms to esbuild.
57
60
  */
58
61
  export class EsbuildBuildAdapter implements BuildAdapter {
59
- private registeredPlugins: EcoBuildPlugin[] = [];
60
-
61
62
  private escapeRegExp(value: string): string {
62
63
  return value.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
63
64
  }
64
65
 
65
66
  private getPluginsForBuild(additionalPlugins?: EcoBuildPlugin[]): EcoBuildPlugin[] {
66
- const merged = [...(additionalPlugins ?? []), ...this.registeredPlugins];
67
67
  const byName = new Map<string, EcoBuildPlugin>();
68
68
 
69
- for (const plugin of merged) {
69
+ for (const plugin of additionalPlugins ?? []) {
70
70
  if (!byName.has(plugin.name)) {
71
71
  byName.set(plugin.name, plugin);
72
72
  }
@@ -286,8 +286,28 @@ export class EsbuildBuildAdapter implements BuildAdapter {
286
286
  };
287
287
  }
288
288
 
289
- private async loadEsbuildModule(): Promise<typeof import('esbuild')> {
290
- const esbuildModule = (await import('esbuild')) as typeof import('esbuild');
289
+ private async loadEsbuildModule(moduleGeneration = 0): Promise<typeof import('esbuild')> {
290
+ const importedModule = await import('esbuild');
291
+ const esbuildModule = (
292
+ typeof (importedModule as typeof import('esbuild')).build === 'function'
293
+ ? importedModule
294
+ : ((importedModule as { default?: typeof import('esbuild') }).default ?? importedModule)
295
+ ) as typeof import('esbuild');
296
+
297
+ if (moduleGeneration > 0 && !this.isMockedEsbuildModule(esbuildModule)) {
298
+ const freshModule = await import(
299
+ `${pathToFileURL(esbuildRequire.resolve('esbuild')).href}?ecopages_esbuild=${moduleGeneration}`
300
+ );
301
+ const normalizedFreshModule = (
302
+ typeof (freshModule as typeof import('esbuild')).build === 'function'
303
+ ? freshModule
304
+ : ((freshModule as { default?: typeof import('esbuild') }).default ?? freshModule)
305
+ ) as typeof import('esbuild');
306
+
307
+ if (typeof normalizedFreshModule.build === 'function') {
308
+ return normalizedFreshModule;
309
+ }
310
+ }
291
311
 
292
312
  if (typeof esbuildModule.build !== 'function') {
293
313
  throw new Error('esbuild is not available. Install esbuild to use Node bundling.');
@@ -296,6 +316,102 @@ export class EsbuildBuildAdapter implements BuildAdapter {
296
316
  return esbuildModule;
297
317
  }
298
318
 
319
+ private isMockedEsbuildModule(esbuildModule: typeof import('esbuild')): boolean {
320
+ const build = esbuildModule.build as { mock?: unknown } | undefined;
321
+ const stop = esbuildModule.stop as { mock?: unknown } | undefined;
322
+ return typeof build?.mock === 'object' || typeof stop?.mock === 'object';
323
+ }
324
+
325
+ /**
326
+ * Detects the subset of runtime faults that indicate esbuild's worker
327
+ * protocol is corrupted rather than a normal build error.
328
+ */
329
+ isEsbuildProtocolError(error: unknown): boolean {
330
+ if (!(error instanceof Error)) {
331
+ return false;
332
+ }
333
+
334
+ return ['Unexpected end of JSON input', 'Unexpected EOF', 'parseJSON', 'buildResponseToResult'].some(
335
+ (fragment) => error.message.includes(fragment) || error.stack?.includes(fragment),
336
+ );
337
+ }
338
+
339
+ async stopEsbuildService(moduleGeneration = 0): Promise<void> {
340
+ const esbuild = await this.loadEsbuildModule(moduleGeneration);
341
+ if (typeof esbuild.stop === 'function') {
342
+ esbuild.stop();
343
+ }
344
+ }
345
+
346
+ async buildOrThrow(options: BuildOptions, moduleGeneration = 0): Promise<BuildResult> {
347
+ const esbuild = await this.loadEsbuildModule(moduleGeneration);
348
+ const contextRoot = options.root ? path.resolve(options.root) : process.cwd();
349
+ const outdir = path.resolve(options.outdir ?? 'dist/assets');
350
+ const tsconfigPath = path.join(contextRoot, 'tsconfig.json');
351
+ const tsconfigExists = fileSystem.exists(tsconfigPath);
352
+
353
+ const plugins = this.getPluginsForBuild(options.plugins);
354
+ const esbuildPlugins: EsbuildPlugin[] = [
355
+ ...(plugins.length > 0 ? [this.createEcoPluginBridge(plugins, contextRoot)] : []),
356
+ ];
357
+ const transpileTarget = 'es2022';
358
+
359
+ const usesTemplatedNaming = this.hasTemplateTokens(options.naming);
360
+ const outfile = options.naming && !usesTemplatedNaming ? path.join(outdir, options.naming) : undefined;
361
+ if (outfile) {
362
+ fileSystem.ensureDir(path.dirname(outfile));
363
+ }
364
+
365
+ const outputOptions = outfile
366
+ ? { outfile }
367
+ : {
368
+ outdir,
369
+ ...(options.outbase ? { outbase: path.resolve(options.outbase) } : {}),
370
+ entryNames: usesTemplatedNaming ? this.toEntryNamePattern(options.naming) : '[name]',
371
+ chunkNames: '[name]-[hash]',
372
+ assetNames: '[name]-[hash]',
373
+ };
374
+
375
+ const result = await esbuild.build({
376
+ absWorkingDir: contextRoot,
377
+ entryPoints: options.entrypoints,
378
+ bundle: options.bundle ?? true,
379
+ ...outputOptions,
380
+ ...(options.conditions ? { conditions: options.conditions } : {}),
381
+ ...(options.define ? { define: options.define } : {}),
382
+ format: this.mapEsbuildFormat(options.format),
383
+ platform: (options.target === 'browser' ? 'browser' : 'node') as 'browser' | 'node',
384
+ sourcemap: this.mapEsbuildSourcemap(options.sourcemap),
385
+ splitting: outfile ? false : !!options.splitting,
386
+ minify: !!options.minify,
387
+ ...(typeof options.treeshaking === 'boolean' ? { treeShaking: options.treeshaking } : {}),
388
+ external: options.external,
389
+ ...(options.target !== 'browser' && options.externalPackages !== false
390
+ ? { packages: 'external' as const }
391
+ : {}),
392
+ target: transpileTarget,
393
+ metafile: true,
394
+ write: true,
395
+ plugins: esbuildPlugins,
396
+ jsx: 'automatic',
397
+ tsconfig: tsconfigExists ? tsconfigPath : undefined,
398
+ logLevel: 'silent',
399
+ });
400
+
401
+ const outputs = Object.keys(result.metafile.outputs).map((outputPath) => ({
402
+ path: path.isAbsolute(outputPath) ? outputPath : path.join(contextRoot, outputPath),
403
+ }));
404
+ const logs = result.warnings.map((warning) => ({ message: warning.text }));
405
+ const dependencyGraph = this.extractDependencyGraph(result.metafile, contextRoot);
406
+
407
+ return {
408
+ success: true,
409
+ logs,
410
+ outputs,
411
+ dependencyGraph,
412
+ };
413
+ }
414
+
299
415
  private mapEsbuildSourcemap(value: string | undefined): false | 'linked' | 'inline' | 'external' | 'both' {
300
416
  switch (value) {
301
417
  case 'none':
@@ -407,80 +523,22 @@ export class EsbuildBuildAdapter implements BuildAdapter {
407
523
  return [{ message: 'Unknown esbuild error' }];
408
524
  }
409
525
 
526
+ createFailureResult(error: unknown): BuildResult {
527
+ return {
528
+ success: false,
529
+ logs: this.toBuildLogs(error),
530
+ outputs: [],
531
+ };
532
+ }
533
+
410
534
  /**
411
535
  * Bundles entrypoints using esbuild for Node runtime builds.
412
536
  */
413
537
  async build(options: BuildOptions): Promise<BuildResult> {
414
- const esbuild = await this.loadEsbuildModule();
415
- const contextRoot = options.root ? path.resolve(options.root) : process.cwd();
416
- const outdir = path.resolve(options.outdir ?? '.eco/assets');
417
- const tsconfigPath = path.join(contextRoot, 'tsconfig.json');
418
- const tsconfigExists = fileSystem.exists(tsconfigPath);
419
-
420
- const plugins = this.getPluginsForBuild(options.plugins);
421
- const esbuildPlugins: EsbuildPlugin[] = [
422
- ...(plugins.length > 0 ? [this.createEcoPluginBridge(plugins, contextRoot)] : []),
423
- ];
424
- const transpileTarget = 'es2022';
425
-
426
- const usesTemplatedNaming = this.hasTemplateTokens(options.naming);
427
- const outfile = options.naming && !usesTemplatedNaming ? path.join(outdir, options.naming) : undefined;
428
- if (outfile) {
429
- fileSystem.ensureDir(path.dirname(outfile));
430
- }
431
-
432
- const outputOptions = outfile
433
- ? { outfile }
434
- : {
435
- outdir,
436
- entryNames: usesTemplatedNaming ? this.toEntryNamePattern(options.naming) : '[name]',
437
- chunkNames: '[name]-[hash]',
438
- assetNames: '[name]-[hash]',
439
- };
440
-
441
538
  try {
442
- const result = await esbuild.build({
443
- absWorkingDir: contextRoot,
444
- entryPoints: options.entrypoints,
445
- bundle: options.bundle ?? true,
446
- ...outputOptions,
447
- format: this.mapEsbuildFormat(options.format),
448
- platform: (options.target === 'browser' ? 'browser' : 'node') as 'browser' | 'node',
449
- sourcemap: this.mapEsbuildSourcemap(options.sourcemap),
450
- splitting: outfile ? false : !!options.splitting,
451
- minify: !!options.minify,
452
- ...(typeof options.treeshaking === 'boolean' ? { treeShaking: options.treeshaking } : {}),
453
- external: options.external,
454
- ...(options.target !== 'browser' && options.externalPackages !== false
455
- ? { packages: 'external' as const }
456
- : {}),
457
- target: transpileTarget,
458
- metafile: true,
459
- write: true,
460
- plugins: esbuildPlugins,
461
- jsx: 'automatic',
462
- tsconfig: tsconfigExists ? tsconfigPath : undefined,
463
- logLevel: 'silent',
464
- });
465
-
466
- const outputs = Object.keys(result.metafile.outputs).map((outputPath) => ({
467
- path: path.isAbsolute(outputPath) ? outputPath : path.join(contextRoot, outputPath),
468
- }));
469
- const logs = result.warnings.map((warning) => ({ message: warning.text }));
470
- const dependencyGraph = this.extractDependencyGraph(result.metafile, contextRoot);
471
-
472
- return {
473
- success: true,
474
- logs,
475
- outputs,
476
- dependencyGraph,
477
- };
539
+ return await this.buildOrThrow(options);
478
540
  } catch (error) {
479
- return {
480
- success: false,
481
- logs: this.toBuildLogs(error),
482
- outputs: [],
483
- };
541
+ return this.createFailureResult(error);
484
542
  }
485
543
  }
486
544
 
@@ -492,15 +550,6 @@ export class EsbuildBuildAdapter implements BuildAdapter {
492
550
  return localRequire.resolve(importPath);
493
551
  }
494
552
 
495
- /**
496
- * Registers a build plugin once by plugin name.
497
- */
498
- registerPlugin(plugin: EcoBuildPlugin): void {
499
- if (!this.registeredPlugins.find((registered) => registered.name === plugin.name)) {
500
- this.registeredPlugins.push(plugin);
501
- }
502
- }
503
-
504
553
  /**
505
554
  * Returns transpile defaults for a known transpile profile.
506
555
  */
@@ -0,0 +1,34 @@
1
+ import type { EcoPagesAppConfig } from '../internal-types.ts';
2
+ import {
3
+ getAppBuildAdapter,
4
+ getAppBuildExecutor,
5
+ getAppServerBuildPlugins,
6
+ setAppBuildExecutor,
7
+ type BuildExecutor,
8
+ } from './build-adapter.ts';
9
+ import { createOrReuseAppBuildExecutor } from './dev-build-coordinator.ts';
10
+
11
+ /**
12
+ * Installs the app-owned runtime build executor for one app instance.
13
+ *
14
+ * @remarks
15
+ * This is the single coordinator boundary for runtime executor ownership across
16
+ * adapters. It preserves an existing development coordinator when available and
17
+ * always applies app server build plugins through one shared path.
18
+ */
19
+ export function installAppRuntimeBuildExecutor(
20
+ appConfig: EcoPagesAppConfig,
21
+ options: {
22
+ development: boolean;
23
+ },
24
+ ): BuildExecutor {
25
+ const buildExecutor = createOrReuseAppBuildExecutor({
26
+ development: options.development,
27
+ adapter: getAppBuildAdapter(appConfig),
28
+ currentExecutor: getAppBuildExecutor(appConfig),
29
+ getPlugins: () => getAppServerBuildPlugins(appConfig),
30
+ });
31
+
32
+ setAppBuildExecutor(appConfig, buildExecutor);
33
+ return buildExecutor;
34
+ }
@@ -0,0 +1,43 @@
1
+ import assert from 'node:assert/strict';
2
+ import { test } from 'vitest';
3
+ import type { EcoBuildOnResolveResult } from './build-types.ts';
4
+ import { createRuntimeSpecifierAliasPlugin } from './runtime-specifier-alias-plugin.ts';
5
+
6
+ test('createRuntimeSpecifierAliasPlugin resolves mapped specifiers as externals', async () => {
7
+ const registrations: Array<{
8
+ filter: RegExp;
9
+ callback: (args: {
10
+ path: string;
11
+ }) => EcoBuildOnResolveResult | undefined | Promise<EcoBuildOnResolveResult | undefined>;
12
+ }> = [];
13
+ const plugin = createRuntimeSpecifierAliasPlugin(
14
+ {
15
+ react: '/assets/vendors/react.js',
16
+ 'react-dom/client': '/assets/vendors/react-dom.js',
17
+ },
18
+ { name: 'test-runtime-alias' },
19
+ );
20
+
21
+ assert.ok(plugin);
22
+ assert.equal(plugin.name, 'test-runtime-alias');
23
+
24
+ plugin.setup({
25
+ onResolve(options, callback) {
26
+ registrations.push({ filter: options.filter, callback });
27
+ },
28
+ onLoad() {},
29
+ module() {},
30
+ });
31
+
32
+ assert.equal(registrations.length, 1);
33
+ assert.equal(registrations[0]?.filter.test('react'), true);
34
+ assert.deepEqual(await registrations[0]?.callback({ path: 'react' }), {
35
+ path: '/assets/vendors/react.js',
36
+ external: true,
37
+ });
38
+ assert.equal(await registrations[0]?.callback({ path: 'unknown' }), undefined);
39
+ });
40
+
41
+ test('createRuntimeSpecifierAliasPlugin returns null for an empty specifier map', () => {
42
+ assert.equal(createRuntimeSpecifierAliasPlugin(new Map()), null);
43
+ });
@@ -0,0 +1,58 @@
1
+ import type { EcoBuildPlugin } from './build-types.ts';
2
+
3
+ type RuntimeSpecifierMap = ReadonlyMap<string, string> | Record<string, string>;
4
+
5
+ /**
6
+ * Normalizes runtime specifier input into a read-only map shape.
7
+ */
8
+ function toRuntimeSpecifierMap(specifierMap: RuntimeSpecifierMap): ReadonlyMap<string, string> {
9
+ return specifierMap instanceof Map ? specifierMap : new Map(Object.entries(specifierMap));
10
+ }
11
+
12
+ /**
13
+ * Escapes a literal specifier for inclusion in a regular expression.
14
+ */
15
+ function escapeRegExp(value: string): string {
16
+ return value.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
17
+ }
18
+
19
+ /**
20
+ * Creates a build plugin that aliases runtime bare specifiers to concrete URLs.
21
+ *
22
+ * @remarks
23
+ * This helper is used when browser-target builds must preserve integration-owned
24
+ * runtime specifier semantics while letting the bundler treat the mapped URLs as
25
+ * external runtime assets.
26
+ */
27
+ export function createRuntimeSpecifierAliasPlugin(
28
+ specifierMapInput: RuntimeSpecifierMap,
29
+ options?: {
30
+ name?: string;
31
+ external?: boolean;
32
+ },
33
+ ): EcoBuildPlugin | null {
34
+ const specifierMap = toRuntimeSpecifierMap(specifierMapInput);
35
+
36
+ if (specifierMap.size === 0) {
37
+ return null;
38
+ }
39
+
40
+ const filter = new RegExp(`^(${Array.from(specifierMap.keys()).map(escapeRegExp).join('|')})$`);
41
+
42
+ return {
43
+ name: options?.name ?? 'runtime-specifier-alias',
44
+ setup(build) {
45
+ build.onResolve({ filter }, (args) => {
46
+ const mappedPath = specifierMap.get(args.path);
47
+ if (!mappedPath) {
48
+ return undefined;
49
+ }
50
+
51
+ return {
52
+ path: mappedPath,
53
+ external: options?.external ?? true,
54
+ };
55
+ });
56
+ },
57
+ };
58
+ }
@@ -0,0 +1,33 @@
1
+ # Config Layer
2
+
3
+ This directory contains the app-configuration finalization path for Ecopages.
4
+
5
+ ## Purpose
6
+
7
+ The config layer answers one question:
8
+
9
+ How does one `eco.config.ts` become one stable, app-owned runtime/build configuration?
10
+
11
+ It is responsible for:
12
+
13
+ - validating integration, processor, and loader registration
14
+ - resolving semantic paths such as `html` and `404` templates
15
+ - creating app-owned runtime state such as the build adapter, build executor, build manifest, dev graph service, runtime specifier registry, and Node runtime manifest
16
+ - enforcing runtime capability requirements before startup
17
+
18
+ ## Main Files
19
+
20
+ - `config-builder.ts`: the primary builder and config finalization boundary
21
+ - `config-builder.test.ts`: coverage for validation, path resolution, and runtime capability checks
22
+
23
+ ## Ownership Rules
24
+
25
+ - Integrations and processors declare contributions.
26
+ - `ConfigBuilder.build()` decides ordering and validates compatibility.
27
+ - Runtime startup reuses finalized config/build state; it should not recompute manifest ownership.
28
+
29
+ ## Output
30
+
31
+ The result of this layer is a built `EcoPagesAppConfig` with resolved absolute paths and app-owned runtime services attached under `appConfig.runtime`.
32
+
33
+ That built config is then consumed by server adapters, static generation, route rendering, and HMR.