@ecopages/core 0.2.0-alpha.3 → 0.2.0-alpha.30

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 (436) hide show
  1. package/CHANGELOG.md +66 -66
  2. package/README.md +268 -14
  3. package/package.json +72 -108
  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 +5 -12
  11. package/src/adapters/bun/create-app.js +43 -7
  12. package/src/adapters/bun/hmr-manager.d.ts +72 -26
  13. package/src/adapters/bun/hmr-manager.js +153 -81
  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 +63 -38
  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 +79 -21
  28. package/src/adapters/node/node-hmr-manager.js +167 -114
  29. package/src/adapters/node/server-adapter.d.ts +7 -35
  30. package/src/adapters/node/server-adapter.js +55 -107
  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-render-preparation.d.ts +25 -0
  36. package/src/adapters/shared/explicit-static-render-preparation.js +26 -0
  37. package/src/adapters/shared/explicit-static-route-matcher.d.ts +7 -4
  38. package/src/adapters/shared/explicit-static-route-matcher.js +14 -13
  39. package/src/adapters/shared/file-route-middleware-pipeline.d.ts +7 -10
  40. package/src/adapters/shared/file-route-middleware-pipeline.js +3 -11
  41. package/src/adapters/shared/fs-server-response-factory.d.ts +14 -10
  42. package/src/adapters/shared/fs-server-response-factory.js +11 -27
  43. package/src/adapters/shared/fs-server-response-matcher.d.ts +20 -16
  44. package/src/adapters/shared/fs-server-response-matcher.js +76 -45
  45. package/src/adapters/shared/hmr-entrypoint-registrar.d.ts +55 -0
  46. package/src/adapters/shared/hmr-entrypoint-registrar.js +87 -0
  47. package/src/adapters/shared/hmr-html-response.d.ts +22 -0
  48. package/src/adapters/shared/hmr-html-response.js +32 -0
  49. package/src/adapters/shared/render-context.d.ts +4 -3
  50. package/src/adapters/shared/render-context.js +6 -3
  51. package/src/adapters/shared/runtime-bootstrap.d.ts +38 -0
  52. package/src/adapters/shared/runtime-bootstrap.js +43 -0
  53. package/src/adapters/shared/server-adapter.d.ts +33 -12
  54. package/src/adapters/shared/server-adapter.js +208 -132
  55. package/src/adapters/shared/server-route-handler.d.ts +5 -5
  56. package/src/adapters/shared/server-route-handler.js +7 -16
  57. package/src/adapters/shared/server-static-builder.d.ts +41 -8
  58. package/src/adapters/shared/server-static-builder.js +65 -11
  59. package/src/build/README.md +107 -0
  60. package/src/build/build-adapter.d.ts +168 -3
  61. package/src/build/build-adapter.js +604 -16
  62. package/src/build/build-manifest.d.ts +27 -0
  63. package/src/build/build-manifest.js +30 -0
  64. package/src/build/dev-build-coordinator.d.ts +72 -0
  65. package/src/build/dev-build-coordinator.js +154 -0
  66. package/src/build/esbuild-build-adapter.d.ts +15 -6
  67. package/src/build/esbuild-build-adapter.js +189 -74
  68. package/src/build/runtime-build-executor.d.ts +14 -0
  69. package/src/build/runtime-build-executor.js +22 -0
  70. package/src/build/runtime-specifier-alias-plugin.d.ts +15 -0
  71. package/src/build/runtime-specifier-alias-plugin.js +35 -0
  72. package/src/build/runtime-specifier-aliases.d.ts +5 -0
  73. package/src/build/runtime-specifier-aliases.js +95 -0
  74. package/src/config/README.md +36 -0
  75. package/src/config/config-builder.d.ts +54 -29
  76. package/src/config/config-builder.js +255 -49
  77. package/src/{constants.d.ts → config/constants.d.ts} +13 -0
  78. package/src/{constants.js → config/constants.js} +4 -0
  79. package/src/declarations.d.ts +19 -14
  80. package/src/dev/host-runtime.d.ts +10 -0
  81. package/src/dev/host-runtime.js +24 -0
  82. package/src/dev/sc-server.d.ts +1 -1
  83. package/src/dev/sc-server.js +1 -1
  84. package/src/eco/README.md +70 -16
  85. package/src/eco/eco.browser.d.ts +2 -0
  86. package/src/eco/eco.browser.js +83 -0
  87. package/src/eco/eco.js +32 -57
  88. package/src/eco/eco.types.d.ts +14 -6
  89. package/src/eco/eco.utils.d.ts +1 -40
  90. package/src/eco/eco.utils.js +5 -35
  91. package/src/eco/global-injector-map.d.ts +3 -3
  92. package/src/eco/global-injector-map.js +2 -2
  93. package/src/eco/lazy-injector-map.d.ts +2 -2
  94. package/src/errors/index.d.ts +1 -0
  95. package/src/errors/index.js +3 -1
  96. package/src/hmr/README.md +26 -0
  97. package/src/hmr/client/hmr-runtime.d.ts +1 -6
  98. package/src/hmr/client/hmr-runtime.js +38 -7
  99. package/src/hmr/hmr-strategy.d.ts +16 -13
  100. package/src/hmr/hmr-strategy.js +22 -7
  101. package/src/hmr/hmr.postcss.test.e2e.d.ts +1 -0
  102. package/src/hmr/hmr.postcss.test.e2e.js +31 -0
  103. package/src/hmr/hmr.test.e2e.js +26 -33
  104. package/src/hmr/strategies/default-hmr-strategy.d.ts +2 -2
  105. package/src/hmr/strategies/default-hmr-strategy.js +1 -1
  106. package/src/hmr/strategies/js-hmr-strategy.d.ts +46 -48
  107. package/src/hmr/strategies/js-hmr-strategy.js +64 -74
  108. package/src/index.browser.d.ts +2 -2
  109. package/src/index.browser.js +1 -1
  110. package/src/index.d.ts +4 -3
  111. package/src/index.js +16 -5
  112. package/src/integrations/ghtml/ghtml-renderer.d.ts +3 -2
  113. package/src/integrations/ghtml/ghtml-renderer.js +27 -30
  114. package/src/integrations/ghtml/ghtml.constants.d.ts +1 -0
  115. package/src/integrations/ghtml/ghtml.constants.js +4 -0
  116. package/src/integrations/ghtml/ghtml.plugin.d.ts +2 -6
  117. package/src/integrations/ghtml/ghtml.plugin.js +3 -4
  118. package/src/plugins/README.md +35 -0
  119. package/src/plugins/alias-resolver-plugin.js +17 -3
  120. package/src/plugins/eco-component-meta-plugin.d.ts +14 -1
  121. package/src/plugins/eco-component-meta-plugin.js +27 -22
  122. package/src/plugins/foreign-jsx-override-plugin.d.ts +31 -0
  123. package/src/plugins/foreign-jsx-override-plugin.js +35 -0
  124. package/src/plugins/integration-plugin.d.ts +142 -29
  125. package/src/plugins/integration-plugin.js +103 -14
  126. package/src/plugins/processor.d.ts +17 -2
  127. package/src/plugins/processor.js +22 -3
  128. package/src/plugins/runtime-capability.d.ts +9 -0
  129. package/src/plugins/source-transform.d.ts +46 -0
  130. package/src/plugins/source-transform.js +71 -0
  131. package/src/route-renderer/GRAPH.md +83 -325
  132. package/src/route-renderer/README.md +73 -90
  133. package/src/route-renderer/orchestration/component-render-context.d.ts +89 -0
  134. package/src/route-renderer/orchestration/component-render-context.js +147 -0
  135. package/src/route-renderer/orchestration/declared-ownership-graph.d.ts +18 -0
  136. package/src/route-renderer/orchestration/declared-ownership-graph.js +34 -0
  137. package/src/route-renderer/orchestration/foreign-subtree-execution.service.d.ts +108 -0
  138. package/src/route-renderer/orchestration/foreign-subtree-execution.service.js +206 -0
  139. package/src/route-renderer/orchestration/integration-renderer.d.ts +516 -0
  140. package/src/route-renderer/orchestration/integration-renderer.js +909 -0
  141. package/src/route-renderer/orchestration/ownership-planning.service.d.ts +24 -0
  142. package/src/route-renderer/orchestration/ownership-planning.service.js +63 -0
  143. package/src/route-renderer/orchestration/ownership-validation.service.d.ts +29 -0
  144. package/src/route-renderer/orchestration/ownership-validation.service.js +53 -0
  145. package/src/route-renderer/orchestration/processed-asset-dedupe.d.ts +2 -0
  146. package/src/route-renderer/orchestration/processed-asset-dedupe.js +23 -0
  147. package/src/route-renderer/orchestration/queued-foreign-subtree-resolution.service.d.ts +90 -0
  148. package/src/route-renderer/orchestration/queued-foreign-subtree-resolution.service.js +158 -0
  149. package/src/route-renderer/orchestration/render-output.utils.d.ts +66 -0
  150. package/src/route-renderer/orchestration/render-output.utils.js +171 -0
  151. package/src/route-renderer/orchestration/route-render-orchestrator.d.ts +120 -0
  152. package/src/route-renderer/orchestration/route-render-orchestrator.js +388 -0
  153. package/src/route-renderer/orchestration/template-serialization.d.ts +38 -0
  154. package/src/route-renderer/orchestration/template-serialization.js +45 -0
  155. package/src/route-renderer/page-loading/component-dependency-collection.d.ts +37 -0
  156. package/src/route-renderer/page-loading/component-dependency-collection.js +132 -0
  157. package/src/route-renderer/page-loading/declared-asset-collection.d.ts +24 -0
  158. package/src/route-renderer/page-loading/declared-asset-collection.js +106 -0
  159. package/src/route-renderer/{dependency-resolver.d.ts → page-loading/dependency-resolver.d.ts} +15 -4
  160. package/src/route-renderer/page-loading/dependency-resolver.js +115 -0
  161. package/src/route-renderer/page-loading/ecopages-virtual-imports.d.ts +11 -0
  162. package/src/route-renderer/page-loading/ecopages-virtual-imports.js +57 -0
  163. package/src/route-renderer/page-loading/lazy-entry-collection.d.ts +45 -0
  164. package/src/route-renderer/page-loading/lazy-entry-collection.js +105 -0
  165. package/src/route-renderer/page-loading/lazy-trigger-planning.d.ts +19 -0
  166. package/src/route-renderer/page-loading/lazy-trigger-planning.js +40 -0
  167. package/src/route-renderer/page-loading/module-declaration-aggregation.d.ts +5 -0
  168. package/src/route-renderer/page-loading/module-declaration-aggregation.js +33 -0
  169. package/src/route-renderer/page-loading/module-declaration-scripts.d.ts +3 -0
  170. package/src/route-renderer/page-loading/module-declaration-scripts.js +18 -0
  171. package/src/route-renderer/page-loading/page-dependency-bundling.d.ts +13 -0
  172. package/src/route-renderer/page-loading/page-dependency-bundling.js +137 -0
  173. package/src/route-renderer/page-loading/page-module-loader.d.ts +90 -0
  174. package/src/route-renderer/{page-module-loader.js → page-loading/page-module-loader.js} +39 -14
  175. package/src/route-renderer/route-renderer.d.ts +57 -14
  176. package/src/route-renderer/route-renderer.js +30 -18
  177. package/src/router/README.md +94 -0
  178. package/src/router/client/link-intent.d.ts +53 -0
  179. package/src/router/client/link-intent.js +34 -0
  180. package/src/router/client/link-intent.test.browser.d.ts +1 -0
  181. package/src/router/client/link-intent.test.browser.js +43 -0
  182. package/src/router/client/navigation-coordinator.d.ts +169 -0
  183. package/src/router/client/navigation-coordinator.js +215 -0
  184. package/src/router/server/route-registry.d.ts +78 -0
  185. package/src/router/server/route-registry.js +262 -0
  186. package/src/services/README.md +28 -0
  187. package/src/services/assets/asset-processing-service/asset-dependency-keys.d.ts +3 -0
  188. package/src/services/assets/asset-processing-service/asset-dependency-keys.js +56 -0
  189. package/src/services/assets/asset-processing-service/asset-processing.service.d.ts +103 -0
  190. package/src/services/{asset-processing-service → assets/asset-processing-service}/asset-processing.service.js +124 -89
  191. package/src/services/{asset-processing-service → assets/asset-processing-service}/asset.factory.d.ts +1 -1
  192. package/src/services/{asset-processing-service → assets/asset-processing-service}/asset.factory.js +2 -2
  193. package/src/services/{asset-processing-service → assets/asset-processing-service}/assets.types.d.ts +16 -1
  194. package/src/services/assets/asset-processing-service/browser-runtime-asset.factory.d.ts +55 -0
  195. package/src/services/assets/asset-processing-service/browser-runtime-asset.factory.js +49 -0
  196. package/src/services/assets/asset-processing-service/browser-runtime-entry.factory.d.ts +20 -0
  197. package/src/services/assets/asset-processing-service/browser-runtime-entry.factory.js +41 -0
  198. package/src/services/assets/asset-processing-service/grouped-content-bundles.d.ts +30 -0
  199. package/src/services/assets/asset-processing-service/grouped-content-bundles.js +65 -0
  200. package/src/services/assets/asset-processing-service/index.d.ts +6 -0
  201. package/src/services/assets/asset-processing-service/index.js +6 -0
  202. package/src/services/assets/asset-processing-service/page-package.d.ts +3 -0
  203. package/src/services/assets/asset-processing-service/page-package.js +74 -0
  204. package/src/services/{asset-processing-service → assets/asset-processing-service}/processor.interface.d.ts +2 -2
  205. package/src/services/{asset-processing-service → assets/asset-processing-service}/processor.registry.d.ts +2 -2
  206. package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/base/base-processor.d.ts +1 -1
  207. package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/base/base-processor.js +11 -5
  208. package/src/services/assets/asset-processing-service/processors/base/base-script-processor.d.ts +22 -0
  209. package/src/services/assets/asset-processing-service/processors/base/base-script-processor.js +136 -0
  210. package/src/services/assets/asset-processing-service/processors/index.d.ts +5 -0
  211. package/src/services/assets/asset-processing-service/processors/index.js +5 -0
  212. package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/script/content-script.processor.d.ts +3 -2
  213. package/src/services/assets/asset-processing-service/processors/script/content-script.processor.js +119 -0
  214. package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/script/file-script.processor.d.ts +4 -3
  215. package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/script/file-script.processor.js +28 -7
  216. package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/script/node-module-script.processor.d.ts +3 -3
  217. package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/script/node-module-script.processor.js +12 -7
  218. package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/stylesheet/content-stylesheet.processor.d.ts +5 -2
  219. package/src/services/assets/asset-processing-service/processors/stylesheet/content-stylesheet.processor.js +59 -0
  220. package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/stylesheet/file-stylesheet.processor.d.ts +2 -2
  221. package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/stylesheet/file-stylesheet.processor.js +9 -3
  222. package/src/services/assets/asset-processing-service/ungrouped-dependency-processing.d.ts +18 -0
  223. package/src/services/assets/asset-processing-service/ungrouped-dependency-processing.js +45 -0
  224. package/src/services/assets/browser-bundle.service.d.ts +73 -0
  225. package/src/services/assets/browser-bundle.service.js +41 -0
  226. package/src/services/{page-request-cache-coordinator.service.d.ts → cache/page-request-cache-coordinator.service.d.ts} +2 -2
  227. package/src/services/{page-request-cache-coordinator.service.js → cache/page-request-cache-coordinator.service.js} +3 -1
  228. package/src/services/html/html-rewriter-provider.service.d.ts +37 -0
  229. package/src/services/html/html-rewriter-provider.service.js +68 -0
  230. package/src/services/html/html-transformer.service.d.ts +87 -0
  231. package/src/services/html/html-transformer.service.js +216 -0
  232. package/src/services/invalidation/development-invalidation.service.d.ts +74 -0
  233. package/src/services/invalidation/development-invalidation.service.js +190 -0
  234. package/src/services/module-loading/app-module-loader.service.d.ts +7 -0
  235. package/src/services/module-loading/app-server-module-transpiler.service.d.ts +24 -0
  236. package/src/services/module-loading/app-server-module-transpiler.service.js +115 -0
  237. package/src/services/module-loading/host-module-loader-registry.d.ts +4 -0
  238. package/src/services/module-loading/host-module-loader-registry.js +15 -0
  239. package/src/services/module-loading/module-loading-types.d.ts +2 -0
  240. package/src/services/module-loading/module-loading-types.js +0 -0
  241. package/src/services/module-loading/node-bootstrap-plugin.d.ts +42 -0
  242. package/src/services/module-loading/node-bootstrap-plugin.js +216 -0
  243. package/src/services/module-loading/page-module-import.service.d.ts +76 -0
  244. package/src/services/module-loading/page-module-import.service.js +170 -0
  245. package/src/services/module-loading/server-module-transpiler.service.d.ts +63 -0
  246. package/src/services/module-loading/server-module-transpiler.service.js +64 -0
  247. package/src/services/module-loading/source-module-support.d.ts +5 -0
  248. package/src/services/module-loading/source-module-support.js +8 -0
  249. package/src/services/runtime-state/dev-graph.service.d.ts +118 -0
  250. package/src/services/runtime-state/dev-graph.service.js +162 -0
  251. package/src/services/runtime-state/entrypoint-dependency-graph.service.d.ts +41 -0
  252. package/src/services/runtime-state/entrypoint-dependency-graph.service.js +85 -0
  253. package/src/services/runtime-state/server-invalidation-state.service.d.ts +26 -0
  254. package/src/services/runtime-state/server-invalidation-state.service.js +35 -0
  255. package/src/services/{schema-validation-service.d.ts → validation/schema-validation-service.d.ts} +1 -1
  256. package/src/static-site-generator/README.md +26 -0
  257. package/src/static-site-generator/static-site-generator.d.ts +67 -20
  258. package/src/static-site-generator/static-site-generator.js +182 -138
  259. package/src/{internal-types.d.ts → types/internal-types.d.ts} +62 -30
  260. package/src/types/internal-types.js +0 -0
  261. package/src/{public-types.d.ts → types/public-types.d.ts} +201 -32
  262. package/src/types/public-types.js +0 -0
  263. package/src/utils/html-escaping.d.ts +7 -0
  264. package/src/utils/html-escaping.js +6 -0
  265. package/src/utils/locals-utils.d.ts +1 -1
  266. package/src/utils/parse-cli-args.d.ts +4 -1
  267. package/src/utils/parse-cli-args.js +16 -1
  268. package/src/utils/resolve-work-dir.d.ts +11 -0
  269. package/src/utils/resolve-work-dir.js +31 -0
  270. package/src/watchers/project-watcher.d.ts +40 -29
  271. package/src/watchers/project-watcher.js +126 -116
  272. package/src/watchers/project-watcher.test-helpers.d.ts +2 -2
  273. package/src/watchers/project-watcher.test-helpers.js +6 -6
  274. package/src/adapters/abstract/application-adapter.ts +0 -337
  275. package/src/adapters/abstract/router-adapter.ts +0 -30
  276. package/src/adapters/abstract/server-adapter.ts +0 -79
  277. package/src/adapters/bun/client-bridge.ts +0 -62
  278. package/src/adapters/bun/create-app.ts +0 -189
  279. package/src/adapters/bun/define-api-handler.d.ts +0 -61
  280. package/src/adapters/bun/define-api-handler.ts +0 -114
  281. package/src/adapters/bun/hmr-manager.ts +0 -296
  282. package/src/adapters/bun/index.ts +0 -3
  283. package/src/adapters/bun/server-adapter.ts +0 -492
  284. package/src/adapters/bun/server-lifecycle.ts +0 -154
  285. package/src/adapters/index.ts +0 -6
  286. package/src/adapters/node/create-app.ts +0 -179
  287. package/src/adapters/node/index.d.ts +0 -4
  288. package/src/adapters/node/index.js +0 -8
  289. package/src/adapters/node/index.ts +0 -9
  290. package/src/adapters/node/node-client-bridge.ts +0 -79
  291. package/src/adapters/node/node-hmr-manager.ts +0 -289
  292. package/src/adapters/node/server-adapter.ts +0 -561
  293. package/src/adapters/node/static-content-server.ts +0 -203
  294. package/src/adapters/shared/api-response.ts +0 -104
  295. package/src/adapters/shared/application-adapter.ts +0 -199
  296. package/src/adapters/shared/explicit-static-route-matcher.ts +0 -134
  297. package/src/adapters/shared/file-route-middleware-pipeline.ts +0 -123
  298. package/src/adapters/shared/fs-server-response-factory.ts +0 -118
  299. package/src/adapters/shared/fs-server-response-matcher.ts +0 -198
  300. package/src/adapters/shared/render-context.ts +0 -105
  301. package/src/adapters/shared/server-adapter.ts +0 -442
  302. package/src/adapters/shared/server-route-handler.ts +0 -166
  303. package/src/adapters/shared/server-static-builder.ts +0 -82
  304. package/src/build/build-adapter.ts +0 -132
  305. package/src/build/build-types.ts +0 -83
  306. package/src/build/esbuild-build-adapter.ts +0 -510
  307. package/src/config/config-builder.ts +0 -474
  308. package/src/constants.ts +0 -39
  309. package/src/create-app.ts +0 -87
  310. package/src/define-api-handler.js +0 -15
  311. package/src/define-api-handler.ts +0 -66
  312. package/src/dev/sc-server.ts +0 -143
  313. package/src/eco/component-render-context.d.ts +0 -105
  314. package/src/eco/component-render-context.js +0 -77
  315. package/src/eco/component-render-context.ts +0 -202
  316. package/src/eco/eco.ts +0 -221
  317. package/src/eco/eco.types.ts +0 -202
  318. package/src/eco/eco.utils.ts +0 -89
  319. package/src/eco/global-injector-map.ts +0 -112
  320. package/src/eco/lazy-injector-map.ts +0 -120
  321. package/src/eco/module-dependencies.ts +0 -75
  322. package/src/errors/http-error.ts +0 -72
  323. package/src/errors/index.ts +0 -2
  324. package/src/errors/locals-access-error.ts +0 -7
  325. package/src/global/app-logger.ts +0 -4
  326. 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
  327. package/src/hmr/client/__screenshots__/hmr-runtime.test.browser.ts/HMR-Runtime-HMR-Server-Integration-should-load-fixture-app-page-1.png +0 -0
  328. package/src/hmr/client/__screenshots__/hmr-runtime.test.browser.ts/HMR-Runtime-WebSocket-Connection-should-connect-to-correct-HMR-endpoint-1.png +0 -0
  329. package/src/hmr/client/hmr-runtime.ts +0 -121
  330. package/src/hmr/hmr-strategy.ts +0 -172
  331. package/src/hmr/hmr.test.e2e.ts +0 -75
  332. package/src/hmr/strategies/default-hmr-strategy.ts +0 -60
  333. package/src/hmr/strategies/js-hmr-strategy.ts +0 -320
  334. package/src/index.browser.ts +0 -3
  335. package/src/index.ts +0 -5
  336. package/src/integrations/ghtml/ghtml-renderer.ts +0 -93
  337. package/src/integrations/ghtml/ghtml.plugin.ts +0 -32
  338. package/src/internal-types.ts +0 -212
  339. package/src/plugins/alias-resolver-plugin.ts +0 -45
  340. package/src/plugins/eco-component-meta-plugin.ts +0 -474
  341. package/src/plugins/integration-plugin.ts +0 -184
  342. package/src/plugins/processor.ts +0 -220
  343. package/src/public-types.ts +0 -1260
  344. package/src/route-renderer/component-graph-executor.d.ts +0 -32
  345. package/src/route-renderer/component-graph-executor.js +0 -31
  346. package/src/route-renderer/component-graph-executor.ts +0 -84
  347. package/src/route-renderer/component-graph.d.ts +0 -42
  348. package/src/route-renderer/component-graph.js +0 -72
  349. package/src/route-renderer/component-graph.ts +0 -159
  350. package/src/route-renderer/component-marker.d.ts +0 -52
  351. package/src/route-renderer/component-marker.js +0 -46
  352. package/src/route-renderer/component-marker.ts +0 -117
  353. package/src/route-renderer/dependency-resolver.js +0 -428
  354. package/src/route-renderer/dependency-resolver.ts +0 -596
  355. package/src/route-renderer/html-post-processing.service.d.ts +0 -40
  356. package/src/route-renderer/html-post-processing.service.js +0 -86
  357. package/src/route-renderer/html-post-processing.service.ts +0 -103
  358. package/src/route-renderer/integration-renderer.d.ts +0 -339
  359. package/src/route-renderer/integration-renderer.js +0 -526
  360. package/src/route-renderer/integration-renderer.ts +0 -696
  361. package/src/route-renderer/marker-graph-resolver.d.ts +0 -76
  362. package/src/route-renderer/marker-graph-resolver.js +0 -93
  363. package/src/route-renderer/marker-graph-resolver.ts +0 -153
  364. package/src/route-renderer/page-module-loader.d.ts +0 -61
  365. package/src/route-renderer/page-module-loader.ts +0 -153
  366. package/src/route-renderer/render-execution.service.d.ts +0 -69
  367. package/src/route-renderer/render-execution.service.js +0 -91
  368. package/src/route-renderer/render-execution.service.ts +0 -158
  369. package/src/route-renderer/render-preparation.service.d.ts +0 -112
  370. package/src/route-renderer/render-preparation.service.js +0 -243
  371. package/src/route-renderer/render-preparation.service.ts +0 -358
  372. package/src/route-renderer/route-renderer.ts +0 -80
  373. package/src/router/fs-router-scanner.d.ts +0 -41
  374. package/src/router/fs-router-scanner.js +0 -155
  375. package/src/router/fs-router-scanner.ts +0 -217
  376. package/src/router/fs-router.d.ts +0 -26
  377. package/src/router/fs-router.js +0 -100
  378. package/src/router/fs-router.ts +0 -122
  379. package/src/services/asset-processing-service/asset-processing.service.d.ts +0 -41
  380. package/src/services/asset-processing-service/asset-processing.service.ts +0 -306
  381. package/src/services/asset-processing-service/asset.factory.ts +0 -105
  382. package/src/services/asset-processing-service/assets.types.ts +0 -112
  383. package/src/services/asset-processing-service/index.d.ts +0 -3
  384. package/src/services/asset-processing-service/index.js +0 -3
  385. package/src/services/asset-processing-service/index.ts +0 -3
  386. package/src/services/asset-processing-service/processor.interface.ts +0 -27
  387. package/src/services/asset-processing-service/processor.registry.ts +0 -18
  388. package/src/services/asset-processing-service/processors/base/base-processor.ts +0 -76
  389. package/src/services/asset-processing-service/processors/base/base-script-processor.d.ts +0 -16
  390. package/src/services/asset-processing-service/processors/base/base-script-processor.js +0 -80
  391. package/src/services/asset-processing-service/processors/base/base-script-processor.ts +0 -105
  392. package/src/services/asset-processing-service/processors/index.d.ts +0 -5
  393. package/src/services/asset-processing-service/processors/index.js +0 -5
  394. package/src/services/asset-processing-service/processors/index.ts +0 -5
  395. package/src/services/asset-processing-service/processors/script/content-script.processor.js +0 -57
  396. package/src/services/asset-processing-service/processors/script/content-script.processor.ts +0 -66
  397. package/src/services/asset-processing-service/processors/script/file-script.processor.ts +0 -88
  398. package/src/services/asset-processing-service/processors/script/node-module-script.processor.ts +0 -84
  399. package/src/services/asset-processing-service/processors/stylesheet/content-stylesheet.processor.js +0 -25
  400. package/src/services/asset-processing-service/processors/stylesheet/content-stylesheet.processor.ts +0 -27
  401. package/src/services/asset-processing-service/processors/stylesheet/file-stylesheet.processor.ts +0 -77
  402. package/src/services/cache/cache.types.ts +0 -126
  403. package/src/services/cache/index.ts +0 -18
  404. package/src/services/cache/memory-cache-store.ts +0 -130
  405. package/src/services/cache/page-cache-service.ts +0 -202
  406. package/src/services/html-transformer.service.d.ts +0 -50
  407. package/src/services/html-transformer.service.js +0 -163
  408. package/src/services/html-transformer.service.ts +0 -217
  409. package/src/services/page-module-import.service.d.ts +0 -37
  410. package/src/services/page-module-import.service.js +0 -88
  411. package/src/services/page-module-import.service.ts +0 -129
  412. package/src/services/page-request-cache-coordinator.service.ts +0 -128
  413. package/src/services/schema-validation-service.ts +0 -204
  414. package/src/services/validation/standard-schema.types.ts +0 -68
  415. package/src/static-site-generator/static-site-generator.ts +0 -359
  416. package/src/utils/css.d.ts +0 -1
  417. package/src/utils/css.js +0 -7
  418. package/src/utils/css.ts +0 -5
  419. package/src/utils/deep-merge.ts +0 -47
  420. package/src/utils/hash.ts +0 -5
  421. package/src/utils/html.ts +0 -1
  422. package/src/utils/invariant.ts +0 -15
  423. package/src/utils/locals-utils.ts +0 -37
  424. package/src/utils/parse-cli-args.ts +0 -83
  425. package/src/utils/path-utils.module.ts +0 -14
  426. package/src/utils/runtime.ts +0 -44
  427. package/src/utils/server-utils.module.ts +0 -67
  428. package/src/watchers/project-watcher.test-helpers.ts +0 -41
  429. package/src/watchers/project-watcher.ts +0 -344
  430. /package/src/adapters/{bun → shared}/define-api-handler.js +0 -0
  431. /package/src/{internal-types.js → plugins/runtime-capability.js} +0 -0
  432. /package/src/services/{asset-processing-service → assets/asset-processing-service}/assets.types.js +0 -0
  433. /package/src/services/{asset-processing-service → assets/asset-processing-service}/processor.interface.js +0 -0
  434. /package/src/services/{asset-processing-service → assets/asset-processing-service}/processor.registry.js +0 -0
  435. /package/src/{public-types.js → services/module-loading/app-module-loader.service.js} +0 -0
  436. /package/src/services/{schema-validation-service.js → validation/schema-validation-service.js} +0 -0
@@ -1,4 +1,4 @@
1
- import type { ClientBridgeEvent } from '../public-types';
1
+ import type { ClientBridgeEvent } from '../types/public-types.js';
2
2
  /**
3
3
  * HMR Strategy Pattern
4
4
  *
@@ -18,11 +18,13 @@ import type { ClientBridgeEvent } from '../public-types';
18
18
  * async process(filePath: string): Promise<HmrAction> {
19
19
  * return {
20
20
  * type: 'broadcast',
21
- * events: [{ type: 'update', path: filePath, timestamp: Date.now() }]
21
+ * events: [{ type: 'update', path: filePath, timestamp: Date.now() }],
22
22
  * };
23
23
  * }
24
24
  * }
25
-
25
+ * ```
26
+ */
27
+ /**
26
28
  * Defines the category of an HMR strategy, which determines its execution priority.
27
29
  * Strategies are evaluated in descending order: INTEGRATION → ASSET → SCRIPT → FALLBACK.
28
30
  *
@@ -30,28 +32,29 @@ import type { ClientBridgeEvent } from '../public-types';
30
32
  * The numeric values represent base priorities. Strategies can fine-tune their priority
31
33
  * using the `priorityOffset` property.
32
34
  */
33
- export declare enum HmrStrategyType {
35
+ export declare const HmrStrategyType: {
34
36
  /**
35
37
  * Integration-specific strategies (React, Lit, etc.)
36
38
  * Highest priority to allow framework-specific HMR handling.
37
39
  */
38
- INTEGRATION = 100,
40
+ readonly INTEGRATION: 100;
39
41
  /**
40
42
  * Asset processing strategies (CSS, images, etc.)
41
43
  * High priority for specialized asset handling.
42
44
  */
43
- ASSET = 50,
45
+ readonly ASSET: 50;
44
46
  /**
45
47
  * Generic script bundling strategies (JS/TS)
46
48
  * Medium priority for standard script processing.
47
49
  */
48
- SCRIPT = 25,
50
+ readonly SCRIPT: 25;
49
51
  /**
50
52
  * Fallback strategy for unhandled file types.
51
53
  * Lowest priority, triggers full page reload.
52
54
  */
53
- FALLBACK = 0
54
- }
55
+ readonly FALLBACK: 0;
56
+ };
57
+ export type HmrStrategyType = (typeof HmrStrategyType)[keyof typeof HmrStrategyType];
55
58
  /**
56
59
  * Represents an action to be taken after processing a file change.
57
60
  */
@@ -62,7 +65,7 @@ export interface HmrAction {
62
65
  type: 'broadcast' | 'none';
63
66
  /**
64
67
  * The HMR events to broadcast, if type is 'broadcast'.
65
- * capable of broadcasting multiple events at once.
68
+ * Multiple events may be broadcast in one action.
66
69
  */
67
70
  events?: ClientBridgeEvent[];
68
71
  }
@@ -74,8 +77,8 @@ export interface HmrAction {
74
77
  * whether they match the changed file path.
75
78
  *
76
79
  * @remarks
77
- * Strategies should be stateless and idempotent. The same file change should always
78
- * produce the same result when processed by the same strategy.
80
+ * Strategies are expected to be stateless and idempotent. The same file change
81
+ * should produce the same result when processed by the same strategy.
79
82
  *
80
83
  * @example
81
84
  * ```typescript
@@ -120,7 +123,7 @@ export declare abstract class HmrStrategy {
120
123
  * Determines if this strategy can handle the given file path.
121
124
  *
122
125
  * @param filePath - Absolute path to the changed file
123
- * @returns True if this strategy should process the file
126
+ * @returns `true` when this strategy should process the file
124
127
  *
125
128
  * @example
126
129
  * ```typescript
@@ -1,10 +1,25 @@
1
- var HmrStrategyType = /* @__PURE__ */ ((HmrStrategyType2) => {
2
- HmrStrategyType2[HmrStrategyType2["INTEGRATION"] = 100] = "INTEGRATION";
3
- HmrStrategyType2[HmrStrategyType2["ASSET"] = 50] = "ASSET";
4
- HmrStrategyType2[HmrStrategyType2["SCRIPT"] = 25] = "SCRIPT";
5
- HmrStrategyType2[HmrStrategyType2["FALLBACK"] = 0] = "FALLBACK";
6
- return HmrStrategyType2;
7
- })(HmrStrategyType || {});
1
+ const HmrStrategyType = {
2
+ /**
3
+ * Integration-specific strategies (React, Lit, etc.)
4
+ * Highest priority to allow framework-specific HMR handling.
5
+ */
6
+ INTEGRATION: 100,
7
+ /**
8
+ * Asset processing strategies (CSS, images, etc.)
9
+ * High priority for specialized asset handling.
10
+ */
11
+ ASSET: 50,
12
+ /**
13
+ * Generic script bundling strategies (JS/TS)
14
+ * Medium priority for standard script processing.
15
+ */
16
+ SCRIPT: 25,
17
+ /**
18
+ * Fallback strategy for unhandled file types.
19
+ * Lowest priority, triggers full page reload.
20
+ */
21
+ FALLBACK: 0
22
+ };
8
23
  class HmrStrategy {
9
24
  /**
10
25
  * Optional offset to fine-tune priority within the same category.
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,31 @@
1
+ import { test, expect } from "@playwright/test";
2
+ import { readFileSync } from "node:fs";
3
+ import { writeFile } from "node:fs/promises";
4
+ import { resolve } from "node:path";
5
+ const FIXTURE_DIR = resolve(process.cwd(), "packages/core/__fixtures__/app");
6
+ const TEST_CSS_FILE = resolve(FIXTURE_DIR, "src/pages/postcss-hmr.css");
7
+ test.describe("HMR E2E PostCSS", () => {
8
+ test("should hot-update processor-owned CSS without a full page reload", async ({ page }) => {
9
+ const originalCss = readFileSync(TEST_CSS_FILE, "utf-8");
10
+ const title = page.locator(".postcss-title").first();
11
+ try {
12
+ await page.goto("/postcss-hmr", { waitUntil: "networkidle" });
13
+ await expect(title).toBeVisible();
14
+ const initialColor = await title.evaluate((el) => getComputedStyle(el).color);
15
+ expect(initialColor).toBeTruthy();
16
+ await page.evaluate(() => {
17
+ window.__postcssReloadProbe = "before-change";
18
+ });
19
+ const modifiedCss = originalCss.replace(".postcss-title {", ".postcss-title {\n color: rgb(255, 0, 0);");
20
+ await writeFile(TEST_CSS_FILE, modifiedCss, { flush: true });
21
+ await expect.poll(async () => title.evaluate((el) => getComputedStyle(el).color), { timeout: 1e4 }).toBe("rgb(255, 0, 0)");
22
+ await expect(
23
+ page.evaluate(
24
+ () => window.__postcssReloadProbe ?? null
25
+ )
26
+ ).resolves.toBe("before-change");
27
+ } finally {
28
+ await writeFile(TEST_CSS_FILE, originalCss, { flush: true });
29
+ }
30
+ });
31
+ });
@@ -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.
@@ -17,27 +20,7 @@ export interface JsHmrContext {
17
20
  * Map of registered entrypoints to their output URLs.
18
21
  */
19
22
  getWatchedFiles(): Map<string, string>;
20
- /**
21
- * Map of bare specifiers to vendor URLs for import resolution.
22
- */
23
- 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;
23
+ getEntrypointDependencyGraph(): EntrypointDependencyGraph;
41
24
  /**
42
25
  * Directory where HMR bundles are written.
43
26
  */
@@ -50,23 +33,47 @@ export interface JsHmrContext {
50
33
  * Absolute path to the source directory.
51
34
  */
52
35
  getSrcDir(): string;
36
+ /**
37
+ * Absolute path to the pages directory.
38
+ */
39
+ getPagesDir(): string;
40
+ /**
41
+ * Absolute path to the layouts directory.
42
+ */
43
+ getLayoutsDir(): string;
44
+ /**
45
+ * All configured route-template extensions across integrations.
46
+ */
47
+ getTemplateExtensions(): string[];
48
+ /**
49
+ * Browser bundler used to rebuild changed entrypoints.
50
+ */
51
+ getBrowserBundleService(): BrowserBundleExecutor;
52
+ /**
53
+ * Returns whether a watched entrypoint should be rebuilt by the generic JS strategy.
54
+ *
55
+ * @remarks
56
+ * Integrations with higher-priority HMR strategies can use this to keep the
57
+ * generic JS strategy from overwriting their emitted entrypoints when a shared
58
+ * dependency changes.
59
+ */
60
+ shouldProcessEntrypoint?(entrypointPath: string): boolean;
53
61
  }
54
62
  /**
55
63
  * Strategy for handling JavaScript/TypeScript file changes with hot reloading.
56
64
  *
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
65
  * The processing steps are:
61
66
  * 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
67
+ * 2. Rebuild impacted entrypoints, or all watched entrypoints when no runtime
68
+ * dependency graph is available
69
+ * 3. Emit rebuilt entrypoint bundles for browser delivery
64
70
  * 4. Inject generic HMR boilerplate
65
71
  * 5. Broadcast update events for each rebuilt entrypoint
66
72
  *
67
73
  * @remarks
68
- * Future enhancement: Track dependencies using Bun's transpiler API to only
69
- * rebuild affected entrypoints instead of all of them.
74
+ * Node can provide dependency-graph metadata, so this strategy can rebuild only
75
+ * the entrypoints impacted by a changed dependency. Runtimes that do not expose
76
+ * that metadata intentionally keep the rebuild-all fallback.
70
77
  *
71
78
  * @see https://bun.sh/docs/runtime/transpiler
72
79
  *
@@ -74,7 +81,6 @@ export interface JsHmrContext {
74
81
  * ```typescript
75
82
  * const context = {
76
83
  * getWatchedFiles: () => watchedFilesMap,
77
- * getSpecifierMap: () => specifierMap,
78
84
  * getDistDir: () => '/path/to/dist/_hmr',
79
85
  * getPlugins: () => [],
80
86
  * getSrcDir: () => '/path/to/src'
@@ -83,8 +89,8 @@ export interface JsHmrContext {
83
89
  * ```
84
90
  */
85
91
  export declare class JsHmrStrategy extends HmrStrategy {
92
+ readonly type: 25;
86
93
  private context;
87
- readonly type = HmrStrategyType.SCRIPT;
88
94
  constructor(context: JsHmrContext);
89
95
  /**
90
96
  * Determines if the file is a JS/TS file that could affect registered entrypoints.
@@ -105,32 +111,24 @@ export declare class JsHmrStrategy extends HmrStrategy {
105
111
  * @remarks
106
112
  * If runtime-specific dependency graph hooks are unavailable, this strategy
107
113
  * falls back to rebuilding all watched entrypoints.
114
+ * When multiple entrypoints are impacted they are bundled in a single esbuild
115
+ * invocation to share AST parsing and chunk deduplication.
108
116
  * @returns Action to broadcast update events
109
117
  */
110
118
  process(filePath: string): Promise<HmrAction>;
111
119
  /**
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
120
+ * Bundles one or more entrypoints in a single esbuild invocation.
121
+ * Uses the source directory as the output base so that the directory structure
122
+ * is preserved under the HMR dist folder.
117
123
  */
118
- private bundleEntrypoint;
124
+ private bundleEntrypoints;
119
125
  /**
120
- * Processes bundled output by replacing specifiers and injecting HMR code.
126
+ * Processes bundled output and determines whether the browser can hot-accept
127
+ * the update or must fall back to a full reload.
121
128
  *
122
129
  * @param filepath - Path to the bundled output file
123
130
  * @param url - URL path for the bundled file
124
131
  * @returns True if processing was successful and update should be broadcast
125
132
  */
126
133
  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
134
  }
@@ -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,17 +23,23 @@ 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
31
  if (!isJsTs || !isInSrc) {
30
32
  return false;
31
33
  }
34
+ if (isIntegrationTemplate) {
35
+ return false;
36
+ }
32
37
  if (watchedFiles.has(filePath)) {
33
38
  return true;
34
39
  }
35
- if (this.context.getDependencyEntrypoints) {
36
- return this.context.getDependencyEntrypoints(filePath).size > 0;
40
+ const entrypointDependencyGraph = this.context.getEntrypointDependencyGraph();
41
+ if (entrypointDependencyGraph.supportsSelectiveInvalidation()) {
42
+ return entrypointDependencyGraph.getDependencyEntrypoints(filePath).size > 0;
37
43
  }
38
44
  return true;
39
45
  }
@@ -45,6 +51,8 @@ class JsHmrStrategy extends HmrStrategy {
45
51
  * @remarks
46
52
  * If runtime-specific dependency graph hooks are unavailable, this strategy
47
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.
48
56
  * @returns Action to broadcast update events
49
57
  */
50
58
  async process(filePath) {
@@ -54,24 +62,37 @@ class JsHmrStrategy extends HmrStrategy {
54
62
  appLogger.debug(`[JsHmrStrategy] No watched files to rebuild`);
55
63
  return { type: "none" };
56
64
  }
57
- const updates = [];
58
- let reloadRequired = false;
59
- const dependencyHits = this.context.getDependencyEntrypoints?.(filePath) ?? /* @__PURE__ */ new Set();
65
+ const dependencyHits = this.context.getEntrypointDependencyGraph().getDependencyEntrypoints(filePath);
60
66
  const hasDependencyHit = dependencyHits.size > 0;
61
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
+ );
62
71
  if (!hasDependencyHit) {
63
72
  appLogger.debug("[JsHmrStrategy] Dependency graph miss, rebuilding all watched entrypoints");
64
73
  }
65
- 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) {
66
84
  const outputUrl = watchedFiles.get(entrypoint);
67
- if (!outputUrl) {
68
- 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);
69
89
  }
70
- 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);
71
95
  if (result.success) {
72
- if (result.dependencies && this.context.setEntrypointDependencies) {
73
- this.context.setEntrypointDependencies(entrypoint, result.dependencies);
74
- }
75
96
  updates.push(outputUrl);
76
97
  if (result.requiresReload) {
77
98
  reloadRequired = true;
@@ -83,18 +104,14 @@ class JsHmrStrategy extends HmrStrategy {
83
104
  appLogger.debug(`[JsHmrStrategy] Full reload required (no HMR accept found)`);
84
105
  return {
85
106
  type: "broadcast",
86
- events: [
87
- {
88
- type: "reload"
89
- }
90
- ]
107
+ events: [{ type: "reload" }]
91
108
  };
92
109
  }
93
110
  return {
94
111
  type: "broadcast",
95
- events: updates.map((path2) => ({
112
+ events: updates.map((p) => ({
96
113
  type: "update",
97
- path: path2,
114
+ path: p,
98
115
  timestamp: Date.now()
99
116
  }))
100
117
  };
@@ -102,44 +119,40 @@ class JsHmrStrategy extends HmrStrategy {
102
119
  return { type: "none" };
103
120
  }
104
121
  /**
105
- * Bundles a single entrypoint and processes the output.
106
- *
107
- * @param entrypointPath - Absolute path to the source file
108
- * @param outputUrl - URL path for the bundled file
109
- * @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.
110
125
  */
111
- async bundleEntrypoint(entrypointPath, outputUrl) {
126
+ async bundleEntrypoints(entrypoints) {
112
127
  try {
113
- const srcDir = this.context.getSrcDir();
114
- const relativePath = path.relative(srcDir, entrypointPath);
115
- const relativePathJs = relativePath.replace(/\.(tsx?|jsx?)$/, ".js");
116
- const outputPath = path.join(this.context.getDistDir(), relativePathJs);
117
- const result = await defaultBuildAdapter.build({
118
- entrypoints: [entrypointPath],
128
+ const result = await this.context.getBrowserBundleService().bundle({
129
+ profile: "hmr-entrypoint",
130
+ entrypoints,
119
131
  outdir: this.context.getDistDir(),
120
- naming: relativePathJs,
121
- ...defaultBuildAdapter.getTranspileOptions("hmr-entrypoint"),
132
+ outbase: this.context.getSrcDir(),
133
+ naming: "[dir]/[name]",
122
134
  plugins: this.context.getPlugins(),
123
- minify: false,
124
- external: ["react", "react-dom"]
135
+ minify: false
125
136
  });
126
137
  if (!result.success) {
127
- appLogger.error(`[JsHmrStrategy] Failed to build ${entrypointPath}:`, result.logs);
128
- return { success: false, requiresReload: false, dependencies: void 0 };
138
+ appLogger.error("[JsHmrStrategy] Batched build failed:", result.logs);
139
+ return { success: false };
129
140
  }
130
- const dependencyGraph = result.dependencyGraph?.entrypoints?.[path.resolve(entrypointPath)] ?? [];
131
- const output = await this.processOutput(outputPath, outputUrl);
132
- return {
133
- ...output,
134
- dependencies: dependencyGraph
135
- };
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 };
136
148
  } catch (error) {
137
- appLogger.error(`[JsHmrStrategy] Error bundling ${entrypointPath}:`, error);
138
- return { success: false, requiresReload: false, dependencies: void 0 };
149
+ appLogger.error("[JsHmrStrategy] Error in batched build:", error);
150
+ return { success: false };
139
151
  }
140
152
  }
141
153
  /**
142
- * 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.
143
156
  *
144
157
  * @param filepath - Path to the bundled output file
145
158
  * @param url - URL path for the bundled file
@@ -147,12 +160,10 @@ class JsHmrStrategy extends HmrStrategy {
147
160
  */
148
161
  async processOutput(filepath, url) {
149
162
  try {
150
- let code = await fileSystem.readFile(filepath);
163
+ const code = await fileSystem.readFile(filepath);
151
164
  if (code.includes("/* [ecopages] hmr */")) {
152
165
  return { success: true, requiresReload: !code.includes("import.meta.hot.accept") };
153
166
  }
154
- code = this.replaceBareSpecifiers(code);
155
- await fileSystem.writeAsync(filepath, code);
156
167
  appLogger.debug(`[JsHmrStrategy] Processed ${url}`);
157
168
  const hasHmrAccept = code.includes("import.meta.hot.accept");
158
169
  return { success: true, requiresReload: !hasHmrAccept };
@@ -161,27 +172,6 @@ class JsHmrStrategy extends HmrStrategy {
161
172
  return { success: false, requiresReload: false };
162
173
  }
163
174
  }
164
- /**
165
- * Replaces bare specifiers with vendor URLs.
166
- *
167
- * Handles both static imports and dynamic imports.
168
- *
169
- * @param code - The bundled code to transform
170
- * @returns The transformed code with vendor URLs
171
- */
172
- replaceBareSpecifiers(code) {
173
- const specifierMap = this.context.getSpecifierMap();
174
- if (specifierMap.size === 0) {
175
- return code;
176
- }
177
- let result = code;
178
- for (const [bareSpec, vendorUrl] of specifierMap.entries()) {
179
- const escaped = bareSpec.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
180
- result = result.replace(new RegExp(`from\\s*["']${escaped}["']`, "g"), `from "${vendorUrl}"`);
181
- result = result.replace(new RegExp(`import\\(["']${escaped}["']\\)`, "g"), `import("${vendorUrl}")`);
182
- }
183
- return result;
184
- }
185
175
  }
186
176
  export {
187
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
  };