@ecopages/core 0.2.0-beta.4 → 0.2.0-beta.40

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 (611) hide show
  1. package/README.md +40 -9
  2. package/package.json +371 -33
  3. package/src/adapters/README.md +6 -2
  4. package/src/adapters/abstract/application-adapter.d.ts +115 -6
  5. package/src/adapters/abstract/application-adapter.js +261 -120
  6. package/src/adapters/abstract/router-adapter.js +12 -4
  7. package/src/adapters/abstract/segment-path-matcher.d.ts +6 -0
  8. package/src/adapters/abstract/segment-path-matcher.js +147 -0
  9. package/src/adapters/abstract/server-adapter.d.ts +16 -2
  10. package/src/adapters/abstract/server-adapter.js +22 -14
  11. package/src/adapters/abstract/ws-pattern-matcher.d.ts +12 -0
  12. package/src/adapters/abstract/ws-pattern-matcher.js +28 -0
  13. package/src/adapters/bun/bun-user-websocket-lifecycle.d.ts +22 -0
  14. package/src/adapters/bun/bun-user-websocket-lifecycle.js +93 -0
  15. package/src/adapters/bun/client-bridge.d.ts +1 -0
  16. package/src/adapters/bun/client-bridge.js +51 -47
  17. package/src/adapters/bun/create-app.d.ts +9 -6
  18. package/src/adapters/bun/create-app.js +171 -130
  19. package/src/adapters/bun/hmr-manager.d.ts +1 -1
  20. package/src/adapters/bun/hmr-manager.js +62 -57
  21. package/src/adapters/bun/index.d.ts +1 -1
  22. package/src/adapters/bun/index.js +2 -8
  23. package/src/adapters/bun/runtime-host.d.ts +1 -1
  24. package/src/adapters/bun/runtime-host.js +61 -54
  25. package/src/adapters/bun/server-adapter.d.ts +91 -41
  26. package/src/adapters/bun/server-adapter.js +566 -426
  27. package/src/adapters/bun/static-preview-host.d.ts +1 -1
  28. package/src/adapters/bun/static-preview-host.js +43 -41
  29. package/src/adapters/create-app.d.ts +13 -11
  30. package/src/adapters/create-app.js +11 -63
  31. package/src/adapters/index.d.ts +2 -2
  32. package/src/adapters/index.js +2 -8
  33. package/src/adapters/node/create-app.d.ts +8 -3
  34. package/src/adapters/node/create-app.js +126 -84
  35. package/src/adapters/node/http-request-bridge.js +147 -106
  36. package/src/adapters/node/node-client-bridge.d.ts +1 -0
  37. package/src/adapters/node/node-client-bridge.js +62 -61
  38. package/src/adapters/node/node-hmr-manager.d.ts +1 -1
  39. package/src/adapters/node/node-hmr-manager.js +58 -48
  40. package/src/adapters/node/runtime-host.d.ts +1 -1
  41. package/src/adapters/node/runtime-host.js +96 -89
  42. package/src/adapters/node/server-adapter-dependencies.js +18 -17
  43. package/src/adapters/node/server-adapter.d.ts +63 -23
  44. package/src/adapters/node/server-adapter.js +346 -297
  45. package/src/adapters/node/static-content-server.d.ts +1 -0
  46. package/src/adapters/node/static-content-server.js +172 -183
  47. package/src/adapters/node/static-preview-host.d.ts +1 -1
  48. package/src/adapters/node/static-preview-host.js +88 -64
  49. package/src/adapters/shared/hmr/dev-transform-entrypoint-registry.d.ts +16 -0
  50. package/src/adapters/shared/hmr/dev-transform-entrypoint-registry.js +32 -0
  51. package/src/adapters/shared/{hmr-html-response.d.ts → hmr/hmr-html-response.d.ts} +2 -2
  52. package/src/adapters/shared/hmr/hmr-html-response.js +50 -0
  53. package/src/adapters/shared/hmr/shared-hmr-manager.d.ts +92 -0
  54. package/src/adapters/shared/hmr/shared-hmr-manager.js +446 -0
  55. package/src/adapters/shared/http/api-request-pipeline.d.ts +23 -0
  56. package/src/adapters/shared/http/api-request-pipeline.js +132 -0
  57. package/src/adapters/shared/{api-response.d.ts → http/api-response.d.ts} +1 -1
  58. package/src/adapters/shared/http/api-response.js +79 -0
  59. package/src/adapters/shared/http/create-body-response.d.ts +12 -0
  60. package/src/adapters/shared/http/create-body-response.js +26 -0
  61. package/src/adapters/shared/http/define-api-handler.d.ts +90 -0
  62. package/src/adapters/shared/http/define-api-handler.js +49 -0
  63. package/src/adapters/shared/{explicit-static-render-preparation.d.ts → http/explicit-static-render-preparation.d.ts} +3 -3
  64. package/src/adapters/shared/http/explicit-static-render-preparation.js +29 -0
  65. package/src/adapters/shared/{explicit-static-route-matcher.d.ts → http/explicit-static-route-matcher.d.ts} +3 -9
  66. package/src/adapters/shared/http/explicit-static-route-matcher.js +59 -0
  67. package/src/adapters/shared/{file-route-middleware-pipeline.d.ts → http/file-route-middleware-pipeline.d.ts} +2 -2
  68. package/src/adapters/shared/http/file-route-middleware-pipeline.js +84 -0
  69. package/src/adapters/shared/{fs-server-response-factory.d.ts → http/fs-server-response-factory.d.ts} +7 -2
  70. package/src/adapters/shared/http/fs-server-response-factory.js +106 -0
  71. package/src/adapters/shared/{fs-server-response-matcher.d.ts → http/fs-server-response-matcher.d.ts} +25 -5
  72. package/src/adapters/shared/http/fs-server-response-matcher.js +258 -0
  73. package/src/adapters/shared/http/run-middleware-chain.d.ts +5 -0
  74. package/src/adapters/shared/http/run-middleware-chain.js +17 -0
  75. package/src/adapters/shared/{application-adapter.d.ts → runtime/application-adapter.d.ts} +2 -2
  76. package/src/adapters/shared/runtime/application-adapter.js +75 -0
  77. package/src/adapters/shared/runtime/collect-dev-prewarm-plan.d.ts +11 -0
  78. package/src/adapters/shared/runtime/collect-dev-prewarm-plan.js +29 -0
  79. package/src/adapters/shared/runtime/copy-runtime-public-dir.d.ts +6 -0
  80. package/src/adapters/shared/runtime/copy-runtime-public-dir.js +27 -0
  81. package/src/adapters/shared/runtime/dev-static-route-prewarm.d.ts +16 -0
  82. package/src/adapters/shared/runtime/dev-static-route-prewarm.js +66 -0
  83. package/src/adapters/shared/runtime/port-manager.d.ts +116 -0
  84. package/src/adapters/shared/runtime/port-manager.js +226 -0
  85. package/src/adapters/shared/{render-context.d.ts → runtime/render-context.d.ts} +2 -2
  86. package/src/adapters/shared/runtime/render-context.js +99 -0
  87. package/src/adapters/shared/{runtime-app-bootstrap.d.ts → runtime/runtime-app-bootstrap.d.ts} +4 -3
  88. package/src/adapters/shared/runtime/runtime-app-bootstrap.js +38 -0
  89. package/src/adapters/shared/runtime/runtime-server-lifecycle.d.ts +45 -0
  90. package/src/adapters/shared/runtime/runtime-server-lifecycle.js +71 -0
  91. package/src/adapters/shared/{server-adapter.d.ts → runtime/server-adapter.d.ts} +31 -50
  92. package/src/adapters/shared/runtime/server-adapter.js +301 -0
  93. package/src/adapters/shared/{server-route-handler.d.ts → runtime/server-route-handler.d.ts} +6 -33
  94. package/src/adapters/shared/runtime/server-route-handler.js +77 -0
  95. package/src/adapters/shared/{server-static-builder.d.ts → runtime/server-static-builder.d.ts} +27 -35
  96. package/src/adapters/shared/runtime/server-static-builder.js +172 -0
  97. package/src/adapters/shared/{static-preview-host.d.ts → runtime/static-preview-host.d.ts} +6 -1
  98. package/src/adapters/shared/ws/node-http-websocket-upgrades.d.ts +21 -0
  99. package/src/adapters/shared/ws/node-http-websocket-upgrades.js +109 -0
  100. package/src/adapters/shared/ws/websocket-lifecycle.d.ts +24 -0
  101. package/src/adapters/shared/ws/websocket-lifecycle.js +62 -0
  102. package/src/build/README.md +191 -31
  103. package/src/build/app-build-manifest-runtime.d.ts +39 -0
  104. package/src/build/app-build-manifest-runtime.js +145 -0
  105. package/src/build/browser/browser-runtime-manifest.js +58 -0
  106. package/src/build/browser/browser-runtime-plugin-helpers.js +34 -0
  107. package/src/build/{browser-runtime-plugin.d.ts → browser/browser-runtime-plugin.d.ts} +1 -1
  108. package/src/build/browser/browser-runtime-plugin.js +216 -0
  109. package/src/build/browser/jsx-ownership-plugins.d.ts +24 -0
  110. package/src/build/browser/jsx-ownership-plugins.js +55 -0
  111. package/src/build/browser/lit-static-render-worker-context.d.ts +2 -0
  112. package/src/build/browser/lit-static-render-worker-context.js +4 -0
  113. package/src/build/build-adapter.d.ts +29 -334
  114. package/src/build/build-adapter.js +273 -237
  115. package/src/build/cache/build-input-fingerprint.d.ts +28 -0
  116. package/src/build/cache/build-input-fingerprint.js +33 -0
  117. package/src/build/cache/cache-constants.d.ts +4 -0
  118. package/src/build/cache/cache-constants.js +4 -0
  119. package/src/build/cache/cache-keys.d.ts +22 -0
  120. package/src/build/cache/cache-keys.js +71 -0
  121. package/src/build/cache/pages-unified-graph-build.d.ts +31 -0
  122. package/src/build/cache/pages-unified-graph-build.js +199 -0
  123. package/src/build/cache/production-build-cache.d.ts +21 -0
  124. package/src/build/cache/production-build-cache.js +56 -0
  125. package/src/build/cache/server-entry-build-cache.d.ts +43 -0
  126. package/src/build/cache/server-entry-build-cache.js +153 -0
  127. package/src/build/contracts/build-contracts.d.ts +96 -0
  128. package/src/build/contracts/build-contracts.js +1 -0
  129. package/src/build/contracts/build-manifest.d.ts +90 -0
  130. package/src/build/contracts/build-manifest.js +64 -0
  131. package/src/build/contracts/build-types.js +1 -0
  132. package/src/build/contracts/content-virtual-modules.d.ts +12 -0
  133. package/src/build/contracts/content-virtual-modules.js +29 -0
  134. package/src/build/{rolldown-adapter-helpers.d.ts → rolldown/rolldown-adapter-helpers.d.ts} +32 -9
  135. package/src/build/rolldown/rolldown-adapter-helpers.js +458 -0
  136. package/src/build/{rolldown-build-adapter.d.ts → rolldown/rolldown-build-adapter.d.ts} +3 -7
  137. package/src/build/rolldown/rolldown-build-adapter.js +57 -0
  138. package/src/build/rolldown/rolldown-build-invocation-metrics.d.ts +12 -0
  139. package/src/build/rolldown/rolldown-build-invocation-metrics.js +39 -0
  140. package/src/build/{rolldown-plugin-bridge.d.ts → rolldown/rolldown-plugin-bridge.d.ts} +16 -2
  141. package/src/build/rolldown/rolldown-plugin-bridge.js +284 -0
  142. package/src/build/rolldown/rolldown-source-transform-pass.d.ts +15 -0
  143. package/src/build/rolldown/rolldown-source-transform-pass.js +70 -0
  144. package/src/build/rolldown/runtime-build-output-normalizer.d.ts +10 -0
  145. package/src/build/rolldown/runtime-build-output-normalizer.js +253 -0
  146. package/src/build/rolldown/server-side-css-shim-plugin.js +58 -0
  147. package/src/build/runtime/build-profile-options.d.ts +7 -0
  148. package/src/build/runtime/build-profile-options.js +37 -0
  149. package/src/build/runtime/build-request-identity.d.ts +17 -0
  150. package/src/build/runtime/build-request-identity.js +79 -0
  151. package/src/build/runtime/build-request-policy.d.ts +58 -0
  152. package/src/build/runtime/build-request-policy.js +84 -0
  153. package/src/build/runtime/build-runtime.d.ts +28 -0
  154. package/src/build/runtime/build-runtime.js +75 -0
  155. package/src/build/runtime/deduping-build-executor.d.ts +21 -0
  156. package/src/build/runtime/deduping-build-executor.js +40 -0
  157. package/src/build/runtime/parallel-build-executor.d.ts +21 -0
  158. package/src/build/runtime/parallel-build-executor.js +60 -0
  159. package/src/build/{serialized-build-executor.d.ts → runtime/serialized-build-executor.d.ts} +1 -1
  160. package/src/build/runtime/serialized-build-executor.js +79 -0
  161. package/src/cache/index.d.ts +2 -1
  162. package/src/cache/index.js +7 -6
  163. package/src/cache/module-parse-cache.d.ts +5 -0
  164. package/src/cache/module-parse-cache.js +122 -67
  165. package/src/cache/module-transform-profiler.d.ts +8 -0
  166. package/src/cache/module-transform-profiler.js +8 -0
  167. package/src/client/navigation-scripts/classification.d.ts +16 -0
  168. package/src/client/navigation-scripts/classification.js +49 -0
  169. package/src/client/navigation-scripts/index.d.ts +3 -0
  170. package/src/client/navigation-scripts/index.js +3 -0
  171. package/src/client/navigation-scripts/navigation-scripts.test.browser.d.ts +1 -0
  172. package/src/client/navigation-scripts/navigation-scripts.test.browser.js +61 -0
  173. package/src/client/navigation-scripts/registry.d.ts +11 -0
  174. package/src/client/navigation-scripts/registry.js +16 -0
  175. package/src/client/navigation-scripts/rerun-queue.d.ts +37 -0
  176. package/src/client/navigation-scripts/rerun-queue.js +90 -0
  177. package/src/client/scroll.d.ts +17 -0
  178. package/src/client/scroll.js +33 -0
  179. package/src/client/scroll.test.browser.d.ts +1 -0
  180. package/src/client/scroll.test.browser.js +31 -0
  181. package/src/client/view-transitions.d.ts +32 -0
  182. package/src/client/view-transitions.js +120 -0
  183. package/src/client/view-transitions.test.browser.d.ts +1 -0
  184. package/src/client/view-transitions.test.browser.js +56 -0
  185. package/src/config/config-builder.d.ts +40 -10
  186. package/src/config/config-builder.js +647 -600
  187. package/src/config/constants.d.ts +1 -0
  188. package/src/config/constants.js +44 -23
  189. package/src/declarations.d.ts +1 -0
  190. package/src/dev/README.md +24 -0
  191. package/src/dev/client-bridge-registry.d.ts +5 -0
  192. package/src/dev/client-bridge-registry.js +10 -0
  193. package/src/dev/dev-client-ownership.d.ts +7 -0
  194. package/src/dev/dev-client-ownership.js +8 -0
  195. package/src/dev/hmr-manager-registry.d.ts +8 -0
  196. package/src/dev/hmr-manager-registry.js +10 -0
  197. package/src/dev/host-runtime.d.ts +3 -0
  198. package/src/dev/host-runtime.js +25 -23
  199. package/src/dev/runtime-server-started-message.d.ts +2 -0
  200. package/src/dev/runtime-server-started-message.js +3 -0
  201. package/src/dev/sc-server.js +106 -103
  202. package/src/dev/transform-server/dev-transform-bundler.d.ts +24 -0
  203. package/src/dev/transform-server/dev-transform-bundler.js +79 -0
  204. package/src/dev/transform-server/dev-transform-externalize-plugin.d.ts +12 -0
  205. package/src/dev/transform-server/dev-transform-externalize-plugin.js +29 -0
  206. package/src/dev/transform-server/dev-transform-import-rewriter.d.ts +16 -0
  207. package/src/dev/transform-server/dev-transform-import-rewriter.js +126 -0
  208. package/src/dev/transform-server/dev-transform-module-kind.d.ts +13 -0
  209. package/src/dev/transform-server/dev-transform-module-kind.js +17 -0
  210. package/src/dev/transform-server/dev-transform-runtime-specifiers.d.ts +5 -0
  211. package/src/dev/transform-server/dev-transform-runtime-specifiers.js +16 -0
  212. package/src/dev/transform-server/dev-transform-server.d.ts +41 -0
  213. package/src/dev/transform-server/dev-transform-server.js +191 -0
  214. package/src/dev/transform-server/dev-transform-url.d.ts +13 -0
  215. package/src/dev/transform-server/dev-transform-url.js +58 -0
  216. package/src/dev/transform-server/dev-transform-vendor-registry.d.ts +28 -0
  217. package/src/dev/transform-server/dev-transform-vendor-registry.js +158 -0
  218. package/src/dev/transform-server/index.d.ts +6 -0
  219. package/src/dev/transform-server/index.js +4 -0
  220. package/src/dev/transform-server/types.d.ts +15 -0
  221. package/src/dev/transform-server/types.js +1 -0
  222. package/src/dev-toolbar/README.md +52 -0
  223. package/src/dev-toolbar/define-dev-tool.d.ts +21 -0
  224. package/src/dev-toolbar/define-dev-tool.js +9 -0
  225. package/src/dev-toolbar/dev-toolbar-config.d.ts +25 -0
  226. package/src/dev-toolbar/dev-toolbar-config.js +19 -0
  227. package/src/dev-toolbar/dev-toolbar-host.d.ts +49 -0
  228. package/src/dev-toolbar/dev-toolbar-host.js +117 -0
  229. package/src/dev-toolbar/dev-toolbar-html-response.d.ts +11 -0
  230. package/src/dev-toolbar/dev-toolbar-html-response.js +14 -0
  231. package/src/dev-toolbar/dev-toolbar-manifest-contract.d.ts +22 -0
  232. package/src/dev-toolbar/dev-toolbar-manifest-contract.js +2 -0
  233. package/src/dev-toolbar/dev-toolbar-manifest.d.ts +15 -0
  234. package/src/dev-toolbar/dev-toolbar-manifest.js +52 -0
  235. package/src/dev-toolbar/dev-toolbar-package.d.ts +34 -0
  236. package/src/dev-toolbar/dev-toolbar-package.js +78 -0
  237. package/src/dev-toolbar/dev-toolbar-runtime-paths.d.ts +10 -0
  238. package/src/dev-toolbar/dev-toolbar-runtime-paths.js +13 -0
  239. package/src/diagnostics/request-build-dedupe.d.ts +18 -0
  240. package/src/diagnostics/request-build-dedupe.js +39 -0
  241. package/src/diagnostics/request-pipeline-metrics.d.ts +38 -0
  242. package/src/diagnostics/request-pipeline-metrics.js +121 -0
  243. package/src/diagnostics/startup-trace.d.ts +81 -0
  244. package/src/diagnostics/startup-trace.js +281 -0
  245. package/src/eco/README.md +17 -0
  246. package/src/eco/component-identity.d.ts +13 -0
  247. package/src/eco/component-identity.js +18 -0
  248. package/src/eco/eco-declared-component.d.ts +15 -0
  249. package/src/eco/eco-declared-component.js +23 -0
  250. package/src/eco/eco.browser.js +63 -70
  251. package/src/eco/eco.js +163 -97
  252. package/src/eco/eco.types.d.ts +47 -8
  253. package/src/eco/eco.types.js +5 -0
  254. package/src/eco/eco.utils.d.ts +1 -1
  255. package/src/eco/eco.utils.js +1 -10
  256. package/src/eco/global-injector-map.js +55 -41
  257. package/src/eco/lazy-injector-map.js +90 -60
  258. package/src/eco/module-dependencies.js +52 -44
  259. package/src/eco/page-layout-normalization.d.ts +21 -0
  260. package/src/eco/page-layout-normalization.js +69 -0
  261. package/src/env.d.ts +2 -0
  262. package/src/errors/http-error.d.ts +8 -0
  263. package/src/errors/http-error.js +66 -49
  264. package/src/errors/index.d.ts +1 -0
  265. package/src/errors/index.js +3 -6
  266. package/src/errors/locals-access-error.js +5 -8
  267. package/src/errors/undeclared-component-dependency-error.d.ts +11 -0
  268. package/src/errors/undeclared-component-dependency-error.js +17 -0
  269. package/src/global/app-logger.js +3 -6
  270. package/src/hmr/README.md +21 -0
  271. package/src/hmr/client/hmr-runtime.js +119 -110
  272. package/src/hmr/client/module-update.d.ts +13 -0
  273. package/src/hmr/client/module-update.js +39 -0
  274. package/src/hmr/hmr-asset-paths.d.ts +14 -0
  275. package/src/hmr/hmr-asset-paths.js +22 -0
  276. package/src/hmr/hmr-entrypoint-output.d.ts +21 -0
  277. package/src/hmr/hmr-entrypoint-output.js +34 -0
  278. package/src/hmr/hmr-file-change-prep.d.ts +10 -0
  279. package/src/hmr/hmr-file-change-prep.js +14 -0
  280. package/src/hmr/hmr-registered-entrypoints-context.d.ts +7 -0
  281. package/src/hmr/hmr-registered-entrypoints-context.js +1 -0
  282. package/src/hmr/hmr-runtime-paths.d.ts +10 -0
  283. package/src/hmr/hmr-runtime-paths.js +13 -0
  284. package/src/hmr/hmr-strategy.d.ts +9 -0
  285. package/src/hmr/hmr-strategy.js +113 -42
  286. package/src/hmr/strategies/default-hmr-strategy.js +55 -33
  287. package/src/hmr/strategies/js-hmr-strategy.d.ts +6 -97
  288. package/src/hmr/strategies/js-hmr-strategy.js +107 -167
  289. package/src/hmr/strategies/server-rendered-template-hmr-strategy.d.ts +17 -0
  290. package/src/hmr/strategies/server-rendered-template-hmr-strategy.js +35 -0
  291. package/src/index.browser.d.ts +1 -0
  292. package/src/index.browser.js +2 -4
  293. package/src/index.d.ts +4 -1
  294. package/src/index.js +7 -21
  295. package/src/integrations/ghtml/ghtml-renderer.d.ts +2 -6
  296. package/src/integrations/ghtml/ghtml-renderer.js +12 -56
  297. package/src/integrations/ghtml/ghtml.constants.js +1 -4
  298. package/src/integrations/ghtml/ghtml.plugin.d.ts +3 -16
  299. package/src/integrations/ghtml/ghtml.plugin.js +10 -20
  300. package/src/islands/README.md +25 -0
  301. package/src/islands/island-host.d.ts +37 -0
  302. package/src/islands/island-host.js +55 -0
  303. package/src/plugins/README.md +2 -1
  304. package/src/plugins/alias-resolver-cache.d.ts +6 -9
  305. package/src/plugins/alias-resolver-cache.js +114 -97
  306. package/src/plugins/alias-resolver-plugin.d.ts +3 -3
  307. package/src/plugins/alias-resolver-plugin.js +35 -62
  308. package/src/plugins/define-integration.d.ts +26 -0
  309. package/src/plugins/define-integration.js +20 -0
  310. package/src/plugins/eco-component-meta-plugin.d.ts +6 -102
  311. package/src/plugins/eco-component-meta-plugin.js +120 -162
  312. package/src/plugins/foreign-jsx-override-plugin.d.ts +1 -1
  313. package/src/plugins/foreign-jsx-override-plugin.js +49 -37
  314. package/src/plugins/integration-plugin.d.ts +43 -14
  315. package/src/plugins/integration-plugin.js +212 -190
  316. package/src/plugins/jsx-import-source.utils.d.ts +8 -0
  317. package/src/plugins/jsx-import-source.utils.js +21 -0
  318. package/src/plugins/processor.d.ts +71 -12
  319. package/src/plugins/processor.js +168 -130
  320. package/src/plugins/runtime-capability.js +1 -0
  321. package/src/plugins/source-transform.d.ts +32 -1
  322. package/src/plugins/source-transform.js +112 -60
  323. package/src/plugins/tsconfig-import-resolver.d.ts +35 -0
  324. package/src/plugins/tsconfig-import-resolver.js +235 -0
  325. package/src/route-renderer/GRAPH.md +26 -32
  326. package/src/route-renderer/README.md +54 -33
  327. package/src/route-renderer/orchestration/document-shell/document-shell-render.service.d.ts +107 -0
  328. package/src/route-renderer/orchestration/document-shell/document-shell-render.service.js +155 -0
  329. package/src/route-renderer/orchestration/document-shell/layout-shell-props.service.d.ts +20 -0
  330. package/src/route-renderer/orchestration/document-shell/layout-shell-props.service.js +37 -0
  331. package/src/route-renderer/orchestration/{component-render-context.d.ts → foreign-child/component-render-context.d.ts} +8 -15
  332. package/src/route-renderer/orchestration/foreign-child/component-render-context.js +196 -0
  333. package/src/route-renderer/orchestration/{render-output.utils.d.ts → foreign-child/foreign-child-output.utils.d.ts} +17 -7
  334. package/src/route-renderer/orchestration/foreign-child/foreign-child-output.utils.js +191 -0
  335. package/src/route-renderer/orchestration/{foreign-subtree-execution.service.d.ts → foreign-child/foreign-subtree-execution.service.d.ts} +64 -34
  336. package/src/route-renderer/orchestration/foreign-child/foreign-subtree-execution.service.js +354 -0
  337. package/src/route-renderer/orchestration/foreign-child/owning-renderer-resolution.d.ts +19 -0
  338. package/src/route-renderer/orchestration/foreign-child/owning-renderer-resolution.js +36 -0
  339. package/src/route-renderer/orchestration/integration-renderer.d.ts +41 -151
  340. package/src/route-renderer/orchestration/integration-renderer.js +798 -988
  341. package/src/route-renderer/orchestration/integration-renderer.test-fixtures.d.ts +75 -0
  342. package/src/route-renderer/orchestration/integration-renderer.test-fixtures.js +173 -0
  343. package/src/route-renderer/orchestration/ownership-graph/component-graph-collectors.d.ts +10 -0
  344. package/src/route-renderer/orchestration/ownership-graph/component-graph-collectors.js +132 -0
  345. package/src/route-renderer/orchestration/ownership-graph/component-graph.d.ts +34 -0
  346. package/src/route-renderer/orchestration/ownership-graph/component-graph.js +89 -0
  347. package/src/route-renderer/orchestration/{ownership-validation.service.d.ts → ownership-graph/ownership-validation.service.d.ts} +6 -2
  348. package/src/route-renderer/orchestration/ownership-graph/ownership-validation.service.js +77 -0
  349. package/src/route-renderer/orchestration/page-browser-graph/global-injector-assets.service.d.ts +7 -0
  350. package/src/route-renderer/orchestration/page-browser-graph/global-injector-assets.service.js +30 -0
  351. package/src/route-renderer/orchestration/page-browser-graph/grouped-graph-build-plan.d.ts +15 -0
  352. package/src/route-renderer/orchestration/page-browser-graph/grouped-graph-build-plan.js +9 -0
  353. package/src/route-renderer/orchestration/page-browser-graph/page-browser-graph-contribution.merge.d.ts +5 -0
  354. package/src/route-renderer/orchestration/page-browser-graph/page-browser-graph-contribution.merge.js +30 -0
  355. package/src/route-renderer/orchestration/page-browser-graph/page-browser-graph-merge.utils.d.ts +12 -0
  356. package/src/route-renderer/orchestration/page-browser-graph/page-browser-graph-merge.utils.js +32 -0
  357. package/src/route-renderer/orchestration/page-browser-graph/page-browser-graph-session.d.ts +126 -0
  358. package/src/route-renderer/orchestration/page-browser-graph/page-browser-graph-session.js +542 -0
  359. package/src/route-renderer/orchestration/page-browser-graph/page-browser-graph.service.d.ts +47 -0
  360. package/src/route-renderer/orchestration/page-browser-graph/page-browser-graph.service.js +232 -0
  361. package/src/route-renderer/orchestration/{processed-asset-dedupe.d.ts → page-browser-graph/processed-asset-dedupe.d.ts} +1 -1
  362. package/src/route-renderer/orchestration/page-browser-graph/processed-asset-dedupe.js +23 -0
  363. package/src/route-renderer/orchestration/page-browser-graph/route-instance-key.d.ts +29 -0
  364. package/src/route-renderer/orchestration/page-browser-graph/route-instance-key.js +54 -0
  365. package/src/route-renderer/orchestration/route-pipeline/integration-route-render-adapter.d.ts +38 -0
  366. package/src/route-renderer/orchestration/route-pipeline/integration-route-render-adapter.js +26 -0
  367. package/src/route-renderer/orchestration/route-pipeline/marker-artifact.utils.d.ts +6 -0
  368. package/src/route-renderer/orchestration/route-pipeline/marker-artifact.utils.js +25 -0
  369. package/src/route-renderer/orchestration/route-pipeline/robots-meta.contribution.d.ts +15 -0
  370. package/src/route-renderer/orchestration/route-pipeline/robots-meta.contribution.js +43 -0
  371. package/src/route-renderer/orchestration/route-pipeline/route-html-finalization.service.d.ts +25 -0
  372. package/src/route-renderer/orchestration/route-pipeline/route-html-finalization.service.js +44 -0
  373. package/src/route-renderer/orchestration/route-pipeline/route-prepared-options.builder.d.ts +26 -0
  374. package/src/route-renderer/orchestration/route-pipeline/route-prepared-options.builder.js +49 -0
  375. package/src/route-renderer/orchestration/route-pipeline/route-prepared-options.utils.d.ts +4 -0
  376. package/src/route-renderer/orchestration/route-pipeline/route-prepared-options.utils.js +30 -0
  377. package/src/route-renderer/orchestration/{route-render-orchestrator.d.ts → route-pipeline/route-render-orchestrator.d.ts} +24 -54
  378. package/src/route-renderer/orchestration/route-pipeline/route-render-orchestrator.js +215 -0
  379. package/src/route-renderer/orchestration/string-markup-renderer.d.ts +14 -0
  380. package/src/route-renderer/orchestration/string-markup-renderer.js +52 -0
  381. package/src/route-renderer/page-loading/component-dependency-collection.js +121 -121
  382. package/src/route-renderer/page-loading/declared-asset-collection.js +66 -94
  383. package/src/route-renderer/page-loading/dependency-resolver.js +101 -104
  384. package/src/route-renderer/page-loading/ecopages-virtual-imports.d.ts +1 -0
  385. package/src/route-renderer/page-loading/ecopages-virtual-imports.js +64 -51
  386. package/src/route-renderer/page-loading/file-scoped-dependency-components.d.ts +42 -0
  387. package/src/route-renderer/page-loading/file-scoped-dependency-components.js +94 -0
  388. package/src/route-renderer/page-loading/lazy-entry-collection.js +75 -98
  389. package/src/route-renderer/page-loading/lazy-trigger-planning.js +47 -36
  390. package/src/route-renderer/page-loading/module-declaration-aggregation.js +39 -28
  391. package/src/route-renderer/page-loading/module-declaration-scripts.js +10 -15
  392. package/src/route-renderer/page-loading/page-dependency-bundling.js +156 -113
  393. package/src/route-renderer/page-loading/page-module-loader.d.ts +2 -1
  394. package/src/route-renderer/page-loading/page-module-loader.js +136 -124
  395. package/src/route-renderer/page-loading/resolved-page-dependencies.d.ts +12 -0
  396. package/src/route-renderer/page-loading/resolved-page-dependencies.js +38 -0
  397. package/src/route-renderer/route-renderer.js +74 -76
  398. package/src/router/README.md +31 -0
  399. package/src/router/client/link-intent.d.ts +11 -21
  400. package/src/router/client/link-intent.js +56 -30
  401. package/src/router/client/link-intent.test.browser.js +50 -39
  402. package/src/router/client/link-navigation-policy.d.ts +45 -0
  403. package/src/router/client/link-navigation-policy.js +122 -0
  404. package/src/router/client/link-navigation-policy.test.browser.d.ts +1 -0
  405. package/src/router/client/link-navigation-policy.test.browser.js +82 -0
  406. package/src/router/client/navigation-coordinator.d.ts +1 -1
  407. package/src/router/client/navigation-coordinator.js +235 -201
  408. package/src/router/client/navigation-lifecycle.d.ts +55 -0
  409. package/src/router/client/navigation-lifecycle.js +50 -0
  410. package/src/router/client/navigation-lifecycle.test.browser.d.ts +1 -0
  411. package/src/router/client/navigation-lifecycle.test.browser.js +118 -0
  412. package/src/router/server/route-registry.js +237 -242
  413. package/src/services/README.md +5 -0
  414. package/src/services/assets/asset-processing-service/asset-dependency-keys.d.ts +13 -0
  415. package/src/services/assets/asset-processing-service/asset-dependency-keys.js +64 -50
  416. package/src/services/assets/asset-processing-service/asset-processing.service.d.ts +7 -1
  417. package/src/services/assets/asset-processing-service/asset-processing.service.js +308 -268
  418. package/src/services/assets/asset-processing-service/asset.factory.js +78 -81
  419. package/src/services/assets/asset-processing-service/assets.types.d.ts +1 -1
  420. package/src/services/assets/asset-processing-service/assets.types.js +1 -0
  421. package/src/services/assets/asset-processing-service/browser-runtime-asset.factory.d.ts +2 -1
  422. package/src/services/assets/asset-processing-service/browser-runtime-asset.factory.js +57 -45
  423. package/src/services/assets/asset-processing-service/browser-runtime-entry-resolution.d.ts +52 -0
  424. package/src/services/assets/asset-processing-service/browser-runtime-entry-resolution.js +115 -0
  425. package/src/services/assets/asset-processing-service/browser-runtime-entry.factory.d.ts +4 -2
  426. package/src/services/assets/asset-processing-service/browser-runtime-entry.factory.js +53 -38
  427. package/src/services/assets/asset-processing-service/finalize-processed-asset.d.ts +3 -0
  428. package/src/services/assets/asset-processing-service/finalize-processed-asset.js +5 -0
  429. package/src/services/assets/asset-processing-service/grouped-content-bundles.d.ts +2 -1
  430. package/src/services/assets/asset-processing-service/grouped-content-bundles.js +85 -60
  431. package/src/services/assets/asset-processing-service/index.d.ts +2 -0
  432. package/src/services/assets/asset-processing-service/index.js +8 -6
  433. package/src/services/assets/asset-processing-service/inline-content-script-body.d.ts +11 -0
  434. package/src/services/assets/asset-processing-service/inline-content-script-body.js +23 -0
  435. package/src/services/assets/asset-processing-service/materialize-content-script-asset.d.ts +9 -0
  436. package/src/services/assets/asset-processing-service/materialize-content-script-asset.js +22 -0
  437. package/src/services/assets/asset-processing-service/page-package.js +70 -72
  438. package/src/services/assets/asset-processing-service/processor.interface.js +7 -5
  439. package/src/services/assets/asset-processing-service/processor.registry.js +11 -14
  440. package/src/services/assets/asset-processing-service/processors/base/base-processor.js +59 -62
  441. package/src/services/assets/asset-processing-service/processors/base/base-script-processor.d.ts +0 -2
  442. package/src/services/assets/asset-processing-service/processors/base/base-script-processor.js +102 -130
  443. package/src/services/assets/asset-processing-service/processors/index.js +5 -5
  444. package/src/services/assets/asset-processing-service/processors/script/content-script.processor.d.ts +8 -0
  445. package/src/services/assets/asset-processing-service/processors/script/content-script.processor.js +111 -111
  446. package/src/services/assets/asset-processing-service/processors/script/file-script.processor.d.ts +0 -1
  447. package/src/services/assets/asset-processing-service/processors/script/file-script.processor.js +95 -94
  448. package/src/services/assets/asset-processing-service/processors/script/node-module-script.processor.js +136 -121
  449. package/src/services/assets/asset-processing-service/processors/stylesheet/content-stylesheet.processor.d.ts +0 -3
  450. package/src/services/assets/asset-processing-service/processors/stylesheet/content-stylesheet.processor.js +26 -57
  451. package/src/services/assets/asset-processing-service/processors/stylesheet/file-stylesheet.processor.d.ts +0 -3
  452. package/src/services/assets/asset-processing-service/processors/stylesheet/file-stylesheet.processor.js +33 -67
  453. package/src/services/assets/asset-processing-service/processors/stylesheet/stylesheet-processor-pipeline.d.ts +2 -0
  454. package/src/services/assets/asset-processing-service/processors/stylesheet/stylesheet-processor-pipeline.js +44 -0
  455. package/src/services/assets/asset-processing-service/resolve-integration-plugin.d.ts +4 -0
  456. package/src/services/assets/asset-processing-service/resolve-integration-plugin.js +15 -0
  457. package/src/services/assets/asset-processing-service/ungrouped-dependency-processing.d.ts +0 -1
  458. package/src/services/assets/asset-processing-service/ungrouped-dependency-processing.js +27 -44
  459. package/src/services/assets/browser-bundle.service.d.ts +28 -30
  460. package/src/services/assets/browser-bundle.service.js +54 -40
  461. package/src/services/cache/cache.types.d.ts +4 -2
  462. package/src/services/cache/cache.types.js +5 -0
  463. package/src/services/cache/html-page-cache-dependency-index.d.ts +34 -0
  464. package/src/services/cache/html-page-cache-dependency-index.js +88 -0
  465. package/src/services/cache/index.d.ts +2 -0
  466. package/src/services/cache/index.js +8 -7
  467. package/src/services/cache/memory-cache-store.js +101 -89
  468. package/src/services/cache/page-cache-service.d.ts +31 -1
  469. package/src/services/cache/page-cache-service.js +237 -150
  470. package/src/services/cache/page-request-cache-coordinator.service.js +106 -102
  471. package/src/services/html/html-rewriter-provider.service.js +61 -61
  472. package/src/services/html/html-transformer.service.d.ts +1 -1
  473. package/src/services/html/html-transformer.service.js +249 -266
  474. package/src/services/invalidation/development-invalidation.service.d.ts +25 -2
  475. package/src/services/invalidation/development-invalidation.service.js +239 -175
  476. package/src/services/module-loading/README.md +52 -0
  477. package/src/services/module-loading/app-module-loader.service.js +1 -0
  478. package/src/services/module-loading/app-server-module-transpiler.service.d.ts +8 -0
  479. package/src/services/module-loading/app-server-module-transpiler.service.js +103 -118
  480. package/src/services/module-loading/collection-server-module-build.service.d.ts +19 -0
  481. package/src/services/module-loading/collection-server-module-build.service.js +83 -0
  482. package/src/services/module-loading/host-module-loader-registry.js +6 -11
  483. package/src/services/module-loading/module-loading-types.js +1 -0
  484. package/src/services/module-loading/page-module-import.service.d.ts +11 -13
  485. package/src/services/module-loading/page-module-import.service.js +222 -184
  486. package/src/services/module-loading/route-module-build-cache-registry.d.ts +24 -0
  487. package/src/services/module-loading/route-module-build-cache-registry.js +51 -0
  488. package/src/services/module-loading/route-module-build-cache.d.ts +4 -0
  489. package/src/services/module-loading/route-module-build-cache.js +3 -0
  490. package/src/services/module-loading/route-module-build-cache.store.d.ts +57 -0
  491. package/src/services/module-loading/route-module-build-cache.store.js +202 -0
  492. package/src/services/module-loading/route-module-build-manifest.d.ts +57 -0
  493. package/src/services/module-loading/route-module-build-manifest.js +60 -0
  494. package/src/services/module-loading/route-module-dependency-hasher.d.ts +81 -0
  495. package/src/services/module-loading/route-module-dependency-hasher.js +148 -0
  496. package/src/services/module-loading/server-module-transpiler.service.d.ts +1 -3
  497. package/src/services/module-loading/server-module-transpiler.service.js +65 -62
  498. package/src/services/module-loading/source-module-support.js +15 -7
  499. package/src/services/runtime-state/dev-graph.service.js +165 -157
  500. package/src/services/runtime-state/entrypoint-dependency-graph.service.js +85 -76
  501. package/src/services/runtime-state/server-invalidation-state.service.js +38 -30
  502. package/src/services/validation/schema-validation-service.d.ts +1 -4
  503. package/src/services/validation/schema-validation-service.js +156 -95
  504. package/src/services/validation/standard-schema.types.d.ts +9 -62
  505. package/src/services/validation/standard-schema.types.js +1 -0
  506. package/src/services/validation/validate-standard-schema.d.ts +7 -0
  507. package/src/services/validation/validate-standard-schema.js +14 -0
  508. package/src/static-site-generator/README.md +41 -0
  509. package/src/static-site-generator/production-page-browser-graph-prebuild.d.ts +32 -0
  510. package/src/static-site-generator/production-page-browser-graph-prebuild.js +57 -0
  511. package/src/static-site-generator/sitemap-routes.d.ts +14 -0
  512. package/src/static-site-generator/sitemap-routes.js +36 -0
  513. package/src/static-site-generator/sitemap.d.ts +15 -0
  514. package/src/static-site-generator/sitemap.js +42 -0
  515. package/src/static-site-generator/static-build-invalidation.d.ts +10 -0
  516. package/src/static-site-generator/static-build-invalidation.js +37 -0
  517. package/src/static-site-generator/static-export-context.d.ts +30 -0
  518. package/src/static-site-generator/static-export-context.js +1 -0
  519. package/src/static-site-generator/static-site-generator.d.ts +43 -25
  520. package/src/static-site-generator/static-site-generator.js +536 -294
  521. package/src/types/internal-types.d.ts +59 -13
  522. package/src/types/internal-types.js +1 -0
  523. package/src/types/public-types.d.ts +310 -95
  524. package/src/types/public-types.js +1 -0
  525. package/src/utils/deep-merge.js +39 -26
  526. package/src/utils/ecopages-route-info.d.ts +26 -0
  527. package/src/utils/ecopages-route-info.js +30 -0
  528. package/src/utils/hash.js +3 -6
  529. package/src/utils/html-escaping.d.ts +7 -0
  530. package/src/utils/html-escaping.js +22 -5
  531. package/src/utils/html.js +1 -4
  532. package/src/utils/invariant.js +11 -10
  533. package/src/utils/locals-utils.js +32 -22
  534. package/src/utils/parse-cli-args.d.ts +2 -0
  535. package/src/utils/parse-cli-args.js +73 -59
  536. package/src/utils/path-pattern.d.ts +23 -0
  537. package/src/utils/path-pattern.js +42 -0
  538. package/src/utils/path-utils.module.js +8 -11
  539. package/src/utils/resolve-entry-file.js +70 -38
  540. package/src/utils/resolve-work-dir.js +23 -27
  541. package/src/utils/runtime.js +24 -33
  542. package/src/utils/server-utils.module.d.ts +3 -2
  543. package/src/utils/server-utils.module.js +60 -53
  544. package/src/utils/static-file-extensions.d.ts +12 -0
  545. package/src/utils/static-file-extensions.js +54 -0
  546. package/src/watchers/project-watcher-ignore.d.ts +11 -0
  547. package/src/watchers/project-watcher-ignore.js +17 -0
  548. package/src/watchers/project-watcher.d.ts +29 -6
  549. package/src/watchers/project-watcher.js +402 -257
  550. package/src/watchers/project-watcher.test-helpers.js +45 -50
  551. package/src/adapters/shared/api-response.js +0 -96
  552. package/src/adapters/shared/application-adapter.js +0 -90
  553. package/src/adapters/shared/define-api-handler.d.ts +0 -25
  554. package/src/adapters/shared/define-api-handler.js +0 -15
  555. package/src/adapters/shared/explicit-static-render-preparation.js +0 -26
  556. package/src/adapters/shared/explicit-static-route-matcher.js +0 -101
  557. package/src/adapters/shared/file-route-middleware-pipeline.js +0 -90
  558. package/src/adapters/shared/fs-server-response-factory.js +0 -81
  559. package/src/adapters/shared/fs-server-response-matcher.js +0 -186
  560. package/src/adapters/shared/hmr-entrypoint-registrar.d.ts +0 -55
  561. package/src/adapters/shared/hmr-entrypoint-registrar.js +0 -87
  562. package/src/adapters/shared/hmr-html-response.js +0 -33
  563. package/src/adapters/shared/render-context.js +0 -93
  564. package/src/adapters/shared/runtime-app-bootstrap.js +0 -46
  565. package/src/adapters/shared/runtime-host.js +0 -0
  566. package/src/adapters/shared/server-adapter.js +0 -436
  567. package/src/adapters/shared/server-route-handler.js +0 -111
  568. package/src/adapters/shared/server-static-builder.js +0 -162
  569. package/src/adapters/shared/shared-hmr-manager.d.ts +0 -59
  570. package/src/adapters/shared/shared-hmr-manager.js +0 -241
  571. package/src/adapters/shared/static-preview-host.js +0 -0
  572. package/src/build/browser-runtime-manifest.js +0 -61
  573. package/src/build/browser-runtime-plugin-helpers.js +0 -14
  574. package/src/build/browser-runtime-plugin.js +0 -173
  575. package/src/build/build-manifest.d.ts +0 -33
  576. package/src/build/build-manifest.js +0 -49
  577. package/src/build/build-types.js +0 -0
  578. package/src/build/rolldown-adapter-helpers.js +0 -265
  579. package/src/build/rolldown-build-adapter.js +0 -65
  580. package/src/build/rolldown-dev-build-adapter.d.ts +0 -82
  581. package/src/build/rolldown-dev-build-adapter.js +0 -166
  582. package/src/build/rolldown-plugin-bridge.js +0 -199
  583. package/src/build/runtime-build-executor.d.ts +0 -21
  584. package/src/build/runtime-build-executor.js +0 -19
  585. package/src/build/runtime-build-output-normalizer.d.ts +0 -3
  586. package/src/build/runtime-build-output-normalizer.js +0 -111
  587. package/src/build/serialized-build-executor.js +0 -63
  588. package/src/build/server-side-css-shim-plugin.js +0 -35
  589. package/src/hmr/hmr.postcss.test.e2e.js +0 -31
  590. package/src/hmr/hmr.test.e2e.js +0 -43
  591. package/src/route-renderer/orchestration/component-render-context.js +0 -147
  592. package/src/route-renderer/orchestration/declared-ownership-graph.d.ts +0 -18
  593. package/src/route-renderer/orchestration/declared-ownership-graph.js +0 -34
  594. package/src/route-renderer/orchestration/foreign-subtree-execution.service.js +0 -233
  595. package/src/route-renderer/orchestration/ownership-planning.service.d.ts +0 -24
  596. package/src/route-renderer/orchestration/ownership-planning.service.js +0 -63
  597. package/src/route-renderer/orchestration/ownership-validation.service.js +0 -53
  598. package/src/route-renderer/orchestration/processed-asset-dedupe.js +0 -27
  599. package/src/route-renderer/orchestration/queued-foreign-subtree-resolution.service.d.ts +0 -91
  600. package/src/route-renderer/orchestration/queued-foreign-subtree-resolution.service.js +0 -170
  601. package/src/route-renderer/orchestration/render-output.utils.js +0 -171
  602. package/src/route-renderer/orchestration/route-render-orchestrator.js +0 -577
  603. package/src/route-renderer/orchestration/template-serialization.d.ts +0 -38
  604. package/src/route-renderer/orchestration/template-serialization.js +0 -45
  605. /package/src/adapters/shared/{runtime-host.d.ts → runtime/runtime-host.d.ts} +0 -0
  606. /package/src/{hmr/hmr.postcss.test.e2e.d.ts → adapters/shared/runtime/runtime-host.js} +0 -0
  607. /package/src/{hmr/hmr.test.e2e.d.ts → adapters/shared/runtime/static-preview-host.js} +0 -0
  608. /package/src/build/{browser-runtime-manifest.d.ts → browser/browser-runtime-manifest.d.ts} +0 -0
  609. /package/src/build/{browser-runtime-plugin-helpers.d.ts → browser/browser-runtime-plugin-helpers.d.ts} +0 -0
  610. /package/src/build/{build-types.d.ts → contracts/build-types.d.ts} +0 -0
  611. /package/src/build/{server-side-css-shim-plugin.d.ts → rolldown/server-side-css-shim-plugin.d.ts} +0 -0
@@ -0,0 +1,232 @@
1
+ import path from 'node:path';
2
+ import {} from '../../../services/assets/asset-processing-service/index.js';
3
+ import { appLogger } from '../../../global/app-logger.js';
4
+ import { startupTrace } from '../../../diagnostics/startup-trace.js';
5
+ import { collectPageBrowserGraphDependencyPaths, createPageBrowserGraphEntryFingerprint, getAppPageBrowserGraphSession, } from './page-browser-graph-session.js';
6
+ import { createRouteGraphLookupKey } from './route-instance-key.js';
7
+ function isGroupedContentScriptAsset(asset) {
8
+ return asset.kind === 'script' && asset.source === 'content' && Boolean(asset.groupedBundle?.id);
9
+ }
10
+ function getGroupedBundleAssetKey(groupedBundle) {
11
+ return `${groupedBundle.id}:${groupedBundle.entryName}`;
12
+ }
13
+ /**
14
+ * Resolves declarative page browser graph assets for one route and integration.
15
+ */
16
+ export class PageBrowserGraphService {
17
+ appConfig;
18
+ assetProcessingService;
19
+ constructor(appConfig, assetProcessingService) {
20
+ this.appConfig = appConfig;
21
+ this.assetProcessingService = assetProcessingService;
22
+ }
23
+ async resolvePageBrowserGraph(input) {
24
+ return await this.getOrBuild(input);
25
+ }
26
+ /**
27
+ * Returns dependency paths recorded for one resolved Page Browser Graph.
28
+ */
29
+ getDependencyPathsForRoute(input) {
30
+ const policy = input.policy ?? this.resolveGraphPolicy();
31
+ return getAppPageBrowserGraphSession(this.appConfig).getDependencyPathsByRoute(input.integrationName, input.routeFile, policy, input.dependencyInstanceKey ?? '');
32
+ }
33
+ /**
34
+ * Resolves or builds one Page Browser Graph under the given policy.
35
+ */
36
+ async getOrBuild(input) {
37
+ const policy = input.policy ?? this.resolveGraphPolicy();
38
+ const session = getAppPageBrowserGraphSession(this.appConfig);
39
+ const dependencyInstanceKey = input.dependencyInstanceKey ?? '';
40
+ if (!this.isHmrEnabled()) {
41
+ const cachedByRoute = session.getGraphByRoute(input.integrationName, input.routeFile, policy, dependencyInstanceKey);
42
+ if (cachedByRoute) {
43
+ return cachedByRoute;
44
+ }
45
+ }
46
+ const contribution = await input.collectContribution();
47
+ if (!contribution) {
48
+ return undefined;
49
+ }
50
+ const entryFingerprint = createPageBrowserGraphEntryFingerprint(contribution);
51
+ return await session.resolveGraph({
52
+ integrationName: input.integrationName,
53
+ routeFile: input.routeFile,
54
+ dependencyInstanceKey,
55
+ entryFingerprint,
56
+ policy,
57
+ }, collectPageBrowserGraphDependencyPaths(input.routeFile, contribution, contribution.assets ?? []), async () => this.buildPageBrowserGraphRecord(input, contribution));
58
+ }
59
+ resolveGraphPolicy() {
60
+ return this.isHmrEnabled() ? 'development' : 'production';
61
+ }
62
+ isHmrEnabled() {
63
+ return (typeof this.assetProcessingService.getHmrManager === 'function' &&
64
+ this.assetProcessingService.getHmrManager()?.isEnabled() === true);
65
+ }
66
+ async buildPageBrowserGraphRecord(input, contribution) {
67
+ const result = await this.materializePageBrowserGraph(input, contribution);
68
+ if (!result) {
69
+ return undefined;
70
+ }
71
+ startupTrace.markFirstPageBrowserGraphReady(getAppPageBrowserGraphSession(this.appConfig).getBuildCount());
72
+ return result;
73
+ }
74
+ async materializePageBrowserGraph(input, contribution) {
75
+ const groupedDependencies = (contribution.dependencies ?? []).filter((dep) => isGroupedContentScriptAsset(dep));
76
+ const ungroupedDependencies = (contribution.dependencies ?? []).filter((dep) => !isGroupedContentScriptAsset(dep));
77
+ const groupedResolution = groupedDependencies.length
78
+ ? await this.resolveGroupedPageBrowserAssets(input, contribution)
79
+ : undefined;
80
+ const groupedAssets = groupedResolution?.assetsByRoute.get(createRouteGraphLookupKey(input.routeFile, input.dependencyInstanceKey ?? '')) ?? [];
81
+ const processedDependencies = ungroupedDependencies.length
82
+ ? await this.assetProcessingService.processDependencies(ungroupedDependencies, `${input.integrationName}:${input.routeFile}`)
83
+ : [];
84
+ const resolvedAssets = [...processedDependencies, ...groupedAssets, ...(contribution.assets ?? [])];
85
+ const result = this.partitionPageBrowserGraphAssets(resolvedAssets);
86
+ const dependencyPaths = collectPageBrowserGraphDependencyPaths(input.routeFile, contribution, resolvedAssets);
87
+ return {
88
+ result,
89
+ dependencyPaths,
90
+ cacheable: groupedResolution?.cacheable ?? true,
91
+ };
92
+ }
93
+ async resolveGroupedPageBrowserAssets(input, currentContribution) {
94
+ if (this.isHmrEnabled()) {
95
+ return await this.buildGroupedPageBrowserAssets(input, currentContribution);
96
+ }
97
+ if (!input.groupedBuildPlan) {
98
+ const built = await this.buildGroupedPageBrowserAssets(input, currentContribution);
99
+ return {
100
+ ...built,
101
+ cacheable: false,
102
+ };
103
+ }
104
+ const session = getAppPageBrowserGraphSession(this.appConfig);
105
+ const groupedScope = {
106
+ integrationName: input.integrationName,
107
+ planKey: input.groupedBuildPlan.planKey,
108
+ };
109
+ let groupedCacheable = true;
110
+ const assetsByRoute = await session.resolveGroupedGraph(groupedScope, async () => {
111
+ const built = await this.buildGroupedPageBrowserAssets(input, currentContribution);
112
+ groupedCacheable = !built.hasCollectionFailures;
113
+ if (built.hasCollectionFailures) {
114
+ return {
115
+ skipCache: true,
116
+ assetsByRoute: built.assetsByRoute,
117
+ dependencyPaths: built.dependencyPaths,
118
+ };
119
+ }
120
+ return {
121
+ assetsByRoute: built.assetsByRoute,
122
+ dependencyPaths: built.dependencyPaths,
123
+ generation: 0,
124
+ };
125
+ });
126
+ return {
127
+ assetsByRoute,
128
+ dependencyPaths: new Set(),
129
+ hasCollectionFailures: !groupedCacheable,
130
+ cacheable: groupedCacheable,
131
+ };
132
+ }
133
+ async buildGroupedPageBrowserAssets(input, currentContribution) {
134
+ const dependencyInstanceKey = input.dependencyInstanceKey ?? '';
135
+ const currentRouteLookupKey = createRouteGraphLookupKey(input.routeFile, dependencyInstanceKey);
136
+ const groupedCollection = input.groupedBuildPlan
137
+ ? {
138
+ contributions: input.groupedBuildPlan.instances.map((instance) => ({
139
+ routeFile: instance.routeFile,
140
+ dependencyInstanceKey: instance.dependencyInstanceKey,
141
+ contribution: instance.contribution,
142
+ })),
143
+ hasCollectionFailures: false,
144
+ }
145
+ : {
146
+ contributions: [],
147
+ hasCollectionFailures: false,
148
+ };
149
+ const groupedContributions = groupedCollection.contributions;
150
+ const currentRouteGroupedDependencies = (currentContribution.dependencies ?? []).filter((dep) => isGroupedContentScriptAsset(dep));
151
+ const groupedDependencies = [...currentRouteGroupedDependencies];
152
+ const groupedAssetKeysByRoute = new Map();
153
+ const routeDisplayPaths = new Map();
154
+ const dependencyPaths = new Set([path.resolve(input.routeFile)]);
155
+ let hasCollectionFailures = groupedCollection.hasCollectionFailures;
156
+ if (currentRouteGroupedDependencies.length > 0) {
157
+ groupedAssetKeysByRoute.set(currentRouteLookupKey, new Set(currentRouteGroupedDependencies.map((dep) => getGroupedBundleAssetKey(dep.groupedBundle))));
158
+ routeDisplayPaths.set(currentRouteLookupKey, input.routeFile);
159
+ }
160
+ for (const groupedContribution of groupedContributions) {
161
+ if (groupedContribution.routeFile === input.routeFile &&
162
+ groupedContribution.dependencyInstanceKey === dependencyInstanceKey) {
163
+ continue;
164
+ }
165
+ const { contribution, routeFile } = groupedContribution;
166
+ if (!contribution?.dependencies?.length) {
167
+ continue;
168
+ }
169
+ const routeGroupedDependencies = contribution.dependencies.filter((dep) => isGroupedContentScriptAsset(dep));
170
+ if (routeGroupedDependencies.length === 0) {
171
+ continue;
172
+ }
173
+ groupedDependencies.push(...routeGroupedDependencies);
174
+ groupedAssetKeysByRoute.set(createRouteGraphLookupKey(routeFile, groupedContribution.dependencyInstanceKey), new Set(routeGroupedDependencies.map((dep) => getGroupedBundleAssetKey(dep.groupedBundle))));
175
+ routeDisplayPaths.set(createRouteGraphLookupKey(routeFile, groupedContribution.dependencyInstanceKey), routeFile);
176
+ dependencyPaths.add(path.resolve(routeFile));
177
+ }
178
+ if (groupedDependencies.length === 0) {
179
+ return {
180
+ assetsByRoute: new Map(),
181
+ dependencyPaths,
182
+ hasCollectionFailures,
183
+ cacheable: Boolean(input.groupedBuildPlan) && !hasCollectionFailures,
184
+ };
185
+ }
186
+ for (const dependency of groupedDependencies) {
187
+ if (dependency.source === 'file') {
188
+ dependencyPaths.add(path.resolve(dependency.filepath));
189
+ }
190
+ }
191
+ const processedGroupedDependencies = await this.assetProcessingService.processDependencies(groupedDependencies, `${input.integrationName}:grouped-page-browser-graph`);
192
+ const groupedAssetsByRoute = new Map();
193
+ for (const [routeFile, groupedAssetKeys] of groupedAssetKeysByRoute) {
194
+ const matchedAssets = processedGroupedDependencies.filter((asset) => {
195
+ if (!asset.groupedBundle) {
196
+ return false;
197
+ }
198
+ return groupedAssetKeys.has(getGroupedBundleAssetKey(asset.groupedBundle));
199
+ });
200
+ if (groupedAssetKeys.size > 0 && matchedAssets.length === 0) {
201
+ appLogger.warn(`Grouped page-browser assets for ${routeDisplayPaths.get(routeFile) ?? routeFile} are missing groupedBundle metadata after processing. Hydration scripts may be omitted from HTML.`);
202
+ }
203
+ groupedAssetsByRoute.set(routeFile, matchedAssets);
204
+ }
205
+ for (const asset of processedGroupedDependencies) {
206
+ if (asset.sourceFilepath) {
207
+ dependencyPaths.add(path.resolve(asset.sourceFilepath));
208
+ }
209
+ for (const bundledSourceFilepath of asset.bundledSourceFilepaths ?? []) {
210
+ dependencyPaths.add(path.resolve(bundledSourceFilepath));
211
+ }
212
+ }
213
+ return {
214
+ assetsByRoute: groupedAssetsByRoute,
215
+ dependencyPaths,
216
+ hasCollectionFailures,
217
+ cacheable: Boolean(input.groupedBuildPlan) && !hasCollectionFailures,
218
+ };
219
+ }
220
+ partitionPageBrowserGraphAssets(assets) {
221
+ const entryAssets = [];
222
+ const chunkAssets = [];
223
+ for (const asset of assets) {
224
+ if (asset.packageRole === 'dynamic-chunk') {
225
+ chunkAssets.push(asset);
226
+ continue;
227
+ }
228
+ entryAssets.push(asset);
229
+ }
230
+ return { entryAssets, chunkAssets };
231
+ }
232
+ }
@@ -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,23 @@
1
+ export function buildProcessedAssetDedupeKey(asset) {
2
+ return [
3
+ asset.kind,
4
+ asset.position ?? '',
5
+ asset.srcUrl ?? '',
6
+ asset.filepath ?? '',
7
+ asset.content ?? '',
8
+ asset.inline ? 'inline' : 'external',
9
+ asset.excludeFromHtml ? 'excluded' : 'included',
10
+ asset.packageRole ?? '',
11
+ JSON.stringify(asset.attributes ?? {}),
12
+ ].join('|');
13
+ }
14
+ export function dedupeProcessedAssets(assets) {
15
+ const unique = new Map();
16
+ for (const asset of assets) {
17
+ const key = buildProcessedAssetDedupeKey(asset);
18
+ if (!unique.has(key)) {
19
+ unique.set(key, asset);
20
+ }
21
+ }
22
+ return [...unique.values()];
23
+ }
@@ -0,0 +1,29 @@
1
+ import type { PageParams, PageQuery } from '../../../types/public-types.js';
2
+ export type PageDependencyInstance = {
3
+ params?: PageParams;
4
+ query?: PageQuery;
5
+ };
6
+ export type GroupedGraphScope = {
7
+ integrationName: string;
8
+ planKey: string;
9
+ };
10
+ /**
11
+ * Builds a stable cache key for one concrete dependency resolver input.
12
+ *
13
+ * @remarks
14
+ * The representation deliberately retains scalar versus array values. Delimiter-based
15
+ * encodings would make otherwise distinct route inputs collide.
16
+ */
17
+ export declare function createPageDependencyInstanceKey(input: PageDependencyInstance): string;
18
+ /**
19
+ * Combines a route file with an optional dependency-instance key for grouped graph maps.
20
+ */
21
+ export declare function createRouteGraphLookupKey(routeFile: string, dependencyInstanceKey?: string): string;
22
+ /**
23
+ * Serializes the grouped graph cache scope for one integration and dependency instance.
24
+ */
25
+ export declare function serializeGroupedGraphCacheKey(scope: GroupedGraphScope): string;
26
+ /**
27
+ * Reconstructs dependency resolver inputs from a serialized dependency-instance key.
28
+ */
29
+ export declare function parsePageDependencyInstanceKey(dependencyInstanceKey: string): PageDependencyInstance;
@@ -0,0 +1,54 @@
1
+ /**
2
+ * Builds a stable cache key for one concrete dependency resolver input.
3
+ *
4
+ * @remarks
5
+ * The representation deliberately retains scalar versus array values. Delimiter-based
6
+ * encodings would make otherwise distinct route inputs collide.
7
+ */
8
+ export function createPageDependencyInstanceKey(input) {
9
+ const params = canonicalizeInput(input.params);
10
+ const query = canonicalizeInput(input.query);
11
+ if (params.length === 0 && query.length === 0) {
12
+ return '';
13
+ }
14
+ return JSON.stringify({ params, query });
15
+ }
16
+ /**
17
+ * Combines a route file with an optional dependency-instance key for grouped graph maps.
18
+ */
19
+ export function createRouteGraphLookupKey(routeFile, dependencyInstanceKey = '') {
20
+ return JSON.stringify([routeFile, dependencyInstanceKey]);
21
+ }
22
+ /**
23
+ * Serializes the grouped graph cache scope for one integration and dependency instance.
24
+ */
25
+ export function serializeGroupedGraphCacheKey(scope) {
26
+ return JSON.stringify(['grouped', scope.integrationName, scope.planKey]);
27
+ }
28
+ /**
29
+ * Reconstructs dependency resolver inputs from a serialized dependency-instance key.
30
+ */
31
+ export function parsePageDependencyInstanceKey(dependencyInstanceKey) {
32
+ if (!dependencyInstanceKey) {
33
+ return {};
34
+ }
35
+ const parsed = JSON.parse(dependencyInstanceKey);
36
+ if (!isSerializedDependencyInstance(parsed)) {
37
+ throw new TypeError('Invalid page dependency instance key.');
38
+ }
39
+ return {
40
+ ...(parsed.params.length > 0 ? { params: Object.fromEntries(parsed.params) } : {}),
41
+ ...(parsed.query.length > 0 ? { query: Object.fromEntries(parsed.query) } : {}),
42
+ };
43
+ }
44
+ function canonicalizeInput(input) {
45
+ return Object.entries(input ?? {})
46
+ .sort(([left], [right]) => left.localeCompare(right))
47
+ .map(([key, value]) => [key, Array.isArray(value) ? [...value] : value]);
48
+ }
49
+ function isSerializedDependencyInstance(value) {
50
+ if (!value || typeof value !== 'object' || !('params' in value) || !('query' in value)) {
51
+ return false;
52
+ }
53
+ return Array.isArray(value.params) && Array.isArray(value.query);
54
+ }
@@ -0,0 +1,38 @@
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 { EcoPagesAppConfig } from '../../../types/internal-types.js';
4
+ import type { EcoComponent, EcoPageFile, IntegrationRendererRenderOptions, PageBrowserGraphContribution, PageBrowserGraphContributionContext, PagePackageResult, RouteRendererBody, RouteRendererOptions } from '../../../types/public-types.js';
5
+ import type { ResolvedPageDependencies } from '../../page-loading/resolved-page-dependencies.js';
6
+ import type { RouteHtmlFinalization, RouteRenderOrchestratorAdapter, RouteRenderOrchestratorResolvedInputs } from './route-render-orchestrator.js';
7
+ /**
8
+ * Host surface required to build the orchestrator adapter for one integration renderer.
9
+ */
10
+ export type IntegrationRouteRenderAdapterHost<C> = {
11
+ readonly name: string;
12
+ readonly appConfig: EcoPagesAppConfig;
13
+ readonly watch: boolean;
14
+ readonly hostOwnsDevClient?: boolean;
15
+ resolveRouteRenderInputs(routeOptions: RouteRendererOptions): Promise<RouteRenderOrchestratorResolvedInputs>;
16
+ resolveRouteDependencies(input: {
17
+ components: (EcoComponent | Partial<EcoComponent>)[];
18
+ }): Promise<{
19
+ resolvedDependencies: ProcessedAsset[];
20
+ }>;
21
+ importPageFile(file: string): Promise<EcoPageFile>;
22
+ collectPageBrowserGraphContribution(context: PageBrowserGraphContributionContext): Promise<PageBrowserGraphContribution | undefined>;
23
+ resolvePageDependencies(context: PageBrowserGraphContributionContext): Promise<ResolvedPageDependencies | undefined>;
24
+ buildPageBrowserGraphContributionContext(routeFile: string, routeOptions?: Pick<RouteRendererOptions, 'params' | 'query'>): Promise<PageBrowserGraphContributionContext>;
25
+ renderRouteBody(renderOptions: IntegrationRendererRenderOptions<C>): Promise<RouteRendererBody>;
26
+ getDocumentAttributes(renderOptions: IntegrationRendererRenderOptions<C>): Record<string, string> | undefined;
27
+ getHtmlDocumentContributions(options: {
28
+ renderOptions: IntegrationRendererRenderOptions<C>;
29
+ partial: boolean;
30
+ }): HtmlDocumentContribution[] | undefined;
31
+ applyAttributesToHtmlElement(html: string, attributes: Record<string, string>): string;
32
+ transformRouteResponse(response: Response, htmlContributions?: HtmlDocumentContribution[], pagePackage?: PagePackageResult): Promise<RouteRendererBody>;
33
+ };
34
+ /**
35
+ * Builds the internal route-render adapter consumed by `RouteRenderOrchestrator`.
36
+ */
37
+ export declare function createIntegrationRouteRenderAdapter<C>(host: IntegrationRouteRenderAdapterHost<C>): RouteRenderOrchestratorAdapter<C>;
38
+ export type { RouteHtmlFinalization };
@@ -0,0 +1,26 @@
1
+ import { buildRouteHtmlFinalization } from './route-html-finalization.service.js';
2
+ /**
3
+ * Builds the internal route-render adapter consumed by `RouteRenderOrchestrator`.
4
+ */
5
+ export function createIntegrationRouteRenderAdapter(host) {
6
+ return {
7
+ name: host.name,
8
+ resolveRouteRenderInputs: (routeOptions) => host.resolveRouteRenderInputs(routeOptions),
9
+ resolveRouteDependencies: (input) => host.resolveRouteDependencies(input),
10
+ collectPageBrowserGraphContribution: (context) => host.collectPageBrowserGraphContribution(context),
11
+ resolvePageDependencies: (context) => host.resolvePageDependencies(context),
12
+ buildPageBrowserGraphContributionContext: (routeFile, routeOptions) => host.buildPageBrowserGraphContributionContext(routeFile, routeOptions),
13
+ renderRouteBody: (renderOptions) => host.renderRouteBody(renderOptions),
14
+ getRouteHtmlFinalization: (renderOptions) => buildRouteHtmlFinalization({
15
+ appConfig: host.appConfig,
16
+ watch: host.watch,
17
+ hostOwnsDevClient: host.hostOwnsDevClient,
18
+ integrationName: host.name,
19
+ renderOptions,
20
+ getDocumentAttributes: (options) => host.getDocumentAttributes(options),
21
+ getHtmlDocumentContributions: (options) => host.getHtmlDocumentContributions(options),
22
+ applyAttributesToHtmlElement: (html, attributes) => host.applyAttributesToHtmlElement(html, attributes),
23
+ }),
24
+ transformRouteResponse: (response, htmlContributions, pagePackage) => host.transformRouteResponse(response, htmlContributions, pagePackage),
25
+ };
26
+ }
@@ -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,25 @@
1
+ export function decodeHtmlEntities(value) {
2
+ let decoded = value;
3
+ let previous;
4
+ do {
5
+ previous = decoded;
6
+ decoded = decoded
7
+ .replaceAll('&quot;', '"')
8
+ .replaceAll('&#39;', "'")
9
+ .replaceAll('&#x27;', "'")
10
+ .replaceAll('&lt;', '<')
11
+ .replaceAll('&gt;', '>')
12
+ .replaceAll('&amp;', '&');
13
+ } while (decoded !== previous);
14
+ return decoded;
15
+ }
16
+ export function normalizeUnresolvedMarkerArtifactHtml(html) {
17
+ return html.replace(/&(?:amp;)?lt;eco-marker\b[\s\S]*?&(?:amp;)?gt;&(?:amp;)?lt;\/eco-marker&(?:amp;)?gt;/g, (marker) => decodeHtmlEntities(marker));
18
+ }
19
+ export function inspectUnresolvedMarkerArtifactHtml(html) {
20
+ const normalizedHtml = normalizeUnresolvedMarkerArtifactHtml(html);
21
+ return {
22
+ normalizedHtml,
23
+ hasUnresolvedMarkerArtifacts: normalizedHtml.includes('<eco-marker'),
24
+ };
25
+ }
@@ -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,43 @@
1
+ import { escapeHtmlAttribute } from '../../../utils/html-escaping.js';
2
+ /**
3
+ * Builds a head contribution for non-default `metadata.robots` values.
4
+ *
5
+ * @remarks
6
+ * When `robots` is omitted or matches the default `index,follow` behaviour,
7
+ * no tag is emitted (Next.js parity). Otherwise a single
8
+ * `<meta name="robots" content="...">` contribution is returned.
9
+ */
10
+ export function buildRobotsMetaContribution(metadata) {
11
+ const content = formatRobotsMetaContent(metadata.robots);
12
+ if (!content) {
13
+ return undefined;
14
+ }
15
+ return {
16
+ placement: 'head-append',
17
+ html: `<meta name="robots" content="${escapeHtmlAttribute(content)}">`,
18
+ };
19
+ }
20
+ /**
21
+ * Formats robots directives for a meta tag, or `undefined` when defaults apply.
22
+ */
23
+ export function formatRobotsMetaContent(robots) {
24
+ if (!robots) {
25
+ return undefined;
26
+ }
27
+ const index = robots.index !== false;
28
+ const follow = robots.follow !== false;
29
+ const directives = [];
30
+ if (!index) {
31
+ directives.push('noindex');
32
+ }
33
+ if (!follow) {
34
+ directives.push('nofollow');
35
+ }
36
+ if (robots.nocache) {
37
+ directives.push('nocache');
38
+ }
39
+ if (directives.length === 0) {
40
+ return undefined;
41
+ }
42
+ return directives.join(', ');
43
+ }
@@ -0,0 +1,25 @@
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
+ import type { EcoPagesAppConfig } from '../../../types/internal-types.js';
5
+ export type RouteHtmlFinalizationContext<C> = {
6
+ appConfig: EcoPagesAppConfig;
7
+ watch: boolean;
8
+ hostOwnsDevClient?: boolean;
9
+ integrationName: string;
10
+ renderOptions: IntegrationRendererRenderOptions<C>;
11
+ getDocumentAttributes: (renderOptions: IntegrationRendererRenderOptions<C>) => Record<string, string> | undefined;
12
+ getHtmlDocumentContributions: (options: {
13
+ renderOptions: IntegrationRendererRenderOptions<C>;
14
+ partial: boolean;
15
+ }) => HtmlDocumentContribution[] | undefined;
16
+ applyAttributesToHtmlElement: (html: string, attributes: Record<string, string>) => string;
17
+ };
18
+ /**
19
+ * Builds the structural HTML finalization plan for one prepared route render.
20
+ *
21
+ * @remarks
22
+ * Merges core robots meta contributions with integration-owned document
23
+ * contributions so page-level `metadata.robots` works across templates.
24
+ */
25
+ export declare function buildRouteHtmlFinalization<C>(context: RouteHtmlFinalizationContext<C>): RouteHtmlFinalization;
@@ -0,0 +1,44 @@
1
+ import { buildRobotsMetaContribution } from './robots-meta.contribution.js';
2
+ import { DevToolbarHost } from '../../../dev-toolbar/dev-toolbar-host.js';
3
+ /**
4
+ * Builds the structural HTML finalization plan for one prepared route render.
5
+ *
6
+ * @remarks
7
+ * Merges core robots meta contributions with integration-owned document
8
+ * contributions so page-level `metadata.robots` works across templates.
9
+ */
10
+ export function buildRouteHtmlFinalization(context) {
11
+ const { renderOptions } = context;
12
+ const documentAttributes = context.getDocumentAttributes(renderOptions);
13
+ const integrationContributions = context.getHtmlDocumentContributions({ renderOptions, partial: false }) ?? [];
14
+ const robotsContribution = buildRobotsMetaContribution(renderOptions.metadata ?? {});
15
+ const devToolbarContribution = buildDevToolbarManifestContribution(context);
16
+ const htmlContributions = [
17
+ ...(robotsContribution ? [robotsContribution] : []),
18
+ ...(devToolbarContribution ? [devToolbarContribution] : []),
19
+ ...integrationContributions,
20
+ ];
21
+ const hasStructuralFinalization = documentAttributes && Object.keys(documentAttributes).length > 0;
22
+ if (!hasStructuralFinalization && htmlContributions.length === 0) {
23
+ return {};
24
+ }
25
+ return {
26
+ htmlContributions,
27
+ finalizeHtml: (html) => {
28
+ if (!documentAttributes || Object.keys(documentAttributes).length === 0) {
29
+ return html;
30
+ }
31
+ return context.applyAttributesToHtmlElement(html, documentAttributes);
32
+ },
33
+ };
34
+ }
35
+ function buildDevToolbarManifestContribution(context) {
36
+ return DevToolbarHost.forApp(context.appConfig, {
37
+ watch: context.watch,
38
+ hostOwnsDevClient: context.hostOwnsDevClient,
39
+ }).buildRouteManifestContribution({
40
+ routeFile: context.renderOptions.file,
41
+ integrationName: context.integrationName,
42
+ pagePackage: context.renderOptions.pagePackage,
43
+ });
44
+ }
@@ -0,0 +1,26 @@
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
+ resolvedPageDependencyComponents?: ReadonlyArray<EcoComponent | Partial<EcoComponent>>;
21
+ resolvedDependencies: ProcessedAsset[];
22
+ allDependencies: ProcessedAsset[];
23
+ pageBrowserGraph?: PageBrowserGraphResult;
24
+ appConfig: EcoPagesAppConfig;
25
+ }): IntegrationRendererRenderOptions<C>;
26
+ 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
+ /**
5
+ * Assembles the final integration render options after route prep dependencies resolve.
6
+ */
7
+ export function buildPreparedRenderOptions(input) {
8
+ const { routeOptions, resolvedInputs, resolvedPageDependencyComponents, resolvedDependencies, allDependencies, pageBrowserGraph, appConfig, } = input;
9
+ const { Page, HtmlTemplate, Layouts, Layout, layoutEntries, props, metadata, integrationSpecificProps } = resolvedInputs;
10
+ const dedupedDependencies = dedupeProcessedAssets(allDependencies);
11
+ const pagePackage = createPagePackage(dedupedDependencies, { pageBrowserGraph });
12
+ const resolvedProps = props;
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 !== undefined;
22
+ const pageLocals = localsAvailable
23
+ ? routeOptions.locals
24
+ : createPageLocalsProxy(routeOptions.file);
25
+ const locals = localsAvailable ? routeOptions.locals : undefined;
26
+ const preparedOptions = {
27
+ ...routeOptions,
28
+ resolvedPageDependencyComponents,
29
+ resolvedDependencies,
30
+ pagePackage,
31
+ HtmlTemplate: HtmlTemplate,
32
+ Layouts,
33
+ Layout,
34
+ layoutEntries,
35
+ props: resolvedProps,
36
+ Page: Page,
37
+ metadata,
38
+ params: routeOptions.params || {},
39
+ query: routeOptions.query || {},
40
+ pageProps,
41
+ locals,
42
+ pageLocals,
43
+ cacheStrategy,
44
+ };
45
+ return {
46
+ ...integrationSpecificProps,
47
+ ...preparedOptions,
48
+ };
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>;