@ecopages/core 0.2.0-alpha.5 → 0.2.0-alpha.7

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 (418) hide show
  1. package/README.md +213 -12
  2. package/package.json +100 -188
  3. package/src/adapters/README.md +39 -0
  4. package/src/adapters/bun/hmr-manager.test.ts +267 -0
  5. package/src/adapters/bun/hmr-manager.ts +180 -47
  6. package/src/adapters/bun/index.ts +1 -2
  7. package/src/adapters/bun/server-adapter.ts +41 -34
  8. package/src/adapters/bun/server-lifecycle.ts +40 -70
  9. package/src/adapters/index.ts +1 -1
  10. package/src/adapters/node/bootstrap-dependency-resolver.test.ts +282 -0
  11. package/src/adapters/node/bootstrap-dependency-resolver.ts +301 -0
  12. package/src/adapters/node/index.ts +7 -0
  13. package/src/adapters/node/node-client-bridge.test.ts +198 -0
  14. package/src/adapters/node/node-hmr-manager.test.ts +322 -0
  15. package/src/adapters/node/node-hmr-manager.ts +207 -97
  16. package/src/adapters/node/runtime-adapter.test.ts +868 -0
  17. package/src/adapters/node/runtime-adapter.ts +439 -0
  18. package/src/adapters/node/server-adapter.ts +31 -104
  19. package/src/adapters/node/static-content-server.test.ts +60 -0
  20. package/src/adapters/node/static-content-server.ts +36 -0
  21. package/src/adapters/node/write-runtime-manifest.ts +38 -0
  22. package/src/adapters/shared/api-response.test.ts +97 -0
  23. package/src/{define-api-handler.ts → adapters/shared/define-api-handler.ts} +1 -1
  24. package/src/adapters/shared/explicit-static-route-matcher.test.ts +381 -0
  25. package/src/adapters/shared/explicit-static-route-matcher.ts +7 -1
  26. package/src/adapters/shared/file-route-middleware-pipeline.test.ts +90 -0
  27. package/src/adapters/shared/file-route-middleware-pipeline.ts +6 -2
  28. package/src/adapters/shared/fs-server-response-factory.test.ts +187 -0
  29. package/src/adapters/shared/fs-server-response-matcher.test.ts +286 -0
  30. package/src/adapters/shared/fs-server-response-matcher.ts +17 -10
  31. package/src/adapters/shared/hmr-entrypoint-registrar.ts +149 -0
  32. package/src/adapters/shared/hmr-html-response.ts +52 -0
  33. package/src/adapters/shared/hmr-manager.contract.test.ts +196 -0
  34. package/src/adapters/shared/hmr-manager.dispatch.test.ts +220 -0
  35. package/src/adapters/shared/render-context.test.ts +146 -0
  36. package/src/adapters/shared/render-context.ts +21 -6
  37. package/src/adapters/shared/runtime-bootstrap.ts +79 -0
  38. package/src/adapters/shared/server-adapter.test.ts +77 -0
  39. package/src/adapters/shared/server-adapter.ts +51 -4
  40. package/src/adapters/shared/server-route-handler.test.ts +110 -0
  41. package/src/adapters/shared/server-route-handler.ts +5 -18
  42. package/src/adapters/shared/server-static-builder.test.ts +316 -0
  43. package/src/adapters/shared/server-static-builder.ts +92 -8
  44. package/src/build/README.md +101 -0
  45. package/src/build/build-adapter-serialization.test.ts +268 -0
  46. package/src/build/build-adapter.test.ts +815 -0
  47. package/src/build/build-adapter.ts +234 -6
  48. package/src/build/build-manifest.ts +54 -0
  49. package/src/build/dev-build-coordinator.ts +221 -0
  50. package/src/build/esbuild-build-adapter.ts +132 -84
  51. package/src/build/runtime-build-executor.ts +34 -0
  52. package/src/build/runtime-specifier-alias-plugin.test.ts +43 -0
  53. package/src/build/runtime-specifier-alias-plugin.ts +58 -0
  54. package/src/config/README.md +33 -0
  55. package/src/config/config-builder.test.ts +410 -0
  56. package/src/config/config-builder.ts +281 -49
  57. package/src/constants.ts +15 -0
  58. package/src/declarations.d.ts +18 -13
  59. package/src/eco/README.md +70 -16
  60. package/src/eco/component-render-context.ts +39 -17
  61. package/src/eco/eco.test.ts +678 -0
  62. package/src/eco/eco.ts +29 -8
  63. package/src/eco/eco.types.ts +20 -1
  64. package/src/eco/eco.utils.test.ts +124 -0
  65. package/src/eco/global-injector-map.test.ts +42 -0
  66. package/src/eco/lazy-injector-map.test.ts +66 -0
  67. package/src/eco/module-dependencies.test.ts +30 -0
  68. package/src/errors/http-error.test.ts +134 -0
  69. package/src/global/utils.test.ts +12 -0
  70. package/src/hmr/README.md +26 -0
  71. package/src/hmr/client/__screenshots__/hmr-runtime.test.browser.ts/HMR-Runtime-HMR-Server-Integration-should-have-HMR-script-injected-in-page-1.png +0 -0
  72. package/src/hmr/client/__screenshots__/hmr-runtime.test.browser.ts/HMR-Runtime-HMR-Server-Integration-should-load-fixture-app-page-1.png +0 -0
  73. package/src/hmr/client/__screenshots__/hmr-runtime.test.browser.ts/HMR-Runtime-WebSocket-Connection-should-connect-to-correct-HMR-endpoint-1.png +0 -0
  74. package/src/hmr/client/hmr-runtime.ts +38 -7
  75. package/src/hmr/hmr-strategy.test.ts +124 -0
  76. package/src/hmr/hmr.postcss.test.e2e.ts +41 -0
  77. package/src/hmr/hmr.test.e2e.ts +29 -38
  78. package/src/hmr/strategies/js-hmr-strategy.test.ts +335 -0
  79. package/src/hmr/strategies/js-hmr-strategy.ts +71 -78
  80. package/src/index.ts +1 -1
  81. package/src/integrations/ghtml/ghtml-renderer.test.ts +63 -0
  82. package/src/integrations/ghtml/ghtml-renderer.ts +4 -1
  83. package/src/internal-types.ts +39 -19
  84. package/src/plugins/README.md +34 -0
  85. package/src/plugins/alias-resolver-plugin.test.ts +41 -0
  86. package/src/plugins/alias-resolver-plugin.ts +21 -3
  87. package/src/plugins/eco-component-meta-plugin.test.ts +380 -0
  88. package/src/plugins/eco-component-meta-plugin.ts +10 -3
  89. package/src/plugins/integration-plugin.test.ts +111 -0
  90. package/src/plugins/integration-plugin.ts +45 -3
  91. package/src/plugins/processor.test.ts +148 -0
  92. package/src/plugins/processor.ts +22 -2
  93. package/src/plugins/runtime-capability.ts +14 -0
  94. package/src/public-types.ts +73 -11
  95. package/src/route-renderer/GRAPH.md +16 -20
  96. package/src/route-renderer/README.md +8 -21
  97. package/src/route-renderer/component-graph/component-graph-executor.test.ts +41 -0
  98. package/src/route-renderer/component-graph/component-graph.test.ts +63 -0
  99. package/src/route-renderer/component-graph/component-marker.test.ts +73 -0
  100. package/src/route-renderer/component-graph/component-reference.ts +29 -0
  101. package/src/route-renderer/component-graph/marker-graph-resolver.test.ts +135 -0
  102. package/src/route-renderer/{marker-graph-resolver.ts → component-graph/marker-graph-resolver.ts} +11 -9
  103. package/src/route-renderer/orchestration/integration-renderer.test.ts +936 -0
  104. package/src/route-renderer/{integration-renderer.ts → orchestration/integration-renderer.ts} +113 -19
  105. package/src/route-renderer/orchestration/render-execution.service.test.ts +97 -0
  106. package/src/route-renderer/{render-execution.service.ts → orchestration/render-execution.service.ts} +109 -37
  107. package/src/route-renderer/orchestration/render-preparation.service.test.ts +235 -0
  108. package/src/route-renderer/{render-preparation.service.ts → orchestration/render-preparation.service.ts} +127 -9
  109. package/src/route-renderer/page-loading/dependency-resolver.test.ts +345 -0
  110. package/src/route-renderer/{dependency-resolver.ts → page-loading/dependency-resolver.ts} +28 -12
  111. package/src/route-renderer/page-loading/page-module-loader.test.ts +96 -0
  112. package/src/route-renderer/{page-module-loader.ts → page-loading/page-module-loader.ts} +49 -21
  113. package/src/route-renderer/route-renderer.ts +36 -1
  114. package/src/router/README.md +26 -0
  115. package/src/router/client/link-intent.d.ts +53 -0
  116. package/src/router/client/link-intent.test.browser.ts +51 -0
  117. package/src/router/client/link-intent.ts +92 -0
  118. package/src/router/client/navigation-coordinator.test.ts +237 -0
  119. package/src/router/client/navigation-coordinator.ts +433 -0
  120. package/src/router/server/fs-router-scanner.test.ts +83 -0
  121. package/src/router/{fs-router-scanner.ts → server/fs-router-scanner.ts} +12 -10
  122. package/src/router/server/fs-router.test.ts +214 -0
  123. package/src/router/{fs-router.ts → server/fs-router.ts} +2 -2
  124. package/src/services/README.md +29 -0
  125. package/src/services/assets/asset-processing-service/asset-processing.service.test.ts +385 -0
  126. package/src/services/{asset-processing-service → assets/asset-processing-service}/asset-processing.service.ts +101 -6
  127. package/src/services/assets/asset-processing-service/asset.factory.test.ts +63 -0
  128. package/src/services/{asset-processing-service → assets/asset-processing-service}/asset.factory.ts +2 -2
  129. package/src/services/{asset-processing-service → assets/asset-processing-service}/assets.types.ts +2 -1
  130. package/src/services/assets/asset-processing-service/browser-runtime-asset.factory.test.ts +72 -0
  131. package/src/services/assets/asset-processing-service/browser-runtime-asset.factory.ts +95 -0
  132. package/src/services/assets/asset-processing-service/browser-runtime-entry.factory.test.ts +67 -0
  133. package/src/services/assets/asset-processing-service/browser-runtime-entry.factory.ts +78 -0
  134. package/src/services/{asset-processing-service → assets/asset-processing-service}/index.ts +2 -0
  135. package/src/services/{asset-processing-service → assets/asset-processing-service}/processor.interface.ts +1 -1
  136. package/src/services/assets/asset-processing-service/processors/base/base-processor.test.ts +59 -0
  137. package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/base/base-processor.ts +11 -5
  138. package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/base/base-script-processor.ts +17 -27
  139. package/src/services/assets/asset-processing-service/processors/script/file-script.processor.test.ts +286 -0
  140. package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/script/file-script.processor.ts +3 -3
  141. package/src/services/assets/asset-processing-service/processors/script/node-module-script.processor.test.ts +227 -0
  142. package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/script/node-module-script.processor.ts +5 -4
  143. package/src/services/assets/asset-processing-service/processors/stylesheet/content-stylesheet.processor.test.ts +199 -0
  144. package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/stylesheet/file-stylesheet.processor.ts +4 -1
  145. package/src/services/assets/browser-bundle.service.test.ts +36 -0
  146. package/src/services/assets/browser-bundle.service.ts +53 -0
  147. package/src/services/cache/index.ts +3 -3
  148. package/src/services/cache/memory-cache-store.test.ts +225 -0
  149. package/src/services/cache/memory-cache-store.ts +1 -1
  150. package/src/services/cache/page-cache-service.test.ts +175 -0
  151. package/src/services/cache/page-cache-service.ts +3 -3
  152. package/src/services/cache/page-request-cache-coordinator.service.test.ts +79 -0
  153. package/src/services/{page-request-cache-coordinator.service.ts → cache/page-request-cache-coordinator.service.ts} +9 -6
  154. package/src/services/html/html-rewriter-provider.service.test.ts +183 -0
  155. package/src/services/html/html-rewriter-provider.service.ts +103 -0
  156. package/src/services/html/html-transformer.service.test.ts +378 -0
  157. package/src/services/html/html-transformer.service.ts +279 -0
  158. package/src/services/invalidation/development-invalidation.service.test.ts +77 -0
  159. package/src/services/invalidation/development-invalidation.service.ts +261 -0
  160. package/src/services/module-loading/app-server-module-transpiler.service.ts +52 -0
  161. package/src/services/module-loading/page-module-import.service.test.ts +253 -0
  162. package/src/services/module-loading/page-module-import.service.ts +200 -0
  163. package/src/services/module-loading/server-loader.service.test.ts +161 -0
  164. package/src/services/module-loading/server-loader.service.ts +130 -0
  165. package/src/services/module-loading/server-module-transpiler.service.test.ts +115 -0
  166. package/src/services/module-loading/server-module-transpiler.service.ts +105 -0
  167. package/src/services/runtime-manifest/node-runtime-manifest.service.test.ts +95 -0
  168. package/src/services/runtime-manifest/node-runtime-manifest.service.ts +101 -0
  169. package/src/services/runtime-state/dev-graph.service.ts +217 -0
  170. package/src/services/runtime-state/entrypoint-dependency-graph.service.ts +136 -0
  171. package/src/services/runtime-state/runtime-specifier-registry.service.ts +96 -0
  172. package/src/services/runtime-state/server-invalidation-state.service.ts +68 -0
  173. package/src/services/validation/schema-validation-service.test.ts +223 -0
  174. package/src/services/{schema-validation-service.ts → validation/schema-validation-service.ts} +1 -1
  175. package/src/static-site-generator/README.md +26 -0
  176. package/src/static-site-generator/static-site-generator.test.ts +307 -0
  177. package/src/static-site-generator/static-site-generator.ts +109 -6
  178. package/src/utils/deep-merge.test.ts +114 -0
  179. package/src/utils/invariant.test.ts +22 -0
  180. package/src/utils/path-utils.test.ts +15 -0
  181. package/src/utils/resolve-work-dir.ts +45 -0
  182. package/src/utils/server-utils.test.ts +38 -0
  183. package/src/watchers/project-watcher.integration.test.ts +337 -0
  184. package/src/watchers/project-watcher.test-helpers.ts +1 -0
  185. package/src/watchers/project-watcher.test.ts +678 -0
  186. package/src/watchers/project-watcher.ts +49 -50
  187. package/CHANGELOG.md +0 -94
  188. package/src/adapters/abstract/application-adapter.d.ts +0 -168
  189. package/src/adapters/abstract/application-adapter.js +0 -109
  190. package/src/adapters/abstract/router-adapter.d.ts +0 -26
  191. package/src/adapters/abstract/router-adapter.js +0 -5
  192. package/src/adapters/abstract/server-adapter.d.ts +0 -69
  193. package/src/adapters/abstract/server-adapter.js +0 -15
  194. package/src/adapters/bun/client-bridge.d.ts +0 -34
  195. package/src/adapters/bun/client-bridge.js +0 -48
  196. package/src/adapters/bun/create-app.d.ts +0 -60
  197. package/src/adapters/bun/create-app.js +0 -117
  198. package/src/adapters/bun/define-api-handler.d.ts +0 -61
  199. package/src/adapters/bun/define-api-handler.js +0 -15
  200. package/src/adapters/bun/define-api-handler.ts +0 -114
  201. package/src/adapters/bun/hmr-manager.d.ts +0 -79
  202. package/src/adapters/bun/hmr-manager.js +0 -222
  203. package/src/adapters/bun/index.d.ts +0 -3
  204. package/src/adapters/bun/index.js +0 -8
  205. package/src/adapters/bun/server-adapter.d.ts +0 -155
  206. package/src/adapters/bun/server-adapter.js +0 -368
  207. package/src/adapters/bun/server-lifecycle.d.ts +0 -52
  208. package/src/adapters/bun/server-lifecycle.js +0 -120
  209. package/src/adapters/index.d.ts +0 -6
  210. package/src/adapters/index.js +0 -14
  211. package/src/adapters/node/create-app.d.ts +0 -21
  212. package/src/adapters/node/create-app.js +0 -143
  213. package/src/adapters/node/index.d.ts +0 -4
  214. package/src/adapters/node/index.js +0 -8
  215. package/src/adapters/node/node-client-bridge.d.ts +0 -26
  216. package/src/adapters/node/node-client-bridge.js +0 -66
  217. package/src/adapters/node/node-hmr-manager.d.ts +0 -62
  218. package/src/adapters/node/node-hmr-manager.js +0 -221
  219. package/src/adapters/node/server-adapter.d.ts +0 -190
  220. package/src/adapters/node/server-adapter.js +0 -420
  221. package/src/adapters/node/static-content-server.d.ts +0 -24
  222. package/src/adapters/node/static-content-server.js +0 -166
  223. package/src/adapters/shared/api-response.d.ts +0 -52
  224. package/src/adapters/shared/api-response.js +0 -96
  225. package/src/adapters/shared/application-adapter.d.ts +0 -18
  226. package/src/adapters/shared/application-adapter.js +0 -90
  227. package/src/adapters/shared/explicit-static-route-matcher.d.ts +0 -38
  228. package/src/adapters/shared/explicit-static-route-matcher.js +0 -100
  229. package/src/adapters/shared/file-route-middleware-pipeline.d.ts +0 -65
  230. package/src/adapters/shared/file-route-middleware-pipeline.js +0 -98
  231. package/src/adapters/shared/fs-server-response-factory.d.ts +0 -19
  232. package/src/adapters/shared/fs-server-response-factory.js +0 -97
  233. package/src/adapters/shared/fs-server-response-matcher.d.ts +0 -71
  234. package/src/adapters/shared/fs-server-response-matcher.js +0 -155
  235. package/src/adapters/shared/render-context.d.ts +0 -14
  236. package/src/adapters/shared/render-context.js +0 -69
  237. package/src/adapters/shared/server-adapter.d.ts +0 -87
  238. package/src/adapters/shared/server-adapter.js +0 -353
  239. package/src/adapters/shared/server-route-handler.d.ts +0 -89
  240. package/src/adapters/shared/server-route-handler.js +0 -120
  241. package/src/adapters/shared/server-static-builder.d.ts +0 -38
  242. package/src/adapters/shared/server-static-builder.js +0 -46
  243. package/src/build/build-adapter.d.ts +0 -75
  244. package/src/build/build-adapter.js +0 -54
  245. package/src/build/build-types.d.ts +0 -57
  246. package/src/build/build-types.js +0 -0
  247. package/src/build/esbuild-build-adapter.d.ts +0 -69
  248. package/src/build/esbuild-build-adapter.js +0 -391
  249. package/src/config/config-builder.d.ts +0 -227
  250. package/src/config/config-builder.js +0 -392
  251. package/src/constants.d.ts +0 -32
  252. package/src/constants.js +0 -21
  253. package/src/create-app.d.ts +0 -17
  254. package/src/create-app.js +0 -66
  255. package/src/define-api-handler.d.ts +0 -25
  256. package/src/define-api-handler.js +0 -15
  257. package/src/dev/sc-server.d.ts +0 -30
  258. package/src/dev/sc-server.js +0 -111
  259. package/src/eco/component-render-context.d.ts +0 -105
  260. package/src/eco/component-render-context.js +0 -77
  261. package/src/eco/eco.d.ts +0 -9
  262. package/src/eco/eco.js +0 -110
  263. package/src/eco/eco.types.d.ts +0 -170
  264. package/src/eco/eco.types.js +0 -0
  265. package/src/eco/eco.utils.d.ts +0 -40
  266. package/src/eco/eco.utils.js +0 -40
  267. package/src/eco/global-injector-map.d.ts +0 -16
  268. package/src/eco/global-injector-map.js +0 -80
  269. package/src/eco/lazy-injector-map.d.ts +0 -8
  270. package/src/eco/lazy-injector-map.js +0 -70
  271. package/src/eco/module-dependencies.d.ts +0 -18
  272. package/src/eco/module-dependencies.js +0 -49
  273. package/src/errors/http-error.d.ts +0 -31
  274. package/src/errors/http-error.js +0 -50
  275. package/src/errors/index.d.ts +0 -2
  276. package/src/errors/index.js +0 -4
  277. package/src/errors/locals-access-error.d.ts +0 -4
  278. package/src/errors/locals-access-error.js +0 -9
  279. package/src/global/app-logger.d.ts +0 -2
  280. package/src/global/app-logger.js +0 -6
  281. package/src/hmr/client/hmr-runtime.d.ts +0 -10
  282. package/src/hmr/client/hmr-runtime.js +0 -86
  283. package/src/hmr/hmr-strategy.d.ts +0 -159
  284. package/src/hmr/hmr-strategy.js +0 -29
  285. package/src/hmr/hmr.test.e2e.d.ts +0 -1
  286. package/src/hmr/hmr.test.e2e.js +0 -50
  287. package/src/hmr/strategies/default-hmr-strategy.d.ts +0 -43
  288. package/src/hmr/strategies/default-hmr-strategy.js +0 -34
  289. package/src/hmr/strategies/js-hmr-strategy.d.ts +0 -136
  290. package/src/hmr/strategies/js-hmr-strategy.js +0 -192
  291. package/src/index.browser.d.ts +0 -3
  292. package/src/index.browser.js +0 -4
  293. package/src/index.d.ts +0 -5
  294. package/src/index.js +0 -10
  295. package/src/integrations/ghtml/ghtml-renderer.d.ts +0 -15
  296. package/src/integrations/ghtml/ghtml-renderer.js +0 -60
  297. package/src/integrations/ghtml/ghtml.plugin.d.ts +0 -20
  298. package/src/integrations/ghtml/ghtml.plugin.js +0 -21
  299. package/src/internal-types.d.ts +0 -200
  300. package/src/internal-types.js +0 -0
  301. package/src/plugins/alias-resolver-plugin.d.ts +0 -2
  302. package/src/plugins/alias-resolver-plugin.js +0 -39
  303. package/src/plugins/eco-component-meta-plugin.d.ts +0 -95
  304. package/src/plugins/eco-component-meta-plugin.js +0 -157
  305. package/src/plugins/integration-plugin.d.ts +0 -102
  306. package/src/plugins/integration-plugin.js +0 -100
  307. package/src/plugins/processor.d.ts +0 -82
  308. package/src/plugins/processor.js +0 -122
  309. package/src/public-types.d.ts +0 -1094
  310. package/src/public-types.js +0 -0
  311. package/src/route-renderer/component-graph-executor.d.ts +0 -32
  312. package/src/route-renderer/component-graph-executor.js +0 -31
  313. package/src/route-renderer/component-graph.d.ts +0 -42
  314. package/src/route-renderer/component-graph.js +0 -72
  315. package/src/route-renderer/component-marker.d.ts +0 -52
  316. package/src/route-renderer/component-marker.js +0 -46
  317. package/src/route-renderer/dependency-resolver.d.ts +0 -24
  318. package/src/route-renderer/dependency-resolver.js +0 -428
  319. package/src/route-renderer/html-post-processing.service.d.ts +0 -40
  320. package/src/route-renderer/html-post-processing.service.js +0 -86
  321. package/src/route-renderer/html-post-processing.service.ts +0 -103
  322. package/src/route-renderer/integration-renderer.d.ts +0 -339
  323. package/src/route-renderer/integration-renderer.js +0 -526
  324. package/src/route-renderer/marker-graph-resolver.d.ts +0 -76
  325. package/src/route-renderer/marker-graph-resolver.js +0 -93
  326. package/src/route-renderer/page-module-loader.d.ts +0 -61
  327. package/src/route-renderer/page-module-loader.js +0 -102
  328. package/src/route-renderer/render-execution.service.d.ts +0 -69
  329. package/src/route-renderer/render-execution.service.js +0 -91
  330. package/src/route-renderer/render-preparation.service.d.ts +0 -112
  331. package/src/route-renderer/render-preparation.service.js +0 -243
  332. package/src/route-renderer/route-renderer.d.ts +0 -26
  333. package/src/route-renderer/route-renderer.js +0 -68
  334. package/src/router/fs-router-scanner.d.ts +0 -41
  335. package/src/router/fs-router-scanner.js +0 -155
  336. package/src/router/fs-router.d.ts +0 -26
  337. package/src/router/fs-router.js +0 -100
  338. package/src/services/asset-processing-service/asset-processing.service.d.ts +0 -41
  339. package/src/services/asset-processing-service/asset-processing.service.js +0 -250
  340. package/src/services/asset-processing-service/asset.factory.d.ts +0 -17
  341. package/src/services/asset-processing-service/asset.factory.js +0 -82
  342. package/src/services/asset-processing-service/assets.types.d.ts +0 -88
  343. package/src/services/asset-processing-service/assets.types.js +0 -0
  344. package/src/services/asset-processing-service/index.d.ts +0 -3
  345. package/src/services/asset-processing-service/index.js +0 -3
  346. package/src/services/asset-processing-service/processor.interface.d.ts +0 -22
  347. package/src/services/asset-processing-service/processor.interface.js +0 -6
  348. package/src/services/asset-processing-service/processor.registry.d.ts +0 -8
  349. package/src/services/asset-processing-service/processor.registry.js +0 -15
  350. package/src/services/asset-processing-service/processors/base/base-processor.d.ts +0 -24
  351. package/src/services/asset-processing-service/processors/base/base-processor.js +0 -59
  352. package/src/services/asset-processing-service/processors/base/base-script-processor.d.ts +0 -16
  353. package/src/services/asset-processing-service/processors/base/base-script-processor.js +0 -80
  354. package/src/services/asset-processing-service/processors/index.d.ts +0 -5
  355. package/src/services/asset-processing-service/processors/index.js +0 -5
  356. package/src/services/asset-processing-service/processors/script/content-script.processor.d.ts +0 -5
  357. package/src/services/asset-processing-service/processors/script/content-script.processor.js +0 -57
  358. package/src/services/asset-processing-service/processors/script/file-script.processor.d.ts +0 -8
  359. package/src/services/asset-processing-service/processors/script/file-script.processor.js +0 -76
  360. package/src/services/asset-processing-service/processors/script/node-module-script.processor.d.ts +0 -7
  361. package/src/services/asset-processing-service/processors/script/node-module-script.processor.js +0 -74
  362. package/src/services/asset-processing-service/processors/stylesheet/content-stylesheet.processor.d.ts +0 -5
  363. package/src/services/asset-processing-service/processors/stylesheet/content-stylesheet.processor.js +0 -25
  364. package/src/services/asset-processing-service/processors/stylesheet/file-stylesheet.processor.d.ts +0 -9
  365. package/src/services/asset-processing-service/processors/stylesheet/file-stylesheet.processor.js +0 -63
  366. package/src/services/cache/cache.types.d.ts +0 -107
  367. package/src/services/cache/cache.types.js +0 -0
  368. package/src/services/cache/index.d.ts +0 -7
  369. package/src/services/cache/index.js +0 -7
  370. package/src/services/cache/memory-cache-store.d.ts +0 -42
  371. package/src/services/cache/memory-cache-store.js +0 -98
  372. package/src/services/cache/page-cache-service.d.ts +0 -70
  373. package/src/services/cache/page-cache-service.js +0 -152
  374. package/src/services/html-transformer.service.d.ts +0 -50
  375. package/src/services/html-transformer.service.js +0 -163
  376. package/src/services/html-transformer.service.ts +0 -217
  377. package/src/services/page-module-import.service.d.ts +0 -37
  378. package/src/services/page-module-import.service.js +0 -88
  379. package/src/services/page-module-import.service.ts +0 -129
  380. package/src/services/page-request-cache-coordinator.service.d.ts +0 -75
  381. package/src/services/page-request-cache-coordinator.service.js +0 -107
  382. package/src/services/schema-validation-service.d.ts +0 -122
  383. package/src/services/schema-validation-service.js +0 -101
  384. package/src/services/validation/standard-schema.types.d.ts +0 -65
  385. package/src/services/validation/standard-schema.types.js +0 -0
  386. package/src/static-site-generator/static-site-generator.d.ts +0 -57
  387. package/src/static-site-generator/static-site-generator.js +0 -272
  388. package/src/utils/css.d.ts +0 -1
  389. package/src/utils/css.js +0 -7
  390. package/src/utils/deep-merge.d.ts +0 -14
  391. package/src/utils/deep-merge.js +0 -32
  392. package/src/utils/hash.d.ts +0 -1
  393. package/src/utils/hash.js +0 -7
  394. package/src/utils/html.d.ts +0 -1
  395. package/src/utils/html.js +0 -4
  396. package/src/utils/invariant.d.ts +0 -5
  397. package/src/utils/invariant.js +0 -11
  398. package/src/utils/locals-utils.d.ts +0 -15
  399. package/src/utils/locals-utils.js +0 -24
  400. package/src/utils/parse-cli-args.d.ts +0 -24
  401. package/src/utils/parse-cli-args.js +0 -47
  402. package/src/utils/path-utils.module.d.ts +0 -5
  403. package/src/utils/path-utils.module.js +0 -14
  404. package/src/utils/runtime.d.ts +0 -11
  405. package/src/utils/runtime.js +0 -40
  406. package/src/utils/server-utils.module.d.ts +0 -19
  407. package/src/utils/server-utils.module.js +0 -56
  408. package/src/watchers/project-watcher.d.ts +0 -132
  409. package/src/watchers/project-watcher.js +0 -281
  410. package/src/watchers/project-watcher.test-helpers.d.ts +0 -4
  411. package/src/watchers/project-watcher.test-helpers.js +0 -51
  412. /package/src/route-renderer/{component-graph-executor.ts → component-graph/component-graph-executor.ts} +0 -0
  413. /package/src/route-renderer/{component-graph.ts → component-graph/component-graph.ts} +0 -0
  414. /package/src/route-renderer/{component-marker.ts → component-graph/component-marker.ts} +0 -0
  415. /package/src/services/{asset-processing-service → assets/asset-processing-service}/processor.registry.ts +0 -0
  416. /package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/index.ts +0 -0
  417. /package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/script/content-script.processor.ts +0 -0
  418. /package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/stylesheet/content-stylesheet.processor.ts +0 -0
@@ -1,45 +1,88 @@
1
1
  import fs from 'node:fs';
2
2
  import path from 'node:path';
3
- import { fileURLToPath } from 'node:url';
4
3
  import { RESOLVED_ASSETS_DIR } from '../../constants.ts';
5
- import { defaultBuildAdapter } from '../../build/build-adapter.ts';
4
+ import { getAppBuildExecutor } from '../../build/build-adapter.ts';
6
5
  import type { DefaultHmrContext, EcoPagesAppConfig, IHmrManager, IClientBridge } from '../../internal-types.ts';
7
6
  import type { EcoBuildPlugin } from '../../build/build-types.ts';
8
7
  import { fileSystem } from '@ecopages/file-system';
9
- import type { HmrStrategy } from '../../hmr/hmr-strategy.ts';
8
+ import { HmrStrategyType, type HmrStrategy } from '../../hmr/hmr-strategy.ts';
10
9
  import { DefaultHmrStrategy } from '../../hmr/strategies/default-hmr-strategy.ts';
11
10
  import { JsHmrStrategy } from '../../hmr/strategies/js-hmr-strategy.ts';
12
11
  import { appLogger } from '../../global/app-logger.ts';
13
12
  import type { ClientBridgeEvent } from '../../public-types.ts';
13
+ import { HmrEntrypointRegistrar } from '../shared/hmr-entrypoint-registrar.ts';
14
+ import { BrowserBundleService } from '../../services/assets/browser-bundle.service.ts';
15
+ import { getAppServerModuleTranspiler } from '../../services/module-loading/app-server-module-transpiler.service.ts';
16
+ import {
17
+ getAppEntrypointDependencyGraph,
18
+ InMemoryEntrypointDependencyGraph,
19
+ setAppEntrypointDependencyGraph,
20
+ type EntrypointDependencyGraph,
21
+ } from '../../services/runtime-state/entrypoint-dependency-graph.service.ts';
22
+ import { getAppRuntimeSpecifierRegistry } from '../../services/runtime-state/runtime-specifier-registry.service.ts';
23
+ import type { ServerModuleTranspiler } from '../../services/module-loading/server-module-transpiler.service.ts';
24
+ import { resolveInternalExecutionDir, resolveInternalWorkDir } from '../../utils/resolve-work-dir.ts';
14
25
 
15
26
  export interface NodeHmrManagerParams {
16
27
  appConfig: EcoPagesAppConfig;
17
28
  bridge: IClientBridge;
18
29
  }
19
30
 
31
+ type HandleFileChangeOptions = {
32
+ broadcast?: boolean;
33
+ };
34
+
35
+ /**
36
+ * Node development HMR manager.
37
+ *
38
+ * @remarks
39
+ * This manager owns three separate concerns:
40
+ * - runtime websocket event fanout
41
+ * - entrypoint registration and dedupe
42
+ * - strategy coordination for rebuilds and invalidation
43
+ *
44
+ * The strict page-entrypoint contract lives here: `registerEntrypoint()` is
45
+ * reserved for integration-owned page bundles, while generic script assets must
46
+ * go through `registerScriptEntrypoint()`.
47
+ */
20
48
  export class NodeHmrManager implements IHmrManager {
49
+ private static readonly entrypointRegistrationTimeoutMs = 4000;
21
50
  public readonly appConfig: EcoPagesAppConfig;
22
51
  private readonly bridge: IClientBridge;
23
52
  private watchers = new Map<string, fs.FSWatcher>();
24
53
  private watchedFiles = new Map<string, string>();
25
- private specifierMap = new Map<string, string>();
26
- /**
27
- * Node-only reverse invalidation index: dependency file -> affected entrypoints.
28
- */
29
- private dependencyEntrypoints = new Map<string, Set<string>>();
30
- /**
31
- * Node-only forward index: entrypoint -> latest dependency set.
32
- */
33
- private entrypointDependencies = new Map<string, Set<string>>();
54
+ private entrypointRegistrations = new Map<string, Promise<string>>();
34
55
  private distDir: string;
35
56
  private plugins: EcoBuildPlugin[] = [];
36
57
  private enabled = true;
37
58
  private strategies: HmrStrategy[] = [];
59
+ private readonly entrypointRegistrar: HmrEntrypointRegistrar;
60
+ private readonly browserBundleService: BrowserBundleService;
61
+ private readonly entrypointDependencyGraph: EntrypointDependencyGraph;
62
+ private readonly runtimeSpecifierRegistry: ReturnType<typeof getAppRuntimeSpecifierRegistry>;
63
+ private readonly serverModuleTranspiler: ServerModuleTranspiler;
38
64
 
39
65
  constructor({ appConfig, bridge }: NodeHmrManagerParams) {
40
66
  this.appConfig = appConfig;
41
67
  this.bridge = bridge;
42
- this.distDir = path.join(this.appConfig.absolutePaths.distDir, RESOLVED_ASSETS_DIR, '_hmr');
68
+ this.distDir = path.join(resolveInternalWorkDir(this.appConfig), RESOLVED_ASSETS_DIR, '_hmr');
69
+ this.entrypointRegistrar = new HmrEntrypointRegistrar({
70
+ srcDir: this.appConfig.absolutePaths.srcDir,
71
+ distDir: this.distDir,
72
+ entrypointRegistrations: this.entrypointRegistrations,
73
+ watchedFiles: this.watchedFiles,
74
+ clearFailedRegistration: (entrypointPath) => this.clearFailedEntrypointRegistration(entrypointPath),
75
+ registrationTimeoutMs: NodeHmrManager.entrypointRegistrationTimeoutMs,
76
+ });
77
+ this.browserBundleService = new BrowserBundleService(appConfig);
78
+ const existingEntrypointDependencyGraph = getAppEntrypointDependencyGraph(appConfig);
79
+ this.entrypointDependencyGraph =
80
+ existingEntrypointDependencyGraph instanceof InMemoryEntrypointDependencyGraph
81
+ ? existingEntrypointDependencyGraph
82
+ : new InMemoryEntrypointDependencyGraph();
83
+ setAppEntrypointDependencyGraph(this.appConfig, this.entrypointDependencyGraph);
84
+ this.runtimeSpecifierRegistry = getAppRuntimeSpecifierRegistry(this.appConfig);
85
+ this.serverModuleTranspiler = getAppServerModuleTranspiler(this.appConfig);
43
86
  this.cleanDistDir();
44
87
  this.initializeStrategies();
45
88
  }
@@ -54,17 +97,42 @@ export class NodeHmrManager implements IHmrManager {
54
97
  fileSystem.ensureDir(this.distDir);
55
98
  }
56
99
 
100
+ /**
101
+ * Returns whether the generic JS strategy is allowed to rebuild an entrypoint.
102
+ *
103
+ * @remarks
104
+ * Higher-priority integration strategies own framework page entrypoints. When
105
+ * one of them matches, the generic JS strategy must stay out of the way so a
106
+ * shared dependency invalidation does not overwrite framework-specific output.
107
+ */
108
+ private shouldJsStrategyProcessEntrypoint(entrypointPath: string): boolean {
109
+ return !this.strategies.some((strategy) => {
110
+ if (strategy.type !== HmrStrategyType.INTEGRATION || strategy.priority <= HmrStrategyType.SCRIPT) {
111
+ return false;
112
+ }
113
+
114
+ try {
115
+ return strategy.matches(entrypointPath);
116
+ } catch (error) {
117
+ appLogger.error(error);
118
+ return false;
119
+ }
120
+ });
121
+ }
122
+
57
123
  private initializeStrategies(): void {
58
124
  const jsContext = {
59
125
  getWatchedFiles: () => this.watchedFiles,
60
- getSpecifierMap: () => this.specifierMap,
61
- getDependencyEntrypoints: (filePath: string) =>
62
- new Set(this.dependencyEntrypoints.get(path.resolve(filePath)) ?? []),
63
- setEntrypointDependencies: (entrypointPath: string, dependencies: string[]) =>
64
- this.setEntrypointDependencies(entrypointPath, dependencies),
126
+ getSpecifierMap: () => this.runtimeSpecifierRegistry.getAll(),
65
127
  getDistDir: () => this.distDir,
66
128
  getPlugins: () => this.plugins,
67
129
  getSrcDir: () => this.appConfig.absolutePaths.srcDir,
130
+ getPagesDir: () => this.appConfig.absolutePaths.pagesDir,
131
+ getLayoutsDir: () => this.appConfig.absolutePaths.layoutsDir,
132
+ getTemplateExtensions: () => this.appConfig.templatesExt,
133
+ getBrowserBundleService: () => this.browserBundleService,
134
+ getEntrypointDependencyGraph: () => this.entrypointDependencyGraph,
135
+ shouldProcessEntrypoint: (entrypointPath: string) => this.shouldJsStrategyProcessEntrypoint(entrypointPath),
68
136
  };
69
137
 
70
138
  this.strategies = [new JsHmrStrategy(jsContext), new DefaultHmrStrategy()];
@@ -86,27 +154,39 @@ export class NodeHmrManager implements IHmrManager {
86
154
  return this.enabled;
87
155
  }
88
156
 
157
+ /**
158
+ * Registers runtime bare-specifier mappings exposed by integrations.
159
+ *
160
+ * @remarks
161
+ * These mappings are consumed by framework-owned HMR strategies such as the
162
+ * React integration strategy when they rewrite browser bundles. The registry
163
+ * stays generic so the same mappings can support broader import-map-style
164
+ * runtime features later without moving integration semantics into core.
165
+ */
89
166
  public registerSpecifierMap(map: Record<string, string>): void {
90
- for (const [specifier, url] of Object.entries(map)) {
91
- this.specifierMap.set(specifier, url);
92
- }
167
+ this.runtimeSpecifierRegistry.register(map);
93
168
  }
94
169
 
95
170
  public async buildRuntime(): Promise<void> {
96
- const currentDir = path.dirname(fileURLToPath(import.meta.url));
97
- const runtimeSource = path.resolve(currentDir, '../../hmr/client/hmr-runtime.ts');
98
-
99
- const result = await defaultBuildAdapter.build({
100
- entrypoints: [runtimeSource],
101
- outdir: this.distDir,
102
- naming: '_hmr_runtime.js',
103
- minify: false,
104
- ...defaultBuildAdapter.getTranspileOptions('hmr-runtime'),
105
- plugins: this.plugins,
106
- });
171
+ const runtimeSource = path.resolve(import.meta.dirname, '../../hmr/client/hmr-runtime.ts');
107
172
 
108
- if (!result.success) {
109
- appLogger.error('[HMR] Failed to build runtime script:', result.logs);
173
+ try {
174
+ const result = await this.browserBundleService.bundle({
175
+ profile: 'hmr-runtime',
176
+ entrypoints: [runtimeSource],
177
+ outdir: this.distDir,
178
+ naming: '_hmr_runtime.js',
179
+ minify: false,
180
+ plugins: this.plugins,
181
+ });
182
+
183
+ if (!result.success) {
184
+ this.enabled = false;
185
+ appLogger.error('[HMR] Failed to build runtime script; continuing with HMR disabled.', result.logs);
186
+ }
187
+ } catch (error) {
188
+ this.enabled = false;
189
+ appLogger.error('[HMR] Failed to build runtime script; continuing with HMR disabled.', error);
110
190
  }
111
191
  }
112
192
 
@@ -121,7 +201,7 @@ export class NodeHmrManager implements IHmrManager {
121
201
  this.bridge.broadcast(event);
122
202
  }
123
203
 
124
- public async handleFileChange(filePath: string): Promise<void> {
204
+ public async handleFileChange(filePath: string, options: HandleFileChangeOptions = {}): Promise<void> {
125
205
  const sorted = [...this.strategies].sort((a, b) => b.priority - a.priority);
126
206
  const strategy = sorted.find((s) => {
127
207
  try {
@@ -140,8 +220,9 @@ export class NodeHmrManager implements IHmrManager {
140
220
  appLogger.debug(`[NodeHmrManager] Selected strategy: ${strategy.constructor.name}`);
141
221
 
142
222
  const action = await strategy.process(filePath);
223
+ const shouldBroadcast = options.broadcast ?? true;
143
224
 
144
- if (action.type === 'broadcast') {
225
+ if (shouldBroadcast && action.type === 'broadcast') {
145
226
  if (action.events) {
146
227
  for (const event of action.events) {
147
228
  this.broadcast(event);
@@ -159,7 +240,7 @@ export class NodeHmrManager implements IHmrManager {
159
240
  }
160
241
 
161
242
  public getSpecifierMap(): Map<string, string> {
162
- return this.specifierMap;
243
+ return this.runtimeSpecifierRegistry.getAll();
163
244
  }
164
245
 
165
246
  public getDistDir(): string {
@@ -173,99 +254,128 @@ export class NodeHmrManager implements IHmrManager {
173
254
  public getDefaultContext(): DefaultHmrContext {
174
255
  return {
175
256
  getWatchedFiles: () => this.watchedFiles,
176
- getSpecifierMap: () => this.specifierMap,
257
+ getSpecifierMap: () => this.runtimeSpecifierRegistry.getAll(),
177
258
  getDistDir: () => this.distDir,
178
259
  getPlugins: () => this.plugins,
179
260
  getSrcDir: () => this.appConfig.absolutePaths.srcDir,
180
261
  getLayoutsDir: () => this.appConfig.absolutePaths.layoutsDir,
181
262
  getPagesDir: () => this.appConfig.absolutePaths.pagesDir,
263
+ getBuildExecutor: () => getAppBuildExecutor(this.appConfig),
264
+ getBrowserBundleService: () => this.browserBundleService,
265
+ importServerModule: async <T>(filePath: string) =>
266
+ await this.serverModuleTranspiler.importModule<T>({
267
+ filePath,
268
+ outdir: path.join(resolveInternalExecutionDir(this.appConfig), '.server-modules'),
269
+ externalPackages: true,
270
+ }),
182
271
  };
183
272
  }
184
273
 
274
+ private clearFailedEntrypointRegistration(entrypointPath: string): void {
275
+ this.watchedFiles.delete(entrypointPath);
276
+ this.entrypointDependencyGraph.clearEntrypointDependencies(entrypointPath);
277
+ }
278
+
185
279
  /**
186
- * Updates Node HMR dependency indexes for selective invalidation.
280
+ * Registers one integration-owned page entrypoint.
187
281
  *
188
282
  * @remarks
189
- * Graph data comes from Node/esbuild build metadata and does not affect Bun
190
- * HMR behavior.
283
+ * Concurrent callers share one in-flight registration. The registration is
284
+ * removed from the dedupe map once it resolves or fails so later requests do
285
+ * not inherit stale state.
191
286
  */
192
- private setEntrypointDependencies(entrypointPath: string, dependencies: string[]): void {
193
- const normalizedEntrypoint = path.resolve(entrypointPath);
194
- const previousDependencies = this.entrypointDependencies.get(normalizedEntrypoint);
195
-
196
- if (previousDependencies) {
197
- for (const dependencyPath of previousDependencies) {
198
- const entrypoints = this.dependencyEntrypoints.get(dependencyPath);
199
- if (!entrypoints) {
200
- continue;
201
- }
202
-
203
- entrypoints.delete(normalizedEntrypoint);
204
- if (entrypoints.size === 0) {
205
- this.dependencyEntrypoints.delete(dependencyPath);
206
- }
207
- }
208
- }
209
-
210
- const normalizedDependencies = new Set<string>([
211
- normalizedEntrypoint,
212
- ...dependencies.map((dependencyPath) => path.resolve(dependencyPath)),
213
- ]);
214
-
215
- this.entrypointDependencies.set(normalizedEntrypoint, normalizedDependencies);
216
-
217
- for (const dependencyPath of normalizedDependencies) {
218
- const entrypoints = this.dependencyEntrypoints.get(dependencyPath) ?? new Set<string>();
219
- entrypoints.add(normalizedEntrypoint);
220
- this.dependencyEntrypoints.set(dependencyPath, entrypoints);
221
- }
222
- }
223
-
224
287
  public async registerEntrypoint(entrypointPath: string): Promise<string> {
225
- if (this.watchedFiles.has(entrypointPath)) {
226
- return this.watchedFiles.get(entrypointPath)!;
227
- }
288
+ return await this.entrypointRegistrar.registerEntrypoint(entrypointPath, {
289
+ emit: async (normalizedEntrypoint, outputPath) =>
290
+ await this.emitStrictEntrypoint(normalizedEntrypoint, outputPath),
291
+ getMissingOutputError: (normalizedEntrypoint, outputPath) =>
292
+ new Error(
293
+ `[HMR] Integration failed to emit entrypoint ${normalizedEntrypoint} to ${outputPath}. Page entrypoints must be produced by their owning integration.`,
294
+ ),
295
+ });
296
+ }
228
297
 
229
- const srcDir = this.appConfig.absolutePaths.srcDir;
230
- const relativePath = path.relative(srcDir, entrypointPath);
231
- const relativePathJs = relativePath.replace(/\.(tsx?|jsx?|mdx?)$/, '.js');
232
- const encodedPathJs = this.encodeDynamicSegments(relativePathJs);
298
+ /**
299
+ * Registers one generic script entrypoint.
300
+ *
301
+ * @remarks
302
+ * This path is intentionally separate from page entrypoints so non-framework
303
+ * scripts can still use the generic build fallback without weakening the page
304
+ * ownership contract.
305
+ */
306
+ public async registerScriptEntrypoint(entrypointPath: string): Promise<string> {
307
+ return await this.entrypointRegistrar.registerEntrypoint(entrypointPath, {
308
+ emit: async (normalizedEntrypoint, outputPath) =>
309
+ await this.emitScriptEntrypoint(normalizedEntrypoint, outputPath),
310
+ getMissingOutputError: (normalizedEntrypoint) =>
311
+ new Error(`[HMR] Failed to register script entrypoint: ${normalizedEntrypoint}`),
312
+ });
313
+ }
233
314
 
234
- const urlPath = encodedPathJs.split(path.sep).join('/');
235
- const outputUrl = `/${path.join(RESOLVED_ASSETS_DIR, '_hmr', urlPath)}`;
236
- const outputPath = path.join(this.distDir, urlPath);
315
+ /**
316
+ * Performs strict integration-owned entrypoint registration for one normalized source path.
317
+ *
318
+ * @remarks
319
+ * The flow is:
320
+ * 1. Reserve the output URL in the watched map.
321
+ * 2. Remove any stale emitted file from an earlier process or failed build.
322
+ * 3. Let the strategy chain try to emit the entrypoint without broadcasting.
323
+ * 4. Fail if the owning integration did not emit the expected output.
324
+ */
325
+ private async emitStrictEntrypoint(entrypointPath: string, _outputPath: string): Promise<void> {
326
+ await this.handleFileChange(entrypointPath, { broadcast: false });
327
+ }
237
328
 
238
- this.watchedFiles.set(entrypointPath, outputUrl);
329
+ /**
330
+ * Performs registration for a generic script asset.
331
+ *
332
+ * @remarks
333
+ * The manager first gives registered strategies a chance to emit the file so
334
+ * processor-owned or integration-owned behavior can still participate. Only
335
+ * when no output exists does it issue the generic build.
336
+ */
337
+ private async emitScriptEntrypoint(entrypointPath: string, outputPath: string): Promise<void> {
338
+ const naming = path.relative(this.distDir, outputPath).split(path.sep).join('/');
239
339
 
240
- await this.handleFileChange(entrypointPath);
340
+ await this.handleFileChange(entrypointPath, { broadcast: false });
241
341
 
242
342
  if (!fileSystem.exists(outputPath)) {
243
- const fallback = await defaultBuildAdapter.build({
343
+ const buildResult = await this.browserBundleService.bundle({
344
+ profile: 'hmr-entrypoint',
244
345
  entrypoints: [entrypointPath],
245
346
  outdir: this.distDir,
246
- naming: encodedPathJs,
347
+ naming,
247
348
  minify: false,
248
- external: Array.from(this.specifierMap.keys()),
249
- ...defaultBuildAdapter.getTranspileOptions('hmr-entrypoint'),
250
349
  plugins: this.plugins,
251
350
  });
252
351
 
253
- if (!fallback.success) {
254
- appLogger.error(`[HMR] Fallback build failed for ${entrypointPath}:`, fallback.logs);
352
+ if (!buildResult.success) {
353
+ appLogger.error(
354
+ `[HMR] Generic script entrypoint build failed for ${entrypointPath}:`,
355
+ buildResult.logs,
356
+ );
255
357
  }
256
358
  }
257
-
258
- return outputUrl;
259
- }
260
-
261
- private encodeDynamicSegments(filepath: string): string {
262
- return filepath.replace(/\[([^\]]+)\]/g, '_$1_');
263
359
  }
264
360
 
361
+ /**
362
+ * Stops active watchers and releases retained registration state.
363
+ *
364
+ * @remarks
365
+ * The manager intentionally does not remove emitted `_hmr` files from disk
366
+ * because multiple app processes may share the same dist directory during test
367
+ * runs. It does clear in-memory indexes so old entrypoints, dependencies, and
368
+ * specifier maps cannot leak across a reused manager instance.
369
+ */
265
370
  public stop() {
371
+ this.entrypointRegistrations.clear();
266
372
  for (const watcher of this.watchers.values()) {
267
373
  watcher.close();
268
374
  }
269
375
  this.watchers.clear();
376
+ this.watchedFiles.clear();
377
+ this.runtimeSpecifierRegistry.clear();
378
+ this.entrypointDependencyGraph.reset();
379
+ this.plugins = [];
270
380
  }
271
381
  }