@ecopages/core 0.2.0-alpha.1 → 0.2.0-alpha.11

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 (372) hide show
  1. package/CHANGELOG.md +16 -64
  2. package/README.md +210 -13
  3. package/package.json +88 -62
  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 +163 -56
  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 +180 -89
  29. package/src/adapters/node/server-adapter.d.ts +4 -33
  30. package/src/adapters/node/server-adapter.js +39 -100
  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 +9 -5
  42. package/src/adapters/shared/fs-server-response-matcher.js +13 -8
  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 +160 -3
  59. package/src/build/build-adapter.js +494 -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 -18
  74. package/src/config/config-builder.js +258 -48
  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/component-render-context.d.ts +2 -2
  82. package/src/eco/component-render-context.js +33 -16
  83. package/src/eco/eco.browser.d.ts +2 -0
  84. package/src/eco/eco.browser.js +83 -0
  85. package/src/eco/eco.js +91 -16
  86. package/src/eco/eco.types.d.ts +12 -4
  87. package/src/eco/eco.utils.d.ts +1 -1
  88. package/src/eco/global-injector-map.d.ts +1 -1
  89. package/src/eco/lazy-injector-map.d.ts +1 -1
  90. package/src/hmr/README.md +26 -0
  91. package/src/hmr/client/hmr-runtime.d.ts +1 -6
  92. package/src/hmr/client/hmr-runtime.js +30 -7
  93. package/src/hmr/hmr-strategy.d.ts +8 -7
  94. package/src/hmr/hmr-strategy.js +22 -7
  95. package/src/hmr/hmr.postcss.test.e2e.d.ts +1 -0
  96. package/src/hmr/hmr.postcss.test.e2e.js +31 -0
  97. package/src/hmr/hmr.test.e2e.js +26 -33
  98. package/src/hmr/strategies/default-hmr-strategy.d.ts +2 -2
  99. package/src/hmr/strategies/default-hmr-strategy.js +1 -1
  100. package/src/hmr/strategies/js-hmr-strategy.d.ts +46 -43
  101. package/src/hmr/strategies/js-hmr-strategy.js +72 -73
  102. package/src/index.browser.d.ts +2 -2
  103. package/src/index.browser.js +1 -1
  104. package/src/index.d.ts +4 -3
  105. package/src/index.js +16 -5
  106. package/src/integrations/ghtml/ghtml-renderer.d.ts +2 -2
  107. package/src/integrations/ghtml/ghtml-renderer.js +3 -1
  108. package/src/integrations/ghtml/ghtml.plugin.d.ts +2 -2
  109. package/src/integrations/ghtml/ghtml.plugin.js +2 -2
  110. package/src/plugins/README.md +35 -0
  111. package/src/plugins/alias-resolver-plugin.js +17 -3
  112. package/src/plugins/eco-component-meta-plugin.d.ts +14 -1
  113. package/src/plugins/eco-component-meta-plugin.js +27 -21
  114. package/src/plugins/integration-plugin.d.ts +48 -9
  115. package/src/plugins/integration-plugin.js +39 -2
  116. package/src/plugins/processor.d.ts +15 -2
  117. package/src/plugins/processor.js +16 -2
  118. package/src/plugins/runtime-capability.d.ts +9 -0
  119. package/src/plugins/source-transform.d.ts +46 -0
  120. package/src/plugins/source-transform.js +71 -0
  121. package/src/route-renderer/GRAPH.md +18 -22
  122. package/src/route-renderer/README.md +15 -26
  123. package/src/route-renderer/{component-graph-executor.d.ts → component-graph/component-graph-executor.d.ts} +3 -2
  124. package/src/route-renderer/{component-graph-executor.js → component-graph/component-graph-executor.js} +2 -3
  125. package/src/route-renderer/{component-graph.d.ts → component-graph/component-graph.d.ts} +13 -2
  126. package/src/route-renderer/{component-graph.js → component-graph/component-graph.js} +26 -4
  127. package/src/route-renderer/component-graph/component-reference.d.ts +11 -0
  128. package/src/route-renderer/component-graph/component-reference.js +39 -0
  129. package/src/route-renderer/{marker-graph-resolver.d.ts → component-graph/marker-graph-resolver.d.ts} +9 -6
  130. package/src/route-renderer/{marker-graph-resolver.js → component-graph/marker-graph-resolver.js} +36 -12
  131. package/src/route-renderer/{integration-renderer.d.ts → orchestration/integration-renderer.d.ts} +65 -13
  132. package/src/route-renderer/{integration-renderer.js → orchestration/integration-renderer.js} +206 -30
  133. package/src/route-renderer/{render-execution.service.d.ts → orchestration/render-execution.service.d.ts} +42 -6
  134. package/src/route-renderer/orchestration/render-execution.service.js +191 -0
  135. package/src/route-renderer/{render-preparation.service.d.ts → orchestration/render-preparation.service.d.ts} +13 -4
  136. package/src/route-renderer/{render-preparation.service.js → orchestration/render-preparation.service.js} +95 -5
  137. package/src/route-renderer/{dependency-resolver.d.ts → page-loading/dependency-resolver.d.ts} +15 -4
  138. package/src/route-renderer/{dependency-resolver.js → page-loading/dependency-resolver.js} +18 -4
  139. package/src/route-renderer/page-loading/page-module-loader.d.ts +89 -0
  140. package/src/route-renderer/{page-module-loader.js → page-loading/page-module-loader.js} +38 -14
  141. package/src/route-renderer/route-renderer.d.ts +41 -4
  142. package/src/route-renderer/route-renderer.js +32 -3
  143. package/src/router/README.md +97 -0
  144. package/src/router/client/link-intent.d.ts +53 -0
  145. package/src/router/client/link-intent.js +34 -0
  146. package/src/router/client/link-intent.test.browser.d.ts +1 -0
  147. package/src/router/client/link-intent.test.browser.js +43 -0
  148. package/src/router/client/navigation-coordinator.d.ts +149 -0
  149. package/src/router/client/navigation-coordinator.js +215 -0
  150. package/src/router/{fs-router-scanner.d.ts → server/fs-router-scanner.d.ts} +3 -3
  151. package/src/router/{fs-router-scanner.js → server/fs-router-scanner.js} +8 -7
  152. package/src/router/{fs-router.d.ts → server/fs-router.d.ts} +1 -1
  153. package/src/router/{fs-router.js → server/fs-router.js} +1 -1
  154. package/src/services/README.md +29 -0
  155. package/src/services/assets/asset-processing-service/asset-processing.service.d.ts +120 -0
  156. package/src/services/{asset-processing-service → assets/asset-processing-service}/asset-processing.service.js +91 -10
  157. package/src/services/{asset-processing-service → assets/asset-processing-service}/asset.factory.d.ts +1 -1
  158. package/src/services/{asset-processing-service → assets/asset-processing-service}/asset.factory.js +2 -2
  159. package/src/services/{asset-processing-service → assets/asset-processing-service}/assets.types.d.ts +2 -1
  160. package/src/services/assets/asset-processing-service/browser-runtime-asset.factory.d.ts +55 -0
  161. package/src/services/assets/asset-processing-service/browser-runtime-asset.factory.js +48 -0
  162. package/src/services/assets/asset-processing-service/browser-runtime-entry.factory.d.ts +20 -0
  163. package/src/services/assets/asset-processing-service/browser-runtime-entry.factory.js +41 -0
  164. package/src/services/assets/asset-processing-service/index.d.ts +5 -0
  165. package/src/services/assets/asset-processing-service/index.js +5 -0
  166. package/src/services/{asset-processing-service → assets/asset-processing-service}/processor.interface.d.ts +2 -2
  167. package/src/services/{asset-processing-service → assets/asset-processing-service}/processor.registry.d.ts +2 -2
  168. package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/base/base-processor.d.ts +1 -1
  169. package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/base/base-processor.js +9 -4
  170. package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/base/base-script-processor.d.ts +5 -4
  171. package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/base/base-script-processor.js +15 -23
  172. package/src/services/assets/asset-processing-service/processors/index.d.ts +5 -0
  173. package/src/services/assets/asset-processing-service/processors/index.js +5 -0
  174. package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/script/content-script.processor.d.ts +2 -2
  175. package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/script/content-script.processor.js +1 -1
  176. package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/script/file-script.processor.d.ts +4 -3
  177. package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/script/file-script.processor.js +16 -4
  178. package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/script/node-module-script.processor.d.ts +3 -3
  179. package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/script/node-module-script.processor.js +6 -5
  180. package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/stylesheet/content-stylesheet.processor.d.ts +2 -2
  181. package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/stylesheet/content-stylesheet.processor.js +1 -1
  182. package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/stylesheet/file-stylesheet.processor.d.ts +2 -2
  183. package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/stylesheet/file-stylesheet.processor.js +5 -2
  184. package/src/services/assets/browser-bundle.service.d.ts +32 -0
  185. package/src/services/assets/browser-bundle.service.js +33 -0
  186. package/src/services/{page-request-cache-coordinator.service.d.ts → cache/page-request-cache-coordinator.service.d.ts} +2 -2
  187. package/src/services/{page-request-cache-coordinator.service.js → cache/page-request-cache-coordinator.service.js} +3 -1
  188. package/src/services/html/html-rewriter-provider.service.d.ts +37 -0
  189. package/src/services/html/html-rewriter-provider.service.js +68 -0
  190. package/src/services/html/html-transformer.service.d.ts +77 -0
  191. package/src/services/html/html-transformer.service.js +215 -0
  192. package/src/services/invalidation/development-invalidation.service.d.ts +74 -0
  193. package/src/services/invalidation/development-invalidation.service.js +190 -0
  194. package/src/services/module-loading/app-module-loader.service.d.ts +25 -0
  195. package/src/services/module-loading/app-module-loader.service.js +31 -0
  196. package/src/services/module-loading/app-server-module-transpiler.service.d.ts +24 -0
  197. package/src/services/module-loading/app-server-module-transpiler.service.js +109 -0
  198. package/src/services/module-loading/host-module-loader-registry.d.ts +4 -0
  199. package/src/services/module-loading/host-module-loader-registry.js +15 -0
  200. package/src/services/module-loading/module-loading-types.d.ts +2 -0
  201. package/src/services/module-loading/node-bootstrap-plugin.d.ts +22 -0
  202. package/src/services/module-loading/node-bootstrap-plugin.js +179 -0
  203. package/src/services/module-loading/page-module-import.service.d.ts +75 -0
  204. package/src/services/module-loading/page-module-import.service.js +161 -0
  205. package/src/services/module-loading/server-module-transpiler.service.d.ts +72 -0
  206. package/src/services/module-loading/server-module-transpiler.service.js +64 -0
  207. package/src/services/runtime-state/dev-graph.service.d.ts +118 -0
  208. package/src/services/runtime-state/dev-graph.service.js +162 -0
  209. package/src/services/runtime-state/entrypoint-dependency-graph.service.d.ts +41 -0
  210. package/src/services/runtime-state/entrypoint-dependency-graph.service.js +85 -0
  211. package/src/services/runtime-state/runtime-specifier-registry.service.d.ts +69 -0
  212. package/src/services/runtime-state/runtime-specifier-registry.service.js +37 -0
  213. package/src/services/runtime-state/server-invalidation-state.service.d.ts +26 -0
  214. package/src/services/runtime-state/server-invalidation-state.service.js +35 -0
  215. package/src/services/{schema-validation-service.d.ts → validation/schema-validation-service.d.ts} +1 -1
  216. package/src/static-site-generator/README.md +26 -0
  217. package/src/static-site-generator/static-site-generator.d.ts +55 -3
  218. package/src/static-site-generator/static-site-generator.js +86 -5
  219. package/src/{internal-types.d.ts → types/internal-types.d.ts} +53 -22
  220. package/src/types/internal-types.js +0 -0
  221. package/src/{public-types.d.ts → types/public-types.d.ts} +73 -17
  222. package/src/types/public-types.js +0 -0
  223. package/src/utils/locals-utils.d.ts +1 -1
  224. package/src/utils/parse-cli-args.d.ts +4 -1
  225. package/src/utils/parse-cli-args.js +16 -1
  226. package/src/utils/resolve-work-dir.d.ts +11 -0
  227. package/src/utils/resolve-work-dir.js +31 -0
  228. package/src/watchers/project-watcher.d.ts +40 -24
  229. package/src/watchers/project-watcher.js +105 -68
  230. package/src/watchers/project-watcher.test-helpers.d.ts +2 -2
  231. package/src/watchers/project-watcher.test-helpers.js +1 -0
  232. package/src/adapters/abstract/application-adapter.ts +0 -337
  233. package/src/adapters/abstract/router-adapter.ts +0 -30
  234. package/src/adapters/abstract/server-adapter.ts +0 -79
  235. package/src/adapters/bun/client-bridge.ts +0 -62
  236. package/src/adapters/bun/create-app.ts +0 -189
  237. package/src/adapters/bun/define-api-handler.d.ts +0 -61
  238. package/src/adapters/bun/define-api-handler.ts +0 -114
  239. package/src/adapters/bun/hmr-manager.ts +0 -281
  240. package/src/adapters/bun/index.ts +0 -3
  241. package/src/adapters/bun/server-adapter.ts +0 -492
  242. package/src/adapters/bun/server-lifecycle.ts +0 -154
  243. package/src/adapters/index.ts +0 -6
  244. package/src/adapters/node/create-app.ts +0 -179
  245. package/src/adapters/node/index.d.ts +0 -4
  246. package/src/adapters/node/index.js +0 -8
  247. package/src/adapters/node/index.ts +0 -9
  248. package/src/adapters/node/node-client-bridge.ts +0 -79
  249. package/src/adapters/node/node-hmr-manager.ts +0 -271
  250. package/src/adapters/node/server-adapter.ts +0 -561
  251. package/src/adapters/node/static-content-server.ts +0 -203
  252. package/src/adapters/shared/api-response.ts +0 -104
  253. package/src/adapters/shared/application-adapter.ts +0 -199
  254. package/src/adapters/shared/explicit-static-route-matcher.ts +0 -134
  255. package/src/adapters/shared/file-route-middleware-pipeline.ts +0 -123
  256. package/src/adapters/shared/fs-server-response-factory.ts +0 -118
  257. package/src/adapters/shared/fs-server-response-matcher.ts +0 -198
  258. package/src/adapters/shared/render-context.ts +0 -105
  259. package/src/adapters/shared/server-adapter.ts +0 -442
  260. package/src/adapters/shared/server-route-handler.ts +0 -166
  261. package/src/adapters/shared/server-static-builder.ts +0 -82
  262. package/src/build/build-adapter.ts +0 -132
  263. package/src/build/build-types.ts +0 -83
  264. package/src/build/esbuild-build-adapter.ts +0 -510
  265. package/src/config/config-builder.ts +0 -474
  266. package/src/constants.ts +0 -39
  267. package/src/create-app.ts +0 -87
  268. package/src/define-api-handler.js +0 -15
  269. package/src/define-api-handler.ts +0 -66
  270. package/src/dev/sc-server.ts +0 -143
  271. package/src/eco/component-render-context.ts +0 -202
  272. package/src/eco/eco.ts +0 -221
  273. package/src/eco/eco.types.ts +0 -202
  274. package/src/eco/eco.utils.ts +0 -89
  275. package/src/eco/global-injector-map.ts +0 -112
  276. package/src/eco/lazy-injector-map.ts +0 -120
  277. package/src/eco/module-dependencies.ts +0 -75
  278. package/src/errors/http-error.ts +0 -72
  279. package/src/errors/index.ts +0 -2
  280. package/src/errors/locals-access-error.ts +0 -7
  281. package/src/global/app-logger.ts +0 -4
  282. 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
  283. package/src/hmr/client/__screenshots__/hmr-runtime.test.browser.ts/HMR-Runtime-HMR-Server-Integration-should-load-fixture-app-page-1.png +0 -0
  284. package/src/hmr/client/__screenshots__/hmr-runtime.test.browser.ts/HMR-Runtime-WebSocket-Connection-should-connect-to-correct-HMR-endpoint-1.png +0 -0
  285. package/src/hmr/client/hmr-runtime.ts +0 -121
  286. package/src/hmr/hmr-strategy.ts +0 -172
  287. package/src/hmr/hmr.test.e2e.ts +0 -75
  288. package/src/hmr/strategies/default-hmr-strategy.ts +0 -60
  289. package/src/hmr/strategies/js-hmr-strategy.ts +0 -308
  290. package/src/index.browser.ts +0 -3
  291. package/src/index.ts +0 -5
  292. package/src/integrations/ghtml/ghtml-renderer.ts +0 -93
  293. package/src/integrations/ghtml/ghtml.plugin.ts +0 -32
  294. package/src/internal-types.ts +0 -212
  295. package/src/plugins/alias-resolver-plugin.ts +0 -45
  296. package/src/plugins/eco-component-meta-plugin.ts +0 -474
  297. package/src/plugins/integration-plugin.ts +0 -184
  298. package/src/plugins/processor.ts +0 -220
  299. package/src/public-types.ts +0 -1255
  300. package/src/route-renderer/component-graph-executor.ts +0 -84
  301. package/src/route-renderer/component-graph.ts +0 -159
  302. package/src/route-renderer/component-marker.ts +0 -117
  303. package/src/route-renderer/dependency-resolver.ts +0 -596
  304. package/src/route-renderer/html-post-processing.service.d.ts +0 -40
  305. package/src/route-renderer/html-post-processing.service.js +0 -86
  306. package/src/route-renderer/html-post-processing.service.ts +0 -103
  307. package/src/route-renderer/integration-renderer.ts +0 -696
  308. package/src/route-renderer/marker-graph-resolver.ts +0 -153
  309. package/src/route-renderer/page-module-loader.d.ts +0 -61
  310. package/src/route-renderer/page-module-loader.ts +0 -153
  311. package/src/route-renderer/render-execution.service.js +0 -91
  312. package/src/route-renderer/render-execution.service.ts +0 -158
  313. package/src/route-renderer/render-preparation.service.ts +0 -358
  314. package/src/route-renderer/route-renderer.ts +0 -80
  315. package/src/router/fs-router-scanner.ts +0 -217
  316. package/src/router/fs-router.ts +0 -122
  317. package/src/services/asset-processing-service/asset-processing.service.d.ts +0 -41
  318. package/src/services/asset-processing-service/asset-processing.service.ts +0 -306
  319. package/src/services/asset-processing-service/asset.factory.ts +0 -105
  320. package/src/services/asset-processing-service/assets.types.ts +0 -112
  321. package/src/services/asset-processing-service/index.d.ts +0 -3
  322. package/src/services/asset-processing-service/index.js +0 -3
  323. package/src/services/asset-processing-service/index.ts +0 -3
  324. package/src/services/asset-processing-service/processor.interface.ts +0 -27
  325. package/src/services/asset-processing-service/processor.registry.ts +0 -18
  326. package/src/services/asset-processing-service/processors/base/base-processor.ts +0 -76
  327. package/src/services/asset-processing-service/processors/base/base-script-processor.ts +0 -105
  328. package/src/services/asset-processing-service/processors/index.d.ts +0 -5
  329. package/src/services/asset-processing-service/processors/index.js +0 -5
  330. package/src/services/asset-processing-service/processors/index.ts +0 -5
  331. package/src/services/asset-processing-service/processors/script/content-script.processor.ts +0 -66
  332. package/src/services/asset-processing-service/processors/script/file-script.processor.ts +0 -88
  333. package/src/services/asset-processing-service/processors/script/node-module-script.processor.ts +0 -84
  334. package/src/services/asset-processing-service/processors/stylesheet/content-stylesheet.processor.ts +0 -27
  335. package/src/services/asset-processing-service/processors/stylesheet/file-stylesheet.processor.ts +0 -77
  336. package/src/services/cache/cache.types.ts +0 -126
  337. package/src/services/cache/index.ts +0 -18
  338. package/src/services/cache/memory-cache-store.ts +0 -130
  339. package/src/services/cache/page-cache-service.ts +0 -202
  340. package/src/services/html-transformer.service.d.ts +0 -50
  341. package/src/services/html-transformer.service.js +0 -163
  342. package/src/services/html-transformer.service.ts +0 -217
  343. package/src/services/page-module-import.service.d.ts +0 -37
  344. package/src/services/page-module-import.service.js +0 -88
  345. package/src/services/page-module-import.service.ts +0 -129
  346. package/src/services/page-request-cache-coordinator.service.ts +0 -128
  347. package/src/services/schema-validation-service.ts +0 -204
  348. package/src/services/validation/standard-schema.types.ts +0 -68
  349. package/src/static-site-generator/static-site-generator.ts +0 -359
  350. package/src/utils/css.d.ts +0 -1
  351. package/src/utils/css.js +0 -7
  352. package/src/utils/css.ts +0 -5
  353. package/src/utils/deep-merge.ts +0 -47
  354. package/src/utils/hash.ts +0 -5
  355. package/src/utils/html.ts +0 -1
  356. package/src/utils/invariant.ts +0 -15
  357. package/src/utils/locals-utils.ts +0 -37
  358. package/src/utils/parse-cli-args.ts +0 -83
  359. package/src/utils/path-utils.module.ts +0 -14
  360. package/src/utils/runtime.ts +0 -44
  361. package/src/utils/server-utils.module.ts +0 -67
  362. package/src/watchers/project-watcher.test-helpers.ts +0 -40
  363. package/src/watchers/project-watcher.ts +0 -306
  364. /package/src/adapters/{bun → shared}/define-api-handler.js +0 -0
  365. /package/src/{internal-types.js → plugins/runtime-capability.js} +0 -0
  366. /package/src/route-renderer/{component-marker.d.ts → component-graph/component-marker.d.ts} +0 -0
  367. /package/src/route-renderer/{component-marker.js → component-graph/component-marker.js} +0 -0
  368. /package/src/services/{asset-processing-service → assets/asset-processing-service}/assets.types.js +0 -0
  369. /package/src/services/{asset-processing-service → assets/asset-processing-service}/processor.interface.js +0 -0
  370. /package/src/services/{asset-processing-service → assets/asset-processing-service}/processor.registry.js +0 -0
  371. /package/src/{public-types.js → services/module-loading/module-loading-types.js} +0 -0
  372. /package/src/services/{schema-validation-service.js → validation/schema-validation-service.js} +0 -0
@@ -4,47 +4,40 @@ import { writeFile } from "node:fs/promises";
4
4
  import { resolve } from "node:path";
5
5
  const FIXTURE_DIR = resolve(process.cwd(), "packages/core/__fixtures__/app");
6
6
  const TEST_CSS_FILE = resolve(FIXTURE_DIR, "src/pages/index.css");
7
- const BUILT_CSS_FILE = resolve(FIXTURE_DIR, ".eco/assets/pages/index.css");
8
- const TEST_URL = "http://localhost:3002";
9
7
  test.describe("HMR E2E", () => {
10
8
  test("should load page with .main-title element", async ({ page }) => {
11
- await page.goto(TEST_URL, { waitUntil: "networkidle" });
9
+ await page.goto("/", { waitUntil: "networkidle" });
12
10
  const title = page.locator(".main-title").first();
13
11
  await expect(title).toBeVisible();
14
12
  });
15
13
  test("should connect to HMR WebSocket", async ({ page }) => {
16
- await page.goto(TEST_URL);
17
- const connected = await page.evaluate(async () => {
18
- return new Promise((resolve2) => {
19
- const ws = new WebSocket("ws://localhost:3002/_hmr");
20
- ws.onopen = () => {
21
- ws.close();
22
- resolve2(true);
23
- };
24
- ws.onerror = () => resolve2(false);
25
- setTimeout(() => resolve2(false), 5e3);
26
- });
14
+ const socketPromise = page.waitForEvent("websocket", {
15
+ predicate: (socket2) => socket2.url().endsWith("/_hmr"),
16
+ timeout: 1e4
27
17
  });
28
- expect(connected).toBe(true);
18
+ await page.goto("/", { waitUntil: "networkidle" });
19
+ const socket = await socketPromise;
20
+ expect(socket.url()).toMatch(/\/_hmr$/);
29
21
  });
30
- test("should reload page when CSS file changes", async ({ page }) => {
22
+ test("should fall back to a full page reload when raw CSS file changes", async ({ page }) => {
31
23
  const originalCss = readFileSync(TEST_CSS_FILE, "utf-8");
32
- await page.goto(TEST_URL, { waitUntil: "networkidle" });
33
- const initialColor = await page.evaluate(() => {
34
- const el = document.querySelector(".main-title");
35
- return el ? getComputedStyle(el).color : null;
36
- });
37
- expect(initialColor).toBeTruthy();
38
- const modifiedCss = originalCss.replace(".main-title {", ".main-title {\n color: rgb(255, 0, 0);");
39
- const loadPromise = page.waitForEvent("load", { timeout: 1e4 });
40
- await writeFile(TEST_CSS_FILE, modifiedCss, { flush: true });
41
- await writeFile(BUILT_CSS_FILE, modifiedCss, { flush: true });
42
- await loadPromise;
43
- const updatedColor = await page.evaluate(() => {
44
- const el = document.querySelector(".main-title");
45
- return el ? getComputedStyle(el).color : null;
46
- });
47
- expect(updatedColor).toBe("rgb(255, 0, 0)");
48
- await writeFile(TEST_CSS_FILE, originalCss, { flush: true });
24
+ const title = page.locator(".main-title").first();
25
+ try {
26
+ await page.goto("/", { waitUntil: "networkidle" });
27
+ await expect(title).toBeVisible();
28
+ const initialColor = await title.evaluate((el) => getComputedStyle(el).color);
29
+ expect(initialColor).toBeTruthy();
30
+ const modifiedCss = originalCss.replace(".main-title {", ".main-title {\n color: rgb(255, 0, 0);");
31
+ const reloadPromise = page.waitForEvent("framenavigated", {
32
+ predicate: (frame) => frame === page.mainFrame(),
33
+ timeout: 1e4
34
+ });
35
+ await writeFile(TEST_CSS_FILE, modifiedCss, { flush: true });
36
+ await reloadPromise;
37
+ await page.waitForLoadState("networkidle");
38
+ await expect.poll(async () => title.evaluate((el) => getComputedStyle(el).color), { timeout: 1e4 }).toBe("rgb(255, 0, 0)");
39
+ } finally {
40
+ await writeFile(TEST_CSS_FILE, originalCss, { flush: true });
41
+ }
49
42
  });
50
43
  });
@@ -6,7 +6,7 @@
6
6
  *
7
7
  * @module
8
8
  */
9
- import { HmrStrategy, HmrStrategyType, type HmrAction } from '../hmr-strategy';
9
+ import { HmrStrategy, type HmrAction } from '../hmr-strategy.js';
10
10
  /**
11
11
  * Default fallback strategy for unhandled file types.
12
12
  *
@@ -25,7 +25,7 @@ import { HmrStrategy, HmrStrategyType, type HmrAction } from '../hmr-strategy';
25
25
  * ```
26
26
  */
27
27
  export declare class DefaultHmrStrategy extends HmrStrategy {
28
- readonly type = HmrStrategyType.FALLBACK;
28
+ readonly type: 0;
29
29
  /**
30
30
  * Matches all file paths.
31
31
  *
@@ -1,4 +1,4 @@
1
- import { HmrStrategy, HmrStrategyType } from "../hmr-strategy";
1
+ import { HmrStrategy, HmrStrategyType } from "../hmr-strategy.js";
2
2
  class DefaultHmrStrategy extends HmrStrategy {
3
3
  type = HmrStrategyType.FALLBACK;
4
4
  /**
@@ -2,12 +2,15 @@
2
2
  * JavaScript HMR Strategy
3
3
  *
4
4
  * Handles hot module replacement for JavaScript and TypeScript entrypoints.
5
- * Bundles files, replaces bare specifiers, and injects HMR boilerplate.
5
+ * Bundles files, inspects the emitted output, and decides whether the browser
6
+ * can hot-accept the change or must reload.
6
7
  *
7
8
  * @module
8
9
  */
9
- import { HmrStrategy, HmrStrategyType, type HmrAction } from '../hmr-strategy';
10
+ import { HmrStrategy, type HmrAction } from '../hmr-strategy.js';
10
11
  import type { EcoBuildPlugin } from '../../build/build-types.js';
12
+ import type { BrowserBundleExecutor } from '../../services/assets/browser-bundle.service.js';
13
+ import type { EntrypointDependencyGraph } from '../../services/runtime-state/entrypoint-dependency-graph.service.js';
11
14
  /**
12
15
  * Context interface providing access to HmrManager state.
13
16
  * Required for JsHmrStrategy to access registered entrypoints and configuration.
@@ -21,23 +24,7 @@ export interface JsHmrContext {
21
24
  * Map of bare specifiers to vendor URLs for import resolution.
22
25
  */
23
26
  getSpecifierMap(): Map<string, string>;
24
- /**
25
- * Returns entrypoints impacted by a changed dependency path.
26
- *
27
- * @remarks
28
- * This hook is currently provided by the Node HMR manager where dependency
29
- * graph metadata is extracted from the Node/esbuild build adapter.
30
- */
31
- getDependencyEntrypoints?(filePath: string): Set<string>;
32
- /**
33
- * Stores latest dependency set for an entrypoint.
34
- *
35
- * @remarks
36
- * This hook is currently used only by the Node HMR manager to maintain a
37
- * reverse invalidation index. Runtimes that do not provide it keep rebuild-all
38
- * fallback semantics.
39
- */
40
- setEntrypointDependencies?(entrypointPath: string, dependencies: string[]): void;
27
+ getEntrypointDependencyGraph(): EntrypointDependencyGraph;
41
28
  /**
42
29
  * Directory where HMR bundles are written.
43
30
  */
@@ -50,23 +37,47 @@ export interface JsHmrContext {
50
37
  * Absolute path to the source directory.
51
38
  */
52
39
  getSrcDir(): string;
40
+ /**
41
+ * Absolute path to the pages directory.
42
+ */
43
+ getPagesDir(): string;
44
+ /**
45
+ * Absolute path to the layouts directory.
46
+ */
47
+ getLayoutsDir(): string;
48
+ /**
49
+ * All configured route-template extensions across integrations.
50
+ */
51
+ getTemplateExtensions(): string[];
52
+ /**
53
+ * Browser bundler used to rebuild changed entrypoints.
54
+ */
55
+ getBrowserBundleService(): BrowserBundleExecutor;
56
+ /**
57
+ * Returns whether a watched entrypoint should be rebuilt by the generic JS strategy.
58
+ *
59
+ * @remarks
60
+ * Integrations with higher-priority HMR strategies can use this to keep the
61
+ * generic JS strategy from overwriting their emitted entrypoints when a shared
62
+ * dependency changes.
63
+ */
64
+ shouldProcessEntrypoint?(entrypointPath: string): boolean;
53
65
  }
54
66
  /**
55
67
  * Strategy for handling JavaScript/TypeScript file changes with hot reloading.
56
68
  *
57
- * This strategy rebuilds all registered entrypoints when any file changes,
58
- * as we don't currently track dependencies. This is safe but inefficient.
59
- *
60
69
  * The processing steps are:
61
70
  * 1. Check if any entrypoints are registered
62
- * 2. Rebuild all entrypoints (the changed file could be a dependency)
63
- * 3. Replace bare specifiers with vendor URLs
71
+ * 2. Rebuild impacted entrypoints, or all watched entrypoints when no runtime
72
+ * dependency graph is available
73
+ * 3. Emit rebuilt entrypoint bundles for browser delivery
64
74
  * 4. Inject generic HMR boilerplate
65
75
  * 5. Broadcast update events for each rebuilt entrypoint
66
76
  *
67
77
  * @remarks
68
- * Future enhancement: Track dependencies using Bun's transpiler API to only
69
- * rebuild affected entrypoints instead of all of them.
78
+ * Node can provide dependency-graph metadata, so this strategy can rebuild only
79
+ * the entrypoints impacted by a changed dependency. Runtimes that do not expose
80
+ * that metadata intentionally keep the rebuild-all fallback.
70
81
  *
71
82
  * @see https://bun.sh/docs/runtime/transpiler
72
83
  *
@@ -83,8 +94,8 @@ export interface JsHmrContext {
83
94
  * ```
84
95
  */
85
96
  export declare class JsHmrStrategy extends HmrStrategy {
97
+ readonly type: 25;
86
98
  private context;
87
- readonly type = HmrStrategyType.SCRIPT;
88
99
  constructor(context: JsHmrContext);
89
100
  /**
90
101
  * Determines if the file is a JS/TS file that could affect registered entrypoints.
@@ -105,32 +116,24 @@ export declare class JsHmrStrategy extends HmrStrategy {
105
116
  * @remarks
106
117
  * If runtime-specific dependency graph hooks are unavailable, this strategy
107
118
  * falls back to rebuilding all watched entrypoints.
119
+ * When multiple entrypoints are impacted they are bundled in a single esbuild
120
+ * invocation to share AST parsing and chunk deduplication.
108
121
  * @returns Action to broadcast update events
109
122
  */
110
123
  process(filePath: string): Promise<HmrAction>;
111
124
  /**
112
- * Bundles a single entrypoint and processes the output.
113
- *
114
- * @param entrypointPath - Absolute path to the source file
115
- * @param outputUrl - URL path for the bundled file
116
- * @returns True if bundling was successful
125
+ * Bundles one or more entrypoints in a single esbuild invocation.
126
+ * Uses the source directory as the output base so that the directory structure
127
+ * is preserved under the HMR dist folder.
117
128
  */
118
- private bundleEntrypoint;
129
+ private bundleEntrypoints;
119
130
  /**
120
- * Processes bundled output by replacing specifiers and injecting HMR code.
131
+ * Processes bundled output and determines whether the browser can hot-accept
132
+ * the update or must fall back to a full reload.
121
133
  *
122
134
  * @param filepath - Path to the bundled output file
123
135
  * @param url - URL path for the bundled file
124
136
  * @returns True if processing was successful and update should be broadcast
125
137
  */
126
138
  private processOutput;
127
- /**
128
- * Replaces bare specifiers with vendor URLs.
129
- *
130
- * Handles both static imports and dynamic imports.
131
- *
132
- * @param code - The bundled code to transform
133
- * @returns The transformed code with vendor URLs
134
- */
135
- private replaceBareSpecifiers;
136
139
  }
@@ -1,14 +1,14 @@
1
1
  import path from "node:path";
2
2
  import { fileSystem } from "@ecopages/file-system";
3
- import { HmrStrategy, HmrStrategyType } from "../hmr-strategy";
4
- import { appLogger } from "../../global/app-logger";
5
- import { defaultBuildAdapter } from "../../build/build-adapter.js";
3
+ import { HmrStrategy, HmrStrategyType } from "../hmr-strategy.js";
4
+ import { appLogger } from "../../global/app-logger.js";
6
5
  class JsHmrStrategy extends HmrStrategy {
6
+ type = HmrStrategyType.SCRIPT;
7
+ context;
7
8
  constructor(context) {
8
9
  super();
9
10
  this.context = context;
10
11
  }
11
- type = HmrStrategyType.SCRIPT;
12
12
  /**
13
13
  * Determines if the file is a JS/TS file that could affect registered entrypoints.
14
14
  *
@@ -23,10 +23,25 @@ class JsHmrStrategy extends HmrStrategy {
23
23
  const watchedFiles = this.context.getWatchedFiles();
24
24
  const isJsTs = /\.(ts|tsx|js|jsx)$/.test(filePath);
25
25
  const isInSrc = filePath.startsWith(this.context.getSrcDir());
26
+ const isRouteTemplate = filePath.startsWith(this.context.getPagesDir()) || filePath.startsWith(this.context.getLayoutsDir());
27
+ const isIntegrationTemplate = isRouteTemplate && this.context.getTemplateExtensions().some((extension) => filePath.endsWith(extension));
26
28
  if (watchedFiles.size === 0) {
27
29
  return false;
28
30
  }
29
- return isJsTs && isInSrc;
31
+ if (!isJsTs || !isInSrc) {
32
+ return false;
33
+ }
34
+ if (isIntegrationTemplate) {
35
+ return false;
36
+ }
37
+ if (watchedFiles.has(filePath)) {
38
+ return true;
39
+ }
40
+ const entrypointDependencyGraph = this.context.getEntrypointDependencyGraph();
41
+ if (entrypointDependencyGraph.supportsSelectiveInvalidation()) {
42
+ return entrypointDependencyGraph.getDependencyEntrypoints(filePath).size > 0;
43
+ }
44
+ return true;
30
45
  }
31
46
  /**
32
47
  * Processes a file change by rebuilding affected entrypoints.
@@ -36,6 +51,8 @@ class JsHmrStrategy extends HmrStrategy {
36
51
  * @remarks
37
52
  * If runtime-specific dependency graph hooks are unavailable, this strategy
38
53
  * falls back to rebuilding all watched entrypoints.
54
+ * When multiple entrypoints are impacted they are bundled in a single esbuild
55
+ * invocation to share AST parsing and chunk deduplication.
39
56
  * @returns Action to broadcast update events
40
57
  */
41
58
  async process(filePath) {
@@ -45,24 +62,37 @@ class JsHmrStrategy extends HmrStrategy {
45
62
  appLogger.debug(`[JsHmrStrategy] No watched files to rebuild`);
46
63
  return { type: "none" };
47
64
  }
48
- const updates = [];
49
- let reloadRequired = false;
50
- const dependencyHits = this.context.getDependencyEntrypoints?.(filePath) ?? /* @__PURE__ */ new Set();
65
+ const dependencyHits = this.context.getEntrypointDependencyGraph().getDependencyEntrypoints(filePath);
51
66
  const hasDependencyHit = dependencyHits.size > 0;
52
67
  const impactedEntrypoints = hasDependencyHit ? Array.from(dependencyHits).filter((entrypoint) => watchedFiles.has(entrypoint)) : Array.from(watchedFiles.keys());
68
+ const buildableEntrypoints = impactedEntrypoints.filter(
69
+ (entrypoint) => this.context.shouldProcessEntrypoint?.(entrypoint) ?? true
70
+ );
53
71
  if (!hasDependencyHit) {
54
72
  appLogger.debug("[JsHmrStrategy] Dependency graph miss, rebuilding all watched entrypoints");
55
73
  }
56
- for (const entrypoint of impactedEntrypoints) {
74
+ if (buildableEntrypoints.length === 0) {
75
+ return { type: "none" };
76
+ }
77
+ const buildResult = await this.bundleEntrypoints(buildableEntrypoints);
78
+ if (!buildResult.success) {
79
+ return { type: "none" };
80
+ }
81
+ const updates = [];
82
+ let reloadRequired = false;
83
+ for (const entrypoint of buildableEntrypoints) {
57
84
  const outputUrl = watchedFiles.get(entrypoint);
58
- if (!outputUrl) {
59
- continue;
85
+ if (!outputUrl) continue;
86
+ if (buildResult.dependencies) {
87
+ const entrypointDeps = buildResult.dependencies.get(path.resolve(entrypoint)) ?? [];
88
+ this.context.getEntrypointDependencyGraph().setEntrypointDependencies(entrypoint, entrypointDeps);
60
89
  }
61
- const result = await this.bundleEntrypoint(entrypoint, outputUrl);
90
+ const srcDir = this.context.getSrcDir();
91
+ const relativePath = path.relative(srcDir, entrypoint);
92
+ const relativePathJs = relativePath.replace(/\.(tsx?|jsx?|mdx?)$/, ".js");
93
+ const outputPath = path.join(this.context.getDistDir(), relativePathJs);
94
+ const result = await this.processOutput(outputPath, outputUrl);
62
95
  if (result.success) {
63
- if (result.dependencies && this.context.setEntrypointDependencies) {
64
- this.context.setEntrypointDependencies(entrypoint, result.dependencies);
65
- }
66
96
  updates.push(outputUrl);
67
97
  if (result.requiresReload) {
68
98
  reloadRequired = true;
@@ -74,18 +104,14 @@ class JsHmrStrategy extends HmrStrategy {
74
104
  appLogger.debug(`[JsHmrStrategy] Full reload required (no HMR accept found)`);
75
105
  return {
76
106
  type: "broadcast",
77
- events: [
78
- {
79
- type: "reload"
80
- }
81
- ]
107
+ events: [{ type: "reload" }]
82
108
  };
83
109
  }
84
110
  return {
85
111
  type: "broadcast",
86
- events: updates.map((path2) => ({
112
+ events: updates.map((p) => ({
87
113
  type: "update",
88
- path: path2,
114
+ path: p,
89
115
  timestamp: Date.now()
90
116
  }))
91
117
  };
@@ -93,44 +119,40 @@ class JsHmrStrategy extends HmrStrategy {
93
119
  return { type: "none" };
94
120
  }
95
121
  /**
96
- * Bundles a single entrypoint and processes the output.
97
- *
98
- * @param entrypointPath - Absolute path to the source file
99
- * @param outputUrl - URL path for the bundled file
100
- * @returns True if bundling was successful
122
+ * Bundles one or more entrypoints in a single esbuild invocation.
123
+ * Uses the source directory as the output base so that the directory structure
124
+ * is preserved under the HMR dist folder.
101
125
  */
102
- async bundleEntrypoint(entrypointPath, outputUrl) {
126
+ async bundleEntrypoints(entrypoints) {
103
127
  try {
104
- const srcDir = this.context.getSrcDir();
105
- const relativePath = path.relative(srcDir, entrypointPath);
106
- const relativePathJs = relativePath.replace(/\.(tsx?|jsx?)$/, ".js");
107
- const outputPath = path.join(this.context.getDistDir(), relativePathJs);
108
- const result = await defaultBuildAdapter.build({
109
- entrypoints: [entrypointPath],
128
+ const result = await this.context.getBrowserBundleService().bundle({
129
+ profile: "hmr-entrypoint",
130
+ entrypoints,
110
131
  outdir: this.context.getDistDir(),
111
- naming: relativePathJs,
112
- ...defaultBuildAdapter.getTranspileOptions("hmr-entrypoint"),
132
+ outbase: this.context.getSrcDir(),
133
+ naming: "[dir]/[name]",
113
134
  plugins: this.context.getPlugins(),
114
- minify: false,
115
- external: ["react", "react-dom"]
135
+ minify: false
116
136
  });
117
137
  if (!result.success) {
118
- appLogger.error(`[JsHmrStrategy] Failed to build ${entrypointPath}:`, result.logs);
119
- return { success: false, requiresReload: false, dependencies: void 0 };
138
+ appLogger.error("[JsHmrStrategy] Batched build failed:", result.logs);
139
+ return { success: false };
120
140
  }
121
- const dependencyGraph = result.dependencyGraph?.entrypoints?.[path.resolve(entrypointPath)] ?? [];
122
- const output = await this.processOutput(outputPath, outputUrl);
123
- return {
124
- ...output,
125
- dependencies: dependencyGraph
126
- };
141
+ const dependencies = /* @__PURE__ */ new Map();
142
+ if (result.dependencyGraph?.entrypoints) {
143
+ for (const [entrypoint, deps] of Object.entries(result.dependencyGraph.entrypoints)) {
144
+ dependencies.set(path.resolve(entrypoint), deps);
145
+ }
146
+ }
147
+ return { success: true, dependencies };
127
148
  } catch (error) {
128
- appLogger.error(`[JsHmrStrategy] Error bundling ${entrypointPath}:`, error);
129
- return { success: false, requiresReload: false, dependencies: void 0 };
149
+ appLogger.error("[JsHmrStrategy] Error in batched build:", error);
150
+ return { success: false };
130
151
  }
131
152
  }
132
153
  /**
133
- * Processes bundled output by replacing specifiers and injecting HMR code.
154
+ * Processes bundled output and determines whether the browser can hot-accept
155
+ * the update or must fall back to a full reload.
134
156
  *
135
157
  * @param filepath - Path to the bundled output file
136
158
  * @param url - URL path for the bundled file
@@ -138,12 +160,10 @@ class JsHmrStrategy extends HmrStrategy {
138
160
  */
139
161
  async processOutput(filepath, url) {
140
162
  try {
141
- let code = await fileSystem.readFile(filepath);
163
+ const code = await fileSystem.readFile(filepath);
142
164
  if (code.includes("/* [ecopages] hmr */")) {
143
165
  return { success: true, requiresReload: !code.includes("import.meta.hot.accept") };
144
166
  }
145
- code = this.replaceBareSpecifiers(code);
146
- await fileSystem.writeAsync(filepath, code);
147
167
  appLogger.debug(`[JsHmrStrategy] Processed ${url}`);
148
168
  const hasHmrAccept = code.includes("import.meta.hot.accept");
149
169
  return { success: true, requiresReload: !hasHmrAccept };
@@ -152,27 +172,6 @@ class JsHmrStrategy extends HmrStrategy {
152
172
  return { success: false, requiresReload: false };
153
173
  }
154
174
  }
155
- /**
156
- * Replaces bare specifiers with vendor URLs.
157
- *
158
- * Handles both static imports and dynamic imports.
159
- *
160
- * @param code - The bundled code to transform
161
- * @returns The transformed code with vendor URLs
162
- */
163
- replaceBareSpecifiers(code) {
164
- const specifierMap = this.context.getSpecifierMap();
165
- if (specifierMap.size === 0) {
166
- return code;
167
- }
168
- let result = code;
169
- for (const [bareSpec, vendorUrl] of specifierMap.entries()) {
170
- const escaped = bareSpec.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
171
- result = result.replace(new RegExp(`from\\s*["']${escaped}["']`, "g"), `from "${vendorUrl}"`);
172
- result = result.replace(new RegExp(`import\\(["']${escaped}["']\\)`, "g"), `import("${vendorUrl}")`);
173
- }
174
- return result;
175
- }
176
175
  }
177
176
  export {
178
177
  JsHmrStrategy
@@ -1,3 +1,3 @@
1
- export type * from './public-types.js';
1
+ export type * from './types/public-types.js';
2
2
  export type * from './eco/eco.types.js';
3
- export { eco } from './eco/eco.js';
3
+ export { eco } from './eco/eco.browser.js';
@@ -1,4 +1,4 @@
1
- import { eco } from "./eco/eco.js";
1
+ import { eco } from "./eco/eco.browser.js";
2
2
  export {
3
3
  eco
4
4
  };
package/src/index.d.ts CHANGED
@@ -1,5 +1,6 @@
1
- export type * from './public-types.js';
1
+ export type * from './types/public-types.js';
2
2
  export type * from './eco/eco.types.js';
3
3
  export { eco } from './eco/eco.js';
4
- export { EcopagesApp, createApp, type EcopagesAppOptions } from './create-app.js';
5
- export { defineApiHandler, defineGroupHandler, type GroupHandler } from './define-api-handler.js';
4
+ export { defineApiHandler, defineGroupHandler, type GroupHandler } from './adapters/shared/define-api-handler.js';
5
+ export { createEcoBuildPluginFromSourceTransform, createVitePluginsFromAppSourceTransforms, getAppSourceTransforms, createVitePluginFromSourceTransform, normalizeTransformId, type EcoSourceTransform, type EcoSourceTransformResult, type EcoViteCompatiblePlugin, } from './plugins/source-transform.js';
6
+ export { createEcoComponentMetaTransform } from './plugins/eco-component-meta-plugin.js';
package/src/index.js CHANGED
@@ -1,10 +1,21 @@
1
1
  import { eco } from "./eco/eco.js";
2
- import { EcopagesApp, createApp } from "./create-app.js";
3
- import { defineApiHandler, defineGroupHandler } from "./define-api-handler.js";
2
+ import { defineApiHandler, defineGroupHandler } from "./adapters/shared/define-api-handler.js";
3
+ import {
4
+ createEcoBuildPluginFromSourceTransform,
5
+ createVitePluginsFromAppSourceTransforms,
6
+ getAppSourceTransforms,
7
+ createVitePluginFromSourceTransform,
8
+ normalizeTransformId
9
+ } from "./plugins/source-transform.js";
10
+ import { createEcoComponentMetaTransform } from "./plugins/eco-component-meta-plugin.js";
4
11
  export {
5
- EcopagesApp,
6
- createApp,
12
+ createEcoBuildPluginFromSourceTransform,
13
+ createEcoComponentMetaTransform,
14
+ createVitePluginFromSourceTransform,
15
+ createVitePluginsFromAppSourceTransforms,
7
16
  defineApiHandler,
8
17
  defineGroupHandler,
9
- eco
18
+ eco,
19
+ getAppSourceTransforms,
20
+ normalizeTransformId
10
21
  };
@@ -2,8 +2,8 @@
2
2
  * This module contains the ghtml renderer
3
3
  * @module
4
4
  */
5
- import type { EcoComponent, EcoPagesElement, IntegrationRendererRenderOptions, RouteRendererBody } from '../../public-types.js';
6
- import { IntegrationRenderer, type RenderToResponseContext } from '../../route-renderer/integration-renderer.js';
5
+ import type { EcoComponent, EcoPagesElement, IntegrationRendererRenderOptions, RouteRendererBody } from '../../types/public-types.js';
6
+ import { IntegrationRenderer, type RenderToResponseContext } from '../../route-renderer/orchestration/integration-renderer.js';
7
7
  /**
8
8
  * A renderer for the ghtml integration.
9
9
  * It renders a page using the HtmlTemplate and Page components.
@@ -1,4 +1,6 @@
1
- import { IntegrationRenderer } from "../../route-renderer/integration-renderer.js";
1
+ import {
2
+ IntegrationRenderer
3
+ } from "../../route-renderer/orchestration/integration-renderer.js";
2
4
  import { GHTML_PLUGIN_NAME } from "./ghtml.plugin.js";
3
5
  class GhtmlRenderer extends IntegrationRenderer {
4
6
  name = GHTML_PLUGIN_NAME;
@@ -1,5 +1,5 @@
1
- import { IntegrationPlugin, type IntegrationPluginConfig } from '../../plugins/integration-plugin';
2
- import { GhtmlRenderer } from './ghtml-renderer';
1
+ import { IntegrationPlugin, type IntegrationPluginConfig } from '../../plugins/integration-plugin.js';
2
+ import { GhtmlRenderer } from './ghtml-renderer.js';
3
3
  /**
4
4
  * The name of the ghtml plugin
5
5
  */
@@ -1,5 +1,5 @@
1
- import { IntegrationPlugin } from "../../plugins/integration-plugin";
2
- import { GhtmlRenderer } from "./ghtml-renderer";
1
+ import { IntegrationPlugin } from "../../plugins/integration-plugin.js";
2
+ import { GhtmlRenderer } from "./ghtml-renderer.js";
3
3
  const GHTML_PLUGIN_NAME = "ghtml";
4
4
  class GhtmlPlugin extends IntegrationPlugin {
5
5
  renderer = GhtmlRenderer;
@@ -0,0 +1,35 @@
1
+ # Plugin Contracts
2
+
3
+ This directory contains the authoring contracts for Ecopages integrations, processors, and related plugin-facing runtime declarations.
4
+
5
+ ## Purpose
6
+
7
+ The plugin layer defines what packages are allowed to declare about themselves, while core retains orchestration ownership.
8
+
9
+ These contracts are responsible for:
10
+
11
+ - integration registration and lifecycle hooks
12
+ - processor registration and asset capability declaration
13
+ - runtime capability declaration and validation input
14
+ - shared build-plugin bridge types used by integrations and processors
15
+
16
+ ## Main Files
17
+
18
+ - `integration-plugin.ts`: framework-semantics contract for render integrations
19
+ - `processor.ts`: asset-transformation contract for processors
20
+ - `runtime-capability.ts`: runtime compatibility declaration types
21
+ - `source-transform.ts`: bundler-neutral source-transform primitive with Ecopages adapters plus app-level Vite plugin composition helpers
22
+ - `eco-component-meta-plugin.ts`: shared metadata transform used by core loading/build paths
23
+
24
+ ## Ownership Rules
25
+
26
+ - Integrations own rendering semantics, hydration behavior, and integration-specific HMR strategy.
27
+ - Processors own asset semantics, cache ownership, and processor-specific watch behavior.
28
+ - Core owns lifecycle ordering, startup orchestration, and manifest assembly.
29
+
30
+ ## Lifecycle Summary
31
+
32
+ 1. Config build validates and prepares plugin contributions.
33
+ 2. Core seals the app-owned build manifest.
34
+ 3. Runtime startup calls runtime-only setup hooks.
35
+ 4. Request-time rendering and development invalidation reuse those finalized contracts.
@@ -1,9 +1,11 @@
1
- import { existsSync } from "node:fs";
1
+ import { existsSync, readFileSync } from "node:fs";
2
2
  import path from "node:path";
3
3
  const RESOLVABLE_EXTENSIONS = [".ts", ".tsx", ".js", ".jsx", ".mjs", ".cjs", ".mdx", ".css", ".scss", ".sass", ".less"];
4
4
  function findResolvablePath(candidate) {
5
5
  if (path.extname(candidate)) {
6
- return existsSync(candidate) ? candidate : void 0;
6
+ if (existsSync(candidate)) {
7
+ return candidate;
8
+ }
7
9
  }
8
10
  for (const extension of RESOLVABLE_EXTENSIONS) {
9
11
  const fileCandidate = `${candidate}${extension}`;
@@ -19,6 +21,18 @@ function findResolvablePath(candidate) {
19
21
  }
20
22
  return void 0;
21
23
  }
24
+ function resolveAliasedBarrelTarget(resolvedPath) {
25
+ if (!path.basename(resolvedPath).startsWith("index.")) {
26
+ return resolvedPath;
27
+ }
28
+ const source = readFileSync(resolvedPath, "utf8").trim();
29
+ const match = source.match(/^export\s+\*\s+from\s+['"]([^'"]+)['"]\s*;?$/);
30
+ if (!match?.[1]?.startsWith(".")) {
31
+ return resolvedPath;
32
+ }
33
+ const target = findResolvablePath(path.resolve(path.dirname(resolvedPath), match[1]));
34
+ return target ?? resolvedPath;
35
+ }
22
36
  function createAliasResolverPlugin(srcDir) {
23
37
  return {
24
38
  name: "ecopages-alias-resolver",
@@ -27,7 +41,7 @@ function createAliasResolverPlugin(srcDir) {
27
41
  const candidate = path.join(srcDir, args.path.slice(2));
28
42
  const resolved = findResolvablePath(candidate);
29
43
  if (resolved) {
30
- return { path: resolved };
44
+ return { path: resolveAliasedBarrelTarget(resolved) };
31
45
  }
32
46
  return {};
33
47
  });