@ecopages/core 0.2.0-alpha.23 → 0.2.0-alpha.24

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 (515) hide show
  1. package/package.json +93 -226
  2. package/src/adapters/abstract/application-adapter.test.ts +172 -0
  3. package/src/adapters/abstract/application-adapter.ts +379 -0
  4. package/src/adapters/abstract/router-adapter.ts +30 -0
  5. package/src/adapters/abstract/server-adapter.ts +79 -0
  6. package/src/adapters/bun/client-bridge.ts +62 -0
  7. package/src/adapters/bun/create-app.ts +180 -0
  8. package/src/adapters/bun/hmr-manager.test.ts +267 -0
  9. package/src/adapters/bun/hmr-manager.ts +406 -0
  10. package/src/adapters/bun/index.ts +2 -0
  11. package/src/adapters/bun/server-adapter.ts +500 -0
  12. package/src/adapters/bun/server-lifecycle.ts +124 -0
  13. package/src/adapters/create-app.test.ts +10 -0
  14. package/src/adapters/create-app.ts +91 -0
  15. package/src/adapters/index.ts +2 -0
  16. package/src/adapters/node/create-app.test.ts +53 -0
  17. package/src/adapters/node/create-app.ts +183 -0
  18. package/src/adapters/node/node-client-bridge.test.ts +198 -0
  19. package/src/adapters/node/node-client-bridge.ts +79 -0
  20. package/src/adapters/node/node-hmr-manager.test.ts +322 -0
  21. package/src/adapters/node/node-hmr-manager.ts +378 -0
  22. package/src/adapters/node/server-adapter.ts +502 -0
  23. package/src/adapters/node/static-content-server.test.ts +60 -0
  24. package/src/adapters/node/static-content-server.ts +239 -0
  25. package/src/adapters/shared/api-response.test.ts +97 -0
  26. package/src/adapters/shared/api-response.ts +104 -0
  27. package/src/adapters/shared/application-adapter.ts +199 -0
  28. package/src/adapters/shared/define-api-handler.ts +66 -0
  29. package/src/adapters/shared/explicit-static-route-matcher.test.ts +381 -0
  30. package/src/adapters/shared/explicit-static-route-matcher.ts +140 -0
  31. package/src/adapters/shared/file-route-middleware-pipeline.test.ts +90 -0
  32. package/src/adapters/shared/file-route-middleware-pipeline.ts +127 -0
  33. package/src/adapters/shared/fs-server-response-factory.test.ts +187 -0
  34. package/src/adapters/shared/fs-server-response-factory.ts +118 -0
  35. package/src/adapters/shared/fs-server-response-matcher.test.ts +285 -0
  36. package/src/adapters/shared/fs-server-response-matcher.ts +189 -0
  37. package/src/adapters/shared/hmr-entrypoint-registrar.ts +149 -0
  38. package/src/adapters/shared/hmr-html-response.ts +52 -0
  39. package/src/adapters/shared/hmr-manager.contract.test.ts +232 -0
  40. package/src/adapters/shared/hmr-manager.dispatch.test.ts +220 -0
  41. package/src/adapters/shared/render-context.test.ts +150 -0
  42. package/src/adapters/shared/render-context.ts +123 -0
  43. package/src/adapters/shared/runtime-bootstrap.ts +79 -0
  44. package/src/adapters/shared/server-adapter.test.ts +77 -0
  45. package/src/adapters/shared/server-adapter.ts +493 -0
  46. package/src/adapters/shared/server-route-handler.test.ts +110 -0
  47. package/src/adapters/shared/server-route-handler.ts +153 -0
  48. package/src/adapters/shared/server-static-builder.test.ts +338 -0
  49. package/src/adapters/shared/server-static-builder.ts +170 -0
  50. package/src/build/build-adapter-serialization.test.ts +281 -0
  51. package/src/build/build-adapter.test.ts +1240 -0
  52. package/src/build/build-adapter.ts +1012 -0
  53. package/src/build/build-manifest.ts +54 -0
  54. package/src/build/build-types.ts +83 -0
  55. package/src/build/dev-build-coordinator.ts +220 -0
  56. package/src/build/esbuild-build-adapter.ts +660 -0
  57. package/src/build/runtime-build-executor.test.ts +81 -0
  58. package/src/build/runtime-build-executor.ts +40 -0
  59. package/src/build/runtime-specifier-alias-plugin.test.ts +67 -0
  60. package/src/build/runtime-specifier-alias-plugin.ts +62 -0
  61. package/src/build/runtime-specifier-aliases.ts +135 -0
  62. package/src/config/config-builder.test.ts +443 -0
  63. package/src/config/config-builder.ts +742 -0
  64. package/src/config/config-builder.typecheck.test.ts +96 -0
  65. package/src/config/{constants.d.ts → constants.ts} +22 -13
  66. package/src/dev/sc-server.ts +143 -0
  67. package/src/eco/eco.browser.test.ts +43 -0
  68. package/src/eco/eco.browser.ts +118 -0
  69. package/src/eco/eco.test.ts +654 -0
  70. package/src/eco/eco.ts +205 -0
  71. package/src/eco/eco.types.ts +221 -0
  72. package/src/eco/eco.utils.test.ts +219 -0
  73. package/src/eco/eco.utils.ts +5 -0
  74. package/src/eco/global-injector-map.test.ts +42 -0
  75. package/src/eco/global-injector-map.ts +112 -0
  76. package/src/eco/lazy-injector-map.test.ts +66 -0
  77. package/src/eco/lazy-injector-map.ts +120 -0
  78. package/src/eco/module-dependencies.test.ts +30 -0
  79. package/src/eco/module-dependencies.ts +75 -0
  80. package/src/errors/http-error.test.ts +134 -0
  81. package/src/errors/http-error.ts +72 -0
  82. package/src/errors/{index.d.ts → index.ts} +2 -2
  83. package/src/errors/locals-access-error.ts +7 -0
  84. package/src/global/app-logger.ts +4 -0
  85. package/src/global/utils.test.ts +12 -0
  86. 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
  87. package/src/hmr/client/__screenshots__/hmr-runtime.test.browser.ts/HMR-Runtime-HMR-Server-Integration-should-load-fixture-app-page-1.png +0 -0
  88. package/src/hmr/client/__screenshots__/hmr-runtime.test.browser.ts/HMR-Runtime-WebSocket-Connection-should-connect-to-correct-HMR-endpoint-1.png +0 -0
  89. package/src/hmr/client/hmr-runtime.ts +160 -0
  90. package/src/hmr/hmr-strategy.test.ts +124 -0
  91. package/src/hmr/hmr-strategy.ts +177 -0
  92. package/src/hmr/hmr.postcss.test.e2e.ts +41 -0
  93. package/src/hmr/hmr.test.e2e.ts +66 -0
  94. package/src/hmr/strategies/default-hmr-strategy.ts +60 -0
  95. package/src/hmr/strategies/js-hmr-strategy.test.ts +335 -0
  96. package/src/hmr/strategies/js-hmr-strategy.ts +320 -0
  97. package/src/index.browser.ts +3 -0
  98. package/src/index.ts +15 -0
  99. package/src/integrations/ghtml/ghtml-renderer.test.ts +253 -0
  100. package/src/integrations/ghtml/ghtml-renderer.ts +97 -0
  101. package/src/integrations/ghtml/ghtml.constants.ts +1 -0
  102. package/src/integrations/ghtml/ghtml.plugin.ts +28 -0
  103. package/src/plugins/alias-resolver-plugin.test.ts +41 -0
  104. package/src/plugins/alias-resolver-plugin.ts +63 -0
  105. package/src/plugins/eco-component-meta-plugin.test.ts +406 -0
  106. package/src/plugins/eco-component-meta-plugin.ts +495 -0
  107. package/src/plugins/foreign-jsx-override-plugin.test.ts +65 -0
  108. package/src/plugins/foreign-jsx-override-plugin.ts +67 -0
  109. package/src/plugins/integration-plugin.test.ts +156 -0
  110. package/src/plugins/integration-plugin.ts +311 -0
  111. package/src/plugins/processor.test.ts +148 -0
  112. package/src/plugins/processor.ts +240 -0
  113. package/src/plugins/{runtime-capability.d.ts → runtime-capability.ts} +8 -3
  114. package/src/plugins/source-transform.test.ts +82 -0
  115. package/src/plugins/source-transform.ts +123 -0
  116. package/src/route-renderer/orchestration/boundary-planning.service.ts +146 -0
  117. package/src/route-renderer/orchestration/component-render-context.ts +318 -0
  118. package/src/route-renderer/orchestration/integration-renderer.test.ts +2088 -0
  119. package/src/route-renderer/orchestration/integration-renderer.ts +1285 -0
  120. package/src/route-renderer/orchestration/page-packaging.service.test.ts +76 -0
  121. package/src/route-renderer/orchestration/page-packaging.service.ts +85 -0
  122. package/src/route-renderer/orchestration/processed-asset-dedupe.ts +25 -0
  123. package/src/route-renderer/orchestration/queued-boundary-runtime.service.test.ts +319 -0
  124. package/src/route-renderer/orchestration/queued-boundary-runtime.service.ts +289 -0
  125. package/src/route-renderer/orchestration/render-execution.service.test.ts +196 -0
  126. package/src/route-renderer/orchestration/render-execution.service.ts +182 -0
  127. package/src/route-renderer/orchestration/render-output.utils.ts +302 -0
  128. package/src/route-renderer/orchestration/render-preparation.service.test.ts +569 -0
  129. package/src/route-renderer/orchestration/render-preparation.service.ts +508 -0
  130. package/src/route-renderer/orchestration/route-shell-composer.service.ts +162 -0
  131. package/src/route-renderer/orchestration/template-serialization.test.ts +110 -0
  132. package/src/route-renderer/orchestration/template-serialization.ts +117 -0
  133. package/src/route-renderer/page-loading/component-dependency-collection.ts +196 -0
  134. package/src/route-renderer/page-loading/declared-asset-collection.ts +156 -0
  135. package/src/route-renderer/page-loading/dependency-resolver.test.ts +665 -0
  136. package/src/route-renderer/page-loading/dependency-resolver.ts +150 -0
  137. package/src/route-renderer/page-loading/ecopages-virtual-imports.ts +75 -0
  138. package/src/route-renderer/page-loading/lazy-entry-collection.ts +167 -0
  139. package/src/route-renderer/page-loading/lazy-trigger-planning.ts +74 -0
  140. package/src/route-renderer/page-loading/module-declaration-aggregation.ts +60 -0
  141. package/src/route-renderer/page-loading/module-declaration-scripts.ts +16 -0
  142. package/src/route-renderer/page-loading/page-dependency-bundling.ts +205 -0
  143. package/src/route-renderer/page-loading/page-module-loader.test.ts +183 -0
  144. package/src/route-renderer/page-loading/page-module-loader.ts +184 -0
  145. package/src/route-renderer/route-renderer.ts +136 -0
  146. package/src/router/client/link-intent.test.browser.ts +51 -0
  147. package/src/router/client/link-intent.ts +92 -0
  148. package/src/router/client/navigation-coordinator.test.ts +237 -0
  149. package/src/router/client/navigation-coordinator.ts +453 -0
  150. package/src/router/server/fs-router-scanner.test.ts +83 -0
  151. package/src/router/server/fs-router-scanner.ts +224 -0
  152. package/src/router/server/fs-router.test.ts +214 -0
  153. package/src/router/server/fs-router.ts +122 -0
  154. package/src/services/assets/asset-processing-service/asset-dependency-keys.ts +66 -0
  155. package/src/services/assets/asset-processing-service/asset-processing.service.test.ts +476 -0
  156. package/src/services/assets/asset-processing-service/asset-processing.service.ts +345 -0
  157. package/src/services/assets/asset-processing-service/asset.factory.test.ts +63 -0
  158. package/src/services/assets/asset-processing-service/asset.factory.ts +105 -0
  159. package/src/services/assets/asset-processing-service/assets.types.ts +125 -0
  160. package/src/services/assets/asset-processing-service/browser-runtime-asset.factory.test.ts +74 -0
  161. package/src/services/assets/asset-processing-service/browser-runtime-asset.factory.ts +96 -0
  162. package/src/services/assets/asset-processing-service/browser-runtime-entry.factory.test.ts +67 -0
  163. package/src/services/assets/asset-processing-service/browser-runtime-entry.factory.ts +78 -0
  164. package/src/services/assets/asset-processing-service/grouped-content-bundles.ts +104 -0
  165. package/src/services/assets/asset-processing-service/index.ts +5 -0
  166. package/src/services/assets/asset-processing-service/{processor.interface.d.ts → processor.interface.ts} +10 -5
  167. package/src/services/assets/asset-processing-service/processor.registry.ts +18 -0
  168. package/src/services/assets/asset-processing-service/processors/base/base-processor.test.ts +59 -0
  169. package/src/services/assets/asset-processing-service/processors/base/base-processor.ts +83 -0
  170. package/src/services/assets/asset-processing-service/processors/base/base-script-processor.ts +174 -0
  171. package/src/services/assets/asset-processing-service/processors/index.ts +5 -0
  172. package/src/services/assets/asset-processing-service/processors/script/content-script.processor.test.ts +192 -0
  173. package/src/services/assets/asset-processing-service/processors/script/content-script.processor.ts +134 -0
  174. package/src/services/assets/asset-processing-service/processors/script/file-script.processor.test.ts +326 -0
  175. package/src/services/assets/asset-processing-service/processors/script/file-script.processor.ts +110 -0
  176. package/src/services/assets/asset-processing-service/processors/script/node-module-script.processor.test.ts +227 -0
  177. package/src/services/assets/asset-processing-service/processors/script/node-module-script.processor.ts +87 -0
  178. package/src/services/assets/asset-processing-service/processors/stylesheet/content-stylesheet.processor.test.ts +261 -0
  179. package/src/services/assets/asset-processing-service/processors/stylesheet/content-stylesheet.processor.ts +71 -0
  180. package/src/services/assets/asset-processing-service/processors/stylesheet/file-stylesheet.processor.ts +81 -0
  181. package/src/services/assets/asset-processing-service/ungrouped-dependency-processing.ts +65 -0
  182. package/src/services/assets/browser-bundle.service.test.ts +66 -0
  183. package/src/services/assets/browser-bundle.service.ts +109 -0
  184. package/src/services/cache/cache.types.ts +126 -0
  185. package/src/services/cache/index.ts +18 -0
  186. package/src/services/cache/memory-cache-store.test.ts +225 -0
  187. package/src/services/cache/memory-cache-store.ts +130 -0
  188. package/src/services/cache/page-cache-service.test.ts +175 -0
  189. package/src/services/cache/page-cache-service.ts +202 -0
  190. package/src/services/cache/page-request-cache-coordinator.service.test.ts +79 -0
  191. package/src/services/cache/page-request-cache-coordinator.service.ts +131 -0
  192. package/src/services/html/html-rewriter-provider.service.test.ts +183 -0
  193. package/src/services/html/html-rewriter-provider.service.ts +104 -0
  194. package/src/services/html/html-transformer.service.test.ts +479 -0
  195. package/src/services/html/html-transformer.service.ts +275 -0
  196. package/src/services/invalidation/development-invalidation.service.test.ts +87 -0
  197. package/src/services/invalidation/development-invalidation.service.ts +262 -0
  198. package/src/services/module-loading/app-module-loader.service.ts +9 -0
  199. package/src/services/module-loading/app-server-module-transpiler.service.test.ts +130 -0
  200. package/src/services/module-loading/app-server-module-transpiler.service.ts +143 -0
  201. package/src/services/module-loading/host-module-loader-registry.ts +15 -0
  202. package/src/services/module-loading/{module-loading-types.d.ts → module-loading-types.ts} +1 -0
  203. package/src/services/module-loading/node-bootstrap-plugin.test.ts +335 -0
  204. package/src/services/module-loading/node-bootstrap-plugin.ts +297 -0
  205. package/src/services/module-loading/page-module-import.service.test.ts +504 -0
  206. package/src/services/module-loading/page-module-import.service.ts +252 -0
  207. package/src/services/module-loading/server-module-transpiler.service.test.ts +243 -0
  208. package/src/services/module-loading/server-module-transpiler.service.ts +104 -0
  209. package/src/services/module-loading/source-module-support.ts +19 -0
  210. package/src/services/runtime-state/dev-graph.service.ts +217 -0
  211. package/src/services/runtime-state/entrypoint-dependency-graph.service.ts +136 -0
  212. package/src/services/runtime-state/runtime-specifier-registry.service.ts +96 -0
  213. package/src/services/runtime-state/server-invalidation-state.service.ts +68 -0
  214. package/src/services/validation/schema-validation-service.test.ts +223 -0
  215. package/src/services/validation/schema-validation-service.ts +204 -0
  216. package/src/services/validation/{standard-schema.types.d.ts → standard-schema.types.ts} +20 -17
  217. package/src/static-site-generator/static-site-generator.test.ts +316 -0
  218. package/src/static-site-generator/static-site-generator.ts +462 -0
  219. package/src/types/internal-types.ts +242 -0
  220. package/src/types/public-types.ts +1443 -0
  221. package/src/utils/deep-merge.test.ts +114 -0
  222. package/src/utils/deep-merge.ts +47 -0
  223. package/src/utils/hash.ts +5 -0
  224. package/src/utils/html-escaping.ts +9 -0
  225. package/src/utils/invariant.test.ts +22 -0
  226. package/src/utils/invariant.ts +15 -0
  227. package/src/utils/locals-utils.ts +37 -0
  228. package/src/utils/parse-cli-args.test.ts +69 -0
  229. package/src/utils/parse-cli-args.ts +105 -0
  230. package/src/utils/path-utils.module.ts +14 -0
  231. package/src/utils/path-utils.test.ts +15 -0
  232. package/src/utils/resolve-work-dir.ts +45 -0
  233. package/src/utils/runtime.ts +44 -0
  234. package/src/utils/server-utils.module.ts +67 -0
  235. package/src/utils/server-utils.test.ts +38 -0
  236. package/src/watchers/project-watcher.integration.test.ts +337 -0
  237. package/src/watchers/project-watcher.test-helpers.ts +41 -0
  238. package/src/watchers/project-watcher.test.ts +768 -0
  239. package/src/watchers/project-watcher.ts +357 -0
  240. package/CHANGELOG.md +0 -51
  241. package/src/adapters/abstract/application-adapter.d.ts +0 -194
  242. package/src/adapters/abstract/application-adapter.js +0 -121
  243. package/src/adapters/abstract/router-adapter.d.ts +0 -26
  244. package/src/adapters/abstract/router-adapter.js +0 -5
  245. package/src/adapters/abstract/server-adapter.d.ts +0 -69
  246. package/src/adapters/abstract/server-adapter.js +0 -15
  247. package/src/adapters/bun/client-bridge.d.ts +0 -34
  248. package/src/adapters/bun/client-bridge.js +0 -48
  249. package/src/adapters/bun/create-app.d.ts +0 -52
  250. package/src/adapters/bun/create-app.js +0 -116
  251. package/src/adapters/bun/hmr-manager.d.ts +0 -143
  252. package/src/adapters/bun/hmr-manager.js +0 -333
  253. package/src/adapters/bun/index.d.ts +0 -2
  254. package/src/adapters/bun/index.js +0 -8
  255. package/src/adapters/bun/server-adapter.d.ts +0 -155
  256. package/src/adapters/bun/server-adapter.js +0 -374
  257. package/src/adapters/bun/server-lifecycle.d.ts +0 -63
  258. package/src/adapters/bun/server-lifecycle.js +0 -92
  259. package/src/adapters/create-app.d.ts +0 -20
  260. package/src/adapters/create-app.js +0 -66
  261. package/src/adapters/index.d.ts +0 -2
  262. package/src/adapters/index.js +0 -8
  263. package/src/adapters/node/create-app.d.ts +0 -18
  264. package/src/adapters/node/create-app.js +0 -149
  265. package/src/adapters/node/node-client-bridge.d.ts +0 -26
  266. package/src/adapters/node/node-client-bridge.js +0 -66
  267. package/src/adapters/node/node-hmr-manager.d.ts +0 -133
  268. package/src/adapters/node/node-hmr-manager.js +0 -311
  269. package/src/adapters/node/server-adapter.d.ts +0 -161
  270. package/src/adapters/node/server-adapter.js +0 -359
  271. package/src/adapters/node/static-content-server.d.ts +0 -60
  272. package/src/adapters/node/static-content-server.js +0 -194
  273. package/src/adapters/shared/api-response.d.ts +0 -52
  274. package/src/adapters/shared/api-response.js +0 -96
  275. package/src/adapters/shared/application-adapter.d.ts +0 -18
  276. package/src/adapters/shared/application-adapter.js +0 -90
  277. package/src/adapters/shared/define-api-handler.d.ts +0 -25
  278. package/src/adapters/shared/define-api-handler.js +0 -15
  279. package/src/adapters/shared/explicit-static-route-matcher.d.ts +0 -38
  280. package/src/adapters/shared/explicit-static-route-matcher.js +0 -103
  281. package/src/adapters/shared/file-route-middleware-pipeline.d.ts +0 -65
  282. package/src/adapters/shared/file-route-middleware-pipeline.js +0 -99
  283. package/src/adapters/shared/fs-server-response-factory.d.ts +0 -19
  284. package/src/adapters/shared/fs-server-response-factory.js +0 -97
  285. package/src/adapters/shared/fs-server-response-matcher.d.ts +0 -67
  286. package/src/adapters/shared/fs-server-response-matcher.js +0 -147
  287. package/src/adapters/shared/hmr-entrypoint-registrar.d.ts +0 -55
  288. package/src/adapters/shared/hmr-entrypoint-registrar.js +0 -87
  289. package/src/adapters/shared/hmr-html-response.d.ts +0 -22
  290. package/src/adapters/shared/hmr-html-response.js +0 -32
  291. package/src/adapters/shared/render-context.d.ts +0 -15
  292. package/src/adapters/shared/render-context.js +0 -72
  293. package/src/adapters/shared/runtime-bootstrap.d.ts +0 -38
  294. package/src/adapters/shared/runtime-bootstrap.js +0 -43
  295. package/src/adapters/shared/server-adapter.d.ts +0 -97
  296. package/src/adapters/shared/server-adapter.js +0 -390
  297. package/src/adapters/shared/server-route-handler.d.ts +0 -89
  298. package/src/adapters/shared/server-route-handler.js +0 -111
  299. package/src/adapters/shared/server-static-builder.d.ts +0 -70
  300. package/src/adapters/shared/server-static-builder.js +0 -100
  301. package/src/build/build-adapter.d.ts +0 -239
  302. package/src/build/build-adapter.js +0 -642
  303. package/src/build/build-manifest.d.ts +0 -27
  304. package/src/build/build-manifest.js +0 -30
  305. package/src/build/build-types.d.ts +0 -57
  306. package/src/build/build-types.js +0 -0
  307. package/src/build/dev-build-coordinator.d.ts +0 -72
  308. package/src/build/dev-build-coordinator.js +0 -154
  309. package/src/build/esbuild-build-adapter.d.ts +0 -78
  310. package/src/build/esbuild-build-adapter.js +0 -505
  311. package/src/build/runtime-build-executor.d.ts +0 -14
  312. package/src/build/runtime-build-executor.js +0 -22
  313. package/src/build/runtime-specifier-alias-plugin.d.ts +0 -15
  314. package/src/build/runtime-specifier-alias-plugin.js +0 -35
  315. package/src/build/runtime-specifier-aliases.d.ts +0 -5
  316. package/src/build/runtime-specifier-aliases.js +0 -95
  317. package/src/config/config-builder.d.ts +0 -252
  318. package/src/config/config-builder.js +0 -603
  319. package/src/config/constants.js +0 -25
  320. package/src/dev/sc-server.d.ts +0 -30
  321. package/src/dev/sc-server.js +0 -111
  322. package/src/eco/eco.browser.d.ts +0 -2
  323. package/src/eco/eco.browser.js +0 -83
  324. package/src/eco/eco.d.ts +0 -9
  325. package/src/eco/eco.js +0 -85
  326. package/src/eco/eco.types.d.ts +0 -178
  327. package/src/eco/eco.types.js +0 -0
  328. package/src/eco/eco.utils.d.ts +0 -1
  329. package/src/eco/eco.utils.js +0 -10
  330. package/src/eco/global-injector-map.d.ts +0 -16
  331. package/src/eco/global-injector-map.js +0 -80
  332. package/src/eco/lazy-injector-map.d.ts +0 -8
  333. package/src/eco/lazy-injector-map.js +0 -70
  334. package/src/eco/module-dependencies.d.ts +0 -18
  335. package/src/eco/module-dependencies.js +0 -49
  336. package/src/errors/http-error.d.ts +0 -31
  337. package/src/errors/http-error.js +0 -50
  338. package/src/errors/index.js +0 -4
  339. package/src/errors/locals-access-error.d.ts +0 -4
  340. package/src/errors/locals-access-error.js +0 -9
  341. package/src/global/app-logger.d.ts +0 -2
  342. package/src/global/app-logger.js +0 -6
  343. package/src/hmr/client/hmr-runtime.d.ts +0 -5
  344. package/src/hmr/client/hmr-runtime.js +0 -109
  345. package/src/hmr/hmr-strategy.d.ts +0 -162
  346. package/src/hmr/hmr-strategy.js +0 -44
  347. package/src/hmr/hmr.postcss.test.e2e.d.ts +0 -1
  348. package/src/hmr/hmr.postcss.test.e2e.js +0 -31
  349. package/src/hmr/hmr.test.e2e.d.ts +0 -1
  350. package/src/hmr/hmr.test.e2e.js +0 -43
  351. package/src/hmr/strategies/default-hmr-strategy.d.ts +0 -43
  352. package/src/hmr/strategies/default-hmr-strategy.js +0 -34
  353. package/src/hmr/strategies/js-hmr-strategy.d.ts +0 -139
  354. package/src/hmr/strategies/js-hmr-strategy.js +0 -178
  355. package/src/index.browser.d.ts +0 -3
  356. package/src/index.browser.js +0 -4
  357. package/src/index.d.ts +0 -6
  358. package/src/index.js +0 -21
  359. package/src/integrations/ghtml/ghtml-renderer.d.ts +0 -20
  360. package/src/integrations/ghtml/ghtml-renderer.js +0 -63
  361. package/src/integrations/ghtml/ghtml.constants.d.ts +0 -1
  362. package/src/integrations/ghtml/ghtml.constants.js +0 -4
  363. package/src/integrations/ghtml/ghtml.plugin.d.ts +0 -16
  364. package/src/integrations/ghtml/ghtml.plugin.js +0 -20
  365. package/src/plugins/alias-resolver-plugin.d.ts +0 -2
  366. package/src/plugins/alias-resolver-plugin.js +0 -53
  367. package/src/plugins/eco-component-meta-plugin.d.ts +0 -108
  368. package/src/plugins/eco-component-meta-plugin.js +0 -163
  369. package/src/plugins/foreign-jsx-override-plugin.d.ts +0 -31
  370. package/src/plugins/foreign-jsx-override-plugin.js +0 -35
  371. package/src/plugins/integration-plugin.d.ts +0 -219
  372. package/src/plugins/integration-plugin.js +0 -196
  373. package/src/plugins/processor.d.ts +0 -95
  374. package/src/plugins/processor.js +0 -136
  375. package/src/plugins/runtime-capability.js +0 -0
  376. package/src/plugins/source-transform.d.ts +0 -46
  377. package/src/plugins/source-transform.js +0 -71
  378. package/src/route-renderer/orchestration/boundary-planning.service.d.ts +0 -25
  379. package/src/route-renderer/orchestration/boundary-planning.service.js +0 -97
  380. package/src/route-renderer/orchestration/component-render-context.d.ts +0 -83
  381. package/src/route-renderer/orchestration/component-render-context.js +0 -147
  382. package/src/route-renderer/orchestration/integration-renderer.d.ts +0 -554
  383. package/src/route-renderer/orchestration/integration-renderer.js +0 -957
  384. package/src/route-renderer/orchestration/queued-boundary-runtime.service.d.ts +0 -89
  385. package/src/route-renderer/orchestration/queued-boundary-runtime.service.js +0 -155
  386. package/src/route-renderer/orchestration/render-execution.service.d.ts +0 -43
  387. package/src/route-renderer/orchestration/render-execution.service.js +0 -106
  388. package/src/route-renderer/orchestration/render-output.utils.d.ts +0 -46
  389. package/src/route-renderer/orchestration/render-output.utils.js +0 -65
  390. package/src/route-renderer/orchestration/render-preparation.service.d.ts +0 -120
  391. package/src/route-renderer/orchestration/render-preparation.service.js +0 -341
  392. package/src/route-renderer/orchestration/route-shell-composer.service.d.ts +0 -50
  393. package/src/route-renderer/orchestration/route-shell-composer.service.js +0 -81
  394. package/src/route-renderer/orchestration/template-serialization.d.ts +0 -38
  395. package/src/route-renderer/orchestration/template-serialization.js +0 -45
  396. package/src/route-renderer/page-loading/dependency-resolver.d.ts +0 -35
  397. package/src/route-renderer/page-loading/dependency-resolver.js +0 -444
  398. package/src/route-renderer/page-loading/page-module-loader.d.ts +0 -90
  399. package/src/route-renderer/page-loading/page-module-loader.js +0 -127
  400. package/src/route-renderer/route-renderer.d.ts +0 -67
  401. package/src/route-renderer/route-renderer.js +0 -103
  402. package/src/router/client/link-intent.js +0 -34
  403. package/src/router/client/link-intent.test.browser.d.ts +0 -1
  404. package/src/router/client/link-intent.test.browser.js +0 -43
  405. package/src/router/client/navigation-coordinator.d.ts +0 -149
  406. package/src/router/client/navigation-coordinator.js +0 -215
  407. package/src/router/server/fs-router-scanner.d.ts +0 -41
  408. package/src/router/server/fs-router-scanner.js +0 -161
  409. package/src/router/server/fs-router.d.ts +0 -26
  410. package/src/router/server/fs-router.js +0 -100
  411. package/src/services/assets/asset-processing-service/asset-processing.service.d.ts +0 -120
  412. package/src/services/assets/asset-processing-service/asset-processing.service.js +0 -331
  413. package/src/services/assets/asset-processing-service/asset.factory.d.ts +0 -17
  414. package/src/services/assets/asset-processing-service/asset.factory.js +0 -82
  415. package/src/services/assets/asset-processing-service/assets.types.d.ts +0 -89
  416. package/src/services/assets/asset-processing-service/assets.types.js +0 -0
  417. package/src/services/assets/asset-processing-service/browser-runtime-asset.factory.d.ts +0 -55
  418. package/src/services/assets/asset-processing-service/browser-runtime-asset.factory.js +0 -48
  419. package/src/services/assets/asset-processing-service/browser-runtime-entry.factory.d.ts +0 -20
  420. package/src/services/assets/asset-processing-service/browser-runtime-entry.factory.js +0 -41
  421. package/src/services/assets/asset-processing-service/index.d.ts +0 -5
  422. package/src/services/assets/asset-processing-service/index.js +0 -5
  423. package/src/services/assets/asset-processing-service/processor.interface.js +0 -6
  424. package/src/services/assets/asset-processing-service/processor.registry.d.ts +0 -8
  425. package/src/services/assets/asset-processing-service/processor.registry.js +0 -15
  426. package/src/services/assets/asset-processing-service/processors/base/base-processor.d.ts +0 -24
  427. package/src/services/assets/asset-processing-service/processors/base/base-processor.js +0 -64
  428. package/src/services/assets/asset-processing-service/processors/base/base-script-processor.d.ts +0 -17
  429. package/src/services/assets/asset-processing-service/processors/base/base-script-processor.js +0 -72
  430. package/src/services/assets/asset-processing-service/processors/index.d.ts +0 -5
  431. package/src/services/assets/asset-processing-service/processors/index.js +0 -5
  432. package/src/services/assets/asset-processing-service/processors/script/content-script.processor.d.ts +0 -5
  433. package/src/services/assets/asset-processing-service/processors/script/content-script.processor.js +0 -57
  434. package/src/services/assets/asset-processing-service/processors/script/file-script.processor.d.ts +0 -9
  435. package/src/services/assets/asset-processing-service/processors/script/file-script.processor.js +0 -88
  436. package/src/services/assets/asset-processing-service/processors/script/node-module-script.processor.d.ts +0 -7
  437. package/src/services/assets/asset-processing-service/processors/script/node-module-script.processor.js +0 -75
  438. package/src/services/assets/asset-processing-service/processors/stylesheet/content-stylesheet.processor.d.ts +0 -5
  439. package/src/services/assets/asset-processing-service/processors/stylesheet/content-stylesheet.processor.js +0 -25
  440. package/src/services/assets/asset-processing-service/processors/stylesheet/file-stylesheet.processor.d.ts +0 -9
  441. package/src/services/assets/asset-processing-service/processors/stylesheet/file-stylesheet.processor.js +0 -66
  442. package/src/services/assets/browser-bundle.service.d.ts +0 -32
  443. package/src/services/assets/browser-bundle.service.js +0 -33
  444. package/src/services/cache/cache.types.d.ts +0 -107
  445. package/src/services/cache/cache.types.js +0 -0
  446. package/src/services/cache/index.d.ts +0 -7
  447. package/src/services/cache/index.js +0 -7
  448. package/src/services/cache/memory-cache-store.d.ts +0 -42
  449. package/src/services/cache/memory-cache-store.js +0 -98
  450. package/src/services/cache/page-cache-service.d.ts +0 -70
  451. package/src/services/cache/page-cache-service.js +0 -152
  452. package/src/services/cache/page-request-cache-coordinator.service.d.ts +0 -75
  453. package/src/services/cache/page-request-cache-coordinator.service.js +0 -109
  454. package/src/services/html/html-rewriter-provider.service.d.ts +0 -37
  455. package/src/services/html/html-rewriter-provider.service.js +0 -68
  456. package/src/services/html/html-transformer.service.d.ts +0 -77
  457. package/src/services/html/html-transformer.service.js +0 -215
  458. package/src/services/invalidation/development-invalidation.service.d.ts +0 -74
  459. package/src/services/invalidation/development-invalidation.service.js +0 -190
  460. package/src/services/module-loading/app-module-loader.service.d.ts +0 -28
  461. package/src/services/module-loading/app-module-loader.service.js +0 -35
  462. package/src/services/module-loading/app-server-module-transpiler.service.d.ts +0 -24
  463. package/src/services/module-loading/app-server-module-transpiler.service.js +0 -109
  464. package/src/services/module-loading/host-module-loader-registry.d.ts +0 -4
  465. package/src/services/module-loading/host-module-loader-registry.js +0 -15
  466. package/src/services/module-loading/module-loading-types.js +0 -0
  467. package/src/services/module-loading/node-bootstrap-plugin.d.ts +0 -42
  468. package/src/services/module-loading/node-bootstrap-plugin.js +0 -204
  469. package/src/services/module-loading/page-module-import.service.d.ts +0 -76
  470. package/src/services/module-loading/page-module-import.service.js +0 -173
  471. package/src/services/module-loading/server-module-transpiler.service.d.ts +0 -72
  472. package/src/services/module-loading/server-module-transpiler.service.js +0 -64
  473. package/src/services/runtime-state/dev-graph.service.d.ts +0 -118
  474. package/src/services/runtime-state/dev-graph.service.js +0 -162
  475. package/src/services/runtime-state/entrypoint-dependency-graph.service.d.ts +0 -41
  476. package/src/services/runtime-state/entrypoint-dependency-graph.service.js +0 -85
  477. package/src/services/runtime-state/runtime-specifier-registry.service.d.ts +0 -69
  478. package/src/services/runtime-state/runtime-specifier-registry.service.js +0 -37
  479. package/src/services/runtime-state/server-invalidation-state.service.d.ts +0 -26
  480. package/src/services/runtime-state/server-invalidation-state.service.js +0 -35
  481. package/src/services/validation/schema-validation-service.d.ts +0 -122
  482. package/src/services/validation/schema-validation-service.js +0 -101
  483. package/src/services/validation/standard-schema.types.js +0 -0
  484. package/src/static-site-generator/static-site-generator.d.ts +0 -104
  485. package/src/static-site-generator/static-site-generator.js +0 -338
  486. package/src/types/internal-types.d.ts +0 -231
  487. package/src/types/internal-types.js +0 -0
  488. package/src/types/public-types.d.ts +0 -1219
  489. package/src/types/public-types.js +0 -0
  490. package/src/utils/deep-merge.d.ts +0 -14
  491. package/src/utils/deep-merge.js +0 -32
  492. package/src/utils/hash.d.ts +0 -1
  493. package/src/utils/hash.js +0 -7
  494. package/src/utils/html-escaping.d.ts +0 -7
  495. package/src/utils/html-escaping.js +0 -6
  496. package/src/utils/html.js +0 -4
  497. package/src/utils/invariant.d.ts +0 -5
  498. package/src/utils/invariant.js +0 -11
  499. package/src/utils/locals-utils.d.ts +0 -15
  500. package/src/utils/locals-utils.js +0 -24
  501. package/src/utils/parse-cli-args.d.ts +0 -27
  502. package/src/utils/parse-cli-args.js +0 -62
  503. package/src/utils/path-utils.module.d.ts +0 -5
  504. package/src/utils/path-utils.module.js +0 -14
  505. package/src/utils/resolve-work-dir.d.ts +0 -11
  506. package/src/utils/resolve-work-dir.js +0 -31
  507. package/src/utils/runtime.d.ts +0 -11
  508. package/src/utils/runtime.js +0 -40
  509. package/src/utils/server-utils.module.d.ts +0 -19
  510. package/src/utils/server-utils.module.js +0 -56
  511. package/src/watchers/project-watcher.d.ts +0 -136
  512. package/src/watchers/project-watcher.js +0 -275
  513. package/src/watchers/project-watcher.test-helpers.d.ts +0 -4
  514. package/src/watchers/project-watcher.test-helpers.js +0 -52
  515. /package/src/utils/{html.d.ts → html.ts} +0 -0
@@ -0,0 +1,180 @@
1
+ /**
2
+ * This file contains the implementation of the Bun application adapter for EcoPages.
3
+ * It extends the AbstractApplicationAdapter class and provides methods for handling
4
+ * HTTP requests, initializing the server adapter, and starting the Bun application server.
5
+ * The adapter is designed to work with the Bun runtime and provides a way to create
6
+ * EcoPages applications using Bun's features.
7
+ *
8
+ * @module EcopagesApp
9
+ */
10
+
11
+ import type { Server } from 'bun';
12
+ import { DEFAULT_ECOPAGES_HOSTNAME, DEFAULT_ECOPAGES_PORT } from '../../config/constants.ts';
13
+ import { appLogger } from '../../global/app-logger.ts';
14
+ import { getBunRuntime } from '../../utils/runtime.ts';
15
+ import type { ApiHandlerContext, RouteGroupBuilder } from '../../types/public-types.ts';
16
+ import { SharedApplicationAdapter } from '../shared/application-adapter.ts';
17
+ import type { EcopagesAppOptions } from '../create-app.ts';
18
+ import { type BunServerAdapterResult, createBunServerAdapter } from './server-adapter.ts';
19
+
20
+ /**
21
+ * Bun-specific route group builder that properly infers route params from path patterns.
22
+ * When you define a route like `/posts/:slug`, the handler context will have
23
+ * `ctx.params.slug` typed as `string`.
24
+ *
25
+ * @typeParam WebSocketData - WebSocket data type for the server
26
+ * @typeParam TContext - Extended context type from middleware (e.g., `{ user: User }`)
27
+ */
28
+ export type BunRouteGroupBuilder<
29
+ WebSocketData = undefined,
30
+ TContext extends ApiHandlerContext<Request, Server<WebSocketData>> = ApiHandlerContext<
31
+ Request,
32
+ Server<WebSocketData>
33
+ >,
34
+ > = RouteGroupBuilder<Request, Server<WebSocketData>, TContext>;
35
+
36
+ /**
37
+ * Bun-specific application adapter implementation
38
+ * This class extends the {@link AbstractApplicationAdapter}
39
+ * and provides methods for handling HTTP requests and managing the server.
40
+ */
41
+
42
+ export class BunEcopagesApp<WebSocketData = undefined> extends SharedApplicationAdapter<
43
+ EcopagesAppOptions,
44
+ Server<WebSocketData>,
45
+ Request
46
+ > {
47
+ serverAdapter: BunServerAdapterResult | undefined;
48
+ private server: Server<WebSocketData> | null = null;
49
+
50
+ public async fetch(request: Request): Promise<Response> {
51
+ if (!this.serverAdapter) {
52
+ this.serverAdapter = await this.initializeServerAdapter();
53
+ }
54
+
55
+ await this.serverAdapter.completeInitialization(this.server);
56
+ return this.serverAdapter.handleRequest(request);
57
+ }
58
+
59
+ /**
60
+ * Complete the initialization of the server adapter by processing dynamic routes
61
+ * @param server The Bun server instance
62
+ */
63
+ public async completeInitialization(server: Server<WebSocketData>): Promise<void> {
64
+ if (!this.serverAdapter) {
65
+ throw new Error('Server adapter not initialized. Call start() first.');
66
+ }
67
+
68
+ await this.serverAdapter.completeInitialization(server);
69
+ }
70
+
71
+ /**
72
+ * Initialize the Bun server adapter
73
+ */
74
+ protected async initializeServerAdapter(): Promise<BunServerAdapterResult> {
75
+ const { dev } = this.cliArgs;
76
+ const { port: cliPort, hostname: cliHostname } = this.cliArgs;
77
+
78
+ const envPort = process.env.ECOPAGES_PORT ? process.env.ECOPAGES_PORT : undefined;
79
+ const envHostname = process.env.ECOPAGES_HOSTNAME;
80
+
81
+ const preferredPort = cliPort ?? envPort ?? DEFAULT_ECOPAGES_PORT;
82
+ const preferredHostname = cliHostname ?? envHostname ?? DEFAULT_ECOPAGES_HOSTNAME;
83
+
84
+ appLogger.debug('initializeServerAdapter', {
85
+ dev,
86
+ cliPort,
87
+ cliHostname,
88
+ envPort,
89
+ envHostname,
90
+ preferredPort,
91
+ preferredHostname,
92
+ composedUrl: `http://${preferredHostname}:${preferredPort}`,
93
+ });
94
+
95
+ return await createBunServerAdapter({
96
+ runtimeOrigin: `http://${preferredHostname}:${preferredPort}`,
97
+ appConfig: this.appConfig,
98
+ apiHandlers: this.apiHandlers,
99
+ staticRoutes: this.staticRoutes,
100
+ errorHandler: this.errorHandler,
101
+ options: { watch: dev },
102
+ serveOptions: {
103
+ port: preferredPort,
104
+ hostname: preferredHostname,
105
+ ...this.serverOptions,
106
+ },
107
+ });
108
+ }
109
+
110
+ /**
111
+ * Start the Bun application server
112
+ * @param options Optional settings
113
+ * @param options.autoCompleteInitialization Whether to automatically complete initialization with dynamic routes after server start (defaults to true)
114
+ */
115
+ public async start(): Promise<Server<WebSocketData> | void> {
116
+ if (!this.serverAdapter) {
117
+ this.serverAdapter = await this.initializeServerAdapter();
118
+ }
119
+
120
+ const { dev, preview, build } = this.cliArgs;
121
+ const requiresFetchRuntime = this.appConfig.integrations.some(
122
+ (integration) => integration.staticBuildStep === 'fetch',
123
+ );
124
+ const canBuildWithoutRuntimeServer = (build || preview) && !requiresFetchRuntime;
125
+
126
+ if (canBuildWithoutRuntimeServer) {
127
+ appLogger.debugTime('Building static pages');
128
+ await this.serverAdapter.buildStatic({ preview });
129
+ appLogger.debugTimeEnd('Building static pages');
130
+
131
+ if (build) {
132
+ process.exit(0);
133
+ }
134
+
135
+ return;
136
+ }
137
+
138
+ const enableHmr = dev || (!preview && !build);
139
+ const serverOptions = this.serverAdapter.getServerOptions({ enableHmr });
140
+
141
+ const bun = getBunRuntime();
142
+ if (!bun) {
143
+ throw new Error('Bun runtime is required for the Bun adapter');
144
+ }
145
+
146
+ const bunServer = bun.serve(serverOptions as Bun.Serve.Options<WebSocketData>);
147
+ this.server = bunServer as Server<WebSocketData>;
148
+
149
+ await this.serverAdapter.completeInitialization(this.server).catch((error: Error) => {
150
+ appLogger.error(`Failed to complete initialization: ${error}`);
151
+ });
152
+
153
+ if (!this.server) {
154
+ throw new Error('Server failed to start');
155
+ }
156
+ appLogger.info(`Server running at http://${this.server.hostname}:${this.server.port}`);
157
+
158
+ if (build || preview) {
159
+ appLogger.debugTime('Building static pages');
160
+ await this.serverAdapter.buildStatic({ preview });
161
+ this.server.stop(true);
162
+ appLogger.debugTimeEnd('Building static pages');
163
+
164
+ if (build) {
165
+ process.exit(0);
166
+ }
167
+ }
168
+
169
+ return this.server;
170
+ }
171
+ }
172
+
173
+ /**
174
+ * Factory function to create a Bun application
175
+ */
176
+ export async function createApp<WebSocketData = undefined>(
177
+ options: EcopagesAppOptions,
178
+ ): Promise<BunEcopagesApp<WebSocketData>> {
179
+ return new BunEcopagesApp(options);
180
+ }
@@ -0,0 +1,267 @@
1
+ import assert from 'node:assert/strict';
2
+ import fs from 'node:fs';
3
+ import os from 'node:os';
4
+ import path from 'node:path';
5
+ import { afterEach, test, vi } from 'vitest';
6
+ import { ConfigBuilder } from '../../config/config-builder.ts';
7
+ import { resolveInternalExecutionDir, resolveInternalWorkDir } from '../../utils/resolve-work-dir.ts';
8
+ import { HmrManager } from './hmr-manager.ts';
9
+
10
+ const tempRoots: string[] = [];
11
+
12
+ function createTempRoot(prefix: string): string {
13
+ const root = fs.mkdtempSync(path.join(os.tmpdir(), `${prefix}-`));
14
+ tempRoots.push(root);
15
+ return root;
16
+ }
17
+
18
+ afterEach(() => {
19
+ for (const root of tempRoots.splice(0)) {
20
+ fs.rmSync(root, { recursive: true, force: true });
21
+ }
22
+ vi.restoreAllMocks();
23
+ });
24
+
25
+ test('HmrManager shares one in-flight entrypoint registration across concurrent callers', async () => {
26
+ const rootDir = createTempRoot('ecopages-bun-hmr-register');
27
+ const srcDir = path.join(rootDir, 'src');
28
+ const pagesDir = path.join(srcDir, 'pages');
29
+ fs.mkdirSync(pagesDir, { recursive: true });
30
+
31
+ const entrypointPath = path.join(pagesDir, 'react-lab.tsx');
32
+ fs.writeFileSync(entrypointPath, 'export default function Page() { return null; }', 'utf8');
33
+
34
+ const config = await new ConfigBuilder().setRootDir(rootDir).build();
35
+ const manager = new HmrManager({
36
+ appConfig: config,
37
+ bridge: {
38
+ subscriberCount: 0,
39
+ broadcast: () => {},
40
+ subscribe: () => {},
41
+ unsubscribe: () => {},
42
+ } as any,
43
+ });
44
+
45
+ const relativePathJs = path
46
+ .relative(config.absolutePaths.srcDir, entrypointPath)
47
+ .replace(/\.(tsx?|jsx?|mdx?)$/, '.js');
48
+ const encodedPathJs = relativePathJs.replace(/\[([^\]]+)\]/g, '_$1_');
49
+ const outputPath = path.join(resolveInternalWorkDir(config), 'assets', '_hmr', encodedPathJs);
50
+
51
+ const handleFileChange = vi.spyOn(manager, 'handleFileChange').mockImplementation(async () => {
52
+ await new Promise((resolve) => setTimeout(resolve, 25));
53
+ fs.mkdirSync(path.dirname(outputPath), { recursive: true });
54
+ fs.writeFileSync(outputPath, 'export default 1;', 'utf8');
55
+ });
56
+
57
+ const [firstUrl, secondUrl] = await Promise.all([
58
+ manager.registerEntrypoint(entrypointPath),
59
+ manager.registerEntrypoint(entrypointPath),
60
+ ]);
61
+
62
+ assert.equal(firstUrl, '/assets/_hmr/pages/react-lab.js');
63
+ assert.equal(secondUrl, '/assets/_hmr/pages/react-lab.js');
64
+ assert.equal(handleFileChange.mock.calls.length, 1);
65
+ assert.equal(fs.existsSync(outputPath), true);
66
+
67
+ manager.stop();
68
+ });
69
+
70
+ test('HmrManager clears timed-out entrypoint registrations so later requests can retry', async () => {
71
+ const rootDir = createTempRoot('ecopages-bun-hmr-timeout-register');
72
+ const srcDir = path.join(rootDir, 'src');
73
+ const pagesDir = path.join(srcDir, 'pages');
74
+ fs.mkdirSync(pagesDir, { recursive: true });
75
+
76
+ const entrypointPath = path.join(pagesDir, 'stuck-page.tsx');
77
+ fs.writeFileSync(entrypointPath, 'export default function Page() { return null; }', 'utf8');
78
+
79
+ const config = await new ConfigBuilder().setRootDir(rootDir).build();
80
+ const manager = new HmrManager({
81
+ appConfig: config,
82
+ bridge: {
83
+ subscriberCount: 0,
84
+ broadcast: () => {},
85
+ subscribe: () => {},
86
+ unsubscribe: () => {},
87
+ } as any,
88
+ });
89
+
90
+ const previousNodeEnv = process.env.NODE_ENV;
91
+ process.env.NODE_ENV = 'development';
92
+
93
+ const handleFileChange = vi.spyOn(manager, 'handleFileChange').mockImplementation(async () => {
94
+ await new Promise(() => undefined);
95
+ });
96
+
97
+ try {
98
+ await assert.rejects(() => manager.registerEntrypoint(entrypointPath), /Timed out registering entrypoint/);
99
+
100
+ const registrations = (manager as unknown as { entrypointRegistrations: Map<string, Promise<string>> })
101
+ .entrypointRegistrations;
102
+ const watchedFiles = manager.getWatchedFiles();
103
+ assert.equal(registrations.size, 0);
104
+ assert.equal(watchedFiles.has(entrypointPath), false);
105
+
106
+ handleFileChange.mockImplementationOnce(async () => {
107
+ const relativePathJs = path
108
+ .relative(config.absolutePaths.srcDir, entrypointPath)
109
+ .replace(/\.(tsx?|jsx?|mdx?)$/, '.js');
110
+ const encodedPathJs = relativePathJs.replace(/\[([^\]]+)\]/g, '_$1_');
111
+ const outputPath = path.join(resolveInternalWorkDir(config), 'assets', '_hmr', encodedPathJs);
112
+ fs.mkdirSync(path.dirname(outputPath), { recursive: true });
113
+ fs.writeFileSync(outputPath, 'export default 2;', 'utf8');
114
+ });
115
+
116
+ const retriedUrl = await manager.registerEntrypoint(entrypointPath);
117
+ assert.equal(retriedUrl, '/assets/_hmr/pages/stuck-page.js');
118
+ assert.equal(watchedFiles.get(entrypointPath), retriedUrl);
119
+ } finally {
120
+ process.env.NODE_ENV = previousNodeEnv;
121
+ manager.stop();
122
+ }
123
+ });
124
+
125
+ test('HmrManager fails strict entrypoint registration when the owning integration emits no output', async () => {
126
+ const rootDir = createTempRoot('ecopages-bun-hmr-strict-fail');
127
+ const srcDir = path.join(rootDir, 'src');
128
+ const pagesDir = path.join(srcDir, 'pages');
129
+ fs.mkdirSync(pagesDir, { recursive: true });
130
+
131
+ const entrypointPath = path.join(pagesDir, 'react-content.mdx');
132
+ fs.writeFileSync(entrypointPath, '# Hello', 'utf8');
133
+
134
+ const config = await new ConfigBuilder().setRootDir(rootDir).build();
135
+ const manager = new HmrManager({
136
+ appConfig: config,
137
+ bridge: {
138
+ subscriberCount: 0,
139
+ broadcast: () => {},
140
+ subscribe: () => {},
141
+ unsubscribe: () => {},
142
+ } as any,
143
+ });
144
+
145
+ vi.spyOn(manager, 'handleFileChange').mockImplementation(async () => {});
146
+
147
+ await assert.rejects(() => manager.registerEntrypoint(entrypointPath), /Integration failed to emit entrypoint/);
148
+ assert.equal(manager.getWatchedFiles().has(path.resolve(entrypointPath)), false);
149
+
150
+ manager.stop();
151
+ });
152
+
153
+ test('HmrManager uses the generic build path for script entrypoints when no strategy emits output', async () => {
154
+ const rootDir = createTempRoot('ecopages-bun-hmr-script-fallback');
155
+ const srcDir = path.join(rootDir, 'src');
156
+ fs.mkdirSync(srcDir, { recursive: true });
157
+
158
+ const entrypointPath = path.join(srcDir, 'script.ts');
159
+ fs.writeFileSync(entrypointPath, 'console.log("hello");', 'utf8');
160
+
161
+ const config = await new ConfigBuilder().setRootDir(rootDir).build();
162
+ const manager = new HmrManager({
163
+ appConfig: config,
164
+ bridge: {
165
+ subscriberCount: 0,
166
+ broadcast: () => {},
167
+ subscribe: () => {},
168
+ unsubscribe: () => {},
169
+ } as any,
170
+ });
171
+
172
+ const outputPath = path.join(resolveInternalWorkDir(config), 'assets', '_hmr', 'script.js');
173
+ const buildCalls: string[] = [];
174
+ config.runtime!.buildExecutor = {
175
+ build: vi.fn(async (options) => {
176
+ buildCalls.push(options.entrypoints[0] as string);
177
+ fs.mkdirSync(path.dirname(outputPath), { recursive: true });
178
+ fs.writeFileSync(outputPath, 'fresh-output', 'utf8');
179
+
180
+ return {
181
+ success: true,
182
+ logs: [],
183
+ outputs: [{ path: outputPath }],
184
+ };
185
+ }),
186
+ };
187
+
188
+ vi.spyOn(manager, 'handleFileChange').mockImplementation(async () => {});
189
+
190
+ const outputUrl = await manager.registerScriptEntrypoint(entrypointPath);
191
+
192
+ assert.equal(outputUrl, '/assets/_hmr/script.js');
193
+ assert.deepEqual(buildCalls, [entrypointPath]);
194
+ assert.equal(fs.readFileSync(outputPath, 'utf8'), 'fresh-output');
195
+
196
+ manager.stop();
197
+ });
198
+
199
+ test('HmrManager stop clears retained registration state', async () => {
200
+ const rootDir = createTempRoot('ecopages-bun-hmr-stop-cleanup');
201
+ const srcDir = path.join(rootDir, 'src');
202
+ const pagesDir = path.join(srcDir, 'pages');
203
+ fs.mkdirSync(pagesDir, { recursive: true });
204
+
205
+ const entrypointPath = path.join(pagesDir, 'react-content.tsx');
206
+ fs.writeFileSync(entrypointPath, 'export default function Page() { return null; }', 'utf8');
207
+
208
+ const config = await new ConfigBuilder().setRootDir(rootDir).build();
209
+ const manager = new HmrManager({
210
+ appConfig: config,
211
+ bridge: {
212
+ subscriberCount: 0,
213
+ broadcast: () => {},
214
+ subscribe: () => {},
215
+ unsubscribe: () => {},
216
+ } as any,
217
+ });
218
+
219
+ const relativePathJs = path
220
+ .relative(config.absolutePaths.srcDir, entrypointPath)
221
+ .replace(/\.(tsx?|jsx?|mdx?)$/, '.js');
222
+ const encodedPathJs = relativePathJs.replace(/\[([^\]]+)\]/g, '_$1_');
223
+ const outputPath = path.join(resolveInternalWorkDir(config), 'assets', '_hmr', encodedPathJs);
224
+
225
+ vi.spyOn(manager, 'handleFileChange').mockImplementation(async () => {
226
+ fs.mkdirSync(path.dirname(outputPath), { recursive: true });
227
+ fs.writeFileSync(outputPath, 'export default 1;', 'utf8');
228
+ });
229
+
230
+ manager.registerSpecifierMap({ react: '/assets/vendors/react.js' });
231
+ await manager.registerEntrypoint(entrypointPath);
232
+
233
+ manager.stop();
234
+
235
+ assert.equal(manager.getWatchedFiles().size, 0);
236
+ assert.equal(manager.getSpecifierMap().size, 0);
237
+ });
238
+
239
+ test('HmrManager keeps internal browser and server-module outputs out of distDir', async () => {
240
+ const rootDir = createTempRoot('ecopages-bun-hmr-internal-paths');
241
+ const config = await new ConfigBuilder().setRootDir(rootDir).build();
242
+ const manager = new HmrManager({
243
+ appConfig: config,
244
+ bridge: {
245
+ subscriberCount: 0,
246
+ broadcast: () => {},
247
+ subscribe: () => {},
248
+ unsubscribe: () => {},
249
+ } as any,
250
+ });
251
+
252
+ assert.equal(manager.getDistDir(), path.join(resolveInternalWorkDir(config), 'assets', '_hmr'));
253
+
254
+ const importModule = vi.fn(async (_options: { outdir: string }) => ({}));
255
+ (manager as unknown as { serverModuleTranspiler: { importModule: typeof importModule } }).serverModuleTranspiler = {
256
+ importModule,
257
+ };
258
+
259
+ await manager.getDefaultContext().importServerModule(path.join(config.absolutePaths.srcDir, 'pages', 'index.tsx'));
260
+
261
+ assert.equal(
262
+ importModule.mock.calls[0]?.[0]?.outdir,
263
+ path.join(resolveInternalExecutionDir(config), '.server-modules'),
264
+ );
265
+
266
+ manager.stop();
267
+ });