@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,52 +1,47 @@
1
- import { vi } from "vitest";
2
- const createMockHmrManager = () => ({
3
- handleFileChange: vi.fn(async () => {
4
- }),
5
- broadcast: vi.fn(() => {
6
- }),
7
- setEnabled: vi.fn(() => {
8
- }),
9
- registerEntrypoint: vi.fn(async () => ""),
10
- registerScriptEntrypoint: vi.fn(async () => ({
11
- sourcePath: "",
12
- outputPath: "",
13
- outputUrl: ""
14
- })),
15
- registerStrategy: vi.fn(() => {
16
- }),
17
- isEnabled: vi.fn(() => true),
18
- getOutputUrl: vi.fn(() => void 0),
19
- getWatchedFiles: vi.fn(() => /* @__PURE__ */ new Map()),
20
- getDistDir: vi.fn(() => ""),
21
- getDefaultContext: vi.fn(() => ({
22
- getWatchedFiles: () => /* @__PURE__ */ new Map(),
23
- getDistDir: () => "",
24
- getSrcDir: () => "",
25
- getLayoutsDir: () => "",
26
- getPagesDir: () => "",
27
- getBuildExecutor: () => ({ build: vi.fn(async () => ({ success: true, logs: [], outputs: [] })) }),
28
- getBrowserBundleService: () => ({ bundle: vi.fn(async () => ({ success: true, logs: [], outputs: [] })) }),
29
- importServerModule: vi.fn(async () => ({}))
30
- }))
1
+ import { vi } from 'vitest';
2
+ export const createMockHmrManager = () => ({
3
+ handleFileChange: vi.fn(async () => { }),
4
+ broadcast: vi.fn(() => { }),
5
+ setEnabled: vi.fn(() => { }),
6
+ registerEntrypoint: vi.fn(async () => ''),
7
+ registerDevTransformContributor: vi.fn(() => { }),
8
+ registerScriptEntrypoint: vi.fn(async () => ({
9
+ sourcePath: '',
10
+ outputPath: '',
11
+ outputUrl: '',
12
+ role: 'script',
13
+ })),
14
+ registerStrategy: vi.fn(() => { }),
15
+ isEnabled: vi.fn(() => true),
16
+ getOutputUrl: vi.fn(() => undefined),
17
+ getWatchedFiles: vi.fn(() => new Map()),
18
+ getRegisteredEntrypoints: vi.fn(() => new Map()),
19
+ getRuntimeWorkDir: vi.fn(() => ''),
20
+ getRuntimePath: vi.fn(() => ''),
21
+ tryHandleAssetRequest: vi.fn(() => null),
22
+ getDefaultContext: vi.fn(() => ({
23
+ getWatchedFiles: () => new Map(),
24
+ getRegisteredEntrypoints: () => new Map(),
25
+ getSrcDir: () => '',
26
+ getLayoutsDir: () => '',
27
+ getPagesDir: () => '',
28
+ getEntrypointDependencyGraph: () => ({
29
+ supportsSelectiveInvalidation: () => false,
30
+ getDependencyEntrypoints: () => new Set(),
31
+ setEntrypointDependencies: () => { },
32
+ clearEntrypointDependencies: () => { },
33
+ reset: () => { },
34
+ }),
35
+ importServerModule: vi.fn(async () => ({})),
36
+ })),
31
37
  });
32
- const createMockBridge = () => ({
33
- reload: vi.fn(() => {
34
- }),
35
- error: vi.fn(() => {
36
- }),
37
- cssUpdate: vi.fn(() => {
38
- }),
39
- update: vi.fn(() => {
40
- }),
41
- subscribe: vi.fn(() => {
42
- }),
43
- unsubscribe: vi.fn(() => {
44
- }),
45
- broadcast: vi.fn(() => {
46
- }),
47
- subscriberCount: 0
38
+ export const createMockBridge = () => ({
39
+ reload: vi.fn(() => { }),
40
+ error: vi.fn(() => { }),
41
+ cssUpdate: vi.fn(() => { }),
42
+ update: vi.fn(() => { }),
43
+ subscribe: vi.fn(() => { }),
44
+ unsubscribe: vi.fn(() => { }),
45
+ broadcast: vi.fn(() => { }),
46
+ subscriberCount: 0,
48
47
  });
49
- export {
50
- createMockBridge,
51
- createMockHmrManager
52
- };
@@ -1,56 +0,0 @@
1
- import { type ResolvedHmrEntrypoint } from '../../../hmr/hmr-entrypoint-output.js';
2
- /**
3
- * Runtime-specific hooks required to materialize a single HMR entrypoint.
4
- */
5
- export interface HmrEntrypointRegistrationOptions {
6
- /**
7
- * Emits the browser-consumable HMR artifact for an entrypoint.
8
- */
9
- emit(entrypointPath: string, outputPath: string): Promise<void>;
10
- /**
11
- * Creates the runtime-specific error raised when the emit hook completes without producing output.
12
- */
13
- getMissingOutputError(entrypointPath: string, outputPath: string): Error;
14
- }
15
- export interface HmrEntrypointRegistrarOptions {
16
- /** Absolute source directory used to derive the emitted HMR path. */
17
- srcDir: string;
18
- /** Absolute distribution directory where HMR outputs are written. */
19
- distDir: string;
20
- /** Runtime-specific cleanup invoked when an entrypoint registration fails. */
21
- clearFailedRegistration?: (entrypointPath: string) => void;
22
- }
23
- /**
24
- * Coordinates the shared HMR entrypoint registration lifecycle for both Node and Bun managers.
25
- *
26
- * @remarks
27
- * The registrar owns in-flight deduplication and the registered entrypoint table.
28
- * A source path is committed only after emit succeeds and the expected output exists on disk.
29
- */
30
- export declare class HmrEntrypointRegistrar {
31
- private readonly options;
32
- private readonly inFlight;
33
- private readonly registered;
34
- constructor(options: HmrEntrypointRegistrarOptions);
35
- getRegistered(): ReadonlyMap<string, ResolvedHmrEntrypoint>;
36
- getWatchedFiles(): Map<string, string>;
37
- clearRegistration(entrypointPath: string): void;
38
- /**
39
- * Registers an already-materialized HMR entrypoint without running the emit hook.
40
- *
41
- * @remarks
42
- * Cold dev batches build entrypoints in grouped Rolldown passes and then seed
43
- * the registrar so the first SSR can resolve the artifact without rebuilding.
44
- * The source path is committed verbatim so `getResolvedScriptOutput()` and the
45
- * file watcher see it as a regular watched entrypoint.
46
- */
47
- seedResolvedEntrypoint(resolved: ResolvedHmrEntrypoint): void;
48
- clearAll(): void;
49
- /**
50
- * Registers a single source entrypoint and returns its verified HMR artifact.
51
- *
52
- * Concurrent requests for the same normalized entrypoint share the same in-flight promise.
53
- */
54
- registerEntrypoint(entrypointPath: string, registrationOptions: HmrEntrypointRegistrationOptions): Promise<ResolvedHmrEntrypoint>;
55
- private registerEntrypointInternal;
56
- }
@@ -1,106 +0,0 @@
1
- import path from "node:path";
2
- import { fileSystem } from "@ecopages/file-system";
3
- import {
4
- removeStaleHmrEntrypointOutput,
5
- resolveHmrEntrypointOutputPaths
6
- } from "../../../hmr/hmr-entrypoint-output.js";
7
- class HmrEntrypointRegistrar {
8
- options;
9
- inFlight = /* @__PURE__ */ new Map();
10
- registered = /* @__PURE__ */ new Map();
11
- constructor(options) {
12
- this.options = options;
13
- }
14
- getRegistered() {
15
- return this.registered;
16
- }
17
- getWatchedFiles() {
18
- const watchedFiles = /* @__PURE__ */ new Map();
19
- for (const [sourcePath, entrypoint] of this.registered) {
20
- watchedFiles.set(sourcePath, entrypoint.outputUrl);
21
- }
22
- return watchedFiles;
23
- }
24
- clearRegistration(entrypointPath) {
25
- this.registered.delete(path.resolve(entrypointPath));
26
- }
27
- /**
28
- * Registers an already-materialized HMR entrypoint without running the emit hook.
29
- *
30
- * @remarks
31
- * Cold dev batches build entrypoints in grouped Rolldown passes and then seed
32
- * the registrar so the first SSR can resolve the artifact without rebuilding.
33
- * The source path is committed verbatim so `getResolvedScriptOutput()` and the
34
- * file watcher see it as a regular watched entrypoint.
35
- */
36
- seedResolvedEntrypoint(resolved) {
37
- this.registered.set(path.resolve(resolved.sourcePath), {
38
- sourcePath: resolved.sourcePath,
39
- outputPath: resolved.outputPath,
40
- outputUrl: resolved.outputUrl
41
- });
42
- }
43
- clearAll() {
44
- this.inFlight.clear();
45
- this.registered.clear();
46
- }
47
- /**
48
- * Registers a single source entrypoint and returns its verified HMR artifact.
49
- *
50
- * Concurrent requests for the same normalized entrypoint share the same in-flight promise.
51
- */
52
- async registerEntrypoint(entrypointPath, registrationOptions) {
53
- const normalizedEntrypoint = path.resolve(entrypointPath);
54
- const existing = this.registered.get(normalizedEntrypoint);
55
- if (existing && fileSystem.exists(existing.outputPath)) {
56
- return existing;
57
- }
58
- const existingRegistration = this.inFlight.get(normalizedEntrypoint);
59
- if (existingRegistration) {
60
- return await existingRegistration;
61
- }
62
- const registration = this.registerEntrypointInternal(normalizedEntrypoint, registrationOptions);
63
- this.inFlight.set(normalizedEntrypoint, registration);
64
- try {
65
- return await registration;
66
- } catch (error) {
67
- this.options.clearFailedRegistration?.(normalizedEntrypoint);
68
- this.registered.delete(normalizedEntrypoint);
69
- throw error;
70
- } finally {
71
- if (this.inFlight.get(normalizedEntrypoint) === registration) {
72
- this.inFlight.delete(normalizedEntrypoint);
73
- }
74
- }
75
- }
76
- async registerEntrypointInternal(entrypointPath, registrationOptions) {
77
- const previous = this.registered.get(entrypointPath);
78
- const { outputPath, outputUrl } = resolveHmrEntrypointOutputPaths(
79
- this.options.srcDir,
80
- this.options.distDir,
81
- entrypointPath
82
- );
83
- removeStaleHmrEntrypointOutput(outputPath, "HMR");
84
- try {
85
- await registrationOptions.emit(entrypointPath, outputPath);
86
- if (!fileSystem.exists(outputPath)) {
87
- throw registrationOptions.getMissingOutputError(entrypointPath, outputPath);
88
- }
89
- const resolved = {
90
- sourcePath: entrypointPath,
91
- outputPath,
92
- outputUrl
93
- };
94
- this.registered.set(entrypointPath, resolved);
95
- return resolved;
96
- } catch (error) {
97
- if (previous && fileSystem.exists(previous.outputPath)) {
98
- this.registered.set(entrypointPath, previous);
99
- }
100
- throw error;
101
- }
102
- }
103
- }
104
- export {
105
- HmrEntrypointRegistrar
106
- };
@@ -1,34 +0,0 @@
1
- import type { EcoPagesAppConfig } from '../../types/internal-types.js';
2
- import type { ProcessedAsset } from '../../services/assets/asset-processing-service/assets.types.js';
3
- export declare const DEV_BROWSER_SCRIPT_CACHE_DIR = ".browser-script-bundles";
4
- export declare const DEV_BROWSER_SCRIPT_CACHE_FILENAME = ".build-cache.json";
5
- /** Output path restored from the dev disk cache before dependency metadata is merged. */
6
- export type DevBrowserScriptCacheHit = {
7
- filepath: string;
8
- };
9
- /**
10
- * @remarks
11
- * Dev asset caching spans three scopes that should not be conflated:
12
- * - request dedupe (`request-build-dedupe.ts`) — one in-flight build per request key
13
- * - in-memory service cache (`AssetProcessingService`) — per-process reuse within one dev server
14
- * - this disk manifest (`.eco/.browser-script-bundles`) — cross-request reuse of content-script bundles
15
- *
16
- * Disk entries intentionally store only output file paths. Declarative fields such as
17
- * `groupedBundle`, `attributes`, and `packageRole` live on the originating
18
- * `ContentScriptAsset` and are merged via `materializeContentScriptAsset()` on lookup.
19
- */
20
- export interface DevBrowserScriptCacheEntry {
21
- filepath: string;
22
- builtAt: number;
23
- }
24
- export interface DevBrowserScriptCacheManifest {
25
- invalidationVersion: string;
26
- buildInputsFingerprint: string;
27
- entries: Record<string, DevBrowserScriptCacheEntry>;
28
- }
29
- /** Returns whether dev-only cross-request content-script bundle cache is active. */
30
- export declare function shouldUseDevBrowserScriptCache(): boolean;
31
- /** Looks up one persisted dev content-script output path by dependency cache key. */
32
- export declare function getDevBrowserScriptCacheEntry(appConfig: EcoPagesAppConfig, depKey: string): DevBrowserScriptCacheHit | null;
33
- /** Persists one dev content-script bundle output for cross-request reuse. */
34
- export declare function setDevBrowserScriptCacheEntry(appConfig: EcoPagesAppConfig, depKey: string, asset: ProcessedAsset): void;
@@ -1,90 +0,0 @@
1
- import path from "node:path";
2
- import { fileSystem } from "@ecopages/file-system";
3
- import { getAppBrowserBuildPlugins } from "../build-adapter.js";
4
- import { createBuildInputsFingerprint, hashAppConfigFile } from "./build-input-fingerprint.js";
5
- import {
6
- readProductionCacheManifest,
7
- writeProductionCacheManifest,
8
- isProductionCacheManifestCurrent,
9
- matchesProductionCacheFingerprint
10
- } from "./production-build-cache.js";
11
- import { getCorePackageVersion } from "./cache-keys.js";
12
- import { resolveInternalExecutionDir } from "../../utils/resolve-work-dir.js";
13
- import { isDevelopmentRuntime } from "../../utils/runtime.js";
14
- const DEV_BROWSER_SCRIPT_CACHE_DIR = ".browser-script-bundles";
15
- const DEV_BROWSER_SCRIPT_CACHE_FILENAME = ".build-cache.json";
16
- function getDevBrowserScriptCacheDir(appConfig) {
17
- return path.join(resolveInternalExecutionDir(appConfig), DEV_BROWSER_SCRIPT_CACHE_DIR);
18
- }
19
- function getDevBrowserScriptCacheManifestPath(appConfig) {
20
- return path.join(getDevBrowserScriptCacheDir(appConfig), DEV_BROWSER_SCRIPT_CACHE_FILENAME);
21
- }
22
- function createBrowserBuildKey(appConfig) {
23
- try {
24
- const pluginNames = getAppBrowserBuildPlugins(appConfig).map((plugin) => plugin.name).sort().join("|");
25
- return pluginNames || "default";
26
- } catch {
27
- return "default";
28
- }
29
- }
30
- function createDevBrowserScriptCacheInvalidationVersion(appConfig) {
31
- return [getCorePackageVersion(), hashAppConfigFile(appConfig), createBrowserBuildKey(appConfig)].join("::");
32
- }
33
- function readManifest(appConfig) {
34
- const manifest = readProductionCacheManifest(
35
- getDevBrowserScriptCacheManifestPath(appConfig)
36
- );
37
- if (!manifest) {
38
- return void 0;
39
- }
40
- const invalidationVersion = createDevBrowserScriptCacheInvalidationVersion(appConfig);
41
- const buildInputsFingerprint = createBuildInputsFingerprint(appConfig);
42
- if (!isProductionCacheManifestCurrent(manifest, invalidationVersion) || !matchesProductionCacheFingerprint(manifest, buildInputsFingerprint)) {
43
- return void 0;
44
- }
45
- return manifest;
46
- }
47
- function writeManifest(appConfig, manifest) {
48
- writeProductionCacheManifest(getDevBrowserScriptCacheManifestPath(appConfig), manifest);
49
- }
50
- function shouldUseDevBrowserScriptCache() {
51
- return isDevelopmentRuntime();
52
- }
53
- function getDevBrowserScriptCacheEntry(appConfig, depKey) {
54
- if (!shouldUseDevBrowserScriptCache()) {
55
- return null;
56
- }
57
- const manifest = readManifest(appConfig);
58
- const entry = manifest?.entries[depKey];
59
- if (!entry?.filepath || !fileSystem.exists(entry.filepath)) {
60
- return null;
61
- }
62
- return { filepath: entry.filepath };
63
- }
64
- function setDevBrowserScriptCacheEntry(appConfig, depKey, asset) {
65
- if (!shouldUseDevBrowserScriptCache() || !asset.filepath) {
66
- return;
67
- }
68
- const invalidationVersion = createDevBrowserScriptCacheInvalidationVersion(appConfig);
69
- const buildInputsFingerprint = createBuildInputsFingerprint(appConfig);
70
- const existing = readManifest(appConfig);
71
- const manifest = existing ?? {
72
- invalidationVersion,
73
- buildInputsFingerprint,
74
- entries: {}
75
- };
76
- manifest.invalidationVersion = invalidationVersion;
77
- manifest.buildInputsFingerprint = buildInputsFingerprint;
78
- manifest.entries[depKey] = {
79
- filepath: asset.filepath,
80
- builtAt: Date.now()
81
- };
82
- writeManifest(appConfig, manifest);
83
- }
84
- export {
85
- DEV_BROWSER_SCRIPT_CACHE_DIR,
86
- DEV_BROWSER_SCRIPT_CACHE_FILENAME,
87
- getDevBrowserScriptCacheEntry,
88
- setDevBrowserScriptCacheEntry,
89
- shouldUseDevBrowserScriptCache
90
- };