@ecopages/core 0.2.0-beta.31 → 0.2.0-beta.33

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 (343) hide show
  1. package/README.md +1 -0
  2. package/package.json +90 -3
  3. package/src/adapters/abstract/application-adapter.d.ts +0 -8
  4. package/src/adapters/abstract/application-adapter.js +252 -261
  5. package/src/adapters/abstract/router-adapter.js +12 -4
  6. package/src/adapters/abstract/segment-path-matcher.js +132 -134
  7. package/src/adapters/abstract/server-adapter.js +22 -14
  8. package/src/adapters/abstract/ws-pattern-matcher.js +24 -26
  9. package/src/adapters/bun/bun-user-websocket-lifecycle.js +83 -86
  10. package/src/adapters/bun/client-bridge.js +51 -50
  11. package/src/adapters/bun/create-app.js +171 -161
  12. package/src/adapters/bun/hmr-manager.js +62 -57
  13. package/src/adapters/bun/index.js +2 -31
  14. package/src/adapters/bun/runtime-host.js +61 -54
  15. package/src/adapters/bun/server-adapter.d.ts +0 -1
  16. package/src/adapters/bun/server-adapter.js +561 -561
  17. package/src/adapters/bun/static-preview-host.js +43 -46
  18. package/src/adapters/create-app.js +11 -14
  19. package/src/adapters/index.js +2 -30
  20. package/src/adapters/node/create-app.js +123 -129
  21. package/src/adapters/node/http-request-bridge.js +147 -106
  22. package/src/adapters/node/node-client-bridge.js +62 -64
  23. package/src/adapters/node/node-hmr-manager.js +58 -48
  24. package/src/adapters/node/runtime-host.js +96 -89
  25. package/src/adapters/node/server-adapter-dependencies.js +18 -21
  26. package/src/adapters/node/server-adapter.d.ts +0 -1
  27. package/src/adapters/node/server-adapter.js +347 -326
  28. package/src/adapters/node/static-content-server.js +172 -191
  29. package/src/adapters/node/static-preview-host.js +87 -78
  30. package/src/adapters/shared/hmr/dev-transform-entrypoint-registry.d.ts +16 -0
  31. package/src/adapters/shared/hmr/dev-transform-entrypoint-registry.js +32 -0
  32. package/src/adapters/shared/hmr/hmr-html-response.js +46 -32
  33. package/src/adapters/shared/hmr/shared-hmr-manager.d.ts +29 -38
  34. package/src/adapters/shared/hmr/shared-hmr-manager.js +439 -425
  35. package/src/adapters/shared/http/api-request-pipeline.js +122 -119
  36. package/src/adapters/shared/http/api-response.js +77 -77
  37. package/src/adapters/shared/http/create-body-response.js +22 -19
  38. package/src/adapters/shared/http/define-api-handler.js +41 -55
  39. package/src/adapters/shared/http/explicit-static-render-preparation.js +26 -23
  40. package/src/adapters/shared/http/explicit-static-route-matcher.js +55 -62
  41. package/src/adapters/shared/http/file-route-middleware-pipeline.js +81 -75
  42. package/src/adapters/shared/http/fs-server-response-factory.js +101 -96
  43. package/src/adapters/shared/http/fs-server-response-matcher.js +239 -257
  44. package/src/adapters/shared/http/run-middleware-chain.js +15 -15
  45. package/src/adapters/shared/runtime/application-adapter.js +72 -87
  46. package/src/adapters/shared/runtime/copy-runtime-public-dir.js +25 -22
  47. package/src/adapters/shared/runtime/port-manager.js +207 -177
  48. package/src/adapters/shared/runtime/render-context.js +94 -79
  49. package/src/adapters/shared/runtime/runtime-app-bootstrap.js +33 -38
  50. package/src/adapters/shared/runtime/runtime-host.js +1 -0
  51. package/src/adapters/shared/runtime/runtime-server-lifecycle.d.ts +2 -3
  52. package/src/adapters/shared/runtime/runtime-server-lifecycle.js +65 -51
  53. package/src/adapters/shared/runtime/server-adapter.d.ts +1 -0
  54. package/src/adapters/shared/runtime/server-adapter.js +233 -217
  55. package/src/adapters/shared/runtime/server-route-handler.js +74 -70
  56. package/src/adapters/shared/runtime/server-static-builder.js +165 -184
  57. package/src/adapters/shared/runtime/static-preview-host.js +1 -0
  58. package/src/adapters/shared/ws/node-http-websocket-upgrades.js +97 -88
  59. package/src/adapters/shared/ws/websocket-lifecycle.js +57 -50
  60. package/src/build/README.md +52 -1
  61. package/src/build/app-build-manifest-runtime.js +129 -108
  62. package/src/build/browser/browser-runtime-manifest.js +47 -50
  63. package/src/build/browser/browser-runtime-plugin-helpers.js +32 -12
  64. package/src/build/browser/browser-runtime-plugin.js +206 -160
  65. package/src/build/browser/jsx-ownership-plugins.js +51 -37
  66. package/src/build/browser/lit-static-render-worker-context.js +3 -5
  67. package/src/build/build-adapter.js +276 -139
  68. package/src/build/cache/build-input-fingerprint.js +28 -26
  69. package/src/build/cache/cache-constants.js +4 -6
  70. package/src/build/cache/cache-keys.js +64 -56
  71. package/src/build/cache/pages-unified-graph-build.js +179 -178
  72. package/src/build/cache/production-build-cache.js +47 -54
  73. package/src/build/cache/server-entry-build-cache.js +134 -146
  74. package/src/build/contracts/build-contracts.d.ts +4 -4
  75. package/src/build/contracts/build-contracts.js +1 -0
  76. package/src/build/contracts/build-manifest.js +58 -43
  77. package/src/build/contracts/build-types.js +1 -0
  78. package/src/build/rolldown/rolldown-adapter-helpers.d.ts +9 -0
  79. package/src/build/rolldown/rolldown-adapter-helpers.js +405 -298
  80. package/src/build/rolldown/rolldown-build-adapter.js +53 -61
  81. package/src/build/rolldown/rolldown-build-invocation-metrics.js +31 -35
  82. package/src/build/rolldown/rolldown-plugin-bridge.js +264 -194
  83. package/src/build/rolldown/rolldown-source-transform-pass.js +59 -50
  84. package/src/build/rolldown/runtime-build-output-normalizer.js +227 -175
  85. package/src/build/rolldown/server-side-css-shim-plugin.js +54 -31
  86. package/src/build/runtime/build-profile-options.js +36 -36
  87. package/src/build/runtime/build-request-identity.js +70 -45
  88. package/src/build/runtime/build-request-policy.js +80 -42
  89. package/src/build/runtime/build-runtime.js +64 -54
  90. package/src/build/runtime/deduping-build-executor.js +38 -32
  91. package/src/build/runtime/parallel-build-executor.js +58 -50
  92. package/src/build/runtime/serialized-build-executor.js +78 -62
  93. package/src/cache/index.js +6 -6
  94. package/src/cache/module-parse-cache.js +99 -68
  95. package/src/client/navigation-scripts/classification.js +45 -37
  96. package/src/client/navigation-scripts/index.js +3 -23
  97. package/src/client/navigation-scripts/navigation-scripts.test.browser.js +58 -62
  98. package/src/client/navigation-scripts/registry.js +15 -11
  99. package/src/client/navigation-scripts/rerun-queue.js +81 -64
  100. package/src/client/scroll.js +32 -24
  101. package/src/client/scroll.test.browser.js +27 -33
  102. package/src/client/view-transitions.js +68 -55
  103. package/src/config/config-builder.d.ts +8 -0
  104. package/src/config/config-builder.js +637 -642
  105. package/src/config/constants.js +44 -24
  106. package/src/declarations.d.ts +1 -0
  107. package/src/dev/README.md +24 -0
  108. package/src/dev/client-bridge-registry.js +7 -12
  109. package/src/dev/dev-client-ownership.js +7 -5
  110. package/src/dev/hmr-manager-registry.js +7 -12
  111. package/src/dev/host-runtime.js +25 -30
  112. package/src/dev/runtime-server-started-message.js +2 -5
  113. package/src/dev/sc-server.js +106 -103
  114. package/src/dev/transform-server/dev-transform-bundler.d.ts +24 -0
  115. package/src/dev/transform-server/dev-transform-bundler.js +79 -0
  116. package/src/dev/transform-server/dev-transform-externalize-plugin.d.ts +12 -0
  117. package/src/dev/transform-server/dev-transform-externalize-plugin.js +29 -0
  118. package/src/dev/transform-server/dev-transform-import-rewriter.d.ts +16 -0
  119. package/src/dev/transform-server/dev-transform-import-rewriter.js +110 -0
  120. package/src/dev/transform-server/dev-transform-module-kind.d.ts +13 -0
  121. package/src/dev/transform-server/dev-transform-module-kind.js +17 -0
  122. package/src/dev/transform-server/dev-transform-runtime-specifiers.d.ts +5 -0
  123. package/src/dev/transform-server/dev-transform-runtime-specifiers.js +16 -0
  124. package/src/dev/transform-server/dev-transform-server.d.ts +41 -0
  125. package/src/dev/transform-server/dev-transform-server.js +191 -0
  126. package/src/dev/transform-server/dev-transform-url.d.ts +13 -0
  127. package/src/dev/transform-server/dev-transform-url.js +58 -0
  128. package/src/dev/transform-server/dev-transform-vendor-registry.d.ts +27 -0
  129. package/src/dev/transform-server/dev-transform-vendor-registry.js +145 -0
  130. package/src/dev/transform-server/index.d.ts +6 -0
  131. package/src/dev/transform-server/index.js +4 -0
  132. package/src/dev/transform-server/types.d.ts +15 -0
  133. package/src/dev/transform-server/types.js +1 -0
  134. package/src/dev-toolbar/README.md +51 -0
  135. package/src/dev-toolbar/define-dev-tool.d.ts +21 -0
  136. package/src/dev-toolbar/define-dev-tool.js +9 -0
  137. package/src/dev-toolbar/dev-toolbar-config.d.ts +25 -0
  138. package/src/dev-toolbar/dev-toolbar-config.js +19 -0
  139. package/src/dev-toolbar/dev-toolbar-host.d.ts +49 -0
  140. package/src/dev-toolbar/dev-toolbar-host.js +117 -0
  141. package/src/dev-toolbar/dev-toolbar-html-response.d.ts +11 -0
  142. package/src/dev-toolbar/dev-toolbar-html-response.js +14 -0
  143. package/src/dev-toolbar/dev-toolbar-manifest.d.ts +15 -0
  144. package/src/dev-toolbar/dev-toolbar-manifest.js +52 -0
  145. package/src/dev-toolbar/dev-toolbar-package.d.ts +31 -0
  146. package/src/dev-toolbar/dev-toolbar-package.js +72 -0
  147. package/src/dev-toolbar/dev-toolbar-runtime-paths.d.ts +10 -0
  148. package/src/dev-toolbar/dev-toolbar-runtime-paths.js +13 -0
  149. package/src/diagnostics/request-build-dedupe.js +34 -28
  150. package/src/diagnostics/startup-trace.d.ts +10 -1
  151. package/src/diagnostics/startup-trace.js +269 -241
  152. package/src/eco/README.md +6 -0
  153. package/src/eco/eco-declared-component.js +19 -14
  154. package/src/eco/eco.browser.js +56 -69
  155. package/src/eco/eco.js +156 -96
  156. package/src/eco/eco.types.js +5 -0
  157. package/src/eco/eco.utils.js +1 -10
  158. package/src/eco/global-injector-map.js +55 -41
  159. package/src/eco/lazy-injector-map.js +90 -60
  160. package/src/eco/module-dependencies.js +52 -44
  161. package/src/eco/page-layout-normalization.js +59 -49
  162. package/src/errors/http-error.js +50 -49
  163. package/src/errors/index.js +3 -12
  164. package/src/errors/locals-access-error.js +5 -8
  165. package/src/errors/undeclared-component-dependency-error.js +15 -15
  166. package/src/global/app-logger.js +3 -6
  167. package/src/hmr/README.md +10 -0
  168. package/src/hmr/client/hmr-runtime.js +117 -113
  169. package/src/hmr/client/module-update.d.ts +13 -0
  170. package/src/hmr/client/module-update.js +39 -0
  171. package/src/hmr/hmr-asset-paths.d.ts +14 -0
  172. package/src/hmr/hmr-asset-paths.js +22 -0
  173. package/src/hmr/hmr-entrypoint-output.d.ts +11 -39
  174. package/src/hmr/hmr-entrypoint-output.js +28 -54
  175. package/src/hmr/hmr-file-change-prep.js +13 -16
  176. package/src/hmr/hmr-registered-entrypoints-context.d.ts +7 -0
  177. package/src/hmr/hmr-registered-entrypoints-context.js +1 -0
  178. package/src/hmr/hmr-runtime-paths.d.ts +10 -0
  179. package/src/hmr/hmr-runtime-paths.js +13 -0
  180. package/src/hmr/hmr-strategy.d.ts +5 -11
  181. package/src/hmr/hmr-strategy.js +113 -61
  182. package/src/hmr/strategies/default-hmr-strategy.js +55 -33
  183. package/src/hmr/strategies/js-hmr-strategy.d.ts +6 -95
  184. package/src/hmr/strategies/js-hmr-strategy.js +104 -217
  185. package/src/hmr/strategies/server-rendered-template-hmr-strategy.js +33 -27
  186. package/src/index.browser.js +1 -4
  187. package/src/index.d.ts +1 -0
  188. package/src/index.js +6 -47
  189. package/src/integrations/ghtml/ghtml-renderer.js +12 -7
  190. package/src/integrations/ghtml/ghtml.constants.js +1 -4
  191. package/src/integrations/ghtml/ghtml.plugin.js +9 -12
  192. package/src/islands/README.md +25 -0
  193. package/src/islands/island-host.d.ts +37 -0
  194. package/src/islands/island-host.js +55 -0
  195. package/src/plugins/alias-resolver-cache.js +114 -97
  196. package/src/plugins/alias-resolver-plugin.js +33 -47
  197. package/src/plugins/define-integration.js +18 -17
  198. package/src/plugins/eco-component-meta-plugin.js +387 -145
  199. package/src/plugins/foreign-jsx-override-plugin.js +49 -35
  200. package/src/plugins/integration-plugin.js +212 -203
  201. package/src/plugins/jsx-import-source.utils.js +16 -21
  202. package/src/plugins/processor.js +159 -149
  203. package/src/plugins/runtime-capability.js +1 -0
  204. package/src/plugins/source-transform.js +109 -79
  205. package/src/plugins/tsconfig-import-resolver.d.ts +17 -0
  206. package/src/plugins/tsconfig-import-resolver.js +218 -142
  207. package/src/route-renderer/README.md +12 -1
  208. package/src/route-renderer/orchestration/document-shell/document-shell-render.service.js +143 -136
  209. package/src/route-renderer/orchestration/document-shell/layout-shell-props.service.js +33 -27
  210. package/src/route-renderer/orchestration/foreign-child/component-render-context.js +173 -126
  211. package/src/route-renderer/orchestration/foreign-child/foreign-child-output.utils.js +165 -154
  212. package/src/route-renderer/orchestration/foreign-child/foreign-subtree-execution.service.js +329 -341
  213. package/src/route-renderer/orchestration/foreign-child/owning-renderer-resolution.js +33 -32
  214. package/src/route-renderer/orchestration/integration-renderer.d.ts +1 -0
  215. package/src/route-renderer/orchestration/integration-renderer.js +731 -750
  216. package/src/route-renderer/orchestration/integration-renderer.test-fixtures.js +168 -172
  217. package/src/route-renderer/orchestration/ownership-graph/component-graph-collectors.js +119 -131
  218. package/src/route-renderer/orchestration/ownership-graph/component-graph.js +82 -91
  219. package/src/route-renderer/orchestration/ownership-graph/ownership-validation.service.js +82 -76
  220. package/src/route-renderer/orchestration/page-browser-graph/global-injector-assets.service.js +29 -31
  221. package/src/route-renderer/orchestration/page-browser-graph/page-browser-graph-contribution.loader.js +10 -6
  222. package/src/route-renderer/orchestration/page-browser-graph/page-browser-graph-merge.utils.js +31 -28
  223. package/src/route-renderer/orchestration/page-browser-graph/page-browser-graph-session.d.ts +3 -0
  224. package/src/route-renderer/orchestration/page-browser-graph/page-browser-graph-session.js +430 -413
  225. package/src/route-renderer/orchestration/page-browser-graph/page-browser-graph.service.js +191 -212
  226. package/src/route-renderer/orchestration/page-browser-graph/processed-asset-dedupe.js +20 -24
  227. package/src/route-renderer/orchestration/route-pipeline/integration-route-render-adapter.d.ts +4 -0
  228. package/src/route-renderer/orchestration/route-pipeline/integration-route-render-adapter.js +24 -24
  229. package/src/route-renderer/orchestration/route-pipeline/marker-artifact.utils.js +22 -24
  230. package/src/route-renderer/orchestration/route-pipeline/robots-meta.contribution.js +41 -34
  231. package/src/route-renderer/orchestration/route-pipeline/route-html-finalization.service.d.ts +5 -0
  232. package/src/route-renderer/orchestration/route-pipeline/route-html-finalization.service.js +42 -22
  233. package/src/route-renderer/orchestration/route-pipeline/route-prepared-options.builder.js +50 -48
  234. package/src/route-renderer/orchestration/route-pipeline/route-prepared-options.utils.js +29 -32
  235. package/src/route-renderer/orchestration/route-pipeline/route-render-orchestrator.js +150 -156
  236. package/src/route-renderer/orchestration/string-markup-renderer.js +48 -51
  237. package/src/route-renderer/page-loading/component-dependency-collection.js +120 -124
  238. package/src/route-renderer/page-loading/declared-asset-collection.js +66 -94
  239. package/src/route-renderer/page-loading/dependency-resolver.js +101 -104
  240. package/src/route-renderer/page-loading/ecopages-virtual-imports.js +68 -54
  241. package/src/route-renderer/page-loading/lazy-entry-collection.js +75 -98
  242. package/src/route-renderer/page-loading/lazy-trigger-planning.js +46 -36
  243. package/src/route-renderer/page-loading/module-declaration-aggregation.js +38 -31
  244. package/src/route-renderer/page-loading/module-declaration-scripts.js +10 -15
  245. package/src/route-renderer/page-loading/page-dependency-bundling.js +156 -113
  246. package/src/route-renderer/page-loading/page-module-loader.js +130 -124
  247. package/src/route-renderer/route-renderer.js +74 -76
  248. package/src/router/README.md +23 -0
  249. package/src/router/client/link-intent.js +55 -39
  250. package/src/router/client/link-intent.test.browser.js +49 -49
  251. package/src/router/client/link-navigation-policy.js +114 -93
  252. package/src/router/client/link-navigation-policy.test.browser.js +70 -80
  253. package/src/router/client/navigation-coordinator.js +235 -211
  254. package/src/router/client/navigation-lifecycle.d.ts +55 -0
  255. package/src/router/client/navigation-lifecycle.js +50 -0
  256. package/src/router/client/navigation-lifecycle.test.browser.d.ts +1 -0
  257. package/src/router/client/navigation-lifecycle.test.browser.js +118 -0
  258. package/src/router/server/route-registry.js +237 -242
  259. package/src/services/assets/asset-processing-service/asset-dependency-keys.js +64 -53
  260. package/src/services/assets/asset-processing-service/asset-processing.service.js +287 -303
  261. package/src/services/assets/asset-processing-service/asset.factory.js +78 -81
  262. package/src/services/assets/asset-processing-service/assets.types.js +1 -0
  263. package/src/services/assets/asset-processing-service/browser-runtime-asset.factory.js +57 -46
  264. package/src/services/assets/asset-processing-service/browser-runtime-entry-resolution.js +106 -69
  265. package/src/services/assets/asset-processing-service/browser-runtime-entry.factory.js +53 -53
  266. package/src/services/assets/asset-processing-service/finalize-processed-asset.js +4 -6
  267. package/src/services/assets/asset-processing-service/grouped-content-bundles.js +79 -80
  268. package/src/services/assets/asset-processing-service/index.js +8 -8
  269. package/src/services/assets/asset-processing-service/inline-content-script-body.js +22 -16
  270. package/src/services/assets/asset-processing-service/materialize-content-script-asset.js +21 -17
  271. package/src/services/assets/asset-processing-service/page-package.js +70 -72
  272. package/src/services/assets/asset-processing-service/processor.interface.js +7 -5
  273. package/src/services/assets/asset-processing-service/processor.registry.js +11 -14
  274. package/src/services/assets/asset-processing-service/processors/base/base-processor.js +59 -62
  275. package/src/services/assets/asset-processing-service/processors/base/base-script-processor.js +102 -117
  276. package/src/services/assets/asset-processing-service/processors/index.js +5 -5
  277. package/src/services/assets/asset-processing-service/processors/script/content-script.processor.js +110 -115
  278. package/src/services/assets/asset-processing-service/processors/script/file-script.processor.js +95 -97
  279. package/src/services/assets/asset-processing-service/processors/script/node-module-script.processor.js +136 -135
  280. package/src/services/assets/asset-processing-service/processors/stylesheet/content-stylesheet.processor.js +27 -29
  281. package/src/services/assets/asset-processing-service/processors/stylesheet/file-stylesheet.processor.js +34 -40
  282. package/src/services/assets/asset-processing-service/processors/stylesheet/stylesheet-processor-pipeline.js +36 -35
  283. package/src/services/assets/asset-processing-service/resolve-integration-plugin.js +14 -16
  284. package/src/services/assets/asset-processing-service/ungrouped-dependency-processing.js +27 -39
  285. package/src/services/assets/browser-bundle.service.js +52 -47
  286. package/src/services/cache/cache.types.js +5 -0
  287. package/src/services/cache/index.js +6 -7
  288. package/src/services/cache/memory-cache-store.js +101 -89
  289. package/src/services/cache/page-cache-service.js +156 -145
  290. package/src/services/cache/page-request-cache-coordinator.service.js +102 -102
  291. package/src/services/html/html-rewriter-provider.service.js +61 -61
  292. package/src/services/html/html-transformer.service.js +249 -266
  293. package/src/services/invalidation/development-invalidation.service.js +252 -241
  294. package/src/services/module-loading/app-module-loader.service.js +1 -0
  295. package/src/services/module-loading/app-server-module-transpiler.service.js +107 -101
  296. package/src/services/module-loading/host-module-loader-registry.js +6 -11
  297. package/src/services/module-loading/module-loading-types.js +1 -0
  298. package/src/services/module-loading/page-module-import.service.js +235 -243
  299. package/src/services/module-loading/route-module-build-cache-registry.js +47 -33
  300. package/src/services/module-loading/route-module-build-cache.js +3 -38
  301. package/src/services/module-loading/route-module-build-cache.store.js +195 -200
  302. package/src/services/module-loading/route-module-build-manifest.js +61 -74
  303. package/src/services/module-loading/route-module-dependency-hasher.js +136 -110
  304. package/src/services/module-loading/server-module-transpiler.service.js +68 -62
  305. package/src/services/module-loading/source-module-support.js +15 -7
  306. package/src/services/runtime-state/dev-graph.service.js +165 -157
  307. package/src/services/runtime-state/entrypoint-dependency-graph.service.js +85 -76
  308. package/src/services/runtime-state/server-invalidation-state.service.js +38 -30
  309. package/src/services/validation/schema-validation-service.js +157 -95
  310. package/src/services/validation/standard-schema.types.js +1 -0
  311. package/src/services/validation/validate-standard-schema.js +13 -13
  312. package/src/static-site-generator/production-page-browser-graph-prebuild.js +35 -19
  313. package/src/static-site-generator/sitemap-routes.js +33 -28
  314. package/src/static-site-generator/sitemap.js +38 -29
  315. package/src/static-site-generator/static-build-invalidation.js +34 -56
  316. package/src/static-site-generator/static-export-context.js +1 -0
  317. package/src/static-site-generator/static-site-generator.js +517 -553
  318. package/src/types/internal-types.d.ts +19 -3
  319. package/src/types/internal-types.js +1 -0
  320. package/src/types/public-types.d.ts +16 -46
  321. package/src/types/public-types.js +1 -0
  322. package/src/utils/deep-merge.js +39 -26
  323. package/src/utils/ecopages-route-info.js +27 -23
  324. package/src/utils/hash.js +3 -6
  325. package/src/utils/html-escaping.js +21 -8
  326. package/src/utils/html.js +1 -4
  327. package/src/utils/invariant.js +11 -10
  328. package/src/utils/locals-utils.js +32 -22
  329. package/src/utils/parse-cli-args.js +73 -65
  330. package/src/utils/path-pattern.js +38 -23
  331. package/src/utils/path-utils.module.js +8 -11
  332. package/src/utils/resolve-entry-file.js +70 -38
  333. package/src/utils/resolve-work-dir.js +23 -27
  334. package/src/utils/runtime.js +24 -33
  335. package/src/utils/server-utils.module.js +60 -52
  336. package/src/utils/static-file-extensions.js +52 -46
  337. package/src/watchers/project-watcher-ignore.js +16 -15
  338. package/src/watchers/project-watcher.js +385 -366
  339. package/src/watchers/project-watcher.test-helpers.js +45 -50
  340. package/src/adapters/shared/hmr/hmr-entrypoint-registrar.d.ts +0 -56
  341. package/src/adapters/shared/hmr/hmr-entrypoint-registrar.js +0 -106
  342. package/src/build/cache/dev-browser-script-cache.d.ts +0 -34
  343. package/src/build/cache/dev-browser-script-cache.js +0 -90
@@ -1,366 +1,354 @@
1
- import {
2
- getComponentRenderContext,
3
- runWithComponentRenderContext
4
- } from "./component-render-context.js";
5
- import { assertForeignChildrenNotOpaque, isMarkupNodeLike } from "./foreign-child-output.utils.js";
6
- function toForeignSubtreeRenderPayload(result) {
7
- return {
8
- html: result.html,
9
- assets: result.assets ?? [],
10
- rootTag: result.rootTag,
11
- rootAttributes: result.rootAttributes,
12
- attachmentPolicy: result.canAttachAttributes ? { kind: "first-element" } : { kind: "none" },
13
- integrationName: result.integrationName
14
- };
1
+ import { getComponentRenderContext, runWithComponentRenderContext, } from './component-render-context.js';
2
+ import { assertForeignChildrenNotOpaque, isMarkupNodeLike } from './foreign-child-output.utils.js';
3
+ /**
4
+ * Maps one component render result into the foreign-subtree payload shape used by
5
+ * queue resolution and integration tests.
6
+ */
7
+ export function toForeignSubtreeRenderPayload(result) {
8
+ return {
9
+ html: result.html,
10
+ assets: result.assets ?? [],
11
+ rootTag: result.rootTag,
12
+ rootAttributes: result.rootAttributes,
13
+ attachmentPolicy: result.canAttachAttributes ? { kind: 'first-element' } : { kind: 'none' },
14
+ integrationName: result.integrationName,
15
+ };
15
16
  }
16
- class ForeignSubtreeExecutionService {
17
- requiresForeignChildRuntime(input) {
18
- const children = input.children ?? input.props.children;
19
- if (children === void 0 || children === null) {
20
- return false;
21
- }
22
- if (typeof children === "string") {
23
- return false;
17
+ /**
18
+ * Executes one component render tree under Foreign Child support.
19
+ *
20
+ * This service owns mixed-integration execution policy and the queued token
21
+ * mechanics renderers use when foreign children cannot resolve inline.
22
+ */
23
+ export class ForeignSubtreeExecutionService {
24
+ requiresForeignChildRuntime(input) {
25
+ const children = input.children ?? input.props.children;
26
+ if (children === undefined || children === null) {
27
+ return false;
28
+ }
29
+ if (typeof children === 'string') {
30
+ return false;
31
+ }
32
+ if (typeof children !== 'object') {
33
+ return false;
34
+ }
35
+ return !isMarkupNodeLike(children);
24
36
  }
25
- if (typeof children !== "object") {
26
- return false;
37
+ shouldDelegateForeignChild(input) {
38
+ return !!input.targetIntegration && input.targetIntegration !== input.currentIntegration;
27
39
  }
28
- return !isMarkupNodeLike(children);
29
- }
30
- shouldDelegateForeignChild(input) {
31
- return !!input.targetIntegration && input.targetIntegration !== input.currentIntegration;
32
- }
33
- createFailFastRuntime(rendererName) {
34
- const interceptForeignChild = (input) => {
35
- if (!this.shouldDelegateForeignChild(input)) {
40
+ createFailFastRuntime(rendererName) {
41
+ const interceptForeignChild = (input) => {
42
+ if (!this.shouldDelegateForeignChild(input)) {
43
+ return {
44
+ kind: 'inline',
45
+ props: 'props' in input && input.props ? { ...input.props } : undefined,
46
+ };
47
+ }
48
+ throw new Error(`[ecopages] ${rendererName} renderer crossed into ${input.targetIntegration} without a renderer-owned foreign-child runtime. Override createForeignChildRuntime() to resolve foreign children inside the owning renderer.`);
49
+ };
36
50
  return {
37
- kind: "inline",
38
- props: "props" in input && input.props ? { ...input.props } : void 0
51
+ interceptForeignChild,
52
+ interceptForeignChildSync: interceptForeignChild,
53
+ };
54
+ }
55
+ getQueuedRuntimeContext(input, runtimeContextKey) {
56
+ return this.getRuntimeContext(input, runtimeContextKey);
57
+ }
58
+ createQueuedRuntime(options) {
59
+ return this.createQueueRuntime({
60
+ renderInput: options.renderInput,
61
+ rendererCache: options.rendererCache,
62
+ runtimeContextKey: options.runtimeContextKey,
63
+ tokenPrefix: options.tokenPrefix,
64
+ shouldQueueForeignChild: (input) => this.shouldDelegateForeignChild(input),
65
+ createRuntimeContext: options.createRuntimeContext,
66
+ });
67
+ }
68
+ createQueueRuntime(options) {
69
+ const runtimeContext = this.ensureRuntimeContext(options);
70
+ const interceptForeignChild = (input) => {
71
+ if (!options.shouldQueueForeignChild(input)) {
72
+ return {
73
+ kind: 'inline',
74
+ props: { ...input.props },
75
+ };
76
+ }
77
+ if ('children' in input.props) {
78
+ assertForeignChildrenNotOpaque(input.props.children, 'foreign-subtree queue');
79
+ }
80
+ runtimeContext.nextForeignSubtreeId += 1;
81
+ const foreignSubtreeId = runtimeContext.nextForeignSubtreeId;
82
+ const token = this.createForeignSubtreeToken(options.tokenPrefix, runtimeContext, foreignSubtreeId);
83
+ runtimeContext.queuedResolutions.push({
84
+ token,
85
+ component: input.component,
86
+ props: { ...input.props },
87
+ componentInstanceId: runtimeContext.componentInstanceScope
88
+ ? `${runtimeContext.componentInstanceScope}_n_${foreignSubtreeId}`
89
+ : `n_${foreignSubtreeId}`,
90
+ });
91
+ return {
92
+ kind: 'resolved',
93
+ value: token,
94
+ };
39
95
  };
40
- }
41
- throw new Error(
42
- `[ecopages] ${rendererName} renderer crossed into ${input.targetIntegration} without a renderer-owned foreign-child runtime. Override createForeignChildRuntime() to resolve foreign children inside the owning renderer.`
43
- );
44
- };
45
- return {
46
- interceptForeignChild,
47
- interceptForeignChildSync: interceptForeignChild
48
- };
49
- }
50
- getQueuedRuntimeContext(input, runtimeContextKey) {
51
- return this.getRuntimeContext(input, runtimeContextKey);
52
- }
53
- createQueuedRuntime(options) {
54
- return this.createQueueRuntime({
55
- renderInput: options.renderInput,
56
- rendererCache: options.rendererCache,
57
- runtimeContextKey: options.runtimeContextKey,
58
- tokenPrefix: options.tokenPrefix,
59
- shouldQueueForeignChild: (input) => this.shouldDelegateForeignChild(input),
60
- createRuntimeContext: options.createRuntimeContext
61
- });
62
- }
63
- createQueueRuntime(options) {
64
- const runtimeContext = this.ensureRuntimeContext(options);
65
- const interceptForeignChild = (input) => {
66
- if (!options.shouldQueueForeignChild(input)) {
67
96
  return {
68
- kind: "inline",
69
- props: { ...input.props }
97
+ interceptForeignChild,
98
+ interceptForeignChildSync: interceptForeignChild,
70
99
  };
71
- }
72
- if ("children" in input.props) {
73
- assertForeignChildrenNotOpaque(input.props.children, "foreign-subtree queue");
74
- }
75
- runtimeContext.nextForeignSubtreeId += 1;
76
- const foreignSubtreeId = runtimeContext.nextForeignSubtreeId;
77
- const token = this.createForeignSubtreeToken(options.tokenPrefix, runtimeContext, foreignSubtreeId);
78
- runtimeContext.queuedResolutions.push({
79
- token,
80
- component: input.component,
81
- props: { ...input.props },
82
- componentInstanceId: runtimeContext.componentInstanceScope ? `${runtimeContext.componentInstanceScope}_n_${foreignSubtreeId}` : `n_${foreignSubtreeId}`
83
- });
84
- return {
85
- kind: "resolved",
86
- value: token
87
- };
88
- };
89
- return {
90
- interceptForeignChild,
91
- interceptForeignChildSync: interceptForeignChild
92
- };
93
- }
94
- getRuntimeContext(input, runtimeContextKey) {
95
- const integrationContext = input.integrationContext;
96
- const runtimeContext = integrationContext?.[runtimeContextKey];
97
- if (typeof runtimeContext !== "object" || runtimeContext === null) {
98
- return void 0;
99
100
  }
100
- return runtimeContext;
101
- }
102
- async resolveStringQueuedHtml(options) {
103
- const runtimeContext = this.getQueuedRuntimeContext(options.renderInput, options.runtimeContextKey);
104
- return this.resolveQueuedHtml({
105
- currentIntegrationName: options.currentIntegrationName,
106
- html: options.html,
107
- runtimeContext,
108
- queueLabel: options.queueLabel,
109
- renderQueuedChildren: async (children, _runtimeContext, queuedResolutionsByToken, resolveToken) => {
110
- if (children === void 0) {
111
- return { assets: [], html: void 0 };
112
- }
113
- if (typeof children !== "string" && !isMarkupNodeLike(children)) {
114
- assertForeignChildrenNotOpaque(children, options.queueLabel);
115
- return { assets: [], children };
101
+ getRuntimeContext(input, runtimeContextKey) {
102
+ const integrationContext = input.integrationContext;
103
+ const runtimeContext = integrationContext?.[runtimeContextKey];
104
+ if (typeof runtimeContext !== 'object' || runtimeContext === null) {
105
+ return undefined;
116
106
  }
117
- const html = await this.resolveQueuedTokens(
118
- typeof children === "string" ? children : children.outerHTML ?? "",
119
- queuedResolutionsByToken,
120
- resolveToken
121
- );
122
- return { assets: [], html };
123
- },
124
- getOwningRenderer: options.getOwningRenderer,
125
- applyAttributesToFirstElement: options.applyAttributesToFirstElement,
126
- dedupeProcessedAssets: options.dedupeProcessedAssets
127
- });
128
- }
129
- async resolveQueuedHtml(options) {
130
- return this.resolveQueuedForeignSubtreeTokens({
131
- html: options.html,
132
- runtimeContext: options.runtimeContext,
133
- queueLabel: options.queueLabel,
134
- renderQueuedChildren: options.renderQueuedChildren,
135
- resolveForeignSubtree: (input, rendererCache) => this.resolveForeignSubtreeInOwningRenderer({
136
- currentIntegrationName: options.currentIntegrationName,
137
- input,
138
- rendererCache,
139
- getOwningRenderer: options.getOwningRenderer
140
- }),
141
- applyAttributesToFirstElement: options.applyAttributesToFirstElement,
142
- dedupeProcessedAssets: options.dedupeProcessedAssets
143
- });
144
- }
145
- async resolveQueuedForeignSubtreeTokens(options) {
146
- if (!options.runtimeContext || options.runtimeContext.queuedResolutions.length === 0) {
147
- return { assets: [], html: options.html };
107
+ return runtimeContext;
148
108
  }
149
- const runtimeContext = options.runtimeContext;
150
- const queuedResolutionsByToken = /* @__PURE__ */ new Map();
151
- const resolvedHtmlByToken = /* @__PURE__ */ new Map();
152
- const resolvingTokens = /* @__PURE__ */ new Set();
153
- const collectedAssets = [];
154
- const syncQueuedResolutions = () => {
155
- for (const resolution of runtimeContext.queuedResolutions) {
156
- if (!queuedResolutionsByToken.has(resolution.token)) {
157
- queuedResolutionsByToken.set(resolution.token, resolution);
158
- }
159
- }
160
- };
161
- const resolveToken = async (token) => {
162
- syncQueuedResolutions();
163
- const cachedHtml = resolvedHtmlByToken.get(token);
164
- if (cachedHtml) {
165
- return cachedHtml;
166
- }
167
- const resolution = queuedResolutionsByToken.get(token);
168
- if (!resolution) {
169
- return token;
170
- }
171
- if (resolvingTokens.has(token)) {
172
- throw new Error(
173
- `[ecopages] ${options.queueLabel} foreign-subtree queue contains a cycle or unresolved dependency links.`
174
- );
175
- }
176
- resolvingTokens.add(token);
177
- try {
178
- const renderedChildren = await options.renderQueuedChildren(
179
- resolution.props.children,
180
- runtimeContext,
181
- queuedResolutionsByToken,
182
- resolveToken
183
- );
184
- syncQueuedResolutions();
185
- if (renderedChildren.assets.length > 0) {
186
- collectedAssets.push(...renderedChildren.assets);
109
+ async resolveStringQueuedHtml(options) {
110
+ const runtimeContext = this.getQueuedRuntimeContext(options.renderInput, options.runtimeContextKey);
111
+ return this.resolveQueuedHtml({
112
+ currentIntegrationName: options.currentIntegrationName,
113
+ html: options.html,
114
+ runtimeContext,
115
+ queueLabel: options.queueLabel,
116
+ renderQueuedChildren: async (children, _runtimeContext, queuedResolutionsByToken, resolveToken) => {
117
+ if (children === undefined) {
118
+ return { assets: [], html: undefined };
119
+ }
120
+ if (typeof children !== 'string' && !isMarkupNodeLike(children)) {
121
+ assertForeignChildrenNotOpaque(children, options.queueLabel);
122
+ return { assets: [], children };
123
+ }
124
+ const html = await this.resolveQueuedTokens(typeof children === 'string' ? children : (children.outerHTML ?? ''), queuedResolutionsByToken, resolveToken);
125
+ return { assets: [], html };
126
+ },
127
+ getOwningRenderer: options.getOwningRenderer,
128
+ applyAttributesToFirstElement: options.applyAttributesToFirstElement,
129
+ dedupeProcessedAssets: options.dedupeProcessedAssets,
130
+ });
131
+ }
132
+ async resolveQueuedHtml(options) {
133
+ return this.resolveQueuedForeignSubtreeTokens({
134
+ html: options.html,
135
+ runtimeContext: options.runtimeContext,
136
+ queueLabel: options.queueLabel,
137
+ renderQueuedChildren: options.renderQueuedChildren,
138
+ resolveForeignSubtree: (input, rendererCache) => this.resolveForeignSubtreeInOwningRenderer({
139
+ currentIntegrationName: options.currentIntegrationName,
140
+ input,
141
+ rendererCache: rendererCache,
142
+ getOwningRenderer: options.getOwningRenderer,
143
+ }),
144
+ applyAttributesToFirstElement: options.applyAttributesToFirstElement,
145
+ dedupeProcessedAssets: options.dedupeProcessedAssets,
146
+ });
147
+ }
148
+ async resolveQueuedForeignSubtreeTokens(options) {
149
+ if (!options.runtimeContext || options.runtimeContext.queuedResolutions.length === 0) {
150
+ return { assets: [], html: options.html };
187
151
  }
188
- const foreignSubtreeRender = await options.resolveForeignSubtree(
189
- {
190
- component: resolution.component,
191
- props: { ...resolution.props },
192
- children: renderedChildren.html ?? renderedChildren.children,
193
- integrationContext: {
194
- rendererCache: runtimeContext.rendererCache,
195
- componentInstanceId: resolution.componentInstanceId
152
+ const runtimeContext = options.runtimeContext;
153
+ const queuedResolutionsByToken = new Map();
154
+ const resolvedHtmlByToken = new Map();
155
+ const resolvingTokens = new Set();
156
+ const collectedAssets = [];
157
+ const syncQueuedResolutions = () => {
158
+ for (const resolution of runtimeContext.queuedResolutions) {
159
+ if (!queuedResolutionsByToken.has(resolution.token)) {
160
+ queuedResolutionsByToken.set(resolution.token, resolution);
161
+ }
162
+ }
163
+ };
164
+ const resolveToken = async (token) => {
165
+ syncQueuedResolutions();
166
+ const cachedHtml = resolvedHtmlByToken.get(token);
167
+ if (cachedHtml) {
168
+ return cachedHtml;
169
+ }
170
+ const resolution = queuedResolutionsByToken.get(token);
171
+ if (!resolution) {
172
+ return token;
196
173
  }
197
- },
198
- runtimeContext.rendererCache
199
- );
200
- if (!foreignSubtreeRender) {
201
- throw new Error(
202
- `[ecopages] ${options.queueLabel} queued foreign subtree could not resolve its owning renderer.`
203
- );
174
+ if (resolvingTokens.has(token)) {
175
+ throw new Error(`[ecopages] ${options.queueLabel} foreign-subtree queue contains a cycle or unresolved dependency links.`);
176
+ }
177
+ resolvingTokens.add(token);
178
+ try {
179
+ const renderedChildren = await options.renderQueuedChildren(resolution.props.children, runtimeContext, queuedResolutionsByToken, resolveToken);
180
+ syncQueuedResolutions();
181
+ if (renderedChildren.assets.length > 0) {
182
+ collectedAssets.push(...renderedChildren.assets);
183
+ }
184
+ const foreignSubtreeRender = await options.resolveForeignSubtree({
185
+ component: resolution.component,
186
+ props: { ...resolution.props },
187
+ children: renderedChildren.html ?? renderedChildren.children,
188
+ integrationContext: {
189
+ rendererCache: runtimeContext.rendererCache,
190
+ componentInstanceId: resolution.componentInstanceId,
191
+ },
192
+ }, runtimeContext.rendererCache);
193
+ if (!foreignSubtreeRender) {
194
+ throw new Error(`[ecopages] ${options.queueLabel} queued foreign subtree could not resolve its owning renderer.`);
195
+ }
196
+ if ((foreignSubtreeRender.assets?.length ?? 0) > 0) {
197
+ collectedAssets.push(...(foreignSubtreeRender.assets ?? []));
198
+ }
199
+ const resolvedHtml = foreignSubtreeRender.attachmentPolicy.kind === 'first-element' &&
200
+ foreignSubtreeRender.rootAttributes
201
+ ? options.applyAttributesToFirstElement(foreignSubtreeRender.html, foreignSubtreeRender.rootAttributes)
202
+ : foreignSubtreeRender.html;
203
+ resolvedHtmlByToken.set(token, resolvedHtml);
204
+ return resolvedHtml;
205
+ }
206
+ finally {
207
+ resolvingTokens.delete(token);
208
+ }
209
+ };
210
+ let resolvedHtml = options.html;
211
+ for (let index = 0; index < runtimeContext.queuedResolutions.length; index += 1) {
212
+ syncQueuedResolutions();
213
+ const resolution = runtimeContext.queuedResolutions[index];
214
+ if (!resolvedHtml.includes(resolution.token)) {
215
+ continue;
216
+ }
217
+ resolvedHtml = resolvedHtml.split(resolution.token).join(await resolveToken(resolution.token));
218
+ }
219
+ return {
220
+ assets: options.dedupeProcessedAssets(collectedAssets),
221
+ html: resolvedHtml,
222
+ };
223
+ }
224
+ async executeComponentRender(options) {
225
+ const rendererCache = this.getRendererCache(options.input.integrationContext) ??
226
+ new Map();
227
+ const delegatedForeignChildRender = await this.resolveForeignChildInOwningRenderer({
228
+ currentIntegrationName: options.currentIntegrationName,
229
+ input: options.input,
230
+ rendererCache,
231
+ getOwningRenderer: options.getOwningRenderer,
232
+ });
233
+ if (delegatedForeignChildRender) {
234
+ return delegatedForeignChildRender;
204
235
  }
205
- if ((foreignSubtreeRender.assets?.length ?? 0) > 0) {
206
- collectedAssets.push(...foreignSubtreeRender.assets ?? []);
236
+ const hasForeignChildren = options.hasForeignChildDescendants(options.input.component) ||
237
+ this.requiresForeignChildRuntime(options.input);
238
+ const activeRenderContext = getComponentRenderContext();
239
+ if (!hasForeignChildren) {
240
+ if (!activeRenderContext || activeRenderContext.currentIntegration === options.currentIntegrationName) {
241
+ return options.normalizeComponentRenderOutput(await options.renderComponent(options.input));
242
+ }
243
+ const sameIntegrationExecution = await runWithComponentRenderContext({
244
+ currentIntegration: options.currentIntegrationName,
245
+ }, async () => options.renderComponent(options.input));
246
+ return options.normalizeComponentRenderOutput(sameIntegrationExecution.value);
207
247
  }
208
- const resolvedHtml2 = foreignSubtreeRender.attachmentPolicy.kind === "first-element" && foreignSubtreeRender.rootAttributes ? options.applyAttributesToFirstElement(
209
- foreignSubtreeRender.html,
210
- foreignSubtreeRender.rootAttributes
211
- ) : foreignSubtreeRender.html;
212
- resolvedHtmlByToken.set(token, resolvedHtml2);
213
- return resolvedHtml2;
214
- } finally {
215
- resolvingTokens.delete(token);
216
- }
217
- };
218
- let resolvedHtml = options.html;
219
- for (let index = 0; index < runtimeContext.queuedResolutions.length; index += 1) {
220
- syncQueuedResolutions();
221
- const resolution = runtimeContext.queuedResolutions[index];
222
- if (!resolvedHtml.includes(resolution.token)) {
223
- continue;
224
- }
225
- resolvedHtml = resolvedHtml.split(resolution.token).join(await resolveToken(resolution.token));
248
+ const execution = await runWithComponentRenderContext({
249
+ currentIntegration: options.currentIntegrationName,
250
+ foreignChildRuntime: options.createForeignChildRuntime({
251
+ renderInput: options.input,
252
+ rendererCache,
253
+ }),
254
+ }, async () => options.renderComponent(options.input));
255
+ return options.normalizeComponentRenderOutput(execution.value);
226
256
  }
227
- return {
228
- assets: options.dedupeProcessedAssets(collectedAssets),
229
- html: resolvedHtml
230
- };
231
- }
232
- async executeComponentRender(options) {
233
- const rendererCache = this.getRendererCache(options.input.integrationContext) ?? /* @__PURE__ */ new Map();
234
- const delegatedForeignChildRender = await this.resolveForeignChildInOwningRenderer({
235
- currentIntegrationName: options.currentIntegrationName,
236
- input: options.input,
237
- rendererCache,
238
- getOwningRenderer: options.getOwningRenderer
239
- });
240
- if (delegatedForeignChildRender) {
241
- return delegatedForeignChildRender;
257
+ getRendererCache(integrationContext) {
258
+ if (integrationContext?.rendererCache instanceof Map) {
259
+ return integrationContext.rendererCache;
260
+ }
261
+ return undefined;
242
262
  }
243
- const hasForeignChildren = options.hasForeignChildDescendants(options.input.component) || this.requiresForeignChildRuntime(options.input);
244
- const activeRenderContext = getComponentRenderContext();
245
- if (!hasForeignChildren) {
246
- if (!activeRenderContext || activeRenderContext.currentIntegration === options.currentIntegrationName) {
247
- return options.normalizeComponentRenderOutput(await options.renderComponent(options.input));
248
- }
249
- const sameIntegrationExecution = await runWithComponentRenderContext(
250
- {
251
- currentIntegration: options.currentIntegrationName
252
- },
253
- async () => options.renderComponent(options.input)
254
- );
255
- return options.normalizeComponentRenderOutput(sameIntegrationExecution.value);
263
+ withRendererCache(input, rendererCache) {
264
+ const integrationContext = input.integrationContext;
265
+ const sharedRendererCache = rendererCache;
266
+ return {
267
+ ...input,
268
+ integrationContext: integrationContext
269
+ ? { ...integrationContext, rendererCache: sharedRendererCache }
270
+ : { rendererCache: sharedRendererCache },
271
+ };
256
272
  }
257
- const execution = await runWithComponentRenderContext(
258
- {
259
- currentIntegration: options.currentIntegrationName,
260
- foreignChildRuntime: options.createForeignChildRuntime({
261
- renderInput: options.input,
262
- rendererCache
263
- })
264
- },
265
- async () => options.renderComponent(options.input)
266
- );
267
- return options.normalizeComponentRenderOutput(execution.value);
268
- }
269
- getRendererCache(integrationContext) {
270
- if (integrationContext?.rendererCache instanceof Map) {
271
- return integrationContext.rendererCache;
273
+ getForeignOwnerIntegrationName(component, currentIntegrationName) {
274
+ const integrationName = component.config?.integration ?? component.config?.__eco?.integration;
275
+ if (!integrationName || integrationName === 'html' || integrationName === currentIntegrationName) {
276
+ return undefined;
277
+ }
278
+ return integrationName;
272
279
  }
273
- return void 0;
274
- }
275
- withRendererCache(input, rendererCache) {
276
- const integrationContext = input.integrationContext;
277
- const sharedRendererCache = rendererCache;
278
- return {
279
- ...input,
280
- integrationContext: integrationContext ? { ...integrationContext, rendererCache: sharedRendererCache } : { rendererCache: sharedRendererCache }
281
- };
282
- }
283
- getForeignOwnerIntegrationName(component, currentIntegrationName) {
284
- const integrationName = component.config?.integration ?? component.config?.__eco?.integration;
285
- if (!integrationName || integrationName === "html" || integrationName === currentIntegrationName) {
286
- return void 0;
280
+ async resolveForeignChildInOwningRenderer(options) {
281
+ return await this.runInForeignOwningRenderer({
282
+ currentIntegrationName: options.currentIntegrationName,
283
+ input: options.input,
284
+ rendererCache: options.rendererCache,
285
+ getOwningRenderer: options.getOwningRenderer,
286
+ run: (owningRenderer, delegatedInput) => owningRenderer.renderComponentWithForeignChildren(delegatedInput),
287
+ });
287
288
  }
288
- return integrationName;
289
- }
290
- async resolveForeignChildInOwningRenderer(options) {
291
- return await this.runInForeignOwningRenderer({
292
- currentIntegrationName: options.currentIntegrationName,
293
- input: options.input,
294
- rendererCache: options.rendererCache,
295
- getOwningRenderer: options.getOwningRenderer,
296
- run: (owningRenderer, delegatedInput) => owningRenderer.renderComponentWithForeignChildren(delegatedInput)
297
- });
298
- }
299
- async resolveForeignSubtreeInOwningRenderer(options) {
300
- return await this.runInForeignOwningRenderer({
301
- currentIntegrationName: options.currentIntegrationName,
302
- input: options.input,
303
- rendererCache: options.rendererCache,
304
- getOwningRenderer: options.getOwningRenderer,
305
- run: async (owningRenderer, delegatedInput) => toForeignSubtreeRenderPayload(await owningRenderer.renderComponentWithForeignChildren(delegatedInput))
306
- });
307
- }
308
- async runInForeignOwningRenderer(options) {
309
- const foreignOwnerIntegrationName = this.getForeignOwnerIntegrationName(
310
- options.input.component,
311
- options.currentIntegrationName
312
- );
313
- if (!foreignOwnerIntegrationName) {
314
- return void 0;
289
+ async resolveForeignSubtreeInOwningRenderer(options) {
290
+ return await this.runInForeignOwningRenderer({
291
+ currentIntegrationName: options.currentIntegrationName,
292
+ input: options.input,
293
+ rendererCache: options.rendererCache,
294
+ getOwningRenderer: options.getOwningRenderer,
295
+ run: async (owningRenderer, delegatedInput) => toForeignSubtreeRenderPayload(await owningRenderer.renderComponentWithForeignChildren(delegatedInput)),
296
+ });
315
297
  }
316
- const owningRenderer = await options.getOwningRenderer(foreignOwnerIntegrationName, options.rendererCache);
317
- if (owningRenderer.name === options.currentIntegrationName) {
318
- return void 0;
298
+ async runInForeignOwningRenderer(options) {
299
+ const foreignOwnerIntegrationName = this.getForeignOwnerIntegrationName(options.input.component, options.currentIntegrationName);
300
+ if (!foreignOwnerIntegrationName) {
301
+ return undefined;
302
+ }
303
+ const owningRenderer = await options.getOwningRenderer(foreignOwnerIntegrationName, options.rendererCache);
304
+ if (owningRenderer.name === options.currentIntegrationName) {
305
+ return undefined;
306
+ }
307
+ const delegatedInputWithCache = this.withRendererCache(options.input, options.rendererCache);
308
+ const delegatedChildren = delegatedInputWithCache.children ?? delegatedInputWithCache.props.children;
309
+ return await options.run(owningRenderer, {
310
+ ...delegatedInputWithCache,
311
+ children: delegatedChildren,
312
+ });
319
313
  }
320
- const delegatedInputWithCache = this.withRendererCache(options.input, options.rendererCache);
321
- const delegatedChildren = delegatedInputWithCache.children ?? delegatedInputWithCache.props.children;
322
- return await options.run(owningRenderer, {
323
- ...delegatedInputWithCache,
324
- children: delegatedChildren
325
- });
326
- }
327
- async resolveQueuedTokens(html, queuedResolutionsByToken, resolveToken) {
328
- let resolvedHtml = html;
329
- for (const token of queuedResolutionsByToken.keys()) {
330
- if (!resolvedHtml.includes(token)) {
331
- continue;
332
- }
333
- resolvedHtml = resolvedHtml.split(token).join(await resolveToken(token));
314
+ async resolveQueuedTokens(html, queuedResolutionsByToken, resolveToken) {
315
+ let resolvedHtml = html;
316
+ for (const token of queuedResolutionsByToken.keys()) {
317
+ if (!resolvedHtml.includes(token)) {
318
+ continue;
319
+ }
320
+ resolvedHtml = resolvedHtml.split(token).join(await resolveToken(token));
321
+ }
322
+ return resolvedHtml;
334
323
  }
335
- return resolvedHtml;
336
- }
337
- createForeignSubtreeToken(tokenPrefix, runtimeContext, foreignSubtreeId) {
338
- return `${tokenPrefix}${runtimeContext.componentInstanceScope ?? "root"}__${foreignSubtreeId}__`;
339
- }
340
- ensureRuntimeContext(options) {
341
- let integrationContext;
342
- if (typeof options.renderInput.integrationContext === "object" && options.renderInput.integrationContext !== null) {
343
- integrationContext = options.renderInput.integrationContext;
344
- } else {
345
- integrationContext = {};
324
+ createForeignSubtreeToken(tokenPrefix, runtimeContext, foreignSubtreeId) {
325
+ return `${tokenPrefix}${runtimeContext.componentInstanceScope ?? 'root'}__${foreignSubtreeId}__`;
346
326
  }
347
- const existingRuntimeContext = integrationContext[options.runtimeContextKey];
348
- if (typeof existingRuntimeContext !== "object" || existingRuntimeContext === null) {
349
- integrationContext[options.runtimeContextKey] = options.createRuntimeContext?.(integrationContext, options.rendererCache) ?? {
350
- rendererCache: options.rendererCache,
351
- componentInstanceScope: integrationContext.componentInstanceId,
352
- nextForeignSubtreeId: 0,
353
- queuedResolutions: []
354
- };
355
- } else {
356
- existingRuntimeContext.rendererCache = options.rendererCache;
327
+ ensureRuntimeContext(options) {
328
+ let integrationContext;
329
+ if (typeof options.renderInput.integrationContext === 'object' &&
330
+ options.renderInput.integrationContext !== null) {
331
+ integrationContext = options.renderInput.integrationContext;
332
+ }
333
+ else {
334
+ integrationContext = {};
335
+ }
336
+ const existingRuntimeContext = integrationContext[options.runtimeContextKey];
337
+ if (typeof existingRuntimeContext !== 'object' || existingRuntimeContext === null) {
338
+ integrationContext[options.runtimeContextKey] =
339
+ options.createRuntimeContext?.(integrationContext, options.rendererCache) ??
340
+ {
341
+ rendererCache: options.rendererCache,
342
+ componentInstanceScope: integrationContext.componentInstanceId,
343
+ nextForeignSubtreeId: 0,
344
+ queuedResolutions: [],
345
+ };
346
+ }
347
+ else {
348
+ existingRuntimeContext.rendererCache = options.rendererCache;
349
+ }
350
+ integrationContext.rendererCache = options.rendererCache;
351
+ options.renderInput.integrationContext = integrationContext;
352
+ return integrationContext[options.runtimeContextKey];
357
353
  }
358
- integrationContext.rendererCache = options.rendererCache;
359
- options.renderInput.integrationContext = integrationContext;
360
- return integrationContext[options.runtimeContextKey];
361
- }
362
354
  }
363
- export {
364
- ForeignSubtreeExecutionService,
365
- toForeignSubtreeRenderPayload
366
- };