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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (418) hide show
  1. package/README.md +213 -12
  2. package/package.json +100 -188
  3. package/src/adapters/README.md +39 -0
  4. package/src/adapters/bun/hmr-manager.test.ts +267 -0
  5. package/src/adapters/bun/hmr-manager.ts +181 -68
  6. package/src/adapters/bun/index.ts +1 -2
  7. package/src/adapters/bun/server-adapter.ts +41 -34
  8. package/src/adapters/bun/server-lifecycle.ts +40 -70
  9. package/src/adapters/index.ts +1 -1
  10. package/src/adapters/node/bootstrap-dependency-resolver.test.ts +282 -0
  11. package/src/adapters/node/bootstrap-dependency-resolver.ts +301 -0
  12. package/src/adapters/node/index.ts +7 -0
  13. package/src/adapters/node/node-client-bridge.test.ts +198 -0
  14. package/src/adapters/node/node-hmr-manager.test.ts +322 -0
  15. package/src/adapters/node/node-hmr-manager.ts +208 -116
  16. package/src/adapters/node/runtime-adapter.test.ts +868 -0
  17. package/src/adapters/node/runtime-adapter.ts +439 -0
  18. package/src/adapters/node/server-adapter.ts +31 -104
  19. package/src/adapters/node/static-content-server.test.ts +60 -0
  20. package/src/adapters/node/static-content-server.ts +36 -0
  21. package/src/adapters/node/write-runtime-manifest.ts +38 -0
  22. package/src/adapters/shared/api-response.test.ts +97 -0
  23. package/src/{define-api-handler.ts → adapters/shared/define-api-handler.ts} +1 -1
  24. package/src/adapters/shared/explicit-static-route-matcher.test.ts +381 -0
  25. package/src/adapters/shared/explicit-static-route-matcher.ts +7 -1
  26. package/src/adapters/shared/file-route-middleware-pipeline.test.ts +90 -0
  27. package/src/adapters/shared/file-route-middleware-pipeline.ts +6 -2
  28. package/src/adapters/shared/fs-server-response-factory.test.ts +187 -0
  29. package/src/adapters/shared/fs-server-response-matcher.test.ts +286 -0
  30. package/src/adapters/shared/fs-server-response-matcher.ts +17 -10
  31. package/src/adapters/shared/hmr-entrypoint-registrar.ts +149 -0
  32. package/src/adapters/shared/hmr-html-response.ts +52 -0
  33. package/src/adapters/shared/hmr-manager.contract.test.ts +196 -0
  34. package/src/adapters/shared/hmr-manager.dispatch.test.ts +220 -0
  35. package/src/adapters/shared/render-context.test.ts +146 -0
  36. package/src/adapters/shared/render-context.ts +21 -6
  37. package/src/adapters/shared/runtime-bootstrap.ts +79 -0
  38. package/src/adapters/shared/server-adapter.test.ts +77 -0
  39. package/src/adapters/shared/server-adapter.ts +51 -4
  40. package/src/adapters/shared/server-route-handler.test.ts +110 -0
  41. package/src/adapters/shared/server-route-handler.ts +5 -18
  42. package/src/adapters/shared/server-static-builder.test.ts +316 -0
  43. package/src/adapters/shared/server-static-builder.ts +92 -8
  44. package/src/build/README.md +101 -0
  45. package/src/build/build-adapter-serialization.test.ts +268 -0
  46. package/src/build/build-adapter.test.ts +815 -0
  47. package/src/build/build-adapter.ts +235 -6
  48. package/src/build/build-manifest.ts +54 -0
  49. package/src/build/dev-build-coordinator.ts +221 -0
  50. package/src/build/esbuild-build-adapter.ts +132 -83
  51. package/src/build/runtime-build-executor.ts +34 -0
  52. package/src/build/runtime-specifier-alias-plugin.test.ts +43 -0
  53. package/src/build/runtime-specifier-alias-plugin.ts +58 -0
  54. package/src/config/README.md +33 -0
  55. package/src/config/config-builder.test.ts +410 -0
  56. package/src/config/config-builder.ts +281 -49
  57. package/src/constants.ts +15 -0
  58. package/src/declarations.d.ts +18 -13
  59. package/src/eco/README.md +70 -16
  60. package/src/eco/component-render-context.ts +39 -17
  61. package/src/eco/eco.test.ts +678 -0
  62. package/src/eco/eco.ts +29 -8
  63. package/src/eco/eco.types.ts +20 -1
  64. package/src/eco/eco.utils.test.ts +124 -0
  65. package/src/eco/global-injector-map.test.ts +42 -0
  66. package/src/eco/lazy-injector-map.test.ts +66 -0
  67. package/src/eco/module-dependencies.test.ts +30 -0
  68. package/src/errors/http-error.test.ts +134 -0
  69. package/src/global/utils.test.ts +12 -0
  70. package/src/hmr/README.md +26 -0
  71. package/src/hmr/client/__screenshots__/hmr-runtime.test.browser.ts/HMR-Runtime-HMR-Server-Integration-should-have-HMR-script-injected-in-page-1.png +0 -0
  72. package/src/hmr/client/__screenshots__/hmr-runtime.test.browser.ts/HMR-Runtime-HMR-Server-Integration-should-load-fixture-app-page-1.png +0 -0
  73. package/src/hmr/client/__screenshots__/hmr-runtime.test.browser.ts/HMR-Runtime-WebSocket-Connection-should-connect-to-correct-HMR-endpoint-1.png +0 -0
  74. package/src/hmr/client/hmr-runtime.ts +38 -7
  75. package/src/hmr/hmr-strategy.test.ts +124 -0
  76. package/src/hmr/hmr.postcss.test.e2e.ts +41 -0
  77. package/src/hmr/hmr.test.e2e.ts +29 -38
  78. package/src/hmr/strategies/js-hmr-strategy.test.ts +335 -0
  79. package/src/hmr/strategies/js-hmr-strategy.ts +115 -115
  80. package/src/index.ts +1 -1
  81. package/src/integrations/ghtml/ghtml-renderer.test.ts +63 -0
  82. package/src/integrations/ghtml/ghtml-renderer.ts +4 -1
  83. package/src/internal-types.ts +39 -19
  84. package/src/plugins/README.md +34 -0
  85. package/src/plugins/alias-resolver-plugin.test.ts +41 -0
  86. package/src/plugins/alias-resolver-plugin.ts +21 -3
  87. package/src/plugins/eco-component-meta-plugin.test.ts +380 -0
  88. package/src/plugins/eco-component-meta-plugin.ts +10 -3
  89. package/src/plugins/integration-plugin.test.ts +111 -0
  90. package/src/plugins/integration-plugin.ts +45 -3
  91. package/src/plugins/processor.test.ts +148 -0
  92. package/src/plugins/processor.ts +22 -2
  93. package/src/plugins/runtime-capability.ts +14 -0
  94. package/src/public-types.ts +73 -16
  95. package/src/route-renderer/GRAPH.md +16 -20
  96. package/src/route-renderer/README.md +8 -21
  97. package/src/route-renderer/component-graph/component-graph-executor.test.ts +41 -0
  98. package/src/route-renderer/component-graph/component-graph.test.ts +63 -0
  99. package/src/route-renderer/component-graph/component-marker.test.ts +73 -0
  100. package/src/route-renderer/component-graph/component-reference.ts +29 -0
  101. package/src/route-renderer/component-graph/marker-graph-resolver.test.ts +135 -0
  102. package/src/route-renderer/{marker-graph-resolver.ts → component-graph/marker-graph-resolver.ts} +11 -9
  103. package/src/route-renderer/orchestration/integration-renderer.test.ts +936 -0
  104. package/src/route-renderer/{integration-renderer.ts → orchestration/integration-renderer.ts} +113 -19
  105. package/src/route-renderer/orchestration/render-execution.service.test.ts +97 -0
  106. package/src/route-renderer/{render-execution.service.ts → orchestration/render-execution.service.ts} +109 -37
  107. package/src/route-renderer/orchestration/render-preparation.service.test.ts +235 -0
  108. package/src/route-renderer/{render-preparation.service.ts → orchestration/render-preparation.service.ts} +127 -9
  109. package/src/route-renderer/page-loading/dependency-resolver.test.ts +345 -0
  110. package/src/route-renderer/{dependency-resolver.ts → page-loading/dependency-resolver.ts} +28 -12
  111. package/src/route-renderer/page-loading/page-module-loader.test.ts +96 -0
  112. package/src/route-renderer/{page-module-loader.ts → page-loading/page-module-loader.ts} +49 -21
  113. package/src/route-renderer/route-renderer.ts +36 -1
  114. package/src/router/README.md +26 -0
  115. package/src/router/client/link-intent.d.ts +53 -0
  116. package/src/router/client/link-intent.test.browser.ts +51 -0
  117. package/src/router/client/link-intent.ts +92 -0
  118. package/src/router/client/navigation-coordinator.test.ts +237 -0
  119. package/src/router/client/navigation-coordinator.ts +433 -0
  120. package/src/router/server/fs-router-scanner.test.ts +83 -0
  121. package/src/router/{fs-router-scanner.ts → server/fs-router-scanner.ts} +12 -10
  122. package/src/router/server/fs-router.test.ts +214 -0
  123. package/src/router/{fs-router.ts → server/fs-router.ts} +2 -2
  124. package/src/services/README.md +29 -0
  125. package/src/services/assets/asset-processing-service/asset-processing.service.test.ts +385 -0
  126. package/src/services/{asset-processing-service → assets/asset-processing-service}/asset-processing.service.ts +101 -6
  127. package/src/services/assets/asset-processing-service/asset.factory.test.ts +63 -0
  128. package/src/services/{asset-processing-service → assets/asset-processing-service}/asset.factory.ts +2 -2
  129. package/src/services/{asset-processing-service → assets/asset-processing-service}/assets.types.ts +2 -1
  130. package/src/services/assets/asset-processing-service/browser-runtime-asset.factory.test.ts +72 -0
  131. package/src/services/assets/asset-processing-service/browser-runtime-asset.factory.ts +95 -0
  132. package/src/services/assets/asset-processing-service/browser-runtime-entry.factory.test.ts +67 -0
  133. package/src/services/assets/asset-processing-service/browser-runtime-entry.factory.ts +78 -0
  134. package/src/services/{asset-processing-service → assets/asset-processing-service}/index.ts +2 -0
  135. package/src/services/{asset-processing-service → assets/asset-processing-service}/processor.interface.ts +1 -1
  136. package/src/services/assets/asset-processing-service/processors/base/base-processor.test.ts +59 -0
  137. package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/base/base-processor.ts +11 -5
  138. package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/base/base-script-processor.ts +17 -27
  139. package/src/services/assets/asset-processing-service/processors/script/file-script.processor.test.ts +286 -0
  140. package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/script/file-script.processor.ts +3 -3
  141. package/src/services/assets/asset-processing-service/processors/script/node-module-script.processor.test.ts +227 -0
  142. package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/script/node-module-script.processor.ts +5 -4
  143. package/src/services/assets/asset-processing-service/processors/stylesheet/content-stylesheet.processor.test.ts +199 -0
  144. package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/stylesheet/file-stylesheet.processor.ts +4 -1
  145. package/src/services/assets/browser-bundle.service.test.ts +36 -0
  146. package/src/services/assets/browser-bundle.service.ts +53 -0
  147. package/src/services/cache/index.ts +3 -3
  148. package/src/services/cache/memory-cache-store.test.ts +225 -0
  149. package/src/services/cache/memory-cache-store.ts +1 -1
  150. package/src/services/cache/page-cache-service.test.ts +175 -0
  151. package/src/services/cache/page-cache-service.ts +3 -3
  152. package/src/services/cache/page-request-cache-coordinator.service.test.ts +79 -0
  153. package/src/services/{page-request-cache-coordinator.service.ts → cache/page-request-cache-coordinator.service.ts} +9 -6
  154. package/src/services/html/html-rewriter-provider.service.test.ts +183 -0
  155. package/src/services/html/html-rewriter-provider.service.ts +103 -0
  156. package/src/services/html/html-transformer.service.test.ts +378 -0
  157. package/src/services/html/html-transformer.service.ts +279 -0
  158. package/src/services/invalidation/development-invalidation.service.test.ts +77 -0
  159. package/src/services/invalidation/development-invalidation.service.ts +261 -0
  160. package/src/services/module-loading/app-server-module-transpiler.service.ts +52 -0
  161. package/src/services/module-loading/page-module-import.service.test.ts +253 -0
  162. package/src/services/module-loading/page-module-import.service.ts +200 -0
  163. package/src/services/module-loading/server-loader.service.test.ts +161 -0
  164. package/src/services/module-loading/server-loader.service.ts +130 -0
  165. package/src/services/module-loading/server-module-transpiler.service.test.ts +115 -0
  166. package/src/services/module-loading/server-module-transpiler.service.ts +105 -0
  167. package/src/services/runtime-manifest/node-runtime-manifest.service.test.ts +95 -0
  168. package/src/services/runtime-manifest/node-runtime-manifest.service.ts +101 -0
  169. package/src/services/runtime-state/dev-graph.service.ts +217 -0
  170. package/src/services/runtime-state/entrypoint-dependency-graph.service.ts +136 -0
  171. package/src/services/runtime-state/runtime-specifier-registry.service.ts +96 -0
  172. package/src/services/runtime-state/server-invalidation-state.service.ts +68 -0
  173. package/src/services/validation/schema-validation-service.test.ts +223 -0
  174. package/src/services/{schema-validation-service.ts → validation/schema-validation-service.ts} +1 -1
  175. package/src/static-site-generator/README.md +26 -0
  176. package/src/static-site-generator/static-site-generator.test.ts +307 -0
  177. package/src/static-site-generator/static-site-generator.ts +109 -6
  178. package/src/utils/deep-merge.test.ts +114 -0
  179. package/src/utils/invariant.test.ts +22 -0
  180. package/src/utils/path-utils.test.ts +15 -0
  181. package/src/utils/resolve-work-dir.ts +45 -0
  182. package/src/utils/server-utils.test.ts +38 -0
  183. package/src/watchers/project-watcher.integration.test.ts +337 -0
  184. package/src/watchers/project-watcher.test-helpers.ts +1 -1
  185. package/src/watchers/project-watcher.test.ts +678 -0
  186. package/src/watchers/project-watcher.ts +130 -111
  187. package/CHANGELOG.md +0 -91
  188. package/src/adapters/abstract/application-adapter.d.ts +0 -168
  189. package/src/adapters/abstract/application-adapter.js +0 -109
  190. package/src/adapters/abstract/router-adapter.d.ts +0 -26
  191. package/src/adapters/abstract/router-adapter.js +0 -5
  192. package/src/adapters/abstract/server-adapter.d.ts +0 -69
  193. package/src/adapters/abstract/server-adapter.js +0 -15
  194. package/src/adapters/bun/client-bridge.d.ts +0 -34
  195. package/src/adapters/bun/client-bridge.js +0 -48
  196. package/src/adapters/bun/create-app.d.ts +0 -60
  197. package/src/adapters/bun/create-app.js +0 -117
  198. package/src/adapters/bun/define-api-handler.d.ts +0 -61
  199. package/src/adapters/bun/define-api-handler.js +0 -15
  200. package/src/adapters/bun/define-api-handler.ts +0 -114
  201. package/src/adapters/bun/hmr-manager.d.ts +0 -85
  202. package/src/adapters/bun/hmr-manager.js +0 -240
  203. package/src/adapters/bun/index.d.ts +0 -3
  204. package/src/adapters/bun/index.js +0 -8
  205. package/src/adapters/bun/server-adapter.d.ts +0 -155
  206. package/src/adapters/bun/server-adapter.js +0 -368
  207. package/src/adapters/bun/server-lifecycle.d.ts +0 -52
  208. package/src/adapters/bun/server-lifecycle.js +0 -120
  209. package/src/adapters/index.d.ts +0 -6
  210. package/src/adapters/index.js +0 -14
  211. package/src/adapters/node/create-app.d.ts +0 -21
  212. package/src/adapters/node/create-app.js +0 -143
  213. package/src/adapters/node/index.d.ts +0 -4
  214. package/src/adapters/node/index.js +0 -8
  215. package/src/adapters/node/node-client-bridge.d.ts +0 -26
  216. package/src/adapters/node/node-client-bridge.js +0 -66
  217. package/src/adapters/node/node-hmr-manager.d.ts +0 -63
  218. package/src/adapters/node/node-hmr-manager.js +0 -237
  219. package/src/adapters/node/server-adapter.d.ts +0 -190
  220. package/src/adapters/node/server-adapter.js +0 -420
  221. package/src/adapters/node/static-content-server.d.ts +0 -24
  222. package/src/adapters/node/static-content-server.js +0 -166
  223. package/src/adapters/shared/api-response.d.ts +0 -52
  224. package/src/adapters/shared/api-response.js +0 -96
  225. package/src/adapters/shared/application-adapter.d.ts +0 -18
  226. package/src/adapters/shared/application-adapter.js +0 -90
  227. package/src/adapters/shared/explicit-static-route-matcher.d.ts +0 -38
  228. package/src/adapters/shared/explicit-static-route-matcher.js +0 -100
  229. package/src/adapters/shared/file-route-middleware-pipeline.d.ts +0 -65
  230. package/src/adapters/shared/file-route-middleware-pipeline.js +0 -98
  231. package/src/adapters/shared/fs-server-response-factory.d.ts +0 -19
  232. package/src/adapters/shared/fs-server-response-factory.js +0 -97
  233. package/src/adapters/shared/fs-server-response-matcher.d.ts +0 -71
  234. package/src/adapters/shared/fs-server-response-matcher.js +0 -155
  235. package/src/adapters/shared/render-context.d.ts +0 -14
  236. package/src/adapters/shared/render-context.js +0 -69
  237. package/src/adapters/shared/server-adapter.d.ts +0 -87
  238. package/src/adapters/shared/server-adapter.js +0 -353
  239. package/src/adapters/shared/server-route-handler.d.ts +0 -89
  240. package/src/adapters/shared/server-route-handler.js +0 -120
  241. package/src/adapters/shared/server-static-builder.d.ts +0 -38
  242. package/src/adapters/shared/server-static-builder.js +0 -46
  243. package/src/build/build-adapter.d.ts +0 -74
  244. package/src/build/build-adapter.js +0 -54
  245. package/src/build/build-types.d.ts +0 -57
  246. package/src/build/build-types.js +0 -0
  247. package/src/build/esbuild-build-adapter.d.ts +0 -69
  248. package/src/build/esbuild-build-adapter.js +0 -390
  249. package/src/config/config-builder.d.ts +0 -227
  250. package/src/config/config-builder.js +0 -392
  251. package/src/constants.d.ts +0 -32
  252. package/src/constants.js +0 -21
  253. package/src/create-app.d.ts +0 -17
  254. package/src/create-app.js +0 -66
  255. package/src/define-api-handler.d.ts +0 -25
  256. package/src/define-api-handler.js +0 -15
  257. package/src/dev/sc-server.d.ts +0 -30
  258. package/src/dev/sc-server.js +0 -111
  259. package/src/eco/component-render-context.d.ts +0 -105
  260. package/src/eco/component-render-context.js +0 -77
  261. package/src/eco/eco.d.ts +0 -9
  262. package/src/eco/eco.js +0 -110
  263. package/src/eco/eco.types.d.ts +0 -170
  264. package/src/eco/eco.types.js +0 -0
  265. package/src/eco/eco.utils.d.ts +0 -40
  266. package/src/eco/eco.utils.js +0 -40
  267. package/src/eco/global-injector-map.d.ts +0 -16
  268. package/src/eco/global-injector-map.js +0 -80
  269. package/src/eco/lazy-injector-map.d.ts +0 -8
  270. package/src/eco/lazy-injector-map.js +0 -70
  271. package/src/eco/module-dependencies.d.ts +0 -18
  272. package/src/eco/module-dependencies.js +0 -49
  273. package/src/errors/http-error.d.ts +0 -31
  274. package/src/errors/http-error.js +0 -50
  275. package/src/errors/index.d.ts +0 -2
  276. package/src/errors/index.js +0 -4
  277. package/src/errors/locals-access-error.d.ts +0 -4
  278. package/src/errors/locals-access-error.js +0 -9
  279. package/src/global/app-logger.d.ts +0 -2
  280. package/src/global/app-logger.js +0 -6
  281. package/src/hmr/client/hmr-runtime.d.ts +0 -10
  282. package/src/hmr/client/hmr-runtime.js +0 -86
  283. package/src/hmr/hmr-strategy.d.ts +0 -159
  284. package/src/hmr/hmr-strategy.js +0 -29
  285. package/src/hmr/hmr.test.e2e.d.ts +0 -1
  286. package/src/hmr/hmr.test.e2e.js +0 -50
  287. package/src/hmr/strategies/default-hmr-strategy.d.ts +0 -43
  288. package/src/hmr/strategies/default-hmr-strategy.js +0 -34
  289. package/src/hmr/strategies/js-hmr-strategy.d.ts +0 -136
  290. package/src/hmr/strategies/js-hmr-strategy.js +0 -188
  291. package/src/index.browser.d.ts +0 -3
  292. package/src/index.browser.js +0 -4
  293. package/src/index.d.ts +0 -5
  294. package/src/index.js +0 -10
  295. package/src/integrations/ghtml/ghtml-renderer.d.ts +0 -15
  296. package/src/integrations/ghtml/ghtml-renderer.js +0 -60
  297. package/src/integrations/ghtml/ghtml.plugin.d.ts +0 -20
  298. package/src/integrations/ghtml/ghtml.plugin.js +0 -21
  299. package/src/internal-types.d.ts +0 -200
  300. package/src/internal-types.js +0 -0
  301. package/src/plugins/alias-resolver-plugin.d.ts +0 -2
  302. package/src/plugins/alias-resolver-plugin.js +0 -39
  303. package/src/plugins/eco-component-meta-plugin.d.ts +0 -95
  304. package/src/plugins/eco-component-meta-plugin.js +0 -157
  305. package/src/plugins/integration-plugin.d.ts +0 -102
  306. package/src/plugins/integration-plugin.js +0 -100
  307. package/src/plugins/processor.d.ts +0 -82
  308. package/src/plugins/processor.js +0 -122
  309. package/src/public-types.d.ts +0 -1098
  310. package/src/public-types.js +0 -0
  311. package/src/route-renderer/component-graph-executor.d.ts +0 -32
  312. package/src/route-renderer/component-graph-executor.js +0 -31
  313. package/src/route-renderer/component-graph.d.ts +0 -42
  314. package/src/route-renderer/component-graph.js +0 -72
  315. package/src/route-renderer/component-marker.d.ts +0 -52
  316. package/src/route-renderer/component-marker.js +0 -46
  317. package/src/route-renderer/dependency-resolver.d.ts +0 -24
  318. package/src/route-renderer/dependency-resolver.js +0 -428
  319. package/src/route-renderer/html-post-processing.service.d.ts +0 -40
  320. package/src/route-renderer/html-post-processing.service.js +0 -86
  321. package/src/route-renderer/html-post-processing.service.ts +0 -103
  322. package/src/route-renderer/integration-renderer.d.ts +0 -339
  323. package/src/route-renderer/integration-renderer.js +0 -526
  324. package/src/route-renderer/marker-graph-resolver.d.ts +0 -76
  325. package/src/route-renderer/marker-graph-resolver.js +0 -93
  326. package/src/route-renderer/page-module-loader.d.ts +0 -61
  327. package/src/route-renderer/page-module-loader.js +0 -102
  328. package/src/route-renderer/render-execution.service.d.ts +0 -69
  329. package/src/route-renderer/render-execution.service.js +0 -91
  330. package/src/route-renderer/render-preparation.service.d.ts +0 -112
  331. package/src/route-renderer/render-preparation.service.js +0 -243
  332. package/src/route-renderer/route-renderer.d.ts +0 -26
  333. package/src/route-renderer/route-renderer.js +0 -68
  334. package/src/router/fs-router-scanner.d.ts +0 -41
  335. package/src/router/fs-router-scanner.js +0 -155
  336. package/src/router/fs-router.d.ts +0 -26
  337. package/src/router/fs-router.js +0 -100
  338. package/src/services/asset-processing-service/asset-processing.service.d.ts +0 -41
  339. package/src/services/asset-processing-service/asset-processing.service.js +0 -250
  340. package/src/services/asset-processing-service/asset.factory.d.ts +0 -17
  341. package/src/services/asset-processing-service/asset.factory.js +0 -82
  342. package/src/services/asset-processing-service/assets.types.d.ts +0 -88
  343. package/src/services/asset-processing-service/assets.types.js +0 -0
  344. package/src/services/asset-processing-service/index.d.ts +0 -3
  345. package/src/services/asset-processing-service/index.js +0 -3
  346. package/src/services/asset-processing-service/processor.interface.d.ts +0 -22
  347. package/src/services/asset-processing-service/processor.interface.js +0 -6
  348. package/src/services/asset-processing-service/processor.registry.d.ts +0 -8
  349. package/src/services/asset-processing-service/processor.registry.js +0 -15
  350. package/src/services/asset-processing-service/processors/base/base-processor.d.ts +0 -24
  351. package/src/services/asset-processing-service/processors/base/base-processor.js +0 -59
  352. package/src/services/asset-processing-service/processors/base/base-script-processor.d.ts +0 -16
  353. package/src/services/asset-processing-service/processors/base/base-script-processor.js +0 -80
  354. package/src/services/asset-processing-service/processors/index.d.ts +0 -5
  355. package/src/services/asset-processing-service/processors/index.js +0 -5
  356. package/src/services/asset-processing-service/processors/script/content-script.processor.d.ts +0 -5
  357. package/src/services/asset-processing-service/processors/script/content-script.processor.js +0 -57
  358. package/src/services/asset-processing-service/processors/script/file-script.processor.d.ts +0 -8
  359. package/src/services/asset-processing-service/processors/script/file-script.processor.js +0 -76
  360. package/src/services/asset-processing-service/processors/script/node-module-script.processor.d.ts +0 -7
  361. package/src/services/asset-processing-service/processors/script/node-module-script.processor.js +0 -74
  362. package/src/services/asset-processing-service/processors/stylesheet/content-stylesheet.processor.d.ts +0 -5
  363. package/src/services/asset-processing-service/processors/stylesheet/content-stylesheet.processor.js +0 -25
  364. package/src/services/asset-processing-service/processors/stylesheet/file-stylesheet.processor.d.ts +0 -9
  365. package/src/services/asset-processing-service/processors/stylesheet/file-stylesheet.processor.js +0 -63
  366. package/src/services/cache/cache.types.d.ts +0 -107
  367. package/src/services/cache/cache.types.js +0 -0
  368. package/src/services/cache/index.d.ts +0 -7
  369. package/src/services/cache/index.js +0 -7
  370. package/src/services/cache/memory-cache-store.d.ts +0 -42
  371. package/src/services/cache/memory-cache-store.js +0 -98
  372. package/src/services/cache/page-cache-service.d.ts +0 -70
  373. package/src/services/cache/page-cache-service.js +0 -152
  374. package/src/services/html-transformer.service.d.ts +0 -50
  375. package/src/services/html-transformer.service.js +0 -163
  376. package/src/services/html-transformer.service.ts +0 -217
  377. package/src/services/page-module-import.service.d.ts +0 -37
  378. package/src/services/page-module-import.service.js +0 -88
  379. package/src/services/page-module-import.service.ts +0 -129
  380. package/src/services/page-request-cache-coordinator.service.d.ts +0 -75
  381. package/src/services/page-request-cache-coordinator.service.js +0 -107
  382. package/src/services/schema-validation-service.d.ts +0 -122
  383. package/src/services/schema-validation-service.js +0 -101
  384. package/src/services/validation/standard-schema.types.d.ts +0 -65
  385. package/src/services/validation/standard-schema.types.js +0 -0
  386. package/src/static-site-generator/static-site-generator.d.ts +0 -57
  387. package/src/static-site-generator/static-site-generator.js +0 -272
  388. package/src/utils/css.d.ts +0 -1
  389. package/src/utils/css.js +0 -7
  390. package/src/utils/deep-merge.d.ts +0 -14
  391. package/src/utils/deep-merge.js +0 -32
  392. package/src/utils/hash.d.ts +0 -1
  393. package/src/utils/hash.js +0 -7
  394. package/src/utils/html.d.ts +0 -1
  395. package/src/utils/html.js +0 -4
  396. package/src/utils/invariant.d.ts +0 -5
  397. package/src/utils/invariant.js +0 -11
  398. package/src/utils/locals-utils.d.ts +0 -15
  399. package/src/utils/locals-utils.js +0 -24
  400. package/src/utils/parse-cli-args.d.ts +0 -24
  401. package/src/utils/parse-cli-args.js +0 -47
  402. package/src/utils/path-utils.module.d.ts +0 -5
  403. package/src/utils/path-utils.module.js +0 -14
  404. package/src/utils/runtime.d.ts +0 -11
  405. package/src/utils/runtime.js +0 -40
  406. package/src/utils/server-utils.module.d.ts +0 -19
  407. package/src/utils/server-utils.module.js +0 -56
  408. package/src/watchers/project-watcher.d.ts +0 -125
  409. package/src/watchers/project-watcher.js +0 -265
  410. package/src/watchers/project-watcher.test-helpers.d.ts +0 -4
  411. package/src/watchers/project-watcher.test-helpers.js +0 -52
  412. /package/src/route-renderer/{component-graph-executor.ts → component-graph/component-graph-executor.ts} +0 -0
  413. /package/src/route-renderer/{component-graph.ts → component-graph/component-graph.ts} +0 -0
  414. /package/src/route-renderer/{component-marker.ts → component-graph/component-marker.ts} +0 -0
  415. /package/src/services/{asset-processing-service → assets/asset-processing-service}/processor.registry.ts +0 -0
  416. /package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/index.ts +0 -0
  417. /package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/script/content-script.processor.ts +0 -0
  418. /package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/stylesheet/content-stylesheet.processor.ts +0 -0
@@ -4,17 +4,49 @@
4
4
  */
5
5
 
6
6
  import path from 'node:path';
7
- import { DEFAULT_ECOPAGES_HOSTNAME, DEFAULT_ECOPAGES_PORT } from '../constants.ts';
7
+ import {
8
+ DEFAULT_ECOPAGES_DIST_DIR,
9
+ DEFAULT_ECOPAGES_HOSTNAME,
10
+ DEFAULT_ECOPAGES_PORT,
11
+ DEFAULT_ECOPAGES_WORK_DIR,
12
+ } from '../constants.ts';
13
+ import {
14
+ collectConfiguredAppBuildManifestContributions,
15
+ createBuildAdapter,
16
+ getAppServerBuildPlugins,
17
+ setAppBuildAdapter,
18
+ setAppBuildExecutor,
19
+ updateAppBuildManifest,
20
+ } from '../build/build-adapter.ts';
8
21
  import type { EcoBuildPlugin } from '../build/build-types.ts';
22
+ import { createAppBuildExecutor } from '../build/dev-build-coordinator.ts';
9
23
  import { GHTML_PLUGIN_NAME, ghtmlPlugin } from '../integrations/ghtml/ghtml.plugin.ts';
10
- import type { EcoPagesAppConfig, IncludesTemplates, RobotsPreference } from '../internal-types.ts';
24
+ import type { EcoPagesAppConfig, RobotsPreference } from '../internal-types.ts';
11
25
  import { createEcoComponentMetaPlugin } from '../plugins/eco-component-meta-plugin.ts';
12
26
  import type { IntegrationPlugin } from '../plugins/integration-plugin.ts';
13
27
  import type { Processor } from '../plugins/processor.ts';
28
+ import type { RuntimeCapabilityDeclaration, RuntimeCapabilityTag } from '../plugins/runtime-capability.ts';
14
29
  import type { PageMetadataProps } from '../public-types.ts';
15
30
  import type { CacheConfig } from '../services/cache/cache.types.ts';
31
+ import {
32
+ NoopEntrypointDependencyGraph,
33
+ setAppEntrypointDependencyGraph,
34
+ } from '../services/runtime-state/entrypoint-dependency-graph.service.ts';
35
+ import {
36
+ createNodeRuntimeManifest,
37
+ setAppNodeRuntimeManifest,
38
+ } from '../services/runtime-manifest/node-runtime-manifest.service.ts';
39
+ import {
40
+ InMemoryRuntimeSpecifierRegistry,
41
+ setAppRuntimeSpecifierRegistry,
42
+ } from '../services/runtime-state/runtime-specifier-registry.service.ts';
43
+ import {
44
+ CounterServerInvalidationState,
45
+ setAppServerInvalidationState,
46
+ } from '../services/runtime-state/server-invalidation-state.service.ts';
16
47
  import { invariant } from '../utils/invariant.ts';
17
48
  import { appLogger } from '../global/app-logger.ts';
49
+ import { fileSystem } from '@ecopages/file-system';
18
50
 
19
51
  export const CONFIG_BUILDER_ERRORS = {
20
52
  DUPLICATE_INTEGRATION_NAMES: 'Integrations names must be unique',
@@ -23,8 +55,39 @@ export const CONFIG_BUILDER_ERRORS = {
23
55
  '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).',
24
56
  duplicateProcessorName: (name: string) => `Processor with name "${name}" already exists`,
25
57
  duplicateLoaderName: (name: string) => `Loader with name "${name}" already exists`,
58
+ duplicateSemanticTemplate: (kind: 'html' | '404', matches: string[]) =>
59
+ `Multiple ${kind} templates found: ${matches.join(', ')}`,
60
+ incompatibleRuntimeCapability: (
61
+ kind: 'integration' | 'processor',
62
+ name: string,
63
+ runtime: RuntimeKind,
64
+ reason: string,
65
+ ) => `Cannot enable ${kind} "${name}" on ${runtime}: ${reason}`,
66
+ unsupportedRuntimeVersion: (
67
+ kind: 'integration' | 'processor',
68
+ name: string,
69
+ runtime: RuntimeKind,
70
+ current: string,
71
+ min: string,
72
+ ) => `Cannot enable ${kind} "${name}" on ${runtime} ${current}: requires runtime version ${min} or newer`,
73
+ invalidRuntimeVersion: (kind: 'integration' | 'processor', name: string, version: string) =>
74
+ `Cannot validate ${kind} "${name}" runtimeCapability.minRuntimeVersion "${version}" because it is not a dot-separated numeric version`,
26
75
  } as const;
27
76
 
77
+ type RuntimeKind = 'node' | 'bun';
78
+
79
+ type RuntimeEnvironment = {
80
+ runtime: RuntimeKind;
81
+ version: string;
82
+ supportedTags: Set<RuntimeCapabilityTag>;
83
+ };
84
+
85
+ type RuntimeCapabilityOwner = {
86
+ kind: 'integration' | 'processor';
87
+ name: string;
88
+ runtimeCapability?: RuntimeCapabilityDeclaration;
89
+ };
90
+
28
91
  /**
29
92
  * A builder class for creating and configuring EcoPages application configuration.
30
93
  * Provides a fluent interface for setting various configuration options and managing
@@ -65,12 +128,6 @@ export class ConfigBuilder {
65
128
  componentsDir: 'components',
66
129
  layoutsDir: 'layouts',
67
130
  publicDir: 'public',
68
- includesTemplates: {
69
- head: 'head.ghtml.ts',
70
- html: 'html.ghtml.ts',
71
- seo: 'seo.ghtml.ts',
72
- },
73
- error404Template: '404.ghtml.ts',
74
131
  robotsTxt: {
75
132
  preferences: {
76
133
  '*': [],
@@ -78,7 +135,7 @@ export class ConfigBuilder {
78
135
  },
79
136
  integrations: [],
80
137
  integrationsDependencies: [],
81
- distDir: '.eco',
138
+ distDir: DEFAULT_ECOPAGES_DIST_DIR,
82
139
  defaultMetadata: {
83
140
  title: 'Ecopages',
84
141
  description: 'This is a static site generated with Ecopages',
@@ -89,6 +146,7 @@ export class ConfigBuilder {
89
146
  config: '',
90
147
  componentsDir: '',
91
148
  distDir: '',
149
+ workDir: '',
92
150
  includesDir: '',
93
151
  layoutsDir: '',
94
152
  pagesDir: '',
@@ -100,6 +158,7 @@ export class ConfigBuilder {
100
158
  },
101
159
  processors: new Map(),
102
160
  loaders: new Map(),
161
+ workDir: DEFAULT_ECOPAGES_WORK_DIR,
103
162
  };
104
163
 
105
164
  /**
@@ -198,29 +257,6 @@ export class ConfigBuilder {
198
257
  return this;
199
258
  }
200
259
 
201
- /**
202
- * Sets the templates used for includes.
203
- * These templates are used to build the HTML structure of pages.
204
- *
205
- * @param includesTemplates - An object containing the template file names
206
- * @returns The ConfigBuilder instance for method chaining
207
- */
208
- setIncludesTemplates(includesTemplates: IncludesTemplates): this {
209
- this.config.includesTemplates = includesTemplates;
210
- return this;
211
- }
212
-
213
- /**
214
- * Sets the template file for the 404 error page.
215
- *
216
- * @param error404Template - The file name of the 404 error template (default: '404.ghtml.ts')
217
- * @returns The ConfigBuilder instance for method chaining
218
- */
219
- setError404Template(error404Template: string): this {
220
- this.config.error404Template = error404Template;
221
- return this;
222
- }
223
-
224
260
  /**
225
261
  * Sets the robots.txt configuration.
226
262
  * This determines which paths are allowed/disallowed for search engines.
@@ -248,7 +284,7 @@ export class ConfigBuilder {
248
284
  /**
249
285
  * Sets the output directory for the built application.
250
286
  *
251
- * @param distDir - The distribution directory name (default: '.eco')
287
+ * @param distDir - The distribution directory name (default: 'dist')
252
288
  * @returns The ConfigBuilder instance for method chaining
253
289
  */
254
290
  setDistDir(distDir: string): this {
@@ -256,6 +292,22 @@ export class ConfigBuilder {
256
292
  return this;
257
293
  }
258
294
 
295
+ /**
296
+ * Sets the internal work directory for runtime-only artifacts.
297
+ *
298
+ * @remarks
299
+ * Use this when deployable output should stay clean while Ecopages still
300
+ * needs a separate workspace for server transpilation caches, runtime
301
+ * manifests, and other internal build products.
302
+ *
303
+ * @param workDir - The internal work directory name
304
+ * @returns The ConfigBuilder instance for method chaining
305
+ */
306
+ setWorkDir(workDir: string): this {
307
+ this.config.workDir = workDir;
308
+ return this;
309
+ }
310
+
259
311
  /**
260
312
  * Sets the default metadata for pages.
261
313
  * This is used when a page doesn't specify its own metadata.
@@ -360,40 +412,56 @@ export class ConfigBuilder {
360
412
  }
361
413
 
362
414
  private createAbsolutePaths(config: EcoPagesAppConfig): this {
363
- const {
364
- srcDir,
365
- componentsDir,
366
- includesDir,
367
- layoutsDir,
368
- pagesDir,
369
- publicDir,
370
- distDir,
371
- includesTemplates,
372
- error404Template,
373
- } = config;
415
+ const { srcDir, componentsDir, includesDir, layoutsDir, pagesDir, publicDir, distDir, workDir } = config;
374
416
 
375
417
  const projectDir = config.rootDir;
376
418
 
377
419
  const absoluteSrcDir = path.resolve(projectDir, srcDir);
378
420
  const absoluteDistDir = path.resolve(projectDir, distDir);
421
+ const absoluteWorkDir = path.resolve(projectDir, workDir);
422
+
423
+ const absoluteIncludesDir = path.join(absoluteSrcDir, includesDir);
424
+ const absolutePagesDir = path.join(absoluteSrcDir, pagesDir);
379
425
 
380
426
  this.config.absolutePaths = {
381
427
  config: path.join(projectDir, 'eco.config.ts'),
382
428
  projectDir: projectDir,
383
429
  srcDir: absoluteSrcDir,
384
430
  distDir: absoluteDistDir,
431
+ workDir: absoluteWorkDir,
385
432
  componentsDir: path.join(absoluteSrcDir, componentsDir),
386
- includesDir: path.join(absoluteSrcDir, includesDir),
433
+ includesDir: absoluteIncludesDir,
387
434
  layoutsDir: path.join(absoluteSrcDir, layoutsDir),
388
- pagesDir: path.join(absoluteSrcDir, pagesDir),
435
+ pagesDir: absolutePagesDir,
389
436
  publicDir: path.join(absoluteSrcDir, publicDir),
390
- htmlTemplatePath: path.join(absoluteSrcDir, includesDir, includesTemplates.html),
391
- error404TemplatePath: path.join(absoluteSrcDir, pagesDir, error404Template),
437
+ htmlTemplatePath: this.resolveSemanticTemplatePath({
438
+ dirPath: absoluteIncludesDir,
439
+ basename: 'html',
440
+ }),
441
+ error404TemplatePath: this.resolveSemanticTemplatePath({
442
+ dirPath: absolutePagesDir,
443
+ basename: '404',
444
+ }),
392
445
  };
393
446
 
394
447
  return this;
395
448
  }
396
449
 
450
+ private resolveSemanticTemplatePath({ dirPath, basename }: { dirPath: string; basename: 'html' | '404' }): string {
451
+ const extensions = this.config.templatesExt.length > 0 ? this.config.templatesExt : ['.ghtml.ts'];
452
+ const matches = extensions
453
+ .map((extension) => path.join(dirPath, `${basename}${extension}`))
454
+ .filter((candidate) => fileSystem.exists(candidate));
455
+
456
+ invariant(matches.length <= 1, CONFIG_BUILDER_ERRORS.duplicateSemanticTemplate(basename, matches));
457
+
458
+ if (matches.length === 1) {
459
+ return matches[0]!;
460
+ }
461
+
462
+ return path.join(dirPath, `${basename}${extensions[0]}`);
463
+ }
464
+
397
465
  private createIntegrationTemplatesExt(integrations: EcoPagesAppConfig['integrations']) {
398
466
  const integrationName = integrations.map((integration) => integration.name);
399
467
  const uniqueName = new Set(integrationName);
@@ -423,6 +491,154 @@ export class ConfigBuilder {
423
491
  }
424
492
  }
425
493
 
494
+ private validateRuntimeCapabilities(): void {
495
+ const runtimeEnvironment = this.detectRuntimeEnvironment();
496
+ const contributors: RuntimeCapabilityOwner[] = [
497
+ ...this.config.integrations.map((integration) => ({
498
+ kind: 'integration' as const,
499
+ name: integration.name,
500
+ runtimeCapability: integration.runtimeCapability,
501
+ })),
502
+ ...Array.from(this.config.processors.values(), (processor) => ({
503
+ kind: 'processor' as const,
504
+ name: processor.name,
505
+ runtimeCapability: processor.runtimeCapability,
506
+ })),
507
+ ];
508
+
509
+ for (const contributor of contributors) {
510
+ this.validateRuntimeCapability(contributor, runtimeEnvironment);
511
+ }
512
+ }
513
+
514
+ private validateRuntimeCapability(contributor: RuntimeCapabilityOwner, environment: RuntimeEnvironment): void {
515
+ const declaration = contributor.runtimeCapability;
516
+ if (!declaration) {
517
+ return;
518
+ }
519
+
520
+ for (const tag of declaration.tags) {
521
+ if (environment.supportedTags.has(tag)) {
522
+ continue;
523
+ }
524
+
525
+ throw new Error(
526
+ CONFIG_BUILDER_ERRORS.incompatibleRuntimeCapability(
527
+ contributor.kind,
528
+ contributor.name,
529
+ environment.runtime,
530
+ this.describeUnsupportedRuntimeTag(tag),
531
+ ),
532
+ );
533
+ }
534
+
535
+ if (!declaration.minRuntimeVersion) {
536
+ return;
537
+ }
538
+
539
+ const minVersion = this.parseVersion(declaration.minRuntimeVersion);
540
+ if (!minVersion) {
541
+ throw new Error(
542
+ CONFIG_BUILDER_ERRORS.invalidRuntimeVersion(
543
+ contributor.kind,
544
+ contributor.name,
545
+ declaration.minRuntimeVersion,
546
+ ),
547
+ );
548
+ }
549
+
550
+ const currentVersion = this.parseVersion(environment.version);
551
+ if (!currentVersion) {
552
+ return;
553
+ }
554
+
555
+ if (this.compareVersions(currentVersion, minVersion) >= 0) {
556
+ return;
557
+ }
558
+
559
+ throw new Error(
560
+ CONFIG_BUILDER_ERRORS.unsupportedRuntimeVersion(
561
+ contributor.kind,
562
+ contributor.name,
563
+ environment.runtime,
564
+ environment.version,
565
+ declaration.minRuntimeVersion,
566
+ ),
567
+ );
568
+ }
569
+
570
+ private detectRuntimeEnvironment(): RuntimeEnvironment {
571
+ const bunVersion = this.getBunVersion();
572
+ if (bunVersion) {
573
+ return {
574
+ runtime: 'bun',
575
+ version: bunVersion,
576
+ supportedTags: new Set<RuntimeCapabilityTag>([
577
+ 'bun-only',
578
+ 'node-compatible',
579
+ 'requires-native-bun-api',
580
+ 'requires-node-builtins',
581
+ ]),
582
+ };
583
+ }
584
+
585
+ return {
586
+ runtime: 'node',
587
+ version: process.versions.node,
588
+ supportedTags: new Set<RuntimeCapabilityTag>(['node-compatible', 'requires-node-builtins']),
589
+ };
590
+ }
591
+
592
+ private getBunVersion(): string | undefined {
593
+ const bun = globalThis as typeof globalThis & {
594
+ Bun?: {
595
+ version?: string;
596
+ };
597
+ };
598
+
599
+ return typeof bun.Bun?.version === 'string' ? bun.Bun.version : undefined;
600
+ }
601
+
602
+ private describeUnsupportedRuntimeTag(tag: RuntimeCapabilityTag): string {
603
+ switch (tag) {
604
+ case 'bun-only':
605
+ return 'it is Bun-only';
606
+ case 'requires-native-bun-api':
607
+ return 'it requires the native Bun API';
608
+ case 'requires-node-builtins':
609
+ return 'it requires Node builtins';
610
+ case 'node-compatible':
611
+ return 'it requires a Node-compatible runtime';
612
+ }
613
+ }
614
+
615
+ private parseVersion(version: string): number[] | undefined {
616
+ const normalized = version.trim().replace(/^v/i, '');
617
+ if (!/^\d+(?:\.\d+)*$/.test(normalized)) {
618
+ return undefined;
619
+ }
620
+
621
+ return normalized.split('.').map((segment) => Number(segment));
622
+ }
623
+
624
+ private compareVersions(left: number[], right: number[]): number {
625
+ const maxLength = Math.max(left.length, right.length);
626
+ for (let index = 0; index < maxLength; index += 1) {
627
+ const leftValue = left[index] ?? 0;
628
+ const rightValue = right[index] ?? 0;
629
+
630
+ if (leftValue > rightValue) {
631
+ return 1;
632
+ }
633
+
634
+ if (leftValue < rightValue) {
635
+ return -1;
636
+ }
637
+ }
638
+
639
+ return 0;
640
+ }
641
+
426
642
  /**
427
643
  * Initializes default loaders that are required for EcoPages to function.
428
644
  * This includes the eco-component-meta-plugin which auto-injects __eco metadata into component configs.
@@ -463,11 +679,27 @@ export class ConfigBuilder {
463
679
  this.config.integrations.push(ghtmlPlugin());
464
680
  }
465
681
 
466
- this.createAbsolutePaths(this.config);
467
682
  this.createIntegrationTemplatesExt(this.config.integrations);
683
+ this.createAbsolutePaths(this.config);
468
684
 
469
685
  await this.initializeDefaultLoaders();
470
686
  this.initializeProcessors();
687
+ this.validateRuntimeCapabilities();
688
+ const buildAdapter = createBuildAdapter();
689
+ setAppBuildAdapter(this.config, buildAdapter);
690
+ updateAppBuildManifest(this.config, await collectConfiguredAppBuildManifestContributions(this.config));
691
+ setAppServerInvalidationState(this.config, new CounterServerInvalidationState());
692
+ setAppEntrypointDependencyGraph(this.config, new NoopEntrypointDependencyGraph());
693
+ setAppRuntimeSpecifierRegistry(this.config, new InMemoryRuntimeSpecifierRegistry());
694
+ setAppBuildExecutor(
695
+ this.config,
696
+ createAppBuildExecutor({
697
+ development: false,
698
+ adapter: buildAdapter,
699
+ getPlugins: () => getAppServerBuildPlugins(this.config),
700
+ }),
701
+ );
702
+ setAppNodeRuntimeManifest(this.config, createNodeRuntimeManifest(this.config));
471
703
 
472
704
  return this.config;
473
705
  }
package/src/constants.ts CHANGED
@@ -37,3 +37,18 @@ export const GENERATED_BASE_PATHS = {
37
37
  export const DEFAULT_ECOPAGES_PORT = 3000;
38
38
 
39
39
  export const DEFAULT_ECOPAGES_HOSTNAME = 'localhost';
40
+
41
+ /**
42
+ * Default directory used for deployable output.
43
+ */
44
+ export const DEFAULT_ECOPAGES_DIST_DIR = 'dist';
45
+
46
+ /**
47
+ * Default internal working directory used for runtime-only artifacts.
48
+ *
49
+ * @remarks
50
+ * This directory is a local tool workspace and is not intended for deployment.
51
+ * It owns transpiled server modules, runtime manifests, and processor caches
52
+ * so the export directory can remain a clean deployable tree.
53
+ */
54
+ export const DEFAULT_ECOPAGES_WORK_DIR = '.eco';
@@ -1,22 +1,27 @@
1
1
  import type { EcoPagesAppConfig } from './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
 
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