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

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/hmr-manager.d.ts +2 -1
  13. package/src/adapters/bun/hmr-manager.js +2 -2
  14. package/src/adapters/bun/server-adapter.d.ts +90 -22
  15. package/src/adapters/bun/server-adapter.js +265 -84
  16. package/src/adapters/bun/static-preview-host.js +25 -20
  17. package/src/adapters/create-app.d.ts +13 -11
  18. package/src/adapters/create-app.js +2 -51
  19. package/src/adapters/index.d.ts +1 -1
  20. package/src/adapters/index.js +1 -2
  21. package/src/adapters/node/create-app.d.ts +5 -1
  22. package/src/adapters/node/create-app.js +51 -12
  23. package/src/adapters/node/node-client-bridge.d.ts +1 -0
  24. package/src/adapters/node/node-client-bridge.js +3 -0
  25. package/src/adapters/node/node-hmr-manager.d.ts +2 -1
  26. package/src/adapters/node/node-hmr-manager.js +2 -2
  27. package/src/adapters/node/server-adapter-dependencies.js +4 -0
  28. package/src/adapters/node/server-adapter.d.ts +62 -20
  29. package/src/adapters/node/server-adapter.js +161 -131
  30. package/src/adapters/node/static-content-server.d.ts +1 -0
  31. package/src/adapters/node/static-content-server.js +10 -2
  32. package/src/adapters/node/static-preview-host.js +27 -12
  33. package/src/adapters/shared/bun-user-websocket-lifecycle.d.ts +22 -0
  34. package/src/adapters/shared/bun-user-websocket-lifecycle.js +96 -0
  35. package/src/adapters/shared/copy-runtime-public-dir.d.ts +6 -0
  36. package/src/adapters/shared/copy-runtime-public-dir.js +24 -0
  37. package/src/adapters/shared/fs-server-response-matcher.d.ts +2 -0
  38. package/src/adapters/shared/fs-server-response-matcher.js +40 -18
  39. package/src/adapters/shared/hmr-entrypoint-registrar.d.ts +0 -2
  40. package/src/adapters/shared/hmr-entrypoint-registrar.js +3 -26
  41. package/src/adapters/shared/hmr-html-response.d.ts +1 -1
  42. package/src/adapters/shared/hmr-html-response.js +4 -1
  43. package/src/adapters/shared/node-http-websocket-upgrades.d.ts +21 -0
  44. package/src/adapters/shared/node-http-websocket-upgrades.js +100 -0
  45. package/src/adapters/shared/port-manager.d.ts +116 -0
  46. package/src/adapters/shared/port-manager.js +196 -0
  47. package/src/adapters/shared/runtime-app-bootstrap.d.ts +2 -1
  48. package/src/adapters/shared/runtime-app-bootstrap.js +3 -6
  49. package/src/adapters/shared/runtime-server-lifecycle.d.ts +38 -0
  50. package/src/adapters/shared/runtime-server-lifecycle.js +43 -0
  51. package/src/adapters/shared/server-adapter.d.ts +2 -1
  52. package/src/adapters/shared/server-adapter.js +13 -6
  53. package/src/adapters/shared/server-route-handler.d.ts +4 -1
  54. package/src/adapters/shared/server-route-handler.js +5 -2
  55. package/src/adapters/shared/server-static-builder.d.ts +23 -32
  56. package/src/adapters/shared/server-static-builder.js +97 -73
  57. package/src/adapters/shared/shared-hmr-manager.d.ts +28 -0
  58. package/src/adapters/shared/shared-hmr-manager.js +119 -9
  59. package/src/adapters/shared/static-preview-host.d.ts +5 -0
  60. package/src/adapters/shared/websocket-lifecycle.d.ts +24 -0
  61. package/src/adapters/shared/websocket-lifecycle.js +55 -0
  62. package/src/build/README.md +77 -14
  63. package/src/build/app-build-manifest-runtime.d.ts +10 -0
  64. package/src/build/app-build-manifest-runtime.js +90 -0
  65. package/src/build/build-adapter.d.ts +17 -319
  66. package/src/build/build-adapter.js +28 -94
  67. package/src/build/build-contracts.d.ts +97 -0
  68. package/src/build/build-contracts.js +0 -0
  69. package/src/build/build-input-fingerprint.d.ts +28 -0
  70. package/src/build/build-input-fingerprint.js +31 -0
  71. package/src/build/build-profile-options.d.ts +7 -0
  72. package/src/build/build-profile-options.js +37 -0
  73. package/src/build/build-runtime.d.ts +24 -0
  74. package/src/build/build-runtime.js +65 -0
  75. package/src/build/deduping-build-executor.d.ts +28 -0
  76. package/src/build/deduping-build-executor.js +56 -0
  77. package/src/build/jsx-ownership-plugins.d.ts +24 -0
  78. package/src/build/jsx-ownership-plugins.js +41 -0
  79. package/src/build/pages-unified-graph-build.d.ts +31 -0
  80. package/src/build/pages-unified-graph-build.js +206 -0
  81. package/src/build/parallel-build-executor.d.ts +21 -0
  82. package/src/build/parallel-build-executor.js +52 -0
  83. package/src/build/production-build-cache.d.ts +20 -0
  84. package/src/build/production-build-cache.js +63 -0
  85. package/src/build/rolldown-adapter-helpers.d.ts +3 -6
  86. package/src/build/rolldown-adapter-helpers.js +71 -6
  87. package/src/build/rolldown-build-adapter.d.ts +2 -6
  88. package/src/build/rolldown-build-adapter.js +3 -3
  89. package/src/build/rolldown-build-invocation-metrics.d.ts +12 -0
  90. package/src/build/rolldown-build-invocation-metrics.js +43 -0
  91. package/src/build/rolldown-plugin-bridge.d.ts +15 -1
  92. package/src/build/rolldown-plugin-bridge.js +20 -5
  93. package/src/build/rolldown-source-transform-pass.d.ts +15 -0
  94. package/src/build/rolldown-source-transform-pass.js +58 -0
  95. package/src/build/runtime-build-executor.d.ts +8 -15
  96. package/src/build/runtime-build-executor.js +12 -15
  97. package/src/build/runtime-build-output-normalizer.d.ts +7 -0
  98. package/src/build/runtime-build-output-normalizer.js +94 -2
  99. package/src/build/server-entry-build-cache.d.ts +44 -0
  100. package/src/build/server-entry-build-cache.js +161 -0
  101. package/src/client/navigation-scripts/classification.d.ts +16 -0
  102. package/src/client/navigation-scripts/classification.js +41 -0
  103. package/src/client/navigation-scripts/index.d.ts +3 -0
  104. package/src/client/navigation-scripts/index.js +23 -0
  105. package/src/client/navigation-scripts/navigation-scripts.test.browser.js +65 -0
  106. package/src/client/navigation-scripts/registry.d.ts +11 -0
  107. package/src/client/navigation-scripts/registry.js +12 -0
  108. package/src/client/navigation-scripts/rerun-queue.d.ts +37 -0
  109. package/src/client/navigation-scripts/rerun-queue.js +73 -0
  110. package/src/client/scroll.d.ts +17 -0
  111. package/src/client/scroll.js +25 -0
  112. package/src/client/scroll.test.browser.js +37 -0
  113. package/src/client/view-transitions.d.ts +16 -0
  114. package/src/client/view-transitions.js +63 -0
  115. package/src/config/config-builder.d.ts +12 -7
  116. package/src/config/config-builder.js +12 -9
  117. package/src/dev/client-bridge-registry.d.ts +5 -0
  118. package/src/dev/client-bridge-registry.js +15 -0
  119. package/src/dev/dev-client-ownership.d.ts +7 -0
  120. package/src/dev/dev-client-ownership.js +6 -0
  121. package/src/dev/hmr-manager-registry.d.ts +8 -0
  122. package/src/dev/hmr-manager-registry.js +15 -0
  123. package/src/dev/host-runtime.d.ts +3 -0
  124. package/src/dev/host-runtime.js +7 -0
  125. package/src/dev/runtime-server-started-message.d.ts +2 -0
  126. package/src/dev/runtime-server-started-message.js +6 -0
  127. package/src/eco/README.md +11 -0
  128. package/src/eco/eco-declared-component.d.ts +14 -0
  129. package/src/eco/eco-declared-component.js +16 -0
  130. package/src/eco/eco.browser.js +5 -6
  131. package/src/eco/eco.js +5 -6
  132. package/src/eco/eco.types.d.ts +2 -2
  133. package/src/eco/page-layout-normalization.d.ts +21 -0
  134. package/src/eco/page-layout-normalization.js +59 -0
  135. package/src/errors/index.d.ts +1 -0
  136. package/src/errors/index.js +7 -1
  137. package/src/errors/undeclared-component-dependency-error.d.ts +11 -0
  138. package/src/errors/undeclared-component-dependency-error.js +17 -0
  139. package/src/hmr/client/hmr-runtime.js +5 -2
  140. package/src/hmr/hmr-entrypoint-output.d.ts +28 -0
  141. package/src/hmr/hmr-entrypoint-output.js +58 -0
  142. package/src/hmr/strategies/js-hmr-strategy.d.ts +3 -0
  143. package/src/hmr/strategies/js-hmr-strategy.js +68 -18
  144. package/src/hmr/strategies/server-rendered-template-hmr-strategy.d.ts +17 -0
  145. package/src/hmr/strategies/server-rendered-template-hmr-strategy.js +29 -0
  146. package/src/integrations/ghtml/ghtml-renderer.d.ts +2 -6
  147. package/src/integrations/ghtml/ghtml-renderer.js +2 -51
  148. package/src/integrations/ghtml/ghtml.plugin.d.ts +3 -16
  149. package/src/integrations/ghtml/ghtml.plugin.js +7 -14
  150. package/src/plugins/define-integration.d.ts +26 -0
  151. package/src/plugins/define-integration.js +19 -0
  152. package/src/plugins/eco-component-meta-plugin.js +5 -8
  153. package/src/plugins/foreign-jsx-override-plugin.js +4 -6
  154. package/src/plugins/integration-plugin.d.ts +19 -9
  155. package/src/plugins/integration-plugin.js +7 -4
  156. package/src/plugins/jsx-import-source.utils.d.ts +8 -0
  157. package/src/plugins/jsx-import-source.utils.js +26 -0
  158. package/src/plugins/processor.d.ts +19 -4
  159. package/src/plugins/processor.js +22 -4
  160. package/src/plugins/source-transform.d.ts +31 -0
  161. package/src/plugins/source-transform.js +23 -1
  162. package/src/route-renderer/GRAPH.md +8 -8
  163. package/src/route-renderer/README.md +30 -28
  164. package/src/route-renderer/orchestration/component-graph-collectors.d.ts +10 -0
  165. package/src/route-renderer/orchestration/component-graph-collectors.js +143 -0
  166. package/src/route-renderer/orchestration/component-graph.d.ts +36 -0
  167. package/src/route-renderer/orchestration/component-graph.js +98 -0
  168. package/src/route-renderer/orchestration/component-render-context.d.ts +3 -10
  169. package/src/route-renderer/orchestration/component-render-context.js +3 -1
  170. package/src/route-renderer/orchestration/declared-ownership-graph.d.ts +1 -18
  171. package/src/route-renderer/orchestration/declared-ownership-graph.js +5 -31
  172. package/src/route-renderer/orchestration/document-shell-render.service.d.ts +90 -0
  173. package/src/route-renderer/orchestration/document-shell-render.service.js +120 -0
  174. package/src/route-renderer/orchestration/foreign-subtree-execution.service.d.ts +59 -29
  175. package/src/route-renderer/orchestration/foreign-subtree-execution.service.js +164 -35
  176. package/src/route-renderer/orchestration/global-injector-assets.service.d.ts +7 -0
  177. package/src/route-renderer/orchestration/global-injector-assets.service.js +32 -0
  178. package/src/route-renderer/orchestration/integration-renderer.d.ts +18 -54
  179. package/src/route-renderer/orchestration/integration-renderer.js +113 -195
  180. package/src/route-renderer/orchestration/integration-route-render-adapter.d.ts +38 -0
  181. package/src/route-renderer/orchestration/integration-route-render-adapter.js +27 -0
  182. package/src/route-renderer/orchestration/layout-shell-props.service.d.ts +20 -0
  183. package/src/route-renderer/orchestration/layout-shell-props.service.js +31 -0
  184. package/src/route-renderer/orchestration/ownership-validation.service.d.ts +5 -0
  185. package/src/route-renderer/orchestration/ownership-validation.service.js +29 -1
  186. package/src/route-renderer/orchestration/page-browser-graph-contribution.loader.d.ts +9 -0
  187. package/src/route-renderer/orchestration/page-browser-graph-contribution.loader.js +7 -0
  188. package/src/route-renderer/orchestration/page-browser-graph.service.d.ts +25 -0
  189. package/src/route-renderer/orchestration/page-browser-graph.service.js +174 -0
  190. package/src/route-renderer/orchestration/render-output.utils.d.ts +2 -0
  191. package/src/route-renderer/orchestration/render-output.utils.js +4 -0
  192. package/src/route-renderer/orchestration/route-html-finalization.service.d.ts +17 -0
  193. package/src/route-renderer/orchestration/route-html-finalization.service.js +26 -0
  194. package/src/route-renderer/orchestration/route-prepared-options.builder.d.ts +26 -0
  195. package/src/route-renderer/orchestration/route-prepared-options.builder.js +54 -0
  196. package/src/route-renderer/orchestration/route-prepared-options.utils.d.ts +4 -0
  197. package/src/route-renderer/orchestration/route-prepared-options.utils.js +33 -0
  198. package/src/route-renderer/orchestration/route-render-orchestrator.d.ts +8 -39
  199. package/src/route-renderer/orchestration/route-render-orchestrator.js +53 -461
  200. package/src/route-renderer/orchestration/string-markup-renderer.d.ts +14 -0
  201. package/src/route-renderer/orchestration/string-markup-renderer.js +55 -0
  202. package/src/route-renderer/page-loading/component-dependency-collection.js +5 -2
  203. package/src/router/client/link-intent.d.ts +11 -21
  204. package/src/router/client/link-intent.js +10 -0
  205. package/src/router/client/link-intent.test.browser.js +12 -1
  206. package/src/router/client/link-navigation-policy.d.ts +45 -0
  207. package/src/router/client/link-navigation-policy.js +101 -0
  208. package/src/router/client/link-navigation-policy.test.browser.d.ts +1 -0
  209. package/src/router/client/link-navigation-policy.test.browser.js +92 -0
  210. package/src/router/client/navigation-coordinator.d.ts +1 -1
  211. package/src/router/client/navigation-coordinator.js +12 -2
  212. package/src/services/assets/asset-processing-service/browser-runtime-asset.factory.d.ts +1 -0
  213. package/src/services/assets/asset-processing-service/browser-runtime-asset.factory.js +1 -0
  214. package/src/services/assets/asset-processing-service/browser-runtime-entry.factory.d.ts +4 -2
  215. package/src/services/assets/asset-processing-service/browser-runtime-entry.factory.js +27 -7
  216. package/src/services/assets/asset-processing-service/processors/script/file-script.processor.js +36 -14
  217. package/src/services/assets/asset-processing-service/processors/script/node-module-script.processor.js +17 -3
  218. package/src/services/assets/asset-processing-service/processors/stylesheet/content-stylesheet.processor.d.ts +0 -3
  219. package/src/services/assets/asset-processing-service/processors/stylesheet/content-stylesheet.processor.js +2 -31
  220. package/src/services/assets/asset-processing-service/processors/stylesheet/file-stylesheet.processor.d.ts +0 -3
  221. package/src/services/assets/asset-processing-service/processors/stylesheet/file-stylesheet.processor.js +2 -30
  222. package/src/services/assets/asset-processing-service/processors/stylesheet/stylesheet-processor-pipeline.d.ts +2 -0
  223. package/src/services/assets/asset-processing-service/processors/stylesheet/stylesheet-processor-pipeline.js +43 -0
  224. package/src/services/assets/browser-bundle.service.d.ts +3 -1
  225. package/src/services/assets/browser-bundle.service.js +17 -5
  226. package/src/services/html/html-transformer.service.d.ts +1 -1
  227. package/src/services/html/html-transformer.service.js +4 -4
  228. package/src/services/invalidation/development-invalidation.service.d.ts +20 -2
  229. package/src/services/invalidation/development-invalidation.service.js +56 -2
  230. package/src/services/module-loading/README.md +49 -0
  231. package/src/services/module-loading/app-server-module-transpiler.service.js +5 -17
  232. package/src/services/module-loading/page-module-import.service.d.ts +5 -1
  233. package/src/services/module-loading/page-module-import.service.js +97 -45
  234. package/src/services/module-loading/route-module-build-cache-registry.d.ts +24 -0
  235. package/src/services/module-loading/route-module-build-cache-registry.js +37 -0
  236. package/src/services/module-loading/route-module-build-cache.d.ts +4 -0
  237. package/src/services/module-loading/route-module-build-cache.js +38 -0
  238. package/src/services/module-loading/route-module-build-cache.store.d.ts +57 -0
  239. package/src/services/module-loading/route-module-build-cache.store.js +207 -0
  240. package/src/services/module-loading/route-module-build-manifest.d.ts +61 -0
  241. package/src/services/module-loading/route-module-build-manifest.js +116 -0
  242. package/src/services/module-loading/route-module-dependency-hasher.d.ts +81 -0
  243. package/src/services/module-loading/route-module-dependency-hasher.js +121 -0
  244. package/src/services/module-loading/server-module-transpiler.service.js +1 -1
  245. package/src/static-site-generator/README.md +33 -0
  246. package/src/static-site-generator/static-build-invalidation.d.ts +10 -0
  247. package/src/static-site-generator/static-build-invalidation.js +59 -0
  248. package/src/static-site-generator/static-export-context.d.ts +22 -0
  249. package/src/static-site-generator/static-export-context.js +0 -0
  250. package/src/static-site-generator/static-site-generator.d.ts +17 -20
  251. package/src/static-site-generator/static-site-generator.js +188 -85
  252. package/src/types/internal-types.d.ts +16 -9
  253. package/src/types/public-types.d.ts +138 -26
  254. package/src/utils/parse-cli-args.d.ts +2 -0
  255. package/src/utils/parse-cli-args.js +6 -0
  256. package/src/utils/server-utils.module.d.ts +3 -2
  257. package/src/utils/server-utils.module.js +5 -6
  258. package/src/utils/static-file-extensions.d.ts +12 -0
  259. package/src/utils/static-file-extensions.js +48 -0
  260. package/src/watchers/project-watcher-ignore.d.ts +11 -0
  261. package/src/watchers/project-watcher-ignore.js +16 -0
  262. package/src/watchers/project-watcher.d.ts +25 -2
  263. package/src/watchers/project-watcher.js +130 -23
  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,8 @@
1
+ import type { EcoPagesAppConfig } from '../types/internal-types.js';
2
+ export declare function createJsxImportSourcePragma(jsxImportSource: string): string;
3
+ export declare function prependJsxImportSourceIfMissing(code: string, jsxImportSource: string | undefined): string;
4
+ export declare function isJsxSourceExtension(extension: string): boolean;
5
+ export declare function filterJsxSourceExtensions(extensions: string[]): string[];
6
+ export declare function collectJsxExtensions(integrations: NonNullable<EcoPagesAppConfig['integrations']>, options?: {
7
+ excludeIntegrationName?: string;
8
+ }): string[];
@@ -0,0 +1,26 @@
1
+ function createJsxImportSourcePragma(jsxImportSource) {
2
+ return `/** @jsxImportSource ${jsxImportSource} */
3
+ `;
4
+ }
5
+ function prependJsxImportSourceIfMissing(code, jsxImportSource) {
6
+ if (!jsxImportSource || code.includes("@jsxImportSource")) {
7
+ return code;
8
+ }
9
+ return createJsxImportSourcePragma(jsxImportSource) + code;
10
+ }
11
+ function isJsxSourceExtension(extension) {
12
+ return extension.endsWith(".tsx") || extension.endsWith(".jsx");
13
+ }
14
+ function filterJsxSourceExtensions(extensions) {
15
+ return extensions.filter(isJsxSourceExtension);
16
+ }
17
+ function collectJsxExtensions(integrations, options) {
18
+ return integrations.filter((integration) => integration.jsxImportSource).filter((integration) => integration.name !== options?.excludeIntegrationName).flatMap((integration) => filterJsxSourceExtensions(integration.extensions));
19
+ }
20
+ export {
21
+ collectJsxExtensions,
22
+ createJsxImportSourcePragma,
23
+ filterJsxSourceExtensions,
24
+ isJsxSourceExtension,
25
+ prependJsxImportSourceIfMissing
26
+ };
@@ -1,6 +1,5 @@
1
1
  import type { EcoBuildPlugin } from '../build/build-types.js';
2
2
  import type { EcoPagesAppConfig, IClientBridge } from '../types/internal-types.js';
3
- import type { AssetDefinition } from '../services/assets/asset-processing-service/assets.types.js';
4
3
  import type { RuntimeCapabilityDeclaration } from './runtime-capability.js';
5
4
  export type { RuntimeCapabilityDeclaration, RuntimeCapabilityTag } from './runtime-capability.js';
6
5
  export type { EcoBuildLoader, EcoBuildOnLoadArgs, EcoBuildOnLoadResult, EcoBuildOnResolveArgs, EcoBuildOnResolveResult, EcoBuildPlugin, EcoBuildPluginBuilder, } from '../build/build-types.js';
@@ -59,7 +58,6 @@ export interface ProcessorContext {
59
58
  */
60
59
  export declare abstract class Processor<TOptions = Record<string, unknown>> {
61
60
  readonly name: string;
62
- protected dependencies: AssetDefinition[];
63
61
  protected context?: ProcessorContext;
64
62
  protected options?: TOptions;
65
63
  protected watchConfig?: ProcessorWatchConfig;
@@ -80,14 +78,31 @@ export declare abstract class Processor<TOptions = Record<string, unknown>> {
80
78
  * warming or watcher registration should stay in `setup()`.
81
79
  */
82
80
  prepareBuildContributions(): Promise<void>;
81
+ /**
82
+ * Reports whether this processor's build inputs changed since the last
83
+ * incremental static build.
84
+ *
85
+ * @remarks
86
+ * No shipped processor overrides this today. Integrations and processors can
87
+ * opt in when they own build inputs that should invalidate incremental static
88
+ * exports without a full rebuild.
89
+ */
90
+ didChange(): boolean;
83
91
  abstract setup(): Promise<void>;
84
- abstract teardown(): Promise<void>;
85
92
  abstract process(input: unknown, filePath?: string): Promise<unknown>;
93
+ /**
94
+ * Releases runtime resources owned by the processor.
95
+ *
96
+ * @remarks
97
+ * Core does not call this hook today. Override only when a processor owns
98
+ * watchers, compiler handles, or other resources that outlive individual
99
+ * requests.
100
+ */
101
+ teardown(): Promise<void>;
86
102
  protected getCachePath(key: string): string;
87
103
  protected readCache<T>(key: string): Promise<T | null>;
88
104
  protected writeCache<T>(key: string, data: T): Promise<void>;
89
105
  getWatchConfig(): ProcessorWatchConfig | undefined;
90
- getDependencies(): AssetDefinition[];
91
106
  getName(): string;
92
107
  getAssetCapabilities(): ProcessorAssetCapability[];
93
108
  matchesFileFilter(_filepath: string): boolean;
@@ -16,7 +16,6 @@ function resolveGeneratedPath(type, options) {
16
16
  }
17
17
  class Processor {
18
18
  name;
19
- dependencies = [];
20
19
  context;
21
20
  options;
22
21
  watchConfig;
@@ -54,6 +53,28 @@ class Processor {
54
53
  */
55
54
  async prepareBuildContributions() {
56
55
  }
56
+ /**
57
+ * Reports whether this processor's build inputs changed since the last
58
+ * incremental static build.
59
+ *
60
+ * @remarks
61
+ * No shipped processor overrides this today. Integrations and processors can
62
+ * opt in when they own build inputs that should invalidate incremental static
63
+ * exports without a full rebuild.
64
+ */
65
+ didChange() {
66
+ return false;
67
+ }
68
+ /**
69
+ * Releases runtime resources owned by the processor.
70
+ *
71
+ * @remarks
72
+ * Core does not call this hook today. Override only when a processor owns
73
+ * watchers, compiler handles, or other resources that outlive individual
74
+ * requests.
75
+ */
76
+ async teardown() {
77
+ }
57
78
  getCachePath(key) {
58
79
  return `${this.context?.cache}/${key}`;
59
80
  }
@@ -76,9 +97,6 @@ class Processor {
76
97
  getWatchConfig() {
77
98
  return this.watchConfig;
78
99
  }
79
- getDependencies() {
80
- return this.dependencies;
81
- }
82
100
  getName() {
83
101
  return this.name;
84
102
  }
@@ -4,9 +4,21 @@ export interface EcoSourceTransformResult {
4
4
  code: string;
5
5
  map?: unknown;
6
6
  }
7
+ /**
8
+ * Bundler-neutral source transform registered on {@link EcoPagesAppConfig.sourceTransforms}.
9
+ *
10
+ * @remarks
11
+ * Prefer this shape over a competing {@link EcoBuildPlugin} `onLoad` handler when
12
+ * the transform only rewrites module source. Browser/HMR builds run source
13
+ * transforms after first-wins `onLoad` plugins, so metadata injection and similar
14
+ * passes still run on rewritten output from boundary/runtime plugins.
15
+ */
7
16
  export interface EcoSourceTransform {
17
+ /** Stable transform name. Also used to dedupe loader plugins in browser builds. */
8
18
  name: string;
19
+ /** File-path filter tested against {@link normalizeTransformId | normalized ids}. */
9
20
  filter: RegExp;
21
+ /** Runs before default transforms, or after them when set to `post`. */
10
22
  enforce?: 'pre' | 'post';
11
23
  transform(code: string, id: string): EcoSourceTransformResult | string | undefined;
12
24
  }
@@ -24,8 +36,27 @@ export declare function normalizeTransformId(id: string): string;
24
36
  * Applies one source transform if the normalized id matches its filter.
25
37
  */
26
38
  export declare function applySourceTransform(transform: EcoSourceTransform, code: string, id: string): EcoSourceTransformResult | string | undefined;
39
+ /**
40
+ * Applies app-owned source transforms in deterministic `pre` → default → `post` order.
41
+ *
42
+ * @remarks
43
+ * Used by the Rolldown plugin bridge after `onLoad` plugins produce final module
44
+ * contents. Transforms that do not match `filter` are skipped; matching transforms
45
+ * are chained left-to-right on the current source string.
46
+ *
47
+ * @param transforms - App-owned transforms, usually from {@link getAppSourceTransforms}.
48
+ * @param code - Current module source.
49
+ * @param id - Module id forwarded to each transform after query/hash normalization.
50
+ * @returns The transformed source, or the original `code` when no transform matches.
51
+ */
52
+ export declare function applySourceTransforms(transforms: readonly EcoSourceTransform[], code: string, id: string): string;
27
53
  /**
28
54
  * Adapts a source transform into the existing Ecopages build-plugin contract.
55
+ *
56
+ * @remarks
57
+ * Server-oriented builds and loader registration still use this adapter.
58
+ * Browser/HMR builds should register the transform in `appConfig.sourceTransforms`
59
+ * instead so the Rolldown bridge can run it after competing `onLoad` plugins.
29
60
  */
30
61
  export declare function createEcoBuildPluginFromSourceTransform(transform: EcoSourceTransform): EcoBuildPlugin;
31
62
  /**
@@ -13,6 +13,27 @@ function applySourceTransform(transform, code, id) {
13
13
  }
14
14
  return transform.transform(code, normalizedId);
15
15
  }
16
+ const SOURCE_TRANSFORM_ENFORCE_ORDER = {
17
+ pre: 0,
18
+ default: 1,
19
+ post: 2
20
+ };
21
+ function getSourceTransformEnforceOrder(transform) {
22
+ return SOURCE_TRANSFORM_ENFORCE_ORDER[transform.enforce ?? "default"];
23
+ }
24
+ function applySourceTransforms(transforms, code, id) {
25
+ let current = code;
26
+ for (const transform of [...transforms].sort(
27
+ (left, right) => getSourceTransformEnforceOrder(left) - getSourceTransformEnforceOrder(right)
28
+ )) {
29
+ const result = applySourceTransform(transform, current, id);
30
+ if (!result) {
31
+ continue;
32
+ }
33
+ current = typeof result === "string" ? result : result.code;
34
+ }
35
+ return current;
36
+ }
16
37
  function inferLoaderFromPath(filePath) {
17
38
  const extension = path.extname(filePath).toLowerCase();
18
39
  switch (extension) {
@@ -56,13 +77,14 @@ function createVitePluginFromSourceTransform(transform) {
56
77
  };
57
78
  }
58
79
  function getAppSourceTransforms(appConfig) {
59
- return Array.from(appConfig.sourceTransforms.values());
80
+ return appConfig.sourceTransforms ? Array.from(appConfig.sourceTransforms.values()) : [];
60
81
  }
61
82
  function createVitePluginsFromAppSourceTransforms(appConfig) {
62
83
  return getAppSourceTransforms(appConfig).map((transform) => createVitePluginFromSourceTransform(transform));
63
84
  }
64
85
  export {
65
86
  applySourceTransform,
87
+ applySourceTransforms,
66
88
  createEcoBuildPluginFromSourceTransform,
67
89
  createVitePluginFromSourceTransform,
68
90
  createVitePluginsFromAppSourceTransforms,
@@ -33,15 +33,15 @@ flowchart TD
33
33
 
34
34
  ## 2) Route Render Flow
35
35
 
36
- `IntegrationRenderer.execute()` delegates shared route orchestration to `RouteRenderFlow`.
36
+ `IntegrationRenderer.execute()` delegates shared route orchestration to `RouteRenderOrchestrator`.
37
37
 
38
38
  ```mermaid
39
39
  flowchart TD
40
- A[IntegrationRenderer.execute] --> B[RouteRenderFlow.prepareRenderOptions]
40
+ A[IntegrationRenderer.execute] --> B[RouteRenderOrchestrator.prepareRenderOptions]
41
41
  B --> C[resolvePageModule]
42
42
  C --> D[ownershipValidationService.validate]
43
43
  D --> E[resolvePageData]
44
- E --> F[ownershipPlanningService.buildPlan]
44
+ E --> F[ownershipValidationService.validate + throwIfOwnershipInvalid]
45
45
  F --> G[resolveDependencies]
46
46
  G --> H[buildPageBrowserGraph]
47
47
  H --> I{shouldRenderPageComponent?}
@@ -77,7 +77,7 @@ flowchart TD
77
77
  D -- Yes --> E[render inline]
78
78
  D -- No --> F[delegate to owning renderer]
79
79
  F --> G[owning renderer renderComponentWithForeignChildren]
80
- G --> H[owning renderer renderForeignSubtree when payload form is needed]
80
+ G --> H[owning renderer renderComponentWithForeignChildren mapped via toForeignSubtreeRenderPayload]
81
81
  H --> I[resolved html plus assets and attachment policy]
82
82
  ```
83
83
 
@@ -121,12 +121,12 @@ flowchart TD
121
121
  The most useful reading order is:
122
122
 
123
123
  1. `route-renderer.ts`
124
- 2. `orchestration/route-render-flow.ts`
124
+ 2. `orchestration/route-render-orchestrator.ts`
125
125
  3. `orchestration/integration-renderer.ts`
126
126
  4. `orchestration/ownership-validation.service.ts`
127
127
  5. `orchestration/ownership-planning.service.ts`
128
128
  6. `orchestration/component-render-context.ts`
129
- 7. `orchestration/queued-foreign-subtree-resolution.service.ts`
129
+ 7. `orchestration/foreign-subtree-execution.service.ts`
130
130
  8. `page-loading/page-module-loader.ts`
131
131
  9. `page-loading/dependency-resolver.ts`
132
132
  10. `eco/eco.ts`
@@ -134,12 +134,12 @@ The most useful reading order is:
134
134
  ## 7) Key Files
135
135
 
136
136
  - `packages/core/src/route-renderer/route-renderer.ts`
137
- - `packages/core/src/route-renderer/orchestration/route-render-flow.ts`
137
+ - `packages/core/src/route-renderer/orchestration/route-render-orchestrator.ts`
138
138
  - `packages/core/src/route-renderer/orchestration/integration-renderer.ts`
139
139
  - `packages/core/src/route-renderer/orchestration/ownership-validation.service.ts`
140
140
  - `packages/core/src/route-renderer/orchestration/ownership-planning.service.ts`
141
141
  - `packages/core/src/route-renderer/orchestration/component-render-context.ts`
142
- - `packages/core/src/route-renderer/orchestration/queued-foreign-subtree-resolution.service.ts`
142
+ - `packages/core/src/route-renderer/orchestration/foreign-subtree-execution.service.ts`
143
143
  - `packages/core/src/route-renderer/page-loading/page-module-loader.ts`
144
144
  - `packages/core/src/route-renderer/page-loading/dependency-resolver.ts`
145
145
  - `packages/core/src/eco/eco.ts`
@@ -16,18 +16,30 @@ The route renderer layer is responsible for:
16
16
 
17
17
  The architecture is organized around three distinct concepts:
18
18
 
19
- - `ownership`: preparation-time metadata that describes which integration owns each declared component edge
19
+ - `ownership`: declared component dependency metadata validated before render
20
20
  - `foreign child`: a component encountered during render whose owning integration differs from the current integration
21
21
  - `foreign subtree`: the resolved HTML, assets, and root-attachment metadata returned by the owning renderer for that foreign child
22
22
 
23
23
  These concepts intentionally live in different places:
24
24
 
25
- - `ownership-planning.service.ts` builds `ownershipPlan`
26
- - `ownership-validation.service.ts` validates declared foreign ownership up front
25
+ - `ownership-validation.service.ts` validates declared foreign ownership up front and fails the render on misconfiguration
27
26
  - `component-render-context.ts` intercepts foreign children during active component render
28
- - `queued-foreign-subtree-resolution.service.ts` resolves queued foreign subtrees for renderers that cannot hand them off inline
29
- - `integration-renderer.ts` owns renderer-to-renderer delegation and shared shell composition
30
- - `route-render-flow.ts` owns route preparation, final response capture, and unresolved artifact enforcement
27
+ - `foreign-subtree-execution.service.ts` owns mixed-integration execution policy and queued token resolution
28
+ - `document-shell-render.service.ts` composes page, layout, and html template shells with one execution-scoped renderer cache
29
+ - `integration-renderer.ts` owns renderer-to-renderer delegation and integration-specific render hooks
30
+ - `route-render-orchestrator.ts` owns route preparation, final response capture, and unresolved artifact enforcement
31
+
32
+ ## Build-Time JSX vs Runtime Foreign Children
33
+
34
+ Mixed-integration apps use two separate mechanisms:
35
+
36
+ | Layer | Mechanism | Purpose |
37
+ | ------- | ----------------------------------------------------------------- | ---------------------------------------------------------------------------------------- |
38
+ | Build | `getJsxOwnershipPlugins()` / `getHostScopedJsxOwnershipPlugins()` | Prepend `@jsxImportSource` so bundled `.tsx` files compile with the correct JSX runtime |
39
+ | Build | `eco-component-meta-plugin` | Prepends the owning integration pragma when injecting `__eco` metadata into native files |
40
+ | Runtime | `eco.component()` / `eco.embed()` + foreign-child runtime | Hand off cross-integration children during SSR |
41
+
42
+ See [`../build/README.md`](../build/README.md) for the JSX ownership helper split.
31
43
 
32
44
  ## Main Files
33
45
 
@@ -38,12 +50,12 @@ These concepts intentionally live in different places:
38
50
 
39
51
  ### `orchestration/`
40
52
 
41
- - `route-render-flow.ts`: one route render from page-module loading through final HTML output
53
+ - `route-render-orchestrator.ts`: one route render from page-module loading through final HTML output
42
54
  - `integration-renderer.ts`: abstract base class for route rendering, explicit view rendering, and foreign-child delegation
43
- - `ownership-planning.service.ts`: declared ownership graph construction
44
55
  - `ownership-validation.service.ts`: up-front ownership validation for route roots and declared descendants
56
+ - `foreign-subtree-execution.service.ts`: foreign-child execution policy, queue token resolution, and `toForeignSubtreeRenderPayload()`
57
+ - `document-shell-render.service.ts`: shared page/layout/html shell composition and attribute stamping helpers
45
58
  - `component-render-context.ts`: active render context used by `eco.component()` to intercept foreign children
46
- - `queued-foreign-subtree-resolution.service.ts`: queue resolution for renderers that need token-based foreign-subtree handoff
47
59
  - `render-output.utils.ts`: unresolved artifact normalization and marker inspection
48
60
 
49
61
  ### `page-loading/`
@@ -56,11 +68,11 @@ These concepts intentionally live in different places:
56
68
  The route-render contract is:
57
69
 
58
70
  1. `RouteRendererFactory` selects the owning integration renderer.
59
- 2. `IntegrationRenderer.execute()` delegates preparation and finalization to `RouteRenderFlow`.
60
- 3. `RouteRenderFlow.prepareRenderOptions()` loads the page module, validates ownership, builds `ownershipPlan`, resolves page data, resolves dependencies, and builds the page browser graph.
71
+ 2. `IntegrationRenderer.execute()` delegates preparation and finalization to `RouteRenderOrchestrator`.
72
+ 3. `RouteRenderOrchestrator.prepareRenderOptions()` loads the page module, validates ownership (fail-fast), resolves page data, resolves dependencies, and builds the page browser graph.
61
73
  4. The integration renderer performs page, layout, and document-shell rendering. When it encounters a foreign child, it delegates that child back to the owning renderer.
62
74
  5. If a renderer needs queued handoff, it emits internal foreign-subtree tokens and resolves them before returning final HTML.
63
- 6. `RouteRenderFlow.execute()` captures the final body, rejects unresolved `<eco-marker>` artifacts, stamps root or document attributes when needed, and runs the HTML transformer.
75
+ 6. `RouteRenderOrchestrator.executePrepared()` captures the final body, rejects unresolved `<eco-marker>` artifacts, stamps root or document attributes when needed, and runs the HTML transformer.
64
76
 
65
77
  Important:
66
78
 
@@ -72,38 +84,28 @@ Important:
72
84
 
73
85
  Mixed-integration component configs must declare every possible foreign child in `config.dependencies.components`.
74
86
 
75
- That declaration is used for two things:
76
-
77
- - `OwnershipValidationService` surfaces missing metadata or unknown integrations before render execution
78
- - `OwnershipPlanningService` records the expected ownership shape in `ownershipPlan`
87
+ `OwnershipValidationService` surfaces missing metadata or unknown integrations during `prepareRenderOptions()` and throws before render execution starts.
79
88
 
80
89
  At runtime, renderers still discover actual foreign children through the active component render context.
81
90
 
82
91
  ## Foreign Subtree Contract
83
92
 
84
- `renderForeignSubtree()` is the compatibility contract for renderer-to-renderer handoff. It returns:
85
-
86
- - `html`
87
- - `assets`
88
- - `rootTag`
89
- - optional `rootAttributes`
90
- - `attachmentPolicy`
91
- - `integrationName`
92
-
93
- `renderComponentWithForeignChildren()` is the higher-level renderer entrypoint. It is responsible for:
93
+ `renderComponentWithForeignChildren()` is the renderer entrypoint for mixed-integration trees. It is responsible for:
94
94
 
95
95
  - reusing the execution-scoped owning-renderer cache
96
96
  - deciding whether the current component can stay local
97
97
  - creating a foreign-child runtime when nested foreign ownership must be resolved
98
98
  - normalizing unresolved artifact HTML before the render leaves the renderer
99
99
 
100
+ Queue resolution maps owning-renderer output into the foreign-subtree payload shape via `toForeignSubtreeRenderPayload()` inside `foreign-subtree-execution.service.ts`.
101
+
100
102
  ## Queue Model
101
103
 
102
104
  Not every integration needs queue-based handoff.
103
105
 
104
106
  - If a renderer can resolve a foreign child inline, it returns resolved output immediately.
105
107
  - If it cannot, it may emit internal foreign-subtree tokens and resolve them before returning final HTML.
106
- - The queue service is only for renderer-owned transport inside one render pass. It is not a general route-level fallback mechanism.
108
+ - Queue mechanics live inside `ForeignSubtreeExecutionService`; they are renderer-owned transport inside one render pass, not a general route-level fallback mechanism.
107
109
 
108
110
  ## React Island Notes
109
111
 
@@ -114,5 +116,5 @@ Not every integration needs queue-based handoff.
114
116
 
115
117
  ## Current Limits
116
118
 
117
- - `ownershipPlan` is still diagnostic and preparatory metadata; it does not yet drive a full route-composer execution model.
118
119
  - Different integrations still own different foreign-child runtime strategies, which is intentional where child transport or hydration behavior differs.
120
+ - `integration-renderer.ts` remains the largest integration hook surface even after document-shell extraction.
@@ -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,36 @@
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[];
35
+ /** @deprecated Use `mapComponentGraph` from `component-graph.ts`. */
36
+ export declare const mapDeclaredOwnershipGraph: typeof mapComponentGraph;