@ecopages/core 0.2.0-alpha.25 → 0.2.0-alpha.26

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 (543) hide show
  1. package/CHANGELOG.md +66 -0
  2. package/package.json +226 -93
  3. package/src/adapters/abstract/application-adapter.d.ts +194 -0
  4. package/src/adapters/abstract/application-adapter.js +121 -0
  5. package/src/adapters/abstract/router-adapter.d.ts +26 -0
  6. package/src/adapters/abstract/router-adapter.js +5 -0
  7. package/src/adapters/abstract/server-adapter.d.ts +69 -0
  8. package/src/adapters/abstract/server-adapter.js +15 -0
  9. package/src/adapters/bun/client-bridge.d.ts +34 -0
  10. package/src/adapters/bun/client-bridge.js +48 -0
  11. package/src/adapters/bun/create-app.d.ts +52 -0
  12. package/src/adapters/bun/create-app.js +116 -0
  13. package/src/adapters/bun/hmr-manager.d.ts +143 -0
  14. package/src/adapters/bun/hmr-manager.js +333 -0
  15. package/src/adapters/bun/index.d.ts +2 -0
  16. package/src/adapters/bun/index.js +8 -0
  17. package/src/adapters/bun/server-adapter.d.ts +155 -0
  18. package/src/adapters/bun/server-adapter.js +374 -0
  19. package/src/adapters/bun/server-lifecycle.d.ts +63 -0
  20. package/src/adapters/bun/server-lifecycle.js +92 -0
  21. package/src/adapters/create-app.d.ts +20 -0
  22. package/src/adapters/create-app.js +66 -0
  23. package/src/adapters/index.d.ts +2 -0
  24. package/src/adapters/index.js +8 -0
  25. package/src/adapters/node/create-app.d.ts +18 -0
  26. package/src/adapters/node/create-app.js +149 -0
  27. package/src/adapters/node/node-client-bridge.d.ts +26 -0
  28. package/src/adapters/node/node-client-bridge.js +66 -0
  29. package/src/adapters/node/node-hmr-manager.d.ts +133 -0
  30. package/src/adapters/node/node-hmr-manager.js +311 -0
  31. package/src/adapters/node/server-adapter.d.ts +162 -0
  32. package/src/adapters/node/server-adapter.js +368 -0
  33. package/src/adapters/node/static-content-server.d.ts +60 -0
  34. package/src/adapters/node/static-content-server.js +194 -0
  35. package/src/adapters/shared/api-response.d.ts +52 -0
  36. package/src/adapters/shared/api-response.js +96 -0
  37. package/src/adapters/shared/application-adapter.d.ts +18 -0
  38. package/src/adapters/shared/application-adapter.js +90 -0
  39. package/src/adapters/shared/define-api-handler.d.ts +25 -0
  40. package/src/adapters/shared/define-api-handler.js +15 -0
  41. package/src/adapters/shared/explicit-static-route-matcher.d.ts +38 -0
  42. package/src/adapters/shared/explicit-static-route-matcher.js +103 -0
  43. package/src/adapters/shared/file-route-middleware-pipeline.d.ts +65 -0
  44. package/src/adapters/shared/file-route-middleware-pipeline.js +99 -0
  45. package/src/adapters/shared/fs-server-response-factory.d.ts +19 -0
  46. package/src/adapters/shared/fs-server-response-factory.js +97 -0
  47. package/src/adapters/shared/fs-server-response-matcher.d.ts +67 -0
  48. package/src/adapters/shared/fs-server-response-matcher.js +147 -0
  49. package/src/adapters/shared/hmr-entrypoint-registrar.d.ts +55 -0
  50. package/src/adapters/shared/hmr-entrypoint-registrar.js +87 -0
  51. package/src/adapters/shared/hmr-html-response.d.ts +22 -0
  52. package/src/adapters/shared/hmr-html-response.js +32 -0
  53. package/src/adapters/shared/render-context.d.ts +15 -0
  54. package/src/adapters/shared/render-context.js +72 -0
  55. package/src/adapters/shared/runtime-bootstrap.d.ts +38 -0
  56. package/src/adapters/shared/runtime-bootstrap.js +43 -0
  57. package/src/adapters/shared/server-adapter.d.ts +97 -0
  58. package/src/adapters/shared/server-adapter.js +390 -0
  59. package/src/adapters/shared/server-route-handler.d.ts +89 -0
  60. package/src/adapters/shared/server-route-handler.js +111 -0
  61. package/src/adapters/shared/server-static-builder.d.ts +71 -0
  62. package/src/adapters/shared/server-static-builder.js +100 -0
  63. package/src/build/build-adapter.d.ts +239 -0
  64. package/src/build/build-adapter.js +642 -0
  65. package/src/build/build-manifest.d.ts +27 -0
  66. package/src/build/build-manifest.js +30 -0
  67. package/src/build/build-types.d.ts +57 -0
  68. package/src/build/build-types.js +0 -0
  69. package/src/build/dev-build-coordinator.d.ts +72 -0
  70. package/src/build/dev-build-coordinator.js +154 -0
  71. package/src/build/esbuild-build-adapter.d.ts +78 -0
  72. package/src/build/esbuild-build-adapter.js +505 -0
  73. package/src/build/runtime-build-executor.d.ts +14 -0
  74. package/src/build/runtime-build-executor.js +22 -0
  75. package/src/build/runtime-specifier-alias-plugin.d.ts +15 -0
  76. package/src/build/runtime-specifier-alias-plugin.js +35 -0
  77. package/src/build/runtime-specifier-aliases.d.ts +5 -0
  78. package/src/build/runtime-specifier-aliases.js +95 -0
  79. package/src/config/config-builder.d.ts +252 -0
  80. package/src/config/config-builder.js +603 -0
  81. package/src/config/{constants.ts → constants.d.ts} +13 -22
  82. package/src/config/constants.js +25 -0
  83. package/src/dev/sc-server.d.ts +30 -0
  84. package/src/dev/sc-server.js +111 -0
  85. package/src/eco/eco.browser.d.ts +2 -0
  86. package/src/eco/eco.browser.js +83 -0
  87. package/src/eco/eco.d.ts +9 -0
  88. package/src/eco/eco.js +85 -0
  89. package/src/eco/eco.types.d.ts +178 -0
  90. package/src/eco/eco.types.js +0 -0
  91. package/src/eco/eco.utils.d.ts +1 -0
  92. package/src/eco/eco.utils.js +10 -0
  93. package/src/eco/global-injector-map.d.ts +16 -0
  94. package/src/eco/global-injector-map.js +80 -0
  95. package/src/eco/lazy-injector-map.d.ts +8 -0
  96. package/src/eco/lazy-injector-map.js +70 -0
  97. package/src/eco/module-dependencies.d.ts +18 -0
  98. package/src/eco/module-dependencies.js +49 -0
  99. package/src/errors/http-error.d.ts +31 -0
  100. package/src/errors/http-error.js +50 -0
  101. package/src/errors/{index.ts → index.d.ts} +2 -2
  102. package/src/errors/index.js +4 -0
  103. package/src/errors/locals-access-error.d.ts +4 -0
  104. package/src/errors/locals-access-error.js +9 -0
  105. package/src/global/app-logger.d.ts +2 -0
  106. package/src/global/app-logger.js +6 -0
  107. package/src/hmr/client/hmr-runtime.d.ts +5 -0
  108. package/src/hmr/client/hmr-runtime.js +117 -0
  109. package/src/hmr/hmr-strategy.d.ts +162 -0
  110. package/src/hmr/hmr-strategy.js +44 -0
  111. package/src/hmr/hmr.postcss.test.e2e.d.ts +1 -0
  112. package/src/hmr/hmr.postcss.test.e2e.js +31 -0
  113. package/src/hmr/hmr.test.e2e.d.ts +1 -0
  114. package/src/hmr/hmr.test.e2e.js +43 -0
  115. package/src/hmr/strategies/default-hmr-strategy.d.ts +43 -0
  116. package/src/hmr/strategies/default-hmr-strategy.js +34 -0
  117. package/src/hmr/strategies/js-hmr-strategy.d.ts +139 -0
  118. package/src/hmr/strategies/js-hmr-strategy.js +178 -0
  119. package/src/index.browser.d.ts +3 -0
  120. package/src/index.browser.js +4 -0
  121. package/src/index.d.ts +6 -0
  122. package/src/index.js +21 -0
  123. package/src/integrations/ghtml/ghtml-renderer.d.ts +20 -0
  124. package/src/integrations/ghtml/ghtml-renderer.js +63 -0
  125. package/src/integrations/ghtml/ghtml.constants.d.ts +1 -0
  126. package/src/integrations/ghtml/ghtml.constants.js +4 -0
  127. package/src/integrations/ghtml/ghtml.plugin.d.ts +16 -0
  128. package/src/integrations/ghtml/ghtml.plugin.js +20 -0
  129. package/src/plugins/alias-resolver-plugin.d.ts +2 -0
  130. package/src/plugins/alias-resolver-plugin.js +53 -0
  131. package/src/plugins/eco-component-meta-plugin.d.ts +108 -0
  132. package/src/plugins/eco-component-meta-plugin.js +163 -0
  133. package/src/plugins/foreign-jsx-override-plugin.d.ts +31 -0
  134. package/src/plugins/foreign-jsx-override-plugin.js +35 -0
  135. package/src/plugins/integration-plugin.d.ts +219 -0
  136. package/src/plugins/integration-plugin.js +196 -0
  137. package/src/plugins/processor.d.ts +95 -0
  138. package/src/plugins/processor.js +136 -0
  139. package/src/plugins/{runtime-capability.ts → runtime-capability.d.ts} +3 -8
  140. package/src/plugins/runtime-capability.js +0 -0
  141. package/src/plugins/source-transform.d.ts +46 -0
  142. package/src/plugins/source-transform.js +71 -0
  143. package/src/route-renderer/orchestration/boundary-planning.service.d.ts +25 -0
  144. package/src/route-renderer/orchestration/boundary-planning.service.js +97 -0
  145. package/src/route-renderer/orchestration/component-render-context.d.ts +83 -0
  146. package/src/route-renderer/orchestration/component-render-context.js +147 -0
  147. package/src/route-renderer/orchestration/integration-renderer.d.ts +556 -0
  148. package/src/route-renderer/orchestration/integration-renderer.js +932 -0
  149. package/src/route-renderer/orchestration/page-packaging.service.d.ts +16 -0
  150. package/src/route-renderer/orchestration/page-packaging.service.js +66 -0
  151. package/src/route-renderer/orchestration/processed-asset-dedupe.d.ts +2 -0
  152. package/src/route-renderer/orchestration/processed-asset-dedupe.js +23 -0
  153. package/src/route-renderer/orchestration/queued-boundary-runtime.service.d.ts +89 -0
  154. package/src/route-renderer/orchestration/queued-boundary-runtime.service.js +155 -0
  155. package/src/route-renderer/orchestration/render-execution.service.d.ts +43 -0
  156. package/src/route-renderer/orchestration/render-execution.service.js +106 -0
  157. package/src/route-renderer/orchestration/render-output.utils.d.ts +66 -0
  158. package/src/route-renderer/orchestration/render-output.utils.js +171 -0
  159. package/src/route-renderer/orchestration/render-preparation.service.d.ts +120 -0
  160. package/src/route-renderer/orchestration/render-preparation.service.js +364 -0
  161. package/src/route-renderer/orchestration/route-shell-composer.service.d.ts +50 -0
  162. package/src/route-renderer/orchestration/route-shell-composer.service.js +81 -0
  163. package/src/route-renderer/orchestration/template-serialization.d.ts +38 -0
  164. package/src/route-renderer/orchestration/template-serialization.js +45 -0
  165. package/src/route-renderer/page-loading/component-dependency-collection.d.ts +37 -0
  166. package/src/route-renderer/page-loading/component-dependency-collection.js +125 -0
  167. package/src/route-renderer/page-loading/declared-asset-collection.d.ts +24 -0
  168. package/src/route-renderer/page-loading/declared-asset-collection.js +106 -0
  169. package/src/route-renderer/page-loading/dependency-resolver.d.ts +35 -0
  170. package/src/route-renderer/page-loading/dependency-resolver.js +117 -0
  171. package/src/route-renderer/page-loading/ecopages-virtual-imports.d.ts +11 -0
  172. package/src/route-renderer/page-loading/ecopages-virtual-imports.js +57 -0
  173. package/src/route-renderer/page-loading/lazy-entry-collection.d.ts +45 -0
  174. package/src/route-renderer/page-loading/lazy-entry-collection.js +105 -0
  175. package/src/route-renderer/page-loading/lazy-trigger-planning.d.ts +19 -0
  176. package/src/route-renderer/page-loading/lazy-trigger-planning.js +40 -0
  177. package/src/route-renderer/page-loading/module-declaration-aggregation.d.ts +5 -0
  178. package/src/route-renderer/page-loading/module-declaration-aggregation.js +33 -0
  179. package/src/route-renderer/page-loading/module-declaration-scripts.d.ts +3 -0
  180. package/src/route-renderer/page-loading/module-declaration-scripts.js +18 -0
  181. package/src/route-renderer/page-loading/page-dependency-bundling.d.ts +13 -0
  182. package/src/route-renderer/page-loading/page-dependency-bundling.js +115 -0
  183. package/src/route-renderer/page-loading/page-module-loader.d.ts +90 -0
  184. package/src/route-renderer/page-loading/page-module-loader.js +127 -0
  185. package/src/route-renderer/route-renderer.d.ts +67 -0
  186. package/src/route-renderer/route-renderer.js +103 -0
  187. package/src/router/client/link-intent.js +34 -0
  188. package/src/router/client/link-intent.test.browser.d.ts +1 -0
  189. package/src/router/client/link-intent.test.browser.js +43 -0
  190. package/src/router/client/navigation-coordinator.d.ts +169 -0
  191. package/src/router/client/navigation-coordinator.js +215 -0
  192. package/src/router/server/fs-router-scanner.d.ts +41 -0
  193. package/src/router/server/fs-router-scanner.js +161 -0
  194. package/src/router/server/fs-router.d.ts +26 -0
  195. package/src/router/server/fs-router.js +100 -0
  196. package/src/services/assets/asset-processing-service/asset-dependency-keys.d.ts +3 -0
  197. package/src/services/assets/asset-processing-service/asset-dependency-keys.js +56 -0
  198. package/src/services/assets/asset-processing-service/asset-processing.service.d.ts +103 -0
  199. package/src/services/assets/asset-processing-service/asset-processing.service.js +285 -0
  200. package/src/services/assets/asset-processing-service/asset.factory.d.ts +17 -0
  201. package/src/services/assets/asset-processing-service/asset.factory.js +82 -0
  202. package/src/services/assets/asset-processing-service/assets.types.d.ts +100 -0
  203. package/src/services/assets/asset-processing-service/assets.types.js +0 -0
  204. package/src/services/assets/asset-processing-service/browser-runtime-asset.factory.d.ts +55 -0
  205. package/src/services/assets/asset-processing-service/browser-runtime-asset.factory.js +49 -0
  206. package/src/services/assets/asset-processing-service/browser-runtime-entry.factory.d.ts +20 -0
  207. package/src/services/assets/asset-processing-service/browser-runtime-entry.factory.js +41 -0
  208. package/src/services/assets/asset-processing-service/grouped-content-bundles.d.ts +30 -0
  209. package/src/services/assets/asset-processing-service/grouped-content-bundles.js +65 -0
  210. package/src/services/assets/asset-processing-service/index.d.ts +5 -0
  211. package/src/services/assets/asset-processing-service/index.js +5 -0
  212. package/src/services/assets/asset-processing-service/{processor.interface.ts → processor.interface.d.ts} +5 -10
  213. package/src/services/assets/asset-processing-service/processor.interface.js +6 -0
  214. package/src/services/assets/asset-processing-service/processor.registry.d.ts +8 -0
  215. package/src/services/assets/asset-processing-service/processor.registry.js +15 -0
  216. package/src/services/assets/asset-processing-service/processors/base/base-processor.d.ts +24 -0
  217. package/src/services/assets/asset-processing-service/processors/base/base-processor.js +65 -0
  218. package/src/services/assets/asset-processing-service/processors/base/base-script-processor.d.ts +22 -0
  219. package/src/services/assets/asset-processing-service/processors/base/base-script-processor.js +136 -0
  220. package/src/services/assets/asset-processing-service/processors/index.d.ts +5 -0
  221. package/src/services/assets/asset-processing-service/processors/index.js +5 -0
  222. package/src/services/assets/asset-processing-service/processors/script/content-script.processor.d.ts +6 -0
  223. package/src/services/assets/asset-processing-service/processors/script/content-script.processor.js +116 -0
  224. package/src/services/assets/asset-processing-service/processors/script/file-script.processor.d.ts +9 -0
  225. package/src/services/assets/asset-processing-service/processors/script/file-script.processor.js +91 -0
  226. package/src/services/assets/asset-processing-service/processors/script/node-module-script.processor.d.ts +7 -0
  227. package/src/services/assets/asset-processing-service/processors/script/node-module-script.processor.js +77 -0
  228. package/src/services/assets/asset-processing-service/processors/stylesheet/content-stylesheet.processor.d.ts +8 -0
  229. package/src/services/assets/asset-processing-service/processors/stylesheet/content-stylesheet.processor.js +58 -0
  230. package/src/services/assets/asset-processing-service/processors/stylesheet/file-stylesheet.processor.d.ts +9 -0
  231. package/src/services/assets/asset-processing-service/processors/stylesheet/file-stylesheet.processor.js +67 -0
  232. package/src/services/assets/asset-processing-service/ungrouped-dependency-processing.d.ts +18 -0
  233. package/src/services/assets/asset-processing-service/ungrouped-dependency-processing.js +45 -0
  234. package/src/services/assets/browser-bundle.service.d.ts +73 -0
  235. package/src/services/assets/browser-bundle.service.js +41 -0
  236. package/src/services/cache/cache.types.d.ts +107 -0
  237. package/src/services/cache/cache.types.js +0 -0
  238. package/src/services/cache/index.d.ts +7 -0
  239. package/src/services/cache/index.js +7 -0
  240. package/src/services/cache/memory-cache-store.d.ts +42 -0
  241. package/src/services/cache/memory-cache-store.js +98 -0
  242. package/src/services/cache/page-cache-service.d.ts +70 -0
  243. package/src/services/cache/page-cache-service.js +152 -0
  244. package/src/services/cache/page-request-cache-coordinator.service.d.ts +75 -0
  245. package/src/services/cache/page-request-cache-coordinator.service.js +109 -0
  246. package/src/services/html/html-rewriter-provider.service.d.ts +37 -0
  247. package/src/services/html/html-rewriter-provider.service.js +68 -0
  248. package/src/services/html/html-transformer.service.d.ts +87 -0
  249. package/src/services/html/html-transformer.service.js +216 -0
  250. package/src/services/invalidation/development-invalidation.service.d.ts +74 -0
  251. package/src/services/invalidation/development-invalidation.service.js +190 -0
  252. package/src/services/module-loading/app-module-loader.service.d.ts +7 -0
  253. package/src/services/module-loading/app-module-loader.service.js +0 -0
  254. package/src/services/module-loading/app-server-module-transpiler.service.d.ts +24 -0
  255. package/src/services/module-loading/app-server-module-transpiler.service.js +115 -0
  256. package/src/services/module-loading/host-module-loader-registry.d.ts +4 -0
  257. package/src/services/module-loading/host-module-loader-registry.js +15 -0
  258. package/src/services/module-loading/{module-loading-types.ts → module-loading-types.d.ts} +0 -1
  259. package/src/services/module-loading/module-loading-types.js +0 -0
  260. package/src/services/module-loading/node-bootstrap-plugin.d.ts +42 -0
  261. package/src/services/module-loading/node-bootstrap-plugin.js +204 -0
  262. package/src/services/module-loading/page-module-import.service.d.ts +76 -0
  263. package/src/services/module-loading/page-module-import.service.js +170 -0
  264. package/src/services/module-loading/server-module-transpiler.service.d.ts +63 -0
  265. package/src/services/module-loading/server-module-transpiler.service.js +64 -0
  266. package/src/services/module-loading/source-module-support.d.ts +5 -0
  267. package/src/services/module-loading/source-module-support.js +8 -0
  268. package/src/services/runtime-state/dev-graph.service.d.ts +118 -0
  269. package/src/services/runtime-state/dev-graph.service.js +162 -0
  270. package/src/services/runtime-state/entrypoint-dependency-graph.service.d.ts +41 -0
  271. package/src/services/runtime-state/entrypoint-dependency-graph.service.js +85 -0
  272. package/src/services/runtime-state/runtime-specifier-registry.service.d.ts +69 -0
  273. package/src/services/runtime-state/runtime-specifier-registry.service.js +37 -0
  274. package/src/services/runtime-state/server-invalidation-state.service.d.ts +26 -0
  275. package/src/services/runtime-state/server-invalidation-state.service.js +35 -0
  276. package/src/services/validation/schema-validation-service.d.ts +122 -0
  277. package/src/services/validation/schema-validation-service.js +101 -0
  278. package/src/services/validation/{standard-schema.types.ts → standard-schema.types.d.ts} +17 -20
  279. package/src/services/validation/standard-schema.types.js +0 -0
  280. package/src/static-site-generator/static-site-generator.d.ts +105 -0
  281. package/src/static-site-generator/static-site-generator.js +349 -0
  282. package/src/types/internal-types.d.ts +231 -0
  283. package/src/types/internal-types.js +0 -0
  284. package/src/types/public-types.d.ts +1257 -0
  285. package/src/types/public-types.js +0 -0
  286. package/src/utils/deep-merge.d.ts +14 -0
  287. package/src/utils/deep-merge.js +32 -0
  288. package/src/utils/hash.d.ts +1 -0
  289. package/src/utils/hash.js +7 -0
  290. package/src/utils/html-escaping.d.ts +7 -0
  291. package/src/utils/html-escaping.js +6 -0
  292. package/src/utils/html.js +4 -0
  293. package/src/utils/invariant.d.ts +5 -0
  294. package/src/utils/invariant.js +11 -0
  295. package/src/utils/locals-utils.d.ts +15 -0
  296. package/src/utils/locals-utils.js +24 -0
  297. package/src/utils/parse-cli-args.d.ts +27 -0
  298. package/src/utils/parse-cli-args.js +62 -0
  299. package/src/utils/path-utils.module.d.ts +5 -0
  300. package/src/utils/path-utils.module.js +14 -0
  301. package/src/utils/resolve-work-dir.d.ts +11 -0
  302. package/src/utils/resolve-work-dir.js +31 -0
  303. package/src/utils/runtime.d.ts +11 -0
  304. package/src/utils/runtime.js +40 -0
  305. package/src/utils/server-utils.module.d.ts +19 -0
  306. package/src/utils/server-utils.module.js +56 -0
  307. package/src/watchers/project-watcher.d.ts +136 -0
  308. package/src/watchers/project-watcher.js +275 -0
  309. package/src/watchers/project-watcher.test-helpers.d.ts +4 -0
  310. package/src/watchers/project-watcher.test-helpers.js +52 -0
  311. package/src/adapters/abstract/application-adapter.test.ts +0 -172
  312. package/src/adapters/abstract/application-adapter.ts +0 -379
  313. package/src/adapters/abstract/router-adapter.ts +0 -30
  314. package/src/adapters/abstract/server-adapter.ts +0 -79
  315. package/src/adapters/bun/client-bridge.ts +0 -62
  316. package/src/adapters/bun/create-app.ts +0 -180
  317. package/src/adapters/bun/hmr-manager.test.ts +0 -267
  318. package/src/adapters/bun/hmr-manager.ts +0 -406
  319. package/src/adapters/bun/index.ts +0 -2
  320. package/src/adapters/bun/server-adapter.ts +0 -500
  321. package/src/adapters/bun/server-lifecycle.ts +0 -124
  322. package/src/adapters/create-app.test.ts +0 -10
  323. package/src/adapters/create-app.ts +0 -91
  324. package/src/adapters/index.ts +0 -2
  325. package/src/adapters/node/create-app.test.ts +0 -53
  326. package/src/adapters/node/create-app.ts +0 -183
  327. package/src/adapters/node/node-client-bridge.test.ts +0 -198
  328. package/src/adapters/node/node-client-bridge.ts +0 -79
  329. package/src/adapters/node/node-hmr-manager.test.ts +0 -322
  330. package/src/adapters/node/node-hmr-manager.ts +0 -378
  331. package/src/adapters/node/server-adapter.ts +0 -502
  332. package/src/adapters/node/static-content-server.test.ts +0 -60
  333. package/src/adapters/node/static-content-server.ts +0 -239
  334. package/src/adapters/shared/api-response.test.ts +0 -97
  335. package/src/adapters/shared/api-response.ts +0 -104
  336. package/src/adapters/shared/application-adapter.ts +0 -199
  337. package/src/adapters/shared/define-api-handler.ts +0 -66
  338. package/src/adapters/shared/explicit-static-route-matcher.test.ts +0 -381
  339. package/src/adapters/shared/explicit-static-route-matcher.ts +0 -140
  340. package/src/adapters/shared/file-route-middleware-pipeline.test.ts +0 -90
  341. package/src/adapters/shared/file-route-middleware-pipeline.ts +0 -127
  342. package/src/adapters/shared/fs-server-response-factory.test.ts +0 -187
  343. package/src/adapters/shared/fs-server-response-factory.ts +0 -118
  344. package/src/adapters/shared/fs-server-response-matcher.test.ts +0 -285
  345. package/src/adapters/shared/fs-server-response-matcher.ts +0 -189
  346. package/src/adapters/shared/hmr-entrypoint-registrar.ts +0 -149
  347. package/src/adapters/shared/hmr-html-response.ts +0 -52
  348. package/src/adapters/shared/hmr-manager.contract.test.ts +0 -232
  349. package/src/adapters/shared/hmr-manager.dispatch.test.ts +0 -220
  350. package/src/adapters/shared/render-context.test.ts +0 -150
  351. package/src/adapters/shared/render-context.ts +0 -123
  352. package/src/adapters/shared/runtime-bootstrap.ts +0 -79
  353. package/src/adapters/shared/server-adapter.test.ts +0 -77
  354. package/src/adapters/shared/server-adapter.ts +0 -493
  355. package/src/adapters/shared/server-route-handler.test.ts +0 -110
  356. package/src/adapters/shared/server-route-handler.ts +0 -153
  357. package/src/adapters/shared/server-static-builder.test.ts +0 -338
  358. package/src/adapters/shared/server-static-builder.ts +0 -170
  359. package/src/build/build-adapter-serialization.test.ts +0 -281
  360. package/src/build/build-adapter.test.ts +0 -1240
  361. package/src/build/build-adapter.ts +0 -1012
  362. package/src/build/build-manifest.ts +0 -54
  363. package/src/build/build-types.ts +0 -83
  364. package/src/build/dev-build-coordinator.ts +0 -220
  365. package/src/build/esbuild-build-adapter.ts +0 -660
  366. package/src/build/runtime-build-executor.test.ts +0 -81
  367. package/src/build/runtime-build-executor.ts +0 -40
  368. package/src/build/runtime-specifier-alias-plugin.test.ts +0 -67
  369. package/src/build/runtime-specifier-alias-plugin.ts +0 -62
  370. package/src/build/runtime-specifier-aliases.ts +0 -135
  371. package/src/config/config-builder.test.ts +0 -443
  372. package/src/config/config-builder.ts +0 -742
  373. package/src/config/config-builder.typecheck.test.ts +0 -96
  374. package/src/dev/sc-server.ts +0 -143
  375. package/src/eco/eco.browser.test.ts +0 -43
  376. package/src/eco/eco.browser.ts +0 -118
  377. package/src/eco/eco.test.ts +0 -654
  378. package/src/eco/eco.ts +0 -205
  379. package/src/eco/eco.types.ts +0 -221
  380. package/src/eco/eco.utils.test.ts +0 -219
  381. package/src/eco/eco.utils.ts +0 -5
  382. package/src/eco/global-injector-map.test.ts +0 -42
  383. package/src/eco/global-injector-map.ts +0 -112
  384. package/src/eco/lazy-injector-map.test.ts +0 -66
  385. package/src/eco/lazy-injector-map.ts +0 -120
  386. package/src/eco/module-dependencies.test.ts +0 -30
  387. package/src/eco/module-dependencies.ts +0 -75
  388. package/src/errors/http-error.test.ts +0 -134
  389. package/src/errors/http-error.ts +0 -72
  390. package/src/errors/locals-access-error.ts +0 -7
  391. package/src/global/app-logger.ts +0 -4
  392. package/src/global/utils.test.ts +0 -12
  393. 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
  394. package/src/hmr/client/__screenshots__/hmr-runtime.test.browser.ts/HMR-Runtime-HMR-Server-Integration-should-load-fixture-app-page-1.png +0 -0
  395. package/src/hmr/client/__screenshots__/hmr-runtime.test.browser.ts/HMR-Runtime-WebSocket-Connection-should-connect-to-correct-HMR-endpoint-1.png +0 -0
  396. package/src/hmr/client/hmr-runtime.ts +0 -160
  397. package/src/hmr/hmr-strategy.test.ts +0 -124
  398. package/src/hmr/hmr-strategy.ts +0 -177
  399. package/src/hmr/hmr.postcss.test.e2e.ts +0 -41
  400. package/src/hmr/hmr.test.e2e.ts +0 -66
  401. package/src/hmr/strategies/default-hmr-strategy.ts +0 -60
  402. package/src/hmr/strategies/js-hmr-strategy.test.ts +0 -335
  403. package/src/hmr/strategies/js-hmr-strategy.ts +0 -320
  404. package/src/index.browser.ts +0 -3
  405. package/src/index.ts +0 -15
  406. package/src/integrations/ghtml/ghtml-renderer.test.ts +0 -253
  407. package/src/integrations/ghtml/ghtml-renderer.ts +0 -97
  408. package/src/integrations/ghtml/ghtml.constants.ts +0 -1
  409. package/src/integrations/ghtml/ghtml.plugin.ts +0 -28
  410. package/src/plugins/alias-resolver-plugin.test.ts +0 -41
  411. package/src/plugins/alias-resolver-plugin.ts +0 -63
  412. package/src/plugins/eco-component-meta-plugin.test.ts +0 -406
  413. package/src/plugins/eco-component-meta-plugin.ts +0 -495
  414. package/src/plugins/foreign-jsx-override-plugin.test.ts +0 -65
  415. package/src/plugins/foreign-jsx-override-plugin.ts +0 -67
  416. package/src/plugins/integration-plugin.test.ts +0 -156
  417. package/src/plugins/integration-plugin.ts +0 -311
  418. package/src/plugins/processor.test.ts +0 -148
  419. package/src/plugins/processor.ts +0 -240
  420. package/src/plugins/source-transform.test.ts +0 -82
  421. package/src/plugins/source-transform.ts +0 -123
  422. package/src/route-renderer/orchestration/boundary-planning.service.ts +0 -146
  423. package/src/route-renderer/orchestration/component-render-context.ts +0 -318
  424. package/src/route-renderer/orchestration/integration-renderer.test.ts +0 -2088
  425. package/src/route-renderer/orchestration/integration-renderer.ts +0 -1285
  426. package/src/route-renderer/orchestration/page-packaging.service.test.ts +0 -76
  427. package/src/route-renderer/orchestration/page-packaging.service.ts +0 -85
  428. package/src/route-renderer/orchestration/processed-asset-dedupe.ts +0 -25
  429. package/src/route-renderer/orchestration/queued-boundary-runtime.service.test.ts +0 -319
  430. package/src/route-renderer/orchestration/queued-boundary-runtime.service.ts +0 -289
  431. package/src/route-renderer/orchestration/render-execution.service.test.ts +0 -196
  432. package/src/route-renderer/orchestration/render-execution.service.ts +0 -182
  433. package/src/route-renderer/orchestration/render-output.utils.ts +0 -302
  434. package/src/route-renderer/orchestration/render-preparation.service.test.ts +0 -569
  435. package/src/route-renderer/orchestration/render-preparation.service.ts +0 -508
  436. package/src/route-renderer/orchestration/route-shell-composer.service.ts +0 -162
  437. package/src/route-renderer/orchestration/template-serialization.test.ts +0 -110
  438. package/src/route-renderer/orchestration/template-serialization.ts +0 -117
  439. package/src/route-renderer/page-loading/component-dependency-collection.ts +0 -196
  440. package/src/route-renderer/page-loading/declared-asset-collection.ts +0 -156
  441. package/src/route-renderer/page-loading/dependency-resolver.test.ts +0 -665
  442. package/src/route-renderer/page-loading/dependency-resolver.ts +0 -150
  443. package/src/route-renderer/page-loading/ecopages-virtual-imports.ts +0 -75
  444. package/src/route-renderer/page-loading/lazy-entry-collection.ts +0 -167
  445. package/src/route-renderer/page-loading/lazy-trigger-planning.ts +0 -74
  446. package/src/route-renderer/page-loading/module-declaration-aggregation.ts +0 -60
  447. package/src/route-renderer/page-loading/module-declaration-scripts.ts +0 -16
  448. package/src/route-renderer/page-loading/page-dependency-bundling.ts +0 -205
  449. package/src/route-renderer/page-loading/page-module-loader.test.ts +0 -183
  450. package/src/route-renderer/page-loading/page-module-loader.ts +0 -184
  451. package/src/route-renderer/route-renderer.ts +0 -136
  452. package/src/router/client/link-intent.test.browser.ts +0 -51
  453. package/src/router/client/link-intent.ts +0 -92
  454. package/src/router/client/navigation-coordinator.test.ts +0 -237
  455. package/src/router/client/navigation-coordinator.ts +0 -453
  456. package/src/router/server/fs-router-scanner.test.ts +0 -83
  457. package/src/router/server/fs-router-scanner.ts +0 -224
  458. package/src/router/server/fs-router.test.ts +0 -214
  459. package/src/router/server/fs-router.ts +0 -122
  460. package/src/services/assets/asset-processing-service/asset-dependency-keys.ts +0 -66
  461. package/src/services/assets/asset-processing-service/asset-processing.service.test.ts +0 -476
  462. package/src/services/assets/asset-processing-service/asset-processing.service.ts +0 -345
  463. package/src/services/assets/asset-processing-service/asset.factory.test.ts +0 -63
  464. package/src/services/assets/asset-processing-service/asset.factory.ts +0 -105
  465. package/src/services/assets/asset-processing-service/assets.types.ts +0 -125
  466. package/src/services/assets/asset-processing-service/browser-runtime-asset.factory.test.ts +0 -74
  467. package/src/services/assets/asset-processing-service/browser-runtime-asset.factory.ts +0 -96
  468. package/src/services/assets/asset-processing-service/browser-runtime-entry.factory.test.ts +0 -67
  469. package/src/services/assets/asset-processing-service/browser-runtime-entry.factory.ts +0 -78
  470. package/src/services/assets/asset-processing-service/grouped-content-bundles.ts +0 -104
  471. package/src/services/assets/asset-processing-service/index.ts +0 -5
  472. package/src/services/assets/asset-processing-service/processor.registry.ts +0 -18
  473. package/src/services/assets/asset-processing-service/processors/base/base-processor.test.ts +0 -59
  474. package/src/services/assets/asset-processing-service/processors/base/base-processor.ts +0 -83
  475. package/src/services/assets/asset-processing-service/processors/base/base-script-processor.ts +0 -174
  476. package/src/services/assets/asset-processing-service/processors/index.ts +0 -5
  477. package/src/services/assets/asset-processing-service/processors/script/content-script.processor.test.ts +0 -192
  478. package/src/services/assets/asset-processing-service/processors/script/content-script.processor.ts +0 -134
  479. package/src/services/assets/asset-processing-service/processors/script/file-script.processor.test.ts +0 -326
  480. package/src/services/assets/asset-processing-service/processors/script/file-script.processor.ts +0 -110
  481. package/src/services/assets/asset-processing-service/processors/script/node-module-script.processor.test.ts +0 -227
  482. package/src/services/assets/asset-processing-service/processors/script/node-module-script.processor.ts +0 -87
  483. package/src/services/assets/asset-processing-service/processors/stylesheet/content-stylesheet.processor.test.ts +0 -261
  484. package/src/services/assets/asset-processing-service/processors/stylesheet/content-stylesheet.processor.ts +0 -71
  485. package/src/services/assets/asset-processing-service/processors/stylesheet/file-stylesheet.processor.ts +0 -81
  486. package/src/services/assets/asset-processing-service/ungrouped-dependency-processing.ts +0 -65
  487. package/src/services/assets/browser-bundle.service.test.ts +0 -66
  488. package/src/services/assets/browser-bundle.service.ts +0 -109
  489. package/src/services/cache/cache.types.ts +0 -126
  490. package/src/services/cache/index.ts +0 -18
  491. package/src/services/cache/memory-cache-store.test.ts +0 -225
  492. package/src/services/cache/memory-cache-store.ts +0 -130
  493. package/src/services/cache/page-cache-service.test.ts +0 -175
  494. package/src/services/cache/page-cache-service.ts +0 -202
  495. package/src/services/cache/page-request-cache-coordinator.service.test.ts +0 -79
  496. package/src/services/cache/page-request-cache-coordinator.service.ts +0 -131
  497. package/src/services/html/html-rewriter-provider.service.test.ts +0 -183
  498. package/src/services/html/html-rewriter-provider.service.ts +0 -104
  499. package/src/services/html/html-transformer.service.test.ts +0 -479
  500. package/src/services/html/html-transformer.service.ts +0 -275
  501. package/src/services/invalidation/development-invalidation.service.test.ts +0 -87
  502. package/src/services/invalidation/development-invalidation.service.ts +0 -262
  503. package/src/services/module-loading/app-module-loader.service.ts +0 -9
  504. package/src/services/module-loading/app-server-module-transpiler.service.test.ts +0 -130
  505. package/src/services/module-loading/app-server-module-transpiler.service.ts +0 -143
  506. package/src/services/module-loading/host-module-loader-registry.ts +0 -15
  507. package/src/services/module-loading/node-bootstrap-plugin.test.ts +0 -335
  508. package/src/services/module-loading/node-bootstrap-plugin.ts +0 -297
  509. package/src/services/module-loading/page-module-import.service.test.ts +0 -504
  510. package/src/services/module-loading/page-module-import.service.ts +0 -252
  511. package/src/services/module-loading/server-module-transpiler.service.test.ts +0 -243
  512. package/src/services/module-loading/server-module-transpiler.service.ts +0 -104
  513. package/src/services/module-loading/source-module-support.ts +0 -19
  514. package/src/services/runtime-state/dev-graph.service.ts +0 -217
  515. package/src/services/runtime-state/entrypoint-dependency-graph.service.ts +0 -136
  516. package/src/services/runtime-state/runtime-specifier-registry.service.ts +0 -96
  517. package/src/services/runtime-state/server-invalidation-state.service.ts +0 -68
  518. package/src/services/validation/schema-validation-service.test.ts +0 -223
  519. package/src/services/validation/schema-validation-service.ts +0 -204
  520. package/src/static-site-generator/static-site-generator.test.ts +0 -316
  521. package/src/static-site-generator/static-site-generator.ts +0 -462
  522. package/src/types/internal-types.ts +0 -242
  523. package/src/types/public-types.ts +0 -1443
  524. package/src/utils/deep-merge.test.ts +0 -114
  525. package/src/utils/deep-merge.ts +0 -47
  526. package/src/utils/hash.ts +0 -5
  527. package/src/utils/html-escaping.ts +0 -9
  528. package/src/utils/invariant.test.ts +0 -22
  529. package/src/utils/invariant.ts +0 -15
  530. package/src/utils/locals-utils.ts +0 -37
  531. package/src/utils/parse-cli-args.test.ts +0 -69
  532. package/src/utils/parse-cli-args.ts +0 -105
  533. package/src/utils/path-utils.module.ts +0 -14
  534. package/src/utils/path-utils.test.ts +0 -15
  535. package/src/utils/resolve-work-dir.ts +0 -45
  536. package/src/utils/runtime.ts +0 -44
  537. package/src/utils/server-utils.module.ts +0 -67
  538. package/src/utils/server-utils.test.ts +0 -38
  539. package/src/watchers/project-watcher.integration.test.ts +0 -337
  540. package/src/watchers/project-watcher.test-helpers.ts +0 -41
  541. package/src/watchers/project-watcher.test.ts +0 -768
  542. package/src/watchers/project-watcher.ts +0 -357
  543. /package/src/utils/{html.ts → html.d.ts} +0 -0
@@ -0,0 +1,932 @@
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 { DependencyResolverService } from "../page-loading/dependency-resolver.js";
7
+ import { PageModuleLoaderService } from "../page-loading/page-module-loader.js";
8
+ import { PagePackagingService } from "./page-packaging.service.js";
9
+ import { RenderExecutionService } from "./render-execution.service.js";
10
+ import { RenderPreparationService } from "./render-preparation.service.js";
11
+ import { RouteShellComposer } from "./route-shell-composer.service.js";
12
+ import { normalizeBoundaryArtifactHtml } from "./render-output.utils.js";
13
+ import { getComponentRenderContext, runWithComponentRenderContext } from "./component-render-context.js";
14
+ import {
15
+ QueuedBoundaryRuntimeService
16
+ } from "./queued-boundary-runtime.service.js";
17
+ class IntegrationRenderer {
18
+ appConfig;
19
+ assetProcessingService;
20
+ htmlTransformer;
21
+ hmrManager;
22
+ resolvedIntegrationDependencies = [];
23
+ rendererModules;
24
+ runtimeOrigin;
25
+ dependencyResolverService;
26
+ pageModuleLoaderService;
27
+ renderPreparationService;
28
+ renderExecutionService;
29
+ pagePackagingService;
30
+ routeShellComposer = new RouteShellComposer();
31
+ queuedBoundaryRuntimeService = new QueuedBoundaryRuntimeService();
32
+ DOC_TYPE = "<!DOCTYPE html>";
33
+ /**
34
+ * Loads one route module through the owning renderer's import path.
35
+ *
36
+ * Request-time infrastructure may need page metadata such as cache strategy or
37
+ * middleware before full rendering starts. Exposing this narrow entrypoint lets
38
+ * those callers reuse integration-specific import setup instead of bypassing it
39
+ * with raw transpiler access.
40
+ */
41
+ async loadPageModule(file, options) {
42
+ return this.importPageFile(file, options);
43
+ }
44
+ /**
45
+ * Reads the execution-scoped foreign renderer cache from one boundary input.
46
+ *
47
+ * Shared page/layout/document shell helpers pass one cache through
48
+ * `integrationContext` so repeated delegation to the same foreign integration
49
+ * can reuse a single initialized renderer instance during one render flow.
50
+ * The cache is deliberately scoped to the current render execution rather than
51
+ * stored on the renderer, which avoids leaking mutable integration state across
52
+ * requests while still preventing redundant renderer initialization.
53
+ *
54
+ * @param integrationContext - Optional boundary context carried with one render input.
55
+ * @returns The current execution cache when present.
56
+ */
57
+ getBoundaryRendererCache(integrationContext) {
58
+ if (integrationContext?.rendererCache instanceof Map) {
59
+ return integrationContext.rendererCache;
60
+ }
61
+ return void 0;
62
+ }
63
+ getRegisteredBoundaryOwner(component) {
64
+ const integrationName = component.config?.integration ?? component.config?.__eco?.integration;
65
+ if (!integrationName || integrationName === this.name) {
66
+ return void 0;
67
+ }
68
+ return this.appConfig.integrations.some((integration) => integration.name === integrationName) ? integrationName : void 0;
69
+ }
70
+ /**
71
+ * Attaches an execution-scoped foreign renderer cache to one boundary input.
72
+ *
73
+ * Foreign-owned page, layout, or document shells may delegate several times in
74
+ * the same render flow. Threading the cache through `integrationContext`
75
+ * preserves renderer reuse without changing the public boundary input contract.
76
+ * Existing integration-specific context is preserved and augmented.
77
+ *
78
+ * @param input - Original boundary render input.
79
+ * @param rendererCache - Execution-scoped renderer cache to propagate.
80
+ * @returns Boundary input augmented with the shared renderer cache.
81
+ */
82
+ withBoundaryRendererCache(input, rendererCache) {
83
+ const integrationContext = input.integrationContext;
84
+ const sharedRendererCache = rendererCache;
85
+ return {
86
+ ...input,
87
+ integrationContext: integrationContext ? { ...integrationContext, rendererCache: sharedRendererCache } : { rendererCache: sharedRendererCache }
88
+ };
89
+ }
90
+ getRendererModuleValue(key) {
91
+ if (!this.rendererModules || typeof this.rendererModules !== "object") {
92
+ return void 0;
93
+ }
94
+ return this.rendererModules[key];
95
+ }
96
+ getRendererModuleString(key) {
97
+ const value = this.getRendererModuleValue(key);
98
+ return typeof value === "string" && value.length > 0 ? value : void 0;
99
+ }
100
+ getRendererBootstrapDependencies(partial = false) {
101
+ if (partial) {
102
+ return [];
103
+ }
104
+ const islandClientModuleId = this.getRendererModuleString("islandClientModuleId");
105
+ if (!islandClientModuleId) {
106
+ return [];
107
+ }
108
+ return [
109
+ {
110
+ attributes: {
111
+ crossorigin: "anonymous",
112
+ "data-ecopages-runtime": "islands",
113
+ type: "module"
114
+ },
115
+ content: `import ${JSON.stringify(islandClientModuleId)};`,
116
+ inline: true,
117
+ kind: "script",
118
+ packageRole: "keep-separate",
119
+ position: "body"
120
+ }
121
+ ];
122
+ }
123
+ setHmrManager(hmrManager) {
124
+ this.hmrManager = hmrManager;
125
+ if (this.assetProcessingService) {
126
+ this.assetProcessingService.setHmrManager(hmrManager);
127
+ }
128
+ }
129
+ /**
130
+ * Build response headers with optional custom headers.
131
+ * @param contentType - The Content-Type header value
132
+ * @param customHeaders - Optional custom headers to merge
133
+ * @returns Headers object
134
+ */
135
+ buildHeaders(contentType, customHeaders) {
136
+ const headers = new Headers({ "Content-Type": contentType });
137
+ if (customHeaders) {
138
+ const incoming = new Headers(customHeaders);
139
+ incoming.forEach((value, key) => headers.set(key, value));
140
+ }
141
+ return headers;
142
+ }
143
+ /**
144
+ * Create an HTML Response.
145
+ * @param body - Response body (string or ReadableStream)
146
+ * @param ctx - Render context with status and headers
147
+ * @returns Response object
148
+ */
149
+ createHtmlResponse(body, ctx) {
150
+ return new Response(body, {
151
+ status: ctx.status ?? 200,
152
+ headers: this.buildHeaders("text/html; charset=utf-8", ctx.headers)
153
+ });
154
+ }
155
+ /**
156
+ * Create an HttpError for render failures.
157
+ * @param message - Error message
158
+ * @param cause - Original error if available
159
+ * @returns HttpError with 500 status
160
+ */
161
+ createRenderError(message, cause) {
162
+ const errorMessage = cause instanceof Error ? `${message}: ${cause.message}` : message;
163
+ return HttpError.InternalServerError(errorMessage);
164
+ }
165
+ /**
166
+ * Prepares dependencies for renderToResponse by resolving component dependencies
167
+ * and configuring the HTML transformer.
168
+ * @param view - The view component being rendered
169
+ * @param layout - Optional layout component
170
+ * @returns Resolved processed assets
171
+ */
172
+ async prepareViewDependencies(view, layout) {
173
+ const HtmlTemplate = await this.getHtmlTemplate();
174
+ const componentsToResolve = layout ? [HtmlTemplate, layout, view] : [HtmlTemplate, view];
175
+ const resolvedDependencies = this.htmlTransformer.dedupeProcessedAssets(
176
+ await this.resolveDependencies(componentsToResolve)
177
+ );
178
+ this.htmlTransformer.setPagePackage(this.pagePackagingService.createPagePackage(resolvedDependencies));
179
+ return resolvedDependencies;
180
+ }
181
+ /**
182
+ * Merges component-scoped assets into the active HTML transformer state.
183
+ *
184
+ * Explicit page, layout, and document shell composition can produce assets at
185
+ * each boundary. This helper deduplicates those groups and folds them back into
186
+ * the transformer so downstream HTML finalization sees one canonical asset set.
187
+ *
188
+ * @param assetGroups - Optional groups of processed assets to merge.
189
+ * @returns The deduplicated asset subset contributed by this merge operation.
190
+ */
191
+ appendProcessedDependencies(...assetGroups) {
192
+ const nextDependencies = this.htmlTransformer.dedupeProcessedAssets(
193
+ assetGroups.flatMap((assets) => assets ?? [])
194
+ );
195
+ if (nextDependencies.length === 0) {
196
+ return nextDependencies;
197
+ }
198
+ const mergedDependencies = this.htmlTransformer.dedupeProcessedAssets([
199
+ ...this.htmlTransformer.getProcessedDependencies(),
200
+ ...nextDependencies
201
+ ]);
202
+ this.htmlTransformer.setPagePackage(this.pagePackagingService.createPagePackage(mergedDependencies));
203
+ return nextDependencies;
204
+ }
205
+ /**
206
+ * Resolves metadata for explicit view rendering.
207
+ *
208
+ * When a view declares a `metadata()` function, that contract owns the final
209
+ * metadata for the explicit render. Otherwise the app-level default metadata is
210
+ * reused so explicit routes and page-module routes share the same fallback.
211
+ *
212
+ * @param view - View component being rendered.
213
+ * @param props - Props passed to the view.
214
+ * @returns Resolved metadata for the final document shell.
215
+ */
216
+ async resolveViewMetadata(view, props) {
217
+ return view.metadata ? await view.metadata({
218
+ params: {},
219
+ query: {},
220
+ props,
221
+ appConfig: this.appConfig
222
+ }) : this.appConfig.defaultMetadata;
223
+ }
224
+ /**
225
+ * Renders one explicit view response in partial mode.
226
+ *
227
+ * Same-integration views can optionally stream or render inline via the caller's
228
+ * `renderInline()` hook. Once a view may cross integration boundaries, this
229
+ * helper routes the render through `renderComponentBoundary()` instead so mixed
230
+ * shells can reuse the execution-scoped renderer cache and resolve nested
231
+ * foreign ownership before the partial response is returned.
232
+ *
233
+ * @param input - View render options for the partial response.
234
+ * @returns HTML response for the partial render.
235
+ */
236
+ async renderPartialViewResponse(input) {
237
+ return this.routeShellComposer.renderPartialViewResponse(input, {
238
+ hasForeignBoundaryDescendants: (component) => this.hasForeignBoundaryDescendants(component),
239
+ createHtmlResponse: (body, ctx) => this.createHtmlResponse(body, ctx),
240
+ renderComponentBoundary: (boundaryInput) => this.renderComponentBoundary(boundaryInput),
241
+ prepareViewDependencies: (view, layout) => this.prepareViewDependencies(view, layout),
242
+ getHtmlTemplate: () => this.getHtmlTemplate(),
243
+ resolveViewMetadata: (view, props) => this.resolveViewMetadata(view, props),
244
+ appendProcessedDependencies: (...assetGroups) => this.appendProcessedDependencies(...assetGroups),
245
+ finalizeResolvedHtml: (options) => this.finalizeResolvedHtml(options),
246
+ docType: this.DOC_TYPE
247
+ });
248
+ }
249
+ /**
250
+ * Renders an explicit view through optional layout and document shells.
251
+ *
252
+ * This helper is the shared explicit-route path for string-oriented and mixed
253
+ * integrations. It prepares view dependencies, resolves metadata, and composes
254
+ * view, layout, and html template boundaries with one execution-scoped renderer
255
+ * cache so repeated foreign shell delegation can reuse initialized renderers
256
+ * during the same render flow.
257
+ *
258
+ * @param input - View, props, and optional layout metadata for the render.
259
+ * @returns HTML response for the explicit view render.
260
+ */
261
+ async renderViewWithDocumentShell(input) {
262
+ return this.routeShellComposer.renderViewWithDocumentShell(input, {
263
+ hasForeignBoundaryDescendants: (component) => this.hasForeignBoundaryDescendants(component),
264
+ createHtmlResponse: (body, ctx) => this.createHtmlResponse(body, ctx),
265
+ renderComponentBoundary: (boundaryInput) => this.renderComponentBoundary(boundaryInput),
266
+ prepareViewDependencies: (view, layout) => this.prepareViewDependencies(view, layout),
267
+ getHtmlTemplate: () => this.getHtmlTemplate(),
268
+ resolveViewMetadata: (view, props) => this.resolveViewMetadata(view, props),
269
+ appendProcessedDependencies: (...assetGroups) => this.appendProcessedDependencies(...assetGroups),
270
+ finalizeResolvedHtml: (options) => this.finalizeResolvedHtml(options),
271
+ docType: this.DOC_TYPE
272
+ });
273
+ }
274
+ /**
275
+ * Renders a route page through optional layout and document shells.
276
+ *
277
+ * Route rendering and explicit view rendering now share the same boundary-owned
278
+ * shell composition model. This helper composes page, layout, and html template
279
+ * boundaries while threading one execution-scoped renderer cache through every
280
+ * delegated boundary so foreign shell ownership remains stable and renderer
281
+ * initialization is reused inside the current request.
282
+ *
283
+ * @param input - Page, layout, document, and metadata inputs for the route render.
284
+ * @returns Final serialized document HTML including the doctype prefix.
285
+ */
286
+ async renderPageWithDocumentShell(input) {
287
+ return this.routeShellComposer.renderPageWithDocumentShell(input, {
288
+ hasForeignBoundaryDescendants: (component) => this.hasForeignBoundaryDescendants(component),
289
+ createHtmlResponse: (body, ctx) => this.createHtmlResponse(body, ctx),
290
+ renderComponentBoundary: (boundaryInput) => this.renderComponentBoundary(boundaryInput),
291
+ prepareViewDependencies: (view, layout) => this.prepareViewDependencies(view, layout),
292
+ getHtmlTemplate: () => this.getHtmlTemplate(),
293
+ resolveViewMetadata: (view, props) => this.resolveViewMetadata(view, props),
294
+ appendProcessedDependencies: (...assetGroups) => this.appendProcessedDependencies(...assetGroups),
295
+ finalizeResolvedHtml: (options) => this.finalizeResolvedHtml(options),
296
+ docType: this.DOC_TYPE
297
+ });
298
+ }
299
+ /**
300
+ * Renders one string-first component boundary and collects its assets.
301
+ *
302
+ * String-oriented integrations frequently share the same boundary contract:
303
+ * pass serialized children through props, coerce the render result to HTML, and
304
+ * attach any component-scoped dependencies. This helper centralizes that flow
305
+ * so integrations can opt into shared orchestration without repeating the same
306
+ * boundary boilerplate.
307
+ *
308
+ * @param input - Boundary render input.
309
+ * @param component - String-oriented component implementation to execute.
310
+ * @returns Structured component render result for orchestration paths.
311
+ */
312
+ async renderStringComponentBoundary(input, component) {
313
+ const props = input.children === void 0 ? input.props : { ...input.props, children: input.children };
314
+ const content = await component(props);
315
+ const html = String(content);
316
+ const assets = input.component.config?.dependencies && typeof this.assetProcessingService?.processDependencies === "function" ? await this.processComponentDependencies([input.component]) : void 0;
317
+ return {
318
+ html,
319
+ canAttachAttributes: true,
320
+ rootTag: this.getRootTagName(html),
321
+ integrationName: this.name,
322
+ assets
323
+ };
324
+ }
325
+ getBoundaryTokenPrefix() {
326
+ return `__${this.name}_boundary__`;
327
+ }
328
+ getBoundaryRuntimeContextKey() {
329
+ return `__${this.name}_boundary_runtime__`;
330
+ }
331
+ getQueuedBoundaryRuntime(input, runtimeContextKey = this.getBoundaryRuntimeContextKey()) {
332
+ return this.queuedBoundaryRuntimeService.getRuntimeContext(input, runtimeContextKey);
333
+ }
334
+ async resolveQueuedBoundaryTokens(html, queuedResolutionsByToken, resolveToken) {
335
+ let resolvedHtml = html;
336
+ for (const token of queuedResolutionsByToken.keys()) {
337
+ if (!resolvedHtml.includes(token)) {
338
+ continue;
339
+ }
340
+ resolvedHtml = resolvedHtml.split(token).join(await resolveToken(token));
341
+ }
342
+ return resolvedHtml;
343
+ }
344
+ createQueuedBoundaryRuntime(options) {
345
+ return this.queuedBoundaryRuntimeService.createRuntime({
346
+ boundaryInput: options.boundaryInput,
347
+ rendererCache: options.rendererCache,
348
+ runtimeContextKey: options.runtimeContextKey ?? this.getBoundaryRuntimeContextKey(),
349
+ tokenPrefix: options.tokenPrefix ?? this.getBoundaryTokenPrefix(),
350
+ shouldQueueBoundary: (input) => this.shouldResolveBoundaryInOwningRenderer(input),
351
+ createRuntimeContext: options.createRuntimeContext
352
+ });
353
+ }
354
+ async resolveRendererOwnedQueuedBoundaryHtml(options) {
355
+ return this.queuedBoundaryRuntimeService.resolveQueuedHtml({
356
+ html: options.html,
357
+ runtimeContext: options.runtimeContext,
358
+ queueLabel: options.queueLabel,
359
+ renderQueuedChildren: options.renderQueuedChildren,
360
+ resolveBoundary: (input, rendererCache) => this.resolveBoundaryPayloadInOwningRenderer(
361
+ input,
362
+ rendererCache
363
+ ),
364
+ applyAttributesToFirstElement: (html, attributes) => this.htmlTransformer.applyAttributesToFirstElement(html, attributes),
365
+ dedupeProcessedAssets: (assets) => this.htmlTransformer.dedupeProcessedAssets(assets)
366
+ });
367
+ }
368
+ /**
369
+ * Renders a string-first component, then resolves any queued foreign
370
+ * boundaries before returning final component HTML.
371
+ */
372
+ async renderStringComponentBoundaryWithQueuedForeignBoundaries(input, component) {
373
+ const componentRender = await this.renderStringComponentBoundary(input, component);
374
+ const queuedBoundaryResolution = await this.resolveRendererOwnedQueuedBoundaryHtml({
375
+ html: componentRender.html,
376
+ runtimeContext: this.getQueuedBoundaryRuntime(input),
377
+ queueLabel: "String",
378
+ renderQueuedChildren: async (children, _runtimeContext, queuedResolutionsByToken, resolveToken) => {
379
+ if (children === void 0) {
380
+ return { assets: [], html: void 0 };
381
+ }
382
+ const html = await this.resolveQueuedBoundaryTokens(
383
+ typeof children === "string" ? children : String(children ?? ""),
384
+ queuedResolutionsByToken,
385
+ resolveToken
386
+ );
387
+ return { assets: [], html };
388
+ }
389
+ });
390
+ const mergedAssets = this.htmlTransformer.dedupeProcessedAssets([
391
+ ...componentRender.assets ?? [],
392
+ ...queuedBoundaryResolution.assets
393
+ ]);
394
+ return {
395
+ ...componentRender,
396
+ html: queuedBoundaryResolution.html,
397
+ rootTag: this.getRootTagName(queuedBoundaryResolution.html),
398
+ assets: mergedAssets.length > 0 ? mergedAssets : void 0
399
+ };
400
+ }
401
+ constructor({
402
+ appConfig,
403
+ assetProcessingService,
404
+ resolvedIntegrationDependencies,
405
+ rendererModules,
406
+ runtimeOrigin
407
+ }) {
408
+ this.appConfig = appConfig;
409
+ this.assetProcessingService = assetProcessingService;
410
+ this.htmlTransformer = new HtmlTransformerService();
411
+ this.pagePackagingService = new PagePackagingService();
412
+ this.resolvedIntegrationDependencies = resolvedIntegrationDependencies || [];
413
+ this.rendererModules = rendererModules ?? appConfig.runtime?.rendererModuleContext;
414
+ this.runtimeOrigin = runtimeOrigin;
415
+ this.dependencyResolverService = new DependencyResolverService(appConfig, assetProcessingService);
416
+ this.pageModuleLoaderService = new PageModuleLoaderService(appConfig, runtimeOrigin);
417
+ this.renderPreparationService = new RenderPreparationService(appConfig, assetProcessingService, {
418
+ pagePackagingService: this.pagePackagingService
419
+ });
420
+ this.renderExecutionService = new RenderExecutionService();
421
+ }
422
+ /**
423
+ * Returns the HTML path from the provided file path.
424
+ * It extracts the path relative to the pages directory and removes the 'index' part if present.
425
+ *
426
+ * @param file - The file path to extract the HTML path from.
427
+ * @returns The extracted HTML path.
428
+ */
429
+ getHtmlPath({ file }) {
430
+ const pagesDir = this.appConfig.absolutePaths.pagesDir;
431
+ const pagesIndex = file.indexOf(pagesDir);
432
+ if (pagesIndex === -1) return file;
433
+ const startIndex = file.indexOf(pagesDir) + pagesDir.length;
434
+ const endIndex = file.lastIndexOf("/");
435
+ const path = file.substring(startIndex, endIndex);
436
+ if (path === "/index") return "";
437
+ return path;
438
+ }
439
+ /**
440
+ * Returns the HTML template component.
441
+ * It imports the HTML template from the specified path in the app configuration.
442
+ *
443
+ * @returns The HTML template component.
444
+ */
445
+ async getHtmlTemplate() {
446
+ const htmlTemplatePath = this.getRendererModuleString("htmlTemplateModulePath") ?? this.appConfig.absolutePaths.htmlTemplatePath;
447
+ try {
448
+ const { default: HtmlTemplate } = await this.importPageFile(htmlTemplatePath);
449
+ return HtmlTemplate;
450
+ } catch (error) {
451
+ invariant(false, `Error importing HtmlTemplate: ${error}`);
452
+ }
453
+ }
454
+ /**
455
+ * Returns the static props for the page.
456
+ * It calls the provided getStaticProps function with the given options.
457
+ *
458
+ * @param getStaticProps - The function to get static props.
459
+ * @param options - The options to pass to the getStaticProps function.
460
+ * @returns The static props and metadata.
461
+ */
462
+ async getStaticProps(getStaticProps, options) {
463
+ return this.pageModuleLoaderService.getStaticPropsForPage({
464
+ getStaticProps,
465
+ params: options?.params
466
+ });
467
+ }
468
+ /**
469
+ * Returns the metadata properties for the page.
470
+ * It calls the provided getMetadata function with the given context.
471
+ *
472
+ * @param getMetadata - The function to get metadata.
473
+ * @param context - The context to pass to the getMetadata function.
474
+ * @returns The metadata properties.
475
+ */
476
+ async getMetadataProps(getMetadata, { props, params, query }) {
477
+ return this.pageModuleLoaderService.getMetadataPropsForPage({
478
+ getMetadata,
479
+ context: { props, params, query }
480
+ });
481
+ }
482
+ usesIntegrationPageImporter(_file) {
483
+ return false;
484
+ }
485
+ async importIntegrationPageFile(_file, _options) {
486
+ invariant(false, "Integration page importer must be implemented when enabled");
487
+ }
488
+ normalizeImportedPageFile(_file, pageModule) {
489
+ return pageModule;
490
+ }
491
+ /**
492
+ * Imports the page file from the specified path.
493
+ * It uses dynamic import to load the file and returns the imported module.
494
+ *
495
+ * @param file - The file path to import.
496
+ * @returns The imported module.
497
+ */
498
+ async importPageFile(file, options) {
499
+ const bypassCache = options?.bypassCache ?? (typeof Bun !== "undefined" && process.env.NODE_ENV === "development");
500
+ const pageModule = this.usesIntegrationPageImporter(file) ? await this.importIntegrationPageFile(file, {
501
+ bypassCache,
502
+ cacheScope: options?.cacheScope
503
+ }) : await this.pageModuleLoaderService.importPageFile(file, {
504
+ bypassCache,
505
+ cacheScope: options?.cacheScope
506
+ });
507
+ return this.normalizeImportedPageFile(file, pageModule);
508
+ }
509
+ /**
510
+ * Resolves the dependency path based on the component directory.
511
+ * It combines the component directory with the provided path URL.
512
+ *
513
+ * @param componentDir - The component directory path.
514
+ * @param pathUrl - The path URL to resolve.
515
+ * @returns The resolved dependency path.
516
+ */
517
+ resolveDependencyPath(componentDir, pathUrl) {
518
+ return this.dependencyResolverService.resolveDependencyPath(componentDir, pathUrl);
519
+ }
520
+ /**
521
+ * Extracts the dependencies from the provided component configuration.
522
+ * It resolves the paths for scripts and stylesheets based on the component directory.
523
+ *
524
+ * @param componentDir - The component directory path.
525
+ * @param scripts - The scripts to extract.
526
+ * @param stylesheets - The stylesheets to extract.
527
+ * @returns The extracted dependencies.
528
+ */
529
+ extractDependencies({
530
+ componentDir,
531
+ scripts,
532
+ stylesheets
533
+ }) {
534
+ const scriptsPaths = [
535
+ ...new Set(
536
+ (scripts ?? []).filter((script) => typeof script === "string" ? true : !script.lazy).map((script) => typeof script === "string" ? script : script.src).filter((script) => Boolean(script)).map((script) => this.resolveDependencyPath(componentDir, script))
537
+ )
538
+ ];
539
+ const stylesheetsPaths = [
540
+ ...new Set(
541
+ (stylesheets ?? []).map((style) => typeof style === "string" ? style : style.src).filter((style) => Boolean(style)).map((style) => this.resolveDependencyPath(componentDir, style))
542
+ )
543
+ ];
544
+ return {
545
+ scripts: scriptsPaths,
546
+ stylesheets: stylesheetsPaths
547
+ };
548
+ }
549
+ /**
550
+ * Resolves lazy script paths to public asset URLs.
551
+ * Converts source paths to their final bundled output paths.
552
+ *
553
+ * @param componentDir - The component directory path.
554
+ * @param scripts - The lazy script paths to resolve.
555
+ * @returns Comma-separated string of resolved public script paths.
556
+ */
557
+ resolveLazyScripts(componentDir, scripts) {
558
+ return this.dependencyResolverService.resolveLazyScripts(componentDir, scripts);
559
+ }
560
+ /**
561
+ * Collects the dependencies for the provided components.
562
+ * Combines component-specific dependencies with global integration dependencies.
563
+ *
564
+ * @param components - The components to collect dependencies from.
565
+ */
566
+ async resolveDependencies(components) {
567
+ const componentDeps = await this.processComponentDependencies(components);
568
+ return this.resolvedIntegrationDependencies.concat(componentDeps);
569
+ }
570
+ /**
571
+ * Processes component-specific dependencies WITHOUT prepending global integration dependencies.
572
+ * Use this method when you need only the component's own assets.
573
+ *
574
+ * @param components - The components to collect dependencies from.
575
+ */
576
+ async processComponentDependencies(components) {
577
+ return this.dependencyResolverService.processComponentDependencies(components, this.name);
578
+ }
579
+ /**
580
+ * Prepares the render options for the integration renderer.
581
+ * It imports the page file, collects dependencies, and prepares the render options.
582
+ *
583
+ * @param options - The route renderer options.
584
+ * @returns The prepared render options.
585
+ */
586
+ async prepareRenderOptions(options) {
587
+ const preparedOptions = await this.renderPreparationService.prepare(options, this.name, {
588
+ resolvePageModule: (file) => this.resolvePageModule(file),
589
+ getHtmlTemplate: () => this.getHtmlTemplate(),
590
+ resolvePageData: (pageModule, routeOptions) => this.resolvePageData(pageModule, routeOptions),
591
+ resolveDependencies: (components) => this.resolveDependencies(components),
592
+ buildRouteRenderAssets: (file) => this.buildRouteRenderAssets(file),
593
+ shouldRenderPageComponent: (input) => this.shouldRenderPageComponent(input),
594
+ renderPageComponent: ({ component, props }) => this.renderComponentBoundary({
595
+ component,
596
+ props,
597
+ integrationContext: {
598
+ componentInstanceId: "eco-page-root"
599
+ }
600
+ })
601
+ });
602
+ invariant(preparedOptions.pagePackage !== void 0, "Expected render preparation to produce a page package");
603
+ this.htmlTransformer.setPagePackage(preparedOptions.pagePackage);
604
+ return preparedOptions;
605
+ }
606
+ /**
607
+ * Controls whether the page root should be rendered through `renderComponent()`
608
+ * during route option preparation in component-capable modes.
609
+ *
610
+ * Integrations that already own page-level hydration (for example router-driven
611
+ * React rendering) can override this and return `false` to avoid duplicate root
612
+ * mount assets and competing hydration entrypoints.
613
+ */
614
+ shouldRenderPageComponent(_input) {
615
+ return true;
616
+ }
617
+ /**
618
+ * Resolves the page module and normalizes exports.
619
+ */
620
+ async resolvePageModule(file) {
621
+ return this.pageModuleLoaderService.resolvePageModule({
622
+ file,
623
+ importPageFileFn: (targetFile) => this.importPageFile(targetFile)
624
+ });
625
+ }
626
+ /**
627
+ * Resolves static props and metadata for the page.
628
+ */
629
+ async resolvePageData(pageModule, options) {
630
+ return this.pageModuleLoaderService.resolvePageData({
631
+ pageModule,
632
+ routeOptions: options
633
+ });
634
+ }
635
+ /**
636
+ * Executes the integration renderer with the provided options.
637
+ *
638
+ * Execution flow:
639
+ * 1. Build normalized render options (`prepareRenderOptions`).
640
+ * 2. Render the route body once.
641
+ * 3. Reject unresolved route-level boundary artifacts.
642
+ * 4. Optionally apply root attributes for page/component root boundaries.
643
+ * 5. Run HTML transformer with final dependency set.
644
+ *
645
+ * Stream-safety note: the first render result is normalized to a string once,
646
+ * then the pipeline continues with that immutable HTML value to avoid disturbed
647
+ * response-body errors.
648
+ *
649
+ * @param options Route renderer options.
650
+ * @returns Rendered route body plus effective cache strategy.
651
+ */
652
+ async execute(options) {
653
+ return this.renderExecutionService.execute(options, {
654
+ prepareRenderOptions: (routeOptions) => this.prepareRenderOptions(routeOptions),
655
+ render: (renderOptions) => this.render(renderOptions),
656
+ getDocumentAttributes: (renderOptions) => this.getDocumentAttributes(renderOptions),
657
+ applyAttributesToHtmlElement: (html, attributes) => this.htmlTransformer.applyAttributesToHtmlElement(html, attributes),
658
+ applyAttributesToFirstBodyElement: (html, attributes) => this.htmlTransformer.applyAttributesToFirstBodyElement(html, attributes),
659
+ transformResponse: async (response) => {
660
+ const transformedResponse = await this.htmlTransformer.transform(response);
661
+ return transformedResponse.body ?? await transformedResponse.text();
662
+ }
663
+ });
664
+ }
665
+ /**
666
+ * Finalizes already-resolved HTML for explicit renderer-owned paths.
667
+ *
668
+ * This keeps document and root-attribute stamping plus HTML transformation
669
+ * available after a renderer has completed nested boundary resolution without
670
+ * routing back through shared route execution.
671
+ */
672
+ async finalizeResolvedHtml(options) {
673
+ const rendererBootstrapDependencies = this.getRendererBootstrapDependencies(options.partial);
674
+ this.appendProcessedDependencies(rendererBootstrapDependencies);
675
+ let html = options.html;
676
+ if (options.componentRootAttributes && Object.keys(options.componentRootAttributes).length > 0) {
677
+ html = this.htmlTransformer.applyAttributesToFirstBodyElement(html, options.componentRootAttributes);
678
+ }
679
+ if (options.documentAttributes && Object.keys(options.documentAttributes).length > 0) {
680
+ html = this.htmlTransformer.applyAttributesToHtmlElement(html, options.documentAttributes);
681
+ }
682
+ const shouldTransform = options.transformHtml ?? !options.partial;
683
+ if (!shouldTransform) {
684
+ return html;
685
+ }
686
+ const transformedResponse = await this.htmlTransformer.transform(
687
+ new Response(html, {
688
+ headers: { "Content-Type": "text/html" }
689
+ })
690
+ );
691
+ return await transformedResponse.text();
692
+ }
693
+ /**
694
+ * Returns document-level attributes to stamp onto the rendered `<html>` tag.
695
+ *
696
+ * Integrations can override this to expose explicit document ownership or
697
+ * other runtime coordination markers without relying on script sniffing.
698
+ */
699
+ getDocumentAttributes(_renderOptions) {
700
+ return void 0;
701
+ }
702
+ /**
703
+ * Returns a renderer instance for a given integration name.
704
+ *
705
+ * Uses a per-execution cache to avoid repeated renderer initialization.
706
+ *
707
+ * @param integrationName Target integration name.
708
+ * @param cache Render-pass renderer cache.
709
+ * @returns Renderer for the requested integration.
710
+ * @throws Error when no integration plugin matches `integrationName`.
711
+ */
712
+ getIntegrationRendererForName(integrationName, cache) {
713
+ if (cache.has(integrationName)) {
714
+ return cache.get(integrationName);
715
+ }
716
+ if (integrationName === this.name) {
717
+ cache.set(integrationName, this);
718
+ return this;
719
+ }
720
+ const integrationPlugin = this.appConfig.integrations.find(
721
+ (integration) => integration.name === integrationName
722
+ );
723
+ invariant(!!integrationPlugin, `[ecopages] Integration not found for boundary owner: ${integrationName}`);
724
+ const renderer = integrationPlugin.initializeRenderer({
725
+ rendererModules: this.appConfig.runtime?.rendererModuleContext
726
+ });
727
+ cache.set(integrationName, renderer);
728
+ return renderer;
729
+ }
730
+ async resolveBoundaryInOwningRenderer(input, rendererCache) {
731
+ const boundaryOwner = this.getRegisteredBoundaryOwner(input.component);
732
+ if (!boundaryOwner) {
733
+ return void 0;
734
+ }
735
+ const owningRenderer = this.getIntegrationRendererForName(boundaryOwner, rendererCache);
736
+ if (owningRenderer === this || owningRenderer.name === this.name) {
737
+ return void 0;
738
+ }
739
+ return await owningRenderer.renderComponentBoundary(this.withBoundaryRendererCache(input, rendererCache));
740
+ }
741
+ async resolveBoundaryPayloadInOwningRenderer(input, rendererCache) {
742
+ const boundaryOwner = this.getRegisteredBoundaryOwner(input.component);
743
+ if (!boundaryOwner) {
744
+ return void 0;
745
+ }
746
+ const owningRenderer = this.getIntegrationRendererForName(boundaryOwner, rendererCache);
747
+ if (owningRenderer === this || owningRenderer.name === this.name) {
748
+ return void 0;
749
+ }
750
+ return await owningRenderer.renderBoundary(this.withBoundaryRendererCache(input, rendererCache));
751
+ }
752
+ /**
753
+ * Renders one component under this integration's boundary runtime and resolves
754
+ * any nested foreign boundaries captured during that render.
755
+ *
756
+ * Without this wrapper, a component tree with foreign-owned descendants would
757
+ * render them with no active boundary runtime, which bypasses the owning
758
+ * renderer's nested-boundary handoff.
759
+ */
760
+ async renderComponentBoundary(input) {
761
+ const rendererCache = this.getBoundaryRendererCache(input.integrationContext) ?? /* @__PURE__ */ new Map();
762
+ const delegatedBoundaryRender = await this.resolveBoundaryInOwningRenderer(input, rendererCache);
763
+ if (delegatedBoundaryRender) {
764
+ return delegatedBoundaryRender;
765
+ }
766
+ const hasForeignBoundaries = this.hasForeignBoundaryDescendants(input.component);
767
+ const activeRenderContext = getComponentRenderContext();
768
+ if (!hasForeignBoundaries) {
769
+ if (!activeRenderContext || activeRenderContext.currentIntegration === this.name) {
770
+ return this.normalizeComponentBoundaryRender(await this.renderComponent(input));
771
+ }
772
+ const sameIntegrationExecution = await runWithComponentRenderContext(
773
+ {
774
+ currentIntegration: this.name
775
+ },
776
+ async () => this.renderComponent(input)
777
+ );
778
+ return this.normalizeComponentBoundaryRender(sameIntegrationExecution.value);
779
+ }
780
+ const execution = await runWithComponentRenderContext(
781
+ {
782
+ currentIntegration: this.name,
783
+ boundaryRuntime: this.createComponentBoundaryRuntime({
784
+ boundaryInput: input,
785
+ rendererCache
786
+ })
787
+ },
788
+ async () => this.renderComponent(input)
789
+ );
790
+ return this.normalizeComponentBoundaryRender(execution.value);
791
+ }
792
+ /**
793
+ * Compatibility boundary contract that exposes a narrower payload shape for
794
+ * future route-composition work while preserving the current
795
+ * `renderComponentBoundary()` runtime semantics.
796
+ */
797
+ async renderBoundary(input) {
798
+ const result = await this.renderComponentBoundary(input);
799
+ return {
800
+ html: result.html,
801
+ assets: result.assets ?? [],
802
+ rootTag: result.rootTag,
803
+ rootAttributes: result.rootAttributes,
804
+ attachmentPolicy: result.canAttachAttributes ? { kind: "first-element" } : { kind: "none" },
805
+ integrationName: result.integrationName
806
+ };
807
+ }
808
+ normalizeComponentBoundaryRender(result) {
809
+ const normalizedHtml = this.normalizeBoundaryArtifactHtml(result.html);
810
+ return normalizedHtml === result.html ? result : {
811
+ ...result,
812
+ html: normalizedHtml
813
+ };
814
+ }
815
+ normalizeBoundaryArtifactHtml(html) {
816
+ return normalizeBoundaryArtifactHtml(html);
817
+ }
818
+ /**
819
+ * Returns whether the component dependency tree crosses into another
820
+ * integration.
821
+ *
822
+ * This keeps boundary-runtime setup narrow: same-integration trees can render
823
+ * directly without paying the queue orchestration cost.
824
+ */
825
+ hasForeignBoundaryDescendants(component) {
826
+ const stack = [component];
827
+ const seen = /* @__PURE__ */ new Set();
828
+ while (stack.length > 0) {
829
+ const current = stack.pop();
830
+ if (!current || seen.has(current)) {
831
+ continue;
832
+ }
833
+ seen.add(current);
834
+ const integrationName = current.config?.integration ?? current.config?.__eco?.integration;
835
+ if (integrationName && integrationName !== this.name) {
836
+ return true;
837
+ }
838
+ stack.push(...current.config?.dependencies?.components ?? []);
839
+ }
840
+ return false;
841
+ }
842
+ /**
843
+ * Render a single component and return structured output for orchestration paths.
844
+ *
845
+ * Default behavior delegates to `renderToResponse` in partial mode and wraps
846
+ * the resulting HTML into the `ComponentRenderResult` contract.
847
+ *
848
+ * In boundary resolution, this method is the integration-owned step that turns an
849
+ * already-resolved deferred boundary into concrete HTML, assets, and optional
850
+ * root attributes.
851
+ *
852
+ * Integrations can override this for richer behavior (asset emission,
853
+ * root attributes, integration-specific hydration metadata).
854
+ *
855
+ * @param input Component render request.
856
+ * @returns Structured render result used by component/page orchestration.
857
+ */
858
+ async renderComponent(input) {
859
+ const response = await this.renderToResponse(
860
+ input.component,
861
+ input.props,
862
+ { partial: true }
863
+ );
864
+ const html = await response.text();
865
+ return {
866
+ html,
867
+ canAttachAttributes: true,
868
+ rootTag: this.getRootTagName(html),
869
+ integrationName: this.name
870
+ };
871
+ }
872
+ /**
873
+ * Extracts the first root element tag name from HTML output.
874
+ *
875
+ * @param html HTML fragment.
876
+ * @returns Root tag name when present; otherwise `undefined`.
877
+ */
878
+ getRootTagName(html) {
879
+ const rootTag = html.match(/^(?:\s|<!--[\s\S]*?-->)*<([a-zA-Z][a-zA-Z0-9:-]*)\b/);
880
+ return rootTag?.[1];
881
+ }
882
+ /**
883
+ * Method to build route render assets.
884
+ * This method can be optionally overridden by the specific integration renderer.
885
+ *
886
+ * @param file - The file path to build assets for.
887
+ * @returns The processed assets or undefined.
888
+ */
889
+ buildRouteRenderAssets(_file) {
890
+ return void 0;
891
+ }
892
+ /**
893
+ * Creates the per-render boundary runtime adopted by the shared component
894
+ * render context.
895
+ *
896
+ * Real mixed-integration renderers should override this and keep foreign
897
+ * boundary resolution inside their own renderer-owned queue. The base runtime
898
+ * fails fast when a renderer crosses into a foreign owner without providing its
899
+ * own handoff mechanism.
900
+ */
901
+ createComponentBoundaryRuntime(_options) {
902
+ const decideBoundaryInterception = (input) => {
903
+ if (!this.shouldResolveBoundaryInOwningRenderer(input)) {
904
+ return { kind: "inline" };
905
+ }
906
+ throw new Error(
907
+ `[ecopages] ${this.name} renderer crossed into ${input.targetIntegration} without a renderer-owned boundary runtime. Override createComponentBoundaryRuntime() to resolve foreign boundaries inside the owning renderer.`
908
+ );
909
+ };
910
+ const runtime = {
911
+ interceptBoundary: decideBoundaryInterception,
912
+ interceptBoundarySync: decideBoundaryInterception
913
+ };
914
+ return runtime;
915
+ }
916
+ /**
917
+ * Resolves whether a boundary should leave the current render pass and be
918
+ * resolved by its owning renderer.
919
+ *
920
+ * Boundaries owned by the current integration always render inline. Foreign-
921
+ * owned boundaries must be handed off by a renderer-owned runtime.
922
+ *
923
+ * @param input Boundary metadata for the active render pass.
924
+ * @returns `true` when the boundary should leave the current pass; otherwise `false`.
925
+ */
926
+ shouldResolveBoundaryInOwningRenderer(input) {
927
+ return !!input.targetIntegration && input.targetIntegration !== input.currentIntegration;
928
+ }
929
+ }
930
+ export {
931
+ IntegrationRenderer
932
+ };