@ecopages/core 0.2.0-alpha.2 → 0.2.0-alpha.21

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