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

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
@@ -6,19 +6,31 @@ import { invariant } from "../../utils/invariant.js";
6
6
  import { HttpError } from "../../errors/http-error.js";
7
7
  import { DependencyResolverService } from "../page-loading/dependency-resolver.js";
8
8
  import { PageModuleLoaderService } from "../page-loading/page-module-loader.js";
9
- import { OwnershipValidationService } from "./ownership-validation.service.js";
9
+ import { OwnershipValidationService } from "./ownership-graph/ownership-validation.service.js";
10
+ import { hasForeignChildDescendantsInGraph } from "./ownership-graph/component-graph-collectors.js";
10
11
  import {
11
12
  RouteRenderOrchestrator
12
- } from "./route-render-orchestrator.js";
13
- import { normalizeUnresolvedMarkerArtifactHtml } from "./render-output.utils.js";
13
+ } from "./route-pipeline/route-render-orchestrator.js";
14
+ import { createIntegrationRouteRenderAdapter } from "./route-pipeline/integration-route-render-adapter.js";
15
+ import { loadPageBrowserGraphContribution } from "./page-browser-graph/page-browser-graph-contribution.loader.js";
16
+ import { normalizeUnresolvedMarkerArtifactHtml } from "./route-pipeline/marker-artifact.utils.js";
17
+ import { isMarkupNodeLike } from "./foreign-child/foreign-child-output.utils.js";
14
18
  import {
15
- ForeignSubtreeExecutionService
16
- } from "./foreign-subtree-execution.service.js";
17
- import {} from "./queued-foreign-subtree-resolution.service.js";
18
- import { buildProcessedAssetDedupeKey } from "./processed-asset-dedupe.js";
19
- function isMarkupNodeLike(value) {
20
- return typeof value === "object" && value !== null && "nodeType" in value && typeof value.nodeType === "number" && "outerHTML" in value && typeof value.outerHTML === "string";
21
- }
19
+ getForeignSubtreeResolutionContextKey,
20
+ getForeignSubtreeTokenPrefix,
21
+ resolveOwningIntegrationRenderer
22
+ } from "./foreign-child/owning-renderer-resolution.js";
23
+ import { ensureIntegrationRuntimeReady } from "../../build/app-build-manifest-runtime.js";
24
+ import { ForeignSubtreeExecutionService } from "./foreign-child/foreign-subtree-execution.service.js";
25
+ import {
26
+ composeDocumentShell,
27
+ finalizeDocumentShellHtml,
28
+ renderPageDocumentShell
29
+ } from "./document-shell/document-shell-render.service.js";
30
+ import {
31
+ resolveInnermostPageLayout,
32
+ resolvePageLayoutComponents
33
+ } from "./document-shell/layout-shell-props.service.js";
22
34
  class IntegrationRenderer {
23
35
  appConfig;
24
36
  assetProcessingService;
@@ -31,63 +43,52 @@ class IntegrationRenderer {
31
43
  pageModuleLoaderService;
32
44
  routeRenderOrchestrator;
33
45
  foreignSubtreeExecutionService = new ForeignSubtreeExecutionService();
34
- DOC_TYPE = "<!DOCTYPE html>";
35
46
  /**
36
- * Loads one route module through the owning renderer's import path.
47
+ * Serializes route and view renders that mutate `htmlTransformer` state.
37
48
  *
38
- * Request-time infrastructure may need page metadata such as cache strategy or
39
- * middleware before full rendering starts. Exposing this narrow entrypoint lets
40
- * those callers reuse integration-specific import setup instead of bypassing it
41
- * with raw transpiler access.
49
+ * Integration renderers are cached per integration, so concurrent static builds
50
+ * and overlapping SSR requests must not share one transformer page package.
42
51
  */
43
- async loadPageModule(file, options) {
44
- return this.importPageFile(file, options);
52
+ renderExclusiveChain = Promise.resolve();
53
+ DOC_TYPE = "<!DOCTYPE html>";
54
+ runRenderExclusive(operation) {
55
+ const run = this.renderExclusiveChain.then(async () => {
56
+ await this.ensureIntegrationRuntimeActivated();
57
+ return operation();
58
+ });
59
+ this.renderExclusiveChain = run.then(
60
+ () => void 0,
61
+ () => void 0
62
+ );
63
+ return run;
45
64
  }
46
65
  /**
47
- * Reads the execution-scoped owning-renderer cache from one render input.
48
- *
49
- * Shared page/layout/document shell helpers pass one cache through
50
- * `integrationContext` so repeated delegation to the same foreign integration
51
- * can reuse a single initialized renderer instance during one render flow.
52
- * The cache is deliberately scoped to the current render execution rather than
53
- * stored on the renderer, which avoids leaking mutable integration state across
54
- * requests while still preventing redundant renderer initialization.
55
- *
56
- * @param integrationContext - Optional render context carried with one render input.
57
- * @returns The current execution cache when present.
66
+ * Activates the owning integration runtime on first render or graph use.
58
67
  */
59
- getOwningRendererCache(integrationContext) {
60
- if (integrationContext?.rendererCache instanceof Map) {
61
- return integrationContext.rendererCache;
62
- }
63
- return void 0;
68
+ async ensureIntegrationRuntimeActivated() {
69
+ await ensureIntegrationRuntimeReady({
70
+ appConfig: this.appConfig,
71
+ integrationName: this.name,
72
+ runtimeOrigin: this.runtimeOrigin
73
+ });
64
74
  }
65
- getForeignOwnerIntegrationName(component) {
66
- const integrationName = component.config?.integration ?? component.config?.__eco?.integration;
67
- if (!integrationName || integrationName === this.name) {
68
- return void 0;
69
- }
70
- return this.appConfig.integrations.some((integration) => integration.name === integrationName) ? integrationName : void 0;
75
+ /**
76
+ * Prebuilds the production Page Browser Graph for one route file.
77
+ */
78
+ async prebuildProductionPageBrowserGraph(routeFile) {
79
+ await this.ensureIntegrationRuntimeActivated();
80
+ await this.resolvePageBrowserGraphForFile(routeFile);
71
81
  }
72
82
  /**
73
- * Attaches an execution-scoped owning-renderer cache to one render input.
74
- *
75
- * Foreign-owned page, layout, or document shells may delegate several times in
76
- * the same render flow. Threading the cache through `integrationContext`
77
- * preserves renderer reuse without changing the public render input contract.
78
- * Existing integration-specific context is preserved and augmented.
83
+ * Loads one route module through the owning renderer's import path.
79
84
  *
80
- * @param input - Original render input.
81
- * @param rendererCache - Execution-scoped renderer cache to propagate.
82
- * @returns Render input augmented with the shared renderer cache.
85
+ * Request-time infrastructure may need page metadata such as cache strategy or
86
+ * middleware before full rendering starts. Exposing this narrow entrypoint lets
87
+ * those callers reuse integration-specific import setup instead of bypassing it
88
+ * with raw transpiler access.
83
89
  */
84
- withOwningRendererCache(input, rendererCache) {
85
- const integrationContext = input.integrationContext;
86
- const sharedRendererCache = rendererCache;
87
- return {
88
- ...input,
89
- integrationContext: integrationContext ? { ...integrationContext, rendererCache: sharedRendererCache } : { rendererCache: sharedRendererCache }
90
- };
90
+ async loadPageModule(file, options) {
91
+ return this.importPageFile(file, options);
91
92
  }
92
93
  getRendererModuleValue(key) {
93
94
  if (!this.rendererModules || typeof this.rendererModules !== "object") {
@@ -184,41 +185,12 @@ class IntegrationRenderer {
184
185
  return await this.routeRenderOrchestrator.resolveDeclaredPageBrowserGraph({
185
186
  routeFile: filePath,
186
187
  integrationName: this.name,
187
- collectContribution: async (routeFile) => {
188
- const pageModule = await this.importPageFile(routeFile);
189
- return await this.collectPageBrowserGraphContribution({ file: routeFile, pageModule });
190
- }
191
- });
192
- }
193
- mergePageBrowserGraphIntoPagePackage(pageBrowserGraph) {
194
- if (!pageBrowserGraph) {
195
- return void 0;
196
- }
197
- const currentPagePackage = this.htmlTransformer.getPagePackage();
198
- const mergedPageBrowserGraph = currentPagePackage?.pageBrowserGraph ? {
199
- entryAssets: this.htmlTransformer.dedupeProcessedAssets([
200
- ...currentPagePackage.pageBrowserGraph.entryAssets,
201
- ...pageBrowserGraph.entryAssets
202
- ]),
203
- chunkAssets: this.htmlTransformer.dedupeProcessedAssets([
204
- ...currentPagePackage.pageBrowserGraph.chunkAssets,
205
- ...pageBrowserGraph.chunkAssets
206
- ])
207
- } : pageBrowserGraph;
208
- const pageBrowserGraphAssetKeys = new Set(
209
- [...mergedPageBrowserGraph.entryAssets, ...mergedPageBrowserGraph.chunkAssets].map(
210
- (asset) => buildProcessedAssetDedupeKey(asset)
188
+ collectContribution: (routeFile) => loadPageBrowserGraphContribution(
189
+ routeFile,
190
+ (targetFile) => this.importPageFile(targetFile),
191
+ (context) => this.collectPageBrowserGraphContribution(context)
211
192
  )
212
- );
213
- const baseAssets = currentPagePackage ? currentPagePackage.assets.filter(
214
- (asset) => !pageBrowserGraphAssetKeys.has(buildProcessedAssetDedupeKey(asset))
215
- ) : this.htmlTransformer.getProcessedDependencies();
216
- this.htmlTransformer.setPagePackage(
217
- createPagePackage(this.htmlTransformer.dedupeProcessedAssets(baseAssets), {
218
- pageBrowserGraph: mergedPageBrowserGraph
219
- })
220
- );
221
- return mergedPageBrowserGraph;
193
+ });
222
194
  }
223
195
  /**
224
196
  * Merges component-scoped assets into the active HTML transformer state.
@@ -306,29 +278,42 @@ class IntegrationRenderer {
306
278
  * @returns HTML response for the explicit view render.
307
279
  */
308
280
  async renderViewWithDocumentShell(input) {
281
+ await this.ensureIntegrationRuntimeActivated();
309
282
  const normalizedProps = input.props ?? {};
310
283
  if (input.ctx.partial) {
311
- return this.renderPartialViewResponse(input);
284
+ return this.renderPartialViewResponse({
285
+ ...input,
286
+ transformHtml: input.transformDocumentHtml
287
+ });
312
288
  }
313
289
  await this.prepareViewDependencies(input.view, input.layout);
314
290
  const HtmlTemplate = await this.getHtmlTemplate();
315
291
  const metadata = await this.resolveViewMetadata(input.view, input.props);
316
- const { documentHtml } = await this.composeDocumentShell({
317
- primaryComponent: input.view,
318
- primaryProps: normalizedProps,
319
- layout: input.layout ? {
320
- component: input.layout,
321
- props: {}
322
- } : void 0,
323
- htmlTemplate: HtmlTemplate,
324
- documentProps: {
325
- metadata,
326
- pageProps: normalizedProps
292
+ const { documentHtml } = await composeDocumentShell(
293
+ {
294
+ renderComponentWithForeignChildren: (renderInput) => this.renderComponentWithForeignChildren(renderInput),
295
+ appendProcessedDependencies: (...assetGroups) => this.appendProcessedDependencies(...assetGroups)
296
+ },
297
+ {
298
+ primaryComponent: input.view,
299
+ primaryProps: normalizedProps,
300
+ layout: input.layout ? {
301
+ component: input.layout,
302
+ props: {}
303
+ } : void 0,
304
+ htmlTemplate: HtmlTemplate,
305
+ documentProps: {
306
+ metadata,
307
+ pageProps: normalizedProps
308
+ }
327
309
  }
328
- });
329
- const html = await this.finalizeResolvedHtml({
330
- html: `${this.DOC_TYPE}${documentHtml}`,
331
- partial: false
310
+ );
311
+ const transformedDocumentHtml = input.transformDocumentHtml ? input.transformDocumentHtml(documentHtml) : documentHtml;
312
+ this.appendProcessedDependencies(this.getRendererBootstrapDependencies(false));
313
+ const html = await finalizeDocumentShellHtml(this.htmlTransformer, {
314
+ html: `${this.DOC_TYPE}${transformedDocumentHtml}`,
315
+ partial: false,
316
+ htmlContributions: this.getHtmlDocumentContributions({ partial: false })
332
317
  });
333
318
  return this.createHtmlResponse(html, input.ctx);
334
319
  }
@@ -345,59 +330,17 @@ class IntegrationRenderer {
345
330
  * @returns Final serialized document HTML including the doctype prefix.
346
331
  */
347
332
  async renderPageWithDocumentShell(input) {
348
- const { documentHtml: composedDocumentHtml } = await this.composeDocumentShell({
349
- primaryComponent: input.page.component,
350
- primaryProps: input.page.props,
351
- layout: input.layout,
352
- htmlTemplate: input.htmlTemplate,
353
- documentProps: {
354
- metadata: input.metadata,
355
- pageProps: input.pageProps,
356
- ...input.documentProps ?? {}
357
- }
358
- });
359
- const documentHtml = input.transformDocumentHtml ? input.transformDocumentHtml(composedDocumentHtml) : composedDocumentHtml;
360
- return `${this.DOC_TYPE}${documentHtml}`;
361
- }
362
- async composeDocumentShell(input) {
363
- const rendererCache = /* @__PURE__ */ new Map();
364
- const primaryRender = await this.renderComponentWithForeignChildren({
365
- component: input.primaryComponent,
366
- props: input.primaryProps,
367
- integrationContext: { rendererCache }
368
- });
369
- const layoutRender = input.layout ? await this.renderComponentWithForeignChildren({
370
- component: input.layout.component,
371
- props: input.layout.props ?? {},
372
- children: primaryRender.html,
373
- integrationContext: { rendererCache }
374
- }) : void 0;
375
- const documentRender = await this.renderComponentWithForeignChildren({
376
- component: input.htmlTemplate,
377
- props: input.documentProps,
378
- children: layoutRender?.html ?? primaryRender.html,
379
- integrationContext: { rendererCache }
380
- });
381
- this.appendProcessedDependencies(primaryRender.assets, layoutRender?.assets, documentRender.assets);
382
- return {
383
- documentHtml: documentRender.html
384
- };
333
+ return renderPageDocumentShell(
334
+ {
335
+ renderComponentWithForeignChildren: (renderInput) => this.renderComponentWithForeignChildren(renderInput),
336
+ appendProcessedDependencies: (...assetGroups) => this.appendProcessedDependencies(...assetGroups)
337
+ },
338
+ input,
339
+ this.DOC_TYPE
340
+ );
385
341
  }
386
- /**
387
- * Renders one string-first component with serialized children and collects its assets.
388
- *
389
- * String-oriented integrations frequently share the same component contract:
390
- * pass serialized children through props, coerce the render result to HTML, and
391
- * attach any component-scoped dependencies. This helper centralizes that flow
392
- * so integrations can opt into shared orchestration without repeating the same
393
- * string-render boilerplate.
394
- *
395
- * @param input - Component render input.
396
- * @param component - String-oriented component implementation to execute.
397
- * @returns Structured component render result for orchestration paths.
398
- */
399
342
  async renderStringComponentWithSerializedChildren(input, component) {
400
- const serializedChildren = input.children === void 0 ? void 0 : typeof input.children === "string" ? input.children : isMarkupNodeLike(input.children) ? input.children.outerHTML : void 0;
343
+ const serializedChildren = input.children === void 0 ? void 0 : typeof input.children === "string" ? input.children : isMarkupNodeLike(input.children) && typeof input.children.outerHTML === "string" ? input.children.outerHTML : void 0;
401
344
  if (input.children !== void 0 && serializedChildren === void 0) {
402
345
  const componentFile = input.component.config?.__eco?.file ?? "unknown component";
403
346
  const childTag = Object.prototype.toString.call(input.children);
@@ -407,7 +350,14 @@ class IntegrationRenderer {
407
350
  }
408
351
  const props = serializedChildren === void 0 ? input.props : { ...input.props, children: serializedChildren };
409
352
  const content = await component(props);
410
- const html = String(content);
353
+ if (typeof content !== "string") {
354
+ const componentFile = input.component.config?.__eco?.file ?? "unknown component";
355
+ const contentTag = Object.prototype.toString.call(content);
356
+ throw new TypeError(
357
+ `[ecopages] ${this.name} renderer expected a string render result for ${componentFile}, received ${contentTag}.`
358
+ );
359
+ }
360
+ const html = content;
411
361
  const assets = input.component.config?.dependencies && typeof this.assetProcessingService?.processDependencies === "function" ? await this.processComponentDependencies([input.component]) : void 0;
412
362
  return {
413
363
  html,
@@ -417,27 +367,6 @@ class IntegrationRenderer {
417
367
  assets
418
368
  };
419
369
  }
420
- getForeignSubtreeTokenPrefix() {
421
- return `__${this.name}_foreign_subtree__`;
422
- }
423
- getForeignSubtreeResolutionContextKey() {
424
- return `__${this.name}_foreign_subtree_runtime__`;
425
- }
426
- createQueuedForeignSubtreeExecutionRuntime(options) {
427
- return this.foreignSubtreeExecutionService.createQueuedRuntime({
428
- renderInput: options.renderInput,
429
- rendererCache: options.rendererCache,
430
- runtimeContextKey: options.runtimeContextKey ?? this.getForeignSubtreeResolutionContextKey(),
431
- tokenPrefix: options.tokenPrefix ?? this.getForeignSubtreeTokenPrefix(),
432
- createRuntimeContext: options.createRuntimeContext
433
- });
434
- }
435
- getQueuedForeignSubtreeResolutionContext(input) {
436
- return this.foreignSubtreeExecutionService.getQueuedRuntimeContext(
437
- input,
438
- this.getForeignSubtreeResolutionContextKey()
439
- );
440
- }
441
370
  /**
442
371
  * Renders a string-first component, then resolves any queued foreign
443
372
  * boundaries before returning final component HTML.
@@ -448,9 +377,16 @@ class IntegrationRenderer {
448
377
  currentIntegrationName: this.name,
449
378
  renderInput: input,
450
379
  html: componentRender.html,
451
- runtimeContextKey: this.getForeignSubtreeResolutionContextKey(),
380
+ runtimeContextKey: getForeignSubtreeResolutionContextKey(this.name),
452
381
  queueLabel: "String",
453
- getOwningRenderer: (integrationName, rendererCache) => this.getIntegrationRendererForName(integrationName, rendererCache),
382
+ getOwningRenderer: (integrationName, rendererCache) => resolveOwningIntegrationRenderer({
383
+ appConfig: this.appConfig,
384
+ runtimeOrigin: this.runtimeOrigin,
385
+ currentIntegrationName: this.name,
386
+ currentRenderer: this,
387
+ integrationName,
388
+ cache: rendererCache
389
+ }),
454
390
  applyAttributesToFirstElement: (html, attributes) => this.htmlTransformer.applyAttributesToFirstElement(html, attributes),
455
391
  dedupeProcessedAssets: (assets) => this.htmlTransformer.dedupeProcessedAssets(assets)
456
392
  });
@@ -484,23 +420,6 @@ class IntegrationRenderer {
484
420
  ownershipValidationService: new OwnershipValidationService(appConfig)
485
421
  });
486
422
  }
487
- /**
488
- * Returns the HTML path from the provided file path.
489
- * It extracts the path relative to the pages directory and removes the 'index' part if present.
490
- *
491
- * @param file - The file path to extract the HTML path from.
492
- * @returns The extracted HTML path.
493
- */
494
- getHtmlPath({ file }) {
495
- const pagesDir = this.appConfig.absolutePaths.pagesDir;
496
- const pagesIndex = file.indexOf(pagesDir);
497
- if (pagesIndex === -1) return file;
498
- const startIndex = file.indexOf(pagesDir) + pagesDir.length;
499
- const endIndex = file.lastIndexOf("/");
500
- const path = file.substring(startIndex, endIndex);
501
- if (path === "/index") return "";
502
- return path;
503
- }
504
423
  /**
505
424
  * Returns the HTML template component.
506
425
  * It imports the HTML template from the specified path in the app configuration.
@@ -533,7 +452,7 @@ class IntegrationRenderer {
533
452
  * @returns The imported module.
534
453
  */
535
454
  async importPageFile(file, options) {
536
- const bypassCache = options?.bypassCache ?? (typeof Bun !== "undefined" && process.env.NODE_ENV === "development");
455
+ const bypassCache = options?.bypassCache ?? false;
537
456
  const pageModule = this.usesIntegrationPageImporter(file) ? await this.importIntegrationPageFile(file, {
538
457
  bypassCache,
539
458
  cacheScope: options?.cacheScope
@@ -554,46 +473,6 @@ class IntegrationRenderer {
554
473
  resolveDependencyPath(componentDir, pathUrl) {
555
474
  return this.dependencyResolverService.resolveDependencyPath(componentDir, pathUrl);
556
475
  }
557
- /**
558
- * Extracts the dependencies from the provided component configuration.
559
- * It resolves the paths for scripts and stylesheets based on the component directory.
560
- *
561
- * @param componentDir - The component directory path.
562
- * @param scripts - The scripts to extract.
563
- * @param stylesheets - The stylesheets to extract.
564
- * @returns The extracted dependencies.
565
- */
566
- extractDependencies({
567
- componentDir,
568
- scripts,
569
- stylesheets
570
- }) {
571
- const scriptsPaths = [
572
- ...new Set(
573
- (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))
574
- )
575
- ];
576
- const stylesheetsPaths = [
577
- ...new Set(
578
- (stylesheets ?? []).map((style) => typeof style === "string" ? style : style.src).filter((style) => Boolean(style)).map((style) => this.resolveDependencyPath(componentDir, style))
579
- )
580
- ];
581
- return {
582
- scripts: scriptsPaths,
583
- stylesheets: stylesheetsPaths
584
- };
585
- }
586
- /**
587
- * Resolves lazy script paths to public asset URLs.
588
- * Converts source paths to their final bundled output paths.
589
- *
590
- * @param componentDir - The component directory path.
591
- * @param scripts - The lazy script paths to resolve.
592
- * @returns Comma-separated string of resolved public script paths.
593
- */
594
- resolveLazyScripts(componentDir, scripts) {
595
- return this.dependencyResolverService.resolveLazyScripts(componentDir, scripts);
596
- }
597
476
  /**
598
477
  * Collects the dependencies for the provided components.
599
478
  * Combines component-specific dependencies with global integration dependencies.
@@ -622,19 +501,26 @@ class IntegrationRenderer {
622
501
  * subclasses continue to override protected renderer behavior directly.
623
502
  */
624
503
  createRouteRenderOrchestratorAdapter() {
625
- return {
504
+ return createIntegrationRouteRenderAdapter({
626
505
  name: this.name,
627
506
  resolveRouteRenderInputs: (routeOptions) => this.resolveRouteRenderInputs(routeOptions),
628
507
  resolveRouteDependencies: (input) => this.resolveRouteDependencies(input),
629
- collectPageBrowserGraphContribution: async (routeFile) => {
630
- const pageModule = await this.importPageFile(routeFile);
631
- return await this.collectPageBrowserGraphContribution({ file: routeFile, pageModule });
632
- },
633
- resolveRoutePageComponentRender: (input) => this.resolveRoutePageComponentRender(input),
508
+ importPageFile: (file) => this.importPageFile(file),
509
+ collectPageBrowserGraphContribution: (context) => this.collectPageBrowserGraphContribution(context),
634
510
  renderRouteBody: (renderOptions) => this.renderRouteBody(renderOptions),
635
- getRouteHtmlFinalization: (renderOptions) => this.getRouteHtmlFinalization(renderOptions),
636
- transformRouteResponse: (response, htmlContributions) => this.transformRouteResponse(response, htmlContributions)
637
- };
511
+ getDocumentAttributes: (renderOptions) => this.getDocumentAttributes(renderOptions),
512
+ getHtmlDocumentContributions: (options) => this.getHtmlDocumentContributions(options),
513
+ applyAttributesToHtmlElement: (html, attributes) => this.applyAttributesToHtmlElement(html, attributes),
514
+ transformRouteResponse: async (response, htmlContributions, pagePackage) => {
515
+ const resolvedPagePackage = this.htmlTransformer.getPagePackage() ?? pagePackage;
516
+ const transformedResponse = await this.htmlTransformer.transform(
517
+ response,
518
+ htmlContributions,
519
+ resolvedPagePackage
520
+ );
521
+ return transformedResponse.body ?? await transformedResponse.text();
522
+ }
523
+ });
638
524
  }
639
525
  async resolveRouteRenderInputs(routeOptions) {
640
526
  const pageModule = await this.pageModuleLoaderService.resolvePageModule({
@@ -643,7 +529,8 @@ class IntegrationRenderer {
643
529
  });
644
530
  const { Page, integrationSpecificProps } = pageModule;
645
531
  const HtmlTemplate = await this.getHtmlTemplate();
646
- const Layout = Page.config?.layout;
532
+ const Layouts = resolvePageLayoutComponents(Page.config?.layouts);
533
+ const Layout = resolveInnermostPageLayout(Layouts);
647
534
  const { props, metadata } = await this.pageModuleLoaderService.resolvePageData({
648
535
  pageModule,
649
536
  routeOptions
@@ -651,7 +538,9 @@ class IntegrationRenderer {
651
538
  return {
652
539
  Page,
653
540
  HtmlTemplate,
541
+ Layouts,
654
542
  Layout,
543
+ layoutEntries: Page.config?.layoutEntries,
655
544
  props,
656
545
  metadata,
657
546
  integrationSpecificProps
@@ -662,54 +551,9 @@ class IntegrationRenderer {
662
551
  resolvedDependencies: await this.resolveDependencies(input.components)
663
552
  };
664
553
  }
665
- async resolveRoutePageComponentRender(input) {
666
- if (!this.shouldRenderPageComponent({ Page: input.Page, Layout: input.Layout, options: input.routeOptions })) {
667
- return void 0;
668
- }
669
- return this.renderComponentWithForeignChildren({
670
- component: input.Page,
671
- props: {
672
- ...input.props,
673
- params: input.routeOptions.params || {},
674
- query: input.routeOptions.query || {}
675
- },
676
- integrationContext: {
677
- componentInstanceId: "eco-page-root"
678
- }
679
- });
680
- }
681
554
  async renderRouteBody(renderOptions) {
682
555
  return this.render(renderOptions);
683
556
  }
684
- getRouteHtmlFinalization(renderOptions) {
685
- const componentRootAttributes = renderOptions.componentRender?.canAttachAttributes && renderOptions.componentRender.rootAttributes && Object.keys(renderOptions.componentRender.rootAttributes).length > 0 ? renderOptions.componentRender.rootAttributes : void 0;
686
- const documentAttributes = this.getDocumentAttributes(renderOptions);
687
- const htmlContributions = this.getHtmlDocumentContributions({ renderOptions, partial: false });
688
- const hasStructuralFinalization = componentRootAttributes && Object.keys(componentRootAttributes).length > 0 || documentAttributes && Object.keys(documentAttributes).length > 0;
689
- if (!hasStructuralFinalization && (!htmlContributions || htmlContributions.length === 0)) {
690
- return {};
691
- }
692
- return {
693
- htmlContributions,
694
- finalizeHtml: (html) => {
695
- let renderedHtml = html;
696
- if (componentRootAttributes) {
697
- renderedHtml = this.htmlTransformer.applyAttributesToFirstBodyElement(
698
- renderedHtml,
699
- componentRootAttributes
700
- );
701
- }
702
- if (documentAttributes) {
703
- renderedHtml = this.htmlTransformer.applyAttributesToHtmlElement(renderedHtml, documentAttributes);
704
- }
705
- return renderedHtml;
706
- }
707
- };
708
- }
709
- async transformRouteResponse(response, htmlContributions) {
710
- const transformedResponse = await this.htmlTransformer.transform(response, htmlContributions);
711
- return transformedResponse.body ?? await transformedResponse.text();
712
- }
713
557
  /**
714
558
  * Prepares the render options for the integration renderer.
715
559
  * It imports the page file, collects dependencies, and prepares the render options.
@@ -723,17 +567,6 @@ class IntegrationRenderer {
723
567
  this.htmlTransformer.setPagePackage(renderOptions.pagePackage);
724
568
  return renderOptions;
725
569
  }
726
- /**
727
- * Controls whether the page root should be rendered through `renderComponent()`
728
- * during route option preparation in component-capable modes.
729
- *
730
- * Integrations that already own page-level hydration (for example router-driven
731
- * React rendering) can override this and return `false` to avoid duplicate root
732
- * mount assets and competing hydration entrypoints.
733
- */
734
- shouldRenderPageComponent(_input) {
735
- return true;
736
- }
737
570
  /**
738
571
  * Executes the integration renderer with the provided options.
739
572
  *
@@ -741,7 +574,7 @@ class IntegrationRenderer {
741
574
  * 1. Build normalized render options (`prepareRenderOptions`).
742
575
  * 2. Render the route body once.
743
576
  * 3. Reject unresolved route-level eco-marker artifacts.
744
- * 4. Optionally apply root attributes for page/component root boundaries.
577
+ * 4. Optionally apply document attributes for integration-owned document boundaries.
745
578
  * 5. Run HTML transformer with final dependency set.
746
579
  *
747
580
  * Stream-safety note: the first render result is normalized to a string once,
@@ -752,41 +585,12 @@ class IntegrationRenderer {
752
585
  * @returns Rendered route body plus effective cache strategy.
753
586
  */
754
587
  async execute(options) {
755
- const adapter = this.createRouteRenderOrchestratorAdapter();
756
- const renderOptions = await this.prepareRenderOptions(options, adapter);
757
- return this.routeRenderOrchestrator.executePrepared(renderOptions, adapter);
758
- }
759
- /**
760
- * Finalizes already-resolved HTML for explicit renderer-owned paths.
761
- *
762
- * This keeps document and root-attribute stamping plus HTML transformation
763
- * available after a renderer has completed nested foreign-subtree resolution without
764
- * routing back through shared route execution.
765
- */
766
- async finalizeResolvedHtml(options) {
767
- const rendererBootstrapDependencies = this.getRendererBootstrapDependencies(options.partial);
768
- this.appendProcessedDependencies(rendererBootstrapDependencies);
769
- let html = options.html;
770
- if (options.componentRootAttributes && Object.keys(options.componentRootAttributes).length > 0) {
771
- html = this.htmlTransformer.applyAttributesToFirstBodyElement(html, options.componentRootAttributes);
772
- }
773
- if (options.documentAttributes && Object.keys(options.documentAttributes).length > 0) {
774
- html = this.htmlTransformer.applyAttributesToHtmlElement(html, options.documentAttributes);
775
- }
776
- const shouldTransform = options.transformHtml ?? !options.partial;
777
- if (!shouldTransform) {
778
- return html;
779
- }
780
- const htmlContributions = options.htmlContributions ?? this.getHtmlDocumentContributions({
781
- partial: options.partial
588
+ return this.runRenderExclusive(async () => {
589
+ this.htmlTransformer.setProcessedDependencies([]);
590
+ const adapter = this.createRouteRenderOrchestratorAdapter();
591
+ const renderOptions = await this.prepareRenderOptions(options, adapter);
592
+ return this.routeRenderOrchestrator.executePrepared(renderOptions, adapter);
782
593
  });
783
- const transformedResponse = await this.htmlTransformer.transform(
784
- new Response(html, {
785
- headers: { "Content-Type": "text/html" }
786
- }),
787
- htmlContributions
788
- );
789
- return await transformedResponse.text();
790
594
  }
791
595
  /**
792
596
  * Returns document-level attributes to stamp onto the rendered `<html>` tag.
@@ -797,6 +601,12 @@ class IntegrationRenderer {
797
601
  getDocumentAttributes(_renderOptions) {
798
602
  return void 0;
799
603
  }
604
+ applyAttributesToFirstBodyElement(html, attributes) {
605
+ return this.htmlTransformer.applyAttributesToFirstBodyElement(html, attributes);
606
+ }
607
+ applyAttributesToHtmlElement(html, attributes) {
608
+ return this.htmlTransformer.applyAttributesToHtmlElement(html, attributes);
609
+ }
800
610
  /**
801
611
  * Returns declarative HTML fragments that core should inject into the final document.
802
612
  *
@@ -809,34 +619,6 @@ class IntegrationRenderer {
809
619
  getHtmlDocumentContributions(_options) {
810
620
  return void 0;
811
621
  }
812
- /**
813
- * Returns a renderer instance for a given integration name.
814
- *
815
- * Uses a per-execution cache to avoid repeated renderer initialization.
816
- *
817
- * @param integrationName Target integration name.
818
- * @param cache Render-pass renderer cache.
819
- * @returns Renderer for the requested integration.
820
- * @throws Error when no integration plugin matches `integrationName`.
821
- */
822
- getIntegrationRendererForName(integrationName, cache) {
823
- if (cache.has(integrationName)) {
824
- return cache.get(integrationName);
825
- }
826
- if (integrationName === this.name) {
827
- cache.set(integrationName, this);
828
- return this;
829
- }
830
- const integrationPlugin = this.appConfig.integrations.find(
831
- (integration) => integration.name === integrationName
832
- );
833
- invariant(!!integrationPlugin, `[ecopages] Integration not found for foreign owner: ${integrationName}`);
834
- const renderer = integrationPlugin.initializeRenderer({
835
- rendererModules: this.appConfig.runtime?.rendererModuleContext
836
- });
837
- cache.set(integrationName, renderer);
838
- return renderer;
839
- }
840
622
  /**
841
623
  * Renders one component under this integration's foreign-child runtime and resolves
842
624
  * any nested foreign children captured during that render.
@@ -856,25 +638,16 @@ class IntegrationRenderer {
856
638
  renderInput,
857
639
  rendererCache
858
640
  }),
859
- getOwningRenderer: (integrationName, rendererCache) => this.getIntegrationRendererForName(integrationName, rendererCache)
641
+ getOwningRenderer: (integrationName, rendererCache) => resolveOwningIntegrationRenderer({
642
+ appConfig: this.appConfig,
643
+ runtimeOrigin: this.runtimeOrigin,
644
+ currentIntegrationName: this.name,
645
+ currentRenderer: this,
646
+ integrationName,
647
+ cache: rendererCache
648
+ })
860
649
  });
861
650
  }
862
- /**
863
- * Compatibility foreign-subtree contract that exposes a narrower payload shape for
864
- * future route-composition work while preserving the current
865
- * `renderComponentWithForeignChildren()` runtime semantics.
866
- */
867
- async renderForeignSubtree(input) {
868
- const result = await this.renderComponentWithForeignChildren(input);
869
- return {
870
- html: result.html,
871
- assets: result.assets ?? [],
872
- rootTag: result.rootTag,
873
- rootAttributes: result.rootAttributes,
874
- attachmentPolicy: result.canAttachAttributes ? { kind: "first-element" } : { kind: "none" },
875
- integrationName: result.integrationName
876
- };
877
- }
878
651
  normalizeComponentRenderOutput(result) {
879
652
  const normalizedHtml = this.normalizeUnresolvedMarkerArtifactHtml(result.html);
880
653
  return normalizedHtml === result.html ? result : {
@@ -893,21 +666,7 @@ class IntegrationRenderer {
893
666
  * directly without paying the queue orchestration cost.
894
667
  */
895
668
  hasForeignChildDescendants(component) {
896
- const stack = [component];
897
- const seen = /* @__PURE__ */ new Set();
898
- while (stack.length > 0) {
899
- const current = stack.pop();
900
- if (!current || seen.has(current)) {
901
- continue;
902
- }
903
- seen.add(current);
904
- const integrationName = current.config?.integration ?? current.config?.__eco?.integration;
905
- if (integrationName && integrationName !== this.name) {
906
- return true;
907
- }
908
- stack.push(...current.config?.dependencies?.components ?? []);
909
- }
910
- return false;
669
+ return hasForeignChildDescendantsInGraph(component, this.name);
911
670
  }
912
671
  /**
913
672
  * Render a single component and return structured output for orchestration paths.
@@ -973,9 +732,11 @@ class IntegrationRenderer {
973
732
  * context or a different foreign-child execution strategy.
974
733
  */
975
734
  createForeignChildRuntime(options) {
976
- return this.createQueuedForeignSubtreeExecutionRuntime({
735
+ return this.foreignSubtreeExecutionService.createQueuedRuntime({
977
736
  renderInput: options.renderInput,
978
- rendererCache: options.rendererCache
737
+ rendererCache: options.rendererCache,
738
+ runtimeContextKey: getForeignSubtreeResolutionContextKey(this.name),
739
+ tokenPrefix: getForeignSubtreeTokenPrefix(this.name)
979
740
  });
980
741
  }
981
742
  /**