@ecopages/core 0.2.0-alpha.4 → 0.2.0-alpha.6

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 +181 -68
  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 +208 -116
  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 +235 -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 -83
  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 +115 -115
  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 -16
  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 -1
  185. package/src/watchers/project-watcher.test.ts +678 -0
  186. package/src/watchers/project-watcher.ts +130 -111
  187. package/CHANGELOG.md +0 -91
  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 -85
  202. package/src/adapters/bun/hmr-manager.js +0 -240
  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 -63
  218. package/src/adapters/node/node-hmr-manager.js +0 -237
  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 -74
  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 -390
  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 -188
  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 -1098
  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 -125
  409. package/src/watchers/project-watcher.js +0 -265
  410. package/src/watchers/project-watcher.test-helpers.d.ts +0 -4
  411. package/src/watchers/project-watcher.test-helpers.js +0 -52
  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,46 +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';
10
- import { HmrStrategyType } from '../../hmr/hmr-strategy.ts';
8
+ import { HmrStrategyType, type HmrStrategy } from '../../hmr/hmr-strategy.ts';
11
9
  import { DefaultHmrStrategy } from '../../hmr/strategies/default-hmr-strategy.ts';
12
10
  import { JsHmrStrategy } from '../../hmr/strategies/js-hmr-strategy.ts';
13
11
  import { appLogger } from '../../global/app-logger.ts';
14
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';
15
25
 
16
26
  export interface NodeHmrManagerParams {
17
27
  appConfig: EcoPagesAppConfig;
18
28
  bridge: IClientBridge;
19
29
  }
20
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
+ */
21
48
  export class NodeHmrManager implements IHmrManager {
49
+ private static readonly entrypointRegistrationTimeoutMs = 4000;
22
50
  public readonly appConfig: EcoPagesAppConfig;
23
51
  private readonly bridge: IClientBridge;
24
52
  private watchers = new Map<string, fs.FSWatcher>();
25
53
  private watchedFiles = new Map<string, string>();
26
- private specifierMap = new Map<string, string>();
27
- /**
28
- * Node-only reverse invalidation index: dependency file -> affected entrypoints.
29
- */
30
- private dependencyEntrypoints = new Map<string, Set<string>>();
31
- /**
32
- * Node-only forward index: entrypoint -> latest dependency set.
33
- */
34
- private entrypointDependencies = new Map<string, Set<string>>();
54
+ private entrypointRegistrations = new Map<string, Promise<string>>();
35
55
  private distDir: string;
36
56
  private plugins: EcoBuildPlugin[] = [];
37
57
  private enabled = true;
38
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;
39
64
 
40
65
  constructor({ appConfig, bridge }: NodeHmrManagerParams) {
41
66
  this.appConfig = appConfig;
42
67
  this.bridge = bridge;
43
- 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);
44
86
  this.cleanDistDir();
45
87
  this.initializeStrategies();
46
88
  }
@@ -55,17 +97,42 @@ export class NodeHmrManager implements IHmrManager {
55
97
  fileSystem.ensureDir(this.distDir);
56
98
  }
57
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
+
58
123
  private initializeStrategies(): void {
59
124
  const jsContext = {
60
125
  getWatchedFiles: () => this.watchedFiles,
61
- getSpecifierMap: () => this.specifierMap,
62
- getDependencyEntrypoints: (filePath: string) =>
63
- new Set(this.dependencyEntrypoints.get(path.resolve(filePath)) ?? []),
64
- setEntrypointDependencies: (entrypointPath: string, dependencies: string[]) =>
65
- this.setEntrypointDependencies(entrypointPath, dependencies),
126
+ getSpecifierMap: () => this.runtimeSpecifierRegistry.getAll(),
66
127
  getDistDir: () => this.distDir,
67
128
  getPlugins: () => this.plugins,
68
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),
69
136
  };
70
137
 
71
138
  this.strategies = [new JsHmrStrategy(jsContext), new DefaultHmrStrategy()];
@@ -87,27 +154,39 @@ export class NodeHmrManager implements IHmrManager {
87
154
  return this.enabled;
88
155
  }
89
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
+ */
90
166
  public registerSpecifierMap(map: Record<string, string>): void {
91
- for (const [specifier, url] of Object.entries(map)) {
92
- this.specifierMap.set(specifier, url);
93
- }
167
+ this.runtimeSpecifierRegistry.register(map);
94
168
  }
95
169
 
96
170
  public async buildRuntime(): Promise<void> {
97
- const currentDir = path.dirname(fileURLToPath(import.meta.url));
98
- const runtimeSource = path.resolve(currentDir, '../../hmr/client/hmr-runtime.ts');
99
-
100
- const result = await defaultBuildAdapter.build({
101
- entrypoints: [runtimeSource],
102
- outdir: this.distDir,
103
- naming: '_hmr_runtime.js',
104
- minify: false,
105
- ...defaultBuildAdapter.getTranspileOptions('hmr-runtime'),
106
- plugins: this.plugins,
107
- });
171
+ const runtimeSource = path.resolve(import.meta.dirname, '../../hmr/client/hmr-runtime.ts');
108
172
 
109
- if (!result.success) {
110
- 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);
111
190
  }
112
191
  }
113
192
 
@@ -122,30 +201,13 @@ export class NodeHmrManager implements IHmrManager {
122
201
  this.bridge.broadcast(event);
123
202
  }
124
203
 
125
- public canHandleFileChange(filePath: string): boolean {
126
- const sorted = [...this.strategies].sort((a, b) => b.priority - a.priority);
127
- const strategy = sorted.find((candidate) => {
128
- try {
129
- return candidate.matches(filePath);
130
- } catch (err) {
131
- appLogger.error(
132
- `[NodeHmrManager] Error checking match for ${candidate.constructor.name}:`,
133
- err as Error,
134
- );
135
- return false;
136
- }
137
- });
138
-
139
- return strategy !== undefined && strategy.type !== HmrStrategyType.FALLBACK;
140
- }
141
-
142
- public async handleFileChange(filePath: string): Promise<void> {
204
+ public async handleFileChange(filePath: string, options: HandleFileChangeOptions = {}): Promise<void> {
143
205
  const sorted = [...this.strategies].sort((a, b) => b.priority - a.priority);
144
206
  const strategy = sorted.find((s) => {
145
207
  try {
146
208
  return s.matches(filePath);
147
209
  } catch (err) {
148
- appLogger.error(`[NodeHmrManager] Error checking match for ${s.constructor.name}:`, err as Error);
210
+ appLogger.error(err);
149
211
  return false;
150
212
  }
151
213
  });
@@ -158,8 +220,9 @@ export class NodeHmrManager implements IHmrManager {
158
220
  appLogger.debug(`[NodeHmrManager] Selected strategy: ${strategy.constructor.name}`);
159
221
 
160
222
  const action = await strategy.process(filePath);
223
+ const shouldBroadcast = options.broadcast ?? true;
161
224
 
162
- if (action.type === 'broadcast') {
225
+ if (shouldBroadcast && action.type === 'broadcast') {
163
226
  if (action.events) {
164
227
  for (const event of action.events) {
165
228
  this.broadcast(event);
@@ -177,7 +240,7 @@ export class NodeHmrManager implements IHmrManager {
177
240
  }
178
241
 
179
242
  public getSpecifierMap(): Map<string, string> {
180
- return this.specifierMap;
243
+ return this.runtimeSpecifierRegistry.getAll();
181
244
  }
182
245
 
183
246
  public getDistDir(): string {
@@ -191,99 +254,128 @@ export class NodeHmrManager implements IHmrManager {
191
254
  public getDefaultContext(): DefaultHmrContext {
192
255
  return {
193
256
  getWatchedFiles: () => this.watchedFiles,
194
- getSpecifierMap: () => this.specifierMap,
257
+ getSpecifierMap: () => this.runtimeSpecifierRegistry.getAll(),
195
258
  getDistDir: () => this.distDir,
196
259
  getPlugins: () => this.plugins,
197
260
  getSrcDir: () => this.appConfig.absolutePaths.srcDir,
198
261
  getLayoutsDir: () => this.appConfig.absolutePaths.layoutsDir,
199
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
+ }),
200
271
  };
201
272
  }
202
273
 
274
+ private clearFailedEntrypointRegistration(entrypointPath: string): void {
275
+ this.watchedFiles.delete(entrypointPath);
276
+ this.entrypointDependencyGraph.clearEntrypointDependencies(entrypointPath);
277
+ }
278
+
203
279
  /**
204
- * Updates Node HMR dependency indexes for selective invalidation.
280
+ * Registers one integration-owned page entrypoint.
205
281
  *
206
282
  * @remarks
207
- * Graph data comes from Node/esbuild build metadata and does not affect Bun
208
- * 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.
209
286
  */
210
- private setEntrypointDependencies(entrypointPath: string, dependencies: string[]): void {
211
- const normalizedEntrypoint = path.resolve(entrypointPath);
212
- const previousDependencies = this.entrypointDependencies.get(normalizedEntrypoint);
213
-
214
- if (previousDependencies) {
215
- for (const dependencyPath of previousDependencies) {
216
- const entrypoints = this.dependencyEntrypoints.get(dependencyPath);
217
- if (!entrypoints) {
218
- continue;
219
- }
220
-
221
- entrypoints.delete(normalizedEntrypoint);
222
- if (entrypoints.size === 0) {
223
- this.dependencyEntrypoints.delete(dependencyPath);
224
- }
225
- }
226
- }
227
-
228
- const normalizedDependencies = new Set<string>([
229
- normalizedEntrypoint,
230
- ...dependencies.map((dependencyPath) => path.resolve(dependencyPath)),
231
- ]);
232
-
233
- this.entrypointDependencies.set(normalizedEntrypoint, normalizedDependencies);
234
-
235
- for (const dependencyPath of normalizedDependencies) {
236
- const entrypoints = this.dependencyEntrypoints.get(dependencyPath) ?? new Set<string>();
237
- entrypoints.add(normalizedEntrypoint);
238
- this.dependencyEntrypoints.set(dependencyPath, entrypoints);
239
- }
240
- }
241
-
242
287
  public async registerEntrypoint(entrypointPath: string): Promise<string> {
243
- if (this.watchedFiles.has(entrypointPath)) {
244
- return this.watchedFiles.get(entrypointPath)!;
245
- }
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
+ }
246
297
 
247
- const srcDir = this.appConfig.absolutePaths.srcDir;
248
- const relativePath = path.relative(srcDir, entrypointPath);
249
- const relativePathJs = relativePath.replace(/\.(tsx?|jsx?|mdx?)$/, '.js');
250
- 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
+ }
251
314
 
252
- const urlPath = encodedPathJs.split(path.sep).join('/');
253
- const outputUrl = `/${path.join(RESOLVED_ASSETS_DIR, '_hmr', urlPath)}`;
254
- 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
+ }
255
328
 
256
- 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('/');
257
339
 
258
- await this.handleFileChange(entrypointPath);
340
+ await this.handleFileChange(entrypointPath, { broadcast: false });
259
341
 
260
342
  if (!fileSystem.exists(outputPath)) {
261
- const fallback = await defaultBuildAdapter.build({
343
+ const buildResult = await this.browserBundleService.bundle({
344
+ profile: 'hmr-entrypoint',
262
345
  entrypoints: [entrypointPath],
263
346
  outdir: this.distDir,
264
- naming: encodedPathJs,
347
+ naming,
265
348
  minify: false,
266
- external: Array.from(this.specifierMap.keys()),
267
- ...defaultBuildAdapter.getTranspileOptions('hmr-entrypoint'),
268
349
  plugins: this.plugins,
269
350
  });
270
351
 
271
- if (!fallback.success) {
272
- 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
+ );
273
357
  }
274
358
  }
275
-
276
- return outputUrl;
277
- }
278
-
279
- private encodeDynamicSegments(filepath: string): string {
280
- return filepath.replace(/\[([^\]]+)\]/g, '_$1_');
281
359
  }
282
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
+ */
283
370
  public stop() {
371
+ this.entrypointRegistrations.clear();
284
372
  for (const watcher of this.watchers.values()) {
285
373
  watcher.close();
286
374
  }
287
375
  this.watchers.clear();
376
+ this.watchedFiles.clear();
377
+ this.runtimeSpecifierRegistry.clear();
378
+ this.entrypointDependencyGraph.reset();
379
+ this.plugins = [];
288
380
  }
289
381
  }