@ecopages/core 0.2.0-alpha.3 → 0.2.0-alpha.30

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 (436) hide show
  1. package/CHANGELOG.md +66 -66
  2. package/README.md +268 -14
  3. package/package.json +72 -108
  4. package/src/adapters/README.md +39 -0
  5. package/src/adapters/abstract/application-adapter.d.ts +28 -2
  6. package/src/adapters/abstract/application-adapter.js +14 -2
  7. package/src/adapters/abstract/router-adapter.d.ts +1 -1
  8. package/src/adapters/abstract/server-adapter.d.ts +2 -2
  9. package/src/adapters/bun/client-bridge.d.ts +1 -1
  10. package/src/adapters/bun/create-app.d.ts +5 -12
  11. package/src/adapters/bun/create-app.js +43 -7
  12. package/src/adapters/bun/hmr-manager.d.ts +72 -26
  13. package/src/adapters/bun/hmr-manager.js +153 -81
  14. package/src/adapters/bun/index.d.ts +2 -3
  15. package/src/adapters/bun/index.js +3 -3
  16. package/src/adapters/bun/server-adapter.d.ts +5 -5
  17. package/src/adapters/bun/server-adapter.js +63 -38
  18. package/src/adapters/bun/server-lifecycle.d.ts +28 -17
  19. package/src/adapters/bun/server-lifecycle.js +34 -62
  20. package/src/{create-app.d.ts → adapters/create-app.d.ts} +9 -6
  21. package/src/{create-app.js → adapters/create-app.js} +4 -4
  22. package/src/adapters/index.d.ts +2 -6
  23. package/src/adapters/index.js +2 -8
  24. package/src/adapters/node/create-app.d.ts +6 -9
  25. package/src/adapters/node/create-app.js +12 -6
  26. package/src/adapters/node/node-client-bridge.d.ts +1 -1
  27. package/src/adapters/node/node-hmr-manager.d.ts +79 -21
  28. package/src/adapters/node/node-hmr-manager.js +167 -114
  29. package/src/adapters/node/server-adapter.d.ts +7 -35
  30. package/src/adapters/node/server-adapter.js +55 -107
  31. package/src/adapters/node/static-content-server.d.ts +37 -1
  32. package/src/adapters/node/static-content-server.js +29 -1
  33. package/src/adapters/shared/application-adapter.d.ts +1 -1
  34. package/src/{define-api-handler.d.ts → adapters/shared/define-api-handler.d.ts} +1 -1
  35. package/src/adapters/shared/explicit-static-render-preparation.d.ts +25 -0
  36. package/src/adapters/shared/explicit-static-render-preparation.js +26 -0
  37. package/src/adapters/shared/explicit-static-route-matcher.d.ts +7 -4
  38. package/src/adapters/shared/explicit-static-route-matcher.js +14 -13
  39. package/src/adapters/shared/file-route-middleware-pipeline.d.ts +7 -10
  40. package/src/adapters/shared/file-route-middleware-pipeline.js +3 -11
  41. package/src/adapters/shared/fs-server-response-factory.d.ts +14 -10
  42. package/src/adapters/shared/fs-server-response-factory.js +11 -27
  43. package/src/adapters/shared/fs-server-response-matcher.d.ts +20 -16
  44. package/src/adapters/shared/fs-server-response-matcher.js +76 -45
  45. package/src/adapters/shared/hmr-entrypoint-registrar.d.ts +55 -0
  46. package/src/adapters/shared/hmr-entrypoint-registrar.js +87 -0
  47. package/src/adapters/shared/hmr-html-response.d.ts +22 -0
  48. package/src/adapters/shared/hmr-html-response.js +32 -0
  49. package/src/adapters/shared/render-context.d.ts +4 -3
  50. package/src/adapters/shared/render-context.js +6 -3
  51. package/src/adapters/shared/runtime-bootstrap.d.ts +38 -0
  52. package/src/adapters/shared/runtime-bootstrap.js +43 -0
  53. package/src/adapters/shared/server-adapter.d.ts +33 -12
  54. package/src/adapters/shared/server-adapter.js +208 -132
  55. package/src/adapters/shared/server-route-handler.d.ts +5 -5
  56. package/src/adapters/shared/server-route-handler.js +7 -16
  57. package/src/adapters/shared/server-static-builder.d.ts +41 -8
  58. package/src/adapters/shared/server-static-builder.js +65 -11
  59. package/src/build/README.md +107 -0
  60. package/src/build/build-adapter.d.ts +168 -3
  61. package/src/build/build-adapter.js +604 -16
  62. package/src/build/build-manifest.d.ts +27 -0
  63. package/src/build/build-manifest.js +30 -0
  64. package/src/build/dev-build-coordinator.d.ts +72 -0
  65. package/src/build/dev-build-coordinator.js +154 -0
  66. package/src/build/esbuild-build-adapter.d.ts +15 -6
  67. package/src/build/esbuild-build-adapter.js +189 -74
  68. package/src/build/runtime-build-executor.d.ts +14 -0
  69. package/src/build/runtime-build-executor.js +22 -0
  70. package/src/build/runtime-specifier-alias-plugin.d.ts +15 -0
  71. package/src/build/runtime-specifier-alias-plugin.js +35 -0
  72. package/src/build/runtime-specifier-aliases.d.ts +5 -0
  73. package/src/build/runtime-specifier-aliases.js +95 -0
  74. package/src/config/README.md +36 -0
  75. package/src/config/config-builder.d.ts +54 -29
  76. package/src/config/config-builder.js +255 -49
  77. package/src/{constants.d.ts → config/constants.d.ts} +13 -0
  78. package/src/{constants.js → config/constants.js} +4 -0
  79. package/src/declarations.d.ts +19 -14
  80. package/src/dev/host-runtime.d.ts +10 -0
  81. package/src/dev/host-runtime.js +24 -0
  82. package/src/dev/sc-server.d.ts +1 -1
  83. package/src/dev/sc-server.js +1 -1
  84. package/src/eco/README.md +70 -16
  85. package/src/eco/eco.browser.d.ts +2 -0
  86. package/src/eco/eco.browser.js +83 -0
  87. package/src/eco/eco.js +32 -57
  88. package/src/eco/eco.types.d.ts +14 -6
  89. package/src/eco/eco.utils.d.ts +1 -40
  90. package/src/eco/eco.utils.js +5 -35
  91. package/src/eco/global-injector-map.d.ts +3 -3
  92. package/src/eco/global-injector-map.js +2 -2
  93. package/src/eco/lazy-injector-map.d.ts +2 -2
  94. package/src/errors/index.d.ts +1 -0
  95. package/src/errors/index.js +3 -1
  96. package/src/hmr/README.md +26 -0
  97. package/src/hmr/client/hmr-runtime.d.ts +1 -6
  98. package/src/hmr/client/hmr-runtime.js +38 -7
  99. package/src/hmr/hmr-strategy.d.ts +16 -13
  100. package/src/hmr/hmr-strategy.js +22 -7
  101. package/src/hmr/hmr.postcss.test.e2e.d.ts +1 -0
  102. package/src/hmr/hmr.postcss.test.e2e.js +31 -0
  103. package/src/hmr/hmr.test.e2e.js +26 -33
  104. package/src/hmr/strategies/default-hmr-strategy.d.ts +2 -2
  105. package/src/hmr/strategies/default-hmr-strategy.js +1 -1
  106. package/src/hmr/strategies/js-hmr-strategy.d.ts +46 -48
  107. package/src/hmr/strategies/js-hmr-strategy.js +64 -74
  108. package/src/index.browser.d.ts +2 -2
  109. package/src/index.browser.js +1 -1
  110. package/src/index.d.ts +4 -3
  111. package/src/index.js +16 -5
  112. package/src/integrations/ghtml/ghtml-renderer.d.ts +3 -2
  113. package/src/integrations/ghtml/ghtml-renderer.js +27 -30
  114. package/src/integrations/ghtml/ghtml.constants.d.ts +1 -0
  115. package/src/integrations/ghtml/ghtml.constants.js +4 -0
  116. package/src/integrations/ghtml/ghtml.plugin.d.ts +2 -6
  117. package/src/integrations/ghtml/ghtml.plugin.js +3 -4
  118. package/src/plugins/README.md +35 -0
  119. package/src/plugins/alias-resolver-plugin.js +17 -3
  120. package/src/plugins/eco-component-meta-plugin.d.ts +14 -1
  121. package/src/plugins/eco-component-meta-plugin.js +27 -22
  122. package/src/plugins/foreign-jsx-override-plugin.d.ts +31 -0
  123. package/src/plugins/foreign-jsx-override-plugin.js +35 -0
  124. package/src/plugins/integration-plugin.d.ts +142 -29
  125. package/src/plugins/integration-plugin.js +103 -14
  126. package/src/plugins/processor.d.ts +17 -2
  127. package/src/plugins/processor.js +22 -3
  128. package/src/plugins/runtime-capability.d.ts +9 -0
  129. package/src/plugins/source-transform.d.ts +46 -0
  130. package/src/plugins/source-transform.js +71 -0
  131. package/src/route-renderer/GRAPH.md +83 -325
  132. package/src/route-renderer/README.md +73 -90
  133. package/src/route-renderer/orchestration/component-render-context.d.ts +89 -0
  134. package/src/route-renderer/orchestration/component-render-context.js +147 -0
  135. package/src/route-renderer/orchestration/declared-ownership-graph.d.ts +18 -0
  136. package/src/route-renderer/orchestration/declared-ownership-graph.js +34 -0
  137. package/src/route-renderer/orchestration/foreign-subtree-execution.service.d.ts +108 -0
  138. package/src/route-renderer/orchestration/foreign-subtree-execution.service.js +206 -0
  139. package/src/route-renderer/orchestration/integration-renderer.d.ts +516 -0
  140. package/src/route-renderer/orchestration/integration-renderer.js +909 -0
  141. package/src/route-renderer/orchestration/ownership-planning.service.d.ts +24 -0
  142. package/src/route-renderer/orchestration/ownership-planning.service.js +63 -0
  143. package/src/route-renderer/orchestration/ownership-validation.service.d.ts +29 -0
  144. package/src/route-renderer/orchestration/ownership-validation.service.js +53 -0
  145. package/src/route-renderer/orchestration/processed-asset-dedupe.d.ts +2 -0
  146. package/src/route-renderer/orchestration/processed-asset-dedupe.js +23 -0
  147. package/src/route-renderer/orchestration/queued-foreign-subtree-resolution.service.d.ts +90 -0
  148. package/src/route-renderer/orchestration/queued-foreign-subtree-resolution.service.js +158 -0
  149. package/src/route-renderer/orchestration/render-output.utils.d.ts +66 -0
  150. package/src/route-renderer/orchestration/render-output.utils.js +171 -0
  151. package/src/route-renderer/orchestration/route-render-orchestrator.d.ts +120 -0
  152. package/src/route-renderer/orchestration/route-render-orchestrator.js +388 -0
  153. package/src/route-renderer/orchestration/template-serialization.d.ts +38 -0
  154. package/src/route-renderer/orchestration/template-serialization.js +45 -0
  155. package/src/route-renderer/page-loading/component-dependency-collection.d.ts +37 -0
  156. package/src/route-renderer/page-loading/component-dependency-collection.js +132 -0
  157. package/src/route-renderer/page-loading/declared-asset-collection.d.ts +24 -0
  158. package/src/route-renderer/page-loading/declared-asset-collection.js +106 -0
  159. package/src/route-renderer/{dependency-resolver.d.ts → page-loading/dependency-resolver.d.ts} +15 -4
  160. package/src/route-renderer/page-loading/dependency-resolver.js +115 -0
  161. package/src/route-renderer/page-loading/ecopages-virtual-imports.d.ts +11 -0
  162. package/src/route-renderer/page-loading/ecopages-virtual-imports.js +57 -0
  163. package/src/route-renderer/page-loading/lazy-entry-collection.d.ts +45 -0
  164. package/src/route-renderer/page-loading/lazy-entry-collection.js +105 -0
  165. package/src/route-renderer/page-loading/lazy-trigger-planning.d.ts +19 -0
  166. package/src/route-renderer/page-loading/lazy-trigger-planning.js +40 -0
  167. package/src/route-renderer/page-loading/module-declaration-aggregation.d.ts +5 -0
  168. package/src/route-renderer/page-loading/module-declaration-aggregation.js +33 -0
  169. package/src/route-renderer/page-loading/module-declaration-scripts.d.ts +3 -0
  170. package/src/route-renderer/page-loading/module-declaration-scripts.js +18 -0
  171. package/src/route-renderer/page-loading/page-dependency-bundling.d.ts +13 -0
  172. package/src/route-renderer/page-loading/page-dependency-bundling.js +137 -0
  173. package/src/route-renderer/page-loading/page-module-loader.d.ts +90 -0
  174. package/src/route-renderer/{page-module-loader.js → page-loading/page-module-loader.js} +39 -14
  175. package/src/route-renderer/route-renderer.d.ts +57 -14
  176. package/src/route-renderer/route-renderer.js +30 -18
  177. package/src/router/README.md +94 -0
  178. package/src/router/client/link-intent.d.ts +53 -0
  179. package/src/router/client/link-intent.js +34 -0
  180. package/src/router/client/link-intent.test.browser.d.ts +1 -0
  181. package/src/router/client/link-intent.test.browser.js +43 -0
  182. package/src/router/client/navigation-coordinator.d.ts +169 -0
  183. package/src/router/client/navigation-coordinator.js +215 -0
  184. package/src/router/server/route-registry.d.ts +78 -0
  185. package/src/router/server/route-registry.js +262 -0
  186. package/src/services/README.md +28 -0
  187. package/src/services/assets/asset-processing-service/asset-dependency-keys.d.ts +3 -0
  188. package/src/services/assets/asset-processing-service/asset-dependency-keys.js +56 -0
  189. package/src/services/assets/asset-processing-service/asset-processing.service.d.ts +103 -0
  190. package/src/services/{asset-processing-service → assets/asset-processing-service}/asset-processing.service.js +124 -89
  191. package/src/services/{asset-processing-service → assets/asset-processing-service}/asset.factory.d.ts +1 -1
  192. package/src/services/{asset-processing-service → assets/asset-processing-service}/asset.factory.js +2 -2
  193. package/src/services/{asset-processing-service → assets/asset-processing-service}/assets.types.d.ts +16 -1
  194. package/src/services/assets/asset-processing-service/browser-runtime-asset.factory.d.ts +55 -0
  195. package/src/services/assets/asset-processing-service/browser-runtime-asset.factory.js +49 -0
  196. package/src/services/assets/asset-processing-service/browser-runtime-entry.factory.d.ts +20 -0
  197. package/src/services/assets/asset-processing-service/browser-runtime-entry.factory.js +41 -0
  198. package/src/services/assets/asset-processing-service/grouped-content-bundles.d.ts +30 -0
  199. package/src/services/assets/asset-processing-service/grouped-content-bundles.js +65 -0
  200. package/src/services/assets/asset-processing-service/index.d.ts +6 -0
  201. package/src/services/assets/asset-processing-service/index.js +6 -0
  202. package/src/services/assets/asset-processing-service/page-package.d.ts +3 -0
  203. package/src/services/assets/asset-processing-service/page-package.js +74 -0
  204. package/src/services/{asset-processing-service → assets/asset-processing-service}/processor.interface.d.ts +2 -2
  205. package/src/services/{asset-processing-service → assets/asset-processing-service}/processor.registry.d.ts +2 -2
  206. package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/base/base-processor.d.ts +1 -1
  207. package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/base/base-processor.js +11 -5
  208. package/src/services/assets/asset-processing-service/processors/base/base-script-processor.d.ts +22 -0
  209. package/src/services/assets/asset-processing-service/processors/base/base-script-processor.js +136 -0
  210. package/src/services/assets/asset-processing-service/processors/index.d.ts +5 -0
  211. package/src/services/assets/asset-processing-service/processors/index.js +5 -0
  212. package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/script/content-script.processor.d.ts +3 -2
  213. package/src/services/assets/asset-processing-service/processors/script/content-script.processor.js +119 -0
  214. package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/script/file-script.processor.d.ts +4 -3
  215. package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/script/file-script.processor.js +28 -7
  216. package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/script/node-module-script.processor.d.ts +3 -3
  217. package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/script/node-module-script.processor.js +12 -7
  218. package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/stylesheet/content-stylesheet.processor.d.ts +5 -2
  219. package/src/services/assets/asset-processing-service/processors/stylesheet/content-stylesheet.processor.js +59 -0
  220. package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/stylesheet/file-stylesheet.processor.d.ts +2 -2
  221. package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/stylesheet/file-stylesheet.processor.js +9 -3
  222. package/src/services/assets/asset-processing-service/ungrouped-dependency-processing.d.ts +18 -0
  223. package/src/services/assets/asset-processing-service/ungrouped-dependency-processing.js +45 -0
  224. package/src/services/assets/browser-bundle.service.d.ts +73 -0
  225. package/src/services/assets/browser-bundle.service.js +41 -0
  226. package/src/services/{page-request-cache-coordinator.service.d.ts → cache/page-request-cache-coordinator.service.d.ts} +2 -2
  227. package/src/services/{page-request-cache-coordinator.service.js → cache/page-request-cache-coordinator.service.js} +3 -1
  228. package/src/services/html/html-rewriter-provider.service.d.ts +37 -0
  229. package/src/services/html/html-rewriter-provider.service.js +68 -0
  230. package/src/services/html/html-transformer.service.d.ts +87 -0
  231. package/src/services/html/html-transformer.service.js +216 -0
  232. package/src/services/invalidation/development-invalidation.service.d.ts +74 -0
  233. package/src/services/invalidation/development-invalidation.service.js +190 -0
  234. package/src/services/module-loading/app-module-loader.service.d.ts +7 -0
  235. package/src/services/module-loading/app-server-module-transpiler.service.d.ts +24 -0
  236. package/src/services/module-loading/app-server-module-transpiler.service.js +115 -0
  237. package/src/services/module-loading/host-module-loader-registry.d.ts +4 -0
  238. package/src/services/module-loading/host-module-loader-registry.js +15 -0
  239. package/src/services/module-loading/module-loading-types.d.ts +2 -0
  240. package/src/services/module-loading/module-loading-types.js +0 -0
  241. package/src/services/module-loading/node-bootstrap-plugin.d.ts +42 -0
  242. package/src/services/module-loading/node-bootstrap-plugin.js +216 -0
  243. package/src/services/module-loading/page-module-import.service.d.ts +76 -0
  244. package/src/services/module-loading/page-module-import.service.js +170 -0
  245. package/src/services/module-loading/server-module-transpiler.service.d.ts +63 -0
  246. package/src/services/module-loading/server-module-transpiler.service.js +64 -0
  247. package/src/services/module-loading/source-module-support.d.ts +5 -0
  248. package/src/services/module-loading/source-module-support.js +8 -0
  249. package/src/services/runtime-state/dev-graph.service.d.ts +118 -0
  250. package/src/services/runtime-state/dev-graph.service.js +162 -0
  251. package/src/services/runtime-state/entrypoint-dependency-graph.service.d.ts +41 -0
  252. package/src/services/runtime-state/entrypoint-dependency-graph.service.js +85 -0
  253. package/src/services/runtime-state/server-invalidation-state.service.d.ts +26 -0
  254. package/src/services/runtime-state/server-invalidation-state.service.js +35 -0
  255. package/src/services/{schema-validation-service.d.ts → validation/schema-validation-service.d.ts} +1 -1
  256. package/src/static-site-generator/README.md +26 -0
  257. package/src/static-site-generator/static-site-generator.d.ts +67 -20
  258. package/src/static-site-generator/static-site-generator.js +182 -138
  259. package/src/{internal-types.d.ts → types/internal-types.d.ts} +62 -30
  260. package/src/types/internal-types.js +0 -0
  261. package/src/{public-types.d.ts → types/public-types.d.ts} +201 -32
  262. package/src/types/public-types.js +0 -0
  263. package/src/utils/html-escaping.d.ts +7 -0
  264. package/src/utils/html-escaping.js +6 -0
  265. package/src/utils/locals-utils.d.ts +1 -1
  266. package/src/utils/parse-cli-args.d.ts +4 -1
  267. package/src/utils/parse-cli-args.js +16 -1
  268. package/src/utils/resolve-work-dir.d.ts +11 -0
  269. package/src/utils/resolve-work-dir.js +31 -0
  270. package/src/watchers/project-watcher.d.ts +40 -29
  271. package/src/watchers/project-watcher.js +126 -116
  272. package/src/watchers/project-watcher.test-helpers.d.ts +2 -2
  273. package/src/watchers/project-watcher.test-helpers.js +6 -6
  274. package/src/adapters/abstract/application-adapter.ts +0 -337
  275. package/src/adapters/abstract/router-adapter.ts +0 -30
  276. package/src/adapters/abstract/server-adapter.ts +0 -79
  277. package/src/adapters/bun/client-bridge.ts +0 -62
  278. package/src/adapters/bun/create-app.ts +0 -189
  279. package/src/adapters/bun/define-api-handler.d.ts +0 -61
  280. package/src/adapters/bun/define-api-handler.ts +0 -114
  281. package/src/adapters/bun/hmr-manager.ts +0 -296
  282. package/src/adapters/bun/index.ts +0 -3
  283. package/src/adapters/bun/server-adapter.ts +0 -492
  284. package/src/adapters/bun/server-lifecycle.ts +0 -154
  285. package/src/adapters/index.ts +0 -6
  286. package/src/adapters/node/create-app.ts +0 -179
  287. package/src/adapters/node/index.d.ts +0 -4
  288. package/src/adapters/node/index.js +0 -8
  289. package/src/adapters/node/index.ts +0 -9
  290. package/src/adapters/node/node-client-bridge.ts +0 -79
  291. package/src/adapters/node/node-hmr-manager.ts +0 -289
  292. package/src/adapters/node/server-adapter.ts +0 -561
  293. package/src/adapters/node/static-content-server.ts +0 -203
  294. package/src/adapters/shared/api-response.ts +0 -104
  295. package/src/adapters/shared/application-adapter.ts +0 -199
  296. package/src/adapters/shared/explicit-static-route-matcher.ts +0 -134
  297. package/src/adapters/shared/file-route-middleware-pipeline.ts +0 -123
  298. package/src/adapters/shared/fs-server-response-factory.ts +0 -118
  299. package/src/adapters/shared/fs-server-response-matcher.ts +0 -198
  300. package/src/adapters/shared/render-context.ts +0 -105
  301. package/src/adapters/shared/server-adapter.ts +0 -442
  302. package/src/adapters/shared/server-route-handler.ts +0 -166
  303. package/src/adapters/shared/server-static-builder.ts +0 -82
  304. package/src/build/build-adapter.ts +0 -132
  305. package/src/build/build-types.ts +0 -83
  306. package/src/build/esbuild-build-adapter.ts +0 -510
  307. package/src/config/config-builder.ts +0 -474
  308. package/src/constants.ts +0 -39
  309. package/src/create-app.ts +0 -87
  310. package/src/define-api-handler.js +0 -15
  311. package/src/define-api-handler.ts +0 -66
  312. package/src/dev/sc-server.ts +0 -143
  313. package/src/eco/component-render-context.d.ts +0 -105
  314. package/src/eco/component-render-context.js +0 -77
  315. package/src/eco/component-render-context.ts +0 -202
  316. package/src/eco/eco.ts +0 -221
  317. package/src/eco/eco.types.ts +0 -202
  318. package/src/eco/eco.utils.ts +0 -89
  319. package/src/eco/global-injector-map.ts +0 -112
  320. package/src/eco/lazy-injector-map.ts +0 -120
  321. package/src/eco/module-dependencies.ts +0 -75
  322. package/src/errors/http-error.ts +0 -72
  323. package/src/errors/index.ts +0 -2
  324. package/src/errors/locals-access-error.ts +0 -7
  325. package/src/global/app-logger.ts +0 -4
  326. package/src/hmr/client/__screenshots__/hmr-runtime.test.browser.ts/HMR-Runtime-HMR-Server-Integration-should-have-HMR-script-injected-in-page-1.png +0 -0
  327. package/src/hmr/client/__screenshots__/hmr-runtime.test.browser.ts/HMR-Runtime-HMR-Server-Integration-should-load-fixture-app-page-1.png +0 -0
  328. package/src/hmr/client/__screenshots__/hmr-runtime.test.browser.ts/HMR-Runtime-WebSocket-Connection-should-connect-to-correct-HMR-endpoint-1.png +0 -0
  329. package/src/hmr/client/hmr-runtime.ts +0 -121
  330. package/src/hmr/hmr-strategy.ts +0 -172
  331. package/src/hmr/hmr.test.e2e.ts +0 -75
  332. package/src/hmr/strategies/default-hmr-strategy.ts +0 -60
  333. package/src/hmr/strategies/js-hmr-strategy.ts +0 -320
  334. package/src/index.browser.ts +0 -3
  335. package/src/index.ts +0 -5
  336. package/src/integrations/ghtml/ghtml-renderer.ts +0 -93
  337. package/src/integrations/ghtml/ghtml.plugin.ts +0 -32
  338. package/src/internal-types.ts +0 -212
  339. package/src/plugins/alias-resolver-plugin.ts +0 -45
  340. package/src/plugins/eco-component-meta-plugin.ts +0 -474
  341. package/src/plugins/integration-plugin.ts +0 -184
  342. package/src/plugins/processor.ts +0 -220
  343. package/src/public-types.ts +0 -1260
  344. package/src/route-renderer/component-graph-executor.d.ts +0 -32
  345. package/src/route-renderer/component-graph-executor.js +0 -31
  346. package/src/route-renderer/component-graph-executor.ts +0 -84
  347. package/src/route-renderer/component-graph.d.ts +0 -42
  348. package/src/route-renderer/component-graph.js +0 -72
  349. package/src/route-renderer/component-graph.ts +0 -159
  350. package/src/route-renderer/component-marker.d.ts +0 -52
  351. package/src/route-renderer/component-marker.js +0 -46
  352. package/src/route-renderer/component-marker.ts +0 -117
  353. package/src/route-renderer/dependency-resolver.js +0 -428
  354. package/src/route-renderer/dependency-resolver.ts +0 -596
  355. package/src/route-renderer/html-post-processing.service.d.ts +0 -40
  356. package/src/route-renderer/html-post-processing.service.js +0 -86
  357. package/src/route-renderer/html-post-processing.service.ts +0 -103
  358. package/src/route-renderer/integration-renderer.d.ts +0 -339
  359. package/src/route-renderer/integration-renderer.js +0 -526
  360. package/src/route-renderer/integration-renderer.ts +0 -696
  361. package/src/route-renderer/marker-graph-resolver.d.ts +0 -76
  362. package/src/route-renderer/marker-graph-resolver.js +0 -93
  363. package/src/route-renderer/marker-graph-resolver.ts +0 -153
  364. package/src/route-renderer/page-module-loader.d.ts +0 -61
  365. package/src/route-renderer/page-module-loader.ts +0 -153
  366. package/src/route-renderer/render-execution.service.d.ts +0 -69
  367. package/src/route-renderer/render-execution.service.js +0 -91
  368. package/src/route-renderer/render-execution.service.ts +0 -158
  369. package/src/route-renderer/render-preparation.service.d.ts +0 -112
  370. package/src/route-renderer/render-preparation.service.js +0 -243
  371. package/src/route-renderer/render-preparation.service.ts +0 -358
  372. package/src/route-renderer/route-renderer.ts +0 -80
  373. package/src/router/fs-router-scanner.d.ts +0 -41
  374. package/src/router/fs-router-scanner.js +0 -155
  375. package/src/router/fs-router-scanner.ts +0 -217
  376. package/src/router/fs-router.d.ts +0 -26
  377. package/src/router/fs-router.js +0 -100
  378. package/src/router/fs-router.ts +0 -122
  379. package/src/services/asset-processing-service/asset-processing.service.d.ts +0 -41
  380. package/src/services/asset-processing-service/asset-processing.service.ts +0 -306
  381. package/src/services/asset-processing-service/asset.factory.ts +0 -105
  382. package/src/services/asset-processing-service/assets.types.ts +0 -112
  383. package/src/services/asset-processing-service/index.d.ts +0 -3
  384. package/src/services/asset-processing-service/index.js +0 -3
  385. package/src/services/asset-processing-service/index.ts +0 -3
  386. package/src/services/asset-processing-service/processor.interface.ts +0 -27
  387. package/src/services/asset-processing-service/processor.registry.ts +0 -18
  388. package/src/services/asset-processing-service/processors/base/base-processor.ts +0 -76
  389. package/src/services/asset-processing-service/processors/base/base-script-processor.d.ts +0 -16
  390. package/src/services/asset-processing-service/processors/base/base-script-processor.js +0 -80
  391. package/src/services/asset-processing-service/processors/base/base-script-processor.ts +0 -105
  392. package/src/services/asset-processing-service/processors/index.d.ts +0 -5
  393. package/src/services/asset-processing-service/processors/index.js +0 -5
  394. package/src/services/asset-processing-service/processors/index.ts +0 -5
  395. package/src/services/asset-processing-service/processors/script/content-script.processor.js +0 -57
  396. package/src/services/asset-processing-service/processors/script/content-script.processor.ts +0 -66
  397. package/src/services/asset-processing-service/processors/script/file-script.processor.ts +0 -88
  398. package/src/services/asset-processing-service/processors/script/node-module-script.processor.ts +0 -84
  399. package/src/services/asset-processing-service/processors/stylesheet/content-stylesheet.processor.js +0 -25
  400. package/src/services/asset-processing-service/processors/stylesheet/content-stylesheet.processor.ts +0 -27
  401. package/src/services/asset-processing-service/processors/stylesheet/file-stylesheet.processor.ts +0 -77
  402. package/src/services/cache/cache.types.ts +0 -126
  403. package/src/services/cache/index.ts +0 -18
  404. package/src/services/cache/memory-cache-store.ts +0 -130
  405. package/src/services/cache/page-cache-service.ts +0 -202
  406. package/src/services/html-transformer.service.d.ts +0 -50
  407. package/src/services/html-transformer.service.js +0 -163
  408. package/src/services/html-transformer.service.ts +0 -217
  409. package/src/services/page-module-import.service.d.ts +0 -37
  410. package/src/services/page-module-import.service.js +0 -88
  411. package/src/services/page-module-import.service.ts +0 -129
  412. package/src/services/page-request-cache-coordinator.service.ts +0 -128
  413. package/src/services/schema-validation-service.ts +0 -204
  414. package/src/services/validation/standard-schema.types.ts +0 -68
  415. package/src/static-site-generator/static-site-generator.ts +0 -359
  416. package/src/utils/css.d.ts +0 -1
  417. package/src/utils/css.js +0 -7
  418. package/src/utils/css.ts +0 -5
  419. package/src/utils/deep-merge.ts +0 -47
  420. package/src/utils/hash.ts +0 -5
  421. package/src/utils/html.ts +0 -1
  422. package/src/utils/invariant.ts +0 -15
  423. package/src/utils/locals-utils.ts +0 -37
  424. package/src/utils/parse-cli-args.ts +0 -83
  425. package/src/utils/path-utils.module.ts +0 -14
  426. package/src/utils/runtime.ts +0 -44
  427. package/src/utils/server-utils.module.ts +0 -67
  428. package/src/watchers/project-watcher.test-helpers.ts +0 -41
  429. package/src/watchers/project-watcher.ts +0 -344
  430. /package/src/adapters/{bun → shared}/define-api-handler.js +0 -0
  431. /package/src/{internal-types.js → plugins/runtime-capability.js} +0 -0
  432. /package/src/services/{asset-processing-service → assets/asset-processing-service}/assets.types.js +0 -0
  433. /package/src/services/{asset-processing-service → assets/asset-processing-service}/processor.interface.js +0 -0
  434. /package/src/services/{asset-processing-service → assets/asset-processing-service}/processor.registry.js +0 -0
  435. /package/src/{public-types.js → services/module-loading/app-module-loader.service.js} +0 -0
  436. /package/src/services/{schema-validation-service.js → validation/schema-validation-service.js} +0 -0
@@ -0,0 +1,43 @@
1
+ import path from "node:path";
2
+ import { fileSystem } from "@ecopages/file-system";
3
+ import { getAppBrowserBuildPlugins, setupAppRuntimePlugins } from "../../build/build-adapter.js";
4
+ import { installAppRuntimeBuildExecutor } from "../../build/runtime-build-executor.js";
5
+ import { RESOLVED_ASSETS_DIR } from "../../config/constants.js";
6
+ import { ProjectWatcher } from "../../watchers/project-watcher.js";
7
+ function installSharedRuntimeBuildExecutor(appConfig, options) {
8
+ return installAppRuntimeBuildExecutor(appConfig, options);
9
+ }
10
+ function prepareSharedRuntimePublicDir(appConfig) {
11
+ const srcPublicDir = path.join(appConfig.rootDir, appConfig.srcDir, appConfig.publicDir);
12
+ if (fileSystem.exists(srcPublicDir)) {
13
+ fileSystem.copyDir(srcPublicDir, path.join(appConfig.rootDir, appConfig.distDir));
14
+ }
15
+ fileSystem.ensureDir(path.join(appConfig.absolutePaths.distDir, RESOLVED_ASSETS_DIR));
16
+ }
17
+ async function initializeSharedRuntimePlugins(options) {
18
+ await setupAppRuntimePlugins(options);
19
+ }
20
+ async function startSharedProjectWatching(options) {
21
+ const watcher = new ProjectWatcher({
22
+ config: options.appConfig,
23
+ refreshRouterRoutesCallback: options.refreshRouterRoutesCallback,
24
+ hmrManager: options.hmrManager,
25
+ bridge: options.bridge
26
+ });
27
+ await watcher.createWatcherSubscription();
28
+ }
29
+ function bindSharedRuntimeHmrManager(appConfig, hmrManager) {
30
+ const browserBuildPlugins = getAppBrowserBuildPlugins(appConfig);
31
+ hmrManager.setPlugins(browserBuildPlugins);
32
+ for (const integration of appConfig.integrations) {
33
+ integration.setHmrManager(hmrManager);
34
+ }
35
+ return browserBuildPlugins;
36
+ }
37
+ export {
38
+ bindSharedRuntimeHmrManager,
39
+ initializeSharedRuntimePlugins,
40
+ installSharedRuntimeBuildExecutor,
41
+ prepareSharedRuntimePublicDir,
42
+ startSharedProjectWatching
43
+ };
@@ -1,30 +1,47 @@
1
1
  import { AbstractServerAdapter } from '../abstract/server-adapter.js';
2
2
  import type { ServerAdapterOptions, ServerAdapterResult } 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 { SchemaValidationService } from '../../services/schema-validation-service.js';
4
+ import { RouteRegistry } from '../../router/server/route-registry.js';
5
+ import { SchemaValidationService } from '../../services/validation/schema-validation-service.js';
6
6
  import { StaticSiteGenerator } from '../../static-site-generator/static-site-generator.js';
7
7
  import { ServerStaticBuilder } from './server-static-builder.js';
8
8
  import { FileSystemResponseMatcher } from './fs-server-response-matcher.js';
9
9
  import { ServerRouteHandler } from './server-route-handler.js';
10
- import type { ApiHandler, CacheInvalidator, ErrorHandler, RenderContext, StaticRoute } from '../../public-types.js';
10
+ import type { ApiHandler, CacheInvalidator, ErrorHandler, RenderContext, StaticRoute } from '../../types/public-types.js';
11
+ type SharedRequestContext = {
12
+ apiHandlers: ApiHandler[];
13
+ errorHandler?: ErrorHandler;
14
+ serverInstance?: any;
15
+ hmrManager?: any;
16
+ };
11
17
  export declare abstract class SharedServerAdapter<TOptions extends ServerAdapterOptions, TResult extends ServerAdapterResult> extends AbstractServerAdapter<TOptions, TResult> {
12
- protected router: FSRouter;
18
+ protected router: RouteRegistry;
13
19
  protected fileSystemResponseMatcher: FileSystemResponseMatcher;
14
20
  protected routeRendererFactory: RouteRendererFactory;
15
21
  protected routeHandler: ServerRouteHandler;
16
22
  protected staticSiteGenerator: StaticSiteGenerator;
17
23
  protected staticBuilder: ServerStaticBuilder;
18
24
  protected readonly schemaValidator: SchemaValidationService;
25
+ protected initializeSharedRouteHandling(options: {
26
+ staticRoutes: StaticRoute[];
27
+ hmrManager?: any;
28
+ }): Promise<void>;
29
+ protected createSharedWatchRefreshCallback(options: {
30
+ staticRoutes: StaticRoute[];
31
+ hmrManager?: any;
32
+ onRoutesReady?: () => Promise<void> | void;
33
+ onError?: (error: Error) => Promise<void> | void;
34
+ }): () => Promise<void>;
19
35
  /**
20
- * Scans the filesystem and dynamically constructs the universal router map.
36
+ * Scans the filesystem and dynamically constructs the Route Registry.
21
37
  *
22
38
  * This process runs identically across both Bun and Node wrappers. It analyzes the configured pages
23
39
  * directory, building a map of all available UI routes and API endpoints.
24
- * The resulting `FSRouter` instance becomes the central nervous system for mapping WinterCG incoming
40
+ * The resulting `RouteRegistry` instance becomes the central nervous system for mapping WinterCG incoming
25
41
  * Web Requests (`Request`) to their corresponding internal execution paths.
26
42
  */
27
43
  protected initSharedRouter(): Promise<void>;
44
+ private createRouteRegistryPageModuleAdapter;
28
45
  /**
29
46
  * Sets up the unified rendering pipeline and response matching chain.
30
47
  *
@@ -40,6 +57,8 @@ export declare abstract class SharedServerAdapter<TOptions extends ServerAdapter
40
57
  * @param hmrManager - The runtime-specific Hot Module Replacement orchestrator (if watching).
41
58
  */
42
59
  protected configureSharedResponseHandlers(staticRoutes: StaticRoute[], hmrManager?: any): void;
60
+ private createSharedResponseHandlerDependencies;
61
+ private createSharedPageCacheService;
43
62
  protected getCacheService(): CacheInvalidator | null;
44
63
  protected getRenderContext(): RenderContext;
45
64
  /**
@@ -60,6 +79,10 @@ export declare abstract class SharedServerAdapter<TOptions extends ServerAdapter
60
79
  * @returns The resulting Web standard `Response` constructed by the user's handler.
61
80
  */
62
81
  protected executeApiHandler(request: Request, params: Record<string, string | string[]>, routeConfig: ApiHandler, serverInstance: any, errorHandler?: ErrorHandler): Promise<Response>;
82
+ private createApiHandlerContext;
83
+ private normalizeApiParams;
84
+ private applyApiRequestSchema;
85
+ private runApiMiddlewareChain;
63
86
  private normalizePath;
64
87
  private matchApiPath;
65
88
  private getApiPathScore;
@@ -67,6 +90,8 @@ export declare abstract class SharedServerAdapter<TOptions extends ServerAdapter
67
90
  routeConfig: ApiHandler;
68
91
  params: Record<string, string | string[]>;
69
92
  } | null;
93
+ private tryHandleSharedHmrRequest;
94
+ private tryHandleSharedApiRequest;
70
95
  /**
71
96
  * Universally processes an incoming WinterCG Web standard Request.
72
97
  *
@@ -78,10 +103,6 @@ export declare abstract class SharedServerAdapter<TOptions extends ServerAdapter
78
103
  * Both Bun and Node bindings fall back to this exact function once they have mapped their
79
104
  * native HTTP objects into Web Standard Requests.
80
105
  */
81
- handleSharedRequest(request: Request, context: {
82
- apiHandlers: ApiHandler[];
83
- errorHandler?: ErrorHandler;
84
- serverInstance?: any;
85
- hmrManager?: any;
86
- }): Promise<Response>;
106
+ handleSharedRequest(request: Request, context: SharedRequestContext): Promise<Response>;
87
107
  }
108
+ export {};
@@ -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,62 @@ 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
+ return createRenderContext({
161
+ integrations: this.appConfig.integrations,
162
+ rendererModules: this.appConfig.runtime?.rendererModuleContext
163
+ });
111
164
  }
112
165
  /**
113
166
  * Executes an Application Programming Interface (API) handler in an environment-agnostic manner.
@@ -129,87 +182,18 @@ class SharedServerAdapter extends AbstractServerAdapter {
129
182
  async executeApiHandler(request, params, routeConfig, serverInstance, errorHandler) {
130
183
  let context;
131
184
  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);
185
+ context = this.createApiHandlerContext(request, params, serverInstance);
186
+ const schemaResponse = await this.applyApiRequestSchema(context, routeConfig.schema);
187
+ if (schemaResponse) {
188
+ return schemaResponse;
182
189
  }
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();
190
+ return await this.runApiMiddlewareChain(context, routeConfig);
192
191
  } catch (error) {
193
192
  if (error instanceof Response) return error;
194
193
  if (errorHandler) {
195
194
  try {
196
195
  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
- };
196
+ context = this.createApiHandlerContext(request, params, serverInstance);
213
197
  }
214
198
  return await errorHandler(error, context);
215
199
  } catch (handlerError) {
@@ -221,6 +205,76 @@ class SharedServerAdapter extends AbstractServerAdapter {
221
205
  return new Response("Internal Server Error", { status: 500 });
222
206
  }
223
207
  }
208
+ createApiHandlerContext(request, params, serverInstance) {
209
+ const locals = {};
210
+ const normalizedParams = this.normalizeApiParams(params);
211
+ return {
212
+ request,
213
+ params: normalizedParams,
214
+ response: new ApiResponseBuilder(),
215
+ server: serverInstance,
216
+ locals,
217
+ require: createRequire(() => locals),
218
+ services: {
219
+ cache: this.getCacheService()
220
+ },
221
+ ...this.getRenderContext()
222
+ };
223
+ }
224
+ normalizeApiParams(params) {
225
+ return Object.fromEntries(
226
+ Object.entries(params).map(([key, value]) => [key, Array.isArray(value) ? value.join("/") : value])
227
+ );
228
+ }
229
+ async applyApiRequestSchema(context, schema) {
230
+ if (!schema) {
231
+ return void 0;
232
+ }
233
+ const url = new URL(context.request.url);
234
+ const queryParams = Object.fromEntries(url.searchParams);
235
+ const headers = Object.fromEntries(context.request.headers);
236
+ let body;
237
+ if (schema.body) {
238
+ try {
239
+ const contentType = context.request.headers.get("Content-Type") || "";
240
+ if (contentType.includes("application/json")) body = await context.request.clone().json();
241
+ else if (contentType.includes("text/plain")) body = await context.request.clone().text();
242
+ } catch {
243
+ return context.response.status(400).json({ error: "Invalid request body" });
244
+ }
245
+ }
246
+ const validationResult = await this.schemaValidator.validateRequest(
247
+ { body, query: queryParams, headers, params: context.params },
248
+ schema
249
+ );
250
+ if (!validationResult.success) {
251
+ return context.response.status(400).json({
252
+ error: "Validation failed",
253
+ issues: validationResult.errors
254
+ });
255
+ }
256
+ const validated = validationResult.data;
257
+ if (validated.body !== void 0) context.body = validated.body;
258
+ if (validated.query !== void 0) context.query = validated.query;
259
+ if (validated.headers !== void 0) context.headers = validated.headers;
260
+ if (validated.params !== void 0) context.params = validated.params;
261
+ return void 0;
262
+ }
263
+ async runApiMiddlewareChain(context, routeConfig) {
264
+ const middleware = routeConfig.middleware || [];
265
+ if (middleware.length === 0) {
266
+ return await routeConfig.handler(context);
267
+ }
268
+ let index = 0;
269
+ const executeNext = async () => {
270
+ if (index < middleware.length) {
271
+ const currentMiddleware = middleware[index++];
272
+ return await currentMiddleware(context, executeNext);
273
+ }
274
+ return await routeConfig.handler(context);
275
+ };
276
+ return await executeNext();
277
+ }
224
278
  normalizePath(pathname) {
225
279
  if (pathname.length > 1 && pathname.endsWith("/")) {
226
280
  return pathname.slice(0, -1);
@@ -313,6 +367,40 @@ class SharedServerAdapter extends AbstractServerAdapter {
313
367
  }
314
368
  return null;
315
369
  }
370
+ tryHandleSharedHmrRequest(request, context) {
371
+ const url = new URL(request.url);
372
+ if (url.pathname === "/_hmr_runtime.js" && context.hmrManager) {
373
+ const runtimePath = context.hmrManager.getRuntimePath();
374
+ if (fileSystem.exists(runtimePath)) {
375
+ return new Response(fileSystem.readFileAsBuffer(runtimePath), {
376
+ headers: { "Content-Type": "application/javascript" }
377
+ });
378
+ }
379
+ }
380
+ if (url.pathname.startsWith("/assets/_hmr/") && context.hmrManager) {
381
+ const relativePath = url.pathname.slice("/assets/_hmr/".length);
382
+ const assetPath = path.join(context.hmrManager.getDistDir(), relativePath);
383
+ if (fileSystem.exists(assetPath)) {
384
+ return new Response(fileSystem.readFileAsBuffer(assetPath), {
385
+ headers: { "Content-Type": "application/javascript" }
386
+ });
387
+ }
388
+ }
389
+ return null;
390
+ }
391
+ async tryHandleSharedApiRequest(request, context) {
392
+ const apiMatch = this.matchApiHandler(request, context.apiHandlers);
393
+ if (!apiMatch) {
394
+ return null;
395
+ }
396
+ return await this.executeApiHandler(
397
+ request,
398
+ apiMatch.params,
399
+ apiMatch.routeConfig,
400
+ context.serverInstance,
401
+ context.errorHandler
402
+ );
403
+ }
316
404
  /**
317
405
  * Universally processes an incoming WinterCG Web standard Request.
318
406
  *
@@ -325,25 +413,13 @@ class SharedServerAdapter extends AbstractServerAdapter {
325
413
  * native HTTP objects into Web Standard Requests.
326
414
  */
327
415
  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
- }
416
+ const hmrResponse = this.tryHandleSharedHmrRequest(request, context);
417
+ if (hmrResponse) {
418
+ return hmrResponse;
337
419
  }
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
- );
420
+ const apiResponse = await this.tryHandleSharedApiRequest(request, context);
421
+ if (apiResponse) {
422
+ return apiResponse;
347
423
  }
348
424
  return this.routeHandler.handleResponse(request);
349
425
  }
@@ -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
  }