@ecopages/core 0.2.0-alpha.27 → 0.2.0-alpha.28

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 (546) hide show
  1. package/CHANGELOG.md +91 -0
  2. package/package.json +162 -72
  3. package/src/adapters/abstract/application-adapter.d.ts +194 -0
  4. package/src/adapters/abstract/application-adapter.js +121 -0
  5. package/src/adapters/abstract/router-adapter.d.ts +26 -0
  6. package/src/adapters/abstract/router-adapter.js +5 -0
  7. package/src/adapters/abstract/server-adapter.d.ts +69 -0
  8. package/src/adapters/abstract/server-adapter.js +15 -0
  9. package/src/adapters/bun/client-bridge.d.ts +34 -0
  10. package/src/adapters/bun/client-bridge.js +48 -0
  11. package/src/adapters/bun/create-app.d.ts +53 -0
  12. package/src/adapters/bun/create-app.js +153 -0
  13. package/src/adapters/bun/hmr-manager.d.ts +131 -0
  14. package/src/adapters/bun/hmr-manager.js +312 -0
  15. package/src/adapters/bun/index.d.ts +2 -0
  16. package/src/adapters/bun/index.js +8 -0
  17. package/src/adapters/bun/server-adapter.d.ts +155 -0
  18. package/src/adapters/bun/server-adapter.js +393 -0
  19. package/src/adapters/bun/server-lifecycle.d.ts +63 -0
  20. package/src/adapters/bun/server-lifecycle.js +92 -0
  21. package/src/adapters/create-app.d.ts +20 -0
  22. package/src/adapters/create-app.js +66 -0
  23. package/src/adapters/index.d.ts +2 -0
  24. package/src/adapters/index.js +8 -0
  25. package/src/adapters/node/create-app.d.ts +18 -0
  26. package/src/adapters/node/create-app.js +149 -0
  27. package/src/adapters/node/node-client-bridge.d.ts +26 -0
  28. package/src/adapters/node/node-client-bridge.js +66 -0
  29. package/src/adapters/node/node-hmr-manager.d.ts +121 -0
  30. package/src/adapters/node/node-hmr-manager.js +290 -0
  31. package/src/adapters/node/server-adapter.d.ts +162 -0
  32. package/src/adapters/node/server-adapter.js +368 -0
  33. package/src/adapters/node/static-content-server.d.ts +60 -0
  34. package/src/adapters/node/static-content-server.js +194 -0
  35. package/src/adapters/shared/api-response.d.ts +52 -0
  36. package/src/adapters/shared/api-response.js +96 -0
  37. package/src/adapters/shared/application-adapter.d.ts +18 -0
  38. package/src/adapters/shared/application-adapter.js +90 -0
  39. package/src/adapters/shared/define-api-handler.d.ts +25 -0
  40. package/src/adapters/shared/define-api-handler.js +15 -0
  41. package/src/adapters/shared/explicit-static-render-preparation.d.ts +25 -0
  42. package/src/adapters/shared/explicit-static-render-preparation.js +26 -0
  43. package/src/adapters/shared/explicit-static-route-matcher.d.ts +41 -0
  44. package/src/adapters/shared/explicit-static-route-matcher.js +101 -0
  45. package/src/adapters/shared/file-route-middleware-pipeline.d.ts +62 -0
  46. package/src/adapters/shared/file-route-middleware-pipeline.js +90 -0
  47. package/src/adapters/shared/fs-server-response-factory.d.ts +23 -0
  48. package/src/adapters/shared/fs-server-response-factory.js +81 -0
  49. package/src/adapters/shared/fs-server-response-matcher.d.ts +75 -0
  50. package/src/adapters/shared/fs-server-response-matcher.js +186 -0
  51. package/src/adapters/shared/hmr-entrypoint-registrar.d.ts +55 -0
  52. package/src/adapters/shared/hmr-entrypoint-registrar.js +87 -0
  53. package/src/adapters/shared/hmr-html-response.d.ts +22 -0
  54. package/src/adapters/shared/hmr-html-response.js +32 -0
  55. package/src/adapters/shared/render-context.d.ts +15 -0
  56. package/src/adapters/shared/render-context.js +72 -0
  57. package/src/adapters/shared/runtime-bootstrap.d.ts +38 -0
  58. package/src/adapters/shared/runtime-bootstrap.js +43 -0
  59. package/src/adapters/shared/server-adapter.d.ts +108 -0
  60. package/src/adapters/shared/server-adapter.js +429 -0
  61. package/src/adapters/shared/server-route-handler.d.ts +89 -0
  62. package/src/adapters/shared/server-route-handler.js +111 -0
  63. package/src/adapters/shared/server-static-builder.d.ts +71 -0
  64. package/src/adapters/shared/server-static-builder.js +100 -0
  65. package/src/build/build-adapter.d.ts +239 -0
  66. package/src/build/build-adapter.js +642 -0
  67. package/src/build/build-manifest.d.ts +27 -0
  68. package/src/build/build-manifest.js +30 -0
  69. package/src/build/build-types.d.ts +57 -0
  70. package/src/build/build-types.js +0 -0
  71. package/src/build/dev-build-coordinator.d.ts +72 -0
  72. package/src/build/dev-build-coordinator.js +154 -0
  73. package/src/build/esbuild-build-adapter.d.ts +78 -0
  74. package/src/build/esbuild-build-adapter.js +505 -0
  75. package/src/build/runtime-build-executor.d.ts +14 -0
  76. package/src/build/runtime-build-executor.js +22 -0
  77. package/src/build/runtime-specifier-alias-plugin.d.ts +15 -0
  78. package/src/build/runtime-specifier-alias-plugin.js +35 -0
  79. package/src/build/runtime-specifier-aliases.d.ts +5 -0
  80. package/src/build/runtime-specifier-aliases.js +95 -0
  81. package/src/config/config-builder.d.ts +252 -0
  82. package/src/config/config-builder.js +598 -0
  83. package/src/config/{constants.ts → constants.d.ts} +13 -22
  84. package/src/config/constants.js +25 -0
  85. package/src/dev/host-runtime.d.ts +10 -0
  86. package/src/dev/host-runtime.js +24 -0
  87. package/src/dev/sc-server.d.ts +30 -0
  88. package/src/dev/sc-server.js +111 -0
  89. package/src/eco/eco.browser.d.ts +2 -0
  90. package/src/eco/eco.browser.js +83 -0
  91. package/src/eco/eco.d.ts +9 -0
  92. package/src/eco/eco.js +85 -0
  93. package/src/eco/eco.types.d.ts +178 -0
  94. package/src/eco/eco.types.js +0 -0
  95. package/src/eco/eco.utils.d.ts +1 -0
  96. package/src/eco/eco.utils.js +10 -0
  97. package/src/eco/global-injector-map.d.ts +16 -0
  98. package/src/eco/global-injector-map.js +80 -0
  99. package/src/eco/lazy-injector-map.d.ts +8 -0
  100. package/src/eco/lazy-injector-map.js +70 -0
  101. package/src/eco/module-dependencies.d.ts +18 -0
  102. package/src/eco/module-dependencies.js +49 -0
  103. package/src/errors/http-error.d.ts +31 -0
  104. package/src/errors/http-error.js +50 -0
  105. package/src/errors/index.d.ts +3 -0
  106. package/src/errors/index.js +6 -0
  107. package/src/errors/locals-access-error.d.ts +4 -0
  108. package/src/errors/locals-access-error.js +9 -0
  109. package/src/global/app-logger.d.ts +2 -0
  110. package/src/global/app-logger.js +6 -0
  111. package/src/hmr/client/hmr-runtime.d.ts +5 -0
  112. package/src/hmr/client/hmr-runtime.js +117 -0
  113. package/src/hmr/hmr-strategy.d.ts +162 -0
  114. package/src/hmr/hmr-strategy.js +44 -0
  115. package/src/hmr/hmr.postcss.test.e2e.d.ts +1 -0
  116. package/src/hmr/hmr.postcss.test.e2e.js +31 -0
  117. package/src/hmr/hmr.test.e2e.d.ts +1 -0
  118. package/src/hmr/hmr.test.e2e.js +43 -0
  119. package/src/hmr/strategies/default-hmr-strategy.d.ts +43 -0
  120. package/src/hmr/strategies/default-hmr-strategy.js +34 -0
  121. package/src/hmr/strategies/js-hmr-strategy.d.ts +134 -0
  122. package/src/hmr/strategies/js-hmr-strategy.js +178 -0
  123. package/src/index.browser.d.ts +3 -0
  124. package/src/index.browser.js +4 -0
  125. package/src/index.d.ts +6 -0
  126. package/src/index.js +21 -0
  127. package/src/integrations/ghtml/ghtml-renderer.d.ts +16 -0
  128. package/src/integrations/ghtml/ghtml-renderer.js +57 -0
  129. package/src/integrations/ghtml/ghtml.constants.d.ts +1 -0
  130. package/src/integrations/ghtml/ghtml.constants.js +4 -0
  131. package/src/integrations/ghtml/ghtml.plugin.d.ts +16 -0
  132. package/src/integrations/ghtml/ghtml.plugin.js +20 -0
  133. package/src/plugins/alias-resolver-plugin.d.ts +2 -0
  134. package/src/plugins/alias-resolver-plugin.js +53 -0
  135. package/src/plugins/eco-component-meta-plugin.d.ts +108 -0
  136. package/src/plugins/eco-component-meta-plugin.js +162 -0
  137. package/src/plugins/foreign-jsx-override-plugin.d.ts +31 -0
  138. package/src/plugins/foreign-jsx-override-plugin.js +35 -0
  139. package/src/plugins/integration-plugin.d.ts +215 -0
  140. package/src/plugins/integration-plugin.js +189 -0
  141. package/src/plugins/processor.d.ts +97 -0
  142. package/src/plugins/processor.js +141 -0
  143. package/src/plugins/{runtime-capability.ts → runtime-capability.d.ts} +3 -8
  144. package/src/plugins/runtime-capability.js +0 -0
  145. package/src/plugins/source-transform.d.ts +46 -0
  146. package/src/plugins/source-transform.js +71 -0
  147. package/src/route-renderer/orchestration/component-render-context.d.ts +89 -0
  148. package/src/route-renderer/orchestration/component-render-context.js +147 -0
  149. package/src/route-renderer/orchestration/declared-ownership-graph.d.ts +18 -0
  150. package/src/route-renderer/orchestration/declared-ownership-graph.js +34 -0
  151. package/src/route-renderer/orchestration/foreign-subtree-execution.service.d.ts +108 -0
  152. package/src/route-renderer/orchestration/foreign-subtree-execution.service.js +206 -0
  153. package/src/route-renderer/orchestration/integration-renderer.d.ts +516 -0
  154. package/src/route-renderer/orchestration/integration-renderer.js +909 -0
  155. package/src/route-renderer/orchestration/ownership-planning.service.d.ts +24 -0
  156. package/src/route-renderer/orchestration/ownership-planning.service.js +63 -0
  157. package/src/route-renderer/orchestration/ownership-validation.service.d.ts +29 -0
  158. package/src/route-renderer/orchestration/ownership-validation.service.js +53 -0
  159. package/src/route-renderer/orchestration/processed-asset-dedupe.d.ts +2 -0
  160. package/src/route-renderer/orchestration/processed-asset-dedupe.js +23 -0
  161. package/src/route-renderer/orchestration/queued-foreign-subtree-resolution.service.d.ts +90 -0
  162. package/src/route-renderer/orchestration/queued-foreign-subtree-resolution.service.js +158 -0
  163. package/src/route-renderer/orchestration/render-output.utils.d.ts +66 -0
  164. package/src/route-renderer/orchestration/render-output.utils.js +171 -0
  165. package/src/route-renderer/orchestration/route-render-orchestrator.d.ts +120 -0
  166. package/src/route-renderer/orchestration/route-render-orchestrator.js +388 -0
  167. package/src/route-renderer/orchestration/template-serialization.d.ts +38 -0
  168. package/src/route-renderer/orchestration/template-serialization.js +45 -0
  169. package/src/route-renderer/page-loading/component-dependency-collection.d.ts +37 -0
  170. package/src/route-renderer/page-loading/component-dependency-collection.js +132 -0
  171. package/src/route-renderer/page-loading/declared-asset-collection.d.ts +24 -0
  172. package/src/route-renderer/page-loading/declared-asset-collection.js +106 -0
  173. package/src/route-renderer/page-loading/dependency-resolver.d.ts +35 -0
  174. package/src/route-renderer/page-loading/dependency-resolver.js +115 -0
  175. package/src/route-renderer/page-loading/ecopages-virtual-imports.d.ts +11 -0
  176. package/src/route-renderer/page-loading/ecopages-virtual-imports.js +57 -0
  177. package/src/route-renderer/page-loading/lazy-entry-collection.d.ts +45 -0
  178. package/src/route-renderer/page-loading/lazy-entry-collection.js +105 -0
  179. package/src/route-renderer/page-loading/lazy-trigger-planning.d.ts +19 -0
  180. package/src/route-renderer/page-loading/lazy-trigger-planning.js +40 -0
  181. package/src/route-renderer/page-loading/module-declaration-aggregation.d.ts +5 -0
  182. package/src/route-renderer/page-loading/module-declaration-aggregation.js +33 -0
  183. package/src/route-renderer/page-loading/module-declaration-scripts.d.ts +3 -0
  184. package/src/route-renderer/page-loading/module-declaration-scripts.js +18 -0
  185. package/src/route-renderer/page-loading/page-dependency-bundling.d.ts +13 -0
  186. package/src/route-renderer/page-loading/page-dependency-bundling.js +137 -0
  187. package/src/route-renderer/page-loading/page-module-loader.d.ts +90 -0
  188. package/src/route-renderer/page-loading/page-module-loader.js +127 -0
  189. package/src/route-renderer/route-renderer.d.ts +69 -0
  190. package/src/route-renderer/route-renderer.js +80 -0
  191. package/src/router/client/link-intent.js +34 -0
  192. package/src/router/client/link-intent.test.browser.d.ts +1 -0
  193. package/src/router/client/link-intent.test.browser.js +43 -0
  194. package/src/router/client/navigation-coordinator.d.ts +169 -0
  195. package/src/router/client/navigation-coordinator.js +215 -0
  196. package/src/router/server/route-registry.d.ts +78 -0
  197. package/src/router/server/route-registry.js +262 -0
  198. package/src/services/assets/asset-processing-service/asset-dependency-keys.d.ts +3 -0
  199. package/src/services/assets/asset-processing-service/asset-dependency-keys.js +56 -0
  200. package/src/services/assets/asset-processing-service/asset-processing.service.d.ts +103 -0
  201. package/src/services/assets/asset-processing-service/asset-processing.service.js +285 -0
  202. package/src/services/assets/asset-processing-service/asset.factory.d.ts +17 -0
  203. package/src/services/assets/asset-processing-service/asset.factory.js +82 -0
  204. package/src/services/assets/asset-processing-service/assets.types.d.ts +103 -0
  205. package/src/services/assets/asset-processing-service/assets.types.js +0 -0
  206. package/src/services/assets/asset-processing-service/browser-runtime-asset.factory.d.ts +55 -0
  207. package/src/services/assets/asset-processing-service/browser-runtime-asset.factory.js +49 -0
  208. package/src/services/assets/asset-processing-service/browser-runtime-entry.factory.d.ts +20 -0
  209. package/src/services/assets/asset-processing-service/browser-runtime-entry.factory.js +41 -0
  210. package/src/services/assets/asset-processing-service/grouped-content-bundles.d.ts +30 -0
  211. package/src/services/assets/asset-processing-service/grouped-content-bundles.js +65 -0
  212. package/src/services/assets/asset-processing-service/index.d.ts +6 -0
  213. package/src/services/assets/asset-processing-service/index.js +6 -0
  214. package/src/services/assets/asset-processing-service/page-package.d.ts +3 -0
  215. package/src/services/assets/asset-processing-service/page-package.js +74 -0
  216. package/src/services/assets/asset-processing-service/{processor.interface.ts → processor.interface.d.ts} +5 -10
  217. package/src/services/assets/asset-processing-service/processor.interface.js +6 -0
  218. package/src/services/assets/asset-processing-service/processor.registry.d.ts +8 -0
  219. package/src/services/assets/asset-processing-service/processor.registry.js +15 -0
  220. package/src/services/assets/asset-processing-service/processors/base/base-processor.d.ts +24 -0
  221. package/src/services/assets/asset-processing-service/processors/base/base-processor.js +65 -0
  222. package/src/services/assets/asset-processing-service/processors/base/base-script-processor.d.ts +22 -0
  223. package/src/services/assets/asset-processing-service/processors/base/base-script-processor.js +136 -0
  224. package/src/services/assets/asset-processing-service/processors/index.d.ts +5 -0
  225. package/src/services/assets/asset-processing-service/processors/index.js +5 -0
  226. package/src/services/assets/asset-processing-service/processors/script/content-script.processor.d.ts +6 -0
  227. package/src/services/assets/asset-processing-service/processors/script/content-script.processor.js +119 -0
  228. package/src/services/assets/asset-processing-service/processors/script/file-script.processor.d.ts +9 -0
  229. package/src/services/assets/asset-processing-service/processors/script/file-script.processor.js +97 -0
  230. package/src/services/assets/asset-processing-service/processors/script/node-module-script.processor.d.ts +7 -0
  231. package/src/services/assets/asset-processing-service/processors/script/node-module-script.processor.js +79 -0
  232. package/src/services/assets/asset-processing-service/processors/stylesheet/content-stylesheet.processor.d.ts +8 -0
  233. package/src/services/assets/asset-processing-service/processors/stylesheet/content-stylesheet.processor.js +59 -0
  234. package/src/services/assets/asset-processing-service/processors/stylesheet/file-stylesheet.processor.d.ts +9 -0
  235. package/src/services/assets/asset-processing-service/processors/stylesheet/file-stylesheet.processor.js +69 -0
  236. package/src/services/assets/asset-processing-service/ungrouped-dependency-processing.d.ts +18 -0
  237. package/src/services/assets/asset-processing-service/ungrouped-dependency-processing.js +45 -0
  238. package/src/services/assets/browser-bundle.service.d.ts +73 -0
  239. package/src/services/assets/browser-bundle.service.js +41 -0
  240. package/src/services/cache/cache.types.d.ts +107 -0
  241. package/src/services/cache/cache.types.js +0 -0
  242. package/src/services/cache/index.d.ts +7 -0
  243. package/src/services/cache/index.js +7 -0
  244. package/src/services/cache/memory-cache-store.d.ts +42 -0
  245. package/src/services/cache/memory-cache-store.js +98 -0
  246. package/src/services/cache/page-cache-service.d.ts +70 -0
  247. package/src/services/cache/page-cache-service.js +152 -0
  248. package/src/services/cache/page-request-cache-coordinator.service.d.ts +75 -0
  249. package/src/services/cache/page-request-cache-coordinator.service.js +109 -0
  250. package/src/services/html/html-rewriter-provider.service.d.ts +37 -0
  251. package/src/services/html/html-rewriter-provider.service.js +68 -0
  252. package/src/services/html/html-transformer.service.d.ts +87 -0
  253. package/src/services/html/html-transformer.service.js +216 -0
  254. package/src/services/invalidation/development-invalidation.service.d.ts +74 -0
  255. package/src/services/invalidation/development-invalidation.service.js +190 -0
  256. package/src/services/module-loading/app-module-loader.service.d.ts +7 -0
  257. package/src/services/module-loading/app-module-loader.service.js +0 -0
  258. package/src/services/module-loading/app-server-module-transpiler.service.d.ts +24 -0
  259. package/src/services/module-loading/app-server-module-transpiler.service.js +115 -0
  260. package/src/services/module-loading/host-module-loader-registry.d.ts +4 -0
  261. package/src/services/module-loading/host-module-loader-registry.js +15 -0
  262. package/src/services/module-loading/{module-loading-types.ts → module-loading-types.d.ts} +0 -1
  263. package/src/services/module-loading/module-loading-types.js +0 -0
  264. package/src/services/module-loading/node-bootstrap-plugin.d.ts +42 -0
  265. package/src/services/module-loading/node-bootstrap-plugin.js +216 -0
  266. package/src/services/module-loading/page-module-import.service.d.ts +76 -0
  267. package/src/services/module-loading/page-module-import.service.js +170 -0
  268. package/src/services/module-loading/server-module-transpiler.service.d.ts +63 -0
  269. package/src/services/module-loading/server-module-transpiler.service.js +64 -0
  270. package/src/services/module-loading/source-module-support.d.ts +5 -0
  271. package/src/services/module-loading/source-module-support.js +8 -0
  272. package/src/services/runtime-state/dev-graph.service.d.ts +118 -0
  273. package/src/services/runtime-state/dev-graph.service.js +162 -0
  274. package/src/services/runtime-state/entrypoint-dependency-graph.service.d.ts +41 -0
  275. package/src/services/runtime-state/entrypoint-dependency-graph.service.js +85 -0
  276. package/src/services/runtime-state/server-invalidation-state.service.d.ts +26 -0
  277. package/src/services/runtime-state/server-invalidation-state.service.js +35 -0
  278. package/src/services/validation/schema-validation-service.d.ts +122 -0
  279. package/src/services/validation/schema-validation-service.js +101 -0
  280. package/src/services/validation/{standard-schema.types.ts → standard-schema.types.d.ts} +17 -20
  281. package/src/services/validation/standard-schema.types.js +0 -0
  282. package/src/static-site-generator/static-site-generator.d.ts +104 -0
  283. package/src/static-site-generator/static-site-generator.js +316 -0
  284. package/src/types/internal-types.d.ts +232 -0
  285. package/src/types/internal-types.js +0 -0
  286. package/src/types/public-types.d.ts +1267 -0
  287. package/src/types/public-types.js +0 -0
  288. package/src/utils/deep-merge.d.ts +14 -0
  289. package/src/utils/deep-merge.js +32 -0
  290. package/src/utils/hash.d.ts +1 -0
  291. package/src/utils/hash.js +7 -0
  292. package/src/utils/html-escaping.d.ts +7 -0
  293. package/src/utils/html-escaping.js +6 -0
  294. package/src/utils/html.js +4 -0
  295. package/src/utils/invariant.d.ts +5 -0
  296. package/src/utils/invariant.js +11 -0
  297. package/src/utils/locals-utils.d.ts +15 -0
  298. package/src/utils/locals-utils.js +24 -0
  299. package/src/utils/parse-cli-args.d.ts +27 -0
  300. package/src/utils/parse-cli-args.js +62 -0
  301. package/src/utils/path-utils.module.d.ts +5 -0
  302. package/src/utils/path-utils.module.js +14 -0
  303. package/src/utils/resolve-work-dir.d.ts +11 -0
  304. package/src/utils/resolve-work-dir.js +31 -0
  305. package/src/utils/runtime.d.ts +11 -0
  306. package/src/utils/runtime.js +40 -0
  307. package/src/utils/server-utils.module.d.ts +19 -0
  308. package/src/utils/server-utils.module.js +56 -0
  309. package/src/watchers/project-watcher.d.ts +136 -0
  310. package/src/watchers/project-watcher.js +275 -0
  311. package/src/watchers/project-watcher.test-helpers.d.ts +4 -0
  312. package/src/watchers/project-watcher.test-helpers.js +52 -0
  313. package/src/adapters/abstract/application-adapter.test.ts +0 -172
  314. package/src/adapters/abstract/application-adapter.ts +0 -379
  315. package/src/adapters/abstract/router-adapter.ts +0 -30
  316. package/src/adapters/abstract/server-adapter.ts +0 -79
  317. package/src/adapters/bun/client-bridge.ts +0 -62
  318. package/src/adapters/bun/create-app.ts +0 -232
  319. package/src/adapters/bun/hmr-manager.test.ts +0 -265
  320. package/src/adapters/bun/hmr-manager.ts +0 -383
  321. package/src/adapters/bun/index.ts +0 -2
  322. package/src/adapters/bun/server-adapter.ts +0 -526
  323. package/src/adapters/bun/server-lifecycle.ts +0 -124
  324. package/src/adapters/create-app.test.ts +0 -10
  325. package/src/adapters/create-app.ts +0 -91
  326. package/src/adapters/index.ts +0 -2
  327. package/src/adapters/node/create-app.test.ts +0 -53
  328. package/src/adapters/node/create-app.ts +0 -183
  329. package/src/adapters/node/node-client-bridge.test.ts +0 -198
  330. package/src/adapters/node/node-client-bridge.ts +0 -79
  331. package/src/adapters/node/node-hmr-manager.test.ts +0 -320
  332. package/src/adapters/node/node-hmr-manager.ts +0 -355
  333. package/src/adapters/node/server-adapter.ts +0 -502
  334. package/src/adapters/node/static-content-server.test.ts +0 -60
  335. package/src/adapters/node/static-content-server.ts +0 -239
  336. package/src/adapters/shared/api-response.test.ts +0 -97
  337. package/src/adapters/shared/api-response.ts +0 -104
  338. package/src/adapters/shared/application-adapter.ts +0 -199
  339. package/src/adapters/shared/define-api-handler.ts +0 -66
  340. package/src/adapters/shared/explicit-static-render-preparation.ts +0 -58
  341. package/src/adapters/shared/explicit-static-route-matcher.test.ts +0 -381
  342. package/src/adapters/shared/explicit-static-route-matcher.ts +0 -131
  343. package/src/adapters/shared/file-route-middleware-pipeline.test.ts +0 -85
  344. package/src/adapters/shared/file-route-middleware-pipeline.ts +0 -118
  345. package/src/adapters/shared/fs-server-response-factory.test.ts +0 -176
  346. package/src/adapters/shared/fs-server-response-factory.ts +0 -96
  347. package/src/adapters/shared/fs-server-response-matcher.test.ts +0 -311
  348. package/src/adapters/shared/fs-server-response-matcher.ts +0 -240
  349. package/src/adapters/shared/hmr-entrypoint-registrar.ts +0 -149
  350. package/src/adapters/shared/hmr-html-response.ts +0 -52
  351. package/src/adapters/shared/hmr-manager.contract.test.ts +0 -228
  352. package/src/adapters/shared/hmr-manager.dispatch.test.ts +0 -220
  353. package/src/adapters/shared/render-context.test.ts +0 -150
  354. package/src/adapters/shared/render-context.ts +0 -123
  355. package/src/adapters/shared/runtime-bootstrap.ts +0 -79
  356. package/src/adapters/shared/server-adapter.test.ts +0 -130
  357. package/src/adapters/shared/server-adapter.ts +0 -562
  358. package/src/adapters/shared/server-route-handler.test.ts +0 -111
  359. package/src/adapters/shared/server-route-handler.ts +0 -153
  360. package/src/adapters/shared/server-static-builder.test.ts +0 -338
  361. package/src/adapters/shared/server-static-builder.ts +0 -170
  362. package/src/build/build-adapter-serialization.test.ts +0 -281
  363. package/src/build/build-adapter.test.ts +0 -1240
  364. package/src/build/build-adapter.ts +0 -1012
  365. package/src/build/build-manifest.ts +0 -54
  366. package/src/build/build-types.ts +0 -83
  367. package/src/build/dev-build-coordinator.ts +0 -220
  368. package/src/build/esbuild-build-adapter.ts +0 -660
  369. package/src/build/runtime-build-executor.test.ts +0 -81
  370. package/src/build/runtime-build-executor.ts +0 -40
  371. package/src/build/runtime-specifier-alias-plugin.test.ts +0 -67
  372. package/src/build/runtime-specifier-alias-plugin.ts +0 -62
  373. package/src/build/runtime-specifier-aliases.ts +0 -135
  374. package/src/config/config-builder.test.ts +0 -442
  375. package/src/config/config-builder.ts +0 -737
  376. package/src/config/config-builder.typecheck.test.ts +0 -96
  377. package/src/dev/host-runtime.ts +0 -34
  378. package/src/dev/sc-server.ts +0 -143
  379. package/src/eco/eco.browser.test.ts +0 -43
  380. package/src/eco/eco.browser.ts +0 -118
  381. package/src/eco/eco.test.ts +0 -654
  382. package/src/eco/eco.ts +0 -205
  383. package/src/eco/eco.types.ts +0 -221
  384. package/src/eco/eco.utils.test.ts +0 -219
  385. package/src/eco/eco.utils.ts +0 -5
  386. package/src/eco/global-injector-map.test.ts +0 -42
  387. package/src/eco/global-injector-map.ts +0 -112
  388. package/src/eco/lazy-injector-map.test.ts +0 -66
  389. package/src/eco/lazy-injector-map.ts +0 -120
  390. package/src/eco/module-dependencies.test.ts +0 -30
  391. package/src/eco/module-dependencies.ts +0 -75
  392. package/src/errors/http-error.test.ts +0 -134
  393. package/src/errors/http-error.ts +0 -72
  394. package/src/errors/index.ts +0 -3
  395. package/src/errors/locals-access-error.ts +0 -7
  396. package/src/global/app-logger.ts +0 -4
  397. package/src/global/utils.test.ts +0 -12
  398. 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
  399. package/src/hmr/client/__screenshots__/hmr-runtime.test.browser.ts/HMR-Runtime-HMR-Server-Integration-should-load-fixture-app-page-1.png +0 -0
  400. package/src/hmr/client/__screenshots__/hmr-runtime.test.browser.ts/HMR-Runtime-WebSocket-Connection-should-connect-to-correct-HMR-endpoint-1.png +0 -0
  401. package/src/hmr/client/hmr-runtime.ts +0 -162
  402. package/src/hmr/hmr-strategy.test.ts +0 -124
  403. package/src/hmr/hmr-strategy.ts +0 -177
  404. package/src/hmr/hmr.postcss.test.e2e.ts +0 -41
  405. package/src/hmr/hmr.test.e2e.ts +0 -66
  406. package/src/hmr/strategies/default-hmr-strategy.ts +0 -60
  407. package/src/hmr/strategies/js-hmr-strategy.test.ts +0 -334
  408. package/src/hmr/strategies/js-hmr-strategy.ts +0 -314
  409. package/src/index.browser.ts +0 -3
  410. package/src/index.ts +0 -15
  411. package/src/integrations/ghtml/ghtml-renderer.test.ts +0 -253
  412. package/src/integrations/ghtml/ghtml-renderer.ts +0 -87
  413. package/src/integrations/ghtml/ghtml.constants.ts +0 -1
  414. package/src/integrations/ghtml/ghtml.plugin.ts +0 -28
  415. package/src/plugins/alias-resolver-plugin.test.ts +0 -41
  416. package/src/plugins/alias-resolver-plugin.ts +0 -63
  417. package/src/plugins/eco-component-meta-plugin.test.ts +0 -406
  418. package/src/plugins/eco-component-meta-plugin.ts +0 -494
  419. package/src/plugins/foreign-jsx-override-plugin.test.ts +0 -65
  420. package/src/plugins/foreign-jsx-override-plugin.ts +0 -67
  421. package/src/plugins/integration-plugin.test.ts +0 -151
  422. package/src/plugins/integration-plugin.ts +0 -323
  423. package/src/plugins/processor.test.ts +0 -148
  424. package/src/plugins/processor.ts +0 -257
  425. package/src/plugins/source-transform.test.ts +0 -82
  426. package/src/plugins/source-transform.ts +0 -123
  427. package/src/route-renderer/orchestration/component-render-context.ts +0 -325
  428. package/src/route-renderer/orchestration/declared-ownership-graph.ts +0 -62
  429. package/src/route-renderer/orchestration/foreign-subtree-execution.service.ts +0 -383
  430. package/src/route-renderer/orchestration/integration-renderer.test.ts +0 -2085
  431. package/src/route-renderer/orchestration/integration-renderer.ts +0 -1244
  432. package/src/route-renderer/orchestration/ownership-planning.service.ts +0 -97
  433. package/src/route-renderer/orchestration/ownership-validation.service.ts +0 -76
  434. package/src/route-renderer/orchestration/processed-asset-dedupe.ts +0 -25
  435. package/src/route-renderer/orchestration/queued-foreign-subtree-resolution.service.test.ts +0 -324
  436. package/src/route-renderer/orchestration/queued-foreign-subtree-resolution.service.ts +0 -294
  437. package/src/route-renderer/orchestration/render-output.utils.ts +0 -310
  438. package/src/route-renderer/orchestration/route-render-orchestrator.prepare-render-options.test.ts +0 -644
  439. package/src/route-renderer/orchestration/route-render-orchestrator.test.ts +0 -265
  440. package/src/route-renderer/orchestration/route-render-orchestrator.ts +0 -592
  441. package/src/route-renderer/orchestration/template-serialization.test.ts +0 -110
  442. package/src/route-renderer/orchestration/template-serialization.ts +0 -117
  443. package/src/route-renderer/page-loading/component-dependency-collection.ts +0 -202
  444. package/src/route-renderer/page-loading/declared-asset-collection.ts +0 -153
  445. package/src/route-renderer/page-loading/dependency-resolver.test.ts +0 -761
  446. package/src/route-renderer/page-loading/dependency-resolver.ts +0 -144
  447. package/src/route-renderer/page-loading/ecopages-virtual-imports.ts +0 -75
  448. package/src/route-renderer/page-loading/lazy-entry-collection.ts +0 -167
  449. package/src/route-renderer/page-loading/lazy-trigger-planning.ts +0 -74
  450. package/src/route-renderer/page-loading/module-declaration-aggregation.ts +0 -60
  451. package/src/route-renderer/page-loading/module-declaration-scripts.ts +0 -16
  452. package/src/route-renderer/page-loading/page-dependency-bundling.ts +0 -244
  453. package/src/route-renderer/page-loading/page-module-loader.test.ts +0 -183
  454. package/src/route-renderer/page-loading/page-module-loader.ts +0 -184
  455. package/src/route-renderer/route-renderer.ts +0 -133
  456. package/src/router/client/link-intent.test.browser.ts +0 -51
  457. package/src/router/client/link-intent.ts +0 -92
  458. package/src/router/client/navigation-coordinator.test.ts +0 -237
  459. package/src/router/client/navigation-coordinator.ts +0 -453
  460. package/src/router/server/route-registry.test.ts +0 -176
  461. package/src/router/server/route-registry.ts +0 -382
  462. package/src/services/assets/asset-processing-service/asset-dependency-keys.ts +0 -66
  463. package/src/services/assets/asset-processing-service/asset-processing.service.test.ts +0 -473
  464. package/src/services/assets/asset-processing-service/asset-processing.service.ts +0 -344
  465. package/src/services/assets/asset-processing-service/asset.factory.test.ts +0 -63
  466. package/src/services/assets/asset-processing-service/asset.factory.ts +0 -105
  467. package/src/services/assets/asset-processing-service/assets.types.ts +0 -128
  468. package/src/services/assets/asset-processing-service/browser-runtime-asset.factory.test.ts +0 -74
  469. package/src/services/assets/asset-processing-service/browser-runtime-asset.factory.ts +0 -96
  470. package/src/services/assets/asset-processing-service/browser-runtime-entry.factory.test.ts +0 -67
  471. package/src/services/assets/asset-processing-service/browser-runtime-entry.factory.ts +0 -78
  472. package/src/services/assets/asset-processing-service/grouped-content-bundles.ts +0 -104
  473. package/src/services/assets/asset-processing-service/index.ts +0 -6
  474. package/src/services/assets/asset-processing-service/page-package.test.ts +0 -100
  475. package/src/services/assets/asset-processing-service/page-package.ts +0 -93
  476. package/src/services/assets/asset-processing-service/processor.registry.ts +0 -18
  477. package/src/services/assets/asset-processing-service/processors/base/base-processor.test.ts +0 -59
  478. package/src/services/assets/asset-processing-service/processors/base/base-processor.ts +0 -83
  479. package/src/services/assets/asset-processing-service/processors/base/base-script-processor.ts +0 -173
  480. package/src/services/assets/asset-processing-service/processors/index.ts +0 -5
  481. package/src/services/assets/asset-processing-service/processors/script/content-script.processor.test.ts +0 -195
  482. package/src/services/assets/asset-processing-service/processors/script/content-script.processor.ts +0 -137
  483. package/src/services/assets/asset-processing-service/processors/script/file-script.processor.test.ts +0 -326
  484. package/src/services/assets/asset-processing-service/processors/script/file-script.processor.ts +0 -116
  485. package/src/services/assets/asset-processing-service/processors/script/node-module-script.processor.test.ts +0 -227
  486. package/src/services/assets/asset-processing-service/processors/script/node-module-script.processor.ts +0 -89
  487. package/src/services/assets/asset-processing-service/processors/stylesheet/content-stylesheet.processor.test.ts +0 -261
  488. package/src/services/assets/asset-processing-service/processors/stylesheet/content-stylesheet.processor.ts +0 -72
  489. package/src/services/assets/asset-processing-service/processors/stylesheet/file-stylesheet.processor.ts +0 -83
  490. package/src/services/assets/asset-processing-service/ungrouped-dependency-processing.ts +0 -65
  491. package/src/services/assets/browser-bundle.service.test.ts +0 -66
  492. package/src/services/assets/browser-bundle.service.ts +0 -109
  493. package/src/services/cache/cache.types.ts +0 -126
  494. package/src/services/cache/index.ts +0 -18
  495. package/src/services/cache/memory-cache-store.test.ts +0 -225
  496. package/src/services/cache/memory-cache-store.ts +0 -130
  497. package/src/services/cache/page-cache-service.test.ts +0 -175
  498. package/src/services/cache/page-cache-service.ts +0 -202
  499. package/src/services/cache/page-request-cache-coordinator.service.test.ts +0 -79
  500. package/src/services/cache/page-request-cache-coordinator.service.ts +0 -131
  501. package/src/services/html/html-rewriter-provider.service.test.ts +0 -183
  502. package/src/services/html/html-rewriter-provider.service.ts +0 -104
  503. package/src/services/html/html-transformer.service.test.ts +0 -476
  504. package/src/services/html/html-transformer.service.ts +0 -275
  505. package/src/services/invalidation/development-invalidation.service.test.ts +0 -87
  506. package/src/services/invalidation/development-invalidation.service.ts +0 -262
  507. package/src/services/module-loading/app-module-loader.service.ts +0 -9
  508. package/src/services/module-loading/app-server-module-transpiler.service.test.ts +0 -130
  509. package/src/services/module-loading/app-server-module-transpiler.service.ts +0 -141
  510. package/src/services/module-loading/host-module-loader-registry.ts +0 -15
  511. package/src/services/module-loading/node-bootstrap-plugin.test.ts +0 -335
  512. package/src/services/module-loading/node-bootstrap-plugin.ts +0 -311
  513. package/src/services/module-loading/page-module-import.service.test.ts +0 -504
  514. package/src/services/module-loading/page-module-import.service.ts +0 -251
  515. package/src/services/module-loading/server-module-transpiler.service.test.ts +0 -243
  516. package/src/services/module-loading/server-module-transpiler.service.ts +0 -104
  517. package/src/services/module-loading/source-module-support.ts +0 -19
  518. package/src/services/runtime-state/dev-graph.service.ts +0 -217
  519. package/src/services/runtime-state/entrypoint-dependency-graph.service.ts +0 -136
  520. package/src/services/runtime-state/server-invalidation-state.service.ts +0 -68
  521. package/src/services/validation/schema-validation-service.test.ts +0 -223
  522. package/src/services/validation/schema-validation-service.ts +0 -204
  523. package/src/static-site-generator/static-site-generator.test.ts +0 -408
  524. package/src/static-site-generator/static-site-generator.ts +0 -445
  525. package/src/types/internal-types.ts +0 -243
  526. package/src/types/public-types.ts +0 -1459
  527. package/src/utils/deep-merge.test.ts +0 -114
  528. package/src/utils/deep-merge.ts +0 -47
  529. package/src/utils/hash.ts +0 -5
  530. package/src/utils/html-escaping.ts +0 -9
  531. package/src/utils/invariant.test.ts +0 -22
  532. package/src/utils/invariant.ts +0 -15
  533. package/src/utils/locals-utils.ts +0 -37
  534. package/src/utils/parse-cli-args.test.ts +0 -69
  535. package/src/utils/parse-cli-args.ts +0 -105
  536. package/src/utils/path-utils.module.ts +0 -14
  537. package/src/utils/path-utils.test.ts +0 -15
  538. package/src/utils/resolve-work-dir.ts +0 -45
  539. package/src/utils/runtime.ts +0 -44
  540. package/src/utils/server-utils.module.ts +0 -67
  541. package/src/utils/server-utils.test.ts +0 -38
  542. package/src/watchers/project-watcher.integration.test.ts +0 -337
  543. package/src/watchers/project-watcher.test-helpers.ts +0 -42
  544. package/src/watchers/project-watcher.test.ts +0 -768
  545. package/src/watchers/project-watcher.ts +0 -357
  546. /package/src/utils/{html.ts → html.d.ts} +0 -0
@@ -1,562 +0,0 @@
1
- import path from 'node:path';
2
- import { AbstractServerAdapter } from '../abstract/server-adapter.ts';
3
- import type { ServerAdapterOptions, ServerAdapterResult } from '../abstract/server-adapter.ts';
4
- import { RouteRendererFactory } from '../../route-renderer/route-renderer.ts';
5
- import { RouteRegistry } from '../../router/server/route-registry.ts';
6
- import { MemoryCacheStore } from '../../services/cache/memory-cache-store.ts';
7
- import { PageCacheService } from '../../services/cache/page-cache-service.ts';
8
- import { SchemaValidationService } from '../../services/validation/schema-validation-service.ts';
9
- import { StaticSiteGenerator } from '../../static-site-generator/static-site-generator.ts';
10
- import { ServerStaticBuilder } from './server-static-builder.ts';
11
- import { ExplicitStaticRouteMatcher } from './explicit-static-route-matcher.ts';
12
- import { FileSystemServerResponseFactory } from './fs-server-response-factory.ts';
13
- import { FileSystemResponseMatcher } from './fs-server-response-matcher.ts';
14
- import { ServerRouteHandler } from './server-route-handler.ts';
15
- import { createRenderContext } from './render-context.ts';
16
- import { createRequire } from '../../utils/locals-utils.ts';
17
- import { HttpError } from '../../errors/http-error.ts';
18
- import { ApiResponseBuilder } from './api-response.ts';
19
- import { appLogger } from '../../global/app-logger.ts';
20
- import { fileSystem } from '@ecopages/file-system';
21
- import type { EcoPageFile } from '../../types/public-types.ts';
22
- import { getAppServerModuleTranspiler } from '../../services/module-loading/app-server-module-transpiler.service.ts';
23
- import { resolveInternalExecutionDir } from '../../utils/resolve-work-dir.ts';
24
- import type { RouteRegistryPageModuleAdapter } from '../../router/server/route-registry.ts';
25
- import type {
26
- ApiHandler,
27
- ApiHandlerContext,
28
- CacheInvalidator,
29
- ErrorHandler,
30
- RenderContext,
31
- StaticRoute,
32
- } from '../../types/public-types.ts';
33
-
34
- type SharedResponseHandlerDependencies = {
35
- cacheService: PageCacheService | null;
36
- fileSystemResponseMatcher: FileSystemResponseMatcher;
37
- explicitStaticRouteMatcher?: ExplicitStaticRouteMatcher;
38
- };
39
-
40
- type SharedRequestContext = {
41
- apiHandlers: ApiHandler[];
42
- errorHandler?: ErrorHandler;
43
- serverInstance?: any;
44
- hmrManager?: any;
45
- };
46
-
47
- export abstract class SharedServerAdapter<
48
- TOptions extends ServerAdapterOptions,
49
- TResult extends ServerAdapterResult,
50
- > extends AbstractServerAdapter<TOptions, TResult> {
51
- protected router!: RouteRegistry;
52
- protected fileSystemResponseMatcher!: FileSystemResponseMatcher;
53
- protected routeRendererFactory!: RouteRendererFactory;
54
- protected routeHandler!: ServerRouteHandler;
55
- protected staticSiteGenerator!: StaticSiteGenerator;
56
- protected staticBuilder!: ServerStaticBuilder;
57
- protected readonly schemaValidator = new SchemaValidationService();
58
-
59
- protected async initializeSharedRouteHandling(options: {
60
- staticRoutes: StaticRoute[];
61
- hmrManager?: any;
62
- }): Promise<void> {
63
- await this.initSharedRouter();
64
- this.configureSharedResponseHandlers(options.staticRoutes, options.hmrManager);
65
- }
66
-
67
- protected createSharedWatchRefreshCallback(options: {
68
- staticRoutes: StaticRoute[];
69
- hmrManager?: any;
70
- onRoutesReady?: () => Promise<void> | void;
71
- onError?: (error: Error) => Promise<void> | void;
72
- }): () => Promise<void> {
73
- return async () => {
74
- try {
75
- await this.initializeSharedRouteHandling({
76
- staticRoutes: options.staticRoutes,
77
- hmrManager: options.hmrManager,
78
- });
79
-
80
- if (options.onRoutesReady) {
81
- await options.onRoutesReady();
82
- }
83
- } catch (error) {
84
- if (options.onError) {
85
- await options.onError(error instanceof Error ? error : new Error(String(error)));
86
- return;
87
- }
88
-
89
- throw error;
90
- }
91
- };
92
- }
93
-
94
- /**
95
- * Scans the filesystem and dynamically constructs the Route Registry.
96
- *
97
- * This process runs identically across both Bun and Node wrappers. It analyzes the configured pages
98
- * directory, building a map of all available UI routes and API endpoints.
99
- * The resulting `RouteRegistry` instance becomes the central nervous system for mapping WinterCG incoming
100
- * Web Requests (`Request`) to their corresponding internal execution paths.
101
- */
102
- protected async initSharedRouter(): Promise<void> {
103
- this.router = new RouteRegistry({
104
- pagesDir: path.join(this.appConfig.rootDir, this.appConfig.srcDir, this.appConfig.pagesDir),
105
- appConfig: this.appConfig,
106
- origin: this.runtimeOrigin,
107
- templatesExt: this.appConfig.templatesExt,
108
- buildMode: !this.options?.watch,
109
- pageModuleAdapter: this.createRouteRegistryPageModuleAdapter(),
110
- });
111
-
112
- await this.router.init();
113
- }
114
-
115
- private createRouteRegistryPageModuleAdapter(): RouteRegistryPageModuleAdapter {
116
- const serverModuleTranspiler = getAppServerModuleTranspiler(this.appConfig);
117
-
118
- return {
119
- loadPageModule: async (filePath) => {
120
- const module = (await serverModuleTranspiler.importModule({
121
- filePath,
122
- outdir: path.join(resolveInternalExecutionDir(this.appConfig), '.server-route-modules'),
123
- externalPackages: false,
124
- transpileErrorMessage: (details) => `Error transpiling route module: ${details}`,
125
- noOutputMessage: (targetFilePath) =>
126
- `No transpiled output generated for route module: ${targetFilePath}`,
127
- })) as EcoPageFile;
128
-
129
- const page = module.default;
130
-
131
- return {
132
- staticPaths: page?.staticPaths ?? module.getStaticPaths,
133
- staticProps: page?.staticProps ?? module.getStaticProps,
134
- };
135
- },
136
- };
137
- }
138
-
139
- /**
140
- * Sets up the unified rendering pipeline and response matching chain.
141
- *
142
- * It bridges several sub-systems together so that when an incoming request is received, the adapter knows:
143
- * 1. How to render React/Lit pages via `RouteRendererFactory`
144
- * 2. How to match logical routes to physical filesystem artifacts via `FileSystemResponseMatcher`
145
- * 3. Whether to serve the response from the embedded `PageCacheService` or generate it fresh on the fly.
146
- *
147
- * Because `HmrManager` implementations rely heavily on runtime-specific WebSocket APIs (e.g. Bun.serve Websockets vs Node WS),
148
- * we leave it untyped (`any`) here at the common denominator core.
149
- *
150
- * @param staticRoutes - A map of explicitly served static assets.
151
- * @param hmrManager - The runtime-specific Hot Module Replacement orchestrator (if watching).
152
- */
153
- protected configureSharedResponseHandlers(staticRoutes: StaticRoute[], hmrManager?: any): void {
154
- this.routeRendererFactory = new RouteRendererFactory({
155
- appConfig: this.appConfig,
156
- rendererModules: this.appConfig.runtime?.rendererModuleContext,
157
- runtimeOrigin: this.runtimeOrigin,
158
- });
159
-
160
- const { fileSystemResponseMatcher, explicitStaticRouteMatcher } =
161
- this.createSharedResponseHandlerDependencies(staticRoutes);
162
-
163
- this.fileSystemResponseMatcher = fileSystemResponseMatcher;
164
- this.routeHandler = new ServerRouteHandler({
165
- router: this.router,
166
- fileSystemResponseMatcher: this.fileSystemResponseMatcher,
167
- explicitStaticRouteMatcher,
168
- watch: !!this.options?.watch,
169
- hmrManager,
170
- });
171
- }
172
-
173
- private createSharedResponseHandlerDependencies(staticRoutes: StaticRoute[]): SharedResponseHandlerDependencies {
174
- const fileSystemResponseFactory = new FileSystemServerResponseFactory({
175
- options: {
176
- watchMode: !!this.options?.watch,
177
- },
178
- });
179
-
180
- const cacheService = this.createSharedPageCacheService();
181
- const fileSystemResponseMatcher = new FileSystemResponseMatcher({
182
- appConfig: this.appConfig,
183
- assetPrefix: path.join(this.appConfig.rootDir, this.appConfig.distDir),
184
- router: this.router,
185
- routeRendererFactory: this.routeRendererFactory,
186
- fileSystemResponseFactory,
187
- cacheService,
188
- defaultCacheStrategy: this.appConfig.cache?.defaultStrategy ?? 'static',
189
- });
190
-
191
- return {
192
- cacheService,
193
- fileSystemResponseMatcher,
194
- explicitStaticRouteMatcher:
195
- staticRoutes.length > 0
196
- ? new ExplicitStaticRouteMatcher({
197
- appConfig: this.appConfig,
198
- routeRendererFactory: this.routeRendererFactory,
199
- staticRoutes,
200
- })
201
- : undefined,
202
- };
203
- }
204
-
205
- private createSharedPageCacheService(): PageCacheService | null {
206
- const cacheConfig = this.appConfig.cache;
207
- const isCacheEnabled = cacheConfig?.enabled ?? !this.options?.watch;
208
- if (!isCacheEnabled) {
209
- return null;
210
- }
211
-
212
- const store =
213
- cacheConfig?.store === 'memory' || !cacheConfig?.store
214
- ? new MemoryCacheStore({ maxEntries: cacheConfig?.maxEntries })
215
- : cacheConfig.store;
216
- return new PageCacheService({ store, enabled: true });
217
- }
218
-
219
- protected getCacheService(): CacheInvalidator | null {
220
- return this.fileSystemResponseMatcher?.getCacheService() ?? null;
221
- }
222
-
223
- protected getRenderContext(): RenderContext {
224
- return createRenderContext({
225
- integrations: this.appConfig.integrations,
226
- rendererModules: this.appConfig.runtime?.rendererModuleContext,
227
- });
228
- }
229
-
230
- /**
231
- * Executes an Application Programming Interface (API) handler in an environment-agnostic manner.
232
- *
233
- * API routes in Ecopages are universally written using standard WinterCG `Request` and `Response` objects.
234
- * This execution pipeline takes the raw `Request`, extracts its dynamic segments, runs our high-speed JSON schema
235
- * validator against the body/query/headers, and triggers the developer's middleware chain sequentially.
236
- *
237
- * If the execution throws an error, it is gracefully caught, logged, and mutated into a standardized Http error payload,
238
- * ensuring the consuming client receives a parsable response even upon internal catastrophic failure.
239
- *
240
- * @param request - The incoming Web standard `Request`.
241
- * @param params - The extracted dynamic URL parameters (e.g., `{ id: '123' }`).
242
- * @param routeConfig - The user-defined API handler object containing their business logic (`handler`) and `middleware`.
243
- * @param serverInstance - Untyped reference to the underlying native server instance (BunServer/NodeServer) for potential escape hatches.
244
- * @param errorHandler - Optional global error trap defined in project configuration.
245
- * @returns The resulting Web standard `Response` constructed by the user's handler.
246
- */
247
- protected async executeApiHandler(
248
- request: Request,
249
- params: Record<string, string | string[]>,
250
- routeConfig: ApiHandler,
251
- serverInstance: any,
252
- errorHandler?: ErrorHandler,
253
- ): Promise<Response> {
254
- let context: ApiHandlerContext<Request, any> | undefined;
255
-
256
- try {
257
- context = this.createApiHandlerContext(request, params, serverInstance);
258
- const schemaResponse = await this.applyApiRequestSchema(context, routeConfig.schema);
259
- if (schemaResponse) {
260
- return schemaResponse;
261
- }
262
-
263
- return await this.runApiMiddlewareChain(context, routeConfig);
264
- } catch (error) {
265
- if (error instanceof Response) return error;
266
-
267
- if (errorHandler) {
268
- try {
269
- if (!context) {
270
- context = this.createApiHandlerContext(request, params, serverInstance);
271
- }
272
- return await errorHandler(error, context);
273
- } catch (handlerError) {
274
- appLogger.error(`[ecopages] Error in custom error handler: ${handlerError}`);
275
- }
276
- }
277
-
278
- if (error instanceof HttpError) return error.toResponse();
279
- appLogger.error(`[ecopages] Error handling API request: ${error}`);
280
- return new Response('Internal Server Error', { status: 500 });
281
- }
282
- }
283
-
284
- private createApiHandlerContext(
285
- request: Request,
286
- params: Record<string, string | string[]>,
287
- serverInstance: any,
288
- ): ApiHandlerContext<Request, any> {
289
- const locals: Record<string, unknown> = {};
290
- const normalizedParams = this.normalizeApiParams(params);
291
-
292
- return {
293
- request,
294
- params: normalizedParams,
295
- response: new ApiResponseBuilder(),
296
- server: serverInstance,
297
- locals,
298
- require: createRequire((): Record<string, unknown> => locals),
299
- services: {
300
- cache: this.getCacheService(),
301
- },
302
- ...this.getRenderContext(),
303
- };
304
- }
305
-
306
- private normalizeApiParams(params: Record<string, string | string[]>): Record<string, string> {
307
- return Object.fromEntries(
308
- Object.entries(params).map(([key, value]) => [key, Array.isArray(value) ? value.join('/') : value]),
309
- );
310
- }
311
-
312
- private async applyApiRequestSchema(
313
- context: ApiHandlerContext<Request, any>,
314
- schema: ApiHandler['schema'],
315
- ): Promise<Response | undefined> {
316
- if (!schema) {
317
- return undefined;
318
- }
319
-
320
- const url = new URL(context.request.url);
321
- const queryParams = Object.fromEntries(url.searchParams);
322
- const headers = Object.fromEntries(context.request.headers);
323
-
324
- let body: unknown;
325
- if (schema.body) {
326
- try {
327
- const contentType = context.request.headers.get('Content-Type') || '';
328
- if (contentType.includes('application/json')) body = await context.request.clone().json();
329
- else if (contentType.includes('text/plain')) body = await context.request.clone().text();
330
- } catch {
331
- return context.response.status(400).json({ error: 'Invalid request body' });
332
- }
333
- }
334
-
335
- const validationResult = await this.schemaValidator.validateRequest(
336
- { body, query: queryParams, headers, params: context.params },
337
- schema,
338
- );
339
-
340
- if (!validationResult.success) {
341
- return context.response.status(400).json({
342
- error: 'Validation failed',
343
- issues: validationResult.errors,
344
- });
345
- }
346
-
347
- const validated = validationResult.data!;
348
- if (validated.body !== undefined) context.body = validated.body;
349
- if (validated.query !== undefined) context.query = validated.query;
350
- if (validated.headers !== undefined) context.headers = validated.headers;
351
- if (validated.params !== undefined) context.params = validated.params as Record<string, string>;
352
- return undefined;
353
- }
354
-
355
- private async runApiMiddlewareChain(
356
- context: ApiHandlerContext<Request, any>,
357
- routeConfig: ApiHandler,
358
- ): Promise<Response> {
359
- const middleware = routeConfig.middleware || [];
360
- if (middleware.length === 0) {
361
- return await routeConfig.handler(context);
362
- }
363
-
364
- let index = 0;
365
- const executeNext = async (): Promise<Response> => {
366
- if (index < middleware.length) {
367
- const currentMiddleware = middleware[index++];
368
- return await currentMiddleware(context, executeNext);
369
- }
370
- return await routeConfig.handler(context);
371
- };
372
-
373
- return await executeNext();
374
- }
375
-
376
- private normalizePath(pathname: string): string {
377
- if (pathname.length > 1 && pathname.endsWith('/')) {
378
- return pathname.slice(0, -1);
379
- }
380
-
381
- return pathname;
382
- }
383
-
384
- private matchApiPath(pattern: string, pathname: string): Record<string, string | string[]> | null {
385
- const normalizedPattern = this.normalizePath(pattern);
386
- const normalizedPathname = this.normalizePath(pathname);
387
-
388
- const patternSegments = normalizedPattern.split('/').filter(Boolean);
389
- const pathSegments = normalizedPathname.split('/').filter(Boolean);
390
- const params: Record<string, string | string[]> = {};
391
-
392
- let patternIndex = 0;
393
- let pathIndex = 0;
394
-
395
- while (patternIndex < patternSegments.length && pathIndex < pathSegments.length) {
396
- const patternSegment = patternSegments[patternIndex];
397
- const pathSegment = pathSegments[pathIndex];
398
-
399
- if (patternSegment === '*') {
400
- return params;
401
- }
402
-
403
- if (patternSegment.startsWith('[...') && patternSegment.endsWith(']')) {
404
- const paramName = patternSegment.slice(4, -1);
405
- params[paramName] = pathSegments.slice(pathIndex);
406
- return params;
407
- }
408
-
409
- if (patternSegment.startsWith(':')) {
410
- params[patternSegment.slice(1)] = pathSegment;
411
- patternIndex++;
412
- pathIndex++;
413
- continue;
414
- }
415
-
416
- if (patternSegment.startsWith('[') && patternSegment.endsWith(']')) {
417
- params[patternSegment.slice(1, -1)] = pathSegment;
418
- patternIndex++;
419
- pathIndex++;
420
- continue;
421
- }
422
-
423
- if (patternSegment !== pathSegment) {
424
- return null;
425
- }
426
-
427
- patternIndex++;
428
- pathIndex++;
429
- }
430
-
431
- if (patternIndex < patternSegments.length) {
432
- const remaining = patternSegments.slice(patternIndex);
433
- const catchAll = remaining[0];
434
-
435
- if (
436
- remaining.length === 1 &&
437
- (catchAll === '*' || (catchAll.startsWith('[...') && catchAll.endsWith(']')))
438
- ) {
439
- if (catchAll.startsWith('[...')) {
440
- const paramName = catchAll.slice(4, -1);
441
- params[paramName] = [];
442
- }
443
- return params;
444
- }
445
-
446
- return null;
447
- }
448
-
449
- if (pathIndex < pathSegments.length) {
450
- return null;
451
- }
452
-
453
- return params;
454
- }
455
-
456
- private getApiPathScore(pattern: string): number {
457
- const segments = this.normalizePath(pattern).split('/').filter(Boolean);
458
- let score = 0;
459
- for (const segment of segments) {
460
- if (segment === '*' || (segment.startsWith('[...') && segment.endsWith(']'))) {
461
- score += 10;
462
- } else if (segment.startsWith(':') || (segment.startsWith('[') && segment.endsWith(']'))) {
463
- score += 50;
464
- } else {
465
- score += 100;
466
- }
467
- }
468
- return score;
469
- }
470
-
471
- protected matchApiHandler(
472
- request: Request,
473
- apiHandlers: ApiHandler[],
474
- ): { routeConfig: ApiHandler; params: Record<string, string | string[]> } | null {
475
- const pathname = new URL(request.url).pathname;
476
- const method = request.method.toUpperCase();
477
-
478
- const sortedHandlers = [...apiHandlers].sort((a, b) => {
479
- return this.getApiPathScore(b.path) - this.getApiPathScore(a.path);
480
- });
481
-
482
- for (const routeConfig of sortedHandlers) {
483
- const routeMethod = (routeConfig.method || 'GET').toUpperCase();
484
- if (routeMethod !== method) {
485
- continue;
486
- }
487
-
488
- const params = this.matchApiPath(routeConfig.path, pathname);
489
- if (params) {
490
- return { routeConfig, params };
491
- }
492
- }
493
-
494
- return null;
495
- }
496
-
497
- private tryHandleSharedHmrRequest(request: Request, context: SharedRequestContext): Response | null {
498
- const url = new URL(request.url);
499
-
500
- if (url.pathname === '/_hmr_runtime.js' && context.hmrManager) {
501
- const runtimePath = context.hmrManager.getRuntimePath();
502
- if (fileSystem.exists(runtimePath)) {
503
- return new Response(fileSystem.readFileAsBuffer(runtimePath) as BodyInit, {
504
- headers: { 'Content-Type': 'application/javascript' },
505
- });
506
- }
507
- }
508
-
509
- if (url.pathname.startsWith('/assets/_hmr/') && context.hmrManager) {
510
- const relativePath = url.pathname.slice('/assets/_hmr/'.length);
511
- const assetPath = path.join(context.hmrManager.getDistDir(), relativePath);
512
-
513
- if (fileSystem.exists(assetPath)) {
514
- return new Response(fileSystem.readFileAsBuffer(assetPath) as BodyInit, {
515
- headers: { 'Content-Type': 'application/javascript' },
516
- });
517
- }
518
- }
519
-
520
- return null;
521
- }
522
-
523
- private async tryHandleSharedApiRequest(request: Request, context: SharedRequestContext): Promise<Response | null> {
524
- const apiMatch = this.matchApiHandler(request, context.apiHandlers);
525
- if (!apiMatch) {
526
- return null;
527
- }
528
-
529
- return await this.executeApiHandler(
530
- request,
531
- apiMatch.params,
532
- apiMatch.routeConfig,
533
- context.serverInstance,
534
- context.errorHandler,
535
- );
536
- }
537
-
538
- /**
539
- * Universally processes an incoming WinterCG Web standard Request.
540
- *
541
- * 1. Resolves static Hot Module Replacement runtime blobs if development.
542
- * 2. Checks if the incoming request matches any parsed API route schemas.
543
- * - Routes through `executeApiHandler` which performs strict validation.
544
- * 3. Falls through to standard `ServerRouteHandler` for React/Lit filesystem pages.
545
- *
546
- * Both Bun and Node bindings fall back to this exact function once they have mapped their
547
- * native HTTP objects into Web Standard Requests.
548
- */
549
- public async handleSharedRequest(request: Request, context: SharedRequestContext): Promise<Response> {
550
- const hmrResponse = this.tryHandleSharedHmrRequest(request, context);
551
- if (hmrResponse) {
552
- return hmrResponse;
553
- }
554
-
555
- const apiResponse = await this.tryHandleSharedApiRequest(request, context);
556
- if (apiResponse) {
557
- return apiResponse;
558
- }
559
-
560
- return this.routeHandler.handleResponse(request);
561
- }
562
- }
@@ -1,111 +0,0 @@
1
- import { describe, expect, it, vi } from 'vitest';
2
- import { ServerRouteHandler } from './server-route-handler';
3
- import type { RouteRegistry } from '../../router/server/route-registry.ts';
4
- import type { FileSystemResponseMatcher } from './fs-server-response-matcher.ts';
5
- import type { IHmrManager } from '../../types/public-types.ts';
6
-
7
- function createMockDependencies() {
8
- const Router = {
9
- matchRequest: vi.fn(() => null),
10
- origin: 'http://localhost:3000',
11
- } as unknown as RouteRegistry;
12
-
13
- const FileSystemResponseMatcher = {
14
- handleMatch: vi.fn(() => Promise.resolve(new Response('Matched Content'))),
15
- handleNoMatch: vi.fn(() => Promise.resolve(new Response('Not Found', { status: 404 }))),
16
- } as unknown as FileSystemResponseMatcher;
17
-
18
- const HmrManager = {
19
- isEnabled: vi.fn(() => true),
20
- broadcast: vi.fn(),
21
- } as unknown as IHmrManager;
22
-
23
- return {
24
- Router,
25
- FileSystemResponseMatcher,
26
- HmrManager,
27
- };
28
- }
29
-
30
- describe('ServerRouteHandler', () => {
31
- describe('handleResponse', () => {
32
- it('should delegate to fileSystemResponseMatcher when route matches', async () => {
33
- const { Router, FileSystemResponseMatcher } = createMockDependencies();
34
- const handler = new ServerRouteHandler({
35
- router: Router,
36
- fileSystemResponseMatcher: FileSystemResponseMatcher,
37
- });
38
-
39
- Router.matchRequest = vi.fn(
40
- () =>
41
- ({
42
- /* match */
43
- }) as any,
44
- );
45
- const request = new Request('http://localhost/test');
46
- const response = await handler.handleResponse(request);
47
-
48
- expect(FileSystemResponseMatcher.handleMatch).toHaveBeenCalled();
49
- expect(response.status).toBe(200);
50
- });
51
-
52
- it('should delegate to handleNoMatch when route does not match', async () => {
53
- const { Router, FileSystemResponseMatcher } = createMockDependencies();
54
- const handler = new ServerRouteHandler({
55
- router: Router,
56
- fileSystemResponseMatcher: FileSystemResponseMatcher,
57
- });
58
-
59
- const request = new Request('http://localhost/unknown');
60
- const response = await handler.handleResponse(request);
61
-
62
- expect(FileSystemResponseMatcher.handleNoMatch).toHaveBeenCalled();
63
- expect(response.status).toBe(404);
64
- });
65
-
66
- it('should inject HMR script in watch mode for HTML responses', async () => {
67
- const { Router, FileSystemResponseMatcher, HmrManager } = createMockDependencies();
68
- const handler = new ServerRouteHandler({
69
- router: Router,
70
- fileSystemResponseMatcher: FileSystemResponseMatcher,
71
- watch: true,
72
- hmrManager: HmrManager,
73
- });
74
-
75
- Router.matchRequest = vi.fn(() => ({}) as any);
76
- FileSystemResponseMatcher.handleMatch = vi.fn(() =>
77
- Promise.resolve(
78
- new Response('<html><body></body></html>', { headers: { 'Content-Type': 'text/html' } }),
79
- ),
80
- );
81
-
82
- const request = new Request('http://localhost/test');
83
- const response = await handler.handleResponse(request);
84
- const text = await response.text();
85
-
86
- expect(text).toContain("import '/_hmr_runtime.js'");
87
- });
88
- });
89
-
90
- describe('handleNoMatch', () => {
91
- it('should broadcast error if handleNoMatch throws', async () => {
92
- const { Router, FileSystemResponseMatcher, HmrManager } = createMockDependencies();
93
- const handler = new ServerRouteHandler({
94
- router: Router,
95
- fileSystemResponseMatcher: FileSystemResponseMatcher,
96
- watch: true,
97
- hmrManager: HmrManager,
98
- });
99
-
100
- FileSystemResponseMatcher.handleNoMatch = vi.fn(() => {
101
- throw new Error('Test Error');
102
- });
103
-
104
- const request = new Request('http://localhost/unknown');
105
- const response = await handler.handleNoMatch(request);
106
-
107
- expect(response.status).toBe(500);
108
- expect(HmrManager.broadcast).toHaveBeenCalledWith({ type: 'error', message: 'Test Error' });
109
- });
110
- });
111
- });