@ecopages/core 0.2.0-alpha.5 → 0.2.0-alpha.51

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 (456) hide show
  1. package/README.md +267 -14
  2. package/package.json +98 -108
  3. package/src/adapters/README.md +39 -0
  4. package/src/adapters/abstract/application-adapter.d.ts +28 -2
  5. package/src/adapters/abstract/application-adapter.js +14 -2
  6. package/src/adapters/abstract/router-adapter.d.ts +1 -1
  7. package/src/adapters/abstract/server-adapter.d.ts +2 -2
  8. package/src/adapters/bun/client-bridge.d.ts +1 -1
  9. package/src/adapters/bun/create-app.d.ts +12 -12
  10. package/src/adapters/bun/create-app.js +64 -41
  11. package/src/adapters/bun/hmr-manager.d.ts +30 -62
  12. package/src/adapters/bun/hmr-manager.js +30 -194
  13. package/src/adapters/bun/index.d.ts +2 -3
  14. package/src/adapters/bun/index.js +3 -3
  15. package/src/adapters/bun/runtime-host.d.ts +52 -0
  16. package/src/adapters/bun/runtime-host.js +56 -0
  17. package/src/adapters/bun/server-adapter.d.ts +93 -32
  18. package/src/adapters/bun/server-adapter.js +166 -89
  19. package/src/adapters/bun/static-preview-host.d.ts +28 -0
  20. package/src/adapters/bun/static-preview-host.js +45 -0
  21. package/src/{create-app.d.ts → adapters/create-app.d.ts} +9 -6
  22. package/src/{create-app.js → adapters/create-app.js} +4 -4
  23. package/src/adapters/index.d.ts +2 -6
  24. package/src/adapters/index.js +2 -8
  25. package/src/adapters/node/create-app.d.ts +15 -12
  26. package/src/adapters/node/create-app.js +34 -85
  27. package/src/adapters/node/http-request-bridge.d.ts +57 -0
  28. package/src/adapters/node/http-request-bridge.js +118 -0
  29. package/src/adapters/node/node-client-bridge.d.ts +1 -1
  30. package/src/adapters/node/node-hmr-manager.d.ts +38 -48
  31. package/src/adapters/node/node-hmr-manager.js +31 -203
  32. package/src/adapters/node/runtime-host.d.ts +57 -0
  33. package/src/adapters/node/runtime-host.js +92 -0
  34. package/src/adapters/node/server-adapter-dependencies.d.ts +19 -0
  35. package/src/adapters/node/server-adapter-dependencies.js +18 -0
  36. package/src/adapters/node/server-adapter.d.ts +20 -72
  37. package/src/adapters/node/server-adapter.js +98 -203
  38. package/src/adapters/node/static-content-server.d.ts +37 -1
  39. package/src/adapters/node/static-content-server.js +29 -1
  40. package/src/adapters/node/static-preview-host.d.ts +55 -0
  41. package/src/adapters/node/static-preview-host.js +68 -0
  42. package/src/adapters/shared/application-adapter.d.ts +1 -1
  43. package/src/{define-api-handler.d.ts → adapters/shared/define-api-handler.d.ts} +1 -1
  44. package/src/adapters/shared/explicit-static-render-preparation.d.ts +25 -0
  45. package/src/adapters/shared/explicit-static-render-preparation.js +26 -0
  46. package/src/adapters/shared/explicit-static-route-matcher.d.ts +7 -4
  47. package/src/adapters/shared/explicit-static-route-matcher.js +14 -13
  48. package/src/adapters/shared/file-route-middleware-pipeline.d.ts +7 -10
  49. package/src/adapters/shared/file-route-middleware-pipeline.js +3 -11
  50. package/src/adapters/shared/fs-server-response-factory.d.ts +14 -10
  51. package/src/adapters/shared/fs-server-response-factory.js +11 -27
  52. package/src/adapters/shared/fs-server-response-matcher.d.ts +20 -16
  53. package/src/adapters/shared/fs-server-response-matcher.js +76 -45
  54. package/src/adapters/shared/hmr-entrypoint-registrar.d.ts +55 -0
  55. package/src/adapters/shared/hmr-entrypoint-registrar.js +87 -0
  56. package/src/adapters/shared/hmr-html-response.d.ts +22 -0
  57. package/src/adapters/shared/hmr-html-response.js +33 -0
  58. package/src/adapters/shared/render-context.d.ts +5 -3
  59. package/src/adapters/shared/render-context.js +27 -3
  60. package/src/adapters/shared/runtime-app-bootstrap.d.ts +26 -0
  61. package/src/adapters/shared/runtime-app-bootstrap.js +46 -0
  62. package/src/adapters/shared/runtime-host.d.ts +12 -0
  63. package/src/adapters/shared/server-adapter.d.ts +33 -12
  64. package/src/adapters/shared/server-adapter.js +215 -132
  65. package/src/adapters/shared/server-route-handler.d.ts +5 -5
  66. package/src/adapters/shared/server-route-handler.js +7 -16
  67. package/src/adapters/shared/server-static-builder.d.ts +41 -8
  68. package/src/adapters/shared/server-static-builder.js +65 -11
  69. package/src/adapters/shared/shared-hmr-manager.d.ts +59 -0
  70. package/src/adapters/shared/shared-hmr-manager.js +240 -0
  71. package/src/adapters/shared/static-preview-host.d.ts +10 -0
  72. package/src/build/README.md +107 -0
  73. package/src/build/browser-runtime-import-rewrite-plugin.d.ts +26 -0
  74. package/src/build/browser-runtime-import-rewrite-plugin.js +162 -0
  75. package/src/build/browser-runtime-manifest.d.ts +31 -0
  76. package/src/build/browser-runtime-manifest.js +61 -0
  77. package/src/build/build-adapter.d.ts +175 -3
  78. package/src/build/build-adapter.js +633 -16
  79. package/src/build/build-manifest.d.ts +33 -0
  80. package/src/build/build-manifest.js +52 -0
  81. package/src/build/dev-build-coordinator.d.ts +72 -0
  82. package/src/build/dev-build-coordinator.js +154 -0
  83. package/src/build/esbuild-build-adapter.d.ts +16 -6
  84. package/src/build/esbuild-build-adapter.js +205 -75
  85. package/src/build/runtime-build-executor.d.ts +14 -0
  86. package/src/build/runtime-build-executor.js +22 -0
  87. package/src/build/runtime-specifier-alias-plugin.d.ts +15 -0
  88. package/src/build/runtime-specifier-alias-plugin.js +31 -0
  89. package/src/config/README.md +36 -0
  90. package/src/config/config-builder.d.ts +54 -29
  91. package/src/config/config-builder.js +256 -50
  92. package/src/{constants.d.ts → config/constants.d.ts} +13 -0
  93. package/src/{constants.js → config/constants.js} +4 -0
  94. package/src/declarations.d.ts +19 -14
  95. package/src/dev/host-runtime.d.ts +10 -0
  96. package/src/dev/host-runtime.js +24 -0
  97. package/src/dev/sc-server.d.ts +1 -1
  98. package/src/dev/sc-server.js +1 -1
  99. package/src/eco/README.md +70 -16
  100. package/src/eco/eco.browser.d.ts +2 -0
  101. package/src/eco/eco.browser.js +88 -0
  102. package/src/eco/eco.js +63 -54
  103. package/src/eco/eco.types.d.ts +69 -6
  104. package/src/eco/eco.utils.d.ts +1 -40
  105. package/src/eco/eco.utils.js +5 -35
  106. package/src/eco/global-injector-map.d.ts +3 -3
  107. package/src/eco/global-injector-map.js +2 -2
  108. package/src/eco/lazy-injector-map.d.ts +2 -2
  109. package/src/errors/index.d.ts +1 -0
  110. package/src/errors/index.js +3 -1
  111. package/src/hmr/README.md +26 -0
  112. package/src/hmr/client/hmr-runtime.d.ts +1 -6
  113. package/src/hmr/client/hmr-runtime.js +38 -7
  114. package/src/hmr/hmr-strategy.d.ts +16 -13
  115. package/src/hmr/hmr-strategy.js +22 -7
  116. package/src/hmr/hmr.postcss.test.e2e.d.ts +1 -0
  117. package/src/hmr/hmr.postcss.test.e2e.js +31 -0
  118. package/src/hmr/hmr.test.e2e.js +26 -33
  119. package/src/hmr/strategies/default-hmr-strategy.d.ts +2 -2
  120. package/src/hmr/strategies/default-hmr-strategy.js +1 -1
  121. package/src/hmr/strategies/js-hmr-strategy.d.ts +40 -42
  122. package/src/hmr/strategies/js-hmr-strategy.js +24 -43
  123. package/src/index.browser.d.ts +2 -2
  124. package/src/index.browser.js +1 -1
  125. package/src/index.d.ts +4 -3
  126. package/src/index.js +16 -5
  127. package/src/integrations/ghtml/ghtml-renderer.d.ts +3 -2
  128. package/src/integrations/ghtml/ghtml-renderer.js +27 -30
  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 +2 -6
  132. package/src/integrations/ghtml/ghtml.plugin.js +3 -4
  133. package/src/plugins/README.md +35 -0
  134. package/src/plugins/alias-resolver-plugin.d.ts +1 -0
  135. package/src/plugins/alias-resolver-plugin.js +27 -5
  136. package/src/plugins/eco-component-meta-plugin.d.ts +14 -1
  137. package/src/plugins/eco-component-meta-plugin.js +42 -24
  138. package/src/plugins/foreign-jsx-override-plugin.d.ts +33 -0
  139. package/src/plugins/foreign-jsx-override-plugin.js +41 -0
  140. package/src/plugins/integration-plugin.d.ts +157 -29
  141. package/src/plugins/integration-plugin.js +115 -14
  142. package/src/plugins/processor.d.ts +17 -2
  143. package/src/plugins/processor.js +22 -3
  144. package/src/plugins/runtime-capability.d.ts +9 -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/GRAPH.md +83 -325
  148. package/src/route-renderer/README.md +73 -90
  149. package/src/route-renderer/orchestration/component-render-context.d.ts +97 -0
  150. package/src/route-renderer/orchestration/component-render-context.js +147 -0
  151. package/src/route-renderer/orchestration/declared-ownership-graph.d.ts +18 -0
  152. package/src/route-renderer/orchestration/declared-ownership-graph.js +34 -0
  153. package/src/route-renderer/orchestration/foreign-subtree-execution.service.d.ts +110 -0
  154. package/src/route-renderer/orchestration/foreign-subtree-execution.service.js +233 -0
  155. package/src/route-renderer/orchestration/integration-renderer.d.ts +534 -0
  156. package/src/route-renderer/orchestration/integration-renderer.js +991 -0
  157. package/src/route-renderer/orchestration/ownership-planning.service.d.ts +24 -0
  158. package/src/route-renderer/orchestration/ownership-planning.service.js +63 -0
  159. package/src/route-renderer/orchestration/ownership-validation.service.d.ts +29 -0
  160. package/src/route-renderer/orchestration/ownership-validation.service.js +53 -0
  161. package/src/route-renderer/orchestration/processed-asset-dedupe.d.ts +3 -0
  162. package/src/route-renderer/orchestration/processed-asset-dedupe.js +27 -0
  163. package/src/route-renderer/orchestration/queued-foreign-subtree-resolution.service.d.ts +91 -0
  164. package/src/route-renderer/orchestration/queued-foreign-subtree-resolution.service.js +170 -0
  165. package/src/route-renderer/orchestration/render-output.utils.d.ts +66 -0
  166. package/src/route-renderer/orchestration/render-output.utils.js +171 -0
  167. package/src/route-renderer/orchestration/route-render-orchestrator.d.ts +156 -0
  168. package/src/route-renderer/orchestration/route-render-orchestrator.js +577 -0
  169. package/src/route-renderer/orchestration/template-serialization.d.ts +38 -0
  170. package/src/route-renderer/orchestration/template-serialization.js +45 -0
  171. package/src/route-renderer/page-loading/component-dependency-collection.d.ts +37 -0
  172. package/src/route-renderer/page-loading/component-dependency-collection.js +132 -0
  173. package/src/route-renderer/page-loading/declared-asset-collection.d.ts +24 -0
  174. package/src/route-renderer/page-loading/declared-asset-collection.js +106 -0
  175. package/src/route-renderer/{dependency-resolver.d.ts → page-loading/dependency-resolver.d.ts} +15 -4
  176. package/src/route-renderer/page-loading/dependency-resolver.js +115 -0
  177. package/src/route-renderer/page-loading/ecopages-virtual-imports.d.ts +11 -0
  178. package/src/route-renderer/page-loading/ecopages-virtual-imports.js +57 -0
  179. package/src/route-renderer/page-loading/lazy-entry-collection.d.ts +45 -0
  180. package/src/route-renderer/page-loading/lazy-entry-collection.js +105 -0
  181. package/src/route-renderer/page-loading/lazy-trigger-planning.d.ts +19 -0
  182. package/src/route-renderer/page-loading/lazy-trigger-planning.js +40 -0
  183. package/src/route-renderer/page-loading/module-declaration-aggregation.d.ts +5 -0
  184. package/src/route-renderer/page-loading/module-declaration-aggregation.js +33 -0
  185. package/src/route-renderer/page-loading/module-declaration-scripts.d.ts +3 -0
  186. package/src/route-renderer/page-loading/module-declaration-scripts.js +18 -0
  187. package/src/route-renderer/page-loading/page-dependency-bundling.d.ts +13 -0
  188. package/src/route-renderer/page-loading/page-dependency-bundling.js +137 -0
  189. package/src/route-renderer/page-loading/page-module-loader.d.ts +90 -0
  190. package/src/route-renderer/{page-module-loader.js → page-loading/page-module-loader.js} +39 -14
  191. package/src/route-renderer/route-renderer.d.ts +57 -14
  192. package/src/route-renderer/route-renderer.js +30 -18
  193. package/src/router/README.md +94 -0
  194. package/src/router/client/link-intent.d.ts +53 -0
  195. package/src/router/client/link-intent.js +34 -0
  196. package/src/router/client/link-intent.test.browser.d.ts +1 -0
  197. package/src/router/client/link-intent.test.browser.js +43 -0
  198. package/src/router/client/navigation-coordinator.d.ts +169 -0
  199. package/src/router/client/navigation-coordinator.js +215 -0
  200. package/src/router/server/route-registry.d.ts +78 -0
  201. package/src/router/server/route-registry.js +262 -0
  202. package/src/services/README.md +28 -0
  203. package/src/services/assets/asset-processing-service/asset-dependency-keys.d.ts +3 -0
  204. package/src/services/assets/asset-processing-service/asset-dependency-keys.js +56 -0
  205. package/src/services/assets/asset-processing-service/asset-processing.service.d.ts +103 -0
  206. package/src/services/{asset-processing-service → assets/asset-processing-service}/asset-processing.service.js +124 -89
  207. package/src/services/{asset-processing-service → assets/asset-processing-service}/asset.factory.d.ts +1 -1
  208. package/src/services/{asset-processing-service → assets/asset-processing-service}/asset.factory.js +2 -2
  209. package/src/services/{asset-processing-service → assets/asset-processing-service}/assets.types.d.ts +16 -1
  210. package/src/services/assets/asset-processing-service/assets.types.js +0 -0
  211. package/src/services/assets/asset-processing-service/browser-runtime-asset.factory.d.ts +57 -0
  212. package/src/services/assets/asset-processing-service/browser-runtime-asset.factory.js +49 -0
  213. package/src/services/assets/asset-processing-service/browser-runtime-entry.factory.d.ts +20 -0
  214. package/src/services/assets/asset-processing-service/browser-runtime-entry.factory.js +41 -0
  215. package/src/services/assets/asset-processing-service/grouped-content-bundles.d.ts +30 -0
  216. package/src/services/assets/asset-processing-service/grouped-content-bundles.js +65 -0
  217. package/src/services/assets/asset-processing-service/index.d.ts +6 -0
  218. package/src/services/assets/asset-processing-service/index.js +6 -0
  219. package/src/services/assets/asset-processing-service/page-package.d.ts +6 -0
  220. package/src/services/assets/asset-processing-service/page-package.js +80 -0
  221. package/src/services/{asset-processing-service → assets/asset-processing-service}/processor.interface.d.ts +2 -2
  222. package/src/services/{asset-processing-service → assets/asset-processing-service}/processor.registry.d.ts +2 -2
  223. package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/base/base-processor.d.ts +1 -1
  224. package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/base/base-processor.js +11 -5
  225. package/src/services/assets/asset-processing-service/processors/base/base-script-processor.d.ts +22 -0
  226. package/src/services/assets/asset-processing-service/processors/base/base-script-processor.js +136 -0
  227. package/src/services/assets/asset-processing-service/processors/index.d.ts +5 -0
  228. package/src/services/assets/asset-processing-service/processors/index.js +5 -0
  229. package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/script/content-script.processor.d.ts +3 -2
  230. package/src/services/assets/asset-processing-service/processors/script/content-script.processor.js +120 -0
  231. package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/script/file-script.processor.d.ts +4 -3
  232. package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/script/file-script.processor.js +28 -7
  233. package/src/services/assets/asset-processing-service/processors/script/node-module-script.processor.d.ts +42 -0
  234. package/src/services/assets/asset-processing-service/processors/script/node-module-script.processor.js +126 -0
  235. package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/stylesheet/content-stylesheet.processor.d.ts +5 -2
  236. package/src/services/assets/asset-processing-service/processors/stylesheet/content-stylesheet.processor.js +59 -0
  237. package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/stylesheet/file-stylesheet.processor.d.ts +2 -2
  238. package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/stylesheet/file-stylesheet.processor.js +9 -3
  239. package/src/services/assets/asset-processing-service/ungrouped-dependency-processing.d.ts +18 -0
  240. package/src/services/assets/asset-processing-service/ungrouped-dependency-processing.js +45 -0
  241. package/src/services/assets/browser-bundle.service.d.ts +73 -0
  242. package/src/services/assets/browser-bundle.service.js +41 -0
  243. package/src/services/{page-request-cache-coordinator.service.d.ts → cache/page-request-cache-coordinator.service.d.ts} +2 -2
  244. package/src/services/{page-request-cache-coordinator.service.js → cache/page-request-cache-coordinator.service.js} +3 -1
  245. package/src/services/html/html-rewriter-provider.service.d.ts +40 -0
  246. package/src/services/html/html-rewriter-provider.service.js +68 -0
  247. package/src/services/html/html-transformer.service.d.ts +96 -0
  248. package/src/services/html/html-transformer.service.js +287 -0
  249. package/src/services/invalidation/development-invalidation.service.d.ts +74 -0
  250. package/src/services/invalidation/development-invalidation.service.js +190 -0
  251. package/src/services/module-loading/app-module-loader.service.d.ts +7 -0
  252. package/src/services/module-loading/app-module-loader.service.js +0 -0
  253. package/src/services/module-loading/app-server-module-transpiler.service.d.ts +24 -0
  254. package/src/services/module-loading/app-server-module-transpiler.service.js +151 -0
  255. package/src/services/module-loading/host-module-loader-registry.d.ts +4 -0
  256. package/src/services/module-loading/host-module-loader-registry.js +15 -0
  257. package/src/services/module-loading/module-loading-types.d.ts +2 -0
  258. package/src/services/module-loading/module-loading-types.js +0 -0
  259. package/src/services/module-loading/node-bootstrap-plugin.d.ts +38 -0
  260. package/src/services/module-loading/node-bootstrap-plugin.js +215 -0
  261. package/src/services/module-loading/page-module-import.service.d.ts +95 -0
  262. package/src/services/module-loading/page-module-import.service.js +191 -0
  263. package/src/services/module-loading/server-module-transpiler.service.d.ts +63 -0
  264. package/src/services/module-loading/server-module-transpiler.service.js +64 -0
  265. package/src/services/module-loading/source-module-support.d.ts +5 -0
  266. package/src/services/module-loading/source-module-support.js +8 -0
  267. package/src/services/runtime-state/dev-graph.service.d.ts +118 -0
  268. package/src/services/runtime-state/dev-graph.service.js +162 -0
  269. package/src/services/runtime-state/entrypoint-dependency-graph.service.d.ts +41 -0
  270. package/src/services/runtime-state/entrypoint-dependency-graph.service.js +85 -0
  271. package/src/services/runtime-state/server-invalidation-state.service.d.ts +26 -0
  272. package/src/services/runtime-state/server-invalidation-state.service.js +35 -0
  273. package/src/services/{schema-validation-service.d.ts → validation/schema-validation-service.d.ts} +1 -1
  274. package/src/static-site-generator/README.md +26 -0
  275. package/src/static-site-generator/static-site-generator.d.ts +67 -20
  276. package/src/static-site-generator/static-site-generator.js +182 -138
  277. package/src/{internal-types.d.ts → types/internal-types.d.ts} +62 -30
  278. package/src/types/internal-types.js +0 -0
  279. package/src/{public-types.d.ts → types/public-types.d.ts} +239 -31
  280. package/src/types/public-types.js +0 -0
  281. package/src/utils/html-escaping.d.ts +7 -0
  282. package/src/utils/html-escaping.js +6 -0
  283. package/src/utils/locals-utils.d.ts +1 -1
  284. package/src/utils/parse-cli-args.d.ts +4 -1
  285. package/src/utils/parse-cli-args.js +16 -1
  286. package/src/utils/resolve-work-dir.d.ts +11 -0
  287. package/src/utils/resolve-work-dir.js +31 -0
  288. package/src/watchers/project-watcher.d.ts +11 -7
  289. package/src/watchers/project-watcher.js +69 -75
  290. package/src/watchers/project-watcher.test-helpers.d.ts +2 -2
  291. package/src/watchers/project-watcher.test-helpers.js +6 -5
  292. package/CHANGELOG.md +0 -94
  293. package/src/adapters/abstract/application-adapter.ts +0 -337
  294. package/src/adapters/abstract/router-adapter.ts +0 -30
  295. package/src/adapters/abstract/server-adapter.ts +0 -79
  296. package/src/adapters/bun/client-bridge.ts +0 -62
  297. package/src/adapters/bun/create-app.ts +0 -189
  298. package/src/adapters/bun/define-api-handler.d.ts +0 -61
  299. package/src/adapters/bun/define-api-handler.ts +0 -114
  300. package/src/adapters/bun/hmr-manager.ts +0 -276
  301. package/src/adapters/bun/index.ts +0 -3
  302. package/src/adapters/bun/server-adapter.ts +0 -492
  303. package/src/adapters/bun/server-lifecycle.d.ts +0 -52
  304. package/src/adapters/bun/server-lifecycle.js +0 -120
  305. package/src/adapters/bun/server-lifecycle.ts +0 -154
  306. package/src/adapters/index.ts +0 -6
  307. package/src/adapters/node/create-app.ts +0 -179
  308. package/src/adapters/node/index.d.ts +0 -4
  309. package/src/adapters/node/index.js +0 -8
  310. package/src/adapters/node/index.ts +0 -9
  311. package/src/adapters/node/node-client-bridge.ts +0 -79
  312. package/src/adapters/node/node-hmr-manager.ts +0 -271
  313. package/src/adapters/node/server-adapter.ts +0 -561
  314. package/src/adapters/node/static-content-server.ts +0 -203
  315. package/src/adapters/shared/api-response.ts +0 -104
  316. package/src/adapters/shared/application-adapter.ts +0 -199
  317. package/src/adapters/shared/explicit-static-route-matcher.ts +0 -134
  318. package/src/adapters/shared/file-route-middleware-pipeline.ts +0 -123
  319. package/src/adapters/shared/fs-server-response-factory.ts +0 -118
  320. package/src/adapters/shared/fs-server-response-matcher.ts +0 -198
  321. package/src/adapters/shared/render-context.ts +0 -105
  322. package/src/adapters/shared/server-adapter.ts +0 -442
  323. package/src/adapters/shared/server-route-handler.ts +0 -166
  324. package/src/adapters/shared/server-static-builder.ts +0 -82
  325. package/src/build/build-adapter.ts +0 -133
  326. package/src/build/build-types.ts +0 -83
  327. package/src/build/esbuild-build-adapter.ts +0 -511
  328. package/src/config/config-builder.ts +0 -474
  329. package/src/constants.ts +0 -39
  330. package/src/create-app.ts +0 -87
  331. package/src/define-api-handler.js +0 -15
  332. package/src/define-api-handler.ts +0 -66
  333. package/src/dev/sc-server.ts +0 -143
  334. package/src/eco/component-render-context.d.ts +0 -105
  335. package/src/eco/component-render-context.js +0 -77
  336. package/src/eco/component-render-context.ts +0 -202
  337. package/src/eco/eco.ts +0 -221
  338. package/src/eco/eco.types.ts +0 -202
  339. package/src/eco/eco.utils.ts +0 -89
  340. package/src/eco/global-injector-map.ts +0 -112
  341. package/src/eco/lazy-injector-map.ts +0 -120
  342. package/src/eco/module-dependencies.ts +0 -75
  343. package/src/errors/http-error.ts +0 -72
  344. package/src/errors/index.ts +0 -2
  345. package/src/errors/locals-access-error.ts +0 -7
  346. package/src/global/app-logger.ts +0 -4
  347. package/src/hmr/client/hmr-runtime.ts +0 -121
  348. package/src/hmr/hmr-strategy.ts +0 -172
  349. package/src/hmr/hmr.test.e2e.ts +0 -75
  350. package/src/hmr/strategies/default-hmr-strategy.ts +0 -60
  351. package/src/hmr/strategies/js-hmr-strategy.ts +0 -327
  352. package/src/index.browser.ts +0 -3
  353. package/src/index.ts +0 -5
  354. package/src/integrations/ghtml/ghtml-renderer.ts +0 -93
  355. package/src/integrations/ghtml/ghtml.plugin.ts +0 -32
  356. package/src/internal-types.ts +0 -212
  357. package/src/plugins/alias-resolver-plugin.ts +0 -45
  358. package/src/plugins/eco-component-meta-plugin.ts +0 -474
  359. package/src/plugins/integration-plugin.ts +0 -184
  360. package/src/plugins/processor.ts +0 -220
  361. package/src/public-types.ts +0 -1255
  362. package/src/route-renderer/component-graph-executor.d.ts +0 -32
  363. package/src/route-renderer/component-graph-executor.js +0 -31
  364. package/src/route-renderer/component-graph-executor.ts +0 -84
  365. package/src/route-renderer/component-graph.d.ts +0 -42
  366. package/src/route-renderer/component-graph.js +0 -72
  367. package/src/route-renderer/component-graph.ts +0 -159
  368. package/src/route-renderer/component-marker.d.ts +0 -52
  369. package/src/route-renderer/component-marker.js +0 -46
  370. package/src/route-renderer/component-marker.ts +0 -117
  371. package/src/route-renderer/dependency-resolver.js +0 -428
  372. package/src/route-renderer/dependency-resolver.ts +0 -596
  373. package/src/route-renderer/html-post-processing.service.d.ts +0 -40
  374. package/src/route-renderer/html-post-processing.service.js +0 -86
  375. package/src/route-renderer/html-post-processing.service.ts +0 -103
  376. package/src/route-renderer/integration-renderer.d.ts +0 -339
  377. package/src/route-renderer/integration-renderer.js +0 -526
  378. package/src/route-renderer/integration-renderer.ts +0 -696
  379. package/src/route-renderer/marker-graph-resolver.d.ts +0 -76
  380. package/src/route-renderer/marker-graph-resolver.js +0 -93
  381. package/src/route-renderer/marker-graph-resolver.ts +0 -153
  382. package/src/route-renderer/page-module-loader.d.ts +0 -61
  383. package/src/route-renderer/page-module-loader.ts +0 -153
  384. package/src/route-renderer/render-execution.service.d.ts +0 -69
  385. package/src/route-renderer/render-execution.service.js +0 -91
  386. package/src/route-renderer/render-execution.service.ts +0 -158
  387. package/src/route-renderer/render-preparation.service.d.ts +0 -112
  388. package/src/route-renderer/render-preparation.service.js +0 -243
  389. package/src/route-renderer/render-preparation.service.ts +0 -358
  390. package/src/route-renderer/route-renderer.ts +0 -80
  391. package/src/router/fs-router-scanner.d.ts +0 -41
  392. package/src/router/fs-router-scanner.js +0 -155
  393. package/src/router/fs-router-scanner.ts +0 -217
  394. package/src/router/fs-router.d.ts +0 -26
  395. package/src/router/fs-router.js +0 -100
  396. package/src/router/fs-router.ts +0 -122
  397. package/src/services/asset-processing-service/asset-processing.service.d.ts +0 -41
  398. package/src/services/asset-processing-service/asset-processing.service.ts +0 -306
  399. package/src/services/asset-processing-service/asset.factory.ts +0 -105
  400. package/src/services/asset-processing-service/assets.types.ts +0 -112
  401. package/src/services/asset-processing-service/index.d.ts +0 -3
  402. package/src/services/asset-processing-service/index.js +0 -3
  403. package/src/services/asset-processing-service/index.ts +0 -3
  404. package/src/services/asset-processing-service/processor.interface.ts +0 -27
  405. package/src/services/asset-processing-service/processor.registry.ts +0 -18
  406. package/src/services/asset-processing-service/processors/base/base-processor.ts +0 -76
  407. package/src/services/asset-processing-service/processors/base/base-script-processor.d.ts +0 -16
  408. package/src/services/asset-processing-service/processors/base/base-script-processor.js +0 -80
  409. package/src/services/asset-processing-service/processors/base/base-script-processor.ts +0 -105
  410. package/src/services/asset-processing-service/processors/index.d.ts +0 -5
  411. package/src/services/asset-processing-service/processors/index.js +0 -5
  412. package/src/services/asset-processing-service/processors/index.ts +0 -5
  413. package/src/services/asset-processing-service/processors/script/content-script.processor.js +0 -57
  414. package/src/services/asset-processing-service/processors/script/content-script.processor.ts +0 -66
  415. package/src/services/asset-processing-service/processors/script/file-script.processor.ts +0 -88
  416. package/src/services/asset-processing-service/processors/script/node-module-script.processor.d.ts +0 -7
  417. package/src/services/asset-processing-service/processors/script/node-module-script.processor.js +0 -74
  418. package/src/services/asset-processing-service/processors/script/node-module-script.processor.ts +0 -84
  419. package/src/services/asset-processing-service/processors/stylesheet/content-stylesheet.processor.js +0 -25
  420. package/src/services/asset-processing-service/processors/stylesheet/content-stylesheet.processor.ts +0 -27
  421. package/src/services/asset-processing-service/processors/stylesheet/file-stylesheet.processor.ts +0 -77
  422. package/src/services/cache/cache.types.ts +0 -126
  423. package/src/services/cache/index.ts +0 -18
  424. package/src/services/cache/memory-cache-store.ts +0 -130
  425. package/src/services/cache/page-cache-service.ts +0 -202
  426. package/src/services/html-transformer.service.d.ts +0 -50
  427. package/src/services/html-transformer.service.js +0 -163
  428. package/src/services/html-transformer.service.ts +0 -217
  429. package/src/services/page-module-import.service.d.ts +0 -37
  430. package/src/services/page-module-import.service.js +0 -88
  431. package/src/services/page-module-import.service.ts +0 -129
  432. package/src/services/page-request-cache-coordinator.service.ts +0 -128
  433. package/src/services/schema-validation-service.ts +0 -204
  434. package/src/services/validation/standard-schema.types.ts +0 -68
  435. package/src/static-site-generator/static-site-generator.ts +0 -359
  436. package/src/utils/css.d.ts +0 -1
  437. package/src/utils/css.js +0 -7
  438. package/src/utils/css.ts +0 -5
  439. package/src/utils/deep-merge.ts +0 -47
  440. package/src/utils/hash.ts +0 -5
  441. package/src/utils/html.ts +0 -1
  442. package/src/utils/invariant.ts +0 -15
  443. package/src/utils/locals-utils.ts +0 -37
  444. package/src/utils/parse-cli-args.ts +0 -83
  445. package/src/utils/path-utils.module.ts +0 -14
  446. package/src/utils/runtime.ts +0 -44
  447. package/src/utils/server-utils.module.ts +0 -67
  448. package/src/watchers/project-watcher.test-helpers.ts +0 -40
  449. package/src/watchers/project-watcher.ts +0 -364
  450. /package/src/adapters/{bun → shared}/define-api-handler.js +0 -0
  451. /package/src/{internal-types.js → adapters/shared/runtime-host.js} +0 -0
  452. /package/src/{public-types.js → adapters/shared/static-preview-host.js} +0 -0
  453. /package/src/{services/asset-processing-service/assets.types.js → plugins/runtime-capability.js} +0 -0
  454. /package/src/services/{asset-processing-service → assets/asset-processing-service}/processor.interface.js +0 -0
  455. /package/src/services/{asset-processing-service → assets/asset-processing-service}/processor.registry.js +0 -0
  456. /package/src/services/{schema-validation-service.js → validation/schema-validation-service.js} +0 -0
@@ -1,203 +0,0 @@
1
- import { createServer, type IncomingMessage, type Server as NodeHttpServer, type ServerResponse } from 'node:http';
2
- import { extname, join, normalize, sep } from 'node:path';
3
- import { DEFAULT_ECOPAGES_HOSTNAME, DEFAULT_ECOPAGES_PORT, STATUS_MESSAGE } from '../../constants.ts';
4
- import { fileSystem } from '@ecopages/file-system';
5
- import type { EcoPagesAppConfig } from '../../internal-types.ts';
6
- import { ServerUtils } from '../../utils/server-utils.module.ts';
7
-
8
- type NodeStaticContentServerOptions = {
9
- hostname?: string;
10
- port?: number;
11
- };
12
-
13
- export class NodeStaticContentServer {
14
- private readonly appConfig: EcoPagesAppConfig;
15
- private readonly options: NodeStaticContentServerOptions;
16
- private server: NodeHttpServer | null = null;
17
-
18
- constructor({ appConfig, options }: { appConfig: EcoPagesAppConfig; options?: NodeStaticContentServerOptions }) {
19
- this.appConfig = appConfig;
20
- this.options = {
21
- hostname: options?.hostname ?? DEFAULT_ECOPAGES_HOSTNAME,
22
- port: options?.port ?? DEFAULT_ECOPAGES_PORT,
23
- };
24
- }
25
-
26
- private shouldServeGzip(contentType: string): boolean {
27
- return ['text/javascript', 'text/css'].includes(contentType);
28
- }
29
-
30
- private sanitizePath(pathname: string): string | null {
31
- const withoutLeadingSlash = pathname.replace(/^\/+/, '');
32
- const normalizedPath = normalize(withoutLeadingSlash);
33
-
34
- if (normalizedPath.startsWith('..') || normalizedPath.includes(`..${sep}`)) {
35
- return null;
36
- }
37
-
38
- return normalizedPath;
39
- }
40
-
41
- private sendResponse(res: ServerResponse, status: number, headers: Record<string, string>, body?: Buffer): void {
42
- res.statusCode = status;
43
- for (const [key, value] of Object.entries(headers)) {
44
- res.setHeader(key, value);
45
- }
46
-
47
- if (!body) {
48
- res.end();
49
- return;
50
- }
51
-
52
- res.end(body);
53
- }
54
-
55
- private sendNotFoundPage(req: IncomingMessage, res: ServerResponse): void {
56
- const error404TemplatePath = join(this.appConfig.absolutePaths.distDir, '404.html');
57
- const isHead = (req.method ?? 'GET').toUpperCase() === 'HEAD';
58
-
59
- if (!fileSystem.exists(error404TemplatePath)) {
60
- this.sendResponse(
61
- res,
62
- 404,
63
- { 'Content-Type': 'text/plain' },
64
- isHead ? undefined : Buffer.from(STATUS_MESSAGE[404]),
65
- );
66
- return;
67
- }
68
-
69
- const file = fileSystem.readFileAsBuffer(error404TemplatePath);
70
- this.sendResponse(res, 404, { 'Content-Type': 'text/html' }, isHead ? undefined : file);
71
- }
72
-
73
- private serveFile(req: IncomingMessage, res: ServerResponse, filePath: string, status = 200): void {
74
- const contentType = ServerUtils.getContentType(extname(filePath));
75
- const acceptsGzip = req.headers['accept-encoding']?.includes('gzip');
76
- const isHead = (req.method ?? 'GET').toUpperCase() === 'HEAD';
77
-
78
- if (acceptsGzip && this.shouldServeGzip(contentType)) {
79
- const gzipPath = `${filePath}.gz`;
80
- if (fileSystem.exists(gzipPath)) {
81
- const file = fileSystem.readFileAsBuffer(gzipPath);
82
- this.sendResponse(
83
- res,
84
- status,
85
- {
86
- 'Content-Type': contentType,
87
- 'Content-Encoding': 'gzip',
88
- Vary: 'Accept-Encoding',
89
- },
90
- isHead ? undefined : file,
91
- );
92
- return;
93
- }
94
- }
95
-
96
- if (!fileSystem.exists(filePath)) {
97
- this.sendNotFoundPage(req, res);
98
- return;
99
- }
100
-
101
- const file = fileSystem.readFileAsBuffer(filePath);
102
- this.sendResponse(res, status, { 'Content-Type': contentType }, isHead ? undefined : file);
103
- }
104
-
105
- private handleRequest(req: IncomingMessage, res: ServerResponse): void {
106
- const method = (req.method ?? 'GET').toUpperCase();
107
- const isHead = method === 'HEAD';
108
- if (method !== 'GET' && method !== 'HEAD') {
109
- this.sendResponse(
110
- res,
111
- 405,
112
- { Allow: 'GET, HEAD', 'Content-Type': 'text/plain' },
113
- isHead ? undefined : Buffer.from('Method Not Allowed'),
114
- );
115
- return;
116
- }
117
-
118
- const url = new URL(req.url ?? '/', 'http://localhost');
119
- let decodedPathname = '/';
120
- try {
121
- decodedPathname = decodeURIComponent(url.pathname);
122
- } catch {
123
- this.sendResponse(
124
- res,
125
- 400,
126
- { 'Content-Type': 'text/plain' },
127
- isHead ? undefined : Buffer.from('Invalid path'),
128
- );
129
- return;
130
- }
131
-
132
- const pathname = decodedPathname === '/' ? '/index.html' : decodedPathname;
133
- const relativePath = this.sanitizePath(pathname);
134
-
135
- if (!relativePath) {
136
- this.sendResponse(
137
- res,
138
- 400,
139
- { 'Content-Type': 'text/plain' },
140
- isHead ? undefined : Buffer.from('Invalid path'),
141
- );
142
- return;
143
- }
144
-
145
- const basePath = join(this.appConfig.absolutePaths.distDir, relativePath);
146
-
147
- if (pathname.includes('.')) {
148
- this.serveFile(req, res, basePath);
149
- return;
150
- }
151
-
152
- const htmlCandidates = [`${basePath}.html`, join(basePath, 'index.html')];
153
-
154
- for (const candidate of htmlCandidates) {
155
- if (fileSystem.exists(candidate)) {
156
- this.serveFile(req, res, candidate);
157
- return;
158
- }
159
- }
160
-
161
- this.sendNotFoundPage(req, res);
162
- }
163
-
164
- public async start(): Promise<NodeHttpServer> {
165
- if (this.server) {
166
- return this.server;
167
- }
168
-
169
- this.server = createServer(this.handleRequest.bind(this));
170
- const hostname = this.options.hostname ?? DEFAULT_ECOPAGES_HOSTNAME;
171
- const port = this.options.port ?? DEFAULT_ECOPAGES_PORT;
172
-
173
- await new Promise<void>((resolve) => {
174
- this.server!.listen(port, hostname, () => resolve());
175
- });
176
-
177
- return this.server;
178
- }
179
-
180
- public async stop(force = true): Promise<void> {
181
- if (!this.server) {
182
- return;
183
- }
184
-
185
- const activeServer = this.server;
186
- this.server = null;
187
-
188
- await new Promise<void>((resolve, reject) => {
189
- activeServer.close((error) => {
190
- if (error) {
191
- reject(error);
192
- return;
193
- }
194
-
195
- resolve();
196
- });
197
-
198
- if (force) {
199
- activeServer.closeAllConnections();
200
- }
201
- });
202
- }
203
- }
@@ -1,104 +0,0 @@
1
- /**
2
- * A builder class for creating Response objects fluently.
3
- */
4
- export class ApiResponseBuilder {
5
- private _status: Response['status'] = 200;
6
- private _headers: Headers = new Headers();
7
-
8
- /**
9
- * Sets the HTTP status code for the response.
10
- * @param code - The HTTP status code.
11
- * @returns The builder instance for chaining.
12
- */
13
- status(code: Response['status']): this {
14
- this._status = code;
15
- return this;
16
- }
17
-
18
- /**
19
- * Adds or merges headers for the response.
20
- * @param headersInit - Headers to add or merge.
21
- * @returns The builder instance for chaining.
22
- */
23
- headers(headersInit: HeadersInit): this {
24
- const inputHeaders = new Headers(headersInit);
25
- inputHeaders.forEach((value, key) => {
26
- this._headers.set(key, value);
27
- });
28
- return this;
29
- }
30
-
31
- /**
32
- * Creates a JSON response using the configured status and headers.
33
- * @param data - The data to serialize.
34
- * @returns A Response object.
35
- */
36
- json(data: any): Response {
37
- if (!this._headers.has('Content-Type')) {
38
- this._headers.set('Content-Type', 'application/json; charset=utf-8');
39
- }
40
- return new Response(JSON.stringify(data), { status: this._status, headers: this._headers });
41
- }
42
-
43
- /**
44
- * Creates a plain text response using the configured status and headers.
45
- * @param data - The text content.
46
- * @returns A Response object.
47
- */
48
- text(data: string): Response {
49
- if (!this._headers.has('Content-Type')) {
50
- this._headers.set('Content-Type', 'text/plain; charset=utf-8');
51
- }
52
- return new Response(data, { status: this._status, headers: this._headers });
53
- }
54
-
55
- /**
56
- * Creates an HTML response using the configured status and headers.
57
- * @param data - The HTML content.
58
- * @returns A Response object.
59
- */
60
- html(data: string): Response {
61
- if (!this._headers.has('Content-Type')) {
62
- this._headers.set('Content-Type', 'text/html; charset=utf-8');
63
- }
64
- return new Response(data, { status: this._status, headers: this._headers });
65
- }
66
-
67
- /**
68
- * Creates a redirect response.
69
- * @param url - The URL to redirect to.
70
- * @param explicitStatus - Optional explicit status code (overrides status() if provided). Defaults to 302 if not set via status().
71
- * @returns A Response object.
72
- */
73
- redirect(url: string, explicitStatus?: Response['status']): Response {
74
- const redirectStatus = explicitStatus ?? (this._status === 200 ? 302 : this._status); // Default to 302 if status wasn't explicitly set
75
- this._headers.set('Location', url);
76
- return new Response(null, { status: redirectStatus, headers: this._headers });
77
- }
78
-
79
- /**
80
- * Creates an error response using the configured status and headers.
81
- * If data is an object, it's treated as JSON, otherwise as text.
82
- * @param data - The error data (string or object).
83
- * @param explicitStatus - Optional explicit status code (overrides status() if provided). Defaults to 500 if not set via status().
84
- * @returns A Response object.
85
- */
86
- error(data: string | object, explicitStatus?: Response['status']): Response {
87
- const errorStatus = explicitStatus ?? (this._status === 200 ? 500 : this._status); // Default to 500 if status wasn't explicitly set
88
- this.status(errorStatus);
89
-
90
- if (typeof data === 'object' && data !== null) {
91
- if (!this._headers.has('Content-Type')) {
92
- this._headers.set('Content-Type', 'application/json; charset=utf-8');
93
- }
94
- return new Response(JSON.stringify({ error: data }), {
95
- status: this._status,
96
- headers: this._headers,
97
- });
98
- }
99
- if (!this._headers.has('Content-Type')) {
100
- this._headers.set('Content-Type', 'text/plain; charset=utf-8');
101
- }
102
- return new Response(String(data), { status: this._status, headers: this._headers });
103
- }
104
- }
@@ -1,199 +0,0 @@
1
- import type {
2
- ApiHandler,
3
- ApiHandlerContext,
4
- Middleware,
5
- RouteGroupBuilder,
6
- RouteOptions,
7
- RouteSchema,
8
- } from '../../public-types.ts';
9
- import {
10
- AbstractApplicationAdapter,
11
- type ApplicationAdapterOptions,
12
- type RouteGroupDefinition,
13
- type RouteHandler,
14
- } from '../abstract/application-adapter.ts';
15
-
16
- export abstract class SharedApplicationAdapter<
17
- TOptions extends ApplicationAdapterOptions = ApplicationAdapterOptions,
18
- TServer = any,
19
- TRequest extends Request = Request,
20
- > extends AbstractApplicationAdapter<TOptions, TServer, TRequest> {
21
- protected register<
22
- P extends string,
23
- TContext extends ApiHandlerContext<TRequest, TServer> = ApiHandlerContext<TRequest, TServer>,
24
- >(
25
- path: P,
26
- method: ApiHandler['method'],
27
- handler: RouteHandler<TRequest, TServer, TContext>,
28
- options?: RouteOptions<TRequest, TServer, TContext>,
29
- ): this {
30
- return this.addRouteHandler(path, method, handler, options?.middleware, options?.schema);
31
- }
32
-
33
- get<P extends string, TContext extends ApiHandlerContext<TRequest, TServer> = ApiHandlerContext<TRequest, TServer>>(
34
- path: P,
35
- handler: RouteHandler<TRequest, TServer, TContext>,
36
- options?: RouteOptions<TRequest, TServer, TContext>,
37
- ): this {
38
- return this.register(path, 'GET', handler, options);
39
- }
40
-
41
- post<
42
- P extends string,
43
- TContext extends ApiHandlerContext<TRequest, TServer> = ApiHandlerContext<TRequest, TServer>,
44
- >(
45
- path: P,
46
- handler: RouteHandler<TRequest, TServer, TContext>,
47
- options?: RouteOptions<TRequest, TServer, TContext>,
48
- ): this {
49
- return this.register(path, 'POST', handler, options);
50
- }
51
-
52
- put<P extends string, TContext extends ApiHandlerContext<TRequest, TServer> = ApiHandlerContext<TRequest, TServer>>(
53
- path: P,
54
- handler: RouteHandler<TRequest, TServer, TContext>,
55
- options?: RouteOptions<TRequest, TServer, TContext>,
56
- ): this {
57
- return this.register(path, 'PUT', handler, options);
58
- }
59
-
60
- delete<
61
- P extends string,
62
- TContext extends ApiHandlerContext<TRequest, TServer> = ApiHandlerContext<TRequest, TServer>,
63
- >(
64
- path: P,
65
- handler: RouteHandler<TRequest, TServer, TContext>,
66
- options?: RouteOptions<TRequest, TServer, TContext>,
67
- ): this {
68
- return this.register(path, 'DELETE', handler, options);
69
- }
70
-
71
- patch<
72
- P extends string,
73
- TContext extends ApiHandlerContext<TRequest, TServer> = ApiHandlerContext<TRequest, TServer>,
74
- >(
75
- path: P,
76
- handler: RouteHandler<TRequest, TServer, TContext>,
77
- options?: RouteOptions<TRequest, TServer, TContext>,
78
- ): this {
79
- return this.register(path, 'PATCH', handler, options);
80
- }
81
-
82
- options<
83
- P extends string,
84
- TContext extends ApiHandlerContext<TRequest, TServer> = ApiHandlerContext<TRequest, TServer>,
85
- >(
86
- path: P,
87
- handler: RouteHandler<TRequest, TServer, TContext>,
88
- options?: RouteOptions<TRequest, TServer, TContext>,
89
- ): this {
90
- return this.register(path, 'OPTIONS', handler, options);
91
- }
92
-
93
- head<
94
- P extends string,
95
- TContext extends ApiHandlerContext<TRequest, TServer> = ApiHandlerContext<TRequest, TServer>,
96
- >(
97
- path: P,
98
- handler: RouteHandler<TRequest, TServer, TContext>,
99
- options?: RouteOptions<TRequest, TServer, TContext>,
100
- ): this {
101
- return this.register(path, 'HEAD', handler, options);
102
- }
103
-
104
- route<P extends string>(
105
- path: P,
106
- method: ApiHandler['method'],
107
- handler: RouteHandler<TRequest, TServer>,
108
- options?: RouteOptions<TRequest, TServer>,
109
- ): this {
110
- return this.register(path, method, handler, options);
111
- }
112
-
113
- add(handler: ApiHandler<string, TRequest, TServer>): this {
114
- return this.addRouteHandler(handler.path, handler.method, handler.handler, handler.middleware, handler.schema);
115
- }
116
-
117
- group<TMiddleware extends readonly Middleware<TRequest, TServer, any>[] = []>(
118
- prefixOrGroup: string | RouteGroupDefinition<TRequest, TServer>,
119
- callback?: (
120
- builder: TMiddleware extends readonly Middleware<TRequest, TServer, infer TContext>[]
121
- ? RouteGroupBuilder<TRequest, TServer, TContext>
122
- : RouteGroupBuilder<TRequest, TServer>,
123
- ) => void,
124
- options?: {
125
- middleware?: TMiddleware;
126
- },
127
- ): this {
128
- if (typeof prefixOrGroup === 'object') {
129
- return this.registerGroup(prefixOrGroup);
130
- }
131
-
132
- type TContext = TMiddleware extends readonly Middleware<TRequest, TServer, infer TCtx>[]
133
- ? TCtx
134
- : ApiHandlerContext<TRequest, TServer>;
135
-
136
- const normalizedPrefix = prefixOrGroup.endsWith('/') ? prefixOrGroup.slice(0, -1) : prefixOrGroup;
137
- const groupMiddleware = (options?.middleware ?? []) as Middleware<TRequest, TServer, TContext>[];
138
-
139
- const createHandler = (
140
- method: ApiHandler['method'],
141
- ): RouteGroupBuilder<TRequest, TServer, TContext>[Lowercase<typeof method>] => {
142
- return ((
143
- path: string,
144
- handler: (context: TContext) => Promise<Response> | Response,
145
- routeOptions?: RouteOptions<TRequest, TServer, TContext> & { schema?: RouteSchema },
146
- ) => {
147
- const combinedMiddleware: Middleware<TRequest, TServer, TContext>[] = [
148
- ...groupMiddleware,
149
- ...(routeOptions?.middleware ?? []),
150
- ];
151
- const fullPath = path === '/' ? normalizedPrefix : `${normalizedPrefix}${path}`;
152
- this.addRouteHandler(
153
- fullPath,
154
- method,
155
- handler as RouteHandler<TRequest, TServer, ApiHandlerContext<TRequest, TServer>>,
156
- combinedMiddleware.length > 0
157
- ? (combinedMiddleware as Middleware<TRequest, TServer, ApiHandlerContext<TRequest, TServer>>[])
158
- : undefined,
159
- routeOptions?.schema,
160
- );
161
- return builder;
162
- }) as RouteGroupBuilder<TRequest, TServer, TContext>[Lowercase<typeof method>];
163
- };
164
-
165
- const builder: RouteGroupBuilder<TRequest, TServer, TContext> = {
166
- get: createHandler('GET'),
167
- post: createHandler('POST'),
168
- put: createHandler('PUT'),
169
- delete: createHandler('DELETE'),
170
- patch: createHandler('PATCH'),
171
- options: createHandler('OPTIONS'),
172
- head: createHandler('HEAD'),
173
- };
174
-
175
- callback?.(builder as never);
176
- return this;
177
- }
178
-
179
- private registerGroup(group: RouteGroupDefinition<TRequest, TServer>): this {
180
- const normalizedPrefix = group.prefix.endsWith('/') ? group.prefix.slice(0, -1) : group.prefix;
181
- const groupMiddleware = group.middleware ?? [];
182
-
183
- for (const route of group.routes) {
184
- const normalizedPath = route.path.startsWith('/') ? route.path : `/${route.path}`;
185
- const fullPath = route.path === '/' ? normalizedPrefix : `${normalizedPrefix}${normalizedPath}`;
186
- const combinedMiddleware = [...groupMiddleware, ...(route.middleware ?? [])];
187
-
188
- this.addRouteHandler(
189
- fullPath,
190
- route.method,
191
- route.handler,
192
- combinedMiddleware.length > 0 ? combinedMiddleware : undefined,
193
- route.schema,
194
- );
195
- }
196
-
197
- return this;
198
- }
199
- }
@@ -1,134 +0,0 @@
1
- import { appLogger } from '../../global/app-logger.ts';
2
- import type { EcoPagesAppConfig } from '../../internal-types.ts';
3
- import type { StaticRoute } from '../../public-types.ts';
4
- import type { RouteRendererFactory } from '../../route-renderer/route-renderer.ts';
5
-
6
- export const EXPLICIT_STATIC_ROUTE_MATCHER_ERRORS = {
7
- missingIntegration: (routePath: string) =>
8
- `View at ${routePath} is missing __eco.integration. Ensure it's defined with eco.page() and exported as default.`,
9
- noRendererForIntegration: (integrationName: string) => `No renderer found for integration: ${integrationName}`,
10
- } as const;
11
-
12
- export interface ExplicitStaticRouteMatcherOptions {
13
- appConfig: EcoPagesAppConfig;
14
- routeRendererFactory: RouteRendererFactory;
15
- staticRoutes: StaticRoute[];
16
- }
17
-
18
- export interface ExplicitRouteMatch {
19
- route: StaticRoute;
20
- params: Record<string, string>;
21
- }
22
-
23
- export class ExplicitStaticRouteMatcher {
24
- private readonly appConfig: EcoPagesAppConfig;
25
- private readonly routeRendererFactory: RouteRendererFactory;
26
- private readonly staticRoutes: StaticRoute[];
27
-
28
- constructor({ appConfig, routeRendererFactory, staticRoutes }: ExplicitStaticRouteMatcherOptions) {
29
- this.appConfig = appConfig;
30
- this.routeRendererFactory = routeRendererFactory;
31
- this.staticRoutes = staticRoutes;
32
- }
33
-
34
- /**
35
- * Match a request URL against explicit static routes.
36
- * Returns the matched route and extracted params, or null if no match.
37
- */
38
- match(url: string): ExplicitRouteMatch | null {
39
- const pathname = new URL(url).pathname;
40
-
41
- for (const route of this.staticRoutes) {
42
- const params = this.matchRoute(route.path, pathname);
43
- if (params !== null) {
44
- return { route, params };
45
- }
46
- }
47
-
48
- return null;
49
- }
50
-
51
- /**
52
- * Match a route pattern against a pathname.
53
- * Supports :param and [param] syntax.
54
- * Returns extracted params or null if no match.
55
- */
56
- private matchRoute(pattern: string, pathname: string): Record<string, string> | null {
57
- const patternSegments = pattern.split('/').filter(Boolean);
58
- const pathSegments = pathname.split('/').filter(Boolean);
59
-
60
- if (patternSegments.length !== pathSegments.length) {
61
- const lastPattern = patternSegments[patternSegments.length - 1];
62
- const isCatchAll = lastPattern?.startsWith('[...') || lastPattern?.startsWith(':...');
63
- if (!isCatchAll) {
64
- return null;
65
- }
66
- }
67
-
68
- const params: Record<string, string> = {};
69
-
70
- for (let i = 0; i < patternSegments.length; i++) {
71
- const patternPart = patternSegments[i];
72
- const pathPart = pathSegments[i];
73
-
74
- if (patternPart.startsWith(':...') || patternPart.startsWith('[...')) {
75
- const paramName = patternPart.replace(/^(:\.\.\.|\[\.\.\.)/, '').replace(/\]$/, '');
76
- params[paramName] = pathSegments.slice(i).join('/');
77
- return params;
78
- }
79
-
80
- if (patternPart.startsWith(':')) {
81
- const paramName = patternPart.slice(1);
82
- params[paramName] = pathPart;
83
- } else if (patternPart.startsWith('[') && patternPart.endsWith(']')) {
84
- const paramName = patternPart.slice(1, -1);
85
- params[paramName] = pathPart;
86
- } else if (patternPart !== pathPart) {
87
- return null;
88
- }
89
- }
90
-
91
- return params;
92
- }
93
-
94
- /**
95
- * Handle a matched explicit static route.
96
- * Resolves the loader and renders the view using the appropriate integration renderer.
97
- */
98
- async handleMatch(match: ExplicitRouteMatch): Promise<Response> {
99
- const { route, params } = match;
100
-
101
- try {
102
- const mod = await route.loader();
103
- const view = mod.default;
104
-
105
- const integrationName = view.config?.__eco?.integration;
106
- if (!integrationName) {
107
- throw new Error(EXPLICIT_STATIC_ROUTE_MATCHER_ERRORS.missingIntegration(route.path));
108
- }
109
-
110
- const renderer = this.routeRendererFactory.getRendererByIntegration(integrationName);
111
- if (!renderer) {
112
- throw new Error(EXPLICIT_STATIC_ROUTE_MATCHER_ERRORS.noRendererForIntegration(integrationName));
113
- }
114
-
115
- const props = view.staticProps
116
- ? (
117
- await view.staticProps({
118
- pathname: { params },
119
- appConfig: this.appConfig,
120
- runtimeOrigin: this.appConfig.baseUrl,
121
- })
122
- ).props
123
- : {};
124
-
125
- return renderer.renderToResponse(view, props, {});
126
- } catch (error) {
127
- appLogger.error(
128
- `Error rendering explicit static route ${route.path}:`,
129
- error instanceof Error ? error : String(error),
130
- );
131
- throw error;
132
- }
133
- }
134
- }