@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,27 +1,42 @@
1
1
  import type { WebSocketHandler } from 'bun';
2
- import type { DefaultHmrContext, EcoPagesAppConfig, IHmrManager } from '../../internal-types';
2
+ import type { DefaultHmrContext, EcoPagesAppConfig, IHmrManager } from '../../types/internal-types.js';
3
3
  import type { EcoBuildPlugin } from '../../build/build-types.js';
4
- import type { HmrStrategy } from '../../hmr/hmr-strategy';
5
- import type { ClientBridge } from './client-bridge';
6
- import type { ClientBridgeEvent } from '../../public-types';
4
+ import { type HmrStrategy } from '../../hmr/hmr-strategy.js';
5
+ import type { ClientBridge } from './client-bridge.js';
6
+ import type { ClientBridgeEvent } from '../../types/public-types.js';
7
7
  type BunSocketHandler = WebSocketHandler<unknown>;
8
8
  export interface HmrManagerParams {
9
9
  appConfig: EcoPagesAppConfig;
10
10
  bridge: ClientBridge;
11
11
  }
12
+ type HandleFileChangeOptions = {
13
+ broadcast?: boolean;
14
+ };
15
+ /**
16
+ * Bun development HMR manager.
17
+ *
18
+ * @remarks
19
+ * Bun shares the same public contract as the Node manager: page entrypoints are
20
+ * strict integration-owned registrations, while generic script assets use their
21
+ * own explicit registration path.
22
+ */
12
23
  export declare class HmrManager implements IHmrManager {
24
+ private static readonly entrypointRegistrationTimeoutMs;
13
25
  readonly appConfig: EcoPagesAppConfig;
14
26
  private readonly bridge;
15
27
  /** Keep track of watchers */
16
28
  private watchers;
17
29
  /** entrypoint -> output path */
18
30
  private watchedFiles;
19
- /** bare specifier -> runtime URL (e.g., 'react' -> '/assets/vendors/react.js') */
20
- private specifierMap;
31
+ private entrypointRegistrations;
21
32
  private distDir;
22
33
  private plugins;
23
34
  private enabled;
24
35
  private strategies;
36
+ private readonly entrypointRegistrar;
37
+ private readonly browserBundleService;
38
+ private readonly entrypointDependencyGraph;
39
+ private readonly serverModuleTranspiler;
25
40
  private wsHandler;
26
41
  constructor({ appConfig, bridge }: HmrManagerParams);
27
42
  /**
@@ -31,6 +46,15 @@ export declare class HmrManager implements IHmrManager {
31
46
  * can share the same dist path during e2e runs.
32
47
  */
33
48
  private cleanDistDir;
49
+ /**
50
+ * Returns whether the generic JS strategy may rebuild an entrypoint.
51
+ *
52
+ * @remarks
53
+ * Integration-owned page entrypoints are excluded so a shared dependency
54
+ * invalidation cannot replace framework-owned browser output with a generic JS
55
+ * rebuild.
56
+ */
57
+ private shouldJsStrategyProcessEntrypoint;
34
58
  /**
35
59
  * Initializes core HMR strategies.
36
60
  * Strategies are evaluated in priority order (highest first).
@@ -45,12 +69,6 @@ export declare class HmrManager implements IHmrManager {
45
69
  setPlugins(plugins: EcoBuildPlugin[]): void;
46
70
  setEnabled(enabled: boolean): void;
47
71
  isEnabled(): boolean;
48
- /**
49
- * Registers a mapping from bare specifiers to vendor URLs.
50
- * Used by integrations to provide their module resolution mappings.
51
- * @param map - Object mapping bare specifiers to vendor URLs
52
- */
53
- registerSpecifierMap(map: Record<string, string>): void;
54
72
  getWebSocketHandler(): BunSocketHandler;
55
73
  /**
56
74
  * Builds the client-side HMR runtime script.
@@ -58,28 +76,56 @@ export declare class HmrManager implements IHmrManager {
58
76
  buildRuntime(): Promise<void>;
59
77
  getRuntimePath(): string;
60
78
  broadcast(event: ClientBridgeEvent): void;
61
- canHandleFileChange(filePath: string): boolean;
62
- /**
63
- * Handles file changes using registered HMR strategies.
64
- * Strategies are evaluated in priority order until one matches.
65
- * @param filePath - Absolute path to the changed file
66
- */
67
- handleFileChange(filePath: string): Promise<void>;
68
- /**
69
- * Registers a client entrypoint to be built and watched by Bun.
70
- */
79
+ handleFileChange(filePath: string, options?: HandleFileChangeOptions): Promise<void>;
71
80
  getOutputUrl(entrypointPath: string): string | undefined;
72
81
  getWatchedFiles(): Map<string, string>;
73
- getSpecifierMap(): Map<string, string>;
74
82
  getDistDir(): string;
75
83
  getPlugins(): EcoBuildPlugin[];
76
84
  getDefaultContext(): DefaultHmrContext;
85
+ private clearFailedEntrypointRegistration;
86
+ /**
87
+ * Registers one integration-owned page entrypoint.
88
+ *
89
+ * @remarks
90
+ * Concurrent callers share one in-flight registration. The registration is
91
+ * cleared from the dedupe map when it settles so later callers cannot inherit a
92
+ * stale promise.
93
+ */
77
94
  registerEntrypoint(entrypointPath: string): Promise<string>;
78
95
  /**
79
- * Encodes dynamic route segments (brackets) in file paths.
80
- * Converts `[slug]` to `_slug_` to avoid filesystem/URL issues.
96
+ * Registers one generic script entrypoint.
97
+ *
98
+ * @remarks
99
+ * This explicit path keeps the page-entrypoint contract strict while still
100
+ * allowing generic script assets to use the fallback build path.
101
+ */
102
+ registerScriptEntrypoint(entrypointPath: string): Promise<string>;
103
+ /**
104
+ * Performs strict integration-owned registration for one normalized path.
105
+ *
106
+ * @remarks
107
+ * The manager reserves the output URL, removes any stale emitted file, runs
108
+ * strategy processing without broadcasting, and then verifies that the owning
109
+ * integration emitted the expected file.
110
+ */
111
+ private emitStrictEntrypoint;
112
+ /**
113
+ * Performs registration for a generic script asset.
114
+ *
115
+ * @remarks
116
+ * This path performs a targeted browser bundle for the requested script
117
+ * entrypoint only. The resulting dependency graph is retained so later file
118
+ * changes can invalidate just the affected script entrypoints.
119
+ */
120
+ private emitScriptEntrypoint;
121
+ /**
122
+ * Stops active watchers and releases retained registration state.
123
+ *
124
+ * @remarks
125
+ * Emitted `_hmr` files remain on disk because parallel app processes may share
126
+ * the same dist directory. The in-memory indexes are cleared so stale
127
+ * entrypoints cannot leak through a reused manager object.
81
128
  */
82
- private encodeDynamicSegments;
83
129
  stop(): void;
84
130
  }
85
131
  export {};
@@ -1,30 +1,56 @@
1
1
  import fs from "node:fs";
2
2
  import path from "node:path";
3
- import { RESOLVED_ASSETS_DIR } from "../../constants";
4
- import { defaultBuildAdapter } from "../../build/build-adapter.js";
3
+ import { RESOLVED_ASSETS_DIR } from "../../config/constants.js";
4
+ import { getAppBuildExecutor } from "../../build/build-adapter.js";
5
5
  import { fileSystem } from "@ecopages/file-system";
6
- import { HmrStrategyType } from "../../hmr/hmr-strategy";
7
- import { DefaultHmrStrategy } from "../../hmr/strategies/default-hmr-strategy";
8
- import { JsHmrStrategy } from "../../hmr/strategies/js-hmr-strategy";
9
- import { appLogger } from "../../global/app-logger";
6
+ import { HmrStrategyType } from "../../hmr/hmr-strategy.js";
7
+ import { DefaultHmrStrategy } from "../../hmr/strategies/default-hmr-strategy.js";
8
+ import { JsHmrStrategy } from "../../hmr/strategies/js-hmr-strategy.js";
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
+ NoopEntrypointDependencyGraph,
16
+ setAppEntrypointDependencyGraph
17
+ } from "../../services/runtime-state/entrypoint-dependency-graph.service.js";
18
+ import { resolveInternalExecutionDir, resolveInternalWorkDir } from "../../utils/resolve-work-dir.js";
10
19
  class HmrManager {
20
+ static entrypointRegistrationTimeoutMs = 4e3;
11
21
  appConfig;
12
22
  bridge;
13
23
  /** Keep track of watchers */
14
24
  watchers = /* @__PURE__ */ new Map();
15
25
  /** entrypoint -> output path */
16
26
  watchedFiles = /* @__PURE__ */ new Map();
17
- /** bare specifier -> runtime URL (e.g., 'react' -> '/assets/vendors/react.js') */
18
- specifierMap = /* @__PURE__ */ new Map();
27
+ entrypointRegistrations = /* @__PURE__ */ new Map();
19
28
  distDir;
20
29
  plugins = [];
21
30
  enabled = true;
22
31
  strategies = [];
32
+ entrypointRegistrar;
33
+ browserBundleService;
34
+ entrypointDependencyGraph;
35
+ serverModuleTranspiler;
23
36
  wsHandler;
24
37
  constructor({ appConfig, bridge }) {
25
38
  this.appConfig = appConfig;
26
39
  this.bridge = bridge;
27
- this.distDir = path.join(this.appConfig.absolutePaths.distDir, RESOLVED_ASSETS_DIR, "_hmr");
40
+ this.distDir = path.join(resolveInternalWorkDir(this.appConfig), RESOLVED_ASSETS_DIR, "_hmr");
41
+ this.entrypointRegistrar = new HmrEntrypointRegistrar({
42
+ srcDir: this.appConfig.absolutePaths.srcDir,
43
+ distDir: this.distDir,
44
+ entrypointRegistrations: this.entrypointRegistrations,
45
+ watchedFiles: this.watchedFiles,
46
+ clearFailedRegistration: (entrypointPath) => this.clearFailedEntrypointRegistration(entrypointPath),
47
+ registrationTimeoutMs: HmrManager.entrypointRegistrationTimeoutMs
48
+ });
49
+ this.browserBundleService = new BrowserBundleService(appConfig);
50
+ const existingEntrypointDependencyGraph = getAppEntrypointDependencyGraph(appConfig);
51
+ this.entrypointDependencyGraph = existingEntrypointDependencyGraph instanceof NoopEntrypointDependencyGraph ? existingEntrypointDependencyGraph : new NoopEntrypointDependencyGraph();
52
+ setAppEntrypointDependencyGraph(this.appConfig, this.entrypointDependencyGraph);
53
+ this.serverModuleTranspiler = getAppServerModuleTranspiler(this.appConfig);
28
54
  this.cleanDistDir();
29
55
  this.initializeStrategies();
30
56
  }
@@ -37,6 +63,27 @@ class HmrManager {
37
63
  cleanDistDir() {
38
64
  fileSystem.ensureDir(this.distDir);
39
65
  }
66
+ /**
67
+ * Returns whether the generic JS strategy may rebuild an entrypoint.
68
+ *
69
+ * @remarks
70
+ * Integration-owned page entrypoints are excluded so a shared dependency
71
+ * invalidation cannot replace framework-owned browser output with a generic JS
72
+ * rebuild.
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
+ }
40
87
  /**
41
88
  * Initializes core HMR strategies.
42
89
  * Strategies are evaluated in priority order (highest first).
@@ -44,10 +91,15 @@ class HmrManager {
44
91
  initializeStrategies() {
45
92
  const jsContext = {
46
93
  getWatchedFiles: () => this.watchedFiles,
47
- getSpecifierMap: () => this.specifierMap,
48
94
  getDistDir: () => this.distDir,
49
95
  getPlugins: () => this.plugins,
50
- getSrcDir: () => this.appConfig.absolutePaths.srcDir
96
+ getSrcDir: () => this.appConfig.absolutePaths.srcDir,
97
+ getPagesDir: () => this.appConfig.absolutePaths.pagesDir,
98
+ getLayoutsDir: () => this.appConfig.absolutePaths.layoutsDir,
99
+ getTemplateExtensions: () => this.appConfig.templatesExt,
100
+ getBrowserBundleService: () => this.browserBundleService,
101
+ getEntrypointDependencyGraph: () => this.entrypointDependencyGraph,
102
+ shouldProcessEntrypoint: (entrypointPath) => this.shouldJsStrategyProcessEntrypoint(entrypointPath)
51
103
  };
52
104
  this.strategies = [new JsHmrStrategy(jsContext), new DefaultHmrStrategy()];
53
105
  }
@@ -68,16 +120,6 @@ class HmrManager {
68
120
  isEnabled() {
69
121
  return this.enabled;
70
122
  }
71
- /**
72
- * Registers a mapping from bare specifiers to vendor URLs.
73
- * Used by integrations to provide their module resolution mappings.
74
- * @param map - Object mapping bare specifiers to vendor URLs
75
- */
76
- registerSpecifierMap(map) {
77
- for (const [specifier, url] of Object.entries(map)) {
78
- this.specifierMap.set(specifier, url);
79
- }
80
- }
81
123
  getWebSocketHandler() {
82
124
  const open = (ws) => {
83
125
  this.bridge.subscribe(ws);
@@ -101,12 +143,12 @@ class HmrManager {
101
143
  */
102
144
  async buildRuntime() {
103
145
  const runtimeSource = path.resolve(import.meta.dirname, "../../hmr/client/hmr-runtime.js");
104
- const result = await defaultBuildAdapter.build({
146
+ const result = await this.browserBundleService.bundle({
147
+ profile: "hmr-runtime",
105
148
  entrypoints: [runtimeSource],
106
149
  outdir: this.distDir,
107
150
  naming: "_hmr_runtime.js",
108
151
  minify: false,
109
- ...defaultBuildAdapter.getTranspileOptions("hmr-runtime"),
110
152
  plugins: this.plugins
111
153
  });
112
154
  if (!result.success) {
@@ -122,30 +164,13 @@ class HmrManager {
122
164
  );
123
165
  this.bridge.broadcast(event);
124
166
  }
125
- canHandleFileChange(filePath) {
126
- const sorted = [...this.strategies].sort((a, b) => b.priority - a.priority);
127
- const strategy = sorted.find((candidate) => {
128
- try {
129
- return candidate.matches(filePath);
130
- } catch (err) {
131
- appLogger.error(`[HmrManager] Error checking match for ${candidate.constructor.name}:`, err);
132
- return false;
133
- }
134
- });
135
- return strategy !== void 0 && strategy.type !== HmrStrategyType.FALLBACK;
136
- }
137
- /**
138
- * Handles file changes using registered HMR strategies.
139
- * Strategies are evaluated in priority order until one matches.
140
- * @param filePath - Absolute path to the changed file
141
- */
142
- async handleFileChange(filePath) {
167
+ async handleFileChange(filePath, options = {}) {
143
168
  const sorted = [...this.strategies].sort((a, b) => b.priority - a.priority);
144
169
  const strategy = sorted.find((s) => {
145
170
  try {
146
171
  return s.matches(filePath);
147
172
  } catch (err) {
148
- appLogger.error(`[HmrManager] Error checking match for ${s.constructor.name}:`, err);
173
+ appLogger.error(err);
149
174
  return false;
150
175
  }
151
176
  });
@@ -155,7 +180,8 @@ class HmrManager {
155
180
  }
156
181
  appLogger.debug(`[HmrManager] Selected strategy: ${strategy.constructor.name}`);
157
182
  const action = await strategy.process(filePath);
158
- if (action.type === "broadcast") {
183
+ const shouldBroadcast = options.broadcast ?? true;
184
+ if (shouldBroadcast && action.type === "broadcast") {
159
185
  if (action.events) {
160
186
  for (const event of action.events) {
161
187
  this.broadcast(event);
@@ -163,18 +189,12 @@ class HmrManager {
163
189
  }
164
190
  }
165
191
  }
166
- /**
167
- * Registers a client entrypoint to be built and watched by Bun.
168
- */
169
192
  getOutputUrl(entrypointPath) {
170
193
  return this.watchedFiles.get(entrypointPath);
171
194
  }
172
195
  getWatchedFiles() {
173
196
  return this.watchedFiles;
174
197
  }
175
- getSpecifierMap() {
176
- return this.specifierMap;
177
- }
178
198
  getDistDir() {
179
199
  return this.distDir;
180
200
  }
@@ -184,55 +204,107 @@ class HmrManager {
184
204
  getDefaultContext() {
185
205
  return {
186
206
  getWatchedFiles: () => this.watchedFiles,
187
- getSpecifierMap: () => this.specifierMap,
188
207
  getDistDir: () => this.distDir,
189
208
  getPlugins: () => this.plugins,
190
209
  getSrcDir: () => this.appConfig.absolutePaths.srcDir,
191
210
  getLayoutsDir: () => this.appConfig.absolutePaths.layoutsDir,
192
- getPagesDir: () => this.appConfig.absolutePaths.pagesDir
211
+ getPagesDir: () => this.appConfig.absolutePaths.pagesDir,
212
+ getBuildExecutor: () => getAppBuildExecutor(this.appConfig),
213
+ getBrowserBundleService: () => this.browserBundleService,
214
+ importServerModule: async (filePath) => await this.serverModuleTranspiler.importModule({
215
+ filePath,
216
+ outdir: path.join(resolveInternalExecutionDir(this.appConfig), ".server-modules"),
217
+ externalPackages: true
218
+ })
193
219
  };
194
220
  }
221
+ clearFailedEntrypointRegistration(entrypointPath) {
222
+ this.watchedFiles.delete(entrypointPath);
223
+ }
224
+ /**
225
+ * Registers one integration-owned page entrypoint.
226
+ *
227
+ * @remarks
228
+ * Concurrent callers share one in-flight registration. The registration is
229
+ * cleared from the dedupe map when it settles so later callers cannot inherit a
230
+ * stale promise.
231
+ */
195
232
  async registerEntrypoint(entrypointPath) {
196
- if (this.watchedFiles.has(entrypointPath)) {
197
- return this.watchedFiles.get(entrypointPath);
233
+ return await this.entrypointRegistrar.registerEntrypoint(entrypointPath, {
234
+ emit: async (normalizedEntrypoint) => await this.emitStrictEntrypoint(normalizedEntrypoint),
235
+ getMissingOutputError: (normalizedEntrypoint, outputPath) => new Error(
236
+ `[HMR] Integration failed to emit entrypoint ${normalizedEntrypoint} to ${outputPath}. Page entrypoints must be produced by their owning integration.`
237
+ )
238
+ });
239
+ }
240
+ /**
241
+ * Registers one generic script entrypoint.
242
+ *
243
+ * @remarks
244
+ * This explicit path keeps the page-entrypoint contract strict while still
245
+ * allowing generic script assets to use the fallback build path.
246
+ */
247
+ async registerScriptEntrypoint(entrypointPath) {
248
+ return await this.entrypointRegistrar.registerEntrypoint(entrypointPath, {
249
+ emit: async (normalizedEntrypoint, outputPath) => await this.emitScriptEntrypoint(normalizedEntrypoint, outputPath),
250
+ getMissingOutputError: (normalizedEntrypoint) => new Error(`[HMR] Failed to register script entrypoint: ${normalizedEntrypoint}`)
251
+ });
252
+ }
253
+ /**
254
+ * Performs strict integration-owned registration for one normalized path.
255
+ *
256
+ * @remarks
257
+ * The manager reserves the output URL, removes any stale emitted file, runs
258
+ * strategy processing without broadcasting, and then verifies that the owning
259
+ * integration emitted the expected file.
260
+ */
261
+ async emitStrictEntrypoint(entrypointPath) {
262
+ await this.handleFileChange(entrypointPath, { broadcast: false });
263
+ }
264
+ /**
265
+ * Performs registration for a generic script asset.
266
+ *
267
+ * @remarks
268
+ * This path performs a targeted browser bundle for the requested script
269
+ * entrypoint only. The resulting dependency graph is retained so later file
270
+ * changes can invalidate just the affected script entrypoints.
271
+ */
272
+ async emitScriptEntrypoint(entrypointPath, outputPath) {
273
+ const naming = path.relative(this.distDir, outputPath).split(path.sep).join("/");
274
+ const buildResult = await this.browserBundleService.bundle({
275
+ profile: "hmr-entrypoint",
276
+ entrypoints: [entrypointPath],
277
+ outdir: this.distDir,
278
+ naming,
279
+ minify: false,
280
+ plugins: this.plugins
281
+ });
282
+ if (!buildResult.success) {
283
+ appLogger.error(`[HMR] Generic script entrypoint build failed for ${entrypointPath}:`, buildResult.logs);
284
+ return;
198
285
  }
199
- const srcDir = this.appConfig.absolutePaths.srcDir;
200
- const relativePath = path.relative(srcDir, entrypointPath);
201
- const relativePathJs = relativePath.replace(/\.(tsx?|jsx?|mdx?)$/, ".js");
202
- const encodedPathJs = this.encodeDynamicSegments(relativePathJs);
203
- const urlPath = encodedPathJs.split(path.sep).join("/");
204
- const outputUrl = `/${path.join(RESOLVED_ASSETS_DIR, "_hmr", urlPath)}`;
205
- const outputPath = path.join(this.distDir, urlPath);
206
- this.watchedFiles.set(entrypointPath, outputUrl);
207
- await this.handleFileChange(entrypointPath);
208
- if (!fileSystem.exists(outputPath)) {
209
- const fallback = await defaultBuildAdapter.build({
210
- entrypoints: [entrypointPath],
211
- outdir: this.distDir,
212
- naming: encodedPathJs,
213
- minify: false,
214
- external: Array.from(this.specifierMap.keys()),
215
- ...defaultBuildAdapter.getTranspileOptions("hmr-entrypoint"),
216
- plugins: this.plugins
217
- });
218
- if (!fallback.success) {
219
- appLogger.error(`[HMR] Fallback build failed for ${entrypointPath}:`, fallback.logs);
220
- }
286
+ const entrypointDependencies = buildResult.dependencyGraph?.entrypoints?.[entrypointPath];
287
+ if (entrypointDependencies) {
288
+ this.entrypointDependencyGraph.setEntrypointDependencies(entrypointPath, entrypointDependencies);
221
289
  }
222
- return outputUrl;
223
290
  }
224
291
  /**
225
- * Encodes dynamic route segments (brackets) in file paths.
226
- * Converts `[slug]` to `_slug_` to avoid filesystem/URL issues.
292
+ * Stops active watchers and releases retained registration state.
293
+ *
294
+ * @remarks
295
+ * Emitted `_hmr` files remain on disk because parallel app processes may share
296
+ * the same dist directory. The in-memory indexes are cleared so stale
297
+ * entrypoints cannot leak through a reused manager object.
227
298
  */
228
- encodeDynamicSegments(filepath) {
229
- return filepath.replace(/\[([^\]]+)\]/g, "_$1_");
230
- }
231
299
  stop() {
300
+ this.entrypointRegistrations.clear();
232
301
  for (const watcher of this.watchers.values()) {
233
302
  watcher.close();
234
303
  }
235
304
  this.watchers.clear();
305
+ this.watchedFiles.clear();
306
+ this.entrypointDependencyGraph.reset();
307
+ this.plugins = [];
236
308
  }
237
309
  }
238
310
  export {
@@ -1,3 +1,2 @@
1
- export { EcopagesApp, createApp } from './create-app.js';
2
- export { defineApiHandler, defineGroupHandler } from './define-api-handler.js';
3
- export type { GroupHandler } from './define-api-handler.js';
1
+ export { BunEcopagesApp, createApp } from './create-app.js';
2
+ export { defineApiHandler, defineGroupHandler, type GroupHandler } from '../shared/define-api-handler.js';
@@ -1,7 +1,7 @@
1
- import { EcopagesApp, createApp } from "./create-app.js";
2
- import { defineApiHandler, defineGroupHandler } from "./define-api-handler.js";
1
+ import { BunEcopagesApp, createApp } from "./create-app.js";
2
+ import { defineApiHandler, defineGroupHandler } from "../shared/define-api-handler.js";
3
3
  export {
4
- EcopagesApp,
4
+ BunEcopagesApp,
5
5
  createApp,
6
6
  defineApiHandler,
7
7
  defineGroupHandler
@@ -1,12 +1,12 @@
1
1
  import type { Server, WebSocketHandler } from 'bun';
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
  import { ServerRouteHandler, type ServerRouteHandlerParams } from '../shared/server-route-handler.js';
7
- import { ServerStaticBuilder, type ServerStaticBuilderParams } from '../shared/server-static-builder';
8
- import { ClientBridge } from './client-bridge';
9
- import { HmrManager } from './hmr-manager';
7
+ import { ServerStaticBuilder, type ServerStaticBuilderParams } from '../shared/server-static-builder.js';
8
+ import { ClientBridge } from './client-bridge.js';
9
+ import { HmrManager } from './hmr-manager.js';
10
10
  import { ServerLifecycle } from './server-lifecycle.js';
11
11
  type BunServerInstance = Server<unknown>;
12
12
  type BunNativeServeOptions = Bun.Serve.Options<unknown>;