@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
@@ -0,0 +1,75 @@
1
+ import { IntegrationRenderer, type HtmlDocumentContribution, type RenderToResponseContext } from './integration-renderer.js';
2
+ import { getComponentRenderContext, type ForeignChildRuntime } from './foreign-child/component-render-context.js';
3
+ import type { EcoPagesAppConfig } from '../../types/internal-types.js';
4
+ import type { AssetProcessingService, ProcessedAsset } from '../../services/assets/asset-processing-service/index.js';
5
+ import type { ComponentRenderInput, ComponentRenderResult, EcoPagesElement, IntegrationRendererRenderOptions, EcoPageFile, RouteRendererBody, RouteRendererOptions, EcoComponent, HtmlTemplateProps } from '../../types/public-types.js';
6
+ import type { PagePackageResult } from '../../types/public-types.js';
7
+ export declare function createUnresolvedMarkerArtifact(nodeId: string, componentRef: string, propsRef: string): string;
8
+ export declare function createMockIntegrationPlugin(plugin: {
9
+ name: string;
10
+ } & Record<string, unknown>): EcoPagesAppConfig['integrations'][number];
11
+ export declare const testAppConfig: EcoPagesAppConfig;
12
+ export declare const testAssetService: AssetProcessingService;
13
+ /**
14
+ * Concrete implementation with ed file loading for testing purposes.
15
+ */
16
+ export declare class TestIntegrationRenderer extends IntegrationRenderer<EcoPagesElement> {
17
+ name: string;
18
+ ForeignChildRuntimeCreationCount: number;
19
+ ForeignChildRenderCount: number;
20
+ UseFailFastForeignChildRuntime: boolean;
21
+ PageModule: EcoPageFile | null;
22
+ HtmlTemplate: EcoComponent<HtmlTemplateProps> | null;
23
+ RenderedBody: RouteRendererBody;
24
+ RenderBodyFactory: ((context: ReturnType<typeof getComponentRenderContext>) => RouteRendererBody | Promise<RouteRendererBody>) | null;
25
+ MockComponentRenderResult: ComponentRenderResult | null;
26
+ ImportedFiles: string[];
27
+ HtmlContributions: HtmlDocumentContribution[];
28
+ render(_options: IntegrationRendererRenderOptions<EcoPagesElement>): Promise<RouteRendererBody>;
29
+ renderComponent(_input: ComponentRenderInput): Promise<ComponentRenderResult>;
30
+ renderComponentWithForeignChildren(input: ComponentRenderInput): Promise<ComponentRenderResult>;
31
+ renderToResponse<P>(view: EcoComponent<P>, props: P, ctx: RenderToResponseContext): Promise<Response>;
32
+ protected importPageFile(_file: string): Promise<EcoPageFile>;
33
+ protected getHtmlTemplate(): Promise<EcoComponent<HtmlTemplateProps>>;
34
+ protected resolveDependencies(_components: (EcoComponent | Partial<EcoComponent>)[]): Promise<ProcessedAsset[]>;
35
+ testPrepareRenderOptions(options: RouteRendererOptions): Promise<IntegrationRendererRenderOptions<EcoPagesElement>>;
36
+ testShouldDelegateForeignChild(input: {
37
+ currentIntegration: string;
38
+ targetIntegration?: string;
39
+ }): boolean;
40
+ testHasForeignChildDescendants(component: EcoComponent): boolean;
41
+ testGetHtmlTemplate(): Promise<import("../../index.browser.js").EcoFunctionComponent<HtmlTemplateProps<EcoPagesElement>, any>>;
42
+ testBaseGetHtmlTemplate(): Promise<import("../../index.browser.js").EcoFunctionComponent<HtmlTemplateProps<EcoPagesElement>, any>>;
43
+ testGetRendererBootstrapDependencies(partial?: boolean): ProcessedAsset[];
44
+ testFinalizeDocumentShellHtml(options: {
45
+ html: string;
46
+ partial?: boolean;
47
+ htmlContributions?: HtmlDocumentContribution[];
48
+ }): Promise<string>;
49
+ testTransformRouteResponse(response: Response, htmlContributions?: HtmlDocumentContribution[], pagePackage?: PagePackageResult): Promise<RouteRendererBody>;
50
+ appendTestProcessedDependencies(assets: ProcessedAsset[]): ProcessedAsset[];
51
+ setTestPagePackage(pagePackage: PagePackageResult): void;
52
+ getTestPagePackage(): PagePackageResult | undefined;
53
+ getTestProcessedDependencies(): ProcessedAsset[];
54
+ testRenderPartialViewResponse<P>(input: {
55
+ view: EcoComponent<P>;
56
+ props: P;
57
+ ctx?: RenderToResponseContext;
58
+ renderInline?: () => Promise<BodyInit>;
59
+ transformHtml?: (html: string) => string;
60
+ }): Promise<Response>;
61
+ testRenderViewWithDocumentShell<P>(input: {
62
+ view: EcoComponent<P>;
63
+ props: P;
64
+ ctx?: RenderToResponseContext;
65
+ layout?: EcoComponent;
66
+ }): Promise<Response>;
67
+ testRenderForeignSubtree(input: ComponentRenderInput): Promise<import("../../index.browser.js").ForeignSubtreeRenderPayload>;
68
+ protected createForeignChildRuntime(options: {
69
+ renderInput: ComponentRenderInput;
70
+ rendererCache: Map<string, IntegrationRenderer<any>>;
71
+ }): ForeignChildRuntime;
72
+ protected getHtmlDocumentContributions(_options?: {
73
+ partial?: boolean;
74
+ }): HtmlDocumentContribution[] | undefined;
75
+ }
@@ -0,0 +1,177 @@
1
+ import { vi } from "vitest";
2
+ import { resolveInnermostPageLayout } from "./document-shell/layout-shell-props.service.js";
3
+ import { finalizeDocumentShellHtml } from "./document-shell/document-shell-render.service.js";
4
+ import {
5
+ IntegrationRenderer
6
+ } from "./integration-renderer.js";
7
+ import { getComponentRenderContext } from "./foreign-child/component-render-context.js";
8
+ import { toForeignSubtreeRenderPayload } from "./foreign-child/foreign-subtree-execution.service.js";
9
+ function createUnresolvedMarkerArtifact(nodeId, componentRef, propsRef) {
10
+ return `<eco-marker data-eco-node-id="${nodeId}" data-eco-component-ref="${componentRef}" data-eco-props-ref="${propsRef}"></eco-marker>`;
11
+ }
12
+ function createMockIntegrationPlugin(plugin) {
13
+ return {
14
+ setConfig: vi.fn(),
15
+ setRuntimeOrigin: vi.fn(),
16
+ setup: vi.fn(async () => {
17
+ }),
18
+ ...plugin
19
+ };
20
+ }
21
+ const testAppConfig = {
22
+ absolutePaths: {
23
+ pagesDir: "/app/pages",
24
+ htmlTemplatePath: "/app/index.ghtml.ts"
25
+ },
26
+ integrations: [],
27
+ defaultMetadata: {
28
+ title: "Default Title",
29
+ description: "Default Description"
30
+ },
31
+ srcDir: "/app"
32
+ };
33
+ const testAssetService = {
34
+ processDependencies: vi.fn(() => Promise.resolve([]))
35
+ };
36
+ class TestIntegrationRenderer extends IntegrationRenderer {
37
+ name = "test-renderer";
38
+ ForeignChildRuntimeCreationCount = 0;
39
+ ForeignChildRenderCount = 0;
40
+ UseFailFastForeignChildRuntime = false;
41
+ PageModule = null;
42
+ HtmlTemplate = null;
43
+ RenderedBody = "<html><body>Test Page</body></html>";
44
+ RenderBodyFactory = null;
45
+ MockComponentRenderResult = null;
46
+ ImportedFiles = [];
47
+ HtmlContributions = [];
48
+ async render(_options) {
49
+ if (this.RenderBodyFactory) {
50
+ return await this.RenderBodyFactory(getComponentRenderContext());
51
+ }
52
+ return this.RenderedBody;
53
+ }
54
+ async renderComponent(_input) {
55
+ if (this.MockComponentRenderResult) {
56
+ return this.MockComponentRenderResult;
57
+ }
58
+ return super.renderComponent(_input);
59
+ }
60
+ async renderComponentWithForeignChildren(input) {
61
+ this.ForeignChildRenderCount += 1;
62
+ return await super.renderComponentWithForeignChildren(input);
63
+ }
64
+ async renderToResponse(view, props, ctx) {
65
+ const viewFn = view;
66
+ const content = viewFn(props);
67
+ let body;
68
+ if (ctx.partial) {
69
+ body = content;
70
+ } else {
71
+ const Layout = resolveInnermostPageLayout(view.config?.layouts);
72
+ const children = Layout ? Layout({ children: content }) : content;
73
+ body = `<!DOCTYPE html><html><body>${children}</body></html>`;
74
+ }
75
+ const headers = new Headers({ "Content-Type": "text/html; charset=utf-8" });
76
+ if (ctx.headers) {
77
+ for (const [key, value] of Object.entries(ctx.headers)) {
78
+ headers.set(key, value);
79
+ }
80
+ }
81
+ return new Response(body, {
82
+ status: ctx.status ?? 200,
83
+ headers
84
+ });
85
+ }
86
+ async importPageFile(_file) {
87
+ this.ImportedFiles.push(_file);
88
+ if (!this.PageModule) throw new Error("Mock page module not set");
89
+ return this.PageModule;
90
+ }
91
+ async getHtmlTemplate() {
92
+ if (!this.HtmlTemplate) throw new Error("Mock HTML template not set");
93
+ return this.HtmlTemplate;
94
+ }
95
+ async resolveDependencies(_components) {
96
+ return [];
97
+ }
98
+ async testPrepareRenderOptions(options) {
99
+ return this.prepareRenderOptions(options);
100
+ }
101
+ testShouldDelegateForeignChild(input) {
102
+ return this.foreignSubtreeExecutionService.shouldDelegateForeignChild(input);
103
+ }
104
+ testHasForeignChildDescendants(component) {
105
+ return this.hasForeignChildDescendants(component);
106
+ }
107
+ async testGetHtmlTemplate() {
108
+ return this.getHtmlTemplate();
109
+ }
110
+ async testBaseGetHtmlTemplate() {
111
+ return super.getHtmlTemplate();
112
+ }
113
+ testGetRendererBootstrapDependencies(partial = false) {
114
+ return this.getRendererBootstrapDependencies(partial);
115
+ }
116
+ async testFinalizeDocumentShellHtml(options) {
117
+ this.appendProcessedDependencies(this.getRendererBootstrapDependencies(options.partial));
118
+ return finalizeDocumentShellHtml(this.htmlTransformer, {
119
+ html: options.html,
120
+ partial: options.partial,
121
+ htmlContributions: options.htmlContributions ?? this.getHtmlDocumentContributions({ partial: options.partial ?? false })
122
+ });
123
+ }
124
+ async testTransformRouteResponse(response, htmlContributions, pagePackage) {
125
+ const adapter = this.createRouteRenderOrchestratorAdapter();
126
+ return adapter.transformRouteResponse(response, htmlContributions, pagePackage);
127
+ }
128
+ appendTestProcessedDependencies(assets) {
129
+ return this.appendProcessedDependencies(assets);
130
+ }
131
+ setTestPagePackage(pagePackage) {
132
+ this.htmlTransformer.setPagePackage(pagePackage);
133
+ }
134
+ getTestPagePackage() {
135
+ return this.htmlTransformer.getPagePackage();
136
+ }
137
+ getTestProcessedDependencies() {
138
+ return this.htmlTransformer.getProcessedDependencies();
139
+ }
140
+ async testRenderPartialViewResponse(input) {
141
+ return this.renderPartialViewResponse({
142
+ view: input.view,
143
+ props: input.props,
144
+ ctx: input.ctx ?? { partial: true },
145
+ renderInline: input.renderInline,
146
+ transformHtml: input.transformHtml
147
+ });
148
+ }
149
+ async testRenderViewWithDocumentShell(input) {
150
+ return this.renderViewWithDocumentShell({
151
+ view: input.view,
152
+ props: input.props,
153
+ ctx: input.ctx ?? {},
154
+ layout: input.layout
155
+ });
156
+ }
157
+ async testRenderForeignSubtree(input) {
158
+ return toForeignSubtreeRenderPayload(await this.renderComponentWithForeignChildren(input));
159
+ }
160
+ createForeignChildRuntime(options) {
161
+ this.ForeignChildRuntimeCreationCount += 1;
162
+ if (this.UseFailFastForeignChildRuntime) {
163
+ return this.createFailFastForeignChildRuntime();
164
+ }
165
+ return super.createForeignChildRuntime(options);
166
+ }
167
+ getHtmlDocumentContributions(_options) {
168
+ return this.HtmlContributions;
169
+ }
170
+ }
171
+ export {
172
+ TestIntegrationRenderer,
173
+ createMockIntegrationPlugin,
174
+ createUnresolvedMarkerArtifact,
175
+ testAppConfig,
176
+ testAssetService
177
+ };
@@ -0,0 +1,10 @@
1
+ import type { EcoPagesAppConfig } from '../../../types/internal-types.js';
2
+ import type { EcoComponent, ResolvedLazyTrigger } from '../../../types/public-types.js';
3
+ import type { AssetDefinition } from '../../../services/assets/asset-processing-service/index.js';
4
+ import type { AssetProcessingService, ProcessedAsset } from '../../../services/assets/asset-processing-service/index.js';
5
+ export declare function collectIntegrationNamesFromGraph(components: (EcoComponent | Partial<EcoComponent>)[], currentIntegrationName: string): Set<string>;
6
+ export declare function collectResolvedLazyTriggersFromGraph(components: (EcoComponent | Partial<EcoComponent>)[], currentIntegrationName: string): ResolvedLazyTrigger[];
7
+ export declare function hasForeignChildDescendantsInGraph(component: EcoComponent, currentIntegrationName: string): boolean;
8
+ export declare function collectEagerSsrLazyScriptDefinitions(components: (EcoComponent | Partial<EcoComponent>)[]): AssetDefinition[];
9
+ export declare function collectUsedIntegrationDependenciesFromGraph(appConfig: EcoPagesAppConfig, components: (EcoComponent | Partial<EcoComponent>)[], currentIntegrationName: string): ProcessedAsset[];
10
+ export declare function buildEagerSsrLazyAssetsFromGraph(assetProcessingService: AssetProcessingService, components: (EcoComponent | Partial<EcoComponent>)[], currentIntegrationName: string): Promise<ProcessedAsset[]>;
@@ -0,0 +1,143 @@
1
+ import path from "node:path";
2
+ import { AssetFactory } from "../../../services/assets/asset-processing-service/index.js";
3
+ import { walkComponentGraph } from "./component-graph.js";
4
+ function toGraphRoots(components) {
5
+ return components.filter(Boolean).map((component) => ({ component }));
6
+ }
7
+ function collectIntegrationNamesFromGraph(components, currentIntegrationName) {
8
+ const integrationNames = /* @__PURE__ */ new Set();
9
+ walkComponentGraph({
10
+ roots: toGraphRoots(components),
11
+ currentIntegrationName,
12
+ onComponent: ({ component }) => {
13
+ const integrationName = component.config?.integration ?? component.config?.__eco?.integration;
14
+ if (integrationName) {
15
+ integrationNames.add(integrationName);
16
+ }
17
+ }
18
+ });
19
+ return integrationNames;
20
+ }
21
+ function collectResolvedLazyTriggersFromGraph(components, currentIntegrationName) {
22
+ const triggers = [];
23
+ walkComponentGraph({
24
+ roots: toGraphRoots(components),
25
+ currentIntegrationName,
26
+ onComponent: ({ component }) => {
27
+ const ownTriggers = component.config?._resolvedLazyTriggers;
28
+ if (ownTriggers?.length) {
29
+ triggers.push(...ownTriggers);
30
+ }
31
+ }
32
+ });
33
+ return triggers;
34
+ }
35
+ function hasForeignChildDescendantsInGraph(component, currentIntegrationName) {
36
+ let foundForeign = false;
37
+ walkComponentGraph({
38
+ roots: [{ component }],
39
+ currentIntegrationName,
40
+ onComponent: ({ component: currentComponent }) => {
41
+ if (foundForeign) {
42
+ return false;
43
+ }
44
+ const integrationName = currentComponent.config?.integration ?? currentComponent.config?.__eco?.integration;
45
+ if (integrationName && integrationName !== currentIntegrationName) {
46
+ foundForeign = true;
47
+ return false;
48
+ }
49
+ }
50
+ });
51
+ return foundForeign;
52
+ }
53
+ function collectEagerSsrLazyScriptDefinitions(components) {
54
+ const dependencies = [];
55
+ const seenKeys = /* @__PURE__ */ new Set();
56
+ const normalizeAttributes = (attributes) => ({
57
+ type: "module",
58
+ defer: "",
59
+ ...attributes ?? {}
60
+ });
61
+ walkComponentGraph({
62
+ roots: toGraphRoots(components),
63
+ currentIntegrationName: "",
64
+ visitLayout: true,
65
+ onConfig: (config) => {
66
+ const componentFile = config?.__eco?.file;
67
+ if (!componentFile) {
68
+ return;
69
+ }
70
+ const componentDir = path.dirname(componentFile);
71
+ for (const script of config.dependencies?.scripts ?? []) {
72
+ if (typeof script === "string" || !script.lazy || script.ssr !== true) {
73
+ continue;
74
+ }
75
+ const attributes = normalizeAttributes(script.attributes);
76
+ if (script.content) {
77
+ const key2 = `content:${script.content}:${JSON.stringify(attributes)}`;
78
+ if (seenKeys.has(key2)) {
79
+ continue;
80
+ }
81
+ seenKeys.add(key2);
82
+ dependencies.push(
83
+ AssetFactory.createContentScript({
84
+ position: "head",
85
+ content: script.content,
86
+ attributes,
87
+ packageRole: "dynamic-chunk"
88
+ })
89
+ );
90
+ continue;
91
+ }
92
+ if (!script.src) {
93
+ continue;
94
+ }
95
+ const resolvedPath = path.resolve(componentDir, script.src);
96
+ const key = `file:${resolvedPath}:${JSON.stringify(attributes)}`;
97
+ if (seenKeys.has(key)) {
98
+ continue;
99
+ }
100
+ seenKeys.add(key);
101
+ dependencies.push(
102
+ AssetFactory.createFileScript({
103
+ filepath: resolvedPath,
104
+ position: "head",
105
+ attributes,
106
+ packageRole: "dynamic-chunk"
107
+ })
108
+ );
109
+ }
110
+ }
111
+ });
112
+ return dependencies;
113
+ }
114
+ function collectUsedIntegrationDependenciesFromGraph(appConfig, components, currentIntegrationName) {
115
+ const integrationNames = collectIntegrationNamesFromGraph(components, currentIntegrationName);
116
+ const dependencies = [];
117
+ for (const integrationName of integrationNames) {
118
+ if (integrationName === currentIntegrationName) {
119
+ continue;
120
+ }
121
+ const integrationPlugin = appConfig.integrations.find((integration) => integration.name === integrationName);
122
+ if (!integrationPlugin || typeof integrationPlugin.getResolvedIntegrationDependencies !== "function") {
123
+ continue;
124
+ }
125
+ dependencies.push(...integrationPlugin.getResolvedIntegrationDependencies());
126
+ }
127
+ return dependencies;
128
+ }
129
+ async function buildEagerSsrLazyAssetsFromGraph(assetProcessingService, components, currentIntegrationName) {
130
+ const dependencies = collectEagerSsrLazyScriptDefinitions(components);
131
+ if (dependencies.length === 0) {
132
+ return [];
133
+ }
134
+ return assetProcessingService.processDependencies(dependencies, `${currentIntegrationName}:ssr-lazy`);
135
+ }
136
+ export {
137
+ buildEagerSsrLazyAssetsFromGraph,
138
+ collectEagerSsrLazyScriptDefinitions,
139
+ collectIntegrationNamesFromGraph,
140
+ collectResolvedLazyTriggersFromGraph,
141
+ collectUsedIntegrationDependenciesFromGraph,
142
+ hasForeignChildDescendantsInGraph
143
+ };
@@ -0,0 +1,34 @@
1
+ import type { EcoComponent, OwnershipPlanNodeSource } from '../../../types/public-types.js';
2
+ export type DeclaredOwnershipRoot = {
3
+ component: EcoComponent;
4
+ source: Extract<OwnershipPlanNodeSource, 'page' | 'layout' | 'html-template'>;
5
+ };
6
+ export type DeclaredOwnershipNodeInput = {
7
+ component: EcoComponent;
8
+ source: Exclude<OwnershipPlanNodeSource, 'route'>;
9
+ parentIntegrationName: string;
10
+ integrationName: string;
11
+ componentId: string;
12
+ isForeignToParent: boolean;
13
+ };
14
+ export type ComponentGraphRoot = {
15
+ component: EcoComponent | Partial<EcoComponent>;
16
+ source?: Exclude<OwnershipPlanNodeSource, 'route'>;
17
+ };
18
+ export type ComponentGraphWalkInput = {
19
+ component: EcoComponent;
20
+ parentIntegrationName: string;
21
+ source?: Exclude<OwnershipPlanNodeSource, 'route'>;
22
+ };
23
+ export declare function walkComponentGraph(input: {
24
+ roots: ComponentGraphRoot[];
25
+ currentIntegrationName: string;
26
+ visitLayout?: boolean;
27
+ onComponent?: (node: ComponentGraphWalkInput) => void | boolean;
28
+ onConfig?: (config: EcoComponent['config']) => void;
29
+ }): void;
30
+ export declare function mapComponentGraph<T>(input: {
31
+ roots: DeclaredOwnershipRoot[];
32
+ currentIntegrationName: string;
33
+ mapNode: (node: DeclaredOwnershipNodeInput, children: T[]) => T;
34
+ }): T[];
@@ -0,0 +1,96 @@
1
+ function walkComponentGraph(input) {
2
+ const seenComponents = /* @__PURE__ */ new Set();
3
+ const seenConfigs = /* @__PURE__ */ new Set();
4
+ const visitComponent = (component, parentIntegrationName, source) => {
5
+ if (!component) {
6
+ return;
7
+ }
8
+ const ecoComponent = component;
9
+ if (seenComponents.has(ecoComponent)) {
10
+ return;
11
+ }
12
+ seenComponents.add(ecoComponent);
13
+ const integrationName = ecoComponent.config?.integration ?? ecoComponent.config?.__eco?.integration ?? parentIntegrationName;
14
+ if (input.onConfig && ecoComponent.config && !seenConfigs.has(ecoComponent.config)) {
15
+ seenConfigs.add(ecoComponent.config);
16
+ input.onConfig(ecoComponent.config);
17
+ }
18
+ if (input.onComponent) {
19
+ const shouldContinue = input.onComponent({
20
+ component: ecoComponent,
21
+ parentIntegrationName,
22
+ source
23
+ });
24
+ if (shouldContinue === false) {
25
+ return;
26
+ }
27
+ }
28
+ if (input.visitLayout) {
29
+ for (const layout of ecoComponent.config?.layouts ?? []) {
30
+ if (layout?.config) {
31
+ visitConfig(layout.config, integrationName);
32
+ }
33
+ }
34
+ }
35
+ for (const child of ecoComponent.config?.dependencies?.components ?? []) {
36
+ visitComponent(child, integrationName, "dependency");
37
+ }
38
+ };
39
+ const visitConfig = (config, parentIntegrationName) => {
40
+ if (!config || seenConfigs.has(config)) {
41
+ return;
42
+ }
43
+ seenConfigs.add(config);
44
+ if (input.onConfig) {
45
+ input.onConfig(config);
46
+ }
47
+ if (input.visitLayout) {
48
+ for (const layout of config.layouts ?? []) {
49
+ if (layout?.config) {
50
+ visitConfig(layout.config, parentIntegrationName);
51
+ }
52
+ }
53
+ }
54
+ for (const child of config.dependencies?.components ?? []) {
55
+ visitComponent(child, parentIntegrationName, "dependency");
56
+ }
57
+ };
58
+ for (const root of input.roots) {
59
+ visitComponent(root.component, input.currentIntegrationName, root.source);
60
+ }
61
+ }
62
+ function mapComponentGraph(input) {
63
+ let nextSyntheticId = 0;
64
+ const mapComponent = (component, source, parentIntegrationName, lineage) => {
65
+ const integrationName = component.config?.integration ?? component.config?.__eco?.integration ?? parentIntegrationName;
66
+ const componentMeta = component.config?.__eco;
67
+ const isForeignToParent = integrationName !== parentIntegrationName;
68
+ const componentId = componentMeta?.id ?? componentMeta?.file ?? `${source}:${nextSyntheticId += 1}`;
69
+ const nextLineage = new Set(lineage);
70
+ nextLineage.add(component);
71
+ const children = (component.config?.dependencies?.components ?? []).flatMap((child) => {
72
+ if (!child || nextLineage.has(child)) {
73
+ return [];
74
+ }
75
+ return [mapComponent(child, "dependency", integrationName, nextLineage)];
76
+ });
77
+ return input.mapNode(
78
+ {
79
+ component,
80
+ source,
81
+ parentIntegrationName,
82
+ integrationName,
83
+ componentId,
84
+ isForeignToParent
85
+ },
86
+ children
87
+ );
88
+ };
89
+ return input.roots.map(
90
+ ({ component, source }) => mapComponent(component, source, input.currentIntegrationName, /* @__PURE__ */ new Set())
91
+ );
92
+ }
93
+ export {
94
+ mapComponentGraph,
95
+ walkComponentGraph
96
+ };
@@ -1,5 +1,5 @@
1
- import type { EcoPagesAppConfig } from '../../types/internal-types.js';
2
- import type { OwnershipPlanNodeSource, OwnershipValidationError, EcoComponent } from '../../types/public-types.js';
1
+ import type { EcoPagesAppConfig } from '../../../types/internal-types.js';
2
+ import type { OwnershipPlanNodeSource, OwnershipValidationError, EcoComponent } from '../../../types/public-types.js';
3
3
  type OwnershipValidationInput = {
4
4
  currentIntegrationName: string;
5
5
  roots: Array<{
@@ -24,6 +24,11 @@ export declare class OwnershipValidationService {
24
24
  * Validates foreign ownership edges reachable from the supplied route roots.
25
25
  */
26
26
  validate(input: OwnershipValidationInput): OwnershipValidationError[];
27
+ private assertDeclaredComponentDependencies;
27
28
  private isRegisteredIntegration;
28
29
  }
30
+ /**
31
+ * Throws when declared ownership validation collected one or more errors.
32
+ */
33
+ export declare function throwIfOwnershipInvalid(validationErrors: OwnershipValidationError[]): void;
29
34
  export {};
@@ -1,4 +1,5 @@
1
- import { mapDeclaredOwnershipGraph } from "./declared-ownership-graph.js";
1
+ import { assertEcoDeclaredComponent } from "../../../eco/eco-declared-component.js";
2
+ import { mapComponentGraph, walkComponentGraph } from "./component-graph.js";
2
3
  class OwnershipValidationService {
3
4
  appConfig;
4
5
  /**
@@ -11,7 +12,8 @@ class OwnershipValidationService {
11
12
  * Validates foreign ownership edges reachable from the supplied route roots.
12
13
  */
13
14
  validate(input) {
14
- return mapDeclaredOwnershipGraph({
15
+ this.assertDeclaredComponentDependencies(input);
16
+ return mapComponentGraph({
15
17
  roots: input.roots,
16
18
  currentIntegrationName: input.currentIntegrationName,
17
19
  mapNode: ({ component, integrationName, componentId, isForeignToParent }, children) => {
@@ -20,6 +22,9 @@ class OwnershipValidationService {
20
22
  if (!isForeignToParent) {
21
23
  return errors;
22
24
  }
25
+ if (integrationName === "html") {
26
+ return errors;
27
+ }
23
28
  if (!componentMeta) {
24
29
  errors.push({
25
30
  code: "MISSING_COMPONENT_METADATA",
@@ -41,6 +46,21 @@ class OwnershipValidationService {
41
46
  }
42
47
  }).flat();
43
48
  }
49
+ assertDeclaredComponentDependencies(input) {
50
+ walkComponentGraph({
51
+ roots: input.roots,
52
+ currentIntegrationName: input.currentIntegrationName,
53
+ onComponent: ({ component }) => {
54
+ const parentFile = component.config?.__eco?.file;
55
+ for (const child of component.config?.dependencies?.components ?? []) {
56
+ if (!child) {
57
+ continue;
58
+ }
59
+ assertEcoDeclaredComponent(child, { parentComponentFile: parentFile });
60
+ }
61
+ }
62
+ });
63
+ }
44
64
  isRegisteredIntegration(integrationName, currentIntegrationName) {
45
65
  if (integrationName === currentIntegrationName) {
46
66
  return true;
@@ -48,6 +68,13 @@ class OwnershipValidationService {
48
68
  return this.appConfig.integrations.some((integration) => integration.name === integrationName);
49
69
  }
50
70
  }
71
+ function throwIfOwnershipInvalid(validationErrors) {
72
+ if (validationErrors.length === 0) {
73
+ return;
74
+ }
75
+ throw new Error(validationErrors.map((error) => error.message).join("\n"));
76
+ }
51
77
  export {
52
- OwnershipValidationService
78
+ OwnershipValidationService,
79
+ throwIfOwnershipInvalid
53
80
  };
@@ -0,0 +1,7 @@
1
+ import type { EcoPagesAppConfig } from '../../../types/internal-types.js';
2
+ import type { ResolvedLazyTrigger } from '../../../types/public-types.js';
3
+ import { type AssetProcessingService, type ProcessedAsset } from '../../../services/assets/asset-processing-service/index.js';
4
+ /**
5
+ * Builds processed global-injector map and bootstrap assets for resolved lazy triggers.
6
+ */
7
+ export declare function buildGlobalInjectorAssets(appConfig: EcoPagesAppConfig, assetProcessingService: AssetProcessingService, triggers: ResolvedLazyTrigger[], currentIntegrationName: string): Promise<ProcessedAsset[]>;
@@ -0,0 +1,32 @@
1
+ import { createRequire } from "node:module";
2
+ import path from "node:path";
3
+ import {
4
+ AssetFactory
5
+ } from "../../../services/assets/asset-processing-service/index.js";
6
+ import { buildGlobalInjectorBootstrapContent, buildGlobalInjectorMapScript } from "../../../eco/global-injector-map.js";
7
+ async function buildGlobalInjectorAssets(appConfig, assetProcessingService, triggers, currentIntegrationName) {
8
+ const appProjectDir = appConfig.rootDir ?? appConfig.absolutePaths?.projectDir ?? process.cwd();
9
+ const appPackageRequire = createRequire(path.join(appProjectDir, "package.json"));
10
+ const corePackageEntryPath = appPackageRequire.resolve("@ecopages/core");
11
+ const globalInjectorImportPath = createRequire(corePackageEntryPath).resolve("@ecopages/scripts-injector/global");
12
+ const mapScript = AssetFactory.createInlineContentScript({
13
+ position: "head",
14
+ name: "ecopages-global-injector-map",
15
+ content: buildGlobalInjectorMapScript(triggers),
16
+ attributes: { type: "ecopages/global-injector-map" },
17
+ packageRole: "keep-separate",
18
+ bundle: false
19
+ });
20
+ const bootstrapInlineScript = AssetFactory.createInlineContentScript({
21
+ position: "head",
22
+ name: "ecopages-global-injector-bootstrap",
23
+ content: buildGlobalInjectorBootstrapContent(globalInjectorImportPath),
24
+ attributes: { type: "module" },
25
+ packageRole: "keep-separate",
26
+ bundle: true
27
+ });
28
+ return assetProcessingService.processDependencies([mapScript, bootstrapInlineScript], currentIntegrationName);
29
+ }
30
+ export {
31
+ buildGlobalInjectorAssets
32
+ };
@@ -0,0 +1,9 @@
1
+ import type { EcoPageFile, PageBrowserGraphContribution, PageBrowserGraphContributionContext } from '../../../types/public-types.js';
2
+ /**
3
+ * Loads a page module once and collects declarative browser-graph requirements.
4
+ *
5
+ * @remarks
6
+ * Shared by route orchestration prep and the integration route-render adapter so
7
+ * page imports are not duplicated when both paths need the same contribution.
8
+ */
9
+ export declare function loadPageBrowserGraphContribution(routeFile: string, importPageFile: (file: string) => Promise<EcoPageFile>, collectContribution: (context: PageBrowserGraphContributionContext) => Promise<PageBrowserGraphContribution | undefined>): Promise<PageBrowserGraphContribution | undefined>;