@ecopages/core 0.2.0-alpha.52 → 0.2.0-alpha.54

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 (590) hide show
  1. package/README.md +2 -3
  2. package/package.json +97 -182
  3. package/src/adapters/abstract/application-adapter.test.ts +218 -0
  4. package/src/adapters/abstract/application-adapter.ts +379 -0
  5. package/src/adapters/abstract/router-adapter.ts +30 -0
  6. package/src/adapters/abstract/server-adapter.ts +79 -0
  7. package/src/adapters/bun/client-bridge.ts +62 -0
  8. package/src/adapters/bun/create-app.ts +214 -0
  9. package/src/adapters/bun/hmr-manager.test.ts +265 -0
  10. package/src/adapters/bun/hmr-manager.ts +88 -0
  11. package/src/adapters/bun/index.ts +2 -0
  12. package/src/adapters/bun/runtime-host.ts +76 -0
  13. package/src/adapters/bun/server-adapter.ts +605 -0
  14. package/src/adapters/bun/static-preview-host.ts +70 -0
  15. package/src/adapters/create-app.test.ts +10 -0
  16. package/src/adapters/create-app.ts +91 -0
  17. package/src/adapters/index.ts +2 -0
  18. package/src/adapters/node/create-app.test.ts +76 -0
  19. package/src/adapters/node/create-app.ts +116 -0
  20. package/src/adapters/node/http-request-bridge.test.ts +146 -0
  21. package/src/adapters/node/http-request-bridge.ts +176 -0
  22. package/src/adapters/node/node-client-bridge.test.ts +198 -0
  23. package/src/adapters/node/node-client-bridge.ts +79 -0
  24. package/src/adapters/node/node-hmr-manager.test.ts +374 -0
  25. package/src/adapters/node/node-hmr-manager.ts +72 -0
  26. package/src/adapters/node/runtime-host.test.ts +49 -0
  27. package/src/adapters/node/runtime-host.ts +113 -0
  28. package/src/adapters/node/server-adapter-dependencies.ts +28 -0
  29. package/src/adapters/node/server-adapter.test.ts +84 -0
  30. package/src/adapters/node/server-adapter.ts +423 -0
  31. package/src/adapters/node/static-content-server.test.ts +60 -0
  32. package/src/adapters/node/static-content-server.ts +239 -0
  33. package/src/adapters/node/static-preview-host.test.ts +89 -0
  34. package/src/adapters/node/static-preview-host.ts +101 -0
  35. package/src/adapters/shared/api-response.test.ts +97 -0
  36. package/src/adapters/shared/api-response.ts +104 -0
  37. package/src/adapters/shared/application-adapter.ts +199 -0
  38. package/src/adapters/shared/define-api-handler.ts +66 -0
  39. package/src/adapters/shared/explicit-static-render-preparation.ts +58 -0
  40. package/src/adapters/shared/explicit-static-route-matcher.test.ts +381 -0
  41. package/src/adapters/shared/explicit-static-route-matcher.ts +131 -0
  42. package/src/adapters/shared/file-route-middleware-pipeline.test.ts +85 -0
  43. package/src/adapters/shared/file-route-middleware-pipeline.ts +118 -0
  44. package/src/adapters/shared/fs-server-response-factory.test.ts +176 -0
  45. package/src/adapters/shared/fs-server-response-factory.ts +96 -0
  46. package/src/adapters/shared/fs-server-response-matcher.test.ts +311 -0
  47. package/src/adapters/shared/fs-server-response-matcher.ts +240 -0
  48. package/src/adapters/shared/hmr-entrypoint-registrar.ts +149 -0
  49. package/src/adapters/shared/hmr-html-response.ts +54 -0
  50. package/src/adapters/shared/hmr-manager.contract.test.ts +228 -0
  51. package/src/adapters/shared/hmr-manager.dispatch.test.ts +229 -0
  52. package/src/adapters/shared/render-context.test.ts +244 -0
  53. package/src/adapters/shared/render-context.ts +161 -0
  54. package/src/adapters/shared/runtime-app-bootstrap.test.ts +96 -0
  55. package/src/adapters/shared/runtime-app-bootstrap.ts +72 -0
  56. package/src/adapters/shared/runtime-host.ts +11 -0
  57. package/src/adapters/shared/server-adapter.test.ts +130 -0
  58. package/src/adapters/shared/server-adapter.ts +571 -0
  59. package/src/adapters/shared/server-route-handler.test.ts +112 -0
  60. package/src/adapters/shared/server-route-handler.ts +153 -0
  61. package/src/adapters/shared/server-static-builder.test.ts +338 -0
  62. package/src/adapters/shared/server-static-builder.ts +170 -0
  63. package/src/adapters/shared/shared-hmr-manager.ts +298 -0
  64. package/src/adapters/shared/static-preview-host.ts +12 -0
  65. package/src/build/README.md +57 -73
  66. package/src/build/browser-runtime-manifest.test.ts +121 -0
  67. package/src/build/browser-runtime-manifest.ts +105 -0
  68. package/src/build/browser-runtime-plugin-helpers.test.ts +49 -0
  69. package/src/build/browser-runtime-plugin-helpers.ts +37 -0
  70. package/src/build/browser-runtime-plugin.test.ts +256 -0
  71. package/src/build/browser-runtime-plugin.ts +306 -0
  72. package/src/build/build-adapter.test.ts +463 -0
  73. package/src/build/build-adapter.ts +788 -0
  74. package/src/build/build-manifest.ts +79 -0
  75. package/src/build/build-types.ts +83 -0
  76. package/src/build/rolldown-build-adapter.test.ts +352 -0
  77. package/src/build/rolldown-build-adapter.ts +363 -0
  78. package/src/build/rolldown-plugin-bridge.test.ts +256 -0
  79. package/src/build/rolldown-plugin-bridge.ts +309 -0
  80. package/src/build/runtime-build-executor.test.ts +130 -0
  81. package/src/build/runtime-build-executor.ts +37 -0
  82. package/src/build/runtime-build-output-normalizer.ts +137 -0
  83. package/src/build/serialized-build-executor.test.ts +96 -0
  84. package/src/build/serialized-build-executor.ts +90 -0
  85. package/src/build/server-side-css-shim-plugin.ts +77 -0
  86. package/src/cache/index.ts +6 -0
  87. package/src/cache/module-parse-cache.test.ts +73 -0
  88. package/src/cache/module-parse-cache.ts +137 -0
  89. package/src/config/README.md +1 -1
  90. package/src/config/config-builder.test.ts +456 -0
  91. package/src/config/config-builder.ts +728 -0
  92. package/src/config/config-builder.typecheck.test.ts +96 -0
  93. package/src/config/{constants.d.ts → constants.ts} +22 -13
  94. package/src/dev/host-runtime.ts +34 -0
  95. package/src/dev/sc-server.ts +143 -0
  96. package/src/eco/eco.browser.test.ts +43 -0
  97. package/src/eco/eco.browser.ts +137 -0
  98. package/src/eco/eco.test.ts +781 -0
  99. package/src/eco/eco.ts +262 -0
  100. package/src/eco/eco.types.ts +293 -0
  101. package/src/eco/eco.utils.test.ts +219 -0
  102. package/src/eco/eco.utils.ts +5 -0
  103. package/src/eco/global-injector-map.test.ts +42 -0
  104. package/src/eco/global-injector-map.ts +112 -0
  105. package/src/eco/lazy-injector-map.test.ts +66 -0
  106. package/src/eco/lazy-injector-map.ts +120 -0
  107. package/src/eco/module-dependencies.test.ts +30 -0
  108. package/src/eco/module-dependencies.ts +75 -0
  109. package/src/errors/http-error.test.ts +134 -0
  110. package/src/errors/http-error.ts +72 -0
  111. package/src/errors/index.ts +3 -0
  112. package/src/errors/locals-access-error.ts +7 -0
  113. package/src/global/app-logger.ts +4 -0
  114. package/src/global/utils.test.ts +12 -0
  115. 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
  116. package/src/hmr/client/__screenshots__/hmr-runtime.test.browser.ts/HMR-Runtime-HMR-Server-Integration-should-load-fixture-app-page-1.png +0 -0
  117. package/src/hmr/client/__screenshots__/hmr-runtime.test.browser.ts/HMR-Runtime-WebSocket-Connection-should-connect-to-correct-HMR-endpoint-1.png +0 -0
  118. package/src/hmr/client/hmr-runtime.ts +162 -0
  119. package/src/hmr/hmr-strategy.test.ts +124 -0
  120. package/src/hmr/hmr-strategy.ts +177 -0
  121. package/src/hmr/hmr.postcss.test.e2e.ts +41 -0
  122. package/src/hmr/hmr.test.e2e.ts +66 -0
  123. package/src/hmr/strategies/default-hmr-strategy.ts +60 -0
  124. package/src/hmr/strategies/js-hmr-strategy.test.ts +344 -0
  125. package/src/hmr/strategies/js-hmr-strategy.ts +307 -0
  126. package/src/index.browser.ts +3 -0
  127. package/src/index.ts +15 -0
  128. package/src/integrations/ghtml/ghtml-renderer.test.ts +253 -0
  129. package/src/integrations/ghtml/ghtml-renderer.ts +87 -0
  130. package/src/integrations/ghtml/ghtml.constants.ts +1 -0
  131. package/src/integrations/ghtml/ghtml.plugin.ts +28 -0
  132. package/src/plugins/alias-resolver-cache.test.ts +110 -0
  133. package/src/plugins/alias-resolver-cache.ts +145 -0
  134. package/src/plugins/alias-resolver-plugin.test.ts +41 -0
  135. package/src/plugins/alias-resolver-plugin.ts +75 -0
  136. package/src/plugins/eco-component-meta-plugin.test.ts +421 -0
  137. package/src/plugins/eco-component-meta-plugin.ts +518 -0
  138. package/src/plugins/foreign-jsx-override-plugin.test.ts +65 -0
  139. package/src/plugins/foreign-jsx-override-plugin.ts +76 -0
  140. package/src/plugins/integration-plugin.test.ts +151 -0
  141. package/src/plugins/integration-plugin.ts +344 -0
  142. package/src/plugins/processor.test.ts +148 -0
  143. package/src/plugins/processor.ts +257 -0
  144. package/src/plugins/{runtime-capability.d.ts → runtime-capability.ts} +8 -3
  145. package/src/plugins/source-transform.test.ts +82 -0
  146. package/src/plugins/source-transform.ts +123 -0
  147. package/src/route-renderer/orchestration/component-render-context.ts +338 -0
  148. package/src/route-renderer/orchestration/declared-ownership-graph.ts +62 -0
  149. package/src/route-renderer/orchestration/foreign-subtree-execution.service.ts +431 -0
  150. package/src/route-renderer/orchestration/integration-renderer.test.ts +2251 -0
  151. package/src/route-renderer/orchestration/integration-renderer.ts +1384 -0
  152. package/src/route-renderer/orchestration/ownership-planning.service.ts +97 -0
  153. package/src/route-renderer/orchestration/ownership-validation.service.ts +76 -0
  154. package/src/route-renderer/orchestration/processed-asset-dedupe.ts +29 -0
  155. package/src/route-renderer/orchestration/queued-foreign-subtree-resolution.service.test.ts +435 -0
  156. package/src/route-renderer/orchestration/queued-foreign-subtree-resolution.service.ts +310 -0
  157. package/src/route-renderer/orchestration/render-output.utils.ts +310 -0
  158. package/src/route-renderer/orchestration/route-render-orchestrator.prepare-render-options.test.ts +1365 -0
  159. package/src/route-renderer/orchestration/route-render-orchestrator.test.ts +267 -0
  160. package/src/route-renderer/orchestration/route-render-orchestrator.ts +879 -0
  161. package/src/route-renderer/orchestration/template-serialization.test.ts +110 -0
  162. package/src/route-renderer/orchestration/template-serialization.ts +117 -0
  163. package/src/route-renderer/page-loading/component-dependency-collection.ts +202 -0
  164. package/src/route-renderer/page-loading/declared-asset-collection.ts +153 -0
  165. package/src/route-renderer/page-loading/dependency-resolver.test.ts +761 -0
  166. package/src/route-renderer/page-loading/dependency-resolver.ts +144 -0
  167. package/src/route-renderer/page-loading/ecopages-virtual-imports.ts +75 -0
  168. package/src/route-renderer/page-loading/lazy-entry-collection.ts +167 -0
  169. package/src/route-renderer/page-loading/lazy-trigger-planning.ts +74 -0
  170. package/src/route-renderer/page-loading/module-declaration-aggregation.ts +60 -0
  171. package/src/route-renderer/page-loading/module-declaration-scripts.ts +16 -0
  172. package/src/route-renderer/page-loading/page-dependency-bundling.ts +244 -0
  173. package/src/route-renderer/page-loading/page-module-loader.test.ts +183 -0
  174. package/src/route-renderer/page-loading/page-module-loader.ts +184 -0
  175. package/src/route-renderer/route-renderer.ts +133 -0
  176. package/src/router/client/link-intent.test.browser.ts +51 -0
  177. package/src/router/client/link-intent.ts +92 -0
  178. package/src/router/client/navigation-coordinator.test.ts +237 -0
  179. package/src/router/client/navigation-coordinator.ts +453 -0
  180. package/src/router/server/route-registry.test.ts +176 -0
  181. package/src/router/server/route-registry.ts +382 -0
  182. package/src/services/assets/asset-processing-service/asset-dependency-keys.ts +66 -0
  183. package/src/services/assets/asset-processing-service/asset-processing.service.test.ts +473 -0
  184. package/src/services/assets/asset-processing-service/asset-processing.service.ts +344 -0
  185. package/src/services/assets/asset-processing-service/asset.factory.test.ts +63 -0
  186. package/src/services/assets/asset-processing-service/asset.factory.ts +105 -0
  187. package/src/services/assets/asset-processing-service/assets.types.ts +128 -0
  188. package/src/services/assets/asset-processing-service/browser-runtime-asset.factory.test.ts +74 -0
  189. package/src/services/assets/asset-processing-service/browser-runtime-asset.factory.ts +98 -0
  190. package/src/services/assets/asset-processing-service/browser-runtime-entry.factory.test.ts +67 -0
  191. package/src/services/assets/asset-processing-service/browser-runtime-entry.factory.ts +78 -0
  192. package/src/services/assets/asset-processing-service/grouped-content-bundles.ts +104 -0
  193. package/src/services/assets/asset-processing-service/index.ts +6 -0
  194. package/src/services/assets/asset-processing-service/page-package.test.ts +135 -0
  195. package/src/services/assets/asset-processing-service/page-package.ts +103 -0
  196. package/src/services/assets/asset-processing-service/{processor.interface.d.ts → processor.interface.ts} +10 -5
  197. package/src/services/assets/asset-processing-service/processor.registry.ts +18 -0
  198. package/src/services/assets/asset-processing-service/processors/base/base-processor.test.ts +59 -0
  199. package/src/services/assets/asset-processing-service/processors/base/base-processor.ts +83 -0
  200. package/src/services/assets/asset-processing-service/processors/base/base-script-processor.ts +173 -0
  201. package/src/services/assets/asset-processing-service/processors/index.ts +5 -0
  202. package/src/services/assets/asset-processing-service/processors/script/content-script.processor.test.ts +188 -0
  203. package/src/services/assets/asset-processing-service/processors/script/content-script.processor.ts +138 -0
  204. package/src/services/assets/asset-processing-service/processors/script/file-script.processor.test.ts +326 -0
  205. package/src/services/assets/asset-processing-service/processors/script/file-script.processor.ts +116 -0
  206. package/src/services/assets/asset-processing-service/processors/script/node-module-script.processor.test.ts +270 -0
  207. package/src/services/assets/asset-processing-service/processors/script/node-module-script.processor.ts +145 -0
  208. package/src/services/assets/asset-processing-service/processors/stylesheet/content-stylesheet.processor.test.ts +261 -0
  209. package/src/services/assets/asset-processing-service/processors/stylesheet/content-stylesheet.processor.ts +72 -0
  210. package/src/services/assets/asset-processing-service/processors/stylesheet/file-stylesheet.processor.ts +83 -0
  211. package/src/services/assets/asset-processing-service/ungrouped-dependency-processing.ts +65 -0
  212. package/src/services/assets/browser-bundle.service.test.ts +66 -0
  213. package/src/services/assets/browser-bundle.service.ts +109 -0
  214. package/src/services/cache/cache.types.ts +126 -0
  215. package/src/services/cache/index.ts +18 -0
  216. package/src/services/cache/memory-cache-store.test.ts +225 -0
  217. package/src/services/cache/memory-cache-store.ts +130 -0
  218. package/src/services/cache/page-cache-service.test.ts +175 -0
  219. package/src/services/cache/page-cache-service.ts +202 -0
  220. package/src/services/cache/page-request-cache-coordinator.service.test.ts +79 -0
  221. package/src/services/cache/page-request-cache-coordinator.service.ts +131 -0
  222. package/src/services/html/html-rewriter-provider.service.test.ts +183 -0
  223. package/src/services/html/html-rewriter-provider.service.ts +105 -0
  224. package/src/services/html/html-transformer.service.test.ts +544 -0
  225. package/src/services/html/html-transformer.service.ts +369 -0
  226. package/src/services/invalidation/development-invalidation.service.test.ts +87 -0
  227. package/src/services/invalidation/development-invalidation.service.ts +262 -0
  228. package/src/services/module-loading/app-module-loader.service.ts +9 -0
  229. package/src/services/module-loading/app-server-module-transpiler.service.test.ts +297 -0
  230. package/src/services/module-loading/app-server-module-transpiler.service.ts +168 -0
  231. package/src/services/module-loading/host-module-loader-registry.ts +15 -0
  232. package/src/services/module-loading/{module-loading-types.d.ts → module-loading-types.ts} +1 -0
  233. package/src/services/module-loading/page-module-import.service.test.ts +652 -0
  234. package/src/services/module-loading/page-module-import.service.ts +302 -0
  235. package/src/services/module-loading/server-module-transpiler.service.test.ts +242 -0
  236. package/src/services/module-loading/server-module-transpiler.service.ts +104 -0
  237. package/src/services/module-loading/source-module-support.ts +19 -0
  238. package/src/services/runtime-state/dev-graph.service.ts +217 -0
  239. package/src/services/runtime-state/entrypoint-dependency-graph.service.ts +136 -0
  240. package/src/services/runtime-state/server-invalidation-state.service.ts +68 -0
  241. package/src/services/validation/schema-validation-service.test.ts +223 -0
  242. package/src/services/validation/schema-validation-service.ts +204 -0
  243. package/src/services/validation/{standard-schema.types.d.ts → standard-schema.types.ts} +20 -17
  244. package/src/static-site-generator/static-site-generator.test.ts +408 -0
  245. package/src/static-site-generator/static-site-generator.ts +445 -0
  246. package/src/types/internal-types.ts +243 -0
  247. package/src/types/public-types.ts +1508 -0
  248. package/src/utils/deep-merge.test.ts +114 -0
  249. package/src/utils/deep-merge.ts +47 -0
  250. package/src/utils/hash.ts +5 -0
  251. package/src/utils/html-escaping.ts +9 -0
  252. package/src/utils/invariant.test.ts +22 -0
  253. package/src/utils/invariant.ts +15 -0
  254. package/src/utils/locals-utils.ts +37 -0
  255. package/src/utils/parse-cli-args.test.ts +69 -0
  256. package/src/utils/parse-cli-args.ts +105 -0
  257. package/src/utils/path-utils.module.ts +14 -0
  258. package/src/utils/path-utils.test.ts +15 -0
  259. package/src/utils/resolve-work-dir.ts +45 -0
  260. package/src/utils/runtime.ts +44 -0
  261. package/src/utils/server-utils.module.ts +67 -0
  262. package/src/utils/server-utils.test.ts +38 -0
  263. package/src/watchers/project-watcher.integration.test.ts +337 -0
  264. package/src/watchers/project-watcher.test-helpers.ts +42 -0
  265. package/src/watchers/project-watcher.test.ts +768 -0
  266. package/src/watchers/project-watcher.ts +357 -0
  267. package/src/adapters/abstract/application-adapter.d.ts +0 -194
  268. package/src/adapters/abstract/application-adapter.js +0 -121
  269. package/src/adapters/abstract/router-adapter.d.ts +0 -26
  270. package/src/adapters/abstract/router-adapter.js +0 -5
  271. package/src/adapters/abstract/server-adapter.d.ts +0 -69
  272. package/src/adapters/abstract/server-adapter.js +0 -15
  273. package/src/adapters/bun/client-bridge.d.ts +0 -34
  274. package/src/adapters/bun/client-bridge.js +0 -48
  275. package/src/adapters/bun/create-app.d.ts +0 -60
  276. package/src/adapters/bun/create-app.js +0 -140
  277. package/src/adapters/bun/hmr-manager.d.ts +0 -47
  278. package/src/adapters/bun/hmr-manager.js +0 -58
  279. package/src/adapters/bun/index.d.ts +0 -2
  280. package/src/adapters/bun/index.js +0 -8
  281. package/src/adapters/bun/runtime-host.d.ts +0 -52
  282. package/src/adapters/bun/runtime-host.js +0 -56
  283. package/src/adapters/bun/server-adapter.d.ts +0 -216
  284. package/src/adapters/bun/server-adapter.js +0 -445
  285. package/src/adapters/bun/static-preview-host.d.ts +0 -28
  286. package/src/adapters/bun/static-preview-host.js +0 -45
  287. package/src/adapters/create-app.d.ts +0 -20
  288. package/src/adapters/create-app.js +0 -66
  289. package/src/adapters/index.d.ts +0 -2
  290. package/src/adapters/index.js +0 -8
  291. package/src/adapters/node/create-app.d.ts +0 -24
  292. package/src/adapters/node/create-app.js +0 -92
  293. package/src/adapters/node/http-request-bridge.d.ts +0 -57
  294. package/src/adapters/node/http-request-bridge.js +0 -118
  295. package/src/adapters/node/node-client-bridge.d.ts +0 -26
  296. package/src/adapters/node/node-client-bridge.js +0 -66
  297. package/src/adapters/node/node-hmr-manager.d.ts +0 -52
  298. package/src/adapters/node/node-hmr-manager.js +0 -49
  299. package/src/adapters/node/runtime-host.d.ts +0 -57
  300. package/src/adapters/node/runtime-host.js +0 -92
  301. package/src/adapters/node/server-adapter-dependencies.d.ts +0 -19
  302. package/src/adapters/node/server-adapter-dependencies.js +0 -18
  303. package/src/adapters/node/server-adapter.d.ts +0 -138
  304. package/src/adapters/node/server-adapter.js +0 -315
  305. package/src/adapters/node/static-content-server.d.ts +0 -60
  306. package/src/adapters/node/static-content-server.js +0 -194
  307. package/src/adapters/node/static-preview-host.d.ts +0 -55
  308. package/src/adapters/node/static-preview-host.js +0 -68
  309. package/src/adapters/shared/api-response.d.ts +0 -52
  310. package/src/adapters/shared/api-response.js +0 -96
  311. package/src/adapters/shared/application-adapter.d.ts +0 -18
  312. package/src/adapters/shared/application-adapter.js +0 -90
  313. package/src/adapters/shared/define-api-handler.d.ts +0 -25
  314. package/src/adapters/shared/define-api-handler.js +0 -15
  315. package/src/adapters/shared/explicit-static-render-preparation.d.ts +0 -25
  316. package/src/adapters/shared/explicit-static-render-preparation.js +0 -26
  317. package/src/adapters/shared/explicit-static-route-matcher.d.ts +0 -41
  318. package/src/adapters/shared/explicit-static-route-matcher.js +0 -101
  319. package/src/adapters/shared/file-route-middleware-pipeline.d.ts +0 -62
  320. package/src/adapters/shared/file-route-middleware-pipeline.js +0 -90
  321. package/src/adapters/shared/fs-server-response-factory.d.ts +0 -23
  322. package/src/adapters/shared/fs-server-response-factory.js +0 -81
  323. package/src/adapters/shared/fs-server-response-matcher.d.ts +0 -75
  324. package/src/adapters/shared/fs-server-response-matcher.js +0 -186
  325. package/src/adapters/shared/hmr-entrypoint-registrar.d.ts +0 -55
  326. package/src/adapters/shared/hmr-entrypoint-registrar.js +0 -87
  327. package/src/adapters/shared/hmr-html-response.d.ts +0 -22
  328. package/src/adapters/shared/hmr-html-response.js +0 -33
  329. package/src/adapters/shared/render-context.d.ts +0 -16
  330. package/src/adapters/shared/render-context.js +0 -93
  331. package/src/adapters/shared/runtime-app-bootstrap.d.ts +0 -26
  332. package/src/adapters/shared/runtime-app-bootstrap.js +0 -46
  333. package/src/adapters/shared/runtime-host.d.ts +0 -12
  334. package/src/adapters/shared/runtime-host.js +0 -0
  335. package/src/adapters/shared/server-adapter.d.ts +0 -108
  336. package/src/adapters/shared/server-adapter.js +0 -436
  337. package/src/adapters/shared/server-route-handler.d.ts +0 -89
  338. package/src/adapters/shared/server-route-handler.js +0 -111
  339. package/src/adapters/shared/server-static-builder.d.ts +0 -71
  340. package/src/adapters/shared/server-static-builder.js +0 -100
  341. package/src/adapters/shared/shared-hmr-manager.d.ts +0 -59
  342. package/src/adapters/shared/shared-hmr-manager.js +0 -241
  343. package/src/adapters/shared/static-preview-host.d.ts +0 -10
  344. package/src/adapters/shared/static-preview-host.js +0 -0
  345. package/src/build/browser-runtime-import-rewrite-plugin.d.ts +0 -26
  346. package/src/build/browser-runtime-import-rewrite-plugin.js +0 -165
  347. package/src/build/browser-runtime-manifest.d.ts +0 -31
  348. package/src/build/browser-runtime-manifest.js +0 -61
  349. package/src/build/build-adapter.d.ts +0 -247
  350. package/src/build/build-adapter.js +0 -671
  351. package/src/build/build-manifest.d.ts +0 -33
  352. package/src/build/build-manifest.js +0 -52
  353. package/src/build/build-types.d.ts +0 -57
  354. package/src/build/build-types.js +0 -0
  355. package/src/build/dev-build-coordinator.d.ts +0 -72
  356. package/src/build/dev-build-coordinator.js +0 -154
  357. package/src/build/esbuild-build-adapter.d.ts +0 -79
  358. package/src/build/esbuild-build-adapter.js +0 -521
  359. package/src/build/runtime-build-executor.d.ts +0 -14
  360. package/src/build/runtime-build-executor.js +0 -22
  361. package/src/build/runtime-specifier-alias-plugin.d.ts +0 -15
  362. package/src/build/runtime-specifier-alias-plugin.js +0 -31
  363. package/src/config/config-builder.d.ts +0 -252
  364. package/src/config/config-builder.js +0 -598
  365. package/src/config/constants.js +0 -25
  366. package/src/dev/host-runtime.d.ts +0 -10
  367. package/src/dev/host-runtime.js +0 -24
  368. package/src/dev/sc-server.d.ts +0 -30
  369. package/src/dev/sc-server.js +0 -111
  370. package/src/eco/eco.browser.d.ts +0 -2
  371. package/src/eco/eco.browser.js +0 -88
  372. package/src/eco/eco.d.ts +0 -9
  373. package/src/eco/eco.js +0 -119
  374. package/src/eco/eco.types.d.ts +0 -233
  375. package/src/eco/eco.types.js +0 -0
  376. package/src/eco/eco.utils.d.ts +0 -1
  377. package/src/eco/eco.utils.js +0 -10
  378. package/src/eco/global-injector-map.d.ts +0 -16
  379. package/src/eco/global-injector-map.js +0 -80
  380. package/src/eco/lazy-injector-map.d.ts +0 -8
  381. package/src/eco/lazy-injector-map.js +0 -70
  382. package/src/eco/module-dependencies.d.ts +0 -18
  383. package/src/eco/module-dependencies.js +0 -49
  384. package/src/errors/http-error.d.ts +0 -31
  385. package/src/errors/http-error.js +0 -50
  386. package/src/errors/index.d.ts +0 -3
  387. package/src/errors/index.js +0 -6
  388. package/src/errors/locals-access-error.d.ts +0 -4
  389. package/src/errors/locals-access-error.js +0 -9
  390. package/src/global/app-logger.d.ts +0 -2
  391. package/src/global/app-logger.js +0 -6
  392. package/src/hmr/client/hmr-runtime.d.ts +0 -5
  393. package/src/hmr/client/hmr-runtime.js +0 -117
  394. package/src/hmr/hmr-strategy.d.ts +0 -162
  395. package/src/hmr/hmr-strategy.js +0 -44
  396. package/src/hmr/hmr.postcss.test.e2e.d.ts +0 -1
  397. package/src/hmr/hmr.postcss.test.e2e.js +0 -31
  398. package/src/hmr/hmr.test.e2e.d.ts +0 -1
  399. package/src/hmr/hmr.test.e2e.js +0 -43
  400. package/src/hmr/strategies/default-hmr-strategy.d.ts +0 -43
  401. package/src/hmr/strategies/default-hmr-strategy.js +0 -34
  402. package/src/hmr/strategies/js-hmr-strategy.d.ts +0 -134
  403. package/src/hmr/strategies/js-hmr-strategy.js +0 -173
  404. package/src/index.browser.d.ts +0 -3
  405. package/src/index.browser.js +0 -4
  406. package/src/index.d.ts +0 -6
  407. package/src/index.js +0 -21
  408. package/src/integrations/ghtml/ghtml-renderer.d.ts +0 -16
  409. package/src/integrations/ghtml/ghtml-renderer.js +0 -57
  410. package/src/integrations/ghtml/ghtml.constants.d.ts +0 -1
  411. package/src/integrations/ghtml/ghtml.constants.js +0 -4
  412. package/src/integrations/ghtml/ghtml.plugin.d.ts +0 -16
  413. package/src/integrations/ghtml/ghtml.plugin.js +0 -20
  414. package/src/plugins/alias-resolver-plugin.d.ts +0 -3
  415. package/src/plugins/alias-resolver-plugin.js +0 -61
  416. package/src/plugins/eco-component-meta-plugin.d.ts +0 -108
  417. package/src/plugins/eco-component-meta-plugin.js +0 -175
  418. package/src/plugins/foreign-jsx-override-plugin.d.ts +0 -33
  419. package/src/plugins/foreign-jsx-override-plugin.js +0 -41
  420. package/src/plugins/integration-plugin.d.ts +0 -230
  421. package/src/plugins/integration-plugin.js +0 -201
  422. package/src/plugins/processor.d.ts +0 -97
  423. package/src/plugins/processor.js +0 -141
  424. package/src/plugins/runtime-capability.js +0 -0
  425. package/src/plugins/source-transform.d.ts +0 -46
  426. package/src/plugins/source-transform.js +0 -71
  427. package/src/route-renderer/orchestration/component-render-context.d.ts +0 -97
  428. package/src/route-renderer/orchestration/component-render-context.js +0 -147
  429. package/src/route-renderer/orchestration/declared-ownership-graph.d.ts +0 -18
  430. package/src/route-renderer/orchestration/declared-ownership-graph.js +0 -34
  431. package/src/route-renderer/orchestration/foreign-subtree-execution.service.d.ts +0 -110
  432. package/src/route-renderer/orchestration/foreign-subtree-execution.service.js +0 -233
  433. package/src/route-renderer/orchestration/integration-renderer.d.ts +0 -534
  434. package/src/route-renderer/orchestration/integration-renderer.js +0 -991
  435. package/src/route-renderer/orchestration/ownership-planning.service.d.ts +0 -24
  436. package/src/route-renderer/orchestration/ownership-planning.service.js +0 -63
  437. package/src/route-renderer/orchestration/ownership-validation.service.d.ts +0 -29
  438. package/src/route-renderer/orchestration/ownership-validation.service.js +0 -53
  439. package/src/route-renderer/orchestration/processed-asset-dedupe.d.ts +0 -3
  440. package/src/route-renderer/orchestration/processed-asset-dedupe.js +0 -27
  441. package/src/route-renderer/orchestration/queued-foreign-subtree-resolution.service.d.ts +0 -91
  442. package/src/route-renderer/orchestration/queued-foreign-subtree-resolution.service.js +0 -170
  443. package/src/route-renderer/orchestration/render-output.utils.d.ts +0 -66
  444. package/src/route-renderer/orchestration/render-output.utils.js +0 -171
  445. package/src/route-renderer/orchestration/route-render-orchestrator.d.ts +0 -156
  446. package/src/route-renderer/orchestration/route-render-orchestrator.js +0 -577
  447. package/src/route-renderer/orchestration/template-serialization.d.ts +0 -38
  448. package/src/route-renderer/orchestration/template-serialization.js +0 -45
  449. package/src/route-renderer/page-loading/component-dependency-collection.d.ts +0 -37
  450. package/src/route-renderer/page-loading/component-dependency-collection.js +0 -132
  451. package/src/route-renderer/page-loading/declared-asset-collection.d.ts +0 -24
  452. package/src/route-renderer/page-loading/declared-asset-collection.js +0 -106
  453. package/src/route-renderer/page-loading/dependency-resolver.d.ts +0 -35
  454. package/src/route-renderer/page-loading/dependency-resolver.js +0 -115
  455. package/src/route-renderer/page-loading/ecopages-virtual-imports.d.ts +0 -11
  456. package/src/route-renderer/page-loading/ecopages-virtual-imports.js +0 -57
  457. package/src/route-renderer/page-loading/lazy-entry-collection.d.ts +0 -45
  458. package/src/route-renderer/page-loading/lazy-entry-collection.js +0 -105
  459. package/src/route-renderer/page-loading/lazy-trigger-planning.d.ts +0 -19
  460. package/src/route-renderer/page-loading/lazy-trigger-planning.js +0 -40
  461. package/src/route-renderer/page-loading/module-declaration-aggregation.d.ts +0 -5
  462. package/src/route-renderer/page-loading/module-declaration-aggregation.js +0 -33
  463. package/src/route-renderer/page-loading/module-declaration-scripts.d.ts +0 -3
  464. package/src/route-renderer/page-loading/module-declaration-scripts.js +0 -18
  465. package/src/route-renderer/page-loading/page-dependency-bundling.d.ts +0 -13
  466. package/src/route-renderer/page-loading/page-dependency-bundling.js +0 -137
  467. package/src/route-renderer/page-loading/page-module-loader.d.ts +0 -90
  468. package/src/route-renderer/page-loading/page-module-loader.js +0 -127
  469. package/src/route-renderer/route-renderer.d.ts +0 -69
  470. package/src/route-renderer/route-renderer.js +0 -80
  471. package/src/router/client/link-intent.js +0 -34
  472. package/src/router/client/link-intent.test.browser.d.ts +0 -1
  473. package/src/router/client/link-intent.test.browser.js +0 -43
  474. package/src/router/client/navigation-coordinator.d.ts +0 -169
  475. package/src/router/client/navigation-coordinator.js +0 -215
  476. package/src/router/server/route-registry.d.ts +0 -78
  477. package/src/router/server/route-registry.js +0 -262
  478. package/src/services/assets/asset-processing-service/asset-dependency-keys.d.ts +0 -3
  479. package/src/services/assets/asset-processing-service/asset-dependency-keys.js +0 -56
  480. package/src/services/assets/asset-processing-service/asset-processing.service.d.ts +0 -103
  481. package/src/services/assets/asset-processing-service/asset-processing.service.js +0 -285
  482. package/src/services/assets/asset-processing-service/asset.factory.d.ts +0 -17
  483. package/src/services/assets/asset-processing-service/asset.factory.js +0 -82
  484. package/src/services/assets/asset-processing-service/assets.types.d.ts +0 -103
  485. package/src/services/assets/asset-processing-service/assets.types.js +0 -0
  486. package/src/services/assets/asset-processing-service/browser-runtime-asset.factory.d.ts +0 -57
  487. package/src/services/assets/asset-processing-service/browser-runtime-asset.factory.js +0 -49
  488. package/src/services/assets/asset-processing-service/browser-runtime-entry.factory.d.ts +0 -20
  489. package/src/services/assets/asset-processing-service/browser-runtime-entry.factory.js +0 -41
  490. package/src/services/assets/asset-processing-service/grouped-content-bundles.d.ts +0 -30
  491. package/src/services/assets/asset-processing-service/grouped-content-bundles.js +0 -65
  492. package/src/services/assets/asset-processing-service/index.d.ts +0 -6
  493. package/src/services/assets/asset-processing-service/index.js +0 -6
  494. package/src/services/assets/asset-processing-service/page-package.d.ts +0 -6
  495. package/src/services/assets/asset-processing-service/page-package.js +0 -80
  496. package/src/services/assets/asset-processing-service/processor.interface.js +0 -6
  497. package/src/services/assets/asset-processing-service/processor.registry.d.ts +0 -8
  498. package/src/services/assets/asset-processing-service/processor.registry.js +0 -15
  499. package/src/services/assets/asset-processing-service/processors/base/base-processor.d.ts +0 -24
  500. package/src/services/assets/asset-processing-service/processors/base/base-processor.js +0 -65
  501. package/src/services/assets/asset-processing-service/processors/base/base-script-processor.d.ts +0 -22
  502. package/src/services/assets/asset-processing-service/processors/base/base-script-processor.js +0 -136
  503. package/src/services/assets/asset-processing-service/processors/index.d.ts +0 -5
  504. package/src/services/assets/asset-processing-service/processors/index.js +0 -5
  505. package/src/services/assets/asset-processing-service/processors/script/content-script.processor.d.ts +0 -6
  506. package/src/services/assets/asset-processing-service/processors/script/content-script.processor.js +0 -120
  507. package/src/services/assets/asset-processing-service/processors/script/file-script.processor.d.ts +0 -9
  508. package/src/services/assets/asset-processing-service/processors/script/file-script.processor.js +0 -97
  509. package/src/services/assets/asset-processing-service/processors/script/node-module-script.processor.d.ts +0 -42
  510. package/src/services/assets/asset-processing-service/processors/script/node-module-script.processor.js +0 -126
  511. package/src/services/assets/asset-processing-service/processors/stylesheet/content-stylesheet.processor.d.ts +0 -8
  512. package/src/services/assets/asset-processing-service/processors/stylesheet/content-stylesheet.processor.js +0 -59
  513. package/src/services/assets/asset-processing-service/processors/stylesheet/file-stylesheet.processor.d.ts +0 -9
  514. package/src/services/assets/asset-processing-service/processors/stylesheet/file-stylesheet.processor.js +0 -69
  515. package/src/services/assets/asset-processing-service/ungrouped-dependency-processing.d.ts +0 -18
  516. package/src/services/assets/asset-processing-service/ungrouped-dependency-processing.js +0 -45
  517. package/src/services/assets/browser-bundle.service.d.ts +0 -73
  518. package/src/services/assets/browser-bundle.service.js +0 -41
  519. package/src/services/cache/cache.types.d.ts +0 -107
  520. package/src/services/cache/cache.types.js +0 -0
  521. package/src/services/cache/index.d.ts +0 -7
  522. package/src/services/cache/index.js +0 -7
  523. package/src/services/cache/memory-cache-store.d.ts +0 -42
  524. package/src/services/cache/memory-cache-store.js +0 -98
  525. package/src/services/cache/page-cache-service.d.ts +0 -70
  526. package/src/services/cache/page-cache-service.js +0 -152
  527. package/src/services/cache/page-request-cache-coordinator.service.d.ts +0 -75
  528. package/src/services/cache/page-request-cache-coordinator.service.js +0 -109
  529. package/src/services/html/html-rewriter-provider.service.d.ts +0 -40
  530. package/src/services/html/html-rewriter-provider.service.js +0 -68
  531. package/src/services/html/html-transformer.service.d.ts +0 -96
  532. package/src/services/html/html-transformer.service.js +0 -287
  533. package/src/services/invalidation/development-invalidation.service.d.ts +0 -74
  534. package/src/services/invalidation/development-invalidation.service.js +0 -190
  535. package/src/services/module-loading/app-module-loader.service.d.ts +0 -7
  536. package/src/services/module-loading/app-module-loader.service.js +0 -0
  537. package/src/services/module-loading/app-server-module-transpiler.service.d.ts +0 -24
  538. package/src/services/module-loading/app-server-module-transpiler.service.js +0 -151
  539. package/src/services/module-loading/host-module-loader-registry.d.ts +0 -4
  540. package/src/services/module-loading/host-module-loader-registry.js +0 -15
  541. package/src/services/module-loading/module-loading-types.js +0 -0
  542. package/src/services/module-loading/node-bootstrap-plugin.d.ts +0 -38
  543. package/src/services/module-loading/node-bootstrap-plugin.js +0 -215
  544. package/src/services/module-loading/page-module-import.service.d.ts +0 -95
  545. package/src/services/module-loading/page-module-import.service.js +0 -191
  546. package/src/services/module-loading/server-module-transpiler.service.d.ts +0 -63
  547. package/src/services/module-loading/server-module-transpiler.service.js +0 -64
  548. package/src/services/module-loading/source-module-support.d.ts +0 -5
  549. package/src/services/module-loading/source-module-support.js +0 -8
  550. package/src/services/runtime-state/dev-graph.service.d.ts +0 -118
  551. package/src/services/runtime-state/dev-graph.service.js +0 -162
  552. package/src/services/runtime-state/entrypoint-dependency-graph.service.d.ts +0 -41
  553. package/src/services/runtime-state/entrypoint-dependency-graph.service.js +0 -85
  554. package/src/services/runtime-state/server-invalidation-state.service.d.ts +0 -26
  555. package/src/services/runtime-state/server-invalidation-state.service.js +0 -35
  556. package/src/services/validation/schema-validation-service.d.ts +0 -122
  557. package/src/services/validation/schema-validation-service.js +0 -101
  558. package/src/services/validation/standard-schema.types.js +0 -0
  559. package/src/static-site-generator/static-site-generator.d.ts +0 -104
  560. package/src/static-site-generator/static-site-generator.js +0 -316
  561. package/src/types/internal-types.d.ts +0 -232
  562. package/src/types/internal-types.js +0 -0
  563. package/src/types/public-types.d.ts +0 -1307
  564. package/src/types/public-types.js +0 -0
  565. package/src/utils/deep-merge.d.ts +0 -14
  566. package/src/utils/deep-merge.js +0 -32
  567. package/src/utils/hash.d.ts +0 -1
  568. package/src/utils/hash.js +0 -7
  569. package/src/utils/html-escaping.d.ts +0 -7
  570. package/src/utils/html-escaping.js +0 -6
  571. package/src/utils/html.js +0 -4
  572. package/src/utils/invariant.d.ts +0 -5
  573. package/src/utils/invariant.js +0 -11
  574. package/src/utils/locals-utils.d.ts +0 -15
  575. package/src/utils/locals-utils.js +0 -24
  576. package/src/utils/parse-cli-args.d.ts +0 -27
  577. package/src/utils/parse-cli-args.js +0 -62
  578. package/src/utils/path-utils.module.d.ts +0 -5
  579. package/src/utils/path-utils.module.js +0 -14
  580. package/src/utils/resolve-work-dir.d.ts +0 -11
  581. package/src/utils/resolve-work-dir.js +0 -31
  582. package/src/utils/runtime.d.ts +0 -11
  583. package/src/utils/runtime.js +0 -40
  584. package/src/utils/server-utils.module.d.ts +0 -19
  585. package/src/utils/server-utils.module.js +0 -56
  586. package/src/watchers/project-watcher.d.ts +0 -136
  587. package/src/watchers/project-watcher.js +0 -275
  588. package/src/watchers/project-watcher.test-helpers.d.ts +0 -4
  589. package/src/watchers/project-watcher.test-helpers.js +0 -52
  590. /package/src/utils/{html.d.ts → html.ts} +0 -0
@@ -0,0 +1,605 @@
1
+ import type { Server, WebSocketHandler } from 'bun';
2
+ import path from 'node:path';
3
+ import { DEFAULT_ECOPAGES_HOSTNAME, DEFAULT_ECOPAGES_PORT } from '../../config/constants.ts';
4
+ import { RESOLVED_ASSETS_DIR } from '../../config/constants.ts';
5
+ import { appLogger } from '../../global/app-logger.ts';
6
+ import type { EcoPagesAppConfig } from '../../types/internal-types.ts';
7
+ import type { ApiHandler, ApiHandlerContext, ErrorHandler, StaticRoute } from '../../types/public-types.ts';
8
+ import { HttpError } from '../../errors/http-error.ts';
9
+ import { createRequire } from '../../utils/locals-utils.ts';
10
+
11
+ import { fileSystem } from '@ecopages/file-system';
12
+ import { getAppBrowserBuildPlugins, setupAppRuntimePlugins } from '../../build/build-adapter.ts';
13
+ import { installAppRuntimeBuildExecutor } from '../../build/runtime-build-executor.ts';
14
+ import { StaticSiteGenerator } from '../../static-site-generator/static-site-generator.ts';
15
+ import { ProjectWatcher } from '../../watchers/project-watcher.ts';
16
+ import { SharedServerAdapter } from '../shared/server-adapter.ts';
17
+ import type { ServerAdapterResult } from '../abstract/server-adapter.ts';
18
+ import { ApiResponseBuilder } from '../shared/api-response.ts';
19
+ import type { StaticPreviewHost } from '../shared/static-preview-host.ts';
20
+
21
+ import { ServerStaticBuilder } from '../shared/server-static-builder.ts';
22
+ import {
23
+ injectHmrRuntimeIntoHtmlResponse,
24
+ isHtmlResponse,
25
+ shouldInjectHmrHtmlResponse,
26
+ } from '../shared/hmr-html-response.ts';
27
+ import { resolveServeRuntimeOrigin } from '../shared/runtime-app-bootstrap.ts';
28
+ import { ClientBridge } from './client-bridge.ts';
29
+ import { HmrManager } from './hmr-manager.ts';
30
+ import { BunStaticPreviewHost } from './static-preview-host.ts';
31
+
32
+ type BunServerInstance = Server<unknown>;
33
+ type BunNativeServeOptions = Bun.Serve.Options<unknown>;
34
+
35
+ export type BunServerRoutes = Bun.Serve.Routes<unknown, string>;
36
+
37
+ export type BunServeAdapterServerOptions = Partial<
38
+ Omit<BunNativeServeOptions, 'fetch'> & {
39
+ fetch(this: BunServerInstance, request: Request): Promise<void | Response>;
40
+ }
41
+ >;
42
+
43
+ export type BunServeOptions = Omit<BunNativeServeOptions, 'fetch'> & {
44
+ fetch?: (this: BunServerInstance, request: Request, server: BunServerInstance) => Promise<void | Response>;
45
+ websocket?: WebSocketHandler<unknown>;
46
+ };
47
+
48
+ /**
49
+ * Construction parameters for the Bun server adapter.
50
+ *
51
+ * @remarks
52
+ * Callers normally provide only the app-facing fields such as routes, handlers,
53
+ * and `serveOptions`. The transport collaborators remain optional here because
54
+ * `createBunServerAdapter()` fills in Bun-specific defaults before the concrete
55
+ * adapter instance is created.
56
+ */
57
+ export interface BunServerAdapterParams {
58
+ appConfig: EcoPagesAppConfig;
59
+ runtimeOrigin: string;
60
+ serveOptions: BunServeAdapterServerOptions;
61
+ apiHandlers?: ApiHandler<string, Request, BunServerInstance>[];
62
+ staticRoutes?: StaticRoute[];
63
+ errorHandler?: ErrorHandler;
64
+ options?: {
65
+ watch?: boolean;
66
+ };
67
+ hmrManager?: HmrManager;
68
+ bridge?: ClientBridge;
69
+ previewHost?: StaticPreviewHost;
70
+ }
71
+
72
+ export interface BunServerAdapterResult extends ServerAdapterResult {
73
+ getServerOptions: (options?: { enableHmr?: boolean }) => BunServeOptions;
74
+ buildStatic: (options?: { preview?: boolean }) => Promise<void>;
75
+ completeInitialization: (server?: BunServerInstance | null) => Promise<void>;
76
+ handleRequest: (request: Request) => Promise<Response>;
77
+ }
78
+
79
+ /**
80
+ * Bun transport adapter that wires shared Ecopages request handling onto a live
81
+ * `Bun.serve()` runtime.
82
+ *
83
+ * @remarks
84
+ * The adapter owns Bun-specific concerns that do not exist in the shared server
85
+ * abstraction: websocket-backed HMR transport, runtime plugin registration, and
86
+ * preview-host startup for static builds. Routing, rendering, and response
87
+ * composition still delegate to the shared server adapter base.
88
+ */
89
+ export class BunServerAdapter extends SharedServerAdapter<BunServerAdapterParams, BunServerAdapterResult> {
90
+ declare appConfig: EcoPagesAppConfig;
91
+ declare options: BunServerAdapterParams['options'];
92
+ declare serveOptions: BunServeAdapterServerOptions;
93
+ protected apiHandlers: ApiHandler<string, Request, BunServerInstance>[];
94
+ protected staticRoutes: StaticRoute[];
95
+
96
+ protected errorHandler?: ErrorHandler;
97
+
98
+ private bridge!: ClientBridge;
99
+ public hmrManager!: HmrManager;
100
+ private initializationPromise: Promise<void> | null = null;
101
+ private fullyInitialized = false;
102
+ declare serverInstance: BunServerInstance | null;
103
+ private readonly previewHost: StaticPreviewHost;
104
+
105
+ /**
106
+ * Creates a Bun server adapter with already-resolved runtime collaborators.
107
+ *
108
+ * @remarks
109
+ * The public params interface keeps `hmrManager`, `bridge`, and `previewHost`
110
+ * optional so factory callers can omit them. By the time the concrete adapter
111
+ * is constructed, those collaborators are mandatory because the adapter cannot
112
+ * initialize Bun HMR or preview flows without them.
113
+ */
114
+ constructor({
115
+ appConfig,
116
+ runtimeOrigin,
117
+ serveOptions,
118
+ apiHandlers,
119
+ staticRoutes,
120
+ errorHandler,
121
+ options,
122
+ hmrManager,
123
+ bridge,
124
+ previewHost,
125
+ }: BunServerAdapterParams & {
126
+ hmrManager: HmrManager;
127
+ bridge: ClientBridge;
128
+ previewHost: StaticPreviewHost;
129
+ }) {
130
+ super({ appConfig, runtimeOrigin, serveOptions, options });
131
+ this.apiHandlers = apiHandlers || [];
132
+ this.staticRoutes = staticRoutes || [];
133
+ this.errorHandler = errorHandler;
134
+ this.bridge = bridge;
135
+ this.hmrManager = hmrManager;
136
+ this.previewHost = previewHost;
137
+ }
138
+
139
+ /**
140
+ * Returns whether adapter-level HTML responses still need HMR runtime injection.
141
+ *
142
+ * @remarks
143
+ * Filesystem-routed pages are wrapped later in the shared route layer. This
144
+ * adapter-level check exists for explicit API handlers that return HTML and
145
+ * would otherwise bypass the route wrapper entirely.
146
+ */
147
+ private shouldInjectHmrScript(): boolean {
148
+ return shouldInjectHmrHtmlResponse(this.options?.watch === true, this.hmrManager);
149
+ }
150
+
151
+ /**
152
+ * Delegates the HTML-response test to the shared response helper used by both
153
+ * adapters.
154
+ */
155
+ private isHtmlResponse(response: Response): boolean {
156
+ return isHtmlResponse(response);
157
+ }
158
+
159
+ /**
160
+ * Injects HMR script into HTML responses in development mode.
161
+ * Ensures explicit API handlers that return HTML get auto-reload capability.
162
+ */
163
+ private async maybeInjectHmrScript(response: Response): Promise<Response> {
164
+ if (this.shouldInjectHmrScript() && this.isHtmlResponse(response)) {
165
+ return injectHmrRuntimeIntoHtmlResponse(response);
166
+ }
167
+ return response;
168
+ }
169
+
170
+ /**
171
+ * Initializes the server adapter's core runtime components.
172
+ */
173
+ public async initialize(): Promise<void> {
174
+ installAppRuntimeBuildExecutor(this.appConfig);
175
+
176
+ this.staticSiteGenerator = new StaticSiteGenerator({ appConfig: this.appConfig });
177
+ await this.hmrManager.buildRuntime();
178
+ this.prepareRuntimePublicDir();
179
+
180
+ const staticBuilderOptions = {
181
+ appConfig: this.appConfig,
182
+ staticSiteGenerator: this.staticSiteGenerator,
183
+ serveOptions: this.serveOptions,
184
+ apiHandlers: this.apiHandlers,
185
+ };
186
+
187
+ this.staticBuilder = new ServerStaticBuilder(staticBuilderOptions);
188
+
189
+ await this.initializeRuntimePlugins({ watch: this.options?.watch });
190
+ }
191
+
192
+ /**
193
+ * Copies the source `public` directory into the runtime output and ensures the
194
+ * HMR assets directory exists before any runtime bundles are emitted.
195
+ */
196
+ private prepareRuntimePublicDir(): void {
197
+ const srcPublicDir = path.join(this.appConfig.rootDir, this.appConfig.srcDir, this.appConfig.publicDir);
198
+
199
+ if (fileSystem.exists(srcPublicDir)) {
200
+ fileSystem.copyDir(srcPublicDir, path.join(this.appConfig.rootDir, this.appConfig.distDir));
201
+ }
202
+
203
+ fileSystem.ensureDir(path.join(this.appConfig.absolutePaths.distDir, RESOLVED_ASSETS_DIR));
204
+ }
205
+
206
+ /**
207
+ * Registers runtime plugins and propagates the final HMR manager into each
208
+ * integration.
209
+ *
210
+ * @remarks
211
+ * This is where Bun's runtime-plugin registration path meets the integration
212
+ * lifecycle. A failure here leaves the runtime partially bootstrapped, so the
213
+ * method logs the underlying error and rethrows instead of trying to limp on.
214
+ */
215
+ private async initializeRuntimePlugins(options?: { watch?: boolean }): Promise<void> {
216
+ try {
217
+ this.hmrManager.setEnabled(Boolean(options?.watch));
218
+
219
+ await setupAppRuntimePlugins({
220
+ appConfig: this.appConfig,
221
+ runtimeOrigin: this.runtimeOrigin,
222
+ hmrManager: this.hmrManager,
223
+ onRuntimePlugin: (plugin) => {
224
+ Bun.plugin(plugin as any);
225
+ },
226
+ });
227
+
228
+ const browserBuildPlugins = getAppBrowserBuildPlugins(this.appConfig);
229
+ this.hmrManager.setPlugins(browserBuildPlugins);
230
+
231
+ for (const integration of this.appConfig.integrations) {
232
+ integration.setHmrManager(this.hmrManager);
233
+ }
234
+ } catch (error) {
235
+ appLogger.error(`Failed to initialize plugins: ${error instanceof Error ? error.message : String(error)}`);
236
+ throw error;
237
+ }
238
+ }
239
+
240
+ /**
241
+ * Rebuilds the shared routing state and hot-reloads the live Bun server when a
242
+ * watched route file changes.
243
+ */
244
+ private async refreshRouterRoutes(): Promise<void> {
245
+ if (!this.serverInstance || typeof this.serverInstance.reload !== 'function') {
246
+ appLogger.error('Server instance is not available for reloading');
247
+ return;
248
+ }
249
+
250
+ await this.createSharedWatchRefreshCallback({
251
+ staticRoutes: this.staticRoutes,
252
+ hmrManager: this.hmrManager,
253
+ onRoutesReady: () => {
254
+ const options = this.getServerOptions({ enableHmr: true });
255
+ this.serverInstance!.reload(options as BunNativeServeOptions);
256
+ appLogger.debug('Server routes updated with dynamic routes');
257
+ },
258
+ onError: (error) => {
259
+ this.hmrManager.broadcast({ type: 'error', message: error.message });
260
+ appLogger.error('Failed to refresh router routes:', error);
261
+ },
262
+ })();
263
+ }
264
+
265
+ private async watch(): Promise<void> {
266
+ const watcher = new ProjectWatcher({
267
+ config: this.appConfig,
268
+ refreshRouterRoutesCallback: this.refreshRouterRoutes.bind(this),
269
+ hmrManager: this.hmrManager,
270
+ bridge: this.bridge,
271
+ });
272
+
273
+ await watcher.createWatcherSubscription();
274
+ }
275
+
276
+ /**
277
+ * Builds the `Bun.serve()` options for the current adapter state.
278
+ *
279
+ * @remarks
280
+ * The HMR-enabled variant wraps the base fetch handler so one Bun server can
281
+ * serve normal requests, accept HMR websocket upgrades, and expose the HMR
282
+ * runtime asset without splitting responsibility across separate listeners.
283
+ */
284
+ public getServerOptions({ enableHmr = false } = {}): BunServeOptions {
285
+ appLogger.debug(`[BunServerAdapter] getServerOptions called with enableHmr: ${enableHmr}`);
286
+ const serverOptions = this.buildServerSettings();
287
+
288
+ if (enableHmr) {
289
+ const originalFetch = serverOptions.fetch;
290
+ const hmrHandler = this.hmrManager.getWebSocketHandler();
291
+ const hmrManager = this.hmrManager;
292
+
293
+ (serverOptions as any).development = true;
294
+
295
+ serverOptions.websocket = hmrHandler;
296
+ serverOptions.fetch = async function (
297
+ this: Server<unknown>,
298
+ request: Request,
299
+ _server: Server<unknown>,
300
+ ): Promise<Response | void> {
301
+ const url = new URL(request.url);
302
+ appLogger.debug(`[HMR] Request: ${url.pathname}`);
303
+
304
+ /** Handle HMR WebSocket upgrade */
305
+ if (url.pathname === '/_hmr') {
306
+ const success = this.upgrade(request, {
307
+ data: undefined,
308
+ });
309
+ if (success) return;
310
+ return new Response('WebSocket upgrade failed', { status: 400 });
311
+ }
312
+
313
+ /** Serve HMR runtime script */
314
+ if (url.pathname === '/_hmr_runtime.js') {
315
+ appLogger.debug(`[HMR] Serving runtime from ${hmrManager.getRuntimePath()}`);
316
+ return new Response(fileSystem.readFileAsBuffer(hmrManager.getRuntimePath()) as BodyInit, {
317
+ headers: { 'Content-Type': 'application/javascript' },
318
+ });
319
+ }
320
+
321
+ /** Proceed with normal request handling */
322
+ let response: Response;
323
+ if (originalFetch) {
324
+ const res = await originalFetch.call(this, request, this);
325
+ response = res instanceof Response ? res : new Response('Not Found', { status: 404 });
326
+ } else {
327
+ response = new Response('Not Found', { status: 404 });
328
+ }
329
+
330
+ return response;
331
+ };
332
+ }
333
+
334
+ return serverOptions as BunServeOptions;
335
+ }
336
+
337
+ /**
338
+ * Helper method to retrieve and parse the request body.
339
+ * Handles JSON and plain text content types.
340
+ * For FormData (multipart/form-data, x-www-form-urlencoded), use ctx.request.formData() directly.
341
+ * Returns undefined for unsupported content types.
342
+ */
343
+ private async retrieveBodyFromRequest(request: Request): Promise<unknown> {
344
+ const contentType = request.headers.get('Content-Type') || '';
345
+
346
+ if (contentType.includes('application/json')) {
347
+ return await request.json();
348
+ }
349
+
350
+ if (contentType.includes('text/plain')) {
351
+ return await request.text();
352
+ }
353
+
354
+ return undefined;
355
+ }
356
+
357
+ /**
358
+ * Composes the base Bun server settings that all runtime modes build from.
359
+ *
360
+ * @remarks
361
+ * This method centralizes the Bun-specific error boundary. It preserves the
362
+ * shared route pipeline while still allowing adapter-level custom error-handler
363
+ * execution and `HttpError` passthrough.
364
+ */
365
+ private buildServerSettings(): BunServeOptions {
366
+ const serverOptions = { ...this.serveOptions } as BunServeAdapterServerOptions;
367
+ const handleNoMatch = this.handleNoMatch.bind(this);
368
+ const waitForInit = this.waitForInitialization.bind(this);
369
+ const handleReq = this.handleRequest.bind(this);
370
+ const errorHandler = this.errorHandler;
371
+ const getCacheService = () => this.getCacheService();
372
+ const getRenderContext = () => this.getRenderContext();
373
+
374
+ appLogger.debug(`[BunServerAdapter] Building server settings`);
375
+
376
+ const finalOptions: BunServeOptions = {
377
+ ...serverOptions,
378
+ async fetch(this: Server<unknown>, request: Request, _server: Server<unknown>) {
379
+ try {
380
+ await waitForInit();
381
+ return await handleReq(request);
382
+ } catch (error) {
383
+ if (error instanceof Response) return error;
384
+ if (errorHandler) {
385
+ try {
386
+ const locals: Record<string, unknown> = {};
387
+ const context: ApiHandlerContext<Request, BunServerInstance> = {
388
+ request,
389
+ params: {},
390
+ response: new ApiResponseBuilder(),
391
+ server: _server as BunServerInstance,
392
+ locals,
393
+ require: createRequire((): Record<string, unknown> => locals),
394
+ services: {
395
+ cache: getCacheService(),
396
+ },
397
+ ...getRenderContext(),
398
+ };
399
+
400
+ return await errorHandler(error, context);
401
+ } catch (handlerError) {
402
+ appLogger.error(`[ecopages] Error in custom error handler: ${handlerError}`);
403
+ }
404
+ }
405
+ if (error instanceof HttpError) return error.toResponse();
406
+
407
+ appLogger.error(`[ecopages] Error handling request: ${error}`);
408
+ return new Response('Internal Server Error', { status: 500 });
409
+ }
410
+ },
411
+ error(this: Server<unknown>, error: Error) {
412
+ appLogger.error(`[ecopages] Error handling request: ${error}`);
413
+ return handleNoMatch(new Request('http://localhost'));
414
+ },
415
+ };
416
+
417
+ return finalOptions as unknown as BunServeOptions;
418
+ }
419
+
420
+ /**
421
+ * Generates a static build of the site for deployment.
422
+ * @param options.preview - If true, starts a preview server after build
423
+ */
424
+ public async buildStatic(options?: { preview?: boolean }): Promise<void> {
425
+ if (!this.fullyInitialized) {
426
+ await this.initializeSharedRouteHandling({
427
+ staticRoutes: this.staticRoutes,
428
+ hmrManager: this.hmrManager,
429
+ });
430
+ }
431
+
432
+ const buildRuntimeOrigin = this.serverInstance
433
+ ? `http://${this.serverInstance.hostname || DEFAULT_ECOPAGES_HOSTNAME}:${this.serverInstance.port || DEFAULT_ECOPAGES_PORT}`
434
+ : undefined;
435
+
436
+ await this.staticBuilder.build(
437
+ { ...options, preview: false, baseUrl: buildRuntimeOrigin },
438
+ {
439
+ router: this.router,
440
+ routeRendererFactory: this.routeRendererFactory,
441
+ staticRoutes: this.staticRoutes,
442
+ },
443
+ );
444
+
445
+ if (!options?.preview) {
446
+ return;
447
+ }
448
+
449
+ const previewHostname = this.serveOptions.hostname || DEFAULT_ECOPAGES_HOSTNAME;
450
+ const previewPort = Number(this.serveOptions.port || DEFAULT_ECOPAGES_PORT);
451
+ const activePreviewPort = await this.previewHost.start({
452
+ appConfig: this.appConfig,
453
+ hostname: String(previewHostname),
454
+ port: previewPort,
455
+ });
456
+
457
+ if (activePreviewPort) {
458
+ appLogger.info(`Preview running at http://${previewHostname}:${activePreviewPort}`);
459
+ return;
460
+ }
461
+ }
462
+
463
+ /**
464
+ * Initializes the server with dynamic routes after server creation.
465
+ * Must be called before handling any requests.
466
+ * @param server - The Bun server instance
467
+ */
468
+ public async completeInitialization(server?: BunServerInstance | null): Promise<void> {
469
+ if (this.fullyInitialized) {
470
+ if (server && !this.serverInstance) {
471
+ this.serverInstance = server;
472
+ }
473
+ return;
474
+ }
475
+
476
+ if (!this.initializationPromise) {
477
+ this.initializationPromise = this._performInitialization(server ?? null);
478
+ }
479
+
480
+ return this.initializationPromise;
481
+ }
482
+
483
+ /**
484
+ * Performs the one-time post-bind initialization path for Bun servers.
485
+ *
486
+ * @remarks
487
+ * This is intentionally split from `initialize()` because shared route handling
488
+ * and file watching need the live server instance to exist before Bun can
489
+ * reload updated route handlers in place.
490
+ */
491
+ private async _performInitialization(server: BunServerInstance | null): Promise<void> {
492
+ this.serverInstance = server;
493
+ appLogger.debug('Completing server initialization with dynamic routes');
494
+
495
+ await this.initializeSharedRouteHandling({
496
+ staticRoutes: this.staticRoutes,
497
+ hmrManager: this.hmrManager,
498
+ });
499
+
500
+ this.fullyInitialized = true;
501
+
502
+ if (this.options?.watch) await this.watch();
503
+
504
+ if (server && typeof server.reload === 'function') {
505
+ const updatedOptions = this.getServerOptions(this.options?.watch ? { enableHmr: true } : undefined);
506
+ server.reload(updatedOptions as BunNativeServeOptions);
507
+ appLogger.debug('Server routes updated with dynamic routes');
508
+ }
509
+ }
510
+
511
+ /**
512
+ * Creates and initializes the Bun server adapter.
513
+ * @returns Configured adapter with server methods
514
+ */
515
+ public async createAdapter(): Promise<BunServerAdapterResult> {
516
+ await this.initialize();
517
+
518
+ return {
519
+ getServerOptions: this.getServerOptions.bind(this),
520
+ buildStatic: this.buildStatic.bind(this),
521
+ completeInitialization: this.completeInitialization.bind(this),
522
+ handleRequest: this.handleRequest.bind(this),
523
+ };
524
+ }
525
+
526
+ /**
527
+ * Handles HTTP requests by passing them securely to the shared core router adapter.
528
+ *
529
+ * @remarks
530
+ * Filesystem page responses are wrapped by `ServerRouteHandler`. This
531
+ * adapter-level pass only covers HTML returned by explicit API handlers,
532
+ * which bypass that route-layer wrapper and would otherwise miss the
533
+ * dev HMR runtime — so the HMR script injection happens here, after
534
+ * the shared handler runs.
535
+ */
536
+ public async handleRequest(request: Request): Promise<Response> {
537
+ const response = await this.handleSharedRequest(request, {
538
+ apiHandlers: this.apiHandlers,
539
+ errorHandler: this.errorHandler,
540
+ serverInstance: this.serverInstance,
541
+ hmrManager: this.hmrManager,
542
+ });
543
+
544
+ return await this.maybeInjectHmrScript(response);
545
+ }
546
+
547
+ /**
548
+ * Ensures server initialization completes before request handling.
549
+ * Prevents race conditions during startup.
550
+ */
551
+ private async waitForInitialization(): Promise<void> {
552
+ if (this.fullyInitialized) {
553
+ return;
554
+ }
555
+
556
+ if (this.initializationPromise) {
557
+ return this.initializationPromise;
558
+ }
559
+
560
+ throw new Error('Server not initialized. Call completeInitialization() first.');
561
+ }
562
+
563
+ /**
564
+ * Handles HTTP requests from the router adapter.
565
+ */
566
+ public async handleResponse(request: Request): Promise<Response> {
567
+ await this.waitForInitialization();
568
+ return this.routeHandler.handleResponse(request);
569
+ }
570
+
571
+ /**
572
+ * Handles requests that do not match any routes.
573
+ */
574
+ private async handleNoMatch(request: Request): Promise<Response> {
575
+ await this.waitForInitialization();
576
+ return this.routeHandler.handleNoMatch(request);
577
+ }
578
+ }
579
+
580
+ /**
581
+ * Creates the Bun server adapter and fills in the runtime-specific collaborators
582
+ * that Bun callers usually leave implicit.
583
+ *
584
+ * @remarks
585
+ * This is the canonical entry point for Bun server-adapter construction. It
586
+ * guarantees that the concrete adapter receives a Bun websocket bridge, HMR
587
+ * manager, and preview host even though those dependencies are optional on the
588
+ * public params type.
589
+ */
590
+ export async function createBunServerAdapter(params: BunServerAdapterParams): Promise<BunServerAdapterResult> {
591
+ const runtimeOrigin = params.runtimeOrigin ?? resolveServeRuntimeOrigin(params.serveOptions);
592
+ const bridge = params.bridge ?? new ClientBridge();
593
+ const hmrManager = params.hmrManager ?? new HmrManager({ appConfig: params.appConfig, bridge });
594
+ const previewHost = params.previewHost ?? new BunStaticPreviewHost();
595
+
596
+ const adapter = new BunServerAdapter({
597
+ ...params,
598
+ runtimeOrigin,
599
+ bridge,
600
+ hmrManager,
601
+ previewHost,
602
+ });
603
+
604
+ return adapter.createAdapter();
605
+ }
@@ -0,0 +1,70 @@
1
+ import { StaticContentServer } from '../../dev/sc-server.ts';
2
+ import { appLogger } from '../../global/app-logger.ts';
3
+ import type { EcoPagesAppConfig } from '../../types/internal-types.ts';
4
+ import type { StaticPreviewHost, StaticPreviewHostStartOptions } from '../shared/static-preview-host.ts';
5
+
6
+ type BunStaticPreviewServer = {
7
+ server: {
8
+ port?: number;
9
+ } | null;
10
+ stop(): void;
11
+ };
12
+
13
+ type BunStaticPreviewServerFactory = {
14
+ createServer(args: { appConfig: EcoPagesAppConfig; options: { port: number } }): BunStaticPreviewServer;
15
+ };
16
+
17
+ type BunStaticPreviewLogger = {
18
+ error(message: string): unknown;
19
+ };
20
+
21
+ export class BunStaticPreviewHost implements StaticPreviewHost {
22
+ private previewServer: BunStaticPreviewServer | null = null;
23
+
24
+ constructor(
25
+ private readonly previewServerFactory: BunStaticPreviewServerFactory = StaticContentServer,
26
+ private readonly logger: BunStaticPreviewLogger = appLogger,
27
+ ) {}
28
+
29
+ public async start(options: StaticPreviewHostStartOptions): Promise<number | null> {
30
+ await this.stop();
31
+ await new Promise((resolve) => setTimeout(resolve, 100));
32
+
33
+ for (let attempt = 0; attempt < 20; attempt += 1) {
34
+ try {
35
+ this.previewServer = this.previewServerFactory.createServer({
36
+ appConfig: options.appConfig,
37
+ options: { port: options.port },
38
+ });
39
+
40
+ const previewPort = this.previewServer.server?.port;
41
+ if (previewPort) {
42
+ return previewPort;
43
+ }
44
+
45
+ break;
46
+ } catch (error) {
47
+ const errorMessage = error instanceof Error ? error.message : String(error);
48
+ const errorCode =
49
+ typeof error === 'object' && error !== null && 'code' in error
50
+ ? String((error as { code?: unknown }).code)
51
+ : undefined;
52
+ const isPortReleaseRace = errorCode === 'EADDRINUSE' || errorMessage.includes('EADDRINUSE');
53
+
54
+ if (!isPortReleaseRace || attempt === 19) {
55
+ throw error;
56
+ }
57
+
58
+ await new Promise((resolve) => setTimeout(resolve, 100));
59
+ }
60
+ }
61
+
62
+ this.logger.error('Failed to start preview server');
63
+ return null;
64
+ }
65
+
66
+ public async stop(): Promise<void> {
67
+ this.previewServer?.stop();
68
+ this.previewServer = null;
69
+ }
70
+ }
@@ -0,0 +1,10 @@
1
+ import { describe, expect, it } from 'vitest';
2
+ import { createApp } from './create-app.ts';
3
+
4
+ describe('createApp', () => {
5
+ it('falls back to Node adapter when Bun is not available', async () => {
6
+ const app = await createApp({ appConfig: {} as never });
7
+ expect(app).toBeDefined();
8
+ expect(typeof app.fetch).toBe('function');
9
+ });
10
+ });