@ecopages/core 0.2.0-alpha.1

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 (342) hide show
  1. package/CHANGELOG.md +89 -0
  2. package/LICENSE +21 -0
  3. package/README.md +32 -0
  4. package/package.json +279 -0
  5. package/src/adapters/abstract/application-adapter.d.ts +168 -0
  6. package/src/adapters/abstract/application-adapter.js +109 -0
  7. package/src/adapters/abstract/application-adapter.ts +337 -0
  8. package/src/adapters/abstract/router-adapter.d.ts +26 -0
  9. package/src/adapters/abstract/router-adapter.js +5 -0
  10. package/src/adapters/abstract/router-adapter.ts +30 -0
  11. package/src/adapters/abstract/server-adapter.d.ts +69 -0
  12. package/src/adapters/abstract/server-adapter.js +15 -0
  13. package/src/adapters/abstract/server-adapter.ts +79 -0
  14. package/src/adapters/bun/client-bridge.d.ts +34 -0
  15. package/src/adapters/bun/client-bridge.js +48 -0
  16. package/src/adapters/bun/client-bridge.ts +62 -0
  17. package/src/adapters/bun/create-app.d.ts +60 -0
  18. package/src/adapters/bun/create-app.js +117 -0
  19. package/src/adapters/bun/create-app.ts +189 -0
  20. package/src/adapters/bun/define-api-handler.d.ts +61 -0
  21. package/src/adapters/bun/define-api-handler.js +15 -0
  22. package/src/adapters/bun/define-api-handler.ts +114 -0
  23. package/src/adapters/bun/hmr-manager.d.ts +84 -0
  24. package/src/adapters/bun/hmr-manager.js +227 -0
  25. package/src/adapters/bun/hmr-manager.ts +281 -0
  26. package/src/adapters/bun/index.d.ts +3 -0
  27. package/src/adapters/bun/index.js +8 -0
  28. package/src/adapters/bun/index.ts +3 -0
  29. package/src/adapters/bun/server-adapter.d.ts +155 -0
  30. package/src/adapters/bun/server-adapter.js +368 -0
  31. package/src/adapters/bun/server-adapter.ts +492 -0
  32. package/src/adapters/bun/server-lifecycle.d.ts +52 -0
  33. package/src/adapters/bun/server-lifecycle.js +120 -0
  34. package/src/adapters/bun/server-lifecycle.ts +154 -0
  35. package/src/adapters/index.d.ts +6 -0
  36. package/src/adapters/index.js +14 -0
  37. package/src/adapters/index.ts +6 -0
  38. package/src/adapters/node/create-app.d.ts +21 -0
  39. package/src/adapters/node/create-app.js +143 -0
  40. package/src/adapters/node/create-app.ts +179 -0
  41. package/src/adapters/node/index.d.ts +4 -0
  42. package/src/adapters/node/index.js +8 -0
  43. package/src/adapters/node/index.ts +9 -0
  44. package/src/adapters/node/node-client-bridge.d.ts +26 -0
  45. package/src/adapters/node/node-client-bridge.js +66 -0
  46. package/src/adapters/node/node-client-bridge.ts +79 -0
  47. package/src/adapters/node/node-hmr-manager.d.ts +62 -0
  48. package/src/adapters/node/node-hmr-manager.js +221 -0
  49. package/src/adapters/node/node-hmr-manager.ts +271 -0
  50. package/src/adapters/node/server-adapter.d.ts +190 -0
  51. package/src/adapters/node/server-adapter.js +420 -0
  52. package/src/adapters/node/server-adapter.ts +561 -0
  53. package/src/adapters/node/static-content-server.d.ts +24 -0
  54. package/src/adapters/node/static-content-server.js +166 -0
  55. package/src/adapters/node/static-content-server.ts +203 -0
  56. package/src/adapters/shared/api-response.d.ts +52 -0
  57. package/src/adapters/shared/api-response.js +96 -0
  58. package/src/adapters/shared/api-response.ts +104 -0
  59. package/src/adapters/shared/application-adapter.d.ts +18 -0
  60. package/src/adapters/shared/application-adapter.js +90 -0
  61. package/src/adapters/shared/application-adapter.ts +199 -0
  62. package/src/adapters/shared/explicit-static-route-matcher.d.ts +38 -0
  63. package/src/adapters/shared/explicit-static-route-matcher.js +100 -0
  64. package/src/adapters/shared/explicit-static-route-matcher.ts +134 -0
  65. package/src/adapters/shared/file-route-middleware-pipeline.d.ts +65 -0
  66. package/src/adapters/shared/file-route-middleware-pipeline.js +98 -0
  67. package/src/adapters/shared/file-route-middleware-pipeline.ts +123 -0
  68. package/src/adapters/shared/fs-server-response-factory.d.ts +19 -0
  69. package/src/adapters/shared/fs-server-response-factory.js +97 -0
  70. package/src/adapters/shared/fs-server-response-factory.ts +118 -0
  71. package/src/adapters/shared/fs-server-response-matcher.d.ts +71 -0
  72. package/src/adapters/shared/fs-server-response-matcher.js +155 -0
  73. package/src/adapters/shared/fs-server-response-matcher.ts +198 -0
  74. package/src/adapters/shared/render-context.d.ts +14 -0
  75. package/src/adapters/shared/render-context.js +69 -0
  76. package/src/adapters/shared/render-context.ts +105 -0
  77. package/src/adapters/shared/server-adapter.d.ts +87 -0
  78. package/src/adapters/shared/server-adapter.js +353 -0
  79. package/src/adapters/shared/server-adapter.ts +442 -0
  80. package/src/adapters/shared/server-route-handler.d.ts +89 -0
  81. package/src/adapters/shared/server-route-handler.js +120 -0
  82. package/src/adapters/shared/server-route-handler.ts +166 -0
  83. package/src/adapters/shared/server-static-builder.d.ts +38 -0
  84. package/src/adapters/shared/server-static-builder.js +46 -0
  85. package/src/adapters/shared/server-static-builder.ts +82 -0
  86. package/src/build/build-adapter.d.ts +74 -0
  87. package/src/build/build-adapter.js +54 -0
  88. package/src/build/build-adapter.ts +132 -0
  89. package/src/build/build-types.d.ts +57 -0
  90. package/src/build/build-types.js +0 -0
  91. package/src/build/build-types.ts +83 -0
  92. package/src/build/esbuild-build-adapter.d.ts +69 -0
  93. package/src/build/esbuild-build-adapter.js +390 -0
  94. package/src/build/esbuild-build-adapter.ts +510 -0
  95. package/src/config/config-builder.d.ts +227 -0
  96. package/src/config/config-builder.js +392 -0
  97. package/src/config/config-builder.ts +474 -0
  98. package/src/constants.d.ts +32 -0
  99. package/src/constants.js +21 -0
  100. package/src/constants.ts +39 -0
  101. package/src/create-app.d.ts +17 -0
  102. package/src/create-app.js +66 -0
  103. package/src/create-app.ts +87 -0
  104. package/src/declarations.d.ts +26 -0
  105. package/src/define-api-handler.d.ts +25 -0
  106. package/src/define-api-handler.js +15 -0
  107. package/src/define-api-handler.ts +66 -0
  108. package/src/dev/sc-server.d.ts +30 -0
  109. package/src/dev/sc-server.js +111 -0
  110. package/src/dev/sc-server.ts +143 -0
  111. package/src/eco/README.md +636 -0
  112. package/src/eco/component-render-context.d.ts +105 -0
  113. package/src/eco/component-render-context.js +77 -0
  114. package/src/eco/component-render-context.ts +202 -0
  115. package/src/eco/eco.d.ts +9 -0
  116. package/src/eco/eco.js +110 -0
  117. package/src/eco/eco.ts +221 -0
  118. package/src/eco/eco.types.d.ts +170 -0
  119. package/src/eco/eco.types.js +0 -0
  120. package/src/eco/eco.types.ts +202 -0
  121. package/src/eco/eco.utils.d.ts +40 -0
  122. package/src/eco/eco.utils.js +40 -0
  123. package/src/eco/eco.utils.ts +89 -0
  124. package/src/eco/global-injector-map.d.ts +16 -0
  125. package/src/eco/global-injector-map.js +80 -0
  126. package/src/eco/global-injector-map.ts +112 -0
  127. package/src/eco/lazy-injector-map.d.ts +8 -0
  128. package/src/eco/lazy-injector-map.js +70 -0
  129. package/src/eco/lazy-injector-map.ts +120 -0
  130. package/src/eco/module-dependencies.d.ts +18 -0
  131. package/src/eco/module-dependencies.js +49 -0
  132. package/src/eco/module-dependencies.ts +75 -0
  133. package/src/env.d.ts +20 -0
  134. package/src/errors/http-error.d.ts +31 -0
  135. package/src/errors/http-error.js +50 -0
  136. package/src/errors/http-error.ts +72 -0
  137. package/src/errors/index.d.ts +2 -0
  138. package/src/errors/index.js +4 -0
  139. package/src/errors/index.ts +2 -0
  140. package/src/errors/locals-access-error.d.ts +4 -0
  141. package/src/errors/locals-access-error.js +9 -0
  142. package/src/errors/locals-access-error.ts +7 -0
  143. package/src/global/app-logger.d.ts +2 -0
  144. package/src/global/app-logger.js +6 -0
  145. package/src/global/app-logger.ts +4 -0
  146. 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
  147. package/src/hmr/client/__screenshots__/hmr-runtime.test.browser.ts/HMR-Runtime-HMR-Server-Integration-should-load-fixture-app-page-1.png +0 -0
  148. package/src/hmr/client/__screenshots__/hmr-runtime.test.browser.ts/HMR-Runtime-WebSocket-Connection-should-connect-to-correct-HMR-endpoint-1.png +0 -0
  149. package/src/hmr/client/hmr-runtime.d.ts +10 -0
  150. package/src/hmr/client/hmr-runtime.js +86 -0
  151. package/src/hmr/client/hmr-runtime.ts +121 -0
  152. package/src/hmr/hmr-strategy.d.ts +159 -0
  153. package/src/hmr/hmr-strategy.js +29 -0
  154. package/src/hmr/hmr-strategy.ts +172 -0
  155. package/src/hmr/hmr.test.e2e.d.ts +1 -0
  156. package/src/hmr/hmr.test.e2e.js +50 -0
  157. package/src/hmr/hmr.test.e2e.ts +75 -0
  158. package/src/hmr/strategies/default-hmr-strategy.d.ts +43 -0
  159. package/src/hmr/strategies/default-hmr-strategy.js +34 -0
  160. package/src/hmr/strategies/default-hmr-strategy.ts +60 -0
  161. package/src/hmr/strategies/js-hmr-strategy.d.ts +136 -0
  162. package/src/hmr/strategies/js-hmr-strategy.js +179 -0
  163. package/src/hmr/strategies/js-hmr-strategy.ts +308 -0
  164. package/src/index.browser.d.ts +3 -0
  165. package/src/index.browser.js +4 -0
  166. package/src/index.browser.ts +3 -0
  167. package/src/index.d.ts +5 -0
  168. package/src/index.js +10 -0
  169. package/src/index.ts +5 -0
  170. package/src/integrations/ghtml/ghtml-renderer.d.ts +15 -0
  171. package/src/integrations/ghtml/ghtml-renderer.js +60 -0
  172. package/src/integrations/ghtml/ghtml-renderer.ts +93 -0
  173. package/src/integrations/ghtml/ghtml.plugin.d.ts +20 -0
  174. package/src/integrations/ghtml/ghtml.plugin.js +21 -0
  175. package/src/integrations/ghtml/ghtml.plugin.ts +32 -0
  176. package/src/internal-types.d.ts +200 -0
  177. package/src/internal-types.js +0 -0
  178. package/src/internal-types.ts +212 -0
  179. package/src/plugins/alias-resolver-plugin.d.ts +2 -0
  180. package/src/plugins/alias-resolver-plugin.js +39 -0
  181. package/src/plugins/alias-resolver-plugin.ts +45 -0
  182. package/src/plugins/eco-component-meta-plugin.d.ts +95 -0
  183. package/src/plugins/eco-component-meta-plugin.js +157 -0
  184. package/src/plugins/eco-component-meta-plugin.ts +474 -0
  185. package/src/plugins/integration-plugin.d.ts +102 -0
  186. package/src/plugins/integration-plugin.js +100 -0
  187. package/src/plugins/integration-plugin.ts +184 -0
  188. package/src/plugins/processor.d.ts +82 -0
  189. package/src/plugins/processor.js +122 -0
  190. package/src/plugins/processor.ts +220 -0
  191. package/src/public-types.d.ts +1094 -0
  192. package/src/public-types.js +0 -0
  193. package/src/public-types.ts +1255 -0
  194. package/src/route-renderer/GRAPH.md +387 -0
  195. package/src/route-renderer/README.md +135 -0
  196. package/src/route-renderer/component-graph-executor.d.ts +32 -0
  197. package/src/route-renderer/component-graph-executor.js +31 -0
  198. package/src/route-renderer/component-graph-executor.ts +84 -0
  199. package/src/route-renderer/component-graph.d.ts +42 -0
  200. package/src/route-renderer/component-graph.js +72 -0
  201. package/src/route-renderer/component-graph.ts +159 -0
  202. package/src/route-renderer/component-marker.d.ts +52 -0
  203. package/src/route-renderer/component-marker.js +46 -0
  204. package/src/route-renderer/component-marker.ts +117 -0
  205. package/src/route-renderer/dependency-resolver.d.ts +24 -0
  206. package/src/route-renderer/dependency-resolver.js +428 -0
  207. package/src/route-renderer/dependency-resolver.ts +596 -0
  208. package/src/route-renderer/html-post-processing.service.d.ts +40 -0
  209. package/src/route-renderer/html-post-processing.service.js +86 -0
  210. package/src/route-renderer/html-post-processing.service.ts +103 -0
  211. package/src/route-renderer/integration-renderer.d.ts +339 -0
  212. package/src/route-renderer/integration-renderer.js +526 -0
  213. package/src/route-renderer/integration-renderer.ts +696 -0
  214. package/src/route-renderer/marker-graph-resolver.d.ts +76 -0
  215. package/src/route-renderer/marker-graph-resolver.js +93 -0
  216. package/src/route-renderer/marker-graph-resolver.ts +153 -0
  217. package/src/route-renderer/page-module-loader.d.ts +61 -0
  218. package/src/route-renderer/page-module-loader.js +102 -0
  219. package/src/route-renderer/page-module-loader.ts +153 -0
  220. package/src/route-renderer/render-execution.service.d.ts +69 -0
  221. package/src/route-renderer/render-execution.service.js +91 -0
  222. package/src/route-renderer/render-execution.service.ts +158 -0
  223. package/src/route-renderer/render-preparation.service.d.ts +112 -0
  224. package/src/route-renderer/render-preparation.service.js +243 -0
  225. package/src/route-renderer/render-preparation.service.ts +358 -0
  226. package/src/route-renderer/route-renderer.d.ts +26 -0
  227. package/src/route-renderer/route-renderer.js +68 -0
  228. package/src/route-renderer/route-renderer.ts +80 -0
  229. package/src/router/fs-router-scanner.d.ts +41 -0
  230. package/src/router/fs-router-scanner.js +155 -0
  231. package/src/router/fs-router-scanner.ts +217 -0
  232. package/src/router/fs-router.d.ts +26 -0
  233. package/src/router/fs-router.js +100 -0
  234. package/src/router/fs-router.ts +122 -0
  235. package/src/services/asset-processing-service/asset-processing.service.d.ts +41 -0
  236. package/src/services/asset-processing-service/asset-processing.service.js +250 -0
  237. package/src/services/asset-processing-service/asset-processing.service.ts +306 -0
  238. package/src/services/asset-processing-service/asset.factory.d.ts +17 -0
  239. package/src/services/asset-processing-service/asset.factory.js +82 -0
  240. package/src/services/asset-processing-service/asset.factory.ts +105 -0
  241. package/src/services/asset-processing-service/assets.types.d.ts +88 -0
  242. package/src/services/asset-processing-service/assets.types.js +0 -0
  243. package/src/services/asset-processing-service/assets.types.ts +112 -0
  244. package/src/services/asset-processing-service/index.d.ts +3 -0
  245. package/src/services/asset-processing-service/index.js +3 -0
  246. package/src/services/asset-processing-service/index.ts +3 -0
  247. package/src/services/asset-processing-service/processor.interface.d.ts +22 -0
  248. package/src/services/asset-processing-service/processor.interface.js +6 -0
  249. package/src/services/asset-processing-service/processor.interface.ts +27 -0
  250. package/src/services/asset-processing-service/processor.registry.d.ts +8 -0
  251. package/src/services/asset-processing-service/processor.registry.js +15 -0
  252. package/src/services/asset-processing-service/processor.registry.ts +18 -0
  253. package/src/services/asset-processing-service/processors/base/base-processor.d.ts +24 -0
  254. package/src/services/asset-processing-service/processors/base/base-processor.js +59 -0
  255. package/src/services/asset-processing-service/processors/base/base-processor.ts +76 -0
  256. package/src/services/asset-processing-service/processors/base/base-script-processor.d.ts +16 -0
  257. package/src/services/asset-processing-service/processors/base/base-script-processor.js +80 -0
  258. package/src/services/asset-processing-service/processors/base/base-script-processor.ts +105 -0
  259. package/src/services/asset-processing-service/processors/index.d.ts +5 -0
  260. package/src/services/asset-processing-service/processors/index.js +5 -0
  261. package/src/services/asset-processing-service/processors/index.ts +5 -0
  262. package/src/services/asset-processing-service/processors/script/content-script.processor.d.ts +5 -0
  263. package/src/services/asset-processing-service/processors/script/content-script.processor.js +57 -0
  264. package/src/services/asset-processing-service/processors/script/content-script.processor.ts +66 -0
  265. package/src/services/asset-processing-service/processors/script/file-script.processor.d.ts +8 -0
  266. package/src/services/asset-processing-service/processors/script/file-script.processor.js +76 -0
  267. package/src/services/asset-processing-service/processors/script/file-script.processor.ts +88 -0
  268. package/src/services/asset-processing-service/processors/script/node-module-script.processor.d.ts +7 -0
  269. package/src/services/asset-processing-service/processors/script/node-module-script.processor.js +74 -0
  270. package/src/services/asset-processing-service/processors/script/node-module-script.processor.ts +84 -0
  271. package/src/services/asset-processing-service/processors/stylesheet/content-stylesheet.processor.d.ts +5 -0
  272. package/src/services/asset-processing-service/processors/stylesheet/content-stylesheet.processor.js +25 -0
  273. package/src/services/asset-processing-service/processors/stylesheet/content-stylesheet.processor.ts +27 -0
  274. package/src/services/asset-processing-service/processors/stylesheet/file-stylesheet.processor.d.ts +9 -0
  275. package/src/services/asset-processing-service/processors/stylesheet/file-stylesheet.processor.js +63 -0
  276. package/src/services/asset-processing-service/processors/stylesheet/file-stylesheet.processor.ts +77 -0
  277. package/src/services/cache/cache.types.d.ts +107 -0
  278. package/src/services/cache/cache.types.js +0 -0
  279. package/src/services/cache/cache.types.ts +126 -0
  280. package/src/services/cache/index.d.ts +7 -0
  281. package/src/services/cache/index.js +7 -0
  282. package/src/services/cache/index.ts +18 -0
  283. package/src/services/cache/memory-cache-store.d.ts +42 -0
  284. package/src/services/cache/memory-cache-store.js +98 -0
  285. package/src/services/cache/memory-cache-store.ts +130 -0
  286. package/src/services/cache/page-cache-service.d.ts +70 -0
  287. package/src/services/cache/page-cache-service.js +152 -0
  288. package/src/services/cache/page-cache-service.ts +202 -0
  289. package/src/services/html-transformer.service.d.ts +50 -0
  290. package/src/services/html-transformer.service.js +163 -0
  291. package/src/services/html-transformer.service.ts +217 -0
  292. package/src/services/page-module-import.service.d.ts +37 -0
  293. package/src/services/page-module-import.service.js +88 -0
  294. package/src/services/page-module-import.service.ts +129 -0
  295. package/src/services/page-request-cache-coordinator.service.d.ts +75 -0
  296. package/src/services/page-request-cache-coordinator.service.js +107 -0
  297. package/src/services/page-request-cache-coordinator.service.ts +128 -0
  298. package/src/services/schema-validation-service.d.ts +122 -0
  299. package/src/services/schema-validation-service.js +101 -0
  300. package/src/services/schema-validation-service.ts +204 -0
  301. package/src/services/validation/standard-schema.types.d.ts +65 -0
  302. package/src/services/validation/standard-schema.types.js +0 -0
  303. package/src/services/validation/standard-schema.types.ts +68 -0
  304. package/src/static-site-generator/static-site-generator.d.ts +57 -0
  305. package/src/static-site-generator/static-site-generator.js +272 -0
  306. package/src/static-site-generator/static-site-generator.ts +359 -0
  307. package/src/utils/css.d.ts +1 -0
  308. package/src/utils/css.js +7 -0
  309. package/src/utils/css.ts +5 -0
  310. package/src/utils/deep-merge.d.ts +14 -0
  311. package/src/utils/deep-merge.js +32 -0
  312. package/src/utils/deep-merge.ts +47 -0
  313. package/src/utils/hash.d.ts +1 -0
  314. package/src/utils/hash.js +7 -0
  315. package/src/utils/hash.ts +5 -0
  316. package/src/utils/html.d.ts +1 -0
  317. package/src/utils/html.js +4 -0
  318. package/src/utils/html.ts +1 -0
  319. package/src/utils/invariant.d.ts +5 -0
  320. package/src/utils/invariant.js +11 -0
  321. package/src/utils/invariant.ts +15 -0
  322. package/src/utils/locals-utils.d.ts +15 -0
  323. package/src/utils/locals-utils.js +24 -0
  324. package/src/utils/locals-utils.ts +37 -0
  325. package/src/utils/parse-cli-args.d.ts +24 -0
  326. package/src/utils/parse-cli-args.js +47 -0
  327. package/src/utils/parse-cli-args.ts +83 -0
  328. package/src/utils/path-utils.module.d.ts +5 -0
  329. package/src/utils/path-utils.module.js +14 -0
  330. package/src/utils/path-utils.module.ts +14 -0
  331. package/src/utils/runtime.d.ts +11 -0
  332. package/src/utils/runtime.js +40 -0
  333. package/src/utils/runtime.ts +44 -0
  334. package/src/utils/server-utils.module.d.ts +19 -0
  335. package/src/utils/server-utils.module.js +56 -0
  336. package/src/utils/server-utils.module.ts +67 -0
  337. package/src/watchers/project-watcher.d.ts +120 -0
  338. package/src/watchers/project-watcher.js +238 -0
  339. package/src/watchers/project-watcher.test-helpers.d.ts +4 -0
  340. package/src/watchers/project-watcher.test-helpers.js +51 -0
  341. package/src/watchers/project-watcher.test-helpers.ts +40 -0
  342. package/src/watchers/project-watcher.ts +306 -0
@@ -0,0 +1,87 @@
1
+ import type { EcopagesAppOptions as BunOptions } from './adapters/bun/create-app.ts';
2
+ import type { EcopagesAppOptions as NodeOptions } from './adapters/node/create-app.ts';
3
+ import { AbstractApplicationAdapter } from './adapters/abstract/application-adapter.ts';
4
+ import type { ApiHandler } from './public-types.ts';
5
+ import { SharedApplicationAdapter } from './adapters/shared/application-adapter.ts';
6
+
7
+ export type EcopagesAppOptions = BunOptions | NodeOptions;
8
+ export type UniversalEcopagesApp = AbstractApplicationAdapter<EcopagesAppOptions, any, Request>;
9
+
10
+ async function createRuntimeApp<WebSocketData = undefined>(options: EcopagesAppOptions): Promise<UniversalEcopagesApp> {
11
+ const bun = (globalThis as { Bun?: unknown }).Bun;
12
+
13
+ if (bun) {
14
+ const { createApp: createBunApp } = await import('./adapters/bun/create-app.ts');
15
+ return (await createBunApp<WebSocketData>(options as BunOptions)) as unknown as UniversalEcopagesApp;
16
+ }
17
+
18
+ const { createNodeApp } = await import('./adapters/node/create-app.ts');
19
+ return (await createNodeApp(options as NodeOptions)) as unknown as UniversalEcopagesApp;
20
+ }
21
+
22
+ export async function createApp<WebSocketData = undefined>(options: EcopagesAppOptions): Promise<UniversalEcopagesApp> {
23
+ return createRuntimeApp<WebSocketData>(options);
24
+ }
25
+
26
+ export class EcopagesApp extends SharedApplicationAdapter<EcopagesAppOptions, unknown, Request> {
27
+ private readonly appOptions: EcopagesAppOptions;
28
+ private runtimeApp: UniversalEcopagesApp | null = null;
29
+ private runtimeAppPromise: Promise<UniversalEcopagesApp> | null = null;
30
+
31
+ constructor(options: EcopagesAppOptions) {
32
+ super(options);
33
+ this.appOptions = options;
34
+ }
35
+
36
+ private async getRuntimeApp(): Promise<UniversalEcopagesApp> {
37
+ if (this.runtimeApp) {
38
+ return this.runtimeApp;
39
+ }
40
+
41
+ if (!this.runtimeAppPromise) {
42
+ this.runtimeAppPromise = createRuntimeApp({
43
+ ...this.appOptions,
44
+ clearOutput: false,
45
+ }).then((app) => {
46
+ for (const handler of this.apiHandlers) {
47
+ app.add(handler as ApiHandler<string, Request, any>);
48
+ }
49
+
50
+ for (const route of this.staticRoutes) {
51
+ app.static(route.path, route.loader);
52
+ }
53
+
54
+ if (this.errorHandler) {
55
+ app.onError(this.errorHandler);
56
+ }
57
+
58
+ this.runtimeApp = app;
59
+ return app;
60
+ });
61
+ }
62
+
63
+ return this.runtimeAppPromise;
64
+ }
65
+
66
+ protected async initializeServerAdapter(): Promise<UniversalEcopagesApp> {
67
+ return this.getRuntimeApp();
68
+ }
69
+
70
+ async start(): Promise<unknown> {
71
+ const runtimeApp = await this.getRuntimeApp();
72
+ return runtimeApp.start();
73
+ }
74
+
75
+ async fetch(request: Request): Promise<Response> {
76
+ const runtimeApp = await this.getRuntimeApp();
77
+ const candidate = runtimeApp as UniversalEcopagesApp & {
78
+ fetch?: (request: Request) => Promise<Response>;
79
+ };
80
+
81
+ if (!candidate.fetch) {
82
+ throw new Error('The selected runtime adapter does not expose fetch()');
83
+ }
84
+
85
+ return candidate.fetch(request);
86
+ }
87
+ }
@@ -0,0 +1,26 @@
1
+ import type { EcoPagesAppConfig } from './internal-types';
2
+
3
+ type HMRHandler = (url: string) => Promise<void>;
4
+
5
+ type ReloadPageFunction = (options: { clearCache: boolean }) => Promise<void>;
6
+
7
+ declare global {
8
+ var ecoConfig: EcoPagesAppConfig;
9
+
10
+ interface Window {
11
+ /** Registered HMR handlers for specific module paths */
12
+ __ecopages_hmr_handlers__?: Record<string, HMRHandler>;
13
+ /** Function to reload the current page, used for layout updates */
14
+ __ecopages_reload_current_page__?: ReloadPageFunction;
15
+ /** Page data registry - contains module path and props for current page */
16
+ __ECO_PAGE__?: {
17
+ module: string;
18
+ props: Record<string, unknown>;
19
+ };
20
+ }
21
+ }
22
+
23
+ declare module '*.css' {
24
+ const styles: string;
25
+ export default styles;
26
+ }
@@ -0,0 +1,25 @@
1
+ import type { ApiHandler, ApiHandlerContext, Middleware, RouteSchema, TypedGroupHandlerContext } from './public-types.js';
2
+ type UniversalContext = ApiHandlerContext<Request, unknown>;
3
+ type SchemaHandlerContext<TSchema extends RouteSchema | undefined, TContext extends UniversalContext> = TSchema extends RouteSchema ? TypedGroupHandlerContext<TSchema, TContext> : TContext;
4
+ export declare function defineApiHandler<TPath extends string, TSchema extends RouteSchema | undefined = undefined, TContext extends UniversalContext = UniversalContext>(handler: Omit<ApiHandler<TPath, Request, unknown>, 'handler' | 'middleware' | 'schema'> & {
5
+ handler: (context: SchemaHandlerContext<TSchema, TContext>) => Promise<Response> | Response;
6
+ middleware?: Middleware<Request, unknown, TContext>[];
7
+ schema?: TSchema;
8
+ }): ApiHandler<TPath, Request, unknown>;
9
+ export interface GroupHandler<TPrefix extends string = string> {
10
+ prefix: TPrefix;
11
+ middleware?: readonly Middleware<Request, unknown, any>[];
12
+ routes: readonly ApiHandler<string, Request, unknown>[];
13
+ }
14
+ type GroupDefineHandler<TContext extends UniversalContext> = <const TPath extends string, TSchema extends RouteSchema | undefined = undefined>(handler: Omit<ApiHandler<TPath, Request, unknown>, 'handler' | 'middleware' | 'schema'> & {
15
+ path: TPath;
16
+ handler: (context: SchemaHandlerContext<TSchema, TContext>) => Promise<Response> | Response;
17
+ middleware?: Middleware<Request, unknown, TContext>[];
18
+ schema?: TSchema;
19
+ }) => ApiHandler<TPath, Request, unknown>;
20
+ export declare function defineGroupHandler<TPrefix extends string, TMiddleware extends readonly Middleware<Request, unknown, any>[] = [], TContext extends UniversalContext = TMiddleware extends readonly Middleware<Request, unknown, infer TGroupContext>[] ? TGroupContext : UniversalContext>(config: {
21
+ prefix: TPrefix;
22
+ middleware?: TMiddleware;
23
+ routes: (define: GroupDefineHandler<TContext>) => readonly ApiHandler<string, Request, unknown>[];
24
+ }): GroupHandler<TPrefix>;
25
+ export {};
@@ -0,0 +1,15 @@
1
+ function defineApiHandler(handler) {
2
+ return handler;
3
+ }
4
+ function defineGroupHandler(config) {
5
+ const define = ((handler) => handler);
6
+ return {
7
+ prefix: config.prefix,
8
+ middleware: config.middleware,
9
+ routes: config.routes(define)
10
+ };
11
+ }
12
+ export {
13
+ defineApiHandler,
14
+ defineGroupHandler
15
+ };
@@ -0,0 +1,66 @@
1
+ import type {
2
+ ApiHandler,
3
+ ApiHandlerContext,
4
+ Middleware,
5
+ RouteSchema,
6
+ TypedGroupHandlerContext,
7
+ } from './public-types.ts';
8
+
9
+ type UniversalContext = ApiHandlerContext<Request, unknown>;
10
+
11
+ type SchemaHandlerContext<
12
+ TSchema extends RouteSchema | undefined,
13
+ TContext extends UniversalContext,
14
+ > = TSchema extends RouteSchema ? TypedGroupHandlerContext<TSchema, TContext> : TContext;
15
+
16
+ export function defineApiHandler<
17
+ TPath extends string,
18
+ TSchema extends RouteSchema | undefined = undefined,
19
+ TContext extends UniversalContext = UniversalContext,
20
+ >(
21
+ handler: Omit<ApiHandler<TPath, Request, unknown>, 'handler' | 'middleware' | 'schema'> & {
22
+ handler: (context: SchemaHandlerContext<TSchema, TContext>) => Promise<Response> | Response;
23
+ middleware?: Middleware<Request, unknown, TContext>[];
24
+ schema?: TSchema;
25
+ },
26
+ ): ApiHandler<TPath, Request, unknown> {
27
+ return handler as ApiHandler<TPath, Request, unknown>;
28
+ }
29
+
30
+ export interface GroupHandler<TPrefix extends string = string> {
31
+ prefix: TPrefix;
32
+ middleware?: readonly Middleware<Request, unknown, any>[];
33
+ routes: readonly ApiHandler<string, Request, unknown>[];
34
+ }
35
+
36
+ type GroupDefineHandler<TContext extends UniversalContext> = <
37
+ const TPath extends string,
38
+ TSchema extends RouteSchema | undefined = undefined,
39
+ >(
40
+ handler: Omit<ApiHandler<TPath, Request, unknown>, 'handler' | 'middleware' | 'schema'> & {
41
+ path: TPath;
42
+ handler: (context: SchemaHandlerContext<TSchema, TContext>) => Promise<Response> | Response;
43
+ middleware?: Middleware<Request, unknown, TContext>[];
44
+ schema?: TSchema;
45
+ },
46
+ ) => ApiHandler<TPath, Request, unknown>;
47
+
48
+ export function defineGroupHandler<
49
+ TPrefix extends string,
50
+ TMiddleware extends readonly Middleware<Request, unknown, any>[] = [],
51
+ TContext extends UniversalContext = TMiddleware extends readonly Middleware<Request, unknown, infer TGroupContext>[]
52
+ ? TGroupContext
53
+ : UniversalContext,
54
+ >(config: {
55
+ prefix: TPrefix;
56
+ middleware?: TMiddleware;
57
+ routes: (define: GroupDefineHandler<TContext>) => readonly ApiHandler<string, Request, unknown>[];
58
+ }): GroupHandler<TPrefix> {
59
+ const define = ((handler) => handler) as GroupDefineHandler<TContext>;
60
+
61
+ return {
62
+ prefix: config.prefix,
63
+ middleware: config.middleware,
64
+ routes: config.routes(define),
65
+ };
66
+ }
@@ -0,0 +1,30 @@
1
+ import type { Server } from 'bun';
2
+ import type { EcoPagesAppConfig } from '../internal-types.js';
3
+ type StaticContentServerOptions = {
4
+ port?: number;
5
+ };
6
+ /**
7
+ * Static content server for production builds.
8
+ * Serves pre-built static files from the dist directory with gzip compression support.
9
+ */
10
+ export declare class StaticContentServer {
11
+ server: Server<unknown> | null;
12
+ private appConfig;
13
+ private options;
14
+ constructor({ appConfig, options }: {
15
+ appConfig: EcoPagesAppConfig;
16
+ options?: StaticContentServerOptions;
17
+ });
18
+ private shouldServeGzip;
19
+ private isHtml;
20
+ private sendNotFoundPage;
21
+ private serveFromDir;
22
+ fetch(request: Request): Promise<Response>;
23
+ private startServer;
24
+ stop(): void;
25
+ static createServer({ appConfig, options, }: {
26
+ appConfig: EcoPagesAppConfig;
27
+ options?: StaticContentServerOptions;
28
+ }): StaticContentServer;
29
+ }
30
+ export {};
@@ -0,0 +1,111 @@
1
+ import { extname, join } from "node:path";
2
+ import { STATUS_MESSAGE } from "../constants.js";
3
+ import { fileSystem } from "@ecopages/file-system";
4
+ import { ServerUtils } from "../utils/server-utils.module.js";
5
+ import { getRequiredBunRuntime } from "../utils/runtime.js";
6
+ class StaticContentServer {
7
+ server = null;
8
+ appConfig;
9
+ options = { port: 3e3 };
10
+ constructor({ appConfig, options }) {
11
+ this.appConfig = appConfig;
12
+ if (options) this.options = options;
13
+ this.startServer();
14
+ }
15
+ shouldServeGzip(contentType) {
16
+ return ["text/javascript", "text/css"].includes(contentType);
17
+ }
18
+ isHtml(contentType) {
19
+ return contentType === "text/html";
20
+ }
21
+ async sendNotFoundPage() {
22
+ const error404TemplatePath = `${this.appConfig.absolutePaths.distDir}/404.html`;
23
+ try {
24
+ fileSystem.exists(error404TemplatePath);
25
+ } catch {
26
+ return new Response(STATUS_MESSAGE[404], {
27
+ status: 404
28
+ });
29
+ }
30
+ const response = new Response(fileSystem.readFileAsBuffer(error404TemplatePath), {
31
+ headers: { "Content-Type": "text/html" }
32
+ });
33
+ return response;
34
+ }
35
+ async serveFromDir({ path, request }) {
36
+ const { absolutePaths } = this.appConfig;
37
+ const basePath = join(absolutePaths.distDir, path);
38
+ const contentType = ServerUtils.getContentType(extname(basePath));
39
+ const acceptsGzip = request.headers.get("Accept-Encoding")?.includes("gzip");
40
+ try {
41
+ if (acceptsGzip && this.shouldServeGzip(contentType)) {
42
+ const gzipPath = `${basePath}.gz`;
43
+ if (fileSystem.exists(gzipPath)) {
44
+ const file = fileSystem.readFileAsBuffer(gzipPath);
45
+ return new Response(file, {
46
+ headers: {
47
+ "Content-Type": contentType,
48
+ "Content-Encoding": "gzip",
49
+ Vary: "Accept-Encoding"
50
+ }
51
+ });
52
+ }
53
+ }
54
+ if (path.includes(".") && fileSystem.exists(basePath)) {
55
+ const file = fileSystem.readFileAsBuffer(basePath);
56
+ return new Response(file, {
57
+ headers: { "Content-Type": contentType }
58
+ });
59
+ }
60
+ const htmlCandidates = [`${basePath}.html`, `${basePath}/index.html`];
61
+ for (const candidate of htmlCandidates) {
62
+ if (fileSystem.exists(candidate)) {
63
+ const file = fileSystem.readFileAsBuffer(candidate);
64
+ return new Response(file, {
65
+ headers: {
66
+ "Content-Type": ServerUtils.getContentType(extname(candidate))
67
+ }
68
+ });
69
+ }
70
+ }
71
+ return this.sendNotFoundPage();
72
+ } catch {
73
+ return this.sendNotFoundPage();
74
+ }
75
+ }
76
+ async fetch(request) {
77
+ let reqPath = new URL(request.url).pathname;
78
+ if (reqPath === "/") reqPath = "/index.html";
79
+ const response = this.serveFromDir({
80
+ path: reqPath,
81
+ request
82
+ });
83
+ if (response) return response;
84
+ return new Response(STATUS_MESSAGE[404], {
85
+ status: 404
86
+ });
87
+ }
88
+ startServer() {
89
+ this.server = getRequiredBunRuntime().serve({
90
+ fetch: this.fetch.bind(this),
91
+ port: this.options.port
92
+ });
93
+ }
94
+ stop() {
95
+ if (this.server) {
96
+ this.server.stop(true);
97
+ }
98
+ }
99
+ static createServer({
100
+ appConfig,
101
+ options
102
+ }) {
103
+ return new StaticContentServer({
104
+ appConfig,
105
+ options
106
+ });
107
+ }
108
+ }
109
+ export {
110
+ StaticContentServer
111
+ };
@@ -0,0 +1,143 @@
1
+ import { extname, join } from 'node:path';
2
+ import { STATUS_MESSAGE } from '../constants.ts';
3
+ import { fileSystem } from '@ecopages/file-system';
4
+ import { ServerUtils } from '../utils/server-utils.module.ts';
5
+ import type { Server } from 'bun';
6
+ import type { EcoPagesAppConfig } from '../internal-types.ts';
7
+ import { getRequiredBunRuntime } from '../utils/runtime.ts';
8
+
9
+ type StaticContentServerOptions = {
10
+ port?: number;
11
+ };
12
+
13
+ /**
14
+ * Static content server for production builds.
15
+ * Serves pre-built static files from the dist directory with gzip compression support.
16
+ */
17
+ export class StaticContentServer {
18
+ server: Server<unknown> | null = null;
19
+ private appConfig: EcoPagesAppConfig;
20
+ private options: StaticContentServerOptions = { port: 3000 };
21
+
22
+ constructor({ appConfig, options }: { appConfig: EcoPagesAppConfig; options?: StaticContentServerOptions }) {
23
+ this.appConfig = appConfig;
24
+ if (options) this.options = options;
25
+ this.startServer();
26
+ }
27
+
28
+ private shouldServeGzip(contentType: ReturnType<typeof ServerUtils.getContentType>) {
29
+ return ['text/javascript', 'text/css'].includes(contentType);
30
+ }
31
+
32
+ private isHtml(contentType: string) {
33
+ return contentType === 'text/html';
34
+ }
35
+
36
+ private async sendNotFoundPage() {
37
+ const error404TemplatePath = `${this.appConfig.absolutePaths.distDir}/404.html`;
38
+
39
+ try {
40
+ fileSystem.exists(error404TemplatePath);
41
+ } catch {
42
+ return new Response(STATUS_MESSAGE[404], {
43
+ status: 404,
44
+ });
45
+ }
46
+
47
+ const response = new Response(fileSystem.readFileAsBuffer(error404TemplatePath) as BodyInit, {
48
+ headers: { 'Content-Type': 'text/html' },
49
+ });
50
+
51
+ return response;
52
+ }
53
+
54
+ private async serveFromDir({ path, request }: { path: string; request: Request }): Promise<Response> {
55
+ const { absolutePaths } = this.appConfig;
56
+ const basePath = join(absolutePaths.distDir, path);
57
+ const contentType = ServerUtils.getContentType(extname(basePath));
58
+ const acceptsGzip = request.headers.get('Accept-Encoding')?.includes('gzip');
59
+
60
+ try {
61
+ if (acceptsGzip && this.shouldServeGzip(contentType)) {
62
+ const gzipPath = `${basePath}.gz`;
63
+ if (fileSystem.exists(gzipPath)) {
64
+ const file = fileSystem.readFileAsBuffer(gzipPath) as BodyInit;
65
+ return new Response(file, {
66
+ headers: {
67
+ 'Content-Type': contentType,
68
+ 'Content-Encoding': 'gzip',
69
+ Vary: 'Accept-Encoding',
70
+ },
71
+ });
72
+ }
73
+ }
74
+
75
+ if (path.includes('.') && fileSystem.exists(basePath)) {
76
+ const file = fileSystem.readFileAsBuffer(basePath) as BodyInit;
77
+ return new Response(file, {
78
+ headers: { 'Content-Type': contentType },
79
+ });
80
+ }
81
+
82
+ const htmlCandidates = [`${basePath}.html`, `${basePath}/index.html`];
83
+
84
+ for (const candidate of htmlCandidates) {
85
+ if (fileSystem.exists(candidate)) {
86
+ const file = fileSystem.readFileAsBuffer(candidate) as BodyInit;
87
+ return new Response(file, {
88
+ headers: {
89
+ 'Content-Type': ServerUtils.getContentType(extname(candidate)),
90
+ },
91
+ });
92
+ }
93
+ }
94
+
95
+ return this.sendNotFoundPage();
96
+ } catch {
97
+ return this.sendNotFoundPage();
98
+ }
99
+ }
100
+
101
+ async fetch(request: Request) {
102
+ let reqPath = new URL(request.url).pathname;
103
+
104
+ if (reqPath === '/') reqPath = '/index.html';
105
+
106
+ const response = this.serveFromDir({
107
+ path: reqPath,
108
+ request,
109
+ });
110
+
111
+ if (response) return response;
112
+
113
+ return new Response(STATUS_MESSAGE[404], {
114
+ status: 404,
115
+ });
116
+ }
117
+
118
+ private startServer() {
119
+ this.server = getRequiredBunRuntime().serve({
120
+ fetch: this.fetch.bind(this),
121
+ port: this.options.port,
122
+ });
123
+ }
124
+
125
+ stop() {
126
+ if (this.server) {
127
+ this.server.stop(true);
128
+ }
129
+ }
130
+
131
+ static createServer({
132
+ appConfig,
133
+ options,
134
+ }: {
135
+ appConfig: EcoPagesAppConfig;
136
+ options?: StaticContentServerOptions;
137
+ }) {
138
+ return new StaticContentServer({
139
+ appConfig: appConfig,
140
+ options,
141
+ });
142
+ }
143
+ }