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

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 (454) hide show
  1. package/README.md +268 -14
  2. package/package.json +92 -110
  3. package/src/adapters/README.md +39 -0
  4. package/src/adapters/abstract/application-adapter.d.ts +28 -2
  5. package/src/adapters/abstract/application-adapter.js +14 -2
  6. package/src/adapters/abstract/router-adapter.d.ts +1 -1
  7. package/src/adapters/abstract/server-adapter.d.ts +2 -2
  8. package/src/adapters/bun/client-bridge.d.ts +1 -1
  9. package/src/adapters/bun/create-app.d.ts +12 -12
  10. package/src/adapters/bun/create-app.js +64 -41
  11. package/src/adapters/bun/hmr-manager.d.ts +30 -68
  12. package/src/adapters/bun/hmr-manager.js +30 -212
  13. package/src/adapters/bun/index.d.ts +2 -3
  14. package/src/adapters/bun/index.js +3 -3
  15. package/src/adapters/bun/runtime-host.d.ts +52 -0
  16. package/src/adapters/bun/runtime-host.js +56 -0
  17. package/src/adapters/bun/server-adapter.d.ts +93 -32
  18. package/src/adapters/bun/server-adapter.js +166 -89
  19. package/src/adapters/bun/static-preview-host.d.ts +28 -0
  20. package/src/adapters/bun/static-preview-host.js +45 -0
  21. package/src/{create-app.d.ts → adapters/create-app.d.ts} +9 -6
  22. package/src/{create-app.js → adapters/create-app.js} +4 -4
  23. package/src/adapters/index.d.ts +2 -6
  24. package/src/adapters/index.js +2 -8
  25. package/src/adapters/node/create-app.d.ts +15 -12
  26. package/src/adapters/node/create-app.js +34 -85
  27. package/src/adapters/node/http-request-bridge.d.ts +57 -0
  28. package/src/adapters/node/http-request-bridge.js +118 -0
  29. package/src/adapters/node/node-client-bridge.d.ts +1 -1
  30. package/src/adapters/node/node-hmr-manager.d.ts +38 -49
  31. package/src/adapters/node/node-hmr-manager.js +31 -219
  32. package/src/adapters/node/runtime-host.d.ts +57 -0
  33. package/src/adapters/node/runtime-host.js +92 -0
  34. package/src/adapters/node/server-adapter-dependencies.d.ts +19 -0
  35. package/src/adapters/node/server-adapter-dependencies.js +18 -0
  36. package/src/adapters/node/server-adapter.d.ts +20 -72
  37. package/src/adapters/node/server-adapter.js +99 -203
  38. package/src/adapters/node/static-content-server.d.ts +37 -1
  39. package/src/adapters/node/static-content-server.js +29 -1
  40. package/src/adapters/node/static-preview-host.d.ts +55 -0
  41. package/src/adapters/node/static-preview-host.js +68 -0
  42. package/src/adapters/shared/application-adapter.d.ts +1 -1
  43. package/src/{define-api-handler.d.ts → adapters/shared/define-api-handler.d.ts} +1 -1
  44. package/src/adapters/shared/explicit-static-render-preparation.d.ts +25 -0
  45. package/src/adapters/shared/explicit-static-render-preparation.js +26 -0
  46. package/src/adapters/shared/explicit-static-route-matcher.d.ts +7 -4
  47. package/src/adapters/shared/explicit-static-route-matcher.js +14 -13
  48. package/src/adapters/shared/file-route-middleware-pipeline.d.ts +7 -10
  49. package/src/adapters/shared/file-route-middleware-pipeline.js +3 -11
  50. package/src/adapters/shared/fs-server-response-factory.d.ts +14 -10
  51. package/src/adapters/shared/fs-server-response-factory.js +11 -27
  52. package/src/adapters/shared/fs-server-response-matcher.d.ts +20 -16
  53. package/src/adapters/shared/fs-server-response-matcher.js +76 -45
  54. package/src/adapters/shared/hmr-entrypoint-registrar.d.ts +55 -0
  55. package/src/adapters/shared/hmr-entrypoint-registrar.js +87 -0
  56. package/src/adapters/shared/hmr-html-response.d.ts +22 -0
  57. package/src/adapters/shared/hmr-html-response.js +33 -0
  58. package/src/adapters/shared/render-context.d.ts +5 -3
  59. package/src/adapters/shared/render-context.js +27 -3
  60. package/src/adapters/shared/runtime-app-bootstrap.d.ts +26 -0
  61. package/src/adapters/shared/runtime-app-bootstrap.js +46 -0
  62. package/src/adapters/shared/runtime-host.d.ts +12 -0
  63. package/src/adapters/shared/server-adapter.d.ts +33 -12
  64. package/src/adapters/shared/server-adapter.js +215 -132
  65. package/src/adapters/shared/server-route-handler.d.ts +5 -5
  66. package/src/adapters/shared/server-route-handler.js +7 -16
  67. package/src/adapters/shared/server-static-builder.d.ts +41 -8
  68. package/src/adapters/shared/server-static-builder.js +65 -11
  69. package/src/adapters/shared/shared-hmr-manager.d.ts +59 -0
  70. package/src/adapters/shared/shared-hmr-manager.js +240 -0
  71. package/src/adapters/shared/static-preview-host.d.ts +10 -0
  72. package/src/build/README.md +107 -0
  73. package/src/build/build-adapter.d.ts +176 -3
  74. package/src/build/build-adapter.js +619 -16
  75. package/src/build/build-manifest.d.ts +27 -0
  76. package/src/build/build-manifest.js +30 -0
  77. package/src/build/dev-build-coordinator.d.ts +72 -0
  78. package/src/build/dev-build-coordinator.js +154 -0
  79. package/src/build/esbuild-build-adapter.d.ts +16 -6
  80. package/src/build/esbuild-build-adapter.js +202 -74
  81. package/src/build/runtime-build-executor.d.ts +14 -0
  82. package/src/build/runtime-build-executor.js +22 -0
  83. package/src/build/runtime-specifier-alias-plugin.d.ts +15 -0
  84. package/src/build/runtime-specifier-alias-plugin.js +35 -0
  85. package/src/build/runtime-specifier-aliases.d.ts +5 -0
  86. package/src/build/runtime-specifier-aliases.js +95 -0
  87. package/src/config/README.md +36 -0
  88. package/src/config/config-builder.d.ts +54 -29
  89. package/src/config/config-builder.js +256 -50
  90. package/src/{constants.d.ts → config/constants.d.ts} +13 -0
  91. package/src/{constants.js → config/constants.js} +4 -0
  92. package/src/declarations.d.ts +19 -14
  93. package/src/dev/host-runtime.d.ts +10 -0
  94. package/src/dev/host-runtime.js +24 -0
  95. package/src/dev/sc-server.d.ts +1 -1
  96. package/src/dev/sc-server.js +1 -1
  97. package/src/eco/README.md +70 -16
  98. package/src/eco/eco.browser.d.ts +2 -0
  99. package/src/eco/eco.browser.js +88 -0
  100. package/src/eco/eco.js +63 -54
  101. package/src/eco/eco.types.d.ts +69 -6
  102. package/src/eco/eco.utils.d.ts +1 -40
  103. package/src/eco/eco.utils.js +5 -35
  104. package/src/eco/global-injector-map.d.ts +3 -3
  105. package/src/eco/global-injector-map.js +2 -2
  106. package/src/eco/lazy-injector-map.d.ts +2 -2
  107. package/src/errors/index.d.ts +1 -0
  108. package/src/errors/index.js +3 -1
  109. package/src/hmr/README.md +26 -0
  110. package/src/hmr/client/hmr-runtime.d.ts +1 -6
  111. package/src/hmr/client/hmr-runtime.js +38 -7
  112. package/src/hmr/hmr-strategy.d.ts +16 -13
  113. package/src/hmr/hmr-strategy.js +22 -7
  114. package/src/hmr/hmr.postcss.test.e2e.d.ts +1 -0
  115. package/src/hmr/hmr.postcss.test.e2e.js +31 -0
  116. package/src/hmr/hmr.test.e2e.js +26 -33
  117. package/src/hmr/strategies/default-hmr-strategy.d.ts +2 -2
  118. package/src/hmr/strategies/default-hmr-strategy.js +1 -1
  119. package/src/hmr/strategies/js-hmr-strategy.d.ts +46 -48
  120. package/src/hmr/strategies/js-hmr-strategy.js +60 -75
  121. package/src/index.browser.d.ts +2 -2
  122. package/src/index.browser.js +1 -1
  123. package/src/index.d.ts +4 -3
  124. package/src/index.js +16 -5
  125. package/src/integrations/ghtml/ghtml-renderer.d.ts +3 -2
  126. package/src/integrations/ghtml/ghtml-renderer.js +27 -30
  127. package/src/integrations/ghtml/ghtml.constants.d.ts +1 -0
  128. package/src/integrations/ghtml/ghtml.constants.js +4 -0
  129. package/src/integrations/ghtml/ghtml.plugin.d.ts +2 -6
  130. package/src/integrations/ghtml/ghtml.plugin.js +3 -4
  131. package/src/plugins/README.md +35 -0
  132. package/src/plugins/alias-resolver-plugin.d.ts +1 -0
  133. package/src/plugins/alias-resolver-plugin.js +27 -5
  134. package/src/plugins/eco-component-meta-plugin.d.ts +14 -1
  135. package/src/plugins/eco-component-meta-plugin.js +42 -24
  136. package/src/plugins/foreign-jsx-override-plugin.d.ts +33 -0
  137. package/src/plugins/foreign-jsx-override-plugin.js +41 -0
  138. package/src/plugins/integration-plugin.d.ts +147 -29
  139. package/src/plugins/integration-plugin.js +103 -14
  140. package/src/plugins/processor.d.ts +17 -2
  141. package/src/plugins/processor.js +22 -3
  142. package/src/plugins/runtime-capability.d.ts +9 -0
  143. package/src/plugins/source-transform.d.ts +46 -0
  144. package/src/plugins/source-transform.js +71 -0
  145. package/src/route-renderer/GRAPH.md +83 -325
  146. package/src/route-renderer/README.md +73 -90
  147. package/src/route-renderer/orchestration/component-render-context.d.ts +97 -0
  148. package/src/route-renderer/orchestration/component-render-context.js +147 -0
  149. package/src/route-renderer/orchestration/declared-ownership-graph.d.ts +18 -0
  150. package/src/route-renderer/orchestration/declared-ownership-graph.js +34 -0
  151. package/src/route-renderer/orchestration/foreign-subtree-execution.service.d.ts +110 -0
  152. package/src/route-renderer/orchestration/foreign-subtree-execution.service.js +233 -0
  153. package/src/route-renderer/orchestration/integration-renderer.d.ts +534 -0
  154. package/src/route-renderer/orchestration/integration-renderer.js +986 -0
  155. package/src/route-renderer/orchestration/ownership-planning.service.d.ts +24 -0
  156. package/src/route-renderer/orchestration/ownership-planning.service.js +63 -0
  157. package/src/route-renderer/orchestration/ownership-validation.service.d.ts +29 -0
  158. package/src/route-renderer/orchestration/ownership-validation.service.js +53 -0
  159. package/src/route-renderer/orchestration/processed-asset-dedupe.d.ts +3 -0
  160. package/src/route-renderer/orchestration/processed-asset-dedupe.js +27 -0
  161. package/src/route-renderer/orchestration/queued-foreign-subtree-resolution.service.d.ts +91 -0
  162. package/src/route-renderer/orchestration/queued-foreign-subtree-resolution.service.js +170 -0
  163. package/src/route-renderer/orchestration/render-output.utils.d.ts +66 -0
  164. package/src/route-renderer/orchestration/render-output.utils.js +171 -0
  165. package/src/route-renderer/orchestration/route-render-orchestrator.d.ts +134 -0
  166. package/src/route-renderer/orchestration/route-render-orchestrator.js +442 -0
  167. package/src/route-renderer/orchestration/template-serialization.d.ts +38 -0
  168. package/src/route-renderer/orchestration/template-serialization.js +45 -0
  169. package/src/route-renderer/page-loading/component-dependency-collection.d.ts +37 -0
  170. package/src/route-renderer/page-loading/component-dependency-collection.js +132 -0
  171. package/src/route-renderer/page-loading/declared-asset-collection.d.ts +24 -0
  172. package/src/route-renderer/page-loading/declared-asset-collection.js +106 -0
  173. package/src/route-renderer/{dependency-resolver.d.ts → page-loading/dependency-resolver.d.ts} +15 -4
  174. package/src/route-renderer/page-loading/dependency-resolver.js +115 -0
  175. package/src/route-renderer/page-loading/ecopages-virtual-imports.d.ts +11 -0
  176. package/src/route-renderer/page-loading/ecopages-virtual-imports.js +57 -0
  177. package/src/route-renderer/page-loading/lazy-entry-collection.d.ts +45 -0
  178. package/src/route-renderer/page-loading/lazy-entry-collection.js +105 -0
  179. package/src/route-renderer/page-loading/lazy-trigger-planning.d.ts +19 -0
  180. package/src/route-renderer/page-loading/lazy-trigger-planning.js +40 -0
  181. package/src/route-renderer/page-loading/module-declaration-aggregation.d.ts +5 -0
  182. package/src/route-renderer/page-loading/module-declaration-aggregation.js +33 -0
  183. package/src/route-renderer/page-loading/module-declaration-scripts.d.ts +3 -0
  184. package/src/route-renderer/page-loading/module-declaration-scripts.js +18 -0
  185. package/src/route-renderer/page-loading/page-dependency-bundling.d.ts +13 -0
  186. package/src/route-renderer/page-loading/page-dependency-bundling.js +137 -0
  187. package/src/route-renderer/page-loading/page-module-loader.d.ts +90 -0
  188. package/src/route-renderer/{page-module-loader.js → page-loading/page-module-loader.js} +39 -14
  189. package/src/route-renderer/route-renderer.d.ts +57 -14
  190. package/src/route-renderer/route-renderer.js +30 -18
  191. package/src/router/README.md +94 -0
  192. package/src/router/client/link-intent.d.ts +53 -0
  193. package/src/router/client/link-intent.js +34 -0
  194. package/src/router/client/link-intent.test.browser.d.ts +1 -0
  195. package/src/router/client/link-intent.test.browser.js +43 -0
  196. package/src/router/client/navigation-coordinator.d.ts +169 -0
  197. package/src/router/client/navigation-coordinator.js +215 -0
  198. package/src/router/server/route-registry.d.ts +78 -0
  199. package/src/router/server/route-registry.js +262 -0
  200. package/src/services/README.md +28 -0
  201. package/src/services/assets/asset-processing-service/asset-dependency-keys.d.ts +3 -0
  202. package/src/services/assets/asset-processing-service/asset-dependency-keys.js +56 -0
  203. package/src/services/assets/asset-processing-service/asset-processing.service.d.ts +103 -0
  204. package/src/services/{asset-processing-service → assets/asset-processing-service}/asset-processing.service.js +124 -89
  205. package/src/services/{asset-processing-service → assets/asset-processing-service}/asset.factory.d.ts +1 -1
  206. package/src/services/{asset-processing-service → assets/asset-processing-service}/asset.factory.js +2 -2
  207. package/src/services/{asset-processing-service → assets/asset-processing-service}/assets.types.d.ts +16 -1
  208. package/src/services/assets/asset-processing-service/assets.types.js +0 -0
  209. package/src/services/assets/asset-processing-service/browser-runtime-asset.factory.d.ts +55 -0
  210. package/src/services/assets/asset-processing-service/browser-runtime-asset.factory.js +49 -0
  211. package/src/services/assets/asset-processing-service/browser-runtime-entry.factory.d.ts +20 -0
  212. package/src/services/assets/asset-processing-service/browser-runtime-entry.factory.js +41 -0
  213. package/src/services/assets/asset-processing-service/grouped-content-bundles.d.ts +30 -0
  214. package/src/services/assets/asset-processing-service/grouped-content-bundles.js +65 -0
  215. package/src/services/assets/asset-processing-service/index.d.ts +6 -0
  216. package/src/services/assets/asset-processing-service/index.js +6 -0
  217. package/src/services/assets/asset-processing-service/page-package.d.ts +6 -0
  218. package/src/services/assets/asset-processing-service/page-package.js +80 -0
  219. package/src/services/{asset-processing-service → assets/asset-processing-service}/processor.interface.d.ts +2 -2
  220. package/src/services/{asset-processing-service → assets/asset-processing-service}/processor.registry.d.ts +2 -2
  221. package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/base/base-processor.d.ts +1 -1
  222. package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/base/base-processor.js +11 -5
  223. package/src/services/assets/asset-processing-service/processors/base/base-script-processor.d.ts +22 -0
  224. package/src/services/assets/asset-processing-service/processors/base/base-script-processor.js +136 -0
  225. package/src/services/assets/asset-processing-service/processors/index.d.ts +5 -0
  226. package/src/services/assets/asset-processing-service/processors/index.js +5 -0
  227. package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/script/content-script.processor.d.ts +3 -2
  228. package/src/services/assets/asset-processing-service/processors/script/content-script.processor.js +119 -0
  229. package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/script/file-script.processor.d.ts +4 -3
  230. package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/script/file-script.processor.js +28 -7
  231. package/src/services/assets/asset-processing-service/processors/script/node-module-script.processor.d.ts +42 -0
  232. package/src/services/assets/asset-processing-service/processors/script/node-module-script.processor.js +126 -0
  233. package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/stylesheet/content-stylesheet.processor.d.ts +5 -2
  234. package/src/services/assets/asset-processing-service/processors/stylesheet/content-stylesheet.processor.js +59 -0
  235. package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/stylesheet/file-stylesheet.processor.d.ts +2 -2
  236. package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/stylesheet/file-stylesheet.processor.js +9 -3
  237. package/src/services/assets/asset-processing-service/ungrouped-dependency-processing.d.ts +18 -0
  238. package/src/services/assets/asset-processing-service/ungrouped-dependency-processing.js +45 -0
  239. package/src/services/assets/browser-bundle.service.d.ts +73 -0
  240. package/src/services/assets/browser-bundle.service.js +41 -0
  241. package/src/services/{page-request-cache-coordinator.service.d.ts → cache/page-request-cache-coordinator.service.d.ts} +2 -2
  242. package/src/services/{page-request-cache-coordinator.service.js → cache/page-request-cache-coordinator.service.js} +3 -1
  243. package/src/services/html/html-rewriter-provider.service.d.ts +40 -0
  244. package/src/services/html/html-rewriter-provider.service.js +68 -0
  245. package/src/services/html/html-transformer.service.d.ts +96 -0
  246. package/src/services/html/html-transformer.service.js +287 -0
  247. package/src/services/invalidation/development-invalidation.service.d.ts +74 -0
  248. package/src/services/invalidation/development-invalidation.service.js +190 -0
  249. package/src/services/module-loading/app-module-loader.service.d.ts +7 -0
  250. package/src/services/module-loading/app-module-loader.service.js +0 -0
  251. package/src/services/module-loading/app-server-module-transpiler.service.d.ts +24 -0
  252. package/src/services/module-loading/app-server-module-transpiler.service.js +151 -0
  253. package/src/services/module-loading/host-module-loader-registry.d.ts +4 -0
  254. package/src/services/module-loading/host-module-loader-registry.js +15 -0
  255. package/src/services/module-loading/module-loading-types.d.ts +2 -0
  256. package/src/services/module-loading/module-loading-types.js +0 -0
  257. package/src/services/module-loading/node-bootstrap-plugin.d.ts +42 -0
  258. package/src/services/module-loading/node-bootstrap-plugin.js +297 -0
  259. package/src/services/module-loading/page-module-import.service.d.ts +95 -0
  260. package/src/services/module-loading/page-module-import.service.js +191 -0
  261. package/src/services/module-loading/server-module-transpiler.service.d.ts +63 -0
  262. package/src/services/module-loading/server-module-transpiler.service.js +64 -0
  263. package/src/services/module-loading/source-module-support.d.ts +5 -0
  264. package/src/services/module-loading/source-module-support.js +8 -0
  265. package/src/services/runtime-state/dev-graph.service.d.ts +118 -0
  266. package/src/services/runtime-state/dev-graph.service.js +162 -0
  267. package/src/services/runtime-state/entrypoint-dependency-graph.service.d.ts +41 -0
  268. package/src/services/runtime-state/entrypoint-dependency-graph.service.js +85 -0
  269. package/src/services/runtime-state/server-invalidation-state.service.d.ts +26 -0
  270. package/src/services/runtime-state/server-invalidation-state.service.js +35 -0
  271. package/src/services/{schema-validation-service.d.ts → validation/schema-validation-service.d.ts} +1 -1
  272. package/src/static-site-generator/README.md +26 -0
  273. package/src/static-site-generator/static-site-generator.d.ts +67 -20
  274. package/src/static-site-generator/static-site-generator.js +182 -138
  275. package/src/{internal-types.d.ts → types/internal-types.d.ts} +62 -30
  276. package/src/types/internal-types.js +0 -0
  277. package/src/{public-types.d.ts → types/public-types.d.ts} +239 -35
  278. package/src/types/public-types.js +0 -0
  279. package/src/utils/html-escaping.d.ts +7 -0
  280. package/src/utils/html-escaping.js +6 -0
  281. package/src/utils/locals-utils.d.ts +1 -1
  282. package/src/utils/parse-cli-args.d.ts +4 -1
  283. package/src/utils/parse-cli-args.js +16 -1
  284. package/src/utils/resolve-work-dir.d.ts +11 -0
  285. package/src/utils/resolve-work-dir.js +31 -0
  286. package/src/watchers/project-watcher.d.ts +40 -29
  287. package/src/watchers/project-watcher.js +126 -116
  288. package/src/watchers/project-watcher.test-helpers.d.ts +2 -2
  289. package/src/watchers/project-watcher.test-helpers.js +6 -6
  290. package/CHANGELOG.md +0 -91
  291. package/src/adapters/abstract/application-adapter.ts +0 -337
  292. package/src/adapters/abstract/router-adapter.ts +0 -30
  293. package/src/adapters/abstract/server-adapter.ts +0 -79
  294. package/src/adapters/bun/client-bridge.ts +0 -62
  295. package/src/adapters/bun/create-app.ts +0 -189
  296. package/src/adapters/bun/define-api-handler.d.ts +0 -61
  297. package/src/adapters/bun/define-api-handler.ts +0 -114
  298. package/src/adapters/bun/hmr-manager.ts +0 -296
  299. package/src/adapters/bun/index.ts +0 -3
  300. package/src/adapters/bun/server-adapter.ts +0 -492
  301. package/src/adapters/bun/server-lifecycle.d.ts +0 -52
  302. package/src/adapters/bun/server-lifecycle.js +0 -120
  303. package/src/adapters/bun/server-lifecycle.ts +0 -154
  304. package/src/adapters/index.ts +0 -6
  305. package/src/adapters/node/create-app.ts +0 -179
  306. package/src/adapters/node/index.d.ts +0 -4
  307. package/src/adapters/node/index.js +0 -8
  308. package/src/adapters/node/index.ts +0 -9
  309. package/src/adapters/node/node-client-bridge.ts +0 -79
  310. package/src/adapters/node/node-hmr-manager.ts +0 -289
  311. package/src/adapters/node/server-adapter.ts +0 -561
  312. package/src/adapters/node/static-content-server.ts +0 -203
  313. package/src/adapters/shared/api-response.ts +0 -104
  314. package/src/adapters/shared/application-adapter.ts +0 -199
  315. package/src/adapters/shared/explicit-static-route-matcher.ts +0 -134
  316. package/src/adapters/shared/file-route-middleware-pipeline.ts +0 -123
  317. package/src/adapters/shared/fs-server-response-factory.ts +0 -118
  318. package/src/adapters/shared/fs-server-response-matcher.ts +0 -198
  319. package/src/adapters/shared/render-context.ts +0 -105
  320. package/src/adapters/shared/server-adapter.ts +0 -442
  321. package/src/adapters/shared/server-route-handler.ts +0 -166
  322. package/src/adapters/shared/server-static-builder.ts +0 -82
  323. package/src/build/build-adapter.ts +0 -132
  324. package/src/build/build-types.ts +0 -83
  325. package/src/build/esbuild-build-adapter.ts +0 -510
  326. package/src/config/config-builder.ts +0 -474
  327. package/src/constants.ts +0 -39
  328. package/src/create-app.ts +0 -87
  329. package/src/define-api-handler.js +0 -15
  330. package/src/define-api-handler.ts +0 -66
  331. package/src/dev/sc-server.ts +0 -143
  332. package/src/eco/component-render-context.d.ts +0 -105
  333. package/src/eco/component-render-context.js +0 -77
  334. package/src/eco/component-render-context.ts +0 -202
  335. package/src/eco/eco.ts +0 -221
  336. package/src/eco/eco.types.ts +0 -202
  337. package/src/eco/eco.utils.ts +0 -89
  338. package/src/eco/global-injector-map.ts +0 -112
  339. package/src/eco/lazy-injector-map.ts +0 -120
  340. package/src/eco/module-dependencies.ts +0 -75
  341. package/src/errors/http-error.ts +0 -72
  342. package/src/errors/index.ts +0 -2
  343. package/src/errors/locals-access-error.ts +0 -7
  344. package/src/global/app-logger.ts +0 -4
  345. package/src/hmr/client/hmr-runtime.ts +0 -121
  346. package/src/hmr/hmr-strategy.ts +0 -172
  347. package/src/hmr/hmr.test.e2e.ts +0 -75
  348. package/src/hmr/strategies/default-hmr-strategy.ts +0 -60
  349. package/src/hmr/strategies/js-hmr-strategy.ts +0 -320
  350. package/src/index.browser.ts +0 -3
  351. package/src/index.ts +0 -5
  352. package/src/integrations/ghtml/ghtml-renderer.ts +0 -93
  353. package/src/integrations/ghtml/ghtml.plugin.ts +0 -32
  354. package/src/internal-types.ts +0 -212
  355. package/src/plugins/alias-resolver-plugin.ts +0 -45
  356. package/src/plugins/eco-component-meta-plugin.ts +0 -474
  357. package/src/plugins/integration-plugin.ts +0 -184
  358. package/src/plugins/processor.ts +0 -220
  359. package/src/public-types.ts +0 -1260
  360. package/src/route-renderer/component-graph-executor.d.ts +0 -32
  361. package/src/route-renderer/component-graph-executor.js +0 -31
  362. package/src/route-renderer/component-graph-executor.ts +0 -84
  363. package/src/route-renderer/component-graph.d.ts +0 -42
  364. package/src/route-renderer/component-graph.js +0 -72
  365. package/src/route-renderer/component-graph.ts +0 -159
  366. package/src/route-renderer/component-marker.d.ts +0 -52
  367. package/src/route-renderer/component-marker.js +0 -46
  368. package/src/route-renderer/component-marker.ts +0 -117
  369. package/src/route-renderer/dependency-resolver.js +0 -428
  370. package/src/route-renderer/dependency-resolver.ts +0 -596
  371. package/src/route-renderer/html-post-processing.service.d.ts +0 -40
  372. package/src/route-renderer/html-post-processing.service.js +0 -86
  373. package/src/route-renderer/html-post-processing.service.ts +0 -103
  374. package/src/route-renderer/integration-renderer.d.ts +0 -339
  375. package/src/route-renderer/integration-renderer.js +0 -526
  376. package/src/route-renderer/integration-renderer.ts +0 -696
  377. package/src/route-renderer/marker-graph-resolver.d.ts +0 -76
  378. package/src/route-renderer/marker-graph-resolver.js +0 -93
  379. package/src/route-renderer/marker-graph-resolver.ts +0 -153
  380. package/src/route-renderer/page-module-loader.d.ts +0 -61
  381. package/src/route-renderer/page-module-loader.ts +0 -153
  382. package/src/route-renderer/render-execution.service.d.ts +0 -69
  383. package/src/route-renderer/render-execution.service.js +0 -91
  384. package/src/route-renderer/render-execution.service.ts +0 -158
  385. package/src/route-renderer/render-preparation.service.d.ts +0 -112
  386. package/src/route-renderer/render-preparation.service.js +0 -243
  387. package/src/route-renderer/render-preparation.service.ts +0 -358
  388. package/src/route-renderer/route-renderer.ts +0 -80
  389. package/src/router/fs-router-scanner.d.ts +0 -41
  390. package/src/router/fs-router-scanner.js +0 -155
  391. package/src/router/fs-router-scanner.ts +0 -217
  392. package/src/router/fs-router.d.ts +0 -26
  393. package/src/router/fs-router.js +0 -100
  394. package/src/router/fs-router.ts +0 -122
  395. package/src/services/asset-processing-service/asset-processing.service.d.ts +0 -41
  396. package/src/services/asset-processing-service/asset-processing.service.ts +0 -306
  397. package/src/services/asset-processing-service/asset.factory.ts +0 -105
  398. package/src/services/asset-processing-service/assets.types.ts +0 -112
  399. package/src/services/asset-processing-service/index.d.ts +0 -3
  400. package/src/services/asset-processing-service/index.js +0 -3
  401. package/src/services/asset-processing-service/index.ts +0 -3
  402. package/src/services/asset-processing-service/processor.interface.ts +0 -27
  403. package/src/services/asset-processing-service/processor.registry.ts +0 -18
  404. package/src/services/asset-processing-service/processors/base/base-processor.ts +0 -76
  405. package/src/services/asset-processing-service/processors/base/base-script-processor.d.ts +0 -16
  406. package/src/services/asset-processing-service/processors/base/base-script-processor.js +0 -80
  407. package/src/services/asset-processing-service/processors/base/base-script-processor.ts +0 -105
  408. package/src/services/asset-processing-service/processors/index.d.ts +0 -5
  409. package/src/services/asset-processing-service/processors/index.js +0 -5
  410. package/src/services/asset-processing-service/processors/index.ts +0 -5
  411. package/src/services/asset-processing-service/processors/script/content-script.processor.js +0 -57
  412. package/src/services/asset-processing-service/processors/script/content-script.processor.ts +0 -66
  413. package/src/services/asset-processing-service/processors/script/file-script.processor.ts +0 -88
  414. package/src/services/asset-processing-service/processors/script/node-module-script.processor.d.ts +0 -7
  415. package/src/services/asset-processing-service/processors/script/node-module-script.processor.js +0 -74
  416. package/src/services/asset-processing-service/processors/script/node-module-script.processor.ts +0 -84
  417. package/src/services/asset-processing-service/processors/stylesheet/content-stylesheet.processor.js +0 -25
  418. package/src/services/asset-processing-service/processors/stylesheet/content-stylesheet.processor.ts +0 -27
  419. package/src/services/asset-processing-service/processors/stylesheet/file-stylesheet.processor.ts +0 -77
  420. package/src/services/cache/cache.types.ts +0 -126
  421. package/src/services/cache/index.ts +0 -18
  422. package/src/services/cache/memory-cache-store.ts +0 -130
  423. package/src/services/cache/page-cache-service.ts +0 -202
  424. package/src/services/html-transformer.service.d.ts +0 -50
  425. package/src/services/html-transformer.service.js +0 -163
  426. package/src/services/html-transformer.service.ts +0 -217
  427. package/src/services/page-module-import.service.d.ts +0 -37
  428. package/src/services/page-module-import.service.js +0 -88
  429. package/src/services/page-module-import.service.ts +0 -129
  430. package/src/services/page-request-cache-coordinator.service.ts +0 -128
  431. package/src/services/schema-validation-service.ts +0 -204
  432. package/src/services/validation/standard-schema.types.ts +0 -68
  433. package/src/static-site-generator/static-site-generator.ts +0 -359
  434. package/src/utils/css.d.ts +0 -1
  435. package/src/utils/css.js +0 -7
  436. package/src/utils/css.ts +0 -5
  437. package/src/utils/deep-merge.ts +0 -47
  438. package/src/utils/hash.ts +0 -5
  439. package/src/utils/html.ts +0 -1
  440. package/src/utils/invariant.ts +0 -15
  441. package/src/utils/locals-utils.ts +0 -37
  442. package/src/utils/parse-cli-args.ts +0 -83
  443. package/src/utils/path-utils.module.ts +0 -14
  444. package/src/utils/runtime.ts +0 -44
  445. package/src/utils/server-utils.module.ts +0 -67
  446. package/src/watchers/project-watcher.test-helpers.ts +0 -41
  447. package/src/watchers/project-watcher.ts +0 -344
  448. /package/src/adapters/{bun → shared}/define-api-handler.js +0 -0
  449. /package/src/{internal-types.js → adapters/shared/runtime-host.js} +0 -0
  450. /package/src/{public-types.js → adapters/shared/static-preview-host.js} +0 -0
  451. /package/src/{services/asset-processing-service/assets.types.js → plugins/runtime-capability.js} +0 -0
  452. /package/src/services/{asset-processing-service → assets/asset-processing-service}/processor.interface.js +0 -0
  453. /package/src/services/{asset-processing-service → assets/asset-processing-service}/processor.registry.js +0 -0
  454. /package/src/services/{schema-validation-service.js → validation/schema-validation-service.js} +0 -0
@@ -0,0 +1,442 @@
1
+ import { createRequire } from "node:module";
2
+ import path from "node:path";
3
+ import {
4
+ AssetFactory,
5
+ createPagePackage
6
+ } from "../../services/assets/asset-processing-service/index.js";
7
+ import { buildGlobalInjectorBootstrapContent, buildGlobalInjectorMapScript } from "../../eco/global-injector-map.js";
8
+ import { LocalsAccessError } from "../../errors/locals-access-error.js";
9
+ import { inspectUnresolvedMarkerArtifactHtml } from "./render-output.utils.js";
10
+ import { OwnershipValidationService } from "./ownership-validation.service.js";
11
+ import { OwnershipPlanningService } from "./ownership-planning.service.js";
12
+ import { dedupeProcessedAssets } from "./processed-asset-dedupe.js";
13
+ function createPageLocalsProxy(filePath) {
14
+ const errorMessage = `[ecopages] Request locals are only available during request-time rendering with cache: 'dynamic'. Page: ${filePath}. If you meant to use locals here, set cache: 'dynamic' and provide locals from route middleware/handlers.`;
15
+ return new Proxy(
16
+ {},
17
+ {
18
+ get: () => {
19
+ throw new LocalsAccessError(errorMessage);
20
+ },
21
+ set: () => {
22
+ throw new LocalsAccessError(errorMessage);
23
+ },
24
+ has: () => {
25
+ throw new LocalsAccessError(errorMessage);
26
+ },
27
+ ownKeys: () => {
28
+ throw new LocalsAccessError(errorMessage);
29
+ },
30
+ deleteProperty: () => {
31
+ throw new LocalsAccessError(errorMessage);
32
+ },
33
+ defineProperty: () => {
34
+ throw new LocalsAccessError(errorMessage);
35
+ },
36
+ getOwnPropertyDescriptor: () => {
37
+ throw new LocalsAccessError(errorMessage);
38
+ }
39
+ }
40
+ );
41
+ }
42
+ class RouteRenderOrchestrator {
43
+ appConfig;
44
+ assetProcessingService;
45
+ ownershipPlanningService;
46
+ ownershipValidationService;
47
+ pageBrowserGraphCache = /* @__PURE__ */ new Map();
48
+ constructor(appConfig, assetProcessingService, dependencies = {}) {
49
+ this.appConfig = appConfig;
50
+ this.assetProcessingService = assetProcessingService;
51
+ this.ownershipPlanningService = dependencies.ownershipPlanningService ?? new OwnershipPlanningService();
52
+ this.ownershipValidationService = dependencies.ownershipValidationService ?? new OwnershipValidationService(appConfig);
53
+ }
54
+ /**
55
+ * Builds normalized route render options before the integration render runs.
56
+ *
57
+ * This preparation step validates route-root ownership, resolves page data,
58
+ * collects processed assets, captures optional page-root render metadata, and
59
+ * produces the page package consumed by downstream HTML transformation.
60
+ */
61
+ async prepareRenderOptions(routeOptions, adapter) {
62
+ const resolvedInputs = await adapter.resolveRouteRenderInputs(routeOptions);
63
+ const { Page, HtmlTemplate, Layout, props, metadata, integrationSpecificProps } = resolvedInputs;
64
+ const validationErrors = this.ownershipValidationService.validate({
65
+ currentIntegrationName: adapter.name,
66
+ roots: [
67
+ { component: HtmlTemplate, source: "html-template" },
68
+ ...Layout ? [{ component: Layout, source: "layout" }] : [],
69
+ { component: Page, source: "page" }
70
+ ]
71
+ });
72
+ const ownershipPlan = this.ownershipPlanningService.buildPlan({
73
+ routeFile: routeOptions.file,
74
+ currentIntegrationName: adapter.name,
75
+ HtmlTemplate,
76
+ Layout,
77
+ Page,
78
+ validationErrors
79
+ });
80
+ const componentsToResolve = Layout ? [HtmlTemplate, Layout, Page] : [HtmlTemplate, Page];
81
+ const { resolvedDependencies } = await adapter.resolveRouteDependencies({
82
+ components: componentsToResolve
83
+ });
84
+ const pageBrowserGraph = await this.resolvePageBrowserGraph({
85
+ routeFile: routeOptions.file,
86
+ integrationName: adapter.name,
87
+ collectContribution: async () => await adapter.collectPageBrowserGraphContribution(routeOptions.file)
88
+ });
89
+ const usedIntegrationDependencies = this.collectUsedIntegrationDependencies(componentsToResolve, adapter.name);
90
+ const allDependencies = [...resolvedDependencies, ...usedIntegrationDependencies];
91
+ const componentRender = await adapter.resolveRoutePageComponentRender({
92
+ Page,
93
+ Layout,
94
+ props,
95
+ routeOptions
96
+ });
97
+ if (componentRender?.assets?.length) {
98
+ allDependencies.push(...componentRender.assets);
99
+ }
100
+ const triggers = this.collectResolvedTriggers(componentsToResolve);
101
+ if (triggers.length > 0) {
102
+ const globalAssets = await this.buildGlobalInjectorAssets(triggers, adapter.name);
103
+ allDependencies.push(...globalAssets);
104
+ }
105
+ const eagerSsrLazyAssets = await this.buildEagerSsrLazyAssets(componentsToResolve, adapter.name);
106
+ if (eagerSsrLazyAssets.length > 0) {
107
+ allDependencies.push(...eagerSsrLazyAssets);
108
+ }
109
+ const dedupedDependencies = dedupeProcessedAssets(allDependencies);
110
+ const pagePackage = createPagePackage(dedupedDependencies, { pageBrowserGraph });
111
+ const pageProps = {
112
+ ...props,
113
+ params: routeOptions.params || {},
114
+ query: routeOptions.query || {}
115
+ };
116
+ const cacheStrategy = Page.cache;
117
+ const defaultCacheStrategy = this.appConfig.cache?.defaultStrategy ?? "static";
118
+ const effectiveCacheStrategy = cacheStrategy ?? defaultCacheStrategy;
119
+ const localsAvailable = effectiveCacheStrategy === "dynamic" && routeOptions.locals !== void 0;
120
+ const pageLocals = localsAvailable ? routeOptions.locals : createPageLocalsProxy(routeOptions.file);
121
+ const locals = localsAvailable ? routeOptions.locals : void 0;
122
+ const preparedOptions = {
123
+ ...routeOptions,
124
+ resolvedDependencies,
125
+ pagePackage,
126
+ componentRender,
127
+ HtmlTemplate,
128
+ Layout,
129
+ props,
130
+ Page,
131
+ metadata,
132
+ params: routeOptions.params || {},
133
+ query: routeOptions.query || {},
134
+ pageProps,
135
+ locals,
136
+ pageLocals,
137
+ cacheStrategy,
138
+ ownershipPlan
139
+ };
140
+ return {
141
+ ...integrationSpecificProps,
142
+ ...preparedOptions
143
+ };
144
+ }
145
+ async resolveDeclaredPageBrowserGraph(input) {
146
+ return await this.resolvePageBrowserGraph(input);
147
+ }
148
+ async resolvePageBrowserGraph(input) {
149
+ if (this.isHmrEnabled()) {
150
+ return await this.buildPageBrowserGraph(input);
151
+ }
152
+ const cacheKey = `${input.integrationName}:${input.routeFile}`;
153
+ const cachedGraph = this.pageBrowserGraphCache.get(cacheKey);
154
+ if (cachedGraph) {
155
+ return await cachedGraph;
156
+ }
157
+ const pendingGraph = this.buildPageBrowserGraph(input).catch((error) => {
158
+ this.pageBrowserGraphCache.delete(cacheKey);
159
+ throw error;
160
+ });
161
+ this.pageBrowserGraphCache.set(cacheKey, pendingGraph);
162
+ return await pendingGraph;
163
+ }
164
+ isHmrEnabled() {
165
+ return typeof this.assetProcessingService.getHmrManager === "function" && this.assetProcessingService.getHmrManager()?.isEnabled() === true;
166
+ }
167
+ async buildPageBrowserGraph(input) {
168
+ const contribution = await input.collectContribution();
169
+ if (!contribution) {
170
+ return void 0;
171
+ }
172
+ const processedDependencies = contribution.dependencies?.length ? await this.assetProcessingService.processDependencies(
173
+ contribution.dependencies,
174
+ `${input.integrationName}:${input.routeFile}`
175
+ ) : [];
176
+ const resolvedAssets = [...processedDependencies, ...contribution.assets ?? []];
177
+ return this.partitionPageBrowserGraphAssets(resolvedAssets);
178
+ }
179
+ partitionPageBrowserGraphAssets(assets) {
180
+ const entryAssets = [];
181
+ const chunkAssets = [];
182
+ for (const asset of assets) {
183
+ if (asset.packageRole === "dynamic-chunk") {
184
+ chunkAssets.push(asset);
185
+ continue;
186
+ }
187
+ entryAssets.push(asset);
188
+ }
189
+ return { entryAssets, chunkAssets };
190
+ }
191
+ /**
192
+ * Captures one route render body as HTML while preserving a replayable body value.
193
+ */
194
+ async captureHtmlRender(render) {
195
+ const renderedBody = await render();
196
+ const capturedRender = await this.captureRenderedBody(renderedBody);
197
+ return {
198
+ body: capturedRender.body,
199
+ html: capturedRender.html
200
+ };
201
+ }
202
+ /**
203
+ * Executes the full route-render flow and returns the final body plus cache strategy.
204
+ */
205
+ async execute(options, adapter) {
206
+ const renderOptions = await this.prepareRenderOptions(options, adapter);
207
+ return this.executePrepared(renderOptions, adapter);
208
+ }
209
+ /**
210
+ * Executes the route-render finalization path for already prepared render options.
211
+ */
212
+ async executePrepared(renderOptions, adapter) {
213
+ const renderExecution = await this.captureHtmlRender(async () => adapter.renderRouteBody(renderOptions));
214
+ const unresolvedArtifactInspection = inspectUnresolvedMarkerArtifactHtml(renderExecution.html);
215
+ const htmlFinalization = adapter.getRouteHtmlFinalization(renderOptions);
216
+ const hasUnresolvedMarkerHtml = unresolvedArtifactInspection.hasUnresolvedMarkerArtifacts;
217
+ if (hasUnresolvedMarkerHtml) {
218
+ throw new Error(
219
+ "[ecopages] Route render returned unresolved eco-marker artifact HTML. Full-route unresolved-marker fallback has been removed; resolve mixed foreign children inside renderComponentWithForeignChildren()."
220
+ );
221
+ }
222
+ const canReuseCapturedBody = !hasUnresolvedMarkerHtml && htmlFinalization.finalizeHtml === void 0;
223
+ if (canReuseCapturedBody) {
224
+ const body2 = await adapter.transformRouteResponse(
225
+ new Response(renderExecution.body, {
226
+ headers: {
227
+ "Content-Type": "text/html"
228
+ }
229
+ }),
230
+ htmlFinalization.htmlContributions
231
+ );
232
+ return {
233
+ body: body2,
234
+ cacheStrategy: renderOptions.cacheStrategy
235
+ };
236
+ }
237
+ const finalization = htmlFinalization.finalizeHtml ? htmlFinalization.finalizeHtml(unresolvedArtifactInspection.normalizedHtml) : unresolvedArtifactInspection.normalizedHtml;
238
+ const body = await adapter.transformRouteResponse(
239
+ new Response(finalization, {
240
+ headers: {
241
+ "Content-Type": "text/html"
242
+ }
243
+ }),
244
+ htmlFinalization.htmlContributions
245
+ );
246
+ return {
247
+ body,
248
+ cacheStrategy: renderOptions.cacheStrategy
249
+ };
250
+ }
251
+ async captureRenderedBody(body) {
252
+ const response = new Response(body);
253
+ if (typeof body === "string") {
254
+ return {
255
+ body,
256
+ html: await response.text()
257
+ };
258
+ }
259
+ if (!response.body) {
260
+ return {
261
+ body,
262
+ html: await response.text()
263
+ };
264
+ }
265
+ const [capturedBody, replayBody] = response.body.tee();
266
+ return {
267
+ body: replayBody,
268
+ html: await new Response(capturedBody).text()
269
+ };
270
+ }
271
+ collectResolvedTriggers(components, seen = /* @__PURE__ */ new Set()) {
272
+ const triggers = [];
273
+ for (const comp of components) {
274
+ if (!comp) {
275
+ continue;
276
+ }
277
+ const ecoComp = comp;
278
+ if (seen.has(ecoComp)) {
279
+ continue;
280
+ }
281
+ seen.add(ecoComp);
282
+ const ownTriggers = ecoComp.config?._resolvedLazyTriggers;
283
+ if (ownTriggers?.length) {
284
+ triggers.push(...ownTriggers);
285
+ }
286
+ const nested = ecoComp.config?.dependencies?.components;
287
+ if (nested?.length) {
288
+ triggers.push(...this.collectResolvedTriggers(nested, seen));
289
+ }
290
+ }
291
+ return triggers;
292
+ }
293
+ collectUsedIntegrationDependencies(components, currentIntegrationName) {
294
+ const integrationNames = this.collectIntegrationNames(components);
295
+ const dependencies = [];
296
+ for (const integrationName of integrationNames) {
297
+ if (integrationName === currentIntegrationName) {
298
+ continue;
299
+ }
300
+ const integrationPlugin = this.appConfig.integrations.find(
301
+ (integration) => integration.name === integrationName
302
+ );
303
+ if (!integrationPlugin || typeof integrationPlugin.getResolvedIntegrationDependencies !== "function") {
304
+ continue;
305
+ }
306
+ dependencies.push(...integrationPlugin.getResolvedIntegrationDependencies());
307
+ }
308
+ return dependencies;
309
+ }
310
+ collectIntegrationNames(components, seen = /* @__PURE__ */ new Set()) {
311
+ const integrationNames = /* @__PURE__ */ new Set();
312
+ for (const comp of components) {
313
+ if (!comp) {
314
+ continue;
315
+ }
316
+ const ecoComp = comp;
317
+ if (seen.has(ecoComp)) {
318
+ continue;
319
+ }
320
+ seen.add(ecoComp);
321
+ const integrationName = ecoComp.config?.integration ?? ecoComp.config?.__eco?.integration;
322
+ if (integrationName) {
323
+ integrationNames.add(integrationName);
324
+ }
325
+ const nested = ecoComp.config?.dependencies?.components;
326
+ if (nested?.length) {
327
+ const nestedNames = this.collectIntegrationNames(nested, seen);
328
+ for (const nestedName of nestedNames) {
329
+ integrationNames.add(nestedName);
330
+ }
331
+ }
332
+ }
333
+ return integrationNames;
334
+ }
335
+ async buildGlobalInjectorAssets(triggers, currentIntegrationName) {
336
+ const appProjectDir = this.appConfig.rootDir ?? this.appConfig.absolutePaths?.projectDir ?? process.cwd();
337
+ const appPackageRequire = createRequire(path.join(appProjectDir, "package.json"));
338
+ const corePackageEntryPath = appPackageRequire.resolve("@ecopages/core");
339
+ const globalInjectorImportPath = createRequire(corePackageEntryPath).resolve(
340
+ "@ecopages/scripts-injector/global"
341
+ );
342
+ const mapScript = AssetFactory.createInlineContentScript({
343
+ position: "head",
344
+ name: "ecopages-global-injector-map",
345
+ content: buildGlobalInjectorMapScript(triggers),
346
+ attributes: { type: "ecopages/global-injector-map" },
347
+ packageRole: "keep-separate",
348
+ bundle: false
349
+ });
350
+ const bootstrapInlineScript = AssetFactory.createInlineContentScript({
351
+ position: "head",
352
+ name: "ecopages-global-injector-bootstrap",
353
+ content: buildGlobalInjectorBootstrapContent(globalInjectorImportPath),
354
+ attributes: { type: "module" },
355
+ packageRole: "keep-separate",
356
+ bundle: true
357
+ });
358
+ return this.assetProcessingService.processDependencies(
359
+ [mapScript, bootstrapInlineScript],
360
+ currentIntegrationName
361
+ );
362
+ }
363
+ async buildEagerSsrLazyAssets(components, currentIntegrationName) {
364
+ const dependencies = this.collectEagerSsrLazyDependencies(components);
365
+ if (dependencies.length === 0) {
366
+ return [];
367
+ }
368
+ return this.assetProcessingService.processDependencies(dependencies, `${currentIntegrationName}:ssr-lazy`);
369
+ }
370
+ collectEagerSsrLazyDependencies(components) {
371
+ const dependencies = [];
372
+ const visitedConfigs = /* @__PURE__ */ new Set();
373
+ const seenKeys = /* @__PURE__ */ new Set();
374
+ const normalizeAttributes = (attributes) => ({
375
+ type: "module",
376
+ defer: "",
377
+ ...attributes ?? {}
378
+ });
379
+ const collect = (config) => {
380
+ if (!config || visitedConfigs.has(config)) {
381
+ return;
382
+ }
383
+ visitedConfigs.add(config);
384
+ const componentFile = config.__eco?.file;
385
+ if (componentFile) {
386
+ const componentDir = path.dirname(componentFile);
387
+ for (const script of config.dependencies?.scripts ?? []) {
388
+ if (typeof script === "string" || !script.lazy || script.ssr !== true) {
389
+ continue;
390
+ }
391
+ const attributes = normalizeAttributes(script.attributes);
392
+ if (script.content) {
393
+ const key2 = `content:${script.content}:${JSON.stringify(attributes)}`;
394
+ if (seenKeys.has(key2)) {
395
+ continue;
396
+ }
397
+ seenKeys.add(key2);
398
+ dependencies.push(
399
+ AssetFactory.createContentScript({
400
+ position: "head",
401
+ content: script.content,
402
+ attributes,
403
+ packageRole: "dynamic-chunk"
404
+ })
405
+ );
406
+ continue;
407
+ }
408
+ if (!script.src) {
409
+ continue;
410
+ }
411
+ const resolvedPath = path.resolve(componentDir, script.src);
412
+ const key = `file:${resolvedPath}:${JSON.stringify(attributes)}`;
413
+ if (seenKeys.has(key)) {
414
+ continue;
415
+ }
416
+ seenKeys.add(key);
417
+ dependencies.push(
418
+ AssetFactory.createFileScript({
419
+ filepath: resolvedPath,
420
+ position: "head",
421
+ attributes,
422
+ packageRole: "dynamic-chunk"
423
+ })
424
+ );
425
+ }
426
+ }
427
+ if (config.layout?.config) {
428
+ collect(config.layout.config);
429
+ }
430
+ for (const nestedComponent of config.dependencies?.components ?? []) {
431
+ collect(nestedComponent?.config);
432
+ }
433
+ };
434
+ for (const component of components) {
435
+ collect(component.config);
436
+ }
437
+ return dependencies;
438
+ }
439
+ }
440
+ export {
441
+ RouteRenderOrchestrator
442
+ };
@@ -0,0 +1,38 @@
1
+ /**
2
+ * Minimal template-result shape that core can serialize generically.
3
+ *
4
+ * @remarks
5
+ * Core intentionally models only the transport shape used during deferred
6
+ * cross-integration child passing: alternating static string segments plus
7
+ * interpolated runtime values. Concrete runtime markers that identify a given
8
+ * framework's template payload must stay outside core and be registered by the
9
+ * owning integration package.
10
+ */
11
+ export type SerializableTemplateShape = {
12
+ strings: readonly string[];
13
+ values?: readonly unknown[];
14
+ };
15
+ /**
16
+ * Integration-owned adapter that teaches core how to serialize one deferred
17
+ * template payload shape.
18
+ *
19
+ * @remarks
20
+ * The separation here is intentional: core owns the HTML serialization logic,
21
+ * but integrations own runtime-shape detection. That keeps package-specific
22
+ * markers such as framework template sentinels out of core while still letting
23
+ * deferred children round-trip through mixed renderer boundaries.
24
+ */
25
+ export type DeferredTemplateSerializer<TTemplate extends SerializableTemplateShape = SerializableTemplateShape> = {
26
+ matches(value: unknown): value is TTemplate;
27
+ serialize(template: TTemplate, serializeValue: (value: unknown) => string | undefined): string;
28
+ };
29
+ /**
30
+ * Serializes a generic template shape into HTML.
31
+ *
32
+ * @remarks
33
+ * This handles only HTML reconstruction semantics: quoted attribute values,
34
+ * boolean attributes, and omission of client-only event or property bindings.
35
+ * It does not decide whether an arbitrary value belongs to a framework-specific
36
+ * template runtime; integrations must make that decision before delegating here.
37
+ */
38
+ export declare function serializeTemplateShape(template: SerializableTemplateShape, serializeValue: (value: unknown) => string | undefined): string;
@@ -0,0 +1,45 @@
1
+ import { escapeHtmlAttribute } from "../../utils/html-escaping.js";
2
+ const ATTRIBUTE_TAIL_PATTERN = /(\s+)([@.?!]?)([^\s"'<>/=`@.?!]+)=$/;
3
+ function getSerializableTemplateAttribute(stringPart) {
4
+ const match = ATTRIBUTE_TAIL_PATTERN.exec(stringPart);
5
+ if (!match) return void 0;
6
+ return {
7
+ leading: stringPart.slice(0, match.index),
8
+ whitespace: match[1],
9
+ prefix: match[2],
10
+ name: match[3]
11
+ };
12
+ }
13
+ function serializeTemplateShape(template, serializeValue) {
14
+ const values = template.values ?? [];
15
+ let html = "";
16
+ for (let index = 0; index < values.length; index += 1) {
17
+ const stringPart = template.strings[index] ?? "";
18
+ const serializedValue = serializeValue(values[index]);
19
+ const attribute = getSerializableTemplateAttribute(stringPart);
20
+ if (!attribute) {
21
+ html += stringPart;
22
+ html += serializedValue ?? "";
23
+ continue;
24
+ }
25
+ html += attribute.leading;
26
+ if (attribute.prefix === "@" || attribute.prefix === "!" || attribute.prefix === ".") {
27
+ continue;
28
+ }
29
+ if (attribute.prefix === "?") {
30
+ if (serializedValue) {
31
+ html += `${attribute.whitespace}${attribute.name}`;
32
+ }
33
+ continue;
34
+ }
35
+ if (serializedValue === void 0) {
36
+ continue;
37
+ }
38
+ html += `${attribute.whitespace}${attribute.name}="${escapeHtmlAttribute(serializedValue)}"`;
39
+ }
40
+ html += template.strings[values.length] ?? "";
41
+ return html;
42
+ }
43
+ export {
44
+ serializeTemplateShape
45
+ };
@@ -0,0 +1,37 @@
1
+ import type { EcoComponent } from '../../types/public-types.js';
2
+ import type { AssetDefinition } from '../../services/assets/asset-processing-service/index.js';
3
+ import { type LazyGroup } from './lazy-entry-collection.js';
4
+ /**
5
+ * Aggregated dependency output for one dependency-collection pass.
6
+ */
7
+ export type CollectedComponentDependencies = {
8
+ /**
9
+ * Flat asset declarations ready for downstream processing.
10
+ */
11
+ dependencies: AssetDefinition[];
12
+ /**
13
+ * Lazy script groups keyed by component config and trigger key.
14
+ */
15
+ lazyScriptsByConfig: Map<NonNullable<EcoComponent['config']>, Map<string, LazyGroup>>;
16
+ };
17
+ type CollectComponentDependenciesOptions = {
18
+ components: Array<EcoComponent | Partial<EcoComponent> | undefined | null>;
19
+ integrationName: string;
20
+ resolveLazyScripts: (componentDir: string, scripts: string[]) => string;
21
+ createEcopagesJsxLazyEntryName: (integrationName: string, key: string) => string;
22
+ isEcopagesJsxIntegration: (integrationName: string) => boolean;
23
+ errors: {
24
+ invalidStylesheetEntry: string;
25
+ invalidScriptEntry: string;
26
+ lazyScriptMissingSrc: string;
27
+ };
28
+ };
29
+ /**
30
+ * Walks component dependency trees and collects declared assets, module declarations,
31
+ * and lazy-script group metadata in one pass.
32
+ *
33
+ * The returned structures intentionally preserve both the flat asset list used by
34
+ * asset processing and the grouped lazy-trigger data used later during render output.
35
+ */
36
+ export declare function collectComponentDependencies(options: CollectComponentDependenciesOptions): CollectedComponentDependencies;
37
+ export {};
@@ -0,0 +1,132 @@
1
+ import path from "node:path";
2
+ import { AssetFactory } from "../../services/assets/asset-processing-service/index.js";
3
+ import { extractEcopagesVirtualImports } from "./ecopages-virtual-imports.js";
4
+ import { collectDeclaredAssetEntries } from "./declared-asset-collection.js";
5
+ import { getLazyTriggerKey } from "./lazy-trigger-planning.js";
6
+ import { collectLazyScriptEntries } from "./lazy-entry-collection.js";
7
+ import {
8
+ createModuleScriptName,
9
+ createNamedImportModuleSource,
10
+ createNamespaceImportModuleSource
11
+ } from "./module-declaration-scripts.js";
12
+ import { collectModuleDeclarations } from "./module-declaration-aggregation.js";
13
+ const MODULE_SCRIPT_ATTRIBUTES = {
14
+ type: "module",
15
+ defer: ""
16
+ };
17
+ function createModuleScriptAttributes(attributes) {
18
+ return {
19
+ ...MODULE_SCRIPT_ATTRIBUTES,
20
+ ...attributes
21
+ };
22
+ }
23
+ function pushUniqueDependency(keys, key, dependencies, dependency) {
24
+ if (keys.has(key)) {
25
+ return false;
26
+ }
27
+ keys.add(key);
28
+ dependencies.push(dependency);
29
+ return true;
30
+ }
31
+ function resolveDependencyPath(componentDir, pathUrl) {
32
+ return path.join(componentDir, pathUrl);
33
+ }
34
+ function collectComponentDependencies(options) {
35
+ const {
36
+ components,
37
+ integrationName,
38
+ resolveLazyScripts,
39
+ createEcopagesJsxLazyEntryName,
40
+ isEcopagesJsxIntegration,
41
+ errors
42
+ } = options;
43
+ const dependencies = [];
44
+ const lazyScriptsByConfig = /* @__PURE__ */ new Map();
45
+ const lazyDependencyKeys = /* @__PURE__ */ new Set();
46
+ for (const component of components) {
47
+ if (!component) continue;
48
+ const componentFile = component.config?.__eco?.file;
49
+ if (!componentFile) continue;
50
+ const stylesheetDependencyKeys = /* @__PURE__ */ new Set();
51
+ const scriptDependencyKeys = /* @__PURE__ */ new Set();
52
+ const modulesMap = /* @__PURE__ */ new Map();
53
+ const collect = (config) => {
54
+ if (!config) return;
55
+ const file = config.__eco?.file;
56
+ if (!file) return;
57
+ const dir = path.dirname(file);
58
+ const dependenciesConfig = config.dependencies;
59
+ const registerLazyScript = ({
60
+ lazy,
61
+ lazyKey,
62
+ fallbackUrl
63
+ }) => {
64
+ let grouped = lazyScriptsByConfig.get(config);
65
+ if (!grouped) {
66
+ grouped = /* @__PURE__ */ new Map();
67
+ lazyScriptsByConfig.set(config, grouped);
68
+ }
69
+ const triggerKey = getLazyTriggerKey(lazy);
70
+ const existing = grouped.get(triggerKey) ?? { lazy, scripts: [] };
71
+ existing.scripts.push({ lazyKey, fallbackUrl });
72
+ grouped.set(triggerKey, existing);
73
+ };
74
+ collectDeclaredAssetEntries({
75
+ stylesheetEntries: dependenciesConfig?.stylesheets ?? [],
76
+ scriptEntries: dependenciesConfig?.scripts ?? [],
77
+ componentDir: dir,
78
+ dependencies,
79
+ stylesheetDependencyKeys,
80
+ scriptDependencyKeys,
81
+ resolveDependencyPath,
82
+ createModuleScriptAttributes,
83
+ pushUniqueDependency,
84
+ getInvalidStylesheetEntryMessage: () => errors.invalidStylesheetEntry,
85
+ getInvalidScriptEntryMessage: () => errors.invalidScriptEntry
86
+ });
87
+ collectModuleDeclarations(modulesMap, dependenciesConfig?.modules, extractEcopagesVirtualImports(file));
88
+ collectLazyScriptEntries({
89
+ scriptEntries: dependenciesConfig?.scripts ?? [],
90
+ componentFile: file,
91
+ componentDir: dir,
92
+ integrationName,
93
+ dependencies,
94
+ lazyDependencyKeys,
95
+ registerLazyScript,
96
+ resolveDependencyPath,
97
+ resolveLazyScripts,
98
+ createModuleScriptAttributes,
99
+ createEcopagesJsxLazyEntryName,
100
+ pushUniqueDependency,
101
+ getLazyScriptMissingSrcMessage: () => errors.lazyScriptMissingSrc,
102
+ isEcopagesJsxIntegration
103
+ });
104
+ if (dependenciesConfig?.components) {
105
+ for (const nestedComponent of dependenciesConfig.components) {
106
+ if (nestedComponent?.config) {
107
+ collect(nestedComponent.config);
108
+ }
109
+ }
110
+ }
111
+ };
112
+ collect(component.config);
113
+ dependencies.push(
114
+ ...Array.from(modulesMap.entries()).map(([from, importsSet]) => {
115
+ const imports = importsSet ? Array.from(importsSet) : void 0;
116
+ return AssetFactory.createContentScript({
117
+ position: "head",
118
+ name: createModuleScriptName(from, imports),
119
+ content: imports && imports.length > 0 ? createNamedImportModuleSource(from, imports) : createNamespaceImportModuleSource(from),
120
+ attributes: createModuleScriptAttributes()
121
+ });
122
+ })
123
+ );
124
+ }
125
+ return {
126
+ dependencies,
127
+ lazyScriptsByConfig
128
+ };
129
+ }
130
+ export {
131
+ collectComponentDependencies
132
+ };