@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
@@ -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
 
@@ -209,11 +246,6 @@ export interface IHmrManager {
209
246
  */
210
247
  isEnabled(): boolean;
211
248
 
212
- /**
213
- * Returns true when a changed file matches a non-fallback HMR strategy.
214
- */
215
- canHandleFileChange(path: string): boolean;
216
-
217
249
  /**
218
250
  * Broadcasts an HMR event to connected clients.
219
251
  */
@@ -230,7 +262,7 @@ export interface IHmrManager {
230
262
  getWatchedFiles(): Map<string, string>;
231
263
 
232
264
  /**
233
- * Gets the specifier map.
265
+ * Gets the registered bare-specifier map.
234
266
  */
235
267
  getSpecifierMap(): Map<string, string>;
236
268
 
@@ -332,7 +364,7 @@ export type EcoComponentConfig = {
332
364
  * MyPage.config = { layout: Layout };
333
365
  * ```
334
366
  */
335
- layout?: EcoComponent;
367
+ layout?: EcoPageLayoutComponent<any>;
336
368
  dependencies?: EcoComponentDependencies;
337
369
  /**
338
370
  * Internal: Resolved lazy scripts grouped by trigger.
@@ -455,6 +487,13 @@ export interface PageHeadProps<T = EcoPagesElement> {
455
487
  children?: T;
456
488
  }
457
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
+
458
497
  /**
459
498
  * Represents the props for the HTML template of a page.
460
499
  */
@@ -465,6 +504,24 @@ export interface HtmlTemplateProps extends PageHeadProps {
465
504
  pageProps: Record<string, unknown>;
466
505
  }
467
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
+
468
525
  /**
469
526
  * Represents the props for the error 404 template.
470
527
  */
@@ -688,9 +745,9 @@ type StylesheetContentIntegrationPluginDependencies = {
688
745
  export type IntegrationRendererRenderOptions<C = EcoPagesElement> = RouteRendererOptions & {
689
746
  props?: Record<string, unknown>;
690
747
  metadata: PageMetadataProps;
691
- HtmlTemplate: EcoComponent<HtmlTemplateProps, C>;
748
+ HtmlTemplate: EcoHtmlComponent<C>;
692
749
  Page: EcoComponent<PageProps, C>;
693
- Layout?: EcoComponent;
750
+ Layout?: EcoPageLayoutComponent<any>;
694
751
  dependencies?: EcoComponentDependencies;
695
752
  resolvedDependencies: ProcessedAsset[];
696
753
  componentRender?: ComponentRenderResult;
@@ -767,7 +824,7 @@ export interface RenderContext {
767
824
  * @param props - Props to pass to the view
768
825
  * @param options - Optional status code and headers
769
826
  */
770
- 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>;
771
828
 
772
829
  /**
773
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
+ });