@ecopages/core 0.2.0-beta.30 → 0.2.0-beta.32

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 (338) hide show
  1. package/README.md +1 -0
  2. package/package.json +82 -3
  3. package/src/adapters/abstract/application-adapter.d.ts +0 -8
  4. package/src/adapters/abstract/application-adapter.js +252 -261
  5. package/src/adapters/abstract/router-adapter.js +12 -4
  6. package/src/adapters/abstract/segment-path-matcher.js +132 -134
  7. package/src/adapters/abstract/server-adapter.js +22 -14
  8. package/src/adapters/abstract/ws-pattern-matcher.js +24 -26
  9. package/src/adapters/bun/bun-user-websocket-lifecycle.js +83 -86
  10. package/src/adapters/bun/client-bridge.js +51 -50
  11. package/src/adapters/bun/create-app.js +171 -161
  12. package/src/adapters/bun/hmr-manager.js +62 -57
  13. package/src/adapters/bun/index.js +2 -31
  14. package/src/adapters/bun/runtime-host.js +61 -54
  15. package/src/adapters/bun/server-adapter.d.ts +0 -1
  16. package/src/adapters/bun/server-adapter.js +561 -561
  17. package/src/adapters/bun/static-preview-host.js +43 -46
  18. package/src/adapters/create-app.js +11 -14
  19. package/src/adapters/index.js +2 -30
  20. package/src/adapters/node/create-app.js +123 -129
  21. package/src/adapters/node/http-request-bridge.js +147 -106
  22. package/src/adapters/node/node-client-bridge.js +62 -64
  23. package/src/adapters/node/node-hmr-manager.js +58 -48
  24. package/src/adapters/node/runtime-host.js +96 -89
  25. package/src/adapters/node/server-adapter-dependencies.js +18 -21
  26. package/src/adapters/node/server-adapter.d.ts +0 -1
  27. package/src/adapters/node/server-adapter.js +347 -326
  28. package/src/adapters/node/static-content-server.js +172 -191
  29. package/src/adapters/node/static-preview-host.js +87 -78
  30. package/src/adapters/shared/hmr/dev-transform-entrypoint-registry.d.ts +16 -0
  31. package/src/adapters/shared/hmr/dev-transform-entrypoint-registry.js +32 -0
  32. package/src/adapters/shared/hmr/hmr-html-response.js +46 -32
  33. package/src/adapters/shared/hmr/shared-hmr-manager.d.ts +29 -38
  34. package/src/adapters/shared/hmr/shared-hmr-manager.js +439 -425
  35. package/src/adapters/shared/http/api-request-pipeline.js +122 -119
  36. package/src/adapters/shared/http/api-response.js +77 -77
  37. package/src/adapters/shared/http/create-body-response.js +22 -19
  38. package/src/adapters/shared/http/define-api-handler.js +41 -55
  39. package/src/adapters/shared/http/explicit-static-render-preparation.js +26 -23
  40. package/src/adapters/shared/http/explicit-static-route-matcher.js +55 -62
  41. package/src/adapters/shared/http/file-route-middleware-pipeline.js +81 -75
  42. package/src/adapters/shared/http/fs-server-response-factory.js +101 -96
  43. package/src/adapters/shared/http/fs-server-response-matcher.js +239 -257
  44. package/src/adapters/shared/http/run-middleware-chain.js +15 -15
  45. package/src/adapters/shared/runtime/application-adapter.js +72 -87
  46. package/src/adapters/shared/runtime/copy-runtime-public-dir.js +25 -22
  47. package/src/adapters/shared/runtime/port-manager.js +207 -177
  48. package/src/adapters/shared/runtime/render-context.js +94 -79
  49. package/src/adapters/shared/runtime/runtime-app-bootstrap.js +33 -38
  50. package/src/adapters/shared/runtime/runtime-host.js +1 -0
  51. package/src/adapters/shared/runtime/runtime-server-lifecycle.d.ts +2 -3
  52. package/src/adapters/shared/runtime/runtime-server-lifecycle.js +65 -51
  53. package/src/adapters/shared/runtime/server-adapter.d.ts +1 -0
  54. package/src/adapters/shared/runtime/server-adapter.js +233 -217
  55. package/src/adapters/shared/runtime/server-route-handler.js +74 -70
  56. package/src/adapters/shared/runtime/server-static-builder.js +165 -184
  57. package/src/adapters/shared/runtime/static-preview-host.js +1 -0
  58. package/src/adapters/shared/ws/node-http-websocket-upgrades.js +97 -88
  59. package/src/adapters/shared/ws/websocket-lifecycle.js +57 -50
  60. package/src/build/README.md +52 -1
  61. package/src/build/app-build-manifest-runtime.js +129 -108
  62. package/src/build/browser/browser-runtime-manifest.js +47 -50
  63. package/src/build/browser/browser-runtime-plugin-helpers.js +32 -12
  64. package/src/build/browser/browser-runtime-plugin.js +206 -160
  65. package/src/build/browser/jsx-ownership-plugins.js +51 -37
  66. package/src/build/browser/lit-static-render-worker-context.js +3 -5
  67. package/src/build/build-adapter.js +276 -139
  68. package/src/build/cache/build-input-fingerprint.js +28 -26
  69. package/src/build/cache/cache-constants.js +4 -6
  70. package/src/build/cache/cache-keys.js +64 -56
  71. package/src/build/cache/pages-unified-graph-build.js +179 -178
  72. package/src/build/cache/production-build-cache.js +47 -54
  73. package/src/build/cache/server-entry-build-cache.js +134 -146
  74. package/src/build/contracts/build-contracts.d.ts +4 -4
  75. package/src/build/contracts/build-contracts.js +1 -0
  76. package/src/build/contracts/build-manifest.js +58 -43
  77. package/src/build/contracts/build-types.js +1 -0
  78. package/src/build/rolldown/rolldown-adapter-helpers.d.ts +9 -0
  79. package/src/build/rolldown/rolldown-adapter-helpers.js +405 -298
  80. package/src/build/rolldown/rolldown-build-adapter.js +53 -61
  81. package/src/build/rolldown/rolldown-build-invocation-metrics.js +31 -35
  82. package/src/build/rolldown/rolldown-plugin-bridge.js +264 -194
  83. package/src/build/rolldown/rolldown-source-transform-pass.js +59 -50
  84. package/src/build/rolldown/runtime-build-output-normalizer.js +227 -175
  85. package/src/build/rolldown/server-side-css-shim-plugin.js +54 -31
  86. package/src/build/runtime/build-profile-options.js +36 -36
  87. package/src/build/runtime/build-request-identity.js +70 -45
  88. package/src/build/runtime/build-request-policy.js +80 -42
  89. package/src/build/runtime/build-runtime.js +64 -54
  90. package/src/build/runtime/deduping-build-executor.js +38 -32
  91. package/src/build/runtime/parallel-build-executor.js +58 -50
  92. package/src/build/runtime/serialized-build-executor.js +78 -62
  93. package/src/cache/index.js +6 -6
  94. package/src/cache/module-parse-cache.js +99 -68
  95. package/src/client/navigation-scripts/classification.js +45 -37
  96. package/src/client/navigation-scripts/index.js +3 -23
  97. package/src/client/navigation-scripts/navigation-scripts.test.browser.js +58 -62
  98. package/src/client/navigation-scripts/registry.js +15 -11
  99. package/src/client/navigation-scripts/rerun-queue.js +81 -64
  100. package/src/client/scroll.js +32 -24
  101. package/src/client/scroll.test.browser.js +27 -33
  102. package/src/client/view-transitions.js +68 -55
  103. package/src/config/config-builder.d.ts +8 -0
  104. package/src/config/config-builder.js +637 -642
  105. package/src/config/constants.js +44 -24
  106. package/src/declarations.d.ts +1 -0
  107. package/src/dev/README.md +24 -0
  108. package/src/dev/client-bridge-registry.js +7 -12
  109. package/src/dev/dev-client-ownership.js +7 -5
  110. package/src/dev/hmr-manager-registry.js +7 -12
  111. package/src/dev/host-runtime.js +25 -30
  112. package/src/dev/runtime-server-started-message.js +2 -5
  113. package/src/dev/sc-server.js +106 -103
  114. package/src/dev/transform-server/dev-transform-bundler.d.ts +24 -0
  115. package/src/dev/transform-server/dev-transform-bundler.js +79 -0
  116. package/src/dev/transform-server/dev-transform-externalize-plugin.d.ts +12 -0
  117. package/src/dev/transform-server/dev-transform-externalize-plugin.js +29 -0
  118. package/src/dev/transform-server/dev-transform-import-rewriter.d.ts +16 -0
  119. package/src/dev/transform-server/dev-transform-import-rewriter.js +110 -0
  120. package/src/dev/transform-server/dev-transform-module-kind.d.ts +13 -0
  121. package/src/dev/transform-server/dev-transform-module-kind.js +17 -0
  122. package/src/dev/transform-server/dev-transform-runtime-specifiers.d.ts +5 -0
  123. package/src/dev/transform-server/dev-transform-runtime-specifiers.js +16 -0
  124. package/src/dev/transform-server/dev-transform-server.d.ts +41 -0
  125. package/src/dev/transform-server/dev-transform-server.js +191 -0
  126. package/src/dev/transform-server/dev-transform-url.d.ts +13 -0
  127. package/src/dev/transform-server/dev-transform-url.js +58 -0
  128. package/src/dev/transform-server/dev-transform-vendor-registry.d.ts +27 -0
  129. package/src/dev/transform-server/dev-transform-vendor-registry.js +145 -0
  130. package/src/dev/transform-server/index.d.ts +6 -0
  131. package/src/dev/transform-server/index.js +4 -0
  132. package/src/dev/transform-server/types.d.ts +15 -0
  133. package/src/dev/transform-server/types.js +1 -0
  134. package/src/dev-toolbar/README.md +51 -0
  135. package/src/dev-toolbar/define-dev-tool.d.ts +21 -0
  136. package/src/dev-toolbar/define-dev-tool.js +9 -0
  137. package/src/dev-toolbar/dev-toolbar-config.d.ts +25 -0
  138. package/src/dev-toolbar/dev-toolbar-config.js +19 -0
  139. package/src/dev-toolbar/dev-toolbar-host.d.ts +49 -0
  140. package/src/dev-toolbar/dev-toolbar-host.js +117 -0
  141. package/src/dev-toolbar/dev-toolbar-html-response.d.ts +11 -0
  142. package/src/dev-toolbar/dev-toolbar-html-response.js +14 -0
  143. package/src/dev-toolbar/dev-toolbar-manifest.d.ts +15 -0
  144. package/src/dev-toolbar/dev-toolbar-manifest.js +52 -0
  145. package/src/dev-toolbar/dev-toolbar-package.d.ts +31 -0
  146. package/src/dev-toolbar/dev-toolbar-package.js +72 -0
  147. package/src/dev-toolbar/dev-toolbar-runtime-paths.d.ts +10 -0
  148. package/src/dev-toolbar/dev-toolbar-runtime-paths.js +13 -0
  149. package/src/diagnostics/request-build-dedupe.js +34 -28
  150. package/src/diagnostics/startup-trace.d.ts +10 -1
  151. package/src/diagnostics/startup-trace.js +269 -241
  152. package/src/eco/README.md +6 -0
  153. package/src/eco/eco-declared-component.js +19 -14
  154. package/src/eco/eco.browser.js +56 -69
  155. package/src/eco/eco.js +156 -96
  156. package/src/eco/eco.types.js +5 -0
  157. package/src/eco/eco.utils.js +1 -10
  158. package/src/eco/global-injector-map.js +55 -41
  159. package/src/eco/lazy-injector-map.js +90 -60
  160. package/src/eco/module-dependencies.js +52 -44
  161. package/src/eco/page-layout-normalization.js +59 -49
  162. package/src/errors/http-error.js +50 -49
  163. package/src/errors/index.js +3 -12
  164. package/src/errors/locals-access-error.js +5 -8
  165. package/src/errors/undeclared-component-dependency-error.js +15 -15
  166. package/src/global/app-logger.js +3 -6
  167. package/src/hmr/README.md +10 -0
  168. package/src/hmr/client/hmr-runtime.js +117 -113
  169. package/src/hmr/client/module-update.d.ts +13 -0
  170. package/src/hmr/client/module-update.js +39 -0
  171. package/src/hmr/hmr-asset-paths.d.ts +14 -0
  172. package/src/hmr/hmr-asset-paths.js +22 -0
  173. package/src/hmr/hmr-entrypoint-output.d.ts +11 -39
  174. package/src/hmr/hmr-entrypoint-output.js +28 -54
  175. package/src/hmr/hmr-file-change-prep.js +13 -16
  176. package/src/hmr/hmr-registered-entrypoints-context.d.ts +7 -0
  177. package/src/hmr/hmr-registered-entrypoints-context.js +1 -0
  178. package/src/hmr/hmr-runtime-paths.d.ts +10 -0
  179. package/src/hmr/hmr-runtime-paths.js +13 -0
  180. package/src/hmr/hmr-strategy.d.ts +5 -11
  181. package/src/hmr/hmr-strategy.js +113 -61
  182. package/src/hmr/strategies/default-hmr-strategy.js +55 -33
  183. package/src/hmr/strategies/js-hmr-strategy.d.ts +6 -95
  184. package/src/hmr/strategies/js-hmr-strategy.js +104 -217
  185. package/src/hmr/strategies/server-rendered-template-hmr-strategy.js +33 -27
  186. package/src/index.browser.js +1 -4
  187. package/src/index.d.ts +1 -0
  188. package/src/index.js +6 -47
  189. package/src/integrations/ghtml/ghtml-renderer.js +12 -7
  190. package/src/integrations/ghtml/ghtml.constants.js +1 -4
  191. package/src/integrations/ghtml/ghtml.plugin.js +9 -12
  192. package/src/islands/README.md +25 -0
  193. package/src/islands/island-host.d.ts +37 -0
  194. package/src/islands/island-host.js +55 -0
  195. package/src/plugins/alias-resolver-cache.js +114 -97
  196. package/src/plugins/alias-resolver-plugin.js +33 -47
  197. package/src/plugins/define-integration.js +18 -17
  198. package/src/plugins/eco-component-meta-plugin.js +387 -145
  199. package/src/plugins/foreign-jsx-override-plugin.js +49 -35
  200. package/src/plugins/integration-plugin.js +212 -203
  201. package/src/plugins/jsx-import-source.utils.js +16 -21
  202. package/src/plugins/processor.js +159 -149
  203. package/src/plugins/runtime-capability.js +1 -0
  204. package/src/plugins/source-transform.js +109 -79
  205. package/src/plugins/tsconfig-import-resolver.d.ts +17 -0
  206. package/src/plugins/tsconfig-import-resolver.js +218 -142
  207. package/src/route-renderer/README.md +12 -1
  208. package/src/route-renderer/orchestration/document-shell/document-shell-render.service.js +143 -136
  209. package/src/route-renderer/orchestration/document-shell/layout-shell-props.service.js +33 -27
  210. package/src/route-renderer/orchestration/foreign-child/component-render-context.js +173 -126
  211. package/src/route-renderer/orchestration/foreign-child/foreign-child-output.utils.js +165 -154
  212. package/src/route-renderer/orchestration/foreign-child/foreign-subtree-execution.service.js +329 -341
  213. package/src/route-renderer/orchestration/foreign-child/owning-renderer-resolution.js +33 -32
  214. package/src/route-renderer/orchestration/integration-renderer.d.ts +1 -0
  215. package/src/route-renderer/orchestration/integration-renderer.js +731 -750
  216. package/src/route-renderer/orchestration/integration-renderer.test-fixtures.js +168 -172
  217. package/src/route-renderer/orchestration/ownership-graph/component-graph-collectors.js +119 -131
  218. package/src/route-renderer/orchestration/ownership-graph/component-graph.js +82 -91
  219. package/src/route-renderer/orchestration/ownership-graph/ownership-validation.service.js +82 -76
  220. package/src/route-renderer/orchestration/page-browser-graph/global-injector-assets.service.js +29 -31
  221. package/src/route-renderer/orchestration/page-browser-graph/page-browser-graph-contribution.loader.js +10 -6
  222. package/src/route-renderer/orchestration/page-browser-graph/page-browser-graph-merge.utils.js +31 -28
  223. package/src/route-renderer/orchestration/page-browser-graph/page-browser-graph-session.d.ts +3 -0
  224. package/src/route-renderer/orchestration/page-browser-graph/page-browser-graph-session.js +430 -413
  225. package/src/route-renderer/orchestration/page-browser-graph/page-browser-graph.service.js +191 -212
  226. package/src/route-renderer/orchestration/page-browser-graph/processed-asset-dedupe.js +20 -24
  227. package/src/route-renderer/orchestration/route-pipeline/integration-route-render-adapter.d.ts +4 -0
  228. package/src/route-renderer/orchestration/route-pipeline/integration-route-render-adapter.js +24 -24
  229. package/src/route-renderer/orchestration/route-pipeline/marker-artifact.utils.js +22 -24
  230. package/src/route-renderer/orchestration/route-pipeline/robots-meta.contribution.js +41 -34
  231. package/src/route-renderer/orchestration/route-pipeline/route-html-finalization.service.d.ts +5 -0
  232. package/src/route-renderer/orchestration/route-pipeline/route-html-finalization.service.js +42 -22
  233. package/src/route-renderer/orchestration/route-pipeline/route-prepared-options.builder.js +50 -48
  234. package/src/route-renderer/orchestration/route-pipeline/route-prepared-options.utils.js +29 -32
  235. package/src/route-renderer/orchestration/route-pipeline/route-render-orchestrator.js +150 -156
  236. package/src/route-renderer/orchestration/string-markup-renderer.js +48 -51
  237. package/src/route-renderer/page-loading/component-dependency-collection.js +120 -124
  238. package/src/route-renderer/page-loading/declared-asset-collection.js +66 -94
  239. package/src/route-renderer/page-loading/dependency-resolver.js +101 -104
  240. package/src/route-renderer/page-loading/ecopages-virtual-imports.js +68 -54
  241. package/src/route-renderer/page-loading/lazy-entry-collection.js +75 -98
  242. package/src/route-renderer/page-loading/lazy-trigger-planning.js +46 -36
  243. package/src/route-renderer/page-loading/module-declaration-aggregation.js +38 -31
  244. package/src/route-renderer/page-loading/module-declaration-scripts.js +10 -15
  245. package/src/route-renderer/page-loading/page-dependency-bundling.js +156 -113
  246. package/src/route-renderer/page-loading/page-module-loader.js +130 -124
  247. package/src/route-renderer/route-renderer.js +74 -76
  248. package/src/router/client/link-intent.js +55 -39
  249. package/src/router/client/link-intent.test.browser.js +49 -49
  250. package/src/router/client/link-navigation-policy.js +114 -93
  251. package/src/router/client/link-navigation-policy.test.browser.js +70 -80
  252. package/src/router/client/navigation-coordinator.js +235 -211
  253. package/src/router/server/route-registry.js +237 -242
  254. package/src/services/assets/asset-processing-service/asset-dependency-keys.js +64 -53
  255. package/src/services/assets/asset-processing-service/asset-processing.service.js +287 -303
  256. package/src/services/assets/asset-processing-service/asset.factory.js +78 -81
  257. package/src/services/assets/asset-processing-service/assets.types.js +1 -0
  258. package/src/services/assets/asset-processing-service/browser-runtime-asset.factory.js +57 -46
  259. package/src/services/assets/asset-processing-service/browser-runtime-entry-resolution.js +106 -69
  260. package/src/services/assets/asset-processing-service/browser-runtime-entry.factory.js +53 -53
  261. package/src/services/assets/asset-processing-service/finalize-processed-asset.js +4 -6
  262. package/src/services/assets/asset-processing-service/grouped-content-bundles.js +79 -80
  263. package/src/services/assets/asset-processing-service/index.js +8 -8
  264. package/src/services/assets/asset-processing-service/inline-content-script-body.js +22 -16
  265. package/src/services/assets/asset-processing-service/materialize-content-script-asset.js +21 -17
  266. package/src/services/assets/asset-processing-service/page-package.js +70 -72
  267. package/src/services/assets/asset-processing-service/processor.interface.js +7 -5
  268. package/src/services/assets/asset-processing-service/processor.registry.js +11 -14
  269. package/src/services/assets/asset-processing-service/processors/base/base-processor.js +59 -62
  270. package/src/services/assets/asset-processing-service/processors/base/base-script-processor.js +102 -117
  271. package/src/services/assets/asset-processing-service/processors/index.js +5 -5
  272. package/src/services/assets/asset-processing-service/processors/script/content-script.processor.js +110 -115
  273. package/src/services/assets/asset-processing-service/processors/script/file-script.processor.js +95 -97
  274. package/src/services/assets/asset-processing-service/processors/script/node-module-script.processor.js +136 -135
  275. package/src/services/assets/asset-processing-service/processors/stylesheet/content-stylesheet.processor.js +27 -29
  276. package/src/services/assets/asset-processing-service/processors/stylesheet/file-stylesheet.processor.js +34 -40
  277. package/src/services/assets/asset-processing-service/processors/stylesheet/stylesheet-processor-pipeline.js +36 -35
  278. package/src/services/assets/asset-processing-service/resolve-integration-plugin.js +14 -16
  279. package/src/services/assets/asset-processing-service/ungrouped-dependency-processing.js +27 -39
  280. package/src/services/assets/browser-bundle.service.js +52 -47
  281. package/src/services/cache/cache.types.js +5 -0
  282. package/src/services/cache/index.js +6 -7
  283. package/src/services/cache/memory-cache-store.js +101 -89
  284. package/src/services/cache/page-cache-service.js +156 -145
  285. package/src/services/cache/page-request-cache-coordinator.service.js +102 -102
  286. package/src/services/html/html-rewriter-provider.service.js +61 -61
  287. package/src/services/html/html-transformer.service.js +249 -266
  288. package/src/services/invalidation/development-invalidation.service.js +252 -241
  289. package/src/services/module-loading/app-module-loader.service.js +1 -0
  290. package/src/services/module-loading/app-server-module-transpiler.service.js +107 -101
  291. package/src/services/module-loading/host-module-loader-registry.js +6 -11
  292. package/src/services/module-loading/module-loading-types.js +1 -0
  293. package/src/services/module-loading/page-module-import.service.js +235 -243
  294. package/src/services/module-loading/route-module-build-cache-registry.js +47 -33
  295. package/src/services/module-loading/route-module-build-cache.js +3 -38
  296. package/src/services/module-loading/route-module-build-cache.store.js +195 -200
  297. package/src/services/module-loading/route-module-build-manifest.js +61 -74
  298. package/src/services/module-loading/route-module-dependency-hasher.js +136 -110
  299. package/src/services/module-loading/server-module-transpiler.service.js +68 -62
  300. package/src/services/module-loading/source-module-support.js +15 -7
  301. package/src/services/runtime-state/dev-graph.service.js +165 -157
  302. package/src/services/runtime-state/entrypoint-dependency-graph.service.js +85 -76
  303. package/src/services/runtime-state/server-invalidation-state.service.js +38 -30
  304. package/src/services/validation/schema-validation-service.js +157 -95
  305. package/src/services/validation/standard-schema.types.js +1 -0
  306. package/src/services/validation/validate-standard-schema.js +13 -13
  307. package/src/static-site-generator/production-page-browser-graph-prebuild.js +35 -19
  308. package/src/static-site-generator/sitemap-routes.js +33 -28
  309. package/src/static-site-generator/sitemap.js +38 -29
  310. package/src/static-site-generator/static-build-invalidation.js +34 -56
  311. package/src/static-site-generator/static-export-context.js +1 -0
  312. package/src/static-site-generator/static-site-generator.js +517 -553
  313. package/src/types/internal-types.d.ts +19 -3
  314. package/src/types/internal-types.js +1 -0
  315. package/src/types/public-types.d.ts +16 -46
  316. package/src/types/public-types.js +1 -0
  317. package/src/utils/deep-merge.js +39 -26
  318. package/src/utils/ecopages-route-info.js +27 -23
  319. package/src/utils/hash.js +3 -6
  320. package/src/utils/html-escaping.js +21 -8
  321. package/src/utils/html.js +1 -4
  322. package/src/utils/invariant.js +11 -10
  323. package/src/utils/locals-utils.js +32 -22
  324. package/src/utils/parse-cli-args.js +73 -65
  325. package/src/utils/path-pattern.js +38 -23
  326. package/src/utils/path-utils.module.js +8 -11
  327. package/src/utils/resolve-entry-file.js +70 -38
  328. package/src/utils/resolve-work-dir.js +23 -27
  329. package/src/utils/runtime.js +24 -33
  330. package/src/utils/server-utils.module.js +60 -52
  331. package/src/utils/static-file-extensions.js +52 -46
  332. package/src/watchers/project-watcher-ignore.js +16 -15
  333. package/src/watchers/project-watcher.js +385 -366
  334. package/src/watchers/project-watcher.test-helpers.js +45 -50
  335. package/src/adapters/shared/hmr/hmr-entrypoint-registrar.d.ts +0 -56
  336. package/src/adapters/shared/hmr/hmr-entrypoint-registrar.js +0 -106
  337. package/src/build/cache/dev-browser-script-cache.d.ts +0 -34
  338. package/src/build/cache/dev-browser-script-cache.js +0 -90
@@ -1,229 +1,208 @@
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";
1
+ import path from 'node:path';
2
+ import { fileSystem } from '@ecopages/file-system';
3
+ import {} from '../../../services/assets/asset-processing-service/index.js';
4
+ import { appLogger } from '../../../global/app-logger.js';
5
+ import { startupTrace } from '../../../diagnostics/startup-trace.js';
6
+ import { collectPageBrowserGraphDependencyPaths, createPageBrowserGraphEntryFingerprint, getAppPageBrowserGraphSession, } from './page-browser-graph-session.js';
12
7
  function isGroupedContentScriptAsset(asset) {
13
- return asset.kind === "script" && asset.source === "content" && Boolean(asset.groupedBundle?.id);
8
+ return asset.kind === 'script' && asset.source === 'content' && Boolean(asset.groupedBundle?.id);
14
9
  }
15
10
  function getGroupedBundleAssetKey(groupedBundle) {
16
- return `${groupedBundle.id}:${groupedBundle.entryName}`;
11
+ return `${groupedBundle.id}:${groupedBundle.entryName}`;
17
12
  }
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
- }
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;
39
22
  }
40
- const contribution = await input.collectContribution(input.routeFile);
41
- if (!contribution) {
42
- return void 0;
23
+ async resolvePageBrowserGraph(input) {
24
+ return await this.getOrBuild(input);
43
25
  }
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);
26
+ /**
27
+ * Resolves or builds one Page Browser Graph under the given policy.
28
+ */
29
+ async getOrBuild(input) {
30
+ const policy = input.policy ?? this.resolveGraphPolicy();
31
+ const session = getAppPageBrowserGraphSession(this.appConfig);
32
+ if (!this.isHmrEnabled()) {
33
+ const cachedByRoute = session.getGraphByRoute(input.integrationName, input.routeFile, policy);
34
+ if (cachedByRoute) {
35
+ return cachedByRoute;
36
+ }
37
+ }
38
+ const contribution = await input.collectContribution(input.routeFile);
39
+ if (!contribution) {
40
+ return undefined;
41
+ }
42
+ const entryFingerprint = createPageBrowserGraphEntryFingerprint(contribution);
43
+ return await session.resolveGraph({
44
+ integrationName: input.integrationName,
45
+ routeFile: input.routeFile,
46
+ entryFingerprint,
47
+ policy,
48
+ }, async () => this.buildPageBrowserGraphRecord(input, contribution));
90
49
  }
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
- );
50
+ resolveGraphPolicy() {
51
+ return this.isHmrEnabled() ? 'development' : 'production';
127
52
  }
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));
53
+ isHmrEnabled() {
54
+ return (typeof this.assetProcessingService.getHmrManager === 'function' &&
55
+ this.assetProcessingService.getHmrManager()?.isEnabled() === true);
157
56
  }
158
- if (groupedDependencies.length === 0) {
159
- return {
160
- assetsByRoute: /* @__PURE__ */ new Map(),
161
- dependencyPaths,
162
- hasCollectionFailures
163
- };
57
+ async buildPageBrowserGraphRecord(input, contribution) {
58
+ const result = await this.materializePageBrowserGraph(input, contribution);
59
+ if (!result) {
60
+ return undefined;
61
+ }
62
+ startupTrace.markFirstPageBrowserGraphReady(getAppPageBrowserGraphSession(this.appConfig).getBuildCount());
63
+ return result;
164
64
  }
165
- for (const dependency of groupedDependencies) {
166
- if (dependency.source === "file") {
167
- dependencyPaths.add(path.resolve(dependency.filepath));
168
- }
65
+ async materializePageBrowserGraph(input, contribution) {
66
+ const groupedDependencies = (contribution.dependencies ?? []).filter((dep) => isGroupedContentScriptAsset(dep));
67
+ const ungroupedDependencies = (contribution.dependencies ?? []).filter((dep) => !isGroupedContentScriptAsset(dep));
68
+ const groupedAssets = groupedDependencies.length
69
+ ? ((await this.resolveGroupedPageBrowserAssets(input, contribution)).assetsByRoute.get(input.routeFile) ??
70
+ [])
71
+ : [];
72
+ const processedDependencies = ungroupedDependencies.length
73
+ ? await this.assetProcessingService.processDependencies(ungroupedDependencies, `${input.integrationName}:${input.routeFile}`)
74
+ : [];
75
+ const resolvedAssets = [...processedDependencies, ...groupedAssets, ...(contribution.assets ?? [])];
76
+ const result = this.partitionPageBrowserGraphAssets(resolvedAssets);
77
+ const dependencyPaths = collectPageBrowserGraphDependencyPaths(input.routeFile, contribution, resolvedAssets);
78
+ return {
79
+ result,
80
+ dependencyPaths,
81
+ };
169
82
  }
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;
83
+ async resolveGroupedPageBrowserAssets(input, currentContribution) {
84
+ if (this.isHmrEnabled()) {
85
+ return await this.buildGroupedPageBrowserAssets(input, currentContribution);
179
86
  }
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);
87
+ const session = getAppPageBrowserGraphSession(this.appConfig);
88
+ const assetsByRoute = await session.resolveGroupedGraph(input.integrationName, async () => {
89
+ const built = await this.buildGroupedPageBrowserAssets(input, currentContribution);
90
+ if (built.hasCollectionFailures) {
91
+ return {
92
+ skipCache: true,
93
+ assetsByRoute: built.assetsByRoute,
94
+ dependencyPaths: built.dependencyPaths,
95
+ };
96
+ }
97
+ return {
98
+ assetsByRoute: built.assetsByRoute,
99
+ dependencyPaths: built.dependencyPaths,
100
+ generation: 0,
101
+ };
102
+ });
103
+ return {
104
+ assetsByRoute,
105
+ dependencyPaths: new Set(),
106
+ hasCollectionFailures: false,
107
+ };
188
108
  }
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
- }
109
+ async buildGroupedPageBrowserAssets(input, currentContribution) {
110
+ const routeFiles = this.isHmrEnabled()
111
+ ? [input.routeFile]
112
+ : await this.listIntegrationRouteFiles(input.integrationName);
113
+ const currentRouteGroupedDependencies = (currentContribution.dependencies ?? []).filter((dep) => isGroupedContentScriptAsset(dep));
114
+ const groupedDependencies = [...currentRouteGroupedDependencies];
115
+ const groupedAssetKeysByRoute = new Map();
116
+ const dependencyPaths = new Set([path.resolve(input.routeFile)]);
117
+ let hasCollectionFailures = false;
118
+ if (currentRouteGroupedDependencies.length > 0) {
119
+ groupedAssetKeysByRoute.set(input.routeFile, new Set(currentRouteGroupedDependencies.map((dep) => getGroupedBundleAssetKey(dep.groupedBundle))));
120
+ }
121
+ for (const routeFile of routeFiles) {
122
+ if (routeFile === input.routeFile) {
123
+ continue;
124
+ }
125
+ let contribution;
126
+ try {
127
+ contribution = await input.collectContribution(routeFile);
128
+ }
129
+ catch (error) {
130
+ hasCollectionFailures = true;
131
+ appLogger.warn(`Skipping grouped page-browser contribution for ${routeFile}: ${error instanceof Error ? error.message : String(error)}`);
132
+ continue;
133
+ }
134
+ if (!contribution?.dependencies?.length) {
135
+ continue;
136
+ }
137
+ const routeGroupedDependencies = contribution.dependencies.filter((dep) => isGroupedContentScriptAsset(dep));
138
+ if (routeGroupedDependencies.length === 0) {
139
+ continue;
140
+ }
141
+ groupedDependencies.push(...routeGroupedDependencies);
142
+ groupedAssetKeysByRoute.set(routeFile, new Set(routeGroupedDependencies.map((dep) => getGroupedBundleAssetKey(dep.groupedBundle))));
143
+ dependencyPaths.add(path.resolve(routeFile));
144
+ }
145
+ if (groupedDependencies.length === 0) {
146
+ return {
147
+ assetsByRoute: new Map(),
148
+ dependencyPaths,
149
+ hasCollectionFailures,
150
+ };
151
+ }
152
+ for (const dependency of groupedDependencies) {
153
+ if (dependency.source === 'file') {
154
+ dependencyPaths.add(path.resolve(dependency.filepath));
155
+ }
156
+ }
157
+ const processedGroupedDependencies = await this.assetProcessingService.processDependencies(groupedDependencies, `${input.integrationName}:grouped-page-browser-graph`);
158
+ const groupedAssetsByRoute = new Map();
159
+ for (const [routeFile, groupedAssetKeys] of groupedAssetKeysByRoute) {
160
+ const matchedAssets = processedGroupedDependencies.filter((asset) => {
161
+ if (!asset.groupedBundle) {
162
+ return false;
163
+ }
164
+ return groupedAssetKeys.has(getGroupedBundleAssetKey(asset.groupedBundle));
165
+ });
166
+ if (groupedAssetKeys.size > 0 && matchedAssets.length === 0) {
167
+ appLogger.warn(`Grouped page-browser assets for ${routeFile} are missing groupedBundle metadata after processing. Hydration scripts may be omitted from HTML.`);
168
+ }
169
+ groupedAssetsByRoute.set(routeFile, matchedAssets);
170
+ }
171
+ for (const asset of processedGroupedDependencies) {
172
+ if (asset.sourceFilepath) {
173
+ dependencyPaths.add(path.resolve(asset.sourceFilepath));
174
+ }
175
+ for (const bundledSourceFilepath of asset.bundledSourceFilepaths ?? []) {
176
+ dependencyPaths.add(path.resolve(bundledSourceFilepath));
177
+ }
178
+ }
179
+ return {
180
+ assetsByRoute: groupedAssetsByRoute,
181
+ dependencyPaths,
182
+ hasCollectionFailures,
183
+ };
196
184
  }
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 [];
185
+ async listIntegrationRouteFiles(integrationName) {
186
+ const integration = this.appConfig.integrations.find((plugin) => plugin.name === integrationName);
187
+ if (!integration) {
188
+ return [];
189
+ }
190
+ const scannedFiles = await fileSystem.glob(integration.extensions.map((extension) => `**/*${extension}`), { cwd: this.appConfig.absolutePaths.pagesDir });
191
+ return scannedFiles
192
+ .filter((file) => !file.includes('.ecopages-node.'))
193
+ .map((file) => path.join(this.appConfig.absolutePaths.pagesDir, file))
194
+ .sort((left, right) => left.localeCompare(right));
207
195
  }
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);
196
+ partitionPageBrowserGraphAssets(assets) {
197
+ const entryAssets = [];
198
+ const chunkAssets = [];
199
+ for (const asset of assets) {
200
+ if (asset.packageRole === 'dynamic-chunk') {
201
+ chunkAssets.push(asset);
202
+ continue;
203
+ }
204
+ entryAssets.push(asset);
205
+ }
206
+ return { entryAssets, chunkAssets };
223
207
  }
224
- return { entryAssets, chunkAssets };
225
- }
226
208
  }
227
- export {
228
- PageBrowserGraphService
229
- };
@@ -1,27 +1,23 @@
1
- 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("|");
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
13
  }
14
- function dedupeProcessedAssets(assets) {
15
- const unique = /* @__PURE__ */ new Map();
16
- for (const asset of assets) {
17
- const key = buildProcessedAssetDedupeKey(asset);
18
- if (!unique.has(key)) {
19
- unique.set(key, asset);
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
+ }
20
21
  }
21
- }
22
- return [...unique.values()];
22
+ return [...unique.values()];
23
23
  }
24
- export {
25
- buildProcessedAssetDedupeKey,
26
- dedupeProcessedAssets
27
- };
@@ -1,5 +1,6 @@
1
1
  import type { ProcessedAsset } from '../../../services/assets/asset-processing-service/index.js';
2
2
  import type { HtmlDocumentContribution } from '../../../services/html/html-transformer.service.js';
3
+ import type { EcoPagesAppConfig } from '../../../types/internal-types.js';
3
4
  import type { EcoComponent, EcoPageFile, IntegrationRendererRenderOptions, PageBrowserGraphContribution, PageBrowserGraphContributionContext, PagePackageResult, RouteRendererBody, RouteRendererOptions } from '../../../types/public-types.js';
4
5
  import type { RouteHtmlFinalization, RouteRenderOrchestratorAdapter, RouteRenderOrchestratorResolvedInputs } from './route-render-orchestrator.js';
5
6
  /**
@@ -7,6 +8,9 @@ import type { RouteHtmlFinalization, RouteRenderOrchestratorAdapter, RouteRender
7
8
  */
8
9
  export type IntegrationRouteRenderAdapterHost<C> = {
9
10
  readonly name: string;
11
+ readonly appConfig: EcoPagesAppConfig;
12
+ readonly watch: boolean;
13
+ readonly hostOwnsDevClient?: boolean;
10
14
  resolveRouteRenderInputs(routeOptions: RouteRendererOptions): Promise<RouteRenderOrchestratorResolvedInputs>;
11
15
  resolveRouteDependencies(input: {
12
16
  components: (EcoComponent | Partial<EcoComponent>)[];
@@ -1,25 +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
- };
1
+ import { loadPageBrowserGraphContribution } from '../page-browser-graph/page-browser-graph-contribution.loader.js';
2
+ import { buildRouteHtmlFinalization } from './route-html-finalization.service.js';
3
+ /**
4
+ * Builds the internal route-render adapter consumed by `RouteRenderOrchestrator`.
5
+ */
6
+ export function createIntegrationRouteRenderAdapter(host) {
7
+ return {
8
+ name: host.name,
9
+ resolveRouteRenderInputs: (routeOptions) => host.resolveRouteRenderInputs(routeOptions),
10
+ resolveRouteDependencies: (input) => host.resolveRouteDependencies(input),
11
+ collectPageBrowserGraphContribution: (routeFile) => loadPageBrowserGraphContribution(routeFile, (file) => host.importPageFile(file), (context) => host.collectPageBrowserGraphContribution(context)),
12
+ renderRouteBody: (renderOptions) => host.renderRouteBody(renderOptions),
13
+ getRouteHtmlFinalization: (renderOptions) => buildRouteHtmlFinalization({
14
+ appConfig: host.appConfig,
15
+ watch: host.watch,
16
+ hostOwnsDevClient: host.hostOwnsDevClient,
17
+ integrationName: host.name,
18
+ renderOptions,
19
+ getDocumentAttributes: (options) => host.getDocumentAttributes(options),
20
+ getHtmlDocumentContributions: (options) => host.getHtmlDocumentContributions(options),
21
+ applyAttributesToHtmlElement: (html, attributes) => host.applyAttributesToHtmlElement(html, attributes),
22
+ }),
23
+ transformRouteResponse: (response, htmlContributions, pagePackage) => host.transformRouteResponse(response, htmlContributions, pagePackage),
24
+ };
22
25
  }
23
- export {
24
- createIntegrationRouteRenderAdapter
25
- };
@@ -1,27 +1,25 @@
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;
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;
9
15
  }
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
- );
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));
15
18
  }
16
- function inspectUnresolvedMarkerArtifactHtml(html) {
17
- const normalizedHtml = normalizeUnresolvedMarkerArtifactHtml(html);
18
- return {
19
- normalizedHtml,
20
- hasUnresolvedMarkerArtifacts: normalizedHtml.includes("<eco-marker")
21
- };
19
+ export function inspectUnresolvedMarkerArtifactHtml(html) {
20
+ const normalizedHtml = normalizeUnresolvedMarkerArtifactHtml(html);
21
+ return {
22
+ normalizedHtml,
23
+ hasUnresolvedMarkerArtifacts: normalizedHtml.includes('<eco-marker'),
24
+ };
22
25
  }
23
- export {
24
- decodeHtmlEntities,
25
- inspectUnresolvedMarkerArtifactHtml,
26
- normalizeUnresolvedMarkerArtifactHtml
27
- };