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

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 (418) hide show
  1. package/README.md +213 -12
  2. package/package.json +100 -188
  3. package/src/adapters/README.md +39 -0
  4. package/src/adapters/bun/hmr-manager.test.ts +267 -0
  5. package/src/adapters/bun/hmr-manager.ts +181 -68
  6. package/src/adapters/bun/index.ts +1 -2
  7. package/src/adapters/bun/server-adapter.ts +41 -34
  8. package/src/adapters/bun/server-lifecycle.ts +40 -70
  9. package/src/adapters/index.ts +1 -1
  10. package/src/adapters/node/bootstrap-dependency-resolver.test.ts +282 -0
  11. package/src/adapters/node/bootstrap-dependency-resolver.ts +301 -0
  12. package/src/adapters/node/index.ts +7 -0
  13. package/src/adapters/node/node-client-bridge.test.ts +198 -0
  14. package/src/adapters/node/node-hmr-manager.test.ts +322 -0
  15. package/src/adapters/node/node-hmr-manager.ts +208 -116
  16. package/src/adapters/node/runtime-adapter.test.ts +868 -0
  17. package/src/adapters/node/runtime-adapter.ts +439 -0
  18. package/src/adapters/node/server-adapter.ts +31 -104
  19. package/src/adapters/node/static-content-server.test.ts +60 -0
  20. package/src/adapters/node/static-content-server.ts +36 -0
  21. package/src/adapters/node/write-runtime-manifest.ts +38 -0
  22. package/src/adapters/shared/api-response.test.ts +97 -0
  23. package/src/{define-api-handler.ts → adapters/shared/define-api-handler.ts} +1 -1
  24. package/src/adapters/shared/explicit-static-route-matcher.test.ts +381 -0
  25. package/src/adapters/shared/explicit-static-route-matcher.ts +7 -1
  26. package/src/adapters/shared/file-route-middleware-pipeline.test.ts +90 -0
  27. package/src/adapters/shared/file-route-middleware-pipeline.ts +6 -2
  28. package/src/adapters/shared/fs-server-response-factory.test.ts +187 -0
  29. package/src/adapters/shared/fs-server-response-matcher.test.ts +286 -0
  30. package/src/adapters/shared/fs-server-response-matcher.ts +17 -10
  31. package/src/adapters/shared/hmr-entrypoint-registrar.ts +149 -0
  32. package/src/adapters/shared/hmr-html-response.ts +52 -0
  33. package/src/adapters/shared/hmr-manager.contract.test.ts +196 -0
  34. package/src/adapters/shared/hmr-manager.dispatch.test.ts +220 -0
  35. package/src/adapters/shared/render-context.test.ts +146 -0
  36. package/src/adapters/shared/render-context.ts +21 -6
  37. package/src/adapters/shared/runtime-bootstrap.ts +79 -0
  38. package/src/adapters/shared/server-adapter.test.ts +77 -0
  39. package/src/adapters/shared/server-adapter.ts +51 -4
  40. package/src/adapters/shared/server-route-handler.test.ts +110 -0
  41. package/src/adapters/shared/server-route-handler.ts +5 -18
  42. package/src/adapters/shared/server-static-builder.test.ts +316 -0
  43. package/src/adapters/shared/server-static-builder.ts +92 -8
  44. package/src/build/README.md +101 -0
  45. package/src/build/build-adapter-serialization.test.ts +268 -0
  46. package/src/build/build-adapter.test.ts +815 -0
  47. package/src/build/build-adapter.ts +235 -6
  48. package/src/build/build-manifest.ts +54 -0
  49. package/src/build/dev-build-coordinator.ts +221 -0
  50. package/src/build/esbuild-build-adapter.ts +132 -83
  51. package/src/build/runtime-build-executor.ts +34 -0
  52. package/src/build/runtime-specifier-alias-plugin.test.ts +43 -0
  53. package/src/build/runtime-specifier-alias-plugin.ts +58 -0
  54. package/src/config/README.md +33 -0
  55. package/src/config/config-builder.test.ts +410 -0
  56. package/src/config/config-builder.ts +281 -49
  57. package/src/constants.ts +15 -0
  58. package/src/declarations.d.ts +18 -13
  59. package/src/eco/README.md +70 -16
  60. package/src/eco/component-render-context.ts +39 -17
  61. package/src/eco/eco.test.ts +678 -0
  62. package/src/eco/eco.ts +29 -8
  63. package/src/eco/eco.types.ts +20 -1
  64. package/src/eco/eco.utils.test.ts +124 -0
  65. package/src/eco/global-injector-map.test.ts +42 -0
  66. package/src/eco/lazy-injector-map.test.ts +66 -0
  67. package/src/eco/module-dependencies.test.ts +30 -0
  68. package/src/errors/http-error.test.ts +134 -0
  69. package/src/global/utils.test.ts +12 -0
  70. package/src/hmr/README.md +26 -0
  71. 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
  72. package/src/hmr/client/__screenshots__/hmr-runtime.test.browser.ts/HMR-Runtime-HMR-Server-Integration-should-load-fixture-app-page-1.png +0 -0
  73. package/src/hmr/client/__screenshots__/hmr-runtime.test.browser.ts/HMR-Runtime-WebSocket-Connection-should-connect-to-correct-HMR-endpoint-1.png +0 -0
  74. package/src/hmr/client/hmr-runtime.ts +38 -7
  75. package/src/hmr/hmr-strategy.test.ts +124 -0
  76. package/src/hmr/hmr.postcss.test.e2e.ts +41 -0
  77. package/src/hmr/hmr.test.e2e.ts +29 -38
  78. package/src/hmr/strategies/js-hmr-strategy.test.ts +335 -0
  79. package/src/hmr/strategies/js-hmr-strategy.ts +115 -115
  80. package/src/index.ts +1 -1
  81. package/src/integrations/ghtml/ghtml-renderer.test.ts +63 -0
  82. package/src/integrations/ghtml/ghtml-renderer.ts +4 -1
  83. package/src/internal-types.ts +39 -19
  84. package/src/plugins/README.md +34 -0
  85. package/src/plugins/alias-resolver-plugin.test.ts +41 -0
  86. package/src/plugins/alias-resolver-plugin.ts +21 -3
  87. package/src/plugins/eco-component-meta-plugin.test.ts +380 -0
  88. package/src/plugins/eco-component-meta-plugin.ts +10 -3
  89. package/src/plugins/integration-plugin.test.ts +111 -0
  90. package/src/plugins/integration-plugin.ts +45 -3
  91. package/src/plugins/processor.test.ts +148 -0
  92. package/src/plugins/processor.ts +22 -2
  93. package/src/plugins/runtime-capability.ts +14 -0
  94. package/src/public-types.ts +73 -16
  95. package/src/route-renderer/GRAPH.md +16 -20
  96. package/src/route-renderer/README.md +8 -21
  97. package/src/route-renderer/component-graph/component-graph-executor.test.ts +41 -0
  98. package/src/route-renderer/component-graph/component-graph.test.ts +63 -0
  99. package/src/route-renderer/component-graph/component-marker.test.ts +73 -0
  100. package/src/route-renderer/component-graph/component-reference.ts +29 -0
  101. package/src/route-renderer/component-graph/marker-graph-resolver.test.ts +135 -0
  102. package/src/route-renderer/{marker-graph-resolver.ts → component-graph/marker-graph-resolver.ts} +11 -9
  103. package/src/route-renderer/orchestration/integration-renderer.test.ts +936 -0
  104. package/src/route-renderer/{integration-renderer.ts → orchestration/integration-renderer.ts} +113 -19
  105. package/src/route-renderer/orchestration/render-execution.service.test.ts +97 -0
  106. package/src/route-renderer/{render-execution.service.ts → orchestration/render-execution.service.ts} +109 -37
  107. package/src/route-renderer/orchestration/render-preparation.service.test.ts +235 -0
  108. package/src/route-renderer/{render-preparation.service.ts → orchestration/render-preparation.service.ts} +127 -9
  109. package/src/route-renderer/page-loading/dependency-resolver.test.ts +345 -0
  110. package/src/route-renderer/{dependency-resolver.ts → page-loading/dependency-resolver.ts} +28 -12
  111. package/src/route-renderer/page-loading/page-module-loader.test.ts +96 -0
  112. package/src/route-renderer/{page-module-loader.ts → page-loading/page-module-loader.ts} +49 -21
  113. package/src/route-renderer/route-renderer.ts +36 -1
  114. package/src/router/README.md +26 -0
  115. package/src/router/client/link-intent.d.ts +53 -0
  116. package/src/router/client/link-intent.test.browser.ts +51 -0
  117. package/src/router/client/link-intent.ts +92 -0
  118. package/src/router/client/navigation-coordinator.test.ts +237 -0
  119. package/src/router/client/navigation-coordinator.ts +433 -0
  120. package/src/router/server/fs-router-scanner.test.ts +83 -0
  121. package/src/router/{fs-router-scanner.ts → server/fs-router-scanner.ts} +12 -10
  122. package/src/router/server/fs-router.test.ts +214 -0
  123. package/src/router/{fs-router.ts → server/fs-router.ts} +2 -2
  124. package/src/services/README.md +29 -0
  125. package/src/services/assets/asset-processing-service/asset-processing.service.test.ts +385 -0
  126. package/src/services/{asset-processing-service → assets/asset-processing-service}/asset-processing.service.ts +101 -6
  127. package/src/services/assets/asset-processing-service/asset.factory.test.ts +63 -0
  128. package/src/services/{asset-processing-service → assets/asset-processing-service}/asset.factory.ts +2 -2
  129. package/src/services/{asset-processing-service → assets/asset-processing-service}/assets.types.ts +2 -1
  130. package/src/services/assets/asset-processing-service/browser-runtime-asset.factory.test.ts +72 -0
  131. package/src/services/assets/asset-processing-service/browser-runtime-asset.factory.ts +95 -0
  132. package/src/services/assets/asset-processing-service/browser-runtime-entry.factory.test.ts +67 -0
  133. package/src/services/assets/asset-processing-service/browser-runtime-entry.factory.ts +78 -0
  134. package/src/services/{asset-processing-service → assets/asset-processing-service}/index.ts +2 -0
  135. package/src/services/{asset-processing-service → assets/asset-processing-service}/processor.interface.ts +1 -1
  136. package/src/services/assets/asset-processing-service/processors/base/base-processor.test.ts +59 -0
  137. package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/base/base-processor.ts +11 -5
  138. package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/base/base-script-processor.ts +17 -27
  139. package/src/services/assets/asset-processing-service/processors/script/file-script.processor.test.ts +286 -0
  140. package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/script/file-script.processor.ts +3 -3
  141. package/src/services/assets/asset-processing-service/processors/script/node-module-script.processor.test.ts +227 -0
  142. package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/script/node-module-script.processor.ts +5 -4
  143. package/src/services/assets/asset-processing-service/processors/stylesheet/content-stylesheet.processor.test.ts +199 -0
  144. package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/stylesheet/file-stylesheet.processor.ts +4 -1
  145. package/src/services/assets/browser-bundle.service.test.ts +36 -0
  146. package/src/services/assets/browser-bundle.service.ts +53 -0
  147. package/src/services/cache/index.ts +3 -3
  148. package/src/services/cache/memory-cache-store.test.ts +225 -0
  149. package/src/services/cache/memory-cache-store.ts +1 -1
  150. package/src/services/cache/page-cache-service.test.ts +175 -0
  151. package/src/services/cache/page-cache-service.ts +3 -3
  152. package/src/services/cache/page-request-cache-coordinator.service.test.ts +79 -0
  153. package/src/services/{page-request-cache-coordinator.service.ts → cache/page-request-cache-coordinator.service.ts} +9 -6
  154. package/src/services/html/html-rewriter-provider.service.test.ts +183 -0
  155. package/src/services/html/html-rewriter-provider.service.ts +103 -0
  156. package/src/services/html/html-transformer.service.test.ts +378 -0
  157. package/src/services/html/html-transformer.service.ts +279 -0
  158. package/src/services/invalidation/development-invalidation.service.test.ts +77 -0
  159. package/src/services/invalidation/development-invalidation.service.ts +261 -0
  160. package/src/services/module-loading/app-server-module-transpiler.service.ts +52 -0
  161. package/src/services/module-loading/page-module-import.service.test.ts +253 -0
  162. package/src/services/module-loading/page-module-import.service.ts +200 -0
  163. package/src/services/module-loading/server-loader.service.test.ts +161 -0
  164. package/src/services/module-loading/server-loader.service.ts +130 -0
  165. package/src/services/module-loading/server-module-transpiler.service.test.ts +115 -0
  166. package/src/services/module-loading/server-module-transpiler.service.ts +105 -0
  167. package/src/services/runtime-manifest/node-runtime-manifest.service.test.ts +95 -0
  168. package/src/services/runtime-manifest/node-runtime-manifest.service.ts +101 -0
  169. package/src/services/runtime-state/dev-graph.service.ts +217 -0
  170. package/src/services/runtime-state/entrypoint-dependency-graph.service.ts +136 -0
  171. package/src/services/runtime-state/runtime-specifier-registry.service.ts +96 -0
  172. package/src/services/runtime-state/server-invalidation-state.service.ts +68 -0
  173. package/src/services/validation/schema-validation-service.test.ts +223 -0
  174. package/src/services/{schema-validation-service.ts → validation/schema-validation-service.ts} +1 -1
  175. package/src/static-site-generator/README.md +26 -0
  176. package/src/static-site-generator/static-site-generator.test.ts +307 -0
  177. package/src/static-site-generator/static-site-generator.ts +109 -6
  178. package/src/utils/deep-merge.test.ts +114 -0
  179. package/src/utils/invariant.test.ts +22 -0
  180. package/src/utils/path-utils.test.ts +15 -0
  181. package/src/utils/resolve-work-dir.ts +45 -0
  182. package/src/utils/server-utils.test.ts +38 -0
  183. package/src/watchers/project-watcher.integration.test.ts +337 -0
  184. package/src/watchers/project-watcher.test-helpers.ts +1 -1
  185. package/src/watchers/project-watcher.test.ts +678 -0
  186. package/src/watchers/project-watcher.ts +130 -111
  187. package/CHANGELOG.md +0 -91
  188. package/src/adapters/abstract/application-adapter.d.ts +0 -168
  189. package/src/adapters/abstract/application-adapter.js +0 -109
  190. package/src/adapters/abstract/router-adapter.d.ts +0 -26
  191. package/src/adapters/abstract/router-adapter.js +0 -5
  192. package/src/adapters/abstract/server-adapter.d.ts +0 -69
  193. package/src/adapters/abstract/server-adapter.js +0 -15
  194. package/src/adapters/bun/client-bridge.d.ts +0 -34
  195. package/src/adapters/bun/client-bridge.js +0 -48
  196. package/src/adapters/bun/create-app.d.ts +0 -60
  197. package/src/adapters/bun/create-app.js +0 -117
  198. package/src/adapters/bun/define-api-handler.d.ts +0 -61
  199. package/src/adapters/bun/define-api-handler.js +0 -15
  200. package/src/adapters/bun/define-api-handler.ts +0 -114
  201. package/src/adapters/bun/hmr-manager.d.ts +0 -85
  202. package/src/adapters/bun/hmr-manager.js +0 -240
  203. package/src/adapters/bun/index.d.ts +0 -3
  204. package/src/adapters/bun/index.js +0 -8
  205. package/src/adapters/bun/server-adapter.d.ts +0 -155
  206. package/src/adapters/bun/server-adapter.js +0 -368
  207. package/src/adapters/bun/server-lifecycle.d.ts +0 -52
  208. package/src/adapters/bun/server-lifecycle.js +0 -120
  209. package/src/adapters/index.d.ts +0 -6
  210. package/src/adapters/index.js +0 -14
  211. package/src/adapters/node/create-app.d.ts +0 -21
  212. package/src/adapters/node/create-app.js +0 -143
  213. package/src/adapters/node/index.d.ts +0 -4
  214. package/src/adapters/node/index.js +0 -8
  215. package/src/adapters/node/node-client-bridge.d.ts +0 -26
  216. package/src/adapters/node/node-client-bridge.js +0 -66
  217. package/src/adapters/node/node-hmr-manager.d.ts +0 -63
  218. package/src/adapters/node/node-hmr-manager.js +0 -237
  219. package/src/adapters/node/server-adapter.d.ts +0 -190
  220. package/src/adapters/node/server-adapter.js +0 -420
  221. package/src/adapters/node/static-content-server.d.ts +0 -24
  222. package/src/adapters/node/static-content-server.js +0 -166
  223. package/src/adapters/shared/api-response.d.ts +0 -52
  224. package/src/adapters/shared/api-response.js +0 -96
  225. package/src/adapters/shared/application-adapter.d.ts +0 -18
  226. package/src/adapters/shared/application-adapter.js +0 -90
  227. package/src/adapters/shared/explicit-static-route-matcher.d.ts +0 -38
  228. package/src/adapters/shared/explicit-static-route-matcher.js +0 -100
  229. package/src/adapters/shared/file-route-middleware-pipeline.d.ts +0 -65
  230. package/src/adapters/shared/file-route-middleware-pipeline.js +0 -98
  231. package/src/adapters/shared/fs-server-response-factory.d.ts +0 -19
  232. package/src/adapters/shared/fs-server-response-factory.js +0 -97
  233. package/src/adapters/shared/fs-server-response-matcher.d.ts +0 -71
  234. package/src/adapters/shared/fs-server-response-matcher.js +0 -155
  235. package/src/adapters/shared/render-context.d.ts +0 -14
  236. package/src/adapters/shared/render-context.js +0 -69
  237. package/src/adapters/shared/server-adapter.d.ts +0 -87
  238. package/src/adapters/shared/server-adapter.js +0 -353
  239. package/src/adapters/shared/server-route-handler.d.ts +0 -89
  240. package/src/adapters/shared/server-route-handler.js +0 -120
  241. package/src/adapters/shared/server-static-builder.d.ts +0 -38
  242. package/src/adapters/shared/server-static-builder.js +0 -46
  243. package/src/build/build-adapter.d.ts +0 -74
  244. package/src/build/build-adapter.js +0 -54
  245. package/src/build/build-types.d.ts +0 -57
  246. package/src/build/build-types.js +0 -0
  247. package/src/build/esbuild-build-adapter.d.ts +0 -69
  248. package/src/build/esbuild-build-adapter.js +0 -390
  249. package/src/config/config-builder.d.ts +0 -227
  250. package/src/config/config-builder.js +0 -392
  251. package/src/constants.d.ts +0 -32
  252. package/src/constants.js +0 -21
  253. package/src/create-app.d.ts +0 -17
  254. package/src/create-app.js +0 -66
  255. package/src/define-api-handler.d.ts +0 -25
  256. package/src/define-api-handler.js +0 -15
  257. package/src/dev/sc-server.d.ts +0 -30
  258. package/src/dev/sc-server.js +0 -111
  259. package/src/eco/component-render-context.d.ts +0 -105
  260. package/src/eco/component-render-context.js +0 -77
  261. package/src/eco/eco.d.ts +0 -9
  262. package/src/eco/eco.js +0 -110
  263. package/src/eco/eco.types.d.ts +0 -170
  264. package/src/eco/eco.types.js +0 -0
  265. package/src/eco/eco.utils.d.ts +0 -40
  266. package/src/eco/eco.utils.js +0 -40
  267. package/src/eco/global-injector-map.d.ts +0 -16
  268. package/src/eco/global-injector-map.js +0 -80
  269. package/src/eco/lazy-injector-map.d.ts +0 -8
  270. package/src/eco/lazy-injector-map.js +0 -70
  271. package/src/eco/module-dependencies.d.ts +0 -18
  272. package/src/eco/module-dependencies.js +0 -49
  273. package/src/errors/http-error.d.ts +0 -31
  274. package/src/errors/http-error.js +0 -50
  275. package/src/errors/index.d.ts +0 -2
  276. package/src/errors/index.js +0 -4
  277. package/src/errors/locals-access-error.d.ts +0 -4
  278. package/src/errors/locals-access-error.js +0 -9
  279. package/src/global/app-logger.d.ts +0 -2
  280. package/src/global/app-logger.js +0 -6
  281. package/src/hmr/client/hmr-runtime.d.ts +0 -10
  282. package/src/hmr/client/hmr-runtime.js +0 -86
  283. package/src/hmr/hmr-strategy.d.ts +0 -159
  284. package/src/hmr/hmr-strategy.js +0 -29
  285. package/src/hmr/hmr.test.e2e.d.ts +0 -1
  286. package/src/hmr/hmr.test.e2e.js +0 -50
  287. package/src/hmr/strategies/default-hmr-strategy.d.ts +0 -43
  288. package/src/hmr/strategies/default-hmr-strategy.js +0 -34
  289. package/src/hmr/strategies/js-hmr-strategy.d.ts +0 -136
  290. package/src/hmr/strategies/js-hmr-strategy.js +0 -188
  291. package/src/index.browser.d.ts +0 -3
  292. package/src/index.browser.js +0 -4
  293. package/src/index.d.ts +0 -5
  294. package/src/index.js +0 -10
  295. package/src/integrations/ghtml/ghtml-renderer.d.ts +0 -15
  296. package/src/integrations/ghtml/ghtml-renderer.js +0 -60
  297. package/src/integrations/ghtml/ghtml.plugin.d.ts +0 -20
  298. package/src/integrations/ghtml/ghtml.plugin.js +0 -21
  299. package/src/internal-types.d.ts +0 -200
  300. package/src/internal-types.js +0 -0
  301. package/src/plugins/alias-resolver-plugin.d.ts +0 -2
  302. package/src/plugins/alias-resolver-plugin.js +0 -39
  303. package/src/plugins/eco-component-meta-plugin.d.ts +0 -95
  304. package/src/plugins/eco-component-meta-plugin.js +0 -157
  305. package/src/plugins/integration-plugin.d.ts +0 -102
  306. package/src/plugins/integration-plugin.js +0 -100
  307. package/src/plugins/processor.d.ts +0 -82
  308. package/src/plugins/processor.js +0 -122
  309. package/src/public-types.d.ts +0 -1098
  310. package/src/public-types.js +0 -0
  311. package/src/route-renderer/component-graph-executor.d.ts +0 -32
  312. package/src/route-renderer/component-graph-executor.js +0 -31
  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-marker.d.ts +0 -52
  316. package/src/route-renderer/component-marker.js +0 -46
  317. package/src/route-renderer/dependency-resolver.d.ts +0 -24
  318. package/src/route-renderer/dependency-resolver.js +0 -428
  319. package/src/route-renderer/html-post-processing.service.d.ts +0 -40
  320. package/src/route-renderer/html-post-processing.service.js +0 -86
  321. package/src/route-renderer/html-post-processing.service.ts +0 -103
  322. package/src/route-renderer/integration-renderer.d.ts +0 -339
  323. package/src/route-renderer/integration-renderer.js +0 -526
  324. package/src/route-renderer/marker-graph-resolver.d.ts +0 -76
  325. package/src/route-renderer/marker-graph-resolver.js +0 -93
  326. package/src/route-renderer/page-module-loader.d.ts +0 -61
  327. package/src/route-renderer/page-module-loader.js +0 -102
  328. package/src/route-renderer/render-execution.service.d.ts +0 -69
  329. package/src/route-renderer/render-execution.service.js +0 -91
  330. package/src/route-renderer/render-preparation.service.d.ts +0 -112
  331. package/src/route-renderer/render-preparation.service.js +0 -243
  332. package/src/route-renderer/route-renderer.d.ts +0 -26
  333. package/src/route-renderer/route-renderer.js +0 -68
  334. package/src/router/fs-router-scanner.d.ts +0 -41
  335. package/src/router/fs-router-scanner.js +0 -155
  336. package/src/router/fs-router.d.ts +0 -26
  337. package/src/router/fs-router.js +0 -100
  338. package/src/services/asset-processing-service/asset-processing.service.d.ts +0 -41
  339. package/src/services/asset-processing-service/asset-processing.service.js +0 -250
  340. package/src/services/asset-processing-service/asset.factory.d.ts +0 -17
  341. package/src/services/asset-processing-service/asset.factory.js +0 -82
  342. package/src/services/asset-processing-service/assets.types.d.ts +0 -88
  343. package/src/services/asset-processing-service/assets.types.js +0 -0
  344. package/src/services/asset-processing-service/index.d.ts +0 -3
  345. package/src/services/asset-processing-service/index.js +0 -3
  346. package/src/services/asset-processing-service/processor.interface.d.ts +0 -22
  347. package/src/services/asset-processing-service/processor.interface.js +0 -6
  348. package/src/services/asset-processing-service/processor.registry.d.ts +0 -8
  349. package/src/services/asset-processing-service/processor.registry.js +0 -15
  350. package/src/services/asset-processing-service/processors/base/base-processor.d.ts +0 -24
  351. package/src/services/asset-processing-service/processors/base/base-processor.js +0 -59
  352. package/src/services/asset-processing-service/processors/base/base-script-processor.d.ts +0 -16
  353. package/src/services/asset-processing-service/processors/base/base-script-processor.js +0 -80
  354. package/src/services/asset-processing-service/processors/index.d.ts +0 -5
  355. package/src/services/asset-processing-service/processors/index.js +0 -5
  356. package/src/services/asset-processing-service/processors/script/content-script.processor.d.ts +0 -5
  357. package/src/services/asset-processing-service/processors/script/content-script.processor.js +0 -57
  358. package/src/services/asset-processing-service/processors/script/file-script.processor.d.ts +0 -8
  359. package/src/services/asset-processing-service/processors/script/file-script.processor.js +0 -76
  360. package/src/services/asset-processing-service/processors/script/node-module-script.processor.d.ts +0 -7
  361. package/src/services/asset-processing-service/processors/script/node-module-script.processor.js +0 -74
  362. package/src/services/asset-processing-service/processors/stylesheet/content-stylesheet.processor.d.ts +0 -5
  363. package/src/services/asset-processing-service/processors/stylesheet/content-stylesheet.processor.js +0 -25
  364. package/src/services/asset-processing-service/processors/stylesheet/file-stylesheet.processor.d.ts +0 -9
  365. package/src/services/asset-processing-service/processors/stylesheet/file-stylesheet.processor.js +0 -63
  366. package/src/services/cache/cache.types.d.ts +0 -107
  367. package/src/services/cache/cache.types.js +0 -0
  368. package/src/services/cache/index.d.ts +0 -7
  369. package/src/services/cache/index.js +0 -7
  370. package/src/services/cache/memory-cache-store.d.ts +0 -42
  371. package/src/services/cache/memory-cache-store.js +0 -98
  372. package/src/services/cache/page-cache-service.d.ts +0 -70
  373. package/src/services/cache/page-cache-service.js +0 -152
  374. package/src/services/html-transformer.service.d.ts +0 -50
  375. package/src/services/html-transformer.service.js +0 -163
  376. package/src/services/html-transformer.service.ts +0 -217
  377. package/src/services/page-module-import.service.d.ts +0 -37
  378. package/src/services/page-module-import.service.js +0 -88
  379. package/src/services/page-module-import.service.ts +0 -129
  380. package/src/services/page-request-cache-coordinator.service.d.ts +0 -75
  381. package/src/services/page-request-cache-coordinator.service.js +0 -107
  382. package/src/services/schema-validation-service.d.ts +0 -122
  383. package/src/services/schema-validation-service.js +0 -101
  384. package/src/services/validation/standard-schema.types.d.ts +0 -65
  385. package/src/services/validation/standard-schema.types.js +0 -0
  386. package/src/static-site-generator/static-site-generator.d.ts +0 -57
  387. package/src/static-site-generator/static-site-generator.js +0 -272
  388. package/src/utils/css.d.ts +0 -1
  389. package/src/utils/css.js +0 -7
  390. package/src/utils/deep-merge.d.ts +0 -14
  391. package/src/utils/deep-merge.js +0 -32
  392. package/src/utils/hash.d.ts +0 -1
  393. package/src/utils/hash.js +0 -7
  394. package/src/utils/html.d.ts +0 -1
  395. package/src/utils/html.js +0 -4
  396. package/src/utils/invariant.d.ts +0 -5
  397. package/src/utils/invariant.js +0 -11
  398. package/src/utils/locals-utils.d.ts +0 -15
  399. package/src/utils/locals-utils.js +0 -24
  400. package/src/utils/parse-cli-args.d.ts +0 -24
  401. package/src/utils/parse-cli-args.js +0 -47
  402. package/src/utils/path-utils.module.d.ts +0 -5
  403. package/src/utils/path-utils.module.js +0 -14
  404. package/src/utils/runtime.d.ts +0 -11
  405. package/src/utils/runtime.js +0 -40
  406. package/src/utils/server-utils.module.d.ts +0 -19
  407. package/src/utils/server-utils.module.js +0 -56
  408. package/src/watchers/project-watcher.d.ts +0 -125
  409. package/src/watchers/project-watcher.js +0 -265
  410. package/src/watchers/project-watcher.test-helpers.d.ts +0 -4
  411. package/src/watchers/project-watcher.test-helpers.js +0 -52
  412. /package/src/route-renderer/{component-graph-executor.ts → component-graph/component-graph-executor.ts} +0 -0
  413. /package/src/route-renderer/{component-graph.ts → component-graph/component-graph.ts} +0 -0
  414. /package/src/route-renderer/{component-marker.ts → component-graph/component-marker.ts} +0 -0
  415. /package/src/services/{asset-processing-service → assets/asset-processing-service}/processor.registry.ts +0 -0
  416. /package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/index.ts +0 -0
  417. /package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/script/content-script.processor.ts +0 -0
  418. /package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/stylesheet/content-stylesheet.processor.ts +0 -0
@@ -3,7 +3,8 @@ import chokidar, { type FSWatcher } from 'chokidar';
3
3
  import { fileSystem } from '@ecopages/file-system';
4
4
  import { appLogger } from '../global/app-logger.ts';
5
5
  import type { EcoPagesAppConfig, IHmrManager, IClientBridge } from '../internal-types.ts';
6
- import type { ProcessorWatchContext } from '../plugins/processor.ts';
6
+ import type { ProcessorWatchConfig, ProcessorWatchContext } from '../plugins/processor.ts';
7
+ import { DevelopmentInvalidationService } from '../services/invalidation/development-invalidation.service.ts';
7
8
 
8
9
  /**
9
10
  * Configuration options for the ProjectWatcher
@@ -48,14 +49,17 @@ export class ProjectWatcher {
48
49
  private refreshRouterRoutesCallback: () => void;
49
50
  private hmrManager: IHmrManager;
50
51
  private bridge: IClientBridge;
52
+ private readonly invalidationService: DevelopmentInvalidationService;
51
53
  private watcher: FSWatcher | null = null;
52
54
  private lastHandledChange = new Map<string, number>();
55
+ private changeQueue: Promise<void> = Promise.resolve();
53
56
 
54
57
  constructor({ config, refreshRouterRoutesCallback, hmrManager, bridge }: ProjectWatcherConfig) {
55
58
  this.appConfig = config;
56
59
  this.refreshRouterRoutesCallback = refreshRouterRoutesCallback;
57
60
  this.hmrManager = hmrManager;
58
61
  this.bridge = bridge;
62
+ this.invalidationService = new DevelopmentInvalidationService(config);
59
63
  this.triggerRouterRefresh = this.triggerRouterRefresh.bind(this);
60
64
  this.handleError = this.handleError.bind(this);
61
65
  this.handleFileChange = this.handleFileChange.bind(this);
@@ -79,6 +83,14 @@ export class ProjectWatcher {
79
83
  }
80
84
  }
81
85
 
86
+ private isRouteSourceFile(filePath: string): boolean {
87
+ return this.invalidationService.isRouteSourceFile(filePath);
88
+ }
89
+
90
+ private isIncludeSourceFile(filePath: string): boolean {
91
+ return this.invalidationService.isIncludeSourceFile(filePath);
92
+ }
93
+
82
94
  /**
83
95
  * Handles public directory file changes by copying only the changed file.
84
96
  * @param filePath - Absolute path of the changed file
@@ -101,19 +113,34 @@ export class ProjectWatcher {
101
113
  }
102
114
  }
103
115
 
116
+ /**
117
+ * Serializes file change handling so that concurrent chokidar events are
118
+ * processed one at a time, preventing overlapping builds and race conditions.
119
+ */
120
+ private enqueueChange(task: () => Promise<void>): void {
121
+ const queuedTask = this.changeQueue.then(task, task);
122
+ this.changeQueue = queuedTask.catch(() => undefined);
123
+ }
124
+
104
125
  /**
105
126
  * Handles file changes by uncaching modules, refreshing routes, and delegating appropriately.
106
- * Follows 4-rule priority:
107
- * 0. Public directory match? copy file and reload
108
- * 1. additionalWatchPaths match? reload
109
- * 2. Processor extension match? processor handles (skip HMR)
110
- * 3. Otherwise HMR strategies
127
+ * Follows 5-rule priority:
128
+ * 0. Public directory match? -> copy file and reload
129
+ * 1. additionalWatchPaths match? -> reload
130
+ * 2. Include template source? -> reload after processor notifications
131
+ * 3. Processor-owned asset? -> processor already handled it via notification, skip HMR
132
+ * 4. Otherwise -> HMR strategies
133
+ *
134
+ * Processors that watch a file extension as a dependency (e.g. PostCSS watching
135
+ * .tsx for Tailwind class scanning) are always notified first, but do not
136
+ * prevent the file from flowing through the normal HMR strategy pipeline.
111
137
  *
112
138
  * Duplicate identical watcher events for the same file are coalesced within a
113
139
  * short window before any of the priority rules run.
114
140
  * @param rawPath - Path of the changed file
141
+ * @param event - The type of file system event
115
142
  */
116
- private async handleFileChange(rawPath: string): Promise<void> {
143
+ private async handleFileChange(rawPath: string, event: 'change' | 'add' | 'unlink' = 'change'): Promise<void> {
117
144
  const filePath = path.resolve(rawPath);
118
145
  const now = Date.now();
119
146
  const lastHandledAt = this.lastHandledChange.get(filePath);
@@ -123,33 +150,41 @@ export class ProjectWatcher {
123
150
  this.lastHandledChange.set(filePath, now);
124
151
 
125
152
  try {
126
- if (this.isPublicDirFile(filePath)) {
153
+ const plan = this.invalidationService.planFileChange(filePath);
154
+
155
+ if (plan.category === 'public-asset') {
127
156
  await this.handlePublicDirFileChange(filePath);
128
157
  return;
129
158
  }
130
159
 
131
160
  this.uncacheModules();
132
- const isPageFile = filePath.startsWith(this.appConfig.absolutePaths.pagesDir);
161
+ if (plan.invalidateServerModules) {
162
+ this.invalidationService.invalidateServerModules([filePath]);
163
+ }
133
164
 
134
- if (isPageFile) {
165
+ if (plan.refreshRoutes) {
135
166
  this.refreshRouterRoutesCallback();
136
167
  }
137
168
 
138
- if (this.matchesAdditionalWatchPaths(filePath)) {
169
+ if (plan.category === 'additional-watch') {
139
170
  this.bridge.reload();
140
171
  return;
141
172
  }
142
173
 
143
- if (this.isHandledByProcessor(filePath)) {
174
+ await this.notifyProcessors(filePath, event);
175
+
176
+ if (plan.category === 'include-source') {
177
+ this.bridge.reload();
144
178
  return;
145
179
  }
146
180
 
147
- if (this.isWatchedByProcessor(filePath) && !this.hmrManager.canHandleFileChange(filePath)) {
148
- this.hmrManager.broadcast({ type: 'layout-update' });
181
+ if (plan.processorHandledAsset) {
149
182
  return;
150
183
  }
151
184
 
152
- await this.hmrManager.handleFileChange(filePath);
185
+ if (plan.delegateToHmr) {
186
+ await this.hmrManager.handleFileChange(filePath);
187
+ }
153
188
  } catch (error) {
154
189
  if (error instanceof Error) {
155
190
  this.bridge.error(error.message);
@@ -159,78 +194,65 @@ export class ProjectWatcher {
159
194
  }
160
195
 
161
196
  /**
162
- * Checks if a file is in the public directory.
163
- */
164
- private isPublicDirFile(filePath: string): boolean {
165
- return filePath.startsWith(this.appConfig.absolutePaths.publicDir);
166
- }
167
-
168
- /**
169
- * Checks if file path matches any additionalWatchPaths patterns.
197
+ * Notifies all processors whose watch config matches the given file extension.
198
+ * This is called before checking processor ownership so that dependency-only
199
+ * processors (e.g. PostCSS watching .tsx for class scanning) receive their
200
+ * notifications regardless of whether they own the file.
170
201
  */
171
- private matchesAdditionalWatchPaths(filePath: string): boolean {
172
- const patterns = this.appConfig.additionalWatchPaths;
173
- if (!patterns.length) return false;
174
-
175
- for (const pattern of patterns) {
176
- if (pattern.includes('*')) {
177
- const ext = pattern.replace(/\*\*?\/\*/, '');
178
- if (filePath.endsWith(ext)) return true;
179
- } else {
180
- if (filePath.endsWith(pattern) || filePath === path.resolve(pattern)) return true;
181
- }
182
- }
183
- return false;
184
- }
202
+ private async notifyProcessors(filePath: string, event: 'change' | 'add' | 'unlink'): Promise<void> {
203
+ const ctx: ProcessorWatchContext = { path: filePath, bridge: this.bridge };
185
204
 
186
- /**
187
- * Checks whether a file is watched by any processor, even if that processor
188
- * does not own the file as a primary asset.
189
- */
190
- private isWatchedByProcessor(filePath: string): boolean {
191
205
  for (const processor of this.appConfig.processors.values()) {
192
206
  const watchConfig = processor.getWatchConfig();
193
207
  if (!watchConfig) continue;
194
208
 
195
209
  const { extensions = [] } = watchConfig;
196
- if (extensions.length && extensions.some((ext) => filePath.endsWith(ext))) {
197
- return true;
210
+ if (extensions.length && !extensions.some((ext) => filePath.endsWith(ext))) {
211
+ continue;
212
+ }
213
+
214
+ const handler = this.getProcessorHandler(watchConfig, event);
215
+ if (handler) {
216
+ await handler(ctx);
198
217
  }
199
218
  }
219
+ }
200
220
 
201
- return false;
221
+ private getProcessorHandler(
222
+ watchConfig: ProcessorWatchConfig,
223
+ event: 'change' | 'add' | 'unlink',
224
+ ): ((ctx: ProcessorWatchContext) => Promise<void>) | undefined {
225
+ switch (event) {
226
+ case 'change':
227
+ return watchConfig.onChange;
228
+ case 'add':
229
+ return watchConfig.onCreate;
230
+ case 'unlink':
231
+ return watchConfig.onDelete;
232
+ }
202
233
  }
203
234
 
204
235
  /**
205
- * Checks if a file is handled by a processor.
206
- * Processors that declare extensions own those file types.
236
+ * Checks if a file is in the public directory.
207
237
  */
208
- private isHandledByProcessor(filePath: string): boolean {
209
- for (const processor of this.appConfig.processors.values()) {
210
- const capabilities = processor.getAssetCapabilities?.() ?? [];
211
- if (capabilities.length > 0) {
212
- const matchesConfiguredAsset =
213
- typeof processor.matchesFileFilter !== 'function' || processor.matchesFileFilter(filePath);
214
-
215
- if (
216
- matchesConfiguredAsset &&
217
- capabilities.some((capability) => processor.canProcessAsset?.(capability.kind, filePath))
218
- ) {
219
- return true;
220
- }
221
-
222
- continue;
223
- }
238
+ private isPublicDirFile(filePath: string): boolean {
239
+ return this.invalidationService.isPublicDirFile(filePath);
240
+ }
224
241
 
225
- const watchConfig = processor.getWatchConfig();
226
- if (!watchConfig) continue;
242
+ /**
243
+ * Checks if file path matches any additionalWatchPaths patterns.
244
+ */
245
+ private matchesAdditionalWatchPaths(filePath: string): boolean {
246
+ return this.invalidationService.matchesAdditionalWatchPaths(filePath);
247
+ }
227
248
 
228
- const { extensions = [] } = watchConfig;
229
- if (extensions.length && extensions.some((ext) => filePath.endsWith(ext))) {
230
- return true;
231
- }
232
- }
233
- return false;
249
+ /**
250
+ * Checks if a file is handled by a processor.
251
+ * Processors that declare asset capabilities own those file types.
252
+ * Processors without capabilities fall back to checking watch extensions.
253
+ */
254
+ private isHandledByProcessor(filePath: string): boolean {
255
+ return this.invalidationService.isProcessorOwnedAsset(filePath);
234
256
  }
235
257
 
236
258
  /**
@@ -239,9 +261,12 @@ export class ProjectWatcher {
239
261
  *
240
262
  * @param {string} path - Path of the changed directory
241
263
  */
242
- triggerRouterRefresh(path: string) {
243
- const isPageDir = path.startsWith(this.appConfig.absolutePaths.pagesDir);
244
- if (isPageDir) {
264
+ triggerRouterRefresh(changedPath: string) {
265
+ const resolvedPath = path.resolve(changedPath);
266
+ const isPageDir =
267
+ resolvedPath.startsWith(this.appConfig.absolutePaths.pagesDir) && path.extname(resolvedPath) === '';
268
+
269
+ if (isPageDir || this.isRouteSourceFile(resolvedPath)) {
245
270
  this.refreshRouterRoutesCallback();
246
271
  }
247
272
  }
@@ -258,28 +283,15 @@ export class ProjectWatcher {
258
283
  appLogger.error(`Watcher error: ${error}`);
259
284
  }
260
285
 
261
- /**
262
- * Processes file changes for specific file extensions.
263
- * Used by processors to handle their specific file types.
264
- *
265
- * @private
266
- * @param {string} path - Path of the changed file
267
- * @param {string[]} extensions - File extensions to process
268
- * @param {(ctx: ProcessorWatchContext) => void} handler - Handler function for the file change
269
- */
270
- private shouldProcess(path: string, extensions: string[], handler: (ctx: ProcessorWatchContext) => void) {
271
- if (!extensions.length || extensions.some((ext) => path.endsWith(ext))) {
272
- handler({ path, bridge: this.bridge });
273
- }
274
- }
275
-
276
286
  /**
277
287
  * Creates and configures the file system watcher.
278
288
  * This sets up:
279
- * 1. Processor-specific file watching
280
- * 2. Page file watching
281
- * 3. Directory watching
282
- * 4. Error handling
289
+ * 1. Page file watching
290
+ * 2. Directory watching
291
+ * 3. Error handling
292
+ *
293
+ * Processor notifications are dispatched inside handleFileChange, ensuring
294
+ * a single unified event pipeline with no parallel chokidar bindings.
283
295
  *
284
296
  * Uses chokidar's built-in debouncing through `awaitWriteFinish` to handle
285
297
  * rapid file changes efficiently.
@@ -293,6 +305,14 @@ export class ProjectWatcher {
293
305
  processorPaths.push(...watchConfig.paths);
294
306
  }
295
307
 
308
+ if (fileSystem.exists(this.appConfig.absolutePaths.includesDir)) {
309
+ processorPaths.push(this.appConfig.absolutePaths.includesDir);
310
+ }
311
+
312
+ if (fileSystem.exists(this.appConfig.absolutePaths.srcDir)) {
313
+ processorPaths.push(this.appConfig.absolutePaths.srcDir);
314
+ }
315
+
296
316
  if (fileSystem.exists(this.appConfig.absolutePaths.pagesDir)) {
297
317
  processorPaths.push(this.appConfig.absolutePaths.pagesDir);
298
318
  }
@@ -315,30 +335,29 @@ export class ProjectWatcher {
315
335
  });
316
336
  }
317
337
 
318
- for (const processor of this.appConfig.processors.values()) {
319
- const watchConfig = processor.getWatchConfig();
320
- if (!watchConfig) continue;
321
- const { extensions = [], onCreate, onChange, onDelete, onError } = watchConfig;
322
-
323
- if (onCreate) this.watcher.on('add', (path) => this.shouldProcess(path, extensions, onCreate));
324
- if (onChange) this.watcher.on('change', (path) => this.shouldProcess(path, extensions, onChange));
325
- if (onDelete) this.watcher.on('unlink', (path) => this.shouldProcess(path, extensions, onDelete));
326
- if (onError) this.watcher.on('error', onError as (error: unknown) => void);
327
- }
328
-
329
338
  this.watcher.add(this.appConfig.absolutePaths.srcDir);
330
339
 
331
340
  this.watcher
332
- .on('change', (path) => this.handleFileChange(path))
333
- .on('add', (path) => {
334
- this.handleFileChange(path);
335
- this.triggerRouterRefresh(path);
341
+ .on('change', (p) => this.enqueueChange(() => this.handleFileChange(p, 'change')))
342
+ .on('add', (p) => {
343
+ this.enqueueChange(() => this.handleFileChange(p, 'add'));
344
+ this.triggerRouterRefresh(p);
345
+ })
346
+ .on('addDir', (p) => this.triggerRouterRefresh(p))
347
+ .on('unlink', (p) => {
348
+ this.enqueueChange(() => this.handleFileChange(p, 'unlink'));
349
+ this.triggerRouterRefresh(p);
336
350
  })
337
- .on('addDir', (path) => this.triggerRouterRefresh(path))
338
- .on('unlink', (path) => this.triggerRouterRefresh(path))
339
- .on('unlinkDir', (path) => this.triggerRouterRefresh(path))
351
+ .on('unlinkDir', (p) => this.triggerRouterRefresh(p))
340
352
  .on('error', (error) => this.handleError(error));
341
353
 
354
+ for (const processor of this.appConfig.processors.values()) {
355
+ const watchConfig = processor.getWatchConfig();
356
+ if (watchConfig?.onError) {
357
+ this.watcher.on('error', watchConfig.onError as (error: unknown) => void);
358
+ }
359
+ }
360
+
342
361
  return this.watcher;
343
362
  }
344
363
  }
package/CHANGELOG.md DELETED
@@ -1,91 +0,0 @@
1
- # Changelog
2
-
3
- All notable changes to `@ecopages/core` are documented here.
4
-
5
- > **Note:** Changelog tracking begins at version `0.2.0`. Changes prior to this release are not recorded here but are available in the git history.
6
-
7
- ## [UNRELEASED] — TBD
8
-
9
- ### Features
10
-
11
- #### Node.js Runtime Support
12
-
13
- - **Node server adapter** — Full HTTP server adapter for Node.js via `packages/core/src/adapters/node/`, including request bridging, route handling, static content serving, and graceful shutdown.
14
- - **Node static build pipeline** — Static-site build and preview server for Node.js runtime (`ab22f167`, `a47b4da3`, `435dc250`).
15
- - **Node API handler pipeline** — `define-api-handler` now works cross-runtime; Node adapter wires API handler execution end-to-end (`73e57d87`, `f46aa528`).
16
- - **Node client bridge** — `NodeClientBridge` with SSE-based HMR stream and heartbeat mechanism for connection health (`3361445f`).
17
- - **Node HMR manager** — `NodeHmrManager` that mirrors Bun HMR capabilities on the Node runtime.
18
- - **`createApp` universal factory** — Top-level `createApp` export that selects the correct adapter (Bun or Node) at runtime (`ce691bdf`, `2f1b1109`).
19
-
20
- #### Build System
21
-
22
- - **`EsbuildBuildAdapter`** — A new build backend backed by esbuild, replacing the Bun-only transpilation path. Includes module resolution routing, plugin registration, and transpilation defaults (`f503e86e`, `94c37d38`, `e4e124a1`).
23
- - **Build dependency graph** — `BuildDependencyGraph` interface for tracking entrypoints and their asset dependencies, enabling more accurate HMR invalidation (`e7653c9b`).
24
- - **Build adapter abstraction** — `build-adapter.ts` and `build-types.ts` decouple build and plugin contracts from Bun-specific types (`11b03bcc`).
25
-
26
- #### Rendering & Orchestration
27
-
28
- - **Boundary rendering policy** — Cross-integration component boundaries are now explicitly enforced (`ec1e4d66`).
29
- - **Full orchestration mode** — Legacy rendering mode branches removed; the engine always runs in unified orchestration mode (`f652fa0a`).
30
- - **Extracted render services** — The render pipeline is decomposed into focused services:
31
- - `RenderExecutionService`
32
- - `HtmlPostProcessingService`
33
- - `RenderPreparationService`
34
- - `MarkerGraphResolver`
35
- - `FileRouteMiddlewarePipeline`
36
- - `PageRequestCacheCoordinator`
37
- - `PageModuleImportService`
38
- - **Component render context** — New `ComponentRenderContext` consolidates component-level state during rendering (`eco/component-render-context.ts`).
39
- - **Worker-tools HTML rewriter fallback** — `html-transformer` adopts `@worker-tools/html-rewriter` as a fallback for non-Bun environments (`54056d4f`).
40
-
41
- #### Dependency & Injection
42
-
43
- - **Global injector map** — `GlobalInjectorMap` and `LazyInjectorMap` provide structured, testable dependency injection for global and lazy assets (`c3a25072`).
44
- - **Lazy dependency resolution** — SSR lazy script resolution now uses dedicated utility functions for dependency entry attributes and content generation (`71ce2f4f`).
45
- - **Dependency entry type refactor** — Unified types for script and stylesheet dependency entries, with improved error messages (`1e02dba6`).
46
- - **Module dependencies** — New `module-dependencies.ts` tracks explicit module-level asset relationships.
47
- - **Eco utils extraction** — Shared utilities moved to `eco.utils.ts` to remove runtime metadata fallbacks (`bdc60d50`).
48
-
49
- #### API Handlers
50
-
51
- - **Unified typed API handler context** — `defineApiHandler` now exposes a fully typed, runtime-agnostic context object. The Bun-specific adapter is slimmed down to a thin wrapper (`2f1b1109`, `08e194b4`).
52
- - **Portable root runtime API** — Core exposes a portable API surface that avoids runtime escape hatches (`ce691bdf`, `1ec42c02`).
53
-
54
- ### Refactoring
55
-
56
- - **Bun adapter isolation** — Bun-specific types (`serve` options, file reads, env access, argv/hash helpers) are routed through dedicated helpers, making the remaining adapter code portable (`73668f52`, `0c90ced1`, `73fb904a`, `5eb0957b`, `4bdc74a9`, `e9ce163c`, `22f9de4a`, `f7b3d95e`).
57
- - **Shared server adapter** — Common server adapter logic extracted to `adapters/shared/application-adapter.ts` and `adapters/shared/server-adapter.ts`, shared between Bun and Node adapters (`5a872eda`).
58
- - **Route assets isolation** — Route-level assets are now isolated per-request, hardening dependency processing (`3fd76a12`).
59
- - **Shared matcher error constants** — Matcher error strings are now constants shared across test and source (`ff4db106`).
60
- - **App registration & fetch pipeline** — App creation and request handling consolidated into a single unified pipeline (`86e20a3d`).
61
- - **Adapter escape hatch surface** trimmed — Public adapter API is narrowed to reduce surface area (`1ec42c02`).
62
-
63
- ### Bug Fixes
64
-
65
- - Fixed invariant checks for route paths with improved error messaging in `AbstractApplicationAdapter` (`9c2a6242`).
66
- - Fixed dependency import name extraction in `extractEcopagesVirtualImports` (`39bbc472`).
67
- - Removed an invalid npm export entry that pointed to a non-existent `utils/ecopages-url-resolver` declaration target.
68
- - Kept source module HMR active when stylesheet processors also watch TSX and JSX files for Tailwind-driven CSS rebuilds.
69
- - Triggered HMR current-page refreshes instead of fallback reload suppression for processor-watched TSX and JSX changes that are not client entrypoints.
70
-
71
- ### Tests
72
-
73
- - Added node static content server test coverage (`435dc250`).
74
- - Strengthened HTML transformer mode matrix coverage (`286c1253`).
75
- - Aligned integration and dependency processing tests to new orchestration model (`7cc73316`).
76
- - Added `EsbuildBuildAdapter` test suite with 500+ lines (`build-adapter.test.ts`).
77
- - Added `file-route-middleware-pipeline` tests.
78
-
79
- ### Documentation
80
-
81
- - Updated rendering graph documentation to cover extracted rendering services (`8bfcfd21`).
82
- - Refreshed server handler and module dependency guidance (`3494f44d`).
83
-
84
- ---
85
-
86
- ## Migration Notes
87
-
88
- - **`createApp`** is now the recommended entrypoint (previously `EcopagesApp`). Import from `@ecopages/core`.
89
- - **`defineApiHandler`** signature is unchanged but the handler context object now carries explicit runtime-agnostic types. No breaking changes for existing handlers.
90
- - Bun adapter still works as before; the new Node adapter is additive.
91
- - The old explicit `renderingMode` config option has been removed — full orchestration is always active.
@@ -1,168 +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
- import type { EcoPagesAppConfig } from '../../internal-types.js';
10
- import type { ApiHandler, ApiHandlerContext, ErrorHandler, Middleware, RouteOptions, StaticRoute, ViewLoader } from '../../public-types.js';
11
- import { type ReturnParseCliArgs } from '../../utils/parse-cli-args.js';
12
- /**
13
- * Configuration options for application adapters
14
- */
15
- export interface ApplicationAdapterOptions {
16
- appConfig: EcoPagesAppConfig;
17
- serverOptions?: Record<string, any>;
18
- /**
19
- * Options for clearing the output directory before starting the server
20
- * @default false
21
- */
22
- clearOutput?: boolean;
23
- }
24
- /**
25
- * Common interface for application adapters
26
- */
27
- export interface ApplicationAdapter<T = any> {
28
- start(): Promise<T | void>;
29
- }
30
- /**
31
- * Handler function type for route handlers
32
- */
33
- export type RouteHandler<TRequest extends Request = Request, TServer = any, TContext extends ApiHandlerContext<TRequest, TServer> = ApiHandlerContext<TRequest, TServer>> = (context: TContext) => Promise<Response> | Response;
34
- export type RouteGroupDefinition<TRequest extends Request = Request, TServer = any> = {
35
- prefix: string;
36
- middleware?: readonly Middleware<TRequest, TServer, any>[];
37
- routes: readonly ApiHandler<string, TRequest, TServer>[];
38
- };
39
- /**
40
- * Abstract base class for application adapters across different runtimes
41
- */
42
- export declare abstract class AbstractApplicationAdapter<TOptions extends ApplicationAdapterOptions = ApplicationAdapterOptions, TServer = any, TRequest extends Request = any> implements ApplicationAdapter<TServer> {
43
- protected appConfig: EcoPagesAppConfig;
44
- protected serverOptions: Record<string, any>;
45
- protected cliArgs: ReturnParseCliArgs;
46
- protected apiHandlers: ApiHandler[];
47
- protected staticRoutes: StaticRoute[];
48
- protected errorHandler?: ErrorHandler;
49
- constructor(options: TOptions);
50
- private clearDistFolder;
51
- /**
52
- * Register a GET route handler.
53
- *
54
- * Use verb methods for inline route definitions.
55
- * For dynamic HTTP method registration, use `route(...)`.
56
- */
57
- abstract get<P extends string, TContext extends ApiHandlerContext<TRequest, TServer> = ApiHandlerContext<TRequest, TServer>>(path: P, handler: RouteHandler<TRequest, TServer, TContext>, options?: RouteOptions<TRequest, TServer, TContext>): this;
58
- /**
59
- * Register a POST route handler
60
- */
61
- abstract post<P extends string, TContext extends ApiHandlerContext<TRequest, TServer> = ApiHandlerContext<TRequest, TServer>>(path: P, handler: RouteHandler<TRequest, TServer, TContext>, options?: RouteOptions<TRequest, TServer, TContext>): this;
62
- /**
63
- * Register a PUT route handler
64
- */
65
- abstract put<P extends string, TContext extends ApiHandlerContext<TRequest, TServer> = ApiHandlerContext<TRequest, TServer>>(path: P, handler: RouteHandler<TRequest, TServer, TContext>, options?: RouteOptions<TRequest, TServer, TContext>): this;
66
- /**
67
- * Register a DELETE route handler
68
- */
69
- abstract delete<P extends string, TContext extends ApiHandlerContext<TRequest, TServer> = ApiHandlerContext<TRequest, TServer>>(path: P, handler: RouteHandler<TRequest, TServer, TContext>, options?: RouteOptions<TRequest, TServer, TContext>): this;
70
- /**
71
- * Register a PATCH route handler
72
- */
73
- abstract patch<P extends string, TContext extends ApiHandlerContext<TRequest, TServer> = ApiHandlerContext<TRequest, TServer>>(path: P, handler: RouteHandler<TRequest, TServer, TContext>, options?: RouteOptions<TRequest, TServer, TContext>): this;
74
- /**
75
- * Register an OPTIONS route handler
76
- */
77
- abstract options<P extends string, TContext extends ApiHandlerContext<TRequest, TServer> = ApiHandlerContext<TRequest, TServer>>(path: P, handler: RouteHandler<TRequest, TServer, TContext>, options?: RouteOptions<TRequest, TServer, TContext>): this;
78
- /**
79
- * Register a HEAD route handler
80
- */
81
- abstract head<P extends string, TContext extends ApiHandlerContext<TRequest, TServer> = ApiHandlerContext<TRequest, TServer>>(path: P, handler: RouteHandler<TRequest, TServer, TContext>, options?: RouteOptions<TRequest, TServer, TContext>): this;
82
- /**
83
- * Register a route with an explicit HTTP method.
84
- *
85
- * This is useful when the method is determined programmatically, or when
86
- * registering a pre-built route declaration object by forwarding its
87
- * `path`, `method`, and `handler` fields.
88
- */
89
- abstract route<P extends string>(path: P, method: ApiHandler['method'], handler: RouteHandler<TRequest, TServer>, options?: RouteOptions<TRequest, TServer>): this;
90
- /**
91
- * Register a pre-built API handler declaration.
92
- */
93
- abstract add(handler: ApiHandler<string, TRequest, TServer>): this;
94
- /**
95
- * Internal method to add route handlers to the API handlers array
96
- */
97
- protected addRouteHandler<P extends string, TSpecRequest extends TRequest = TRequest, TSpecServer extends TServer = TServer, TContext extends ApiHandlerContext<TSpecRequest, TSpecServer> = ApiHandlerContext<TSpecRequest, TSpecServer>>(path: P, method: ApiHandler['method'], handler: RouteHandler<TSpecRequest, TSpecServer, TContext>, middleware?: Middleware<TSpecRequest, TSpecServer, TContext>[], schema?: ApiHandler['schema']): this;
98
- /**
99
- * Create a route group with shared prefix and middleware.
100
- * Routes defined within the group inherit the prefix and middleware.
101
- *
102
- * Each adapter implements this with its own builder type to support
103
- * runtime-specific features (e.g., Bun's path parameter inference).
104
- * Implementations may also support passing a pre-built group object.
105
- *
106
- * @param prefix - URL prefix for all routes in the group (e.g., '/api/v1')
107
- * @param callback - Function that receives a builder to define routes
108
- * @param options - Optional group-level middleware
109
- */
110
- abstract group(prefix: string, callback: (builder: unknown) => void, options?: {
111
- middleware?: readonly Middleware<TRequest, TServer, any>[];
112
- }): this;
113
- abstract group(group: RouteGroupDefinition<TRequest, TServer>): this;
114
- /**
115
- * Get all registered API handlers
116
- */
117
- getApiHandlers(): ApiHandler[];
118
- /**
119
- * Register a view for static generation at build time.
120
- * The view must have staticPaths defined for dynamic routes.
121
- *
122
- * Uses a loader function to enable HMR in development.
123
- *
124
- * @param path - URL path pattern (e.g., '/posts/:slug')
125
- * @param loader - A function that dynamically imports the eco.page view module
126
- * @example
127
- * ```typescript
128
- * app.static('/login', () => import('./src/views/login.kita'))
129
- * app.static('/posts/:slug', () => import('./src/views/post-view.kita'))
130
- * ```
131
- */
132
- static<P>(path: string, loader: ViewLoader<P>): this;
133
- /**
134
- * Get all registered static routes
135
- */
136
- getStaticRoutes(): StaticRoute[];
137
- /**
138
- * Register a global error handler for all routes.
139
- * Useful for logging, monitoring integration, and custom error formatting.
140
- *
141
- * @example
142
- * ```typescript
143
- * app.onError(async (error, ctx) => {
144
- * logger.error(error);
145
- * return ctx.response.status(500).json({ error: 'Something went wrong' });
146
- * });
147
- * ```
148
- */
149
- onError(handler: ErrorHandler<TRequest, TServer>): this;
150
- /**
151
- * Get the registered error handler
152
- */
153
- getErrorHandler(): ErrorHandler | undefined;
154
- /**
155
- * Initialize the server adapter based on the runtime
156
- */
157
- protected abstract initializeServerAdapter(): Promise<any>;
158
- /**
159
- * Start the application server
160
- */
161
- abstract start(): Promise<TServer | void>;
162
- /**
163
- * Handles a standard Web request without requiring a bound network server.
164
- * This is the primary interoperability surface for embedding Ecopages inside
165
- * other runtimes and frameworks.
166
- */
167
- abstract fetch(request: TRequest): Promise<Response>;
168
- }