@ecopages/core 0.2.0-alpha.4 → 0.2.0-alpha.41

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 (454) hide show
  1. package/README.md +268 -14
  2. package/package.json +92 -110
  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 -68
  12. package/src/adapters/bun/hmr-manager.js +30 -212
  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 -49
  31. package/src/adapters/node/node-hmr-manager.js +31 -219
  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 +99 -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/build-adapter.d.ts +176 -3
  74. package/src/build/build-adapter.js +619 -16
  75. package/src/build/build-manifest.d.ts +27 -0
  76. package/src/build/build-manifest.js +30 -0
  77. package/src/build/dev-build-coordinator.d.ts +72 -0
  78. package/src/build/dev-build-coordinator.js +154 -0
  79. package/src/build/esbuild-build-adapter.d.ts +16 -6
  80. package/src/build/esbuild-build-adapter.js +202 -74
  81. package/src/build/runtime-build-executor.d.ts +14 -0
  82. package/src/build/runtime-build-executor.js +22 -0
  83. package/src/build/runtime-specifier-alias-plugin.d.ts +15 -0
  84. package/src/build/runtime-specifier-alias-plugin.js +35 -0
  85. package/src/build/runtime-specifier-aliases.d.ts +5 -0
  86. package/src/build/runtime-specifier-aliases.js +95 -0
  87. package/src/config/README.md +36 -0
  88. package/src/config/config-builder.d.ts +54 -29
  89. package/src/config/config-builder.js +256 -50
  90. package/src/{constants.d.ts → config/constants.d.ts} +13 -0
  91. package/src/{constants.js → config/constants.js} +4 -0
  92. package/src/declarations.d.ts +19 -14
  93. package/src/dev/host-runtime.d.ts +10 -0
  94. package/src/dev/host-runtime.js +24 -0
  95. package/src/dev/sc-server.d.ts +1 -1
  96. package/src/dev/sc-server.js +1 -1
  97. package/src/eco/README.md +70 -16
  98. package/src/eco/eco.browser.d.ts +2 -0
  99. package/src/eco/eco.browser.js +88 -0
  100. package/src/eco/eco.js +63 -54
  101. package/src/eco/eco.types.d.ts +69 -6
  102. package/src/eco/eco.utils.d.ts +1 -40
  103. package/src/eco/eco.utils.js +5 -35
  104. package/src/eco/global-injector-map.d.ts +3 -3
  105. package/src/eco/global-injector-map.js +2 -2
  106. package/src/eco/lazy-injector-map.d.ts +2 -2
  107. package/src/errors/index.d.ts +1 -0
  108. package/src/errors/index.js +3 -1
  109. package/src/hmr/README.md +26 -0
  110. package/src/hmr/client/hmr-runtime.d.ts +1 -6
  111. package/src/hmr/client/hmr-runtime.js +38 -7
  112. package/src/hmr/hmr-strategy.d.ts +16 -13
  113. package/src/hmr/hmr-strategy.js +22 -7
  114. package/src/hmr/hmr.postcss.test.e2e.d.ts +1 -0
  115. package/src/hmr/hmr.postcss.test.e2e.js +31 -0
  116. package/src/hmr/hmr.test.e2e.js +26 -33
  117. package/src/hmr/strategies/default-hmr-strategy.d.ts +2 -2
  118. package/src/hmr/strategies/default-hmr-strategy.js +1 -1
  119. package/src/hmr/strategies/js-hmr-strategy.d.ts +46 -48
  120. package/src/hmr/strategies/js-hmr-strategy.js +60 -75
  121. package/src/index.browser.d.ts +2 -2
  122. package/src/index.browser.js +1 -1
  123. package/src/index.d.ts +4 -3
  124. package/src/index.js +16 -5
  125. package/src/integrations/ghtml/ghtml-renderer.d.ts +3 -2
  126. package/src/integrations/ghtml/ghtml-renderer.js +27 -30
  127. package/src/integrations/ghtml/ghtml.constants.d.ts +1 -0
  128. package/src/integrations/ghtml/ghtml.constants.js +4 -0
  129. package/src/integrations/ghtml/ghtml.plugin.d.ts +2 -6
  130. package/src/integrations/ghtml/ghtml.plugin.js +3 -4
  131. package/src/plugins/README.md +35 -0
  132. package/src/plugins/alias-resolver-plugin.d.ts +1 -0
  133. package/src/plugins/alias-resolver-plugin.js +27 -5
  134. package/src/plugins/eco-component-meta-plugin.d.ts +14 -1
  135. package/src/plugins/eco-component-meta-plugin.js +42 -24
  136. package/src/plugins/foreign-jsx-override-plugin.d.ts +33 -0
  137. package/src/plugins/foreign-jsx-override-plugin.js +41 -0
  138. package/src/plugins/integration-plugin.d.ts +147 -29
  139. package/src/plugins/integration-plugin.js +103 -14
  140. package/src/plugins/processor.d.ts +17 -2
  141. package/src/plugins/processor.js +22 -3
  142. package/src/plugins/runtime-capability.d.ts +9 -0
  143. package/src/plugins/source-transform.d.ts +46 -0
  144. package/src/plugins/source-transform.js +71 -0
  145. package/src/route-renderer/GRAPH.md +83 -325
  146. package/src/route-renderer/README.md +73 -90
  147. package/src/route-renderer/orchestration/component-render-context.d.ts +97 -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 +110 -0
  152. package/src/route-renderer/orchestration/foreign-subtree-execution.service.js +233 -0
  153. package/src/route-renderer/orchestration/integration-renderer.d.ts +534 -0
  154. package/src/route-renderer/orchestration/integration-renderer.js +986 -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 +3 -0
  160. package/src/route-renderer/orchestration/processed-asset-dedupe.js +27 -0
  161. package/src/route-renderer/orchestration/queued-foreign-subtree-resolution.service.d.ts +91 -0
  162. package/src/route-renderer/orchestration/queued-foreign-subtree-resolution.service.js +170 -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 +134 -0
  166. package/src/route-renderer/orchestration/route-render-orchestrator.js +442 -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/{dependency-resolver.d.ts → page-loading/dependency-resolver.d.ts} +15 -4
  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-module-loader.js → page-loading/page-module-loader.js} +39 -14
  189. package/src/route-renderer/route-renderer.d.ts +57 -14
  190. package/src/route-renderer/route-renderer.js +30 -18
  191. package/src/router/README.md +94 -0
  192. package/src/router/client/link-intent.d.ts +53 -0
  193. package/src/router/client/link-intent.js +34 -0
  194. package/src/router/client/link-intent.test.browser.d.ts +1 -0
  195. package/src/router/client/link-intent.test.browser.js +43 -0
  196. package/src/router/client/navigation-coordinator.d.ts +169 -0
  197. package/src/router/client/navigation-coordinator.js +215 -0
  198. package/src/router/server/route-registry.d.ts +78 -0
  199. package/src/router/server/route-registry.js +262 -0
  200. package/src/services/README.md +28 -0
  201. package/src/services/assets/asset-processing-service/asset-dependency-keys.d.ts +3 -0
  202. package/src/services/assets/asset-processing-service/asset-dependency-keys.js +56 -0
  203. package/src/services/assets/asset-processing-service/asset-processing.service.d.ts +103 -0
  204. package/src/services/{asset-processing-service → assets/asset-processing-service}/asset-processing.service.js +124 -89
  205. package/src/services/{asset-processing-service → assets/asset-processing-service}/asset.factory.d.ts +1 -1
  206. package/src/services/{asset-processing-service → assets/asset-processing-service}/asset.factory.js +2 -2
  207. package/src/services/{asset-processing-service → assets/asset-processing-service}/assets.types.d.ts +16 -1
  208. package/src/services/assets/asset-processing-service/assets.types.js +0 -0
  209. package/src/services/assets/asset-processing-service/browser-runtime-asset.factory.d.ts +55 -0
  210. package/src/services/assets/asset-processing-service/browser-runtime-asset.factory.js +49 -0
  211. package/src/services/assets/asset-processing-service/browser-runtime-entry.factory.d.ts +20 -0
  212. package/src/services/assets/asset-processing-service/browser-runtime-entry.factory.js +41 -0
  213. package/src/services/assets/asset-processing-service/grouped-content-bundles.d.ts +30 -0
  214. package/src/services/assets/asset-processing-service/grouped-content-bundles.js +65 -0
  215. package/src/services/assets/asset-processing-service/index.d.ts +6 -0
  216. package/src/services/assets/asset-processing-service/index.js +6 -0
  217. package/src/services/assets/asset-processing-service/page-package.d.ts +6 -0
  218. package/src/services/assets/asset-processing-service/page-package.js +80 -0
  219. package/src/services/{asset-processing-service → assets/asset-processing-service}/processor.interface.d.ts +2 -2
  220. package/src/services/{asset-processing-service → assets/asset-processing-service}/processor.registry.d.ts +2 -2
  221. package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/base/base-processor.d.ts +1 -1
  222. package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/base/base-processor.js +11 -5
  223. package/src/services/assets/asset-processing-service/processors/base/base-script-processor.d.ts +22 -0
  224. package/src/services/assets/asset-processing-service/processors/base/base-script-processor.js +136 -0
  225. package/src/services/assets/asset-processing-service/processors/index.d.ts +5 -0
  226. package/src/services/assets/asset-processing-service/processors/index.js +5 -0
  227. package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/script/content-script.processor.d.ts +3 -2
  228. package/src/services/assets/asset-processing-service/processors/script/content-script.processor.js +119 -0
  229. package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/script/file-script.processor.d.ts +4 -3
  230. package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/script/file-script.processor.js +28 -7
  231. package/src/services/assets/asset-processing-service/processors/script/node-module-script.processor.d.ts +42 -0
  232. package/src/services/assets/asset-processing-service/processors/script/node-module-script.processor.js +126 -0
  233. package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/stylesheet/content-stylesheet.processor.d.ts +5 -2
  234. package/src/services/assets/asset-processing-service/processors/stylesheet/content-stylesheet.processor.js +59 -0
  235. package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/stylesheet/file-stylesheet.processor.d.ts +2 -2
  236. package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/stylesheet/file-stylesheet.processor.js +9 -3
  237. package/src/services/assets/asset-processing-service/ungrouped-dependency-processing.d.ts +18 -0
  238. package/src/services/assets/asset-processing-service/ungrouped-dependency-processing.js +45 -0
  239. package/src/services/assets/browser-bundle.service.d.ts +73 -0
  240. package/src/services/assets/browser-bundle.service.js +41 -0
  241. package/src/services/{page-request-cache-coordinator.service.d.ts → cache/page-request-cache-coordinator.service.d.ts} +2 -2
  242. package/src/services/{page-request-cache-coordinator.service.js → cache/page-request-cache-coordinator.service.js} +3 -1
  243. package/src/services/html/html-rewriter-provider.service.d.ts +40 -0
  244. package/src/services/html/html-rewriter-provider.service.js +68 -0
  245. package/src/services/html/html-transformer.service.d.ts +96 -0
  246. package/src/services/html/html-transformer.service.js +287 -0
  247. package/src/services/invalidation/development-invalidation.service.d.ts +74 -0
  248. package/src/services/invalidation/development-invalidation.service.js +190 -0
  249. package/src/services/module-loading/app-module-loader.service.d.ts +7 -0
  250. package/src/services/module-loading/app-module-loader.service.js +0 -0
  251. package/src/services/module-loading/app-server-module-transpiler.service.d.ts +24 -0
  252. package/src/services/module-loading/app-server-module-transpiler.service.js +151 -0
  253. package/src/services/module-loading/host-module-loader-registry.d.ts +4 -0
  254. package/src/services/module-loading/host-module-loader-registry.js +15 -0
  255. package/src/services/module-loading/module-loading-types.d.ts +2 -0
  256. package/src/services/module-loading/module-loading-types.js +0 -0
  257. package/src/services/module-loading/node-bootstrap-plugin.d.ts +42 -0
  258. package/src/services/module-loading/node-bootstrap-plugin.js +297 -0
  259. package/src/services/module-loading/page-module-import.service.d.ts +95 -0
  260. package/src/services/module-loading/page-module-import.service.js +191 -0
  261. package/src/services/module-loading/server-module-transpiler.service.d.ts +63 -0
  262. package/src/services/module-loading/server-module-transpiler.service.js +64 -0
  263. package/src/services/module-loading/source-module-support.d.ts +5 -0
  264. package/src/services/module-loading/source-module-support.js +8 -0
  265. package/src/services/runtime-state/dev-graph.service.d.ts +118 -0
  266. package/src/services/runtime-state/dev-graph.service.js +162 -0
  267. package/src/services/runtime-state/entrypoint-dependency-graph.service.d.ts +41 -0
  268. package/src/services/runtime-state/entrypoint-dependency-graph.service.js +85 -0
  269. package/src/services/runtime-state/server-invalidation-state.service.d.ts +26 -0
  270. package/src/services/runtime-state/server-invalidation-state.service.js +35 -0
  271. package/src/services/{schema-validation-service.d.ts → validation/schema-validation-service.d.ts} +1 -1
  272. package/src/static-site-generator/README.md +26 -0
  273. package/src/static-site-generator/static-site-generator.d.ts +67 -20
  274. package/src/static-site-generator/static-site-generator.js +182 -138
  275. package/src/{internal-types.d.ts → types/internal-types.d.ts} +62 -30
  276. package/src/types/internal-types.js +0 -0
  277. package/src/{public-types.d.ts → types/public-types.d.ts} +239 -35
  278. package/src/types/public-types.js +0 -0
  279. package/src/utils/html-escaping.d.ts +7 -0
  280. package/src/utils/html-escaping.js +6 -0
  281. package/src/utils/locals-utils.d.ts +1 -1
  282. package/src/utils/parse-cli-args.d.ts +4 -1
  283. package/src/utils/parse-cli-args.js +16 -1
  284. package/src/utils/resolve-work-dir.d.ts +11 -0
  285. package/src/utils/resolve-work-dir.js +31 -0
  286. package/src/watchers/project-watcher.d.ts +40 -29
  287. package/src/watchers/project-watcher.js +126 -116
  288. package/src/watchers/project-watcher.test-helpers.d.ts +2 -2
  289. package/src/watchers/project-watcher.test-helpers.js +6 -6
  290. package/CHANGELOG.md +0 -91
  291. package/src/adapters/abstract/application-adapter.ts +0 -337
  292. package/src/adapters/abstract/router-adapter.ts +0 -30
  293. package/src/adapters/abstract/server-adapter.ts +0 -79
  294. package/src/adapters/bun/client-bridge.ts +0 -62
  295. package/src/adapters/bun/create-app.ts +0 -189
  296. package/src/adapters/bun/define-api-handler.d.ts +0 -61
  297. package/src/adapters/bun/define-api-handler.ts +0 -114
  298. package/src/adapters/bun/hmr-manager.ts +0 -296
  299. package/src/adapters/bun/index.ts +0 -3
  300. package/src/adapters/bun/server-adapter.ts +0 -492
  301. package/src/adapters/bun/server-lifecycle.d.ts +0 -52
  302. package/src/adapters/bun/server-lifecycle.js +0 -120
  303. package/src/adapters/bun/server-lifecycle.ts +0 -154
  304. package/src/adapters/index.ts +0 -6
  305. package/src/adapters/node/create-app.ts +0 -179
  306. package/src/adapters/node/index.d.ts +0 -4
  307. package/src/adapters/node/index.js +0 -8
  308. package/src/adapters/node/index.ts +0 -9
  309. package/src/adapters/node/node-client-bridge.ts +0 -79
  310. package/src/adapters/node/node-hmr-manager.ts +0 -289
  311. package/src/adapters/node/server-adapter.ts +0 -561
  312. package/src/adapters/node/static-content-server.ts +0 -203
  313. package/src/adapters/shared/api-response.ts +0 -104
  314. package/src/adapters/shared/application-adapter.ts +0 -199
  315. package/src/adapters/shared/explicit-static-route-matcher.ts +0 -134
  316. package/src/adapters/shared/file-route-middleware-pipeline.ts +0 -123
  317. package/src/adapters/shared/fs-server-response-factory.ts +0 -118
  318. package/src/adapters/shared/fs-server-response-matcher.ts +0 -198
  319. package/src/adapters/shared/render-context.ts +0 -105
  320. package/src/adapters/shared/server-adapter.ts +0 -442
  321. package/src/adapters/shared/server-route-handler.ts +0 -166
  322. package/src/adapters/shared/server-static-builder.ts +0 -82
  323. package/src/build/build-adapter.ts +0 -132
  324. package/src/build/build-types.ts +0 -83
  325. package/src/build/esbuild-build-adapter.ts +0 -510
  326. package/src/config/config-builder.ts +0 -474
  327. package/src/constants.ts +0 -39
  328. package/src/create-app.ts +0 -87
  329. package/src/define-api-handler.js +0 -15
  330. package/src/define-api-handler.ts +0 -66
  331. package/src/dev/sc-server.ts +0 -143
  332. package/src/eco/component-render-context.d.ts +0 -105
  333. package/src/eco/component-render-context.js +0 -77
  334. package/src/eco/component-render-context.ts +0 -202
  335. package/src/eco/eco.ts +0 -221
  336. package/src/eco/eco.types.ts +0 -202
  337. package/src/eco/eco.utils.ts +0 -89
  338. package/src/eco/global-injector-map.ts +0 -112
  339. package/src/eco/lazy-injector-map.ts +0 -120
  340. package/src/eco/module-dependencies.ts +0 -75
  341. package/src/errors/http-error.ts +0 -72
  342. package/src/errors/index.ts +0 -2
  343. package/src/errors/locals-access-error.ts +0 -7
  344. package/src/global/app-logger.ts +0 -4
  345. package/src/hmr/client/hmr-runtime.ts +0 -121
  346. package/src/hmr/hmr-strategy.ts +0 -172
  347. package/src/hmr/hmr.test.e2e.ts +0 -75
  348. package/src/hmr/strategies/default-hmr-strategy.ts +0 -60
  349. package/src/hmr/strategies/js-hmr-strategy.ts +0 -320
  350. package/src/index.browser.ts +0 -3
  351. package/src/index.ts +0 -5
  352. package/src/integrations/ghtml/ghtml-renderer.ts +0 -93
  353. package/src/integrations/ghtml/ghtml.plugin.ts +0 -32
  354. package/src/internal-types.ts +0 -212
  355. package/src/plugins/alias-resolver-plugin.ts +0 -45
  356. package/src/plugins/eco-component-meta-plugin.ts +0 -474
  357. package/src/plugins/integration-plugin.ts +0 -184
  358. package/src/plugins/processor.ts +0 -220
  359. package/src/public-types.ts +0 -1260
  360. package/src/route-renderer/component-graph-executor.d.ts +0 -32
  361. package/src/route-renderer/component-graph-executor.js +0 -31
  362. package/src/route-renderer/component-graph-executor.ts +0 -84
  363. package/src/route-renderer/component-graph.d.ts +0 -42
  364. package/src/route-renderer/component-graph.js +0 -72
  365. package/src/route-renderer/component-graph.ts +0 -159
  366. package/src/route-renderer/component-marker.d.ts +0 -52
  367. package/src/route-renderer/component-marker.js +0 -46
  368. package/src/route-renderer/component-marker.ts +0 -117
  369. package/src/route-renderer/dependency-resolver.js +0 -428
  370. package/src/route-renderer/dependency-resolver.ts +0 -596
  371. package/src/route-renderer/html-post-processing.service.d.ts +0 -40
  372. package/src/route-renderer/html-post-processing.service.js +0 -86
  373. package/src/route-renderer/html-post-processing.service.ts +0 -103
  374. package/src/route-renderer/integration-renderer.d.ts +0 -339
  375. package/src/route-renderer/integration-renderer.js +0 -526
  376. package/src/route-renderer/integration-renderer.ts +0 -696
  377. package/src/route-renderer/marker-graph-resolver.d.ts +0 -76
  378. package/src/route-renderer/marker-graph-resolver.js +0 -93
  379. package/src/route-renderer/marker-graph-resolver.ts +0 -153
  380. package/src/route-renderer/page-module-loader.d.ts +0 -61
  381. package/src/route-renderer/page-module-loader.ts +0 -153
  382. package/src/route-renderer/render-execution.service.d.ts +0 -69
  383. package/src/route-renderer/render-execution.service.js +0 -91
  384. package/src/route-renderer/render-execution.service.ts +0 -158
  385. package/src/route-renderer/render-preparation.service.d.ts +0 -112
  386. package/src/route-renderer/render-preparation.service.js +0 -243
  387. package/src/route-renderer/render-preparation.service.ts +0 -358
  388. package/src/route-renderer/route-renderer.ts +0 -80
  389. package/src/router/fs-router-scanner.d.ts +0 -41
  390. package/src/router/fs-router-scanner.js +0 -155
  391. package/src/router/fs-router-scanner.ts +0 -217
  392. package/src/router/fs-router.d.ts +0 -26
  393. package/src/router/fs-router.js +0 -100
  394. package/src/router/fs-router.ts +0 -122
  395. package/src/services/asset-processing-service/asset-processing.service.d.ts +0 -41
  396. package/src/services/asset-processing-service/asset-processing.service.ts +0 -306
  397. package/src/services/asset-processing-service/asset.factory.ts +0 -105
  398. package/src/services/asset-processing-service/assets.types.ts +0 -112
  399. package/src/services/asset-processing-service/index.d.ts +0 -3
  400. package/src/services/asset-processing-service/index.js +0 -3
  401. package/src/services/asset-processing-service/index.ts +0 -3
  402. package/src/services/asset-processing-service/processor.interface.ts +0 -27
  403. package/src/services/asset-processing-service/processor.registry.ts +0 -18
  404. package/src/services/asset-processing-service/processors/base/base-processor.ts +0 -76
  405. package/src/services/asset-processing-service/processors/base/base-script-processor.d.ts +0 -16
  406. package/src/services/asset-processing-service/processors/base/base-script-processor.js +0 -80
  407. package/src/services/asset-processing-service/processors/base/base-script-processor.ts +0 -105
  408. package/src/services/asset-processing-service/processors/index.d.ts +0 -5
  409. package/src/services/asset-processing-service/processors/index.js +0 -5
  410. package/src/services/asset-processing-service/processors/index.ts +0 -5
  411. package/src/services/asset-processing-service/processors/script/content-script.processor.js +0 -57
  412. package/src/services/asset-processing-service/processors/script/content-script.processor.ts +0 -66
  413. package/src/services/asset-processing-service/processors/script/file-script.processor.ts +0 -88
  414. package/src/services/asset-processing-service/processors/script/node-module-script.processor.d.ts +0 -7
  415. package/src/services/asset-processing-service/processors/script/node-module-script.processor.js +0 -74
  416. package/src/services/asset-processing-service/processors/script/node-module-script.processor.ts +0 -84
  417. package/src/services/asset-processing-service/processors/stylesheet/content-stylesheet.processor.js +0 -25
  418. package/src/services/asset-processing-service/processors/stylesheet/content-stylesheet.processor.ts +0 -27
  419. package/src/services/asset-processing-service/processors/stylesheet/file-stylesheet.processor.ts +0 -77
  420. package/src/services/cache/cache.types.ts +0 -126
  421. package/src/services/cache/index.ts +0 -18
  422. package/src/services/cache/memory-cache-store.ts +0 -130
  423. package/src/services/cache/page-cache-service.ts +0 -202
  424. package/src/services/html-transformer.service.d.ts +0 -50
  425. package/src/services/html-transformer.service.js +0 -163
  426. package/src/services/html-transformer.service.ts +0 -217
  427. package/src/services/page-module-import.service.d.ts +0 -37
  428. package/src/services/page-module-import.service.js +0 -88
  429. package/src/services/page-module-import.service.ts +0 -129
  430. package/src/services/page-request-cache-coordinator.service.ts +0 -128
  431. package/src/services/schema-validation-service.ts +0 -204
  432. package/src/services/validation/standard-schema.types.ts +0 -68
  433. package/src/static-site-generator/static-site-generator.ts +0 -359
  434. package/src/utils/css.d.ts +0 -1
  435. package/src/utils/css.js +0 -7
  436. package/src/utils/css.ts +0 -5
  437. package/src/utils/deep-merge.ts +0 -47
  438. package/src/utils/hash.ts +0 -5
  439. package/src/utils/html.ts +0 -1
  440. package/src/utils/invariant.ts +0 -15
  441. package/src/utils/locals-utils.ts +0 -37
  442. package/src/utils/parse-cli-args.ts +0 -83
  443. package/src/utils/path-utils.module.ts +0 -14
  444. package/src/utils/runtime.ts +0 -44
  445. package/src/utils/server-utils.module.ts +0 -67
  446. package/src/watchers/project-watcher.test-helpers.ts +0 -41
  447. package/src/watchers/project-watcher.ts +0 -344
  448. /package/src/adapters/{bun → shared}/define-api-handler.js +0 -0
  449. /package/src/{internal-types.js → adapters/shared/runtime-host.js} +0 -0
  450. /package/src/{public-types.js → adapters/shared/static-preview-host.js} +0 -0
  451. /package/src/{services/asset-processing-service/assets.types.js → plugins/runtime-capability.js} +0 -0
  452. /package/src/services/{asset-processing-service → assets/asset-processing-service}/processor.interface.js +0 -0
  453. /package/src/services/{asset-processing-service → assets/asset-processing-service}/processor.registry.js +0 -0
  454. /package/src/services/{schema-validation-service.js → validation/schema-validation-service.js} +0 -0
@@ -1,11 +1,10 @@
1
1
  import path from "node:path";
2
2
  import { AbstractServerAdapter } from "../abstract/server-adapter.js";
3
3
  import { RouteRendererFactory } from "../../route-renderer/route-renderer.js";
4
- import { FSRouter } from "../../router/fs-router.js";
5
- import { FSRouterScanner } from "../../router/fs-router-scanner.js";
4
+ import { RouteRegistry } from "../../router/server/route-registry.js";
6
5
  import { MemoryCacheStore } from "../../services/cache/memory-cache-store.js";
7
6
  import { PageCacheService } from "../../services/cache/page-cache-service.js";
8
- import { SchemaValidationService } from "../../services/schema-validation-service.js";
7
+ import { SchemaValidationService } from "../../services/validation/schema-validation-service.js";
9
8
  import { StaticSiteGenerator } from "../../static-site-generator/static-site-generator.js";
10
9
  import { ServerStaticBuilder } from "./server-static-builder.js";
11
10
  import { ExplicitStaticRouteMatcher } from "./explicit-static-route-matcher.js";
@@ -17,6 +16,9 @@ import { createRequire } from "../../utils/locals-utils.js";
17
16
  import { HttpError } from "../../errors/http-error.js";
18
17
  import { ApiResponseBuilder } from "./api-response.js";
19
18
  import { appLogger } from "../../global/app-logger.js";
19
+ import { fileSystem } from "@ecopages/file-system";
20
+ import { getAppServerModuleTranspiler } from "../../services/module-loading/app-server-module-transpiler.service.js";
21
+ import { resolveInternalExecutionDir } from "../../utils/resolve-work-dir.js";
20
22
  class SharedServerAdapter extends AbstractServerAdapter {
21
23
  router;
22
24
  fileSystemResponseMatcher;
@@ -25,31 +27,67 @@ class SharedServerAdapter extends AbstractServerAdapter {
25
27
  staticSiteGenerator;
26
28
  staticBuilder;
27
29
  schemaValidator = new SchemaValidationService();
30
+ async initializeSharedRouteHandling(options) {
31
+ await this.initSharedRouter();
32
+ this.configureSharedResponseHandlers(options.staticRoutes, options.hmrManager);
33
+ }
34
+ createSharedWatchRefreshCallback(options) {
35
+ return async () => {
36
+ try {
37
+ await this.initializeSharedRouteHandling({
38
+ staticRoutes: options.staticRoutes,
39
+ hmrManager: options.hmrManager
40
+ });
41
+ if (options.onRoutesReady) {
42
+ await options.onRoutesReady();
43
+ }
44
+ } catch (error) {
45
+ if (options.onError) {
46
+ await options.onError(error instanceof Error ? error : new Error(String(error)));
47
+ return;
48
+ }
49
+ throw error;
50
+ }
51
+ };
52
+ }
28
53
  /**
29
- * Scans the filesystem and dynamically constructs the universal router map.
54
+ * Scans the filesystem and dynamically constructs the Route Registry.
30
55
  *
31
56
  * This process runs identically across both Bun and Node wrappers. It analyzes the configured pages
32
57
  * directory, building a map of all available UI routes and API endpoints.
33
- * The resulting `FSRouter` instance becomes the central nervous system for mapping WinterCG incoming
58
+ * The resulting `RouteRegistry` instance becomes the central nervous system for mapping WinterCG incoming
34
59
  * Web Requests (`Request`) to their corresponding internal execution paths.
35
60
  */
36
61
  async initSharedRouter() {
37
- const scanner = new FSRouterScanner({
38
- dir: path.join(this.appConfig.rootDir, this.appConfig.srcDir, this.appConfig.pagesDir),
62
+ this.router = new RouteRegistry({
63
+ pagesDir: path.join(this.appConfig.rootDir, this.appConfig.srcDir, this.appConfig.pagesDir),
39
64
  appConfig: this.appConfig,
40
65
  origin: this.runtimeOrigin,
41
66
  templatesExt: this.appConfig.templatesExt,
42
- options: {
43
- buildMode: !this.options?.watch
44
- }
45
- });
46
- this.router = new FSRouter({
47
- origin: this.runtimeOrigin,
48
- assetPrefix: path.join(this.appConfig.rootDir, this.appConfig.distDir),
49
- scanner
67
+ buildMode: !this.options?.watch,
68
+ pageModuleAdapter: this.createRouteRegistryPageModuleAdapter()
50
69
  });
51
70
  await this.router.init();
52
71
  }
72
+ createRouteRegistryPageModuleAdapter() {
73
+ const serverModuleTranspiler = getAppServerModuleTranspiler(this.appConfig);
74
+ return {
75
+ loadPageModule: async (filePath) => {
76
+ const module = await serverModuleTranspiler.importModule({
77
+ filePath,
78
+ outdir: path.join(resolveInternalExecutionDir(this.appConfig), ".server-route-modules"),
79
+ externalPackages: false,
80
+ transpileErrorMessage: (details) => `Error transpiling route module: ${details}`,
81
+ noOutputMessage: (targetFilePath) => `No transpiled output generated for route module: ${targetFilePath}`
82
+ });
83
+ const page = module.default;
84
+ return {
85
+ staticPaths: page?.staticPaths ?? module.getStaticPaths,
86
+ staticProps: page?.staticProps ?? module.getStaticProps
87
+ };
88
+ }
89
+ };
90
+ }
53
91
  /**
54
92
  * Sets up the unified rendering pipeline and response matching chain.
55
93
  *
@@ -67,47 +105,69 @@ class SharedServerAdapter extends AbstractServerAdapter {
67
105
  configureSharedResponseHandlers(staticRoutes, hmrManager) {
68
106
  this.routeRendererFactory = new RouteRendererFactory({
69
107
  appConfig: this.appConfig,
108
+ rendererModules: this.appConfig.runtime?.rendererModuleContext,
70
109
  runtimeOrigin: this.runtimeOrigin
71
110
  });
111
+ const { fileSystemResponseMatcher, explicitStaticRouteMatcher } = this.createSharedResponseHandlerDependencies(staticRoutes);
112
+ this.fileSystemResponseMatcher = fileSystemResponseMatcher;
113
+ this.routeHandler = new ServerRouteHandler({
114
+ router: this.router,
115
+ fileSystemResponseMatcher: this.fileSystemResponseMatcher,
116
+ explicitStaticRouteMatcher,
117
+ watch: !!this.options?.watch,
118
+ hmrManager
119
+ });
120
+ }
121
+ createSharedResponseHandlerDependencies(staticRoutes) {
72
122
  const fileSystemResponseFactory = new FileSystemServerResponseFactory({
73
- appConfig: this.appConfig,
74
- routeRendererFactory: this.routeRendererFactory,
75
123
  options: {
76
124
  watchMode: !!this.options?.watch
77
125
  }
78
126
  });
79
- const cacheConfig = this.appConfig.cache;
80
- const isCacheEnabled = cacheConfig?.enabled ?? !this.options?.watch;
81
- let cacheService = null;
82
- if (isCacheEnabled) {
83
- const store = cacheConfig?.store === "memory" || !cacheConfig?.store ? new MemoryCacheStore({ maxEntries: cacheConfig?.maxEntries }) : cacheConfig.store;
84
- cacheService = new PageCacheService({ store, enabled: true });
85
- }
86
- this.fileSystemResponseMatcher = new FileSystemResponseMatcher({
127
+ const cacheService = this.createSharedPageCacheService();
128
+ const fileSystemResponseMatcher = new FileSystemResponseMatcher({
129
+ appConfig: this.appConfig,
130
+ assetPrefix: path.join(this.appConfig.rootDir, this.appConfig.distDir),
87
131
  router: this.router,
88
132
  routeRendererFactory: this.routeRendererFactory,
89
133
  fileSystemResponseFactory,
90
134
  cacheService,
91
- defaultCacheStrategy: cacheConfig?.defaultStrategy ?? "static"
92
- });
93
- const explicitStaticRouteMatcher = staticRoutes.length > 0 ? new ExplicitStaticRouteMatcher({
94
- appConfig: this.appConfig,
95
- routeRendererFactory: this.routeRendererFactory,
96
- staticRoutes
97
- }) : void 0;
98
- this.routeHandler = new ServerRouteHandler({
99
- router: this.router,
100
- fileSystemResponseMatcher: this.fileSystemResponseMatcher,
101
- explicitStaticRouteMatcher,
102
- watch: !!this.options?.watch,
103
- hmrManager
135
+ defaultCacheStrategy: this.appConfig.cache?.defaultStrategy ?? "static"
104
136
  });
137
+ return {
138
+ cacheService,
139
+ fileSystemResponseMatcher,
140
+ explicitStaticRouteMatcher: staticRoutes.length > 0 ? new ExplicitStaticRouteMatcher({
141
+ appConfig: this.appConfig,
142
+ routeRendererFactory: this.routeRendererFactory,
143
+ staticRoutes
144
+ }) : void 0
145
+ };
146
+ }
147
+ createSharedPageCacheService() {
148
+ const cacheConfig = this.appConfig.cache;
149
+ const isCacheEnabled = cacheConfig?.enabled ?? !this.options?.watch;
150
+ if (!isCacheEnabled) {
151
+ return null;
152
+ }
153
+ const store = cacheConfig?.store === "memory" || !cacheConfig?.store ? new MemoryCacheStore({ maxEntries: cacheConfig?.maxEntries }) : cacheConfig.store;
154
+ return new PageCacheService({ store, enabled: true });
105
155
  }
106
156
  getCacheService() {
107
157
  return this.fileSystemResponseMatcher?.getCacheService() ?? null;
108
158
  }
109
159
  getRenderContext() {
110
- return createRenderContext({ integrations: this.appConfig.integrations });
160
+ const serverModuleTranspiler = getAppServerModuleTranspiler(this.appConfig);
161
+ return createRenderContext({
162
+ integrations: this.appConfig.integrations,
163
+ rendererModules: this.appConfig.runtime?.rendererModuleContext,
164
+ importServerModule: async (filePath) => await serverModuleTranspiler.importModule({
165
+ filePath,
166
+ outdir: path.join(resolveInternalExecutionDir(this.appConfig), ".server-modules"),
167
+ externalPackages: true,
168
+ bypassCache: this.options?.watch === true
169
+ })
170
+ });
111
171
  }
112
172
  /**
113
173
  * Executes an Application Programming Interface (API) handler in an environment-agnostic manner.
@@ -129,87 +189,18 @@ class SharedServerAdapter extends AbstractServerAdapter {
129
189
  async executeApiHandler(request, params, routeConfig, serverInstance, errorHandler) {
130
190
  let context;
131
191
  try {
132
- const middleware = routeConfig.middleware || [];
133
- const schema = routeConfig.schema;
134
- const locals = {};
135
- const normalizedParams = Object.fromEntries(
136
- Object.entries(params).map(([key, value]) => [key, Array.isArray(value) ? value.join("/") : value])
137
- );
138
- context = {
139
- request,
140
- params: normalizedParams,
141
- response: new ApiResponseBuilder(),
142
- server: serverInstance,
143
- locals,
144
- require: createRequire(() => locals),
145
- services: {
146
- cache: this.getCacheService()
147
- },
148
- ...this.getRenderContext()
149
- };
150
- if (schema) {
151
- const url = new URL(request.url);
152
- const queryParams = Object.fromEntries(url.searchParams);
153
- const headers = Object.fromEntries(request.headers);
154
- let body;
155
- if (schema.body) {
156
- try {
157
- const contentType = request.headers.get("Content-Type") || "";
158
- if (contentType.includes("application/json")) body = await request.clone().json();
159
- else if (contentType.includes("text/plain")) body = await request.clone().text();
160
- } catch {
161
- return context.response.status(400).json({ error: "Invalid request body" });
162
- }
163
- }
164
- const validationResult = await this.schemaValidator.validateRequest(
165
- { body, query: queryParams, headers, params: normalizedParams },
166
- schema
167
- );
168
- if (!validationResult.success) {
169
- return context.response.status(400).json({
170
- error: "Validation failed",
171
- issues: validationResult.errors
172
- });
173
- }
174
- const validated = validationResult.data;
175
- if (validated.body !== void 0) context.body = validated.body;
176
- if (validated.query !== void 0) context.query = validated.query;
177
- if (validated.headers !== void 0) context.headers = validated.headers;
178
- if (validated.params !== void 0) context.params = validated.params;
179
- }
180
- if (middleware.length === 0) {
181
- return await routeConfig.handler(context);
192
+ context = this.createApiHandlerContext(request, params, serverInstance);
193
+ const schemaResponse = await this.applyApiRequestSchema(context, routeConfig.schema);
194
+ if (schemaResponse) {
195
+ return schemaResponse;
182
196
  }
183
- let index = 0;
184
- const executeNext = async () => {
185
- if (index < middleware.length) {
186
- const currentMiddleware = middleware[index++];
187
- return await currentMiddleware(context, executeNext);
188
- }
189
- return await routeConfig.handler(context);
190
- };
191
- return await executeNext();
197
+ return await this.runApiMiddlewareChain(context, routeConfig);
192
198
  } catch (error) {
193
199
  if (error instanceof Response) return error;
194
200
  if (errorHandler) {
195
201
  try {
196
202
  if (!context) {
197
- const locals = {};
198
- context = {
199
- request,
200
- params: Object.fromEntries(
201
- Object.entries(params).map(([key, value]) => [
202
- key,
203
- Array.isArray(value) ? value.join("/") : value
204
- ])
205
- ),
206
- response: new ApiResponseBuilder(),
207
- server: serverInstance,
208
- locals,
209
- require: createRequire(() => locals),
210
- services: { cache: this.getCacheService() },
211
- ...this.getRenderContext()
212
- };
203
+ context = this.createApiHandlerContext(request, params, serverInstance);
213
204
  }
214
205
  return await errorHandler(error, context);
215
206
  } catch (handlerError) {
@@ -221,6 +212,76 @@ class SharedServerAdapter extends AbstractServerAdapter {
221
212
  return new Response("Internal Server Error", { status: 500 });
222
213
  }
223
214
  }
215
+ createApiHandlerContext(request, params, serverInstance) {
216
+ const locals = {};
217
+ const normalizedParams = this.normalizeApiParams(params);
218
+ return {
219
+ request,
220
+ params: normalizedParams,
221
+ response: new ApiResponseBuilder(),
222
+ server: serverInstance,
223
+ locals,
224
+ require: createRequire(() => locals),
225
+ services: {
226
+ cache: this.getCacheService()
227
+ },
228
+ ...this.getRenderContext()
229
+ };
230
+ }
231
+ normalizeApiParams(params) {
232
+ return Object.fromEntries(
233
+ Object.entries(params).map(([key, value]) => [key, Array.isArray(value) ? value.join("/") : value])
234
+ );
235
+ }
236
+ async applyApiRequestSchema(context, schema) {
237
+ if (!schema) {
238
+ return void 0;
239
+ }
240
+ const url = new URL(context.request.url);
241
+ const queryParams = Object.fromEntries(url.searchParams);
242
+ const headers = Object.fromEntries(context.request.headers);
243
+ let body;
244
+ if (schema.body) {
245
+ try {
246
+ const contentType = context.request.headers.get("Content-Type") || "";
247
+ if (contentType.includes("application/json")) body = await context.request.clone().json();
248
+ else if (contentType.includes("text/plain")) body = await context.request.clone().text();
249
+ } catch {
250
+ return context.response.status(400).json({ error: "Invalid request body" });
251
+ }
252
+ }
253
+ const validationResult = await this.schemaValidator.validateRequest(
254
+ { body, query: queryParams, headers, params: context.params },
255
+ schema
256
+ );
257
+ if (!validationResult.success) {
258
+ return context.response.status(400).json({
259
+ error: "Validation failed",
260
+ issues: validationResult.errors
261
+ });
262
+ }
263
+ const validated = validationResult.data;
264
+ if (validated.body !== void 0) context.body = validated.body;
265
+ if (validated.query !== void 0) context.query = validated.query;
266
+ if (validated.headers !== void 0) context.headers = validated.headers;
267
+ if (validated.params !== void 0) context.params = validated.params;
268
+ return void 0;
269
+ }
270
+ async runApiMiddlewareChain(context, routeConfig) {
271
+ const middleware = routeConfig.middleware || [];
272
+ if (middleware.length === 0) {
273
+ return await routeConfig.handler(context);
274
+ }
275
+ let index = 0;
276
+ const executeNext = async () => {
277
+ if (index < middleware.length) {
278
+ const currentMiddleware = middleware[index++];
279
+ return await currentMiddleware(context, executeNext);
280
+ }
281
+ return await routeConfig.handler(context);
282
+ };
283
+ return await executeNext();
284
+ }
224
285
  normalizePath(pathname) {
225
286
  if (pathname.length > 1 && pathname.endsWith("/")) {
226
287
  return pathname.slice(0, -1);
@@ -313,6 +374,40 @@ class SharedServerAdapter extends AbstractServerAdapter {
313
374
  }
314
375
  return null;
315
376
  }
377
+ tryHandleSharedHmrRequest(request, context) {
378
+ const url = new URL(request.url);
379
+ if (url.pathname === "/_hmr_runtime.js" && context.hmrManager) {
380
+ const runtimePath = context.hmrManager.getRuntimePath();
381
+ if (fileSystem.exists(runtimePath)) {
382
+ return new Response(fileSystem.readFileAsBuffer(runtimePath), {
383
+ headers: { "Content-Type": "application/javascript" }
384
+ });
385
+ }
386
+ }
387
+ if (url.pathname.startsWith("/assets/_hmr/") && context.hmrManager) {
388
+ const relativePath = url.pathname.slice("/assets/_hmr/".length);
389
+ const assetPath = path.join(context.hmrManager.getDistDir(), relativePath);
390
+ if (fileSystem.exists(assetPath)) {
391
+ return new Response(fileSystem.readFileAsBuffer(assetPath), {
392
+ headers: { "Content-Type": "application/javascript" }
393
+ });
394
+ }
395
+ }
396
+ return null;
397
+ }
398
+ async tryHandleSharedApiRequest(request, context) {
399
+ const apiMatch = this.matchApiHandler(request, context.apiHandlers);
400
+ if (!apiMatch) {
401
+ return null;
402
+ }
403
+ return await this.executeApiHandler(
404
+ request,
405
+ apiMatch.params,
406
+ apiMatch.routeConfig,
407
+ context.serverInstance,
408
+ context.errorHandler
409
+ );
410
+ }
316
411
  /**
317
412
  * Universally processes an incoming WinterCG Web standard Request.
318
413
  *
@@ -325,25 +420,13 @@ class SharedServerAdapter extends AbstractServerAdapter {
325
420
  * native HTTP objects into Web Standard Requests.
326
421
  */
327
422
  async handleSharedRequest(request, context) {
328
- const url = new URL(request.url);
329
- if (url.pathname === "/_hmr_runtime.js" && context.hmrManager) {
330
- const runtimePath = context.hmrManager.getRuntimePath();
331
- const fileSystem = (await import("@ecopages/file-system")).fileSystem;
332
- if (fileSystem.exists(runtimePath)) {
333
- return new Response(fileSystem.readFileAsBuffer(runtimePath), {
334
- headers: { "Content-Type": "application/javascript" }
335
- });
336
- }
423
+ const hmrResponse = this.tryHandleSharedHmrRequest(request, context);
424
+ if (hmrResponse) {
425
+ return hmrResponse;
337
426
  }
338
- const apiMatch = this.matchApiHandler(request, context.apiHandlers);
339
- if (apiMatch) {
340
- return this.executeApiHandler(
341
- request,
342
- apiMatch.params,
343
- apiMatch.routeConfig,
344
- context.serverInstance,
345
- context.errorHandler
346
- );
427
+ const apiResponse = await this.tryHandleSharedApiRequest(request, context);
428
+ if (apiResponse) {
429
+ return apiResponse;
347
430
  }
348
431
  return this.routeHandler.handleResponse(request);
349
432
  }
@@ -1,13 +1,13 @@
1
- import type { IHmrManager } from '../../public-types';
2
- import type { FSRouter } from '../../router/fs-router';
3
- import type { ExplicitStaticRouteMatcher } from './explicit-static-route-matcher';
4
- import type { FileSystemResponseMatcher } from './fs-server-response-matcher';
1
+ import type { IHmrManager } from '../../types/public-types.js';
2
+ import type { RouteRegistry } from '../../router/server/route-registry.js';
3
+ import type { ExplicitStaticRouteMatcher } from './explicit-static-route-matcher.js';
4
+ import type { FileSystemResponseMatcher } from './fs-server-response-matcher.js';
5
5
  /**
6
6
  * Configuration parameters for ServerRouteHandler.
7
7
  */
8
8
  export interface ServerRouteHandlerParams {
9
9
  /** File system router for matching request URLs to route handlers. */
10
- router: FSRouter;
10
+ router: RouteRegistry;
11
11
  /** Matcher for handling file system route responses. */
12
12
  fileSystemResponseMatcher: FileSystemResponseMatcher;
13
13
  /** Optional matcher for explicit static routes like processed images or sitemaps. */
@@ -1,5 +1,6 @@
1
- import { appLogger } from "../../global/app-logger";
2
- import { HttpError } from "../../errors/http-error";
1
+ import { appLogger } from "../../global/app-logger.js";
2
+ import { HttpError } from "../../errors/http-error.js";
3
+ import { injectHmrRuntimeIntoHtmlResponse, isHtmlResponse, shouldInjectHmrHtmlResponse } from "./hmr-html-response.js";
3
4
  class ServerRouteHandler {
4
5
  router;
5
6
  fileSystemResponseMatcher;
@@ -30,7 +31,7 @@ class ServerRouteHandler {
30
31
  * @returns true if in watch mode and HMR manager is enabled
31
32
  */
32
33
  shouldInjectHmrScript() {
33
- return this.watch && this.hmrManager?.isEnabled() === true;
34
+ return shouldInjectHmrHtmlResponse(this.watch, this.hmrManager);
34
35
  }
35
36
  /**
36
37
  * Checks if a response contains HTML content.
@@ -39,8 +40,7 @@ class ServerRouteHandler {
39
40
  * @returns true if Content-Type header starts with 'text/html'
40
41
  */
41
42
  isHtmlResponse(response) {
42
- const contentType = response.headers.get("Content-Type");
43
- return contentType !== null && contentType.startsWith("text/html");
43
+ return isHtmlResponse(response);
44
44
  }
45
45
  /**
46
46
  * Handles HTTP requests from the router adapter.
@@ -60,7 +60,7 @@ class ServerRouteHandler {
60
60
  const response2 = await this.explicitStaticRouteMatcher.handleMatch(explicitMatch);
61
61
  return this.maybeInjectHmrScript(response2);
62
62
  }
63
- const fsMatch = !pathname.includes(".") && this.router.match(request.url);
63
+ const fsMatch = !pathname.includes(".") && this.router.matchRequest(request.url);
64
64
  const response = await (fsMatch ? this.fileSystemResponseMatcher.handleMatch(fsMatch, request) : this.handleNoMatch(request));
65
65
  return this.maybeInjectHmrScript(response);
66
66
  }
@@ -75,16 +75,7 @@ class ServerRouteHandler {
75
75
  */
76
76
  async maybeInjectHmrScript(response) {
77
77
  if (this.shouldInjectHmrScript() && this.isHtmlResponse(response)) {
78
- const html = await response.text();
79
- const hmrScript = `<script type="module">import '/_hmr_runtime.js';<\/script>`;
80
- const updatedHtml = html.replace(/<\/html>/i, `${hmrScript}</html>`);
81
- const headers = new Headers(response.headers);
82
- headers.delete("Content-Length");
83
- return new Response(updatedHtml, {
84
- status: response.status,
85
- statusText: response.statusText,
86
- headers
87
- });
78
+ return injectHmrRuntimeIntoHtmlResponse(response);
88
79
  }
89
80
  return response;
90
81
  }
@@ -1,10 +1,11 @@
1
- import type { EcoPagesAppConfig } from '../../internal-types';
2
- import type { StaticRoute } from '../../public-types';
3
- import type { RouteRendererFactory } from '../../route-renderer/route-renderer';
4
- import type { FSRouter } from '../../router/fs-router';
5
- import type { StaticSiteGenerator } from '../../static-site-generator/static-site-generator';
1
+ import type { EcoPagesAppConfig } from '../../types/internal-types.js';
2
+ import type { ApiHandler, StaticRoute } from '../../types/public-types.js';
3
+ import type { RouteRegistry } from '../../router/server/route-registry.js';
4
+ import type { StaticSiteGenerator } from '../../static-site-generator/static-site-generator.js';
5
+ import type { StaticGenerationRendererResolver } from '../../route-renderer/route-renderer.js';
6
6
  export interface StaticBuildOptions {
7
7
  preview?: boolean;
8
+ baseUrl?: string;
8
9
  }
9
10
  export interface ServeOptions {
10
11
  hostname?: string;
@@ -14,6 +15,32 @@ export interface ServerStaticBuilderParams {
14
15
  appConfig: EcoPagesAppConfig;
15
16
  staticSiteGenerator: StaticSiteGenerator;
16
17
  serveOptions: ServeOptions;
18
+ apiHandlers?: ApiHandler[];
19
+ logger?: ServerStaticBuilderLogger;
20
+ previewServerFactory?: ServerStaticPreviewServerFactory;
21
+ }
22
+ /**
23
+ * Minimal logger dependency used by the static builder.
24
+ */
25
+ export interface ServerStaticBuilderLogger {
26
+ warn(message: string, detail?: string): unknown;
27
+ info(message: string): unknown;
28
+ error(message: string): unknown;
29
+ }
30
+ /**
31
+ * Preview server factory dependency used when static preview mode is enabled.
32
+ */
33
+ export interface ServerStaticPreviewServerFactory {
34
+ createServer(args: {
35
+ appConfig: EcoPagesAppConfig;
36
+ options: {
37
+ port: number;
38
+ };
39
+ }): {
40
+ server?: {
41
+ port?: number;
42
+ } | null;
43
+ };
17
44
  }
18
45
  /**
19
46
  * Handles static site generation and previews.
@@ -22,7 +49,13 @@ export declare class ServerStaticBuilder {
22
49
  private readonly appConfig;
23
50
  private readonly staticSiteGenerator;
24
51
  private readonly serveOptions;
25
- constructor({ appConfig, staticSiteGenerator, serveOptions }: ServerStaticBuilderParams);
52
+ private readonly apiHandlers;
53
+ private readonly logger;
54
+ private readonly previewServerFactory;
55
+ constructor({ appConfig, staticSiteGenerator, serveOptions, apiHandlers, logger, previewServerFactory, }: ServerStaticBuilderParams);
56
+ private warnApiHandlersUnavailableInStaticMode;
57
+ private prepareExportDirectory;
58
+ private refreshRuntimeAssets;
26
59
  /**
27
60
  * Generates a static build of the site for deployment.
28
61
  * @param options.preview - If true, starts a preview server after build
@@ -31,8 +64,8 @@ export declare class ServerStaticBuilder {
31
64
  * @param dependencies.staticRoutes - Explicit static routes registered via app.static()
32
65
  */
33
66
  build(options: StaticBuildOptions | undefined, dependencies: {
34
- router: FSRouter;
35
- routeRendererFactory: RouteRendererFactory;
67
+ router: RouteRegistry;
68
+ routeRendererFactory: StaticGenerationRendererResolver;
36
69
  staticRoutes?: StaticRoute[];
37
70
  }): Promise<void>;
38
71
  }