@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,120 +1,124 @@
1
- import { getEcoNavigationRuntime } from "../../router/client/navigation-coordinator.js";
2
- (function() {
3
- const WS_URL = "ws://" + location.host + "/_hmr";
4
- let socket;
5
- let reconnectAttempts = 0;
6
- function connect() {
7
- socket = new WebSocket(WS_URL);
8
- socket.addEventListener("open", () => {
9
- console.log("[ecopages] HMR Connected");
10
- reconnectAttempts = 0;
11
- });
12
- socket.addEventListener("message", async (event) => {
13
- try {
14
- const payload = JSON.parse(event.data);
15
- await handleMessage(payload);
16
- } catch (e) {
17
- console.error("[ecopages] Invalid HMR message:", e);
18
- }
19
- });
20
- socket.addEventListener("close", () => {
21
- if (reconnectAttempts < 10) {
22
- setTimeout(connect, 1e3 * 2 ** reconnectAttempts);
23
- reconnectAttempts++;
24
- }
25
- });
26
- }
27
- async function handleMessage(payload) {
28
- const navigationRuntime = getEcoNavigationRuntime(window);
29
- switch (payload.type) {
30
- case "reload":
31
- await waitForNavigationToSettle(navigationRuntime);
32
- if (window.__ECOPAGES_HOST_OWNS_RELOAD__) {
33
- break;
34
- }
35
- location.reload();
36
- break;
37
- case "layout-update": {
38
- await waitForNavigationToSettle(navigationRuntime);
39
- if (await navigationRuntime.reloadCurrentPage({ clearCache: true, moduleUrl: getActiveHmrModuleUrl() })) {
40
- } else if (!window.__ECOPAGES_HOST_OWNS_RELOAD__) {
41
- location.reload();
42
- }
43
- break;
44
- }
45
- case "error":
46
- console.error("[ecopages] HMR Error:", payload.message);
47
- break;
48
- case "update":
49
- if (payload.path) {
50
- await applyUpdate(payload.path, payload.timestamp);
51
- }
52
- break;
53
- case "css-update":
54
- if (payload.path) {
55
- refreshStylesheet(payload.path);
56
- }
57
- break;
1
+ /**
2
+ * Ecopages HMR Runtime
3
+ * Injected into the browser to handle Hot Module Replacement updates.
4
+ */
5
+ import { getEcoNavigationRuntime } from '../../router/client/navigation-coordinator.js';
6
+ import { applyModuleUpdate, resolveActiveModuleUrl } from './module-update.js';
7
+ (function () {
8
+ const WS_URL = 'ws://' + location.host + '/_hmr';
9
+ let socket;
10
+ let reconnectAttempts = 0;
11
+ function connect() {
12
+ socket = new WebSocket(WS_URL);
13
+ socket.addEventListener('open', () => {
14
+ console.log('[ecopages] HMR Connected');
15
+ window.__ECO_HMR_CONNECTED__ = true;
16
+ reconnectAttempts = 0;
17
+ });
18
+ socket.addEventListener('message', async (event) => {
19
+ try {
20
+ const payload = JSON.parse(event.data);
21
+ await handleMessage(payload);
22
+ }
23
+ catch (e) {
24
+ console.error('[ecopages] Invalid HMR message:', e);
25
+ }
26
+ });
27
+ socket.addEventListener('close', () => {
28
+ window.__ECO_HMR_CONNECTED__ = false;
29
+ if (reconnectAttempts < 10) {
30
+ setTimeout(connect, 1000 * 2 ** reconnectAttempts);
31
+ reconnectAttempts++;
32
+ }
33
+ });
58
34
  }
59
- }
60
- async function applyUpdate(path, timestamp) {
61
- try {
62
- const url = path + "?t=" + (timestamp || Date.now());
63
- const handlers = window.__ECO_PAGES__?.hmrHandlers;
64
- const navigationRuntime = getEcoNavigationRuntime(window);
65
- await waitForNavigationToSettle(navigationRuntime);
66
- if (handlers?.[path]) {
67
- await handlers[path](url);
68
- return;
69
- }
70
- await import(url);
71
- if (await navigationRuntime.reloadCurrentPage({ clearCache: false, moduleUrl: url })) {
72
- }
73
- } catch (e) {
74
- console.error("[ecopages] Failed to apply HMR update:", e);
35
+ async function handleMessage(payload) {
36
+ const navigationRuntime = getEcoNavigationRuntime(window);
37
+ switch (payload.type) {
38
+ case 'reload':
39
+ await waitForNavigationToSettle(navigationRuntime);
40
+ if (window.__ECOPAGES_HOST_OWNS_RELOAD__) {
41
+ break;
42
+ }
43
+ location.reload();
44
+ break;
45
+ case 'layout-update': {
46
+ await waitForNavigationToSettle(navigationRuntime);
47
+ if (await navigationRuntime.reloadCurrentPage({
48
+ clearCache: true,
49
+ moduleUrl: getActiveHmrModuleUrl(),
50
+ })) {
51
+ }
52
+ else if (!window.__ECOPAGES_HOST_OWNS_RELOAD__) {
53
+ location.reload();
54
+ }
55
+ break;
56
+ }
57
+ case 'error':
58
+ console.error('[ecopages] HMR Error:', payload.message);
59
+ break;
60
+ case 'update':
61
+ if (payload.path) {
62
+ await applyUpdate(payload.path, payload.timestamp);
63
+ }
64
+ break;
65
+ case 'css-update':
66
+ if (payload.path) {
67
+ refreshStylesheet(payload.path);
68
+ }
69
+ break;
70
+ }
75
71
  }
76
- }
77
- function getActiveHmrModuleUrl() {
78
- const pageModule = window.__ECO_PAGES__?.page?.module;
79
- if (pageModule && pageModule.includes("/assets/_hmr/")) {
80
- return pageModule.split("?")[0];
72
+ async function applyUpdate(path, timestamp) {
73
+ const navigationRuntime = getEcoNavigationRuntime(window);
74
+ await applyModuleUpdate(path, {
75
+ getHandlers: () => window.__ECO_PAGES__?.hmrHandlers,
76
+ getActivePageModule: () => window.__ECO_PAGES__?.page?.module,
77
+ reloadCurrentPage: async (request) => Boolean(await navigationRuntime.reloadCurrentPage(request)),
78
+ importModule: (url) => import(url),
79
+ waitForSettled: async () => waitForNavigationToSettle(navigationRuntime),
80
+ }, timestamp);
81
81
  }
82
- const handlerPaths = Object.keys(window.__ECO_PAGES__?.hmrHandlers ?? {});
83
- return handlerPaths[handlerPaths.length - 1];
84
- }
85
- async function waitForNavigationToSettle(navigationRuntime) {
86
- if (!navigationRuntime.hasPendingNavigationTransaction()) {
87
- return;
82
+ function getActiveHmrModuleUrl() {
83
+ return resolveActiveModuleUrl(window.__ECO_PAGES__?.hmrHandlers ?? {}, window.__ECO_PAGES__?.page?.module);
88
84
  }
89
- await new Promise((resolve) => {
90
- const startedAt = performance.now();
91
- const timeoutMs = 5e3;
92
- const poll = () => {
85
+ async function waitForNavigationToSettle(navigationRuntime) {
93
86
  if (!navigationRuntime.hasPendingNavigationTransaction()) {
94
- resolve();
95
- return;
96
- }
97
- if (performance.now() - startedAt >= timeoutMs) {
98
- resolve();
99
- return;
87
+ return;
100
88
  }
101
- requestAnimationFrame(poll);
102
- };
103
- requestAnimationFrame(poll);
104
- });
105
- }
106
- function refreshStylesheet(path) {
107
- const filename = path.split("/").pop() || "";
108
- const links = document.querySelectorAll('link[rel="stylesheet"]');
109
- links.forEach((link) => {
110
- const href = link.href;
111
- if (href.includes(filename) || href.includes(path.replace(/^.*\/src\//, "/assets/"))) {
112
- const url = new URL(href, location.origin);
113
- url.searchParams.set("t", Date.now().toString());
114
- link.href = url.toString();
115
- console.log("[ecopages] CSS updated:", filename);
116
- }
117
- });
118
- }
119
- connect();
89
+ await new Promise((resolve) => {
90
+ const startedAt = performance.now();
91
+ const timeoutMs = 5_000;
92
+ const poll = () => {
93
+ if (!navigationRuntime.hasPendingNavigationTransaction()) {
94
+ resolve();
95
+ return;
96
+ }
97
+ if (performance.now() - startedAt >= timeoutMs) {
98
+ resolve();
99
+ return;
100
+ }
101
+ requestAnimationFrame(poll);
102
+ };
103
+ requestAnimationFrame(poll);
104
+ });
105
+ }
106
+ /**
107
+ * Hot-reload CSS by updating stylesheet link href with cache-busting query param.
108
+ * This causes the browser to re-fetch the stylesheet without a full page reload.
109
+ */
110
+ function refreshStylesheet(path) {
111
+ const filename = path.split('/').pop() || '';
112
+ const links = document.querySelectorAll('link[rel="stylesheet"]');
113
+ links.forEach((link) => {
114
+ const href = link.href;
115
+ if (href.includes(filename) || href.includes(path.replace(/^.*\/src\//, '/assets/'))) {
116
+ const url = new URL(href, location.origin);
117
+ url.searchParams.set('t', Date.now().toString());
118
+ link.href = url.toString();
119
+ console.log('[ecopages] CSS updated:', filename);
120
+ }
121
+ });
122
+ }
123
+ connect();
120
124
  })();
@@ -0,0 +1,13 @@
1
+ export type HmrModuleHandlers = Record<string, (url: string) => Promise<void> | void>;
2
+ export type ApplyModuleUpdateContext = {
3
+ getHandlers: () => HmrModuleHandlers | undefined;
4
+ getActivePageModule?: () => string | undefined;
5
+ reloadCurrentPage: (request: {
6
+ clearCache: boolean;
7
+ moduleUrl: string;
8
+ }) => Promise<boolean>;
9
+ importModule: (url: string) => Promise<unknown>;
10
+ waitForSettled: () => Promise<void>;
11
+ };
12
+ export declare function resolveActiveModuleUrl(handlers: HmrModuleHandlers, pageModule?: string): string | undefined;
13
+ export declare function applyModuleUpdate(path: string, context: ApplyModuleUpdateContext, timestamp?: number): Promise<void>;
@@ -0,0 +1,39 @@
1
+ import { isDevTransformModuleUrl, stripModuleUrlQuery, withModuleCacheBust } from '../hmr-asset-paths.js';
2
+ export function resolveActiveModuleUrl(handlers, pageModule) {
3
+ if (pageModule) {
4
+ const basePath = stripModuleUrlQuery(pageModule);
5
+ if (isDevTransformModuleUrl(basePath)) {
6
+ return basePath;
7
+ }
8
+ }
9
+ const handlerPaths = Object.keys(handlers);
10
+ for (let index = handlerPaths.length - 1; index >= 0; index -= 1) {
11
+ const handlerPath = handlerPaths[index];
12
+ if (isDevTransformModuleUrl(handlerPath)) {
13
+ return handlerPath;
14
+ }
15
+ }
16
+ return handlerPaths[handlerPaths.length - 1];
17
+ }
18
+ export async function applyModuleUpdate(path, context, timestamp) {
19
+ const basePath = stripModuleUrlQuery(path);
20
+ const url = withModuleCacheBust(basePath, timestamp);
21
+ const handlers = context.getHandlers();
22
+ await context.waitForSettled();
23
+ const handler = handlers?.[basePath];
24
+ if (handler) {
25
+ await handler(url);
26
+ return;
27
+ }
28
+ if (isDevTransformModuleUrl(basePath)) {
29
+ const activePageModule = context.getActivePageModule?.();
30
+ const isActivePageModule = activePageModule !== undefined && stripModuleUrlQuery(activePageModule) === basePath;
31
+ if (isActivePageModule) {
32
+ await context.reloadCurrentPage({ clearCache: false, moduleUrl: url });
33
+ return;
34
+ }
35
+ await context.importModule(url);
36
+ return;
37
+ }
38
+ console.warn(`[ecopages] No HMR handler for module update: ${basePath}`);
39
+ }
@@ -0,0 +1,14 @@
1
+ export declare const DEV_TRANSFORM_URL_PREFIX = "/assets/__eco_dev__";
2
+ export declare const VENDOR_URL_PREFIX = "/assets/vendors";
3
+ /**
4
+ * Strips cache-busting query parameters from a browser module URL.
5
+ */
6
+ export declare function stripModuleUrlQuery(moduleUrl: string): string;
7
+ /**
8
+ * Returns true when a module URL is served by the dev transform server.
9
+ */
10
+ export declare function isDevTransformModuleUrl(moduleUrl: string): boolean;
11
+ /**
12
+ * Appends a cache-busting query parameter for hot module imports.
13
+ */
14
+ export declare function withModuleCacheBust(moduleUrl: string, timestamp?: number): string;
@@ -0,0 +1,22 @@
1
+ import { RESOLVED_ASSETS_DIR } from '../config/constants.js';
2
+ export const DEV_TRANSFORM_URL_PREFIX = `/${RESOLVED_ASSETS_DIR}/__eco_dev__`;
3
+ export const VENDOR_URL_PREFIX = `/${RESOLVED_ASSETS_DIR}/vendors`;
4
+ /**
5
+ * Strips cache-busting query parameters from a browser module URL.
6
+ */
7
+ export function stripModuleUrlQuery(moduleUrl) {
8
+ return moduleUrl.split('?')[0] ?? moduleUrl;
9
+ }
10
+ /**
11
+ * Returns true when a module URL is served by the dev transform server.
12
+ */
13
+ export function isDevTransformModuleUrl(moduleUrl) {
14
+ return stripModuleUrlQuery(moduleUrl).startsWith(`${DEV_TRANSFORM_URL_PREFIX}/`);
15
+ }
16
+ /**
17
+ * Appends a cache-busting query parameter for hot module imports.
18
+ */
19
+ export function withModuleCacheBust(moduleUrl, timestamp) {
20
+ const basePath = stripModuleUrlQuery(moduleUrl);
21
+ return `${basePath}?t=${timestamp ?? Date.now()}`;
22
+ }
@@ -1,49 +1,21 @@
1
- /**
2
- * Verified HMR entrypoint artifact produced by registration.
3
- */
1
+ export type HmrEntrypointRole = 'page' | 'script';
4
2
  export interface ResolvedHmrEntrypoint {
5
3
  sourcePath: string;
4
+ /**
5
+ * Emitted artifact path for disk-based HMR, or the resolved source path for
6
+ * dev-transform entrypoints where modules are served on demand.
7
+ */
6
8
  outputPath: string;
7
9
  outputUrl: string;
10
+ role: HmrEntrypointRole;
8
11
  }
9
- /**
10
- * Returns whether a source path is a registered client script HMR entrypoint.
11
- */
12
- export declare function isRegisteredScriptEntrypoint(registered: ReadonlyMap<string, unknown>, filePath: string): boolean;
13
- /**
14
- * Returns whether a registered script entrypoint is browser-only and must not be
15
- * server-imported during HMR invalidation.
16
- *
17
- * @remarks
18
- * Declared `*.script.ts` modules run only in the browser bundle. Re-importing them
19
- * on the server during `prepareRegisteredScriptChange()` executes DOM globals and
20
- * aborts the watcher before the client artifact rebuilds. Radiant `*.script.tsx`
21
- * entrypoints are server-rendered and remain on the invalidation path.
22
- */
23
- export declare function isBrowserOnlyRegisteredScriptEntrypoint(filePath: string): boolean;
12
+ export declare function isRegisteredDevTransformEntrypoint(registered: ReadonlyMap<string, ResolvedHmrEntrypoint>, filePath: string): boolean;
13
+ export declare function isRegisteredScriptEntrypoint(registered: ReadonlyMap<string, ResolvedHmrEntrypoint>, filePath: string): boolean;
24
14
  export declare function encodeHmrDynamicSegments(filepath: string): string;
25
- /**
26
- * Resolves the on-disk and browser URL targets for one HMR script entrypoint.
27
- */
28
- export declare function resolveHmrEntrypointOutputPaths(srcDir: string, distDir: string, entrypointPath: string): {
29
- outputPath: string;
30
- outputUrl: string;
31
- };
15
+ export declare function decodeHmrDynamicSegments(filepath: string): string;
32
16
  /**
33
17
  * @remarks
34
- * Rebuilds must delete the previous artifact so browser-hmr does not reuse a
35
- * stale bundle when the source file changed.
18
+ * Runtime rebuilds must delete the previous artifact so the bundler does not
19
+ * reuse a stale bundle when the source file changed.
36
20
  */
37
21
  export declare function removeStaleHmrEntrypointOutput(outputPath: string, scope: string): void;
38
- /**
39
- * @remarks
40
- * Guards against broadcasting reload/update before the bundler has flushed a
41
- * fresher artifact than the edited source file.
42
- */
43
- export declare function isHmrOutputFresh(outputPath: string, sourcePath: string): boolean;
44
- /**
45
- * @remarks
46
- * Missing output is treated as a benign rebuild race. This helper isolates the
47
- * post-build case where a bundle exists but is still older than its source.
48
- */
49
- export declare function isHmrOutputOlderThanSource(outputPath: string, sourcePath: string): boolean;
@@ -1,60 +1,34 @@
1
- import fs from "node:fs";
2
- import path from "node:path";
3
- import { fileSystem } from "@ecopages/file-system";
4
- import { RESOLVED_ASSETS_DIR } from "../config/constants.js";
5
- import { appLogger } from "../global/app-logger.js";
6
- function isRegisteredScriptEntrypoint(registered, filePath) {
7
- return registered.has(path.resolve(filePath));
1
+ import path from 'node:path';
2
+ import { fileSystem } from '@ecopages/file-system';
3
+ import { appLogger } from '../global/app-logger.js';
4
+ function resolveRegisteredEntrypoint(registered, filePath) {
5
+ return registered.get(path.resolve(filePath));
8
6
  }
9
- function isBrowserOnlyRegisteredScriptEntrypoint(filePath) {
10
- return /\.script\.ts$/u.test(path.resolve(filePath));
7
+ export function isRegisteredDevTransformEntrypoint(registered, filePath) {
8
+ return resolveRegisteredEntrypoint(registered, filePath) !== undefined;
11
9
  }
12
- function encodeHmrDynamicSegments(filepath) {
13
- return filepath.replace(/\[([^\]]+)\]/g, "_$1_");
10
+ export function isRegisteredScriptEntrypoint(registered, filePath) {
11
+ return resolveRegisteredEntrypoint(registered, filePath)?.role === 'script';
14
12
  }
15
- function resolveHmrEntrypointOutputPaths(srcDir, distDir, entrypointPath) {
16
- const normalizedEntrypoint = path.resolve(entrypointPath);
17
- const relativePath = path.relative(srcDir, normalizedEntrypoint);
18
- const relativePathJs = relativePath.replace(/\.(tsx?|jsx?|mdx?)$/, ".js");
19
- const encodedPathJs = encodeHmrDynamicSegments(relativePathJs);
20
- const urlPath = encodedPathJs.split(path.sep).join("/");
21
- return {
22
- outputUrl: `/${path.join(RESOLVED_ASSETS_DIR, "_hmr", urlPath).split(path.sep).join("/")}`,
23
- outputPath: path.join(distDir, urlPath)
24
- };
13
+ export function encodeHmrDynamicSegments(filepath) {
14
+ return filepath.replace(/\[([^\]]+)\]/g, '_$1_');
25
15
  }
26
- function removeStaleHmrEntrypointOutput(outputPath, scope) {
27
- if (!fileSystem.exists(outputPath)) {
28
- return;
29
- }
30
- try {
31
- fileSystem.remove(outputPath);
32
- } catch (error) {
33
- appLogger.warn(
34
- `[${scope}] Failed to remove stale entrypoint output ${outputPath}: ${error instanceof Error ? error.message : String(error)}`
35
- );
36
- }
16
+ export function decodeHmrDynamicSegments(filepath) {
17
+ return filepath.replace(/_([^_/\\]+)_/g, '[$1]');
37
18
  }
38
- function isHmrOutputFresh(outputPath, sourcePath) {
39
- if (!fileSystem.exists(outputPath) || !fileSystem.exists(sourcePath)) {
40
- return false;
41
- }
42
- const outputMtimeMs = fs.statSync(outputPath).mtimeMs;
43
- const sourceMtimeMs = fs.statSync(sourcePath).mtimeMs;
44
- return outputMtimeMs >= sourceMtimeMs;
19
+ /**
20
+ * @remarks
21
+ * Runtime rebuilds must delete the previous artifact so the bundler does not
22
+ * reuse a stale bundle when the source file changed.
23
+ */
24
+ export function removeStaleHmrEntrypointOutput(outputPath, scope) {
25
+ if (!fileSystem.exists(outputPath)) {
26
+ return;
27
+ }
28
+ try {
29
+ fileSystem.remove(outputPath);
30
+ }
31
+ catch (error) {
32
+ appLogger.warn(`[${scope}] Failed to remove stale entrypoint output ${outputPath}: ${error instanceof Error ? error.message : String(error)}`);
33
+ }
45
34
  }
46
- function isHmrOutputOlderThanSource(outputPath, sourcePath) {
47
- if (!fileSystem.exists(outputPath) || !fileSystem.exists(sourcePath)) {
48
- return false;
49
- }
50
- return fs.statSync(outputPath).mtimeMs < fs.statSync(sourcePath).mtimeMs;
51
- }
52
- export {
53
- encodeHmrDynamicSegments,
54
- isBrowserOnlyRegisteredScriptEntrypoint,
55
- isHmrOutputFresh,
56
- isHmrOutputOlderThanSource,
57
- isRegisteredScriptEntrypoint,
58
- removeStaleHmrEntrypointOutput,
59
- resolveHmrEntrypointOutputPaths
60
- };
@@ -1,17 +1,14 @@
1
- import path from "node:path";
2
- import {
3
- getAffectedPageBrowserGraphIdentities,
4
- invalidatePageBrowserGraphSession
5
- } from "../route-renderer/orchestration/page-browser-graph/page-browser-graph-session.js";
6
- function prepareHmrFileChange(appConfig, filePath) {
7
- const resolvedFilePath = path.resolve(filePath);
8
- const affectedGraphIdentities = getAffectedPageBrowserGraphIdentities(appConfig, resolvedFilePath);
9
- const invalidatedGraphCount = invalidatePageBrowserGraphSession(appConfig, resolvedFilePath);
10
- return {
11
- affectedGraphIdentities,
12
- invalidatedGraphCount
13
- };
1
+ import path from 'node:path';
2
+ import { getAffectedPageBrowserGraphIdentities, invalidatePageBrowserGraphSession, } from '../route-renderer/orchestration/page-browser-graph/page-browser-graph-session.js';
3
+ /**
4
+ * Invalidates affected Page Browser Graph records before HMR strategy dispatch.
5
+ */
6
+ export function prepareHmrFileChange(appConfig, filePath) {
7
+ const resolvedFilePath = path.resolve(filePath);
8
+ const affectedGraphIdentities = getAffectedPageBrowserGraphIdentities(appConfig, resolvedFilePath);
9
+ const invalidatedGraphCount = invalidatePageBrowserGraphSession(appConfig, resolvedFilePath);
10
+ return {
11
+ affectedGraphIdentities,
12
+ invalidatedGraphCount,
13
+ };
14
14
  }
15
- export {
16
- prepareHmrFileChange
17
- };
@@ -0,0 +1,7 @@
1
+ import type { ResolvedHmrEntrypoint } from './hmr-entrypoint-output.js';
2
+ /**
3
+ * Read-only access to dev-transform entrypoints registered for HMR.
4
+ */
5
+ export interface HmrRegisteredEntrypointsContext {
6
+ getRegisteredEntrypoints(): ReadonlyMap<string, ResolvedHmrEntrypoint>;
7
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,10 @@
1
+ /** On-disk work directory segment under {@link RESOLVED_ASSETS_DIR} for the bundled HMR client runtime. */
2
+ export declare const HMR_RUNTIME_WORK_DIR_SEGMENT = "hmr-runtime";
3
+ /** Browser URL for the bundled HMR client runtime script. */
4
+ export declare const HMR_RUNTIME_SCRIPT_URL = "/_hmr_runtime.js";
5
+ /** WebSocket path used by the HMR client runtime for dev server events. */
6
+ export declare const HMR_WEBSOCKET_PATH = "/_hmr";
7
+ /**
8
+ * Absolute work-directory path for HMR runtime artifacts under an app work dir.
9
+ */
10
+ export declare function resolveHmrRuntimeWorkDir(workDir: string): string;
@@ -0,0 +1,13 @@
1
+ import { RESOLVED_ASSETS_DIR } from '../config/constants.js';
2
+ /** On-disk work directory segment under {@link RESOLVED_ASSETS_DIR} for the bundled HMR client runtime. */
3
+ export const HMR_RUNTIME_WORK_DIR_SEGMENT = 'hmr-runtime';
4
+ /** Browser URL for the bundled HMR client runtime script. */
5
+ export const HMR_RUNTIME_SCRIPT_URL = '/_hmr_runtime.js';
6
+ /** WebSocket path used by the HMR client runtime for dev server events. */
7
+ export const HMR_WEBSOCKET_PATH = '/_hmr';
8
+ /**
9
+ * Absolute work-directory path for HMR runtime artifacts under an app work dir.
10
+ */
11
+ export function resolveHmrRuntimeWorkDir(workDir) {
12
+ return `${workDir}/${RESOLVED_ASSETS_DIR}/${HMR_RUNTIME_WORK_DIR_SEGMENT}`;
13
+ }
@@ -134,20 +134,14 @@ export declare abstract class HmrStrategy {
134
134
  */
135
135
  abstract matches(filePath: string): boolean;
136
136
  /**
137
- * Returns whether this strategy owns cold registration for the entrypoint.
137
+ * Returns whether this strategy supplies dev-transform plugins for a source module.
138
138
  *
139
139
  * @remarks
140
- * Registration dispatch uses only integration strategies that claim the
141
- * entrypoint. File-change dispatch continues to use {@link matches}.
140
+ * Used by {@link DevTransformBundler} to select integration-owned plugins for any
141
+ * module in the per-file ESM graph (pages and imported children). File-change
142
+ * dispatch continues to use {@link matches}.
142
143
  */
143
- canEmitEntrypoint(_entrypointPath: string): boolean;
144
- /**
145
- * Materializes one integration-owned HMR entrypoint during registration.
146
- *
147
- * @remarks
148
- * Must write the canonical output path and must not broadcast client events.
149
- */
150
- emitEntrypoint(_entrypointPath: string, _outputPath: string): Promise<void>;
144
+ ownsDevTransformEntrypoint(_sourcePath: string): boolean;
151
145
  /**
152
146
  * Processes a file change and returns the action to take.
153
147
  *