@ecopages/core 0.2.0-alpha.9 → 0.2.1

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 (357) hide show
  1. package/CHANGELOG.md +18 -11
  2. package/README.md +23 -26
  3. package/package.json +76 -58
  4. package/src/adapters/README.md +2 -2
  5. package/src/adapters/abstract/application-adapter.d.ts +28 -2
  6. package/src/adapters/abstract/application-adapter.js +14 -2
  7. package/src/adapters/abstract/router-adapter.d.ts +1 -1
  8. package/src/adapters/abstract/server-adapter.d.ts +2 -2
  9. package/src/adapters/bun/client-bridge.d.ts +1 -1
  10. package/src/adapters/bun/create-app.d.ts +4 -12
  11. package/src/adapters/bun/create-app.js +4 -5
  12. package/src/adapters/bun/hmr-manager.d.ts +4 -4
  13. package/src/adapters/bun/hmr-manager.js +8 -8
  14. package/src/adapters/bun/index.d.ts +1 -1
  15. package/src/adapters/bun/index.js +2 -2
  16. package/src/adapters/bun/server-adapter.d.ts +5 -5
  17. package/src/adapters/bun/server-adapter.js +6 -5
  18. package/src/adapters/bun/server-lifecycle.d.ts +4 -4
  19. package/src/adapters/bun/server-lifecycle.js +2 -2
  20. package/src/{create-app.d.ts → adapters/create-app.d.ts} +9 -6
  21. package/src/{create-app.js → adapters/create-app.js} +4 -4
  22. package/src/adapters/index.d.ts +1 -5
  23. package/src/adapters/index.js +1 -7
  24. package/src/adapters/node/create-app.d.ts +6 -9
  25. package/src/adapters/node/create-app.js +12 -6
  26. package/src/adapters/node/node-client-bridge.d.ts +1 -1
  27. package/src/adapters/node/node-hmr-manager.d.ts +2 -2
  28. package/src/adapters/node/node-hmr-manager.js +3 -3
  29. package/src/adapters/node/server-adapter.d.ts +4 -4
  30. package/src/adapters/node/server-adapter.js +13 -12
  31. package/src/adapters/node/static-content-server.d.ts +1 -1
  32. package/src/adapters/node/static-content-server.js +1 -1
  33. package/src/adapters/shared/application-adapter.d.ts +1 -1
  34. package/src/adapters/shared/define-api-handler.d.ts +1 -1
  35. package/src/adapters/shared/explicit-static-route-matcher.d.ts +2 -2
  36. package/src/adapters/shared/file-route-middleware-pipeline.d.ts +1 -1
  37. package/src/adapters/shared/fs-server-response-factory.d.ts +2 -2
  38. package/src/adapters/shared/fs-server-response-factory.js +1 -1
  39. package/src/adapters/shared/fs-server-response-matcher.d.ts +1 -1
  40. package/src/adapters/shared/hmr-entrypoint-registrar.js +1 -1
  41. package/src/adapters/shared/hmr-html-response.d.ts +1 -1
  42. package/src/adapters/shared/render-context.d.ts +2 -1
  43. package/src/adapters/shared/render-context.js +3 -1
  44. package/src/adapters/shared/runtime-bootstrap.d.ts +1 -1
  45. package/src/adapters/shared/runtime-bootstrap.js +1 -1
  46. package/src/adapters/shared/server-adapter.d.ts +1 -1
  47. package/src/adapters/shared/server-adapter.js +5 -1
  48. package/src/adapters/shared/server-route-handler.d.ts +4 -4
  49. package/src/adapters/shared/server-route-handler.js +3 -3
  50. package/src/adapters/shared/server-static-builder.d.ts +5 -5
  51. package/src/adapters/shared/server-static-builder.js +5 -4
  52. package/src/build/README.md +19 -13
  53. package/src/build/build-adapter.d.ts +67 -20
  54. package/src/build/build-adapter.js +420 -19
  55. package/src/build/dev-build-coordinator.d.ts +10 -12
  56. package/src/build/dev-build-coordinator.js +8 -15
  57. package/src/build/esbuild-build-adapter.d.ts +6 -0
  58. package/src/build/esbuild-build-adapter.js +94 -11
  59. package/src/build/runtime-build-executor.d.ts +5 -4
  60. package/src/build/runtime-build-executor.js +5 -3
  61. package/src/build/runtime-specifier-alias-plugin.js +19 -15
  62. package/src/build/runtime-specifier-aliases.d.ts +5 -0
  63. package/src/build/runtime-specifier-aliases.js +95 -0
  64. package/src/config/README.md +5 -2
  65. package/src/config/config-builder.d.ts +25 -2
  66. package/src/config/config-builder.js +44 -7
  67. package/src/declarations.d.ts +1 -1
  68. package/src/dev/sc-server.d.ts +1 -1
  69. package/src/dev/sc-server.js +1 -1
  70. package/src/eco/eco.browser.d.ts +2 -0
  71. package/src/eco/eco.browser.js +83 -0
  72. package/src/eco/eco.js +19 -48
  73. package/src/eco/eco.types.d.ts +1 -1
  74. package/src/eco/eco.utils.d.ts +1 -40
  75. package/src/eco/eco.utils.js +5 -35
  76. package/src/eco/global-injector-map.d.ts +1 -1
  77. package/src/eco/lazy-injector-map.d.ts +1 -1
  78. package/src/hmr/hmr-strategy.d.ts +16 -13
  79. package/src/hmr/hmr-strategy.js +22 -7
  80. package/src/hmr/strategies/default-hmr-strategy.d.ts +2 -2
  81. package/src/hmr/strategies/default-hmr-strategy.js +1 -1
  82. package/src/hmr/strategies/js-hmr-strategy.d.ts +2 -2
  83. package/src/hmr/strategies/js-hmr-strategy.js +2 -2
  84. package/src/index.browser.d.ts +2 -2
  85. package/src/index.browser.js +1 -1
  86. package/src/index.d.ts +3 -2
  87. package/src/index.js +15 -4
  88. package/src/integrations/ghtml/ghtml-renderer.d.ts +6 -1
  89. package/src/integrations/ghtml/ghtml-renderer.js +29 -28
  90. package/src/integrations/ghtml/ghtml.plugin.d.ts +2 -2
  91. package/src/integrations/ghtml/ghtml.plugin.js +2 -2
  92. package/src/plugins/README.md +1 -0
  93. package/src/plugins/eco-component-meta-plugin.d.ts +12 -1
  94. package/src/plugins/eco-component-meta-plugin.js +26 -20
  95. package/src/plugins/foreign-jsx-override-plugin.d.ts +31 -0
  96. package/src/plugins/foreign-jsx-override-plugin.js +35 -0
  97. package/src/plugins/integration-plugin.d.ts +99 -33
  98. package/src/plugins/integration-plugin.js +68 -21
  99. package/src/plugins/processor.d.ts +2 -2
  100. package/src/plugins/processor.js +2 -2
  101. package/src/plugins/source-transform.d.ts +46 -0
  102. package/src/plugins/source-transform.js +71 -0
  103. package/src/route-renderer/GRAPH.md +54 -84
  104. package/src/route-renderer/README.md +14 -20
  105. package/src/route-renderer/orchestration/component-render-context.d.ts +83 -0
  106. package/src/route-renderer/orchestration/component-render-context.js +147 -0
  107. package/src/route-renderer/orchestration/integration-renderer.d.ts +233 -76
  108. package/src/route-renderer/orchestration/integration-renderer.js +500 -143
  109. package/src/route-renderer/orchestration/queued-boundary-runtime.service.d.ts +93 -0
  110. package/src/route-renderer/orchestration/queued-boundary-runtime.service.js +155 -0
  111. package/src/route-renderer/orchestration/render-execution.service.d.ts +11 -71
  112. package/src/route-renderer/orchestration/render-execution.service.js +65 -80
  113. package/src/{eco/eco.utils.ts → route-renderer/orchestration/render-output.utils.d.ts} +10 -53
  114. package/src/route-renderer/orchestration/render-output.utils.js +65 -0
  115. package/src/route-renderer/orchestration/render-preparation.service.d.ts +2 -8
  116. package/src/route-renderer/orchestration/render-preparation.service.js +10 -17
  117. package/src/route-renderer/orchestration/template-serialization.d.ts +38 -0
  118. package/src/route-renderer/orchestration/template-serialization.js +45 -0
  119. package/src/route-renderer/page-loading/dependency-resolver.d.ts +2 -2
  120. package/src/route-renderer/page-loading/dependency-resolver.js +10 -8
  121. package/src/route-renderer/page-loading/page-module-loader.d.ts +6 -4
  122. package/src/route-renderer/page-loading/page-module-loader.js +7 -5
  123. package/src/route-renderer/route-renderer.d.ts +5 -3
  124. package/src/route-renderer/route-renderer.js +13 -3
  125. package/src/router/README.md +79 -8
  126. package/src/router/client/navigation-coordinator.js +2 -2
  127. package/src/router/server/fs-router-scanner.d.ts +1 -1
  128. package/src/router/server/fs-router-scanner.js +6 -1
  129. package/src/router/server/fs-router.d.ts +1 -1
  130. package/src/services/assets/asset-processing-service/asset-processing.service.d.ts +3 -3
  131. package/src/services/assets/asset-processing-service/asset-processing.service.js +6 -6
  132. package/src/services/assets/asset-processing-service/asset.factory.d.ts +1 -1
  133. package/src/services/assets/asset-processing-service/asset.factory.js +2 -2
  134. package/src/services/assets/asset-processing-service/index.d.ts +5 -5
  135. package/src/services/assets/asset-processing-service/index.js +5 -5
  136. package/src/services/assets/asset-processing-service/processor.interface.d.ts +2 -2
  137. package/src/services/assets/asset-processing-service/processor.registry.d.ts +2 -2
  138. package/src/services/assets/asset-processing-service/processors/base/base-processor.d.ts +1 -1
  139. package/src/services/assets/asset-processing-service/processors/base/base-processor.js +1 -1
  140. package/src/services/assets/asset-processing-service/processors/base/base-script-processor.d.ts +3 -3
  141. package/src/services/assets/asset-processing-service/processors/base/base-script-processor.js +2 -2
  142. package/src/services/assets/asset-processing-service/processors/index.d.ts +5 -5
  143. package/src/services/assets/asset-processing-service/processors/index.js +5 -5
  144. package/src/services/assets/asset-processing-service/processors/script/content-script.processor.d.ts +2 -2
  145. package/src/services/assets/asset-processing-service/processors/script/content-script.processor.js +1 -1
  146. package/src/services/assets/asset-processing-service/processors/script/file-script.processor.d.ts +4 -3
  147. package/src/services/assets/asset-processing-service/processors/script/file-script.processor.js +15 -3
  148. package/src/services/assets/asset-processing-service/processors/script/node-module-script.processor.d.ts +3 -3
  149. package/src/services/assets/asset-processing-service/processors/script/node-module-script.processor.js +1 -1
  150. package/src/services/assets/asset-processing-service/processors/stylesheet/content-stylesheet.processor.d.ts +2 -2
  151. package/src/services/assets/asset-processing-service/processors/stylesheet/content-stylesheet.processor.js +1 -1
  152. package/src/services/assets/asset-processing-service/processors/stylesheet/file-stylesheet.processor.d.ts +2 -2
  153. package/src/services/assets/asset-processing-service/processors/stylesheet/file-stylesheet.processor.js +1 -1
  154. package/src/services/assets/browser-bundle.service.d.ts +1 -1
  155. package/src/services/assets/browser-bundle.service.js +2 -2
  156. package/src/services/html/html-rewriter-provider.service.js +4 -1
  157. package/src/services/html/html-transformer.service.d.ts +2 -2
  158. package/src/services/html/html-transformer.service.js +4 -10
  159. package/src/services/invalidation/development-invalidation.service.d.ts +1 -1
  160. package/src/services/invalidation/development-invalidation.service.js +1 -0
  161. package/src/services/module-loading/app-module-loader.service.d.ts +25 -0
  162. package/src/services/module-loading/app-module-loader.service.js +31 -0
  163. package/src/services/module-loading/app-server-module-transpiler.service.d.ts +9 -1
  164. package/src/services/module-loading/app-server-module-transpiler.service.js +77 -2
  165. package/src/services/module-loading/host-module-loader-registry.d.ts +4 -0
  166. package/src/services/module-loading/host-module-loader-registry.js +15 -0
  167. package/src/services/module-loading/module-loading-types.d.ts +2 -0
  168. package/src/{adapters/node/bootstrap-dependency-resolver.d.ts → services/module-loading/node-bootstrap-plugin.d.ts} +2 -24
  169. package/src/{adapters/node/bootstrap-dependency-resolver.js → services/module-loading/node-bootstrap-plugin.js} +42 -22
  170. package/src/services/module-loading/page-module-import.service.d.ts +4 -0
  171. package/src/services/module-loading/page-module-import.service.js +38 -9
  172. package/src/services/module-loading/server-module-transpiler.service.d.ts +3 -0
  173. package/src/services/module-loading/server-module-transpiler.service.js +4 -1
  174. package/src/services/runtime-state/dev-graph.service.d.ts +6 -6
  175. package/src/services/runtime-state/dev-graph.service.js +10 -10
  176. package/src/services/runtime-state/entrypoint-dependency-graph.service.d.ts +1 -1
  177. package/src/services/runtime-state/runtime-specifier-registry.service.d.ts +1 -1
  178. package/src/services/runtime-state/server-invalidation-state.service.d.ts +1 -1
  179. package/src/static-site-generator/static-site-generator.d.ts +2 -2
  180. package/src/static-site-generator/static-site-generator.js +1 -1
  181. package/src/{internal-types.d.ts → types/internal-types.d.ts} +24 -14
  182. package/src/{public-types.d.ts → types/public-types.d.ts} +30 -14
  183. package/src/types/public-types.js +0 -0
  184. package/src/utils/html-escaping.d.ts +7 -0
  185. package/src/utils/html-escaping.js +6 -0
  186. package/src/utils/locals-utils.d.ts +1 -1
  187. package/src/utils/parse-cli-args.d.ts +4 -1
  188. package/src/utils/parse-cli-args.js +16 -1
  189. package/src/utils/resolve-work-dir.js +1 -1
  190. package/src/watchers/project-watcher.d.ts +4 -4
  191. package/src/watchers/project-watcher.js +4 -10
  192. package/src/watchers/project-watcher.test-helpers.d.ts +2 -2
  193. package/src/adapters/abstract/application-adapter.ts +0 -337
  194. package/src/adapters/abstract/router-adapter.ts +0 -30
  195. package/src/adapters/abstract/server-adapter.ts +0 -79
  196. package/src/adapters/bun/client-bridge.ts +0 -62
  197. package/src/adapters/bun/create-app.ts +0 -189
  198. package/src/adapters/bun/hmr-manager.ts +0 -409
  199. package/src/adapters/bun/index.ts +0 -2
  200. package/src/adapters/bun/server-adapter.ts +0 -499
  201. package/src/adapters/bun/server-lifecycle.ts +0 -124
  202. package/src/adapters/index.ts +0 -6
  203. package/src/adapters/node/bootstrap-dependency-resolver.ts +0 -301
  204. package/src/adapters/node/create-app.ts +0 -179
  205. package/src/adapters/node/index.d.ts +0 -6
  206. package/src/adapters/node/index.js +0 -11
  207. package/src/adapters/node/index.ts +0 -16
  208. package/src/adapters/node/node-client-bridge.ts +0 -79
  209. package/src/adapters/node/node-hmr-manager.ts +0 -381
  210. package/src/adapters/node/runtime-adapter.d.ts +0 -46
  211. package/src/adapters/node/runtime-adapter.js +0 -306
  212. package/src/adapters/node/runtime-adapter.ts +0 -439
  213. package/src/adapters/node/server-adapter.ts +0 -488
  214. package/src/adapters/node/static-content-server.ts +0 -239
  215. package/src/adapters/node/write-runtime-manifest.d.ts +0 -26
  216. package/src/adapters/node/write-runtime-manifest.js +0 -12
  217. package/src/adapters/node/write-runtime-manifest.ts +0 -38
  218. package/src/adapters/shared/api-response.ts +0 -104
  219. package/src/adapters/shared/application-adapter.ts +0 -199
  220. package/src/adapters/shared/define-api-handler.ts +0 -66
  221. package/src/adapters/shared/explicit-static-route-matcher.ts +0 -140
  222. package/src/adapters/shared/file-route-middleware-pipeline.ts +0 -127
  223. package/src/adapters/shared/fs-server-response-factory.ts +0 -118
  224. package/src/adapters/shared/fs-server-response-matcher.ts +0 -205
  225. package/src/adapters/shared/hmr-entrypoint-registrar.ts +0 -149
  226. package/src/adapters/shared/hmr-html-response.ts +0 -52
  227. package/src/adapters/shared/render-context.ts +0 -120
  228. package/src/adapters/shared/runtime-bootstrap.ts +0 -79
  229. package/src/adapters/shared/server-adapter.ts +0 -489
  230. package/src/adapters/shared/server-route-handler.ts +0 -153
  231. package/src/adapters/shared/server-static-builder.ts +0 -166
  232. package/src/build/build-adapter.ts +0 -361
  233. package/src/build/build-manifest.ts +0 -54
  234. package/src/build/build-types.ts +0 -83
  235. package/src/build/dev-build-coordinator.ts +0 -221
  236. package/src/build/esbuild-build-adapter.ts +0 -559
  237. package/src/build/runtime-build-executor.ts +0 -34
  238. package/src/build/runtime-specifier-alias-plugin.ts +0 -58
  239. package/src/config/config-builder.ts +0 -706
  240. package/src/constants.ts +0 -54
  241. package/src/create-app.ts +0 -87
  242. package/src/dev/sc-server.ts +0 -143
  243. package/src/eco/component-render-context.d.ts +0 -105
  244. package/src/eco/component-render-context.js +0 -87
  245. package/src/eco/component-render-context.ts +0 -224
  246. package/src/eco/eco.ts +0 -242
  247. package/src/eco/eco.types.ts +0 -221
  248. package/src/eco/global-injector-map.ts +0 -112
  249. package/src/eco/lazy-injector-map.ts +0 -120
  250. package/src/eco/module-dependencies.ts +0 -75
  251. package/src/errors/http-error.ts +0 -72
  252. package/src/errors/index.ts +0 -2
  253. package/src/errors/locals-access-error.ts +0 -7
  254. package/src/global/app-logger.ts +0 -4
  255. package/src/hmr/client/hmr-runtime.ts +0 -152
  256. package/src/hmr/hmr-strategy.ts +0 -172
  257. package/src/hmr/hmr.postcss.test.e2e.ts +0 -41
  258. package/src/hmr/hmr.test.e2e.ts +0 -66
  259. package/src/hmr/strategies/default-hmr-strategy.ts +0 -60
  260. package/src/hmr/strategies/js-hmr-strategy.ts +0 -320
  261. package/src/index.browser.ts +0 -3
  262. package/src/index.ts +0 -5
  263. package/src/integrations/ghtml/ghtml-renderer.ts +0 -96
  264. package/src/integrations/ghtml/ghtml.plugin.ts +0 -32
  265. package/src/internal-types.ts +0 -232
  266. package/src/plugins/alias-resolver-plugin.ts +0 -63
  267. package/src/plugins/eco-component-meta-plugin.ts +0 -481
  268. package/src/plugins/integration-plugin.ts +0 -226
  269. package/src/plugins/processor.ts +0 -240
  270. package/src/plugins/runtime-capability.ts +0 -14
  271. package/src/public-types.ts +0 -1317
  272. package/src/route-renderer/component-graph/component-graph-executor.d.ts +0 -32
  273. package/src/route-renderer/component-graph/component-graph-executor.js +0 -31
  274. package/src/route-renderer/component-graph/component-graph-executor.ts +0 -84
  275. package/src/route-renderer/component-graph/component-graph.d.ts +0 -42
  276. package/src/route-renderer/component-graph/component-graph.js +0 -72
  277. package/src/route-renderer/component-graph/component-graph.ts +0 -159
  278. package/src/route-renderer/component-graph/component-marker.d.ts +0 -52
  279. package/src/route-renderer/component-graph/component-marker.js +0 -46
  280. package/src/route-renderer/component-graph/component-marker.ts +0 -117
  281. package/src/route-renderer/component-graph/component-reference.d.ts +0 -10
  282. package/src/route-renderer/component-graph/component-reference.js +0 -19
  283. package/src/route-renderer/component-graph/component-reference.ts +0 -29
  284. package/src/route-renderer/component-graph/marker-graph-resolver.d.ts +0 -77
  285. package/src/route-renderer/component-graph/marker-graph-resolver.js +0 -95
  286. package/src/route-renderer/component-graph/marker-graph-resolver.ts +0 -155
  287. package/src/route-renderer/orchestration/integration-renderer.ts +0 -790
  288. package/src/route-renderer/orchestration/render-execution.service.ts +0 -230
  289. package/src/route-renderer/orchestration/render-preparation.service.ts +0 -476
  290. package/src/route-renderer/page-loading/dependency-resolver.ts +0 -612
  291. package/src/route-renderer/page-loading/page-module-loader.ts +0 -181
  292. package/src/route-renderer/route-renderer.ts +0 -115
  293. package/src/router/client/link-intent.test.browser.ts +0 -51
  294. package/src/router/client/link-intent.ts +0 -92
  295. package/src/router/client/navigation-coordinator.ts +0 -433
  296. package/src/router/server/fs-router-scanner.ts +0 -219
  297. package/src/router/server/fs-router.ts +0 -122
  298. package/src/services/assets/asset-processing-service/asset-processing.service.ts +0 -401
  299. package/src/services/assets/asset-processing-service/asset.factory.ts +0 -105
  300. package/src/services/assets/asset-processing-service/assets.types.ts +0 -113
  301. package/src/services/assets/asset-processing-service/browser-runtime-asset.factory.ts +0 -95
  302. package/src/services/assets/asset-processing-service/browser-runtime-entry.factory.ts +0 -78
  303. package/src/services/assets/asset-processing-service/index.ts +0 -5
  304. package/src/services/assets/asset-processing-service/processor.interface.ts +0 -27
  305. package/src/services/assets/asset-processing-service/processor.registry.ts +0 -18
  306. package/src/services/assets/asset-processing-service/processors/base/base-processor.ts +0 -82
  307. package/src/services/assets/asset-processing-service/processors/base/base-script-processor.ts +0 -95
  308. package/src/services/assets/asset-processing-service/processors/index.ts +0 -5
  309. package/src/services/assets/asset-processing-service/processors/script/content-script.processor.ts +0 -66
  310. package/src/services/assets/asset-processing-service/processors/script/file-script.processor.ts +0 -88
  311. package/src/services/assets/asset-processing-service/processors/script/node-module-script.processor.ts +0 -85
  312. package/src/services/assets/asset-processing-service/processors/stylesheet/content-stylesheet.processor.ts +0 -27
  313. package/src/services/assets/asset-processing-service/processors/stylesheet/file-stylesheet.processor.ts +0 -80
  314. package/src/services/assets/browser-bundle.service.ts +0 -53
  315. package/src/services/cache/cache.types.ts +0 -126
  316. package/src/services/cache/index.ts +0 -18
  317. package/src/services/cache/memory-cache-store.ts +0 -130
  318. package/src/services/cache/page-cache-service.ts +0 -202
  319. package/src/services/cache/page-request-cache-coordinator.service.ts +0 -131
  320. package/src/services/html/html-rewriter-provider.service.ts +0 -103
  321. package/src/services/html/html-transformer.service.ts +0 -279
  322. package/src/services/invalidation/development-invalidation.service.ts +0 -261
  323. package/src/services/module-loading/app-server-module-transpiler.service.ts +0 -52
  324. package/src/services/module-loading/page-module-import.service.ts +0 -200
  325. package/src/services/module-loading/server-loader.service.d.ts +0 -96
  326. package/src/services/module-loading/server-loader.service.js +0 -32
  327. package/src/services/module-loading/server-loader.service.ts +0 -130
  328. package/src/services/module-loading/server-module-transpiler.service.ts +0 -105
  329. package/src/services/runtime-manifest/node-runtime-manifest.service.d.ts +0 -35
  330. package/src/services/runtime-manifest/node-runtime-manifest.service.js +0 -60
  331. package/src/services/runtime-manifest/node-runtime-manifest.service.ts +0 -101
  332. package/src/services/runtime-state/dev-graph.service.ts +0 -217
  333. package/src/services/runtime-state/entrypoint-dependency-graph.service.ts +0 -136
  334. package/src/services/runtime-state/runtime-specifier-registry.service.ts +0 -96
  335. package/src/services/runtime-state/server-invalidation-state.service.ts +0 -68
  336. package/src/services/validation/schema-validation-service.ts +0 -204
  337. package/src/services/validation/standard-schema.types.ts +0 -68
  338. package/src/static-site-generator/static-site-generator.ts +0 -462
  339. package/src/utils/css.d.ts +0 -1
  340. package/src/utils/css.js +0 -7
  341. package/src/utils/css.ts +0 -5
  342. package/src/utils/deep-merge.ts +0 -47
  343. package/src/utils/hash.ts +0 -5
  344. package/src/utils/html.ts +0 -1
  345. package/src/utils/invariant.ts +0 -15
  346. package/src/utils/locals-utils.ts +0 -37
  347. package/src/utils/parse-cli-args.ts +0 -83
  348. package/src/utils/path-utils.module.ts +0 -14
  349. package/src/utils/resolve-work-dir.ts +0 -45
  350. package/src/utils/runtime.ts +0 -44
  351. package/src/utils/server-utils.module.ts +0 -67
  352. package/src/watchers/project-watcher.test-helpers.ts +0 -41
  353. package/src/watchers/project-watcher.ts +0 -363
  354. /package/src/{constants.d.ts → config/constants.d.ts} +0 -0
  355. /package/src/{constants.js → config/constants.js} +0 -0
  356. /package/src/{internal-types.js → services/module-loading/module-loading-types.js} +0 -0
  357. /package/src/{public-types.js → types/internal-types.js} +0 -0
@@ -1,6 +1,6 @@
1
1
  # Rendering Logic Graph
2
2
 
3
- This document maps the end-to-end rendering logic in core, including request-time rendering, explicit route rendering, static generation, and marker graph orchestration.
3
+ This document maps the end-to-end rendering logic in core, including request-time rendering, explicit route rendering, static generation, and deferred boundary orchestration.
4
4
 
5
5
  ## Design Principles
6
6
 
@@ -12,16 +12,14 @@ These diagrams are based on a few architectural assumptions that seem important
12
12
  Adapters and route matchers decide which renderer to use; once selected, the integration renderer owns the page render pipeline.
13
13
  - **Data resolution should happen before HTML transformation.**
14
14
  Static props, metadata, dependency processing, and route assets are all upstream of final HTML injection.
15
- - **Marker graph orchestration should be a post-render reconciliation step.**
16
- The initial integration render may emit deferred component markers; those are resolved after the first HTML pass, not during route matching.
17
- - **Marker emission is integration-defined boundary behavior.**
18
- Markers are emitted when the active render boundary policy decides a component boundary must be deferred. If no `eco-marker` tokens are emitted, the marker graph stage is skipped entirely.
19
- - **The marker pipeline remains generic after emission.**
20
- Once markers exist, core resolves them generically through marker graph extraction, integration renderer dispatch, asset collection, and HTML replacement. The current built-in React integration is one concrete consumer of that mechanism.
15
+ - **Deferred boundary orchestration should stay renderer-owned.**
16
+ The initial integration render is responsible for handing foreign boundaries back to their owning renderer before final route HTML is returned.
17
+ - **Foreign boundary ownership is renderer-defined behavior.**
18
+ If a renderer cannot resolve a foreign boundary inside its own runtime, route execution now treats any leftover unresolved boundary artifact HTML as an error instead of attempting any route-level fallback.
21
19
  - **Caching policy is authoritative at the page layer.**
22
20
  Middleware, locals, and response reuse all depend on the effective page cache strategy.
23
21
  - **Asset emission should converge into one injection stage.**
24
- Route-level assets, integration assets, page-root component assets, and marker-generated assets all end up in the HTML transformer.
22
+ Route-level assets, integration assets, page-root component assets, and renderer-owned boundary assets all end up in the HTML transformer.
25
23
 
26
24
  ## Entry Points
27
25
 
@@ -143,7 +141,7 @@ flowchart TD
143
141
 
144
142
  ### 4.2 Main execute flow via `RenderExecutionService`
145
143
 
146
- Important nuance: this phase does not always run marker graph resolution. It only does that when the first render pass actually produced `eco-marker` placeholders. In practice today, that usually means a non-React renderer crossed into React component rendering and deferred those nodes for the second pass.
144
+ Important nuance: this phase does not resolve mixed-integration boundaries itself anymore. Renderer-owned runtimes must finish that work before route finalization. If unresolved boundary artifact HTML survives to this phase, route execution fails fast.
147
145
 
148
146
  ```mermaid
149
147
  flowchart TD
@@ -151,19 +149,14 @@ flowchart TD
151
149
  B --> C[prepareRenderOptions]
152
150
  C --> D[runWithComponentRenderContext then render]
153
151
  D --> E[normalize response body to renderedHtml]
154
- E --> F[merge captured and explicit componentGraphContext]
155
- F --> G{contains eco marker token?}
156
- G -- Yes --> H[resolveMarkerGraphHtml]
157
- G -- No --> I[skip graph resolution]
158
- H --> J[HtmlTransformerService dedupeProcessedAssets]
159
- J --> K[merge marker assets into transformer deps]
160
- I --> L{root attributes attachable?}
161
- K --> L
162
- L -- Yes --> M[HtmlTransformerService applyAttributesToFirstBodyElement]
163
- L -- No --> N[leave html unchanged]
164
- M --> O[htmlTransformer transform]
165
- N --> O
166
- O --> P[return body stream and cache strategy]
152
+ E --> F{contains unresolved boundary artifact html?}
153
+ F -- Yes --> G[throw unresolved boundary error]
154
+ F -- No --> H{root attributes attachable?}
155
+ H -- Yes --> I[HtmlTransformerService applyAttributesToFirstBodyElement]
156
+ H -- No --> J[leave html unchanged]
157
+ I --> K[htmlTransformer transform]
158
+ J --> K
159
+ K --> L[return body stream and cache strategy]
167
160
  ```
168
161
 
169
162
  ### 4.3 Render preparation responsibilities
@@ -189,7 +182,7 @@ flowchart LR
189
182
  flowchart LR
190
183
  A[IntegrationRenderer] --> B[RenderPreparationService]
191
184
  A --> C[RenderExecutionService]
192
- A --> D[MarkerGraphResolver]
185
+ A --> D[QueuedBoundaryRuntimeService]
193
186
  A --> F[PageModuleLoaderService]
194
187
  A --> G[DependencyResolverService]
195
188
  A --> H[HtmlTransformerService]
@@ -197,32 +190,32 @@ flowchart LR
197
190
  B --> F
198
191
  B --> G
199
192
  B --> H
200
- C --> D
201
193
  C --> H
194
+ D --> H
202
195
  ```
203
196
 
204
- ## 5) Marker Emission + Graph Resolution
197
+ ## 5) Boundary Tokens And Renderer-Owned Resolution
205
198
 
206
- This part is architecturally interesting because it introduces a second render stage. The first pass captures boundaries; the second pass resolves them in dependency order.
199
+ This part is architecturally interesting because boundaries can still emit temporary transport tokens, but renderer-owned runtimes are now responsible for resolving foreign descendants before final route HTML is returned.
207
200
 
208
201
  If this feels complex, the simplest mental model is:
209
202
 
210
203
  - first pass: render everything that can be rendered safely right now
211
- - when a boundary cannot be rendered safely in the current integration pass, emit a placeholder marker instead
212
- - second pass: revisit those placeholders and render them using the correct integration renderer
213
- - final pass: merge any emitted assets and perform the normal HTML transformation
204
+ - when a renderer supports mixed boundaries, hand foreign descendants back to the owning renderer inside that renderer's runtime
205
+ - if literal `<eco-marker>` boundary artifact HTML survives to route finalization, treat it as a failure instead of attempting any route-level fallback
206
+ - final pass: merge emitted assets and perform the normal HTML transformation
214
207
 
215
- In the current implementation, this marker path exists to defer React subtrees that cannot be rendered inline during the active non-React integration pass.
208
+ In the current implementation, renderer-owned runtimes use internal boundary tokens for queued nested handoff. Literal `<eco-marker>` markup remains only as a route-level failure signal when unresolved boundary artifacts escape renderer-owned resolution.
216
209
 
217
- Important clarification: not every integration automatically goes through this stage. The marker pipeline is conditional.
210
+ Important clarification: not every integration automatically goes through this stage. Boundary queueing is conditional.
218
211
 
219
- - If the first render pass returns plain HTML with no `eco-marker` tokens, rendering continues directly to post-processing and HTML transformation.
220
- - If the first render pass emits `eco-marker` tokens, the marker graph is built and resolved before the final HTML rewrite.
221
- - In the current implementation, marker emission is triggered when the active render pass boundary policy decides that entering React should be deferred. The policy is injected through component render context, and the React integration currently opts into that deferred behavior.
212
+ - If a render pass stays inside one integration, rendering continues directly to post-processing and HTML transformation.
213
+ - If a renderer can resolve foreign descendants inline, the boundary runtime returns resolved HTML immediately.
214
+ - If a renderer needs token-based nested handoff, it queues renderer-owned transport tokens and resolves them before returning final HTML.
222
215
 
223
216
  ### Why this exists
224
217
 
225
- The marker pipeline exists because some component boundaries cannot always be rendered eagerly inside the current integration pass.
218
+ Renderer-owned boundary queueing exists because some component boundaries cannot always be rendered eagerly inside the current integration pass.
226
219
 
227
220
  Typical reasons include:
228
221
 
@@ -231,62 +224,45 @@ Typical reasons include:
231
224
  - the parent render needs to preserve ordering and slots before the child subtree is resolved
232
225
  - the child render may emit its own assets or root attributes that must be merged back into the final document
233
226
 
234
- So the first pass captures a stable placeholder plus serialized render context, and the second pass resolves those placeholders using the correct integration renderer.
235
-
236
- Responsibility split:
237
-
238
- - core resolves the deferred marker mechanically: graph shape, refs, slot relationships, and target renderer lookup
239
- - the selected integration renderer resolves the actual component render once it receives `component`, `props`, and optional `children`
227
+ So the first pass either returns resolved renderer-owned output immediately or emits a renderer-local transport token that is resolved before the enclosing renderer returns its final HTML.
240
228
 
241
229
  Another way to say it:
242
230
 
243
- - a marker is a promise that says "this subtree will be rendered later by another renderer"
244
- - the marker stores just enough information to make that later render deterministic
245
- - the graph exists so nested deferred boundaries resolve from leaves to parents, preserving child insertion order and slot structure
231
+ - a boundary token says "this subtree belongs to another renderer, but the current renderer still owns the overall render pass"
232
+ - the token stores just enough information to make that later renderer-owned handoff deterministic
233
+ - the queue exists so nested foreign boundaries resolve from leaves to parents while preserving child insertion order and emitted assets
246
234
 
247
- ### 5.1 Marker emission in `eco.component` factory
235
+ ### 5.1 Boundary interception in `eco.component` factory
248
236
 
249
- The key rule here today is: markers are not a general-purpose placeholder for every component. During an active component render pass, `eco.component` asks the current render boundary context whether the next boundary should be deferred. When the answer is defer, it captures props/refs/slot links and returns an `eco-marker` token instead of rendering the component immediately.
237
+ The key rule here today is: boundaries are resolved by the owning renderer, not by a shared core fallback. During an active component render pass, `eco.component` asks the current render boundary context whether the next boundary should render inline or be resolved by a foreign renderer runtime.
250
238
 
251
- For the current built-in integrations, this is how non-React renders defer React subtrees until the marker resolution pass.
239
+ For the current built-in integrations, this is how non-owning renderers hand foreign subtrees back to the owning runtime without relying on a shared core fallback.
252
240
 
253
241
  ```mermaid
254
242
  flowchart TD
255
243
  A[eco component render] --> B[getComponentRenderContext]
256
- B --> C[boundaryContext decideBoundaryRender]
257
- C --> D{decision is defer?}
258
- D -- No --> E[render component content immediately]
259
- D -- Yes --> F[create nodeId + propsRef]
260
- F --> G[store props in propsByRef]
261
- G --> H{children include eco-marker tokens?}
262
- H -- Yes --> I[create slotRef and slotChildrenByRef links]
263
- H -- No --> J[no slot links]
264
- I --> K[createComponentMarker]
265
- J --> K
266
- K --> L[return eco marker token]
244
+ B --> C[boundaryRuntime interceptBoundarySync]
245
+ C --> D{resolved foreign boundary?}
246
+ D -- No --> E[render component content inline]
247
+ D -- Yes --> F[return renderer-owned resolved html]
267
248
  ```
268
249
 
269
- ### 5.2 Marker graph execution
250
+ ### 5.2 Queued boundary execution
270
251
 
271
- Once markers exist in the HTML, the second pass is integration-agnostic at execution time. Each marker carries its target integration name, so the resolver can ask the right renderer to render that specific node. Even though marker emission is currently React-focused, the resolution phase itself is generic and works off the marker payload plus renderer lookup.
252
+ When string-first renderers queue foreign boundaries, the base renderer helper resolves queued boundary tokens directly against the shared queue service. That pass is intentionally narrow: it only resolves queued boundary tokens that the owning renderer emitted as transport artifacts for that string runtime.
272
253
 
273
- This means the marker itself is not interpreted by the integration renderer. Core interprets the marker and reconstructs render input; the integration renderer only performs the final component render.
254
+ This means boundary tokens are no longer a general component-boundary contract. Core only resolves queued boundary payloads that already belong to a renderer-owned string boundary workflow.
274
255
 
275
256
  ```mermaid
276
257
  flowchart TD
277
- A[resolveMarkerGraphHtml] --> B[buildComponentRefRegistry]
278
- B --> C[extractComponentGraph from html and slot registry]
279
- C --> D[resolveComponentGraph in reverse levels]
280
- D --> E[for each marker node]
281
- E --> F[resolve component by componentRef]
282
- F --> G[resolve props by propsRef]
283
- G --> H[stitch child html from slotRef node ids]
284
- H --> I[getIntegrationRendererForName]
285
- I --> J[renderer.renderComponent]
286
- J --> K[collect component assets]
287
- K --> L[apply root attributes to first element]
288
- L --> M[replace marker token in HTML]
289
- M --> N[resolved html and assets]
258
+ A[string boundary runtime html] --> B[find queued boundary tokens]
259
+ B --> C[resolve nested child tokens first]
260
+ C --> D[dispatch boundary to owning renderer]
261
+ D --> E[renderer.renderComponentBoundary]
262
+ E --> F[collect emitted assets]
263
+ F --> G[apply root attributes to first element]
264
+ G --> H[replace queued token in html]
265
+ H --> I[resolved html and merged assets]
290
266
  ```
291
267
 
292
268
  ## 6) Explicit Rendering Paths (outside FS page matching)
@@ -345,15 +321,12 @@ For someone new to the rendering system, this is probably the most useful order
345
321
  6. `integration-renderer.ts`
346
322
  7. `render-preparation.service.ts`
347
323
  8. `render-execution.service.ts`
348
- 9. `marker-graph-resolver.ts`
324
+ 9. `queued-boundary-runtime.service.ts`
349
325
  10. `html-transformer.service.ts`
350
326
  11. `page-module-loader.ts`
351
327
  12. `dependency-resolver.ts`
352
- 13. `component-marker.ts`
353
- 14. `component-graph.ts`
354
- 15. `component-graph-executor.ts`
355
- 16. `eco.ts`
356
- 17. `component-render-context.ts`
328
+ 13. `eco.ts`
329
+ 14. `component-render-context.ts`
357
330
 
358
331
  ## 9) Key Files
359
332
 
@@ -368,10 +341,7 @@ For someone new to the rendering system, this is probably the most useful order
368
341
  - `packages/core/src/route-renderer/orchestration/integration-renderer.ts`
369
342
  - `packages/core/src/route-renderer/orchestration/render-preparation.service.ts`
370
343
  - `packages/core/src/route-renderer/orchestration/render-execution.service.ts`
371
- - `packages/core/src/route-renderer/component-graph/marker-graph-resolver.ts`
372
- - `packages/core/src/route-renderer/component-graph/component-marker.ts`
373
- - `packages/core/src/route-renderer/component-graph/component-graph.ts`
374
- - `packages/core/src/route-renderer/component-graph/component-graph-executor.ts`
344
+ - `packages/core/src/route-renderer/orchestration/queued-boundary-runtime.service.ts`
375
345
  - `packages/core/src/route-renderer/page-loading/page-module-loader.ts`
376
346
  - `packages/core/src/route-renderer/page-loading/dependency-resolver.ts`
377
347
  - `packages/core/src/services/module-loading/page-module-import.service.ts`
@@ -25,23 +25,18 @@ Framework-owned orchestration services and renderer base class:
25
25
 
26
26
  - `integration-renderer.ts`: abstract base class that coordinates end-to-end route rendering.
27
27
  - `render-preparation.service.ts`: page module/data/dependency preparation before render.
28
- - `render-execution.service.ts`: render capture, marker-graph resolution, and finalization.
28
+ - `render-execution.service.ts`: render capture, unresolved boundary artifact enforcement, and finalization.
29
+ - `queued-boundary-runtime.service.ts`: shared queued foreign-boundary runtime used directly by renderer-owned helpers, including string-first renderers.
29
30
 
30
31
  It also provides:
31
32
 
32
33
  - `renderToResponse()` contract for explicit-route rendering.
33
34
  - `renderComponent()` contract for component-level orchestration and artifact reporting.
34
- - marker graph resolution for nested cross-integration component boundaries.
35
+ - deferred boundary resolution for nested cross-integration component boundaries.
35
36
 
36
- ### `component-graph/`
37
+ ### Boundary Tokens
37
38
 
38
- Component marker contracts and graph resolution:
39
-
40
- - `createComponentMarker()` for canonical `<eco-marker ...></eco-marker>` generation.
41
- - `parseComponentMarkers()` for marker extraction from rendered HTML.
42
- - node collection by marker id.
43
- - parent/child edges from slot reference registry.
44
- - topological levels for bottom-up execution.
39
+ Renderer-owned runtimes may emit internal boundary tokens while they resolve foreign descendants before returning final HTML. If literal `<eco-marker ...></eco-marker>` markup survives to route finalization, it is treated as an unresolved boundary artifact rather than a normal transport mechanism.
45
40
 
46
41
  ### `page-loading/`
47
42
 
@@ -61,7 +56,7 @@ Builds processed assets from component dependency declarations:
61
56
 
62
57
  Default behavior:
63
58
 
64
- - marker-graph component orchestration + component render artifacts.
59
+ - renderer-owned component-boundary orchestration + component render artifacts.
65
60
  - global lazy trigger map + global injector bootstrap.
66
61
 
67
62
  Global injector lifecycle notes:
@@ -87,12 +82,10 @@ Current base orchestration behavior:
87
82
  - Merges returned `assets` into processed dependencies.
88
83
  - Applies returned `rootAttributes` to the first element under `<body>`.
89
84
 
90
- When rendered output contains `eco-marker` nodes:
85
+ When rendered output still contains unresolved boundary artifact HTML:
91
86
 
92
- - builds marker graph using `componentGraphContext` (`propsByRef`, `slotChildrenByRef`) from integration-specific page module exports.
93
- - resolves markers bottom-up through integration-specific `renderComponent()` calls.
94
- - fails fast when marker component refs or props refs are missing.
95
- - merges marker-rendered assets back into the dependency pipeline with deduplication.
87
+ - route execution now fails fast instead of attempting any route-level unresolved-boundary fallback.
88
+ - renderer-owned boundary runtimes are responsible for resolving foreign nested components before final route HTML is returned.
96
89
 
97
90
  This enables island-style hydration assets (for example React/Lit/Kita integration outputs) to be emitted through the normal dependency injection pipeline.
98
91
 
@@ -115,8 +108,9 @@ This enables island-style hydration assets (for example React/Lit/Kita integrati
115
108
  6. HTML transformer injects head/body dependencies.
116
109
  7. Route result returns body + metadata + cache strategy.
117
110
 
118
- ## Notes for Future Work
111
+ ## Current Limits And Near-Term Work
112
+
113
+ If you are reading this file to understand today's contract, you can stop at the output pipeline above. The items below describe areas still evolving rather than required behavior.
119
114
 
120
- - Expand integration-side marker emission so more nested trees are resolved through graph mode by default.
121
- - Add broader fixtures/e2e for deep multi-level slot graphs.
122
- - Add optional batching by integration per graph level to reduce repeated renderer invocations.
115
+ - Deep multi-level mixed-integration trees now rely on renderer-owned boundary runtimes rather than a shared post-render graph resolver.
116
+ - Each renderer still decides how to hand off foreign boundaries, so specialized runtimes remain appropriate where child serialization or hydration contracts differ.
@@ -0,0 +1,83 @@
1
+ import type { EcoComponent } from '../../types/public-types.js';
2
+ /**
3
+ * Result returned by a renderer-owned boundary runtime.
4
+ *
5
+ * `inline` keeps rendering inside the current integration. `resolved` returns a
6
+ * renderer-owned value immediately, which can be final HTML or a renderer-local
7
+ * transport token for later queue resolution.
8
+ */
9
+ export type ComponentBoundaryInterceptionResult = {
10
+ kind: 'inline';
11
+ } | {
12
+ kind: 'resolved';
13
+ value: unknown;
14
+ };
15
+ /**
16
+ * Boundary metadata passed into the active renderer-owned runtime.
17
+ */
18
+ export type ComponentBoundaryInterceptionInput = {
19
+ currentIntegration: string;
20
+ targetIntegration?: string;
21
+ component: EcoComponent;
22
+ props: Record<string, unknown>;
23
+ };
24
+ /**
25
+ * Narrow renderer-owned boundary runtime injected into one active render
26
+ * context.
27
+ *
28
+ * Integrations implement this contract when foreign boundaries must be handed
29
+ * off inside the renderer instead of being left for route-level reconciliation.
30
+ */
31
+ export interface ComponentBoundaryRuntime {
32
+ interceptBoundary?(input: ComponentBoundaryInterceptionInput): ComponentBoundaryInterceptionResult | Promise<ComponentBoundaryInterceptionResult>;
33
+ interceptBoundarySync?(input: ComponentBoundaryInterceptionInput): ComponentBoundaryInterceptionResult;
34
+ }
35
+ type ComponentBoundaryRenderInput = {
36
+ component: EcoComponent;
37
+ props: Record<string, unknown>;
38
+ targetIntegration?: string;
39
+ };
40
+ /**
41
+ * Per-render mutable state used while applying boundary interception and lazy
42
+ * output wrapping.
43
+ */
44
+ export type ComponentRenderContext = {
45
+ currentIntegration: string;
46
+ boundaryRuntime?: ComponentBoundaryRuntime;
47
+ interceptBoundary(input: ComponentBoundaryRenderInput): Promise<unknown | undefined> | unknown | undefined;
48
+ finalizeComponentRender<T>(component: EcoComponent, content: T): T;
49
+ };
50
+ /**
51
+ * Returns the current component render context, if one is active.
52
+ *
53
+ * @returns Active render context or `undefined` outside render execution.
54
+ */
55
+ export declare function getComponentRenderContext(): ComponentRenderContext | undefined;
56
+ /**
57
+ * Runs boundary interception for one component boundary.
58
+ *
59
+ * The active runtime may resolve the boundary immediately or keep it inline.
60
+ */
61
+ export declare function interceptComponentBoundary(input: ComponentBoundaryRenderInput): Promise<unknown | undefined> | unknown | undefined;
62
+ /**
63
+ * Applies lazy trigger or injector wrapping to completed component output.
64
+ *
65
+ * This helper works both inside render-context execution and in fallback flows
66
+ * where no active context exists.
67
+ */
68
+ export declare function finalizeComponentRender<T>(component: EcoComponent, content: T): T;
69
+ /**
70
+ * Runs render work under a fresh component render context and returns the
71
+ * resulting value.
72
+ *
73
+ * @param input Execution metadata for current integration and boundary policy.
74
+ * @param render Async render function to execute inside the context.
75
+ * @returns Render result value.
76
+ */
77
+ export declare function runWithComponentRenderContext<T>(input: {
78
+ currentIntegration: string;
79
+ boundaryRuntime?: ComponentBoundaryRuntime;
80
+ }, render: () => Promise<T>): Promise<{
81
+ value: T;
82
+ }>;
83
+ export {};
@@ -0,0 +1,147 @@
1
+ import { addTriggerAttribute, isThenable, wrapWithScriptsInjector } from "./render-output.utils.js";
2
+ class ComponentRenderOutputRuntime {
3
+ finalizeComponentRender(component, content) {
4
+ const lazyTriggers = component.config?._resolvedLazyTriggers;
5
+ if (lazyTriggers && lazyTriggers.length > 0) {
6
+ return this.addTriggerToContent(content, lazyTriggers[0].triggerId);
7
+ }
8
+ const lazyGroups = component.config?._resolvedLazyScripts;
9
+ if (lazyGroups && lazyGroups.length > 0) {
10
+ return this.wrapContentWithScriptsInjector(content, lazyGroups);
11
+ }
12
+ return content;
13
+ }
14
+ addTriggerToContent(content, triggerId) {
15
+ if (isThenable(content)) {
16
+ return content.then((resolvedContent) => addTriggerAttribute(resolvedContent, triggerId));
17
+ }
18
+ return addTriggerAttribute(content, triggerId);
19
+ }
20
+ wrapContentWithScriptsInjector(content, lazyGroups) {
21
+ if (isThenable(content)) {
22
+ return content.then((resolvedContent) => wrapWithScriptsInjector(resolvedContent, lazyGroups));
23
+ }
24
+ return wrapWithScriptsInjector(content, lazyGroups);
25
+ }
26
+ }
27
+ class ContextualComponentRenderRuntime extends ComponentRenderOutputRuntime {
28
+ context;
29
+ constructor(context) {
30
+ super();
31
+ this.context = context;
32
+ }
33
+ applyBoundaryInterceptionResult(result) {
34
+ if (result.kind === "resolved") {
35
+ return result.value;
36
+ }
37
+ return void 0;
38
+ }
39
+ /**
40
+ * Resolves one boundary interception through the active runtime.
41
+ *
42
+ * The runtime may choose inline rendering or immediate resolved output.
43
+ */
44
+ interceptBoundary(input) {
45
+ const boundaryRuntimeInput = {
46
+ currentIntegration: this.context.currentIntegration,
47
+ targetIntegration: input.targetIntegration,
48
+ component: input.component,
49
+ props: input.props
50
+ };
51
+ const asyncInterception = this.context.boundaryRuntime?.interceptBoundary?.(boundaryRuntimeInput);
52
+ if (asyncInterception !== void 0) {
53
+ if (isThenable(asyncInterception)) {
54
+ return asyncInterception.then((result) => this.applyBoundaryInterceptionResult(result));
55
+ }
56
+ return this.applyBoundaryInterceptionResult(asyncInterception);
57
+ }
58
+ const syncInterception = this.context.boundaryRuntime?.interceptBoundarySync?.(boundaryRuntimeInput);
59
+ if (syncInterception === void 0) {
60
+ return void 0;
61
+ }
62
+ return this.applyBoundaryInterceptionResult(syncInterception);
63
+ }
64
+ }
65
+ const GLOBAL_COMPONENT_RENDER_CONTEXT_STATE_KEY = "__ECOPAGES_COMPONENT_RENDER_CONTEXT_STATE__";
66
+ function getSharedContextScope() {
67
+ const globalProcess = globalThis.process;
68
+ if (globalProcess && typeof globalProcess === "object") {
69
+ return globalProcess;
70
+ }
71
+ return globalThis;
72
+ }
73
+ function getComponentRenderContextState() {
74
+ const sharedScope = getSharedContextScope();
75
+ sharedScope[GLOBAL_COMPONENT_RENDER_CONTEXT_STATE_KEY] ??= {
76
+ contextStack: [],
77
+ nodeContextStorage: null,
78
+ nodeContextStorageLoader: null
79
+ };
80
+ return sharedScope[GLOBAL_COMPONENT_RENDER_CONTEXT_STATE_KEY];
81
+ }
82
+ async function getContextStorage() {
83
+ const state = getComponentRenderContextState();
84
+ if (state.nodeContextStorage) {
85
+ return state.nodeContextStorage;
86
+ }
87
+ if (state.nodeContextStorageLoader) {
88
+ return state.nodeContextStorageLoader;
89
+ }
90
+ state.nodeContextStorageLoader = import("node:async_hooks").then((module) => {
91
+ const storage = new module.AsyncLocalStorage();
92
+ state.nodeContextStorage = {
93
+ getStore: () => storage.getStore(),
94
+ run: (store, callback) => storage.run(store, callback)
95
+ };
96
+ return state.nodeContextStorage;
97
+ }).catch(() => {
98
+ state.nodeContextStorage = null;
99
+ return null;
100
+ }).finally(() => {
101
+ state.nodeContextStorageLoader = null;
102
+ });
103
+ return state.nodeContextStorageLoader;
104
+ }
105
+ function getComponentRenderContext() {
106
+ const state = getComponentRenderContextState();
107
+ return state.nodeContextStorage?.getStore() ?? state.contextStack[state.contextStack.length - 1];
108
+ }
109
+ const componentRenderOutputRuntime = new ComponentRenderOutputRuntime();
110
+ function interceptComponentBoundary(input) {
111
+ return getComponentRenderContext()?.interceptBoundary(input);
112
+ }
113
+ function finalizeComponentRender(component, content) {
114
+ const renderContext = getComponentRenderContext();
115
+ return renderContext?.finalizeComponentRender(component, content) ?? componentRenderOutputRuntime.finalizeComponentRender(component, content);
116
+ }
117
+ async function runWithComponentRenderContext(input, render) {
118
+ const context = {
119
+ currentIntegration: input.currentIntegration,
120
+ boundaryRuntime: input.boundaryRuntime
121
+ };
122
+ const runtime = new ContextualComponentRenderRuntime(context);
123
+ context.interceptBoundary = (deferredInput) => runtime.interceptBoundary(deferredInput);
124
+ context.finalizeComponentRender = (component, content) => runtime.finalizeComponentRender(component, content);
125
+ const storage = await getContextStorage();
126
+ let value;
127
+ if (storage) {
128
+ value = await storage.run(context, render);
129
+ } else {
130
+ const state = getComponentRenderContextState();
131
+ state.contextStack.push(context);
132
+ try {
133
+ value = await render();
134
+ } finally {
135
+ state.contextStack.pop();
136
+ }
137
+ }
138
+ return {
139
+ value
140
+ };
141
+ }
142
+ export {
143
+ finalizeComponentRender,
144
+ getComponentRenderContext,
145
+ interceptComponentBoundary,
146
+ runWithComponentRenderContext
147
+ };