@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
@@ -2,6 +2,7 @@ import path from "node:path";
2
2
  import chokidar, {} from "chokidar";
3
3
  import { fileSystem } from "@ecopages/file-system";
4
4
  import { appLogger } from "../global/app-logger.js";
5
+ import { DevelopmentInvalidationService } from "../services/invalidation/development-invalidation.service.js";
5
6
  class ProjectWatcher {
6
7
  /**
7
8
  * Duplicate identical watcher events within this window are ignored.
@@ -15,13 +16,16 @@ class ProjectWatcher {
15
16
  refreshRouterRoutesCallback;
16
17
  hmrManager;
17
18
  bridge;
19
+ invalidationService;
18
20
  watcher = null;
19
21
  lastHandledChange = /* @__PURE__ */ new Map();
22
+ changeQueue = Promise.resolve();
20
23
  constructor({ config, refreshRouterRoutesCallback, hmrManager, bridge }) {
21
24
  this.appConfig = config;
22
25
  this.refreshRouterRoutesCallback = refreshRouterRoutesCallback;
23
26
  this.hmrManager = hmrManager;
24
27
  this.bridge = bridge;
28
+ this.invalidationService = new DevelopmentInvalidationService(config);
25
29
  this.triggerRouterRefresh = this.triggerRouterRefresh.bind(this);
26
30
  this.handleError = this.handleError.bind(this);
27
31
  this.handleFileChange = this.handleFileChange.bind(this);
@@ -41,6 +45,12 @@ class ProjectWatcher {
41
45
  }
42
46
  }
43
47
  }
48
+ isRouteSourceFile(filePath) {
49
+ return this.invalidationService.isRouteSourceFile(filePath);
50
+ }
51
+ isIncludeSourceFile(filePath) {
52
+ return this.invalidationService.isIncludeSourceFile(filePath);
53
+ }
44
54
  /**
45
55
  * Handles public directory file changes by copying only the changed file.
46
56
  * @param filePath - Absolute path of the changed file
@@ -60,19 +70,33 @@ class ProjectWatcher {
60
70
  this.bridge.reload();
61
71
  }
62
72
  }
73
+ /**
74
+ * Serializes file change handling so that concurrent chokidar events are
75
+ * processed one at a time, preventing overlapping builds and race conditions.
76
+ */
77
+ enqueueChange(task) {
78
+ const queuedTask = this.changeQueue.then(task, task);
79
+ this.changeQueue = queuedTask.catch(() => void 0);
80
+ }
63
81
  /**
64
82
  * Handles file changes by uncaching modules, refreshing routes, and delegating appropriately.
65
- * Follows 4-rule priority:
66
- * 0. Public directory match? copy file and reload
67
- * 1. additionalWatchPaths match? reload
68
- * 2. Processor extension match? processor handles (skip HMR)
69
- * 3. Otherwise HMR strategies
83
+ * Follows 5-rule priority:
84
+ * 0. Public directory match? -> copy file and reload
85
+ * 1. additionalWatchPaths match? -> reload
86
+ * 2. Include template source? -> reload after processor notifications
87
+ * 3. Processor-owned asset? -> processor already handled it via notification, skip HMR
88
+ * 4. Otherwise -> HMR strategies
89
+ *
90
+ * Processors that watch a file extension as a dependency (e.g. PostCSS watching
91
+ * .tsx for Tailwind class scanning) are always notified first, but do not
92
+ * prevent the file from flowing through the normal HMR strategy pipeline.
70
93
  *
71
94
  * Duplicate identical watcher events for the same file are coalesced within a
72
95
  * short window before any of the priority rules run.
73
96
  * @param rawPath - Path of the changed file
97
+ * @param event - The type of file system event
74
98
  */
75
- async handleFileChange(rawPath) {
99
+ async handleFileChange(rawPath, event = "change") {
76
100
  const filePath = path.resolve(rawPath);
77
101
  const now = Date.now();
78
102
  const lastHandledAt = this.lastHandledChange.get(filePath);
@@ -81,23 +105,33 @@ class ProjectWatcher {
81
105
  }
82
106
  this.lastHandledChange.set(filePath, now);
83
107
  try {
84
- if (this.isPublicDirFile(filePath)) {
108
+ const plan = this.invalidationService.planFileChange(filePath);
109
+ if (plan.category === "public-asset") {
85
110
  await this.handlePublicDirFileChange(filePath);
86
111
  return;
87
112
  }
88
113
  this.uncacheModules();
89
- const isPageFile = filePath.startsWith(this.appConfig.absolutePaths.pagesDir);
90
- if (isPageFile) {
91
- this.refreshRouterRoutesCallback();
114
+ if (plan.invalidateServerModules) {
115
+ this.invalidationService.invalidateServerModules([filePath]);
116
+ }
117
+ if (plan.refreshRoutes) {
118
+ await this.refreshRouterRoutesCallback();
92
119
  }
93
- if (this.matchesAdditionalWatchPaths(filePath)) {
120
+ if (plan.category === "additional-watch") {
94
121
  this.bridge.reload();
95
122
  return;
96
123
  }
97
- if (this.isHandledByProcessor(filePath)) {
124
+ await this.notifyProcessors(filePath, event);
125
+ if (plan.category === "include-source") {
126
+ this.bridge.reload();
127
+ return;
128
+ }
129
+ if (plan.processorHandledAsset) {
98
130
  return;
99
131
  }
100
- await this.hmrManager.handleFileChange(filePath);
132
+ if (plan.delegateToHmr) {
133
+ await this.hmrManager.handleFileChange(filePath);
134
+ }
101
135
  } catch (error) {
102
136
  if (error instanceof Error) {
103
137
  this.bridge.error(error.message);
@@ -105,42 +139,56 @@ class ProjectWatcher {
105
139
  }
106
140
  }
107
141
  }
142
+ /**
143
+ * Notifies all processors whose watch config matches the given file extension.
144
+ * This is called before checking processor ownership so that dependency-only
145
+ * processors (e.g. PostCSS watching .tsx for class scanning) receive their
146
+ * notifications regardless of whether they own the file.
147
+ */
148
+ async notifyProcessors(filePath, event) {
149
+ const ctx = { path: filePath, bridge: this.bridge };
150
+ for (const processor of this.appConfig.processors.values()) {
151
+ const watchConfig = processor.getWatchConfig();
152
+ if (!watchConfig) continue;
153
+ const { extensions = [] } = watchConfig;
154
+ if (extensions.length && !extensions.some((ext) => filePath.endsWith(ext))) {
155
+ continue;
156
+ }
157
+ const handler = this.getProcessorHandler(watchConfig, event);
158
+ if (handler) {
159
+ await handler(ctx);
160
+ }
161
+ }
162
+ }
163
+ getProcessorHandler(watchConfig, event) {
164
+ switch (event) {
165
+ case "change":
166
+ return watchConfig.onChange;
167
+ case "add":
168
+ return watchConfig.onCreate;
169
+ case "unlink":
170
+ return watchConfig.onDelete;
171
+ }
172
+ }
108
173
  /**
109
174
  * Checks if a file is in the public directory.
110
175
  */
111
176
  isPublicDirFile(filePath) {
112
- return filePath.startsWith(this.appConfig.absolutePaths.publicDir);
177
+ return this.invalidationService.isPublicDirFile(filePath);
113
178
  }
114
179
  /**
115
180
  * Checks if file path matches any additionalWatchPaths patterns.
116
181
  */
117
182
  matchesAdditionalWatchPaths(filePath) {
118
- const patterns = this.appConfig.additionalWatchPaths;
119
- if (!patterns.length) return false;
120
- for (const pattern of patterns) {
121
- if (pattern.includes("*")) {
122
- const ext = pattern.replace(/\*\*?\/\*/, "");
123
- if (filePath.endsWith(ext)) return true;
124
- } else {
125
- if (filePath.endsWith(pattern) || filePath === path.resolve(pattern)) return true;
126
- }
127
- }
128
- return false;
183
+ return this.invalidationService.matchesAdditionalWatchPaths(filePath);
129
184
  }
130
185
  /**
131
186
  * Checks if a file is handled by a processor.
132
- * Processors that declare extensions own those file types.
187
+ * Processors that declare asset capabilities own those file types.
188
+ * Processors without capabilities fall back to checking watch extensions.
133
189
  */
134
190
  isHandledByProcessor(filePath) {
135
- for (const processor of this.appConfig.processors.values()) {
136
- const watchConfig = processor.getWatchConfig();
137
- if (!watchConfig) continue;
138
- const { extensions = [] } = watchConfig;
139
- if (extensions.length && extensions.some((ext) => filePath.endsWith(ext))) {
140
- return true;
141
- }
142
- }
143
- return false;
191
+ return this.invalidationService.isProcessorOwnedAsset(filePath);
144
192
  }
145
193
  /**
146
194
  * Triggers router refresh for page directory changes.
@@ -148,10 +196,11 @@ class ProjectWatcher {
148
196
  *
149
197
  * @param {string} path - Path of the changed directory
150
198
  */
151
- triggerRouterRefresh(path2) {
152
- const isPageDir = path2.startsWith(this.appConfig.absolutePaths.pagesDir);
153
- if (isPageDir) {
154
- this.refreshRouterRoutesCallback();
199
+ async triggerRouterRefresh(changedPath) {
200
+ const resolvedPath = path.resolve(changedPath);
201
+ const isPageDir = resolvedPath.startsWith(this.appConfig.absolutePaths.pagesDir) && path.extname(resolvedPath) === "";
202
+ if (isPageDir || this.isRouteSourceFile(resolvedPath)) {
203
+ await this.refreshRouterRoutesCallback();
155
204
  }
156
205
  }
157
206
  /**
@@ -165,71 +214,59 @@ class ProjectWatcher {
165
214
  }
166
215
  appLogger.error(`Watcher error: ${error}`);
167
216
  }
168
- /**
169
- * Processes file changes for specific file extensions.
170
- * Used by processors to handle their specific file types.
171
- *
172
- * @private
173
- * @param {string} path - Path of the changed file
174
- * @param {string[]} extensions - File extensions to process
175
- * @param {(ctx: ProcessorWatchContext) => void} handler - Handler function for the file change
176
- */
177
- shouldProcess(path2, extensions, handler) {
178
- if (!extensions.length || extensions.some((ext) => path2.endsWith(ext))) {
179
- handler({ path: path2, bridge: this.bridge });
180
- }
181
- }
182
217
  /**
183
218
  * Creates and configures the file system watcher.
184
219
  * This sets up:
185
- * 1. Processor-specific file watching
186
- * 2. Page file watching
187
- * 3. Directory watching
188
- * 4. Error handling
220
+ * 1. Page file watching
221
+ * 2. Directory watching
222
+ * 3. Error handling
223
+ *
224
+ * Processor notifications are dispatched inside handleFileChange, ensuring
225
+ * a single unified event pipeline with no parallel chokidar bindings.
189
226
  *
190
227
  * Uses chokidar's built-in debouncing through `awaitWriteFinish` to handle
191
228
  * rapid file changes efficiently.
192
229
  */
193
230
  async createWatcherSubscription() {
194
- if (!this.watcher) {
195
- const processorPaths = [];
196
- for (const processor of this.appConfig.processors.values()) {
197
- const watchConfig = processor.getWatchConfig();
198
- if (!watchConfig) continue;
199
- processorPaths.push(...watchConfig.paths);
200
- }
201
- if (fileSystem.exists(this.appConfig.absolutePaths.pagesDir)) {
202
- processorPaths.push(this.appConfig.absolutePaths.pagesDir);
203
- }
204
- if (fileSystem.exists(this.appConfig.absolutePaths.publicDir)) {
205
- processorPaths.push(this.appConfig.absolutePaths.publicDir);
206
- }
207
- if (this.appConfig.additionalWatchPaths.length) {
208
- processorPaths.push(...this.appConfig.additionalWatchPaths);
209
- }
210
- this.watcher = chokidar.watch(processorPaths, {
211
- ignoreInitial: true,
212
- ignorePermissionErrors: true,
213
- awaitWriteFinish: {
214
- stabilityThreshold: 50,
215
- pollInterval: 50
216
- }
217
- });
231
+ if (this.watcher) {
232
+ return this.watcher;
218
233
  }
234
+ const processorPaths = [];
219
235
  for (const processor of this.appConfig.processors.values()) {
220
236
  const watchConfig = processor.getWatchConfig();
221
237
  if (!watchConfig) continue;
222
- const { extensions = [], onCreate, onChange, onDelete, onError } = watchConfig;
223
- if (onCreate) this.watcher.on("add", (path2) => this.shouldProcess(path2, extensions, onCreate));
224
- if (onChange) this.watcher.on("change", (path2) => this.shouldProcess(path2, extensions, onChange));
225
- if (onDelete) this.watcher.on("unlink", (path2) => this.shouldProcess(path2, extensions, onDelete));
226
- if (onError) this.watcher.on("error", onError);
227
- }
228
- this.watcher.add(this.appConfig.absolutePaths.srcDir);
229
- this.watcher.on("change", (path2) => this.handleFileChange(path2)).on("add", (path2) => {
230
- this.handleFileChange(path2);
231
- this.triggerRouterRefresh(path2);
232
- }).on("addDir", (path2) => this.triggerRouterRefresh(path2)).on("unlink", (path2) => this.triggerRouterRefresh(path2)).on("unlinkDir", (path2) => this.triggerRouterRefresh(path2)).on("error", (error) => this.handleError(error));
238
+ processorPaths.push(...watchConfig.paths);
239
+ }
240
+ if (fileSystem.exists(this.appConfig.absolutePaths.includesDir)) {
241
+ processorPaths.push(this.appConfig.absolutePaths.includesDir);
242
+ }
243
+ if (fileSystem.exists(this.appConfig.absolutePaths.srcDir)) {
244
+ processorPaths.push(this.appConfig.absolutePaths.srcDir);
245
+ }
246
+ if (fileSystem.exists(this.appConfig.absolutePaths.pagesDir)) {
247
+ processorPaths.push(this.appConfig.absolutePaths.pagesDir);
248
+ }
249
+ if (fileSystem.exists(this.appConfig.absolutePaths.publicDir)) {
250
+ processorPaths.push(this.appConfig.absolutePaths.publicDir);
251
+ }
252
+ if (this.appConfig.additionalWatchPaths.length) {
253
+ processorPaths.push(...this.appConfig.additionalWatchPaths);
254
+ }
255
+ this.watcher = chokidar.watch(processorPaths, {
256
+ ignoreInitial: true,
257
+ ignorePermissionErrors: true,
258
+ awaitWriteFinish: {
259
+ stabilityThreshold: 50,
260
+ pollInterval: 50
261
+ }
262
+ });
263
+ this.watcher.on("change", (p) => this.enqueueChange(() => this.handleFileChange(p, "change"))).on("add", (p) => this.enqueueChange(() => this.handleFileChange(p, "add"))).on("addDir", (p) => this.enqueueChange(() => this.triggerRouterRefresh(p))).on("unlink", (p) => this.enqueueChange(() => this.handleFileChange(p, "unlink"))).on("unlinkDir", (p) => this.enqueueChange(() => this.triggerRouterRefresh(p))).on("error", (error) => this.handleError(error));
264
+ for (const processor of this.appConfig.processors.values()) {
265
+ const watchConfig = processor.getWatchConfig();
266
+ if (watchConfig?.onError) {
267
+ this.watcher.on("error", watchConfig.onError);
268
+ }
269
+ }
233
270
  return this.watcher;
234
271
  }
235
272
  }
@@ -1,4 +1,4 @@
1
- import type { IHmrManager } from '../internal-types';
2
- import type { ClientBridge } from '../adapters/bun/client-bridge';
1
+ import type { IHmrManager } from '../types/internal-types.js';
2
+ import type { ClientBridge } from '../adapters/bun/client-bridge.js';
3
3
  export declare const createMockHmrManager: () => IHmrManager;
4
4
  export declare const createMockBridge: () => ClientBridge;
@@ -9,6 +9,7 @@ const createMockHmrManager = () => ({
9
9
  setPlugins: vi.fn(() => {
10
10
  }),
11
11
  registerEntrypoint: vi.fn(async () => ""),
12
+ registerScriptEntrypoint: vi.fn(async () => ""),
12
13
  registerSpecifierMap: vi.fn(() => {
13
14
  }),
14
15
  registerStrategy: vi.fn(() => {
@@ -1,337 +0,0 @@
1
- /**
2
- * This file defines the abstract class for application adapters in EcoPages.
3
- * It provides a common interface for different runtimes (e.g., Node.js, Deno) to implement.
4
- * The class includes methods for handling HTTP requests and managing application state.
5
- * It also includes a method for parsing command-line arguments.
6
- *
7
- * @module ApplicationAdapter
8
- */
9
-
10
- import { appLogger } from '../../global/app-logger.ts';
11
- import type { EcoPagesAppConfig } from '../../internal-types.ts';
12
- import { invariant } from '../../utils/invariant.ts';
13
- import type {
14
- ApiHandler,
15
- ApiHandlerContext,
16
- ErrorHandler,
17
- Middleware,
18
- RouteOptions,
19
- StaticRoute,
20
- ViewLoader,
21
- } from '../../public-types.ts';
22
- import { fileSystem } from '@ecopages/file-system';
23
- import { parseCliArgs, type ReturnParseCliArgs } from '../../utils/parse-cli-args.ts';
24
-
25
- /**
26
- * Configuration options for application adapters
27
- */
28
- export interface ApplicationAdapterOptions {
29
- appConfig: EcoPagesAppConfig;
30
- serverOptions?: Record<string, any>;
31
- /**
32
- * Options for clearing the output directory before starting the server
33
- * @default false
34
- */
35
- clearOutput?: boolean;
36
- }
37
-
38
- /**
39
- * Common interface for application adapters
40
- */
41
- export interface ApplicationAdapter<T = any> {
42
- start(): Promise<T | void>;
43
- }
44
-
45
- /**
46
- * Handler function type for route handlers
47
- */
48
- export type RouteHandler<
49
- TRequest extends Request = Request,
50
- TServer = any,
51
- TContext extends ApiHandlerContext<TRequest, TServer> = ApiHandlerContext<TRequest, TServer>,
52
- > = (context: TContext) => Promise<Response> | Response;
53
-
54
- export type RouteGroupDefinition<TRequest extends Request = Request, TServer = any> = {
55
- prefix: string;
56
- middleware?: readonly Middleware<TRequest, TServer, any>[];
57
- routes: readonly ApiHandler<string, TRequest, TServer>[];
58
- };
59
-
60
- /**
61
- * Abstract base class for application adapters across different runtimes
62
- */
63
- export abstract class AbstractApplicationAdapter<
64
- TOptions extends ApplicationAdapterOptions = ApplicationAdapterOptions,
65
- TServer = any,
66
- TRequest extends Request = any,
67
- > implements ApplicationAdapter<TServer> {
68
- protected appConfig: EcoPagesAppConfig;
69
- protected serverOptions: Record<string, any>;
70
- protected cliArgs: ReturnParseCliArgs;
71
- protected apiHandlers: ApiHandler[] = [];
72
- protected staticRoutes: StaticRoute[] = [];
73
- protected errorHandler?: ErrorHandler;
74
-
75
- constructor(options: TOptions) {
76
- this.appConfig = options.appConfig;
77
- this.serverOptions = options.serverOptions || {};
78
- this.cliArgs = parseCliArgs();
79
-
80
- if (options.clearOutput) {
81
- this.clearDistFolder().catch((error) => {
82
- appLogger.error('Error clearing dist folder', error as Error);
83
- });
84
- }
85
- }
86
-
87
- private async clearDistFolder(_filter: string[] = []): Promise<void> {
88
- const distPath = this.appConfig.absolutePaths.distDir;
89
- const distExists = fileSystem.exists(distPath);
90
-
91
- if (!distExists) return;
92
-
93
- try {
94
- await fileSystem.removeAsync(distPath);
95
- appLogger.debug(`Cleared dist folder: ${distPath}`);
96
- } catch (error) {
97
- appLogger.error(`Error clearing dist folder: ${distPath}`, error as Error);
98
- }
99
- }
100
-
101
- /**
102
- * Register a GET route handler.
103
- *
104
- * Use verb methods for inline route definitions.
105
- * For dynamic HTTP method registration, use `route(...)`.
106
- */
107
- abstract get<
108
- P extends string,
109
- TContext extends ApiHandlerContext<TRequest, TServer> = ApiHandlerContext<TRequest, TServer>,
110
- >(
111
- path: P,
112
- handler: RouteHandler<TRequest, TServer, TContext>,
113
- options?: RouteOptions<TRequest, TServer, TContext>,
114
- ): this;
115
-
116
- /**
117
- * Register a POST route handler
118
- */
119
- abstract post<
120
- P extends string,
121
- TContext extends ApiHandlerContext<TRequest, TServer> = ApiHandlerContext<TRequest, TServer>,
122
- >(
123
- path: P,
124
- handler: RouteHandler<TRequest, TServer, TContext>,
125
- options?: RouteOptions<TRequest, TServer, TContext>,
126
- ): this;
127
-
128
- /**
129
- * Register a PUT route handler
130
- */
131
- abstract put<
132
- P extends string,
133
- TContext extends ApiHandlerContext<TRequest, TServer> = ApiHandlerContext<TRequest, TServer>,
134
- >(
135
- path: P,
136
- handler: RouteHandler<TRequest, TServer, TContext>,
137
- options?: RouteOptions<TRequest, TServer, TContext>,
138
- ): this;
139
-
140
- /**
141
- * Register a DELETE route handler
142
- */
143
- abstract delete<
144
- P extends string,
145
- TContext extends ApiHandlerContext<TRequest, TServer> = ApiHandlerContext<TRequest, TServer>,
146
- >(
147
- path: P,
148
- handler: RouteHandler<TRequest, TServer, TContext>,
149
- options?: RouteOptions<TRequest, TServer, TContext>,
150
- ): this;
151
-
152
- /**
153
- * Register a PATCH route handler
154
- */
155
- abstract patch<
156
- P extends string,
157
- TContext extends ApiHandlerContext<TRequest, TServer> = ApiHandlerContext<TRequest, TServer>,
158
- >(
159
- path: P,
160
- handler: RouteHandler<TRequest, TServer, TContext>,
161
- options?: RouteOptions<TRequest, TServer, TContext>,
162
- ): this;
163
-
164
- /**
165
- * Register an OPTIONS route handler
166
- */
167
- abstract options<
168
- P extends string,
169
- TContext extends ApiHandlerContext<TRequest, TServer> = ApiHandlerContext<TRequest, TServer>,
170
- >(
171
- path: P,
172
- handler: RouteHandler<TRequest, TServer, TContext>,
173
- options?: RouteOptions<TRequest, TServer, TContext>,
174
- ): this;
175
-
176
- /**
177
- * Register a HEAD route handler
178
- */
179
- abstract head<
180
- P extends string,
181
- TContext extends ApiHandlerContext<TRequest, TServer> = ApiHandlerContext<TRequest, TServer>,
182
- >(
183
- path: P,
184
- handler: RouteHandler<TRequest, TServer, TContext>,
185
- options?: RouteOptions<TRequest, TServer, TContext>,
186
- ): this;
187
-
188
- /**
189
- * Register a route with an explicit HTTP method.
190
- *
191
- * This is useful when the method is determined programmatically, or when
192
- * registering a pre-built route declaration object by forwarding its
193
- * `path`, `method`, and `handler` fields.
194
- */
195
- abstract route<P extends string>(
196
- path: P,
197
- method: ApiHandler['method'],
198
- handler: RouteHandler<TRequest, TServer>,
199
- options?: RouteOptions<TRequest, TServer>,
200
- ): this;
201
-
202
- /**
203
- * Register a pre-built API handler declaration.
204
- */
205
- abstract add(handler: ApiHandler<string, TRequest, TServer>): this;
206
-
207
- /**
208
- * Internal method to add route handlers to the API handlers array
209
- */
210
- protected addRouteHandler<
211
- P extends string,
212
- TSpecRequest extends TRequest = TRequest,
213
- TSpecServer extends TServer = TServer,
214
- TContext extends ApiHandlerContext<TSpecRequest, TSpecServer> = ApiHandlerContext<TSpecRequest, TSpecServer>,
215
- >(
216
- path: P,
217
- method: ApiHandler['method'],
218
- handler: RouteHandler<TSpecRequest, TSpecServer, TContext>,
219
- middleware?: Middleware<TSpecRequest, TSpecServer, TContext>[],
220
- schema?: ApiHandler['schema'],
221
- ): this {
222
- invariant(
223
- typeof path === 'string',
224
- `Invalid route path for ${method}: expected a string path starting with "/" but received ${Object.prototype.toString.call(path)}. If you're passing a prebuilt ApiHandler, use app.add(handler).`,
225
- );
226
-
227
- invariant(
228
- path.startsWith('/'),
229
- `Invalid route path for ${method}: "${path}". Route paths must start with '/'.`,
230
- );
231
-
232
- this.apiHandlers.push({
233
- path,
234
- method,
235
- handler: handler as ApiHandler['handler'],
236
- middleware: middleware as ApiHandler['middleware'],
237
- schema,
238
- });
239
- return this;
240
- }
241
-
242
- /**
243
- * Create a route group with shared prefix and middleware.
244
- * Routes defined within the group inherit the prefix and middleware.
245
- *
246
- * Each adapter implements this with its own builder type to support
247
- * runtime-specific features (e.g., Bun's path parameter inference).
248
- * Implementations may also support passing a pre-built group object.
249
- *
250
- * @param prefix - URL prefix for all routes in the group (e.g., '/api/v1')
251
- * @param callback - Function that receives a builder to define routes
252
- * @param options - Optional group-level middleware
253
- */
254
- abstract group(
255
- prefix: string,
256
- callback: (builder: unknown) => void,
257
- options?: {
258
- middleware?: readonly Middleware<TRequest, TServer, any>[];
259
- },
260
- ): this;
261
-
262
- abstract group(group: RouteGroupDefinition<TRequest, TServer>): this;
263
-
264
- /**
265
- * Get all registered API handlers
266
- */
267
- getApiHandlers(): ApiHandler[] {
268
- return this.apiHandlers;
269
- }
270
-
271
- /**
272
- * Register a view for static generation at build time.
273
- * The view must have staticPaths defined for dynamic routes.
274
- *
275
- * Uses a loader function to enable HMR in development.
276
- *
277
- * @param path - URL path pattern (e.g., '/posts/:slug')
278
- * @param loader - A function that dynamically imports the eco.page view module
279
- * @example
280
- * ```typescript
281
- * app.static('/login', () => import('./src/views/login.kita'))
282
- * app.static('/posts/:slug', () => import('./src/views/post-view.kita'))
283
- * ```
284
- */
285
- static<P>(path: string, loader: ViewLoader<P>): this {
286
- this.staticRoutes.push({ path, loader });
287
- return this;
288
- }
289
-
290
- /**
291
- * Get all registered static routes
292
- */
293
- getStaticRoutes(): StaticRoute[] {
294
- return this.staticRoutes;
295
- }
296
-
297
- /**
298
- * Register a global error handler for all routes.
299
- * Useful for logging, monitoring integration, and custom error formatting.
300
- *
301
- * @example
302
- * ```typescript
303
- * app.onError(async (error, ctx) => {
304
- * logger.error(error);
305
- * return ctx.response.status(500).json({ error: 'Something went wrong' });
306
- * });
307
- * ```
308
- */
309
- onError(handler: ErrorHandler<TRequest, TServer>): this {
310
- this.errorHandler = handler as unknown as ErrorHandler;
311
- return this;
312
- }
313
-
314
- /**
315
- * Get the registered error handler
316
- */
317
- getErrorHandler(): ErrorHandler | undefined {
318
- return this.errorHandler;
319
- }
320
-
321
- /**
322
- * Initialize the server adapter based on the runtime
323
- */
324
- protected abstract initializeServerAdapter(): Promise<any>;
325
-
326
- /**
327
- * Start the application server
328
- */
329
- public abstract start(): Promise<TServer | void>;
330
-
331
- /**
332
- * Handles a standard Web request without requiring a bound network server.
333
- * This is the primary interoperability surface for embedding Ecopages inside
334
- * other runtimes and frameworks.
335
- */
336
- public abstract fetch(request: TRequest): Promise<Response>;
337
- }