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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (391) hide show
  1. package/CHANGELOG.md +26 -64
  2. package/README.md +212 -14
  3. package/package.json +116 -66
  4. package/src/adapters/README.md +39 -0
  5. package/src/adapters/abstract/application-adapter.d.ts +28 -2
  6. package/src/adapters/abstract/application-adapter.js +14 -2
  7. package/src/adapters/abstract/router-adapter.d.ts +1 -1
  8. package/src/adapters/abstract/server-adapter.d.ts +2 -2
  9. package/src/adapters/bun/client-bridge.d.ts +1 -1
  10. package/src/adapters/bun/create-app.d.ts +4 -12
  11. package/src/adapters/bun/create-app.js +4 -5
  12. package/src/adapters/bun/hmr-manager.d.ts +80 -21
  13. package/src/adapters/bun/hmr-manager.js +168 -62
  14. package/src/adapters/bun/index.d.ts +2 -3
  15. package/src/adapters/bun/index.js +3 -3
  16. package/src/adapters/bun/server-adapter.d.ts +5 -5
  17. package/src/adapters/bun/server-adapter.js +40 -34
  18. package/src/adapters/bun/server-lifecycle.d.ts +28 -17
  19. package/src/adapters/bun/server-lifecycle.js +34 -62
  20. package/src/{create-app.d.ts → adapters/create-app.d.ts} +9 -6
  21. package/src/{create-app.js → adapters/create-app.js} +4 -4
  22. package/src/adapters/index.d.ts +2 -6
  23. package/src/adapters/index.js +2 -8
  24. package/src/adapters/node/create-app.d.ts +6 -9
  25. package/src/adapters/node/create-app.js +12 -6
  26. package/src/adapters/node/node-client-bridge.d.ts +1 -1
  27. package/src/adapters/node/node-hmr-manager.d.ts +89 -18
  28. package/src/adapters/node/node-hmr-manager.js +185 -95
  29. package/src/adapters/node/server-adapter.d.ts +6 -35
  30. package/src/adapters/node/server-adapter.js +44 -105
  31. package/src/adapters/node/static-content-server.d.ts +37 -1
  32. package/src/adapters/node/static-content-server.js +29 -1
  33. package/src/adapters/shared/application-adapter.d.ts +1 -1
  34. package/src/{define-api-handler.d.ts → adapters/shared/define-api-handler.d.ts} +1 -1
  35. package/src/adapters/shared/explicit-static-route-matcher.d.ts +2 -2
  36. package/src/adapters/shared/explicit-static-route-matcher.js +4 -1
  37. package/src/adapters/shared/file-route-middleware-pipeline.d.ts +1 -1
  38. package/src/adapters/shared/file-route-middleware-pipeline.js +1 -0
  39. package/src/adapters/shared/fs-server-response-factory.d.ts +2 -2
  40. package/src/adapters/shared/fs-server-response-factory.js +1 -1
  41. package/src/adapters/shared/fs-server-response-matcher.d.ts +8 -12
  42. package/src/adapters/shared/fs-server-response-matcher.js +10 -18
  43. package/src/adapters/shared/hmr-entrypoint-registrar.d.ts +55 -0
  44. package/src/adapters/shared/hmr-entrypoint-registrar.js +87 -0
  45. package/src/adapters/shared/hmr-html-response.d.ts +22 -0
  46. package/src/adapters/shared/hmr-html-response.js +32 -0
  47. package/src/adapters/shared/render-context.d.ts +2 -1
  48. package/src/adapters/shared/render-context.js +6 -3
  49. package/src/adapters/shared/runtime-bootstrap.d.ts +38 -0
  50. package/src/adapters/shared/runtime-bootstrap.js +43 -0
  51. package/src/adapters/shared/server-adapter.d.ts +13 -3
  52. package/src/adapters/shared/server-adapter.js +42 -5
  53. package/src/adapters/shared/server-route-handler.d.ts +4 -4
  54. package/src/adapters/shared/server-route-handler.js +6 -15
  55. package/src/adapters/shared/server-static-builder.d.ts +38 -6
  56. package/src/adapters/shared/server-static-builder.js +64 -10
  57. package/src/build/README.md +107 -0
  58. package/src/build/build-adapter.d.ts +168 -3
  59. package/src/build/build-adapter.js +604 -16
  60. package/src/build/build-manifest.d.ts +27 -0
  61. package/src/build/build-manifest.js +30 -0
  62. package/src/build/dev-build-coordinator.d.ts +72 -0
  63. package/src/build/dev-build-coordinator.js +154 -0
  64. package/src/build/esbuild-build-adapter.d.ts +15 -6
  65. package/src/build/esbuild-build-adapter.js +189 -74
  66. package/src/build/runtime-build-executor.d.ts +14 -0
  67. package/src/build/runtime-build-executor.js +22 -0
  68. package/src/build/runtime-specifier-alias-plugin.d.ts +15 -0
  69. package/src/build/runtime-specifier-alias-plugin.js +35 -0
  70. package/src/build/runtime-specifier-aliases.d.ts +5 -0
  71. package/src/build/runtime-specifier-aliases.js +95 -0
  72. package/src/config/README.md +36 -0
  73. package/src/config/config-builder.d.ts +52 -27
  74. package/src/config/config-builder.js +260 -49
  75. package/src/{constants.d.ts → config/constants.d.ts} +13 -0
  76. package/src/{constants.js → config/constants.js} +4 -0
  77. package/src/declarations.d.ts +19 -14
  78. package/src/dev/sc-server.d.ts +1 -1
  79. package/src/dev/sc-server.js +1 -1
  80. package/src/eco/README.md +70 -16
  81. package/src/eco/eco.browser.d.ts +2 -0
  82. package/src/eco/eco.browser.js +83 -0
  83. package/src/eco/eco.js +32 -57
  84. package/src/eco/eco.types.d.ts +12 -4
  85. package/src/eco/eco.utils.d.ts +1 -40
  86. package/src/eco/eco.utils.js +5 -35
  87. package/src/eco/global-injector-map.d.ts +1 -1
  88. package/src/eco/lazy-injector-map.d.ts +1 -1
  89. package/src/hmr/README.md +26 -0
  90. package/src/hmr/client/hmr-runtime.d.ts +1 -6
  91. package/src/hmr/client/hmr-runtime.js +30 -7
  92. package/src/hmr/hmr-strategy.d.ts +16 -13
  93. package/src/hmr/hmr-strategy.js +22 -7
  94. package/src/hmr/hmr.postcss.test.e2e.d.ts +1 -0
  95. package/src/hmr/hmr.postcss.test.e2e.js +31 -0
  96. package/src/hmr/hmr.test.e2e.js +26 -33
  97. package/src/hmr/strategies/default-hmr-strategy.d.ts +2 -2
  98. package/src/hmr/strategies/default-hmr-strategy.js +1 -1
  99. package/src/hmr/strategies/js-hmr-strategy.d.ts +46 -43
  100. package/src/hmr/strategies/js-hmr-strategy.js +72 -73
  101. package/src/index.browser.d.ts +2 -2
  102. package/src/index.browser.js +1 -1
  103. package/src/index.d.ts +4 -3
  104. package/src/index.js +16 -5
  105. package/src/integrations/ghtml/ghtml-renderer.d.ts +7 -2
  106. package/src/integrations/ghtml/ghtml-renderer.js +33 -30
  107. package/src/integrations/ghtml/ghtml.constants.d.ts +1 -0
  108. package/src/integrations/ghtml/ghtml.constants.js +4 -0
  109. package/src/integrations/ghtml/ghtml.plugin.d.ts +2 -6
  110. package/src/integrations/ghtml/ghtml.plugin.js +3 -4
  111. package/src/plugins/README.md +35 -0
  112. package/src/plugins/alias-resolver-plugin.js +17 -3
  113. package/src/plugins/eco-component-meta-plugin.d.ts +14 -1
  114. package/src/plugins/eco-component-meta-plugin.js +27 -21
  115. package/src/plugins/foreign-jsx-override-plugin.d.ts +31 -0
  116. package/src/plugins/foreign-jsx-override-plugin.js +35 -0
  117. package/src/plugins/integration-plugin.d.ts +145 -28
  118. package/src/plugins/integration-plugin.js +109 -13
  119. package/src/plugins/processor.d.ts +15 -2
  120. package/src/plugins/processor.js +16 -2
  121. package/src/plugins/runtime-capability.d.ts +9 -0
  122. package/src/plugins/source-transform.d.ts +46 -0
  123. package/src/plugins/source-transform.js +71 -0
  124. package/src/route-renderer/GRAPH.md +64 -98
  125. package/src/route-renderer/README.md +67 -46
  126. package/src/route-renderer/orchestration/boundary-planning.service.d.ts +25 -0
  127. package/src/route-renderer/orchestration/boundary-planning.service.js +97 -0
  128. package/src/route-renderer/orchestration/component-render-context.d.ts +83 -0
  129. package/src/route-renderer/orchestration/component-render-context.js +147 -0
  130. package/src/route-renderer/orchestration/integration-renderer.d.ts +554 -0
  131. package/src/route-renderer/orchestration/integration-renderer.js +957 -0
  132. package/src/route-renderer/orchestration/queued-boundary-runtime.service.d.ts +89 -0
  133. package/src/route-renderer/orchestration/queued-boundary-runtime.service.js +155 -0
  134. package/src/route-renderer/orchestration/render-execution.service.d.ts +43 -0
  135. package/src/route-renderer/orchestration/render-execution.service.js +106 -0
  136. package/src/{eco/eco.utils.ts → route-renderer/orchestration/render-output.utils.d.ts} +10 -53
  137. package/src/route-renderer/orchestration/render-output.utils.js +65 -0
  138. package/src/route-renderer/{render-preparation.service.d.ts → orchestration/render-preparation.service.d.ts} +18 -10
  139. package/src/route-renderer/{render-preparation.service.js → orchestration/render-preparation.service.js} +115 -17
  140. package/src/route-renderer/orchestration/route-shell-composer.service.d.ts +50 -0
  141. package/src/route-renderer/orchestration/route-shell-composer.service.js +81 -0
  142. package/src/route-renderer/orchestration/template-serialization.d.ts +38 -0
  143. package/src/route-renderer/orchestration/template-serialization.js +45 -0
  144. package/src/route-renderer/{dependency-resolver.d.ts → page-loading/dependency-resolver.d.ts} +15 -4
  145. package/src/route-renderer/{dependency-resolver.js → page-loading/dependency-resolver.js} +28 -12
  146. package/src/route-renderer/page-loading/page-module-loader.d.ts +90 -0
  147. package/src/route-renderer/{page-module-loader.js → page-loading/page-module-loader.js} +39 -14
  148. package/src/route-renderer/route-renderer.d.ts +45 -4
  149. package/src/route-renderer/route-renderer.js +38 -3
  150. package/src/router/README.md +97 -0
  151. package/src/router/client/link-intent.d.ts +53 -0
  152. package/src/router/client/link-intent.js +34 -0
  153. package/src/router/client/link-intent.test.browser.d.ts +1 -0
  154. package/src/router/client/link-intent.test.browser.js +43 -0
  155. package/src/router/client/navigation-coordinator.d.ts +149 -0
  156. package/src/router/client/navigation-coordinator.js +215 -0
  157. package/src/router/{fs-router-scanner.d.ts → server/fs-router-scanner.d.ts} +3 -3
  158. package/src/router/{fs-router-scanner.js → server/fs-router-scanner.js} +14 -8
  159. package/src/router/{fs-router.d.ts → server/fs-router.d.ts} +1 -1
  160. package/src/router/{fs-router.js → server/fs-router.js} +1 -1
  161. package/src/services/README.md +29 -0
  162. package/src/services/assets/asset-processing-service/asset-processing.service.d.ts +120 -0
  163. package/src/services/{asset-processing-service → assets/asset-processing-service}/asset-processing.service.js +91 -10
  164. package/src/services/{asset-processing-service → assets/asset-processing-service}/asset.factory.d.ts +1 -1
  165. package/src/services/{asset-processing-service → assets/asset-processing-service}/asset.factory.js +2 -2
  166. package/src/services/{asset-processing-service → assets/asset-processing-service}/assets.types.d.ts +2 -1
  167. package/src/services/assets/asset-processing-service/browser-runtime-asset.factory.d.ts +55 -0
  168. package/src/services/assets/asset-processing-service/browser-runtime-asset.factory.js +48 -0
  169. package/src/services/assets/asset-processing-service/browser-runtime-entry.factory.d.ts +20 -0
  170. package/src/services/assets/asset-processing-service/browser-runtime-entry.factory.js +41 -0
  171. package/src/services/assets/asset-processing-service/index.d.ts +5 -0
  172. package/src/services/assets/asset-processing-service/index.js +5 -0
  173. package/src/services/{asset-processing-service → assets/asset-processing-service}/processor.interface.d.ts +2 -2
  174. package/src/services/{asset-processing-service → assets/asset-processing-service}/processor.registry.d.ts +2 -2
  175. package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/base/base-processor.d.ts +1 -1
  176. package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/base/base-processor.js +9 -4
  177. package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/base/base-script-processor.d.ts +5 -4
  178. package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/base/base-script-processor.js +15 -23
  179. package/src/services/assets/asset-processing-service/processors/index.d.ts +5 -0
  180. package/src/services/assets/asset-processing-service/processors/index.js +5 -0
  181. package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/script/content-script.processor.d.ts +2 -2
  182. package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/script/content-script.processor.js +1 -1
  183. package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/script/file-script.processor.d.ts +4 -3
  184. package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/script/file-script.processor.js +16 -4
  185. package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/script/node-module-script.processor.d.ts +3 -3
  186. package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/script/node-module-script.processor.js +6 -5
  187. package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/stylesheet/content-stylesheet.processor.d.ts +2 -2
  188. package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/stylesheet/content-stylesheet.processor.js +1 -1
  189. package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/stylesheet/file-stylesheet.processor.d.ts +2 -2
  190. package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/stylesheet/file-stylesheet.processor.js +5 -2
  191. package/src/services/assets/browser-bundle.service.d.ts +32 -0
  192. package/src/services/assets/browser-bundle.service.js +33 -0
  193. package/src/services/{page-request-cache-coordinator.service.d.ts → cache/page-request-cache-coordinator.service.d.ts} +2 -2
  194. package/src/services/{page-request-cache-coordinator.service.js → cache/page-request-cache-coordinator.service.js} +3 -1
  195. package/src/services/html/html-rewriter-provider.service.d.ts +37 -0
  196. package/src/services/html/html-rewriter-provider.service.js +68 -0
  197. package/src/services/html/html-transformer.service.d.ts +77 -0
  198. package/src/services/html/html-transformer.service.js +215 -0
  199. package/src/services/invalidation/development-invalidation.service.d.ts +74 -0
  200. package/src/services/invalidation/development-invalidation.service.js +190 -0
  201. package/src/services/module-loading/app-module-loader.service.d.ts +28 -0
  202. package/src/services/module-loading/app-module-loader.service.js +35 -0
  203. package/src/services/module-loading/app-server-module-transpiler.service.d.ts +24 -0
  204. package/src/services/module-loading/app-server-module-transpiler.service.js +109 -0
  205. package/src/services/module-loading/host-module-loader-registry.d.ts +4 -0
  206. package/src/services/module-loading/host-module-loader-registry.js +15 -0
  207. package/src/services/module-loading/module-loading-types.d.ts +2 -0
  208. package/src/services/module-loading/node-bootstrap-plugin.d.ts +42 -0
  209. package/src/services/module-loading/node-bootstrap-plugin.js +204 -0
  210. package/src/services/module-loading/page-module-import.service.d.ts +76 -0
  211. package/src/services/module-loading/page-module-import.service.js +173 -0
  212. package/src/services/module-loading/server-module-transpiler.service.d.ts +72 -0
  213. package/src/services/module-loading/server-module-transpiler.service.js +64 -0
  214. package/src/services/runtime-state/dev-graph.service.d.ts +118 -0
  215. package/src/services/runtime-state/dev-graph.service.js +162 -0
  216. package/src/services/runtime-state/entrypoint-dependency-graph.service.d.ts +41 -0
  217. package/src/services/runtime-state/entrypoint-dependency-graph.service.js +85 -0
  218. package/src/services/runtime-state/runtime-specifier-registry.service.d.ts +69 -0
  219. package/src/services/runtime-state/runtime-specifier-registry.service.js +37 -0
  220. package/src/services/runtime-state/server-invalidation-state.service.d.ts +26 -0
  221. package/src/services/runtime-state/server-invalidation-state.service.js +35 -0
  222. package/src/services/{schema-validation-service.d.ts → validation/schema-validation-service.d.ts} +1 -1
  223. package/src/static-site-generator/README.md +26 -0
  224. package/src/static-site-generator/static-site-generator.d.ts +50 -3
  225. package/src/static-site-generator/static-site-generator.js +71 -5
  226. package/src/{internal-types.d.ts → types/internal-types.d.ts} +53 -22
  227. package/src/types/internal-types.js +0 -0
  228. package/src/{public-types.d.ts → types/public-types.d.ts} +146 -21
  229. package/src/types/public-types.js +0 -0
  230. package/src/utils/html-escaping.d.ts +7 -0
  231. package/src/utils/html-escaping.js +6 -0
  232. package/src/utils/locals-utils.d.ts +1 -1
  233. package/src/utils/parse-cli-args.d.ts +4 -1
  234. package/src/utils/parse-cli-args.js +16 -1
  235. package/src/utils/resolve-work-dir.d.ts +11 -0
  236. package/src/utils/resolve-work-dir.js +31 -0
  237. package/src/watchers/project-watcher.d.ts +40 -24
  238. package/src/watchers/project-watcher.js +129 -92
  239. package/src/watchers/project-watcher.test-helpers.d.ts +2 -2
  240. package/src/watchers/project-watcher.test-helpers.js +1 -0
  241. package/src/adapters/abstract/application-adapter.ts +0 -337
  242. package/src/adapters/abstract/router-adapter.ts +0 -30
  243. package/src/adapters/abstract/server-adapter.ts +0 -79
  244. package/src/adapters/bun/client-bridge.ts +0 -62
  245. package/src/adapters/bun/create-app.ts +0 -189
  246. package/src/adapters/bun/define-api-handler.d.ts +0 -61
  247. package/src/adapters/bun/define-api-handler.ts +0 -114
  248. package/src/adapters/bun/hmr-manager.ts +0 -281
  249. package/src/adapters/bun/index.ts +0 -3
  250. package/src/adapters/bun/server-adapter.ts +0 -492
  251. package/src/adapters/bun/server-lifecycle.ts +0 -154
  252. package/src/adapters/index.ts +0 -6
  253. package/src/adapters/node/create-app.ts +0 -179
  254. package/src/adapters/node/index.d.ts +0 -4
  255. package/src/adapters/node/index.js +0 -8
  256. package/src/adapters/node/index.ts +0 -9
  257. package/src/adapters/node/node-client-bridge.ts +0 -79
  258. package/src/adapters/node/node-hmr-manager.ts +0 -271
  259. package/src/adapters/node/server-adapter.ts +0 -561
  260. package/src/adapters/node/static-content-server.ts +0 -203
  261. package/src/adapters/shared/api-response.ts +0 -104
  262. package/src/adapters/shared/application-adapter.ts +0 -199
  263. package/src/adapters/shared/explicit-static-route-matcher.ts +0 -134
  264. package/src/adapters/shared/file-route-middleware-pipeline.ts +0 -123
  265. package/src/adapters/shared/fs-server-response-factory.ts +0 -118
  266. package/src/adapters/shared/fs-server-response-matcher.ts +0 -198
  267. package/src/adapters/shared/render-context.ts +0 -105
  268. package/src/adapters/shared/server-adapter.ts +0 -442
  269. package/src/adapters/shared/server-route-handler.ts +0 -166
  270. package/src/adapters/shared/server-static-builder.ts +0 -82
  271. package/src/build/build-adapter.ts +0 -132
  272. package/src/build/build-types.ts +0 -83
  273. package/src/build/esbuild-build-adapter.ts +0 -510
  274. package/src/config/config-builder.ts +0 -474
  275. package/src/constants.ts +0 -39
  276. package/src/create-app.ts +0 -87
  277. package/src/define-api-handler.js +0 -15
  278. package/src/define-api-handler.ts +0 -66
  279. package/src/dev/sc-server.ts +0 -143
  280. package/src/eco/component-render-context.d.ts +0 -105
  281. package/src/eco/component-render-context.js +0 -77
  282. package/src/eco/component-render-context.ts +0 -202
  283. package/src/eco/eco.ts +0 -221
  284. package/src/eco/eco.types.ts +0 -202
  285. package/src/eco/global-injector-map.ts +0 -112
  286. package/src/eco/lazy-injector-map.ts +0 -120
  287. package/src/eco/module-dependencies.ts +0 -75
  288. package/src/errors/http-error.ts +0 -72
  289. package/src/errors/index.ts +0 -2
  290. package/src/errors/locals-access-error.ts +0 -7
  291. package/src/global/app-logger.ts +0 -4
  292. package/src/hmr/client/__screenshots__/hmr-runtime.test.browser.ts/HMR-Runtime-HMR-Server-Integration-should-have-HMR-script-injected-in-page-1.png +0 -0
  293. package/src/hmr/client/__screenshots__/hmr-runtime.test.browser.ts/HMR-Runtime-HMR-Server-Integration-should-load-fixture-app-page-1.png +0 -0
  294. package/src/hmr/client/__screenshots__/hmr-runtime.test.browser.ts/HMR-Runtime-WebSocket-Connection-should-connect-to-correct-HMR-endpoint-1.png +0 -0
  295. package/src/hmr/client/hmr-runtime.ts +0 -121
  296. package/src/hmr/hmr-strategy.ts +0 -172
  297. package/src/hmr/hmr.test.e2e.ts +0 -75
  298. package/src/hmr/strategies/default-hmr-strategy.ts +0 -60
  299. package/src/hmr/strategies/js-hmr-strategy.ts +0 -308
  300. package/src/index.browser.ts +0 -3
  301. package/src/index.ts +0 -5
  302. package/src/integrations/ghtml/ghtml-renderer.ts +0 -93
  303. package/src/integrations/ghtml/ghtml.plugin.ts +0 -32
  304. package/src/internal-types.ts +0 -212
  305. package/src/plugins/alias-resolver-plugin.ts +0 -45
  306. package/src/plugins/eco-component-meta-plugin.ts +0 -474
  307. package/src/plugins/integration-plugin.ts +0 -184
  308. package/src/plugins/processor.ts +0 -220
  309. package/src/public-types.ts +0 -1255
  310. package/src/route-renderer/component-graph-executor.d.ts +0 -32
  311. package/src/route-renderer/component-graph-executor.js +0 -31
  312. package/src/route-renderer/component-graph-executor.ts +0 -84
  313. package/src/route-renderer/component-graph.d.ts +0 -42
  314. package/src/route-renderer/component-graph.js +0 -72
  315. package/src/route-renderer/component-graph.ts +0 -159
  316. package/src/route-renderer/component-marker.d.ts +0 -52
  317. package/src/route-renderer/component-marker.js +0 -46
  318. package/src/route-renderer/component-marker.ts +0 -117
  319. package/src/route-renderer/dependency-resolver.ts +0 -596
  320. package/src/route-renderer/html-post-processing.service.d.ts +0 -40
  321. package/src/route-renderer/html-post-processing.service.js +0 -86
  322. package/src/route-renderer/html-post-processing.service.ts +0 -103
  323. package/src/route-renderer/integration-renderer.d.ts +0 -339
  324. package/src/route-renderer/integration-renderer.js +0 -526
  325. package/src/route-renderer/integration-renderer.ts +0 -696
  326. package/src/route-renderer/marker-graph-resolver.d.ts +0 -76
  327. package/src/route-renderer/marker-graph-resolver.js +0 -93
  328. package/src/route-renderer/marker-graph-resolver.ts +0 -153
  329. package/src/route-renderer/page-module-loader.d.ts +0 -61
  330. package/src/route-renderer/page-module-loader.ts +0 -153
  331. package/src/route-renderer/render-execution.service.d.ts +0 -69
  332. package/src/route-renderer/render-execution.service.js +0 -91
  333. package/src/route-renderer/render-execution.service.ts +0 -158
  334. package/src/route-renderer/render-preparation.service.ts +0 -358
  335. package/src/route-renderer/route-renderer.ts +0 -80
  336. package/src/router/fs-router-scanner.ts +0 -217
  337. package/src/router/fs-router.ts +0 -122
  338. package/src/services/asset-processing-service/asset-processing.service.d.ts +0 -41
  339. package/src/services/asset-processing-service/asset-processing.service.ts +0 -306
  340. package/src/services/asset-processing-service/asset.factory.ts +0 -105
  341. package/src/services/asset-processing-service/assets.types.ts +0 -112
  342. package/src/services/asset-processing-service/index.d.ts +0 -3
  343. package/src/services/asset-processing-service/index.js +0 -3
  344. package/src/services/asset-processing-service/index.ts +0 -3
  345. package/src/services/asset-processing-service/processor.interface.ts +0 -27
  346. package/src/services/asset-processing-service/processor.registry.ts +0 -18
  347. package/src/services/asset-processing-service/processors/base/base-processor.ts +0 -76
  348. package/src/services/asset-processing-service/processors/base/base-script-processor.ts +0 -105
  349. package/src/services/asset-processing-service/processors/index.d.ts +0 -5
  350. package/src/services/asset-processing-service/processors/index.js +0 -5
  351. package/src/services/asset-processing-service/processors/index.ts +0 -5
  352. package/src/services/asset-processing-service/processors/script/content-script.processor.ts +0 -66
  353. package/src/services/asset-processing-service/processors/script/file-script.processor.ts +0 -88
  354. package/src/services/asset-processing-service/processors/script/node-module-script.processor.ts +0 -84
  355. package/src/services/asset-processing-service/processors/stylesheet/content-stylesheet.processor.ts +0 -27
  356. package/src/services/asset-processing-service/processors/stylesheet/file-stylesheet.processor.ts +0 -77
  357. package/src/services/cache/cache.types.ts +0 -126
  358. package/src/services/cache/index.ts +0 -18
  359. package/src/services/cache/memory-cache-store.ts +0 -130
  360. package/src/services/cache/page-cache-service.ts +0 -202
  361. package/src/services/html-transformer.service.d.ts +0 -50
  362. package/src/services/html-transformer.service.js +0 -163
  363. package/src/services/html-transformer.service.ts +0 -217
  364. package/src/services/page-module-import.service.d.ts +0 -37
  365. package/src/services/page-module-import.service.js +0 -88
  366. package/src/services/page-module-import.service.ts +0 -129
  367. package/src/services/page-request-cache-coordinator.service.ts +0 -128
  368. package/src/services/schema-validation-service.ts +0 -204
  369. package/src/services/validation/standard-schema.types.ts +0 -68
  370. package/src/static-site-generator/static-site-generator.ts +0 -359
  371. package/src/utils/css.d.ts +0 -1
  372. package/src/utils/css.js +0 -7
  373. package/src/utils/css.ts +0 -5
  374. package/src/utils/deep-merge.ts +0 -47
  375. package/src/utils/hash.ts +0 -5
  376. package/src/utils/html.ts +0 -1
  377. package/src/utils/invariant.ts +0 -15
  378. package/src/utils/locals-utils.ts +0 -37
  379. package/src/utils/parse-cli-args.ts +0 -83
  380. package/src/utils/path-utils.module.ts +0 -14
  381. package/src/utils/runtime.ts +0 -44
  382. package/src/utils/server-utils.module.ts +0 -67
  383. package/src/watchers/project-watcher.test-helpers.ts +0 -40
  384. package/src/watchers/project-watcher.ts +0 -306
  385. /package/src/adapters/{bun → shared}/define-api-handler.js +0 -0
  386. /package/src/{internal-types.js → plugins/runtime-capability.js} +0 -0
  387. /package/src/services/{asset-processing-service → assets/asset-processing-service}/assets.types.js +0 -0
  388. /package/src/services/{asset-processing-service → assets/asset-processing-service}/processor.interface.js +0 -0
  389. /package/src/services/{asset-processing-service → assets/asset-processing-service}/processor.registry.js +0 -0
  390. /package/src/{public-types.js → services/module-loading/module-loading-types.js} +0 -0
  391. /package/src/services/{schema-validation-service.js → validation/schema-validation-service.js} +0 -0
@@ -1,27 +1,43 @@
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 runtimeSpecifierRegistry;
40
+ private readonly serverModuleTranspiler;
25
41
  private wsHandler;
26
42
  constructor({ appConfig, bridge }: HmrManagerParams);
27
43
  /**
@@ -31,6 +47,15 @@ export declare class HmrManager implements IHmrManager {
31
47
  * can share the same dist path during e2e runs.
32
48
  */
33
49
  private cleanDistDir;
50
+ /**
51
+ * Returns whether the generic JS strategy may rebuild an entrypoint.
52
+ *
53
+ * @remarks
54
+ * Integration-owned page entrypoints are excluded so a shared dependency
55
+ * invalidation cannot replace framework-owned browser output with a generic JS
56
+ * rebuild.
57
+ */
58
+ private shouldJsStrategyProcessEntrypoint;
34
59
  /**
35
60
  * Initializes core HMR strategies.
36
61
  * Strategies are evaluated in priority order (highest first).
@@ -46,9 +71,13 @@ export declare class HmrManager implements IHmrManager {
46
71
  setEnabled(enabled: boolean): void;
47
72
  isEnabled(): boolean;
48
73
  /**
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
74
+ * Registers runtime bare-specifier mappings exposed by integrations.
75
+ *
76
+ * @remarks
77
+ * These mappings are consumed by framework-owned HMR strategies that preserve
78
+ * shared runtime imports in browser bundles. The registry stays generic so
79
+ * these mappings can later support broader import-map-style runtime features
80
+ * without moving integration semantics into core.
52
81
  */
53
82
  registerSpecifierMap(map: Record<string, string>): void;
54
83
  getWebSocketHandler(): BunSocketHandler;
@@ -58,27 +87,57 @@ export declare class HmrManager implements IHmrManager {
58
87
  buildRuntime(): Promise<void>;
59
88
  getRuntimePath(): string;
60
89
  broadcast(event: ClientBridgeEvent): void;
61
- /**
62
- * Handles file changes using registered HMR strategies.
63
- * Strategies are evaluated in priority order until one matches.
64
- * @param filePath - Absolute path to the changed file
65
- */
66
- handleFileChange(filePath: string): Promise<void>;
67
- /**
68
- * Registers a client entrypoint to be built and watched by Bun.
69
- */
90
+ handleFileChange(filePath: string, options?: HandleFileChangeOptions): Promise<void>;
70
91
  getOutputUrl(entrypointPath: string): string | undefined;
71
92
  getWatchedFiles(): Map<string, string>;
72
93
  getSpecifierMap(): Map<string, string>;
73
94
  getDistDir(): string;
74
95
  getPlugins(): EcoBuildPlugin[];
75
96
  getDefaultContext(): DefaultHmrContext;
97
+ private clearFailedEntrypointRegistration;
98
+ /**
99
+ * Registers one integration-owned page entrypoint.
100
+ *
101
+ * @remarks
102
+ * Concurrent callers share one in-flight registration. The registration is
103
+ * cleared from the dedupe map when it settles so later callers cannot inherit a
104
+ * stale promise.
105
+ */
76
106
  registerEntrypoint(entrypointPath: string): Promise<string>;
77
107
  /**
78
- * Encodes dynamic route segments (brackets) in file paths.
79
- * Converts `[slug]` to `_slug_` to avoid filesystem/URL issues.
108
+ * Registers one generic script entrypoint.
109
+ *
110
+ * @remarks
111
+ * This explicit path keeps the page-entrypoint contract strict while still
112
+ * allowing generic script assets to use the fallback build path.
113
+ */
114
+ registerScriptEntrypoint(entrypointPath: string): Promise<string>;
115
+ /**
116
+ * Performs strict integration-owned registration for one normalized path.
117
+ *
118
+ * @remarks
119
+ * The manager reserves the output URL, removes any stale emitted file, runs
120
+ * strategy processing without broadcasting, and then verifies that the owning
121
+ * integration emitted the expected file.
122
+ */
123
+ private emitStrictEntrypoint;
124
+ /**
125
+ * Performs registration for a generic script asset.
126
+ *
127
+ * @remarks
128
+ * This path performs a targeted browser bundle for the requested script
129
+ * entrypoint only. The resulting dependency graph is retained so later file
130
+ * changes can invalidate just the affected script entrypoints.
131
+ */
132
+ private emitScriptEntrypoint;
133
+ /**
134
+ * Stops active watchers and releases retained registration state.
135
+ *
136
+ * @remarks
137
+ * Emitted `_hmr` files remain on disk because parallel app processes may share
138
+ * the same dist directory. The in-memory indexes are cleared so stale
139
+ * entrypoints and specifier maps cannot leak through a reused manager object.
80
140
  */
81
- private encodeDynamicSegments;
82
141
  stop(): void;
83
142
  }
84
143
  export {};
@@ -1,29 +1,59 @@
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 { DefaultHmrStrategy } from "../../hmr/strategies/default-hmr-strategy";
7
- import { JsHmrStrategy } from "../../hmr/strategies/js-hmr-strategy";
8
- 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 { getAppRuntimeSpecifierRegistry } from "../../services/runtime-state/runtime-specifier-registry.service.js";
19
+ import { resolveInternalExecutionDir, resolveInternalWorkDir } from "../../utils/resolve-work-dir.js";
9
20
  class HmrManager {
21
+ static entrypointRegistrationTimeoutMs = 4e3;
10
22
  appConfig;
11
23
  bridge;
12
24
  /** Keep track of watchers */
13
25
  watchers = /* @__PURE__ */ new Map();
14
26
  /** entrypoint -> output path */
15
27
  watchedFiles = /* @__PURE__ */ new Map();
16
- /** bare specifier -> runtime URL (e.g., 'react' -> '/assets/vendors/react.js') */
17
- specifierMap = /* @__PURE__ */ new Map();
28
+ entrypointRegistrations = /* @__PURE__ */ new Map();
18
29
  distDir;
19
30
  plugins = [];
20
31
  enabled = true;
21
32
  strategies = [];
33
+ entrypointRegistrar;
34
+ browserBundleService;
35
+ entrypointDependencyGraph;
36
+ runtimeSpecifierRegistry;
37
+ serverModuleTranspiler;
22
38
  wsHandler;
23
39
  constructor({ appConfig, bridge }) {
24
40
  this.appConfig = appConfig;
25
41
  this.bridge = bridge;
26
- this.distDir = path.join(this.appConfig.absolutePaths.distDir, RESOLVED_ASSETS_DIR, "_hmr");
42
+ this.distDir = path.join(resolveInternalWorkDir(this.appConfig), RESOLVED_ASSETS_DIR, "_hmr");
43
+ this.entrypointRegistrar = new HmrEntrypointRegistrar({
44
+ srcDir: this.appConfig.absolutePaths.srcDir,
45
+ distDir: this.distDir,
46
+ entrypointRegistrations: this.entrypointRegistrations,
47
+ watchedFiles: this.watchedFiles,
48
+ clearFailedRegistration: (entrypointPath) => this.clearFailedEntrypointRegistration(entrypointPath),
49
+ registrationTimeoutMs: HmrManager.entrypointRegistrationTimeoutMs
50
+ });
51
+ this.browserBundleService = new BrowserBundleService(appConfig);
52
+ const existingEntrypointDependencyGraph = getAppEntrypointDependencyGraph(appConfig);
53
+ this.entrypointDependencyGraph = existingEntrypointDependencyGraph instanceof NoopEntrypointDependencyGraph ? existingEntrypointDependencyGraph : new NoopEntrypointDependencyGraph();
54
+ setAppEntrypointDependencyGraph(this.appConfig, this.entrypointDependencyGraph);
55
+ this.runtimeSpecifierRegistry = getAppRuntimeSpecifierRegistry(this.appConfig);
56
+ this.serverModuleTranspiler = getAppServerModuleTranspiler(this.appConfig);
27
57
  this.cleanDistDir();
28
58
  this.initializeStrategies();
29
59
  }
@@ -36,6 +66,27 @@ class HmrManager {
36
66
  cleanDistDir() {
37
67
  fileSystem.ensureDir(this.distDir);
38
68
  }
69
+ /**
70
+ * Returns whether the generic JS strategy may rebuild an entrypoint.
71
+ *
72
+ * @remarks
73
+ * Integration-owned page entrypoints are excluded so a shared dependency
74
+ * invalidation cannot replace framework-owned browser output with a generic JS
75
+ * rebuild.
76
+ */
77
+ shouldJsStrategyProcessEntrypoint(entrypointPath) {
78
+ return !this.strategies.some((strategy) => {
79
+ if (strategy.type !== HmrStrategyType.INTEGRATION || strategy.priority <= HmrStrategyType.SCRIPT) {
80
+ return false;
81
+ }
82
+ try {
83
+ return strategy.matches(entrypointPath);
84
+ } catch (error) {
85
+ appLogger.error(error);
86
+ return false;
87
+ }
88
+ });
89
+ }
39
90
  /**
40
91
  * Initializes core HMR strategies.
41
92
  * Strategies are evaluated in priority order (highest first).
@@ -43,10 +94,16 @@ class HmrManager {
43
94
  initializeStrategies() {
44
95
  const jsContext = {
45
96
  getWatchedFiles: () => this.watchedFiles,
46
- getSpecifierMap: () => this.specifierMap,
97
+ getSpecifierMap: () => this.runtimeSpecifierRegistry.getAll(),
47
98
  getDistDir: () => this.distDir,
48
99
  getPlugins: () => this.plugins,
49
- getSrcDir: () => this.appConfig.absolutePaths.srcDir
100
+ getSrcDir: () => this.appConfig.absolutePaths.srcDir,
101
+ getPagesDir: () => this.appConfig.absolutePaths.pagesDir,
102
+ getLayoutsDir: () => this.appConfig.absolutePaths.layoutsDir,
103
+ getTemplateExtensions: () => this.appConfig.templatesExt,
104
+ getBrowserBundleService: () => this.browserBundleService,
105
+ getEntrypointDependencyGraph: () => this.entrypointDependencyGraph,
106
+ shouldProcessEntrypoint: (entrypointPath) => this.shouldJsStrategyProcessEntrypoint(entrypointPath)
50
107
  };
51
108
  this.strategies = [new JsHmrStrategy(jsContext), new DefaultHmrStrategy()];
52
109
  }
@@ -68,14 +125,16 @@ class HmrManager {
68
125
  return this.enabled;
69
126
  }
70
127
  /**
71
- * Registers a mapping from bare specifiers to vendor URLs.
72
- * Used by integrations to provide their module resolution mappings.
73
- * @param map - Object mapping bare specifiers to vendor URLs
128
+ * Registers runtime bare-specifier mappings exposed by integrations.
129
+ *
130
+ * @remarks
131
+ * These mappings are consumed by framework-owned HMR strategies that preserve
132
+ * shared runtime imports in browser bundles. The registry stays generic so
133
+ * these mappings can later support broader import-map-style runtime features
134
+ * without moving integration semantics into core.
74
135
  */
75
136
  registerSpecifierMap(map) {
76
- for (const [specifier, url] of Object.entries(map)) {
77
- this.specifierMap.set(specifier, url);
78
- }
137
+ this.runtimeSpecifierRegistry.register(map);
79
138
  }
80
139
  getWebSocketHandler() {
81
140
  const open = (ws) => {
@@ -100,12 +159,12 @@ class HmrManager {
100
159
  */
101
160
  async buildRuntime() {
102
161
  const runtimeSource = path.resolve(import.meta.dirname, "../../hmr/client/hmr-runtime.js");
103
- const result = await defaultBuildAdapter.build({
162
+ const result = await this.browserBundleService.bundle({
163
+ profile: "hmr-runtime",
104
164
  entrypoints: [runtimeSource],
105
165
  outdir: this.distDir,
106
166
  naming: "_hmr_runtime.js",
107
167
  minify: false,
108
- ...defaultBuildAdapter.getTranspileOptions("hmr-runtime"),
109
168
  plugins: this.plugins
110
169
  });
111
170
  if (!result.success) {
@@ -121,18 +180,13 @@ class HmrManager {
121
180
  );
122
181
  this.bridge.broadcast(event);
123
182
  }
124
- /**
125
- * Handles file changes using registered HMR strategies.
126
- * Strategies are evaluated in priority order until one matches.
127
- * @param filePath - Absolute path to the changed file
128
- */
129
- async handleFileChange(filePath) {
183
+ async handleFileChange(filePath, options = {}) {
130
184
  const sorted = [...this.strategies].sort((a, b) => b.priority - a.priority);
131
185
  const strategy = sorted.find((s) => {
132
186
  try {
133
187
  return s.matches(filePath);
134
188
  } catch (err) {
135
- appLogger.error(`[HmrManager] Error checking match for ${s.constructor.name}:`, err);
189
+ appLogger.error(err);
136
190
  return false;
137
191
  }
138
192
  });
@@ -142,7 +196,8 @@ class HmrManager {
142
196
  }
143
197
  appLogger.debug(`[HmrManager] Selected strategy: ${strategy.constructor.name}`);
144
198
  const action = await strategy.process(filePath);
145
- if (action.type === "broadcast") {
199
+ const shouldBroadcast = options.broadcast ?? true;
200
+ if (shouldBroadcast && action.type === "broadcast") {
146
201
  if (action.events) {
147
202
  for (const event of action.events) {
148
203
  this.broadcast(event);
@@ -150,9 +205,6 @@ class HmrManager {
150
205
  }
151
206
  }
152
207
  }
153
- /**
154
- * Registers a client entrypoint to be built and watched by Bun.
155
- */
156
208
  getOutputUrl(entrypointPath) {
157
209
  return this.watchedFiles.get(entrypointPath);
158
210
  }
@@ -160,7 +212,7 @@ class HmrManager {
160
212
  return this.watchedFiles;
161
213
  }
162
214
  getSpecifierMap() {
163
- return this.specifierMap;
215
+ return this.runtimeSpecifierRegistry.getAll();
164
216
  }
165
217
  getDistDir() {
166
218
  return this.distDir;
@@ -171,55 +223,109 @@ class HmrManager {
171
223
  getDefaultContext() {
172
224
  return {
173
225
  getWatchedFiles: () => this.watchedFiles,
174
- getSpecifierMap: () => this.specifierMap,
226
+ getSpecifierMap: () => this.runtimeSpecifierRegistry.getAll(),
175
227
  getDistDir: () => this.distDir,
176
228
  getPlugins: () => this.plugins,
177
229
  getSrcDir: () => this.appConfig.absolutePaths.srcDir,
178
230
  getLayoutsDir: () => this.appConfig.absolutePaths.layoutsDir,
179
- getPagesDir: () => this.appConfig.absolutePaths.pagesDir
231
+ getPagesDir: () => this.appConfig.absolutePaths.pagesDir,
232
+ getBuildExecutor: () => getAppBuildExecutor(this.appConfig),
233
+ getBrowserBundleService: () => this.browserBundleService,
234
+ importServerModule: async (filePath) => await this.serverModuleTranspiler.importModule({
235
+ filePath,
236
+ outdir: path.join(resolveInternalExecutionDir(this.appConfig), ".server-modules"),
237
+ externalPackages: true
238
+ })
180
239
  };
181
240
  }
241
+ clearFailedEntrypointRegistration(entrypointPath) {
242
+ this.watchedFiles.delete(entrypointPath);
243
+ }
244
+ /**
245
+ * Registers one integration-owned page entrypoint.
246
+ *
247
+ * @remarks
248
+ * Concurrent callers share one in-flight registration. The registration is
249
+ * cleared from the dedupe map when it settles so later callers cannot inherit a
250
+ * stale promise.
251
+ */
182
252
  async registerEntrypoint(entrypointPath) {
183
- if (this.watchedFiles.has(entrypointPath)) {
184
- return this.watchedFiles.get(entrypointPath);
253
+ return await this.entrypointRegistrar.registerEntrypoint(entrypointPath, {
254
+ emit: async (normalizedEntrypoint) => await this.emitStrictEntrypoint(normalizedEntrypoint),
255
+ getMissingOutputError: (normalizedEntrypoint, outputPath) => new Error(
256
+ `[HMR] Integration failed to emit entrypoint ${normalizedEntrypoint} to ${outputPath}. Page entrypoints must be produced by their owning integration.`
257
+ )
258
+ });
259
+ }
260
+ /**
261
+ * Registers one generic script entrypoint.
262
+ *
263
+ * @remarks
264
+ * This explicit path keeps the page-entrypoint contract strict while still
265
+ * allowing generic script assets to use the fallback build path.
266
+ */
267
+ async registerScriptEntrypoint(entrypointPath) {
268
+ return await this.entrypointRegistrar.registerEntrypoint(entrypointPath, {
269
+ emit: async (normalizedEntrypoint, outputPath) => await this.emitScriptEntrypoint(normalizedEntrypoint, outputPath),
270
+ getMissingOutputError: (normalizedEntrypoint) => new Error(`[HMR] Failed to register script entrypoint: ${normalizedEntrypoint}`)
271
+ });
272
+ }
273
+ /**
274
+ * Performs strict integration-owned registration for one normalized path.
275
+ *
276
+ * @remarks
277
+ * The manager reserves the output URL, removes any stale emitted file, runs
278
+ * strategy processing without broadcasting, and then verifies that the owning
279
+ * integration emitted the expected file.
280
+ */
281
+ async emitStrictEntrypoint(entrypointPath) {
282
+ await this.handleFileChange(entrypointPath, { broadcast: false });
283
+ }
284
+ /**
285
+ * Performs registration for a generic script asset.
286
+ *
287
+ * @remarks
288
+ * This path performs a targeted browser bundle for the requested script
289
+ * entrypoint only. The resulting dependency graph is retained so later file
290
+ * changes can invalidate just the affected script entrypoints.
291
+ */
292
+ async emitScriptEntrypoint(entrypointPath, outputPath) {
293
+ const naming = path.relative(this.distDir, outputPath).split(path.sep).join("/");
294
+ const buildResult = await this.browserBundleService.bundle({
295
+ profile: "hmr-entrypoint",
296
+ entrypoints: [entrypointPath],
297
+ outdir: this.distDir,
298
+ naming,
299
+ minify: false,
300
+ plugins: this.plugins
301
+ });
302
+ if (!buildResult.success) {
303
+ appLogger.error(`[HMR] Generic script entrypoint build failed for ${entrypointPath}:`, buildResult.logs);
304
+ return;
185
305
  }
186
- const srcDir = this.appConfig.absolutePaths.srcDir;
187
- const relativePath = path.relative(srcDir, entrypointPath);
188
- const relativePathJs = relativePath.replace(/\.(tsx?|jsx?|mdx?)$/, ".js");
189
- const encodedPathJs = this.encodeDynamicSegments(relativePathJs);
190
- const urlPath = encodedPathJs.split(path.sep).join("/");
191
- const outputUrl = `/${path.join(RESOLVED_ASSETS_DIR, "_hmr", urlPath)}`;
192
- const outputPath = path.join(this.distDir, urlPath);
193
- this.watchedFiles.set(entrypointPath, outputUrl);
194
- await this.handleFileChange(entrypointPath);
195
- if (!fileSystem.exists(outputPath)) {
196
- const fallback = await defaultBuildAdapter.build({
197
- entrypoints: [entrypointPath],
198
- outdir: this.distDir,
199
- naming: encodedPathJs,
200
- minify: false,
201
- external: Array.from(this.specifierMap.keys()),
202
- ...defaultBuildAdapter.getTranspileOptions("hmr-entrypoint"),
203
- plugins: this.plugins
204
- });
205
- if (!fallback.success) {
206
- appLogger.error(`[HMR] Fallback build failed for ${entrypointPath}:`, fallback.logs);
207
- }
306
+ const entrypointDependencies = buildResult.dependencyGraph?.entrypoints?.[entrypointPath];
307
+ if (entrypointDependencies) {
308
+ this.entrypointDependencyGraph.setEntrypointDependencies(entrypointPath, entrypointDependencies);
208
309
  }
209
- return outputUrl;
210
310
  }
211
311
  /**
212
- * Encodes dynamic route segments (brackets) in file paths.
213
- * Converts `[slug]` to `_slug_` to avoid filesystem/URL issues.
312
+ * Stops active watchers and releases retained registration state.
313
+ *
314
+ * @remarks
315
+ * Emitted `_hmr` files remain on disk because parallel app processes may share
316
+ * the same dist directory. The in-memory indexes are cleared so stale
317
+ * entrypoints and specifier maps cannot leak through a reused manager object.
214
318
  */
215
- encodeDynamicSegments(filepath) {
216
- return filepath.replace(/\[([^\]]+)\]/g, "_$1_");
217
- }
218
319
  stop() {
320
+ this.entrypointRegistrations.clear();
219
321
  for (const watcher of this.watchers.values()) {
220
322
  watcher.close();
221
323
  }
222
324
  this.watchers.clear();
325
+ this.watchedFiles.clear();
326
+ this.runtimeSpecifierRegistry.clear();
327
+ this.entrypointDependencyGraph.reset();
328
+ this.plugins = [];
223
329
  }
224
330
  }
225
331
  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>;