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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (433) hide show
  1. package/README.md +38 -9
  2. package/package.json +241 -30
  3. package/src/adapters/README.md +6 -2
  4. package/src/adapters/abstract/application-adapter.d.ts +123 -6
  5. package/src/adapters/abstract/application-adapter.js +151 -1
  6. package/src/adapters/abstract/segment-path-matcher.d.ts +6 -0
  7. package/src/adapters/abstract/segment-path-matcher.js +149 -0
  8. package/src/adapters/abstract/server-adapter.d.ts +16 -2
  9. package/src/adapters/abstract/ws-pattern-matcher.d.ts +12 -0
  10. package/src/adapters/abstract/ws-pattern-matcher.js +30 -0
  11. package/src/adapters/bun/bun-user-websocket-lifecycle.d.ts +22 -0
  12. package/src/adapters/bun/bun-user-websocket-lifecycle.js +96 -0
  13. package/src/adapters/bun/client-bridge.d.ts +1 -0
  14. package/src/adapters/bun/client-bridge.js +3 -0
  15. package/src/adapters/bun/create-app.d.ts +9 -6
  16. package/src/adapters/bun/create-app.js +76 -45
  17. package/src/adapters/bun/hmr-manager.d.ts +1 -1
  18. package/src/adapters/bun/hmr-manager.js +1 -1
  19. package/src/adapters/bun/index.d.ts +1 -1
  20. package/src/adapters/bun/index.js +25 -2
  21. package/src/adapters/bun/runtime-host.d.ts +1 -1
  22. package/src/adapters/bun/runtime-host.js +1 -1
  23. package/src/adapters/bun/server-adapter.d.ts +92 -41
  24. package/src/adapters/bun/server-adapter.js +256 -117
  25. package/src/adapters/bun/static-preview-host.d.ts +1 -1
  26. package/src/adapters/bun/static-preview-host.js +25 -20
  27. package/src/adapters/create-app.d.ts +13 -11
  28. package/src/adapters/create-app.js +2 -51
  29. package/src/adapters/index.d.ts +2 -2
  30. package/src/adapters/index.js +26 -4
  31. package/src/adapters/node/create-app.d.ts +8 -3
  32. package/src/adapters/node/create-app.js +61 -13
  33. package/src/adapters/node/node-client-bridge.d.ts +1 -0
  34. package/src/adapters/node/node-client-bridge.js +3 -0
  35. package/src/adapters/node/node-hmr-manager.d.ts +1 -1
  36. package/src/adapters/node/node-hmr-manager.js +1 -1
  37. package/src/adapters/node/runtime-host.d.ts +1 -1
  38. package/src/adapters/node/runtime-host.js +1 -1
  39. package/src/adapters/node/server-adapter-dependencies.js +4 -0
  40. package/src/adapters/node/server-adapter.d.ts +64 -23
  41. package/src/adapters/node/server-adapter.js +169 -142
  42. package/src/adapters/node/static-content-server.d.ts +1 -0
  43. package/src/adapters/node/static-content-server.js +10 -2
  44. package/src/adapters/node/static-preview-host.d.ts +1 -1
  45. package/src/adapters/node/static-preview-host.js +27 -12
  46. package/src/adapters/shared/{hmr-entrypoint-registrar.d.ts → hmr/hmr-entrypoint-registrar.d.ts} +31 -30
  47. package/src/adapters/shared/hmr/hmr-entrypoint-registrar.js +106 -0
  48. package/src/adapters/shared/{hmr-html-response.d.ts → hmr/hmr-html-response.d.ts} +2 -2
  49. package/src/adapters/shared/{hmr-html-response.js → hmr/hmr-html-response.js} +4 -1
  50. package/src/adapters/shared/hmr/shared-hmr-manager.d.ts +101 -0
  51. package/src/adapters/shared/hmr/shared-hmr-manager.js +432 -0
  52. package/src/adapters/shared/http/api-request-pipeline.d.ts +23 -0
  53. package/src/adapters/shared/http/api-request-pipeline.js +129 -0
  54. package/src/adapters/shared/{api-response.d.ts → http/api-response.d.ts} +1 -1
  55. package/src/adapters/shared/{api-response.js → http/api-response.js} +6 -23
  56. package/src/adapters/shared/http/create-body-response.d.ts +12 -0
  57. package/src/adapters/shared/http/create-body-response.js +23 -0
  58. package/src/adapters/shared/http/define-api-handler.d.ts +90 -0
  59. package/src/adapters/shared/http/define-api-handler.js +63 -0
  60. package/src/adapters/shared/{explicit-static-render-preparation.d.ts → http/explicit-static-render-preparation.d.ts} +3 -3
  61. package/src/adapters/shared/{explicit-static-route-matcher.d.ts → http/explicit-static-route-matcher.d.ts} +3 -9
  62. package/src/adapters/shared/{explicit-static-route-matcher.js → http/explicit-static-route-matcher.js} +3 -38
  63. package/src/adapters/shared/{file-route-middleware-pipeline.d.ts → http/file-route-middleware-pipeline.d.ts} +2 -2
  64. package/src/adapters/shared/{file-route-middleware-pipeline.js → http/file-route-middleware-pipeline.js} +10 -22
  65. package/src/adapters/shared/{fs-server-response-factory.d.ts → http/fs-server-response-factory.d.ts} +7 -2
  66. package/src/adapters/shared/{fs-server-response-factory.js → http/fs-server-response-factory.js} +22 -2
  67. package/src/adapters/shared/{fs-server-response-matcher.d.ts → http/fs-server-response-matcher.d.ts} +25 -5
  68. package/src/adapters/shared/{fs-server-response-matcher.js → http/fs-server-response-matcher.js} +109 -27
  69. package/src/adapters/shared/http/run-middleware-chain.d.ts +5 -0
  70. package/src/adapters/shared/http/run-middleware-chain.js +17 -0
  71. package/src/adapters/shared/{application-adapter.d.ts → runtime/application-adapter.d.ts} +2 -2
  72. package/src/adapters/shared/{application-adapter.js → runtime/application-adapter.js} +1 -1
  73. package/src/adapters/shared/runtime/copy-runtime-public-dir.d.ts +6 -0
  74. package/src/adapters/shared/runtime/copy-runtime-public-dir.js +24 -0
  75. package/src/adapters/shared/runtime/port-manager.d.ts +116 -0
  76. package/src/adapters/shared/runtime/port-manager.js +196 -0
  77. package/src/adapters/shared/{render-context.d.ts → runtime/render-context.d.ts} +2 -2
  78. package/src/adapters/shared/{render-context.js → runtime/render-context.js} +8 -17
  79. package/src/adapters/shared/{runtime-app-bootstrap.d.ts → runtime/runtime-app-bootstrap.d.ts} +4 -3
  80. package/src/adapters/shared/{runtime-app-bootstrap.js → runtime/runtime-app-bootstrap.js} +4 -7
  81. package/src/adapters/shared/runtime/runtime-server-lifecycle.d.ts +46 -0
  82. package/src/adapters/shared/runtime/runtime-server-lifecycle.js +57 -0
  83. package/src/adapters/shared/{server-adapter.d.ts → runtime/server-adapter.d.ts} +23 -49
  84. package/src/adapters/shared/runtime/server-adapter.js +226 -0
  85. package/src/adapters/shared/{server-route-handler.d.ts → runtime/server-route-handler.d.ts} +6 -33
  86. package/src/adapters/shared/{server-route-handler.js → runtime/server-route-handler.js} +5 -43
  87. package/src/adapters/shared/{server-static-builder.d.ts → runtime/server-static-builder.d.ts} +27 -35
  88. package/src/adapters/shared/runtime/server-static-builder.js +191 -0
  89. package/src/adapters/shared/{static-preview-host.d.ts → runtime/static-preview-host.d.ts} +6 -1
  90. package/src/adapters/shared/ws/node-http-websocket-upgrades.d.ts +21 -0
  91. package/src/adapters/shared/ws/node-http-websocket-upgrades.js +100 -0
  92. package/src/adapters/shared/ws/websocket-lifecycle.d.ts +24 -0
  93. package/src/adapters/shared/ws/websocket-lifecycle.js +55 -0
  94. package/src/build/README.md +140 -31
  95. package/src/build/app-build-manifest-runtime.d.ts +39 -0
  96. package/src/build/app-build-manifest-runtime.js +124 -0
  97. package/src/build/{browser-runtime-plugin.d.ts → browser/browser-runtime-plugin.d.ts} +1 -1
  98. package/src/build/{browser-runtime-plugin.js → browser/browser-runtime-plugin.js} +1 -1
  99. package/src/build/browser/jsx-ownership-plugins.d.ts +24 -0
  100. package/src/build/browser/jsx-ownership-plugins.js +41 -0
  101. package/src/build/browser/lit-static-render-worker-context.d.ts +2 -0
  102. package/src/build/browser/lit-static-render-worker-context.js +6 -0
  103. package/src/build/build-adapter.d.ts +29 -334
  104. package/src/build/build-adapter.js +32 -133
  105. package/src/build/cache/build-input-fingerprint.d.ts +28 -0
  106. package/src/build/cache/build-input-fingerprint.js +31 -0
  107. package/src/build/cache/cache-constants.d.ts +4 -0
  108. package/src/build/cache/cache-constants.js +6 -0
  109. package/src/build/cache/cache-keys.d.ts +22 -0
  110. package/src/build/cache/cache-keys.js +63 -0
  111. package/src/build/cache/dev-browser-script-cache.d.ts +34 -0
  112. package/src/build/cache/dev-browser-script-cache.js +90 -0
  113. package/src/build/cache/pages-unified-graph-build.d.ts +31 -0
  114. package/src/build/cache/pages-unified-graph-build.js +198 -0
  115. package/src/build/cache/production-build-cache.d.ts +20 -0
  116. package/src/build/cache/production-build-cache.js +63 -0
  117. package/src/build/cache/server-entry-build-cache.d.ts +43 -0
  118. package/src/build/cache/server-entry-build-cache.js +165 -0
  119. package/src/build/contracts/build-contracts.d.ts +96 -0
  120. package/src/build/contracts/build-manifest.d.ts +90 -0
  121. package/src/build/{build-manifest.js → contracts/build-manifest.js} +2 -2
  122. package/src/build/contracts/build-types.js +0 -0
  123. package/src/build/{rolldown-adapter-helpers.d.ts → rolldown/rolldown-adapter-helpers.d.ts} +23 -9
  124. package/src/build/{rolldown-adapter-helpers.js → rolldown/rolldown-adapter-helpers.js} +99 -13
  125. package/src/build/{rolldown-build-adapter.d.ts → rolldown/rolldown-build-adapter.d.ts} +3 -7
  126. package/src/build/{rolldown-build-adapter.js → rolldown/rolldown-build-adapter.js} +3 -3
  127. package/src/build/rolldown/rolldown-build-invocation-metrics.d.ts +12 -0
  128. package/src/build/rolldown/rolldown-build-invocation-metrics.js +43 -0
  129. package/src/build/{rolldown-plugin-bridge.d.ts → rolldown/rolldown-plugin-bridge.d.ts} +16 -2
  130. package/src/build/{rolldown-plugin-bridge.js → rolldown/rolldown-plugin-bridge.js} +21 -6
  131. package/src/build/rolldown/rolldown-source-transform-pass.d.ts +15 -0
  132. package/src/build/rolldown/rolldown-source-transform-pass.js +61 -0
  133. package/src/build/rolldown/runtime-build-output-normalizer.d.ts +10 -0
  134. package/src/build/rolldown/runtime-build-output-normalizer.js +201 -0
  135. package/src/build/runtime/build-profile-options.d.ts +7 -0
  136. package/src/build/runtime/build-profile-options.js +37 -0
  137. package/src/build/runtime/build-request-identity.d.ts +17 -0
  138. package/src/build/runtime/build-request-identity.js +54 -0
  139. package/src/build/runtime/build-request-policy.d.ts +59 -0
  140. package/src/build/runtime/build-request-policy.js +46 -0
  141. package/src/build/runtime/build-runtime.d.ts +28 -0
  142. package/src/build/runtime/build-runtime.js +65 -0
  143. package/src/build/runtime/deduping-build-executor.d.ts +21 -0
  144. package/src/build/runtime/deduping-build-executor.js +34 -0
  145. package/src/build/runtime/parallel-build-executor.d.ts +21 -0
  146. package/src/build/runtime/parallel-build-executor.js +52 -0
  147. package/src/build/{serialized-build-executor.d.ts → runtime/serialized-build-executor.d.ts} +1 -1
  148. package/src/client/navigation-scripts/classification.d.ts +16 -0
  149. package/src/client/navigation-scripts/classification.js +41 -0
  150. package/src/client/navigation-scripts/index.d.ts +3 -0
  151. package/src/client/navigation-scripts/index.js +23 -0
  152. package/src/client/navigation-scripts/navigation-scripts.test.browser.js +65 -0
  153. package/src/client/navigation-scripts/registry.d.ts +11 -0
  154. package/src/client/navigation-scripts/registry.js +12 -0
  155. package/src/client/navigation-scripts/rerun-queue.d.ts +37 -0
  156. package/src/client/navigation-scripts/rerun-queue.js +73 -0
  157. package/src/client/scroll.d.ts +17 -0
  158. package/src/client/scroll.js +25 -0
  159. package/src/client/scroll.test.browser.js +37 -0
  160. package/src/client/view-transitions.d.ts +16 -0
  161. package/src/client/view-transitions.js +63 -0
  162. package/src/config/config-builder.d.ts +25 -10
  163. package/src/config/config-builder.js +53 -11
  164. package/src/config/constants.d.ts +1 -0
  165. package/src/config/constants.js +2 -1
  166. package/src/dev/client-bridge-registry.d.ts +5 -0
  167. package/src/dev/client-bridge-registry.js +15 -0
  168. package/src/dev/dev-client-ownership.d.ts +7 -0
  169. package/src/dev/dev-client-ownership.js +6 -0
  170. package/src/dev/hmr-manager-registry.d.ts +8 -0
  171. package/src/dev/hmr-manager-registry.js +15 -0
  172. package/src/dev/host-runtime.d.ts +3 -0
  173. package/src/dev/host-runtime.js +7 -0
  174. package/src/dev/runtime-server-started-message.d.ts +2 -0
  175. package/src/dev/runtime-server-started-message.js +6 -0
  176. package/src/diagnostics/request-build-dedupe.d.ts +18 -0
  177. package/src/diagnostics/request-build-dedupe.js +33 -0
  178. package/src/diagnostics/startup-trace.d.ts +72 -0
  179. package/src/diagnostics/startup-trace.js +253 -0
  180. package/src/eco/README.md +11 -0
  181. package/src/eco/eco-declared-component.d.ts +14 -0
  182. package/src/eco/eco-declared-component.js +16 -0
  183. package/src/eco/eco.browser.js +5 -6
  184. package/src/eco/eco.js +7 -8
  185. package/src/eco/eco.types.d.ts +14 -3
  186. package/src/eco/eco.utils.d.ts +1 -1
  187. package/src/eco/eco.utils.js +1 -1
  188. package/src/eco/page-layout-normalization.d.ts +21 -0
  189. package/src/eco/page-layout-normalization.js +59 -0
  190. package/src/env.d.ts +2 -0
  191. package/src/errors/index.d.ts +1 -0
  192. package/src/errors/index.js +7 -1
  193. package/src/errors/undeclared-component-dependency-error.d.ts +11 -0
  194. package/src/errors/undeclared-component-dependency-error.js +17 -0
  195. package/src/hmr/client/hmr-runtime.js +7 -4
  196. package/src/hmr/hmr-entrypoint-output.d.ts +49 -0
  197. package/src/hmr/hmr-entrypoint-output.js +60 -0
  198. package/src/hmr/hmr-file-change-prep.d.ts +10 -0
  199. package/src/hmr/hmr-file-change-prep.js +17 -0
  200. package/src/hmr/hmr-strategy.d.ts +15 -0
  201. package/src/hmr/hmr-strategy.js +19 -0
  202. package/src/hmr/strategies/js-hmr-strategy.d.ts +3 -5
  203. package/src/hmr/strategies/js-hmr-strategy.js +72 -19
  204. package/src/hmr/strategies/server-rendered-template-hmr-strategy.d.ts +17 -0
  205. package/src/hmr/strategies/server-rendered-template-hmr-strategy.js +29 -0
  206. package/src/index.d.ts +2 -1
  207. package/src/index.js +28 -2
  208. package/src/integrations/ghtml/ghtml-renderer.d.ts +2 -6
  209. package/src/integrations/ghtml/ghtml-renderer.js +2 -51
  210. package/src/integrations/ghtml/ghtml.plugin.d.ts +3 -16
  211. package/src/integrations/ghtml/ghtml.plugin.js +7 -14
  212. package/src/plugins/alias-resolver-cache.d.ts +6 -9
  213. package/src/plugins/alias-resolver-plugin.d.ts +3 -3
  214. package/src/plugins/alias-resolver-plugin.js +38 -51
  215. package/src/plugins/define-integration.d.ts +26 -0
  216. package/src/plugins/define-integration.js +19 -0
  217. package/src/plugins/eco-component-meta-plugin.d.ts +1 -1
  218. package/src/plugins/eco-component-meta-plugin.js +5 -8
  219. package/src/plugins/foreign-jsx-override-plugin.d.ts +1 -1
  220. package/src/plugins/foreign-jsx-override-plugin.js +4 -6
  221. package/src/plugins/integration-plugin.d.ts +43 -14
  222. package/src/plugins/integration-plugin.js +18 -5
  223. package/src/plugins/jsx-import-source.utils.d.ts +8 -0
  224. package/src/plugins/jsx-import-source.utils.js +26 -0
  225. package/src/plugins/processor.d.ts +61 -12
  226. package/src/plugins/processor.js +24 -5
  227. package/src/plugins/source-transform.d.ts +32 -1
  228. package/src/plugins/source-transform.js +23 -1
  229. package/src/plugins/tsconfig-import-resolver.d.ts +18 -0
  230. package/src/plugins/tsconfig-import-resolver.js +159 -0
  231. package/src/route-renderer/GRAPH.md +26 -32
  232. package/src/route-renderer/README.md +38 -31
  233. package/src/route-renderer/orchestration/document-shell/document-shell-render.service.d.ts +107 -0
  234. package/src/route-renderer/orchestration/document-shell/document-shell-render.service.js +148 -0
  235. package/src/route-renderer/orchestration/document-shell/layout-shell-props.service.d.ts +20 -0
  236. package/src/route-renderer/orchestration/document-shell/layout-shell-props.service.js +31 -0
  237. package/src/route-renderer/orchestration/{component-render-context.d.ts → foreign-child/component-render-context.d.ts} +8 -15
  238. package/src/route-renderer/orchestration/{component-render-context.js → foreign-child/component-render-context.js} +4 -2
  239. package/src/route-renderer/orchestration/{render-output.utils.d.ts → foreign-child/foreign-child-output.utils.d.ts} +17 -7
  240. package/src/route-renderer/orchestration/{render-output.utils.js → foreign-child/foreign-child-output.utils.js} +35 -26
  241. package/src/route-renderer/orchestration/{foreign-subtree-execution.service.d.ts → foreign-child/foreign-subtree-execution.service.d.ts} +64 -34
  242. package/src/route-renderer/orchestration/{foreign-subtree-execution.service.js → foreign-child/foreign-subtree-execution.service.js} +170 -37
  243. package/src/route-renderer/orchestration/foreign-child/owning-renderer-resolution.d.ts +19 -0
  244. package/src/route-renderer/orchestration/foreign-child/owning-renderer-resolution.js +35 -0
  245. package/src/route-renderer/orchestration/integration-renderer.d.ts +24 -143
  246. package/src/route-renderer/orchestration/integration-renderer.js +163 -402
  247. package/src/route-renderer/orchestration/integration-renderer.test-fixtures.d.ts +75 -0
  248. package/src/route-renderer/orchestration/integration-renderer.test-fixtures.js +177 -0
  249. package/src/route-renderer/orchestration/ownership-graph/component-graph-collectors.d.ts +10 -0
  250. package/src/route-renderer/orchestration/ownership-graph/component-graph-collectors.js +143 -0
  251. package/src/route-renderer/orchestration/ownership-graph/component-graph.d.ts +34 -0
  252. package/src/route-renderer/orchestration/ownership-graph/component-graph.js +96 -0
  253. package/src/route-renderer/orchestration/{ownership-validation.service.d.ts → ownership-graph/ownership-validation.service.d.ts} +7 -2
  254. package/src/route-renderer/orchestration/{ownership-validation.service.js → ownership-graph/ownership-validation.service.js} +30 -3
  255. package/src/route-renderer/orchestration/page-browser-graph/global-injector-assets.service.d.ts +7 -0
  256. package/src/route-renderer/orchestration/page-browser-graph/global-injector-assets.service.js +32 -0
  257. package/src/route-renderer/orchestration/page-browser-graph/page-browser-graph-contribution.loader.d.ts +9 -0
  258. package/src/route-renderer/orchestration/page-browser-graph/page-browser-graph-contribution.loader.js +7 -0
  259. package/src/route-renderer/orchestration/page-browser-graph/page-browser-graph-merge.utils.d.ts +12 -0
  260. package/src/route-renderer/orchestration/page-browser-graph/page-browser-graph-merge.utils.js +29 -0
  261. package/src/route-renderer/orchestration/page-browser-graph/page-browser-graph-session.d.ts +106 -0
  262. package/src/route-renderer/orchestration/page-browser-graph/page-browser-graph-session.js +436 -0
  263. package/src/route-renderer/orchestration/page-browser-graph/page-browser-graph.service.d.ts +31 -0
  264. package/src/route-renderer/orchestration/page-browser-graph/page-browser-graph.service.js +229 -0
  265. package/src/route-renderer/orchestration/{processed-asset-dedupe.d.ts → page-browser-graph/processed-asset-dedupe.d.ts} +1 -1
  266. package/src/route-renderer/orchestration/route-pipeline/integration-route-render-adapter.d.ts +31 -0
  267. package/src/route-renderer/orchestration/route-pipeline/integration-route-render-adapter.js +25 -0
  268. package/src/route-renderer/orchestration/route-pipeline/marker-artifact.utils.d.ts +6 -0
  269. package/src/route-renderer/orchestration/route-pipeline/marker-artifact.utils.js +27 -0
  270. package/src/route-renderer/orchestration/route-pipeline/robots-meta.contribution.d.ts +15 -0
  271. package/src/route-renderer/orchestration/route-pipeline/robots-meta.contribution.js +36 -0
  272. package/src/route-renderer/orchestration/route-pipeline/route-html-finalization.service.d.ts +20 -0
  273. package/src/route-renderer/orchestration/route-pipeline/route-html-finalization.service.js +24 -0
  274. package/src/route-renderer/orchestration/route-pipeline/route-prepared-options.builder.d.ts +25 -0
  275. package/src/route-renderer/orchestration/route-pipeline/route-prepared-options.builder.js +49 -0
  276. package/src/route-renderer/orchestration/route-pipeline/route-prepared-options.utils.d.ts +4 -0
  277. package/src/route-renderer/orchestration/route-pipeline/route-prepared-options.utils.js +33 -0
  278. package/src/route-renderer/orchestration/{route-render-orchestrator.d.ts → route-pipeline/route-render-orchestrator.d.ts} +13 -53
  279. package/src/route-renderer/orchestration/route-pipeline/route-render-orchestrator.js +162 -0
  280. package/src/route-renderer/orchestration/string-markup-renderer.d.ts +14 -0
  281. package/src/route-renderer/orchestration/string-markup-renderer.js +55 -0
  282. package/src/route-renderer/page-loading/component-dependency-collection.js +5 -2
  283. package/src/route-renderer/page-loading/ecopages-virtual-imports.d.ts +6 -0
  284. package/src/route-renderer/page-loading/ecopages-virtual-imports.js +7 -2
  285. package/src/route-renderer/page-loading/module-declaration-aggregation.js +4 -0
  286. package/src/router/client/link-intent.d.ts +11 -21
  287. package/src/router/client/link-intent.js +10 -0
  288. package/src/router/client/link-intent.test.browser.js +12 -1
  289. package/src/router/client/link-navigation-policy.d.ts +45 -0
  290. package/src/router/client/link-navigation-policy.js +101 -0
  291. package/src/router/client/link-navigation-policy.test.browser.d.ts +1 -0
  292. package/src/router/client/link-navigation-policy.test.browser.js +92 -0
  293. package/src/router/client/navigation-coordinator.d.ts +1 -1
  294. package/src/router/client/navigation-coordinator.js +12 -2
  295. package/src/services/assets/asset-processing-service/asset-dependency-keys.d.ts +13 -0
  296. package/src/services/assets/asset-processing-service/asset-dependency-keys.js +3 -0
  297. package/src/services/assets/asset-processing-service/asset-processing.service.d.ts +6 -1
  298. package/src/services/assets/asset-processing-service/asset-processing.service.js +44 -5
  299. package/src/services/assets/asset-processing-service/assets.types.d.ts +1 -1
  300. package/src/services/assets/asset-processing-service/browser-runtime-asset.factory.d.ts +2 -1
  301. package/src/services/assets/asset-processing-service/browser-runtime-asset.factory.js +1 -0
  302. package/src/services/assets/asset-processing-service/browser-runtime-entry-resolution.d.ts +52 -0
  303. package/src/services/assets/asset-processing-service/browser-runtime-entry-resolution.js +78 -0
  304. package/src/services/assets/asset-processing-service/browser-runtime-entry.factory.d.ts +4 -2
  305. package/src/services/assets/asset-processing-service/browser-runtime-entry.factory.js +28 -13
  306. package/src/services/assets/asset-processing-service/finalize-processed-asset.d.ts +3 -0
  307. package/src/services/assets/asset-processing-service/finalize-processed-asset.js +7 -0
  308. package/src/services/assets/asset-processing-service/grouped-content-bundles.d.ts +2 -1
  309. package/src/services/assets/asset-processing-service/grouped-content-bundles.js +38 -12
  310. package/src/services/assets/asset-processing-service/index.d.ts +2 -0
  311. package/src/services/assets/asset-processing-service/index.js +2 -0
  312. package/src/services/assets/asset-processing-service/inline-content-script-body.d.ts +11 -0
  313. package/src/services/assets/asset-processing-service/inline-content-script-body.js +17 -0
  314. package/src/services/assets/asset-processing-service/materialize-content-script-asset.d.ts +9 -0
  315. package/src/services/assets/asset-processing-service/materialize-content-script-asset.js +18 -0
  316. package/src/services/assets/asset-processing-service/processors/base/base-script-processor.d.ts +0 -2
  317. package/src/services/assets/asset-processing-service/processors/base/base-script-processor.js +2 -15
  318. package/src/services/assets/asset-processing-service/processors/script/content-script.processor.d.ts +8 -0
  319. package/src/services/assets/asset-processing-service/processors/script/content-script.processor.js +73 -68
  320. package/src/services/assets/asset-processing-service/processors/script/file-script.processor.d.ts +0 -1
  321. package/src/services/assets/asset-processing-service/processors/script/file-script.processor.js +18 -15
  322. package/src/services/assets/asset-processing-service/processors/script/node-module-script.processor.js +17 -3
  323. package/src/services/assets/asset-processing-service/processors/stylesheet/content-stylesheet.processor.d.ts +0 -3
  324. package/src/services/assets/asset-processing-service/processors/stylesheet/content-stylesheet.processor.js +2 -31
  325. package/src/services/assets/asset-processing-service/processors/stylesheet/file-stylesheet.processor.d.ts +0 -3
  326. package/src/services/assets/asset-processing-service/processors/stylesheet/file-stylesheet.processor.js +2 -30
  327. package/src/services/assets/asset-processing-service/processors/stylesheet/stylesheet-processor-pipeline.d.ts +2 -0
  328. package/src/services/assets/asset-processing-service/processors/stylesheet/stylesheet-processor-pipeline.js +43 -0
  329. package/src/services/assets/asset-processing-service/resolve-integration-plugin.d.ts +4 -0
  330. package/src/services/assets/asset-processing-service/resolve-integration-plugin.js +17 -0
  331. package/src/services/assets/asset-processing-service/ungrouped-dependency-processing.d.ts +0 -1
  332. package/src/services/assets/asset-processing-service/ungrouped-dependency-processing.js +5 -10
  333. package/src/services/assets/browser-bundle.service.d.ts +28 -30
  334. package/src/services/assets/browser-bundle.service.js +28 -19
  335. package/src/services/html/html-transformer.service.d.ts +1 -1
  336. package/src/services/html/html-transformer.service.js +5 -5
  337. package/src/services/invalidation/development-invalidation.service.d.ts +25 -2
  338. package/src/services/invalidation/development-invalidation.service.js +64 -11
  339. package/src/services/module-loading/README.md +49 -0
  340. package/src/services/module-loading/app-server-module-transpiler.service.d.ts +8 -0
  341. package/src/services/module-loading/app-server-module-transpiler.service.js +3 -21
  342. package/src/services/module-loading/page-module-import.service.d.ts +6 -2
  343. package/src/services/module-loading/page-module-import.service.js +110 -47
  344. package/src/services/module-loading/route-module-build-cache-registry.d.ts +24 -0
  345. package/src/services/module-loading/route-module-build-cache-registry.js +37 -0
  346. package/src/services/module-loading/route-module-build-cache.d.ts +4 -0
  347. package/src/services/module-loading/route-module-build-cache.js +38 -0
  348. package/src/services/module-loading/route-module-build-cache.store.d.ts +57 -0
  349. package/src/services/module-loading/route-module-build-cache.store.js +207 -0
  350. package/src/services/module-loading/route-module-build-manifest.d.ts +54 -0
  351. package/src/services/module-loading/route-module-build-manifest.js +85 -0
  352. package/src/services/module-loading/route-module-dependency-hasher.d.ts +81 -0
  353. package/src/services/module-loading/route-module-dependency-hasher.js +122 -0
  354. package/src/services/module-loading/server-module-transpiler.service.d.ts +1 -1
  355. package/src/services/module-loading/server-module-transpiler.service.js +1 -1
  356. package/src/services/validation/schema-validation-service.d.ts +1 -4
  357. package/src/services/validation/schema-validation-service.js +12 -13
  358. package/src/services/validation/standard-schema.types.d.ts +9 -62
  359. package/src/services/validation/validate-standard-schema.d.ts +7 -0
  360. package/src/services/validation/validate-standard-schema.js +14 -0
  361. package/src/static-site-generator/README.md +41 -0
  362. package/src/static-site-generator/production-page-browser-graph-prebuild.d.ts +28 -0
  363. package/src/static-site-generator/production-page-browser-graph-prebuild.js +22 -0
  364. package/src/static-site-generator/sitemap-routes.d.ts +14 -0
  365. package/src/static-site-generator/sitemap-routes.js +31 -0
  366. package/src/static-site-generator/sitemap.d.ts +15 -0
  367. package/src/static-site-generator/sitemap.js +33 -0
  368. package/src/static-site-generator/static-build-invalidation.d.ts +10 -0
  369. package/src/static-site-generator/static-build-invalidation.js +59 -0
  370. package/src/static-site-generator/static-export-context.d.ts +30 -0
  371. package/src/static-site-generator/static-export-context.js +0 -0
  372. package/src/static-site-generator/static-site-generator.d.ts +43 -25
  373. package/src/static-site-generator/static-site-generator.js +381 -106
  374. package/src/types/internal-types.d.ts +39 -13
  375. package/src/types/public-types.d.ts +289 -52
  376. package/src/utils/ecopages-route-info.d.ts +26 -0
  377. package/src/utils/ecopages-route-info.js +26 -0
  378. package/src/utils/html-escaping.d.ts +7 -0
  379. package/src/utils/html-escaping.js +5 -1
  380. package/src/utils/parse-cli-args.d.ts +2 -0
  381. package/src/utils/parse-cli-args.js +6 -0
  382. package/src/utils/path-pattern.d.ts +23 -0
  383. package/src/utils/path-pattern.js +27 -0
  384. package/src/utils/server-utils.module.d.ts +3 -2
  385. package/src/utils/server-utils.module.js +5 -6
  386. package/src/utils/static-file-extensions.d.ts +12 -0
  387. package/src/utils/static-file-extensions.js +48 -0
  388. package/src/watchers/project-watcher-ignore.d.ts +11 -0
  389. package/src/watchers/project-watcher-ignore.js +16 -0
  390. package/src/watchers/project-watcher.d.ts +29 -6
  391. package/src/watchers/project-watcher.js +146 -34
  392. package/src/watchers/project-watcher.test-helpers.js +5 -5
  393. package/src/adapters/shared/define-api-handler.d.ts +0 -25
  394. package/src/adapters/shared/define-api-handler.js +0 -15
  395. package/src/adapters/shared/hmr-entrypoint-registrar.js +0 -87
  396. package/src/adapters/shared/server-adapter.js +0 -436
  397. package/src/adapters/shared/server-static-builder.js +0 -162
  398. package/src/adapters/shared/shared-hmr-manager.d.ts +0 -59
  399. package/src/adapters/shared/shared-hmr-manager.js +0 -241
  400. package/src/build/build-manifest.d.ts +0 -33
  401. package/src/build/rolldown-dev-build-adapter.d.ts +0 -82
  402. package/src/build/rolldown-dev-build-adapter.js +0 -166
  403. package/src/build/runtime-build-executor.d.ts +0 -21
  404. package/src/build/runtime-build-executor.js +0 -19
  405. package/src/build/runtime-build-output-normalizer.d.ts +0 -3
  406. package/src/build/runtime-build-output-normalizer.js +0 -111
  407. package/src/hmr/hmr.postcss.test.e2e.js +0 -31
  408. package/src/hmr/hmr.test.e2e.js +0 -43
  409. package/src/route-renderer/orchestration/declared-ownership-graph.d.ts +0 -18
  410. package/src/route-renderer/orchestration/declared-ownership-graph.js +0 -34
  411. package/src/route-renderer/orchestration/ownership-planning.service.d.ts +0 -24
  412. package/src/route-renderer/orchestration/ownership-planning.service.js +0 -63
  413. package/src/route-renderer/orchestration/queued-foreign-subtree-resolution.service.d.ts +0 -91
  414. package/src/route-renderer/orchestration/queued-foreign-subtree-resolution.service.js +0 -170
  415. package/src/route-renderer/orchestration/route-render-orchestrator.js +0 -577
  416. package/src/route-renderer/orchestration/template-serialization.d.ts +0 -38
  417. package/src/route-renderer/orchestration/template-serialization.js +0 -45
  418. /package/src/adapters/shared/{explicit-static-render-preparation.js → http/explicit-static-render-preparation.js} +0 -0
  419. /package/src/adapters/shared/{runtime-host.d.ts → runtime/runtime-host.d.ts} +0 -0
  420. /package/src/adapters/shared/{runtime-host.js → runtime/runtime-host.js} +0 -0
  421. /package/src/adapters/shared/{static-preview-host.js → runtime/static-preview-host.js} +0 -0
  422. /package/src/build/{browser-runtime-manifest.d.ts → browser/browser-runtime-manifest.d.ts} +0 -0
  423. /package/src/build/{browser-runtime-manifest.js → browser/browser-runtime-manifest.js} +0 -0
  424. /package/src/build/{browser-runtime-plugin-helpers.d.ts → browser/browser-runtime-plugin-helpers.d.ts} +0 -0
  425. /package/src/build/{browser-runtime-plugin-helpers.js → browser/browser-runtime-plugin-helpers.js} +0 -0
  426. /package/src/build/{build-types.js → contracts/build-contracts.js} +0 -0
  427. /package/src/build/{build-types.d.ts → contracts/build-types.d.ts} +0 -0
  428. /package/src/build/{server-side-css-shim-plugin.d.ts → rolldown/server-side-css-shim-plugin.d.ts} +0 -0
  429. /package/src/build/{server-side-css-shim-plugin.js → rolldown/server-side-css-shim-plugin.js} +0 -0
  430. /package/src/build/{serialized-build-executor.js → runtime/serialized-build-executor.js} +0 -0
  431. /package/src/{hmr/hmr.postcss.test.e2e.d.ts → client/navigation-scripts/navigation-scripts.test.browser.d.ts} +0 -0
  432. /package/src/{hmr/hmr.test.e2e.d.ts → client/scroll.test.browser.d.ts} +0 -0
  433. /package/src/route-renderer/orchestration/{processed-asset-dedupe.js → page-browser-graph/processed-asset-dedupe.js} +0 -0
@@ -0,0 +1,229 @@
1
+ import path from "node:path";
2
+ import { fileSystem } from "@ecopages/file-system";
3
+ import {
4
+ } from "../../../services/assets/asset-processing-service/index.js";
5
+ import { appLogger } from "../../../global/app-logger.js";
6
+ import { startupTrace } from "../../../diagnostics/startup-trace.js";
7
+ import {
8
+ collectPageBrowserGraphDependencyPaths,
9
+ createPageBrowserGraphEntryFingerprint,
10
+ getAppPageBrowserGraphSession
11
+ } from "./page-browser-graph-session.js";
12
+ function isGroupedContentScriptAsset(asset) {
13
+ return asset.kind === "script" && asset.source === "content" && Boolean(asset.groupedBundle?.id);
14
+ }
15
+ function getGroupedBundleAssetKey(groupedBundle) {
16
+ return `${groupedBundle.id}:${groupedBundle.entryName}`;
17
+ }
18
+ class PageBrowserGraphService {
19
+ appConfig;
20
+ assetProcessingService;
21
+ constructor(appConfig, assetProcessingService) {
22
+ this.appConfig = appConfig;
23
+ this.assetProcessingService = assetProcessingService;
24
+ }
25
+ async resolvePageBrowserGraph(input) {
26
+ return await this.getOrBuild(input);
27
+ }
28
+ /**
29
+ * Resolves or builds one Page Browser Graph under the given policy.
30
+ */
31
+ async getOrBuild(input) {
32
+ const policy = input.policy ?? this.resolveGraphPolicy();
33
+ const session = getAppPageBrowserGraphSession(this.appConfig);
34
+ if (!this.isHmrEnabled()) {
35
+ const cachedByRoute = session.getGraphByRoute(input.integrationName, input.routeFile, policy);
36
+ if (cachedByRoute) {
37
+ return cachedByRoute;
38
+ }
39
+ }
40
+ const contribution = await input.collectContribution(input.routeFile);
41
+ if (!contribution) {
42
+ return void 0;
43
+ }
44
+ const entryFingerprint = createPageBrowserGraphEntryFingerprint(contribution);
45
+ return await session.resolveGraph(
46
+ {
47
+ integrationName: input.integrationName,
48
+ routeFile: input.routeFile,
49
+ entryFingerprint,
50
+ policy
51
+ },
52
+ async () => this.buildPageBrowserGraphRecord(input, contribution)
53
+ );
54
+ }
55
+ resolveGraphPolicy() {
56
+ return this.isHmrEnabled() ? "development" : "production";
57
+ }
58
+ isHmrEnabled() {
59
+ return typeof this.assetProcessingService.getHmrManager === "function" && this.assetProcessingService.getHmrManager()?.isEnabled() === true;
60
+ }
61
+ async buildPageBrowserGraphRecord(input, contribution) {
62
+ const result = await this.materializePageBrowserGraph(input, contribution);
63
+ if (!result) {
64
+ return void 0;
65
+ }
66
+ startupTrace.markFirstPageBrowserGraphReady(getAppPageBrowserGraphSession(this.appConfig).getBuildCount());
67
+ return result;
68
+ }
69
+ async materializePageBrowserGraph(input, contribution) {
70
+ const groupedDependencies = (contribution.dependencies ?? []).filter((dep) => isGroupedContentScriptAsset(dep));
71
+ const ungroupedDependencies = (contribution.dependencies ?? []).filter(
72
+ (dep) => !isGroupedContentScriptAsset(dep)
73
+ );
74
+ const groupedAssets = groupedDependencies.length ? (await this.resolveGroupedPageBrowserAssets(input, contribution)).assetsByRoute.get(input.routeFile) ?? [] : [];
75
+ const processedDependencies = ungroupedDependencies.length ? await this.assetProcessingService.processDependencies(
76
+ ungroupedDependencies,
77
+ `${input.integrationName}:${input.routeFile}`
78
+ ) : [];
79
+ const resolvedAssets = [...processedDependencies, ...groupedAssets, ...contribution.assets ?? []];
80
+ const result = this.partitionPageBrowserGraphAssets(resolvedAssets);
81
+ const dependencyPaths = collectPageBrowserGraphDependencyPaths(input.routeFile, contribution, resolvedAssets);
82
+ return {
83
+ result,
84
+ dependencyPaths
85
+ };
86
+ }
87
+ async resolveGroupedPageBrowserAssets(input, currentContribution) {
88
+ if (this.isHmrEnabled()) {
89
+ return await this.buildGroupedPageBrowserAssets(input, currentContribution);
90
+ }
91
+ const session = getAppPageBrowserGraphSession(this.appConfig);
92
+ const assetsByRoute = await session.resolveGroupedGraph(input.integrationName, async () => {
93
+ const built = await this.buildGroupedPageBrowserAssets(input, currentContribution);
94
+ if (built.hasCollectionFailures) {
95
+ return {
96
+ skipCache: true,
97
+ assetsByRoute: built.assetsByRoute,
98
+ dependencyPaths: built.dependencyPaths
99
+ };
100
+ }
101
+ return {
102
+ assetsByRoute: built.assetsByRoute,
103
+ dependencyPaths: built.dependencyPaths,
104
+ generation: 0
105
+ };
106
+ });
107
+ return {
108
+ assetsByRoute,
109
+ dependencyPaths: /* @__PURE__ */ new Set(),
110
+ hasCollectionFailures: false
111
+ };
112
+ }
113
+ async buildGroupedPageBrowserAssets(input, currentContribution) {
114
+ const routeFiles = this.isHmrEnabled() ? [input.routeFile] : await this.listIntegrationRouteFiles(input.integrationName);
115
+ const currentRouteGroupedDependencies = (currentContribution.dependencies ?? []).filter(
116
+ (dep) => isGroupedContentScriptAsset(dep)
117
+ );
118
+ const groupedDependencies = [...currentRouteGroupedDependencies];
119
+ const groupedAssetKeysByRoute = /* @__PURE__ */ new Map();
120
+ const dependencyPaths = /* @__PURE__ */ new Set([path.resolve(input.routeFile)]);
121
+ let hasCollectionFailures = false;
122
+ if (currentRouteGroupedDependencies.length > 0) {
123
+ groupedAssetKeysByRoute.set(
124
+ input.routeFile,
125
+ new Set(currentRouteGroupedDependencies.map((dep) => getGroupedBundleAssetKey(dep.groupedBundle)))
126
+ );
127
+ }
128
+ for (const routeFile of routeFiles) {
129
+ if (routeFile === input.routeFile) {
130
+ continue;
131
+ }
132
+ let contribution;
133
+ try {
134
+ contribution = await input.collectContribution(routeFile);
135
+ } catch (error) {
136
+ hasCollectionFailures = true;
137
+ appLogger.warn(
138
+ `Skipping grouped page-browser contribution for ${routeFile}: ${error instanceof Error ? error.message : String(error)}`
139
+ );
140
+ continue;
141
+ }
142
+ if (!contribution?.dependencies?.length) {
143
+ continue;
144
+ }
145
+ const routeGroupedDependencies = contribution.dependencies.filter(
146
+ (dep) => isGroupedContentScriptAsset(dep)
147
+ );
148
+ if (routeGroupedDependencies.length === 0) {
149
+ continue;
150
+ }
151
+ groupedDependencies.push(...routeGroupedDependencies);
152
+ groupedAssetKeysByRoute.set(
153
+ routeFile,
154
+ new Set(routeGroupedDependencies.map((dep) => getGroupedBundleAssetKey(dep.groupedBundle)))
155
+ );
156
+ dependencyPaths.add(path.resolve(routeFile));
157
+ }
158
+ if (groupedDependencies.length === 0) {
159
+ return {
160
+ assetsByRoute: /* @__PURE__ */ new Map(),
161
+ dependencyPaths,
162
+ hasCollectionFailures
163
+ };
164
+ }
165
+ for (const dependency of groupedDependencies) {
166
+ if (dependency.source === "file") {
167
+ dependencyPaths.add(path.resolve(dependency.filepath));
168
+ }
169
+ }
170
+ const processedGroupedDependencies = await this.assetProcessingService.processDependencies(
171
+ groupedDependencies,
172
+ `${input.integrationName}:grouped-page-browser-graph`
173
+ );
174
+ const groupedAssetsByRoute = /* @__PURE__ */ new Map();
175
+ for (const [routeFile, groupedAssetKeys] of groupedAssetKeysByRoute) {
176
+ const matchedAssets = processedGroupedDependencies.filter((asset) => {
177
+ if (!asset.groupedBundle) {
178
+ return false;
179
+ }
180
+ return groupedAssetKeys.has(getGroupedBundleAssetKey(asset.groupedBundle));
181
+ });
182
+ if (groupedAssetKeys.size > 0 && matchedAssets.length === 0) {
183
+ appLogger.warn(
184
+ `Grouped page-browser assets for ${routeFile} are missing groupedBundle metadata after processing. Hydration scripts may be omitted from HTML.`
185
+ );
186
+ }
187
+ groupedAssetsByRoute.set(routeFile, matchedAssets);
188
+ }
189
+ for (const asset of processedGroupedDependencies) {
190
+ if (asset.sourceFilepath) {
191
+ dependencyPaths.add(path.resolve(asset.sourceFilepath));
192
+ }
193
+ for (const bundledSourceFilepath of asset.bundledSourceFilepaths ?? []) {
194
+ dependencyPaths.add(path.resolve(bundledSourceFilepath));
195
+ }
196
+ }
197
+ return {
198
+ assetsByRoute: groupedAssetsByRoute,
199
+ dependencyPaths,
200
+ hasCollectionFailures
201
+ };
202
+ }
203
+ async listIntegrationRouteFiles(integrationName) {
204
+ const integration = this.appConfig.integrations.find((plugin) => plugin.name === integrationName);
205
+ if (!integration) {
206
+ return [];
207
+ }
208
+ const scannedFiles = await fileSystem.glob(
209
+ integration.extensions.map((extension) => `**/*${extension}`),
210
+ { cwd: this.appConfig.absolutePaths.pagesDir }
211
+ );
212
+ return scannedFiles.filter((file) => !file.includes(".ecopages-node.")).map((file) => path.join(this.appConfig.absolutePaths.pagesDir, file)).sort((left, right) => left.localeCompare(right));
213
+ }
214
+ partitionPageBrowserGraphAssets(assets) {
215
+ const entryAssets = [];
216
+ const chunkAssets = [];
217
+ for (const asset of assets) {
218
+ if (asset.packageRole === "dynamic-chunk") {
219
+ chunkAssets.push(asset);
220
+ continue;
221
+ }
222
+ entryAssets.push(asset);
223
+ }
224
+ return { entryAssets, chunkAssets };
225
+ }
226
+ }
227
+ export {
228
+ PageBrowserGraphService
229
+ };
@@ -1,3 +1,3 @@
1
- import type { ProcessedAsset } from '../../services/assets/asset-processing-service/index.js';
1
+ import type { ProcessedAsset } from '../../../services/assets/asset-processing-service/index.js';
2
2
  export declare function buildProcessedAssetDedupeKey(asset: ProcessedAsset): string;
3
3
  export declare function dedupeProcessedAssets(assets: ProcessedAsset[]): ProcessedAsset[];
@@ -0,0 +1,31 @@
1
+ import type { ProcessedAsset } from '../../../services/assets/asset-processing-service/index.js';
2
+ import type { HtmlDocumentContribution } from '../../../services/html/html-transformer.service.js';
3
+ import type { EcoComponent, EcoPageFile, IntegrationRendererRenderOptions, PageBrowserGraphContribution, PageBrowserGraphContributionContext, PagePackageResult, RouteRendererBody, RouteRendererOptions } from '../../../types/public-types.js';
4
+ import type { RouteHtmlFinalization, RouteRenderOrchestratorAdapter, RouteRenderOrchestratorResolvedInputs } from './route-render-orchestrator.js';
5
+ /**
6
+ * Host surface required to build the orchestrator adapter for one integration renderer.
7
+ */
8
+ export type IntegrationRouteRenderAdapterHost<C> = {
9
+ readonly name: string;
10
+ resolveRouteRenderInputs(routeOptions: RouteRendererOptions): Promise<RouteRenderOrchestratorResolvedInputs>;
11
+ resolveRouteDependencies(input: {
12
+ components: (EcoComponent | Partial<EcoComponent>)[];
13
+ }): Promise<{
14
+ resolvedDependencies: ProcessedAsset[];
15
+ }>;
16
+ importPageFile(file: string): Promise<EcoPageFile>;
17
+ collectPageBrowserGraphContribution(context: PageBrowserGraphContributionContext): Promise<PageBrowserGraphContribution | undefined>;
18
+ renderRouteBody(renderOptions: IntegrationRendererRenderOptions<C>): Promise<RouteRendererBody>;
19
+ getDocumentAttributes(renderOptions: IntegrationRendererRenderOptions<C>): Record<string, string> | undefined;
20
+ getHtmlDocumentContributions(options: {
21
+ renderOptions: IntegrationRendererRenderOptions<C>;
22
+ partial: boolean;
23
+ }): HtmlDocumentContribution[] | undefined;
24
+ applyAttributesToHtmlElement(html: string, attributes: Record<string, string>): string;
25
+ transformRouteResponse(response: Response, htmlContributions?: HtmlDocumentContribution[], pagePackage?: PagePackageResult): Promise<RouteRendererBody>;
26
+ };
27
+ /**
28
+ * Builds the internal route-render adapter consumed by `RouteRenderOrchestrator`.
29
+ */
30
+ export declare function createIntegrationRouteRenderAdapter<C>(host: IntegrationRouteRenderAdapterHost<C>): RouteRenderOrchestratorAdapter<C>;
31
+ export type { RouteHtmlFinalization };
@@ -0,0 +1,25 @@
1
+ import { loadPageBrowserGraphContribution } from "../page-browser-graph/page-browser-graph-contribution.loader.js";
2
+ import { buildRouteHtmlFinalization } from "./route-html-finalization.service.js";
3
+ function createIntegrationRouteRenderAdapter(host) {
4
+ return {
5
+ name: host.name,
6
+ resolveRouteRenderInputs: (routeOptions) => host.resolveRouteRenderInputs(routeOptions),
7
+ resolveRouteDependencies: (input) => host.resolveRouteDependencies(input),
8
+ collectPageBrowserGraphContribution: (routeFile) => loadPageBrowserGraphContribution(
9
+ routeFile,
10
+ (file) => host.importPageFile(file),
11
+ (context) => host.collectPageBrowserGraphContribution(context)
12
+ ),
13
+ renderRouteBody: (renderOptions) => host.renderRouteBody(renderOptions),
14
+ getRouteHtmlFinalization: (renderOptions) => buildRouteHtmlFinalization({
15
+ renderOptions,
16
+ getDocumentAttributes: (options) => host.getDocumentAttributes(options),
17
+ getHtmlDocumentContributions: (options) => host.getHtmlDocumentContributions(options),
18
+ applyAttributesToHtmlElement: (html, attributes) => host.applyAttributesToHtmlElement(html, attributes)
19
+ }),
20
+ transformRouteResponse: (response, htmlContributions, pagePackage) => host.transformRouteResponse(response, htmlContributions, pagePackage)
21
+ };
22
+ }
23
+ export {
24
+ createIntegrationRouteRenderAdapter
25
+ };
@@ -0,0 +1,6 @@
1
+ export declare function decodeHtmlEntities(value: string): string;
2
+ export declare function normalizeUnresolvedMarkerArtifactHtml(html: string): string;
3
+ export declare function inspectUnresolvedMarkerArtifactHtml(html: string): {
4
+ hasUnresolvedMarkerArtifacts: boolean;
5
+ normalizedHtml: string;
6
+ };
@@ -0,0 +1,27 @@
1
+ function decodeHtmlEntities(value) {
2
+ let decoded = value;
3
+ let previous;
4
+ do {
5
+ previous = decoded;
6
+ decoded = decoded.replaceAll("&quot;", '"').replaceAll("&#39;", "'").replaceAll("&#x27;", "'").replaceAll("&lt;", "<").replaceAll("&gt;", ">").replaceAll("&amp;", "&");
7
+ } while (decoded !== previous);
8
+ return decoded;
9
+ }
10
+ function normalizeUnresolvedMarkerArtifactHtml(html) {
11
+ return html.replace(
12
+ /&(?:amp;)?lt;eco-marker\b[\s\S]*?&(?:amp;)?gt;&(?:amp;)?lt;\/eco-marker&(?:amp;)?gt;/g,
13
+ (marker) => decodeHtmlEntities(marker)
14
+ );
15
+ }
16
+ function inspectUnresolvedMarkerArtifactHtml(html) {
17
+ const normalizedHtml = normalizeUnresolvedMarkerArtifactHtml(html);
18
+ return {
19
+ normalizedHtml,
20
+ hasUnresolvedMarkerArtifacts: normalizedHtml.includes("<eco-marker")
21
+ };
22
+ }
23
+ export {
24
+ decodeHtmlEntities,
25
+ inspectUnresolvedMarkerArtifactHtml,
26
+ normalizeUnresolvedMarkerArtifactHtml
27
+ };
@@ -0,0 +1,15 @@
1
+ import type { HtmlDocumentContribution } from '../../../services/html/html-transformer.service.js';
2
+ import type { PageMetadataProps, PageRobotsMetadata } from '../../../types/public-types.js';
3
+ /**
4
+ * Builds a head contribution for non-default `metadata.robots` values.
5
+ *
6
+ * @remarks
7
+ * When `robots` is omitted or matches the default `index,follow` behaviour,
8
+ * no tag is emitted (Next.js parity). Otherwise a single
9
+ * `<meta name="robots" content="...">` contribution is returned.
10
+ */
11
+ export declare function buildRobotsMetaContribution(metadata: Pick<PageMetadataProps, 'robots'>): HtmlDocumentContribution | undefined;
12
+ /**
13
+ * Formats robots directives for a meta tag, or `undefined` when defaults apply.
14
+ */
15
+ export declare function formatRobotsMetaContent(robots: PageRobotsMetadata | undefined): string | undefined;
@@ -0,0 +1,36 @@
1
+ import { escapeHtmlAttribute } from "../../../utils/html-escaping.js";
2
+ function buildRobotsMetaContribution(metadata) {
3
+ const content = formatRobotsMetaContent(metadata.robots);
4
+ if (!content) {
5
+ return void 0;
6
+ }
7
+ return {
8
+ placement: "head-append",
9
+ html: `<meta name="robots" content="${escapeHtmlAttribute(content)}">`
10
+ };
11
+ }
12
+ function formatRobotsMetaContent(robots) {
13
+ if (!robots) {
14
+ return void 0;
15
+ }
16
+ const index = robots.index !== false;
17
+ const follow = robots.follow !== false;
18
+ const directives = [];
19
+ if (!index) {
20
+ directives.push("noindex");
21
+ }
22
+ if (!follow) {
23
+ directives.push("nofollow");
24
+ }
25
+ if (robots.nocache) {
26
+ directives.push("nocache");
27
+ }
28
+ if (directives.length === 0) {
29
+ return void 0;
30
+ }
31
+ return directives.join(", ");
32
+ }
33
+ export {
34
+ buildRobotsMetaContribution,
35
+ formatRobotsMetaContent
36
+ };
@@ -0,0 +1,20 @@
1
+ import type { HtmlDocumentContribution } from '../../../services/html/html-transformer.service.js';
2
+ import type { IntegrationRendererRenderOptions } from '../../../types/public-types.js';
3
+ import type { RouteHtmlFinalization } from './route-render-orchestrator.js';
4
+ export type RouteHtmlFinalizationContext<C> = {
5
+ renderOptions: IntegrationRendererRenderOptions<C>;
6
+ getDocumentAttributes: (renderOptions: IntegrationRendererRenderOptions<C>) => Record<string, string> | undefined;
7
+ getHtmlDocumentContributions: (options: {
8
+ renderOptions: IntegrationRendererRenderOptions<C>;
9
+ partial: boolean;
10
+ }) => HtmlDocumentContribution[] | undefined;
11
+ applyAttributesToHtmlElement: (html: string, attributes: Record<string, string>) => string;
12
+ };
13
+ /**
14
+ * Builds the structural HTML finalization plan for one prepared route render.
15
+ *
16
+ * @remarks
17
+ * Merges core robots meta contributions with integration-owned document
18
+ * contributions so page-level `metadata.robots` works across templates.
19
+ */
20
+ export declare function buildRouteHtmlFinalization<C>(context: RouteHtmlFinalizationContext<C>): RouteHtmlFinalization;
@@ -0,0 +1,24 @@
1
+ import { buildRobotsMetaContribution } from "./robots-meta.contribution.js";
2
+ function buildRouteHtmlFinalization(context) {
3
+ const { renderOptions } = context;
4
+ const documentAttributes = context.getDocumentAttributes(renderOptions);
5
+ const integrationContributions = context.getHtmlDocumentContributions({ renderOptions, partial: false }) ?? [];
6
+ const robotsContribution = buildRobotsMetaContribution(renderOptions.metadata ?? {});
7
+ const htmlContributions = robotsContribution ? [robotsContribution, ...integrationContributions] : integrationContributions;
8
+ const hasStructuralFinalization = documentAttributes && Object.keys(documentAttributes).length > 0;
9
+ if (!hasStructuralFinalization && htmlContributions.length === 0) {
10
+ return {};
11
+ }
12
+ return {
13
+ htmlContributions,
14
+ finalizeHtml: (html) => {
15
+ if (!documentAttributes || Object.keys(documentAttributes).length === 0) {
16
+ return html;
17
+ }
18
+ return context.applyAttributesToHtmlElement(html, documentAttributes);
19
+ }
20
+ };
21
+ }
22
+ export {
23
+ buildRouteHtmlFinalization
24
+ };
@@ -0,0 +1,25 @@
1
+ import type { EcoPagesAppConfig } from '../../../types/internal-types.js';
2
+ import type { EcoComponent, EcoPageComponent, EcoPageFile, HtmlTemplateProps, IntegrationRendererRenderOptions, PageBrowserGraphResult, PageMetadataProps, EcoPageLayoutEntry, RouteRendererOptions } from '../../../types/public-types.js';
3
+ import { type ProcessedAsset } from '../../../services/assets/asset-processing-service/index.js';
4
+ type PreparedRenderInputs = {
5
+ Page: EcoPageFile['default'] | EcoPageComponent<any>;
6
+ HtmlTemplate: EcoComponent<HtmlTemplateProps>;
7
+ Layouts: EcoComponent[];
8
+ Layout?: EcoComponent;
9
+ layoutEntries?: EcoPageLayoutEntry[];
10
+ props: Record<string, unknown>;
11
+ metadata: PageMetadataProps;
12
+ integrationSpecificProps: Record<string, unknown>;
13
+ };
14
+ /**
15
+ * Assembles the final integration render options after route prep dependencies resolve.
16
+ */
17
+ export declare function buildPreparedRenderOptions<C = unknown>(input: {
18
+ routeOptions: RouteRendererOptions;
19
+ resolvedInputs: PreparedRenderInputs;
20
+ resolvedDependencies: ProcessedAsset[];
21
+ allDependencies: ProcessedAsset[];
22
+ pageBrowserGraph?: PageBrowserGraphResult;
23
+ appConfig: EcoPagesAppConfig;
24
+ }): IntegrationRendererRenderOptions<C>;
25
+ export {};
@@ -0,0 +1,49 @@
1
+ import { createPagePackage } from "../../../services/assets/asset-processing-service/index.js";
2
+ import { dedupeProcessedAssets } from "../page-browser-graph/processed-asset-dedupe.js";
3
+ import { createPageLocalsProxy } from "./route-prepared-options.utils.js";
4
+ function buildPreparedRenderOptions(input) {
5
+ const { routeOptions, resolvedInputs, resolvedDependencies, allDependencies, pageBrowserGraph, appConfig } = input;
6
+ const { Page, HtmlTemplate, Layouts, Layout, layoutEntries, props, metadata, integrationSpecificProps } = resolvedInputs;
7
+ const dedupedDependencies = dedupeProcessedAssets(allDependencies);
8
+ const pagePackage = createPagePackage(dedupedDependencies, { pageBrowserGraph });
9
+ const resolvedProps = {
10
+ ...props,
11
+ ...routeOptions.props ?? {}
12
+ };
13
+ const pageProps = {
14
+ ...resolvedProps,
15
+ params: routeOptions.params || {},
16
+ query: routeOptions.query || {}
17
+ };
18
+ const cacheStrategy = Page.cache;
19
+ const defaultCacheStrategy = appConfig.cache?.defaultStrategy ?? "static";
20
+ const effectiveCacheStrategy = cacheStrategy ?? defaultCacheStrategy;
21
+ const localsAvailable = effectiveCacheStrategy === "dynamic" && routeOptions.locals !== void 0;
22
+ const pageLocals = localsAvailable ? routeOptions.locals : createPageLocalsProxy(routeOptions.file);
23
+ const locals = localsAvailable ? routeOptions.locals : void 0;
24
+ const preparedOptions = {
25
+ ...routeOptions,
26
+ resolvedDependencies,
27
+ pagePackage,
28
+ HtmlTemplate,
29
+ Layouts,
30
+ Layout,
31
+ layoutEntries,
32
+ props: resolvedProps,
33
+ Page,
34
+ metadata,
35
+ params: routeOptions.params || {},
36
+ query: routeOptions.query || {},
37
+ pageProps,
38
+ locals,
39
+ pageLocals,
40
+ cacheStrategy
41
+ };
42
+ return {
43
+ ...integrationSpecificProps,
44
+ ...preparedOptions
45
+ };
46
+ }
47
+ export {
48
+ buildPreparedRenderOptions
49
+ };
@@ -0,0 +1,4 @@
1
+ /**
2
+ * Proxy that throws when dynamic route locals are accessed on non-dynamic pages.
3
+ */
4
+ export declare function createPageLocalsProxy(filePath: string): Record<string, never>;
@@ -0,0 +1,33 @@
1
+ import { LocalsAccessError } from "../../../errors/locals-access-error.js";
2
+ function createPageLocalsProxy(filePath) {
3
+ const errorMessage = `[ecopages] Request locals are only available during request-time rendering with cache: 'dynamic'. Page: ${filePath}. If you meant to use locals here, set cache: 'dynamic' and provide locals from route middleware/handlers.`;
4
+ return new Proxy(
5
+ {},
6
+ {
7
+ get: () => {
8
+ throw new LocalsAccessError(errorMessage);
9
+ },
10
+ set: () => {
11
+ throw new LocalsAccessError(errorMessage);
12
+ },
13
+ has: () => {
14
+ throw new LocalsAccessError(errorMessage);
15
+ },
16
+ ownKeys: () => {
17
+ throw new LocalsAccessError(errorMessage);
18
+ },
19
+ deleteProperty: () => {
20
+ throw new LocalsAccessError(errorMessage);
21
+ },
22
+ defineProperty: () => {
23
+ throw new LocalsAccessError(errorMessage);
24
+ },
25
+ getOwnPropertyDescriptor: () => {
26
+ throw new LocalsAccessError(errorMessage);
27
+ }
28
+ }
29
+ );
30
+ }
31
+ export {
32
+ createPageLocalsProxy
33
+ };
@@ -1,13 +1,15 @@
1
- import type { EcoPagesAppConfig } from '../../types/internal-types.js';
2
- import type { ComponentRenderResult, EcoComponent, EcoPageComponent, EcoPageFile, HtmlTemplateProps, IntegrationRendererRenderOptions, PageBrowserGraphContribution, PageBrowserGraphResult, PageMetadataProps, RouteRendererBody, RouteRendererOptions, RouteRenderResult } from '../../types/public-types.js';
3
- import { type AssetProcessingService, type ProcessedAsset } from '../../services/assets/asset-processing-service/index.js';
4
- import type { HtmlDocumentContribution } from '../../services/html/html-transformer.service.js';
5
- import { OwnershipValidationService } from './ownership-validation.service.js';
6
- import { OwnershipPlanningService } from './ownership-planning.service.js';
1
+ import type { EcoPagesAppConfig } from '../../../types/internal-types.js';
2
+ import type { EcoComponent, EcoPageComponent, EcoPageFile, HtmlTemplateProps, IntegrationRendererRenderOptions, PageBrowserGraphContribution, PageBrowserGraphResult, PageMetadataProps, RouteRendererBody, RouteRendererOptions, RouteRenderResult, EcoPageLayoutEntry } from '../../../types/public-types.js';
3
+ import type { AssetProcessingService, ProcessedAsset } from '../../../services/assets/asset-processing-service/index.js';
4
+ import type { HtmlDocumentContribution } from '../../../services/html/html-transformer.service.js';
5
+ import { OwnershipValidationService } from '../ownership-graph/ownership-validation.service.js';
6
+ import { PageBrowserGraphService } from '../page-browser-graph/page-browser-graph.service.js';
7
7
  export type RouteRenderOrchestratorResolvedInputs = {
8
8
  Page: EcoPageFile['default'] | EcoPageComponent<any>;
9
9
  HtmlTemplate: EcoComponent<HtmlTemplateProps>;
10
+ Layouts: EcoComponent[];
10
11
  Layout?: EcoComponent;
12
+ layoutEntries?: EcoPageLayoutEntry[];
11
13
  props: Record<string, unknown>;
12
14
  metadata: PageMetadataProps;
13
15
  integrationSpecificProps: Record<string, unknown>;
@@ -44,15 +46,6 @@ export interface RouteRenderOrchestratorAdapter<C> {
44
46
  * Collects declarative Page Browser Graph requirements for one route.
45
47
  */
46
48
  collectPageBrowserGraphContribution(routeFile: string): Promise<PageBrowserGraphContribution | undefined>;
47
- /**
48
- * Resolves the optional page-root render through the foreign-child-aware component contract.
49
- */
50
- resolveRoutePageComponentRender(input: {
51
- Page: EcoComponent;
52
- Layout?: EcoComponent;
53
- props: Record<string, unknown>;
54
- routeOptions: RouteRendererOptions;
55
- }): Promise<ComponentRenderResult | undefined>;
56
49
  /**
57
50
  * Executes the Integration-specific route render.
58
51
  */
@@ -64,7 +57,7 @@ export interface RouteRenderOrchestratorAdapter<C> {
64
57
  /**
65
58
  * Runs SSR-policy response transformation and returns the body value exposed to callers.
66
59
  */
67
- transformRouteResponse(response: Response, htmlContributions?: HtmlDocumentContribution[]): Promise<RouteRendererBody>;
60
+ transformRouteResponse(response: Response, htmlContributions?: HtmlDocumentContribution[], pagePackage?: IntegrationRendererRenderOptions<C>['pagePackage']): Promise<RouteRendererBody>;
68
61
  }
69
62
  /**
70
63
  * Captured route-render output in both replayable body and string HTML forms.
@@ -77,8 +70,8 @@ export interface CapturedHtmlRenderResult {
77
70
  * Optional app-scoped collaborators used by the route render orchestrator.
78
71
  */
79
72
  export interface RouteRenderOrchestratorDependencies {
80
- ownershipPlanningService?: OwnershipPlanningService;
81
73
  ownershipValidationService?: OwnershipValidationService;
74
+ pageBrowserGraphService?: PageBrowserGraphService;
82
75
  }
83
76
  /**
84
77
  * Owns one route render from normalized module loading through final HTML output.
@@ -91,17 +84,15 @@ export interface RouteRenderOrchestratorDependencies {
91
84
  export declare class RouteRenderOrchestrator {
92
85
  private readonly appConfig;
93
86
  private readonly assetProcessingService;
94
- private readonly ownershipPlanningService;
95
87
  private readonly ownershipValidationService;
96
- private readonly pageBrowserGraphCache;
97
- private readonly groupedPageBrowserGraphCache;
88
+ private readonly pageBrowserGraphService;
98
89
  constructor(appConfig: EcoPagesAppConfig, assetProcessingService: AssetProcessingService, dependencies?: RouteRenderOrchestratorDependencies);
99
90
  /**
100
91
  * Builds normalized route render options before the integration render runs.
101
92
  *
102
93
  * This preparation step validates route-root ownership, resolves page data,
103
- * collects processed assets, captures optional page-root render metadata, and
104
- * produces the page package consumed by downstream HTML transformation.
94
+ * collects processed assets, and produces the page package consumed by downstream
95
+ * HTML transformation.
105
96
  */
106
97
  prepareRenderOptions<C = unknown>(routeOptions: RouteRendererOptions, adapter: RouteRenderOrchestratorAdapter<C>): Promise<IntegrationRendererRenderOptions<C>>;
107
98
  resolveDeclaredPageBrowserGraph(input: {
@@ -109,31 +100,6 @@ export declare class RouteRenderOrchestrator {
109
100
  integrationName: string;
110
101
  collectContribution: (routeFile: string) => Promise<PageBrowserGraphContribution | undefined>;
111
102
  }): Promise<PageBrowserGraphResult | undefined>;
112
- private resolvePageBrowserGraph;
113
- private isHmrEnabled;
114
- private buildPageBrowserGraph;
115
- /**
116
- * Resolves grouped page-browser assets for all routes owned by one integration.
117
- *
118
- * @remarks
119
- * This keeps one shared browser-build result available across sibling routes so
120
- * navigation can reuse the same emitted client graph instead of rebuilding one
121
- * page entry at a time. HMR bypasses this cache because the grouped build must
122
- * reflect the latest source on every request.
123
- */
124
- private resolveGroupedPageBrowserAssets;
125
- /**
126
- * Builds the shared grouped page-browser asset map for one integration.
127
- *
128
- * @remarks
129
- * Each route can declare grouped content-script dependencies that should be
130
- * emitted together. This method collects those declarations across the owning
131
- * integration, runs the grouped processor once, and then maps the emitted
132
- * assets back onto the routes that reference them.
133
- */
134
- private buildGroupedPageBrowserAssets;
135
- private listIntegrationRouteFiles;
136
- private partitionPageBrowserGraphAssets;
137
103
  /**
138
104
  * Captures one route render body as HTML while preserving a replayable body value.
139
105
  */
@@ -147,10 +113,4 @@ export declare class RouteRenderOrchestrator {
147
113
  */
148
114
  executePrepared<C = unknown>(renderOptions: IntegrationRendererRenderOptions<C>, adapter: RouteRenderOrchestratorAdapter<C>): Promise<RouteRenderResult>;
149
115
  private captureRenderedBody;
150
- private collectResolvedTriggers;
151
- private collectUsedIntegrationDependencies;
152
- private collectIntegrationNames;
153
- private buildGlobalInjectorAssets;
154
- private buildEagerSsrLazyAssets;
155
- private collectEagerSsrLazyDependencies;
156
116
  }