@ecopages/core 0.2.0-alpha.2 → 0.2.0-alpha.20

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 (391) hide show
  1. package/CHANGELOG.md +26 -64
  2. package/README.md +212 -14
  3. package/package.json +116 -66
  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 +4 -12
  11. package/src/adapters/bun/create-app.js +4 -5
  12. package/src/adapters/bun/hmr-manager.d.ts +80 -21
  13. package/src/adapters/bun/hmr-manager.js +168 -62
  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 +40 -34
  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 +89 -18
  28. package/src/adapters/node/node-hmr-manager.js +185 -95
  29. package/src/adapters/node/server-adapter.d.ts +6 -35
  30. package/src/adapters/node/server-adapter.js +44 -105
  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-route-matcher.d.ts +2 -2
  36. package/src/adapters/shared/explicit-static-route-matcher.js +4 -1
  37. package/src/adapters/shared/file-route-middleware-pipeline.d.ts +1 -1
  38. package/src/adapters/shared/file-route-middleware-pipeline.js +1 -0
  39. package/src/adapters/shared/fs-server-response-factory.d.ts +2 -2
  40. package/src/adapters/shared/fs-server-response-factory.js +1 -1
  41. package/src/adapters/shared/fs-server-response-matcher.d.ts +8 -12
  42. package/src/adapters/shared/fs-server-response-matcher.js +10 -18
  43. package/src/adapters/shared/hmr-entrypoint-registrar.d.ts +55 -0
  44. package/src/adapters/shared/hmr-entrypoint-registrar.js +87 -0
  45. package/src/adapters/shared/hmr-html-response.d.ts +22 -0
  46. package/src/adapters/shared/hmr-html-response.js +32 -0
  47. package/src/adapters/shared/render-context.d.ts +2 -1
  48. package/src/adapters/shared/render-context.js +6 -3
  49. package/src/adapters/shared/runtime-bootstrap.d.ts +38 -0
  50. package/src/adapters/shared/runtime-bootstrap.js +43 -0
  51. package/src/adapters/shared/server-adapter.d.ts +13 -3
  52. package/src/adapters/shared/server-adapter.js +42 -5
  53. package/src/adapters/shared/server-route-handler.d.ts +4 -4
  54. package/src/adapters/shared/server-route-handler.js +6 -15
  55. package/src/adapters/shared/server-static-builder.d.ts +38 -6
  56. package/src/adapters/shared/server-static-builder.js +64 -10
  57. package/src/build/README.md +107 -0
  58. package/src/build/build-adapter.d.ts +168 -3
  59. package/src/build/build-adapter.js +604 -16
  60. package/src/build/build-manifest.d.ts +27 -0
  61. package/src/build/build-manifest.js +30 -0
  62. package/src/build/dev-build-coordinator.d.ts +72 -0
  63. package/src/build/dev-build-coordinator.js +154 -0
  64. package/src/build/esbuild-build-adapter.d.ts +15 -6
  65. package/src/build/esbuild-build-adapter.js +189 -74
  66. package/src/build/runtime-build-executor.d.ts +14 -0
  67. package/src/build/runtime-build-executor.js +22 -0
  68. package/src/build/runtime-specifier-alias-plugin.d.ts +15 -0
  69. package/src/build/runtime-specifier-alias-plugin.js +35 -0
  70. package/src/build/runtime-specifier-aliases.d.ts +5 -0
  71. package/src/build/runtime-specifier-aliases.js +95 -0
  72. package/src/config/README.md +36 -0
  73. package/src/config/config-builder.d.ts +52 -27
  74. package/src/config/config-builder.js +260 -49
  75. package/src/{constants.d.ts → config/constants.d.ts} +13 -0
  76. package/src/{constants.js → config/constants.js} +4 -0
  77. package/src/declarations.d.ts +19 -14
  78. package/src/dev/sc-server.d.ts +1 -1
  79. package/src/dev/sc-server.js +1 -1
  80. package/src/eco/README.md +70 -16
  81. package/src/eco/eco.browser.d.ts +2 -0
  82. package/src/eco/eco.browser.js +83 -0
  83. package/src/eco/eco.js +32 -57
  84. package/src/eco/eco.types.d.ts +12 -4
  85. package/src/eco/eco.utils.d.ts +1 -40
  86. package/src/eco/eco.utils.js +5 -35
  87. package/src/eco/global-injector-map.d.ts +1 -1
  88. package/src/eco/lazy-injector-map.d.ts +1 -1
  89. package/src/hmr/README.md +26 -0
  90. package/src/hmr/client/hmr-runtime.d.ts +1 -6
  91. package/src/hmr/client/hmr-runtime.js +30 -7
  92. package/src/hmr/hmr-strategy.d.ts +16 -13
  93. package/src/hmr/hmr-strategy.js +22 -7
  94. package/src/hmr/hmr.postcss.test.e2e.d.ts +1 -0
  95. package/src/hmr/hmr.postcss.test.e2e.js +31 -0
  96. package/src/hmr/hmr.test.e2e.js +26 -33
  97. package/src/hmr/strategies/default-hmr-strategy.d.ts +2 -2
  98. package/src/hmr/strategies/default-hmr-strategy.js +1 -1
  99. package/src/hmr/strategies/js-hmr-strategy.d.ts +46 -43
  100. package/src/hmr/strategies/js-hmr-strategy.js +72 -73
  101. package/src/index.browser.d.ts +2 -2
  102. package/src/index.browser.js +1 -1
  103. package/src/index.d.ts +4 -3
  104. package/src/index.js +16 -5
  105. package/src/integrations/ghtml/ghtml-renderer.d.ts +7 -2
  106. package/src/integrations/ghtml/ghtml-renderer.js +33 -30
  107. package/src/integrations/ghtml/ghtml.constants.d.ts +1 -0
  108. package/src/integrations/ghtml/ghtml.constants.js +4 -0
  109. package/src/integrations/ghtml/ghtml.plugin.d.ts +2 -6
  110. package/src/integrations/ghtml/ghtml.plugin.js +3 -4
  111. package/src/plugins/README.md +35 -0
  112. package/src/plugins/alias-resolver-plugin.js +17 -3
  113. package/src/plugins/eco-component-meta-plugin.d.ts +14 -1
  114. package/src/plugins/eco-component-meta-plugin.js +27 -21
  115. package/src/plugins/foreign-jsx-override-plugin.d.ts +31 -0
  116. package/src/plugins/foreign-jsx-override-plugin.js +35 -0
  117. package/src/plugins/integration-plugin.d.ts +145 -28
  118. package/src/plugins/integration-plugin.js +109 -13
  119. package/src/plugins/processor.d.ts +15 -2
  120. package/src/plugins/processor.js +16 -2
  121. package/src/plugins/runtime-capability.d.ts +9 -0
  122. package/src/plugins/source-transform.d.ts +46 -0
  123. package/src/plugins/source-transform.js +71 -0
  124. package/src/route-renderer/GRAPH.md +64 -98
  125. package/src/route-renderer/README.md +67 -46
  126. package/src/route-renderer/orchestration/boundary-planning.service.d.ts +25 -0
  127. package/src/route-renderer/orchestration/boundary-planning.service.js +97 -0
  128. package/src/route-renderer/orchestration/component-render-context.d.ts +83 -0
  129. package/src/route-renderer/orchestration/component-render-context.js +147 -0
  130. package/src/route-renderer/orchestration/integration-renderer.d.ts +554 -0
  131. package/src/route-renderer/orchestration/integration-renderer.js +957 -0
  132. package/src/route-renderer/orchestration/queued-boundary-runtime.service.d.ts +89 -0
  133. package/src/route-renderer/orchestration/queued-boundary-runtime.service.js +155 -0
  134. package/src/route-renderer/orchestration/render-execution.service.d.ts +43 -0
  135. package/src/route-renderer/orchestration/render-execution.service.js +106 -0
  136. package/src/{eco/eco.utils.ts → route-renderer/orchestration/render-output.utils.d.ts} +10 -53
  137. package/src/route-renderer/orchestration/render-output.utils.js +65 -0
  138. package/src/route-renderer/{render-preparation.service.d.ts → orchestration/render-preparation.service.d.ts} +18 -10
  139. package/src/route-renderer/{render-preparation.service.js → orchestration/render-preparation.service.js} +115 -17
  140. package/src/route-renderer/orchestration/route-shell-composer.service.d.ts +50 -0
  141. package/src/route-renderer/orchestration/route-shell-composer.service.js +81 -0
  142. package/src/route-renderer/orchestration/template-serialization.d.ts +38 -0
  143. package/src/route-renderer/orchestration/template-serialization.js +45 -0
  144. package/src/route-renderer/{dependency-resolver.d.ts → page-loading/dependency-resolver.d.ts} +15 -4
  145. package/src/route-renderer/{dependency-resolver.js → page-loading/dependency-resolver.js} +28 -12
  146. package/src/route-renderer/page-loading/page-module-loader.d.ts +90 -0
  147. package/src/route-renderer/{page-module-loader.js → page-loading/page-module-loader.js} +39 -14
  148. package/src/route-renderer/route-renderer.d.ts +45 -4
  149. package/src/route-renderer/route-renderer.js +38 -3
  150. package/src/router/README.md +97 -0
  151. package/src/router/client/link-intent.d.ts +53 -0
  152. package/src/router/client/link-intent.js +34 -0
  153. package/src/router/client/link-intent.test.browser.d.ts +1 -0
  154. package/src/router/client/link-intent.test.browser.js +43 -0
  155. package/src/router/client/navigation-coordinator.d.ts +149 -0
  156. package/src/router/client/navigation-coordinator.js +215 -0
  157. package/src/router/{fs-router-scanner.d.ts → server/fs-router-scanner.d.ts} +3 -3
  158. package/src/router/{fs-router-scanner.js → server/fs-router-scanner.js} +14 -8
  159. package/src/router/{fs-router.d.ts → server/fs-router.d.ts} +1 -1
  160. package/src/router/{fs-router.js → server/fs-router.js} +1 -1
  161. package/src/services/README.md +29 -0
  162. package/src/services/assets/asset-processing-service/asset-processing.service.d.ts +120 -0
  163. package/src/services/{asset-processing-service → assets/asset-processing-service}/asset-processing.service.js +91 -10
  164. package/src/services/{asset-processing-service → assets/asset-processing-service}/asset.factory.d.ts +1 -1
  165. package/src/services/{asset-processing-service → assets/asset-processing-service}/asset.factory.js +2 -2
  166. package/src/services/{asset-processing-service → assets/asset-processing-service}/assets.types.d.ts +2 -1
  167. package/src/services/assets/asset-processing-service/browser-runtime-asset.factory.d.ts +55 -0
  168. package/src/services/assets/asset-processing-service/browser-runtime-asset.factory.js +48 -0
  169. package/src/services/assets/asset-processing-service/browser-runtime-entry.factory.d.ts +20 -0
  170. package/src/services/assets/asset-processing-service/browser-runtime-entry.factory.js +41 -0
  171. package/src/services/assets/asset-processing-service/index.d.ts +5 -0
  172. package/src/services/assets/asset-processing-service/index.js +5 -0
  173. package/src/services/{asset-processing-service → assets/asset-processing-service}/processor.interface.d.ts +2 -2
  174. package/src/services/{asset-processing-service → assets/asset-processing-service}/processor.registry.d.ts +2 -2
  175. package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/base/base-processor.d.ts +1 -1
  176. package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/base/base-processor.js +9 -4
  177. package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/base/base-script-processor.d.ts +5 -4
  178. package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/base/base-script-processor.js +15 -23
  179. package/src/services/assets/asset-processing-service/processors/index.d.ts +5 -0
  180. package/src/services/assets/asset-processing-service/processors/index.js +5 -0
  181. package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/script/content-script.processor.d.ts +2 -2
  182. package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/script/content-script.processor.js +1 -1
  183. package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/script/file-script.processor.d.ts +4 -3
  184. package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/script/file-script.processor.js +16 -4
  185. package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/script/node-module-script.processor.d.ts +3 -3
  186. package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/script/node-module-script.processor.js +6 -5
  187. package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/stylesheet/content-stylesheet.processor.d.ts +2 -2
  188. package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/stylesheet/content-stylesheet.processor.js +1 -1
  189. package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/stylesheet/file-stylesheet.processor.d.ts +2 -2
  190. package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/stylesheet/file-stylesheet.processor.js +5 -2
  191. package/src/services/assets/browser-bundle.service.d.ts +32 -0
  192. package/src/services/assets/browser-bundle.service.js +33 -0
  193. package/src/services/{page-request-cache-coordinator.service.d.ts → cache/page-request-cache-coordinator.service.d.ts} +2 -2
  194. package/src/services/{page-request-cache-coordinator.service.js → cache/page-request-cache-coordinator.service.js} +3 -1
  195. package/src/services/html/html-rewriter-provider.service.d.ts +37 -0
  196. package/src/services/html/html-rewriter-provider.service.js +68 -0
  197. package/src/services/html/html-transformer.service.d.ts +77 -0
  198. package/src/services/html/html-transformer.service.js +215 -0
  199. package/src/services/invalidation/development-invalidation.service.d.ts +74 -0
  200. package/src/services/invalidation/development-invalidation.service.js +190 -0
  201. package/src/services/module-loading/app-module-loader.service.d.ts +28 -0
  202. package/src/services/module-loading/app-module-loader.service.js +35 -0
  203. package/src/services/module-loading/app-server-module-transpiler.service.d.ts +24 -0
  204. package/src/services/module-loading/app-server-module-transpiler.service.js +109 -0
  205. package/src/services/module-loading/host-module-loader-registry.d.ts +4 -0
  206. package/src/services/module-loading/host-module-loader-registry.js +15 -0
  207. package/src/services/module-loading/module-loading-types.d.ts +2 -0
  208. package/src/services/module-loading/node-bootstrap-plugin.d.ts +42 -0
  209. package/src/services/module-loading/node-bootstrap-plugin.js +204 -0
  210. package/src/services/module-loading/page-module-import.service.d.ts +76 -0
  211. package/src/services/module-loading/page-module-import.service.js +173 -0
  212. package/src/services/module-loading/server-module-transpiler.service.d.ts +72 -0
  213. package/src/services/module-loading/server-module-transpiler.service.js +64 -0
  214. package/src/services/runtime-state/dev-graph.service.d.ts +118 -0
  215. package/src/services/runtime-state/dev-graph.service.js +162 -0
  216. package/src/services/runtime-state/entrypoint-dependency-graph.service.d.ts +41 -0
  217. package/src/services/runtime-state/entrypoint-dependency-graph.service.js +85 -0
  218. package/src/services/runtime-state/runtime-specifier-registry.service.d.ts +69 -0
  219. package/src/services/runtime-state/runtime-specifier-registry.service.js +37 -0
  220. package/src/services/runtime-state/server-invalidation-state.service.d.ts +26 -0
  221. package/src/services/runtime-state/server-invalidation-state.service.js +35 -0
  222. package/src/services/{schema-validation-service.d.ts → validation/schema-validation-service.d.ts} +1 -1
  223. package/src/static-site-generator/README.md +26 -0
  224. package/src/static-site-generator/static-site-generator.d.ts +50 -3
  225. package/src/static-site-generator/static-site-generator.js +71 -5
  226. package/src/{internal-types.d.ts → types/internal-types.d.ts} +53 -22
  227. package/src/types/internal-types.js +0 -0
  228. package/src/{public-types.d.ts → types/public-types.d.ts} +146 -21
  229. package/src/types/public-types.js +0 -0
  230. package/src/utils/html-escaping.d.ts +7 -0
  231. package/src/utils/html-escaping.js +6 -0
  232. package/src/utils/locals-utils.d.ts +1 -1
  233. package/src/utils/parse-cli-args.d.ts +4 -1
  234. package/src/utils/parse-cli-args.js +16 -1
  235. package/src/utils/resolve-work-dir.d.ts +11 -0
  236. package/src/utils/resolve-work-dir.js +31 -0
  237. package/src/watchers/project-watcher.d.ts +40 -24
  238. package/src/watchers/project-watcher.js +129 -92
  239. package/src/watchers/project-watcher.test-helpers.d.ts +2 -2
  240. package/src/watchers/project-watcher.test-helpers.js +1 -0
  241. package/src/adapters/abstract/application-adapter.ts +0 -337
  242. package/src/adapters/abstract/router-adapter.ts +0 -30
  243. package/src/adapters/abstract/server-adapter.ts +0 -79
  244. package/src/adapters/bun/client-bridge.ts +0 -62
  245. package/src/adapters/bun/create-app.ts +0 -189
  246. package/src/adapters/bun/define-api-handler.d.ts +0 -61
  247. package/src/adapters/bun/define-api-handler.ts +0 -114
  248. package/src/adapters/bun/hmr-manager.ts +0 -281
  249. package/src/adapters/bun/index.ts +0 -3
  250. package/src/adapters/bun/server-adapter.ts +0 -492
  251. package/src/adapters/bun/server-lifecycle.ts +0 -154
  252. package/src/adapters/index.ts +0 -6
  253. package/src/adapters/node/create-app.ts +0 -179
  254. package/src/adapters/node/index.d.ts +0 -4
  255. package/src/adapters/node/index.js +0 -8
  256. package/src/adapters/node/index.ts +0 -9
  257. package/src/adapters/node/node-client-bridge.ts +0 -79
  258. package/src/adapters/node/node-hmr-manager.ts +0 -271
  259. package/src/adapters/node/server-adapter.ts +0 -561
  260. package/src/adapters/node/static-content-server.ts +0 -203
  261. package/src/adapters/shared/api-response.ts +0 -104
  262. package/src/adapters/shared/application-adapter.ts +0 -199
  263. package/src/adapters/shared/explicit-static-route-matcher.ts +0 -134
  264. package/src/adapters/shared/file-route-middleware-pipeline.ts +0 -123
  265. package/src/adapters/shared/fs-server-response-factory.ts +0 -118
  266. package/src/adapters/shared/fs-server-response-matcher.ts +0 -198
  267. package/src/adapters/shared/render-context.ts +0 -105
  268. package/src/adapters/shared/server-adapter.ts +0 -442
  269. package/src/adapters/shared/server-route-handler.ts +0 -166
  270. package/src/adapters/shared/server-static-builder.ts +0 -82
  271. package/src/build/build-adapter.ts +0 -132
  272. package/src/build/build-types.ts +0 -83
  273. package/src/build/esbuild-build-adapter.ts +0 -510
  274. package/src/config/config-builder.ts +0 -474
  275. package/src/constants.ts +0 -39
  276. package/src/create-app.ts +0 -87
  277. package/src/define-api-handler.js +0 -15
  278. package/src/define-api-handler.ts +0 -66
  279. package/src/dev/sc-server.ts +0 -143
  280. package/src/eco/component-render-context.d.ts +0 -105
  281. package/src/eco/component-render-context.js +0 -77
  282. package/src/eco/component-render-context.ts +0 -202
  283. package/src/eco/eco.ts +0 -221
  284. package/src/eco/eco.types.ts +0 -202
  285. package/src/eco/global-injector-map.ts +0 -112
  286. package/src/eco/lazy-injector-map.ts +0 -120
  287. package/src/eco/module-dependencies.ts +0 -75
  288. package/src/errors/http-error.ts +0 -72
  289. package/src/errors/index.ts +0 -2
  290. package/src/errors/locals-access-error.ts +0 -7
  291. package/src/global/app-logger.ts +0 -4
  292. 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
  293. package/src/hmr/client/__screenshots__/hmr-runtime.test.browser.ts/HMR-Runtime-HMR-Server-Integration-should-load-fixture-app-page-1.png +0 -0
  294. package/src/hmr/client/__screenshots__/hmr-runtime.test.browser.ts/HMR-Runtime-WebSocket-Connection-should-connect-to-correct-HMR-endpoint-1.png +0 -0
  295. package/src/hmr/client/hmr-runtime.ts +0 -121
  296. package/src/hmr/hmr-strategy.ts +0 -172
  297. package/src/hmr/hmr.test.e2e.ts +0 -75
  298. package/src/hmr/strategies/default-hmr-strategy.ts +0 -60
  299. package/src/hmr/strategies/js-hmr-strategy.ts +0 -308
  300. package/src/index.browser.ts +0 -3
  301. package/src/index.ts +0 -5
  302. package/src/integrations/ghtml/ghtml-renderer.ts +0 -93
  303. package/src/integrations/ghtml/ghtml.plugin.ts +0 -32
  304. package/src/internal-types.ts +0 -212
  305. package/src/plugins/alias-resolver-plugin.ts +0 -45
  306. package/src/plugins/eco-component-meta-plugin.ts +0 -474
  307. package/src/plugins/integration-plugin.ts +0 -184
  308. package/src/plugins/processor.ts +0 -220
  309. package/src/public-types.ts +0 -1255
  310. package/src/route-renderer/component-graph-executor.d.ts +0 -32
  311. package/src/route-renderer/component-graph-executor.js +0 -31
  312. package/src/route-renderer/component-graph-executor.ts +0 -84
  313. package/src/route-renderer/component-graph.d.ts +0 -42
  314. package/src/route-renderer/component-graph.js +0 -72
  315. package/src/route-renderer/component-graph.ts +0 -159
  316. package/src/route-renderer/component-marker.d.ts +0 -52
  317. package/src/route-renderer/component-marker.js +0 -46
  318. package/src/route-renderer/component-marker.ts +0 -117
  319. package/src/route-renderer/dependency-resolver.ts +0 -596
  320. package/src/route-renderer/html-post-processing.service.d.ts +0 -40
  321. package/src/route-renderer/html-post-processing.service.js +0 -86
  322. package/src/route-renderer/html-post-processing.service.ts +0 -103
  323. package/src/route-renderer/integration-renderer.d.ts +0 -339
  324. package/src/route-renderer/integration-renderer.js +0 -526
  325. package/src/route-renderer/integration-renderer.ts +0 -696
  326. package/src/route-renderer/marker-graph-resolver.d.ts +0 -76
  327. package/src/route-renderer/marker-graph-resolver.js +0 -93
  328. package/src/route-renderer/marker-graph-resolver.ts +0 -153
  329. package/src/route-renderer/page-module-loader.d.ts +0 -61
  330. package/src/route-renderer/page-module-loader.ts +0 -153
  331. package/src/route-renderer/render-execution.service.d.ts +0 -69
  332. package/src/route-renderer/render-execution.service.js +0 -91
  333. package/src/route-renderer/render-execution.service.ts +0 -158
  334. package/src/route-renderer/render-preparation.service.ts +0 -358
  335. package/src/route-renderer/route-renderer.ts +0 -80
  336. package/src/router/fs-router-scanner.ts +0 -217
  337. package/src/router/fs-router.ts +0 -122
  338. package/src/services/asset-processing-service/asset-processing.service.d.ts +0 -41
  339. package/src/services/asset-processing-service/asset-processing.service.ts +0 -306
  340. package/src/services/asset-processing-service/asset.factory.ts +0 -105
  341. package/src/services/asset-processing-service/assets.types.ts +0 -112
  342. package/src/services/asset-processing-service/index.d.ts +0 -3
  343. package/src/services/asset-processing-service/index.js +0 -3
  344. package/src/services/asset-processing-service/index.ts +0 -3
  345. package/src/services/asset-processing-service/processor.interface.ts +0 -27
  346. package/src/services/asset-processing-service/processor.registry.ts +0 -18
  347. package/src/services/asset-processing-service/processors/base/base-processor.ts +0 -76
  348. package/src/services/asset-processing-service/processors/base/base-script-processor.ts +0 -105
  349. package/src/services/asset-processing-service/processors/index.d.ts +0 -5
  350. package/src/services/asset-processing-service/processors/index.js +0 -5
  351. package/src/services/asset-processing-service/processors/index.ts +0 -5
  352. package/src/services/asset-processing-service/processors/script/content-script.processor.ts +0 -66
  353. package/src/services/asset-processing-service/processors/script/file-script.processor.ts +0 -88
  354. package/src/services/asset-processing-service/processors/script/node-module-script.processor.ts +0 -84
  355. package/src/services/asset-processing-service/processors/stylesheet/content-stylesheet.processor.ts +0 -27
  356. package/src/services/asset-processing-service/processors/stylesheet/file-stylesheet.processor.ts +0 -77
  357. package/src/services/cache/cache.types.ts +0 -126
  358. package/src/services/cache/index.ts +0 -18
  359. package/src/services/cache/memory-cache-store.ts +0 -130
  360. package/src/services/cache/page-cache-service.ts +0 -202
  361. package/src/services/html-transformer.service.d.ts +0 -50
  362. package/src/services/html-transformer.service.js +0 -163
  363. package/src/services/html-transformer.service.ts +0 -217
  364. package/src/services/page-module-import.service.d.ts +0 -37
  365. package/src/services/page-module-import.service.js +0 -88
  366. package/src/services/page-module-import.service.ts +0 -129
  367. package/src/services/page-request-cache-coordinator.service.ts +0 -128
  368. package/src/services/schema-validation-service.ts +0 -204
  369. package/src/services/validation/standard-schema.types.ts +0 -68
  370. package/src/static-site-generator/static-site-generator.ts +0 -359
  371. package/src/utils/css.d.ts +0 -1
  372. package/src/utils/css.js +0 -7
  373. package/src/utils/css.ts +0 -5
  374. package/src/utils/deep-merge.ts +0 -47
  375. package/src/utils/hash.ts +0 -5
  376. package/src/utils/html.ts +0 -1
  377. package/src/utils/invariant.ts +0 -15
  378. package/src/utils/locals-utils.ts +0 -37
  379. package/src/utils/parse-cli-args.ts +0 -83
  380. package/src/utils/path-utils.module.ts +0 -14
  381. package/src/utils/runtime.ts +0 -44
  382. package/src/utils/server-utils.module.ts +0 -67
  383. package/src/watchers/project-watcher.test-helpers.ts +0 -40
  384. package/src/watchers/project-watcher.ts +0 -306
  385. /package/src/adapters/{bun → shared}/define-api-handler.js +0 -0
  386. /package/src/{internal-types.js → plugins/runtime-capability.js} +0 -0
  387. /package/src/services/{asset-processing-service → assets/asset-processing-service}/assets.types.js +0 -0
  388. /package/src/services/{asset-processing-service → assets/asset-processing-service}/processor.interface.js +0 -0
  389. /package/src/services/{asset-processing-service → assets/asset-processing-service}/processor.registry.js +0 -0
  390. /package/src/{public-types.js → services/module-loading/module-loading-types.js} +0 -0
  391. /package/src/services/{schema-validation-service.js → validation/schema-validation-service.js} +0 -0
@@ -0,0 +1,87 @@
1
+ import path from "node:path";
2
+ import { fileSystem } from "@ecopages/file-system";
3
+ import { appLogger } from "../../global/app-logger.js";
4
+ import { RESOLVED_ASSETS_DIR } from "../../config/constants.js";
5
+ class HmrEntrypointRegistrar {
6
+ options;
7
+ constructor(options) {
8
+ this.options = options;
9
+ }
10
+ /**
11
+ * Registers a single source entrypoint and returns the browser URL for its emitted HMR module.
12
+ *
13
+ * Concurrent requests for the same normalized entrypoint share the same in-flight promise so the
14
+ * integration only builds once per registration cycle.
15
+ */
16
+ async registerEntrypoint(entrypointPath, registrationOptions) {
17
+ const normalizedEntrypoint = path.resolve(entrypointPath);
18
+ const existingRegistration = this.options.entrypointRegistrations.get(normalizedEntrypoint);
19
+ if (existingRegistration) {
20
+ return await this.awaitEntrypointRegistration(existingRegistration, normalizedEntrypoint);
21
+ }
22
+ const registration = this.registerEntrypointInternal(normalizedEntrypoint, registrationOptions);
23
+ this.options.entrypointRegistrations.set(normalizedEntrypoint, registration);
24
+ try {
25
+ return await this.awaitEntrypointRegistration(registration, normalizedEntrypoint);
26
+ } catch (error) {
27
+ this.options.clearFailedRegistration?.(normalizedEntrypoint);
28
+ throw error;
29
+ } finally {
30
+ this.options.entrypointRegistrations.delete(normalizedEntrypoint);
31
+ }
32
+ }
33
+ async registerEntrypointInternal(entrypointPath, registrationOptions) {
34
+ if (this.options.watchedFiles.has(entrypointPath)) {
35
+ return this.options.watchedFiles.get(entrypointPath);
36
+ }
37
+ const { outputPath, outputUrl } = this.getEntrypointOutput(entrypointPath);
38
+ this.options.watchedFiles.set(entrypointPath, outputUrl);
39
+ this.removeStaleEntrypointOutput(outputPath);
40
+ await registrationOptions.emit(entrypointPath, outputPath);
41
+ if (!fileSystem.exists(outputPath)) {
42
+ throw registrationOptions.getMissingOutputError(entrypointPath, outputPath);
43
+ }
44
+ return outputUrl;
45
+ }
46
+ async awaitEntrypointRegistration(registration, entrypointPath) {
47
+ if (process.env.NODE_ENV !== "development") {
48
+ return await registration;
49
+ }
50
+ return await Promise.race([
51
+ registration,
52
+ new Promise((_, reject) => {
53
+ setTimeout(() => {
54
+ reject(new Error(`[HMR] Timed out registering entrypoint: ${entrypointPath}`));
55
+ }, this.options.registrationTimeoutMs);
56
+ })
57
+ ]);
58
+ }
59
+ getEntrypointOutput(entrypointPath) {
60
+ const relativePath = path.relative(this.options.srcDir, entrypointPath);
61
+ const relativePathJs = relativePath.replace(/\.(tsx?|jsx?|mdx?)$/, ".js");
62
+ const encodedPathJs = this.encodeDynamicSegments(relativePathJs);
63
+ const urlPath = encodedPathJs.split(path.sep).join("/");
64
+ return {
65
+ outputUrl: `/${path.join(RESOLVED_ASSETS_DIR, "_hmr", urlPath)}`,
66
+ outputPath: path.join(this.options.distDir, urlPath)
67
+ };
68
+ }
69
+ removeStaleEntrypointOutput(outputPath) {
70
+ if (!fileSystem.exists(outputPath)) {
71
+ return;
72
+ }
73
+ try {
74
+ fileSystem.remove(outputPath);
75
+ } catch (error) {
76
+ appLogger.warn(
77
+ `[HMR] Failed to remove stale entrypoint output ${outputPath}: ${error instanceof Error ? error.message : String(error)}`
78
+ );
79
+ }
80
+ }
81
+ encodeDynamicSegments(filepath) {
82
+ return filepath.replace(/\[([^\]]+)\]/g, "_$1_");
83
+ }
84
+ }
85
+ export {
86
+ HmrEntrypointRegistrar
87
+ };
@@ -0,0 +1,22 @@
1
+ import type { IHmrManager } from '../../types/public-types.js';
2
+ /**
3
+ * Returns whether a response is HTML and therefore eligible for development HMR
4
+ * runtime injection.
5
+ */
6
+ export declare function isHtmlResponse(response: Response): boolean;
7
+ /**
8
+ * Returns whether HTML responses should receive the HMR runtime bootstrap.
9
+ *
10
+ * This is shared because filesystem page responses and adapter-level HTML
11
+ * responses flow through different layers, but both need identical injection
12
+ * behavior in watch mode.
13
+ */
14
+ export declare function shouldInjectHmrHtmlResponse(watch: boolean, hmrManager?: Pick<IHmrManager, 'isEnabled'>): boolean;
15
+ /**
16
+ * Injects the development HMR runtime script into an HTML response if it is not
17
+ * already present.
18
+ *
19
+ * The check is intentionally idempotent because an HTML response can pass
20
+ * through more than one development-layer wrapper before reaching the client.
21
+ */
22
+ export declare function injectHmrRuntimeIntoHtmlResponse(response: Response): Promise<Response>;
@@ -0,0 +1,32 @@
1
+ const HMR_RUNTIME_IMPORT = "import '/_hmr_runtime.js'";
2
+ const HMR_RUNTIME_SCRIPT = `<script type="module">${HMR_RUNTIME_IMPORT};<\/script>`;
3
+ function isHtmlResponse(response) {
4
+ const contentType = response.headers.get("Content-Type");
5
+ return contentType !== null && contentType.startsWith("text/html");
6
+ }
7
+ function shouldInjectHmrHtmlResponse(watch, hmrManager) {
8
+ return watch && hmrManager?.isEnabled() === true;
9
+ }
10
+ async function injectHmrRuntimeIntoHtmlResponse(response) {
11
+ const html = await response.text();
12
+ if (html.includes(HMR_RUNTIME_IMPORT)) {
13
+ return new Response(html, {
14
+ status: response.status,
15
+ statusText: response.statusText,
16
+ headers: response.headers
17
+ });
18
+ }
19
+ const updatedHtml = html.replace(/<\/html>/i, `${HMR_RUNTIME_SCRIPT}</html>`);
20
+ const headers = new Headers(response.headers);
21
+ headers.delete("Content-Length");
22
+ return new Response(updatedHtml, {
23
+ status: response.status,
24
+ statusText: response.statusText,
25
+ headers
26
+ });
27
+ }
28
+ export {
29
+ injectHmrRuntimeIntoHtmlResponse,
30
+ isHtmlResponse,
31
+ shouldInjectHmrHtmlResponse
32
+ };
@@ -1,7 +1,8 @@
1
- import type { RenderContext } from '../../public-types.js';
1
+ import type { RenderContext } from '../../types/public-types.js';
2
2
  import type { IntegrationPlugin } from '../../plugins/integration-plugin.js';
3
3
  export interface CreateRenderContextOptions {
4
4
  integrations: IntegrationPlugin[];
5
+ rendererModules?: unknown;
5
6
  }
6
7
  /**
7
8
  * Creates a render context for route handlers.
@@ -15,12 +15,14 @@ function createRenderContext(options) {
15
15
  );
16
16
  const integration = integrations.find((i) => i.name === integrationName);
17
17
  invariant(!!integration, `No integration found for: ${integrationName}`);
18
- return integration.initializeRenderer();
18
+ return integration.initializeRenderer({
19
+ rendererModules: options.rendererModules
20
+ });
19
21
  };
20
- return {
22
+ const renderContext = {
21
23
  async render(view, props, renderOptions) {
22
24
  const locals = this?.locals;
23
- const mergedProps = mergePropsWithLocals(props, locals);
25
+ const mergedProps = mergePropsWithLocals(props ?? {}, locals);
24
26
  const renderer = getRendererForView(view);
25
27
  const ctx = {
26
28
  partial: false,
@@ -63,6 +65,7 @@ function createRenderContext(options) {
63
65
  });
64
66
  }
65
67
  };
68
+ return renderContext;
66
69
  }
67
70
  export {
68
71
  createRenderContext
@@ -0,0 +1,38 @@
1
+ import { type BuildExecutor } from '../../build/build-adapter.js';
2
+ import type { EcoBuildPlugin } from '../../build/build-types.js';
3
+ import type { EcoPagesAppConfig, IClientBridge, IHmrManager } from '../../types/internal-types.js';
4
+ /**
5
+ * Installs and returns the app-owned runtime build executor used by adapter
6
+ * startup and follow-up runtime work.
7
+ */
8
+ export declare function installSharedRuntimeBuildExecutor(appConfig: EcoPagesAppConfig, options: {
9
+ development: boolean;
10
+ }): BuildExecutor;
11
+ /**
12
+ * Copies app public assets into dist and ensures the resolved assets directory
13
+ * exists before request handling begins.
14
+ */
15
+ export declare function prepareSharedRuntimePublicDir(appConfig: EcoPagesAppConfig): void;
16
+ /**
17
+ * Runs runtime plugin setup against app-owned config/runtime state and optional
18
+ * host plugin registration hooks.
19
+ */
20
+ export declare function initializeSharedRuntimePlugins(options: {
21
+ appConfig: EcoPagesAppConfig;
22
+ runtimeOrigin: string;
23
+ hmrManager?: IHmrManager;
24
+ onRuntimePlugin?: (plugin: unknown) => void;
25
+ }): Promise<void>;
26
+ /**
27
+ * Starts shared project watching for runtime adapters.
28
+ */
29
+ export declare function startSharedProjectWatching(options: {
30
+ appConfig: EcoPagesAppConfig;
31
+ refreshRouterRoutesCallback: () => Promise<void>;
32
+ hmrManager: IHmrManager;
33
+ bridge: IClientBridge;
34
+ }): Promise<void>;
35
+ /**
36
+ * Binds a runtime HMR manager to app-owned plugin and integration state.
37
+ */
38
+ export declare function bindSharedRuntimeHmrManager(appConfig: EcoPagesAppConfig, hmrManager: IHmrManager): EcoBuildPlugin[];
@@ -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,13 +1,13 @@
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 { FSRouter } from '../../router/server/fs-router.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
11
  export declare abstract class SharedServerAdapter<TOptions extends ServerAdapterOptions, TResult extends ServerAdapterResult> extends AbstractServerAdapter<TOptions, TResult> {
12
12
  protected router: FSRouter;
13
13
  protected fileSystemResponseMatcher: FileSystemResponseMatcher;
@@ -16,6 +16,16 @@ export declare abstract class SharedServerAdapter<TOptions extends ServerAdapter
16
16
  protected staticSiteGenerator: StaticSiteGenerator;
17
17
  protected staticBuilder: ServerStaticBuilder;
18
18
  protected readonly schemaValidator: SchemaValidationService;
19
+ protected initializeSharedRouteHandling(options: {
20
+ staticRoutes: StaticRoute[];
21
+ hmrManager?: any;
22
+ }): Promise<void>;
23
+ protected createSharedWatchRefreshCallback(options: {
24
+ staticRoutes: StaticRoute[];
25
+ hmrManager?: any;
26
+ onRoutesReady?: () => Promise<void> | void;
27
+ onError?: (error: Error) => Promise<void> | void;
28
+ }): () => Promise<void>;
19
29
  /**
20
30
  * Scans the filesystem and dynamically constructs the universal router map.
21
31
  *
@@ -1,11 +1,11 @@
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 { FSRouter } from "../../router/server/fs-router.js";
5
+ import { FSRouterScanner } from "../../router/server/fs-router-scanner.js";
6
6
  import { MemoryCacheStore } from "../../services/cache/memory-cache-store.js";
7
7
  import { PageCacheService } from "../../services/cache/page-cache-service.js";
8
- import { SchemaValidationService } from "../../services/schema-validation-service.js";
8
+ import { SchemaValidationService } from "../../services/validation/schema-validation-service.js";
9
9
  import { StaticSiteGenerator } from "../../static-site-generator/static-site-generator.js";
10
10
  import { ServerStaticBuilder } from "./server-static-builder.js";
11
11
  import { ExplicitStaticRouteMatcher } from "./explicit-static-route-matcher.js";
@@ -17,6 +17,7 @@ import { createRequire } from "../../utils/locals-utils.js";
17
17
  import { HttpError } from "../../errors/http-error.js";
18
18
  import { ApiResponseBuilder } from "./api-response.js";
19
19
  import { appLogger } from "../../global/app-logger.js";
20
+ import { fileSystem } from "@ecopages/file-system";
20
21
  class SharedServerAdapter extends AbstractServerAdapter {
21
22
  router;
22
23
  fileSystemResponseMatcher;
@@ -25,6 +26,29 @@ class SharedServerAdapter extends AbstractServerAdapter {
25
26
  staticSiteGenerator;
26
27
  staticBuilder;
27
28
  schemaValidator = new SchemaValidationService();
29
+ async initializeSharedRouteHandling(options) {
30
+ await this.initSharedRouter();
31
+ this.configureSharedResponseHandlers(options.staticRoutes, options.hmrManager);
32
+ }
33
+ createSharedWatchRefreshCallback(options) {
34
+ return async () => {
35
+ try {
36
+ await this.initializeSharedRouteHandling({
37
+ staticRoutes: options.staticRoutes,
38
+ hmrManager: options.hmrManager
39
+ });
40
+ if (options.onRoutesReady) {
41
+ await options.onRoutesReady();
42
+ }
43
+ } catch (error) {
44
+ if (options.onError) {
45
+ await options.onError(error instanceof Error ? error : new Error(String(error)));
46
+ return;
47
+ }
48
+ throw error;
49
+ }
50
+ };
51
+ }
28
52
  /**
29
53
  * Scans the filesystem and dynamically constructs the universal router map.
30
54
  *
@@ -67,6 +91,7 @@ class SharedServerAdapter extends AbstractServerAdapter {
67
91
  configureSharedResponseHandlers(staticRoutes, hmrManager) {
68
92
  this.routeRendererFactory = new RouteRendererFactory({
69
93
  appConfig: this.appConfig,
94
+ rendererModules: this.appConfig.runtime?.rendererModuleContext,
70
95
  runtimeOrigin: this.runtimeOrigin
71
96
  });
72
97
  const fileSystemResponseFactory = new FileSystemServerResponseFactory({
@@ -84,6 +109,7 @@ class SharedServerAdapter extends AbstractServerAdapter {
84
109
  cacheService = new PageCacheService({ store, enabled: true });
85
110
  }
86
111
  this.fileSystemResponseMatcher = new FileSystemResponseMatcher({
112
+ appConfig: this.appConfig,
87
113
  router: this.router,
88
114
  routeRendererFactory: this.routeRendererFactory,
89
115
  fileSystemResponseFactory,
@@ -107,7 +133,10 @@ class SharedServerAdapter extends AbstractServerAdapter {
107
133
  return this.fileSystemResponseMatcher?.getCacheService() ?? null;
108
134
  }
109
135
  getRenderContext() {
110
- return createRenderContext({ integrations: this.appConfig.integrations });
136
+ return createRenderContext({
137
+ integrations: this.appConfig.integrations,
138
+ rendererModules: this.appConfig.runtime?.rendererModuleContext
139
+ });
111
140
  }
112
141
  /**
113
142
  * Executes an Application Programming Interface (API) handler in an environment-agnostic manner.
@@ -328,13 +357,21 @@ class SharedServerAdapter extends AbstractServerAdapter {
328
357
  const url = new URL(request.url);
329
358
  if (url.pathname === "/_hmr_runtime.js" && context.hmrManager) {
330
359
  const runtimePath = context.hmrManager.getRuntimePath();
331
- const fileSystem = (await import("@ecopages/file-system")).fileSystem;
332
360
  if (fileSystem.exists(runtimePath)) {
333
361
  return new Response(fileSystem.readFileAsBuffer(runtimePath), {
334
362
  headers: { "Content-Type": "application/javascript" }
335
363
  });
336
364
  }
337
365
  }
366
+ if (url.pathname.startsWith("/assets/_hmr/") && context.hmrManager) {
367
+ const relativePath = url.pathname.slice("/assets/_hmr/".length);
368
+ const assetPath = path.join(context.hmrManager.getDistDir(), relativePath);
369
+ if (fileSystem.exists(assetPath)) {
370
+ return new Response(fileSystem.readFileAsBuffer(assetPath), {
371
+ headers: { "Content-Type": "application/javascript" }
372
+ });
373
+ }
374
+ }
338
375
  const apiMatch = this.matchApiHandler(request, context.apiHandlers);
339
376
  if (apiMatch) {
340
377
  return this.executeApiHandler(
@@ -1,7 +1,7 @@
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 { FSRouter } from '../../router/server/fs-router.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
  */
@@ -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.
@@ -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,8 +1,8 @@
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 { RouteRendererFactory } from '../../route-renderer/route-renderer.js';
4
+ import type { FSRouter } from '../../router/server/fs-router.js';
5
+ import type { StaticSiteGenerator } from '../../static-site-generator/static-site-generator.js';
6
6
  export interface StaticBuildOptions {
7
7
  preview?: boolean;
8
8
  }
@@ -14,6 +14,32 @@ export interface ServerStaticBuilderParams {
14
14
  appConfig: EcoPagesAppConfig;
15
15
  staticSiteGenerator: StaticSiteGenerator;
16
16
  serveOptions: ServeOptions;
17
+ apiHandlers?: ApiHandler[];
18
+ logger?: ServerStaticBuilderLogger;
19
+ previewServerFactory?: ServerStaticPreviewServerFactory;
20
+ }
21
+ /**
22
+ * Minimal logger dependency used by the static builder.
23
+ */
24
+ export interface ServerStaticBuilderLogger {
25
+ warn(message: string, detail?: string): unknown;
26
+ info(message: string): unknown;
27
+ error(message: string): unknown;
28
+ }
29
+ /**
30
+ * Preview server factory dependency used when static preview mode is enabled.
31
+ */
32
+ export interface ServerStaticPreviewServerFactory {
33
+ createServer(args: {
34
+ appConfig: EcoPagesAppConfig;
35
+ options: {
36
+ port: number;
37
+ };
38
+ }): {
39
+ server?: {
40
+ port?: number;
41
+ } | null;
42
+ };
17
43
  }
18
44
  /**
19
45
  * Handles static site generation and previews.
@@ -22,7 +48,13 @@ export declare class ServerStaticBuilder {
22
48
  private readonly appConfig;
23
49
  private readonly staticSiteGenerator;
24
50
  private readonly serveOptions;
25
- constructor({ appConfig, staticSiteGenerator, serveOptions }: ServerStaticBuilderParams);
51
+ private readonly apiHandlers;
52
+ private readonly logger;
53
+ private readonly previewServerFactory;
54
+ constructor({ appConfig, staticSiteGenerator, serveOptions, apiHandlers, logger, previewServerFactory, }: ServerStaticBuilderParams);
55
+ private warnApiHandlersUnavailableInStaticMode;
56
+ private prepareExportDirectory;
57
+ private refreshRuntimeAssets;
26
58
  /**
27
59
  * Generates a static build of the site for deployment.
28
60
  * @param options.preview - If true, starts a preview server after build
@@ -1,13 +1,64 @@
1
- import { StaticContentServer } from "../../dev/sc-server";
2
- import { appLogger } from "../../global/app-logger";
1
+ import path from "node:path";
2
+ import { fileSystem } from "@ecopages/file-system";
3
+ import { DEFAULT_ECOPAGES_HOSTNAME, DEFAULT_ECOPAGES_PORT } from "../../config/constants.js";
4
+ import { StaticContentServer } from "../../dev/sc-server.js";
5
+ import { appLogger } from "../../global/app-logger.js";
3
6
  class ServerStaticBuilder {
4
7
  appConfig;
5
8
  staticSiteGenerator;
6
9
  serveOptions;
7
- constructor({ appConfig, staticSiteGenerator, serveOptions }) {
10
+ apiHandlers;
11
+ logger;
12
+ previewServerFactory;
13
+ constructor({
14
+ appConfig,
15
+ staticSiteGenerator,
16
+ serveOptions,
17
+ apiHandlers,
18
+ logger,
19
+ previewServerFactory
20
+ }) {
8
21
  this.appConfig = appConfig;
9
22
  this.staticSiteGenerator = staticSiteGenerator;
10
23
  this.serveOptions = serveOptions;
24
+ this.apiHandlers = apiHandlers ?? [];
25
+ this.logger = logger ?? appLogger;
26
+ this.previewServerFactory = previewServerFactory ?? StaticContentServer;
27
+ }
28
+ warnApiHandlersUnavailableInStaticMode() {
29
+ if (this.apiHandlers.length === 0) {
30
+ return;
31
+ }
32
+ const uniqueHandlers = Array.from(
33
+ new Set(this.apiHandlers.map((handler) => `${handler.method} ${handler.path}`))
34
+ );
35
+ const visibleHandlers = uniqueHandlers.slice(0, 5).join(", ");
36
+ const remainingCount = uniqueHandlers.length - Math.min(uniqueHandlers.length, 5);
37
+ const summary = remainingCount > 0 ? `${visibleHandlers}, +${remainingCount} more` : visibleHandlers;
38
+ this.logger.warn(
39
+ "Registered API endpoints are not available in static build or preview modes because no server runtime is started. They are excluded from the generated output.\n",
40
+ `\u27A4 ${summary}`
41
+ );
42
+ }
43
+ prepareExportDirectory() {
44
+ const exportDir = this.appConfig.absolutePaths?.distDir ?? path.join(this.appConfig.rootDir, this.appConfig.distDir);
45
+ fileSystem.ensureDir(exportDir, true);
46
+ const srcPublicDir = path.join(
47
+ this.appConfig.rootDir,
48
+ this.appConfig.srcDir ?? "src",
49
+ this.appConfig.publicDir ?? "public"
50
+ );
51
+ if (fileSystem.exists(srcPublicDir)) {
52
+ fileSystem.copyDir(srcPublicDir, exportDir);
53
+ }
54
+ }
55
+ async refreshRuntimeAssets() {
56
+ for (const processor of this.appConfig.processors.values()) {
57
+ await processor.setup();
58
+ }
59
+ for (const integration of this.appConfig.integrations) {
60
+ await integration.setup();
61
+ }
11
62
  }
12
63
  /**
13
64
  * Generates a static build of the site for deployment.
@@ -18,7 +69,10 @@ class ServerStaticBuilder {
18
69
  */
19
70
  async build(options, dependencies) {
20
71
  const { preview = false } = options ?? {};
21
- const baseUrl = `http://${this.serveOptions.hostname || "localhost"}:${this.serveOptions.port || 3e3}`;
72
+ const baseUrl = `http://${this.serveOptions.hostname || DEFAULT_ECOPAGES_HOSTNAME}:${this.serveOptions.port || DEFAULT_ECOPAGES_PORT}`;
73
+ this.warnApiHandlersUnavailableInStaticMode();
74
+ this.prepareExportDirectory();
75
+ await this.refreshRuntimeAssets();
22
76
  await this.staticSiteGenerator.run({
23
77
  router: dependencies.router,
24
78
  baseUrl,
@@ -26,18 +80,18 @@ class ServerStaticBuilder {
26
80
  staticRoutes: dependencies.staticRoutes
27
81
  });
28
82
  if (!preview) {
29
- appLogger.info("Build completed");
83
+ this.logger.info("Build completed");
30
84
  return;
31
85
  }
32
- const previewPort = this.serveOptions.port || 3e3;
33
- const { server } = StaticContentServer.createServer({
86
+ const previewPort = this.serveOptions.port || DEFAULT_ECOPAGES_PORT;
87
+ const { server } = this.previewServerFactory.createServer({
34
88
  appConfig: this.appConfig,
35
89
  options: { port: Number(previewPort) }
36
90
  });
37
- if (server) {
38
- appLogger.info(`Preview running at http://localhost:${server.port}`);
91
+ if (server?.port) {
92
+ this.logger.info(`Preview running at http://localhost:${server.port}`);
39
93
  } else {
40
- appLogger.error("Failed to start preview server");
94
+ this.logger.error("Failed to start preview server");
41
95
  }
42
96
  }
43
97
  }