@ecopages/core 0.2.0-beta.2 → 0.2.0-beta.21

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 (273) hide show
  1. package/README.md +1 -1
  2. package/package.json +163 -3
  3. package/src/adapters/abstract/application-adapter.d.ts +104 -5
  4. package/src/adapters/abstract/application-adapter.js +125 -1
  5. package/src/adapters/abstract/server-adapter.d.ts +6 -2
  6. package/src/adapters/abstract/ws-pattern-matcher.d.ts +60 -0
  7. package/src/adapters/abstract/ws-pattern-matcher.js +61 -0
  8. package/src/adapters/bun/client-bridge.d.ts +1 -0
  9. package/src/adapters/bun/client-bridge.js +3 -0
  10. package/src/adapters/bun/create-app.d.ts +6 -4
  11. package/src/adapters/bun/create-app.js +65 -43
  12. package/src/adapters/bun/server-adapter.d.ts +90 -22
  13. package/src/adapters/bun/server-adapter.js +266 -84
  14. package/src/adapters/bun/static-preview-host.js +25 -20
  15. package/src/adapters/create-app.d.ts +13 -11
  16. package/src/adapters/create-app.js +2 -51
  17. package/src/adapters/index.d.ts +1 -1
  18. package/src/adapters/index.js +1 -2
  19. package/src/adapters/node/create-app.d.ts +5 -1
  20. package/src/adapters/node/create-app.js +51 -12
  21. package/src/adapters/node/node-client-bridge.d.ts +1 -0
  22. package/src/adapters/node/node-client-bridge.js +3 -0
  23. package/src/adapters/node/server-adapter-dependencies.js +4 -0
  24. package/src/adapters/node/server-adapter.d.ts +62 -20
  25. package/src/adapters/node/server-adapter.js +160 -131
  26. package/src/adapters/node/static-content-server.d.ts +1 -0
  27. package/src/adapters/node/static-content-server.js +10 -2
  28. package/src/adapters/node/static-preview-host.js +27 -12
  29. package/src/adapters/shared/bun-user-websocket-lifecycle.d.ts +22 -0
  30. package/src/adapters/shared/bun-user-websocket-lifecycle.js +96 -0
  31. package/src/adapters/shared/copy-runtime-public-dir.d.ts +6 -0
  32. package/src/adapters/shared/copy-runtime-public-dir.js +24 -0
  33. package/src/adapters/shared/fs-server-response-matcher.d.ts +2 -0
  34. package/src/adapters/shared/fs-server-response-matcher.js +40 -18
  35. package/src/adapters/shared/hmr-entrypoint-registrar.d.ts +21 -30
  36. package/src/adapters/shared/hmr-entrypoint-registrar.js +49 -54
  37. package/src/adapters/shared/hmr-html-response.d.ts +1 -1
  38. package/src/adapters/shared/hmr-html-response.js +4 -1
  39. package/src/adapters/shared/node-http-websocket-upgrades.d.ts +21 -0
  40. package/src/adapters/shared/node-http-websocket-upgrades.js +100 -0
  41. package/src/adapters/shared/port-manager.d.ts +116 -0
  42. package/src/adapters/shared/port-manager.js +196 -0
  43. package/src/adapters/shared/runtime-app-bootstrap.d.ts +2 -1
  44. package/src/adapters/shared/runtime-app-bootstrap.js +3 -6
  45. package/src/adapters/shared/runtime-server-lifecycle.d.ts +46 -0
  46. package/src/adapters/shared/runtime-server-lifecycle.js +50 -0
  47. package/src/adapters/shared/server-adapter.d.ts +2 -1
  48. package/src/adapters/shared/server-adapter.js +13 -6
  49. package/src/adapters/shared/server-route-handler.d.ts +4 -1
  50. package/src/adapters/shared/server-route-handler.js +5 -2
  51. package/src/adapters/shared/server-static-builder.d.ts +23 -32
  52. package/src/adapters/shared/server-static-builder.js +100 -73
  53. package/src/adapters/shared/shared-hmr-manager.d.ts +45 -11
  54. package/src/adapters/shared/shared-hmr-manager.js +204 -58
  55. package/src/adapters/shared/static-preview-host.d.ts +5 -0
  56. package/src/adapters/shared/websocket-lifecycle.d.ts +24 -0
  57. package/src/adapters/shared/websocket-lifecycle.js +55 -0
  58. package/src/build/README.md +77 -14
  59. package/src/build/app-build-manifest-runtime.d.ts +9 -0
  60. package/src/build/app-build-manifest-runtime.js +87 -0
  61. package/src/build/build-adapter.d.ts +17 -319
  62. package/src/build/build-adapter.js +28 -94
  63. package/src/build/build-contracts.d.ts +97 -0
  64. package/src/build/build-contracts.js +0 -0
  65. package/src/build/build-input-fingerprint.d.ts +28 -0
  66. package/src/build/build-input-fingerprint.js +31 -0
  67. package/src/build/build-profile-options.d.ts +7 -0
  68. package/src/build/build-profile-options.js +37 -0
  69. package/src/build/build-runtime.d.ts +24 -0
  70. package/src/build/build-runtime.js +65 -0
  71. package/src/build/deduping-build-executor.d.ts +28 -0
  72. package/src/build/deduping-build-executor.js +56 -0
  73. package/src/build/jsx-ownership-plugins.d.ts +24 -0
  74. package/src/build/jsx-ownership-plugins.js +41 -0
  75. package/src/build/pages-unified-graph-build.d.ts +31 -0
  76. package/src/build/pages-unified-graph-build.js +206 -0
  77. package/src/build/parallel-build-executor.d.ts +21 -0
  78. package/src/build/parallel-build-executor.js +52 -0
  79. package/src/build/production-build-cache.d.ts +20 -0
  80. package/src/build/production-build-cache.js +63 -0
  81. package/src/build/rolldown-adapter-helpers.d.ts +3 -6
  82. package/src/build/rolldown-adapter-helpers.js +71 -6
  83. package/src/build/rolldown-build-adapter.d.ts +2 -6
  84. package/src/build/rolldown-build-adapter.js +3 -3
  85. package/src/build/rolldown-build-invocation-metrics.d.ts +12 -0
  86. package/src/build/rolldown-build-invocation-metrics.js +43 -0
  87. package/src/build/rolldown-plugin-bridge.d.ts +15 -1
  88. package/src/build/rolldown-plugin-bridge.js +20 -5
  89. package/src/build/rolldown-source-transform-pass.d.ts +15 -0
  90. package/src/build/rolldown-source-transform-pass.js +58 -0
  91. package/src/build/runtime-build-executor.d.ts +8 -15
  92. package/src/build/runtime-build-executor.js +12 -15
  93. package/src/build/runtime-build-output-normalizer.d.ts +7 -0
  94. package/src/build/runtime-build-output-normalizer.js +94 -2
  95. package/src/build/server-entry-build-cache.d.ts +44 -0
  96. package/src/build/server-entry-build-cache.js +161 -0
  97. package/src/client/navigation-scripts/classification.d.ts +16 -0
  98. package/src/client/navigation-scripts/classification.js +41 -0
  99. package/src/client/navigation-scripts/index.d.ts +3 -0
  100. package/src/client/navigation-scripts/index.js +23 -0
  101. package/src/client/navigation-scripts/navigation-scripts.test.browser.js +65 -0
  102. package/src/client/navigation-scripts/registry.d.ts +11 -0
  103. package/src/client/navigation-scripts/registry.js +12 -0
  104. package/src/client/navigation-scripts/rerun-queue.d.ts +37 -0
  105. package/src/client/navigation-scripts/rerun-queue.js +73 -0
  106. package/src/client/scroll.d.ts +17 -0
  107. package/src/client/scroll.js +25 -0
  108. package/src/client/scroll.test.browser.js +37 -0
  109. package/src/client/view-transitions.d.ts +16 -0
  110. package/src/client/view-transitions.js +63 -0
  111. package/src/config/config-builder.d.ts +12 -7
  112. package/src/config/config-builder.js +12 -9
  113. package/src/dev/client-bridge-registry.d.ts +5 -0
  114. package/src/dev/client-bridge-registry.js +15 -0
  115. package/src/dev/dev-client-ownership.d.ts +7 -0
  116. package/src/dev/dev-client-ownership.js +6 -0
  117. package/src/dev/hmr-manager-registry.d.ts +8 -0
  118. package/src/dev/hmr-manager-registry.js +15 -0
  119. package/src/dev/host-runtime.d.ts +3 -0
  120. package/src/dev/host-runtime.js +7 -0
  121. package/src/dev/runtime-server-started-message.d.ts +2 -0
  122. package/src/dev/runtime-server-started-message.js +6 -0
  123. package/src/eco/README.md +11 -0
  124. package/src/eco/eco-declared-component.d.ts +14 -0
  125. package/src/eco/eco-declared-component.js +16 -0
  126. package/src/eco/eco.browser.js +5 -6
  127. package/src/eco/eco.js +5 -6
  128. package/src/eco/eco.types.d.ts +2 -2
  129. package/src/eco/page-layout-normalization.d.ts +21 -0
  130. package/src/eco/page-layout-normalization.js +59 -0
  131. package/src/errors/index.d.ts +1 -0
  132. package/src/errors/index.js +7 -1
  133. package/src/errors/undeclared-component-dependency-error.d.ts +11 -0
  134. package/src/errors/undeclared-component-dependency-error.js +17 -0
  135. package/src/hmr/client/hmr-runtime.js +5 -2
  136. package/src/hmr/hmr-entrypoint-output.d.ts +43 -0
  137. package/src/hmr/hmr-entrypoint-output.js +53 -0
  138. package/src/hmr/hmr-strategy.d.ts +15 -0
  139. package/src/hmr/hmr-strategy.js +19 -0
  140. package/src/hmr/strategies/js-hmr-strategy.d.ts +3 -5
  141. package/src/hmr/strategies/js-hmr-strategy.js +67 -19
  142. package/src/hmr/strategies/server-rendered-template-hmr-strategy.d.ts +17 -0
  143. package/src/hmr/strategies/server-rendered-template-hmr-strategy.js +29 -0
  144. package/src/integrations/ghtml/ghtml-renderer.d.ts +2 -6
  145. package/src/integrations/ghtml/ghtml-renderer.js +2 -51
  146. package/src/integrations/ghtml/ghtml.plugin.d.ts +3 -16
  147. package/src/integrations/ghtml/ghtml.plugin.js +7 -14
  148. package/src/plugins/define-integration.d.ts +26 -0
  149. package/src/plugins/define-integration.js +19 -0
  150. package/src/plugins/eco-component-meta-plugin.js +5 -8
  151. package/src/plugins/foreign-jsx-override-plugin.js +4 -6
  152. package/src/plugins/integration-plugin.d.ts +19 -9
  153. package/src/plugins/integration-plugin.js +7 -4
  154. package/src/plugins/jsx-import-source.utils.d.ts +8 -0
  155. package/src/plugins/jsx-import-source.utils.js +26 -0
  156. package/src/plugins/processor.d.ts +19 -4
  157. package/src/plugins/processor.js +22 -4
  158. package/src/plugins/source-transform.d.ts +31 -0
  159. package/src/plugins/source-transform.js +23 -1
  160. package/src/route-renderer/GRAPH.md +8 -8
  161. package/src/route-renderer/README.md +30 -28
  162. package/src/route-renderer/orchestration/component-graph-collectors.d.ts +10 -0
  163. package/src/route-renderer/orchestration/component-graph-collectors.js +143 -0
  164. package/src/route-renderer/orchestration/component-graph.d.ts +36 -0
  165. package/src/route-renderer/orchestration/component-graph.js +98 -0
  166. package/src/route-renderer/orchestration/component-render-context.d.ts +3 -10
  167. package/src/route-renderer/orchestration/component-render-context.js +3 -1
  168. package/src/route-renderer/orchestration/declared-ownership-graph.d.ts +1 -18
  169. package/src/route-renderer/orchestration/declared-ownership-graph.js +5 -31
  170. package/src/route-renderer/orchestration/document-shell-render.service.d.ts +90 -0
  171. package/src/route-renderer/orchestration/document-shell-render.service.js +120 -0
  172. package/src/route-renderer/orchestration/foreign-subtree-execution.service.d.ts +59 -29
  173. package/src/route-renderer/orchestration/foreign-subtree-execution.service.js +164 -35
  174. package/src/route-renderer/orchestration/global-injector-assets.service.d.ts +7 -0
  175. package/src/route-renderer/orchestration/global-injector-assets.service.js +32 -0
  176. package/src/route-renderer/orchestration/integration-renderer.d.ts +18 -54
  177. package/src/route-renderer/orchestration/integration-renderer.js +113 -195
  178. package/src/route-renderer/orchestration/integration-route-render-adapter.d.ts +38 -0
  179. package/src/route-renderer/orchestration/integration-route-render-adapter.js +27 -0
  180. package/src/route-renderer/orchestration/layout-shell-props.service.d.ts +20 -0
  181. package/src/route-renderer/orchestration/layout-shell-props.service.js +31 -0
  182. package/src/route-renderer/orchestration/ownership-validation.service.d.ts +5 -0
  183. package/src/route-renderer/orchestration/ownership-validation.service.js +29 -1
  184. package/src/route-renderer/orchestration/page-browser-graph-contribution.loader.d.ts +9 -0
  185. package/src/route-renderer/orchestration/page-browser-graph-contribution.loader.js +7 -0
  186. package/src/route-renderer/orchestration/page-browser-graph.service.d.ts +25 -0
  187. package/src/route-renderer/orchestration/page-browser-graph.service.js +174 -0
  188. package/src/route-renderer/orchestration/render-output.utils.d.ts +2 -0
  189. package/src/route-renderer/orchestration/render-output.utils.js +4 -0
  190. package/src/route-renderer/orchestration/route-html-finalization.service.d.ts +17 -0
  191. package/src/route-renderer/orchestration/route-html-finalization.service.js +26 -0
  192. package/src/route-renderer/orchestration/route-prepared-options.builder.d.ts +26 -0
  193. package/src/route-renderer/orchestration/route-prepared-options.builder.js +54 -0
  194. package/src/route-renderer/orchestration/route-prepared-options.utils.d.ts +4 -0
  195. package/src/route-renderer/orchestration/route-prepared-options.utils.js +33 -0
  196. package/src/route-renderer/orchestration/route-render-orchestrator.d.ts +8 -39
  197. package/src/route-renderer/orchestration/route-render-orchestrator.js +53 -461
  198. package/src/route-renderer/orchestration/string-markup-renderer.d.ts +14 -0
  199. package/src/route-renderer/orchestration/string-markup-renderer.js +55 -0
  200. package/src/route-renderer/page-loading/component-dependency-collection.js +5 -2
  201. package/src/router/client/link-intent.d.ts +11 -21
  202. package/src/router/client/link-intent.js +10 -0
  203. package/src/router/client/link-intent.test.browser.js +12 -1
  204. package/src/router/client/link-navigation-policy.d.ts +45 -0
  205. package/src/router/client/link-navigation-policy.js +101 -0
  206. package/src/router/client/link-navigation-policy.test.browser.d.ts +1 -0
  207. package/src/router/client/link-navigation-policy.test.browser.js +92 -0
  208. package/src/router/client/navigation-coordinator.d.ts +1 -1
  209. package/src/router/client/navigation-coordinator.js +12 -2
  210. package/src/services/assets/asset-processing-service/browser-runtime-asset.factory.d.ts +1 -0
  211. package/src/services/assets/asset-processing-service/browser-runtime-asset.factory.js +1 -0
  212. package/src/services/assets/asset-processing-service/browser-runtime-entry.factory.d.ts +4 -2
  213. package/src/services/assets/asset-processing-service/browser-runtime-entry.factory.js +27 -7
  214. package/src/services/assets/asset-processing-service/processors/script/file-script.processor.d.ts +0 -1
  215. package/src/services/assets/asset-processing-service/processors/script/file-script.processor.js +18 -15
  216. package/src/services/assets/asset-processing-service/processors/script/node-module-script.processor.js +17 -3
  217. package/src/services/assets/asset-processing-service/processors/stylesheet/content-stylesheet.processor.d.ts +0 -3
  218. package/src/services/assets/asset-processing-service/processors/stylesheet/content-stylesheet.processor.js +2 -31
  219. package/src/services/assets/asset-processing-service/processors/stylesheet/file-stylesheet.processor.d.ts +0 -3
  220. package/src/services/assets/asset-processing-service/processors/stylesheet/file-stylesheet.processor.js +2 -30
  221. package/src/services/assets/asset-processing-service/processors/stylesheet/stylesheet-processor-pipeline.d.ts +2 -0
  222. package/src/services/assets/asset-processing-service/processors/stylesheet/stylesheet-processor-pipeline.js +43 -0
  223. package/src/services/assets/browser-bundle.service.d.ts +3 -1
  224. package/src/services/assets/browser-bundle.service.js +17 -5
  225. package/src/services/html/html-transformer.service.d.ts +1 -1
  226. package/src/services/html/html-transformer.service.js +4 -4
  227. package/src/services/invalidation/development-invalidation.service.d.ts +20 -2
  228. package/src/services/invalidation/development-invalidation.service.js +56 -2
  229. package/src/services/module-loading/README.md +49 -0
  230. package/src/services/module-loading/app-server-module-transpiler.service.js +5 -17
  231. package/src/services/module-loading/page-module-import.service.d.ts +5 -1
  232. package/src/services/module-loading/page-module-import.service.js +96 -45
  233. package/src/services/module-loading/route-module-build-cache-registry.d.ts +24 -0
  234. package/src/services/module-loading/route-module-build-cache-registry.js +37 -0
  235. package/src/services/module-loading/route-module-build-cache.d.ts +4 -0
  236. package/src/services/module-loading/route-module-build-cache.js +38 -0
  237. package/src/services/module-loading/route-module-build-cache.store.d.ts +57 -0
  238. package/src/services/module-loading/route-module-build-cache.store.js +207 -0
  239. package/src/services/module-loading/route-module-build-manifest.d.ts +61 -0
  240. package/src/services/module-loading/route-module-build-manifest.js +116 -0
  241. package/src/services/module-loading/route-module-dependency-hasher.d.ts +81 -0
  242. package/src/services/module-loading/route-module-dependency-hasher.js +122 -0
  243. package/src/services/module-loading/server-module-transpiler.service.js +1 -1
  244. package/src/static-site-generator/README.md +33 -0
  245. package/src/static-site-generator/static-build-invalidation.d.ts +10 -0
  246. package/src/static-site-generator/static-build-invalidation.js +59 -0
  247. package/src/static-site-generator/static-export-context.d.ts +22 -0
  248. package/src/static-site-generator/static-export-context.js +0 -0
  249. package/src/static-site-generator/static-site-generator.d.ts +17 -20
  250. package/src/static-site-generator/static-site-generator.js +188 -85
  251. package/src/types/internal-types.d.ts +16 -9
  252. package/src/types/public-types.d.ts +144 -40
  253. package/src/utils/parse-cli-args.d.ts +2 -0
  254. package/src/utils/parse-cli-args.js +6 -0
  255. package/src/utils/server-utils.module.d.ts +3 -2
  256. package/src/utils/server-utils.module.js +5 -6
  257. package/src/utils/static-file-extensions.d.ts +12 -0
  258. package/src/utils/static-file-extensions.js +48 -0
  259. package/src/watchers/project-watcher-ignore.d.ts +11 -0
  260. package/src/watchers/project-watcher-ignore.js +16 -0
  261. package/src/watchers/project-watcher.d.ts +26 -3
  262. package/src/watchers/project-watcher.js +132 -30
  263. package/src/watchers/project-watcher.test-helpers.js +5 -5
  264. package/src/build/rolldown-dev-build-adapter.d.ts +0 -82
  265. package/src/build/rolldown-dev-build-adapter.js +0 -166
  266. package/src/hmr/hmr.postcss.test.e2e.js +0 -31
  267. package/src/hmr/hmr.test.e2e.js +0 -43
  268. package/src/route-renderer/orchestration/ownership-planning.service.d.ts +0 -24
  269. package/src/route-renderer/orchestration/ownership-planning.service.js +0 -63
  270. package/src/route-renderer/orchestration/queued-foreign-subtree-resolution.service.d.ts +0 -91
  271. package/src/route-renderer/orchestration/queued-foreign-subtree-resolution.service.js +0 -170
  272. /package/src/{hmr/hmr.postcss.test.e2e.d.ts → client/navigation-scripts/navigation-scripts.test.browser.d.ts} +0 -0
  273. /package/src/{hmr/hmr.test.e2e.d.ts → client/scroll.test.browser.d.ts} +0 -0
@@ -0,0 +1,20 @@
1
+ import type { EcoPageLayoutEntry, LayoutPropsContext } from '../../types/public-types.js';
2
+ export type LayoutShellPropsContext = LayoutPropsContext & {
3
+ pageProps?: Record<string, unknown>;
4
+ };
5
+ /**
6
+ * Resolves the default shell props passed to a layout tier during route render.
7
+ */
8
+ export declare function resolveLayoutShellProps(context: LayoutShellPropsContext): Record<string, unknown>;
9
+ /**
10
+ * Resolves props for one layout entry, merging shell props with an optional factory.
11
+ */
12
+ export declare function resolveLayoutEntryProps(entry: EcoPageLayoutEntry, context: LayoutShellPropsContext): Record<string, unknown>;
13
+ /**
14
+ * Reads the normalized layout stack from a page component config.
15
+ */
16
+ export declare function resolvePageLayoutComponents(layouts?: EcoPageLayoutEntry['component'][]): EcoPageLayoutEntry['component'][];
17
+ /**
18
+ * Returns the innermost layout component from a normalized page layout stack.
19
+ */
20
+ export declare function resolveInnermostPageLayout(layouts?: EcoPageLayoutEntry['component'][]): EcoPageLayoutEntry['component'] | undefined;
@@ -0,0 +1,31 @@
1
+ function resolveLayoutShellProps(context) {
2
+ return context.locals ? { locals: context.locals } : {};
3
+ }
4
+ function resolveLayoutEntryProps(entry, context) {
5
+ const shellProps = resolveLayoutShellProps(context);
6
+ if (!entry.props) {
7
+ return shellProps;
8
+ }
9
+ const layoutPropsContext = {
10
+ params: context.params,
11
+ query: context.query,
12
+ locals: context.locals
13
+ };
14
+ return {
15
+ ...shellProps,
16
+ ...entry.props(layoutPropsContext)
17
+ };
18
+ }
19
+ function resolvePageLayoutComponents(layouts) {
20
+ return layouts && layouts.length > 0 ? layouts : [];
21
+ }
22
+ function resolveInnermostPageLayout(layouts) {
23
+ const stack = resolvePageLayoutComponents(layouts);
24
+ return stack[stack.length - 1];
25
+ }
26
+ export {
27
+ resolveInnermostPageLayout,
28
+ resolveLayoutEntryProps,
29
+ resolveLayoutShellProps,
30
+ resolvePageLayoutComponents
31
+ };
@@ -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,6 @@
1
+ import { assertEcoDeclaredComponent } from "../../eco/eco-declared-component.js";
1
2
  import { mapDeclaredOwnershipGraph } from "./declared-ownership-graph.js";
3
+ import { walkComponentGraph } from "./component-graph.js";
2
4
  class OwnershipValidationService {
3
5
  appConfig;
4
6
  /**
@@ -11,6 +13,7 @@ class OwnershipValidationService {
11
13
  * Validates foreign ownership edges reachable from the supplied route roots.
12
14
  */
13
15
  validate(input) {
16
+ this.assertDeclaredComponentDependencies(input);
14
17
  return mapDeclaredOwnershipGraph({
15
18
  roots: input.roots,
16
19
  currentIntegrationName: input.currentIntegrationName,
@@ -20,6 +23,9 @@ class OwnershipValidationService {
20
23
  if (!isForeignToParent) {
21
24
  return errors;
22
25
  }
26
+ if (integrationName === "html") {
27
+ return errors;
28
+ }
23
29
  if (!componentMeta) {
24
30
  errors.push({
25
31
  code: "MISSING_COMPONENT_METADATA",
@@ -41,6 +47,21 @@ class OwnershipValidationService {
41
47
  }
42
48
  }).flat();
43
49
  }
50
+ assertDeclaredComponentDependencies(input) {
51
+ walkComponentGraph({
52
+ roots: input.roots,
53
+ currentIntegrationName: input.currentIntegrationName,
54
+ onComponent: ({ component }) => {
55
+ const parentFile = component.config?.__eco?.file;
56
+ for (const child of component.config?.dependencies?.components ?? []) {
57
+ if (!child) {
58
+ continue;
59
+ }
60
+ assertEcoDeclaredComponent(child, { parentComponentFile: parentFile });
61
+ }
62
+ }
63
+ });
64
+ }
44
65
  isRegisteredIntegration(integrationName, currentIntegrationName) {
45
66
  if (integrationName === currentIntegrationName) {
46
67
  return true;
@@ -48,6 +69,13 @@ class OwnershipValidationService {
48
69
  return this.appConfig.integrations.some((integration) => integration.name === integrationName);
49
70
  }
50
71
  }
72
+ function throwIfOwnershipInvalid(validationErrors) {
73
+ if (validationErrors.length === 0) {
74
+ return;
75
+ }
76
+ throw new Error(validationErrors.map((error) => error.message).join("\n"));
77
+ }
51
78
  export {
52
- OwnershipValidationService
79
+ OwnershipValidationService,
80
+ throwIfOwnershipInvalid
53
81
  };
@@ -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>;
@@ -0,0 +1,7 @@
1
+ async function loadPageBrowserGraphContribution(routeFile, importPageFile, collectContribution) {
2
+ const pageModule = await importPageFile(routeFile);
3
+ return collectContribution({ file: routeFile, pageModule });
4
+ }
5
+ export {
6
+ loadPageBrowserGraphContribution
7
+ };
@@ -0,0 +1,25 @@
1
+ import type { EcoPagesAppConfig } from '../../types/internal-types.js';
2
+ import type { PageBrowserGraphContribution, PageBrowserGraphResult } from '../../types/public-types.js';
3
+ import { type AssetProcessingService } from '../../services/assets/asset-processing-service/index.js';
4
+ export type PageBrowserGraphResolveInput = {
5
+ routeFile: string;
6
+ integrationName: string;
7
+ collectContribution: (routeFile: string) => Promise<PageBrowserGraphContribution | undefined>;
8
+ };
9
+ /**
10
+ * Resolves declarative page browser graph assets for one route and integration.
11
+ */
12
+ export declare class PageBrowserGraphService {
13
+ private readonly appConfig;
14
+ private readonly assetProcessingService;
15
+ private readonly pageBrowserGraphCache;
16
+ private readonly groupedPageBrowserGraphCache;
17
+ constructor(appConfig: EcoPagesAppConfig, assetProcessingService: AssetProcessingService);
18
+ resolvePageBrowserGraph(input: PageBrowserGraphResolveInput): Promise<PageBrowserGraphResult | undefined>;
19
+ private isHmrEnabled;
20
+ private buildPageBrowserGraph;
21
+ private resolveGroupedPageBrowserAssets;
22
+ private buildGroupedPageBrowserAssets;
23
+ private listIntegrationRouteFiles;
24
+ private partitionPageBrowserGraphAssets;
25
+ }
@@ -0,0 +1,174 @@
1
+ import path from "node:path";
2
+ import { fileSystem } from "@ecopages/file-system";
3
+ import {
4
+ } from "../../services/assets/asset-processing-service/index.js";
5
+ import { appLogger } from "../../global/app-logger.js";
6
+ function isGroupedContentScriptAsset(asset) {
7
+ return asset.kind === "script" && asset.source === "content" && Boolean(asset.groupedBundle?.id);
8
+ }
9
+ function getGroupedBundleAssetKey(groupedBundle) {
10
+ return `${groupedBundle.id}:${groupedBundle.entryName}`;
11
+ }
12
+ class PageBrowserGraphService {
13
+ appConfig;
14
+ assetProcessingService;
15
+ pageBrowserGraphCache = /* @__PURE__ */ new Map();
16
+ groupedPageBrowserGraphCache = /* @__PURE__ */ new Map();
17
+ constructor(appConfig, assetProcessingService) {
18
+ this.appConfig = appConfig;
19
+ this.assetProcessingService = assetProcessingService;
20
+ }
21
+ async resolvePageBrowserGraph(input) {
22
+ if (this.isHmrEnabled()) {
23
+ return await this.buildPageBrowserGraph(input);
24
+ }
25
+ const cacheKey = `${input.integrationName}:${input.routeFile}`;
26
+ const cachedGraph = this.pageBrowserGraphCache.get(cacheKey);
27
+ if (cachedGraph) {
28
+ return await cachedGraph;
29
+ }
30
+ const pendingGraph = this.buildPageBrowserGraph(input).catch((error) => {
31
+ this.pageBrowserGraphCache.delete(cacheKey);
32
+ throw error;
33
+ });
34
+ this.pageBrowserGraphCache.set(cacheKey, pendingGraph);
35
+ return await pendingGraph;
36
+ }
37
+ isHmrEnabled() {
38
+ return typeof this.assetProcessingService.getHmrManager === "function" && this.assetProcessingService.getHmrManager()?.isEnabled() === true;
39
+ }
40
+ async buildPageBrowserGraph(input) {
41
+ const contribution = await input.collectContribution(input.routeFile);
42
+ if (!contribution) {
43
+ return void 0;
44
+ }
45
+ const groupedDependencies = (contribution.dependencies ?? []).filter((dep) => isGroupedContentScriptAsset(dep));
46
+ const ungroupedDependencies = (contribution.dependencies ?? []).filter(
47
+ (dep) => !isGroupedContentScriptAsset(dep)
48
+ );
49
+ const groupedAssets = groupedDependencies.length ? (await this.resolveGroupedPageBrowserAssets(input, contribution)).get(input.routeFile) ?? [] : [];
50
+ const processedDependencies = ungroupedDependencies.length ? await this.assetProcessingService.processDependencies(
51
+ ungroupedDependencies,
52
+ `${input.integrationName}:${input.routeFile}`
53
+ ) : [];
54
+ const resolvedAssets = [...processedDependencies, ...groupedAssets, ...contribution.assets ?? []];
55
+ return this.partitionPageBrowserGraphAssets(resolvedAssets);
56
+ }
57
+ async resolveGroupedPageBrowserAssets(input, currentContribution) {
58
+ if (this.isHmrEnabled()) {
59
+ const result = await this.buildGroupedPageBrowserAssets(input, currentContribution);
60
+ return result.assetsByRoute;
61
+ }
62
+ const cacheKey = input.integrationName;
63
+ let pending = this.groupedPageBrowserGraphCache.get(cacheKey);
64
+ if (!pending) {
65
+ pending = this.buildGroupedPageBrowserAssets(input, currentContribution).then((result) => {
66
+ if (result.hasCollectionFailures) {
67
+ this.groupedPageBrowserGraphCache.delete(cacheKey);
68
+ }
69
+ return result.assetsByRoute;
70
+ }).catch((error) => {
71
+ this.groupedPageBrowserGraphCache.delete(cacheKey);
72
+ throw error;
73
+ });
74
+ this.groupedPageBrowserGraphCache.set(cacheKey, pending);
75
+ }
76
+ return await pending;
77
+ }
78
+ async buildGroupedPageBrowserAssets(input, currentContribution) {
79
+ const routeFiles = await this.listIntegrationRouteFiles(input.integrationName);
80
+ const currentRouteGroupedDependencies = (currentContribution.dependencies ?? []).filter(
81
+ (dep) => isGroupedContentScriptAsset(dep)
82
+ );
83
+ const groupedDependencies = [...currentRouteGroupedDependencies];
84
+ const groupedAssetKeysByRoute = /* @__PURE__ */ new Map();
85
+ let hasCollectionFailures = false;
86
+ if (currentRouteGroupedDependencies.length > 0) {
87
+ groupedAssetKeysByRoute.set(
88
+ input.routeFile,
89
+ new Set(currentRouteGroupedDependencies.map((dep) => getGroupedBundleAssetKey(dep.groupedBundle)))
90
+ );
91
+ }
92
+ for (const routeFile of routeFiles) {
93
+ if (routeFile === input.routeFile) {
94
+ continue;
95
+ }
96
+ let contribution;
97
+ try {
98
+ contribution = await input.collectContribution(routeFile);
99
+ } catch (error) {
100
+ hasCollectionFailures = true;
101
+ appLogger.warn(
102
+ `Skipping grouped page-browser contribution for ${routeFile}: ${error instanceof Error ? error.message : String(error)}`
103
+ );
104
+ continue;
105
+ }
106
+ if (!contribution?.dependencies?.length) {
107
+ continue;
108
+ }
109
+ const routeGroupedDependencies = contribution.dependencies.filter(
110
+ (dep) => isGroupedContentScriptAsset(dep)
111
+ );
112
+ if (routeGroupedDependencies.length === 0) {
113
+ continue;
114
+ }
115
+ groupedDependencies.push(...routeGroupedDependencies);
116
+ groupedAssetKeysByRoute.set(
117
+ routeFile,
118
+ new Set(routeGroupedDependencies.map((dep) => getGroupedBundleAssetKey(dep.groupedBundle)))
119
+ );
120
+ }
121
+ if (groupedDependencies.length === 0) {
122
+ return {
123
+ assetsByRoute: /* @__PURE__ */ new Map(),
124
+ hasCollectionFailures
125
+ };
126
+ }
127
+ const processedGroupedDependencies = await this.assetProcessingService.processDependencies(
128
+ groupedDependencies,
129
+ `${input.integrationName}:grouped-page-browser-graph`
130
+ );
131
+ const groupedAssetsByRoute = /* @__PURE__ */ new Map();
132
+ for (const [routeFile, groupedAssetKeys] of groupedAssetKeysByRoute) {
133
+ groupedAssetsByRoute.set(
134
+ routeFile,
135
+ processedGroupedDependencies.filter((asset) => {
136
+ if (!asset.groupedBundle) {
137
+ return false;
138
+ }
139
+ return groupedAssetKeys.has(getGroupedBundleAssetKey(asset.groupedBundle));
140
+ })
141
+ );
142
+ }
143
+ return {
144
+ assetsByRoute: groupedAssetsByRoute,
145
+ hasCollectionFailures
146
+ };
147
+ }
148
+ async listIntegrationRouteFiles(integrationName) {
149
+ const integration = this.appConfig.integrations.find((plugin) => plugin.name === integrationName);
150
+ if (!integration) {
151
+ return [];
152
+ }
153
+ const scannedFiles = await fileSystem.glob(
154
+ integration.extensions.map((extension) => `**/*${extension}`),
155
+ { cwd: this.appConfig.absolutePaths.pagesDir }
156
+ );
157
+ return scannedFiles.filter((file) => !file.includes(".ecopages-node.")).map((file) => path.join(this.appConfig.absolutePaths.pagesDir, file)).sort((left, right) => left.localeCompare(right));
158
+ }
159
+ partitionPageBrowserGraphAssets(assets) {
160
+ const entryAssets = [];
161
+ const chunkAssets = [];
162
+ for (const asset of assets) {
163
+ if (asset.packageRole === "dynamic-chunk") {
164
+ chunkAssets.push(asset);
165
+ continue;
166
+ }
167
+ entryAssets.push(asset);
168
+ }
169
+ return { entryAssets, chunkAssets };
170
+ }
171
+ }
172
+ export {
173
+ PageBrowserGraphService
174
+ };
@@ -21,6 +21,8 @@ type MarkupNodeLikeShape = {
21
21
  * @typeParam T Expected resolved type of the thenable.
22
22
  */
23
23
  export declare function isThenable<T>(value: unknown): value is PromiseLike<T>;
24
+ /** Returns whether a value looks like a DOM-like markup node from SSR integrations. */
25
+ export declare function isMarkupNodeLike(value: unknown): value is MarkupNodeLikeShape;
24
26
  /**
25
27
  * Injects `data-eco-trigger` into the first real HTML element opening tag of
26
28
  * a component's rendered output string.
@@ -82,6 +82,9 @@ function isTemplateContentShape(value) {
82
82
  function isMarkupNodeLikeShape(value) {
83
83
  return typeof value === "object" && value !== null && typeof value.nodeType === "number";
84
84
  }
85
+ function isMarkupNodeLike(value) {
86
+ return isMarkupNodeLikeShape(value);
87
+ }
85
88
  function injectTriggerAttributeIntoString(content, triggerId) {
86
89
  const str = content;
87
90
  let i = 0;
@@ -165,6 +168,7 @@ export {
165
168
  addTriggerAttribute,
166
169
  decodeHtmlEntities,
167
170
  inspectUnresolvedMarkerArtifactHtml,
171
+ isMarkupNodeLike,
168
172
  isThenable,
169
173
  normalizeUnresolvedMarkerArtifactHtml,
170
174
  wrapWithScriptsInjector
@@ -0,0 +1,17 @@
1
+ import type { HtmlDocumentContribution } from '../../services/html/html-transformer.service.js';
2
+ import type { IntegrationRendererRenderOptions } from '../../types/public-types.js';
3
+ import type { RouteHtmlFinalization } from './route-render-orchestrator.js';
4
+ export type RouteHtmlFinalizationContext<C> = {
5
+ renderOptions: IntegrationRendererRenderOptions<C>;
6
+ getDocumentAttributes: (renderOptions: IntegrationRendererRenderOptions<C>) => Record<string, string> | undefined;
7
+ getHtmlDocumentContributions: (options: {
8
+ renderOptions: IntegrationRendererRenderOptions<C>;
9
+ partial: boolean;
10
+ }) => HtmlDocumentContribution[] | undefined;
11
+ applyAttributesToFirstBodyElement: (html: string, attributes: Record<string, string>) => string;
12
+ applyAttributesToHtmlElement: (html: string, attributes: Record<string, string>) => string;
13
+ };
14
+ /**
15
+ * Builds the structural HTML finalization plan for one prepared route render.
16
+ */
17
+ export declare function buildRouteHtmlFinalization<C>(context: RouteHtmlFinalizationContext<C>): RouteHtmlFinalization;
@@ -0,0 +1,26 @@
1
+ function buildRouteHtmlFinalization(context) {
2
+ const { renderOptions } = context;
3
+ const componentRootAttributes = renderOptions.componentRender?.canAttachAttributes && renderOptions.componentRender.rootAttributes && Object.keys(renderOptions.componentRender.rootAttributes).length > 0 ? renderOptions.componentRender.rootAttributes : void 0;
4
+ const documentAttributes = context.getDocumentAttributes(renderOptions);
5
+ const htmlContributions = context.getHtmlDocumentContributions({ renderOptions, partial: false });
6
+ const hasStructuralFinalization = componentRootAttributes && Object.keys(componentRootAttributes).length > 0 || documentAttributes && Object.keys(documentAttributes).length > 0;
7
+ if (!hasStructuralFinalization && (!htmlContributions || htmlContributions.length === 0)) {
8
+ return {};
9
+ }
10
+ return {
11
+ htmlContributions,
12
+ finalizeHtml: (html) => {
13
+ let renderedHtml = html;
14
+ if (componentRootAttributes) {
15
+ renderedHtml = context.applyAttributesToFirstBodyElement(renderedHtml, componentRootAttributes);
16
+ }
17
+ if (documentAttributes) {
18
+ renderedHtml = context.applyAttributesToHtmlElement(renderedHtml, documentAttributes);
19
+ }
20
+ return renderedHtml;
21
+ }
22
+ };
23
+ }
24
+ export {
25
+ buildRouteHtmlFinalization
26
+ };
@@ -0,0 +1,26 @@
1
+ import type { EcoPagesAppConfig } from '../../types/internal-types.js';
2
+ import type { ComponentRenderResult, EcoComponent, EcoPageComponent, EcoPageFile, HtmlTemplateProps, IntegrationRendererRenderOptions, PageBrowserGraphResult, PageMetadataProps, EcoPageLayoutEntry, RouteRendererOptions } from '../../types/public-types.js';
3
+ import { type ProcessedAsset } from '../../services/assets/asset-processing-service/index.js';
4
+ type PreparedRenderInputs = {
5
+ Page: EcoPageFile['default'] | EcoPageComponent<any>;
6
+ HtmlTemplate: EcoComponent<HtmlTemplateProps>;
7
+ Layouts: EcoComponent[];
8
+ Layout?: EcoComponent;
9
+ layoutEntries?: EcoPageLayoutEntry[];
10
+ props: Record<string, unknown>;
11
+ metadata: PageMetadataProps;
12
+ integrationSpecificProps: Record<string, unknown>;
13
+ };
14
+ /**
15
+ * Assembles the final integration render options after route prep dependencies resolve.
16
+ */
17
+ export declare function buildPreparedRenderOptions<C = unknown>(input: {
18
+ routeOptions: RouteRendererOptions;
19
+ resolvedInputs: PreparedRenderInputs;
20
+ resolvedDependencies: ProcessedAsset[];
21
+ allDependencies: ProcessedAsset[];
22
+ pageBrowserGraph?: PageBrowserGraphResult;
23
+ componentRender?: ComponentRenderResult;
24
+ appConfig: EcoPagesAppConfig;
25
+ }): IntegrationRendererRenderOptions<C>;
26
+ export {};
@@ -0,0 +1,54 @@
1
+ import { createPagePackage } from "../../services/assets/asset-processing-service/index.js";
2
+ import { dedupeProcessedAssets } from "./processed-asset-dedupe.js";
3
+ import { createPageLocalsProxy } from "./route-prepared-options.utils.js";
4
+ function buildPreparedRenderOptions(input) {
5
+ const {
6
+ routeOptions,
7
+ resolvedInputs,
8
+ resolvedDependencies,
9
+ allDependencies,
10
+ pageBrowserGraph,
11
+ componentRender,
12
+ appConfig
13
+ } = input;
14
+ const { Page, HtmlTemplate, Layouts, Layout, layoutEntries, props, metadata, integrationSpecificProps } = resolvedInputs;
15
+ const dedupedDependencies = dedupeProcessedAssets(allDependencies);
16
+ const pagePackage = createPagePackage(dedupedDependencies, { pageBrowserGraph });
17
+ const pageProps = {
18
+ ...props,
19
+ params: routeOptions.params || {},
20
+ query: routeOptions.query || {}
21
+ };
22
+ const cacheStrategy = Page.cache;
23
+ const defaultCacheStrategy = appConfig.cache?.defaultStrategy ?? "static";
24
+ const effectiveCacheStrategy = cacheStrategy ?? defaultCacheStrategy;
25
+ const localsAvailable = effectiveCacheStrategy === "dynamic" && routeOptions.locals !== void 0;
26
+ const pageLocals = localsAvailable ? routeOptions.locals : createPageLocalsProxy(routeOptions.file);
27
+ const locals = localsAvailable ? routeOptions.locals : void 0;
28
+ const preparedOptions = {
29
+ ...routeOptions,
30
+ resolvedDependencies,
31
+ pagePackage,
32
+ componentRender,
33
+ HtmlTemplate,
34
+ Layouts,
35
+ Layout,
36
+ layoutEntries,
37
+ props,
38
+ Page,
39
+ metadata,
40
+ params: routeOptions.params || {},
41
+ query: routeOptions.query || {},
42
+ pageProps,
43
+ locals,
44
+ pageLocals,
45
+ cacheStrategy
46
+ };
47
+ return {
48
+ ...integrationSpecificProps,
49
+ ...preparedOptions
50
+ };
51
+ }
52
+ export {
53
+ buildPreparedRenderOptions
54
+ };
@@ -0,0 +1,4 @@
1
+ /**
2
+ * Proxy that throws when dynamic route locals are accessed on non-dynamic pages.
3
+ */
4
+ export declare function createPageLocalsProxy(filePath: string): Record<string, never>;
@@ -0,0 +1,33 @@
1
+ import { LocalsAccessError } from "../../errors/locals-access-error.js";
2
+ function createPageLocalsProxy(filePath) {
3
+ const errorMessage = `[ecopages] Request locals are only available during request-time rendering with cache: 'dynamic'. Page: ${filePath}. If you meant to use locals here, set cache: 'dynamic' and provide locals from route middleware/handlers.`;
4
+ return new Proxy(
5
+ {},
6
+ {
7
+ get: () => {
8
+ throw new LocalsAccessError(errorMessage);
9
+ },
10
+ set: () => {
11
+ throw new LocalsAccessError(errorMessage);
12
+ },
13
+ has: () => {
14
+ throw new LocalsAccessError(errorMessage);
15
+ },
16
+ ownKeys: () => {
17
+ throw new LocalsAccessError(errorMessage);
18
+ },
19
+ deleteProperty: () => {
20
+ throw new LocalsAccessError(errorMessage);
21
+ },
22
+ defineProperty: () => {
23
+ throw new LocalsAccessError(errorMessage);
24
+ },
25
+ getOwnPropertyDescriptor: () => {
26
+ throw new LocalsAccessError(errorMessage);
27
+ }
28
+ }
29
+ );
30
+ }
31
+ export {
32
+ createPageLocalsProxy
33
+ };
@@ -1,13 +1,15 @@
1
1
  import type { EcoPagesAppConfig } from '../../types/internal-types.js';
2
- import type { ComponentRenderResult, EcoComponent, EcoPageComponent, EcoPageFile, HtmlTemplateProps, IntegrationRendererRenderOptions, PageBrowserGraphContribution, PageBrowserGraphResult, PageMetadataProps, RouteRendererBody, RouteRendererOptions, RouteRenderResult } from '../../types/public-types.js';
3
- import { type AssetProcessingService, type ProcessedAsset } from '../../services/assets/asset-processing-service/index.js';
2
+ import type { ComponentRenderResult, EcoComponent, EcoPageComponent, EcoPageFile, HtmlTemplateProps, IntegrationRendererRenderOptions, PageBrowserGraphContribution, PageBrowserGraphResult, PageMetadataProps, RouteRendererBody, RouteRendererOptions, RouteRenderResult, EcoPageLayoutEntry } from '../../types/public-types.js';
3
+ import type { AssetProcessingService, ProcessedAsset } from '../../services/assets/asset-processing-service/index.js';
4
4
  import type { HtmlDocumentContribution } from '../../services/html/html-transformer.service.js';
5
5
  import { OwnershipValidationService } from './ownership-validation.service.js';
6
- import { OwnershipPlanningService } from './ownership-planning.service.js';
6
+ import { PageBrowserGraphService } from './page-browser-graph.service.js';
7
7
  export type RouteRenderOrchestratorResolvedInputs = {
8
8
  Page: EcoPageFile['default'] | EcoPageComponent<any>;
9
9
  HtmlTemplate: EcoComponent<HtmlTemplateProps>;
10
+ Layouts: EcoComponent[];
10
11
  Layout?: EcoComponent;
12
+ layoutEntries?: EcoPageLayoutEntry[];
11
13
  props: Record<string, unknown>;
12
14
  metadata: PageMetadataProps;
13
15
  integrationSpecificProps: Record<string, unknown>;
@@ -64,7 +66,7 @@ export interface RouteRenderOrchestratorAdapter<C> {
64
66
  /**
65
67
  * Runs SSR-policy response transformation and returns the body value exposed to callers.
66
68
  */
67
- transformRouteResponse(response: Response, htmlContributions?: HtmlDocumentContribution[]): Promise<RouteRendererBody>;
69
+ transformRouteResponse(response: Response, htmlContributions?: HtmlDocumentContribution[], pagePackage?: IntegrationRendererRenderOptions<C>['pagePackage']): Promise<RouteRendererBody>;
68
70
  }
69
71
  /**
70
72
  * Captured route-render output in both replayable body and string HTML forms.
@@ -77,8 +79,8 @@ export interface CapturedHtmlRenderResult {
77
79
  * Optional app-scoped collaborators used by the route render orchestrator.
78
80
  */
79
81
  export interface RouteRenderOrchestratorDependencies {
80
- ownershipPlanningService?: OwnershipPlanningService;
81
82
  ownershipValidationService?: OwnershipValidationService;
83
+ pageBrowserGraphService?: PageBrowserGraphService;
82
84
  }
83
85
  /**
84
86
  * Owns one route render from normalized module loading through final HTML output.
@@ -91,10 +93,8 @@ export interface RouteRenderOrchestratorDependencies {
91
93
  export declare class RouteRenderOrchestrator {
92
94
  private readonly appConfig;
93
95
  private readonly assetProcessingService;
94
- private readonly ownershipPlanningService;
95
96
  private readonly ownershipValidationService;
96
- private readonly pageBrowserGraphCache;
97
- private readonly groupedPageBrowserGraphCache;
97
+ private readonly pageBrowserGraphService;
98
98
  constructor(appConfig: EcoPagesAppConfig, assetProcessingService: AssetProcessingService, dependencies?: RouteRenderOrchestratorDependencies);
99
99
  /**
100
100
  * Builds normalized route render options before the integration render runs.
@@ -109,31 +109,6 @@ export declare class RouteRenderOrchestrator {
109
109
  integrationName: string;
110
110
  collectContribution: (routeFile: string) => Promise<PageBrowserGraphContribution | undefined>;
111
111
  }): Promise<PageBrowserGraphResult | undefined>;
112
- private resolvePageBrowserGraph;
113
- private isHmrEnabled;
114
- private buildPageBrowserGraph;
115
- /**
116
- * Resolves grouped page-browser assets for all routes owned by one integration.
117
- *
118
- * @remarks
119
- * This keeps one shared browser-build result available across sibling routes so
120
- * navigation can reuse the same emitted client graph instead of rebuilding one
121
- * page entry at a time. HMR bypasses this cache because the grouped build must
122
- * reflect the latest source on every request.
123
- */
124
- private resolveGroupedPageBrowserAssets;
125
- /**
126
- * Builds the shared grouped page-browser asset map for one integration.
127
- *
128
- * @remarks
129
- * Each route can declare grouped content-script dependencies that should be
130
- * emitted together. This method collects those declarations across the owning
131
- * integration, runs the grouped processor once, and then maps the emitted
132
- * assets back onto the routes that reference them.
133
- */
134
- private buildGroupedPageBrowserAssets;
135
- private listIntegrationRouteFiles;
136
- private partitionPageBrowserGraphAssets;
137
112
  /**
138
113
  * Captures one route render body as HTML while preserving a replayable body value.
139
114
  */
@@ -147,10 +122,4 @@ export declare class RouteRenderOrchestrator {
147
122
  */
148
123
  executePrepared<C = unknown>(renderOptions: IntegrationRendererRenderOptions<C>, adapter: RouteRenderOrchestratorAdapter<C>): Promise<RouteRenderResult>;
149
124
  private captureRenderedBody;
150
- private collectResolvedTriggers;
151
- private collectUsedIntegrationDependencies;
152
- private collectIntegrationNames;
153
- private buildGlobalInjectorAssets;
154
- private buildEagerSsrLazyAssets;
155
- private collectEagerSsrLazyDependencies;
156
125
  }