@ecopages/core 0.2.0-beta.3 → 0.2.0-beta.30

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 (433) hide show
  1. package/README.md +38 -9
  2. package/package.json +241 -30
  3. package/src/adapters/README.md +6 -2
  4. package/src/adapters/abstract/application-adapter.d.ts +123 -6
  5. package/src/adapters/abstract/application-adapter.js +151 -1
  6. package/src/adapters/abstract/segment-path-matcher.d.ts +6 -0
  7. package/src/adapters/abstract/segment-path-matcher.js +149 -0
  8. package/src/adapters/abstract/server-adapter.d.ts +16 -2
  9. package/src/adapters/abstract/ws-pattern-matcher.d.ts +12 -0
  10. package/src/adapters/abstract/ws-pattern-matcher.js +30 -0
  11. package/src/adapters/bun/bun-user-websocket-lifecycle.d.ts +22 -0
  12. package/src/adapters/bun/bun-user-websocket-lifecycle.js +96 -0
  13. package/src/adapters/bun/client-bridge.d.ts +1 -0
  14. package/src/adapters/bun/client-bridge.js +3 -0
  15. package/src/adapters/bun/create-app.d.ts +9 -6
  16. package/src/adapters/bun/create-app.js +76 -45
  17. package/src/adapters/bun/hmr-manager.d.ts +1 -1
  18. package/src/adapters/bun/hmr-manager.js +1 -1
  19. package/src/adapters/bun/index.d.ts +1 -1
  20. package/src/adapters/bun/index.js +25 -2
  21. package/src/adapters/bun/runtime-host.d.ts +1 -1
  22. package/src/adapters/bun/runtime-host.js +1 -1
  23. package/src/adapters/bun/server-adapter.d.ts +92 -41
  24. package/src/adapters/bun/server-adapter.js +256 -117
  25. package/src/adapters/bun/static-preview-host.d.ts +1 -1
  26. package/src/adapters/bun/static-preview-host.js +25 -20
  27. package/src/adapters/create-app.d.ts +13 -11
  28. package/src/adapters/create-app.js +2 -51
  29. package/src/adapters/index.d.ts +2 -2
  30. package/src/adapters/index.js +26 -4
  31. package/src/adapters/node/create-app.d.ts +8 -3
  32. package/src/adapters/node/create-app.js +61 -13
  33. package/src/adapters/node/node-client-bridge.d.ts +1 -0
  34. package/src/adapters/node/node-client-bridge.js +3 -0
  35. package/src/adapters/node/node-hmr-manager.d.ts +1 -1
  36. package/src/adapters/node/node-hmr-manager.js +1 -1
  37. package/src/adapters/node/runtime-host.d.ts +1 -1
  38. package/src/adapters/node/runtime-host.js +1 -1
  39. package/src/adapters/node/server-adapter-dependencies.js +4 -0
  40. package/src/adapters/node/server-adapter.d.ts +64 -23
  41. package/src/adapters/node/server-adapter.js +169 -142
  42. package/src/adapters/node/static-content-server.d.ts +1 -0
  43. package/src/adapters/node/static-content-server.js +10 -2
  44. package/src/adapters/node/static-preview-host.d.ts +1 -1
  45. package/src/adapters/node/static-preview-host.js +27 -12
  46. package/src/adapters/shared/{hmr-entrypoint-registrar.d.ts → hmr/hmr-entrypoint-registrar.d.ts} +31 -30
  47. package/src/adapters/shared/hmr/hmr-entrypoint-registrar.js +106 -0
  48. package/src/adapters/shared/{hmr-html-response.d.ts → hmr/hmr-html-response.d.ts} +2 -2
  49. package/src/adapters/shared/{hmr-html-response.js → hmr/hmr-html-response.js} +4 -1
  50. package/src/adapters/shared/hmr/shared-hmr-manager.d.ts +101 -0
  51. package/src/adapters/shared/hmr/shared-hmr-manager.js +432 -0
  52. package/src/adapters/shared/http/api-request-pipeline.d.ts +23 -0
  53. package/src/adapters/shared/http/api-request-pipeline.js +129 -0
  54. package/src/adapters/shared/{api-response.d.ts → http/api-response.d.ts} +1 -1
  55. package/src/adapters/shared/{api-response.js → http/api-response.js} +6 -23
  56. package/src/adapters/shared/http/create-body-response.d.ts +12 -0
  57. package/src/adapters/shared/http/create-body-response.js +23 -0
  58. package/src/adapters/shared/http/define-api-handler.d.ts +90 -0
  59. package/src/adapters/shared/http/define-api-handler.js +63 -0
  60. package/src/adapters/shared/{explicit-static-render-preparation.d.ts → http/explicit-static-render-preparation.d.ts} +3 -3
  61. package/src/adapters/shared/{explicit-static-route-matcher.d.ts → http/explicit-static-route-matcher.d.ts} +3 -9
  62. package/src/adapters/shared/{explicit-static-route-matcher.js → http/explicit-static-route-matcher.js} +3 -38
  63. package/src/adapters/shared/{file-route-middleware-pipeline.d.ts → http/file-route-middleware-pipeline.d.ts} +2 -2
  64. package/src/adapters/shared/{file-route-middleware-pipeline.js → http/file-route-middleware-pipeline.js} +10 -22
  65. package/src/adapters/shared/{fs-server-response-factory.d.ts → http/fs-server-response-factory.d.ts} +7 -2
  66. package/src/adapters/shared/{fs-server-response-factory.js → http/fs-server-response-factory.js} +22 -2
  67. package/src/adapters/shared/{fs-server-response-matcher.d.ts → http/fs-server-response-matcher.d.ts} +25 -5
  68. package/src/adapters/shared/{fs-server-response-matcher.js → http/fs-server-response-matcher.js} +109 -27
  69. package/src/adapters/shared/http/run-middleware-chain.d.ts +5 -0
  70. package/src/adapters/shared/http/run-middleware-chain.js +17 -0
  71. package/src/adapters/shared/{application-adapter.d.ts → runtime/application-adapter.d.ts} +2 -2
  72. package/src/adapters/shared/{application-adapter.js → runtime/application-adapter.js} +1 -1
  73. package/src/adapters/shared/runtime/copy-runtime-public-dir.d.ts +6 -0
  74. package/src/adapters/shared/runtime/copy-runtime-public-dir.js +24 -0
  75. package/src/adapters/shared/runtime/port-manager.d.ts +116 -0
  76. package/src/adapters/shared/runtime/port-manager.js +196 -0
  77. package/src/adapters/shared/{render-context.d.ts → runtime/render-context.d.ts} +2 -2
  78. package/src/adapters/shared/{render-context.js → runtime/render-context.js} +8 -17
  79. package/src/adapters/shared/{runtime-app-bootstrap.d.ts → runtime/runtime-app-bootstrap.d.ts} +4 -3
  80. package/src/adapters/shared/{runtime-app-bootstrap.js → runtime/runtime-app-bootstrap.js} +4 -7
  81. package/src/adapters/shared/runtime/runtime-server-lifecycle.d.ts +46 -0
  82. package/src/adapters/shared/runtime/runtime-server-lifecycle.js +57 -0
  83. package/src/adapters/shared/{server-adapter.d.ts → runtime/server-adapter.d.ts} +23 -49
  84. package/src/adapters/shared/runtime/server-adapter.js +226 -0
  85. package/src/adapters/shared/{server-route-handler.d.ts → runtime/server-route-handler.d.ts} +6 -33
  86. package/src/adapters/shared/{server-route-handler.js → runtime/server-route-handler.js} +5 -43
  87. package/src/adapters/shared/{server-static-builder.d.ts → runtime/server-static-builder.d.ts} +27 -35
  88. package/src/adapters/shared/runtime/server-static-builder.js +191 -0
  89. package/src/adapters/shared/{static-preview-host.d.ts → runtime/static-preview-host.d.ts} +6 -1
  90. package/src/adapters/shared/ws/node-http-websocket-upgrades.d.ts +21 -0
  91. package/src/adapters/shared/ws/node-http-websocket-upgrades.js +100 -0
  92. package/src/adapters/shared/ws/websocket-lifecycle.d.ts +24 -0
  93. package/src/adapters/shared/ws/websocket-lifecycle.js +55 -0
  94. package/src/build/README.md +140 -31
  95. package/src/build/app-build-manifest-runtime.d.ts +39 -0
  96. package/src/build/app-build-manifest-runtime.js +124 -0
  97. package/src/build/{browser-runtime-plugin.d.ts → browser/browser-runtime-plugin.d.ts} +1 -1
  98. package/src/build/{browser-runtime-plugin.js → browser/browser-runtime-plugin.js} +1 -1
  99. package/src/build/browser/jsx-ownership-plugins.d.ts +24 -0
  100. package/src/build/browser/jsx-ownership-plugins.js +41 -0
  101. package/src/build/browser/lit-static-render-worker-context.d.ts +2 -0
  102. package/src/build/browser/lit-static-render-worker-context.js +6 -0
  103. package/src/build/build-adapter.d.ts +29 -334
  104. package/src/build/build-adapter.js +32 -133
  105. package/src/build/cache/build-input-fingerprint.d.ts +28 -0
  106. package/src/build/cache/build-input-fingerprint.js +31 -0
  107. package/src/build/cache/cache-constants.d.ts +4 -0
  108. package/src/build/cache/cache-constants.js +6 -0
  109. package/src/build/cache/cache-keys.d.ts +22 -0
  110. package/src/build/cache/cache-keys.js +63 -0
  111. package/src/build/cache/dev-browser-script-cache.d.ts +34 -0
  112. package/src/build/cache/dev-browser-script-cache.js +90 -0
  113. package/src/build/cache/pages-unified-graph-build.d.ts +31 -0
  114. package/src/build/cache/pages-unified-graph-build.js +198 -0
  115. package/src/build/cache/production-build-cache.d.ts +20 -0
  116. package/src/build/cache/production-build-cache.js +63 -0
  117. package/src/build/cache/server-entry-build-cache.d.ts +43 -0
  118. package/src/build/cache/server-entry-build-cache.js +165 -0
  119. package/src/build/contracts/build-contracts.d.ts +96 -0
  120. package/src/build/contracts/build-manifest.d.ts +90 -0
  121. package/src/build/{build-manifest.js → contracts/build-manifest.js} +2 -2
  122. package/src/build/contracts/build-types.js +0 -0
  123. package/src/build/{rolldown-adapter-helpers.d.ts → rolldown/rolldown-adapter-helpers.d.ts} +23 -9
  124. package/src/build/{rolldown-adapter-helpers.js → rolldown/rolldown-adapter-helpers.js} +99 -13
  125. package/src/build/{rolldown-build-adapter.d.ts → rolldown/rolldown-build-adapter.d.ts} +3 -7
  126. package/src/build/{rolldown-build-adapter.js → rolldown/rolldown-build-adapter.js} +3 -3
  127. package/src/build/rolldown/rolldown-build-invocation-metrics.d.ts +12 -0
  128. package/src/build/rolldown/rolldown-build-invocation-metrics.js +43 -0
  129. package/src/build/{rolldown-plugin-bridge.d.ts → rolldown/rolldown-plugin-bridge.d.ts} +16 -2
  130. package/src/build/{rolldown-plugin-bridge.js → rolldown/rolldown-plugin-bridge.js} +21 -6
  131. package/src/build/rolldown/rolldown-source-transform-pass.d.ts +15 -0
  132. package/src/build/rolldown/rolldown-source-transform-pass.js +61 -0
  133. package/src/build/rolldown/runtime-build-output-normalizer.d.ts +10 -0
  134. package/src/build/rolldown/runtime-build-output-normalizer.js +201 -0
  135. package/src/build/runtime/build-profile-options.d.ts +7 -0
  136. package/src/build/runtime/build-profile-options.js +37 -0
  137. package/src/build/runtime/build-request-identity.d.ts +17 -0
  138. package/src/build/runtime/build-request-identity.js +54 -0
  139. package/src/build/runtime/build-request-policy.d.ts +59 -0
  140. package/src/build/runtime/build-request-policy.js +46 -0
  141. package/src/build/runtime/build-runtime.d.ts +28 -0
  142. package/src/build/runtime/build-runtime.js +65 -0
  143. package/src/build/runtime/deduping-build-executor.d.ts +21 -0
  144. package/src/build/runtime/deduping-build-executor.js +34 -0
  145. package/src/build/runtime/parallel-build-executor.d.ts +21 -0
  146. package/src/build/runtime/parallel-build-executor.js +52 -0
  147. package/src/build/{serialized-build-executor.d.ts → runtime/serialized-build-executor.d.ts} +1 -1
  148. package/src/client/navigation-scripts/classification.d.ts +16 -0
  149. package/src/client/navigation-scripts/classification.js +41 -0
  150. package/src/client/navigation-scripts/index.d.ts +3 -0
  151. package/src/client/navigation-scripts/index.js +23 -0
  152. package/src/client/navigation-scripts/navigation-scripts.test.browser.js +65 -0
  153. package/src/client/navigation-scripts/registry.d.ts +11 -0
  154. package/src/client/navigation-scripts/registry.js +12 -0
  155. package/src/client/navigation-scripts/rerun-queue.d.ts +37 -0
  156. package/src/client/navigation-scripts/rerun-queue.js +73 -0
  157. package/src/client/scroll.d.ts +17 -0
  158. package/src/client/scroll.js +25 -0
  159. package/src/client/scroll.test.browser.js +37 -0
  160. package/src/client/view-transitions.d.ts +16 -0
  161. package/src/client/view-transitions.js +63 -0
  162. package/src/config/config-builder.d.ts +25 -10
  163. package/src/config/config-builder.js +53 -11
  164. package/src/config/constants.d.ts +1 -0
  165. package/src/config/constants.js +2 -1
  166. package/src/dev/client-bridge-registry.d.ts +5 -0
  167. package/src/dev/client-bridge-registry.js +15 -0
  168. package/src/dev/dev-client-ownership.d.ts +7 -0
  169. package/src/dev/dev-client-ownership.js +6 -0
  170. package/src/dev/hmr-manager-registry.d.ts +8 -0
  171. package/src/dev/hmr-manager-registry.js +15 -0
  172. package/src/dev/host-runtime.d.ts +3 -0
  173. package/src/dev/host-runtime.js +7 -0
  174. package/src/dev/runtime-server-started-message.d.ts +2 -0
  175. package/src/dev/runtime-server-started-message.js +6 -0
  176. package/src/diagnostics/request-build-dedupe.d.ts +18 -0
  177. package/src/diagnostics/request-build-dedupe.js +33 -0
  178. package/src/diagnostics/startup-trace.d.ts +72 -0
  179. package/src/diagnostics/startup-trace.js +253 -0
  180. package/src/eco/README.md +11 -0
  181. package/src/eco/eco-declared-component.d.ts +14 -0
  182. package/src/eco/eco-declared-component.js +16 -0
  183. package/src/eco/eco.browser.js +5 -6
  184. package/src/eco/eco.js +7 -8
  185. package/src/eco/eco.types.d.ts +14 -3
  186. package/src/eco/eco.utils.d.ts +1 -1
  187. package/src/eco/eco.utils.js +1 -1
  188. package/src/eco/page-layout-normalization.d.ts +21 -0
  189. package/src/eco/page-layout-normalization.js +59 -0
  190. package/src/env.d.ts +2 -0
  191. package/src/errors/index.d.ts +1 -0
  192. package/src/errors/index.js +7 -1
  193. package/src/errors/undeclared-component-dependency-error.d.ts +11 -0
  194. package/src/errors/undeclared-component-dependency-error.js +17 -0
  195. package/src/hmr/client/hmr-runtime.js +7 -4
  196. package/src/hmr/hmr-entrypoint-output.d.ts +49 -0
  197. package/src/hmr/hmr-entrypoint-output.js +60 -0
  198. package/src/hmr/hmr-file-change-prep.d.ts +10 -0
  199. package/src/hmr/hmr-file-change-prep.js +17 -0
  200. package/src/hmr/hmr-strategy.d.ts +15 -0
  201. package/src/hmr/hmr-strategy.js +19 -0
  202. package/src/hmr/strategies/js-hmr-strategy.d.ts +3 -5
  203. package/src/hmr/strategies/js-hmr-strategy.js +72 -19
  204. package/src/hmr/strategies/server-rendered-template-hmr-strategy.d.ts +17 -0
  205. package/src/hmr/strategies/server-rendered-template-hmr-strategy.js +29 -0
  206. package/src/index.d.ts +2 -1
  207. package/src/index.js +28 -2
  208. package/src/integrations/ghtml/ghtml-renderer.d.ts +2 -6
  209. package/src/integrations/ghtml/ghtml-renderer.js +2 -51
  210. package/src/integrations/ghtml/ghtml.plugin.d.ts +3 -16
  211. package/src/integrations/ghtml/ghtml.plugin.js +7 -14
  212. package/src/plugins/alias-resolver-cache.d.ts +6 -9
  213. package/src/plugins/alias-resolver-plugin.d.ts +3 -3
  214. package/src/plugins/alias-resolver-plugin.js +38 -51
  215. package/src/plugins/define-integration.d.ts +26 -0
  216. package/src/plugins/define-integration.js +19 -0
  217. package/src/plugins/eco-component-meta-plugin.d.ts +1 -1
  218. package/src/plugins/eco-component-meta-plugin.js +5 -8
  219. package/src/plugins/foreign-jsx-override-plugin.d.ts +1 -1
  220. package/src/plugins/foreign-jsx-override-plugin.js +4 -6
  221. package/src/plugins/integration-plugin.d.ts +43 -14
  222. package/src/plugins/integration-plugin.js +18 -5
  223. package/src/plugins/jsx-import-source.utils.d.ts +8 -0
  224. package/src/plugins/jsx-import-source.utils.js +26 -0
  225. package/src/plugins/processor.d.ts +61 -12
  226. package/src/plugins/processor.js +24 -5
  227. package/src/plugins/source-transform.d.ts +32 -1
  228. package/src/plugins/source-transform.js +23 -1
  229. package/src/plugins/tsconfig-import-resolver.d.ts +18 -0
  230. package/src/plugins/tsconfig-import-resolver.js +159 -0
  231. package/src/route-renderer/GRAPH.md +26 -32
  232. package/src/route-renderer/README.md +38 -31
  233. package/src/route-renderer/orchestration/document-shell/document-shell-render.service.d.ts +107 -0
  234. package/src/route-renderer/orchestration/document-shell/document-shell-render.service.js +148 -0
  235. package/src/route-renderer/orchestration/document-shell/layout-shell-props.service.d.ts +20 -0
  236. package/src/route-renderer/orchestration/document-shell/layout-shell-props.service.js +31 -0
  237. package/src/route-renderer/orchestration/{component-render-context.d.ts → foreign-child/component-render-context.d.ts} +8 -15
  238. package/src/route-renderer/orchestration/{component-render-context.js → foreign-child/component-render-context.js} +4 -2
  239. package/src/route-renderer/orchestration/{render-output.utils.d.ts → foreign-child/foreign-child-output.utils.d.ts} +17 -7
  240. package/src/route-renderer/orchestration/{render-output.utils.js → foreign-child/foreign-child-output.utils.js} +35 -26
  241. package/src/route-renderer/orchestration/{foreign-subtree-execution.service.d.ts → foreign-child/foreign-subtree-execution.service.d.ts} +64 -34
  242. package/src/route-renderer/orchestration/{foreign-subtree-execution.service.js → foreign-child/foreign-subtree-execution.service.js} +170 -37
  243. package/src/route-renderer/orchestration/foreign-child/owning-renderer-resolution.d.ts +19 -0
  244. package/src/route-renderer/orchestration/foreign-child/owning-renderer-resolution.js +35 -0
  245. package/src/route-renderer/orchestration/integration-renderer.d.ts +24 -143
  246. package/src/route-renderer/orchestration/integration-renderer.js +163 -402
  247. package/src/route-renderer/orchestration/integration-renderer.test-fixtures.d.ts +75 -0
  248. package/src/route-renderer/orchestration/integration-renderer.test-fixtures.js +177 -0
  249. package/src/route-renderer/orchestration/ownership-graph/component-graph-collectors.d.ts +10 -0
  250. package/src/route-renderer/orchestration/ownership-graph/component-graph-collectors.js +143 -0
  251. package/src/route-renderer/orchestration/ownership-graph/component-graph.d.ts +34 -0
  252. package/src/route-renderer/orchestration/ownership-graph/component-graph.js +96 -0
  253. package/src/route-renderer/orchestration/{ownership-validation.service.d.ts → ownership-graph/ownership-validation.service.d.ts} +7 -2
  254. package/src/route-renderer/orchestration/{ownership-validation.service.js → ownership-graph/ownership-validation.service.js} +30 -3
  255. package/src/route-renderer/orchestration/page-browser-graph/global-injector-assets.service.d.ts +7 -0
  256. package/src/route-renderer/orchestration/page-browser-graph/global-injector-assets.service.js +32 -0
  257. package/src/route-renderer/orchestration/page-browser-graph/page-browser-graph-contribution.loader.d.ts +9 -0
  258. package/src/route-renderer/orchestration/page-browser-graph/page-browser-graph-contribution.loader.js +7 -0
  259. package/src/route-renderer/orchestration/page-browser-graph/page-browser-graph-merge.utils.d.ts +12 -0
  260. package/src/route-renderer/orchestration/page-browser-graph/page-browser-graph-merge.utils.js +29 -0
  261. package/src/route-renderer/orchestration/page-browser-graph/page-browser-graph-session.d.ts +106 -0
  262. package/src/route-renderer/orchestration/page-browser-graph/page-browser-graph-session.js +436 -0
  263. package/src/route-renderer/orchestration/page-browser-graph/page-browser-graph.service.d.ts +31 -0
  264. package/src/route-renderer/orchestration/page-browser-graph/page-browser-graph.service.js +229 -0
  265. package/src/route-renderer/orchestration/{processed-asset-dedupe.d.ts → page-browser-graph/processed-asset-dedupe.d.ts} +1 -1
  266. package/src/route-renderer/orchestration/route-pipeline/integration-route-render-adapter.d.ts +31 -0
  267. package/src/route-renderer/orchestration/route-pipeline/integration-route-render-adapter.js +25 -0
  268. package/src/route-renderer/orchestration/route-pipeline/marker-artifact.utils.d.ts +6 -0
  269. package/src/route-renderer/orchestration/route-pipeline/marker-artifact.utils.js +27 -0
  270. package/src/route-renderer/orchestration/route-pipeline/robots-meta.contribution.d.ts +15 -0
  271. package/src/route-renderer/orchestration/route-pipeline/robots-meta.contribution.js +36 -0
  272. package/src/route-renderer/orchestration/route-pipeline/route-html-finalization.service.d.ts +20 -0
  273. package/src/route-renderer/orchestration/route-pipeline/route-html-finalization.service.js +24 -0
  274. package/src/route-renderer/orchestration/route-pipeline/route-prepared-options.builder.d.ts +25 -0
  275. package/src/route-renderer/orchestration/route-pipeline/route-prepared-options.builder.js +49 -0
  276. package/src/route-renderer/orchestration/route-pipeline/route-prepared-options.utils.d.ts +4 -0
  277. package/src/route-renderer/orchestration/route-pipeline/route-prepared-options.utils.js +33 -0
  278. package/src/route-renderer/orchestration/{route-render-orchestrator.d.ts → route-pipeline/route-render-orchestrator.d.ts} +13 -53
  279. package/src/route-renderer/orchestration/route-pipeline/route-render-orchestrator.js +162 -0
  280. package/src/route-renderer/orchestration/string-markup-renderer.d.ts +14 -0
  281. package/src/route-renderer/orchestration/string-markup-renderer.js +55 -0
  282. package/src/route-renderer/page-loading/component-dependency-collection.js +5 -2
  283. package/src/route-renderer/page-loading/ecopages-virtual-imports.d.ts +6 -0
  284. package/src/route-renderer/page-loading/ecopages-virtual-imports.js +7 -2
  285. package/src/route-renderer/page-loading/module-declaration-aggregation.js +4 -0
  286. package/src/router/client/link-intent.d.ts +11 -21
  287. package/src/router/client/link-intent.js +10 -0
  288. package/src/router/client/link-intent.test.browser.js +12 -1
  289. package/src/router/client/link-navigation-policy.d.ts +45 -0
  290. package/src/router/client/link-navigation-policy.js +101 -0
  291. package/src/router/client/link-navigation-policy.test.browser.d.ts +1 -0
  292. package/src/router/client/link-navigation-policy.test.browser.js +92 -0
  293. package/src/router/client/navigation-coordinator.d.ts +1 -1
  294. package/src/router/client/navigation-coordinator.js +12 -2
  295. package/src/services/assets/asset-processing-service/asset-dependency-keys.d.ts +13 -0
  296. package/src/services/assets/asset-processing-service/asset-dependency-keys.js +3 -0
  297. package/src/services/assets/asset-processing-service/asset-processing.service.d.ts +6 -1
  298. package/src/services/assets/asset-processing-service/asset-processing.service.js +44 -5
  299. package/src/services/assets/asset-processing-service/assets.types.d.ts +1 -1
  300. package/src/services/assets/asset-processing-service/browser-runtime-asset.factory.d.ts +2 -1
  301. package/src/services/assets/asset-processing-service/browser-runtime-asset.factory.js +1 -0
  302. package/src/services/assets/asset-processing-service/browser-runtime-entry-resolution.d.ts +52 -0
  303. package/src/services/assets/asset-processing-service/browser-runtime-entry-resolution.js +78 -0
  304. package/src/services/assets/asset-processing-service/browser-runtime-entry.factory.d.ts +4 -2
  305. package/src/services/assets/asset-processing-service/browser-runtime-entry.factory.js +28 -13
  306. package/src/services/assets/asset-processing-service/finalize-processed-asset.d.ts +3 -0
  307. package/src/services/assets/asset-processing-service/finalize-processed-asset.js +7 -0
  308. package/src/services/assets/asset-processing-service/grouped-content-bundles.d.ts +2 -1
  309. package/src/services/assets/asset-processing-service/grouped-content-bundles.js +38 -12
  310. package/src/services/assets/asset-processing-service/index.d.ts +2 -0
  311. package/src/services/assets/asset-processing-service/index.js +2 -0
  312. package/src/services/assets/asset-processing-service/inline-content-script-body.d.ts +11 -0
  313. package/src/services/assets/asset-processing-service/inline-content-script-body.js +17 -0
  314. package/src/services/assets/asset-processing-service/materialize-content-script-asset.d.ts +9 -0
  315. package/src/services/assets/asset-processing-service/materialize-content-script-asset.js +18 -0
  316. package/src/services/assets/asset-processing-service/processors/base/base-script-processor.d.ts +0 -2
  317. package/src/services/assets/asset-processing-service/processors/base/base-script-processor.js +2 -15
  318. package/src/services/assets/asset-processing-service/processors/script/content-script.processor.d.ts +8 -0
  319. package/src/services/assets/asset-processing-service/processors/script/content-script.processor.js +73 -68
  320. package/src/services/assets/asset-processing-service/processors/script/file-script.processor.d.ts +0 -1
  321. package/src/services/assets/asset-processing-service/processors/script/file-script.processor.js +18 -15
  322. package/src/services/assets/asset-processing-service/processors/script/node-module-script.processor.js +17 -3
  323. package/src/services/assets/asset-processing-service/processors/stylesheet/content-stylesheet.processor.d.ts +0 -3
  324. package/src/services/assets/asset-processing-service/processors/stylesheet/content-stylesheet.processor.js +2 -31
  325. package/src/services/assets/asset-processing-service/processors/stylesheet/file-stylesheet.processor.d.ts +0 -3
  326. package/src/services/assets/asset-processing-service/processors/stylesheet/file-stylesheet.processor.js +2 -30
  327. package/src/services/assets/asset-processing-service/processors/stylesheet/stylesheet-processor-pipeline.d.ts +2 -0
  328. package/src/services/assets/asset-processing-service/processors/stylesheet/stylesheet-processor-pipeline.js +43 -0
  329. package/src/services/assets/asset-processing-service/resolve-integration-plugin.d.ts +4 -0
  330. package/src/services/assets/asset-processing-service/resolve-integration-plugin.js +17 -0
  331. package/src/services/assets/asset-processing-service/ungrouped-dependency-processing.d.ts +0 -1
  332. package/src/services/assets/asset-processing-service/ungrouped-dependency-processing.js +5 -10
  333. package/src/services/assets/browser-bundle.service.d.ts +28 -30
  334. package/src/services/assets/browser-bundle.service.js +28 -19
  335. package/src/services/html/html-transformer.service.d.ts +1 -1
  336. package/src/services/html/html-transformer.service.js +5 -5
  337. package/src/services/invalidation/development-invalidation.service.d.ts +25 -2
  338. package/src/services/invalidation/development-invalidation.service.js +64 -11
  339. package/src/services/module-loading/README.md +49 -0
  340. package/src/services/module-loading/app-server-module-transpiler.service.d.ts +8 -0
  341. package/src/services/module-loading/app-server-module-transpiler.service.js +3 -21
  342. package/src/services/module-loading/page-module-import.service.d.ts +6 -2
  343. package/src/services/module-loading/page-module-import.service.js +110 -47
  344. package/src/services/module-loading/route-module-build-cache-registry.d.ts +24 -0
  345. package/src/services/module-loading/route-module-build-cache-registry.js +37 -0
  346. package/src/services/module-loading/route-module-build-cache.d.ts +4 -0
  347. package/src/services/module-loading/route-module-build-cache.js +38 -0
  348. package/src/services/module-loading/route-module-build-cache.store.d.ts +57 -0
  349. package/src/services/module-loading/route-module-build-cache.store.js +207 -0
  350. package/src/services/module-loading/route-module-build-manifest.d.ts +54 -0
  351. package/src/services/module-loading/route-module-build-manifest.js +85 -0
  352. package/src/services/module-loading/route-module-dependency-hasher.d.ts +81 -0
  353. package/src/services/module-loading/route-module-dependency-hasher.js +122 -0
  354. package/src/services/module-loading/server-module-transpiler.service.d.ts +1 -1
  355. package/src/services/module-loading/server-module-transpiler.service.js +1 -1
  356. package/src/services/validation/schema-validation-service.d.ts +1 -4
  357. package/src/services/validation/schema-validation-service.js +12 -13
  358. package/src/services/validation/standard-schema.types.d.ts +9 -62
  359. package/src/services/validation/validate-standard-schema.d.ts +7 -0
  360. package/src/services/validation/validate-standard-schema.js +14 -0
  361. package/src/static-site-generator/README.md +41 -0
  362. package/src/static-site-generator/production-page-browser-graph-prebuild.d.ts +28 -0
  363. package/src/static-site-generator/production-page-browser-graph-prebuild.js +22 -0
  364. package/src/static-site-generator/sitemap-routes.d.ts +14 -0
  365. package/src/static-site-generator/sitemap-routes.js +31 -0
  366. package/src/static-site-generator/sitemap.d.ts +15 -0
  367. package/src/static-site-generator/sitemap.js +33 -0
  368. package/src/static-site-generator/static-build-invalidation.d.ts +10 -0
  369. package/src/static-site-generator/static-build-invalidation.js +59 -0
  370. package/src/static-site-generator/static-export-context.d.ts +30 -0
  371. package/src/static-site-generator/static-export-context.js +0 -0
  372. package/src/static-site-generator/static-site-generator.d.ts +43 -25
  373. package/src/static-site-generator/static-site-generator.js +381 -106
  374. package/src/types/internal-types.d.ts +39 -13
  375. package/src/types/public-types.d.ts +289 -52
  376. package/src/utils/ecopages-route-info.d.ts +26 -0
  377. package/src/utils/ecopages-route-info.js +26 -0
  378. package/src/utils/html-escaping.d.ts +7 -0
  379. package/src/utils/html-escaping.js +5 -1
  380. package/src/utils/parse-cli-args.d.ts +2 -0
  381. package/src/utils/parse-cli-args.js +6 -0
  382. package/src/utils/path-pattern.d.ts +23 -0
  383. package/src/utils/path-pattern.js +27 -0
  384. package/src/utils/server-utils.module.d.ts +3 -2
  385. package/src/utils/server-utils.module.js +5 -6
  386. package/src/utils/static-file-extensions.d.ts +12 -0
  387. package/src/utils/static-file-extensions.js +48 -0
  388. package/src/watchers/project-watcher-ignore.d.ts +11 -0
  389. package/src/watchers/project-watcher-ignore.js +16 -0
  390. package/src/watchers/project-watcher.d.ts +29 -6
  391. package/src/watchers/project-watcher.js +146 -34
  392. package/src/watchers/project-watcher.test-helpers.js +5 -5
  393. package/src/adapters/shared/define-api-handler.d.ts +0 -25
  394. package/src/adapters/shared/define-api-handler.js +0 -15
  395. package/src/adapters/shared/hmr-entrypoint-registrar.js +0 -87
  396. package/src/adapters/shared/server-adapter.js +0 -436
  397. package/src/adapters/shared/server-static-builder.js +0 -162
  398. package/src/adapters/shared/shared-hmr-manager.d.ts +0 -59
  399. package/src/adapters/shared/shared-hmr-manager.js +0 -241
  400. package/src/build/build-manifest.d.ts +0 -33
  401. package/src/build/rolldown-dev-build-adapter.d.ts +0 -82
  402. package/src/build/rolldown-dev-build-adapter.js +0 -166
  403. package/src/build/runtime-build-executor.d.ts +0 -21
  404. package/src/build/runtime-build-executor.js +0 -19
  405. package/src/build/runtime-build-output-normalizer.d.ts +0 -3
  406. package/src/build/runtime-build-output-normalizer.js +0 -111
  407. package/src/hmr/hmr.postcss.test.e2e.js +0 -31
  408. package/src/hmr/hmr.test.e2e.js +0 -43
  409. package/src/route-renderer/orchestration/declared-ownership-graph.d.ts +0 -18
  410. package/src/route-renderer/orchestration/declared-ownership-graph.js +0 -34
  411. package/src/route-renderer/orchestration/ownership-planning.service.d.ts +0 -24
  412. package/src/route-renderer/orchestration/ownership-planning.service.js +0 -63
  413. package/src/route-renderer/orchestration/queued-foreign-subtree-resolution.service.d.ts +0 -91
  414. package/src/route-renderer/orchestration/queued-foreign-subtree-resolution.service.js +0 -170
  415. package/src/route-renderer/orchestration/route-render-orchestrator.js +0 -577
  416. package/src/route-renderer/orchestration/template-serialization.d.ts +0 -38
  417. package/src/route-renderer/orchestration/template-serialization.js +0 -45
  418. /package/src/adapters/shared/{explicit-static-render-preparation.js → http/explicit-static-render-preparation.js} +0 -0
  419. /package/src/adapters/shared/{runtime-host.d.ts → runtime/runtime-host.d.ts} +0 -0
  420. /package/src/adapters/shared/{runtime-host.js → runtime/runtime-host.js} +0 -0
  421. /package/src/adapters/shared/{static-preview-host.js → runtime/static-preview-host.js} +0 -0
  422. /package/src/build/{browser-runtime-manifest.d.ts → browser/browser-runtime-manifest.d.ts} +0 -0
  423. /package/src/build/{browser-runtime-manifest.js → browser/browser-runtime-manifest.js} +0 -0
  424. /package/src/build/{browser-runtime-plugin-helpers.d.ts → browser/browser-runtime-plugin-helpers.d.ts} +0 -0
  425. /package/src/build/{browser-runtime-plugin-helpers.js → browser/browser-runtime-plugin-helpers.js} +0 -0
  426. /package/src/build/{build-types.js → contracts/build-contracts.js} +0 -0
  427. /package/src/build/{build-types.d.ts → contracts/build-types.d.ts} +0 -0
  428. /package/src/build/{server-side-css-shim-plugin.d.ts → rolldown/server-side-css-shim-plugin.d.ts} +0 -0
  429. /package/src/build/{server-side-css-shim-plugin.js → rolldown/server-side-css-shim-plugin.js} +0 -0
  430. /package/src/build/{serialized-build-executor.js → runtime/serialized-build-executor.js} +0 -0
  431. /package/src/{hmr/hmr.postcss.test.e2e.d.ts → client/navigation-scripts/navigation-scripts.test.browser.d.ts} +0 -0
  432. /package/src/{hmr/hmr.test.e2e.d.ts → client/scroll.test.browser.d.ts} +0 -0
  433. /package/src/route-renderer/orchestration/{processed-asset-dedupe.js → page-browser-graph/processed-asset-dedupe.js} +0 -0
@@ -2,17 +2,18 @@ import {
2
2
  getComponentRenderContext,
3
3
  runWithComponentRenderContext
4
4
  } from "./component-render-context.js";
5
- import {
6
- QueuedForeignSubtreeResolutionService
7
- } from "./queued-foreign-subtree-resolution.service.js";
8
- function isMarkupNodeLike(value) {
9
- return typeof value === "object" && value !== null && "nodeType" in value && typeof value.nodeType === "number" && (!("outerHTML" in value) || typeof value.outerHTML === "string");
5
+ import { assertForeignChildrenNotOpaque, isMarkupNodeLike } from "./foreign-child-output.utils.js";
6
+ function toForeignSubtreeRenderPayload(result) {
7
+ return {
8
+ html: result.html,
9
+ assets: result.assets ?? [],
10
+ rootTag: result.rootTag,
11
+ rootAttributes: result.rootAttributes,
12
+ attachmentPolicy: result.canAttachAttributes ? { kind: "first-element" } : { kind: "none" },
13
+ integrationName: result.integrationName
14
+ };
10
15
  }
11
16
  class ForeignSubtreeExecutionService {
12
- queuedForeignSubtreeResolutionService;
13
- constructor(queuedForeignSubtreeResolutionService = new QueuedForeignSubtreeResolutionService()) {
14
- this.queuedForeignSubtreeResolutionService = queuedForeignSubtreeResolutionService;
15
- }
16
17
  requiresForeignChildRuntime(input) {
17
18
  const children = input.children ?? input.props.children;
18
19
  if (children === void 0 || children === null) {
@@ -26,18 +27,9 @@ class ForeignSubtreeExecutionService {
26
27
  }
27
28
  return !isMarkupNodeLike(children);
28
29
  }
29
- /**
30
- * Returns whether the current render pass must hand the child off to a foreign owner.
31
- */
32
30
  shouldDelegateForeignChild(input) {
33
31
  return !!input.targetIntegration && input.targetIntegration !== input.currentIntegration;
34
32
  }
35
- /**
36
- * Creates the base runtime used when a renderer has not supplied its own queueing runtime.
37
- *
38
- * The runtime allows same-integration children to continue inline and fails fast
39
- * when execution crosses into a foreign owner without a renderer-owned handoff.
40
- */
41
33
  createFailFastRuntime(rendererName) {
42
34
  const interceptForeignChild = (input) => {
43
35
  if (!this.shouldDelegateForeignChild(input)) {
@@ -56,10 +48,10 @@ class ForeignSubtreeExecutionService {
56
48
  };
57
49
  }
58
50
  getQueuedRuntimeContext(input, runtimeContextKey) {
59
- return this.queuedForeignSubtreeResolutionService.getRuntimeContext(input, runtimeContextKey);
51
+ return this.getRuntimeContext(input, runtimeContextKey);
60
52
  }
61
53
  createQueuedRuntime(options) {
62
- return this.queuedForeignSubtreeResolutionService.createRuntime({
54
+ return this.createQueueRuntime({
63
55
  renderInput: options.renderInput,
64
56
  rendererCache: options.rendererCache,
65
57
  runtimeContextKey: options.runtimeContextKey,
@@ -68,9 +60,45 @@ class ForeignSubtreeExecutionService {
68
60
  createRuntimeContext: options.createRuntimeContext
69
61
  });
70
62
  }
71
- /**
72
- * Resolves a string-first renderer HTML fragment that may contain queued Foreign Subtree tokens.
73
- */
63
+ createQueueRuntime(options) {
64
+ const runtimeContext = this.ensureRuntimeContext(options);
65
+ const interceptForeignChild = (input) => {
66
+ if (!options.shouldQueueForeignChild(input)) {
67
+ return {
68
+ kind: "inline",
69
+ props: { ...input.props }
70
+ };
71
+ }
72
+ if ("children" in input.props) {
73
+ assertForeignChildrenNotOpaque(input.props.children, "foreign-subtree queue");
74
+ }
75
+ runtimeContext.nextForeignSubtreeId += 1;
76
+ const foreignSubtreeId = runtimeContext.nextForeignSubtreeId;
77
+ const token = this.createForeignSubtreeToken(options.tokenPrefix, runtimeContext, foreignSubtreeId);
78
+ runtimeContext.queuedResolutions.push({
79
+ token,
80
+ component: input.component,
81
+ props: { ...input.props },
82
+ componentInstanceId: runtimeContext.componentInstanceScope ? `${runtimeContext.componentInstanceScope}_n_${foreignSubtreeId}` : `n_${foreignSubtreeId}`
83
+ });
84
+ return {
85
+ kind: "resolved",
86
+ value: token
87
+ };
88
+ };
89
+ return {
90
+ interceptForeignChild,
91
+ interceptForeignChildSync: interceptForeignChild
92
+ };
93
+ }
94
+ getRuntimeContext(input, runtimeContextKey) {
95
+ const integrationContext = input.integrationContext;
96
+ const runtimeContext = integrationContext?.[runtimeContextKey];
97
+ if (typeof runtimeContext !== "object" || runtimeContext === null) {
98
+ return void 0;
99
+ }
100
+ return runtimeContext;
101
+ }
74
102
  async resolveStringQueuedHtml(options) {
75
103
  const runtimeContext = this.getQueuedRuntimeContext(options.renderInput, options.runtimeContextKey);
76
104
  return this.resolveQueuedHtml({
@@ -83,10 +111,11 @@ class ForeignSubtreeExecutionService {
83
111
  return { assets: [], html: void 0 };
84
112
  }
85
113
  if (typeof children !== "string" && !isMarkupNodeLike(children)) {
114
+ assertForeignChildrenNotOpaque(children, options.queueLabel);
86
115
  return { assets: [], children };
87
116
  }
88
117
  const html = await this.resolveQueuedTokens(
89
- typeof children === "string" ? children : children.outerHTML ?? String(children ?? ""),
118
+ typeof children === "string" ? children : children.outerHTML ?? "",
90
119
  queuedResolutionsByToken,
91
120
  resolveToken
92
121
  );
@@ -98,7 +127,7 @@ class ForeignSubtreeExecutionService {
98
127
  });
99
128
  }
100
129
  async resolveQueuedHtml(options) {
101
- return this.queuedForeignSubtreeResolutionService.resolveQueuedHtml({
130
+ return this.resolveQueuedForeignSubtreeTokens({
102
131
  html: options.html,
103
132
  runtimeContext: options.runtimeContext,
104
133
  queueLabel: options.queueLabel,
@@ -113,9 +142,93 @@ class ForeignSubtreeExecutionService {
113
142
  dedupeProcessedAssets: options.dedupeProcessedAssets
114
143
  });
115
144
  }
116
- /**
117
- * Executes one component render with Foreign Child support under the current integration.
118
- */
145
+ async resolveQueuedForeignSubtreeTokens(options) {
146
+ if (!options.runtimeContext || options.runtimeContext.queuedResolutions.length === 0) {
147
+ return { assets: [], html: options.html };
148
+ }
149
+ const runtimeContext = options.runtimeContext;
150
+ const queuedResolutionsByToken = /* @__PURE__ */ new Map();
151
+ const resolvedHtmlByToken = /* @__PURE__ */ new Map();
152
+ const resolvingTokens = /* @__PURE__ */ new Set();
153
+ const collectedAssets = [];
154
+ const syncQueuedResolutions = () => {
155
+ for (const resolution of runtimeContext.queuedResolutions) {
156
+ if (!queuedResolutionsByToken.has(resolution.token)) {
157
+ queuedResolutionsByToken.set(resolution.token, resolution);
158
+ }
159
+ }
160
+ };
161
+ const resolveToken = async (token) => {
162
+ syncQueuedResolutions();
163
+ const cachedHtml = resolvedHtmlByToken.get(token);
164
+ if (cachedHtml) {
165
+ return cachedHtml;
166
+ }
167
+ const resolution = queuedResolutionsByToken.get(token);
168
+ if (!resolution) {
169
+ return token;
170
+ }
171
+ if (resolvingTokens.has(token)) {
172
+ throw new Error(
173
+ `[ecopages] ${options.queueLabel} foreign-subtree queue contains a cycle or unresolved dependency links.`
174
+ );
175
+ }
176
+ resolvingTokens.add(token);
177
+ try {
178
+ const renderedChildren = await options.renderQueuedChildren(
179
+ resolution.props.children,
180
+ runtimeContext,
181
+ queuedResolutionsByToken,
182
+ resolveToken
183
+ );
184
+ syncQueuedResolutions();
185
+ if (renderedChildren.assets.length > 0) {
186
+ collectedAssets.push(...renderedChildren.assets);
187
+ }
188
+ const foreignSubtreeRender = await options.resolveForeignSubtree(
189
+ {
190
+ component: resolution.component,
191
+ props: { ...resolution.props },
192
+ children: renderedChildren.html ?? renderedChildren.children,
193
+ integrationContext: {
194
+ rendererCache: runtimeContext.rendererCache,
195
+ componentInstanceId: resolution.componentInstanceId
196
+ }
197
+ },
198
+ runtimeContext.rendererCache
199
+ );
200
+ if (!foreignSubtreeRender) {
201
+ throw new Error(
202
+ `[ecopages] ${options.queueLabel} queued foreign subtree could not resolve its owning renderer.`
203
+ );
204
+ }
205
+ if ((foreignSubtreeRender.assets?.length ?? 0) > 0) {
206
+ collectedAssets.push(...foreignSubtreeRender.assets ?? []);
207
+ }
208
+ const resolvedHtml2 = foreignSubtreeRender.attachmentPolicy.kind === "first-element" && foreignSubtreeRender.rootAttributes ? options.applyAttributesToFirstElement(
209
+ foreignSubtreeRender.html,
210
+ foreignSubtreeRender.rootAttributes
211
+ ) : foreignSubtreeRender.html;
212
+ resolvedHtmlByToken.set(token, resolvedHtml2);
213
+ return resolvedHtml2;
214
+ } finally {
215
+ resolvingTokens.delete(token);
216
+ }
217
+ };
218
+ let resolvedHtml = options.html;
219
+ for (let index = 0; index < runtimeContext.queuedResolutions.length; index += 1) {
220
+ syncQueuedResolutions();
221
+ const resolution = runtimeContext.queuedResolutions[index];
222
+ if (!resolvedHtml.includes(resolution.token)) {
223
+ continue;
224
+ }
225
+ resolvedHtml = resolvedHtml.split(resolution.token).join(await resolveToken(resolution.token));
226
+ }
227
+ return {
228
+ assets: options.dedupeProcessedAssets(collectedAssets),
229
+ html: resolvedHtml
230
+ };
231
+ }
119
232
  async executeComponentRender(options) {
120
233
  const rendererCache = this.getRendererCache(options.input.integrationContext) ?? /* @__PURE__ */ new Map();
121
234
  const delegatedForeignChildRender = await this.resolveForeignChildInOwningRenderer({
@@ -167,12 +280,6 @@ class ForeignSubtreeExecutionService {
167
280
  integrationContext: integrationContext ? { ...integrationContext, rendererCache: sharedRendererCache } : { rendererCache: sharedRendererCache }
168
281
  };
169
282
  }
170
- /**
171
- * Returns the delegatable owning renderer integration for one component.
172
- *
173
- * The pseudo `html` integration marks document-shell ownership only and does
174
- * not participate in component-level foreign subtree execution.
175
- */
176
283
  getForeignOwnerIntegrationName(component, currentIntegrationName) {
177
284
  const integrationName = component.config?.integration ?? component.config?.__eco?.integration;
178
285
  if (!integrationName || integrationName === "html" || integrationName === currentIntegrationName) {
@@ -195,7 +302,7 @@ class ForeignSubtreeExecutionService {
195
302
  input: options.input,
196
303
  rendererCache: options.rendererCache,
197
304
  getOwningRenderer: options.getOwningRenderer,
198
- run: (owningRenderer, delegatedInput) => owningRenderer.renderForeignSubtree(delegatedInput)
305
+ run: async (owningRenderer, delegatedInput) => toForeignSubtreeRenderPayload(await owningRenderer.renderComponentWithForeignChildren(delegatedInput))
199
306
  });
200
307
  }
201
308
  async runInForeignOwningRenderer(options) {
@@ -206,7 +313,7 @@ class ForeignSubtreeExecutionService {
206
313
  if (!foreignOwnerIntegrationName) {
207
314
  return void 0;
208
315
  }
209
- const owningRenderer = options.getOwningRenderer(foreignOwnerIntegrationName, options.rendererCache);
316
+ const owningRenderer = await options.getOwningRenderer(foreignOwnerIntegrationName, options.rendererCache);
210
317
  if (owningRenderer.name === options.currentIntegrationName) {
211
318
  return void 0;
212
319
  }
@@ -227,7 +334,33 @@ class ForeignSubtreeExecutionService {
227
334
  }
228
335
  return resolvedHtml;
229
336
  }
337
+ createForeignSubtreeToken(tokenPrefix, runtimeContext, foreignSubtreeId) {
338
+ return `${tokenPrefix}${runtimeContext.componentInstanceScope ?? "root"}__${foreignSubtreeId}__`;
339
+ }
340
+ ensureRuntimeContext(options) {
341
+ let integrationContext;
342
+ if (typeof options.renderInput.integrationContext === "object" && options.renderInput.integrationContext !== null) {
343
+ integrationContext = options.renderInput.integrationContext;
344
+ } else {
345
+ integrationContext = {};
346
+ }
347
+ const existingRuntimeContext = integrationContext[options.runtimeContextKey];
348
+ if (typeof existingRuntimeContext !== "object" || existingRuntimeContext === null) {
349
+ integrationContext[options.runtimeContextKey] = options.createRuntimeContext?.(integrationContext, options.rendererCache) ?? {
350
+ rendererCache: options.rendererCache,
351
+ componentInstanceScope: integrationContext.componentInstanceId,
352
+ nextForeignSubtreeId: 0,
353
+ queuedResolutions: []
354
+ };
355
+ } else {
356
+ existingRuntimeContext.rendererCache = options.rendererCache;
357
+ }
358
+ integrationContext.rendererCache = options.rendererCache;
359
+ options.renderInput.integrationContext = integrationContext;
360
+ return integrationContext[options.runtimeContextKey];
361
+ }
230
362
  }
231
363
  export {
232
- ForeignSubtreeExecutionService
364
+ ForeignSubtreeExecutionService,
365
+ toForeignSubtreeRenderPayload
233
366
  };
@@ -0,0 +1,19 @@
1
+ import type { EcoPagesAppConfig } from '../../../types/internal-types.js';
2
+ import type { ForeignSubtreeExecutionOwningRenderer } from './foreign-subtree-execution.service.js';
3
+ export type OwningRendererResolutionInput = {
4
+ appConfig: EcoPagesAppConfig;
5
+ runtimeOrigin: string;
6
+ currentIntegrationName: string;
7
+ currentRenderer: ForeignSubtreeExecutionOwningRenderer;
8
+ integrationName: string;
9
+ cache: Map<string, ForeignSubtreeExecutionOwningRenderer>;
10
+ };
11
+ export declare function getForeignSubtreeTokenPrefix(integrationName: string): string;
12
+ export declare function getForeignSubtreeResolutionContextKey(integrationName: string): string;
13
+ /**
14
+ * Resolves an owning integration renderer for a foreign-child handoff.
15
+ *
16
+ * Reuses the execution-scoped cache, activates the target runtime when needed,
17
+ * and initializes the plugin renderer once per integration name.
18
+ */
19
+ export declare function resolveOwningIntegrationRenderer(input: OwningRendererResolutionInput): Promise<ForeignSubtreeExecutionOwningRenderer>;
@@ -0,0 +1,35 @@
1
+ import { ensureIntegrationRuntimeReady } from "../../../build/app-build-manifest-runtime.js";
2
+ import { invariant } from "../../../utils/invariant.js";
3
+ function getForeignSubtreeTokenPrefix(integrationName) {
4
+ return `__${integrationName}_foreign_subtree__`;
5
+ }
6
+ function getForeignSubtreeResolutionContextKey(integrationName) {
7
+ return `__${integrationName}_foreign_subtree_runtime__`;
8
+ }
9
+ async function resolveOwningIntegrationRenderer(input) {
10
+ const { integrationName, cache } = input;
11
+ if (cache.has(integrationName)) {
12
+ return cache.get(integrationName);
13
+ }
14
+ if (integrationName === input.currentIntegrationName) {
15
+ cache.set(integrationName, input.currentRenderer);
16
+ return input.currentRenderer;
17
+ }
18
+ await ensureIntegrationRuntimeReady({
19
+ appConfig: input.appConfig,
20
+ integrationName,
21
+ runtimeOrigin: input.runtimeOrigin
22
+ });
23
+ const integrationPlugin = input.appConfig.integrations.find((integration) => integration.name === integrationName);
24
+ invariant(!!integrationPlugin, `[ecopages] Integration not found for foreign owner: ${integrationName}`);
25
+ const renderer = integrationPlugin.initializeRenderer({
26
+ rendererModules: input.appConfig.runtime?.rendererModuleContext
27
+ });
28
+ cache.set(integrationName, renderer);
29
+ return renderer;
30
+ }
31
+ export {
32
+ getForeignSubtreeResolutionContextKey,
33
+ getForeignSubtreeTokenPrefix,
34
+ resolveOwningIntegrationRenderer
35
+ };
@@ -4,17 +4,16 @@
4
4
  * @module
5
5
  */
6
6
  import type { EcoPagesAppConfig, IHmrManager } from '../../types/internal-types.js';
7
- import type { ComponentRenderInput, ComponentRenderResult, ForeignSubtreeRenderPayload, EcoComponent, EcoComponentDependencies, EcoPageFile, EcoPagesElement, BaseIntegrationContext, HtmlTemplateProps, IntegrationRendererRenderOptions, PageBrowserGraphContribution, PageBrowserGraphContributionContext, PageBrowserGraphResult, PageMetadataProps, RouteRendererBody, RouteRendererOptions, RouteRenderResult } from '../../types/public-types.js';
7
+ import type { ComponentRenderInput, ComponentRenderResult, EcoComponent, EcoPageFile, EcoPagesElement, HtmlTemplateProps, IntegrationRendererRenderOptions, PageBrowserGraphContribution, PageBrowserGraphContributionContext, PageBrowserGraphResult, PageMetadataProps, RouteRendererBody, RouteRendererOptions, RouteRenderResult } from '../../types/public-types.js';
8
8
  import { type AssetProcessingService, type ProcessedAsset } from '../../services/assets/asset-processing-service/index.js';
9
9
  import { HtmlTransformerService } from '../../services/html/html-transformer.service.js';
10
10
  import type { HtmlDocumentContribution } from '../../services/html/html-transformer.service.js';
11
11
  import { HttpError } from '../../errors/http-error.js';
12
12
  import { DependencyResolverService } from '../page-loading/dependency-resolver.js';
13
13
  import { PageModuleLoaderService } from '../page-loading/page-module-loader.js';
14
- import { type RouteHtmlFinalization, RouteRenderOrchestrator, type RouteRenderOrchestratorAdapter, type RouteRenderOrchestratorResolvedInputs } from './route-render-orchestrator.js';
15
- import type { ForeignChildRuntime } from './component-render-context.js';
16
- import { ForeignSubtreeExecutionService, type ForeignSubtreeExecutionOwningRenderer } from './foreign-subtree-execution.service.js';
17
- import { type QueuedForeignSubtreeResolutionContext } from './queued-foreign-subtree-resolution.service.js';
14
+ import { RouteRenderOrchestrator, type RouteRenderOrchestratorAdapter, type RouteRenderOrchestratorResolvedInputs } from './route-pipeline/route-render-orchestrator.js';
15
+ import type { ForeignChildRuntime } from './foreign-child/component-render-context.js';
16
+ import { ForeignSubtreeExecutionService } from './foreign-child/foreign-subtree-execution.service.js';
18
17
  /**
19
18
  * Controls how one route module is loaded outside the normal render path.
20
19
  *
@@ -59,7 +58,23 @@ export declare abstract class IntegrationRenderer<C = EcoPagesElement> {
59
58
  protected pageModuleLoaderService: PageModuleLoaderService;
60
59
  protected routeRenderOrchestrator: RouteRenderOrchestrator;
61
60
  protected readonly foreignSubtreeExecutionService: ForeignSubtreeExecutionService;
61
+ /**
62
+ * Serializes route and view renders that mutate `htmlTransformer` state.
63
+ *
64
+ * Integration renderers are cached per integration, so concurrent static builds
65
+ * and overlapping SSR requests must not share one transformer page package.
66
+ */
67
+ private renderExclusiveChain;
62
68
  protected DOC_TYPE: string;
69
+ private runRenderExclusive;
70
+ /**
71
+ * Activates the owning integration runtime on first render or graph use.
72
+ */
73
+ protected ensureIntegrationRuntimeActivated(): Promise<void>;
74
+ /**
75
+ * Prebuilds the production Page Browser Graph for one route file.
76
+ */
77
+ prebuildProductionPageBrowserGraph(routeFile: string): Promise<void>;
63
78
  /**
64
79
  * Loads one route module through the owning renderer's import path.
65
80
  *
@@ -69,34 +84,6 @@ export declare abstract class IntegrationRenderer<C = EcoPagesElement> {
69
84
  * with raw transpiler access.
70
85
  */
71
86
  loadPageModule(file: string, options?: RouteModuleLoadOptions): Promise<EcoPageFile>;
72
- /**
73
- * Reads the execution-scoped owning-renderer cache from one render input.
74
- *
75
- * Shared page/layout/document shell helpers pass one cache through
76
- * `integrationContext` so repeated delegation to the same foreign integration
77
- * can reuse a single initialized renderer instance during one render flow.
78
- * The cache is deliberately scoped to the current render execution rather than
79
- * stored on the renderer, which avoids leaking mutable integration state across
80
- * requests while still preventing redundant renderer initialization.
81
- *
82
- * @param integrationContext - Optional render context carried with one render input.
83
- * @returns The current execution cache when present.
84
- */
85
- private getOwningRendererCache;
86
- private getForeignOwnerIntegrationName;
87
- /**
88
- * Attaches an execution-scoped owning-renderer cache to one render input.
89
- *
90
- * Foreign-owned page, layout, or document shells may delegate several times in
91
- * the same render flow. Threading the cache through `integrationContext`
92
- * preserves renderer reuse without changing the public render input contract.
93
- * Existing integration-specific context is preserved and augmented.
94
- *
95
- * @param input - Original render input.
96
- * @param rendererCache - Execution-scoped renderer cache to propagate.
97
- * @returns Render input augmented with the shared renderer cache.
98
- */
99
- private withOwningRendererCache;
100
87
  protected getRendererModuleValue(key: string): unknown;
101
88
  protected getRendererModuleString(key: string): string | undefined;
102
89
  protected getRendererBootstrapDependencies(partial?: boolean): ProcessedAsset[];
@@ -131,7 +118,6 @@ export declare abstract class IntegrationRenderer<C = EcoPagesElement> {
131
118
  */
132
119
  protected prepareViewDependencies(view: EcoComponent, layout?: EcoComponent): Promise<ProcessedAsset[]>;
133
120
  protected resolvePageBrowserGraphForFile(filePath: string): Promise<PageBrowserGraphResult | undefined>;
134
- protected mergePageBrowserGraphIntoPagePackage(pageBrowserGraph?: PageBrowserGraphResult): PageBrowserGraphResult | undefined;
135
121
  /**
136
122
  * Merges component-scoped assets into the active HTML transformer state.
137
123
  *
@@ -191,6 +177,7 @@ export declare abstract class IntegrationRenderer<C = EcoPagesElement> {
191
177
  props: P;
192
178
  ctx: RenderToResponseContext;
193
179
  layout?: EcoComponent;
180
+ transformDocumentHtml?: (html: string) => string;
194
181
  }): Promise<Response>;
195
182
  /**
196
183
  * Renders a route page through optional layout and document shells.
@@ -219,31 +206,7 @@ export declare abstract class IntegrationRenderer<C = EcoPagesElement> {
219
206
  documentProps?: Record<string, unknown>;
220
207
  transformDocumentHtml?: (html: string) => string;
221
208
  }): Promise<string>;
222
- private composeDocumentShell;
223
- /**
224
- * Renders one string-first component with serialized children and collects its assets.
225
- *
226
- * String-oriented integrations frequently share the same component contract:
227
- * pass serialized children through props, coerce the render result to HTML, and
228
- * attach any component-scoped dependencies. This helper centralizes that flow
229
- * so integrations can opt into shared orchestration without repeating the same
230
- * string-render boilerplate.
231
- *
232
- * @param input - Component render input.
233
- * @param component - String-oriented component implementation to execute.
234
- * @returns Structured component render result for orchestration paths.
235
- */
236
209
  protected renderStringComponentWithSerializedChildren(input: ComponentRenderInput, component: (props: Record<string, unknown>) => Promise<EcoPagesElement> | EcoPagesElement): Promise<ComponentRenderResult>;
237
- protected getForeignSubtreeTokenPrefix(): string;
238
- protected getForeignSubtreeResolutionContextKey(): string;
239
- protected createQueuedForeignSubtreeExecutionRuntime<TContext extends QueuedForeignSubtreeResolutionContext>(options: {
240
- renderInput: ComponentRenderInput;
241
- rendererCache: Map<string, IntegrationRenderer<any>>;
242
- runtimeContextKey?: string;
243
- tokenPrefix?: string;
244
- createRuntimeContext?: (integrationContext: BaseIntegrationContext & Record<string, unknown>, rendererCache: Map<string, unknown>) => TContext;
245
- }): ForeignChildRuntime;
246
- protected getQueuedForeignSubtreeResolutionContext<TContext extends QueuedForeignSubtreeResolutionContext>(input: ComponentRenderInput): TContext | undefined;
247
210
  /**
248
211
  * Renders a string-first component, then resolves any queued foreign
249
212
  * boundaries before returning final component HTML.
@@ -256,16 +219,6 @@ export declare abstract class IntegrationRenderer<C = EcoPagesElement> {
256
219
  rendererModules?: unknown;
257
220
  runtimeOrigin: string;
258
221
  });
259
- /**
260
- * Returns the HTML path from the provided file path.
261
- * It extracts the path relative to the pages directory and removes the 'index' part if present.
262
- *
263
- * @param file - The file path to extract the HTML path from.
264
- * @returns The extracted HTML path.
265
- */
266
- protected getHtmlPath({ file }: {
267
- file: string;
268
- }): string;
269
222
  /**
270
223
  * Returns the HTML template component.
271
224
  * It imports the HTML template from the specified path in the app configuration.
@@ -293,27 +246,6 @@ export declare abstract class IntegrationRenderer<C = EcoPagesElement> {
293
246
  * @returns The resolved dependency path.
294
247
  */
295
248
  protected resolveDependencyPath(componentDir: string, pathUrl: string): string;
296
- /**
297
- * Extracts the dependencies from the provided component configuration.
298
- * It resolves the paths for scripts and stylesheets based on the component directory.
299
- *
300
- * @param componentDir - The component directory path.
301
- * @param scripts - The scripts to extract.
302
- * @param stylesheets - The stylesheets to extract.
303
- * @returns The extracted dependencies.
304
- */
305
- protected extractDependencies({ componentDir, scripts, stylesheets, }: {
306
- componentDir: string;
307
- } & EcoComponentDependencies): EcoComponentDependencies;
308
- /**
309
- * Resolves lazy script paths to public asset URLs.
310
- * Converts source paths to their final bundled output paths.
311
- *
312
- * @param componentDir - The component directory path.
313
- * @param scripts - The lazy script paths to resolve.
314
- * @returns Comma-separated string of resolved public script paths.
315
- */
316
- protected resolveLazyScripts(componentDir: string, scripts: string[]): string;
317
249
  /**
318
250
  * Collects the dependencies for the provided components.
319
251
  * Combines component-specific dependencies with global integration dependencies.
@@ -343,15 +275,7 @@ export declare abstract class IntegrationRenderer<C = EcoPagesElement> {
343
275
  }): Promise<{
344
276
  resolvedDependencies: ProcessedAsset[];
345
277
  }>;
346
- protected resolveRoutePageComponentRender(input: {
347
- Page: EcoComponent;
348
- Layout?: EcoComponent;
349
- props: Record<string, unknown>;
350
- routeOptions: RouteRendererOptions;
351
- }): Promise<ComponentRenderResult | undefined>;
352
278
  protected renderRouteBody(renderOptions: IntegrationRendererRenderOptions<C>): Promise<RouteRendererBody>;
353
- protected getRouteHtmlFinalization(renderOptions: IntegrationRendererRenderOptions<C>): RouteHtmlFinalization;
354
- protected transformRouteResponse(response: Response, htmlContributions?: HtmlDocumentContribution[]): Promise<RouteRendererBody>;
355
279
  /**
356
280
  * Prepares the render options for the integration renderer.
357
281
  * It imports the page file, collects dependencies, and prepares the render options.
@@ -360,19 +284,6 @@ export declare abstract class IntegrationRenderer<C = EcoPagesElement> {
360
284
  * @returns The prepared render options.
361
285
  */
362
286
  protected prepareRenderOptions(options: RouteRendererOptions, adapter?: RouteRenderOrchestratorAdapter<C>): Promise<IntegrationRendererRenderOptions<C>>;
363
- /**
364
- * Controls whether the page root should be rendered through `renderComponent()`
365
- * during route option preparation in component-capable modes.
366
- *
367
- * Integrations that already own page-level hydration (for example router-driven
368
- * React rendering) can override this and return `false` to avoid duplicate root
369
- * mount assets and competing hydration entrypoints.
370
- */
371
- protected shouldRenderPageComponent(_input: {
372
- Page: EcoComponent;
373
- Layout?: EcoComponent;
374
- options: RouteRendererOptions;
375
- }): boolean;
376
287
  /**
377
288
  * Executes the integration renderer with the provided options.
378
289
  *
@@ -380,7 +291,7 @@ export declare abstract class IntegrationRenderer<C = EcoPagesElement> {
380
291
  * 1. Build normalized render options (`prepareRenderOptions`).
381
292
  * 2. Render the route body once.
382
293
  * 3. Reject unresolved route-level eco-marker artifacts.
383
- * 4. Optionally apply root attributes for page/component root boundaries.
294
+ * 4. Optionally apply document attributes for integration-owned document boundaries.
384
295
  * 5. Run HTML transformer with final dependency set.
385
296
  *
386
297
  * Stream-safety note: the first render result is normalized to a string once,
@@ -391,21 +302,6 @@ export declare abstract class IntegrationRenderer<C = EcoPagesElement> {
391
302
  * @returns Rendered route body plus effective cache strategy.
392
303
  */
393
304
  execute(options: RouteRendererOptions): Promise<RouteRenderResult>;
394
- /**
395
- * Finalizes already-resolved HTML for explicit renderer-owned paths.
396
- *
397
- * This keeps document and root-attribute stamping plus HTML transformation
398
- * available after a renderer has completed nested foreign-subtree resolution without
399
- * routing back through shared route execution.
400
- */
401
- protected finalizeResolvedHtml(options: {
402
- html: string;
403
- partial?: boolean;
404
- componentRootAttributes?: Record<string, string>;
405
- documentAttributes?: Record<string, string>;
406
- transformHtml?: boolean;
407
- htmlContributions?: HtmlDocumentContribution[];
408
- }): Promise<string>;
409
305
  /**
410
306
  * Returns document-level attributes to stamp onto the rendered `<html>` tag.
411
307
  *
@@ -413,6 +309,8 @@ export declare abstract class IntegrationRenderer<C = EcoPagesElement> {
413
309
  * other runtime coordination markers without relying on script sniffing.
414
310
  */
415
311
  protected getDocumentAttributes(_renderOptions: IntegrationRendererRenderOptions<C>): Record<string, string> | undefined;
312
+ protected applyAttributesToFirstBodyElement(html: string, attributes: Record<string, string>): string;
313
+ protected applyAttributesToHtmlElement(html: string, attributes: Record<string, string>): string;
416
314
  /**
417
315
  * Returns declarative HTML fragments that core should inject into the final document.
418
316
  *
@@ -423,17 +321,6 @@ export declare abstract class IntegrationRenderer<C = EcoPagesElement> {
423
321
  * response finalization logic.
424
322
  */
425
323
  protected getHtmlDocumentContributions(_options: HtmlDocumentContributionContext<C>): HtmlDocumentContribution[] | undefined;
426
- /**
427
- * Returns a renderer instance for a given integration name.
428
- *
429
- * Uses a per-execution cache to avoid repeated renderer initialization.
430
- *
431
- * @param integrationName Target integration name.
432
- * @param cache Render-pass renderer cache.
433
- * @returns Renderer for the requested integration.
434
- * @throws Error when no integration plugin matches `integrationName`.
435
- */
436
- protected getIntegrationRendererForName(integrationName: string, cache: Map<string, ForeignSubtreeExecutionOwningRenderer>): ForeignSubtreeExecutionOwningRenderer;
437
324
  /**
438
325
  * Abstract method to render the integration-specific component.
439
326
  * This method should be implemented by the specific integration renderer.
@@ -451,12 +338,6 @@ export declare abstract class IntegrationRenderer<C = EcoPagesElement> {
451
338
  * renderer's nested foreign-child handoff.
452
339
  */
453
340
  renderComponentWithForeignChildren(input: ComponentRenderInput): Promise<ComponentRenderResult>;
454
- /**
455
- * Compatibility foreign-subtree contract that exposes a narrower payload shape for
456
- * future route-composition work while preserving the current
457
- * `renderComponentWithForeignChildren()` runtime semantics.
458
- */
459
- renderForeignSubtree(input: ComponentRenderInput): Promise<ForeignSubtreeRenderPayload>;
460
341
  private normalizeComponentRenderOutput;
461
342
  protected normalizeUnresolvedMarkerArtifactHtml(html: string): string;
462
343
  /**