@ecopages/core 0.2.0-alpha.3 → 0.2.0-alpha.30

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