@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
@@ -1,16 +1,18 @@
1
1
  import { createServer } from "node:http";
2
- import path from "node:path";
3
- import { fileSystem } from "@ecopages/file-system";
4
- import { RESOLVED_ASSETS_DIR } from "../../constants.js";
5
- import { defaultBuildAdapter } from "../../build/build-adapter.js";
6
2
  import { appLogger } from "../../global/app-logger.js";
7
- import { ProjectWatcher } from "../../watchers/project-watcher.js";
8
3
  import { NodeClientBridge } from "./node-client-bridge.js";
9
- import { NodeHmrManager } from "./node-hmr-manager.js";
10
4
  import { StaticSiteGenerator } from "../../static-site-generator/static-site-generator.js";
11
5
  import { SharedServerAdapter } from "../shared/server-adapter.js";
12
6
  import { ServerStaticBuilder } from "../shared/server-static-builder.js";
7
+ import {
8
+ bindSharedRuntimeHmrManager,
9
+ initializeSharedRuntimePlugins,
10
+ installSharedRuntimeBuildExecutor,
11
+ prepareSharedRuntimePublicDir,
12
+ startSharedProjectWatching
13
+ } from "../shared/runtime-bootstrap.js";
13
14
  import { NodeStaticContentServer } from "./static-content-server.js";
15
+ import { DEFAULT_ECOPAGES_HOSTNAME, DEFAULT_ECOPAGES_PORT } from "../../config/constants.js";
14
16
  class ClientAbortError extends Error {
15
17
  constructor() {
16
18
  super("Client closed the request");
@@ -26,7 +28,6 @@ class NodeServerAdapter extends SharedServerAdapter {
26
28
  previewServer = null;
27
29
  bridge = null;
28
30
  hmrManager = null;
29
- processorBuildPlugins = [];
30
31
  constructor(options) {
31
32
  super(options);
32
33
  this.apiHandlers = options.apiHandlers || [];
@@ -47,85 +48,28 @@ class NodeServerAdapter extends SharedServerAdapter {
47
48
  * processors during their `setup()` calls.
48
49
  */
49
50
  async initialize() {
50
- this.setupLoaders();
51
- this.copyPublicDir();
52
- await this.initializePlugins();
53
- await this.initSharedRouter();
54
- this.configureSharedResponseHandlers(this.staticRoutes, this.hmrManager ?? void 0);
51
+ installSharedRuntimeBuildExecutor(this.appConfig, {
52
+ development: this.options?.watch === true
53
+ });
54
+ prepareSharedRuntimePublicDir(this.appConfig);
55
+ await initializeSharedRuntimePlugins({
56
+ appConfig: this.appConfig,
57
+ runtimeOrigin: this.runtimeOrigin,
58
+ hmrManager: this.hmrManager ?? void 0
59
+ });
60
+ await this.initializeSharedRouteHandling({
61
+ staticRoutes: this.staticRoutes,
62
+ hmrManager: this.hmrManager ?? void 0
63
+ });
55
64
  this.staticSiteGenerator = new StaticSiteGenerator({ appConfig: this.appConfig });
56
65
  this.staticBuilder = new ServerStaticBuilder({
57
66
  appConfig: this.appConfig,
58
67
  staticSiteGenerator: this.staticSiteGenerator,
59
- serveOptions: this.serveOptions
68
+ serveOptions: this.serveOptions,
69
+ apiHandlers: this.apiHandlers
60
70
  });
61
71
  this.initialized = true;
62
72
  }
63
- /**
64
- * Registers every configured file loader as a build plugin on the shared
65
- * `defaultBuildAdapter`.
66
- *
67
- * Loaders are registered on the *shared* adapter (not on a per-build instance)
68
- * because they must be available globally to both the SSR build and any dynamic
69
- * transpile passes that happen outside of a top-level `build()` call (e.g. HMR
70
- * incremental rebuilds).
71
- */
72
- setupLoaders() {
73
- for (const loader of this.appConfig.loaders.values()) {
74
- defaultBuildAdapter.registerPlugin(loader);
75
- }
76
- }
77
- copyPublicDir() {
78
- const srcPublicDir = path.join(this.appConfig.rootDir, this.appConfig.srcDir, this.appConfig.publicDir);
79
- if (fileSystem.exists(srcPublicDir)) {
80
- fileSystem.copyDir(srcPublicDir, path.join(this.appConfig.rootDir, this.appConfig.distDir));
81
- }
82
- fileSystem.ensureDir(path.join(this.appConfig.absolutePaths.distDir, RESOLVED_ASSETS_DIR));
83
- }
84
- /**
85
- * Sets up all configured processors and integrations in two distinct phases.
86
- *
87
- * **Phase 1 — Processors:**
88
- * Each processor's `setup()` is called first. A processor may expose two
89
- * plugin lists:
90
- * - `plugins` — transform plugins used during SSR rendering (e.g. PostCSS).
91
- * - `buildPlugins` — esbuild plugins used during the client bundle step.
92
- * Both are registered on `defaultBuildAdapter` so later build calls pick them up.
93
- *
94
- * **Phase 2 — Integrations:**
95
- * Integrations receive the fully-resolved app config, the runtime origin, and
96
- * (if already initialised) the HMR manager before their own `setup()` is called.
97
- * This ordering ensures integrations can query config values that processors
98
- * may have mutated during phase 1.
99
- */
100
- async initializePlugins() {
101
- const processorBuildPlugins = [];
102
- for (const processor of this.appConfig.processors.values()) {
103
- await processor.setup();
104
- if (processor.plugins) {
105
- for (const plugin of processor.plugins) {
106
- defaultBuildAdapter.registerPlugin(plugin);
107
- }
108
- }
109
- if (processor.buildPlugins) {
110
- processorBuildPlugins.push(...processor.buildPlugins);
111
- for (const plugin of processor.buildPlugins) {
112
- defaultBuildAdapter.registerPlugin(plugin);
113
- }
114
- }
115
- }
116
- for (const integration of this.appConfig.integrations) {
117
- integration.setConfig(this.appConfig);
118
- integration.setRuntimeOrigin(this.runtimeOrigin);
119
- if (this.hmrManager) {
120
- integration.setHmrManager(this.hmrManager);
121
- }
122
- await integration.setup();
123
- for (const plugin of integration.plugins) {
124
- defaultBuildAdapter.registerPlugin(plugin);
125
- }
126
- }
127
- this.processorBuildPlugins = processorBuildPlugins;
128
- }
129
73
  getServerOptions() {
130
74
  return {
131
75
  ...this.serveOptions
@@ -158,12 +102,12 @@ class NodeServerAdapter extends SharedServerAdapter {
158
102
  appConfig: this.appConfig,
159
103
  options: {
160
104
  hostname: this.serveOptions.hostname,
161
- port: Number(this.serveOptions.port || 3e3)
105
+ port: Number(this.serveOptions.port || DEFAULT_ECOPAGES_PORT)
162
106
  }
163
107
  });
164
108
  await this.previewServer.start();
165
- const previewHostname = this.serveOptions.hostname || "localhost";
166
- const previewPort = this.serveOptions.port || 3e3;
109
+ const previewHostname = this.serveOptions.hostname || DEFAULT_ECOPAGES_HOSTNAME;
110
+ const previewPort = this.serveOptions.port || DEFAULT_ECOPAGES_PORT;
167
111
  appLogger.info(`Preview running at http://${previewHostname}:${previewPort}`);
168
112
  }
169
113
  /**
@@ -254,8 +198,8 @@ class NodeServerAdapter extends SharedServerAdapter {
254
198
  * `stopBuildRuntimeServer`, so it never overlaps with the actual dev/prod server.
255
199
  */
256
200
  async startBuildRuntimeServer() {
257
- const hostname = String(this.serveOptions.hostname || "localhost");
258
- const port = Number(this.serveOptions.port || 3e3);
201
+ const hostname = String(this.serveOptions.hostname || DEFAULT_ECOPAGES_HOSTNAME);
202
+ const port = Number(this.serveOptions.port || DEFAULT_ECOPAGES_PORT);
259
203
  const server = createServer(async (req, res) => {
260
204
  try {
261
205
  const webRequest = this.createWebRequest(req);
@@ -325,12 +269,12 @@ class NodeServerAdapter extends SharedServerAdapter {
325
269
  * underlying socket closes early — into a 499 response so it does not
326
270
  * incorrectly surface as a 500 in application logs.
327
271
  */
328
- async handleRequest(_request) {
272
+ async handleRequest(request) {
329
273
  if (!this.initialized) {
330
274
  throw new Error("Node server adapter is not initialized. Call createAdapter() first.");
331
275
  }
332
276
  try {
333
- return await this.handleSharedRequest(_request, {
277
+ return await this.handleSharedRequest(request, {
334
278
  apiHandlers: this.apiHandlers,
335
279
  errorHandler: this.errorHandler,
336
280
  serverInstance: this.serverInstance,
@@ -353,22 +297,23 @@ class NodeServerAdapter extends SharedServerAdapter {
353
297
  * broadcast + heartbeat cleanup.
354
298
  * - `NodeHmrManager` watches the filesystem and triggers incremental esbuild
355
299
  * rebuilds, notifying connected clients via the bridge.
356
- * - `ProjectWatcher` listens for route-level file changes and refreshes the
357
- * router and response handlers when pages are added or removed.
300
+ * - Shared watcher bootstrapping listens for route-level file changes and
301
+ * refreshes the router and response handlers when pages are added or removed.
358
302
  *
359
303
  * WebSocket upgrade requests that do not target `/_hmr` are rejected with an
360
304
  * immediate socket destroy to prevent unhandled upgrade leaks.
361
305
  */
362
- async completeInitialization(_server) {
363
- this.serverInstance = _server;
306
+ async completeInitialization(server) {
307
+ this.serverInstance = server;
364
308
  if (this.options?.watch) {
309
+ const { NodeHmrManager } = await import("./node-hmr-manager.js");
365
310
  const { WebSocketServer } = await import("ws");
366
311
  const wss = new WebSocketServer({ noServer: true });
367
312
  this.bridge = new NodeClientBridge();
368
313
  this.hmrManager = new NodeHmrManager({ appConfig: this.appConfig, bridge: this.bridge });
369
314
  this.hmrManager.setEnabled(true);
370
315
  await this.hmrManager.buildRuntime();
371
- _server.on("upgrade", (req, socket, head) => {
316
+ server.on("upgrade", (req, socket, head) => {
372
317
  const url = new URL(req.url ?? "/", this.runtimeOrigin);
373
318
  if (url.pathname === "/_hmr") {
374
319
  wss.handleUpgrade(req, socket, head, (ws) => {
@@ -380,23 +325,17 @@ class NodeServerAdapter extends SharedServerAdapter {
380
325
  socket.destroy();
381
326
  }
382
327
  });
383
- const loaderPlugins = Array.from(this.appConfig.loaders.values());
384
- const hmrBuildPlugins = [...loaderPlugins, ...this.processorBuildPlugins];
385
- this.hmrManager.setPlugins(hmrBuildPlugins);
386
- for (const integration of this.appConfig.integrations) {
387
- integration.setHmrManager(this.hmrManager);
388
- }
328
+ bindSharedRuntimeHmrManager(this.appConfig, this.hmrManager);
389
329
  this.configureSharedResponseHandlers(this.staticRoutes, this.hmrManager);
390
- const watcher = new ProjectWatcher({
391
- config: this.appConfig,
392
- refreshRouterRoutesCallback: async () => {
393
- await this.initSharedRouter();
394
- this.configureSharedResponseHandlers(this.staticRoutes, this.hmrManager);
395
- },
330
+ await startSharedProjectWatching({
331
+ appConfig: this.appConfig,
332
+ refreshRouterRoutesCallback: this.createSharedWatchRefreshCallback({
333
+ staticRoutes: this.staticRoutes,
334
+ hmrManager: this.hmrManager
335
+ }),
396
336
  hmrManager: this.hmrManager,
397
337
  bridge: this.bridge
398
338
  });
399
- await watcher.createWatcherSubscription();
400
339
  }
401
340
  appLogger.debug("Node server adapter initialization completed", {
402
341
  apiHandlers: this.apiHandlers.length,
@@ -407,7 +346,7 @@ class NodeServerAdapter extends SharedServerAdapter {
407
346
  }
408
347
  }
409
348
  async function createNodeServerAdapter(params) {
410
- const runtimeOrigin = params.runtimeOrigin ?? `http://${params.serveOptions.hostname || "localhost"}:${params.serveOptions.port || 3e3}`;
349
+ const runtimeOrigin = params.runtimeOrigin ?? `http://${params.serveOptions.hostname || DEFAULT_ECOPAGES_HOSTNAME}:${params.serveOptions.port || DEFAULT_ECOPAGES_PORT}`;
411
350
  const adapter = new NodeServerAdapter({
412
351
  ...params,
413
352
  runtimeOrigin
@@ -1,24 +1,60 @@
1
1
  import { type Server as NodeHttpServer } from 'node:http';
2
- import type { EcoPagesAppConfig } from '../../internal-types.js';
2
+ import type { EcoPagesAppConfig } from '../../types/internal-types.js';
3
3
  type NodeStaticContentServerOptions = {
4
4
  hostname?: string;
5
5
  port?: number;
6
6
  };
7
+ /**
8
+ * Serves prebuilt static Ecopages output through Node's HTTP server.
9
+ *
10
+ * @remarks
11
+ * This server is used by the Node preview/build path once the app has already
12
+ * emitted its static output. It intentionally stays small: path sanitization,
13
+ * content-type selection, optional gzip serving, and 404 handling.
14
+ */
7
15
  export declare class NodeStaticContentServer {
8
16
  private readonly appConfig;
9
17
  private readonly options;
10
18
  private server;
19
+ /**
20
+ * Creates the Node static-content server for one built app output directory.
21
+ */
11
22
  constructor({ appConfig, options }: {
12
23
  appConfig: EcoPagesAppConfig;
13
24
  options?: NodeStaticContentServerOptions;
14
25
  });
26
+ /**
27
+ * Returns whether the given content type should be served from a pre-gzipped
28
+ * companion file when available.
29
+ */
15
30
  private shouldServeGzip;
31
+ /**
32
+ * Normalizes a request pathname and rejects directory traversal attempts.
33
+ */
16
34
  private sanitizePath;
35
+ /**
36
+ * Writes one HTTP response with the provided headers and optional body.
37
+ */
17
38
  private sendResponse;
39
+ /**
40
+ * Serves the generated 404 page when present, or a plain-text fallback.
41
+ */
18
42
  private sendNotFoundPage;
43
+ /**
44
+ * Serves one concrete file path, honoring gzip and HEAD semantics.
45
+ */
19
46
  private serveFile;
47
+ /**
48
+ * Handles one incoming Node HTTP request against the built static output tree.
49
+ */
20
50
  private handleRequest;
51
+ /**
52
+ * Starts the static preview server.
53
+ */
21
54
  start(): Promise<NodeHttpServer>;
55
+ /**
56
+ * Stops the static preview server and optionally closes active connections.
57
+ */
22
58
  stop(force?: boolean): Promise<void>;
23
59
  }
24
60
  export {};
@@ -1,12 +1,15 @@
1
1
  import { createServer } from "node:http";
2
2
  import { extname, join, normalize, sep } from "node:path";
3
- import { DEFAULT_ECOPAGES_HOSTNAME, DEFAULT_ECOPAGES_PORT, STATUS_MESSAGE } from "../../constants.js";
3
+ import { DEFAULT_ECOPAGES_HOSTNAME, DEFAULT_ECOPAGES_PORT, STATUS_MESSAGE } from "../../config/constants.js";
4
4
  import { fileSystem } from "@ecopages/file-system";
5
5
  import { ServerUtils } from "../../utils/server-utils.module.js";
6
6
  class NodeStaticContentServer {
7
7
  appConfig;
8
8
  options;
9
9
  server = null;
10
+ /**
11
+ * Creates the Node static-content server for one built app output directory.
12
+ */
10
13
  constructor({ appConfig, options }) {
11
14
  this.appConfig = appConfig;
12
15
  this.options = {
@@ -14,9 +17,16 @@ class NodeStaticContentServer {
14
17
  port: options?.port ?? DEFAULT_ECOPAGES_PORT
15
18
  };
16
19
  }
20
+ /**
21
+ * Returns whether the given content type should be served from a pre-gzipped
22
+ * companion file when available.
23
+ */
17
24
  shouldServeGzip(contentType) {
18
25
  return ["text/javascript", "text/css"].includes(contentType);
19
26
  }
27
+ /**
28
+ * Normalizes a request pathname and rejects directory traversal attempts.
29
+ */
20
30
  sanitizePath(pathname) {
21
31
  const withoutLeadingSlash = pathname.replace(/^\/+/, "");
22
32
  const normalizedPath = normalize(withoutLeadingSlash);
@@ -25,6 +35,9 @@ class NodeStaticContentServer {
25
35
  }
26
36
  return normalizedPath;
27
37
  }
38
+ /**
39
+ * Writes one HTTP response with the provided headers and optional body.
40
+ */
28
41
  sendResponse(res, status, headers, body) {
29
42
  res.statusCode = status;
30
43
  for (const [key, value] of Object.entries(headers)) {
@@ -36,6 +49,9 @@ class NodeStaticContentServer {
36
49
  }
37
50
  res.end(body);
38
51
  }
52
+ /**
53
+ * Serves the generated 404 page when present, or a plain-text fallback.
54
+ */
39
55
  sendNotFoundPage(req, res) {
40
56
  const error404TemplatePath = join(this.appConfig.absolutePaths.distDir, "404.html");
41
57
  const isHead = (req.method ?? "GET").toUpperCase() === "HEAD";
@@ -51,6 +67,9 @@ class NodeStaticContentServer {
51
67
  const file = fileSystem.readFileAsBuffer(error404TemplatePath);
52
68
  this.sendResponse(res, 404, { "Content-Type": "text/html" }, isHead ? void 0 : file);
53
69
  }
70
+ /**
71
+ * Serves one concrete file path, honoring gzip and HEAD semantics.
72
+ */
54
73
  serveFile(req, res, filePath, status = 200) {
55
74
  const contentType = ServerUtils.getContentType(extname(filePath));
56
75
  const acceptsGzip = req.headers["accept-encoding"]?.includes("gzip");
@@ -79,6 +98,9 @@ class NodeStaticContentServer {
79
98
  const file = fileSystem.readFileAsBuffer(filePath);
80
99
  this.sendResponse(res, status, { "Content-Type": contentType }, isHead ? void 0 : file);
81
100
  }
101
+ /**
102
+ * Handles one incoming Node HTTP request against the built static output tree.
103
+ */
82
104
  handleRequest(req, res) {
83
105
  const method = (req.method ?? "GET").toUpperCase();
84
106
  const isHead = method === "HEAD";
@@ -129,6 +151,9 @@ class NodeStaticContentServer {
129
151
  }
130
152
  this.sendNotFoundPage(req, res);
131
153
  }
154
+ /**
155
+ * Starts the static preview server.
156
+ */
132
157
  async start() {
133
158
  if (this.server) {
134
159
  return this.server;
@@ -141,6 +166,9 @@ class NodeStaticContentServer {
141
166
  });
142
167
  return this.server;
143
168
  }
169
+ /**
170
+ * Stops the static preview server and optionally closes active connections.
171
+ */
144
172
  async stop(force = true) {
145
173
  if (!this.server) {
146
174
  return;
@@ -1,4 +1,4 @@
1
- import type { ApiHandler, ApiHandlerContext, Middleware, RouteGroupBuilder, RouteOptions } from '../../public-types.js';
1
+ import type { ApiHandler, ApiHandlerContext, Middleware, RouteGroupBuilder, RouteOptions } from '../../types/public-types.js';
2
2
  import { AbstractApplicationAdapter, type ApplicationAdapterOptions, type RouteGroupDefinition, type RouteHandler } from '../abstract/application-adapter.js';
3
3
  export declare abstract class SharedApplicationAdapter<TOptions extends ApplicationAdapterOptions = ApplicationAdapterOptions, TServer = any, TRequest extends Request = Request> extends AbstractApplicationAdapter<TOptions, TServer, TRequest> {
4
4
  protected register<P extends string, TContext extends ApiHandlerContext<TRequest, TServer> = ApiHandlerContext<TRequest, TServer>>(path: P, method: ApiHandler['method'], handler: RouteHandler<TRequest, TServer, TContext>, options?: RouteOptions<TRequest, TServer, TContext>): this;
@@ -1,4 +1,4 @@
1
- import type { ApiHandler, ApiHandlerContext, Middleware, RouteSchema, TypedGroupHandlerContext } from './public-types.js';
1
+ import type { ApiHandler, ApiHandlerContext, Middleware, RouteSchema, TypedGroupHandlerContext } from '../../types/public-types.js';
2
2
  type UniversalContext = ApiHandlerContext<Request, unknown>;
3
3
  type SchemaHandlerContext<TSchema extends RouteSchema | undefined, TContext extends UniversalContext> = TSchema extends RouteSchema ? TypedGroupHandlerContext<TSchema, TContext> : TContext;
4
4
  export declare function defineApiHandler<TPath extends string, TSchema extends RouteSchema | undefined = undefined, TContext extends UniversalContext = UniversalContext>(handler: Omit<ApiHandler<TPath, Request, unknown>, 'handler' | 'middleware' | 'schema'> & {
@@ -1,5 +1,5 @@
1
- import type { EcoPagesAppConfig } from '../../internal-types.js';
2
- import type { StaticRoute } from '../../public-types.js';
1
+ import type { EcoPagesAppConfig } from '../../types/internal-types.js';
2
+ import type { StaticRoute } from '../../types/public-types.js';
3
3
  import type { RouteRendererFactory } from '../../route-renderer/route-renderer.js';
4
4
  export declare const EXPLICIT_STATIC_ROUTE_MATCHER_ERRORS: {
5
5
  readonly missingIntegration: (routePath: string) => string;
@@ -3,6 +3,9 @@ const EXPLICIT_STATIC_ROUTE_MATCHER_ERRORS = {
3
3
  missingIntegration: (routePath) => `View at ${routePath} is missing __eco.integration. Ensure it's defined with eco.page() and exported as default.`,
4
4
  noRendererForIntegration: (integrationName) => `No renderer found for integration: ${integrationName}`
5
5
  };
6
+ function getViewIntegrationName(view) {
7
+ return view.config?.integration ?? view.config?.__eco?.integration;
8
+ }
6
9
  class ExplicitStaticRouteMatcher {
7
10
  appConfig;
8
11
  routeRendererFactory;
@@ -71,7 +74,7 @@ class ExplicitStaticRouteMatcher {
71
74
  try {
72
75
  const mod = await route.loader();
73
76
  const view = mod.default;
74
- const integrationName = view.config?.__eco?.integration;
77
+ const integrationName = getViewIntegrationName(view);
75
78
  if (!integrationName) {
76
79
  throw new Error(EXPLICIT_STATIC_ROUTE_MATCHER_ERRORS.missingIntegration(route.path));
77
80
  }
@@ -1,4 +1,4 @@
1
- import type { Middleware, ApiHandlerContext, RequestLocals } from '../../public-types.js';
1
+ import type { Middleware, ApiHandlerContext, RequestLocals } from '../../types/public-types.js';
2
2
  import type { PageCacheService } from '../../services/cache/page-cache-service.js';
3
3
  export declare const FILE_ROUTE_MIDDLEWARE_PIPELINE_ERRORS: {
4
4
  readonly CTX_RENDER_UNAVAILABLE: "[ecopages] ctx.render is not available in file-route middleware";
@@ -7,6 +7,7 @@ const FILE_ROUTE_MIDDLEWARE_PIPELINE_ERRORS = {
7
7
  middlewareRequiresDynamic: (filePath) => `[ecopages] Page middleware requires cache: 'dynamic'. Page: ${filePath}`
8
8
  };
9
9
  class FileRouteMiddlewarePipeline {
10
+ cacheService;
10
11
  constructor(cacheService) {
11
12
  this.cacheService = cacheService;
12
13
  }
@@ -1,5 +1,5 @@
1
- import type { EcoPagesAppConfig, FileSystemServerOptions } from '../../internal-types.js';
2
- import type { RouteRendererBody } from '../../public-types.js';
1
+ import type { EcoPagesAppConfig, FileSystemServerOptions } from '../../types/internal-types.js';
2
+ import type { RouteRendererBody } from '../../types/public-types.js';
3
3
  import type { RouteRendererFactory } from '../../route-renderer/route-renderer.js';
4
4
  export declare class FileSystemServerResponseFactory {
5
5
  private appConfig;
@@ -1,4 +1,4 @@
1
- import { STATUS_MESSAGE } from "../../constants.js";
1
+ import { STATUS_MESSAGE } from "../../config/constants.js";
2
2
  import { appLogger } from "../../global/app-logger.js";
3
3
  import { fileSystem } from "@ecopages/file-system";
4
4
  class FileSystemServerResponseFactory {
@@ -1,14 +1,11 @@
1
- import type { MatchResult } from '../../internal-types.js';
1
+ import type { EcoPagesAppConfig, MatchResult } from '../../types/internal-types.js';
2
2
  import type { RouteRendererFactory } from '../../route-renderer/route-renderer.js';
3
- import type { FSRouter } from '../../router/fs-router.js';
3
+ import type { FSRouter } from '../../router/server/fs-router.js';
4
4
  import type { PageCacheService } from '../../services/cache/page-cache-service.js';
5
5
  import type { CacheStrategy } from '../../services/cache/cache.types.js';
6
6
  import type { FileSystemServerResponseFactory } from './fs-server-response-factory.js';
7
- export declare const FILE_SYSTEM_RESPONSE_MATCHER_ERRORS: {
8
- readonly transpilePageModuleFailed: (details: string) => string;
9
- readonly noTranspiledOutputForPageModule: (filePath: string) => string;
10
- };
11
7
  export interface FileSystemResponseMatcherOptions {
8
+ appConfig: EcoPagesAppConfig;
12
9
  router: FSRouter;
13
10
  routeRendererFactory: RouteRendererFactory;
14
11
  fileSystemResponseFactory: FileSystemServerResponseFactory;
@@ -20,23 +17,21 @@ export interface FileSystemResponseMatcherOptions {
20
17
  /**
21
18
  * Matches file-system routes to rendered HTML responses.
22
19
  *
23
- * This class sits at the request-time boundary between router matches and the
24
20
  * render pipeline. It coordinates page module inspection, request-local policy,
25
21
  * renderer invocation, middleware execution, cache integration, and fallback
26
22
  * error translation.
27
23
  */
28
24
  export declare class FileSystemResponseMatcher {
25
+ private appConfig;
29
26
  private router;
30
27
  private routeRendererFactory;
31
28
  private fileSystemResponseFactory;
32
- private pageModuleImportService;
33
29
  private pageRequestCacheCoordinator;
34
30
  private fileRouteMiddlewarePipeline;
35
- constructor({ router, routeRendererFactory, fileSystemResponseFactory, cacheService, defaultCacheStrategy, }: FileSystemResponseMatcherOptions);
31
+ constructor({ appConfig, router, routeRendererFactory, fileSystemResponseFactory, cacheService, defaultCacheStrategy, }: FileSystemResponseMatcherOptions);
36
32
  /**
37
33
  * Resolves unmatched paths either as static asset requests or as the custom
38
34
  * not-found page.
39
- *
40
35
  * @param requestUrl Incoming pathname.
41
36
  * @returns Static file response or rendered 404 response.
42
37
  */
@@ -57,8 +52,9 @@ export declare class FileSystemResponseMatcher {
57
52
  * Loads the matched page module for request-time inspection.
58
53
  *
59
54
  * The matcher needs access to page-level metadata such as `cache` and
60
- * `middleware` before full rendering starts, so it uses the shared module
61
- * import service directly rather than going through route rendering.
55
+ * `middleware` before full rendering starts, so it asks the owning route
56
+ * renderer to load the page module. That preserves integration-specific page
57
+ * import setup for request-time inspection as well as for full rendering.
62
58
  *
63
59
  * @param filePath Absolute page module path.
64
60
  * @returns Imported page module.
@@ -1,40 +1,35 @@
1
1
  import path from "node:path";
2
2
  import { appLogger } from "../../global/app-logger.js";
3
- import { PageModuleImportService } from "../../services/page-module-import.service.js";
4
- import { PageRequestCacheCoordinator } from "../../services/page-request-cache-coordinator.service.js";
3
+ import { PageRequestCacheCoordinator } from "../../services/cache/page-request-cache-coordinator.service.js";
5
4
  import { ServerUtils } from "../../utils/server-utils.module.js";
6
5
  import { FileRouteMiddlewarePipeline } from "./file-route-middleware-pipeline.js";
7
6
  import { LocalsAccessError } from "../../errors/locals-access-error.js";
8
7
  import { isDevelopmentRuntime } from "../../utils/runtime.js";
9
- const FILE_SYSTEM_RESPONSE_MATCHER_ERRORS = {
10
- transpilePageModuleFailed: (details) => `Error transpiling page module: ${details}`,
11
- noTranspiledOutputForPageModule: (filePath) => `No transpiled output generated for page module: ${filePath}`
12
- };
13
8
  class FileSystemResponseMatcher {
9
+ appConfig;
14
10
  router;
15
11
  routeRendererFactory;
16
12
  fileSystemResponseFactory;
17
- pageModuleImportService;
18
13
  pageRequestCacheCoordinator;
19
14
  fileRouteMiddlewarePipeline;
20
15
  constructor({
16
+ appConfig,
21
17
  router,
22
18
  routeRendererFactory,
23
19
  fileSystemResponseFactory,
24
20
  cacheService = null,
25
21
  defaultCacheStrategy = "static"
26
22
  }) {
23
+ this.appConfig = appConfig;
27
24
  this.router = router;
28
25
  this.routeRendererFactory = routeRendererFactory;
29
26
  this.fileSystemResponseFactory = fileSystemResponseFactory;
30
- this.pageModuleImportService = new PageModuleImportService();
31
27
  this.pageRequestCacheCoordinator = new PageRequestCacheCoordinator(cacheService, defaultCacheStrategy);
32
28
  this.fileRouteMiddlewarePipeline = new FileRouteMiddlewarePipeline(cacheService);
33
29
  }
34
30
  /**
35
31
  * Resolves unmatched paths either as static asset requests or as the custom
36
32
  * not-found page.
37
- *
38
33
  * @param requestUrl Incoming pathname.
39
34
  * @returns Static file response or rendered 404 response.
40
35
  */
@@ -127,19 +122,17 @@ class FileSystemResponseMatcher {
127
122
  * Loads the matched page module for request-time inspection.
128
123
  *
129
124
  * The matcher needs access to page-level metadata such as `cache` and
130
- * `middleware` before full rendering starts, so it uses the shared module
131
- * import service directly rather than going through route rendering.
125
+ * `middleware` before full rendering starts, so it asks the owning route
126
+ * renderer to load the page module. That preserves integration-specific page
127
+ * import setup for request-time inspection as well as for full rendering.
132
128
  *
133
129
  * @param filePath Absolute page module path.
134
130
  * @returns Imported page module.
135
131
  */
136
132
  async importPageModule(filePath) {
137
- return this.pageModuleImportService.importModule({
138
- filePath,
139
- rootDir: path.dirname(this.router.assetPrefix),
140
- outdir: path.join(this.router.assetPrefix, ".server-modules-meta"),
141
- transpileErrorMessage: FILE_SYSTEM_RESPONSE_MATCHER_ERRORS.transpilePageModuleFailed,
142
- noOutputMessage: FILE_SYSTEM_RESPONSE_MATCHER_ERRORS.noTranspiledOutputForPageModule
133
+ const routeRenderer = this.routeRendererFactory.createRenderer(filePath);
134
+ return routeRenderer.loadPageModule(filePath, {
135
+ cacheScope: "request-metadata"
143
136
  });
144
137
  }
145
138
  /**
@@ -150,6 +143,5 @@ class FileSystemResponseMatcher {
150
143
  }
151
144
  }
152
145
  export {
153
- FILE_SYSTEM_RESPONSE_MATCHER_ERRORS,
154
146
  FileSystemResponseMatcher
155
147
  };
@@ -0,0 +1,55 @@
1
+ /**
2
+ * Shared runtime state used while registering HMR-owned entrypoints.
3
+ */
4
+ export interface HmrEntrypointRegistrarOptions {
5
+ /** Absolute source directory used to derive the emitted HMR path. */
6
+ srcDir: string;
7
+ /** Absolute distribution directory where HMR outputs are written. */
8
+ distDir: string;
9
+ /** In-flight registrations keyed by normalized absolute entrypoint path. */
10
+ entrypointRegistrations: Map<string, Promise<string>>;
11
+ /** Stable entrypoint-to-output mapping retained once an entrypoint is registered. */
12
+ watchedFiles: Map<string, string>;
13
+ /** Runtime-specific cleanup invoked when an entrypoint registration fails. */
14
+ clearFailedRegistration?: (entrypointPath: string) => void;
15
+ /** Development-only guardrail for integrations that never finish producing output. */
16
+ registrationTimeoutMs: number;
17
+ }
18
+ /**
19
+ * Runtime-specific hooks required to materialize a single HMR entrypoint.
20
+ */
21
+ export interface HmrEntrypointRegistrationOptions {
22
+ /**
23
+ * Emits the browser-consumable HMR artifact for an entrypoint.
24
+ */
25
+ emit(entrypointPath: string, outputPath: string): Promise<void>;
26
+ /**
27
+ * Creates the runtime-specific error raised when the emit hook completes without producing output.
28
+ */
29
+ getMissingOutputError(entrypointPath: string, outputPath: string): Error;
30
+ }
31
+ /**
32
+ * Coordinates the shared HMR entrypoint registration lifecycle for both Node and Bun managers.
33
+ *
34
+ * The registrar owns the cross-runtime policy: normalize entrypoint identities, dedupe concurrent
35
+ * registrations, derive the emitted `_hmr` output path, clear stale output before rebuilding, and
36
+ * apply the development timeout that prevents unresolved registrations from hanging navigation.
37
+ * Runtime-specific managers remain responsible for the actual emit step and any cleanup outside
38
+ * this shared registration flow.
39
+ */
40
+ export declare class HmrEntrypointRegistrar {
41
+ private readonly options;
42
+ constructor(options: HmrEntrypointRegistrarOptions);
43
+ /**
44
+ * Registers a single source entrypoint and returns the browser URL for its emitted HMR module.
45
+ *
46
+ * Concurrent requests for the same normalized entrypoint share the same in-flight promise so the
47
+ * integration only builds once per registration cycle.
48
+ */
49
+ registerEntrypoint(entrypointPath: string, registrationOptions: HmrEntrypointRegistrationOptions): Promise<string>;
50
+ private registerEntrypointInternal;
51
+ private awaitEntrypointRegistration;
52
+ private getEntrypointOutput;
53
+ private removeStaleEntrypointOutput;
54
+ private encodeDynamicSegments;
55
+ }