@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
@@ -1,12 +1,24 @@
1
- import type { EcoBuildPlugin } from '../build/build-types.js';
1
+ import type { EcoBuildPlugin } from '../build/contracts/build-types.js';
2
2
  import type { EcoPagesAppConfig } from '../types/internal-types.js';
3
3
  export interface EcoSourceTransformResult {
4
4
  code: string;
5
5
  map?: unknown;
6
6
  }
7
+ /**
8
+ * Bundler-neutral source transform registered on {@link EcoPagesAppConfig.sourceTransforms}.
9
+ *
10
+ * @remarks
11
+ * Prefer this shape over a competing {@link EcoBuildPlugin} `onLoad` handler when
12
+ * the transform only rewrites module source. Browser/HMR builds run source
13
+ * transforms after first-wins `onLoad` plugins, so metadata injection and similar
14
+ * passes still run on rewritten output from boundary/runtime plugins.
15
+ */
7
16
  export interface EcoSourceTransform {
17
+ /** Stable transform name. Also used to dedupe loader plugins in browser builds. */
8
18
  name: string;
19
+ /** File-path filter tested against {@link normalizeTransformId | normalized ids}. */
9
20
  filter: RegExp;
21
+ /** Runs before default transforms, or after them when set to `post`. */
10
22
  enforce?: 'pre' | 'post';
11
23
  transform(code: string, id: string): EcoSourceTransformResult | string | undefined;
12
24
  }
@@ -24,8 +36,27 @@ export declare function normalizeTransformId(id: string): string;
24
36
  * Applies one source transform if the normalized id matches its filter.
25
37
  */
26
38
  export declare function applySourceTransform(transform: EcoSourceTransform, code: string, id: string): EcoSourceTransformResult | string | undefined;
39
+ /**
40
+ * Applies app-owned source transforms in deterministic `pre` → default → `post` order.
41
+ *
42
+ * @remarks
43
+ * Used by the Rolldown plugin bridge after `onLoad` plugins produce final module
44
+ * contents. Transforms that do not match `filter` are skipped; matching transforms
45
+ * are chained left-to-right on the current source string.
46
+ *
47
+ * @param transforms - App-owned transforms, usually from {@link getAppSourceTransforms}.
48
+ * @param code - Current module source.
49
+ * @param id - Module id forwarded to each transform after query/hash normalization.
50
+ * @returns The transformed source, or the original `code` when no transform matches.
51
+ */
52
+ export declare function applySourceTransforms(transforms: readonly EcoSourceTransform[], code: string, id: string): string;
27
53
  /**
28
54
  * Adapts a source transform into the existing Ecopages build-plugin contract.
55
+ *
56
+ * @remarks
57
+ * Server-oriented builds and loader registration still use this adapter.
58
+ * Browser/HMR builds should register the transform in `appConfig.sourceTransforms`
59
+ * instead so the Rolldown bridge can run it after competing `onLoad` plugins.
29
60
  */
30
61
  export declare function createEcoBuildPluginFromSourceTransform(transform: EcoSourceTransform): EcoBuildPlugin;
31
62
  /**
@@ -13,6 +13,27 @@ function applySourceTransform(transform, code, id) {
13
13
  }
14
14
  return transform.transform(code, normalizedId);
15
15
  }
16
+ const SOURCE_TRANSFORM_ENFORCE_ORDER = {
17
+ pre: 0,
18
+ default: 1,
19
+ post: 2
20
+ };
21
+ function getSourceTransformEnforceOrder(transform) {
22
+ return SOURCE_TRANSFORM_ENFORCE_ORDER[transform.enforce ?? "default"];
23
+ }
24
+ function applySourceTransforms(transforms, code, id) {
25
+ let current = code;
26
+ for (const transform of [...transforms].sort(
27
+ (left, right) => getSourceTransformEnforceOrder(left) - getSourceTransformEnforceOrder(right)
28
+ )) {
29
+ const result = applySourceTransform(transform, current, id);
30
+ if (!result) {
31
+ continue;
32
+ }
33
+ current = typeof result === "string" ? result : result.code;
34
+ }
35
+ return current;
36
+ }
16
37
  function inferLoaderFromPath(filePath) {
17
38
  const extension = path.extname(filePath).toLowerCase();
18
39
  switch (extension) {
@@ -56,13 +77,14 @@ function createVitePluginFromSourceTransform(transform) {
56
77
  };
57
78
  }
58
79
  function getAppSourceTransforms(appConfig) {
59
- return Array.from(appConfig.sourceTransforms.values());
80
+ return appConfig.sourceTransforms ? Array.from(appConfig.sourceTransforms.values()) : [];
60
81
  }
61
82
  function createVitePluginsFromAppSourceTransforms(appConfig) {
62
83
  return getAppSourceTransforms(appConfig).map((transform) => createVitePluginFromSourceTransform(transform));
63
84
  }
64
85
  export {
65
86
  applySourceTransform,
87
+ applySourceTransforms,
66
88
  createEcoBuildPluginFromSourceTransform,
67
89
  createVitePluginFromSourceTransform,
68
90
  createVitePluginsFromAppSourceTransforms,
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Loads `compilerOptions.paths` keys from tsconfig, following `extends` recursively.
3
+ */
4
+ export declare function loadTsconfigPathPrefixes(projectRoot: string): string[];
5
+ export declare function matchesTsconfigPathPrefix(specifier: string, prefixes: readonly string[]): boolean;
6
+ /**
7
+ * Returns true when `specifier` looks like a bare npm package import rather than
8
+ * a relative path, absolute path, node built-in, tsconfig alias, or `#` import map.
9
+ */
10
+ export declare function isBarePackageImportSpecifier(specifier: string, projectRoot?: string): boolean;
11
+ /**
12
+ * Resolves a relative or tsconfig path alias import (via oxc-resolver).
13
+ */
14
+ export declare function resolveProjectModulePath(projectRoot: string, fromFile: string, specifier: string): string | undefined;
15
+ /**
16
+ * Resolves a TS path alias import using the app's tsconfig `paths` (via oxc-resolver).
17
+ */
18
+ export declare function resolveProjectImportPath(projectRoot: string, fromFile: string, specifier: string): string | undefined;
@@ -0,0 +1,159 @@
1
+ import { existsSync, readFileSync, realpathSync } from "node:fs";
2
+ import path from "node:path";
3
+ import { ResolverFactory } from "oxc-resolver";
4
+ const RESOLVABLE_EXTENSIONS = [".ts", ".tsx", ".js", ".jsx", ".mjs", ".cjs", ".mdx"];
5
+ const resolverCache = /* @__PURE__ */ new Map();
6
+ const pathPrefixCache = /* @__PURE__ */ new Map();
7
+ function stripJsonComments(source) {
8
+ return source.replace(/\/\*[\s\S]*?\*\//g, "").replace(/^\s*\/\/.*$/gm, "");
9
+ }
10
+ function findTsconfigPath(projectRoot) {
11
+ const candidate = path.join(projectRoot, "tsconfig.json");
12
+ return existsSync(candidate) ? candidate : void 0;
13
+ }
14
+ function readJsonFile(filePath) {
15
+ const source = readFileSync(filePath, "utf8");
16
+ try {
17
+ return JSON.parse(source);
18
+ } catch {
19
+ return JSON.parse(stripJsonComments(source));
20
+ }
21
+ }
22
+ function loadTsconfigPathPrefixes(projectRoot) {
23
+ const cached = pathPrefixCache.get(projectRoot);
24
+ if (cached) {
25
+ return cached;
26
+ }
27
+ const tsconfigPath = findTsconfigPath(projectRoot);
28
+ if (!tsconfigPath) {
29
+ pathPrefixCache.set(projectRoot, []);
30
+ return [];
31
+ }
32
+ const prefixes = /* @__PURE__ */ new Set();
33
+ const visited = /* @__PURE__ */ new Set();
34
+ const collectFromConfig = (configPath) => {
35
+ const normalized = path.resolve(configPath);
36
+ if (visited.has(normalized)) {
37
+ return;
38
+ }
39
+ visited.add(normalized);
40
+ let config;
41
+ try {
42
+ config = readJsonFile(normalized);
43
+ } catch {
44
+ return;
45
+ }
46
+ if (typeof config.extends === "string") {
47
+ const parentPath = path.resolve(path.dirname(normalized), config.extends);
48
+ collectFromConfig(parentPath);
49
+ }
50
+ for (const key of Object.keys(config.compilerOptions?.paths ?? {})) {
51
+ if (key.endsWith("/*")) {
52
+ prefixes.add(key.slice(0, -1));
53
+ continue;
54
+ }
55
+ if (key.endsWith("*")) {
56
+ prefixes.add(key.slice(0, -1));
57
+ continue;
58
+ }
59
+ prefixes.add(key);
60
+ }
61
+ };
62
+ collectFromConfig(tsconfigPath);
63
+ const resolvedPrefixes = [...prefixes];
64
+ pathPrefixCache.set(projectRoot, resolvedPrefixes);
65
+ return resolvedPrefixes;
66
+ }
67
+ function matchesTsconfigPathPrefix(specifier, prefixes) {
68
+ return prefixes.some((prefix) => {
69
+ if (prefix.endsWith("/")) {
70
+ return specifier.startsWith(prefix);
71
+ }
72
+ return specifier === prefix || specifier.startsWith(`${prefix}/`);
73
+ });
74
+ }
75
+ function isBarePackageImportSpecifier(specifier, projectRoot) {
76
+ if (specifier.startsWith(".") || path.isAbsolute(specifier) || specifier.startsWith("/")) {
77
+ return false;
78
+ }
79
+ if (specifier.startsWith("node:") || specifier.startsWith("#") || specifier.includes(":")) {
80
+ return false;
81
+ }
82
+ if (projectRoot && matchesTsconfigPathPrefix(specifier, loadTsconfigPathPrefixes(projectRoot))) {
83
+ return false;
84
+ }
85
+ return true;
86
+ }
87
+ function getResolverFactory(projectRoot) {
88
+ const cached = resolverCache.get(projectRoot);
89
+ if (cached) {
90
+ return cached;
91
+ }
92
+ const tsconfigPath = findTsconfigPath(projectRoot);
93
+ if (!tsconfigPath) {
94
+ return void 0;
95
+ }
96
+ const resolver = new ResolverFactory({
97
+ tsconfig: {
98
+ configFile: tsconfigPath
99
+ },
100
+ extensions: [...RESOLVABLE_EXTENSIONS]
101
+ });
102
+ resolverCache.set(projectRoot, resolver);
103
+ return resolver;
104
+ }
105
+ function resolveAliasedBarrelTarget(resolvedPath) {
106
+ if (!path.basename(resolvedPath).startsWith("index.")) {
107
+ return resolvedPath;
108
+ }
109
+ const source = readFileSync(resolvedPath, "utf8").trim();
110
+ const match = source.match(/^export\s+\*\s+from\s+['"]([^'"]+)['"]\s*;?$/);
111
+ if (!match?.[1]?.startsWith(".")) {
112
+ return resolvedPath;
113
+ }
114
+ const targetDir = path.dirname(resolvedPath);
115
+ const targetBase = path.resolve(targetDir, match[1]);
116
+ for (const extension of RESOLVABLE_EXTENSIONS) {
117
+ const candidate = `${targetBase}${extension}`;
118
+ if (existsSync(candidate)) {
119
+ return candidate;
120
+ }
121
+ }
122
+ for (const extension of RESOLVABLE_EXTENSIONS) {
123
+ const candidate = path.join(targetBase, `index${extension}`);
124
+ if (existsSync(candidate)) {
125
+ return candidate;
126
+ }
127
+ }
128
+ return resolvedPath;
129
+ }
130
+ function resolveProjectModulePath(projectRoot, fromFile, specifier) {
131
+ const prefixes = loadTsconfigPathPrefixes(projectRoot);
132
+ const isRelative = specifier.startsWith(".");
133
+ const isPathAlias = matchesTsconfigPathPrefix(specifier, prefixes);
134
+ if (!isRelative && !isPathAlias) {
135
+ return void 0;
136
+ }
137
+ const resolver = getResolverFactory(projectRoot);
138
+ if (!resolver) {
139
+ return void 0;
140
+ }
141
+ const result = resolver.sync(path.dirname(fromFile), specifier);
142
+ if (!result.path) {
143
+ return void 0;
144
+ }
145
+ return resolveAliasedBarrelTarget(realpathSync(result.path));
146
+ }
147
+ function resolveProjectImportPath(projectRoot, fromFile, specifier) {
148
+ if (!matchesTsconfigPathPrefix(specifier, loadTsconfigPathPrefixes(projectRoot))) {
149
+ return void 0;
150
+ }
151
+ return resolveProjectModulePath(projectRoot, fromFile, specifier);
152
+ }
153
+ export {
154
+ isBarePackageImportSpecifier,
155
+ loadTsconfigPathPrefixes,
156
+ matchesTsconfigPathPrefix,
157
+ resolveProjectImportPath,
158
+ resolveProjectModulePath
159
+ };
@@ -33,32 +33,26 @@ flowchart TD
33
33
 
34
34
  ## 2) Route Render Flow
35
35
 
36
- `IntegrationRenderer.execute()` delegates shared route orchestration to `RouteRenderFlow`.
36
+ `IntegrationRenderer.execute()` delegates shared route orchestration to `RouteRenderOrchestrator`.
37
37
 
38
38
  ```mermaid
39
39
  flowchart TD
40
- A[IntegrationRenderer.execute] --> B[RouteRenderFlow.prepareRenderOptions]
40
+ A[IntegrationRenderer.execute] --> B[RouteRenderOrchestrator.prepareRenderOptions]
41
41
  B --> C[resolvePageModule]
42
42
  C --> D[ownershipValidationService.validate]
43
43
  D --> E[resolvePageData]
44
- E --> F[ownershipPlanningService.buildPlan]
45
- F --> G[resolveDependencies]
46
- G --> H[buildPageBrowserGraph]
47
- H --> I{shouldRenderPageComponent?}
48
- I -- Yes --> J[renderPageComponent]
49
- I -- No --> K[skip page-root render]
50
- J --> L[merge component assets]
51
- K --> L
52
- L --> M[collect injector and eager SSR lazy assets]
53
- M --> N[build pagePackage and prepared render options]
54
- N --> O[callbacks.render]
55
- O --> P[capture rendered body as html]
56
- P --> Q[inspect unresolved marker artifacts]
57
- Q --> R{unresolved eco-marker remains?}
58
- R -- Yes --> S[throw unresolved artifact error]
59
- R -- No --> T[stamp root or document attributes when needed]
60
- T --> U[htmlTransformer transform]
61
- U --> V[final body and cache strategy]
44
+ E --> F[ownershipValidationService.validate + throwIfOwnershipInvalid]
45
+ F --> G[resolveDependencies + buildPageBrowserGraph]
46
+ G --> H[collect injector and eager SSR lazy assets]
47
+ H --> I[build pagePackage and prepared render options]
48
+ I --> J[IntegrationRenderer.render via document shell]
49
+ J --> K[capture rendered body as html]
50
+ K --> L[inspect unresolved marker artifacts]
51
+ L --> M{unresolved eco-marker remains?}
52
+ M -- Yes --> N[throw unresolved artifact error]
53
+ M -- No --> O[stamp document attributes when needed]
54
+ O --> P[htmlTransformer transform]
55
+ P --> Q[final body and cache strategy]
62
56
  ```
63
57
 
64
58
  ## 3) Mixed-Integration Render Model
@@ -77,7 +71,7 @@ flowchart TD
77
71
  D -- Yes --> E[render inline]
78
72
  D -- No --> F[delegate to owning renderer]
79
73
  F --> G[owning renderer renderComponentWithForeignChildren]
80
- G --> H[owning renderer renderForeignSubtree when payload form is needed]
74
+ G --> H[owning renderer renderComponentWithForeignChildren mapped via toForeignSubtreeRenderPayload]
81
75
  H --> I[resolved html plus assets and attachment policy]
82
76
  ```
83
77
 
@@ -91,7 +85,7 @@ flowchart TD
91
85
  B -- Yes --> C[return resolved renderer-owned output]
92
86
  B -- No --> D[queue foreign-subtree token]
93
87
  D --> E[finish current render pass]
94
- E --> F[QueuedForeignSubtreeResolutionService resolveQueuedHtml]
88
+ E --> F[ForeignSubtreeExecutionService resolveQueuedHtml]
95
89
  F --> G[resolve nested queued tokens first]
96
90
  G --> H[dispatch foreign subtree to owning renderer]
97
91
  H --> I[merge emitted assets and root attributes]
@@ -121,12 +115,12 @@ flowchart TD
121
115
  The most useful reading order is:
122
116
 
123
117
  1. `route-renderer.ts`
124
- 2. `orchestration/route-render-flow.ts`
118
+ 2. `orchestration/route-pipeline/route-render-orchestrator.ts`
125
119
  3. `orchestration/integration-renderer.ts`
126
- 4. `orchestration/ownership-validation.service.ts`
127
- 5. `orchestration/ownership-planning.service.ts`
128
- 6. `orchestration/component-render-context.ts`
129
- 7. `orchestration/queued-foreign-subtree-resolution.service.ts`
120
+ 4. `orchestration/ownership-graph/ownership-validation.service.ts`
121
+ 5. `orchestration/ownership-graph/component-graph.ts`
122
+ 6. `orchestration/foreign-child/component-render-context.ts`
123
+ 7. `orchestration/foreign-child/foreign-subtree-execution.service.ts`
130
124
  8. `page-loading/page-module-loader.ts`
131
125
  9. `page-loading/dependency-resolver.ts`
132
126
  10. `eco/eco.ts`
@@ -134,12 +128,12 @@ The most useful reading order is:
134
128
  ## 7) Key Files
135
129
 
136
130
  - `packages/core/src/route-renderer/route-renderer.ts`
137
- - `packages/core/src/route-renderer/orchestration/route-render-flow.ts`
131
+ - `packages/core/src/route-renderer/orchestration/route-pipeline/route-render-orchestrator.ts`
138
132
  - `packages/core/src/route-renderer/orchestration/integration-renderer.ts`
139
- - `packages/core/src/route-renderer/orchestration/ownership-validation.service.ts`
140
- - `packages/core/src/route-renderer/orchestration/ownership-planning.service.ts`
141
- - `packages/core/src/route-renderer/orchestration/component-render-context.ts`
142
- - `packages/core/src/route-renderer/orchestration/queued-foreign-subtree-resolution.service.ts`
133
+ - `packages/core/src/route-renderer/orchestration/ownership-graph/ownership-validation.service.ts`
134
+ - `packages/core/src/route-renderer/orchestration/ownership-graph/component-graph.ts`
135
+ - `packages/core/src/route-renderer/orchestration/foreign-child/component-render-context.ts`
136
+ - `packages/core/src/route-renderer/orchestration/foreign-child/foreign-subtree-execution.service.ts`
143
137
  - `packages/core/src/route-renderer/page-loading/page-module-loader.ts`
144
138
  - `packages/core/src/route-renderer/page-loading/dependency-resolver.ts`
145
139
  - `packages/core/src/eco/eco.ts`
@@ -16,18 +16,30 @@ The route renderer layer is responsible for:
16
16
 
17
17
  The architecture is organized around three distinct concepts:
18
18
 
19
- - `ownership`: preparation-time metadata that describes which integration owns each declared component edge
19
+ - `ownership`: declared component dependency metadata validated before render
20
20
  - `foreign child`: a component encountered during render whose owning integration differs from the current integration
21
21
  - `foreign subtree`: the resolved HTML, assets, and root-attachment metadata returned by the owning renderer for that foreign child
22
22
 
23
23
  These concepts intentionally live in different places:
24
24
 
25
- - `ownership-planning.service.ts` builds `ownershipPlan`
26
- - `ownership-validation.service.ts` validates declared foreign ownership up front
25
+ - `ownership-validation.service.ts` validates declared foreign ownership up front and fails the render on misconfiguration
27
26
  - `component-render-context.ts` intercepts foreign children during active component render
28
- - `queued-foreign-subtree-resolution.service.ts` resolves queued foreign subtrees for renderers that cannot hand them off inline
29
- - `integration-renderer.ts` owns renderer-to-renderer delegation and shared shell composition
30
- - `route-render-flow.ts` owns route preparation, final response capture, and unresolved artifact enforcement
27
+ - `foreign-subtree-execution.service.ts` owns mixed-integration execution policy and queued token resolution
28
+ - `document-shell-render.service.ts` composes page, layout, and html template shells with one execution-scoped renderer cache
29
+ - `integration-renderer.ts` owns renderer-to-renderer delegation and integration-specific render hooks
30
+ - `route-render-orchestrator.ts` owns route preparation, final response capture, and unresolved artifact enforcement
31
+
32
+ ## Build-Time JSX vs Runtime Foreign Children
33
+
34
+ Mixed-integration apps use two separate mechanisms:
35
+
36
+ | Layer | Mechanism | Purpose |
37
+ | ------- | ----------------------------------------------------------------- | ---------------------------------------------------------------------------------------- |
38
+ | Build | `getJsxOwnershipPlugins()` / `getHostScopedJsxOwnershipPlugins()` | Prepend `@jsxImportSource` so bundled `.tsx` files compile with the correct JSX runtime |
39
+ | Build | `eco-component-meta-plugin` | Prepends the owning integration pragma when injecting `__eco` metadata into native files |
40
+ | Runtime | `eco.component()` / `eco.embed()` + foreign-child runtime | Hand off cross-integration children during SSR |
41
+
42
+ See [`../build/README.md`](../build/README.md) for the JSX ownership helper split.
31
43
 
32
44
  ## Main Files
33
45
 
@@ -38,13 +50,18 @@ These concepts intentionally live in different places:
38
50
 
39
51
  ### `orchestration/`
40
52
 
41
- - `route-render-flow.ts`: one route render from page-module loading through final HTML output
53
+ Root renderer classes:
54
+
42
55
  - `integration-renderer.ts`: abstract base class for route rendering, explicit view rendering, and foreign-child delegation
43
- - `ownership-planning.service.ts`: declared ownership graph construction
44
- - `ownership-validation.service.ts`: up-front ownership validation for route roots and declared descendants
45
- - `component-render-context.ts`: active render context used by `eco.component()` to intercept foreign children
46
- - `queued-foreign-subtree-resolution.service.ts`: queue resolution for renderers that need token-based foreign-subtree handoff
47
- - `render-output.utils.ts`: unresolved artifact normalization and marker inspection
56
+ - `string-markup-renderer.ts`: shared base for string-markup integrations
57
+
58
+ Domain folders:
59
+
60
+ - `ownership-graph/`: component graph walk/collect and up-front ownership validation
61
+ - `foreign-child/`: active render context, foreign-subtree execution, deferred template serialization
62
+ - `document-shell/`: shared page/layout/html shell composition and attribute stamping helpers
63
+ - `route-pipeline/`: route preparation, final HTML capture, marker-artifact enforcement
64
+ - `page-browser-graph/`: browser asset graph build, session cache, and injector assets
48
65
 
49
66
  ### `page-loading/`
50
67
 
@@ -56,11 +73,11 @@ These concepts intentionally live in different places:
56
73
  The route-render contract is:
57
74
 
58
75
  1. `RouteRendererFactory` selects the owning integration renderer.
59
- 2. `IntegrationRenderer.execute()` delegates preparation and finalization to `RouteRenderFlow`.
60
- 3. `RouteRenderFlow.prepareRenderOptions()` loads the page module, validates ownership, builds `ownershipPlan`, resolves page data, resolves dependencies, and builds the page browser graph.
76
+ 2. `IntegrationRenderer.execute()` delegates preparation and finalization to `RouteRenderOrchestrator`.
77
+ 3. `RouteRenderOrchestrator.prepareRenderOptions()` loads the page module, validates ownership (fail-fast), resolves page data, resolves dependencies, and builds the page browser graph.
61
78
  4. The integration renderer performs page, layout, and document-shell rendering. When it encounters a foreign child, it delegates that child back to the owning renderer.
62
79
  5. If a renderer needs queued handoff, it emits internal foreign-subtree tokens and resolves them before returning final HTML.
63
- 6. `RouteRenderFlow.execute()` captures the final body, rejects unresolved `<eco-marker>` artifacts, stamps root or document attributes when needed, and runs the HTML transformer.
80
+ 6. `RouteRenderOrchestrator.executePrepared()` captures the final body, rejects unresolved `<eco-marker>` artifacts, stamps document attributes when needed, and runs the HTML transformer.
64
81
 
65
82
  Important:
66
83
 
@@ -72,38 +89,28 @@ Important:
72
89
 
73
90
  Mixed-integration component configs must declare every possible foreign child in `config.dependencies.components`.
74
91
 
75
- That declaration is used for two things:
76
-
77
- - `OwnershipValidationService` surfaces missing metadata or unknown integrations before render execution
78
- - `OwnershipPlanningService` records the expected ownership shape in `ownershipPlan`
92
+ `OwnershipValidationService` surfaces missing metadata or unknown integrations during `prepareRenderOptions()` and throws before render execution starts.
79
93
 
80
94
  At runtime, renderers still discover actual foreign children through the active component render context.
81
95
 
82
96
  ## Foreign Subtree Contract
83
97
 
84
- `renderForeignSubtree()` is the compatibility contract for renderer-to-renderer handoff. It returns:
85
-
86
- - `html`
87
- - `assets`
88
- - `rootTag`
89
- - optional `rootAttributes`
90
- - `attachmentPolicy`
91
- - `integrationName`
92
-
93
- `renderComponentWithForeignChildren()` is the higher-level renderer entrypoint. It is responsible for:
98
+ `renderComponentWithForeignChildren()` is the renderer entrypoint for mixed-integration trees. It is responsible for:
94
99
 
95
100
  - reusing the execution-scoped owning-renderer cache
96
101
  - deciding whether the current component can stay local
97
102
  - creating a foreign-child runtime when nested foreign ownership must be resolved
98
103
  - normalizing unresolved artifact HTML before the render leaves the renderer
99
104
 
105
+ Queue resolution maps owning-renderer output into the foreign-subtree payload shape via `toForeignSubtreeRenderPayload()` inside `foreign-subtree-execution.service.ts`.
106
+
100
107
  ## Queue Model
101
108
 
102
109
  Not every integration needs queue-based handoff.
103
110
 
104
111
  - If a renderer can resolve a foreign child inline, it returns resolved output immediately.
105
112
  - If it cannot, it may emit internal foreign-subtree tokens and resolve them before returning final HTML.
106
- - The queue service is only for renderer-owned transport inside one render pass. It is not a general route-level fallback mechanism.
113
+ - Queue mechanics live inside `ForeignSubtreeExecutionService`; they are renderer-owned transport inside one render pass, not a general route-level fallback mechanism.
107
114
 
108
115
  ## React Island Notes
109
116
 
@@ -114,5 +121,5 @@ Not every integration needs queue-based handoff.
114
121
 
115
122
  ## Current Limits
116
123
 
117
- - `ownershipPlan` is still diagnostic and preparatory metadata; it does not yet drive a full route-composer execution model.
118
124
  - Different integrations still own different foreign-child runtime strategies, which is intentional where child transport or hydration behavior differs.
125
+ - `integration-renderer.ts` remains the largest integration hook surface even after document-shell extraction.
@@ -0,0 +1,107 @@
1
+ import type { BaseIntegrationContext, ComponentRenderInput, ComponentRenderResult, EcoComponent, PageMetadataProps } from '../../../types/public-types.js';
2
+ import type { ProcessedAsset } from '../../../services/assets/asset-processing-service/index.js';
3
+ import { HtmlTransformerService, type HtmlDocumentContribution } from '../../../services/html/html-transformer.service.js';
4
+ export type DocumentShellLayoutInput = {
5
+ component: EcoComponent;
6
+ props?: Record<string, unknown>;
7
+ };
8
+ export type DocumentShellComposeChildrenContext = {
9
+ primaryComponent: EcoComponent;
10
+ primaryProps: Record<string, unknown>;
11
+ primaryRender?: ComponentRenderResult;
12
+ layouts: DocumentShellLayoutInput[];
13
+ rendererCache: BaseIntegrationContext['rendererCache'];
14
+ renderComponentWithForeignChildren: DocumentShellRenderDependencies['renderComponentWithForeignChildren'];
15
+ };
16
+ export type DocumentShellComposeChildrenResult = {
17
+ /** Serialized or element children passed to the HTML template shell. */
18
+ children: unknown;
19
+ layoutRenders: ComponentRenderResult[];
20
+ /**
21
+ * Primary/page render assets when the hook performs unified composition.
22
+ *
23
+ * @remarks
24
+ * Omit only when the default sequential string path runs (core renders primary first).
25
+ */
26
+ primaryRender?: ComponentRenderResult;
27
+ };
28
+ /**
29
+ * Optional hook that replaces default sequential string layout wrapping.
30
+ *
31
+ * @remarks
32
+ * When provided, core skips the initial primary render and expects the hook to return
33
+ * `children` for the HTML template. Supply `primaryRender` so dependency assets still merge.
34
+ */
35
+ export type DocumentShellComposeChildrenHook = (context: DocumentShellComposeChildrenContext) => Promise<DocumentShellComposeChildrenResult>;
36
+ export type DocumentShellComposeInput = {
37
+ primaryComponent: EcoComponent;
38
+ primaryProps: Record<string, unknown>;
39
+ layout?: DocumentShellLayoutInput;
40
+ layouts?: DocumentShellLayoutInput[];
41
+ composeChildren?: DocumentShellComposeChildrenHook;
42
+ htmlTemplate: EcoComponent;
43
+ documentProps: Record<string, unknown>;
44
+ };
45
+ export type DocumentShellPageRenderInput = {
46
+ page: {
47
+ component: EcoComponent;
48
+ props: Record<string, unknown>;
49
+ };
50
+ layout?: DocumentShellLayoutInput;
51
+ layouts?: DocumentShellLayoutInput[];
52
+ composeChildren?: DocumentShellComposeChildrenHook;
53
+ htmlTemplate: EcoComponent;
54
+ metadata: PageMetadataProps;
55
+ pageProps: Record<string, unknown>;
56
+ documentProps?: Record<string, unknown>;
57
+ transformDocumentHtml?: (html: string) => string;
58
+ };
59
+ export type DocumentShellRenderDependencies = {
60
+ renderComponentWithForeignChildren(input: ComponentRenderInput): Promise<ComponentRenderResult>;
61
+ appendProcessedDependencies(...assetGroups: Array<readonly ProcessedAsset[] | undefined>): ProcessedAsset[];
62
+ };
63
+ export type DocumentShellAttributeStamping = {
64
+ applyAttributesToFirstBodyElement(html: string, attributes: Record<string, string>): string;
65
+ applyAttributesToHtmlElement(html: string, attributes: Record<string, string>): string;
66
+ };
67
+ /**
68
+ * Default sequential string-child composition for document shell layers.
69
+ */
70
+ export declare function composeSequentialLayoutChildren(context: DocumentShellComposeChildrenContext): Promise<DocumentShellComposeChildrenResult>;
71
+ /**
72
+ * Composes page or view content through optional layout and document shells.
73
+ *
74
+ * One execution-scoped renderer cache is threaded through every shell layer so
75
+ * repeated foreign delegation reuses initialized renderers within one render pass.
76
+ */
77
+ export declare function composeDocumentShell(dependencies: DocumentShellRenderDependencies, input: DocumentShellComposeInput): Promise<{
78
+ documentHtml: string;
79
+ }>;
80
+ /**
81
+ * Applies optional component-root and document-root attribute stamping before HTML
82
+ * transformation runs on explicit renderer-owned paths.
83
+ */
84
+ export declare function applyDocumentShellAttributeStamping(html: string, stamping: DocumentShellAttributeStamping, options: {
85
+ componentRootAttributes?: Record<string, string>;
86
+ documentAttributes?: Record<string, string>;
87
+ }): string;
88
+ /**
89
+ * Builds the final serialized document HTML for one route page render.
90
+ */
91
+ export declare function renderPageDocumentShell(dependencies: DocumentShellRenderDependencies, input: DocumentShellPageRenderInput, docType: string): Promise<string>;
92
+ /**
93
+ * Finalizes already-resolved HTML for explicit renderer-owned paths.
94
+ *
95
+ * @remarks
96
+ * Callers append renderer bootstrap dependencies before invoking this helper.
97
+ * Stamps document/root attributes and runs HTML transformation after nested
98
+ * foreign-subtree resolution without routing back through shared route execution.
99
+ */
100
+ export declare function finalizeDocumentShellHtml(htmlTransformer: HtmlTransformerService, options: {
101
+ html: string;
102
+ partial?: boolean;
103
+ componentRootAttributes?: Record<string, string>;
104
+ documentAttributes?: Record<string, string>;
105
+ transformHtml?: boolean;
106
+ htmlContributions?: HtmlDocumentContribution[];
107
+ }): Promise<string>;