@ecopages/core 0.2.0-beta.9 → 0.2.0-rc.0

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 (624) hide show
  1. package/README.md +42 -13
  2. package/package.json +360 -57
  3. package/src/adapters/README.md +6 -2
  4. package/src/adapters/abstract/application-adapter.d.ts +57 -5
  5. package/src/adapters/abstract/application-adapter.js +261 -203
  6. package/src/adapters/abstract/router-adapter.js +12 -4
  7. package/src/adapters/abstract/segment-path-matcher.d.ts +6 -0
  8. package/src/adapters/abstract/segment-path-matcher.js +147 -0
  9. package/src/adapters/abstract/server-adapter.d.ts +13 -2
  10. package/src/adapters/abstract/server-adapter.js +22 -14
  11. package/src/adapters/abstract/ws-pattern-matcher.d.ts +2 -50
  12. package/src/adapters/abstract/ws-pattern-matcher.js +24 -57
  13. package/src/adapters/bun/bun-user-websocket-lifecycle.js +93 -0
  14. package/src/adapters/bun/client-bridge.js +51 -50
  15. package/src/adapters/bun/create-app.d.ts +4 -6
  16. package/src/adapters/bun/create-app.js +169 -154
  17. package/src/adapters/bun/hmr-manager.d.ts +2 -3
  18. package/src/adapters/bun/hmr-manager.js +62 -57
  19. package/src/adapters/bun/index.d.ts +1 -1
  20. package/src/adapters/bun/index.js +2 -8
  21. package/src/adapters/bun/runtime-host.d.ts +1 -1
  22. package/src/adapters/bun/runtime-host.js +61 -54
  23. package/src/adapters/bun/server-adapter.d.ts +34 -53
  24. package/src/adapters/bun/server-adapter.js +557 -637
  25. package/src/adapters/bun/static-preview-host.d.ts +1 -1
  26. package/src/adapters/bun/static-preview-host.js +43 -41
  27. package/src/adapters/create-app.d.ts +1 -12
  28. package/src/adapters/create-app.js +11 -72
  29. package/src/adapters/index.d.ts +2 -2
  30. package/src/adapters/index.js +2 -8
  31. package/src/adapters/node/create-app.d.ts +4 -3
  32. package/src/adapters/node/create-app.js +123 -98
  33. package/src/adapters/node/http-request-bridge.js +147 -106
  34. package/src/adapters/node/node-client-bridge.js +62 -64
  35. package/src/adapters/node/node-hmr-manager.d.ts +2 -3
  36. package/src/adapters/node/node-hmr-manager.js +58 -48
  37. package/src/adapters/node/runtime-host.d.ts +1 -1
  38. package/src/adapters/node/runtime-host.js +96 -89
  39. package/src/adapters/node/server-adapter-dependencies.js +18 -17
  40. package/src/adapters/node/server-adapter.d.ts +28 -8
  41. package/src/adapters/node/server-adapter.js +349 -302
  42. package/src/adapters/node/static-content-server.js +172 -186
  43. package/src/adapters/node/static-preview-host.d.ts +1 -1
  44. package/src/adapters/node/static-preview-host.js +88 -64
  45. package/src/adapters/shared/hmr/dev-transform-entrypoint-registry.d.ts +16 -0
  46. package/src/adapters/shared/hmr/dev-transform-entrypoint-registry.js +32 -0
  47. package/src/adapters/shared/{hmr-html-response.d.ts → hmr/hmr-html-response.d.ts} +2 -2
  48. package/src/adapters/shared/hmr/hmr-html-response.js +50 -0
  49. package/src/adapters/shared/hmr/shared-hmr-manager.d.ts +92 -0
  50. package/src/adapters/shared/hmr/shared-hmr-manager.js +446 -0
  51. package/src/adapters/shared/http/api-request-pipeline.d.ts +23 -0
  52. package/src/adapters/shared/http/api-request-pipeline.js +132 -0
  53. package/src/adapters/shared/{api-response.d.ts → http/api-response.d.ts} +1 -1
  54. package/src/adapters/shared/http/api-response.js +79 -0
  55. package/src/adapters/shared/http/create-body-response.d.ts +12 -0
  56. package/src/adapters/shared/http/create-body-response.js +26 -0
  57. package/src/adapters/shared/http/define-api-handler.d.ts +90 -0
  58. package/src/adapters/shared/http/define-api-handler.js +49 -0
  59. package/src/adapters/shared/{explicit-static-render-preparation.d.ts → http/explicit-static-render-preparation.d.ts} +3 -3
  60. package/src/adapters/shared/http/explicit-static-render-preparation.js +29 -0
  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/http/explicit-static-route-matcher.js +59 -0
  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/http/file-route-middleware-pipeline.js +84 -0
  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/http/fs-server-response-factory.js +106 -0
  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/http/fs-server-response-matcher.js +260 -0
  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/runtime/application-adapter.js +75 -0
  73. package/src/adapters/shared/runtime/collect-dev-prewarm-plan.d.ts +11 -0
  74. package/src/adapters/shared/runtime/collect-dev-prewarm-plan.js +29 -0
  75. package/src/adapters/shared/runtime/copy-runtime-public-dir.js +27 -0
  76. package/src/adapters/shared/runtime/dev-static-route-prewarm.d.ts +16 -0
  77. package/src/adapters/shared/runtime/dev-static-route-prewarm.js +66 -0
  78. package/src/adapters/shared/runtime/port-manager.d.ts +116 -0
  79. package/src/adapters/shared/runtime/port-manager.js +226 -0
  80. package/src/adapters/shared/{render-context.d.ts → runtime/render-context.d.ts} +2 -2
  81. package/src/adapters/shared/runtime/render-context.js +99 -0
  82. package/src/adapters/shared/{runtime-app-bootstrap.d.ts → runtime/runtime-app-bootstrap.d.ts} +4 -2
  83. package/src/adapters/shared/runtime/runtime-app-bootstrap.js +38 -0
  84. package/src/adapters/shared/runtime/runtime-server-lifecycle.d.ts +45 -0
  85. package/src/adapters/shared/runtime/runtime-server-lifecycle.js +71 -0
  86. package/src/adapters/shared/{server-adapter.d.ts → runtime/server-adapter.d.ts} +31 -50
  87. package/src/adapters/shared/runtime/server-adapter.js +301 -0
  88. package/src/adapters/shared/{server-route-handler.d.ts → runtime/server-route-handler.d.ts} +6 -33
  89. package/src/adapters/shared/runtime/server-route-handler.js +77 -0
  90. package/src/adapters/shared/{server-static-builder.d.ts → runtime/server-static-builder.d.ts} +26 -31
  91. package/src/adapters/shared/runtime/server-static-builder.js +172 -0
  92. package/src/adapters/shared/{static-preview-host.d.ts → runtime/static-preview-host.d.ts} +6 -1
  93. package/src/adapters/shared/{node-http-websocket-upgrades.d.ts → ws/node-http-websocket-upgrades.d.ts} +1 -1
  94. package/src/adapters/shared/ws/node-http-websocket-upgrades.js +109 -0
  95. package/src/adapters/shared/ws/websocket-lifecycle.d.ts +24 -0
  96. package/src/adapters/shared/ws/websocket-lifecycle.js +62 -0
  97. package/src/build/README.md +165 -45
  98. package/src/build/app-build-manifest-runtime.d.ts +39 -0
  99. package/src/build/app-build-manifest-runtime.js +145 -0
  100. package/src/build/{browser-runtime-manifest.d.ts → browser/browser-runtime-manifest.d.ts} +4 -0
  101. package/src/build/browser/browser-runtime-manifest.js +65 -0
  102. package/src/build/{browser-runtime-plugin-helpers.d.ts → browser/browser-runtime-plugin-helpers.d.ts} +3 -5
  103. package/src/build/browser/browser-runtime-plugin-helpers.js +32 -0
  104. package/src/build/{browser-runtime-plugin.d.ts → browser/browser-runtime-plugin.d.ts} +12 -13
  105. package/src/build/browser/browser-runtime-plugin.js +218 -0
  106. package/src/build/browser/jsx-ownership-plugins.d.ts +24 -0
  107. package/src/build/browser/jsx-ownership-plugins.js +55 -0
  108. package/src/build/browser/lit-static-render-worker-context.d.ts +2 -0
  109. package/src/build/browser/lit-static-render-worker-context.js +4 -0
  110. package/src/build/build-adapter.d.ts +25 -355
  111. package/src/build/build-adapter.js +258 -265
  112. package/src/build/{build-input-fingerprint.d.ts → cache/build-input-fingerprint.d.ts} +3 -3
  113. package/src/build/cache/build-input-fingerprint.js +33 -0
  114. package/src/build/cache/cache-constants.d.ts +4 -0
  115. package/src/build/cache/cache-constants.js +4 -0
  116. package/src/build/cache/cache-keys.d.ts +22 -0
  117. package/src/build/cache/cache-keys.js +71 -0
  118. package/src/build/{pages-unified-graph-build.d.ts → cache/pages-unified-graph-build.d.ts} +1 -1
  119. package/src/build/cache/pages-unified-graph-build.js +199 -0
  120. package/src/build/cache/production-build-cache.d.ts +21 -0
  121. package/src/build/cache/production-build-cache.js +56 -0
  122. package/src/build/{server-entry-build-cache.d.ts → cache/server-entry-build-cache.d.ts} +3 -4
  123. package/src/build/cache/server-entry-build-cache.js +153 -0
  124. package/src/build/contracts/build-contracts.d.ts +96 -0
  125. package/src/build/contracts/build-contracts.js +1 -0
  126. package/src/build/contracts/build-manifest.d.ts +90 -0
  127. package/src/build/contracts/build-manifest.js +64 -0
  128. package/src/build/contracts/build-types.js +1 -0
  129. package/src/build/contracts/content-virtual-modules.d.ts +12 -0
  130. package/src/build/contracts/content-virtual-modules.js +29 -0
  131. package/src/build/{rolldown-adapter-helpers.d.ts → rolldown/rolldown-adapter-helpers.d.ts} +32 -9
  132. package/src/build/rolldown/rolldown-adapter-helpers.js +463 -0
  133. package/src/build/{rolldown-build-adapter.d.ts → rolldown/rolldown-build-adapter.d.ts} +3 -7
  134. package/src/build/rolldown/rolldown-build-adapter.js +57 -0
  135. package/src/build/{rolldown-build-invocation-metrics.d.ts → rolldown/rolldown-build-invocation-metrics.d.ts} +1 -1
  136. package/src/build/rolldown/rolldown-build-invocation-metrics.js +39 -0
  137. package/src/build/{rolldown-plugin-bridge.d.ts → rolldown/rolldown-plugin-bridge.d.ts} +7 -2
  138. package/src/build/rolldown/rolldown-plugin-bridge.js +284 -0
  139. package/src/build/{rolldown-source-transform-pass.d.ts → rolldown/rolldown-source-transform-pass.d.ts} +1 -1
  140. package/src/build/rolldown/rolldown-source-transform-pass.js +70 -0
  141. package/src/build/rolldown/runtime-build-output-normalizer.js +253 -0
  142. package/src/build/rolldown/server-side-css-shim-plugin.js +58 -0
  143. package/src/build/runtime/build-profile-options.d.ts +7 -0
  144. package/src/build/runtime/build-profile-options.js +37 -0
  145. package/src/build/runtime/build-request-identity.d.ts +17 -0
  146. package/src/build/runtime/build-request-identity.js +79 -0
  147. package/src/build/runtime/build-request-policy.d.ts +58 -0
  148. package/src/build/runtime/build-request-policy.js +84 -0
  149. package/src/build/runtime/build-runtime.d.ts +28 -0
  150. package/src/build/runtime/build-runtime.js +75 -0
  151. package/src/build/runtime/deduping-build-executor.d.ts +21 -0
  152. package/src/build/runtime/deduping-build-executor.js +40 -0
  153. package/src/build/{parallel-build-executor.d.ts → runtime/parallel-build-executor.d.ts} +1 -1
  154. package/src/build/runtime/parallel-build-executor.js +60 -0
  155. package/src/build/{serialized-build-executor.d.ts → runtime/serialized-build-executor.d.ts} +1 -1
  156. package/src/build/runtime/serialized-build-executor.js +79 -0
  157. package/src/cache/index.d.ts +2 -1
  158. package/src/cache/index.js +7 -6
  159. package/src/cache/module-parse-cache.d.ts +5 -0
  160. package/src/cache/module-parse-cache.js +122 -67
  161. package/src/cache/module-transform-profiler.d.ts +8 -0
  162. package/src/cache/module-transform-profiler.js +8 -0
  163. package/src/client/navigation-scripts/classification.d.ts +16 -0
  164. package/src/client/navigation-scripts/classification.js +49 -0
  165. package/src/client/navigation-scripts/index.d.ts +3 -0
  166. package/src/client/navigation-scripts/index.js +3 -0
  167. package/src/client/navigation-scripts/navigation-scripts.test.browser.d.ts +1 -0
  168. package/src/client/navigation-scripts/navigation-scripts.test.browser.js +61 -0
  169. package/src/client/navigation-scripts/registry.d.ts +11 -0
  170. package/src/client/navigation-scripts/registry.js +16 -0
  171. package/src/client/navigation-scripts/rerun-queue.d.ts +37 -0
  172. package/src/client/navigation-scripts/rerun-queue.js +90 -0
  173. package/src/client/scroll.d.ts +17 -0
  174. package/src/client/scroll.js +33 -0
  175. package/src/client/scroll.test.browser.d.ts +1 -0
  176. package/src/client/scroll.test.browser.js +31 -0
  177. package/src/client/view-transitions.d.ts +32 -0
  178. package/src/client/view-transitions.js +120 -0
  179. package/src/client/view-transitions.test.browser.d.ts +1 -0
  180. package/src/client/view-transitions.test.browser.js +56 -0
  181. package/src/config/README.md +1 -1
  182. package/src/config/config-builder.d.ts +40 -20
  183. package/src/config/config-builder.js +645 -610
  184. package/src/config/constants.d.ts +1 -0
  185. package/src/config/constants.js +44 -23
  186. package/src/declarations.d.ts +1 -0
  187. package/src/dev/README.md +24 -0
  188. package/src/dev/client-bridge-registry.d.ts +5 -0
  189. package/src/dev/client-bridge-registry.js +10 -0
  190. package/src/dev/dev-client-ownership.d.ts +7 -0
  191. package/src/dev/dev-client-ownership.js +8 -0
  192. package/src/dev/hmr-manager-registry.d.ts +8 -0
  193. package/src/dev/hmr-manager-registry.js +10 -0
  194. package/src/dev/host-runtime.d.ts +3 -0
  195. package/src/dev/host-runtime.js +25 -23
  196. package/src/dev/runtime-server-started-message.d.ts +2 -0
  197. package/src/dev/runtime-server-started-message.js +3 -0
  198. package/src/dev/sc-server.js +106 -103
  199. package/src/dev/transform-server/dev-transform-bundler.d.ts +24 -0
  200. package/src/dev/transform-server/dev-transform-bundler.js +79 -0
  201. package/src/dev/transform-server/dev-transform-externalize-plugin.d.ts +12 -0
  202. package/src/dev/transform-server/dev-transform-externalize-plugin.js +29 -0
  203. package/src/dev/transform-server/dev-transform-import-rewriter.d.ts +16 -0
  204. package/src/dev/transform-server/dev-transform-import-rewriter.js +127 -0
  205. package/src/dev/transform-server/dev-transform-module-kind.d.ts +13 -0
  206. package/src/dev/transform-server/dev-transform-module-kind.js +17 -0
  207. package/src/dev/transform-server/dev-transform-runtime-specifiers.d.ts +5 -0
  208. package/src/dev/transform-server/dev-transform-runtime-specifiers.js +16 -0
  209. package/src/dev/transform-server/dev-transform-server.d.ts +41 -0
  210. package/src/dev/transform-server/dev-transform-server.js +191 -0
  211. package/src/dev/transform-server/dev-transform-url.d.ts +13 -0
  212. package/src/dev/transform-server/dev-transform-url.js +58 -0
  213. package/src/dev/transform-server/dev-transform-vendor-registry.d.ts +28 -0
  214. package/src/dev/transform-server/dev-transform-vendor-registry.js +166 -0
  215. package/src/dev/transform-server/index.d.ts +6 -0
  216. package/src/dev/transform-server/index.js +4 -0
  217. package/src/dev/transform-server/types.d.ts +15 -0
  218. package/src/dev/transform-server/types.js +1 -0
  219. package/src/dev-toolbar/README.md +52 -0
  220. package/src/dev-toolbar/define-dev-tool.d.ts +21 -0
  221. package/src/dev-toolbar/define-dev-tool.js +9 -0
  222. package/src/dev-toolbar/dev-toolbar-config.d.ts +25 -0
  223. package/src/dev-toolbar/dev-toolbar-config.js +19 -0
  224. package/src/dev-toolbar/dev-toolbar-host.d.ts +49 -0
  225. package/src/dev-toolbar/dev-toolbar-host.js +117 -0
  226. package/src/dev-toolbar/dev-toolbar-html-response.d.ts +11 -0
  227. package/src/dev-toolbar/dev-toolbar-html-response.js +14 -0
  228. package/src/dev-toolbar/dev-toolbar-manifest-contract.d.ts +22 -0
  229. package/src/dev-toolbar/dev-toolbar-manifest-contract.js +2 -0
  230. package/src/dev-toolbar/dev-toolbar-manifest.d.ts +15 -0
  231. package/src/dev-toolbar/dev-toolbar-manifest.js +52 -0
  232. package/src/dev-toolbar/dev-toolbar-package.d.ts +34 -0
  233. package/src/dev-toolbar/dev-toolbar-package.js +78 -0
  234. package/src/dev-toolbar/dev-toolbar-runtime-paths.d.ts +10 -0
  235. package/src/dev-toolbar/dev-toolbar-runtime-paths.js +13 -0
  236. package/src/diagnostics/request-build-dedupe.d.ts +18 -0
  237. package/src/diagnostics/request-build-dedupe.js +39 -0
  238. package/src/diagnostics/request-pipeline-metrics.d.ts +38 -0
  239. package/src/diagnostics/request-pipeline-metrics.js +121 -0
  240. package/src/diagnostics/startup-trace.d.ts +81 -0
  241. package/src/diagnostics/startup-trace.js +281 -0
  242. package/src/eco/README.md +17 -0
  243. package/src/eco/component-identity.d.ts +13 -0
  244. package/src/eco/component-identity.js +18 -0
  245. package/src/eco/eco-declared-component.d.ts +15 -0
  246. package/src/eco/eco-declared-component.js +23 -0
  247. package/src/eco/eco.browser.js +63 -70
  248. package/src/eco/eco.js +163 -97
  249. package/src/eco/eco.types.d.ts +47 -8
  250. package/src/eco/eco.types.js +5 -0
  251. package/src/eco/eco.utils.d.ts +1 -1
  252. package/src/eco/eco.utils.js +1 -10
  253. package/src/eco/global-injector-map.js +55 -41
  254. package/src/eco/lazy-injector-map.js +90 -60
  255. package/src/eco/module-dependencies.js +52 -44
  256. package/src/eco/page-layout-normalization.d.ts +21 -0
  257. package/src/eco/page-layout-normalization.js +69 -0
  258. package/src/env.d.ts +2 -0
  259. package/src/errors/http-error.d.ts +8 -0
  260. package/src/errors/http-error.js +66 -49
  261. package/src/errors/index.d.ts +1 -0
  262. package/src/errors/index.js +3 -6
  263. package/src/errors/locals-access-error.js +5 -8
  264. package/src/errors/undeclared-component-dependency-error.d.ts +11 -0
  265. package/src/errors/undeclared-component-dependency-error.js +17 -0
  266. package/src/global/app-logger.js +3 -6
  267. package/src/hmr/README.md +21 -0
  268. package/src/hmr/client/hmr-runtime.js +119 -110
  269. package/src/hmr/client/module-update.d.ts +13 -0
  270. package/src/hmr/client/module-update.js +39 -0
  271. package/src/hmr/hmr-asset-paths.d.ts +14 -0
  272. package/src/hmr/hmr-asset-paths.js +22 -0
  273. package/src/hmr/hmr-entrypoint-output.d.ts +21 -0
  274. package/src/hmr/hmr-entrypoint-output.js +34 -0
  275. package/src/hmr/hmr-file-change-prep.d.ts +10 -0
  276. package/src/hmr/hmr-file-change-prep.js +14 -0
  277. package/src/hmr/hmr-registered-entrypoints-context.d.ts +7 -0
  278. package/src/hmr/hmr-registered-entrypoints-context.js +1 -0
  279. package/src/hmr/hmr-runtime-paths.d.ts +10 -0
  280. package/src/hmr/hmr-runtime-paths.js +13 -0
  281. package/src/hmr/hmr-strategy.d.ts +9 -0
  282. package/src/hmr/hmr-strategy.js +113 -42
  283. package/src/hmr/strategies/default-hmr-strategy.js +55 -33
  284. package/src/hmr/strategies/js-hmr-strategy.d.ts +6 -97
  285. package/src/hmr/strategies/js-hmr-strategy.js +107 -167
  286. package/src/hmr/strategies/server-rendered-template-hmr-strategy.d.ts +17 -0
  287. package/src/hmr/strategies/server-rendered-template-hmr-strategy.js +35 -0
  288. package/src/index.browser.d.ts +1 -0
  289. package/src/index.browser.js +2 -4
  290. package/src/index.d.ts +4 -1
  291. package/src/index.js +7 -21
  292. package/src/islands/README.md +25 -0
  293. package/src/islands/island-host.d.ts +37 -0
  294. package/src/islands/island-host.js +55 -0
  295. package/src/plugins/README.md +2 -1
  296. package/src/plugins/alias-resolver-cache.d.ts +6 -9
  297. package/src/plugins/alias-resolver-cache.js +114 -97
  298. package/src/plugins/alias-resolver-plugin.d.ts +3 -3
  299. package/src/plugins/alias-resolver-plugin.js +35 -62
  300. package/src/plugins/define-integration.d.ts +26 -0
  301. package/src/plugins/define-integration.js +20 -0
  302. package/src/plugins/eco-component-meta-plugin.d.ts +6 -102
  303. package/src/plugins/eco-component-meta-plugin.js +123 -162
  304. package/src/plugins/foreign-jsx-override-plugin.d.ts +1 -1
  305. package/src/plugins/foreign-jsx-override-plugin.js +49 -37
  306. package/src/plugins/integration-plugin.d.ts +24 -6
  307. package/src/plugins/integration-plugin.js +212 -195
  308. package/src/plugins/jsx-import-source.utils.d.ts +8 -0
  309. package/src/plugins/jsx-import-source.utils.js +21 -0
  310. package/src/plugins/package-specifier.d.ts +12 -0
  311. package/src/plugins/package-specifier.js +33 -0
  312. package/src/plugins/processor.d.ts +66 -12
  313. package/src/plugins/processor.js +168 -137
  314. package/src/plugins/runtime-capability.js +1 -0
  315. package/src/plugins/source-transform.d.ts +1 -1
  316. package/src/plugins/source-transform.js +109 -79
  317. package/src/plugins/tsconfig-import-resolver.d.ts +37 -0
  318. package/src/plugins/tsconfig-import-resolver.js +262 -0
  319. package/src/route-renderer/GRAPH.md +24 -30
  320. package/src/route-renderer/README.md +52 -32
  321. package/src/route-renderer/orchestration/document-shell/document-shell-render.service.d.ts +107 -0
  322. package/src/route-renderer/orchestration/document-shell/document-shell-render.service.js +155 -0
  323. package/src/route-renderer/orchestration/document-shell/layout-shell-props.service.d.ts +20 -0
  324. package/src/route-renderer/orchestration/document-shell/layout-shell-props.service.js +37 -0
  325. package/src/route-renderer/orchestration/{component-render-context.d.ts → foreign-child/component-render-context.d.ts} +8 -15
  326. package/src/route-renderer/orchestration/foreign-child/component-render-context.js +196 -0
  327. package/src/route-renderer/orchestration/{render-output.utils.d.ts → foreign-child/foreign-child-output.utils.d.ts} +20 -7
  328. package/src/route-renderer/orchestration/foreign-child/foreign-child-output.utils.js +195 -0
  329. package/src/route-renderer/orchestration/{foreign-subtree-execution.service.d.ts → foreign-child/foreign-subtree-execution.service.d.ts} +64 -34
  330. package/src/route-renderer/orchestration/foreign-child/foreign-subtree-execution.service.js +354 -0
  331. package/src/route-renderer/orchestration/foreign-child/owning-renderer-resolution.d.ts +19 -0
  332. package/src/route-renderer/orchestration/foreign-child/owning-renderer-resolution.js +36 -0
  333. package/src/route-renderer/orchestration/integration-renderer.d.ts +37 -153
  334. package/src/route-renderer/orchestration/integration-renderer.js +803 -1008
  335. package/src/route-renderer/orchestration/integration-renderer.test-fixtures.d.ts +75 -0
  336. package/src/route-renderer/orchestration/integration-renderer.test-fixtures.js +173 -0
  337. package/src/route-renderer/orchestration/ownership-graph/component-graph-collectors.d.ts +10 -0
  338. package/src/route-renderer/orchestration/ownership-graph/component-graph-collectors.js +132 -0
  339. package/src/route-renderer/orchestration/ownership-graph/component-graph.d.ts +34 -0
  340. package/src/route-renderer/orchestration/ownership-graph/component-graph.js +89 -0
  341. package/src/route-renderer/orchestration/{ownership-validation.service.d.ts → ownership-graph/ownership-validation.service.d.ts} +6 -2
  342. package/src/route-renderer/orchestration/ownership-graph/ownership-validation.service.js +77 -0
  343. package/src/route-renderer/orchestration/page-browser-graph/global-injector-assets.service.d.ts +7 -0
  344. package/src/route-renderer/orchestration/page-browser-graph/global-injector-assets.service.js +30 -0
  345. package/src/route-renderer/orchestration/page-browser-graph/grouped-graph-build-plan.d.ts +15 -0
  346. package/src/route-renderer/orchestration/page-browser-graph/grouped-graph-build-plan.js +9 -0
  347. package/src/route-renderer/orchestration/page-browser-graph/page-browser-graph-contribution.merge.d.ts +5 -0
  348. package/src/route-renderer/orchestration/page-browser-graph/page-browser-graph-contribution.merge.js +30 -0
  349. package/src/route-renderer/orchestration/page-browser-graph/page-browser-graph-merge.utils.d.ts +12 -0
  350. package/src/route-renderer/orchestration/page-browser-graph/page-browser-graph-merge.utils.js +32 -0
  351. package/src/route-renderer/orchestration/page-browser-graph/page-browser-graph-session.d.ts +126 -0
  352. package/src/route-renderer/orchestration/page-browser-graph/page-browser-graph-session.js +542 -0
  353. package/src/route-renderer/orchestration/page-browser-graph/page-browser-graph.service.d.ts +47 -0
  354. package/src/route-renderer/orchestration/page-browser-graph/page-browser-graph.service.js +248 -0
  355. package/src/route-renderer/orchestration/{processed-asset-dedupe.d.ts → page-browser-graph/processed-asset-dedupe.d.ts} +1 -1
  356. package/src/route-renderer/orchestration/page-browser-graph/processed-asset-dedupe.js +23 -0
  357. package/src/route-renderer/orchestration/page-browser-graph/route-instance-key.d.ts +29 -0
  358. package/src/route-renderer/orchestration/page-browser-graph/route-instance-key.js +54 -0
  359. package/src/route-renderer/orchestration/route-pipeline/integration-route-render-adapter.d.ts +38 -0
  360. package/src/route-renderer/orchestration/route-pipeline/integration-route-render-adapter.js +26 -0
  361. package/src/route-renderer/orchestration/route-pipeline/marker-artifact.utils.d.ts +6 -0
  362. package/src/route-renderer/orchestration/route-pipeline/marker-artifact.utils.js +25 -0
  363. package/src/route-renderer/orchestration/route-pipeline/robots-meta.contribution.d.ts +15 -0
  364. package/src/route-renderer/orchestration/route-pipeline/robots-meta.contribution.js +43 -0
  365. package/src/route-renderer/orchestration/route-pipeline/route-html-finalization.service.d.ts +25 -0
  366. package/src/route-renderer/orchestration/route-pipeline/route-html-finalization.service.js +44 -0
  367. package/src/route-renderer/orchestration/route-pipeline/route-prepared-options.builder.d.ts +26 -0
  368. package/src/route-renderer/orchestration/route-pipeline/route-prepared-options.builder.js +44 -0
  369. package/src/route-renderer/orchestration/route-pipeline/route-prepared-options.utils.d.ts +4 -0
  370. package/src/route-renderer/orchestration/route-pipeline/route-prepared-options.utils.js +30 -0
  371. package/src/route-renderer/orchestration/{route-render-orchestrator.d.ts → route-pipeline/route-render-orchestrator.d.ts} +24 -54
  372. package/src/route-renderer/orchestration/route-pipeline/route-render-orchestrator.js +215 -0
  373. package/src/{integrations/ghtml/ghtml-renderer.d.ts → route-renderer/orchestration/string-markup-renderer.d.ts} +8 -10
  374. package/src/route-renderer/orchestration/string-markup-renderer.js +52 -0
  375. package/src/route-renderer/page-loading/component-dependency-collection.js +121 -121
  376. package/src/route-renderer/page-loading/declared-asset-collection.js +66 -94
  377. package/src/route-renderer/page-loading/dependency-resolver.js +101 -104
  378. package/src/route-renderer/page-loading/ecopages-virtual-imports.d.ts +1 -0
  379. package/src/route-renderer/page-loading/ecopages-virtual-imports.js +64 -51
  380. package/src/route-renderer/page-loading/file-scoped-dependency-components.d.ts +42 -0
  381. package/src/route-renderer/page-loading/file-scoped-dependency-components.js +94 -0
  382. package/src/route-renderer/page-loading/lazy-entry-collection.js +75 -98
  383. package/src/route-renderer/page-loading/lazy-trigger-planning.js +47 -36
  384. package/src/route-renderer/page-loading/module-declaration-aggregation.js +39 -28
  385. package/src/route-renderer/page-loading/module-declaration-scripts.js +10 -15
  386. package/src/route-renderer/page-loading/page-dependency-bundling.js +156 -113
  387. package/src/route-renderer/page-loading/page-module-loader.d.ts +2 -1
  388. package/src/route-renderer/page-loading/page-module-loader.js +136 -124
  389. package/src/route-renderer/page-loading/resolved-page-dependencies.d.ts +12 -0
  390. package/src/route-renderer/page-loading/resolved-page-dependencies.js +38 -0
  391. package/src/route-renderer/route-renderer.js +74 -76
  392. package/src/router/README.md +31 -0
  393. package/src/router/client/link-intent.d.ts +11 -21
  394. package/src/router/client/link-intent.js +56 -30
  395. package/src/router/client/link-intent.test.browser.js +50 -39
  396. package/src/router/client/link-navigation-policy.d.ts +45 -0
  397. package/src/router/client/link-navigation-policy.js +122 -0
  398. package/src/router/client/link-navigation-policy.test.browser.d.ts +1 -0
  399. package/src/router/client/link-navigation-policy.test.browser.js +82 -0
  400. package/src/router/client/navigation-coordinator.d.ts +1 -1
  401. package/src/router/client/navigation-coordinator.js +235 -211
  402. package/src/router/client/navigation-lifecycle.d.ts +55 -0
  403. package/src/router/client/navigation-lifecycle.js +50 -0
  404. package/src/router/client/navigation-lifecycle.test.browser.d.ts +1 -0
  405. package/src/router/client/navigation-lifecycle.test.browser.js +118 -0
  406. package/src/router/server/route-registry.js +237 -242
  407. package/src/services/README.md +5 -0
  408. package/src/services/assets/asset-processing-service/asset-dependency-keys.d.ts +13 -0
  409. package/src/services/assets/asset-processing-service/asset-dependency-keys.js +64 -50
  410. package/src/services/assets/asset-processing-service/asset-processing.service.d.ts +12 -1
  411. package/src/services/assets/asset-processing-service/asset-processing.service.js +335 -268
  412. package/src/services/assets/asset-processing-service/asset.factory.js +78 -81
  413. package/src/services/assets/asset-processing-service/assets.types.d.ts +1 -1
  414. package/src/services/assets/asset-processing-service/assets.types.js +1 -0
  415. package/src/services/assets/asset-processing-service/browser-runtime-asset.factory.d.ts +1 -1
  416. package/src/services/assets/asset-processing-service/browser-runtime-asset.factory.js +57 -46
  417. package/src/services/assets/asset-processing-service/browser-runtime-entry-resolution.d.ts +52 -0
  418. package/src/services/assets/asset-processing-service/browser-runtime-entry-resolution.js +115 -0
  419. package/src/services/assets/asset-processing-service/browser-runtime-entry.factory.js +53 -58
  420. package/src/services/assets/asset-processing-service/finalize-processed-asset.d.ts +3 -0
  421. package/src/services/assets/asset-processing-service/finalize-processed-asset.js +5 -0
  422. package/src/services/assets/asset-processing-service/grouped-content-bundles.d.ts +2 -1
  423. package/src/services/assets/asset-processing-service/grouped-content-bundles.js +85 -60
  424. package/src/services/assets/asset-processing-service/index.d.ts +2 -0
  425. package/src/services/assets/asset-processing-service/index.js +8 -6
  426. package/src/services/assets/asset-processing-service/inline-content-script-body.d.ts +11 -0
  427. package/src/services/assets/asset-processing-service/inline-content-script-body.js +23 -0
  428. package/src/services/assets/asset-processing-service/materialize-content-script-asset.d.ts +9 -0
  429. package/src/services/assets/asset-processing-service/materialize-content-script-asset.js +22 -0
  430. package/src/services/assets/asset-processing-service/page-package.js +70 -72
  431. package/src/services/assets/asset-processing-service/processor.interface.js +7 -5
  432. package/src/services/assets/asset-processing-service/processor.registry.js +11 -14
  433. package/src/services/assets/asset-processing-service/processors/base/base-processor.js +59 -62
  434. package/src/services/assets/asset-processing-service/processors/base/base-script-processor.d.ts +0 -2
  435. package/src/services/assets/asset-processing-service/processors/base/base-script-processor.js +102 -130
  436. package/src/services/assets/asset-processing-service/processors/index.js +5 -5
  437. package/src/services/assets/asset-processing-service/processors/script/content-script.processor.d.ts +8 -0
  438. package/src/services/assets/asset-processing-service/processors/script/content-script.processor.js +111 -111
  439. package/src/services/assets/asset-processing-service/processors/script/file-script.processor.d.ts +0 -1
  440. package/src/services/assets/asset-processing-service/processors/script/file-script.processor.js +95 -94
  441. package/src/services/assets/asset-processing-service/processors/script/node-module-script.processor.js +136 -135
  442. package/src/services/assets/asset-processing-service/processors/stylesheet/content-stylesheet.processor.d.ts +0 -3
  443. package/src/services/assets/asset-processing-service/processors/stylesheet/content-stylesheet.processor.js +26 -57
  444. package/src/services/assets/asset-processing-service/processors/stylesheet/file-stylesheet.processor.d.ts +0 -3
  445. package/src/services/assets/asset-processing-service/processors/stylesheet/file-stylesheet.processor.js +33 -67
  446. package/src/services/assets/asset-processing-service/processors/stylesheet/stylesheet-processor-pipeline.d.ts +2 -0
  447. package/src/services/assets/asset-processing-service/processors/stylesheet/stylesheet-processor-pipeline.js +44 -0
  448. package/src/services/assets/asset-processing-service/resolve-integration-plugin.d.ts +4 -0
  449. package/src/services/assets/asset-processing-service/resolve-integration-plugin.js +15 -0
  450. package/src/services/assets/asset-processing-service/ungrouped-dependency-processing.d.ts +0 -1
  451. package/src/services/assets/asset-processing-service/ungrouped-dependency-processing.js +27 -44
  452. package/src/services/assets/browser-bundle.service.d.ts +27 -31
  453. package/src/services/assets/browser-bundle.service.js +54 -49
  454. package/src/services/assets/browser-runtime-asset-generation.d.ts +17 -0
  455. package/src/services/assets/browser-runtime-asset-generation.js +28 -0
  456. package/src/services/cache/cache.types.d.ts +4 -2
  457. package/src/services/cache/cache.types.js +5 -0
  458. package/src/services/cache/html-page-cache-dependency-index.d.ts +34 -0
  459. package/src/services/cache/html-page-cache-dependency-index.js +88 -0
  460. package/src/services/cache/index.d.ts +2 -0
  461. package/src/services/cache/index.js +8 -7
  462. package/src/services/cache/memory-cache-store.js +101 -89
  463. package/src/services/cache/page-cache-service.d.ts +31 -1
  464. package/src/services/cache/page-cache-service.js +237 -150
  465. package/src/services/cache/page-request-cache-coordinator.service.d.ts +2 -1
  466. package/src/services/cache/page-request-cache-coordinator.service.js +112 -102
  467. package/src/services/html/html-rewriter-provider.service.js +61 -61
  468. package/src/services/html/html-transformer.service.js +249 -266
  469. package/src/services/invalidation/development-invalidation.service.d.ts +15 -1
  470. package/src/services/invalidation/development-invalidation.service.js +241 -204
  471. package/src/services/module-loading/README.md +9 -6
  472. package/src/services/module-loading/app-module-loader.service.js +1 -0
  473. package/src/services/module-loading/app-server-module-transpiler.service.d.ts +8 -0
  474. package/src/services/module-loading/app-server-module-transpiler.service.js +104 -106
  475. package/src/services/module-loading/collection-server-module-build.service.d.ts +19 -0
  476. package/src/services/module-loading/collection-server-module-build.service.js +83 -0
  477. package/src/services/module-loading/host-module-loader-registry.js +6 -11
  478. package/src/services/module-loading/module-loading-types.js +1 -0
  479. package/src/services/module-loading/page-module-import.service.d.ts +7 -12
  480. package/src/services/module-loading/page-module-import.service.js +232 -206
  481. package/src/services/module-loading/route-module-build-cache-registry.d.ts +2 -0
  482. package/src/services/module-loading/route-module-build-cache-registry.js +59 -33
  483. package/src/services/module-loading/route-module-build-cache.js +3 -38
  484. package/src/services/module-loading/route-module-build-cache.store.d.ts +10 -0
  485. package/src/services/module-loading/route-module-build-cache.store.js +213 -196
  486. package/src/services/module-loading/route-module-build-manifest.d.ts +10 -14
  487. package/src/services/module-loading/route-module-build-manifest.js +54 -118
  488. package/src/services/module-loading/route-module-dependency-hasher.d.ts +2 -2
  489. package/src/services/module-loading/route-module-dependency-hasher.js +136 -109
  490. package/src/services/module-loading/server-module-transpiler.service.d.ts +1 -3
  491. package/src/services/module-loading/server-module-transpiler.service.js +65 -62
  492. package/src/services/module-loading/source-module-support.js +15 -7
  493. package/src/services/runtime-state/dev-graph.service.js +165 -157
  494. package/src/services/runtime-state/entrypoint-dependency-graph.service.js +85 -76
  495. package/src/services/runtime-state/server-invalidation-state.service.js +38 -30
  496. package/src/services/validation/schema-validation-service.d.ts +1 -4
  497. package/src/services/validation/schema-validation-service.js +156 -95
  498. package/src/services/validation/standard-schema.types.d.ts +9 -62
  499. package/src/services/validation/standard-schema.types.js +1 -0
  500. package/src/services/validation/validate-standard-schema.d.ts +7 -0
  501. package/src/services/validation/validate-standard-schema.js +14 -0
  502. package/src/static-site-generator/README.md +10 -2
  503. package/src/static-site-generator/production-page-browser-graph-prebuild.d.ts +32 -0
  504. package/src/static-site-generator/production-page-browser-graph-prebuild.js +57 -0
  505. package/src/static-site-generator/sitemap-routes.d.ts +14 -0
  506. package/src/static-site-generator/sitemap-routes.js +36 -0
  507. package/src/static-site-generator/sitemap.d.ts +15 -0
  508. package/src/static-site-generator/sitemap.js +42 -0
  509. package/src/static-site-generator/static-build-invalidation.d.ts +2 -2
  510. package/src/static-site-generator/static-build-invalidation.js +33 -74
  511. package/src/static-site-generator/static-export-context.d.ts +9 -1
  512. package/src/static-site-generator/static-export-context.js +1 -0
  513. package/src/static-site-generator/static-site-generator.d.ts +27 -6
  514. package/src/static-site-generator/static-site-generator.js +528 -389
  515. package/src/types/internal-types.d.ts +55 -17
  516. package/src/types/internal-types.js +1 -0
  517. package/src/types/public-types.d.ts +236 -95
  518. package/src/types/public-types.js +1 -0
  519. package/src/utils/deep-merge.js +39 -26
  520. package/src/utils/ecopages-route-info.d.ts +26 -0
  521. package/src/utils/ecopages-route-info.js +30 -0
  522. package/src/utils/hash.js +3 -6
  523. package/src/utils/html-escaping.d.ts +7 -0
  524. package/src/utils/html-escaping.js +22 -5
  525. package/src/utils/invariant.js +11 -10
  526. package/src/utils/locals-utils.js +32 -22
  527. package/src/utils/parse-cli-args.d.ts +1 -0
  528. package/src/utils/parse-cli-args.js +73 -62
  529. package/src/utils/path-pattern.d.ts +23 -0
  530. package/src/utils/path-pattern.js +42 -0
  531. package/src/utils/path-utils.module.js +8 -11
  532. package/src/utils/resolve-entry-file.js +70 -38
  533. package/src/utils/resolve-work-dir.js +23 -27
  534. package/src/utils/runtime.js +24 -33
  535. package/src/utils/server-utils.module.d.ts +3 -2
  536. package/src/utils/server-utils.module.js +60 -53
  537. package/src/utils/static-file-extensions.d.ts +12 -0
  538. package/src/utils/static-file-extensions.js +54 -0
  539. package/src/watchers/project-watcher-ignore.d.ts +11 -0
  540. package/src/watchers/project-watcher-ignore.js +17 -0
  541. package/src/watchers/project-watcher.d.ts +21 -6
  542. package/src/watchers/project-watcher.js +402 -277
  543. package/src/watchers/project-watcher.test-helpers.js +45 -50
  544. package/src/adapters/shared/api-response.js +0 -96
  545. package/src/adapters/shared/application-adapter.js +0 -90
  546. package/src/adapters/shared/bun-user-websocket-lifecycle.js +0 -102
  547. package/src/adapters/shared/copy-runtime-public-dir.js +0 -24
  548. package/src/adapters/shared/define-api-handler.d.ts +0 -25
  549. package/src/adapters/shared/define-api-handler.js +0 -15
  550. package/src/adapters/shared/explicit-static-render-preparation.js +0 -26
  551. package/src/adapters/shared/explicit-static-route-matcher.js +0 -101
  552. package/src/adapters/shared/file-route-middleware-pipeline.js +0 -90
  553. package/src/adapters/shared/fs-server-response-factory.js +0 -81
  554. package/src/adapters/shared/fs-server-response-matcher.js +0 -186
  555. package/src/adapters/shared/hmr-entrypoint-registrar.d.ts +0 -55
  556. package/src/adapters/shared/hmr-entrypoint-registrar.js +0 -87
  557. package/src/adapters/shared/hmr-html-response.js +0 -33
  558. package/src/adapters/shared/node-http-websocket-upgrades.js +0 -125
  559. package/src/adapters/shared/render-context.js +0 -93
  560. package/src/adapters/shared/runtime-app-bootstrap.js +0 -41
  561. package/src/adapters/shared/runtime-host.js +0 -0
  562. package/src/adapters/shared/server-adapter.js +0 -436
  563. package/src/adapters/shared/server-route-handler.js +0 -111
  564. package/src/adapters/shared/server-static-builder.js +0 -202
  565. package/src/adapters/shared/shared-hmr-manager.d.ts +0 -61
  566. package/src/adapters/shared/shared-hmr-manager.js +0 -273
  567. package/src/adapters/shared/static-preview-host.js +0 -0
  568. package/src/adapters/shared/websocket-lifecycle.d.ts +0 -3
  569. package/src/adapters/shared/websocket-lifecycle.js +0 -19
  570. package/src/build/browser-runtime-manifest.js +0 -61
  571. package/src/build/browser-runtime-plugin-helpers.js +0 -14
  572. package/src/build/browser-runtime-plugin.js +0 -173
  573. package/src/build/build-input-fingerprint.js +0 -31
  574. package/src/build/build-manifest.d.ts +0 -33
  575. package/src/build/build-manifest.js +0 -49
  576. package/src/build/build-types.js +0 -0
  577. package/src/build/jsx-ownership-plugins.d.ts +0 -10
  578. package/src/build/jsx-ownership-plugins.js +0 -17
  579. package/src/build/pages-unified-graph-build.js +0 -208
  580. package/src/build/parallel-build-executor.js +0 -52
  581. package/src/build/rolldown-adapter-helpers.js +0 -310
  582. package/src/build/rolldown-build-adapter.js +0 -67
  583. package/src/build/rolldown-build-invocation-metrics.js +0 -43
  584. package/src/build/rolldown-dev-build-adapter.d.ts +0 -82
  585. package/src/build/rolldown-dev-build-adapter.js +0 -182
  586. package/src/build/rolldown-plugin-bridge.js +0 -211
  587. package/src/build/rolldown-source-transform-pass.js +0 -58
  588. package/src/build/runtime-build-executor.d.ts +0 -15
  589. package/src/build/runtime-build-executor.js +0 -43
  590. package/src/build/runtime-build-output-normalizer.js +0 -203
  591. package/src/build/serialized-build-executor.js +0 -63
  592. package/src/build/server-entry-build-cache.js +0 -169
  593. package/src/build/server-side-css-shim-plugin.js +0 -35
  594. package/src/hmr/hmr.postcss.test.e2e.js +0 -31
  595. package/src/hmr/hmr.test.e2e.js +0 -54
  596. package/src/integrations/ghtml/ghtml-renderer.js +0 -57
  597. package/src/integrations/ghtml/ghtml.constants.d.ts +0 -1
  598. package/src/integrations/ghtml/ghtml.constants.js +0 -4
  599. package/src/integrations/ghtml/ghtml.plugin.d.ts +0 -16
  600. package/src/integrations/ghtml/ghtml.plugin.js +0 -20
  601. package/src/route-renderer/orchestration/component-render-context.js +0 -147
  602. package/src/route-renderer/orchestration/declared-ownership-graph.d.ts +0 -18
  603. package/src/route-renderer/orchestration/declared-ownership-graph.js +0 -34
  604. package/src/route-renderer/orchestration/foreign-subtree-execution.service.js +0 -231
  605. package/src/route-renderer/orchestration/ownership-planning.service.d.ts +0 -24
  606. package/src/route-renderer/orchestration/ownership-planning.service.js +0 -63
  607. package/src/route-renderer/orchestration/ownership-validation.service.js +0 -53
  608. package/src/route-renderer/orchestration/processed-asset-dedupe.js +0 -27
  609. package/src/route-renderer/orchestration/queued-foreign-subtree-resolution.service.d.ts +0 -91
  610. package/src/route-renderer/orchestration/queued-foreign-subtree-resolution.service.js +0 -170
  611. package/src/route-renderer/orchestration/render-output.utils.js +0 -175
  612. package/src/route-renderer/orchestration/route-render-orchestrator.js +0 -578
  613. package/src/route-renderer/orchestration/template-serialization.d.ts +0 -38
  614. package/src/route-renderer/orchestration/template-serialization.js +0 -45
  615. package/src/utils/html.d.ts +0 -1
  616. package/src/utils/html.js +0 -4
  617. /package/src/adapters/{shared → bun}/bun-user-websocket-lifecycle.d.ts +0 -0
  618. /package/src/adapters/shared/{copy-runtime-public-dir.d.ts → runtime/copy-runtime-public-dir.d.ts} +0 -0
  619. /package/src/adapters/shared/{runtime-host.d.ts → runtime/runtime-host.d.ts} +0 -0
  620. /package/src/{hmr/hmr.postcss.test.e2e.d.ts → adapters/shared/runtime/runtime-host.js} +0 -0
  621. /package/src/{hmr/hmr.test.e2e.d.ts → adapters/shared/runtime/static-preview-host.js} +0 -0
  622. /package/src/build/{build-types.d.ts → contracts/build-types.d.ts} +0 -0
  623. /package/src/build/{runtime-build-output-normalizer.d.ts → rolldown/runtime-build-output-normalizer.d.ts} +0 -0
  624. /package/src/build/{server-side-css-shim-plugin.d.ts → rolldown/server-side-css-shim-plugin.d.ts} +0 -0
@@ -0,0 +1,262 @@
1
+ import { existsSync, readFileSync, realpathSync } from 'node:fs';
2
+ import path from 'node:path';
3
+ import { ResolverFactory } from 'oxc-resolver';
4
+ import { toPackageRootSpecifier } from './package-specifier.js';
5
+ const RESOLVABLE_EXTENSIONS = ['.ts', '.tsx', '.js', '.jsx', '.mjs', '.cjs', '.mdx'];
6
+ const resolverCache = new Map();
7
+ const pathPrefixCache = new Map();
8
+ function stripJsonComments(source) {
9
+ return source.replace(/\/\*[\s\S]*?\*\//g, '').replace(/^\s*\/\/.*$/gm, '');
10
+ }
11
+ function findTsconfigPath(projectRoot) {
12
+ const candidate = path.join(projectRoot, 'tsconfig.json');
13
+ return existsSync(candidate) ? candidate : undefined;
14
+ }
15
+ function readJsonFile(filePath) {
16
+ const source = readFileSync(filePath, 'utf8');
17
+ try {
18
+ return JSON.parse(source);
19
+ }
20
+ catch {
21
+ return JSON.parse(stripJsonComments(source));
22
+ }
23
+ }
24
+ /**
25
+ * Loads `compilerOptions.paths` keys from tsconfig, following `extends` recursively.
26
+ */
27
+ export function loadTsconfigPathPrefixes(projectRoot) {
28
+ const cached = pathPrefixCache.get(projectRoot);
29
+ if (cached) {
30
+ return cached;
31
+ }
32
+ const tsconfigPath = findTsconfigPath(projectRoot);
33
+ if (!tsconfigPath) {
34
+ pathPrefixCache.set(projectRoot, []);
35
+ return [];
36
+ }
37
+ const prefixes = new Set();
38
+ const visited = new Set();
39
+ const collectFromConfig = (configPath) => {
40
+ const normalized = path.resolve(configPath);
41
+ if (visited.has(normalized)) {
42
+ return;
43
+ }
44
+ visited.add(normalized);
45
+ let config;
46
+ try {
47
+ config = readJsonFile(normalized);
48
+ }
49
+ catch {
50
+ return;
51
+ }
52
+ if (typeof config.extends === 'string') {
53
+ const parentPath = path.resolve(path.dirname(normalized), config.extends);
54
+ collectFromConfig(parentPath);
55
+ }
56
+ for (const key of Object.keys(config.compilerOptions?.paths ?? {})) {
57
+ if (key.endsWith('/*')) {
58
+ prefixes.add(key.slice(0, -1));
59
+ continue;
60
+ }
61
+ if (key.endsWith('*')) {
62
+ prefixes.add(key.slice(0, -1));
63
+ continue;
64
+ }
65
+ prefixes.add(key);
66
+ }
67
+ };
68
+ collectFromConfig(tsconfigPath);
69
+ const resolvedPrefixes = [...prefixes];
70
+ pathPrefixCache.set(projectRoot, resolvedPrefixes);
71
+ return resolvedPrefixes;
72
+ }
73
+ export function matchesTsconfigPathPrefix(specifier, prefixes) {
74
+ return prefixes.some((prefix) => {
75
+ if (prefix.endsWith('/')) {
76
+ return specifier.startsWith(prefix);
77
+ }
78
+ return specifier === prefix || specifier.startsWith(`${prefix}/`);
79
+ });
80
+ }
81
+ /**
82
+ * Returns true when `specifier` looks like a bare npm package import rather than
83
+ * a relative path, absolute path, node built-in, tsconfig alias, or `#` import map.
84
+ */
85
+ export function isBarePackageImportSpecifier(specifier, projectRoot) {
86
+ if (specifier.startsWith('.') || path.isAbsolute(specifier) || specifier.startsWith('/')) {
87
+ return false;
88
+ }
89
+ if (specifier.startsWith('node:') || specifier.startsWith('#') || specifier.includes(':')) {
90
+ return false;
91
+ }
92
+ if (projectRoot && matchesTsconfigPathPrefix(specifier, loadTsconfigPathPrefixes(projectRoot))) {
93
+ return false;
94
+ }
95
+ return true;
96
+ }
97
+ function getResolverFactory(projectRoot) {
98
+ const cached = resolverCache.get(projectRoot);
99
+ if (cached) {
100
+ return cached;
101
+ }
102
+ const tsconfigPath = findTsconfigPath(projectRoot);
103
+ if (!tsconfigPath) {
104
+ return undefined;
105
+ }
106
+ const resolver = new ResolverFactory({
107
+ tsconfig: {
108
+ configFile: tsconfigPath,
109
+ },
110
+ extensions: [...RESOLVABLE_EXTENSIONS],
111
+ });
112
+ resolverCache.set(projectRoot, resolver);
113
+ return resolver;
114
+ }
115
+ const BROWSER_FIRST_CONDITION_NAMES = ['browser', 'module', 'import', 'default'];
116
+ /**
117
+ * Omit `browser` so package `exports` cannot select a legacy UMD facade when both
118
+ * `browser` and `import` conditions are published. Legacy `mainFields.browser`
119
+ * remains available after `module` for packages without `exports`.
120
+ */
121
+ const MODULE_FIRST_CONDITION_NAMES = ['module', 'import', 'default'];
122
+ const BROWSER_FIRST_MAIN_FIELDS = ['browser', 'module', 'main'];
123
+ const MODULE_FIRST_MAIN_FIELDS = ['module', 'browser', 'main'];
124
+ /**
125
+ * Package roots that ship an explicit browser facade and must keep browser-first
126
+ * resolution during vendor prebundles.
127
+ *
128
+ * @remarks
129
+ * Prefer expanding this set only for dual packages whose `"browser"` / `exports.browser`
130
+ * entry is the intentional client facade (for example `@ecopages/core`).
131
+ */
132
+ const BROWSER_FIRST_PACKAGE_ROOTS = new Set(['@ecopages/core']);
133
+ const browserPackageResolvers = new Map();
134
+ function usesBrowserFirstPackageResolution(specifier) {
135
+ const packageRoot = toPackageRootSpecifier(specifier);
136
+ return BROWSER_FIRST_PACKAGE_ROOTS.has(packageRoot);
137
+ }
138
+ function getBrowserPackageResolver(projectRoot, mainFields, conditionNames) {
139
+ const normalizedRoot = path.resolve(projectRoot);
140
+ const cacheKey = `${normalizedRoot}\0${mainFields.join(',')}\0${conditionNames.join(',')}`;
141
+ const cached = browserPackageResolvers.get(cacheKey);
142
+ if (cached) {
143
+ return cached;
144
+ }
145
+ const resolver = new ResolverFactory({
146
+ conditionNames: [...conditionNames],
147
+ mainFields: [...mainFields],
148
+ extensions: [...RESOLVABLE_EXTENSIONS],
149
+ });
150
+ browserPackageResolvers.set(cacheKey, resolver);
151
+ return resolver;
152
+ }
153
+ /**
154
+ * Resolves a bare npm package entry for browser vendor prebundles.
155
+ *
156
+ * @remarks
157
+ * Framework-owned dual packages such as `@ecopages/core` keep browser-first
158
+ * `mainFields` and `conditionNames` so vendor prebundles pick the browser facade.
159
+ * Third-party packages prefer ESM (`module` / `import`) and omit the `browser`
160
+ * export condition so legacy UMD `exports.browser` entries cannot win during
161
+ * Rolldown bundling.
162
+ */
163
+ export function resolveBarePackageBrowserEntry(projectRoot, specifier) {
164
+ const browserFirst = usesBrowserFirstPackageResolution(specifier);
165
+ const mainFields = browserFirst ? BROWSER_FIRST_MAIN_FIELDS : MODULE_FIRST_MAIN_FIELDS;
166
+ const conditionNames = browserFirst ? BROWSER_FIRST_CONDITION_NAMES : MODULE_FIRST_CONDITION_NAMES;
167
+ const result = getBrowserPackageResolver(projectRoot, mainFields, conditionNames).sync(projectRoot, specifier);
168
+ if (result.error || !result.path) {
169
+ return undefined;
170
+ }
171
+ try {
172
+ return realpathSync(result.path);
173
+ }
174
+ catch {
175
+ return result.path;
176
+ }
177
+ }
178
+ function resolveAliasedBarrelTarget(resolvedPath) {
179
+ if (!path.basename(resolvedPath).startsWith('index.')) {
180
+ return resolvedPath;
181
+ }
182
+ const source = readFileSync(resolvedPath, 'utf8').trim();
183
+ const match = source.match(/^export\s+\*\s+from\s+['"]([^'"]+)['"]\s*;?$/);
184
+ if (!match?.[1]?.startsWith('.')) {
185
+ return resolvedPath;
186
+ }
187
+ const targetDir = path.dirname(resolvedPath);
188
+ const targetBase = path.resolve(targetDir, match[1]);
189
+ for (const extension of RESOLVABLE_EXTENSIONS) {
190
+ const candidate = `${targetBase}${extension}`;
191
+ if (existsSync(candidate)) {
192
+ return candidate;
193
+ }
194
+ }
195
+ for (const extension of RESOLVABLE_EXTENSIONS) {
196
+ const candidate = path.join(targetBase, `index${extension}`);
197
+ if (existsSync(candidate)) {
198
+ return candidate;
199
+ }
200
+ }
201
+ return resolvedPath;
202
+ }
203
+ /**
204
+ * Resolves a relative import against the filesystem without requiring tsconfig.
205
+ *
206
+ * @remarks
207
+ * Used when oxc-resolver has no tsconfig (minimal fixtures / apps without paths)
208
+ * and as a fallback when the resolver cannot locate a relative specifier.
209
+ */
210
+ export function resolveRelativeModulePath(fromFile, specifier) {
211
+ if (!specifier.startsWith('.')) {
212
+ return undefined;
213
+ }
214
+ const targetBase = path.resolve(path.dirname(fromFile), specifier);
215
+ if (existsSync(targetBase)) {
216
+ return path.resolve(targetBase);
217
+ }
218
+ for (const candidateExtension of RESOLVABLE_EXTENSIONS) {
219
+ const candidate = `${targetBase}${candidateExtension}`;
220
+ if (existsSync(candidate)) {
221
+ return path.resolve(candidate);
222
+ }
223
+ }
224
+ for (const candidateExtension of RESOLVABLE_EXTENSIONS) {
225
+ const candidate = path.join(targetBase, `index${candidateExtension}`);
226
+ if (existsSync(candidate)) {
227
+ return path.resolve(candidate);
228
+ }
229
+ }
230
+ return undefined;
231
+ }
232
+ /**
233
+ * Resolves a relative or tsconfig path alias import (via oxc-resolver).
234
+ */
235
+ export function resolveProjectModulePath(projectRoot, fromFile, specifier) {
236
+ const prefixes = loadTsconfigPathPrefixes(projectRoot);
237
+ const isRelative = specifier.startsWith('.');
238
+ const isPathAlias = matchesTsconfigPathPrefix(specifier, prefixes);
239
+ if (!isRelative && !isPathAlias) {
240
+ return undefined;
241
+ }
242
+ const resolver = getResolverFactory(projectRoot);
243
+ if (resolver) {
244
+ const result = resolver.sync(path.dirname(fromFile), specifier);
245
+ if (result.path) {
246
+ return resolveAliasedBarrelTarget(realpathSync(result.path));
247
+ }
248
+ }
249
+ if (isRelative) {
250
+ return resolveRelativeModulePath(fromFile, specifier);
251
+ }
252
+ return undefined;
253
+ }
254
+ /**
255
+ * Resolves a TS path alias import using the app's tsconfig `paths` (via oxc-resolver).
256
+ */
257
+ export function resolveProjectImportPath(projectRoot, fromFile, specifier) {
258
+ if (!matchesTsconfigPathPrefix(specifier, loadTsconfigPathPrefixes(projectRoot))) {
259
+ return undefined;
260
+ }
261
+ return resolveProjectModulePath(projectRoot, fromFile, specifier);
262
+ }
@@ -41,24 +41,18 @@ flowchart TD
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-orchestrator.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-orchestrator.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,19 +16,35 @@ 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
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
30
  - `route-render-orchestrator.ts` owns route preparation, final response capture, and unresolved artifact enforcement
31
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 | component identity source transform | After a lexical `eco.` gate, uses Oxc to wrap native factory options with `bindComponentIdentity()` and prepends the owning integration pragma |
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.
43
+
44
+ ## Document shell composition
45
+
46
+ `composeDocumentShell` in core is the single string-shell primitive for wrapping a primary component with optional layout tiers and an Html template. Integrations may supply an optional `composeChildren` hook to replace sequential string wrapping with a unified tree (for example React element children) while still delegating foreign subtrees through `renderComponentWithForeignChildren`.
47
+
32
48
  ## Main Files
33
49
 
34
50
  ### `route-renderer.ts`
@@ -38,13 +54,26 @@ These concepts intentionally live in different places:
38
54
 
39
55
  ### `orchestration/`
40
56
 
41
- - `route-render-orchestrator.ts`: one route render from page-module loading through final HTML output
57
+ Root renderer classes:
58
+
42
59
  - `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
60
+ - `string-markup-renderer.ts`: shared base for string-markup integrations
61
+
62
+ Domain folders:
63
+
64
+ - `ownership-graph/`: component graph walk/collect and up-front ownership validation
65
+ - `foreign-child/`: active render context, foreign-subtree execution, deferred template serialization
66
+ - `document-shell/`: shared page/layout/html shell composition and attribute stamping helpers
67
+ - `route-pipeline/`: route preparation, final HTML capture, marker-artifact enforcement
68
+ - `page-browser-graph/`: browser asset graph build, session cache, and injector assets
69
+
70
+ **Page Browser Graph session behavior:**
71
+
72
+ - In development, each Page Browser Graph is built on first request, cached in `page-browser-graph-session` with generation-safe commits, and invalidated when a tracked dependency changes. The per-route fast path is disabled while HMR is enabled so prop-dependent `dependencies(props)` cannot reuse the wrong graph. Hosts call `prepareHmrFileChange()` before HMR dispatch and defer client broadcasts when no browser subscribers are connected.
73
+ - Dev SSR prewarm schedules processor-declared pathnames for background rendering. Static pages cache in watch mode when their Cache Strategy allows it; dynamic pages are never retained. The watcher invalidates HTML through `invalidateAppPageCacheBySourcePaths` when a registered source dependency changes, and falls back to global cache clear for categories whose route impact cannot be narrowed.
74
+ - **Measuring dev page load:** set `ECOPAGES_REQUEST_PIPELINE_METRICS=1` and run `pnpm run test:bench:docs`. Compare cold vs warm navigations and phase totals from the benchmark output.
75
+ - Production static export prebuilds browser graphs from the finalized route list into the in-memory `page-browser-graph-session` via `production-page-browser-graph-prebuild.ts`. Failed exports clear staged production session records so retries cannot reuse partial graph output.
76
+ - Integrations activate lazily on first render or graph prebuild via `ensureIntegrationRuntimeReady()`. Processors initialize their small virtual modules during `setupAppRuntimePlugins()`; content collection server artifacts are built lazily when a server build first resolves the collection.
48
77
 
49
78
  ### `page-loading/`
50
79
 
@@ -57,63 +86,54 @@ The route-render contract is:
57
86
 
58
87
  1. `RouteRendererFactory` selects the owning integration renderer.
59
88
  2. `IntegrationRenderer.execute()` delegates preparation and finalization to `RouteRenderOrchestrator`.
60
- 3. `RouteRenderOrchestrator.prepareRenderOptions()` loads the page module, validates ownership, builds `ownershipPlan`, resolves page data, resolves dependencies, and builds the page browser graph.
89
+ 3. `RouteRenderOrchestrator.prepareRenderOptions()` loads the page module, validates ownership (fail-fast), resolves final page props, resolves dependencies, and builds the page browser graph. Graph cache identity includes route params and query; contribution collection receives those same final props.
61
90
  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
91
  5. If a renderer needs queued handoff, it emits internal foreign-subtree tokens and resolves them before returning final HTML.
63
- 6. `RouteRenderOrchestrator.executePrepared()` captures the final body, rejects unresolved `<eco-marker>` artifacts, stamps root or document attributes when needed, and runs the HTML transformer.
92
+ 6. `RouteRenderOrchestrator.executePrepared()` captures the final body, rejects unresolved `<eco-marker>` artifacts, stamps document attributes when needed, and runs the HTML transformer.
64
93
 
65
94
  Important:
66
95
 
67
96
  - route-level fallback resolution is gone; unresolved artifacts are now a hard failure
68
- - ownership is declared from component metadata, not inferred from final HTML
97
+ - ownership is declared from canonical component identity, not inferred from final HTML
98
+ - declared page dependencies are resolved from final render inputs and carried to the owning integration; integrations may use them for renderer-specific lifecycle work such as HMR ownership
69
99
  - same-integration children stay renderer-local and do not need to pass through a universal transport
70
100
 
71
101
  ## Declared Foreign Child Contract
72
102
 
73
103
  Mixed-integration component configs must declare every possible foreign child in `config.dependencies.components`.
74
104
 
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`
105
+ `OwnershipValidationService` surfaces missing metadata or unknown integrations during `prepareRenderOptions()` and throws before render execution starts.
79
106
 
80
107
  At runtime, renderers still discover actual foreign children through the active component render context.
81
108
 
82
109
  ## Foreign Subtree Contract
83
110
 
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:
111
+ `renderComponentWithForeignChildren()` is the renderer entrypoint for mixed-integration trees. It is responsible for:
94
112
 
95
113
  - reusing the execution-scoped owning-renderer cache
96
114
  - deciding whether the current component can stay local
97
115
  - creating a foreign-child runtime when nested foreign ownership must be resolved
98
116
  - normalizing unresolved artifact HTML before the render leaves the renderer
99
117
 
118
+ Queue resolution maps owning-renderer output into the foreign-subtree payload shape via `toForeignSubtreeRenderPayload()` inside `foreign-subtree-execution.service.ts`.
119
+
100
120
  ## Queue Model
101
121
 
102
122
  Not every integration needs queue-based handoff.
103
123
 
104
124
  - If a renderer can resolve a foreign child inline, it returns resolved output immediately.
105
125
  - 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.
126
+ - Queue mechanics live inside `ForeignSubtreeExecutionService`; they are renderer-owned transport inside one render pass, not a general route-level fallback mechanism.
107
127
 
108
128
  ## React Island Notes
109
129
 
110
130
  - React islands are emitted without synthetic wrapper elements.
111
- - The React integration attaches `data-eco-component-id` to the SSR root when a single root exists.
131
+ - The React integration attaches island host attributes (`data-eco-island`, `data-eco-component-id`, `data-eco-component-key`, `data-eco-props`) to the SSR root when a single root exists.
132
+ - Other integrations call `finalizeIslandComponentRender()` from core when a component instance ships client scripts. See `packages/core/src/islands/README.md`.
112
133
  - The island bootstrap mounts with `createRoot()` into that SSR root.
113
134
  - Hydration bootstraps listen for `eco:after-swap` so islands hydrate after client-side navigation.
114
135
 
115
136
  ## Current Limits
116
137
 
117
- - `ownershipPlan` is still diagnostic and preparatory metadata; it does not yet drive a full route-composer execution model.
118
- - `integration-renderer.ts` remains large (~1,400 lines); document-shell helpers and foreign-subtree wiring are the likely future extraction targets.
119
138
  - Different integrations still own different foreign-child runtime strategies, which is intentional where child transport or hydration behavior differs.
139
+ - `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>;