@ecopages/core 0.2.0-alpha.1 → 0.2.0-alpha.10

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 (323) hide show
  1. package/CHANGELOG.md +13 -70
  2. package/README.md +213 -12
  3. package/package.json +50 -18
  4. package/src/adapters/README.md +39 -0
  5. package/src/adapters/bun/hmr-manager.d.ts +77 -18
  6. package/src/adapters/bun/hmr-manager.js +159 -52
  7. package/src/adapters/bun/index.d.ts +1 -2
  8. package/src/adapters/bun/index.js +1 -1
  9. package/src/adapters/bun/server-adapter.js +35 -30
  10. package/src/adapters/bun/server-lifecycle.d.ts +24 -13
  11. package/src/adapters/bun/server-lifecycle.js +32 -60
  12. package/src/adapters/index.d.ts +1 -1
  13. package/src/adapters/index.js +1 -1
  14. package/src/adapters/node/bootstrap-dependency-resolver.d.ts +44 -0
  15. package/src/adapters/node/bootstrap-dependency-resolver.js +172 -0
  16. package/src/adapters/node/index.d.ts +2 -0
  17. package/src/adapters/node/index.js +3 -0
  18. package/src/adapters/node/node-hmr-manager.d.ts +87 -16
  19. package/src/adapters/node/node-hmr-manager.js +179 -88
  20. package/src/adapters/node/runtime-adapter.d.ts +46 -0
  21. package/src/adapters/node/runtime-adapter.js +306 -0
  22. package/src/adapters/node/server-adapter.d.ts +2 -31
  23. package/src/adapters/node/server-adapter.js +31 -93
  24. package/src/adapters/node/static-content-server.d.ts +36 -0
  25. package/src/adapters/node/static-content-server.js +28 -0
  26. package/src/adapters/node/write-runtime-manifest.d.ts +26 -0
  27. package/src/adapters/node/write-runtime-manifest.js +12 -0
  28. package/src/{define-api-handler.d.ts → adapters/shared/define-api-handler.d.ts} +1 -1
  29. package/src/adapters/shared/explicit-static-route-matcher.js +4 -1
  30. package/src/adapters/shared/file-route-middleware-pipeline.js +1 -0
  31. package/src/adapters/shared/fs-server-response-matcher.d.ts +9 -5
  32. package/src/adapters/shared/fs-server-response-matcher.js +13 -8
  33. package/src/adapters/shared/hmr-entrypoint-registrar.d.ts +55 -0
  34. package/src/adapters/shared/hmr-entrypoint-registrar.js +87 -0
  35. package/src/adapters/shared/hmr-html-response.d.ts +22 -0
  36. package/src/adapters/shared/hmr-html-response.js +32 -0
  37. package/src/adapters/shared/render-context.js +3 -2
  38. package/src/adapters/shared/runtime-bootstrap.d.ts +38 -0
  39. package/src/adapters/shared/runtime-bootstrap.js +43 -0
  40. package/src/adapters/shared/server-adapter.d.ts +12 -2
  41. package/src/adapters/shared/server-adapter.js +37 -4
  42. package/src/adapters/shared/server-route-handler.d.ts +1 -1
  43. package/src/adapters/shared/server-route-handler.js +4 -13
  44. package/src/adapters/shared/server-static-builder.d.ts +35 -3
  45. package/src/adapters/shared/server-static-builder.js +59 -6
  46. package/src/build/README.md +101 -0
  47. package/src/build/build-adapter.d.ts +114 -2
  48. package/src/build/build-adapter.js +119 -5
  49. package/src/build/build-manifest.d.ts +27 -0
  50. package/src/build/build-manifest.js +30 -0
  51. package/src/build/dev-build-coordinator.d.ts +74 -0
  52. package/src/build/dev-build-coordinator.js +161 -0
  53. package/src/build/esbuild-build-adapter.d.ts +9 -6
  54. package/src/build/esbuild-build-adapter.js +103 -71
  55. package/src/build/runtime-build-executor.d.ts +13 -0
  56. package/src/build/runtime-build-executor.js +20 -0
  57. package/src/build/runtime-specifier-alias-plugin.d.ts +15 -0
  58. package/src/build/runtime-specifier-alias-plugin.js +31 -0
  59. package/src/config/README.md +33 -0
  60. package/src/config/config-builder.d.ts +28 -17
  61. package/src/config/config-builder.js +221 -48
  62. package/src/constants.d.ts +13 -0
  63. package/src/constants.js +4 -0
  64. package/src/declarations.d.ts +18 -13
  65. package/src/eco/README.md +70 -16
  66. package/src/eco/component-render-context.d.ts +1 -1
  67. package/src/eco/component-render-context.js +26 -16
  68. package/src/eco/eco.js +16 -12
  69. package/src/eco/eco.types.d.ts +12 -4
  70. package/src/hmr/README.md +26 -0
  71. package/src/hmr/client/hmr-runtime.d.ts +1 -6
  72. package/src/hmr/client/hmr-runtime.js +30 -7
  73. package/src/hmr/hmr.postcss.test.e2e.d.ts +1 -0
  74. package/src/hmr/hmr.postcss.test.e2e.js +31 -0
  75. package/src/hmr/hmr.test.e2e.js +26 -33
  76. package/src/hmr/strategies/js-hmr-strategy.d.ts +45 -42
  77. package/src/hmr/strategies/js-hmr-strategy.js +70 -71
  78. package/src/index.d.ts +1 -1
  79. package/src/index.js +1 -1
  80. package/src/integrations/ghtml/ghtml-renderer.d.ts +1 -1
  81. package/src/integrations/ghtml/ghtml-renderer.js +3 -1
  82. package/src/internal-types.d.ts +39 -18
  83. package/src/plugins/README.md +34 -0
  84. package/src/plugins/alias-resolver-plugin.js +17 -3
  85. package/src/plugins/eco-component-meta-plugin.d.ts +2 -0
  86. package/src/plugins/eco-component-meta-plugin.js +1 -1
  87. package/src/plugins/integration-plugin.d.ts +38 -4
  88. package/src/plugins/integration-plugin.js +34 -1
  89. package/src/plugins/processor.d.ts +14 -1
  90. package/src/plugins/processor.js +15 -1
  91. package/src/plugins/runtime-capability.d.ts +9 -0
  92. package/src/public-types.d.ts +65 -10
  93. package/src/route-renderer/GRAPH.md +16 -20
  94. package/src/route-renderer/README.md +8 -21
  95. package/src/route-renderer/component-graph/component-reference.d.ts +10 -0
  96. package/src/route-renderer/component-graph/component-reference.js +19 -0
  97. package/src/route-renderer/{marker-graph-resolver.d.ts → component-graph/marker-graph-resolver.d.ts} +6 -5
  98. package/src/route-renderer/{marker-graph-resolver.js → component-graph/marker-graph-resolver.js} +10 -8
  99. package/src/route-renderer/{integration-renderer.d.ts → orchestration/integration-renderer.d.ts} +45 -12
  100. package/src/route-renderer/{integration-renderer.js → orchestration/integration-renderer.js} +79 -16
  101. package/src/route-renderer/{render-execution.service.d.ts → orchestration/render-execution.service.d.ts} +39 -5
  102. package/src/route-renderer/{render-execution.service.js → orchestration/render-execution.service.js} +58 -28
  103. package/src/route-renderer/{render-preparation.service.d.ts → orchestration/render-preparation.service.d.ts} +13 -4
  104. package/src/route-renderer/{render-preparation.service.js → orchestration/render-preparation.service.js} +92 -3
  105. package/src/route-renderer/{dependency-resolver.d.ts → page-loading/dependency-resolver.d.ts} +15 -4
  106. package/src/route-renderer/{dependency-resolver.js → page-loading/dependency-resolver.js} +18 -4
  107. package/src/route-renderer/page-loading/page-module-loader.d.ts +87 -0
  108. package/src/route-renderer/{page-module-loader.js → page-loading/page-module-loader.js} +36 -14
  109. package/src/route-renderer/route-renderer.d.ts +36 -1
  110. package/src/route-renderer/route-renderer.js +19 -0
  111. package/src/router/README.md +26 -0
  112. package/src/router/client/link-intent.d.ts +53 -0
  113. package/src/router/client/link-intent.js +34 -0
  114. package/src/router/client/link-intent.test.browser.d.ts +1 -0
  115. package/src/router/client/link-intent.test.browser.js +43 -0
  116. package/src/router/client/navigation-coordinator.d.ts +149 -0
  117. package/src/router/client/navigation-coordinator.js +215 -0
  118. package/src/router/{fs-router-scanner.d.ts → server/fs-router-scanner.d.ts} +3 -3
  119. package/src/router/{fs-router-scanner.js → server/fs-router-scanner.js} +8 -7
  120. package/src/router/{fs-router.d.ts → server/fs-router.d.ts} +1 -1
  121. package/src/router/{fs-router.js → server/fs-router.js} +1 -1
  122. package/src/services/README.md +29 -0
  123. package/src/services/assets/asset-processing-service/asset-processing.service.d.ts +120 -0
  124. package/src/services/{asset-processing-service → assets/asset-processing-service}/asset-processing.service.js +88 -7
  125. package/src/services/{asset-processing-service → assets/asset-processing-service}/asset.factory.js +2 -2
  126. package/src/services/{asset-processing-service → assets/asset-processing-service}/assets.types.d.ts +2 -1
  127. package/src/services/assets/asset-processing-service/assets.types.js +0 -0
  128. package/src/services/assets/asset-processing-service/browser-runtime-asset.factory.d.ts +55 -0
  129. package/src/services/assets/asset-processing-service/browser-runtime-asset.factory.js +48 -0
  130. package/src/services/assets/asset-processing-service/browser-runtime-entry.factory.d.ts +20 -0
  131. package/src/services/assets/asset-processing-service/browser-runtime-entry.factory.js +41 -0
  132. package/src/services/{asset-processing-service → assets/asset-processing-service}/index.d.ts +2 -0
  133. package/src/services/{asset-processing-service → assets/asset-processing-service}/index.js +2 -0
  134. package/src/services/{asset-processing-service → assets/asset-processing-service}/processor.interface.d.ts +1 -1
  135. package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/base/base-processor.d.ts +1 -1
  136. package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/base/base-processor.js +9 -4
  137. package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/base/base-script-processor.d.ts +3 -2
  138. package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/base/base-script-processor.js +14 -22
  139. package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/script/file-script.processor.d.ts +1 -1
  140. package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/script/file-script.processor.js +2 -2
  141. package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/script/node-module-script.processor.js +5 -4
  142. package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/stylesheet/file-stylesheet.processor.js +4 -1
  143. package/src/services/assets/browser-bundle.service.d.ts +32 -0
  144. package/src/services/assets/browser-bundle.service.js +33 -0
  145. package/src/services/{page-request-cache-coordinator.service.d.ts → cache/page-request-cache-coordinator.service.d.ts} +2 -2
  146. package/src/services/{page-request-cache-coordinator.service.js → cache/page-request-cache-coordinator.service.js} +3 -1
  147. package/src/services/html/html-rewriter-provider.service.d.ts +37 -0
  148. package/src/services/html/html-rewriter-provider.service.js +65 -0
  149. package/src/services/html/html-transformer.service.d.ts +77 -0
  150. package/src/services/html/html-transformer.service.js +221 -0
  151. package/src/services/invalidation/development-invalidation.service.d.ts +74 -0
  152. package/src/services/invalidation/development-invalidation.service.js +189 -0
  153. package/src/services/module-loading/app-server-module-transpiler.service.d.ts +16 -0
  154. package/src/services/module-loading/app-server-module-transpiler.service.js +34 -0
  155. package/src/services/module-loading/page-module-import.service.d.ts +71 -0
  156. package/src/services/module-loading/page-module-import.service.js +132 -0
  157. package/src/services/module-loading/server-loader.service.d.ts +96 -0
  158. package/src/services/module-loading/server-loader.service.js +32 -0
  159. package/src/services/module-loading/server-module-transpiler.service.d.ts +69 -0
  160. package/src/services/module-loading/server-module-transpiler.service.js +61 -0
  161. package/src/services/runtime-manifest/node-runtime-manifest.service.d.ts +35 -0
  162. package/src/services/runtime-manifest/node-runtime-manifest.service.js +60 -0
  163. package/src/services/runtime-state/dev-graph.service.d.ts +118 -0
  164. package/src/services/runtime-state/dev-graph.service.js +162 -0
  165. package/src/services/runtime-state/entrypoint-dependency-graph.service.d.ts +41 -0
  166. package/src/services/runtime-state/entrypoint-dependency-graph.service.js +85 -0
  167. package/src/services/runtime-state/runtime-specifier-registry.service.d.ts +69 -0
  168. package/src/services/runtime-state/runtime-specifier-registry.service.js +37 -0
  169. package/src/services/runtime-state/server-invalidation-state.service.d.ts +26 -0
  170. package/src/services/runtime-state/server-invalidation-state.service.js +35 -0
  171. package/src/services/{schema-validation-service.d.ts → validation/schema-validation-service.d.ts} +1 -1
  172. package/src/static-site-generator/README.md +26 -0
  173. package/src/static-site-generator/static-site-generator.d.ts +53 -1
  174. package/src/static-site-generator/static-site-generator.js +86 -5
  175. package/src/utils/resolve-work-dir.d.ts +11 -0
  176. package/src/utils/resolve-work-dir.js +31 -0
  177. package/src/watchers/project-watcher.d.ts +37 -21
  178. package/src/watchers/project-watcher.js +109 -66
  179. package/src/watchers/project-watcher.test-helpers.js +1 -0
  180. package/src/adapters/abstract/application-adapter.ts +0 -337
  181. package/src/adapters/abstract/router-adapter.ts +0 -30
  182. package/src/adapters/abstract/server-adapter.ts +0 -79
  183. package/src/adapters/bun/client-bridge.ts +0 -62
  184. package/src/adapters/bun/create-app.ts +0 -189
  185. package/src/adapters/bun/define-api-handler.d.ts +0 -61
  186. package/src/adapters/bun/define-api-handler.ts +0 -114
  187. package/src/adapters/bun/hmr-manager.ts +0 -281
  188. package/src/adapters/bun/index.ts +0 -3
  189. package/src/adapters/bun/server-adapter.ts +0 -492
  190. package/src/adapters/bun/server-lifecycle.ts +0 -154
  191. package/src/adapters/index.ts +0 -6
  192. package/src/adapters/node/create-app.ts +0 -179
  193. package/src/adapters/node/index.ts +0 -9
  194. package/src/adapters/node/node-client-bridge.ts +0 -79
  195. package/src/adapters/node/node-hmr-manager.ts +0 -271
  196. package/src/adapters/node/server-adapter.ts +0 -561
  197. package/src/adapters/node/static-content-server.ts +0 -203
  198. package/src/adapters/shared/api-response.ts +0 -104
  199. package/src/adapters/shared/application-adapter.ts +0 -199
  200. package/src/adapters/shared/explicit-static-route-matcher.ts +0 -134
  201. package/src/adapters/shared/file-route-middleware-pipeline.ts +0 -123
  202. package/src/adapters/shared/fs-server-response-factory.ts +0 -118
  203. package/src/adapters/shared/fs-server-response-matcher.ts +0 -198
  204. package/src/adapters/shared/render-context.ts +0 -105
  205. package/src/adapters/shared/server-adapter.ts +0 -442
  206. package/src/adapters/shared/server-route-handler.ts +0 -166
  207. package/src/adapters/shared/server-static-builder.ts +0 -82
  208. package/src/build/build-adapter.ts +0 -132
  209. package/src/build/build-types.ts +0 -83
  210. package/src/build/esbuild-build-adapter.ts +0 -510
  211. package/src/config/config-builder.ts +0 -474
  212. package/src/constants.ts +0 -39
  213. package/src/create-app.ts +0 -87
  214. package/src/define-api-handler.js +0 -15
  215. package/src/define-api-handler.ts +0 -66
  216. package/src/dev/sc-server.ts +0 -143
  217. package/src/eco/component-render-context.ts +0 -202
  218. package/src/eco/eco.ts +0 -221
  219. package/src/eco/eco.types.ts +0 -202
  220. package/src/eco/eco.utils.ts +0 -89
  221. package/src/eco/global-injector-map.ts +0 -112
  222. package/src/eco/lazy-injector-map.ts +0 -120
  223. package/src/eco/module-dependencies.ts +0 -75
  224. package/src/errors/http-error.ts +0 -72
  225. package/src/errors/index.ts +0 -2
  226. package/src/errors/locals-access-error.ts +0 -7
  227. package/src/global/app-logger.ts +0 -4
  228. 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
  229. package/src/hmr/client/__screenshots__/hmr-runtime.test.browser.ts/HMR-Runtime-HMR-Server-Integration-should-load-fixture-app-page-1.png +0 -0
  230. package/src/hmr/client/__screenshots__/hmr-runtime.test.browser.ts/HMR-Runtime-WebSocket-Connection-should-connect-to-correct-HMR-endpoint-1.png +0 -0
  231. package/src/hmr/client/hmr-runtime.ts +0 -121
  232. package/src/hmr/hmr-strategy.ts +0 -172
  233. package/src/hmr/hmr.test.e2e.ts +0 -75
  234. package/src/hmr/strategies/default-hmr-strategy.ts +0 -60
  235. package/src/hmr/strategies/js-hmr-strategy.ts +0 -308
  236. package/src/index.browser.ts +0 -3
  237. package/src/index.ts +0 -5
  238. package/src/integrations/ghtml/ghtml-renderer.ts +0 -93
  239. package/src/integrations/ghtml/ghtml.plugin.ts +0 -32
  240. package/src/internal-types.ts +0 -212
  241. package/src/plugins/alias-resolver-plugin.ts +0 -45
  242. package/src/plugins/eco-component-meta-plugin.ts +0 -474
  243. package/src/plugins/integration-plugin.ts +0 -184
  244. package/src/plugins/processor.ts +0 -220
  245. package/src/public-types.ts +0 -1255
  246. package/src/route-renderer/component-graph-executor.ts +0 -84
  247. package/src/route-renderer/component-graph.ts +0 -159
  248. package/src/route-renderer/component-marker.ts +0 -117
  249. package/src/route-renderer/dependency-resolver.ts +0 -596
  250. package/src/route-renderer/html-post-processing.service.d.ts +0 -40
  251. package/src/route-renderer/html-post-processing.service.js +0 -86
  252. package/src/route-renderer/html-post-processing.service.ts +0 -103
  253. package/src/route-renderer/integration-renderer.ts +0 -696
  254. package/src/route-renderer/marker-graph-resolver.ts +0 -153
  255. package/src/route-renderer/page-module-loader.d.ts +0 -61
  256. package/src/route-renderer/page-module-loader.ts +0 -153
  257. package/src/route-renderer/render-execution.service.ts +0 -158
  258. package/src/route-renderer/render-preparation.service.ts +0 -358
  259. package/src/route-renderer/route-renderer.ts +0 -80
  260. package/src/router/fs-router-scanner.ts +0 -217
  261. package/src/router/fs-router.ts +0 -122
  262. package/src/services/asset-processing-service/asset-processing.service.d.ts +0 -41
  263. package/src/services/asset-processing-service/asset-processing.service.ts +0 -306
  264. package/src/services/asset-processing-service/asset.factory.ts +0 -105
  265. package/src/services/asset-processing-service/assets.types.ts +0 -112
  266. package/src/services/asset-processing-service/index.ts +0 -3
  267. package/src/services/asset-processing-service/processor.interface.ts +0 -27
  268. package/src/services/asset-processing-service/processor.registry.ts +0 -18
  269. package/src/services/asset-processing-service/processors/base/base-processor.ts +0 -76
  270. package/src/services/asset-processing-service/processors/base/base-script-processor.ts +0 -105
  271. package/src/services/asset-processing-service/processors/index.ts +0 -5
  272. package/src/services/asset-processing-service/processors/script/content-script.processor.ts +0 -66
  273. package/src/services/asset-processing-service/processors/script/file-script.processor.ts +0 -88
  274. package/src/services/asset-processing-service/processors/script/node-module-script.processor.ts +0 -84
  275. package/src/services/asset-processing-service/processors/stylesheet/content-stylesheet.processor.ts +0 -27
  276. package/src/services/asset-processing-service/processors/stylesheet/file-stylesheet.processor.ts +0 -77
  277. package/src/services/cache/cache.types.ts +0 -126
  278. package/src/services/cache/index.ts +0 -18
  279. package/src/services/cache/memory-cache-store.ts +0 -130
  280. package/src/services/cache/page-cache-service.ts +0 -202
  281. package/src/services/html-transformer.service.d.ts +0 -50
  282. package/src/services/html-transformer.service.js +0 -163
  283. package/src/services/html-transformer.service.ts +0 -217
  284. package/src/services/page-module-import.service.d.ts +0 -37
  285. package/src/services/page-module-import.service.js +0 -88
  286. package/src/services/page-module-import.service.ts +0 -129
  287. package/src/services/page-request-cache-coordinator.service.ts +0 -128
  288. package/src/services/schema-validation-service.ts +0 -204
  289. package/src/services/validation/standard-schema.types.ts +0 -68
  290. package/src/static-site-generator/static-site-generator.ts +0 -359
  291. package/src/utils/css.ts +0 -5
  292. package/src/utils/deep-merge.ts +0 -47
  293. package/src/utils/hash.ts +0 -5
  294. package/src/utils/html.ts +0 -1
  295. package/src/utils/invariant.ts +0 -15
  296. package/src/utils/locals-utils.ts +0 -37
  297. package/src/utils/parse-cli-args.ts +0 -83
  298. package/src/utils/path-utils.module.ts +0 -14
  299. package/src/utils/runtime.ts +0 -44
  300. package/src/utils/server-utils.module.ts +0 -67
  301. package/src/watchers/project-watcher.test-helpers.ts +0 -40
  302. package/src/watchers/project-watcher.ts +0 -306
  303. /package/src/adapters/{bun → shared}/define-api-handler.js +0 -0
  304. /package/src/{services/asset-processing-service/assets.types.js → plugins/runtime-capability.js} +0 -0
  305. /package/src/route-renderer/{component-graph-executor.d.ts → component-graph/component-graph-executor.d.ts} +0 -0
  306. /package/src/route-renderer/{component-graph-executor.js → component-graph/component-graph-executor.js} +0 -0
  307. /package/src/route-renderer/{component-graph.d.ts → component-graph/component-graph.d.ts} +0 -0
  308. /package/src/route-renderer/{component-graph.js → component-graph/component-graph.js} +0 -0
  309. /package/src/route-renderer/{component-marker.d.ts → component-graph/component-marker.d.ts} +0 -0
  310. /package/src/route-renderer/{component-marker.js → component-graph/component-marker.js} +0 -0
  311. /package/src/services/{asset-processing-service → assets/asset-processing-service}/asset.factory.d.ts +0 -0
  312. /package/src/services/{asset-processing-service → assets/asset-processing-service}/processor.interface.js +0 -0
  313. /package/src/services/{asset-processing-service → assets/asset-processing-service}/processor.registry.d.ts +0 -0
  314. /package/src/services/{asset-processing-service → assets/asset-processing-service}/processor.registry.js +0 -0
  315. /package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/index.d.ts +0 -0
  316. /package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/index.js +0 -0
  317. /package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/script/content-script.processor.d.ts +0 -0
  318. /package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/script/content-script.processor.js +0 -0
  319. /package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/script/node-module-script.processor.d.ts +0 -0
  320. /package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/stylesheet/content-stylesheet.processor.d.ts +0 -0
  321. /package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/stylesheet/content-stylesheet.processor.js +0 -0
  322. /package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/stylesheet/file-stylesheet.processor.d.ts +0 -0
  323. /package/src/services/{schema-validation-service.js → validation/schema-validation-service.js} +0 -0
@@ -1,12 +1,12 @@
1
- import {} from "../services/asset-processing-service/index.js";
2
- import { HtmlTransformerService } from "../services/html-transformer.service.js";
3
- import { invariant } from "../utils/invariant.js";
4
- import { HttpError } from "../errors/http-error.js";
5
- import { LocalsAccessError } from "../errors/locals-access-error.js";
6
- import { DependencyResolverService } from "./dependency-resolver.js";
7
- import { HtmlPostProcessingService } from "./html-post-processing.service.js";
8
- import { PageModuleLoaderService } from "./page-module-loader.js";
9
- import { MarkerGraphResolver } from "./marker-graph-resolver.js";
1
+ import {
2
+ } from "../../services/assets/asset-processing-service/index.js";
3
+ import { HtmlTransformerService } from "../../services/html/html-transformer.service.js";
4
+ import { invariant } from "../../utils/invariant.js";
5
+ import { HttpError } from "../../errors/http-error.js";
6
+ import { LocalsAccessError } from "../../errors/locals-access-error.js";
7
+ import { DependencyResolverService } from "../page-loading/dependency-resolver.js";
8
+ import { PageModuleLoaderService } from "../page-loading/page-module-loader.js";
9
+ import { MarkerGraphResolver } from "../component-graph/marker-graph-resolver.js";
10
10
  import { RenderExecutionService } from "./render-execution.service.js";
11
11
  import { RenderPreparationService } from "./render-preparation.service.js";
12
12
  function createLocalsProxy(filePath) {
@@ -49,7 +49,6 @@ class IntegrationRenderer {
49
49
  pageModuleLoaderService;
50
50
  markerGraphResolver;
51
51
  renderPreparationService;
52
- htmlPostProcessingService;
53
52
  renderExecutionService;
54
53
  DOC_TYPE = "<!DOCTYPE html>";
55
54
  setHmrManager(hmrManager) {
@@ -104,7 +103,7 @@ class IntegrationRenderer {
104
103
  async prepareViewDependencies(view, layout) {
105
104
  const HtmlTemplate = await this.getHtmlTemplate();
106
105
  const componentsToResolve = layout ? [HtmlTemplate, layout, view] : [HtmlTemplate, view];
107
- const resolvedDependencies = this.htmlPostProcessingService.dedupeProcessedAssets(
106
+ const resolvedDependencies = this.htmlTransformer.dedupeProcessedAssets(
108
107
  await this.resolveDependencies(componentsToResolve)
109
108
  );
110
109
  this.htmlTransformer.setProcessedDependencies(resolvedDependencies);
@@ -125,7 +124,6 @@ class IntegrationRenderer {
125
124
  this.pageModuleLoaderService = new PageModuleLoaderService(appConfig, runtimeOrigin);
126
125
  this.markerGraphResolver = new MarkerGraphResolver();
127
126
  this.renderPreparationService = new RenderPreparationService(appConfig, assetProcessingService);
128
- this.htmlPostProcessingService = new HtmlPostProcessingService();
129
127
  this.renderExecutionService = new RenderExecutionService();
130
128
  }
131
129
  /**
@@ -292,7 +290,7 @@ class IntegrationRenderer {
292
290
  }),
293
291
  getComponentRenderBoundaryContext: () => this.getComponentRenderBoundaryContext(),
294
292
  setProcessedDependencies: (dependencies) => this.htmlTransformer.setProcessedDependencies(dependencies),
295
- dedupeProcessedAssets: (assets) => this.htmlPostProcessingService.dedupeProcessedAssets(assets),
293
+ dedupeProcessedAssets: (assets) => this.htmlTransformer.dedupeProcessedAssets(assets),
296
294
  createPageLocalsProxy: (filePath) => createLocalsProxy(filePath)
297
295
  });
298
296
  }
@@ -353,10 +351,12 @@ class IntegrationRenderer {
353
351
  componentsToResolve: input.componentsToResolve,
354
352
  graphContext: input.graphContext
355
353
  }),
356
- dedupeProcessedAssets: (assets) => this.htmlPostProcessingService.dedupeProcessedAssets(assets),
354
+ getDocumentAttributes: (renderOptions) => this.getDocumentAttributes(renderOptions),
355
+ dedupeProcessedAssets: (assets) => this.htmlTransformer.dedupeProcessedAssets(assets),
357
356
  getProcessedDependencies: () => this.htmlTransformer.getProcessedDependencies(),
358
357
  setProcessedDependencies: (dependencies) => this.htmlTransformer.setProcessedDependencies(dependencies),
359
- applyAttributesToFirstBodyElement: (html, attributes) => this.htmlPostProcessingService.applyAttributesToFirstBodyElement(html, attributes),
358
+ applyAttributesToHtmlElement: (html, attributes) => this.htmlTransformer.applyAttributesToHtmlElement(html, attributes),
359
+ applyAttributesToFirstBodyElement: (html, attributes) => this.htmlTransformer.applyAttributesToFirstBodyElement(html, attributes),
360
360
  transformHtml: async (html) => {
361
361
  const response = await this.htmlTransformer.transform(
362
362
  new Response(html, {
@@ -369,6 +369,69 @@ class IntegrationRenderer {
369
369
  }
370
370
  });
371
371
  }
372
+ /**
373
+ * Captures a render pass as immutable HTML along with the graph context needed
374
+ * for deferred marker resolution.
375
+ *
376
+ * This is the shared entry point for direct `renderToResponse()` flows that
377
+ * need the same component graph capture semantics as route execution without
378
+ * going through `prepareRenderOptions()`.
379
+ */
380
+ async captureHtmlRender(render) {
381
+ return this.renderExecutionService.captureHtmlRender(
382
+ this.name,
383
+ this.getComponentRenderBoundaryContext(),
384
+ render
385
+ );
386
+ }
387
+ /**
388
+ * Finalizes previously captured HTML by resolving deferred markers, merging
389
+ * any emitted assets, stamping optional attributes, and optionally running the
390
+ * HTML transformer for full-document flows.
391
+ */
392
+ async finalizeCapturedHtmlRender(options) {
393
+ const finalization = await this.renderExecutionService.finalizeHtmlRender(
394
+ {
395
+ html: options.html,
396
+ graphContext: options.graphContext,
397
+ componentsToResolve: options.componentsToResolve,
398
+ componentRootAttributes: options.componentRootAttributes,
399
+ documentAttributes: options.documentAttributes,
400
+ mergeAssets: options.mergeAssets ?? !options.partial
401
+ },
402
+ {
403
+ resolveMarkerGraphHtml: (input) => this.resolveMarkerGraphHtml({
404
+ html: input.html,
405
+ componentsToResolve: input.componentsToResolve,
406
+ graphContext: input.graphContext
407
+ }),
408
+ dedupeProcessedAssets: (assets) => this.htmlTransformer.dedupeProcessedAssets(assets),
409
+ getProcessedDependencies: () => this.htmlTransformer.getProcessedDependencies(),
410
+ setProcessedDependencies: (dependencies) => this.htmlTransformer.setProcessedDependencies(dependencies),
411
+ applyAttributesToHtmlElement: (html, attributes) => this.htmlTransformer.applyAttributesToHtmlElement(html, attributes),
412
+ applyAttributesToFirstBodyElement: (html, attributes) => this.htmlTransformer.applyAttributesToFirstBodyElement(html, attributes)
413
+ }
414
+ );
415
+ const shouldTransform = options.transformHtml ?? !options.partial;
416
+ if (!shouldTransform) {
417
+ return finalization.html;
418
+ }
419
+ const transformedResponse = await this.htmlTransformer.transform(
420
+ new Response(finalization.html, {
421
+ headers: { "Content-Type": "text/html" }
422
+ })
423
+ );
424
+ return await transformedResponse.text();
425
+ }
426
+ /**
427
+ * Returns document-level attributes to stamp onto the rendered `<html>` tag.
428
+ *
429
+ * Integrations can override this to expose explicit document ownership or
430
+ * other runtime coordination markers without relying on script sniffing.
431
+ */
432
+ getDocumentAttributes(_renderOptions) {
433
+ return void 0;
434
+ }
372
435
  /**
373
436
  * Resolves all `eco-marker` placeholders in rendered HTML using integration
374
437
  * dispatch and bottom-up graph execution.
@@ -399,7 +462,7 @@ class IntegrationRenderer {
399
462
  componentsToResolve: options.componentsToResolve,
400
463
  graphContext: options.graphContext,
401
464
  resolveRenderer: (integrationName) => this.getIntegrationRendererForName(integrationName, integrationRendererCache),
402
- applyAttributesToFirstElement: (html, attributes) => this.htmlPostProcessingService.applyAttributesToFirstElement(html, attributes)
465
+ applyAttributesToFirstElement: (html, attributes) => this.htmlTransformer.applyAttributesToFirstElement(html, attributes)
403
466
  });
404
467
  }
405
468
  /**
@@ -1,7 +1,7 @@
1
- import { type ComponentRenderBoundaryContext } from '../eco/component-render-context.js';
2
- import type { EcoComponent, IntegrationRendererRenderOptions, RouteRendererBody, RouteRendererOptions, RouteRenderResult } from '../public-types.js';
3
- import type { ProcessedAsset } from '../services/asset-processing-service/index.js';
4
- import type { MarkerGraphContext } from './marker-graph-resolver.js';
1
+ import { type ComponentRenderBoundaryContext } from '../../eco/component-render-context.js';
2
+ import type { EcoComponent, IntegrationRendererRenderOptions, RouteRendererBody, RouteRendererOptions, RouteRenderResult } from '../../public-types.js';
3
+ import type { ProcessedAsset } from '../../services/assets/asset-processing-service/index.js';
4
+ import type { MarkerGraphContext } from '../component-graph/marker-graph-resolver.js';
5
5
  /**
6
6
  * Serializable graph context merged from render-time captured references and
7
7
  * optional explicit page-module graph metadata.
@@ -10,10 +10,23 @@ export type RenderExecutionGraphContext = {
10
10
  propsByRef?: Record<string, Record<string, unknown>>;
11
11
  slotChildrenByRef?: MarkerGraphContext['slotChildrenByRef'];
12
12
  };
13
+ export interface CapturedHtmlRenderResult {
14
+ html: string;
15
+ graphContext: RenderExecutionGraphContext;
16
+ }
17
+ export interface FinalizeHtmlRenderOptions {
18
+ html: string;
19
+ graphContext: RenderExecutionGraphContext;
20
+ componentsToResolve: EcoComponent[];
21
+ componentRootAttributes?: Record<string, string>;
22
+ documentAttributes?: Record<string, string>;
23
+ mergeAssets?: boolean;
24
+ }
13
25
  export interface RenderExecutionCallbacks<C> {
14
26
  prepareRenderOptions(options: RouteRendererOptions): Promise<IntegrationRendererRenderOptions<C>>;
15
27
  render(renderOptions: IntegrationRendererRenderOptions<C>): Promise<RouteRendererBody>;
16
28
  getComponentRenderBoundaryContext(): ComponentRenderBoundaryContext;
29
+ getDocumentAttributes(renderOptions: IntegrationRendererRenderOptions<C>): Record<string, string> | undefined;
17
30
  resolveMarkerGraphHtml(input: {
18
31
  html: string;
19
32
  componentsToResolve: EcoComponent[];
@@ -25,9 +38,25 @@ export interface RenderExecutionCallbacks<C> {
25
38
  dedupeProcessedAssets(assets: ProcessedAsset[]): ProcessedAsset[];
26
39
  getProcessedDependencies(): ProcessedAsset[];
27
40
  setProcessedDependencies(dependencies: ProcessedAsset[]): void;
41
+ applyAttributesToHtmlElement(html: string, attributes: Record<string, string>): string;
28
42
  applyAttributesToFirstBodyElement(html: string, attributes: Record<string, string>): string;
29
43
  transformHtml(html: string): Promise<RouteRendererBody>;
30
44
  }
45
+ export interface FinalizeHtmlRenderCallbacks {
46
+ resolveMarkerGraphHtml(input: {
47
+ html: string;
48
+ componentsToResolve: EcoComponent[];
49
+ graphContext: RenderExecutionGraphContext;
50
+ }): Promise<{
51
+ html: string;
52
+ assets: ProcessedAsset[];
53
+ }>;
54
+ dedupeProcessedAssets(assets: ProcessedAsset[]): ProcessedAsset[];
55
+ getProcessedDependencies(): ProcessedAsset[];
56
+ setProcessedDependencies(dependencies: ProcessedAsset[]): void;
57
+ applyAttributesToHtmlElement(html: string, attributes: Record<string, string>): string;
58
+ applyAttributesToFirstBodyElement(html: string, attributes: Record<string, string>): string;
59
+ }
31
60
  /**
32
61
  * Executes the main post-preparation rendering flow for integration renderers.
33
62
  *
@@ -37,6 +66,7 @@ export interface RenderExecutionCallbacks<C> {
37
66
  * transformation into a response body stream.
38
67
  */
39
68
  export declare class RenderExecutionService {
69
+ captureHtmlRender(currentIntegrationName: string, boundaryContext: ComponentRenderBoundaryContext, render: () => Promise<RouteRendererBody>): Promise<CapturedHtmlRenderResult>;
40
70
  /**
41
71
  * Executes one integration render pass and returns the final route render
42
72
  * result.
@@ -56,7 +86,11 @@ export declare class RenderExecutionService {
56
86
  * @param explicitGraphContext Optional page-module graph metadata.
57
87
  * @returns Merged graph context used during marker resolution.
58
88
  */
59
- private mergeGraphContext;
89
+ mergeGraphContext(capturedGraphContext: RenderExecutionGraphContext, explicitGraphContext?: RenderExecutionGraphContext): RenderExecutionGraphContext;
90
+ finalizeHtmlRender(options: FinalizeHtmlRenderOptions, callbacks: FinalizeHtmlRenderCallbacks): Promise<{
91
+ html: string;
92
+ assets: ProcessedAsset[];
93
+ }>;
60
94
  /**
61
95
  * Returns the component set that participates in marker graph resolution for a
62
96
  * render pass.
@@ -1,7 +1,20 @@
1
1
  import {
2
2
  runWithComponentRenderContext
3
- } from "../eco/component-render-context.js";
3
+ } from "../../eco/component-render-context.js";
4
4
  class RenderExecutionService {
5
+ async captureHtmlRender(currentIntegrationName, boundaryContext, render) {
6
+ const renderExecution = await runWithComponentRenderContext(
7
+ {
8
+ currentIntegration: currentIntegrationName,
9
+ boundaryContext
10
+ },
11
+ render
12
+ );
13
+ return {
14
+ html: await new Response(renderExecution.value).text(),
15
+ graphContext: renderExecution.graphContext
16
+ };
17
+ }
5
18
  /**
6
19
  * Executes one integration render pass and returns the final route render
7
20
  * result.
@@ -15,40 +28,27 @@ class RenderExecutionService {
15
28
  async execute(options, currentIntegrationName, callbacks) {
16
29
  const renderOptions = await callbacks.prepareRenderOptions(options);
17
30
  const shouldApplyComponentRootAttributes = renderOptions.componentRender?.canAttachAttributes && renderOptions.componentRender.rootAttributes && Object.keys(renderOptions.componentRender.rootAttributes).length > 0;
18
- const renderExecution = await runWithComponentRenderContext(
19
- {
20
- currentIntegration: currentIntegrationName,
21
- boundaryContext: callbacks.getComponentRenderBoundaryContext()
22
- },
31
+ const renderExecution = await this.captureHtmlRender(
32
+ currentIntegrationName,
33
+ callbacks.getComponentRenderBoundaryContext(),
23
34
  async () => callbacks.render(renderOptions)
24
35
  );
25
- let renderedHtml = await new Response(renderExecution.value).text();
26
36
  const componentGraphContext = this.mergeGraphContext(
27
37
  renderExecution.graphContext,
28
38
  renderOptions.componentGraphContext
29
39
  );
30
- if (renderedHtml.includes("<eco-marker")) {
31
- const markerResolution = await callbacks.resolveMarkerGraphHtml({
32
- html: renderedHtml,
40
+ const finalization = await this.finalizeHtmlRender(
41
+ {
42
+ html: renderExecution.html,
43
+ graphContext: componentGraphContext,
33
44
  componentsToResolve: this.getComponentsToResolve(renderOptions),
34
- graphContext: componentGraphContext
35
- });
36
- renderedHtml = markerResolution.html;
37
- if (markerResolution.assets.length > 0) {
38
- const mergedDependencies = callbacks.dedupeProcessedAssets([
39
- ...callbacks.getProcessedDependencies(),
40
- ...markerResolution.assets
41
- ]);
42
- callbacks.setProcessedDependencies(mergedDependencies);
43
- }
44
- }
45
- if (shouldApplyComponentRootAttributes) {
46
- renderedHtml = callbacks.applyAttributesToFirstBodyElement(
47
- renderedHtml,
48
- renderOptions.componentRender?.rootAttributes
49
- );
50
- }
51
- const body = await callbacks.transformHtml(renderedHtml);
45
+ componentRootAttributes: shouldApplyComponentRootAttributes ? renderOptions.componentRender?.rootAttributes : void 0,
46
+ documentAttributes: callbacks.getDocumentAttributes(renderOptions),
47
+ mergeAssets: true
48
+ },
49
+ callbacks
50
+ );
51
+ const body = await callbacks.transformHtml(finalization.html);
52
52
  return {
53
53
  body,
54
54
  cacheStrategy: renderOptions.cacheStrategy
@@ -74,6 +74,36 @@ class RenderExecutionService {
74
74
  }
75
75
  };
76
76
  }
77
+ async finalizeHtmlRender(options, callbacks) {
78
+ let renderedHtml = options.html;
79
+ let markerAssets = [];
80
+ if (renderedHtml.includes("<eco-marker")) {
81
+ const markerResolution = await callbacks.resolveMarkerGraphHtml({
82
+ html: renderedHtml,
83
+ componentsToResolve: options.componentsToResolve,
84
+ graphContext: options.graphContext
85
+ });
86
+ renderedHtml = markerResolution.html;
87
+ markerAssets = markerResolution.assets;
88
+ if (options.mergeAssets !== false && markerResolution.assets.length > 0) {
89
+ const mergedDependencies = callbacks.dedupeProcessedAssets([
90
+ ...callbacks.getProcessedDependencies(),
91
+ ...markerResolution.assets
92
+ ]);
93
+ callbacks.setProcessedDependencies(mergedDependencies);
94
+ }
95
+ }
96
+ if (options.componentRootAttributes && Object.keys(options.componentRootAttributes).length > 0) {
97
+ renderedHtml = callbacks.applyAttributesToFirstBodyElement(renderedHtml, options.componentRootAttributes);
98
+ }
99
+ if (options.documentAttributes && Object.keys(options.documentAttributes).length > 0) {
100
+ renderedHtml = callbacks.applyAttributesToHtmlElement(renderedHtml, options.documentAttributes);
101
+ }
102
+ return {
103
+ html: renderedHtml,
104
+ assets: markerAssets
105
+ };
106
+ }
77
107
  /**
78
108
  * Returns the component set that participates in marker graph resolution for a
79
109
  * render pass.
@@ -1,7 +1,7 @@
1
- import type { EcoPagesAppConfig } from '../internal-types.js';
2
- import type { ComponentRenderResult, EcoComponent, EcoPageComponent, EcoPageFile, EcoPagesElement, GetMetadata, GetStaticProps, HtmlTemplateProps, IntegrationRendererRenderOptions, PageMetadataProps, RouteRendererOptions } from '../public-types.js';
3
- import { type AssetProcessingService, type ProcessedAsset } from '../services/asset-processing-service/index.js';
4
- import { type ComponentRenderBoundaryContext } from '../eco/component-render-context.js';
1
+ import type { EcoPagesAppConfig } from '../../internal-types.js';
2
+ import type { ComponentRenderResult, EcoComponent, EcoPageComponent, EcoPageFile, EcoPagesElement, GetMetadata, GetStaticProps, HtmlTemplateProps, IntegrationRendererRenderOptions, PageMetadataProps, RouteRendererOptions } from '../../public-types.js';
3
+ import { type AssetProcessingService, type ProcessedAsset } from '../../services/assets/asset-processing-service/index.js';
4
+ import { type ComponentRenderBoundaryContext } from '../../eco/component-render-context.js';
5
5
  type ResolvedPageModule = {
6
6
  Page: EcoPageFile['default'] | EcoPageComponent<any>;
7
7
  getStaticProps?: GetStaticProps<Record<string, unknown>>;
@@ -49,6 +49,13 @@ export interface RenderPreparationCallbacks {
49
49
  export declare class RenderPreparationService {
50
50
  private appConfig;
51
51
  private assetProcessingService;
52
+ /**
53
+ * Creates the render-preparation orchestrator for one app instance.
54
+ *
55
+ * @remarks
56
+ * The service is app-scoped because it depends on finalized config defaults and
57
+ * the app-owned asset-processing pipeline while remaining renderer-agnostic.
58
+ */
52
59
  constructor(appConfig: EcoPagesAppConfig, assetProcessingService: AssetProcessingService);
53
60
  /**
54
61
  * Builds the final render options object used by the integration-specific
@@ -108,5 +115,7 @@ export declare class RenderPreparationService {
108
115
  * @returns Processed assets that should be merged into the final dependency set.
109
116
  */
110
117
  private buildGlobalInjectorAssets;
118
+ private buildEagerSsrLazyAssets;
119
+ private collectEagerSsrLazyDependencies;
111
120
  }
112
121
  export {};
@@ -1,11 +1,22 @@
1
1
  import { createRequire } from "node:module";
2
2
  import {
3
3
  AssetFactory
4
- } from "../services/asset-processing-service/index.js";
5
- import { buildGlobalInjectorBootstrapContent, buildGlobalInjectorMapScript } from "../eco/global-injector-map.js";
6
- import { runWithComponentRenderContext } from "../eco/component-render-context.js";
4
+ } from "../../services/assets/asset-processing-service/index.js";
5
+ import { buildGlobalInjectorBootstrapContent, buildGlobalInjectorMapScript } from "../../eco/global-injector-map.js";
6
+ import {
7
+ runWithComponentRenderContext
8
+ } from "../../eco/component-render-context.js";
7
9
  const coreRequire = createRequire(import.meta.url);
8
10
  class RenderPreparationService {
11
+ appConfig;
12
+ assetProcessingService;
13
+ /**
14
+ * Creates the render-preparation orchestrator for one app instance.
15
+ *
16
+ * @remarks
17
+ * The service is app-scoped because it depends on finalized config defaults and
18
+ * the app-owned asset-processing pipeline while remaining renderer-agnostic.
19
+ */
9
20
  constructor(appConfig, assetProcessingService) {
10
21
  this.appConfig = appConfig;
11
22
  this.assetProcessingService = assetProcessingService;
@@ -56,6 +67,10 @@ class RenderPreparationService {
56
67
  const globalAssets = await this.buildGlobalInjectorAssets(triggers, currentIntegrationName);
57
68
  allDependencies.push(...globalAssets);
58
69
  }
70
+ const eagerSsrLazyAssets = await this.buildEagerSsrLazyAssets(componentsToResolve, currentIntegrationName);
71
+ if (eagerSsrLazyAssets.length > 0) {
72
+ allDependencies.push(...eagerSsrLazyAssets);
73
+ }
59
74
  callbacks.setProcessedDependencies(callbacks.dedupeProcessedAssets(allDependencies));
60
75
  const pageProps = {
61
76
  ...props,
@@ -237,6 +252,80 @@ class RenderPreparationService {
237
252
  currentIntegrationName
238
253
  );
239
254
  }
255
+ async buildEagerSsrLazyAssets(components, currentIntegrationName) {
256
+ const dependencies = this.collectEagerSsrLazyDependencies(components);
257
+ if (dependencies.length === 0) {
258
+ return [];
259
+ }
260
+ return this.assetProcessingService.processDependencies(dependencies, `${currentIntegrationName}:ssr-lazy`);
261
+ }
262
+ collectEagerSsrLazyDependencies(components) {
263
+ const dependencies = [];
264
+ const visitedConfigs = /* @__PURE__ */ new Set();
265
+ const seenKeys = /* @__PURE__ */ new Set();
266
+ const normalizeAttributes = (attributes) => ({
267
+ type: "module",
268
+ defer: "",
269
+ ...attributes ?? {}
270
+ });
271
+ const collect = (config) => {
272
+ if (!config || visitedConfigs.has(config)) {
273
+ return;
274
+ }
275
+ visitedConfigs.add(config);
276
+ const componentFile = config.__eco?.file;
277
+ if (componentFile) {
278
+ const componentDir = coreRequire("node:path").dirname(componentFile);
279
+ for (const script of config.dependencies?.scripts ?? []) {
280
+ if (typeof script === "string" || !script.lazy || script.ssr !== true) {
281
+ continue;
282
+ }
283
+ const attributes = normalizeAttributes(script.attributes);
284
+ if (script.content) {
285
+ const key2 = `content:${script.content}:${JSON.stringify(attributes)}`;
286
+ if (seenKeys.has(key2)) {
287
+ continue;
288
+ }
289
+ seenKeys.add(key2);
290
+ dependencies.push(
291
+ AssetFactory.createContentScript({
292
+ position: "head",
293
+ content: script.content,
294
+ attributes
295
+ })
296
+ );
297
+ continue;
298
+ }
299
+ if (!script.src) {
300
+ continue;
301
+ }
302
+ const resolvedPath = coreRequire("node:path").resolve(componentDir, script.src);
303
+ const key = `file:${resolvedPath}:${JSON.stringify(attributes)}`;
304
+ if (seenKeys.has(key)) {
305
+ continue;
306
+ }
307
+ seenKeys.add(key);
308
+ dependencies.push(
309
+ AssetFactory.createFileScript({
310
+ filepath: resolvedPath,
311
+ position: "head",
312
+ attributes
313
+ })
314
+ );
315
+ }
316
+ }
317
+ if (config.layout?.config) {
318
+ collect(config.layout.config);
319
+ }
320
+ for (const nestedComponent of config.dependencies?.components ?? []) {
321
+ collect(nestedComponent?.config);
322
+ }
323
+ };
324
+ for (const component of components) {
325
+ collect(component.config);
326
+ }
327
+ return dependencies;
328
+ }
240
329
  }
241
330
  export {
242
331
  RenderPreparationService
@@ -1,6 +1,6 @@
1
- import type { EcoComponent } from '../public-types.js';
2
- import type { EcoPagesAppConfig } from '../internal-types.js';
3
- import type { AssetProcessingService, ProcessedAsset } from '../services/asset-processing-service/index.js';
1
+ import type { EcoComponent } from '../../public-types.js';
2
+ import type { EcoPagesAppConfig } from '../../internal-types.js';
3
+ import type { AssetProcessingService, ProcessedAsset } from '../../services/assets/asset-processing-service/index.js';
4
4
  export declare const DEPENDENCY_ERRORS: {
5
5
  readonly INVALID_STYLESHEET_ENTRY: "Invalid stylesheet dependency entry: expected src or content";
6
6
  readonly INVALID_SCRIPT_ENTRY: "Invalid script dependency entry: expected src or content";
@@ -9,7 +9,18 @@ export declare const DEPENDENCY_ERRORS: {
9
9
  export declare class DependencyResolverService {
10
10
  private appConfig;
11
11
  private assetProcessingService;
12
+ /**
13
+ * Creates the dependency resolver used by route and component rendering.
14
+ *
15
+ * @remarks
16
+ * The resolver stays intentionally separate from HTML rendering so component
17
+ * dependency collection, lazy trigger grouping, and processed-asset generation
18
+ * can evolve without changing renderer implementations.
19
+ */
12
20
  constructor(appConfig: EcoPagesAppConfig, assetProcessingService: AssetProcessingService);
21
+ /**
22
+ * Resolves one dependency path relative to the component that declared it.
23
+ */
13
24
  resolveDependencyPath(componentDir: string, pathUrl: string): string;
14
25
  /**
15
26
  * Maps lazy script source entries to deterministic fallback public URLs
@@ -20,5 +31,5 @@ export declare class DependencyResolverService {
20
31
  * Collects and processes component dependencies (styles, scripts, modules, lazy scripts).
21
32
  * Lazy dependencies are always resolved into global-injector trigger maps.
22
33
  */
23
- processComponentDependencies(components: (EcoComponent | Partial<EcoComponent>)[], integrationName: string): Promise<ProcessedAsset[]>;
34
+ processComponentDependencies(components: Array<EcoComponent | Partial<EcoComponent> | undefined | null>, integrationName: string): Promise<ProcessedAsset[]>;
24
35
  }
@@ -1,8 +1,8 @@
1
1
  import path from "node:path";
2
2
  import { readFileSync } from "node:fs";
3
- import { rapidhash } from "../utils/hash.js";
4
- import { AssetFactory } from "../services/asset-processing-service/index.js";
5
- import { normalizeModuleDeclarations } from "../eco/module-dependencies.js";
3
+ import { rapidhash } from "../../utils/hash.js";
4
+ import { AssetFactory } from "../../services/assets/asset-processing-service/index.js";
5
+ import { normalizeModuleDeclarations } from "../../eco/module-dependencies.js";
6
6
  import { parseSync } from "oxc-parser";
7
7
  const DEPENDENCY_ERRORS = {
8
8
  INVALID_STYLESHEET_ENTRY: "Invalid stylesheet dependency entry: expected src or content",
@@ -139,10 +139,23 @@ function buildResolvedLazyTriggers(config, groups) {
139
139
  return [{ triggerId, rules }];
140
140
  }
141
141
  class DependencyResolverService {
142
+ appConfig;
143
+ assetProcessingService;
144
+ /**
145
+ * Creates the dependency resolver used by route and component rendering.
146
+ *
147
+ * @remarks
148
+ * The resolver stays intentionally separate from HTML rendering so component
149
+ * dependency collection, lazy trigger grouping, and processed-asset generation
150
+ * can evolve without changing renderer implementations.
151
+ */
142
152
  constructor(appConfig, assetProcessingService) {
143
153
  this.appConfig = appConfig;
144
154
  this.assetProcessingService = assetProcessingService;
145
155
  }
156
+ /**
157
+ * Resolves one dependency path relative to the component that declared it.
158
+ */
146
159
  resolveDependencyPath(componentDir, pathUrl) {
147
160
  return resolveDependencyPath(componentDir, pathUrl);
148
161
  }
@@ -163,6 +176,7 @@ class DependencyResolverService {
163
176
  const lazyScriptsByConfig = /* @__PURE__ */ new Map();
164
177
  const lazyDependencyKeys = /* @__PURE__ */ new Set();
165
178
  for (const component of components) {
179
+ if (!component) continue;
166
180
  const componentFile = component.config?.__eco?.file;
167
181
  if (!componentFile) continue;
168
182
  const stylesheetDependencyKeys = /* @__PURE__ */ new Set();
@@ -357,7 +371,7 @@ class DependencyResolverService {
357
371
  }
358
372
  if (dependenciesConfig?.components) {
359
373
  for (const nestedComponent of dependenciesConfig.components) {
360
- if (nestedComponent.config) {
374
+ if (nestedComponent?.config) {
361
375
  collect(nestedComponent.config);
362
376
  }
363
377
  }