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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (343) hide show
  1. package/README.md +1 -0
  2. package/package.json +90 -3
  3. package/src/adapters/abstract/application-adapter.d.ts +0 -8
  4. package/src/adapters/abstract/application-adapter.js +252 -261
  5. package/src/adapters/abstract/router-adapter.js +12 -4
  6. package/src/adapters/abstract/segment-path-matcher.js +132 -134
  7. package/src/adapters/abstract/server-adapter.js +22 -14
  8. package/src/adapters/abstract/ws-pattern-matcher.js +24 -26
  9. package/src/adapters/bun/bun-user-websocket-lifecycle.js +83 -86
  10. package/src/adapters/bun/client-bridge.js +51 -50
  11. package/src/adapters/bun/create-app.js +171 -161
  12. package/src/adapters/bun/hmr-manager.js +62 -57
  13. package/src/adapters/bun/index.js +2 -31
  14. package/src/adapters/bun/runtime-host.js +61 -54
  15. package/src/adapters/bun/server-adapter.d.ts +0 -1
  16. package/src/adapters/bun/server-adapter.js +561 -561
  17. package/src/adapters/bun/static-preview-host.js +43 -46
  18. package/src/adapters/create-app.js +11 -14
  19. package/src/adapters/index.js +2 -30
  20. package/src/adapters/node/create-app.js +123 -129
  21. package/src/adapters/node/http-request-bridge.js +147 -106
  22. package/src/adapters/node/node-client-bridge.js +62 -64
  23. package/src/adapters/node/node-hmr-manager.js +58 -48
  24. package/src/adapters/node/runtime-host.js +96 -89
  25. package/src/adapters/node/server-adapter-dependencies.js +18 -21
  26. package/src/adapters/node/server-adapter.d.ts +0 -1
  27. package/src/adapters/node/server-adapter.js +347 -326
  28. package/src/adapters/node/static-content-server.js +172 -191
  29. package/src/adapters/node/static-preview-host.js +87 -78
  30. package/src/adapters/shared/hmr/dev-transform-entrypoint-registry.d.ts +16 -0
  31. package/src/adapters/shared/hmr/dev-transform-entrypoint-registry.js +32 -0
  32. package/src/adapters/shared/hmr/hmr-html-response.js +46 -32
  33. package/src/adapters/shared/hmr/shared-hmr-manager.d.ts +29 -38
  34. package/src/adapters/shared/hmr/shared-hmr-manager.js +439 -425
  35. package/src/adapters/shared/http/api-request-pipeline.js +122 -119
  36. package/src/adapters/shared/http/api-response.js +77 -77
  37. package/src/adapters/shared/http/create-body-response.js +22 -19
  38. package/src/adapters/shared/http/define-api-handler.js +41 -55
  39. package/src/adapters/shared/http/explicit-static-render-preparation.js +26 -23
  40. package/src/adapters/shared/http/explicit-static-route-matcher.js +55 -62
  41. package/src/adapters/shared/http/file-route-middleware-pipeline.js +81 -75
  42. package/src/adapters/shared/http/fs-server-response-factory.js +101 -96
  43. package/src/adapters/shared/http/fs-server-response-matcher.js +239 -257
  44. package/src/adapters/shared/http/run-middleware-chain.js +15 -15
  45. package/src/adapters/shared/runtime/application-adapter.js +72 -87
  46. package/src/adapters/shared/runtime/copy-runtime-public-dir.js +25 -22
  47. package/src/adapters/shared/runtime/port-manager.js +207 -177
  48. package/src/adapters/shared/runtime/render-context.js +94 -79
  49. package/src/adapters/shared/runtime/runtime-app-bootstrap.js +33 -38
  50. package/src/adapters/shared/runtime/runtime-host.js +1 -0
  51. package/src/adapters/shared/runtime/runtime-server-lifecycle.d.ts +2 -3
  52. package/src/adapters/shared/runtime/runtime-server-lifecycle.js +65 -51
  53. package/src/adapters/shared/runtime/server-adapter.d.ts +1 -0
  54. package/src/adapters/shared/runtime/server-adapter.js +233 -217
  55. package/src/adapters/shared/runtime/server-route-handler.js +74 -70
  56. package/src/adapters/shared/runtime/server-static-builder.js +165 -184
  57. package/src/adapters/shared/runtime/static-preview-host.js +1 -0
  58. package/src/adapters/shared/ws/node-http-websocket-upgrades.js +97 -88
  59. package/src/adapters/shared/ws/websocket-lifecycle.js +57 -50
  60. package/src/build/README.md +52 -1
  61. package/src/build/app-build-manifest-runtime.js +129 -108
  62. package/src/build/browser/browser-runtime-manifest.js +47 -50
  63. package/src/build/browser/browser-runtime-plugin-helpers.js +32 -12
  64. package/src/build/browser/browser-runtime-plugin.js +206 -160
  65. package/src/build/browser/jsx-ownership-plugins.js +51 -37
  66. package/src/build/browser/lit-static-render-worker-context.js +3 -5
  67. package/src/build/build-adapter.js +276 -139
  68. package/src/build/cache/build-input-fingerprint.js +28 -26
  69. package/src/build/cache/cache-constants.js +4 -6
  70. package/src/build/cache/cache-keys.js +64 -56
  71. package/src/build/cache/pages-unified-graph-build.js +179 -178
  72. package/src/build/cache/production-build-cache.js +47 -54
  73. package/src/build/cache/server-entry-build-cache.js +134 -146
  74. package/src/build/contracts/build-contracts.d.ts +4 -4
  75. package/src/build/contracts/build-contracts.js +1 -0
  76. package/src/build/contracts/build-manifest.js +58 -43
  77. package/src/build/contracts/build-types.js +1 -0
  78. package/src/build/rolldown/rolldown-adapter-helpers.d.ts +9 -0
  79. package/src/build/rolldown/rolldown-adapter-helpers.js +405 -298
  80. package/src/build/rolldown/rolldown-build-adapter.js +53 -61
  81. package/src/build/rolldown/rolldown-build-invocation-metrics.js +31 -35
  82. package/src/build/rolldown/rolldown-plugin-bridge.js +264 -194
  83. package/src/build/rolldown/rolldown-source-transform-pass.js +59 -50
  84. package/src/build/rolldown/runtime-build-output-normalizer.js +227 -175
  85. package/src/build/rolldown/server-side-css-shim-plugin.js +54 -31
  86. package/src/build/runtime/build-profile-options.js +36 -36
  87. package/src/build/runtime/build-request-identity.js +70 -45
  88. package/src/build/runtime/build-request-policy.js +80 -42
  89. package/src/build/runtime/build-runtime.js +64 -54
  90. package/src/build/runtime/deduping-build-executor.js +38 -32
  91. package/src/build/runtime/parallel-build-executor.js +58 -50
  92. package/src/build/runtime/serialized-build-executor.js +78 -62
  93. package/src/cache/index.js +6 -6
  94. package/src/cache/module-parse-cache.js +99 -68
  95. package/src/client/navigation-scripts/classification.js +45 -37
  96. package/src/client/navigation-scripts/index.js +3 -23
  97. package/src/client/navigation-scripts/navigation-scripts.test.browser.js +58 -62
  98. package/src/client/navigation-scripts/registry.js +15 -11
  99. package/src/client/navigation-scripts/rerun-queue.js +81 -64
  100. package/src/client/scroll.js +32 -24
  101. package/src/client/scroll.test.browser.js +27 -33
  102. package/src/client/view-transitions.js +68 -55
  103. package/src/config/config-builder.d.ts +8 -0
  104. package/src/config/config-builder.js +637 -642
  105. package/src/config/constants.js +44 -24
  106. package/src/declarations.d.ts +1 -0
  107. package/src/dev/README.md +24 -0
  108. package/src/dev/client-bridge-registry.js +7 -12
  109. package/src/dev/dev-client-ownership.js +7 -5
  110. package/src/dev/hmr-manager-registry.js +7 -12
  111. package/src/dev/host-runtime.js +25 -30
  112. package/src/dev/runtime-server-started-message.js +2 -5
  113. package/src/dev/sc-server.js +106 -103
  114. package/src/dev/transform-server/dev-transform-bundler.d.ts +24 -0
  115. package/src/dev/transform-server/dev-transform-bundler.js +79 -0
  116. package/src/dev/transform-server/dev-transform-externalize-plugin.d.ts +12 -0
  117. package/src/dev/transform-server/dev-transform-externalize-plugin.js +29 -0
  118. package/src/dev/transform-server/dev-transform-import-rewriter.d.ts +16 -0
  119. package/src/dev/transform-server/dev-transform-import-rewriter.js +110 -0
  120. package/src/dev/transform-server/dev-transform-module-kind.d.ts +13 -0
  121. package/src/dev/transform-server/dev-transform-module-kind.js +17 -0
  122. package/src/dev/transform-server/dev-transform-runtime-specifiers.d.ts +5 -0
  123. package/src/dev/transform-server/dev-transform-runtime-specifiers.js +16 -0
  124. package/src/dev/transform-server/dev-transform-server.d.ts +41 -0
  125. package/src/dev/transform-server/dev-transform-server.js +191 -0
  126. package/src/dev/transform-server/dev-transform-url.d.ts +13 -0
  127. package/src/dev/transform-server/dev-transform-url.js +58 -0
  128. package/src/dev/transform-server/dev-transform-vendor-registry.d.ts +27 -0
  129. package/src/dev/transform-server/dev-transform-vendor-registry.js +145 -0
  130. package/src/dev/transform-server/index.d.ts +6 -0
  131. package/src/dev/transform-server/index.js +4 -0
  132. package/src/dev/transform-server/types.d.ts +15 -0
  133. package/src/dev/transform-server/types.js +1 -0
  134. package/src/dev-toolbar/README.md +51 -0
  135. package/src/dev-toolbar/define-dev-tool.d.ts +21 -0
  136. package/src/dev-toolbar/define-dev-tool.js +9 -0
  137. package/src/dev-toolbar/dev-toolbar-config.d.ts +25 -0
  138. package/src/dev-toolbar/dev-toolbar-config.js +19 -0
  139. package/src/dev-toolbar/dev-toolbar-host.d.ts +49 -0
  140. package/src/dev-toolbar/dev-toolbar-host.js +117 -0
  141. package/src/dev-toolbar/dev-toolbar-html-response.d.ts +11 -0
  142. package/src/dev-toolbar/dev-toolbar-html-response.js +14 -0
  143. package/src/dev-toolbar/dev-toolbar-manifest.d.ts +15 -0
  144. package/src/dev-toolbar/dev-toolbar-manifest.js +52 -0
  145. package/src/dev-toolbar/dev-toolbar-package.d.ts +31 -0
  146. package/src/dev-toolbar/dev-toolbar-package.js +72 -0
  147. package/src/dev-toolbar/dev-toolbar-runtime-paths.d.ts +10 -0
  148. package/src/dev-toolbar/dev-toolbar-runtime-paths.js +13 -0
  149. package/src/diagnostics/request-build-dedupe.js +34 -28
  150. package/src/diagnostics/startup-trace.d.ts +10 -1
  151. package/src/diagnostics/startup-trace.js +269 -241
  152. package/src/eco/README.md +6 -0
  153. package/src/eco/eco-declared-component.js +19 -14
  154. package/src/eco/eco.browser.js +56 -69
  155. package/src/eco/eco.js +156 -96
  156. package/src/eco/eco.types.js +5 -0
  157. package/src/eco/eco.utils.js +1 -10
  158. package/src/eco/global-injector-map.js +55 -41
  159. package/src/eco/lazy-injector-map.js +90 -60
  160. package/src/eco/module-dependencies.js +52 -44
  161. package/src/eco/page-layout-normalization.js +59 -49
  162. package/src/errors/http-error.js +50 -49
  163. package/src/errors/index.js +3 -12
  164. package/src/errors/locals-access-error.js +5 -8
  165. package/src/errors/undeclared-component-dependency-error.js +15 -15
  166. package/src/global/app-logger.js +3 -6
  167. package/src/hmr/README.md +10 -0
  168. package/src/hmr/client/hmr-runtime.js +117 -113
  169. package/src/hmr/client/module-update.d.ts +13 -0
  170. package/src/hmr/client/module-update.js +39 -0
  171. package/src/hmr/hmr-asset-paths.d.ts +14 -0
  172. package/src/hmr/hmr-asset-paths.js +22 -0
  173. package/src/hmr/hmr-entrypoint-output.d.ts +11 -39
  174. package/src/hmr/hmr-entrypoint-output.js +28 -54
  175. package/src/hmr/hmr-file-change-prep.js +13 -16
  176. package/src/hmr/hmr-registered-entrypoints-context.d.ts +7 -0
  177. package/src/hmr/hmr-registered-entrypoints-context.js +1 -0
  178. package/src/hmr/hmr-runtime-paths.d.ts +10 -0
  179. package/src/hmr/hmr-runtime-paths.js +13 -0
  180. package/src/hmr/hmr-strategy.d.ts +5 -11
  181. package/src/hmr/hmr-strategy.js +113 -61
  182. package/src/hmr/strategies/default-hmr-strategy.js +55 -33
  183. package/src/hmr/strategies/js-hmr-strategy.d.ts +6 -95
  184. package/src/hmr/strategies/js-hmr-strategy.js +104 -217
  185. package/src/hmr/strategies/server-rendered-template-hmr-strategy.js +33 -27
  186. package/src/index.browser.js +1 -4
  187. package/src/index.d.ts +1 -0
  188. package/src/index.js +6 -47
  189. package/src/integrations/ghtml/ghtml-renderer.js +12 -7
  190. package/src/integrations/ghtml/ghtml.constants.js +1 -4
  191. package/src/integrations/ghtml/ghtml.plugin.js +9 -12
  192. package/src/islands/README.md +25 -0
  193. package/src/islands/island-host.d.ts +37 -0
  194. package/src/islands/island-host.js +55 -0
  195. package/src/plugins/alias-resolver-cache.js +114 -97
  196. package/src/plugins/alias-resolver-plugin.js +33 -47
  197. package/src/plugins/define-integration.js +18 -17
  198. package/src/plugins/eco-component-meta-plugin.js +387 -145
  199. package/src/plugins/foreign-jsx-override-plugin.js +49 -35
  200. package/src/plugins/integration-plugin.js +212 -203
  201. package/src/plugins/jsx-import-source.utils.js +16 -21
  202. package/src/plugins/processor.js +159 -149
  203. package/src/plugins/runtime-capability.js +1 -0
  204. package/src/plugins/source-transform.js +109 -79
  205. package/src/plugins/tsconfig-import-resolver.d.ts +17 -0
  206. package/src/plugins/tsconfig-import-resolver.js +218 -142
  207. package/src/route-renderer/README.md +12 -1
  208. package/src/route-renderer/orchestration/document-shell/document-shell-render.service.js +143 -136
  209. package/src/route-renderer/orchestration/document-shell/layout-shell-props.service.js +33 -27
  210. package/src/route-renderer/orchestration/foreign-child/component-render-context.js +173 -126
  211. package/src/route-renderer/orchestration/foreign-child/foreign-child-output.utils.js +165 -154
  212. package/src/route-renderer/orchestration/foreign-child/foreign-subtree-execution.service.js +329 -341
  213. package/src/route-renderer/orchestration/foreign-child/owning-renderer-resolution.js +33 -32
  214. package/src/route-renderer/orchestration/integration-renderer.d.ts +1 -0
  215. package/src/route-renderer/orchestration/integration-renderer.js +731 -750
  216. package/src/route-renderer/orchestration/integration-renderer.test-fixtures.js +168 -172
  217. package/src/route-renderer/orchestration/ownership-graph/component-graph-collectors.js +119 -131
  218. package/src/route-renderer/orchestration/ownership-graph/component-graph.js +82 -91
  219. package/src/route-renderer/orchestration/ownership-graph/ownership-validation.service.js +82 -76
  220. package/src/route-renderer/orchestration/page-browser-graph/global-injector-assets.service.js +29 -31
  221. package/src/route-renderer/orchestration/page-browser-graph/page-browser-graph-contribution.loader.js +10 -6
  222. package/src/route-renderer/orchestration/page-browser-graph/page-browser-graph-merge.utils.js +31 -28
  223. package/src/route-renderer/orchestration/page-browser-graph/page-browser-graph-session.d.ts +3 -0
  224. package/src/route-renderer/orchestration/page-browser-graph/page-browser-graph-session.js +430 -413
  225. package/src/route-renderer/orchestration/page-browser-graph/page-browser-graph.service.js +191 -212
  226. package/src/route-renderer/orchestration/page-browser-graph/processed-asset-dedupe.js +20 -24
  227. package/src/route-renderer/orchestration/route-pipeline/integration-route-render-adapter.d.ts +4 -0
  228. package/src/route-renderer/orchestration/route-pipeline/integration-route-render-adapter.js +24 -24
  229. package/src/route-renderer/orchestration/route-pipeline/marker-artifact.utils.js +22 -24
  230. package/src/route-renderer/orchestration/route-pipeline/robots-meta.contribution.js +41 -34
  231. package/src/route-renderer/orchestration/route-pipeline/route-html-finalization.service.d.ts +5 -0
  232. package/src/route-renderer/orchestration/route-pipeline/route-html-finalization.service.js +42 -22
  233. package/src/route-renderer/orchestration/route-pipeline/route-prepared-options.builder.js +50 -48
  234. package/src/route-renderer/orchestration/route-pipeline/route-prepared-options.utils.js +29 -32
  235. package/src/route-renderer/orchestration/route-pipeline/route-render-orchestrator.js +150 -156
  236. package/src/route-renderer/orchestration/string-markup-renderer.js +48 -51
  237. package/src/route-renderer/page-loading/component-dependency-collection.js +120 -124
  238. package/src/route-renderer/page-loading/declared-asset-collection.js +66 -94
  239. package/src/route-renderer/page-loading/dependency-resolver.js +101 -104
  240. package/src/route-renderer/page-loading/ecopages-virtual-imports.js +68 -54
  241. package/src/route-renderer/page-loading/lazy-entry-collection.js +75 -98
  242. package/src/route-renderer/page-loading/lazy-trigger-planning.js +46 -36
  243. package/src/route-renderer/page-loading/module-declaration-aggregation.js +38 -31
  244. package/src/route-renderer/page-loading/module-declaration-scripts.js +10 -15
  245. package/src/route-renderer/page-loading/page-dependency-bundling.js +156 -113
  246. package/src/route-renderer/page-loading/page-module-loader.js +130 -124
  247. package/src/route-renderer/route-renderer.js +74 -76
  248. package/src/router/README.md +23 -0
  249. package/src/router/client/link-intent.js +55 -39
  250. package/src/router/client/link-intent.test.browser.js +49 -49
  251. package/src/router/client/link-navigation-policy.js +114 -93
  252. package/src/router/client/link-navigation-policy.test.browser.js +70 -80
  253. package/src/router/client/navigation-coordinator.js +235 -211
  254. package/src/router/client/navigation-lifecycle.d.ts +55 -0
  255. package/src/router/client/navigation-lifecycle.js +50 -0
  256. package/src/router/client/navigation-lifecycle.test.browser.d.ts +1 -0
  257. package/src/router/client/navigation-lifecycle.test.browser.js +118 -0
  258. package/src/router/server/route-registry.js +237 -242
  259. package/src/services/assets/asset-processing-service/asset-dependency-keys.js +64 -53
  260. package/src/services/assets/asset-processing-service/asset-processing.service.js +287 -303
  261. package/src/services/assets/asset-processing-service/asset.factory.js +78 -81
  262. package/src/services/assets/asset-processing-service/assets.types.js +1 -0
  263. package/src/services/assets/asset-processing-service/browser-runtime-asset.factory.js +57 -46
  264. package/src/services/assets/asset-processing-service/browser-runtime-entry-resolution.js +106 -69
  265. package/src/services/assets/asset-processing-service/browser-runtime-entry.factory.js +53 -53
  266. package/src/services/assets/asset-processing-service/finalize-processed-asset.js +4 -6
  267. package/src/services/assets/asset-processing-service/grouped-content-bundles.js +79 -80
  268. package/src/services/assets/asset-processing-service/index.js +8 -8
  269. package/src/services/assets/asset-processing-service/inline-content-script-body.js +22 -16
  270. package/src/services/assets/asset-processing-service/materialize-content-script-asset.js +21 -17
  271. package/src/services/assets/asset-processing-service/page-package.js +70 -72
  272. package/src/services/assets/asset-processing-service/processor.interface.js +7 -5
  273. package/src/services/assets/asset-processing-service/processor.registry.js +11 -14
  274. package/src/services/assets/asset-processing-service/processors/base/base-processor.js +59 -62
  275. package/src/services/assets/asset-processing-service/processors/base/base-script-processor.js +102 -117
  276. package/src/services/assets/asset-processing-service/processors/index.js +5 -5
  277. package/src/services/assets/asset-processing-service/processors/script/content-script.processor.js +110 -115
  278. package/src/services/assets/asset-processing-service/processors/script/file-script.processor.js +95 -97
  279. package/src/services/assets/asset-processing-service/processors/script/node-module-script.processor.js +136 -135
  280. package/src/services/assets/asset-processing-service/processors/stylesheet/content-stylesheet.processor.js +27 -29
  281. package/src/services/assets/asset-processing-service/processors/stylesheet/file-stylesheet.processor.js +34 -40
  282. package/src/services/assets/asset-processing-service/processors/stylesheet/stylesheet-processor-pipeline.js +36 -35
  283. package/src/services/assets/asset-processing-service/resolve-integration-plugin.js +14 -16
  284. package/src/services/assets/asset-processing-service/ungrouped-dependency-processing.js +27 -39
  285. package/src/services/assets/browser-bundle.service.js +52 -47
  286. package/src/services/cache/cache.types.js +5 -0
  287. package/src/services/cache/index.js +6 -7
  288. package/src/services/cache/memory-cache-store.js +101 -89
  289. package/src/services/cache/page-cache-service.js +156 -145
  290. package/src/services/cache/page-request-cache-coordinator.service.js +102 -102
  291. package/src/services/html/html-rewriter-provider.service.js +61 -61
  292. package/src/services/html/html-transformer.service.js +249 -266
  293. package/src/services/invalidation/development-invalidation.service.js +252 -241
  294. package/src/services/module-loading/app-module-loader.service.js +1 -0
  295. package/src/services/module-loading/app-server-module-transpiler.service.js +107 -101
  296. package/src/services/module-loading/host-module-loader-registry.js +6 -11
  297. package/src/services/module-loading/module-loading-types.js +1 -0
  298. package/src/services/module-loading/page-module-import.service.js +235 -243
  299. package/src/services/module-loading/route-module-build-cache-registry.js +47 -33
  300. package/src/services/module-loading/route-module-build-cache.js +3 -38
  301. package/src/services/module-loading/route-module-build-cache.store.js +195 -200
  302. package/src/services/module-loading/route-module-build-manifest.js +61 -74
  303. package/src/services/module-loading/route-module-dependency-hasher.js +136 -110
  304. package/src/services/module-loading/server-module-transpiler.service.js +68 -62
  305. package/src/services/module-loading/source-module-support.js +15 -7
  306. package/src/services/runtime-state/dev-graph.service.js +165 -157
  307. package/src/services/runtime-state/entrypoint-dependency-graph.service.js +85 -76
  308. package/src/services/runtime-state/server-invalidation-state.service.js +38 -30
  309. package/src/services/validation/schema-validation-service.js +157 -95
  310. package/src/services/validation/standard-schema.types.js +1 -0
  311. package/src/services/validation/validate-standard-schema.js +13 -13
  312. package/src/static-site-generator/production-page-browser-graph-prebuild.js +35 -19
  313. package/src/static-site-generator/sitemap-routes.js +33 -28
  314. package/src/static-site-generator/sitemap.js +38 -29
  315. package/src/static-site-generator/static-build-invalidation.js +34 -56
  316. package/src/static-site-generator/static-export-context.js +1 -0
  317. package/src/static-site-generator/static-site-generator.js +517 -553
  318. package/src/types/internal-types.d.ts +19 -3
  319. package/src/types/internal-types.js +1 -0
  320. package/src/types/public-types.d.ts +16 -46
  321. package/src/types/public-types.js +1 -0
  322. package/src/utils/deep-merge.js +39 -26
  323. package/src/utils/ecopages-route-info.js +27 -23
  324. package/src/utils/hash.js +3 -6
  325. package/src/utils/html-escaping.js +21 -8
  326. package/src/utils/html.js +1 -4
  327. package/src/utils/invariant.js +11 -10
  328. package/src/utils/locals-utils.js +32 -22
  329. package/src/utils/parse-cli-args.js +73 -65
  330. package/src/utils/path-pattern.js +38 -23
  331. package/src/utils/path-utils.module.js +8 -11
  332. package/src/utils/resolve-entry-file.js +70 -38
  333. package/src/utils/resolve-work-dir.js +23 -27
  334. package/src/utils/runtime.js +24 -33
  335. package/src/utils/server-utils.module.js +60 -52
  336. package/src/utils/static-file-extensions.js +52 -46
  337. package/src/watchers/project-watcher-ignore.js +16 -15
  338. package/src/watchers/project-watcher.js +385 -366
  339. package/src/watchers/project-watcher.test-helpers.js +45 -50
  340. package/src/adapters/shared/hmr/hmr-entrypoint-registrar.d.ts +0 -56
  341. package/src/adapters/shared/hmr/hmr-entrypoint-registrar.js +0 -106
  342. package/src/build/cache/dev-browser-script-cache.d.ts +0 -34
  343. package/src/build/cache/dev-browser-script-cache.js +0 -90
@@ -1,96 +1,87 @@
1
- function walkComponentGraph(input) {
2
- const seenComponents = /* @__PURE__ */ new Set();
3
- const seenConfigs = /* @__PURE__ */ new Set();
4
- const visitComponent = (component, parentIntegrationName, source) => {
5
- if (!component) {
6
- return;
7
- }
8
- const ecoComponent = component;
9
- if (seenComponents.has(ecoComponent)) {
10
- return;
11
- }
12
- seenComponents.add(ecoComponent);
13
- const integrationName = ecoComponent.config?.integration ?? ecoComponent.config?.__eco?.integration ?? parentIntegrationName;
14
- if (input.onConfig && ecoComponent.config && !seenConfigs.has(ecoComponent.config)) {
15
- seenConfigs.add(ecoComponent.config);
16
- input.onConfig(ecoComponent.config);
17
- }
18
- if (input.onComponent) {
19
- const shouldContinue = input.onComponent({
20
- component: ecoComponent,
21
- parentIntegrationName,
22
- source
23
- });
24
- if (shouldContinue === false) {
25
- return;
26
- }
27
- }
28
- if (input.visitLayout) {
29
- for (const layout of ecoComponent.config?.layouts ?? []) {
30
- if (layout?.config) {
31
- visitConfig(layout.config, integrationName);
1
+ export function walkComponentGraph(input) {
2
+ const seenComponents = new Set();
3
+ const seenConfigs = new Set();
4
+ const visitComponent = (component, parentIntegrationName, source) => {
5
+ if (!component) {
6
+ return;
32
7
  }
33
- }
34
- }
35
- for (const child of ecoComponent.config?.dependencies?.components ?? []) {
36
- visitComponent(child, integrationName, "dependency");
37
- }
38
- };
39
- const visitConfig = (config, parentIntegrationName) => {
40
- if (!config || seenConfigs.has(config)) {
41
- return;
42
- }
43
- seenConfigs.add(config);
44
- if (input.onConfig) {
45
- input.onConfig(config);
46
- }
47
- if (input.visitLayout) {
48
- for (const layout of config.layouts ?? []) {
49
- if (layout?.config) {
50
- visitConfig(layout.config, parentIntegrationName);
8
+ const ecoComponent = component;
9
+ if (seenComponents.has(ecoComponent)) {
10
+ return;
51
11
  }
52
- }
53
- }
54
- for (const child of config.dependencies?.components ?? []) {
55
- visitComponent(child, parentIntegrationName, "dependency");
12
+ seenComponents.add(ecoComponent);
13
+ const integrationName = ecoComponent.config?.integration ?? ecoComponent.config?.__eco?.integration ?? parentIntegrationName;
14
+ if (input.onConfig && ecoComponent.config && !seenConfigs.has(ecoComponent.config)) {
15
+ seenConfigs.add(ecoComponent.config);
16
+ input.onConfig(ecoComponent.config);
17
+ }
18
+ if (input.onComponent) {
19
+ const shouldContinue = input.onComponent({
20
+ component: ecoComponent,
21
+ parentIntegrationName,
22
+ source,
23
+ });
24
+ if (shouldContinue === false) {
25
+ return;
26
+ }
27
+ }
28
+ if (input.visitLayout) {
29
+ for (const layout of ecoComponent.config?.layouts ?? []) {
30
+ if (layout?.config) {
31
+ visitConfig(layout.config, integrationName);
32
+ }
33
+ }
34
+ }
35
+ for (const child of ecoComponent.config?.dependencies?.components ?? []) {
36
+ visitComponent(child, integrationName, 'dependency');
37
+ }
38
+ };
39
+ const visitConfig = (config, parentIntegrationName) => {
40
+ if (!config || seenConfigs.has(config)) {
41
+ return;
42
+ }
43
+ seenConfigs.add(config);
44
+ if (input.onConfig) {
45
+ input.onConfig(config);
46
+ }
47
+ if (input.visitLayout) {
48
+ for (const layout of config.layouts ?? []) {
49
+ if (layout?.config) {
50
+ visitConfig(layout.config, parentIntegrationName);
51
+ }
52
+ }
53
+ }
54
+ for (const child of config.dependencies?.components ?? []) {
55
+ visitComponent(child, parentIntegrationName, 'dependency');
56
+ }
57
+ };
58
+ for (const root of input.roots) {
59
+ visitComponent(root.component, input.currentIntegrationName, root.source);
56
60
  }
57
- };
58
- for (const root of input.roots) {
59
- visitComponent(root.component, input.currentIntegrationName, root.source);
60
- }
61
61
  }
62
- function mapComponentGraph(input) {
63
- let nextSyntheticId = 0;
64
- const mapComponent = (component, source, parentIntegrationName, lineage) => {
65
- const integrationName = component.config?.integration ?? component.config?.__eco?.integration ?? parentIntegrationName;
66
- const componentMeta = component.config?.__eco;
67
- const isForeignToParent = integrationName !== parentIntegrationName;
68
- const componentId = componentMeta?.id ?? componentMeta?.file ?? `${source}:${nextSyntheticId += 1}`;
69
- const nextLineage = new Set(lineage);
70
- nextLineage.add(component);
71
- const children = (component.config?.dependencies?.components ?? []).flatMap((child) => {
72
- if (!child || nextLineage.has(child)) {
73
- return [];
74
- }
75
- return [mapComponent(child, "dependency", integrationName, nextLineage)];
76
- });
77
- return input.mapNode(
78
- {
79
- component,
80
- source,
81
- parentIntegrationName,
82
- integrationName,
83
- componentId,
84
- isForeignToParent
85
- },
86
- children
87
- );
88
- };
89
- return input.roots.map(
90
- ({ component, source }) => mapComponent(component, source, input.currentIntegrationName, /* @__PURE__ */ new Set())
91
- );
62
+ export function mapComponentGraph(input) {
63
+ let nextSyntheticId = 0;
64
+ const mapComponent = (component, source, parentIntegrationName, lineage) => {
65
+ const integrationName = component.config?.integration ?? component.config?.__eco?.integration ?? parentIntegrationName;
66
+ const componentMeta = component.config?.__eco;
67
+ const isForeignToParent = integrationName !== parentIntegrationName;
68
+ const componentId = componentMeta?.id ?? componentMeta?.file ?? `${source}:${(nextSyntheticId += 1)}`;
69
+ const nextLineage = new Set(lineage);
70
+ nextLineage.add(component);
71
+ const children = (component.config?.dependencies?.components ?? []).flatMap((child) => {
72
+ if (!child || nextLineage.has(child)) {
73
+ return [];
74
+ }
75
+ return [mapComponent(child, 'dependency', integrationName, nextLineage)];
76
+ });
77
+ return input.mapNode({
78
+ component,
79
+ source,
80
+ parentIntegrationName,
81
+ integrationName,
82
+ componentId,
83
+ isForeignToParent,
84
+ }, children);
85
+ };
86
+ return input.roots.map(({ component, source }) => mapComponent(component, source, input.currentIntegrationName, new Set()));
92
87
  }
93
- export {
94
- mapComponentGraph,
95
- walkComponentGraph
96
- };
@@ -1,80 +1,86 @@
1
- import { assertEcoDeclaredComponent } from "../../../eco/eco-declared-component.js";
2
- import { mapComponentGraph, walkComponentGraph } from "./component-graph.js";
3
- class OwnershipValidationService {
4
- appConfig;
5
- /**
6
- * Creates the ownership validator for one finalized app config.
7
- */
8
- constructor(appConfig) {
9
- this.appConfig = appConfig;
10
- }
11
- /**
12
- * Validates foreign ownership edges reachable from the supplied route roots.
13
- */
14
- validate(input) {
15
- this.assertDeclaredComponentDependencies(input);
16
- return mapComponentGraph({
17
- roots: input.roots,
18
- currentIntegrationName: input.currentIntegrationName,
19
- mapNode: ({ component, integrationName, componentId, isForeignToParent }, children) => {
20
- const componentMeta = component.config?.__eco;
21
- const errors = children.flat();
22
- if (!isForeignToParent) {
23
- return errors;
24
- }
25
- if (integrationName === "html") {
26
- return errors;
27
- }
28
- if (!componentMeta) {
29
- errors.push({
30
- code: "MISSING_COMPONENT_METADATA",
31
- message: `[ecopages] Foreign child "${componentId}" must provide stable __eco metadata so ownership diagnostics stay actionable. Declared dependencies must include all possible foreign children.`,
32
- componentId,
33
- integrationName
34
- });
35
- }
36
- if (!this.isRegisteredIntegration(integrationName, input.currentIntegrationName)) {
37
- errors.push({
38
- code: "UNKNOWN_INTEGRATION_OWNER",
39
- message: `[ecopages] Foreign child "${componentId}" references unknown integration owner "${integrationName}". Declared dependencies must include all possible foreign children and those integrations must be registered.`,
40
- componentId,
41
- componentFile: componentMeta?.file,
42
- integrationName
43
- });
44
- }
45
- return errors;
46
- }
47
- }).flat();
48
- }
49
- assertDeclaredComponentDependencies(input) {
50
- walkComponentGraph({
51
- roots: input.roots,
52
- currentIntegrationName: input.currentIntegrationName,
53
- onComponent: ({ component }) => {
54
- const parentFile = component.config?.__eco?.file;
55
- for (const child of component.config?.dependencies?.components ?? []) {
56
- if (!child) {
57
- continue;
58
- }
59
- assertEcoDeclaredComponent(child, { parentComponentFile: parentFile });
1
+ import { assertEcoDeclaredComponent } from '../../../eco/eco-declared-component.js';
2
+ import { mapComponentGraph, walkComponentGraph } from './component-graph.js';
3
+ /**
4
+ * Validates foreign ownership as soon as the route root graph is loaded.
5
+ *
6
+ * This check runs before route data and dependency preparation so ownership and
7
+ * metadata problems are surfaced from the loaded component graph itself rather
8
+ * than being entangled with ownership-plan construction.
9
+ */
10
+ export class OwnershipValidationService {
11
+ appConfig;
12
+ /**
13
+ * Creates the ownership validator for one finalized app config.
14
+ */
15
+ constructor(appConfig) {
16
+ this.appConfig = appConfig;
17
+ }
18
+ /**
19
+ * Validates foreign ownership edges reachable from the supplied route roots.
20
+ */
21
+ validate(input) {
22
+ this.assertDeclaredComponentDependencies(input);
23
+ return mapComponentGraph({
24
+ roots: input.roots,
25
+ currentIntegrationName: input.currentIntegrationName,
26
+ mapNode: ({ component, integrationName, componentId, isForeignToParent }, children) => {
27
+ const componentMeta = component.config?.__eco;
28
+ const errors = children.flat();
29
+ if (!isForeignToParent) {
30
+ return errors;
31
+ }
32
+ if (integrationName === 'html') {
33
+ return errors;
34
+ }
35
+ if (!componentMeta) {
36
+ errors.push({
37
+ code: 'MISSING_COMPONENT_METADATA',
38
+ message: `[ecopages] Foreign child "${componentId}" must provide stable __eco metadata so ownership diagnostics stay actionable. Declared dependencies must include all possible foreign children.`,
39
+ componentId,
40
+ integrationName,
41
+ });
42
+ }
43
+ if (!this.isRegisteredIntegration(integrationName, input.currentIntegrationName)) {
44
+ errors.push({
45
+ code: 'UNKNOWN_INTEGRATION_OWNER',
46
+ message: `[ecopages] Foreign child "${componentId}" references unknown integration owner "${integrationName}". Declared dependencies must include all possible foreign children and those integrations must be registered.`,
47
+ componentId,
48
+ componentFile: componentMeta?.file,
49
+ integrationName,
50
+ });
51
+ }
52
+ return errors;
53
+ },
54
+ }).flat();
55
+ }
56
+ assertDeclaredComponentDependencies(input) {
57
+ walkComponentGraph({
58
+ roots: input.roots,
59
+ currentIntegrationName: input.currentIntegrationName,
60
+ onComponent: ({ component }) => {
61
+ const parentFile = component.config?.__eco?.file;
62
+ for (const child of component.config?.dependencies?.components ?? []) {
63
+ if (!child) {
64
+ continue;
65
+ }
66
+ assertEcoDeclaredComponent(child, { parentComponentFile: parentFile });
67
+ }
68
+ },
69
+ });
70
+ }
71
+ isRegisteredIntegration(integrationName, currentIntegrationName) {
72
+ if (integrationName === currentIntegrationName) {
73
+ return true;
60
74
  }
61
- }
62
- });
63
- }
64
- isRegisteredIntegration(integrationName, currentIntegrationName) {
65
- if (integrationName === currentIntegrationName) {
66
- return true;
75
+ return this.appConfig.integrations.some((integration) => integration.name === integrationName);
67
76
  }
68
- return this.appConfig.integrations.some((integration) => integration.name === integrationName);
69
- }
70
77
  }
71
- function throwIfOwnershipInvalid(validationErrors) {
72
- if (validationErrors.length === 0) {
73
- return;
74
- }
75
- throw new Error(validationErrors.map((error) => error.message).join("\n"));
78
+ /**
79
+ * Throws when declared ownership validation collected one or more errors.
80
+ */
81
+ export function throwIfOwnershipInvalid(validationErrors) {
82
+ if (validationErrors.length === 0) {
83
+ return;
84
+ }
85
+ throw new Error(validationErrors.map((error) => error.message).join('\n'));
76
86
  }
77
- export {
78
- OwnershipValidationService,
79
- throwIfOwnershipInvalid
80
- };
@@ -1,32 +1,30 @@
1
- import { createRequire } from "node:module";
2
- import path from "node:path";
3
- import {
4
- AssetFactory
5
- } from "../../../services/assets/asset-processing-service/index.js";
6
- import { buildGlobalInjectorBootstrapContent, buildGlobalInjectorMapScript } from "../../../eco/global-injector-map.js";
7
- async function buildGlobalInjectorAssets(appConfig, assetProcessingService, triggers, currentIntegrationName) {
8
- const appProjectDir = appConfig.rootDir ?? appConfig.absolutePaths?.projectDir ?? process.cwd();
9
- const appPackageRequire = createRequire(path.join(appProjectDir, "package.json"));
10
- const corePackageEntryPath = appPackageRequire.resolve("@ecopages/core");
11
- const globalInjectorImportPath = createRequire(corePackageEntryPath).resolve("@ecopages/scripts-injector/global");
12
- const mapScript = AssetFactory.createInlineContentScript({
13
- position: "head",
14
- name: "ecopages-global-injector-map",
15
- content: buildGlobalInjectorMapScript(triggers),
16
- attributes: { type: "ecopages/global-injector-map" },
17
- packageRole: "keep-separate",
18
- bundle: false
19
- });
20
- const bootstrapInlineScript = AssetFactory.createInlineContentScript({
21
- position: "head",
22
- name: "ecopages-global-injector-bootstrap",
23
- content: buildGlobalInjectorBootstrapContent(globalInjectorImportPath),
24
- attributes: { type: "module" },
25
- packageRole: "keep-separate",
26
- bundle: true
27
- });
28
- return assetProcessingService.processDependencies([mapScript, bootstrapInlineScript], currentIntegrationName);
1
+ import { createRequire } from 'node:module';
2
+ import path from 'node:path';
3
+ import { AssetFactory, } from '../../../services/assets/asset-processing-service/index.js';
4
+ import { buildGlobalInjectorBootstrapContent, buildGlobalInjectorMapScript } from '../../../eco/global-injector-map.js';
5
+ /**
6
+ * Builds processed global-injector map and bootstrap assets for resolved lazy triggers.
7
+ */
8
+ export async function buildGlobalInjectorAssets(appConfig, assetProcessingService, triggers, currentIntegrationName) {
9
+ const appProjectDir = appConfig.rootDir ?? appConfig.absolutePaths?.projectDir ?? process.cwd();
10
+ const appPackageRequire = createRequire(path.join(appProjectDir, 'package.json'));
11
+ const corePackageEntryPath = appPackageRequire.resolve('@ecopages/core');
12
+ const globalInjectorImportPath = createRequire(corePackageEntryPath).resolve('@ecopages/scripts-injector/global');
13
+ const mapScript = AssetFactory.createInlineContentScript({
14
+ position: 'head',
15
+ name: 'ecopages-global-injector-map',
16
+ content: buildGlobalInjectorMapScript(triggers),
17
+ attributes: { type: 'ecopages/global-injector-map' },
18
+ packageRole: 'keep-separate',
19
+ bundle: false,
20
+ });
21
+ const bootstrapInlineScript = AssetFactory.createInlineContentScript({
22
+ position: 'head',
23
+ name: 'ecopages-global-injector-bootstrap',
24
+ content: buildGlobalInjectorBootstrapContent(globalInjectorImportPath),
25
+ attributes: { type: 'module' },
26
+ packageRole: 'keep-separate',
27
+ bundle: true,
28
+ });
29
+ return assetProcessingService.processDependencies([mapScript, bootstrapInlineScript], currentIntegrationName);
29
30
  }
30
- export {
31
- buildGlobalInjectorAssets
32
- };
@@ -1,7 +1,11 @@
1
- async function loadPageBrowserGraphContribution(routeFile, importPageFile, collectContribution) {
2
- const pageModule = await importPageFile(routeFile);
3
- return collectContribution({ file: routeFile, pageModule });
1
+ /**
2
+ * Loads a page module once and collects declarative browser-graph requirements.
3
+ *
4
+ * @remarks
5
+ * Shared by route orchestration prep and the integration route-render adapter so
6
+ * page imports are not duplicated when both paths need the same contribution.
7
+ */
8
+ export async function loadPageBrowserGraphContribution(routeFile, importPageFile, collectContribution) {
9
+ const pageModule = await importPageFile(routeFile);
10
+ return collectContribution({ file: routeFile, pageModule });
4
11
  }
5
- export {
6
- loadPageBrowserGraphContribution
7
- };
@@ -1,29 +1,32 @@
1
- import { createPagePackage } from "../../../services/assets/asset-processing-service/index.js";
2
- import { buildProcessedAssetDedupeKey, dedupeProcessedAssets } from "./processed-asset-dedupe.js";
3
- function mergePageBrowserGraph(currentPagePackage, processedDependencies, pageBrowserGraph) {
4
- const mergedGraph = currentPagePackage?.pageBrowserGraph ? {
5
- entryAssets: dedupeProcessedAssets([
6
- ...currentPagePackage.pageBrowserGraph.entryAssets,
7
- ...pageBrowserGraph.entryAssets
8
- ]),
9
- chunkAssets: dedupeProcessedAssets([
10
- ...currentPagePackage.pageBrowserGraph.chunkAssets,
11
- ...pageBrowserGraph.chunkAssets
12
- ])
13
- } : pageBrowserGraph;
14
- const pageBrowserGraphAssetKeys = new Set(
15
- [...mergedGraph.entryAssets, ...mergedGraph.chunkAssets].map((asset) => buildProcessedAssetDedupeKey(asset))
16
- );
17
- const baseAssets = currentPagePackage ? currentPagePackage.assets.filter(
18
- (asset) => !pageBrowserGraphAssetKeys.has(buildProcessedAssetDedupeKey(asset))
19
- ) : processedDependencies;
20
- return {
21
- pagePackage: createPagePackage(dedupeProcessedAssets(baseAssets), {
22
- pageBrowserGraph: mergedGraph
23
- }),
24
- mergedGraph
25
- };
1
+ import { createPagePackage } from '../../../services/assets/asset-processing-service/index.js';
2
+ import { buildProcessedAssetDedupeKey, dedupeProcessedAssets } from './processed-asset-dedupe.js';
3
+ /**
4
+ * Merges a page browser graph into an existing page package (or processed dependencies).
5
+ *
6
+ * Deduplicates entry/chunk assets against the existing package and rebuilds the
7
+ * package so downstream HTML finalization sees one canonical graph.
8
+ */
9
+ export function mergePageBrowserGraph(currentPagePackage, processedDependencies, pageBrowserGraph) {
10
+ const mergedGraph = currentPagePackage?.pageBrowserGraph
11
+ ? {
12
+ entryAssets: dedupeProcessedAssets([
13
+ ...currentPagePackage.pageBrowserGraph.entryAssets,
14
+ ...pageBrowserGraph.entryAssets,
15
+ ]),
16
+ chunkAssets: dedupeProcessedAssets([
17
+ ...currentPagePackage.pageBrowserGraph.chunkAssets,
18
+ ...pageBrowserGraph.chunkAssets,
19
+ ]),
20
+ }
21
+ : pageBrowserGraph;
22
+ const pageBrowserGraphAssetKeys = new Set([...mergedGraph.entryAssets, ...mergedGraph.chunkAssets].map((asset) => buildProcessedAssetDedupeKey(asset)));
23
+ const baseAssets = currentPagePackage
24
+ ? currentPagePackage.assets.filter((asset) => !pageBrowserGraphAssetKeys.has(buildProcessedAssetDedupeKey(asset)))
25
+ : processedDependencies;
26
+ return {
27
+ pagePackage: createPagePackage(dedupeProcessedAssets(baseAssets), {
28
+ pageBrowserGraph: mergedGraph,
29
+ }),
30
+ mergedGraph,
31
+ };
26
32
  }
27
- export {
28
- mergePageBrowserGraph
29
- };
@@ -62,6 +62,9 @@ export declare class SessionPageBrowserGraphCache {
62
62
  private readonly groupedGenerations;
63
63
  private buildCount;
64
64
  getGraphByRoute(integrationName: string, routeFile: string, policy: GraphPolicy): PageBrowserGraphResult | undefined;
65
+ /**
66
+ * Page Browser Graph compilations in this dev-server session.
67
+ */
65
68
  getBuildCount(): number;
66
69
  getAffectedGraphIdentities(filePath: string): AffectedGraphIdentity[];
67
70
  resolveGraph(key: GraphKey, build: () => Promise<GraphBuildResult | undefined>): Promise<PageBrowserGraphResult | undefined>;