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

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 +180 -47
  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 +207 -97
  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 +234 -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 -84
  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 +71 -78
  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 -11
  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 -0
  185. package/src/watchers/project-watcher.test.ts +678 -0
  186. package/src/watchers/project-watcher.ts +49 -50
  187. package/CHANGELOG.md +0 -94
  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 -79
  202. package/src/adapters/bun/hmr-manager.js +0 -222
  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 -62
  218. package/src/adapters/node/node-hmr-manager.js +0 -221
  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 -75
  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 -391
  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 -192
  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 -1094
  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 -132
  409. package/src/watchers/project-watcher.js +0 -281
  410. package/src/watchers/project-watcher.test-helpers.d.ts +0 -4
  411. package/src/watchers/project-watcher.test-helpers.js +0 -51
  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
@@ -0,0 +1,148 @@
1
+ import { afterAll, beforeEach, describe, expect, test } from 'vitest';
2
+ import fs from 'node:fs';
3
+ import path from 'node:path';
4
+ import type { EcoBuildPlugin } from '../build/build-types.ts';
5
+ import type { EcoPagesAppConfig } from '../internal-types';
6
+ import { Processor, type ProcessorConfig } from './processor.ts';
7
+
8
+ class TestProcessor extends Processor {
9
+ override buildPlugins?: EcoBuildPlugin[] = [];
10
+ override plugins?: EcoBuildPlugin[] = [];
11
+
12
+ override async setup(): Promise<void> {}
13
+
14
+ override async process(input: unknown, _filePath?: string): Promise<unknown> {
15
+ return input;
16
+ }
17
+
18
+ override async teardown(): Promise<void> {}
19
+ }
20
+
21
+ describe('Processor', () => {
22
+ let processor: TestProcessor;
23
+ let config: ProcessorConfig;
24
+ let appConfig: EcoPagesAppConfig;
25
+
26
+ beforeEach(() => {
27
+ config = {
28
+ name: 'test-processor',
29
+ options: { test: true },
30
+ watch: {
31
+ paths: ['/test'],
32
+ },
33
+ };
34
+
35
+ const testRoot = path.join(process.cwd(), '.test-tmp', 'processor-test');
36
+
37
+ if (fs.existsSync(testRoot)) {
38
+ fs.rmSync(testRoot, { recursive: true, force: true });
39
+ }
40
+
41
+ appConfig = {
42
+ rootDir: testRoot,
43
+ absolutePaths: {
44
+ srcDir: path.join(testRoot, 'src'),
45
+ distDir: path.join(testRoot, 'dist'),
46
+ },
47
+ } as EcoPagesAppConfig;
48
+
49
+ processor = new TestProcessor(config);
50
+ processor.setContext(appConfig);
51
+ });
52
+
53
+ afterAll(() => {
54
+ fs.rmSync(path.join(process.cwd(), '.test-tmp'), { recursive: true, force: true });
55
+ });
56
+
57
+ test('should initialize with correct name', () => {
58
+ expect(processor.getName()).toBe('test-processor');
59
+ });
60
+
61
+ test('should retain runtime capability declarations', () => {
62
+ const runtimeProcessor = new TestProcessor({
63
+ name: 'runtime-processor',
64
+ runtimeCapability: {
65
+ tags: ['requires-node-builtins'],
66
+ minRuntimeVersion: '18.0.0',
67
+ },
68
+ });
69
+
70
+ expect(runtimeProcessor.runtimeCapability).toEqual({
71
+ tags: ['requires-node-builtins'],
72
+ minRuntimeVersion: '18.0.0',
73
+ });
74
+ });
75
+
76
+ test('should return watch config', () => {
77
+ expect(processor.getWatchConfig()).toEqual({
78
+ paths: ['/test'],
79
+ });
80
+ });
81
+ });
82
+
83
+ describe('Processor capability matching', () => {
84
+ test('matches all extensions with * pattern', () => {
85
+ const processor = new TestProcessor({
86
+ name: 'wildcard-all',
87
+ capabilities: [{ kind: 'stylesheet', extensions: ['*'] }],
88
+ });
89
+
90
+ expect(processor.canProcessAsset('stylesheet', '/src/styles/app.css')).toBe(true);
91
+ expect(processor.canProcessAsset('stylesheet', '/src/styles/app.scss')).toBe(true);
92
+ });
93
+
94
+ test('matches explicit *.ext patterns', () => {
95
+ const processor = new TestProcessor({
96
+ name: 'wildcard-explicit',
97
+ capabilities: [{ kind: 'stylesheet', extensions: ['*.css'] }],
98
+ });
99
+
100
+ expect(processor.canProcessAsset('stylesheet', '/src/styles/app.css')).toBe(true);
101
+ expect(processor.canProcessAsset('stylesheet', '/src/styles/app.scss')).toBe(false);
102
+ });
103
+
104
+ test('matches grouped extension patterns', () => {
105
+ const processor = new TestProcessor({
106
+ name: 'wildcard-group',
107
+ capabilities: [{ kind: 'stylesheet', extensions: ['*.{css,scss,sass}'] }],
108
+ });
109
+
110
+ expect(processor.canProcessAsset('stylesheet', '/src/styles/app.css')).toBe(true);
111
+ expect(processor.canProcessAsset('stylesheet', '/src/styles/app.scss')).toBe(true);
112
+ expect(processor.canProcessAsset('stylesheet', '/src/styles/app.sass')).toBe(true);
113
+ expect(processor.canProcessAsset('stylesheet', '/src/styles/app.less')).toBe(false);
114
+ });
115
+
116
+ test('matches grouped patterns with mixed case and spacing', () => {
117
+ const processor = new TestProcessor({
118
+ name: 'wildcard-group-normalized',
119
+ capabilities: [{ kind: 'stylesheet', extensions: ['*.{ CSS, ScSs , .SASS }'] }],
120
+ });
121
+
122
+ expect(processor.canProcessAsset('stylesheet', '/src/styles/app.css')).toBe(true);
123
+ expect(processor.canProcessAsset('stylesheet', '/src/styles/app.scss')).toBe(true);
124
+ expect(processor.canProcessAsset('stylesheet', '/src/styles/app.sass')).toBe(true);
125
+ expect(processor.canProcessAsset('stylesheet', '/src/styles/app.less')).toBe(false);
126
+ });
127
+
128
+ test('matches plain extension and dotted extension forms', () => {
129
+ const processor = new TestProcessor({
130
+ name: 'plain-ext',
131
+ capabilities: [{ kind: 'stylesheet', extensions: ['css', '.scss'] }],
132
+ });
133
+
134
+ expect(processor.canProcessAsset('stylesheet', '/src/styles/app.css')).toBe(true);
135
+ expect(processor.canProcessAsset('stylesheet', '/src/styles/app.scss')).toBe(true);
136
+ expect(processor.canProcessAsset('stylesheet', '/src/styles/app.sass')).toBe(false);
137
+ });
138
+
139
+ test('respects capability kind filtering', () => {
140
+ const processor = new TestProcessor({
141
+ name: 'kind-filter',
142
+ capabilities: [{ kind: 'image', extensions: ['*.png'] }],
143
+ });
144
+
145
+ expect(processor.canProcessAsset('stylesheet', '/src/styles/app.css')).toBe(false);
146
+ expect(processor.canProcessAsset('image', '/src/assets/logo.png')).toBe(true);
147
+ });
148
+ });
@@ -2,8 +2,12 @@ import path from 'node:path';
2
2
  import { fileSystem } from '@ecopages/file-system';
3
3
  import type { EcoBuildPlugin } from '../build/build-types.ts';
4
4
  import type { EcoPagesAppConfig, IClientBridge } from '../internal-types';
5
- import type { AssetDefinition } from '../services/asset-processing-service';
5
+ import type { AssetDefinition } from '../services/assets/asset-processing-service';
6
+ import { DEFAULT_ECOPAGES_WORK_DIR } from '../constants.ts';
6
7
  import { GENERATED_BASE_PATHS } from '../constants';
8
+ import type { RuntimeCapabilityDeclaration } from './runtime-capability.ts';
9
+
10
+ export type { RuntimeCapabilityDeclaration, RuntimeCapabilityTag } from './runtime-capability.ts';
7
11
 
8
12
  export const PROCESSOR_ERRORS = {
9
13
  CACHE_DIRECTORY_NOT_SET: 'Cache directory not set in context',
@@ -56,6 +60,7 @@ export interface ProcessorConfig<TOptions = Record<string, unknown>> {
56
60
  options?: TOptions;
57
61
  watch?: ProcessorWatchConfig;
58
62
  capabilities?: ProcessorAssetCapability[];
63
+ runtimeCapability?: RuntimeCapabilityDeclaration;
59
64
  }
60
65
  export interface ProcessorContext {
61
66
  config: EcoPagesAppConfig;
@@ -78,6 +83,7 @@ export abstract class Processor<TOptions = Record<string, unknown>> {
78
83
  protected options?: TOptions;
79
84
  protected watchConfig?: ProcessorWatchConfig;
80
85
  protected capabilities: ProcessorAssetCapability[] = [];
86
+ readonly runtimeCapability?: RuntimeCapabilityDeclaration;
81
87
 
82
88
  /** Plugins that are only used during the build process */
83
89
  abstract buildPlugins?: EcoBuildPlugin[];
@@ -90,11 +96,15 @@ export abstract class Processor<TOptions = Record<string, unknown>> {
90
96
  this.options = config.options;
91
97
  this.watchConfig = config.watch;
92
98
  this.capabilities = config.capabilities ?? [];
99
+ this.runtimeCapability = config.runtimeCapability;
93
100
  }
94
101
 
95
102
  setContext(appConfig: EcoPagesAppConfig): void {
103
+ const workDir =
104
+ appConfig.absolutePaths.workDir ??
105
+ path.join(appConfig.rootDir, appConfig.workDir ?? DEFAULT_ECOPAGES_WORK_DIR);
96
106
  const cachePath = resolveGeneratedPath('cache', {
97
- root: appConfig.absolutePaths.distDir,
107
+ root: workDir,
98
108
  module: this.name,
99
109
  });
100
110
 
@@ -109,6 +119,16 @@ export abstract class Processor<TOptions = Record<string, unknown>> {
109
119
  };
110
120
  }
111
121
 
122
+ /**
123
+ * Prepares build-facing processor contributions before config finalization.
124
+ *
125
+ * @remarks
126
+ * Override this when a processor must compute runtime/build plugins or other
127
+ * manifest-owned state before startup. Runtime-only work such as cache
128
+ * warming or watcher registration should stay in `setup()`.
129
+ */
130
+ async prepareBuildContributions(): Promise<void> {}
131
+
112
132
  abstract setup(): Promise<void>;
113
133
  abstract teardown(): Promise<void>;
114
134
  abstract process(input: unknown, filePath?: string): Promise<unknown>;
@@ -0,0 +1,14 @@
1
+ export type RuntimeCapabilityTag =
2
+ | 'bun-only'
3
+ | 'node-compatible'
4
+ | 'requires-native-bun-api'
5
+ | 'requires-node-builtins';
6
+
7
+ /**
8
+ * Declares the runtime assumptions a plugin makes so config finalization can
9
+ * reject incompatible startup environments before bootstrapping the app.
10
+ */
11
+ export interface RuntimeCapabilityDeclaration {
12
+ tags: RuntimeCapabilityTag[];
13
+ minRuntimeVersion?: string;
14
+ }
@@ -1,14 +1,18 @@
1
1
  import type { Readable } from 'node:stream';
2
- import type { ApiResponseBuilder } from './adapters/shared/api-response.js';
2
+ import type { ApiResponseBuilder } from './adapters/shared/api-response.ts';
3
+ import type { BuildExecutor } from './build/build-adapter.ts';
3
4
  import type { EcoBuildPlugin } from './build/build-types.ts';
4
5
  import type { EcoPageComponent } from './eco/eco.types.ts';
5
6
  import type { EcoPagesAppConfig } from './internal-types.ts';
6
7
  import type { HmrStrategy } from './hmr/hmr-strategy.ts';
7
- import type { ProcessedAsset } from './services/asset-processing-service/assets.types.ts';
8
+ import type { BrowserBundleExecutor } from './services/assets/browser-bundle.service.ts';
9
+ import type { ProcessedAsset } from './services/assets/asset-processing-service/assets.types.ts';
8
10
  import type { CacheStats, CacheStrategy } from './services/cache/cache.types.ts';
9
11
  import type { InteractionEventsString as ScriptsInjectorInteractionEventsString } from '@ecopages/scripts-injector/types';
10
12
 
11
13
  export type { EcoPageComponent } from './eco/eco.types.ts';
14
+ export type { MarkerGraphContext } from './route-renderer/component-graph/marker-graph-resolver.ts';
15
+ export type { ProcessedAsset } from './services/assets/asset-processing-service/assets.types.ts';
12
16
 
13
17
  import type {
14
18
  StandardSchema,
@@ -98,7 +102,7 @@ export interface CacheInvalidator {
98
102
 
99
103
  /**
100
104
  * Context interface for HMR strategies.
101
- * Provides access to watched files, specifier mappings, and build configuration.
105
+ * Provides access to watched files, registered bare-specifier mappings, and build configuration.
102
106
  */
103
107
  export interface DefaultHmrContext {
104
108
  /**
@@ -107,7 +111,7 @@ export interface DefaultHmrContext {
107
111
  getWatchedFiles(): Map<string, string>;
108
112
 
109
113
  /**
110
- * Map of bare specifiers to vendor URLs for import resolution.
114
+ * Map of bare specifiers to runtime URLs for browser import resolution.
111
115
  */
112
116
  getSpecifierMap(): Map<string, string>;
113
117
 
@@ -137,6 +141,20 @@ export interface DefaultHmrContext {
137
141
  * Used by plugins to identify page files for transformation.
138
142
  */
139
143
  getPagesDir(): string;
144
+
145
+ /**
146
+ * Build executor owned by the active app/runtime.
147
+ */
148
+ getBuildExecutor(): BuildExecutor;
149
+
150
+ /**
151
+ * Browser bundler owned by the active app/runtime.
152
+ */
153
+ getBrowserBundleService(): BrowserBundleExecutor;
154
+ /**
155
+ * Server-side module loader owned by the active app/runtime.
156
+ */
157
+ importServerModule<T = unknown>(filePath: string): Promise<T>;
140
158
  }
141
159
 
142
160
  /**
@@ -180,12 +198,31 @@ export interface IClientBridge {
180
198
  */
181
199
  export interface IHmrManager {
182
200
  /**
183
- * Registers a client entrypoint to be built and watched.
201
+ * Registers an integration-owned client entrypoint to be built and watched.
202
+ *
203
+ * @remarks
204
+ * This path is strict: the owning integration must emit the expected `_hmr`
205
+ * bundle. Missing output is treated as a development pipeline failure.
184
206
  */
185
207
  registerEntrypoint(entrypointPath: string): Promise<string>;
186
208
 
187
209
  /**
188
- * Registers mappings from bare specifiers to vendor URLs.
210
+ * Registers a generic script asset entrypoint to be built and watched.
211
+ *
212
+ * @remarks
213
+ * This path exists for non-page script assets that are not owned by a
214
+ * framework integration. Unlike `registerEntrypoint()`, it may use the generic
215
+ * script bundling path.
216
+ */
217
+ registerScriptEntrypoint(entrypointPath: string): Promise<string>;
218
+
219
+ /**
220
+ * Registers mappings from bare specifiers to runtime URLs.
221
+ *
222
+ * @remarks
223
+ * This is the shared registration seam for integration-owned runtime alias
224
+ * maps. The registry may later back a broader import-map-style facility, but
225
+ * the mappings themselves remain integration-owned.
189
226
  */
190
227
  registerSpecifierMap(map: Record<string, string>): void;
191
228
 
@@ -225,7 +262,7 @@ export interface IHmrManager {
225
262
  getWatchedFiles(): Map<string, string>;
226
263
 
227
264
  /**
228
- * Gets the specifier map.
265
+ * Gets the registered bare-specifier map.
229
266
  */
230
267
  getSpecifierMap(): Map<string, string>;
231
268
 
@@ -327,7 +364,7 @@ export type EcoComponentConfig = {
327
364
  * MyPage.config = { layout: Layout };
328
365
  * ```
329
366
  */
330
- layout?: EcoComponent;
367
+ layout?: EcoPageLayoutComponent<any>;
331
368
  dependencies?: EcoComponentDependencies;
332
369
  /**
333
370
  * Internal: Resolved lazy scripts grouped by trigger.
@@ -450,6 +487,13 @@ export interface PageHeadProps<T = EcoPagesElement> {
450
487
  children?: T;
451
488
  }
452
489
 
490
+ /**
491
+ * Represents the props for a route layout.
492
+ */
493
+ export interface LayoutProps<T = EcoPagesElement> extends Partial<RequestPageContext> {
494
+ children: T;
495
+ }
496
+
453
497
  /**
454
498
  * Represents the props for the HTML template of a page.
455
499
  */
@@ -460,6 +504,24 @@ export interface HtmlTemplateProps extends PageHeadProps {
460
504
  pageProps: Record<string, unknown>;
461
505
  }
462
506
 
507
+ /**
508
+ * Layout components accepted by pages.
509
+ *
510
+ * This preserves compatibility with existing `eco.component()` layouts while
511
+ * also supporting semantic `eco.layout()` declarations.
512
+ */
513
+ export type EcoPageLayoutComponent<T = EcoPagesElement> = EcoLayoutComponent<T> | EcoComponent<any, T>;
514
+
515
+ /**
516
+ * Represents a layout component created with eco.layout().
517
+ */
518
+ export type EcoLayoutComponent<T = EcoPagesElement> = EcoComponent<LayoutProps<T>, T>;
519
+
520
+ /**
521
+ * Represents an HTML shell component created with eco.html().
522
+ */
523
+ export type EcoHtmlComponent<T = EcoPagesElement> = EcoComponent<HtmlTemplateProps, T>;
524
+
463
525
  /**
464
526
  * Represents the props for the error 404 template.
465
527
  */
@@ -683,9 +745,9 @@ type StylesheetContentIntegrationPluginDependencies = {
683
745
  export type IntegrationRendererRenderOptions<C = EcoPagesElement> = RouteRendererOptions & {
684
746
  props?: Record<string, unknown>;
685
747
  metadata: PageMetadataProps;
686
- HtmlTemplate: EcoComponent<HtmlTemplateProps, C>;
748
+ HtmlTemplate: EcoHtmlComponent<C>;
687
749
  Page: EcoComponent<PageProps, C>;
688
- Layout?: EcoComponent;
750
+ Layout?: EcoPageLayoutComponent<any>;
689
751
  dependencies?: EcoComponentDependencies;
690
752
  resolvedDependencies: ProcessedAsset[];
691
753
  componentRender?: ComponentRenderResult;
@@ -762,7 +824,7 @@ export interface RenderContext {
762
824
  * @param props - Props to pass to the view
763
825
  * @param options - Optional status code and headers
764
826
  */
765
- render<P = Record<string, unknown>>(view: EcoComponent<P>, props: P, options?: RenderOptions): Promise<Response>;
827
+ render<P = Record<string, unknown>>(view: EcoComponent<P>, props?: P, options?: RenderOptions): Promise<Response>;
766
828
 
767
829
  /**
768
830
  * Render an eco.page view without layout (for partials/fragments).
@@ -136,7 +136,7 @@ flowchart TD
136
136
  K -- Yes --> L[buildGlobalInjectorAssets]
137
137
  K -- No --> M[continue]
138
138
  L --> M
139
- M --> N[HtmlPostProcessingService dedupeProcessedAssets]
139
+ M --> N[HtmlTransformerService dedupeProcessedAssets]
140
140
  N --> O[htmlTransformer setProcessedDependencies]
141
141
  O --> P[return normalized render options]
142
142
  ```
@@ -155,11 +155,11 @@ flowchart TD
155
155
  F --> G{contains eco marker token?}
156
156
  G -- Yes --> H[resolveMarkerGraphHtml]
157
157
  G -- No --> I[skip graph resolution]
158
- H --> J[HtmlPostProcessingService dedupeProcessedAssets]
158
+ H --> J[HtmlTransformerService dedupeProcessedAssets]
159
159
  J --> K[merge marker assets into transformer deps]
160
160
  I --> L{root attributes attachable?}
161
161
  K --> L
162
- L -- Yes --> M[HtmlPostProcessingService applyAttributesToFirstBodyElement]
162
+ L -- Yes --> M[HtmlTransformerService applyAttributesToFirstBodyElement]
163
163
  L -- No --> N[leave html unchanged]
164
164
  M --> O[htmlTransformer transform]
165
165
  N --> O
@@ -190,16 +190,14 @@ flowchart LR
190
190
  A[IntegrationRenderer] --> B[RenderPreparationService]
191
191
  A --> C[RenderExecutionService]
192
192
  A --> D[MarkerGraphResolver]
193
- A --> E[HtmlPostProcessingService]
194
193
  A --> F[PageModuleLoaderService]
195
194
  A --> G[DependencyResolverService]
196
195
  A --> H[HtmlTransformerService]
197
196
 
198
197
  B --> F
199
198
  B --> G
200
- B --> E
199
+ B --> H
201
200
  C --> D
202
- C --> E
203
201
  C --> H
204
202
  ```
205
203
 
@@ -348,7 +346,7 @@ For someone new to the rendering system, this is probably the most useful order
348
346
  7. `render-preparation.service.ts`
349
347
  8. `render-execution.service.ts`
350
348
  9. `marker-graph-resolver.ts`
351
- 10. `html-post-processing.service.ts`
349
+ 10. `html-transformer.service.ts`
352
350
  11. `page-module-loader.ts`
353
351
  12. `dependency-resolver.ts`
354
352
  13. `component-marker.ts`
@@ -356,7 +354,6 @@ For someone new to the rendering system, this is probably the most useful order
356
354
  15. `component-graph-executor.ts`
357
355
  16. `eco.ts`
358
356
  17. `component-render-context.ts`
359
- 18. `html-transformer.service.ts`
360
357
 
361
358
  ## 9) Key Files
362
359
 
@@ -368,18 +365,17 @@ For someone new to the rendering system, this is probably the most useful order
368
365
  - `packages/core/src/adapters/shared/explicit-static-route-matcher.ts`
369
366
  - `packages/core/src/adapters/shared/render-context.ts`
370
367
  - `packages/core/src/route-renderer/route-renderer.ts`
371
- - `packages/core/src/route-renderer/integration-renderer.ts`
372
- - `packages/core/src/route-renderer/render-preparation.service.ts`
373
- - `packages/core/src/route-renderer/render-execution.service.ts`
374
- - `packages/core/src/route-renderer/html-post-processing.service.ts`
375
- - `packages/core/src/route-renderer/marker-graph-resolver.ts`
376
- - `packages/core/src/route-renderer/component-marker.ts`
377
- - `packages/core/src/route-renderer/component-graph.ts`
378
- - `packages/core/src/route-renderer/component-graph-executor.ts`
379
- - `packages/core/src/route-renderer/page-module-loader.ts`
380
- - `packages/core/src/route-renderer/dependency-resolver.ts`
381
- - `packages/core/src/services/page-module-import.service.ts`
382
- - `packages/core/src/services/page-request-cache-coordinator.service.ts`
368
+ - `packages/core/src/route-renderer/orchestration/integration-renderer.ts`
369
+ - `packages/core/src/route-renderer/orchestration/render-preparation.service.ts`
370
+ - `packages/core/src/route-renderer/orchestration/render-execution.service.ts`
371
+ - `packages/core/src/route-renderer/component-graph/marker-graph-resolver.ts`
372
+ - `packages/core/src/route-renderer/component-graph/component-marker.ts`
373
+ - `packages/core/src/route-renderer/component-graph/component-graph.ts`
374
+ - `packages/core/src/route-renderer/component-graph/component-graph-executor.ts`
375
+ - `packages/core/src/route-renderer/page-loading/page-module-loader.ts`
376
+ - `packages/core/src/route-renderer/page-loading/dependency-resolver.ts`
377
+ - `packages/core/src/services/module-loading/page-module-import.service.ts`
378
+ - `packages/core/src/services/cache/page-request-cache-coordinator.service.ts`
383
379
  - `packages/core/src/eco/component-render-context.ts`
384
380
  - `packages/core/src/eco/eco.ts`
385
381
  - `packages/core/src/services/html-transformer.service.ts`
@@ -19,15 +19,13 @@ The route renderer layer is responsible for:
19
19
  - `RouteRendererFactory` chooses integration renderers based on route file extension.
20
20
  - `RouteRenderer` delegates route execution to the selected integration renderer.
21
21
 
22
- ### `integration-renderer.ts`
22
+ ### `orchestration/`
23
23
 
24
- Abstract base class that coordinates end-to-end route rendering:
24
+ Framework-owned orchestration services and renderer base class:
25
25
 
26
- 1. Resolve page module and page data.
27
- 2. Resolve and process component dependencies.
28
- 3. Add route-level assets and orchestration assets.
29
- 4. Render HTML via integration-specific `render()`.
30
- 5. Inject processed assets into final HTML through `HtmlTransformerService`.
26
+ - `integration-renderer.ts`: abstract base class that coordinates end-to-end route rendering.
27
+ - `render-preparation.service.ts`: page module/data/dependency preparation before render.
28
+ - `render-execution.service.ts`: render capture, marker-graph resolution, and finalization.
31
29
 
32
30
  It also provides:
33
31
 
@@ -35,26 +33,17 @@ It also provides:
35
33
  - `renderComponent()` contract for component-level orchestration and artifact reporting.
36
34
  - marker graph resolution for nested cross-integration component boundaries.
37
35
 
38
- ### `component-marker.ts`
36
+ ### `component-graph/`
39
37
 
40
- Defines marker token contract for component-level orchestration:
38
+ Component marker contracts and graph resolution:
41
39
 
42
40
  - `createComponentMarker()` for canonical `<eco-marker ...></eco-marker>` generation.
43
41
  - `parseComponentMarkers()` for marker extraction from rendered HTML.
44
-
45
- ### `component-graph.ts`
46
-
47
- Builds a deterministic DAG from marker nodes:
48
-
49
42
  - node collection by marker id.
50
43
  - parent/child edges from slot reference registry.
51
44
  - topological levels for bottom-up execution.
52
45
 
53
- ### `component-graph-executor.ts`
54
-
55
- Resolves graph levels in reverse order (leaf to root) and replaces markers with rendered HTML via integration `renderComponent()`.
56
-
57
- ### `page-module-loader.ts`
46
+ ### `page-loading/`
58
47
 
59
48
  Service for loading page modules and deriving page data:
60
49
 
@@ -62,8 +51,6 @@ Service for loading page modules and deriving page data:
62
51
  - `resolvePageModule()` normalizes exports and statics.
63
52
  - `resolvePageData()` resolves static props then metadata.
64
53
 
65
- ### `dependency-resolver.ts`
66
-
67
54
  Builds processed assets from component dependency declarations:
68
55
 
69
56
  - Scripts/styles/components/modules.
@@ -0,0 +1,41 @@
1
+ import { describe, expect, it } from 'vitest';
2
+ import { createComponentMarker } from './component-marker.ts';
3
+ import { extractComponentGraph } from './component-graph.ts';
4
+ import { resolveComponentGraph } from './component-graph-executor.ts';
5
+
6
+ describe('component graph executor', () => {
7
+ it('resolves markers bottom-up using graph levels', async () => {
8
+ const html = [
9
+ '<main>',
10
+ createComponentMarker({
11
+ nodeId: 'n_1',
12
+ integration: 'lit',
13
+ componentRef: 'c_parent',
14
+ propsRef: 'p_parent',
15
+ slotRef: 's_parent',
16
+ }),
17
+ createComponentMarker({
18
+ nodeId: 'n_2',
19
+ integration: 'react',
20
+ componentRef: 'c_child',
21
+ propsRef: 'p_child',
22
+ }),
23
+ '</main>',
24
+ ].join('');
25
+
26
+ const graph = extractComponentGraph(html, {
27
+ s_parent: ['n_2'],
28
+ });
29
+
30
+ const resolved = await resolveComponentGraph(html, graph, async (marker) => {
31
+ if (marker.nodeId === 'n_2') {
32
+ return { html: '<section>child</section>' };
33
+ }
34
+ return { html: '<article>parent</article>' };
35
+ });
36
+
37
+ expect(resolved).toContain('<article>parent</article>');
38
+ expect(resolved).toContain('<section>child</section>');
39
+ expect(resolved).not.toContain('<eco-marker');
40
+ });
41
+ });
@@ -0,0 +1,63 @@
1
+ import { describe, expect, it } from 'vitest';
2
+ import { createComponentMarker } from './component-marker.ts';
3
+ import { extractComponentGraph } from './component-graph.ts';
4
+
5
+ describe('component graph extraction', () => {
6
+ it('extracts nodes in deterministic order without slot links', () => {
7
+ const html = [
8
+ createComponentMarker({ nodeId: 'n_1', integration: 'lit', componentRef: 'c_1', propsRef: 'p_1' }),
9
+ createComponentMarker({ nodeId: 'n_2', integration: 'react', componentRef: 'c_2', propsRef: 'p_2' }),
10
+ ].join('');
11
+
12
+ const graph = extractComponentGraph(html);
13
+ expect([...graph.nodes.keys()]).toEqual(['n_1', 'n_2']);
14
+ expect(graph.levels).toEqual([['n_1', 'n_2']]);
15
+ });
16
+
17
+ it('builds parent child edges from slot registry', () => {
18
+ const html = [
19
+ createComponentMarker({
20
+ nodeId: 'n_1',
21
+ integration: 'lit',
22
+ componentRef: 'c_1',
23
+ propsRef: 'p_1',
24
+ slotRef: 's_1',
25
+ }),
26
+ createComponentMarker({ nodeId: 'n_2', integration: 'react', componentRef: 'c_2', propsRef: 'p_2' }),
27
+ ].join('');
28
+
29
+ const graph = extractComponentGraph(html, {
30
+ s_1: ['n_2'],
31
+ });
32
+
33
+ expect(graph.edges.get('n_1')).toEqual(new Set(['n_2']));
34
+ expect(graph.reverseEdges.get('n_2')).toEqual(new Set(['n_1']));
35
+ expect(graph.levels).toEqual([['n_1'], ['n_2']]);
36
+ });
37
+
38
+ it('throws when slot links create cycles', () => {
39
+ const html = [
40
+ createComponentMarker({
41
+ nodeId: 'n_1',
42
+ integration: 'lit',
43
+ componentRef: 'c_1',
44
+ propsRef: 'p_1',
45
+ slotRef: 's_1',
46
+ }),
47
+ createComponentMarker({
48
+ nodeId: 'n_2',
49
+ integration: 'react',
50
+ componentRef: 'c_2',
51
+ propsRef: 'p_2',
52
+ slotRef: 's_2',
53
+ }),
54
+ ].join('');
55
+
56
+ expect(() =>
57
+ extractComponentGraph(html, {
58
+ s_1: ['n_2'],
59
+ s_2: ['n_1'],
60
+ }),
61
+ ).toThrow('Component marker graph contains a cycle');
62
+ });
63
+ });