@ecopages/core 0.2.0-alpha.2 → 0.2.0-alpha.20

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 (391) hide show
  1. package/CHANGELOG.md +26 -64
  2. package/README.md +212 -14
  3. package/package.json +116 -66
  4. package/src/adapters/README.md +39 -0
  5. package/src/adapters/abstract/application-adapter.d.ts +28 -2
  6. package/src/adapters/abstract/application-adapter.js +14 -2
  7. package/src/adapters/abstract/router-adapter.d.ts +1 -1
  8. package/src/adapters/abstract/server-adapter.d.ts +2 -2
  9. package/src/adapters/bun/client-bridge.d.ts +1 -1
  10. package/src/adapters/bun/create-app.d.ts +4 -12
  11. package/src/adapters/bun/create-app.js +4 -5
  12. package/src/adapters/bun/hmr-manager.d.ts +80 -21
  13. package/src/adapters/bun/hmr-manager.js +168 -62
  14. package/src/adapters/bun/index.d.ts +2 -3
  15. package/src/adapters/bun/index.js +3 -3
  16. package/src/adapters/bun/server-adapter.d.ts +5 -5
  17. package/src/adapters/bun/server-adapter.js +40 -34
  18. package/src/adapters/bun/server-lifecycle.d.ts +28 -17
  19. package/src/adapters/bun/server-lifecycle.js +34 -62
  20. package/src/{create-app.d.ts → adapters/create-app.d.ts} +9 -6
  21. package/src/{create-app.js → adapters/create-app.js} +4 -4
  22. package/src/adapters/index.d.ts +2 -6
  23. package/src/adapters/index.js +2 -8
  24. package/src/adapters/node/create-app.d.ts +6 -9
  25. package/src/adapters/node/create-app.js +12 -6
  26. package/src/adapters/node/node-client-bridge.d.ts +1 -1
  27. package/src/adapters/node/node-hmr-manager.d.ts +89 -18
  28. package/src/adapters/node/node-hmr-manager.js +185 -95
  29. package/src/adapters/node/server-adapter.d.ts +6 -35
  30. package/src/adapters/node/server-adapter.js +44 -105
  31. package/src/adapters/node/static-content-server.d.ts +37 -1
  32. package/src/adapters/node/static-content-server.js +29 -1
  33. package/src/adapters/shared/application-adapter.d.ts +1 -1
  34. package/src/{define-api-handler.d.ts → adapters/shared/define-api-handler.d.ts} +1 -1
  35. package/src/adapters/shared/explicit-static-route-matcher.d.ts +2 -2
  36. package/src/adapters/shared/explicit-static-route-matcher.js +4 -1
  37. package/src/adapters/shared/file-route-middleware-pipeline.d.ts +1 -1
  38. package/src/adapters/shared/file-route-middleware-pipeline.js +1 -0
  39. package/src/adapters/shared/fs-server-response-factory.d.ts +2 -2
  40. package/src/adapters/shared/fs-server-response-factory.js +1 -1
  41. package/src/adapters/shared/fs-server-response-matcher.d.ts +8 -12
  42. package/src/adapters/shared/fs-server-response-matcher.js +10 -18
  43. package/src/adapters/shared/hmr-entrypoint-registrar.d.ts +55 -0
  44. package/src/adapters/shared/hmr-entrypoint-registrar.js +87 -0
  45. package/src/adapters/shared/hmr-html-response.d.ts +22 -0
  46. package/src/adapters/shared/hmr-html-response.js +32 -0
  47. package/src/adapters/shared/render-context.d.ts +2 -1
  48. package/src/adapters/shared/render-context.js +6 -3
  49. package/src/adapters/shared/runtime-bootstrap.d.ts +38 -0
  50. package/src/adapters/shared/runtime-bootstrap.js +43 -0
  51. package/src/adapters/shared/server-adapter.d.ts +13 -3
  52. package/src/adapters/shared/server-adapter.js +42 -5
  53. package/src/adapters/shared/server-route-handler.d.ts +4 -4
  54. package/src/adapters/shared/server-route-handler.js +6 -15
  55. package/src/adapters/shared/server-static-builder.d.ts +38 -6
  56. package/src/adapters/shared/server-static-builder.js +64 -10
  57. package/src/build/README.md +107 -0
  58. package/src/build/build-adapter.d.ts +168 -3
  59. package/src/build/build-adapter.js +604 -16
  60. package/src/build/build-manifest.d.ts +27 -0
  61. package/src/build/build-manifest.js +30 -0
  62. package/src/build/dev-build-coordinator.d.ts +72 -0
  63. package/src/build/dev-build-coordinator.js +154 -0
  64. package/src/build/esbuild-build-adapter.d.ts +15 -6
  65. package/src/build/esbuild-build-adapter.js +189 -74
  66. package/src/build/runtime-build-executor.d.ts +14 -0
  67. package/src/build/runtime-build-executor.js +22 -0
  68. package/src/build/runtime-specifier-alias-plugin.d.ts +15 -0
  69. package/src/build/runtime-specifier-alias-plugin.js +35 -0
  70. package/src/build/runtime-specifier-aliases.d.ts +5 -0
  71. package/src/build/runtime-specifier-aliases.js +95 -0
  72. package/src/config/README.md +36 -0
  73. package/src/config/config-builder.d.ts +52 -27
  74. package/src/config/config-builder.js +260 -49
  75. package/src/{constants.d.ts → config/constants.d.ts} +13 -0
  76. package/src/{constants.js → config/constants.js} +4 -0
  77. package/src/declarations.d.ts +19 -14
  78. package/src/dev/sc-server.d.ts +1 -1
  79. package/src/dev/sc-server.js +1 -1
  80. package/src/eco/README.md +70 -16
  81. package/src/eco/eco.browser.d.ts +2 -0
  82. package/src/eco/eco.browser.js +83 -0
  83. package/src/eco/eco.js +32 -57
  84. package/src/eco/eco.types.d.ts +12 -4
  85. package/src/eco/eco.utils.d.ts +1 -40
  86. package/src/eco/eco.utils.js +5 -35
  87. package/src/eco/global-injector-map.d.ts +1 -1
  88. package/src/eco/lazy-injector-map.d.ts +1 -1
  89. package/src/hmr/README.md +26 -0
  90. package/src/hmr/client/hmr-runtime.d.ts +1 -6
  91. package/src/hmr/client/hmr-runtime.js +30 -7
  92. package/src/hmr/hmr-strategy.d.ts +16 -13
  93. package/src/hmr/hmr-strategy.js +22 -7
  94. package/src/hmr/hmr.postcss.test.e2e.d.ts +1 -0
  95. package/src/hmr/hmr.postcss.test.e2e.js +31 -0
  96. package/src/hmr/hmr.test.e2e.js +26 -33
  97. package/src/hmr/strategies/default-hmr-strategy.d.ts +2 -2
  98. package/src/hmr/strategies/default-hmr-strategy.js +1 -1
  99. package/src/hmr/strategies/js-hmr-strategy.d.ts +46 -43
  100. package/src/hmr/strategies/js-hmr-strategy.js +72 -73
  101. package/src/index.browser.d.ts +2 -2
  102. package/src/index.browser.js +1 -1
  103. package/src/index.d.ts +4 -3
  104. package/src/index.js +16 -5
  105. package/src/integrations/ghtml/ghtml-renderer.d.ts +7 -2
  106. package/src/integrations/ghtml/ghtml-renderer.js +33 -30
  107. package/src/integrations/ghtml/ghtml.constants.d.ts +1 -0
  108. package/src/integrations/ghtml/ghtml.constants.js +4 -0
  109. package/src/integrations/ghtml/ghtml.plugin.d.ts +2 -6
  110. package/src/integrations/ghtml/ghtml.plugin.js +3 -4
  111. package/src/plugins/README.md +35 -0
  112. package/src/plugins/alias-resolver-plugin.js +17 -3
  113. package/src/plugins/eco-component-meta-plugin.d.ts +14 -1
  114. package/src/plugins/eco-component-meta-plugin.js +27 -21
  115. package/src/plugins/foreign-jsx-override-plugin.d.ts +31 -0
  116. package/src/plugins/foreign-jsx-override-plugin.js +35 -0
  117. package/src/plugins/integration-plugin.d.ts +145 -28
  118. package/src/plugins/integration-plugin.js +109 -13
  119. package/src/plugins/processor.d.ts +15 -2
  120. package/src/plugins/processor.js +16 -2
  121. package/src/plugins/runtime-capability.d.ts +9 -0
  122. package/src/plugins/source-transform.d.ts +46 -0
  123. package/src/plugins/source-transform.js +71 -0
  124. package/src/route-renderer/GRAPH.md +64 -98
  125. package/src/route-renderer/README.md +67 -46
  126. package/src/route-renderer/orchestration/boundary-planning.service.d.ts +25 -0
  127. package/src/route-renderer/orchestration/boundary-planning.service.js +97 -0
  128. package/src/route-renderer/orchestration/component-render-context.d.ts +83 -0
  129. package/src/route-renderer/orchestration/component-render-context.js +147 -0
  130. package/src/route-renderer/orchestration/integration-renderer.d.ts +554 -0
  131. package/src/route-renderer/orchestration/integration-renderer.js +957 -0
  132. package/src/route-renderer/orchestration/queued-boundary-runtime.service.d.ts +89 -0
  133. package/src/route-renderer/orchestration/queued-boundary-runtime.service.js +155 -0
  134. package/src/route-renderer/orchestration/render-execution.service.d.ts +43 -0
  135. package/src/route-renderer/orchestration/render-execution.service.js +106 -0
  136. package/src/{eco/eco.utils.ts → route-renderer/orchestration/render-output.utils.d.ts} +10 -53
  137. package/src/route-renderer/orchestration/render-output.utils.js +65 -0
  138. package/src/route-renderer/{render-preparation.service.d.ts → orchestration/render-preparation.service.d.ts} +18 -10
  139. package/src/route-renderer/{render-preparation.service.js → orchestration/render-preparation.service.js} +115 -17
  140. package/src/route-renderer/orchestration/route-shell-composer.service.d.ts +50 -0
  141. package/src/route-renderer/orchestration/route-shell-composer.service.js +81 -0
  142. package/src/route-renderer/orchestration/template-serialization.d.ts +38 -0
  143. package/src/route-renderer/orchestration/template-serialization.js +45 -0
  144. package/src/route-renderer/{dependency-resolver.d.ts → page-loading/dependency-resolver.d.ts} +15 -4
  145. package/src/route-renderer/{dependency-resolver.js → page-loading/dependency-resolver.js} +28 -12
  146. package/src/route-renderer/page-loading/page-module-loader.d.ts +90 -0
  147. package/src/route-renderer/{page-module-loader.js → page-loading/page-module-loader.js} +39 -14
  148. package/src/route-renderer/route-renderer.d.ts +45 -4
  149. package/src/route-renderer/route-renderer.js +38 -3
  150. package/src/router/README.md +97 -0
  151. package/src/router/client/link-intent.d.ts +53 -0
  152. package/src/router/client/link-intent.js +34 -0
  153. package/src/router/client/link-intent.test.browser.d.ts +1 -0
  154. package/src/router/client/link-intent.test.browser.js +43 -0
  155. package/src/router/client/navigation-coordinator.d.ts +149 -0
  156. package/src/router/client/navigation-coordinator.js +215 -0
  157. package/src/router/{fs-router-scanner.d.ts → server/fs-router-scanner.d.ts} +3 -3
  158. package/src/router/{fs-router-scanner.js → server/fs-router-scanner.js} +14 -8
  159. package/src/router/{fs-router.d.ts → server/fs-router.d.ts} +1 -1
  160. package/src/router/{fs-router.js → server/fs-router.js} +1 -1
  161. package/src/services/README.md +29 -0
  162. package/src/services/assets/asset-processing-service/asset-processing.service.d.ts +120 -0
  163. package/src/services/{asset-processing-service → assets/asset-processing-service}/asset-processing.service.js +91 -10
  164. package/src/services/{asset-processing-service → assets/asset-processing-service}/asset.factory.d.ts +1 -1
  165. package/src/services/{asset-processing-service → assets/asset-processing-service}/asset.factory.js +2 -2
  166. package/src/services/{asset-processing-service → assets/asset-processing-service}/assets.types.d.ts +2 -1
  167. package/src/services/assets/asset-processing-service/browser-runtime-asset.factory.d.ts +55 -0
  168. package/src/services/assets/asset-processing-service/browser-runtime-asset.factory.js +48 -0
  169. package/src/services/assets/asset-processing-service/browser-runtime-entry.factory.d.ts +20 -0
  170. package/src/services/assets/asset-processing-service/browser-runtime-entry.factory.js +41 -0
  171. package/src/services/assets/asset-processing-service/index.d.ts +5 -0
  172. package/src/services/assets/asset-processing-service/index.js +5 -0
  173. package/src/services/{asset-processing-service → assets/asset-processing-service}/processor.interface.d.ts +2 -2
  174. package/src/services/{asset-processing-service → assets/asset-processing-service}/processor.registry.d.ts +2 -2
  175. package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/base/base-processor.d.ts +1 -1
  176. package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/base/base-processor.js +9 -4
  177. package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/base/base-script-processor.d.ts +5 -4
  178. package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/base/base-script-processor.js +15 -23
  179. package/src/services/assets/asset-processing-service/processors/index.d.ts +5 -0
  180. package/src/services/assets/asset-processing-service/processors/index.js +5 -0
  181. package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/script/content-script.processor.d.ts +2 -2
  182. package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/script/content-script.processor.js +1 -1
  183. package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/script/file-script.processor.d.ts +4 -3
  184. package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/script/file-script.processor.js +16 -4
  185. package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/script/node-module-script.processor.d.ts +3 -3
  186. package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/script/node-module-script.processor.js +6 -5
  187. package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/stylesheet/content-stylesheet.processor.d.ts +2 -2
  188. package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/stylesheet/content-stylesheet.processor.js +1 -1
  189. package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/stylesheet/file-stylesheet.processor.d.ts +2 -2
  190. package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/stylesheet/file-stylesheet.processor.js +5 -2
  191. package/src/services/assets/browser-bundle.service.d.ts +32 -0
  192. package/src/services/assets/browser-bundle.service.js +33 -0
  193. package/src/services/{page-request-cache-coordinator.service.d.ts → cache/page-request-cache-coordinator.service.d.ts} +2 -2
  194. package/src/services/{page-request-cache-coordinator.service.js → cache/page-request-cache-coordinator.service.js} +3 -1
  195. package/src/services/html/html-rewriter-provider.service.d.ts +37 -0
  196. package/src/services/html/html-rewriter-provider.service.js +68 -0
  197. package/src/services/html/html-transformer.service.d.ts +77 -0
  198. package/src/services/html/html-transformer.service.js +215 -0
  199. package/src/services/invalidation/development-invalidation.service.d.ts +74 -0
  200. package/src/services/invalidation/development-invalidation.service.js +190 -0
  201. package/src/services/module-loading/app-module-loader.service.d.ts +28 -0
  202. package/src/services/module-loading/app-module-loader.service.js +35 -0
  203. package/src/services/module-loading/app-server-module-transpiler.service.d.ts +24 -0
  204. package/src/services/module-loading/app-server-module-transpiler.service.js +109 -0
  205. package/src/services/module-loading/host-module-loader-registry.d.ts +4 -0
  206. package/src/services/module-loading/host-module-loader-registry.js +15 -0
  207. package/src/services/module-loading/module-loading-types.d.ts +2 -0
  208. package/src/services/module-loading/node-bootstrap-plugin.d.ts +42 -0
  209. package/src/services/module-loading/node-bootstrap-plugin.js +204 -0
  210. package/src/services/module-loading/page-module-import.service.d.ts +76 -0
  211. package/src/services/module-loading/page-module-import.service.js +173 -0
  212. package/src/services/module-loading/server-module-transpiler.service.d.ts +72 -0
  213. package/src/services/module-loading/server-module-transpiler.service.js +64 -0
  214. package/src/services/runtime-state/dev-graph.service.d.ts +118 -0
  215. package/src/services/runtime-state/dev-graph.service.js +162 -0
  216. package/src/services/runtime-state/entrypoint-dependency-graph.service.d.ts +41 -0
  217. package/src/services/runtime-state/entrypoint-dependency-graph.service.js +85 -0
  218. package/src/services/runtime-state/runtime-specifier-registry.service.d.ts +69 -0
  219. package/src/services/runtime-state/runtime-specifier-registry.service.js +37 -0
  220. package/src/services/runtime-state/server-invalidation-state.service.d.ts +26 -0
  221. package/src/services/runtime-state/server-invalidation-state.service.js +35 -0
  222. package/src/services/{schema-validation-service.d.ts → validation/schema-validation-service.d.ts} +1 -1
  223. package/src/static-site-generator/README.md +26 -0
  224. package/src/static-site-generator/static-site-generator.d.ts +50 -3
  225. package/src/static-site-generator/static-site-generator.js +71 -5
  226. package/src/{internal-types.d.ts → types/internal-types.d.ts} +53 -22
  227. package/src/types/internal-types.js +0 -0
  228. package/src/{public-types.d.ts → types/public-types.d.ts} +146 -21
  229. package/src/types/public-types.js +0 -0
  230. package/src/utils/html-escaping.d.ts +7 -0
  231. package/src/utils/html-escaping.js +6 -0
  232. package/src/utils/locals-utils.d.ts +1 -1
  233. package/src/utils/parse-cli-args.d.ts +4 -1
  234. package/src/utils/parse-cli-args.js +16 -1
  235. package/src/utils/resolve-work-dir.d.ts +11 -0
  236. package/src/utils/resolve-work-dir.js +31 -0
  237. package/src/watchers/project-watcher.d.ts +40 -24
  238. package/src/watchers/project-watcher.js +129 -92
  239. package/src/watchers/project-watcher.test-helpers.d.ts +2 -2
  240. package/src/watchers/project-watcher.test-helpers.js +1 -0
  241. package/src/adapters/abstract/application-adapter.ts +0 -337
  242. package/src/adapters/abstract/router-adapter.ts +0 -30
  243. package/src/adapters/abstract/server-adapter.ts +0 -79
  244. package/src/adapters/bun/client-bridge.ts +0 -62
  245. package/src/adapters/bun/create-app.ts +0 -189
  246. package/src/adapters/bun/define-api-handler.d.ts +0 -61
  247. package/src/adapters/bun/define-api-handler.ts +0 -114
  248. package/src/adapters/bun/hmr-manager.ts +0 -281
  249. package/src/adapters/bun/index.ts +0 -3
  250. package/src/adapters/bun/server-adapter.ts +0 -492
  251. package/src/adapters/bun/server-lifecycle.ts +0 -154
  252. package/src/adapters/index.ts +0 -6
  253. package/src/adapters/node/create-app.ts +0 -179
  254. package/src/adapters/node/index.d.ts +0 -4
  255. package/src/adapters/node/index.js +0 -8
  256. package/src/adapters/node/index.ts +0 -9
  257. package/src/adapters/node/node-client-bridge.ts +0 -79
  258. package/src/adapters/node/node-hmr-manager.ts +0 -271
  259. package/src/adapters/node/server-adapter.ts +0 -561
  260. package/src/adapters/node/static-content-server.ts +0 -203
  261. package/src/adapters/shared/api-response.ts +0 -104
  262. package/src/adapters/shared/application-adapter.ts +0 -199
  263. package/src/adapters/shared/explicit-static-route-matcher.ts +0 -134
  264. package/src/adapters/shared/file-route-middleware-pipeline.ts +0 -123
  265. package/src/adapters/shared/fs-server-response-factory.ts +0 -118
  266. package/src/adapters/shared/fs-server-response-matcher.ts +0 -198
  267. package/src/adapters/shared/render-context.ts +0 -105
  268. package/src/adapters/shared/server-adapter.ts +0 -442
  269. package/src/adapters/shared/server-route-handler.ts +0 -166
  270. package/src/adapters/shared/server-static-builder.ts +0 -82
  271. package/src/build/build-adapter.ts +0 -132
  272. package/src/build/build-types.ts +0 -83
  273. package/src/build/esbuild-build-adapter.ts +0 -510
  274. package/src/config/config-builder.ts +0 -474
  275. package/src/constants.ts +0 -39
  276. package/src/create-app.ts +0 -87
  277. package/src/define-api-handler.js +0 -15
  278. package/src/define-api-handler.ts +0 -66
  279. package/src/dev/sc-server.ts +0 -143
  280. package/src/eco/component-render-context.d.ts +0 -105
  281. package/src/eco/component-render-context.js +0 -77
  282. package/src/eco/component-render-context.ts +0 -202
  283. package/src/eco/eco.ts +0 -221
  284. package/src/eco/eco.types.ts +0 -202
  285. package/src/eco/global-injector-map.ts +0 -112
  286. package/src/eco/lazy-injector-map.ts +0 -120
  287. package/src/eco/module-dependencies.ts +0 -75
  288. package/src/errors/http-error.ts +0 -72
  289. package/src/errors/index.ts +0 -2
  290. package/src/errors/locals-access-error.ts +0 -7
  291. package/src/global/app-logger.ts +0 -4
  292. package/src/hmr/client/__screenshots__/hmr-runtime.test.browser.ts/HMR-Runtime-HMR-Server-Integration-should-have-HMR-script-injected-in-page-1.png +0 -0
  293. package/src/hmr/client/__screenshots__/hmr-runtime.test.browser.ts/HMR-Runtime-HMR-Server-Integration-should-load-fixture-app-page-1.png +0 -0
  294. package/src/hmr/client/__screenshots__/hmr-runtime.test.browser.ts/HMR-Runtime-WebSocket-Connection-should-connect-to-correct-HMR-endpoint-1.png +0 -0
  295. package/src/hmr/client/hmr-runtime.ts +0 -121
  296. package/src/hmr/hmr-strategy.ts +0 -172
  297. package/src/hmr/hmr.test.e2e.ts +0 -75
  298. package/src/hmr/strategies/default-hmr-strategy.ts +0 -60
  299. package/src/hmr/strategies/js-hmr-strategy.ts +0 -308
  300. package/src/index.browser.ts +0 -3
  301. package/src/index.ts +0 -5
  302. package/src/integrations/ghtml/ghtml-renderer.ts +0 -93
  303. package/src/integrations/ghtml/ghtml.plugin.ts +0 -32
  304. package/src/internal-types.ts +0 -212
  305. package/src/plugins/alias-resolver-plugin.ts +0 -45
  306. package/src/plugins/eco-component-meta-plugin.ts +0 -474
  307. package/src/plugins/integration-plugin.ts +0 -184
  308. package/src/plugins/processor.ts +0 -220
  309. package/src/public-types.ts +0 -1255
  310. package/src/route-renderer/component-graph-executor.d.ts +0 -32
  311. package/src/route-renderer/component-graph-executor.js +0 -31
  312. package/src/route-renderer/component-graph-executor.ts +0 -84
  313. package/src/route-renderer/component-graph.d.ts +0 -42
  314. package/src/route-renderer/component-graph.js +0 -72
  315. package/src/route-renderer/component-graph.ts +0 -159
  316. package/src/route-renderer/component-marker.d.ts +0 -52
  317. package/src/route-renderer/component-marker.js +0 -46
  318. package/src/route-renderer/component-marker.ts +0 -117
  319. package/src/route-renderer/dependency-resolver.ts +0 -596
  320. package/src/route-renderer/html-post-processing.service.d.ts +0 -40
  321. package/src/route-renderer/html-post-processing.service.js +0 -86
  322. package/src/route-renderer/html-post-processing.service.ts +0 -103
  323. package/src/route-renderer/integration-renderer.d.ts +0 -339
  324. package/src/route-renderer/integration-renderer.js +0 -526
  325. package/src/route-renderer/integration-renderer.ts +0 -696
  326. package/src/route-renderer/marker-graph-resolver.d.ts +0 -76
  327. package/src/route-renderer/marker-graph-resolver.js +0 -93
  328. package/src/route-renderer/marker-graph-resolver.ts +0 -153
  329. package/src/route-renderer/page-module-loader.d.ts +0 -61
  330. package/src/route-renderer/page-module-loader.ts +0 -153
  331. package/src/route-renderer/render-execution.service.d.ts +0 -69
  332. package/src/route-renderer/render-execution.service.js +0 -91
  333. package/src/route-renderer/render-execution.service.ts +0 -158
  334. package/src/route-renderer/render-preparation.service.ts +0 -358
  335. package/src/route-renderer/route-renderer.ts +0 -80
  336. package/src/router/fs-router-scanner.ts +0 -217
  337. package/src/router/fs-router.ts +0 -122
  338. package/src/services/asset-processing-service/asset-processing.service.d.ts +0 -41
  339. package/src/services/asset-processing-service/asset-processing.service.ts +0 -306
  340. package/src/services/asset-processing-service/asset.factory.ts +0 -105
  341. package/src/services/asset-processing-service/assets.types.ts +0 -112
  342. package/src/services/asset-processing-service/index.d.ts +0 -3
  343. package/src/services/asset-processing-service/index.js +0 -3
  344. package/src/services/asset-processing-service/index.ts +0 -3
  345. package/src/services/asset-processing-service/processor.interface.ts +0 -27
  346. package/src/services/asset-processing-service/processor.registry.ts +0 -18
  347. package/src/services/asset-processing-service/processors/base/base-processor.ts +0 -76
  348. package/src/services/asset-processing-service/processors/base/base-script-processor.ts +0 -105
  349. package/src/services/asset-processing-service/processors/index.d.ts +0 -5
  350. package/src/services/asset-processing-service/processors/index.js +0 -5
  351. package/src/services/asset-processing-service/processors/index.ts +0 -5
  352. package/src/services/asset-processing-service/processors/script/content-script.processor.ts +0 -66
  353. package/src/services/asset-processing-service/processors/script/file-script.processor.ts +0 -88
  354. package/src/services/asset-processing-service/processors/script/node-module-script.processor.ts +0 -84
  355. package/src/services/asset-processing-service/processors/stylesheet/content-stylesheet.processor.ts +0 -27
  356. package/src/services/asset-processing-service/processors/stylesheet/file-stylesheet.processor.ts +0 -77
  357. package/src/services/cache/cache.types.ts +0 -126
  358. package/src/services/cache/index.ts +0 -18
  359. package/src/services/cache/memory-cache-store.ts +0 -130
  360. package/src/services/cache/page-cache-service.ts +0 -202
  361. package/src/services/html-transformer.service.d.ts +0 -50
  362. package/src/services/html-transformer.service.js +0 -163
  363. package/src/services/html-transformer.service.ts +0 -217
  364. package/src/services/page-module-import.service.d.ts +0 -37
  365. package/src/services/page-module-import.service.js +0 -88
  366. package/src/services/page-module-import.service.ts +0 -129
  367. package/src/services/page-request-cache-coordinator.service.ts +0 -128
  368. package/src/services/schema-validation-service.ts +0 -204
  369. package/src/services/validation/standard-schema.types.ts +0 -68
  370. package/src/static-site-generator/static-site-generator.ts +0 -359
  371. package/src/utils/css.d.ts +0 -1
  372. package/src/utils/css.js +0 -7
  373. package/src/utils/css.ts +0 -5
  374. package/src/utils/deep-merge.ts +0 -47
  375. package/src/utils/hash.ts +0 -5
  376. package/src/utils/html.ts +0 -1
  377. package/src/utils/invariant.ts +0 -15
  378. package/src/utils/locals-utils.ts +0 -37
  379. package/src/utils/parse-cli-args.ts +0 -83
  380. package/src/utils/path-utils.module.ts +0 -14
  381. package/src/utils/runtime.ts +0 -44
  382. package/src/utils/server-utils.module.ts +0 -67
  383. package/src/watchers/project-watcher.test-helpers.ts +0 -40
  384. package/src/watchers/project-watcher.ts +0 -306
  385. /package/src/adapters/{bun → shared}/define-api-handler.js +0 -0
  386. /package/src/{internal-types.js → plugins/runtime-capability.js} +0 -0
  387. /package/src/services/{asset-processing-service → assets/asset-processing-service}/assets.types.js +0 -0
  388. /package/src/services/{asset-processing-service → assets/asset-processing-service}/processor.interface.js +0 -0
  389. /package/src/services/{asset-processing-service → assets/asset-processing-service}/processor.registry.js +0 -0
  390. /package/src/{public-types.js → services/module-loading/module-loading-types.js} +0 -0
  391. /package/src/services/{schema-validation-service.js → validation/schema-validation-service.js} +0 -0
@@ -1,17 +1,51 @@
1
1
  import path from "node:path";
2
- import { DEFAULT_ECOPAGES_HOSTNAME, DEFAULT_ECOPAGES_PORT } from "../constants.js";
3
- import { GHTML_PLUGIN_NAME, ghtmlPlugin } from "../integrations/ghtml/ghtml.plugin.js";
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
+ getAppServerBuildPlugins,
12
+ setAppBuildAdapter,
13
+ setAppBuildExecutor,
14
+ updateAppBuildManifest
15
+ } from "../build/build-adapter.js";
16
+ import { createAppBuildExecutor } from "../build/dev-build-coordinator.js";
17
+ import { GHTML_PLUGIN_NAME } from "../integrations/ghtml/ghtml.constants.js";
18
+ import { ghtmlPlugin } from "../integrations/ghtml/ghtml.plugin.js";
4
19
  import { createEcoComponentMetaPlugin } from "../plugins/eco-component-meta-plugin.js";
20
+ import { createEcoComponentMetaTransform } from "../plugins/eco-component-meta-plugin.js";
21
+ import {
22
+ NoopEntrypointDependencyGraph,
23
+ setAppEntrypointDependencyGraph
24
+ } from "../services/runtime-state/entrypoint-dependency-graph.service.js";
25
+ import {
26
+ InMemoryRuntimeSpecifierRegistry,
27
+ setAppRuntimeSpecifierRegistry
28
+ } from "../services/runtime-state/runtime-specifier-registry.service.js";
29
+ import {
30
+ CounterServerInvalidationState,
31
+ setAppServerInvalidationState
32
+ } from "../services/runtime-state/server-invalidation-state.service.js";
5
33
  import { invariant } from "../utils/invariant.js";
6
34
  import { appLogger } from "../global/app-logger.js";
35
+ import { fileSystem } from "@ecopages/file-system";
7
36
  const CONFIG_BUILDER_ERRORS = {
8
37
  DUPLICATE_INTEGRATION_NAMES: "Integrations names must be unique",
9
38
  DUPLICATE_INTEGRATION_EXTENSIONS: "Integrations extensions must be unique",
10
39
  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).",
11
40
  duplicateProcessorName: (name) => `Processor with name "${name}" already exists`,
12
- duplicateLoaderName: (name) => `Loader with name "${name}" already exists`
41
+ duplicateLoaderName: (name) => `Loader with name "${name}" already exists`,
42
+ duplicateSemanticTemplate: (kind, matches) => `Multiple ${kind} templates found: ${matches.join(", ")}`,
43
+ incompatibleRuntimeCapability: (kind, name, runtime, reason) => `Cannot enable ${kind} "${name}" on ${runtime}: ${reason}`,
44
+ unsupportedRuntimeVersion: (kind, name, runtime, current, min) => `Cannot enable ${kind} "${name}" on ${runtime} ${current}: requires runtime version ${min} or newer`,
45
+ invalidRuntimeVersion: (kind, name, version) => `Cannot validate ${kind} "${name}" runtimeCapability.minRuntimeVersion "${version}" because it is not a dot-separated numeric version`
13
46
  };
14
47
  class ConfigBuilder {
48
+ buildOwnership = "bun-native";
15
49
  config = {
16
50
  baseUrl: "",
17
51
  rootDir: ".",
@@ -21,12 +55,6 @@ class ConfigBuilder {
21
55
  componentsDir: "components",
22
56
  layoutsDir: "layouts",
23
57
  publicDir: "public",
24
- includesTemplates: {
25
- head: "head.ghtml.ts",
26
- html: "html.ghtml.ts",
27
- seo: "seo.ghtml.ts"
28
- },
29
- error404Template: "404.ghtml.ts",
30
58
  robotsTxt: {
31
59
  preferences: {
32
60
  "*": []
@@ -34,7 +62,7 @@ class ConfigBuilder {
34
62
  },
35
63
  integrations: [],
36
64
  integrationsDependencies: [],
37
- distDir: ".eco",
65
+ distDir: DEFAULT_ECOPAGES_DIST_DIR,
38
66
  defaultMetadata: {
39
67
  title: "Ecopages",
40
68
  description: "This is a static site generated with Ecopages"
@@ -45,6 +73,7 @@ class ConfigBuilder {
45
73
  config: "",
46
74
  componentsDir: "",
47
75
  distDir: "",
76
+ workDir: "",
48
77
  includesDir: "",
49
78
  layoutsDir: "",
50
79
  pagesDir: "",
@@ -55,7 +84,9 @@ class ConfigBuilder {
55
84
  error404TemplatePath: ""
56
85
  },
57
86
  processors: /* @__PURE__ */ new Map(),
58
- loaders: /* @__PURE__ */ new Map()
87
+ loaders: /* @__PURE__ */ new Map(),
88
+ sourceTransforms: /* @__PURE__ */ new Map(),
89
+ workDir: DEFAULT_ECOPAGES_WORK_DIR
59
90
  };
60
91
  /**
61
92
  * Sets the base URL for the application.
@@ -79,6 +110,18 @@ class ConfigBuilder {
79
110
  this.config.rootDir = rootDir;
80
111
  return this;
81
112
  }
113
+ /**
114
+ * Sets which runtime path owns build execution for the finalized app config.
115
+ *
116
+ * @remarks
117
+ * Bun-native remains the default. Vite-host ownership should be selected only
118
+ * for host-driven compatibility flows where core must not silently fall back to
119
+ * Bun build execution.
120
+ */
121
+ setBuildOwnership(buildOwnership) {
122
+ this.buildOwnership = buildOwnership;
123
+ return this;
124
+ }
82
125
  /**
83
126
  * Sets the source directory relative to the root directory.
84
127
  * This directory contains all the source files for the application.
@@ -145,27 +188,6 @@ class ConfigBuilder {
145
188
  this.config.publicDir = publicDir;
146
189
  return this;
147
190
  }
148
- /**
149
- * Sets the templates used for includes.
150
- * These templates are used to build the HTML structure of pages.
151
- *
152
- * @param includesTemplates - An object containing the template file names
153
- * @returns The ConfigBuilder instance for method chaining
154
- */
155
- setIncludesTemplates(includesTemplates) {
156
- this.config.includesTemplates = includesTemplates;
157
- return this;
158
- }
159
- /**
160
- * Sets the template file for the 404 error page.
161
- *
162
- * @param error404Template - The file name of the 404 error template (default: '404.ghtml.ts')
163
- * @returns The ConfigBuilder instance for method chaining
164
- */
165
- setError404Template(error404Template) {
166
- this.config.error404Template = error404Template;
167
- return this;
168
- }
169
191
  /**
170
192
  * Sets the robots.txt configuration.
171
193
  * This determines which paths are allowed/disallowed for search engines.
@@ -191,13 +213,28 @@ class ConfigBuilder {
191
213
  /**
192
214
  * Sets the output directory for the built application.
193
215
  *
194
- * @param distDir - The distribution directory name (default: '.eco')
216
+ * @param distDir - The distribution directory name (default: 'dist')
195
217
  * @returns The ConfigBuilder instance for method chaining
196
218
  */
197
219
  setDistDir(distDir) {
198
220
  this.config.distDir = distDir;
199
221
  return this;
200
222
  }
223
+ /**
224
+ * Sets the internal work directory for runtime-only artifacts.
225
+ *
226
+ * @remarks
227
+ * Use this when deployable output should stay clean while Ecopages still
228
+ * needs a separate workspace for server transpilation caches, runtime
229
+ * manifests, and other internal build products.
230
+ *
231
+ * @param workDir - The internal work directory name
232
+ * @returns The ConfigBuilder instance for method chaining
233
+ */
234
+ setWorkDir(workDir) {
235
+ this.config.workDir = workDir;
236
+ return this;
237
+ }
201
238
  /**
202
239
  * Sets the default metadata for pages.
203
240
  * This is used when a page doesn't specify its own metadata.
@@ -264,6 +301,17 @@ class ConfigBuilder {
264
301
  }
265
302
  return this;
266
303
  }
304
+ /**
305
+ * Sets the source transforms to use for transform-first bundlers such as Vite.
306
+ * This replaces any existing source transforms.
307
+ */
308
+ setSourceTransforms(sourceTransforms) {
309
+ this.config.sourceTransforms.clear();
310
+ for (const sourceTransform of sourceTransforms) {
311
+ this.addSourceTransform(sourceTransform.name, sourceTransform);
312
+ }
313
+ return this;
314
+ }
267
315
  /**
268
316
  * Adds a loader to the application.
269
317
  *
@@ -279,6 +327,18 @@ class ConfigBuilder {
279
327
  this.config.loaders.set(name, loader);
280
328
  return this;
281
329
  }
330
+ /**
331
+ * Adds a source transform to the application.
332
+ *
333
+ * @throws Error if a source transform with the same name already exists.
334
+ */
335
+ addSourceTransform(name, sourceTransform) {
336
+ if (this.config.sourceTransforms.has(name)) {
337
+ throw new Error(CONFIG_BUILDER_ERRORS.duplicateLoaderName(name));
338
+ }
339
+ this.config.sourceTransforms.set(name, sourceTransform);
340
+ return this;
341
+ }
282
342
  /**
283
343
  * Sets the cache configuration for ISR and page caching.
284
344
  *
@@ -294,35 +354,44 @@ class ConfigBuilder {
294
354
  return this;
295
355
  }
296
356
  createAbsolutePaths(config) {
297
- const {
298
- srcDir,
299
- componentsDir,
300
- includesDir,
301
- layoutsDir,
302
- pagesDir,
303
- publicDir,
304
- distDir,
305
- includesTemplates,
306
- error404Template
307
- } = config;
357
+ const { srcDir, componentsDir, includesDir, layoutsDir, pagesDir, publicDir, distDir, workDir } = config;
308
358
  const projectDir = config.rootDir;
309
359
  const absoluteSrcDir = path.resolve(projectDir, srcDir);
310
360
  const absoluteDistDir = path.resolve(projectDir, distDir);
361
+ const absoluteWorkDir = path.resolve(projectDir, workDir);
362
+ const absoluteIncludesDir = path.join(absoluteSrcDir, includesDir);
363
+ const absolutePagesDir = path.join(absoluteSrcDir, pagesDir);
311
364
  this.config.absolutePaths = {
312
365
  config: path.join(projectDir, "eco.config.ts"),
313
366
  projectDir,
314
367
  srcDir: absoluteSrcDir,
315
368
  distDir: absoluteDistDir,
369
+ workDir: absoluteWorkDir,
316
370
  componentsDir: path.join(absoluteSrcDir, componentsDir),
317
- includesDir: path.join(absoluteSrcDir, includesDir),
371
+ includesDir: absoluteIncludesDir,
318
372
  layoutsDir: path.join(absoluteSrcDir, layoutsDir),
319
- pagesDir: path.join(absoluteSrcDir, pagesDir),
373
+ pagesDir: absolutePagesDir,
320
374
  publicDir: path.join(absoluteSrcDir, publicDir),
321
- htmlTemplatePath: path.join(absoluteSrcDir, includesDir, includesTemplates.html),
322
- error404TemplatePath: path.join(absoluteSrcDir, pagesDir, error404Template)
375
+ htmlTemplatePath: this.resolveSemanticTemplatePath({
376
+ dirPath: absoluteIncludesDir,
377
+ basename: "html"
378
+ }),
379
+ error404TemplatePath: this.resolveSemanticTemplatePath({
380
+ dirPath: absolutePagesDir,
381
+ basename: "404"
382
+ })
323
383
  };
324
384
  return this;
325
385
  }
386
+ resolveSemanticTemplatePath({ dirPath, basename }) {
387
+ const extensions = this.config.templatesExt.length > 0 ? this.config.templatesExt : [".ghtml.ts"];
388
+ const matches = extensions.map((extension) => path.join(dirPath, `${basename}${extension}`)).filter((candidate) => fileSystem.exists(candidate));
389
+ invariant(matches.length <= 1, CONFIG_BUILDER_ERRORS.duplicateSemanticTemplate(basename, matches));
390
+ if (matches.length === 1) {
391
+ return matches[0];
392
+ }
393
+ return path.join(dirPath, `${basename}${extensions[0]}`);
394
+ }
326
395
  createIntegrationTemplatesExt(integrations) {
327
396
  const integrationName = integrations.map((integration) => integration.name);
328
397
  const uniqueName = new Set(integrationName);
@@ -345,11 +414,138 @@ class ConfigBuilder {
345
414
  processor.setContext(this.config);
346
415
  }
347
416
  }
417
+ validateRuntimeCapabilities() {
418
+ const runtimeEnvironment = this.detectRuntimeEnvironment();
419
+ const contributors = [
420
+ ...this.config.integrations.map((integration) => ({
421
+ kind: "integration",
422
+ name: integration.name,
423
+ runtimeCapability: integration.runtimeCapability
424
+ })),
425
+ ...Array.from(this.config.processors.values(), (processor) => ({
426
+ kind: "processor",
427
+ name: processor.name,
428
+ runtimeCapability: processor.runtimeCapability
429
+ }))
430
+ ];
431
+ for (const contributor of contributors) {
432
+ this.validateRuntimeCapability(contributor, runtimeEnvironment);
433
+ }
434
+ }
435
+ validateRuntimeCapability(contributor, environment) {
436
+ const declaration = contributor.runtimeCapability;
437
+ if (!declaration) {
438
+ return;
439
+ }
440
+ for (const tag of declaration.tags) {
441
+ if (environment.supportedTags.has(tag)) {
442
+ continue;
443
+ }
444
+ throw new Error(
445
+ CONFIG_BUILDER_ERRORS.incompatibleRuntimeCapability(
446
+ contributor.kind,
447
+ contributor.name,
448
+ environment.runtime,
449
+ this.describeUnsupportedRuntimeTag(tag)
450
+ )
451
+ );
452
+ }
453
+ if (!declaration.minRuntimeVersion) {
454
+ return;
455
+ }
456
+ const minVersion = this.parseVersion(declaration.minRuntimeVersion);
457
+ if (!minVersion) {
458
+ throw new Error(
459
+ CONFIG_BUILDER_ERRORS.invalidRuntimeVersion(
460
+ contributor.kind,
461
+ contributor.name,
462
+ declaration.minRuntimeVersion
463
+ )
464
+ );
465
+ }
466
+ const currentVersion = this.parseVersion(environment.version);
467
+ if (!currentVersion) {
468
+ return;
469
+ }
470
+ if (this.compareVersions(currentVersion, minVersion) >= 0) {
471
+ return;
472
+ }
473
+ throw new Error(
474
+ CONFIG_BUILDER_ERRORS.unsupportedRuntimeVersion(
475
+ contributor.kind,
476
+ contributor.name,
477
+ environment.runtime,
478
+ environment.version,
479
+ declaration.minRuntimeVersion
480
+ )
481
+ );
482
+ }
483
+ detectRuntimeEnvironment() {
484
+ const bunVersion = this.getBunVersion();
485
+ if (bunVersion) {
486
+ return {
487
+ runtime: "bun",
488
+ version: bunVersion,
489
+ supportedTags: /* @__PURE__ */ new Set([
490
+ "bun-only",
491
+ "node-compatible",
492
+ "requires-native-bun-api",
493
+ "requires-node-builtins"
494
+ ])
495
+ };
496
+ }
497
+ return {
498
+ runtime: "node",
499
+ version: process.versions.node,
500
+ supportedTags: /* @__PURE__ */ new Set(["node-compatible", "requires-node-builtins"])
501
+ };
502
+ }
503
+ getBunVersion() {
504
+ const bun = globalThis;
505
+ return typeof bun.Bun?.version === "string" ? bun.Bun.version : void 0;
506
+ }
507
+ describeUnsupportedRuntimeTag(tag) {
508
+ switch (tag) {
509
+ case "bun-only":
510
+ return "it is Bun-only";
511
+ case "requires-native-bun-api":
512
+ return "it requires the native Bun API";
513
+ case "requires-node-builtins":
514
+ return "it requires Node builtins";
515
+ case "node-compatible":
516
+ return "it requires a Node-compatible runtime";
517
+ }
518
+ }
519
+ parseVersion(version) {
520
+ const normalized = version.trim().replace(/^v/i, "");
521
+ if (!/^\d+(?:\.\d+)*$/.test(normalized)) {
522
+ return void 0;
523
+ }
524
+ return normalized.split(".").map((segment) => Number(segment));
525
+ }
526
+ compareVersions(left, right) {
527
+ const maxLength = Math.max(left.length, right.length);
528
+ for (let index = 0; index < maxLength; index += 1) {
529
+ const leftValue = left[index] ?? 0;
530
+ const rightValue = right[index] ?? 0;
531
+ if (leftValue > rightValue) {
532
+ return 1;
533
+ }
534
+ if (leftValue < rightValue) {
535
+ return -1;
536
+ }
537
+ }
538
+ return 0;
539
+ }
348
540
  /**
349
541
  * Initializes default loaders that are required for EcoPages to function.
350
542
  * This includes the eco-component-meta-plugin which auto-injects __eco metadata into component configs.
351
543
  */
352
544
  async initializeDefaultLoaders() {
545
+ const componentMetaTransform = createEcoComponentMetaTransform({ config: this.config });
546
+ if (!this.config.sourceTransforms.has(componentMetaTransform.name)) {
547
+ this.config.sourceTransforms.set(componentMetaTransform.name, componentMetaTransform);
548
+ }
353
549
  const componentMetaPlugin = createEcoComponentMetaPlugin({ config: this.config });
354
550
  if (!this.config.loaders.has(componentMetaPlugin.name)) {
355
551
  this.config.loaders.set(componentMetaPlugin.name, componentMetaPlugin);
@@ -379,10 +575,25 @@ class ConfigBuilder {
379
575
  if (!this.config.integrations.some((integration) => integration.name === GHTML_PLUGIN_NAME)) {
380
576
  this.config.integrations.push(ghtmlPlugin());
381
577
  }
382
- this.createAbsolutePaths(this.config);
383
578
  this.createIntegrationTemplatesExt(this.config.integrations);
579
+ this.createAbsolutePaths(this.config);
384
580
  await this.initializeDefaultLoaders();
385
581
  this.initializeProcessors();
582
+ this.validateRuntimeCapabilities();
583
+ const buildAdapter = createBuildAdapter({ ownership: this.buildOwnership });
584
+ setAppBuildAdapter(this.config, buildAdapter);
585
+ updateAppBuildManifest(this.config, await collectConfiguredAppBuildManifestContributions(this.config));
586
+ setAppServerInvalidationState(this.config, new CounterServerInvalidationState());
587
+ setAppEntrypointDependencyGraph(this.config, new NoopEntrypointDependencyGraph());
588
+ setAppRuntimeSpecifierRegistry(this.config, new InMemoryRuntimeSpecifierRegistry());
589
+ setAppBuildExecutor(
590
+ this.config,
591
+ createAppBuildExecutor({
592
+ development: false,
593
+ adapter: buildAdapter,
594
+ getPlugins: () => getAppServerBuildPlugins(this.config)
595
+ })
596
+ );
386
597
  return this.config;
387
598
  }
388
599
  }
@@ -30,3 +30,16 @@ export declare const GENERATED_BASE_PATHS: {
30
30
  };
31
31
  export declare const DEFAULT_ECOPAGES_PORT = 3000;
32
32
  export declare const DEFAULT_ECOPAGES_HOSTNAME = "localhost";
33
+ /**
34
+ * Default directory used for deployable output.
35
+ */
36
+ export declare const DEFAULT_ECOPAGES_DIST_DIR = "dist";
37
+ /**
38
+ * Default internal working directory used for runtime-only artifacts.
39
+ *
40
+ * @remarks
41
+ * This directory is a local tool workspace and is not intended for deployment.
42
+ * It owns transpiled server modules, runtime manifests, and processor caches
43
+ * so the export directory can remain a clean deployable tree.
44
+ */
45
+ export declare const DEFAULT_ECOPAGES_WORK_DIR = ".eco";
@@ -10,9 +10,13 @@ const GENERATED_BASE_PATHS = {
10
10
  };
11
11
  const DEFAULT_ECOPAGES_PORT = 3e3;
12
12
  const DEFAULT_ECOPAGES_HOSTNAME = "localhost";
13
+ const DEFAULT_ECOPAGES_DIST_DIR = "dist";
14
+ const DEFAULT_ECOPAGES_WORK_DIR = ".eco";
13
15
  export {
16
+ DEFAULT_ECOPAGES_DIST_DIR,
14
17
  DEFAULT_ECOPAGES_HOSTNAME,
15
18
  DEFAULT_ECOPAGES_PORT,
19
+ DEFAULT_ECOPAGES_WORK_DIR,
16
20
  GENERATED_BASE_PATHS,
17
21
  IS_BUN,
18
22
  RESOLVED_ASSETS_DIR,
@@ -1,22 +1,27 @@
1
- import type { EcoPagesAppConfig } from './internal-types';
1
+ import type { EcoPagesAppConfig } from './types/internal-types';
2
+ import type { EcoNavigationRuntime } from './router/client/navigation-coordinator';
2
3
 
3
4
  type HMRHandler = (url: string) => Promise<void>;
4
-
5
- type ReloadPageFunction = (options: { clearCache: boolean }) => Promise<void>;
5
+ type CleanupPageRootFunction = () => void;
6
+ type EcoPageRoot = { render: (node: unknown) => void; unmount: () => void };
7
+ type EcoPageData = {
8
+ module: string;
9
+ props: Record<string, unknown>;
10
+ };
11
+ type EcoPagesWindowRuntime = {
12
+ hmrHandlers?: Record<string, HMRHandler>;
13
+ navigation?: EcoNavigationRuntime;
14
+ react?: {
15
+ cleanupPageRoot?: CleanupPageRootFunction;
16
+ pageRoot?: EcoPageRoot | null;
17
+ };
18
+ page?: EcoPageData;
19
+ };
6
20
 
7
21
  declare global {
8
- var ecoConfig: EcoPagesAppConfig;
9
-
10
22
  interface Window {
11
- /** Registered HMR handlers for specific module paths */
12
- __ecopages_hmr_handlers__?: Record<string, HMRHandler>;
13
- /** Function to reload the current page, used for layout updates */
14
- __ecopages_reload_current_page__?: ReloadPageFunction;
15
- /** Page data registry - contains module path and props for current page */
16
- __ECO_PAGE__?: {
17
- module: string;
18
- props: Record<string, unknown>;
19
- };
23
+ /** Shared Ecopages browser runtime state */
24
+ __ECO_PAGES__?: EcoPagesWindowRuntime;
20
25
  }
21
26
  }
22
27
 
@@ -1,5 +1,5 @@
1
1
  import type { Server } from 'bun';
2
- import type { EcoPagesAppConfig } from '../internal-types.js';
2
+ import type { EcoPagesAppConfig } from '../types/internal-types.js';
3
3
  type StaticContentServerOptions = {
4
4
  port?: number;
5
5
  };
@@ -1,5 +1,5 @@
1
1
  import { extname, join } from "node:path";
2
- import { STATUS_MESSAGE } from "../constants.js";
2
+ import { STATUS_MESSAGE } from "../config/constants.js";
3
3
  import { fileSystem } from "@ecopages/file-system";
4
4
  import { ServerUtils } from "../utils/server-utils.module.js";
5
5
  import { getRequiredBunRuntime } from "../utils/runtime.js";
package/src/eco/README.md CHANGED
@@ -7,10 +7,12 @@ A unified API for defining components, pages, and page data in EcoPages.
7
7
  The `eco` namespace provides a consistent, type-safe interface for:
8
8
 
9
9
  1. **`eco.component()`** - Factory for defining reusable components with dependencies and optional lazy-loading
10
- 2. **`eco.page()`** - Factory for defining page components with optional inline `staticPaths`, `staticProps`, and `metadata`
11
- 3. **`eco.metadata()`** - Type-safe wrapper for page metadata (legacy pattern)
12
- 4. **`eco.staticPaths()`** - Type-safe wrapper for dynamic route generation (legacy pattern)
13
- 5. **`eco.staticProps()`** - Type-safe wrapper for static data fetching (legacy pattern)
10
+ 2. **`eco.html()`** - Semantic alias for the document shell component (the outermost HTML wrapper)
11
+ 3. **`eco.layout()`** - Semantic alias for route layout components (page-level wrappers)
12
+ 4. **`eco.page()`** - Factory for defining page components with optional inline `staticPaths`, `staticProps`, and `metadata`
13
+ 5. **`eco.metadata()`** - Type-safe wrapper for page metadata (legacy pattern)
14
+ 6. **`eco.staticPaths()`** - Type-safe wrapper for dynamic route generation (legacy pattern)
15
+ 7. **`eco.staticProps()`** - Type-safe wrapper for static data fetching (legacy pattern)
14
16
 
15
17
  ## Component Patterns
16
18
 
@@ -42,9 +44,9 @@ export function Card({ children, class: className }: CardProps) {
42
44
 
43
45
  > **Note:** If your component requires a dedicated CSS file, use `eco.component()` instead to manage the stylesheet dependency.
44
46
 
45
- ### Plain React Components (With Bun)
47
+ ### Plain React Components
46
48
 
47
- When using Bun, React components with hooks and Tailwind CSS work out of the box without `eco.component()`. Bun auto-imports dependencies, so you can write standard React components:
49
+ React components with hooks and Tailwind CSS work out of the box without `eco.component()`. Standard React components can be used directly:
48
50
 
49
51
  ```tsx
50
52
  import { useEffect, useState } from 'react';
@@ -99,7 +101,6 @@ export function ThemeToggle() {
99
101
  - React components with hooks (`useState`, `useEffect`, etc.)
100
102
  - Components styled with Tailwind CSS classes
101
103
  - Interactive UI that doesn't require external scripts or dedicated stylesheets
102
- - Bun handles all imports automatically
103
104
 
104
105
  > **Note:** Use `eco.component()` only when you need to manage external stylesheets, scripts, or lazy loading. For React components relying solely on hooks and Tailwind, plain functions are simpler and sufficient.
105
106
 
@@ -128,14 +129,14 @@ export const Counter = eco.component({
128
129
 
129
130
  ### Comparison
130
131
 
131
- | Aspect | Simple JSX | Plain React (Bun) | `eco.component()` |
132
- | -------------------- | ---------- | ----------------- | ----------------- |
133
- | React hooks | No | Yes | Yes |
134
- | Scripts/Stylesheets | No | No | Yes |
135
- | Lazy loading | No | No | Yes |
136
- | Hydration strategies | No | No | Yes |
137
- | Runtime cost | Zero | Minimal | Minimal |
138
- | Use case | Static UI | Interactive UI | Advanced UI |
132
+ | Aspect | Simple JSX | Plain React | `eco.component()` |
133
+ | -------------------- | ---------- | -------------- | ----------------- |
134
+ | React hooks | No | Yes | Yes |
135
+ | Scripts/Stylesheets | No | No | Yes |
136
+ | Lazy loading | No | No | Yes |
137
+ | Hydration strategies | No | No | Yes |
138
+ | Runtime cost | Zero | Minimal | Minimal |
139
+ | Use case | Static UI | Interactive UI | Advanced UI |
139
140
 
140
141
  All patterns can coexist in the same project. Use the right tool for the job.
141
142
 
@@ -231,6 +232,53 @@ Both patterns work and can be mixed - the renderer checks for attached propertie
231
232
 
232
233
  ## API Reference
233
234
 
235
+ ### `eco.html()`
236
+
237
+ Creates the document shell component — the outermost HTML wrapper rendered once per page. Semantically equivalent to `eco.component()` but signals intent to tooling and readers that this component owns the full document structure (`<html>`, `<head>`, `<body>`).
238
+
239
+ ```tsx
240
+ import { eco } from '@ecopages/core';
241
+
242
+ export const Document = eco.html({
243
+ dependencies: {
244
+ stylesheets: ['./document.css'],
245
+ },
246
+ render: ({ children, metadata }) => (
247
+ <html lang="en">
248
+ <head>
249
+ <title>{metadata?.title ?? 'EcoPages'}</title>
250
+ </head>
251
+ <body>{children}</body>
252
+ </html>
253
+ ),
254
+ });
255
+ ```
256
+
257
+ ### `eco.layout()`
258
+
259
+ Creates a route layout component — a wrapper rendered around page content. Semantically equivalent to `eco.component()` but clearly communicates that the component is intended to be used as a `layout` in `eco.page()`.
260
+
261
+ ```tsx
262
+ import { eco } from '@ecopages/core';
263
+
264
+ export const BaseLayout = eco.layout({
265
+ dependencies: {
266
+ stylesheets: ['./base-layout.css'],
267
+ scripts: ['./base-layout.script.ts'],
268
+ },
269
+ render: ({ children }) => <main>{children}</main>,
270
+ });
271
+ ```
272
+
273
+ Use `eco.layout()` components as the `layout` option in `eco.page()`:
274
+
275
+ ```tsx
276
+ export default eco.page({
277
+ layout: BaseLayout,
278
+ render: () => <h1>Hello</h1>,
279
+ });
280
+ ```
281
+
234
282
  ### `eco.component()`
235
283
 
236
284
  Define a reusable component with dependencies.
@@ -516,12 +564,18 @@ interface EcoComponentDependencies {
516
564
  components?: EcoComponent[];
517
565
  }
518
566
 
567
+ // Shared base option shape used by component(), html(), and layout()
519
568
  interface ComponentOptions<P, E = EcoPagesElement> {
520
569
  componentDir?: string;
521
570
  dependencies?: EcoComponentDependencies;
522
571
  render: (props: P) => E;
523
572
  }
524
573
 
574
+ // html() and layout() accept the same options as component() but return
575
+ // narrower types to signal intent (EcoHtmlComponent / EcoLayoutComponent).
576
+ type HtmlOptions<E = EcoPagesElement> = ComponentOptions<Record<string, unknown>, E>;
577
+ type LayoutOptions<E = EcoPagesElement> = ComponentOptions<{ children: E }, E>;
578
+
525
579
  interface PageOptions<T, E = EcoPagesElement> {
526
580
  componentDir?: string;
527
581
  dependencies?: EcoComponentDependencies;
@@ -551,7 +605,7 @@ type PagePropsFor<T> =
551
605
  ```tsx
552
606
  import { eco } from '@ecopages/core';
553
607
 
554
- eco. // IDE shows: component, page, metadata, staticPaths, staticProps
608
+ eco. // IDE shows: component, html, layout, page, metadata, staticPaths, staticProps
555
609
  ```
556
610
 
557
611
  ### 2. Type Safety
@@ -0,0 +1,2 @@
1
+ import type { Eco } from './eco.types.js';
2
+ export declare const eco: Eco;