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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (611) hide show
  1. package/README.md +40 -9
  2. package/package.json +371 -33
  3. package/src/adapters/README.md +6 -2
  4. package/src/adapters/abstract/application-adapter.d.ts +115 -6
  5. package/src/adapters/abstract/application-adapter.js +261 -120
  6. package/src/adapters/abstract/router-adapter.js +12 -4
  7. package/src/adapters/abstract/segment-path-matcher.d.ts +6 -0
  8. package/src/adapters/abstract/segment-path-matcher.js +147 -0
  9. package/src/adapters/abstract/server-adapter.d.ts +16 -2
  10. package/src/adapters/abstract/server-adapter.js +22 -14
  11. package/src/adapters/abstract/ws-pattern-matcher.d.ts +12 -0
  12. package/src/adapters/abstract/ws-pattern-matcher.js +28 -0
  13. package/src/adapters/bun/bun-user-websocket-lifecycle.d.ts +22 -0
  14. package/src/adapters/bun/bun-user-websocket-lifecycle.js +93 -0
  15. package/src/adapters/bun/client-bridge.d.ts +1 -0
  16. package/src/adapters/bun/client-bridge.js +51 -47
  17. package/src/adapters/bun/create-app.d.ts +9 -6
  18. package/src/adapters/bun/create-app.js +171 -130
  19. package/src/adapters/bun/hmr-manager.d.ts +1 -1
  20. package/src/adapters/bun/hmr-manager.js +62 -57
  21. package/src/adapters/bun/index.d.ts +1 -1
  22. package/src/adapters/bun/index.js +2 -8
  23. package/src/adapters/bun/runtime-host.d.ts +1 -1
  24. package/src/adapters/bun/runtime-host.js +61 -54
  25. package/src/adapters/bun/server-adapter.d.ts +91 -41
  26. package/src/adapters/bun/server-adapter.js +566 -426
  27. package/src/adapters/bun/static-preview-host.d.ts +1 -1
  28. package/src/adapters/bun/static-preview-host.js +43 -41
  29. package/src/adapters/create-app.d.ts +13 -11
  30. package/src/adapters/create-app.js +11 -63
  31. package/src/adapters/index.d.ts +2 -2
  32. package/src/adapters/index.js +2 -8
  33. package/src/adapters/node/create-app.d.ts +8 -3
  34. package/src/adapters/node/create-app.js +126 -84
  35. package/src/adapters/node/http-request-bridge.js +147 -106
  36. package/src/adapters/node/node-client-bridge.d.ts +1 -0
  37. package/src/adapters/node/node-client-bridge.js +62 -61
  38. package/src/adapters/node/node-hmr-manager.d.ts +1 -1
  39. package/src/adapters/node/node-hmr-manager.js +58 -48
  40. package/src/adapters/node/runtime-host.d.ts +1 -1
  41. package/src/adapters/node/runtime-host.js +96 -89
  42. package/src/adapters/node/server-adapter-dependencies.js +18 -17
  43. package/src/adapters/node/server-adapter.d.ts +63 -23
  44. package/src/adapters/node/server-adapter.js +346 -297
  45. package/src/adapters/node/static-content-server.d.ts +1 -0
  46. package/src/adapters/node/static-content-server.js +172 -183
  47. package/src/adapters/node/static-preview-host.d.ts +1 -1
  48. package/src/adapters/node/static-preview-host.js +88 -64
  49. package/src/adapters/shared/hmr/dev-transform-entrypoint-registry.d.ts +16 -0
  50. package/src/adapters/shared/hmr/dev-transform-entrypoint-registry.js +32 -0
  51. package/src/adapters/shared/{hmr-html-response.d.ts → hmr/hmr-html-response.d.ts} +2 -2
  52. package/src/adapters/shared/hmr/hmr-html-response.js +50 -0
  53. package/src/adapters/shared/hmr/shared-hmr-manager.d.ts +92 -0
  54. package/src/adapters/shared/hmr/shared-hmr-manager.js +446 -0
  55. package/src/adapters/shared/http/api-request-pipeline.d.ts +23 -0
  56. package/src/adapters/shared/http/api-request-pipeline.js +132 -0
  57. package/src/adapters/shared/{api-response.d.ts → http/api-response.d.ts} +1 -1
  58. package/src/adapters/shared/http/api-response.js +79 -0
  59. package/src/adapters/shared/http/create-body-response.d.ts +12 -0
  60. package/src/adapters/shared/http/create-body-response.js +26 -0
  61. package/src/adapters/shared/http/define-api-handler.d.ts +90 -0
  62. package/src/adapters/shared/http/define-api-handler.js +49 -0
  63. package/src/adapters/shared/{explicit-static-render-preparation.d.ts → http/explicit-static-render-preparation.d.ts} +3 -3
  64. package/src/adapters/shared/http/explicit-static-render-preparation.js +29 -0
  65. package/src/adapters/shared/{explicit-static-route-matcher.d.ts → http/explicit-static-route-matcher.d.ts} +3 -9
  66. package/src/adapters/shared/http/explicit-static-route-matcher.js +59 -0
  67. package/src/adapters/shared/{file-route-middleware-pipeline.d.ts → http/file-route-middleware-pipeline.d.ts} +2 -2
  68. package/src/adapters/shared/http/file-route-middleware-pipeline.js +84 -0
  69. package/src/adapters/shared/{fs-server-response-factory.d.ts → http/fs-server-response-factory.d.ts} +7 -2
  70. package/src/adapters/shared/http/fs-server-response-factory.js +106 -0
  71. package/src/adapters/shared/{fs-server-response-matcher.d.ts → http/fs-server-response-matcher.d.ts} +25 -5
  72. package/src/adapters/shared/http/fs-server-response-matcher.js +258 -0
  73. package/src/adapters/shared/http/run-middleware-chain.d.ts +5 -0
  74. package/src/adapters/shared/http/run-middleware-chain.js +17 -0
  75. package/src/adapters/shared/{application-adapter.d.ts → runtime/application-adapter.d.ts} +2 -2
  76. package/src/adapters/shared/runtime/application-adapter.js +75 -0
  77. package/src/adapters/shared/runtime/collect-dev-prewarm-plan.d.ts +11 -0
  78. package/src/adapters/shared/runtime/collect-dev-prewarm-plan.js +29 -0
  79. package/src/adapters/shared/runtime/copy-runtime-public-dir.d.ts +6 -0
  80. package/src/adapters/shared/runtime/copy-runtime-public-dir.js +27 -0
  81. package/src/adapters/shared/runtime/dev-static-route-prewarm.d.ts +16 -0
  82. package/src/adapters/shared/runtime/dev-static-route-prewarm.js +66 -0
  83. package/src/adapters/shared/runtime/port-manager.d.ts +116 -0
  84. package/src/adapters/shared/runtime/port-manager.js +226 -0
  85. package/src/adapters/shared/{render-context.d.ts → runtime/render-context.d.ts} +2 -2
  86. package/src/adapters/shared/runtime/render-context.js +99 -0
  87. package/src/adapters/shared/{runtime-app-bootstrap.d.ts → runtime/runtime-app-bootstrap.d.ts} +4 -3
  88. package/src/adapters/shared/runtime/runtime-app-bootstrap.js +38 -0
  89. package/src/adapters/shared/runtime/runtime-server-lifecycle.d.ts +45 -0
  90. package/src/adapters/shared/runtime/runtime-server-lifecycle.js +71 -0
  91. package/src/adapters/shared/{server-adapter.d.ts → runtime/server-adapter.d.ts} +31 -50
  92. package/src/adapters/shared/runtime/server-adapter.js +301 -0
  93. package/src/adapters/shared/{server-route-handler.d.ts → runtime/server-route-handler.d.ts} +6 -33
  94. package/src/adapters/shared/runtime/server-route-handler.js +77 -0
  95. package/src/adapters/shared/{server-static-builder.d.ts → runtime/server-static-builder.d.ts} +27 -35
  96. package/src/adapters/shared/runtime/server-static-builder.js +172 -0
  97. package/src/adapters/shared/{static-preview-host.d.ts → runtime/static-preview-host.d.ts} +6 -1
  98. package/src/adapters/shared/ws/node-http-websocket-upgrades.d.ts +21 -0
  99. package/src/adapters/shared/ws/node-http-websocket-upgrades.js +109 -0
  100. package/src/adapters/shared/ws/websocket-lifecycle.d.ts +24 -0
  101. package/src/adapters/shared/ws/websocket-lifecycle.js +62 -0
  102. package/src/build/README.md +191 -31
  103. package/src/build/app-build-manifest-runtime.d.ts +39 -0
  104. package/src/build/app-build-manifest-runtime.js +145 -0
  105. package/src/build/browser/browser-runtime-manifest.js +58 -0
  106. package/src/build/browser/browser-runtime-plugin-helpers.js +34 -0
  107. package/src/build/{browser-runtime-plugin.d.ts → browser/browser-runtime-plugin.d.ts} +1 -1
  108. package/src/build/browser/browser-runtime-plugin.js +216 -0
  109. package/src/build/browser/jsx-ownership-plugins.d.ts +24 -0
  110. package/src/build/browser/jsx-ownership-plugins.js +55 -0
  111. package/src/build/browser/lit-static-render-worker-context.d.ts +2 -0
  112. package/src/build/browser/lit-static-render-worker-context.js +4 -0
  113. package/src/build/build-adapter.d.ts +29 -334
  114. package/src/build/build-adapter.js +273 -237
  115. package/src/build/cache/build-input-fingerprint.d.ts +28 -0
  116. package/src/build/cache/build-input-fingerprint.js +33 -0
  117. package/src/build/cache/cache-constants.d.ts +4 -0
  118. package/src/build/cache/cache-constants.js +4 -0
  119. package/src/build/cache/cache-keys.d.ts +22 -0
  120. package/src/build/cache/cache-keys.js +71 -0
  121. package/src/build/cache/pages-unified-graph-build.d.ts +31 -0
  122. package/src/build/cache/pages-unified-graph-build.js +199 -0
  123. package/src/build/cache/production-build-cache.d.ts +21 -0
  124. package/src/build/cache/production-build-cache.js +56 -0
  125. package/src/build/cache/server-entry-build-cache.d.ts +43 -0
  126. package/src/build/cache/server-entry-build-cache.js +153 -0
  127. package/src/build/contracts/build-contracts.d.ts +96 -0
  128. package/src/build/contracts/build-contracts.js +1 -0
  129. package/src/build/contracts/build-manifest.d.ts +90 -0
  130. package/src/build/contracts/build-manifest.js +64 -0
  131. package/src/build/contracts/build-types.js +1 -0
  132. package/src/build/contracts/content-virtual-modules.d.ts +12 -0
  133. package/src/build/contracts/content-virtual-modules.js +29 -0
  134. package/src/build/{rolldown-adapter-helpers.d.ts → rolldown/rolldown-adapter-helpers.d.ts} +32 -9
  135. package/src/build/rolldown/rolldown-adapter-helpers.js +458 -0
  136. package/src/build/{rolldown-build-adapter.d.ts → rolldown/rolldown-build-adapter.d.ts} +3 -7
  137. package/src/build/rolldown/rolldown-build-adapter.js +57 -0
  138. package/src/build/rolldown/rolldown-build-invocation-metrics.d.ts +12 -0
  139. package/src/build/rolldown/rolldown-build-invocation-metrics.js +39 -0
  140. package/src/build/{rolldown-plugin-bridge.d.ts → rolldown/rolldown-plugin-bridge.d.ts} +16 -2
  141. package/src/build/rolldown/rolldown-plugin-bridge.js +284 -0
  142. package/src/build/rolldown/rolldown-source-transform-pass.d.ts +15 -0
  143. package/src/build/rolldown/rolldown-source-transform-pass.js +70 -0
  144. package/src/build/rolldown/runtime-build-output-normalizer.d.ts +10 -0
  145. package/src/build/rolldown/runtime-build-output-normalizer.js +253 -0
  146. package/src/build/rolldown/server-side-css-shim-plugin.js +58 -0
  147. package/src/build/runtime/build-profile-options.d.ts +7 -0
  148. package/src/build/runtime/build-profile-options.js +37 -0
  149. package/src/build/runtime/build-request-identity.d.ts +17 -0
  150. package/src/build/runtime/build-request-identity.js +79 -0
  151. package/src/build/runtime/build-request-policy.d.ts +58 -0
  152. package/src/build/runtime/build-request-policy.js +84 -0
  153. package/src/build/runtime/build-runtime.d.ts +28 -0
  154. package/src/build/runtime/build-runtime.js +75 -0
  155. package/src/build/runtime/deduping-build-executor.d.ts +21 -0
  156. package/src/build/runtime/deduping-build-executor.js +40 -0
  157. package/src/build/runtime/parallel-build-executor.d.ts +21 -0
  158. package/src/build/runtime/parallel-build-executor.js +60 -0
  159. package/src/build/{serialized-build-executor.d.ts → runtime/serialized-build-executor.d.ts} +1 -1
  160. package/src/build/runtime/serialized-build-executor.js +79 -0
  161. package/src/cache/index.d.ts +2 -1
  162. package/src/cache/index.js +7 -6
  163. package/src/cache/module-parse-cache.d.ts +5 -0
  164. package/src/cache/module-parse-cache.js +122 -67
  165. package/src/cache/module-transform-profiler.d.ts +8 -0
  166. package/src/cache/module-transform-profiler.js +8 -0
  167. package/src/client/navigation-scripts/classification.d.ts +16 -0
  168. package/src/client/navigation-scripts/classification.js +49 -0
  169. package/src/client/navigation-scripts/index.d.ts +3 -0
  170. package/src/client/navigation-scripts/index.js +3 -0
  171. package/src/client/navigation-scripts/navigation-scripts.test.browser.d.ts +1 -0
  172. package/src/client/navigation-scripts/navigation-scripts.test.browser.js +61 -0
  173. package/src/client/navigation-scripts/registry.d.ts +11 -0
  174. package/src/client/navigation-scripts/registry.js +16 -0
  175. package/src/client/navigation-scripts/rerun-queue.d.ts +37 -0
  176. package/src/client/navigation-scripts/rerun-queue.js +90 -0
  177. package/src/client/scroll.d.ts +17 -0
  178. package/src/client/scroll.js +33 -0
  179. package/src/client/scroll.test.browser.d.ts +1 -0
  180. package/src/client/scroll.test.browser.js +31 -0
  181. package/src/client/view-transitions.d.ts +32 -0
  182. package/src/client/view-transitions.js +120 -0
  183. package/src/client/view-transitions.test.browser.d.ts +1 -0
  184. package/src/client/view-transitions.test.browser.js +56 -0
  185. package/src/config/config-builder.d.ts +40 -10
  186. package/src/config/config-builder.js +647 -600
  187. package/src/config/constants.d.ts +1 -0
  188. package/src/config/constants.js +44 -23
  189. package/src/declarations.d.ts +1 -0
  190. package/src/dev/README.md +24 -0
  191. package/src/dev/client-bridge-registry.d.ts +5 -0
  192. package/src/dev/client-bridge-registry.js +10 -0
  193. package/src/dev/dev-client-ownership.d.ts +7 -0
  194. package/src/dev/dev-client-ownership.js +8 -0
  195. package/src/dev/hmr-manager-registry.d.ts +8 -0
  196. package/src/dev/hmr-manager-registry.js +10 -0
  197. package/src/dev/host-runtime.d.ts +3 -0
  198. package/src/dev/host-runtime.js +25 -23
  199. package/src/dev/runtime-server-started-message.d.ts +2 -0
  200. package/src/dev/runtime-server-started-message.js +3 -0
  201. package/src/dev/sc-server.js +106 -103
  202. package/src/dev/transform-server/dev-transform-bundler.d.ts +24 -0
  203. package/src/dev/transform-server/dev-transform-bundler.js +79 -0
  204. package/src/dev/transform-server/dev-transform-externalize-plugin.d.ts +12 -0
  205. package/src/dev/transform-server/dev-transform-externalize-plugin.js +29 -0
  206. package/src/dev/transform-server/dev-transform-import-rewriter.d.ts +16 -0
  207. package/src/dev/transform-server/dev-transform-import-rewriter.js +126 -0
  208. package/src/dev/transform-server/dev-transform-module-kind.d.ts +13 -0
  209. package/src/dev/transform-server/dev-transform-module-kind.js +17 -0
  210. package/src/dev/transform-server/dev-transform-runtime-specifiers.d.ts +5 -0
  211. package/src/dev/transform-server/dev-transform-runtime-specifiers.js +16 -0
  212. package/src/dev/transform-server/dev-transform-server.d.ts +41 -0
  213. package/src/dev/transform-server/dev-transform-server.js +191 -0
  214. package/src/dev/transform-server/dev-transform-url.d.ts +13 -0
  215. package/src/dev/transform-server/dev-transform-url.js +58 -0
  216. package/src/dev/transform-server/dev-transform-vendor-registry.d.ts +28 -0
  217. package/src/dev/transform-server/dev-transform-vendor-registry.js +158 -0
  218. package/src/dev/transform-server/index.d.ts +6 -0
  219. package/src/dev/transform-server/index.js +4 -0
  220. package/src/dev/transform-server/types.d.ts +15 -0
  221. package/src/dev/transform-server/types.js +1 -0
  222. package/src/dev-toolbar/README.md +52 -0
  223. package/src/dev-toolbar/define-dev-tool.d.ts +21 -0
  224. package/src/dev-toolbar/define-dev-tool.js +9 -0
  225. package/src/dev-toolbar/dev-toolbar-config.d.ts +25 -0
  226. package/src/dev-toolbar/dev-toolbar-config.js +19 -0
  227. package/src/dev-toolbar/dev-toolbar-host.d.ts +49 -0
  228. package/src/dev-toolbar/dev-toolbar-host.js +117 -0
  229. package/src/dev-toolbar/dev-toolbar-html-response.d.ts +11 -0
  230. package/src/dev-toolbar/dev-toolbar-html-response.js +14 -0
  231. package/src/dev-toolbar/dev-toolbar-manifest-contract.d.ts +22 -0
  232. package/src/dev-toolbar/dev-toolbar-manifest-contract.js +2 -0
  233. package/src/dev-toolbar/dev-toolbar-manifest.d.ts +15 -0
  234. package/src/dev-toolbar/dev-toolbar-manifest.js +52 -0
  235. package/src/dev-toolbar/dev-toolbar-package.d.ts +34 -0
  236. package/src/dev-toolbar/dev-toolbar-package.js +78 -0
  237. package/src/dev-toolbar/dev-toolbar-runtime-paths.d.ts +10 -0
  238. package/src/dev-toolbar/dev-toolbar-runtime-paths.js +13 -0
  239. package/src/diagnostics/request-build-dedupe.d.ts +18 -0
  240. package/src/diagnostics/request-build-dedupe.js +39 -0
  241. package/src/diagnostics/request-pipeline-metrics.d.ts +38 -0
  242. package/src/diagnostics/request-pipeline-metrics.js +121 -0
  243. package/src/diagnostics/startup-trace.d.ts +81 -0
  244. package/src/diagnostics/startup-trace.js +281 -0
  245. package/src/eco/README.md +17 -0
  246. package/src/eco/component-identity.d.ts +13 -0
  247. package/src/eco/component-identity.js +18 -0
  248. package/src/eco/eco-declared-component.d.ts +15 -0
  249. package/src/eco/eco-declared-component.js +23 -0
  250. package/src/eco/eco.browser.js +63 -70
  251. package/src/eco/eco.js +163 -97
  252. package/src/eco/eco.types.d.ts +47 -8
  253. package/src/eco/eco.types.js +5 -0
  254. package/src/eco/eco.utils.d.ts +1 -1
  255. package/src/eco/eco.utils.js +1 -10
  256. package/src/eco/global-injector-map.js +55 -41
  257. package/src/eco/lazy-injector-map.js +90 -60
  258. package/src/eco/module-dependencies.js +52 -44
  259. package/src/eco/page-layout-normalization.d.ts +21 -0
  260. package/src/eco/page-layout-normalization.js +69 -0
  261. package/src/env.d.ts +2 -0
  262. package/src/errors/http-error.d.ts +8 -0
  263. package/src/errors/http-error.js +66 -49
  264. package/src/errors/index.d.ts +1 -0
  265. package/src/errors/index.js +3 -6
  266. package/src/errors/locals-access-error.js +5 -8
  267. package/src/errors/undeclared-component-dependency-error.d.ts +11 -0
  268. package/src/errors/undeclared-component-dependency-error.js +17 -0
  269. package/src/global/app-logger.js +3 -6
  270. package/src/hmr/README.md +21 -0
  271. package/src/hmr/client/hmr-runtime.js +119 -110
  272. package/src/hmr/client/module-update.d.ts +13 -0
  273. package/src/hmr/client/module-update.js +39 -0
  274. package/src/hmr/hmr-asset-paths.d.ts +14 -0
  275. package/src/hmr/hmr-asset-paths.js +22 -0
  276. package/src/hmr/hmr-entrypoint-output.d.ts +21 -0
  277. package/src/hmr/hmr-entrypoint-output.js +34 -0
  278. package/src/hmr/hmr-file-change-prep.d.ts +10 -0
  279. package/src/hmr/hmr-file-change-prep.js +14 -0
  280. package/src/hmr/hmr-registered-entrypoints-context.d.ts +7 -0
  281. package/src/hmr/hmr-registered-entrypoints-context.js +1 -0
  282. package/src/hmr/hmr-runtime-paths.d.ts +10 -0
  283. package/src/hmr/hmr-runtime-paths.js +13 -0
  284. package/src/hmr/hmr-strategy.d.ts +9 -0
  285. package/src/hmr/hmr-strategy.js +113 -42
  286. package/src/hmr/strategies/default-hmr-strategy.js +55 -33
  287. package/src/hmr/strategies/js-hmr-strategy.d.ts +6 -97
  288. package/src/hmr/strategies/js-hmr-strategy.js +107 -167
  289. package/src/hmr/strategies/server-rendered-template-hmr-strategy.d.ts +17 -0
  290. package/src/hmr/strategies/server-rendered-template-hmr-strategy.js +35 -0
  291. package/src/index.browser.d.ts +1 -0
  292. package/src/index.browser.js +2 -4
  293. package/src/index.d.ts +4 -1
  294. package/src/index.js +7 -21
  295. package/src/integrations/ghtml/ghtml-renderer.d.ts +2 -6
  296. package/src/integrations/ghtml/ghtml-renderer.js +12 -56
  297. package/src/integrations/ghtml/ghtml.constants.js +1 -4
  298. package/src/integrations/ghtml/ghtml.plugin.d.ts +3 -16
  299. package/src/integrations/ghtml/ghtml.plugin.js +10 -20
  300. package/src/islands/README.md +25 -0
  301. package/src/islands/island-host.d.ts +37 -0
  302. package/src/islands/island-host.js +55 -0
  303. package/src/plugins/README.md +2 -1
  304. package/src/plugins/alias-resolver-cache.d.ts +6 -9
  305. package/src/plugins/alias-resolver-cache.js +114 -97
  306. package/src/plugins/alias-resolver-plugin.d.ts +3 -3
  307. package/src/plugins/alias-resolver-plugin.js +35 -62
  308. package/src/plugins/define-integration.d.ts +26 -0
  309. package/src/plugins/define-integration.js +20 -0
  310. package/src/plugins/eco-component-meta-plugin.d.ts +6 -102
  311. package/src/plugins/eco-component-meta-plugin.js +120 -162
  312. package/src/plugins/foreign-jsx-override-plugin.d.ts +1 -1
  313. package/src/plugins/foreign-jsx-override-plugin.js +49 -37
  314. package/src/plugins/integration-plugin.d.ts +43 -14
  315. package/src/plugins/integration-plugin.js +212 -190
  316. package/src/plugins/jsx-import-source.utils.d.ts +8 -0
  317. package/src/plugins/jsx-import-source.utils.js +21 -0
  318. package/src/plugins/processor.d.ts +71 -12
  319. package/src/plugins/processor.js +168 -130
  320. package/src/plugins/runtime-capability.js +1 -0
  321. package/src/plugins/source-transform.d.ts +32 -1
  322. package/src/plugins/source-transform.js +112 -60
  323. package/src/plugins/tsconfig-import-resolver.d.ts +35 -0
  324. package/src/plugins/tsconfig-import-resolver.js +235 -0
  325. package/src/route-renderer/GRAPH.md +26 -32
  326. package/src/route-renderer/README.md +54 -33
  327. package/src/route-renderer/orchestration/document-shell/document-shell-render.service.d.ts +107 -0
  328. package/src/route-renderer/orchestration/document-shell/document-shell-render.service.js +155 -0
  329. package/src/route-renderer/orchestration/document-shell/layout-shell-props.service.d.ts +20 -0
  330. package/src/route-renderer/orchestration/document-shell/layout-shell-props.service.js +37 -0
  331. package/src/route-renderer/orchestration/{component-render-context.d.ts → foreign-child/component-render-context.d.ts} +8 -15
  332. package/src/route-renderer/orchestration/foreign-child/component-render-context.js +196 -0
  333. package/src/route-renderer/orchestration/{render-output.utils.d.ts → foreign-child/foreign-child-output.utils.d.ts} +17 -7
  334. package/src/route-renderer/orchestration/foreign-child/foreign-child-output.utils.js +191 -0
  335. package/src/route-renderer/orchestration/{foreign-subtree-execution.service.d.ts → foreign-child/foreign-subtree-execution.service.d.ts} +64 -34
  336. package/src/route-renderer/orchestration/foreign-child/foreign-subtree-execution.service.js +354 -0
  337. package/src/route-renderer/orchestration/foreign-child/owning-renderer-resolution.d.ts +19 -0
  338. package/src/route-renderer/orchestration/foreign-child/owning-renderer-resolution.js +36 -0
  339. package/src/route-renderer/orchestration/integration-renderer.d.ts +41 -151
  340. package/src/route-renderer/orchestration/integration-renderer.js +798 -988
  341. package/src/route-renderer/orchestration/integration-renderer.test-fixtures.d.ts +75 -0
  342. package/src/route-renderer/orchestration/integration-renderer.test-fixtures.js +173 -0
  343. package/src/route-renderer/orchestration/ownership-graph/component-graph-collectors.d.ts +10 -0
  344. package/src/route-renderer/orchestration/ownership-graph/component-graph-collectors.js +132 -0
  345. package/src/route-renderer/orchestration/ownership-graph/component-graph.d.ts +34 -0
  346. package/src/route-renderer/orchestration/ownership-graph/component-graph.js +89 -0
  347. package/src/route-renderer/orchestration/{ownership-validation.service.d.ts → ownership-graph/ownership-validation.service.d.ts} +6 -2
  348. package/src/route-renderer/orchestration/ownership-graph/ownership-validation.service.js +77 -0
  349. package/src/route-renderer/orchestration/page-browser-graph/global-injector-assets.service.d.ts +7 -0
  350. package/src/route-renderer/orchestration/page-browser-graph/global-injector-assets.service.js +30 -0
  351. package/src/route-renderer/orchestration/page-browser-graph/grouped-graph-build-plan.d.ts +15 -0
  352. package/src/route-renderer/orchestration/page-browser-graph/grouped-graph-build-plan.js +9 -0
  353. package/src/route-renderer/orchestration/page-browser-graph/page-browser-graph-contribution.merge.d.ts +5 -0
  354. package/src/route-renderer/orchestration/page-browser-graph/page-browser-graph-contribution.merge.js +30 -0
  355. package/src/route-renderer/orchestration/page-browser-graph/page-browser-graph-merge.utils.d.ts +12 -0
  356. package/src/route-renderer/orchestration/page-browser-graph/page-browser-graph-merge.utils.js +32 -0
  357. package/src/route-renderer/orchestration/page-browser-graph/page-browser-graph-session.d.ts +126 -0
  358. package/src/route-renderer/orchestration/page-browser-graph/page-browser-graph-session.js +542 -0
  359. package/src/route-renderer/orchestration/page-browser-graph/page-browser-graph.service.d.ts +47 -0
  360. package/src/route-renderer/orchestration/page-browser-graph/page-browser-graph.service.js +232 -0
  361. package/src/route-renderer/orchestration/{processed-asset-dedupe.d.ts → page-browser-graph/processed-asset-dedupe.d.ts} +1 -1
  362. package/src/route-renderer/orchestration/page-browser-graph/processed-asset-dedupe.js +23 -0
  363. package/src/route-renderer/orchestration/page-browser-graph/route-instance-key.d.ts +29 -0
  364. package/src/route-renderer/orchestration/page-browser-graph/route-instance-key.js +54 -0
  365. package/src/route-renderer/orchestration/route-pipeline/integration-route-render-adapter.d.ts +38 -0
  366. package/src/route-renderer/orchestration/route-pipeline/integration-route-render-adapter.js +26 -0
  367. package/src/route-renderer/orchestration/route-pipeline/marker-artifact.utils.d.ts +6 -0
  368. package/src/route-renderer/orchestration/route-pipeline/marker-artifact.utils.js +25 -0
  369. package/src/route-renderer/orchestration/route-pipeline/robots-meta.contribution.d.ts +15 -0
  370. package/src/route-renderer/orchestration/route-pipeline/robots-meta.contribution.js +43 -0
  371. package/src/route-renderer/orchestration/route-pipeline/route-html-finalization.service.d.ts +25 -0
  372. package/src/route-renderer/orchestration/route-pipeline/route-html-finalization.service.js +44 -0
  373. package/src/route-renderer/orchestration/route-pipeline/route-prepared-options.builder.d.ts +26 -0
  374. package/src/route-renderer/orchestration/route-pipeline/route-prepared-options.builder.js +49 -0
  375. package/src/route-renderer/orchestration/route-pipeline/route-prepared-options.utils.d.ts +4 -0
  376. package/src/route-renderer/orchestration/route-pipeline/route-prepared-options.utils.js +30 -0
  377. package/src/route-renderer/orchestration/{route-render-orchestrator.d.ts → route-pipeline/route-render-orchestrator.d.ts} +24 -54
  378. package/src/route-renderer/orchestration/route-pipeline/route-render-orchestrator.js +215 -0
  379. package/src/route-renderer/orchestration/string-markup-renderer.d.ts +14 -0
  380. package/src/route-renderer/orchestration/string-markup-renderer.js +52 -0
  381. package/src/route-renderer/page-loading/component-dependency-collection.js +121 -121
  382. package/src/route-renderer/page-loading/declared-asset-collection.js +66 -94
  383. package/src/route-renderer/page-loading/dependency-resolver.js +101 -104
  384. package/src/route-renderer/page-loading/ecopages-virtual-imports.d.ts +1 -0
  385. package/src/route-renderer/page-loading/ecopages-virtual-imports.js +64 -51
  386. package/src/route-renderer/page-loading/file-scoped-dependency-components.d.ts +42 -0
  387. package/src/route-renderer/page-loading/file-scoped-dependency-components.js +94 -0
  388. package/src/route-renderer/page-loading/lazy-entry-collection.js +75 -98
  389. package/src/route-renderer/page-loading/lazy-trigger-planning.js +47 -36
  390. package/src/route-renderer/page-loading/module-declaration-aggregation.js +39 -28
  391. package/src/route-renderer/page-loading/module-declaration-scripts.js +10 -15
  392. package/src/route-renderer/page-loading/page-dependency-bundling.js +156 -113
  393. package/src/route-renderer/page-loading/page-module-loader.d.ts +2 -1
  394. package/src/route-renderer/page-loading/page-module-loader.js +136 -124
  395. package/src/route-renderer/page-loading/resolved-page-dependencies.d.ts +12 -0
  396. package/src/route-renderer/page-loading/resolved-page-dependencies.js +38 -0
  397. package/src/route-renderer/route-renderer.js +74 -76
  398. package/src/router/README.md +31 -0
  399. package/src/router/client/link-intent.d.ts +11 -21
  400. package/src/router/client/link-intent.js +56 -30
  401. package/src/router/client/link-intent.test.browser.js +50 -39
  402. package/src/router/client/link-navigation-policy.d.ts +45 -0
  403. package/src/router/client/link-navigation-policy.js +122 -0
  404. package/src/router/client/link-navigation-policy.test.browser.d.ts +1 -0
  405. package/src/router/client/link-navigation-policy.test.browser.js +82 -0
  406. package/src/router/client/navigation-coordinator.d.ts +1 -1
  407. package/src/router/client/navigation-coordinator.js +235 -201
  408. package/src/router/client/navigation-lifecycle.d.ts +55 -0
  409. package/src/router/client/navigation-lifecycle.js +50 -0
  410. package/src/router/client/navigation-lifecycle.test.browser.d.ts +1 -0
  411. package/src/router/client/navigation-lifecycle.test.browser.js +118 -0
  412. package/src/router/server/route-registry.js +237 -242
  413. package/src/services/README.md +5 -0
  414. package/src/services/assets/asset-processing-service/asset-dependency-keys.d.ts +13 -0
  415. package/src/services/assets/asset-processing-service/asset-dependency-keys.js +64 -50
  416. package/src/services/assets/asset-processing-service/asset-processing.service.d.ts +7 -1
  417. package/src/services/assets/asset-processing-service/asset-processing.service.js +308 -268
  418. package/src/services/assets/asset-processing-service/asset.factory.js +78 -81
  419. package/src/services/assets/asset-processing-service/assets.types.d.ts +1 -1
  420. package/src/services/assets/asset-processing-service/assets.types.js +1 -0
  421. package/src/services/assets/asset-processing-service/browser-runtime-asset.factory.d.ts +2 -1
  422. package/src/services/assets/asset-processing-service/browser-runtime-asset.factory.js +57 -45
  423. package/src/services/assets/asset-processing-service/browser-runtime-entry-resolution.d.ts +52 -0
  424. package/src/services/assets/asset-processing-service/browser-runtime-entry-resolution.js +115 -0
  425. package/src/services/assets/asset-processing-service/browser-runtime-entry.factory.d.ts +4 -2
  426. package/src/services/assets/asset-processing-service/browser-runtime-entry.factory.js +53 -38
  427. package/src/services/assets/asset-processing-service/finalize-processed-asset.d.ts +3 -0
  428. package/src/services/assets/asset-processing-service/finalize-processed-asset.js +5 -0
  429. package/src/services/assets/asset-processing-service/grouped-content-bundles.d.ts +2 -1
  430. package/src/services/assets/asset-processing-service/grouped-content-bundles.js +85 -60
  431. package/src/services/assets/asset-processing-service/index.d.ts +2 -0
  432. package/src/services/assets/asset-processing-service/index.js +8 -6
  433. package/src/services/assets/asset-processing-service/inline-content-script-body.d.ts +11 -0
  434. package/src/services/assets/asset-processing-service/inline-content-script-body.js +23 -0
  435. package/src/services/assets/asset-processing-service/materialize-content-script-asset.d.ts +9 -0
  436. package/src/services/assets/asset-processing-service/materialize-content-script-asset.js +22 -0
  437. package/src/services/assets/asset-processing-service/page-package.js +70 -72
  438. package/src/services/assets/asset-processing-service/processor.interface.js +7 -5
  439. package/src/services/assets/asset-processing-service/processor.registry.js +11 -14
  440. package/src/services/assets/asset-processing-service/processors/base/base-processor.js +59 -62
  441. package/src/services/assets/asset-processing-service/processors/base/base-script-processor.d.ts +0 -2
  442. package/src/services/assets/asset-processing-service/processors/base/base-script-processor.js +102 -130
  443. package/src/services/assets/asset-processing-service/processors/index.js +5 -5
  444. package/src/services/assets/asset-processing-service/processors/script/content-script.processor.d.ts +8 -0
  445. package/src/services/assets/asset-processing-service/processors/script/content-script.processor.js +111 -111
  446. package/src/services/assets/asset-processing-service/processors/script/file-script.processor.d.ts +0 -1
  447. package/src/services/assets/asset-processing-service/processors/script/file-script.processor.js +95 -94
  448. package/src/services/assets/asset-processing-service/processors/script/node-module-script.processor.js +136 -121
  449. package/src/services/assets/asset-processing-service/processors/stylesheet/content-stylesheet.processor.d.ts +0 -3
  450. package/src/services/assets/asset-processing-service/processors/stylesheet/content-stylesheet.processor.js +26 -57
  451. package/src/services/assets/asset-processing-service/processors/stylesheet/file-stylesheet.processor.d.ts +0 -3
  452. package/src/services/assets/asset-processing-service/processors/stylesheet/file-stylesheet.processor.js +33 -67
  453. package/src/services/assets/asset-processing-service/processors/stylesheet/stylesheet-processor-pipeline.d.ts +2 -0
  454. package/src/services/assets/asset-processing-service/processors/stylesheet/stylesheet-processor-pipeline.js +44 -0
  455. package/src/services/assets/asset-processing-service/resolve-integration-plugin.d.ts +4 -0
  456. package/src/services/assets/asset-processing-service/resolve-integration-plugin.js +15 -0
  457. package/src/services/assets/asset-processing-service/ungrouped-dependency-processing.d.ts +0 -1
  458. package/src/services/assets/asset-processing-service/ungrouped-dependency-processing.js +27 -44
  459. package/src/services/assets/browser-bundle.service.d.ts +28 -30
  460. package/src/services/assets/browser-bundle.service.js +54 -40
  461. package/src/services/cache/cache.types.d.ts +4 -2
  462. package/src/services/cache/cache.types.js +5 -0
  463. package/src/services/cache/html-page-cache-dependency-index.d.ts +34 -0
  464. package/src/services/cache/html-page-cache-dependency-index.js +88 -0
  465. package/src/services/cache/index.d.ts +2 -0
  466. package/src/services/cache/index.js +8 -7
  467. package/src/services/cache/memory-cache-store.js +101 -89
  468. package/src/services/cache/page-cache-service.d.ts +31 -1
  469. package/src/services/cache/page-cache-service.js +237 -150
  470. package/src/services/cache/page-request-cache-coordinator.service.js +106 -102
  471. package/src/services/html/html-rewriter-provider.service.js +61 -61
  472. package/src/services/html/html-transformer.service.d.ts +1 -1
  473. package/src/services/html/html-transformer.service.js +249 -266
  474. package/src/services/invalidation/development-invalidation.service.d.ts +25 -2
  475. package/src/services/invalidation/development-invalidation.service.js +239 -175
  476. package/src/services/module-loading/README.md +52 -0
  477. package/src/services/module-loading/app-module-loader.service.js +1 -0
  478. package/src/services/module-loading/app-server-module-transpiler.service.d.ts +8 -0
  479. package/src/services/module-loading/app-server-module-transpiler.service.js +103 -118
  480. package/src/services/module-loading/collection-server-module-build.service.d.ts +19 -0
  481. package/src/services/module-loading/collection-server-module-build.service.js +83 -0
  482. package/src/services/module-loading/host-module-loader-registry.js +6 -11
  483. package/src/services/module-loading/module-loading-types.js +1 -0
  484. package/src/services/module-loading/page-module-import.service.d.ts +11 -13
  485. package/src/services/module-loading/page-module-import.service.js +222 -184
  486. package/src/services/module-loading/route-module-build-cache-registry.d.ts +24 -0
  487. package/src/services/module-loading/route-module-build-cache-registry.js +51 -0
  488. package/src/services/module-loading/route-module-build-cache.d.ts +4 -0
  489. package/src/services/module-loading/route-module-build-cache.js +3 -0
  490. package/src/services/module-loading/route-module-build-cache.store.d.ts +57 -0
  491. package/src/services/module-loading/route-module-build-cache.store.js +202 -0
  492. package/src/services/module-loading/route-module-build-manifest.d.ts +57 -0
  493. package/src/services/module-loading/route-module-build-manifest.js +60 -0
  494. package/src/services/module-loading/route-module-dependency-hasher.d.ts +81 -0
  495. package/src/services/module-loading/route-module-dependency-hasher.js +148 -0
  496. package/src/services/module-loading/server-module-transpiler.service.d.ts +1 -3
  497. package/src/services/module-loading/server-module-transpiler.service.js +65 -62
  498. package/src/services/module-loading/source-module-support.js +15 -7
  499. package/src/services/runtime-state/dev-graph.service.js +165 -157
  500. package/src/services/runtime-state/entrypoint-dependency-graph.service.js +85 -76
  501. package/src/services/runtime-state/server-invalidation-state.service.js +38 -30
  502. package/src/services/validation/schema-validation-service.d.ts +1 -4
  503. package/src/services/validation/schema-validation-service.js +156 -95
  504. package/src/services/validation/standard-schema.types.d.ts +9 -62
  505. package/src/services/validation/standard-schema.types.js +1 -0
  506. package/src/services/validation/validate-standard-schema.d.ts +7 -0
  507. package/src/services/validation/validate-standard-schema.js +14 -0
  508. package/src/static-site-generator/README.md +41 -0
  509. package/src/static-site-generator/production-page-browser-graph-prebuild.d.ts +32 -0
  510. package/src/static-site-generator/production-page-browser-graph-prebuild.js +57 -0
  511. package/src/static-site-generator/sitemap-routes.d.ts +14 -0
  512. package/src/static-site-generator/sitemap-routes.js +36 -0
  513. package/src/static-site-generator/sitemap.d.ts +15 -0
  514. package/src/static-site-generator/sitemap.js +42 -0
  515. package/src/static-site-generator/static-build-invalidation.d.ts +10 -0
  516. package/src/static-site-generator/static-build-invalidation.js +37 -0
  517. package/src/static-site-generator/static-export-context.d.ts +30 -0
  518. package/src/static-site-generator/static-export-context.js +1 -0
  519. package/src/static-site-generator/static-site-generator.d.ts +43 -25
  520. package/src/static-site-generator/static-site-generator.js +536 -294
  521. package/src/types/internal-types.d.ts +59 -13
  522. package/src/types/internal-types.js +1 -0
  523. package/src/types/public-types.d.ts +310 -95
  524. package/src/types/public-types.js +1 -0
  525. package/src/utils/deep-merge.js +39 -26
  526. package/src/utils/ecopages-route-info.d.ts +26 -0
  527. package/src/utils/ecopages-route-info.js +30 -0
  528. package/src/utils/hash.js +3 -6
  529. package/src/utils/html-escaping.d.ts +7 -0
  530. package/src/utils/html-escaping.js +22 -5
  531. package/src/utils/html.js +1 -4
  532. package/src/utils/invariant.js +11 -10
  533. package/src/utils/locals-utils.js +32 -22
  534. package/src/utils/parse-cli-args.d.ts +2 -0
  535. package/src/utils/parse-cli-args.js +73 -59
  536. package/src/utils/path-pattern.d.ts +23 -0
  537. package/src/utils/path-pattern.js +42 -0
  538. package/src/utils/path-utils.module.js +8 -11
  539. package/src/utils/resolve-entry-file.js +70 -38
  540. package/src/utils/resolve-work-dir.js +23 -27
  541. package/src/utils/runtime.js +24 -33
  542. package/src/utils/server-utils.module.d.ts +3 -2
  543. package/src/utils/server-utils.module.js +60 -53
  544. package/src/utils/static-file-extensions.d.ts +12 -0
  545. package/src/utils/static-file-extensions.js +54 -0
  546. package/src/watchers/project-watcher-ignore.d.ts +11 -0
  547. package/src/watchers/project-watcher-ignore.js +17 -0
  548. package/src/watchers/project-watcher.d.ts +29 -6
  549. package/src/watchers/project-watcher.js +402 -257
  550. package/src/watchers/project-watcher.test-helpers.js +45 -50
  551. package/src/adapters/shared/api-response.js +0 -96
  552. package/src/adapters/shared/application-adapter.js +0 -90
  553. package/src/adapters/shared/define-api-handler.d.ts +0 -25
  554. package/src/adapters/shared/define-api-handler.js +0 -15
  555. package/src/adapters/shared/explicit-static-render-preparation.js +0 -26
  556. package/src/adapters/shared/explicit-static-route-matcher.js +0 -101
  557. package/src/adapters/shared/file-route-middleware-pipeline.js +0 -90
  558. package/src/adapters/shared/fs-server-response-factory.js +0 -81
  559. package/src/adapters/shared/fs-server-response-matcher.js +0 -186
  560. package/src/adapters/shared/hmr-entrypoint-registrar.d.ts +0 -55
  561. package/src/adapters/shared/hmr-entrypoint-registrar.js +0 -87
  562. package/src/adapters/shared/hmr-html-response.js +0 -33
  563. package/src/adapters/shared/render-context.js +0 -93
  564. package/src/adapters/shared/runtime-app-bootstrap.js +0 -46
  565. package/src/adapters/shared/runtime-host.js +0 -0
  566. package/src/adapters/shared/server-adapter.js +0 -436
  567. package/src/adapters/shared/server-route-handler.js +0 -111
  568. package/src/adapters/shared/server-static-builder.js +0 -162
  569. package/src/adapters/shared/shared-hmr-manager.d.ts +0 -59
  570. package/src/adapters/shared/shared-hmr-manager.js +0 -241
  571. package/src/adapters/shared/static-preview-host.js +0 -0
  572. package/src/build/browser-runtime-manifest.js +0 -61
  573. package/src/build/browser-runtime-plugin-helpers.js +0 -14
  574. package/src/build/browser-runtime-plugin.js +0 -173
  575. package/src/build/build-manifest.d.ts +0 -33
  576. package/src/build/build-manifest.js +0 -49
  577. package/src/build/build-types.js +0 -0
  578. package/src/build/rolldown-adapter-helpers.js +0 -265
  579. package/src/build/rolldown-build-adapter.js +0 -65
  580. package/src/build/rolldown-dev-build-adapter.d.ts +0 -82
  581. package/src/build/rolldown-dev-build-adapter.js +0 -166
  582. package/src/build/rolldown-plugin-bridge.js +0 -199
  583. package/src/build/runtime-build-executor.d.ts +0 -21
  584. package/src/build/runtime-build-executor.js +0 -19
  585. package/src/build/runtime-build-output-normalizer.d.ts +0 -3
  586. package/src/build/runtime-build-output-normalizer.js +0 -111
  587. package/src/build/serialized-build-executor.js +0 -63
  588. package/src/build/server-side-css-shim-plugin.js +0 -35
  589. package/src/hmr/hmr.postcss.test.e2e.js +0 -31
  590. package/src/hmr/hmr.test.e2e.js +0 -43
  591. package/src/route-renderer/orchestration/component-render-context.js +0 -147
  592. package/src/route-renderer/orchestration/declared-ownership-graph.d.ts +0 -18
  593. package/src/route-renderer/orchestration/declared-ownership-graph.js +0 -34
  594. package/src/route-renderer/orchestration/foreign-subtree-execution.service.js +0 -233
  595. package/src/route-renderer/orchestration/ownership-planning.service.d.ts +0 -24
  596. package/src/route-renderer/orchestration/ownership-planning.service.js +0 -63
  597. package/src/route-renderer/orchestration/ownership-validation.service.js +0 -53
  598. package/src/route-renderer/orchestration/processed-asset-dedupe.js +0 -27
  599. package/src/route-renderer/orchestration/queued-foreign-subtree-resolution.service.d.ts +0 -91
  600. package/src/route-renderer/orchestration/queued-foreign-subtree-resolution.service.js +0 -170
  601. package/src/route-renderer/orchestration/render-output.utils.js +0 -171
  602. package/src/route-renderer/orchestration/route-render-orchestrator.js +0 -577
  603. package/src/route-renderer/orchestration/template-serialization.d.ts +0 -38
  604. package/src/route-renderer/orchestration/template-serialization.js +0 -45
  605. /package/src/adapters/shared/{runtime-host.d.ts → runtime/runtime-host.d.ts} +0 -0
  606. /package/src/{hmr/hmr.postcss.test.e2e.d.ts → adapters/shared/runtime/runtime-host.js} +0 -0
  607. /package/src/{hmr/hmr.test.e2e.d.ts → adapters/shared/runtime/static-preview-host.js} +0 -0
  608. /package/src/build/{browser-runtime-manifest.d.ts → browser/browser-runtime-manifest.d.ts} +0 -0
  609. /package/src/build/{browser-runtime-plugin-helpers.d.ts → browser/browser-runtime-plugin-helpers.d.ts} +0 -0
  610. /package/src/build/{build-types.d.ts → contracts/build-types.d.ts} +0 -0
  611. /package/src/build/{server-side-css-shim-plugin.d.ts → rolldown/server-side-css-shim-plugin.d.ts} +0 -0
@@ -1,603 +1,650 @@
1
- import path from "node:path";
2
- import {
3
- DEFAULT_ECOPAGES_DIST_DIR,
4
- DEFAULT_ECOPAGES_HOSTNAME,
5
- DEFAULT_ECOPAGES_PORT,
6
- DEFAULT_ECOPAGES_WORK_DIR
7
- } from "../config/constants.js";
8
- import {
9
- collectConfiguredAppBuildManifestContributions,
10
- createBuildAdapter,
11
- setAppBuildAdapter,
12
- setAppBuildExecutor,
13
- updateAppBuildManifest
14
- } from "../build/build-adapter.js";
15
- import { GHTML_PLUGIN_NAME } from "../integrations/ghtml/ghtml.constants.js";
16
- import { ghtmlPlugin } from "../integrations/ghtml/ghtml.plugin.js";
17
- import { createEcoComponentMetaPlugin } from "../plugins/eco-component-meta-plugin.js";
18
- import { createEcoComponentMetaTransform } from "../plugins/eco-component-meta-plugin.js";
19
- import {
20
- NoopEntrypointDependencyGraph,
21
- setAppEntrypointDependencyGraph
22
- } from "../services/runtime-state/entrypoint-dependency-graph.service.js";
23
- import {
24
- CounterServerInvalidationState,
25
- setAppServerInvalidationState
26
- } from "../services/runtime-state/server-invalidation-state.service.js";
27
- import { invariant } from "../utils/invariant.js";
28
- import { appLogger } from "../global/app-logger.js";
29
- import { fileSystem } from "@ecopages/file-system";
30
- const CONFIG_BUILDER_ERRORS = {
31
- DUPLICATE_INTEGRATION_NAMES: "Integrations names must be unique",
32
- DUPLICATE_INTEGRATION_EXTENSIONS: "Integrations extensions must be unique",
33
- MIXED_JSX_ENGINES: "Both kitajs and react integrations are enabled. Use per-file JSX import source/pragma consistently (e.g. `/** @jsxImportSource react */` for React files and `/** @jsxImportSource @kitajs/html */` for Kita files).",
34
- duplicateProcessorName: (name) => `Processor with name "${name}" already exists`,
35
- duplicateLoaderName: (name) => `Loader with name "${name}" already exists`,
36
- duplicateSemanticTemplate: (kind, matches) => `Multiple ${kind} templates found: ${matches.join(", ")}`,
37
- incompatibleRuntimeCapability: (kind, name, runtime, reason) => `Cannot enable ${kind} "${name}" on ${runtime}: ${reason}`,
38
- unsupportedRuntimeVersion: (kind, name, runtime, current, min) => `Cannot enable ${kind} "${name}" on ${runtime} ${current}: requires runtime version ${min} or newer`,
39
- invalidRuntimeVersion: (kind, name, version) => `Cannot validate ${kind} "${name}" runtimeCapability.minRuntimeVersion "${version}" because it is not a dot-separated numeric version`
1
+ /**
2
+ * This module contains the ConfigBuilder class, which is used to build the EcoPagesAppConfig object.
3
+ * @module
4
+ */
5
+ import path from 'node:path';
6
+ import { DEFAULT_ECOPAGES_DIST_DIR, DEFAULT_ECOPAGES_HOSTNAME, DEFAULT_ECOPAGES_PORT, DEFAULT_ECOPAGES_WORK_DIR, } from '../config/constants.js';
7
+ import { collectConfiguredAppBuildManifestContributions, createBuildAdapter, setAppBuildAdapter, updateAppBuildManifest, } from '../build/build-adapter.js';
8
+ import { GHTML_PLUGIN_NAME } from '../integrations/ghtml/ghtml.constants.js';
9
+ import { ghtmlPlugin } from '../integrations/ghtml/ghtml.plugin.js';
10
+ import { createEcoComponentMetaTransform } from '../plugins/eco-component-meta-plugin.js';
11
+ import { NoopEntrypointDependencyGraph, setAppEntrypointDependencyGraph, } from '../services/runtime-state/entrypoint-dependency-graph.service.js';
12
+ import { CounterServerInvalidationState, setAppServerInvalidationState, } from '../services/runtime-state/server-invalidation-state.service.js';
13
+ import { invariant } from '../utils/invariant.js';
14
+ import { appLogger } from '../global/app-logger.js';
15
+ import { fileSystem } from '@ecopages/file-system';
16
+ export const CONFIG_BUILDER_ERRORS = {
17
+ DUPLICATE_INTEGRATION_NAMES: 'Integrations names must be unique',
18
+ DUPLICATE_INTEGRATION_EXTENSIONS: 'Integrations extensions must be unique',
19
+ MIXED_JSX_ENGINES: 'Both kitajs and react integrations are enabled. Use per-file JSX import source/pragma consistently (e.g. `/** @jsxImportSource react */` for React files and `/** @jsxImportSource @kitajs/html */` for Kita files).',
20
+ duplicateProcessorName: (name) => `Processor with name "${name}" already exists`,
21
+ duplicateLoaderName: (name) => `Loader with name "${name}" already exists`,
22
+ duplicateSemanticTemplate: (kind, matches) => `Multiple ${kind} templates found: ${matches.join(', ')}`,
23
+ incompatibleRuntimeCapability: (kind, name, runtime, reason) => `Cannot enable ${kind} "${name}" on ${runtime}: ${reason}`,
24
+ unsupportedRuntimeVersion: (kind, name, runtime, current, min) => `Cannot enable ${kind} "${name}" on ${runtime} ${current}: requires runtime version ${min} or newer`,
25
+ invalidRuntimeVersion: (kind, name, version) => `Cannot validate ${kind} "${name}" runtimeCapability.minRuntimeVersion "${version}" because it is not a dot-separated numeric version`,
40
26
  };
41
- class ConfigBuilder {
42
- buildOwnership = "rolldown";
43
- config = {
44
- baseUrl: "",
45
- rootDir: ".",
46
- srcDir: "src",
47
- pagesDir: "pages",
48
- includesDir: "includes",
49
- componentsDir: "components",
50
- layoutsDir: "layouts",
51
- publicDir: "public",
52
- robotsTxt: {
53
- preferences: {
54
- "*": []
55
- }
56
- },
57
- integrations: [],
58
- integrationsDependencies: [],
59
- distDir: DEFAULT_ECOPAGES_DIST_DIR,
60
- defaultMetadata: {
61
- title: "Ecopages",
62
- description: "This is a static site generated with Ecopages"
63
- },
64
- additionalWatchPaths: [],
65
- templatesExt: [],
66
- absolutePaths: {
67
- config: "",
68
- componentsDir: "",
69
- distDir: "",
70
- workDir: "",
71
- includesDir: "",
72
- layoutsDir: "",
73
- pagesDir: "",
74
- projectDir: "",
75
- publicDir: "",
76
- srcDir: "",
77
- htmlTemplatePath: "",
78
- error404TemplatePath: ""
79
- },
80
- processors: /* @__PURE__ */ new Map(),
81
- loaders: /* @__PURE__ */ new Map(),
82
- sourceTransforms: /* @__PURE__ */ new Map(),
83
- workDir: DEFAULT_ECOPAGES_WORK_DIR
84
- };
85
- /**
86
- * Sets the base URL for the application.
87
- * This URL is used as the root URL for all pages and assets.
88
- *
89
- * @param baseUrl - The base URL for the application (e.g., 'https://example.com')
90
- * @returns The ConfigBuilder instance for method chaining
91
- */
92
- setBaseUrl(baseUrl) {
93
- this.config.baseUrl = baseUrl;
94
- return this;
95
- }
96
- /**
97
- * Sets the root directory of the project.
98
- * This is the base directory from which all other paths are resolved.
99
- *
100
- * @param rootDir - The root directory path
101
- * @returns The ConfigBuilder instance for method chaining
102
- */
103
- setRootDir(rootDir) {
104
- this.config.rootDir = rootDir;
105
- return this;
106
- }
107
- /**
108
- * Sets which runtime path owns build execution for the finalized app config.
109
- *
110
- * @remarks
111
- * Three ownership values are accepted:
112
- *
113
- * - `'rolldown'` (default): Ecopages runs builds through
114
- * {@link RolldownBuildAdapter}, creating a new `rolldown()` instance
115
- * per build. Best for one-shot production builds and benchmarks.
116
- * - `'rolldown-dev'`: Ecopages runs builds through
117
- * {@link RolldownDevBuildAdapter}, which wraps Rolldown's experimental
118
- * `DevEngine` and reuses the cached module graph, resolver, and
119
- * transform cache across rebuilds. Best for HMR and watch mode where
120
- * the same entrypoints are rebuilt repeatedly.
121
- * - `'vite-host'`: a host runtime owns the build. Ecopages exposes a
122
- * {@link ViteHostBuildAdapter} boundary marker that throws on direct
123
- * use. Select this only for host-driven compatibility flows where
124
- * core must not silently fall back to app build execution.
125
- *
126
- * Defaults to `'rolldown'` when {@link ConfigBuilder.build} runs
127
- * without an explicit ownership.
128
- */
129
- setBuildOwnership(buildOwnership) {
130
- this.buildOwnership = buildOwnership;
131
- return this;
132
- }
133
- /**
134
- * Sets the source directory relative to the root directory.
135
- * This directory contains all the source files for the application.
136
- *
137
- * @param srcDir - The source directory name (default: 'src')
138
- * @returns The ConfigBuilder instance for method chaining
139
- */
140
- setSrcDir(srcDir) {
141
- this.config.srcDir = srcDir;
142
- return this;
143
- }
144
- /**
145
- * Sets the pages directory relative to the source directory.
146
- * This directory contains all the page files for the application.
147
- *
148
- * @param pagesDir - The pages directory name (default: 'pages')
149
- * @returns The ConfigBuilder instance for method chaining
150
- */
151
- setPagesDir(pagesDir) {
152
- this.config.pagesDir = pagesDir;
153
- return this;
154
- }
155
- /**
156
- * Sets the includes directory relative to the source directory.
157
- * This directory contains template includes and partials.
158
- *
159
- * @param includesDir - The includes directory name (default: 'includes')
160
- * @returns The ConfigBuilder instance for method chaining
161
- */
162
- setIncludesDir(includesDir) {
163
- this.config.includesDir = includesDir;
164
- return this;
165
- }
166
- /**
167
- * Sets the components directory relative to the source directory.
168
- * This directory contains reusable components.
169
- *
170
- * @param componentsDir - The components directory name (default: 'components')
171
- * @returns The ConfigBuilder instance for method chaining
172
- */
173
- setComponentsDir(componentsDir) {
174
- this.config.componentsDir = componentsDir;
175
- return this;
176
- }
177
- /**
178
- * Sets the layouts directory relative to the source directory.
179
- * This directory contains layout templates.
180
- *
181
- * @param layoutsDir - The layouts directory name (default: 'layouts')
182
- * @returns The ConfigBuilder instance for method chaining
183
- */
184
- setLayoutsDir(layoutsDir) {
185
- this.config.layoutsDir = layoutsDir;
186
- return this;
187
- }
188
- /**
189
- * Sets the public directory relative to the source directory.
190
- * This directory contains static assets that should be served as-is.
191
- *
192
- * @param publicDir - The public directory name (default: 'public')
193
- * @returns The ConfigBuilder instance for method chaining
194
- */
195
- setPublicDir(publicDir) {
196
- this.config.publicDir = publicDir;
197
- return this;
198
- }
199
- /**
200
- * Sets the robots.txt configuration.
201
- * This determines which paths are allowed/disallowed for search engines.
202
- *
203
- * @param robotsTxt - The robots.txt configuration object
204
- * @returns The ConfigBuilder instance for method chaining
205
- */
206
- setRobotsTxt(robotsTxt) {
207
- this.config.robotsTxt = robotsTxt;
208
- return this;
209
- }
210
- /**
211
- * Sets the integration plugins to use.
212
- * These plugins provide additional functionality to the application.
213
- *
214
- * @param integrations - An array of integration plugins
215
- * @returns The ConfigBuilder instance for method chaining
216
- */
217
- setIntegrations(integrations) {
218
- this.config.integrations = integrations;
219
- return this;
220
- }
221
- /**
222
- * Sets the output directory for the built application.
223
- *
224
- * @param distDir - The distribution directory name (default: 'dist')
225
- * @returns The ConfigBuilder instance for method chaining
226
- */
227
- setDistDir(distDir) {
228
- this.config.distDir = distDir;
229
- return this;
230
- }
231
- /**
232
- * Sets the internal work directory for runtime-only artifacts.
233
- *
234
- * @remarks
235
- * Use this when deployable output should stay clean while Ecopages still
236
- * needs a separate workspace for server transpilation caches, runtime
237
- * manifests, and other internal build products.
238
- *
239
- * @param workDir - The internal work directory name
240
- * @returns The ConfigBuilder instance for method chaining
241
- */
242
- setWorkDir(workDir) {
243
- this.config.workDir = workDir;
244
- return this;
245
- }
246
- /**
247
- * Sets the default metadata for pages.
248
- * This is used when a page doesn't specify its own metadata.
249
- *
250
- * @param defaultMetadata - The default metadata object
251
- * @returns The ConfigBuilder instance for method chaining
252
- */
253
- setDefaultMetadata(defaultMetadata) {
254
- this.config.defaultMetadata = {
255
- ...this.config.defaultMetadata,
256
- ...defaultMetadata
27
+ /**
28
+ * A builder class for creating and configuring EcoPages application configuration.
29
+ * Provides a fluent interface for setting various configuration options and managing
30
+ * application settings.
31
+ *
32
+ * @remarks
33
+ * The ConfigBuilder follows the builder pattern and allows for:
34
+ * - Setting directory paths for various components (pages, includes, layouts, etc.)
35
+ * - Configuring templates and includes
36
+ * - Managing integrations and plugins
37
+ * - Setting up processors and loaders
38
+ * - Configuring API handlers
39
+ * - Managing metadata and robots.txt preferences
40
+ *
41
+ * All setter methods return the instance of the builder for method chaining.
42
+ * The configuration is finalized by calling the `build()` method, which performs
43
+ * validation and initialization of the configuration.
44
+ *
45
+ * @throws {Error} When building configuration without required fields (e.g., baseUrl)
46
+ * @throws {Error} When adding duplicate processors or loaders
47
+ */
48
+ export class ConfigBuilder {
49
+ buildOwnership = 'rolldown';
50
+ config = {
51
+ baseUrl: '',
52
+ rootDir: '.',
53
+ srcDir: 'src',
54
+ pagesDir: 'pages',
55
+ includesDir: 'includes',
56
+ componentsDir: 'components',
57
+ layoutsDir: 'layouts',
58
+ publicDir: 'public',
59
+ robotsTxt: {
60
+ preferences: {
61
+ '*': [],
62
+ },
63
+ },
64
+ sitemap: {
65
+ enabled: false,
66
+ fileName: 'sitemap.xml',
67
+ extraUrls: [],
68
+ exclude: [],
69
+ },
70
+ integrations: [],
71
+ integrationsDependencies: [],
72
+ distDir: DEFAULT_ECOPAGES_DIST_DIR,
73
+ defaultMetadata: {
74
+ title: 'Ecopages',
75
+ description: 'This is a static site generated with Ecopages',
76
+ },
77
+ additionalWatchPaths: [],
78
+ devPrewarmPaths: [],
79
+ devPrewarmBeforeReadyPaths: [],
80
+ templatesExt: [],
81
+ absolutePaths: {
82
+ config: '',
83
+ componentsDir: '',
84
+ distDir: '',
85
+ workDir: '',
86
+ includesDir: '',
87
+ layoutsDir: '',
88
+ pagesDir: '',
89
+ projectDir: '',
90
+ publicDir: '',
91
+ srcDir: '',
92
+ htmlTemplatePath: '',
93
+ error404TemplatePath: '',
94
+ error500TemplatePath: '',
95
+ },
96
+ processors: new Map(),
97
+ loaders: new Map(),
98
+ sourceTransforms: new Map(),
99
+ workDir: DEFAULT_ECOPAGES_WORK_DIR,
257
100
  };
258
- return this;
259
- }
260
- /**
261
- * Sets additional paths to watch for changes during development.
262
- *
263
- * @param additionalWatchPaths - An array of additional paths to watch
264
- * @returns The ConfigBuilder instance for method chaining
265
- */
266
- setAdditionalWatchPaths(additionalWatchPaths) {
267
- this.config.additionalWatchPaths = additionalWatchPaths;
268
- return this;
269
- }
270
- /**
271
- * Sets the processors to use for the application.
272
- * This replaces any existing processors.
273
- *
274
- * @param processors - An array of processors
275
- * @returns The ConfigBuilder instance for method chaining
276
- */
277
- setProcessors(processors) {
278
- this.config.processors.clear();
279
- for (const processor of processors) {
280
- this.addProcessor(processor);
281
- }
282
- return this;
283
- }
284
- /**
285
- * Adds a processor to the application.
286
- *
287
- * @param processor - The processor to add
288
- * @returns The ConfigBuilder instance for method chaining
289
- * @throws Error if a processor with the same name already exists
290
- */
291
- addProcessor(processor) {
292
- if (this.config.processors.has(processor.name)) {
293
- throw new Error(CONFIG_BUILDER_ERRORS.duplicateProcessorName(processor.name));
294
- }
295
- this.config.processors.set(processor.name, processor);
296
- return this;
297
- }
298
- /**
299
- * Sets the loaders to use for the application.
300
- * This replaces any existing loaders.
301
- *
302
- * @param loaders - An array of build plugins to use as loaders
303
- * @returns The ConfigBuilder instance for method chaining
304
- */
305
- setLoaders(loaders) {
306
- this.config.loaders.clear();
307
- for (const loader of loaders) {
308
- this.addLoader(loader.name, loader);
309
- }
310
- return this;
311
- }
312
- /**
313
- * Sets the source transforms to use for transform-first bundlers such as Vite.
314
- * This replaces any existing source transforms.
315
- */
316
- setSourceTransforms(sourceTransforms) {
317
- this.config.sourceTransforms.clear();
318
- for (const sourceTransform of sourceTransforms) {
319
- this.addSourceTransform(sourceTransform.name, sourceTransform);
320
- }
321
- return this;
322
- }
323
- /**
324
- * Adds a loader to the application.
325
- *
326
- * @param name - The name of the loader
327
- * @param loader - The build plugin to use as a loader
328
- * @returns The ConfigBuilder instance for method chaining
329
- * @throws Error if a loader with the same name already exists
330
- */
331
- addLoader(name, loader) {
332
- if (this.config.loaders.has(name)) {
333
- throw new Error(CONFIG_BUILDER_ERRORS.duplicateLoaderName(name));
334
- }
335
- this.config.loaders.set(name, loader);
336
- return this;
337
- }
338
- /**
339
- * Adds a source transform to the application.
340
- *
341
- * @throws Error if a source transform with the same name already exists.
342
- */
343
- addSourceTransform(name, sourceTransform) {
344
- if (this.config.sourceTransforms.has(name)) {
345
- throw new Error(CONFIG_BUILDER_ERRORS.duplicateLoaderName(name));
346
- }
347
- this.config.sourceTransforms.set(name, sourceTransform);
348
- return this;
349
- }
350
- /**
351
- * Sets the cache configuration for ISR and page caching.
352
- *
353
- * @param cacheConfig - The cache configuration object
354
- * @returns The ConfigBuilder instance for method chaining
355
- */
356
- setCacheConfig(cacheConfig) {
357
- this.config.cache = cacheConfig;
358
- return this;
359
- }
360
- setExperimental(experimental) {
361
- this.config.experimental = experimental;
362
- return this;
363
- }
364
- createAbsolutePaths(config) {
365
- const { srcDir, componentsDir, includesDir, layoutsDir, pagesDir, publicDir, distDir, workDir } = config;
366
- const projectDir = config.rootDir;
367
- const absoluteSrcDir = path.resolve(projectDir, srcDir);
368
- const absoluteDistDir = path.resolve(projectDir, distDir);
369
- const absoluteWorkDir = path.resolve(projectDir, workDir);
370
- const absoluteIncludesDir = path.join(absoluteSrcDir, includesDir);
371
- const absolutePagesDir = path.join(absoluteSrcDir, pagesDir);
372
- this.config.absolutePaths = {
373
- config: path.join(projectDir, "eco.config.ts"),
374
- projectDir,
375
- srcDir: absoluteSrcDir,
376
- distDir: absoluteDistDir,
377
- workDir: absoluteWorkDir,
378
- componentsDir: path.join(absoluteSrcDir, componentsDir),
379
- includesDir: absoluteIncludesDir,
380
- layoutsDir: path.join(absoluteSrcDir, layoutsDir),
381
- pagesDir: absolutePagesDir,
382
- publicDir: path.join(absoluteSrcDir, publicDir),
383
- htmlTemplatePath: this.resolveSemanticTemplatePath({
384
- dirPath: absoluteIncludesDir,
385
- basename: "html"
386
- }),
387
- error404TemplatePath: this.resolveSemanticTemplatePath({
388
- dirPath: absolutePagesDir,
389
- basename: "404"
390
- })
391
- };
392
- return this;
393
- }
394
- resolveSemanticTemplatePath({ dirPath, basename }) {
395
- const extensions = this.config.templatesExt.length > 0 ? this.config.templatesExt : [".ghtml.ts"];
396
- const matches = extensions.map((extension) => path.join(dirPath, `${basename}${extension}`)).filter((candidate) => fileSystem.exists(candidate));
397
- invariant(matches.length <= 1, CONFIG_BUILDER_ERRORS.duplicateSemanticTemplate(basename, matches));
398
- if (matches.length === 1) {
399
- return matches[0];
400
- }
401
- return path.join(dirPath, `${basename}${extensions[0]}`);
402
- }
403
- createIntegrationTemplatesExt(integrations) {
404
- const integrationName = integrations.map((integration) => integration.name);
405
- const uniqueName = new Set(integrationName);
406
- invariant(integrationName.length === uniqueName.size, CONFIG_BUILDER_ERRORS.DUPLICATE_INTEGRATION_NAMES);
407
- const hasKitaJs = uniqueName.has("kitajs");
408
- const hasReact = uniqueName.has("react");
409
- if (hasKitaJs && hasReact) {
410
- appLogger.debug(CONFIG_BUILDER_ERRORS.MIXED_JSX_ENGINES);
411
- }
412
- const integrationsExtensions = integrations.flatMap((integration) => integration.extensions);
413
- const uniqueExtensions = new Set(integrationsExtensions);
414
- invariant(
415
- integrationsExtensions.length === uniqueExtensions.size,
416
- CONFIG_BUILDER_ERRORS.DUPLICATE_INTEGRATION_EXTENSIONS
417
- );
418
- this.config.templatesExt = integrationsExtensions;
419
- }
420
- initializeProcessors() {
421
- for (const processor of this.config.processors.values()) {
422
- processor.setContext(this.config);
423
- }
424
- }
425
- validateRuntimeCapabilities() {
426
- const runtimeEnvironment = this.detectRuntimeEnvironment();
427
- const contributors = [
428
- ...this.config.integrations.map((integration) => ({
429
- kind: "integration",
430
- name: integration.name,
431
- runtimeCapability: integration.runtimeCapability
432
- })),
433
- ...Array.from(this.config.processors.values(), (processor) => ({
434
- kind: "processor",
435
- name: processor.name,
436
- runtimeCapability: processor.runtimeCapability
437
- }))
438
- ];
439
- for (const contributor of contributors) {
440
- this.validateRuntimeCapability(contributor, runtimeEnvironment);
441
- }
442
- }
443
- validateRuntimeCapability(contributor, environment) {
444
- const declaration = contributor.runtimeCapability;
445
- if (!declaration) {
446
- return;
447
- }
448
- for (const tag of declaration.tags) {
449
- if (environment.supportedTags.has(tag)) {
450
- continue;
451
- }
452
- throw new Error(
453
- CONFIG_BUILDER_ERRORS.incompatibleRuntimeCapability(
454
- contributor.kind,
455
- contributor.name,
456
- environment.runtime,
457
- this.describeUnsupportedRuntimeTag(tag)
458
- )
459
- );
460
- }
461
- if (!declaration.minRuntimeVersion) {
462
- return;
463
- }
464
- const minVersion = this.parseVersion(declaration.minRuntimeVersion);
465
- if (!minVersion) {
466
- throw new Error(
467
- CONFIG_BUILDER_ERRORS.invalidRuntimeVersion(
468
- contributor.kind,
469
- contributor.name,
470
- declaration.minRuntimeVersion
471
- )
472
- );
473
- }
474
- const currentVersion = this.parseVersion(environment.version);
475
- if (!currentVersion) {
476
- return;
477
- }
478
- if (this.compareVersions(currentVersion, minVersion) >= 0) {
479
- return;
480
- }
481
- throw new Error(
482
- CONFIG_BUILDER_ERRORS.unsupportedRuntimeVersion(
483
- contributor.kind,
484
- contributor.name,
485
- environment.runtime,
486
- environment.version,
487
- declaration.minRuntimeVersion
488
- )
489
- );
490
- }
491
- detectRuntimeEnvironment() {
492
- const bunVersion = this.getBunVersion();
493
- if (bunVersion) {
494
- return {
495
- runtime: "bun",
496
- version: bunVersion,
497
- supportedTags: /* @__PURE__ */ new Set([
498
- "bun-only",
499
- "node-compatible",
500
- "requires-native-bun-api",
501
- "requires-node-builtins"
502
- ])
503
- };
504
- }
505
- return {
506
- runtime: "node",
507
- version: process.versions.node,
508
- supportedTags: /* @__PURE__ */ new Set(["node-compatible", "requires-node-builtins"])
509
- };
510
- }
511
- getBunVersion() {
512
- const bun = globalThis;
513
- return typeof bun.Bun?.version === "string" ? bun.Bun.version : void 0;
514
- }
515
- describeUnsupportedRuntimeTag(tag) {
516
- switch (tag) {
517
- case "bun-only":
518
- return "it is Bun-only";
519
- case "requires-native-bun-api":
520
- return "it requires the native Bun API";
521
- case "requires-node-builtins":
522
- return "it requires Node builtins";
523
- case "node-compatible":
524
- return "it requires a Node-compatible runtime";
525
- }
526
- }
527
- parseVersion(version) {
528
- const normalized = version.trim().replace(/^v/i, "");
529
- if (!/^\d+(?:\.\d+)*$/.test(normalized)) {
530
- return void 0;
531
- }
532
- return normalized.split(".").map((segment) => Number(segment));
533
- }
534
- compareVersions(left, right) {
535
- const maxLength = Math.max(left.length, right.length);
536
- for (let index = 0; index < maxLength; index += 1) {
537
- const leftValue = left[index] ?? 0;
538
- const rightValue = right[index] ?? 0;
539
- if (leftValue > rightValue) {
540
- return 1;
541
- }
542
- if (leftValue < rightValue) {
543
- return -1;
544
- }
545
- }
546
- return 0;
547
- }
548
- /**
549
- * Initializes default loaders that are required for EcoPages to function.
550
- * This includes the eco-component-meta-plugin which auto-injects __eco metadata into component configs.
551
- */
552
- async initializeDefaultLoaders() {
553
- const componentMetaTransform = createEcoComponentMetaTransform({ config: this.config });
554
- if (!this.config.sourceTransforms.has(componentMetaTransform.name)) {
555
- this.config.sourceTransforms.set(componentMetaTransform.name, componentMetaTransform);
556
- }
557
- const componentMetaPlugin = createEcoComponentMetaPlugin({ config: this.config });
558
- if (!this.config.loaders.has(componentMetaPlugin.name)) {
559
- this.config.loaders.set(componentMetaPlugin.name, componentMetaPlugin);
560
- }
561
- }
562
- reviewBaseUrl(baseUrl) {
563
- if (baseUrl) {
564
- this.config.baseUrl = baseUrl;
565
- return;
566
- }
567
- const envBaseUrl = process.env.ECOPAGES_BASE_URL;
568
- if (envBaseUrl) {
569
- this.config.baseUrl = envBaseUrl;
570
- } else if (!this.config.baseUrl) {
571
- this.config.baseUrl = `http://${DEFAULT_ECOPAGES_HOSTNAME}:${DEFAULT_ECOPAGES_PORT}`;
572
- }
573
- }
574
- /**
575
- * Builds and returns the final configuration object.
576
- * This performs validation and initialization of the configuration.
577
- *
578
- * @returns A promise that resolves to the final EcoPagesAppConfig
579
- * @throws Error if required configuration is missing (e.g., baseUrl)
580
- */
581
- async build() {
582
- this.reviewBaseUrl(this.config.baseUrl);
583
- if (!this.config.integrations.some((integration) => integration.name === GHTML_PLUGIN_NAME)) {
584
- this.config.integrations.push(ghtmlPlugin());
585
- }
586
- this.createIntegrationTemplatesExt(this.config.integrations);
587
- this.createAbsolutePaths(this.config);
588
- await this.initializeDefaultLoaders();
589
- this.initializeProcessors();
590
- this.validateRuntimeCapabilities();
591
- const buildAdapter = createBuildAdapter({ ownership: this.buildOwnership });
592
- setAppBuildAdapter(this.config, buildAdapter);
593
- updateAppBuildManifest(this.config, await collectConfiguredAppBuildManifestContributions(this.config));
594
- setAppServerInvalidationState(this.config, new CounterServerInvalidationState());
595
- setAppEntrypointDependencyGraph(this.config, new NoopEntrypointDependencyGraph());
596
- setAppBuildExecutor(this.config, buildAdapter);
597
- return this.config;
598
- }
101
+ /**
102
+ * Sets the base URL for the application.
103
+ * This URL is used as the root URL for all pages and assets.
104
+ *
105
+ * @param baseUrl - The base URL for the application (e.g., 'https://example.com')
106
+ * @returns The ConfigBuilder instance for method chaining
107
+ */
108
+ setBaseUrl(baseUrl) {
109
+ this.config.baseUrl = baseUrl;
110
+ return this;
111
+ }
112
+ /**
113
+ * Sets the root directory of the project.
114
+ * This is the base directory from which all other paths are resolved.
115
+ *
116
+ * @param rootDir - The root directory path
117
+ * @returns The ConfigBuilder instance for method chaining
118
+ */
119
+ setRootDir(rootDir) {
120
+ this.config.rootDir = rootDir;
121
+ return this;
122
+ }
123
+ /**
124
+ * Sets which runtime path owns build execution for the finalized app config.
125
+ *
126
+ * @remarks
127
+ * Three ownership values are accepted:
128
+ *
129
+ * - `'rolldown'` (default): Ecopages runs builds through
130
+ * {@link RolldownBuildAdapter}, creating a new `rolldown()` instance
131
+ * per build.
132
+ * - `'vite-host'`: a host runtime owns the build. Ecopages exposes a
133
+ * {@link ViteHostBuildAdapter} boundary marker that throws on direct
134
+ * use. Select this only for host-driven compatibility flows where
135
+ * core must not silently fall back to app build execution.
136
+ *
137
+ * Defaults to `'rolldown'` when {@link ConfigBuilder.build} runs
138
+ * without an explicit ownership.
139
+ */
140
+ setBuildOwnership(buildOwnership) {
141
+ this.buildOwnership = buildOwnership;
142
+ return this;
143
+ }
144
+ /**
145
+ * Sets the source directory relative to the root directory.
146
+ * This directory contains all the source files for the application.
147
+ *
148
+ * @param srcDir - The source directory name (default: 'src')
149
+ * @returns The ConfigBuilder instance for method chaining
150
+ */
151
+ setSrcDir(srcDir) {
152
+ this.config.srcDir = srcDir;
153
+ return this;
154
+ }
155
+ /**
156
+ * Sets the pages directory relative to the source directory.
157
+ * This directory contains all the page files for the application.
158
+ *
159
+ * @param pagesDir - The pages directory name (default: 'pages')
160
+ * @returns The ConfigBuilder instance for method chaining
161
+ */
162
+ setPagesDir(pagesDir) {
163
+ this.config.pagesDir = pagesDir;
164
+ return this;
165
+ }
166
+ /**
167
+ * Sets the includes directory relative to the source directory.
168
+ * This directory contains template includes and partials.
169
+ *
170
+ * @param includesDir - The includes directory name (default: 'includes')
171
+ * @returns The ConfigBuilder instance for method chaining
172
+ */
173
+ setIncludesDir(includesDir) {
174
+ this.config.includesDir = includesDir;
175
+ return this;
176
+ }
177
+ /**
178
+ * Sets the components directory relative to the source directory.
179
+ * This directory contains reusable components.
180
+ *
181
+ * @param componentsDir - The components directory name (default: 'components')
182
+ * @returns The ConfigBuilder instance for method chaining
183
+ */
184
+ setComponentsDir(componentsDir) {
185
+ this.config.componentsDir = componentsDir;
186
+ return this;
187
+ }
188
+ /**
189
+ * Sets the layouts directory relative to the source directory.
190
+ * This directory contains layout templates.
191
+ *
192
+ * @param layoutsDir - The layouts directory name (default: 'layouts')
193
+ * @returns The ConfigBuilder instance for method chaining
194
+ */
195
+ setLayoutsDir(layoutsDir) {
196
+ this.config.layoutsDir = layoutsDir;
197
+ return this;
198
+ }
199
+ /**
200
+ * Sets the public directory relative to the source directory.
201
+ * This directory contains static assets that should be served as-is.
202
+ *
203
+ * @param publicDir - The public directory name (default: 'public')
204
+ * @returns The ConfigBuilder instance for method chaining
205
+ */
206
+ setPublicDir(publicDir) {
207
+ this.config.publicDir = publicDir;
208
+ return this;
209
+ }
210
+ /**
211
+ * Sets the robots.txt configuration.
212
+ * This determines which paths are allowed/disallowed for search engines.
213
+ *
214
+ * @param robotsTxt - The robots.txt configuration object
215
+ * @returns The ConfigBuilder instance for method chaining
216
+ */
217
+ setRobotsTxt(robotsTxt) {
218
+ this.config.robotsTxt = robotsTxt;
219
+ return this;
220
+ }
221
+ /**
222
+ * Sets automatic sitemap.xml generation during static export.
223
+ *
224
+ * @remarks
225
+ * Merged over `{ enabled: false, fileName: 'sitemap.xml', extraUrls: [], exclude: [] }`.
226
+ * Existing apps stay unchanged until `enabled: true` is set. Page-level
227
+ * `metadata.robots.index: false` and metadata resolution failures are handled
228
+ * during static generation (not by this config merge).
229
+ */
230
+ setSitemap(sitemap) {
231
+ const defaults = {
232
+ enabled: false,
233
+ fileName: 'sitemap.xml',
234
+ extraUrls: [],
235
+ exclude: [],
236
+ };
237
+ this.config.sitemap = {
238
+ ...defaults,
239
+ ...this.config.sitemap,
240
+ ...sitemap,
241
+ extraUrls: sitemap.extraUrls ?? this.config.sitemap.extraUrls ?? defaults.extraUrls,
242
+ exclude: sitemap.exclude ?? this.config.sitemap.exclude ?? defaults.exclude,
243
+ };
244
+ return this;
245
+ }
246
+ /**
247
+ * Configures the in-browser development toolbar shown during watch mode.
248
+ *
249
+ * @remarks
250
+ * Requires `package` to point at a browser bootstrap module installed in the app.
251
+ * Prefer {@link defineDevTool} for config authoring.
252
+ */
253
+ setDevToolbar(devToolbar) {
254
+ this.config.devToolbar = {
255
+ ...this.config.devToolbar,
256
+ ...devToolbar,
257
+ };
258
+ return this;
259
+ }
260
+ /**
261
+ * Sets the integration plugins to use.
262
+ * These plugins provide additional functionality to the application.
263
+ *
264
+ * @param integrations - An array of integration plugins
265
+ * @returns The ConfigBuilder instance for method chaining
266
+ */
267
+ setIntegrations(integrations) {
268
+ this.config.integrations = integrations;
269
+ return this;
270
+ }
271
+ /**
272
+ * Sets the output directory for the built application.
273
+ *
274
+ * @param distDir - The distribution directory name (default: 'dist')
275
+ * @returns The ConfigBuilder instance for method chaining
276
+ */
277
+ setDistDir(distDir) {
278
+ this.config.distDir = distDir;
279
+ return this;
280
+ }
281
+ /**
282
+ * Sets the internal work directory for runtime-only artifacts.
283
+ *
284
+ * @remarks
285
+ * Use this when deployable output should stay clean while Ecopages still
286
+ * needs a separate workspace for server transpilation caches, runtime
287
+ * manifests, and other internal build products.
288
+ *
289
+ * @param workDir - The internal work directory name
290
+ * @returns The ConfigBuilder instance for method chaining
291
+ */
292
+ setWorkDir(workDir) {
293
+ this.config.workDir = workDir;
294
+ return this;
295
+ }
296
+ /**
297
+ * Sets the default metadata for pages.
298
+ * This is used when a page doesn't specify its own metadata.
299
+ *
300
+ * @param defaultMetadata - The default metadata object
301
+ * @returns The ConfigBuilder instance for method chaining
302
+ */
303
+ setDefaultMetadata(defaultMetadata) {
304
+ this.config.defaultMetadata = {
305
+ ...this.config.defaultMetadata,
306
+ ...defaultMetadata,
307
+ };
308
+ return this;
309
+ }
310
+ /**
311
+ * Sets additional paths to watch for changes during development.
312
+ *
313
+ * @param additionalWatchPaths - An array of additional paths to watch
314
+ * @returns The ConfigBuilder instance for method chaining
315
+ */
316
+ setAdditionalWatchPaths(additionalWatchPaths) {
317
+ this.config.additionalWatchPaths = additionalWatchPaths;
318
+ return this;
319
+ }
320
+ /**
321
+ * Sets static paths to SSR-prewarm in development.
322
+ *
323
+ * @param devPrewarmPaths - Absolute URL pathnames such as `/` or `/docs`.
324
+ * @returns The ConfigBuilder instance for method chaining.
325
+ */
326
+ setDevPrewarmPaths(devPrewarmPaths) {
327
+ this.config.devPrewarmPaths = devPrewarmPaths;
328
+ return this;
329
+ }
330
+ /**
331
+ * Sets static paths to SSR-prewarm before the development server reports ready.
332
+ *
333
+ * @param devPrewarmBeforeReadyPaths - Critical absolute URL pathnames such as `/`.
334
+ * @returns The ConfigBuilder instance for method chaining.
335
+ */
336
+ setDevPrewarmBeforeReadyPaths(devPrewarmBeforeReadyPaths) {
337
+ this.config.devPrewarmBeforeReadyPaths = devPrewarmBeforeReadyPaths;
338
+ return this;
339
+ }
340
+ /**
341
+ * Sets the processors to use for the application.
342
+ * This replaces any existing processors.
343
+ *
344
+ * @param processors - An array of processors
345
+ * @returns The ConfigBuilder instance for method chaining
346
+ */
347
+ setProcessors(processors) {
348
+ this.config.processors.clear();
349
+ for (const processor of processors) {
350
+ this.addProcessor(processor);
351
+ }
352
+ return this;
353
+ }
354
+ /**
355
+ * Adds a processor to the application.
356
+ *
357
+ * @param processor - The processor to add
358
+ * @returns The ConfigBuilder instance for method chaining
359
+ * @throws Error if a processor with the same name already exists
360
+ */
361
+ addProcessor(processor) {
362
+ if (this.config.processors.has(processor.name)) {
363
+ throw new Error(CONFIG_BUILDER_ERRORS.duplicateProcessorName(processor.name));
364
+ }
365
+ this.config.processors.set(processor.name, processor);
366
+ return this;
367
+ }
368
+ /**
369
+ * Sets the loaders to use for the application.
370
+ * This replaces any existing loaders.
371
+ *
372
+ * @param loaders - An array of build plugins to use as loaders
373
+ * @returns The ConfigBuilder instance for method chaining
374
+ */
375
+ setLoaders(loaders) {
376
+ this.config.loaders.clear();
377
+ for (const loader of loaders) {
378
+ this.addLoader(loader.name, loader);
379
+ }
380
+ return this;
381
+ }
382
+ /**
383
+ * Sets the source transforms to use for transform-first bundlers such as Vite.
384
+ * This replaces any existing source transforms.
385
+ */
386
+ setSourceTransforms(sourceTransforms) {
387
+ this.config.sourceTransforms.clear();
388
+ for (const sourceTransform of sourceTransforms) {
389
+ this.addSourceTransform(sourceTransform.name, sourceTransform);
390
+ }
391
+ return this;
392
+ }
393
+ /**
394
+ * Adds a loader to the application.
395
+ *
396
+ * @param name - The name of the loader
397
+ * @param loader - The build plugin to use as a loader
398
+ * @returns The ConfigBuilder instance for method chaining
399
+ * @throws Error if a loader with the same name already exists
400
+ */
401
+ addLoader(name, loader) {
402
+ if (this.config.loaders.has(name)) {
403
+ throw new Error(CONFIG_BUILDER_ERRORS.duplicateLoaderName(name));
404
+ }
405
+ this.config.loaders.set(name, loader);
406
+ return this;
407
+ }
408
+ /**
409
+ * Adds a source transform to the application.
410
+ *
411
+ * @throws Error if a source transform with the same name already exists.
412
+ */
413
+ addSourceTransform(name, sourceTransform) {
414
+ if (this.config.sourceTransforms.has(name)) {
415
+ throw new Error(CONFIG_BUILDER_ERRORS.duplicateLoaderName(name));
416
+ }
417
+ this.config.sourceTransforms.set(name, sourceTransform);
418
+ return this;
419
+ }
420
+ /**
421
+ * Sets the cache configuration for ISR and page caching.
422
+ *
423
+ * @param cacheConfig - The cache configuration object
424
+ * @returns The ConfigBuilder instance for method chaining
425
+ */
426
+ setCacheConfig(cacheConfig) {
427
+ this.config.cache = cacheConfig;
428
+ return this;
429
+ }
430
+ setExperimental(experimental) {
431
+ this.config.experimental = experimental;
432
+ return this;
433
+ }
434
+ createAbsolutePaths(config) {
435
+ const { srcDir, componentsDir, includesDir, layoutsDir, pagesDir, publicDir, distDir, workDir } = config;
436
+ const projectDir = config.rootDir;
437
+ const absoluteSrcDir = path.resolve(projectDir, srcDir);
438
+ const absoluteDistDir = path.resolve(projectDir, distDir);
439
+ const absoluteWorkDir = path.resolve(projectDir, workDir);
440
+ const absoluteIncludesDir = path.join(absoluteSrcDir, includesDir);
441
+ const absolutePagesDir = path.join(absoluteSrcDir, pagesDir);
442
+ this.config.absolutePaths = {
443
+ config: path.join(projectDir, 'eco.config.ts'),
444
+ projectDir: projectDir,
445
+ srcDir: absoluteSrcDir,
446
+ distDir: absoluteDistDir,
447
+ workDir: absoluteWorkDir,
448
+ componentsDir: path.join(absoluteSrcDir, componentsDir),
449
+ includesDir: absoluteIncludesDir,
450
+ layoutsDir: path.join(absoluteSrcDir, layoutsDir),
451
+ pagesDir: absolutePagesDir,
452
+ publicDir: path.join(absoluteSrcDir, publicDir),
453
+ htmlTemplatePath: this.resolveSemanticTemplatePath({
454
+ dirPath: absoluteIncludesDir,
455
+ basename: 'html',
456
+ }),
457
+ error404TemplatePath: this.resolveSemanticTemplatePath({
458
+ dirPath: absolutePagesDir,
459
+ basename: '404',
460
+ }),
461
+ error500TemplatePath: this.resolveSemanticTemplatePath({
462
+ dirPath: absolutePagesDir,
463
+ basename: '500',
464
+ }),
465
+ };
466
+ return this;
467
+ }
468
+ resolveSemanticTemplatePath({ dirPath, basename, }) {
469
+ const extensions = this.config.templatesExt.length > 0 ? this.config.templatesExt : ['.ghtml.ts'];
470
+ const matches = extensions
471
+ .map((extension) => path.join(dirPath, `${basename}${extension}`))
472
+ .filter((candidate) => fileSystem.exists(candidate));
473
+ invariant(matches.length <= 1, CONFIG_BUILDER_ERRORS.duplicateSemanticTemplate(basename, matches));
474
+ if (matches.length === 1) {
475
+ return matches[0];
476
+ }
477
+ return path.join(dirPath, `${basename}${extensions[0]}`);
478
+ }
479
+ createIntegrationTemplatesExt(integrations) {
480
+ const integrationName = integrations.map((integration) => integration.name);
481
+ const uniqueName = new Set(integrationName);
482
+ invariant(integrationName.length === uniqueName.size, CONFIG_BUILDER_ERRORS.DUPLICATE_INTEGRATION_NAMES);
483
+ const hasKitaJs = uniqueName.has('kitajs');
484
+ const hasReact = uniqueName.has('react');
485
+ if (hasKitaJs && hasReact) {
486
+ appLogger.debug(CONFIG_BUILDER_ERRORS.MIXED_JSX_ENGINES);
487
+ }
488
+ const integrationsExtensions = integrations.flatMap((integration) => integration.extensions);
489
+ const uniqueExtensions = new Set(integrationsExtensions);
490
+ invariant(integrationsExtensions.length === uniqueExtensions.size, CONFIG_BUILDER_ERRORS.DUPLICATE_INTEGRATION_EXTENSIONS);
491
+ this.config.templatesExt = integrationsExtensions;
492
+ }
493
+ initializeProcessors() {
494
+ for (const processor of this.config.processors.values()) {
495
+ processor.setContext(this.config);
496
+ }
497
+ }
498
+ validateRuntimeCapabilities() {
499
+ const runtimeEnvironment = this.detectRuntimeEnvironment();
500
+ const contributors = [
501
+ ...this.config.integrations.map((integration) => ({
502
+ kind: 'integration',
503
+ name: integration.name,
504
+ runtimeCapability: integration.runtimeCapability,
505
+ })),
506
+ ...Array.from(this.config.processors.values(), (processor) => ({
507
+ kind: 'processor',
508
+ name: processor.name,
509
+ runtimeCapability: processor.runtimeCapability,
510
+ })),
511
+ ];
512
+ for (const contributor of contributors) {
513
+ this.validateRuntimeCapability(contributor, runtimeEnvironment);
514
+ }
515
+ }
516
+ validateRuntimeCapability(contributor, environment) {
517
+ const declaration = contributor.runtimeCapability;
518
+ if (!declaration) {
519
+ return;
520
+ }
521
+ for (const tag of declaration.tags) {
522
+ if (environment.supportedTags.has(tag)) {
523
+ continue;
524
+ }
525
+ throw new Error(CONFIG_BUILDER_ERRORS.incompatibleRuntimeCapability(contributor.kind, contributor.name, environment.runtime, this.describeUnsupportedRuntimeTag(tag)));
526
+ }
527
+ if (!declaration.minRuntimeVersion) {
528
+ return;
529
+ }
530
+ const minVersion = this.parseVersion(declaration.minRuntimeVersion);
531
+ if (!minVersion) {
532
+ throw new Error(CONFIG_BUILDER_ERRORS.invalidRuntimeVersion(contributor.kind, contributor.name, declaration.minRuntimeVersion));
533
+ }
534
+ const currentVersion = this.parseVersion(environment.version);
535
+ if (!currentVersion) {
536
+ return;
537
+ }
538
+ if (this.compareVersions(currentVersion, minVersion) >= 0) {
539
+ return;
540
+ }
541
+ throw new Error(CONFIG_BUILDER_ERRORS.unsupportedRuntimeVersion(contributor.kind, contributor.name, environment.runtime, environment.version, declaration.minRuntimeVersion));
542
+ }
543
+ detectRuntimeEnvironment() {
544
+ const bunVersion = this.getBunVersion();
545
+ if (bunVersion) {
546
+ return {
547
+ runtime: 'bun',
548
+ version: bunVersion,
549
+ supportedTags: new Set([
550
+ 'bun-only',
551
+ 'node-compatible',
552
+ 'requires-native-bun-api',
553
+ 'requires-node-builtins',
554
+ ]),
555
+ };
556
+ }
557
+ return {
558
+ runtime: 'node',
559
+ version: process.versions.node,
560
+ supportedTags: new Set(['node-compatible', 'requires-node-builtins']),
561
+ };
562
+ }
563
+ getBunVersion() {
564
+ const bun = globalThis;
565
+ return typeof bun.Bun?.version === 'string' ? bun.Bun.version : undefined;
566
+ }
567
+ describeUnsupportedRuntimeTag(tag) {
568
+ switch (tag) {
569
+ case 'bun-only':
570
+ return 'it is Bun-only';
571
+ case 'requires-native-bun-api':
572
+ return 'it requires the native Bun API';
573
+ case 'requires-node-builtins':
574
+ return 'it requires Node builtins';
575
+ case 'node-compatible':
576
+ return 'it requires a Node-compatible runtime';
577
+ }
578
+ }
579
+ parseVersion(version) {
580
+ const normalized = version.trim().replace(/^v/i, '');
581
+ if (!/^\d+(?:\.\d+)*$/.test(normalized)) {
582
+ return undefined;
583
+ }
584
+ return normalized.split('.').map((segment) => Number(segment));
585
+ }
586
+ compareVersions(left, right) {
587
+ const maxLength = Math.max(left.length, right.length);
588
+ for (let index = 0; index < maxLength; index += 1) {
589
+ const leftValue = left[index] ?? 0;
590
+ const rightValue = right[index] ?? 0;
591
+ if (leftValue > rightValue) {
592
+ return 1;
593
+ }
594
+ if (leftValue < rightValue) {
595
+ return -1;
596
+ }
597
+ }
598
+ return 0;
599
+ }
600
+ /**
601
+ * Initializes default loaders that are required for EcoPages to function.
602
+ *
603
+ * @remarks
604
+ * Component identity attribution is a source transform so browser, HMR, and
605
+ * server module paths share one component-identity attribution mechanism.
606
+ */
607
+ async initializeDefaultLoaders() {
608
+ const componentMetaTransform = createEcoComponentMetaTransform({ config: this.config });
609
+ if (!this.config.sourceTransforms.has(componentMetaTransform.name)) {
610
+ this.config.sourceTransforms.set(componentMetaTransform.name, componentMetaTransform);
611
+ }
612
+ }
613
+ reviewBaseUrl(baseUrl) {
614
+ if (baseUrl) {
615
+ this.config.baseUrl = baseUrl;
616
+ return;
617
+ }
618
+ const envBaseUrl = process.env.ECOPAGES_BASE_URL;
619
+ if (envBaseUrl) {
620
+ this.config.baseUrl = envBaseUrl;
621
+ }
622
+ else if (!this.config.baseUrl) {
623
+ this.config.baseUrl = `http://${DEFAULT_ECOPAGES_HOSTNAME}:${DEFAULT_ECOPAGES_PORT}`;
624
+ }
625
+ }
626
+ /**
627
+ * Builds and returns the final configuration object.
628
+ * This performs validation and initialization of the configuration.
629
+ *
630
+ * @returns A promise that resolves to the final EcoPagesAppConfig
631
+ * @throws Error if required configuration is missing (e.g., baseUrl)
632
+ */
633
+ async build() {
634
+ this.reviewBaseUrl(this.config.baseUrl);
635
+ if (!this.config.integrations.some((integration) => integration.name === GHTML_PLUGIN_NAME)) {
636
+ this.config.integrations.push(ghtmlPlugin());
637
+ }
638
+ this.createIntegrationTemplatesExt(this.config.integrations);
639
+ this.createAbsolutePaths(this.config);
640
+ await this.initializeDefaultLoaders();
641
+ this.initializeProcessors();
642
+ this.validateRuntimeCapabilities();
643
+ const buildAdapter = createBuildAdapter({ ownership: this.buildOwnership });
644
+ setAppBuildAdapter(this.config, buildAdapter);
645
+ updateAppBuildManifest(this.config, await collectConfiguredAppBuildManifestContributions(this.config));
646
+ setAppServerInvalidationState(this.config, new CounterServerInvalidationState());
647
+ setAppEntrypointDependencyGraph(this.config, new NoopEntrypointDependencyGraph());
648
+ return this.config;
649
+ }
599
650
  }
600
- export {
601
- CONFIG_BUILDER_ERRORS,
602
- ConfigBuilder
603
- };