@ecopages/core 0.2.0-alpha.26 → 0.2.0-alpha.27

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 (550) hide show
  1. package/README.md +63 -7
  2. package/package.json +73 -249
  3. package/src/adapters/abstract/application-adapter.test.ts +172 -0
  4. package/src/adapters/abstract/application-adapter.ts +379 -0
  5. package/src/adapters/abstract/router-adapter.ts +30 -0
  6. package/src/adapters/abstract/server-adapter.ts +79 -0
  7. package/src/adapters/bun/client-bridge.ts +62 -0
  8. package/src/adapters/bun/create-app.ts +232 -0
  9. package/src/adapters/bun/hmr-manager.test.ts +265 -0
  10. package/src/adapters/bun/hmr-manager.ts +383 -0
  11. package/src/adapters/bun/index.ts +2 -0
  12. package/src/adapters/bun/server-adapter.ts +526 -0
  13. package/src/adapters/bun/server-lifecycle.ts +124 -0
  14. package/src/adapters/create-app.test.ts +10 -0
  15. package/src/adapters/create-app.ts +91 -0
  16. package/src/adapters/index.ts +2 -0
  17. package/src/adapters/node/create-app.test.ts +53 -0
  18. package/src/adapters/node/create-app.ts +183 -0
  19. package/src/adapters/node/node-client-bridge.test.ts +198 -0
  20. package/src/adapters/node/node-client-bridge.ts +79 -0
  21. package/src/adapters/node/node-hmr-manager.test.ts +320 -0
  22. package/src/adapters/node/node-hmr-manager.ts +355 -0
  23. package/src/adapters/node/server-adapter.ts +502 -0
  24. package/src/adapters/node/static-content-server.test.ts +60 -0
  25. package/src/adapters/node/static-content-server.ts +239 -0
  26. package/src/adapters/shared/api-response.test.ts +97 -0
  27. package/src/adapters/shared/api-response.ts +104 -0
  28. package/src/adapters/shared/application-adapter.ts +199 -0
  29. package/src/adapters/shared/define-api-handler.ts +66 -0
  30. package/src/adapters/shared/explicit-static-render-preparation.ts +58 -0
  31. package/src/adapters/shared/explicit-static-route-matcher.test.ts +381 -0
  32. package/src/adapters/shared/explicit-static-route-matcher.ts +131 -0
  33. package/src/adapters/shared/file-route-middleware-pipeline.test.ts +85 -0
  34. package/src/adapters/shared/file-route-middleware-pipeline.ts +118 -0
  35. package/src/adapters/shared/fs-server-response-factory.test.ts +176 -0
  36. package/src/adapters/shared/fs-server-response-factory.ts +96 -0
  37. package/src/adapters/shared/fs-server-response-matcher.test.ts +311 -0
  38. package/src/adapters/shared/fs-server-response-matcher.ts +240 -0
  39. package/src/adapters/shared/hmr-entrypoint-registrar.ts +149 -0
  40. package/src/adapters/shared/hmr-html-response.ts +52 -0
  41. package/src/adapters/shared/hmr-manager.contract.test.ts +228 -0
  42. package/src/adapters/shared/hmr-manager.dispatch.test.ts +220 -0
  43. package/src/adapters/shared/render-context.test.ts +150 -0
  44. package/src/adapters/shared/render-context.ts +123 -0
  45. package/src/adapters/shared/runtime-bootstrap.ts +79 -0
  46. package/src/adapters/shared/server-adapter.test.ts +130 -0
  47. package/src/adapters/shared/server-adapter.ts +562 -0
  48. package/src/adapters/shared/server-route-handler.test.ts +111 -0
  49. package/src/adapters/shared/server-route-handler.ts +153 -0
  50. package/src/adapters/shared/server-static-builder.test.ts +338 -0
  51. package/src/adapters/shared/server-static-builder.ts +170 -0
  52. package/src/build/build-adapter-serialization.test.ts +281 -0
  53. package/src/build/build-adapter.test.ts +1240 -0
  54. package/src/build/build-adapter.ts +1012 -0
  55. package/src/build/build-manifest.ts +54 -0
  56. package/src/build/build-types.ts +83 -0
  57. package/src/build/dev-build-coordinator.ts +220 -0
  58. package/src/build/esbuild-build-adapter.ts +660 -0
  59. package/src/build/runtime-build-executor.test.ts +81 -0
  60. package/src/build/runtime-build-executor.ts +40 -0
  61. package/src/build/runtime-specifier-alias-plugin.test.ts +67 -0
  62. package/src/build/runtime-specifier-alias-plugin.ts +62 -0
  63. package/src/build/runtime-specifier-aliases.ts +135 -0
  64. package/src/config/README.md +1 -1
  65. package/src/config/config-builder.test.ts +442 -0
  66. package/src/config/config-builder.ts +737 -0
  67. package/src/config/config-builder.typecheck.test.ts +96 -0
  68. package/src/config/{constants.d.ts → constants.ts} +22 -13
  69. package/src/dev/host-runtime.ts +34 -0
  70. package/src/dev/sc-server.ts +143 -0
  71. package/src/eco/eco.browser.test.ts +43 -0
  72. package/src/eco/eco.browser.ts +118 -0
  73. package/src/eco/eco.test.ts +654 -0
  74. package/src/eco/eco.ts +205 -0
  75. package/src/eco/eco.types.ts +221 -0
  76. package/src/eco/eco.utils.test.ts +219 -0
  77. package/src/eco/eco.utils.ts +5 -0
  78. package/src/eco/global-injector-map.test.ts +42 -0
  79. package/src/eco/global-injector-map.ts +112 -0
  80. package/src/eco/lazy-injector-map.test.ts +66 -0
  81. package/src/eco/lazy-injector-map.ts +120 -0
  82. package/src/eco/module-dependencies.test.ts +30 -0
  83. package/src/eco/module-dependencies.ts +75 -0
  84. package/src/errors/http-error.test.ts +134 -0
  85. package/src/errors/http-error.ts +72 -0
  86. package/src/errors/index.ts +3 -0
  87. package/src/errors/locals-access-error.ts +7 -0
  88. package/src/global/app-logger.ts +4 -0
  89. package/src/global/utils.test.ts +12 -0
  90. 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
  91. package/src/hmr/client/__screenshots__/hmr-runtime.test.browser.ts/HMR-Runtime-HMR-Server-Integration-should-load-fixture-app-page-1.png +0 -0
  92. package/src/hmr/client/__screenshots__/hmr-runtime.test.browser.ts/HMR-Runtime-WebSocket-Connection-should-connect-to-correct-HMR-endpoint-1.png +0 -0
  93. package/src/hmr/client/hmr-runtime.ts +162 -0
  94. package/src/hmr/hmr-strategy.test.ts +124 -0
  95. package/src/hmr/hmr-strategy.ts +177 -0
  96. package/src/hmr/hmr.postcss.test.e2e.ts +41 -0
  97. package/src/hmr/hmr.test.e2e.ts +66 -0
  98. package/src/hmr/strategies/default-hmr-strategy.ts +60 -0
  99. package/src/hmr/strategies/js-hmr-strategy.test.ts +334 -0
  100. package/src/hmr/strategies/js-hmr-strategy.ts +314 -0
  101. package/src/index.browser.ts +3 -0
  102. package/src/index.ts +15 -0
  103. package/src/integrations/ghtml/ghtml-renderer.test.ts +253 -0
  104. package/src/integrations/ghtml/ghtml-renderer.ts +87 -0
  105. package/src/integrations/ghtml/ghtml.constants.ts +1 -0
  106. package/src/integrations/ghtml/ghtml.plugin.ts +28 -0
  107. package/src/plugins/alias-resolver-plugin.test.ts +41 -0
  108. package/src/plugins/alias-resolver-plugin.ts +63 -0
  109. package/src/plugins/eco-component-meta-plugin.test.ts +406 -0
  110. package/src/plugins/eco-component-meta-plugin.ts +494 -0
  111. package/src/plugins/foreign-jsx-override-plugin.test.ts +65 -0
  112. package/src/plugins/foreign-jsx-override-plugin.ts +67 -0
  113. package/src/plugins/integration-plugin.test.ts +151 -0
  114. package/src/plugins/integration-plugin.ts +323 -0
  115. package/src/plugins/processor.test.ts +148 -0
  116. package/src/plugins/processor.ts +257 -0
  117. package/src/plugins/{runtime-capability.d.ts → runtime-capability.ts} +8 -3
  118. package/src/plugins/source-transform.test.ts +82 -0
  119. package/src/plugins/source-transform.ts +123 -0
  120. package/src/route-renderer/GRAPH.md +81 -289
  121. package/src/route-renderer/README.md +67 -105
  122. package/src/route-renderer/orchestration/component-render-context.ts +325 -0
  123. package/src/route-renderer/orchestration/declared-ownership-graph.ts +62 -0
  124. package/src/route-renderer/orchestration/foreign-subtree-execution.service.ts +383 -0
  125. package/src/route-renderer/orchestration/integration-renderer.test.ts +2085 -0
  126. package/src/route-renderer/orchestration/integration-renderer.ts +1244 -0
  127. package/src/route-renderer/orchestration/ownership-planning.service.ts +97 -0
  128. package/src/route-renderer/orchestration/ownership-validation.service.ts +76 -0
  129. package/src/route-renderer/orchestration/processed-asset-dedupe.ts +25 -0
  130. package/src/route-renderer/orchestration/queued-foreign-subtree-resolution.service.test.ts +324 -0
  131. package/src/route-renderer/orchestration/queued-foreign-subtree-resolution.service.ts +294 -0
  132. package/src/route-renderer/orchestration/render-output.utils.ts +310 -0
  133. package/src/route-renderer/orchestration/route-render-orchestrator.prepare-render-options.test.ts +644 -0
  134. package/src/route-renderer/orchestration/route-render-orchestrator.test.ts +265 -0
  135. package/src/route-renderer/orchestration/route-render-orchestrator.ts +592 -0
  136. package/src/route-renderer/orchestration/template-serialization.test.ts +110 -0
  137. package/src/route-renderer/orchestration/template-serialization.ts +117 -0
  138. package/src/route-renderer/page-loading/component-dependency-collection.ts +202 -0
  139. package/src/route-renderer/page-loading/declared-asset-collection.ts +153 -0
  140. package/src/route-renderer/page-loading/dependency-resolver.test.ts +761 -0
  141. package/src/route-renderer/page-loading/dependency-resolver.ts +144 -0
  142. package/src/route-renderer/page-loading/ecopages-virtual-imports.ts +75 -0
  143. package/src/route-renderer/page-loading/lazy-entry-collection.ts +167 -0
  144. package/src/route-renderer/page-loading/lazy-trigger-planning.ts +74 -0
  145. package/src/route-renderer/page-loading/module-declaration-aggregation.ts +60 -0
  146. package/src/route-renderer/page-loading/module-declaration-scripts.ts +16 -0
  147. package/src/route-renderer/page-loading/page-dependency-bundling.ts +244 -0
  148. package/src/route-renderer/page-loading/page-module-loader.test.ts +183 -0
  149. package/src/route-renderer/page-loading/page-module-loader.ts +184 -0
  150. package/src/route-renderer/route-renderer.ts +133 -0
  151. package/src/router/README.md +16 -19
  152. package/src/router/client/link-intent.test.browser.ts +51 -0
  153. package/src/router/client/link-intent.ts +92 -0
  154. package/src/router/client/navigation-coordinator.test.ts +237 -0
  155. package/src/router/client/navigation-coordinator.ts +453 -0
  156. package/src/router/server/route-registry.test.ts +176 -0
  157. package/src/router/server/route-registry.ts +382 -0
  158. package/src/services/README.md +1 -2
  159. package/src/services/assets/asset-processing-service/asset-dependency-keys.ts +66 -0
  160. package/src/services/assets/asset-processing-service/asset-processing.service.test.ts +473 -0
  161. package/src/services/assets/asset-processing-service/asset-processing.service.ts +344 -0
  162. package/src/services/assets/asset-processing-service/asset.factory.test.ts +63 -0
  163. package/src/services/assets/asset-processing-service/asset.factory.ts +105 -0
  164. package/src/services/assets/asset-processing-service/assets.types.ts +128 -0
  165. package/src/services/assets/asset-processing-service/browser-runtime-asset.factory.test.ts +74 -0
  166. package/src/services/assets/asset-processing-service/browser-runtime-asset.factory.ts +96 -0
  167. package/src/services/assets/asset-processing-service/browser-runtime-entry.factory.test.ts +67 -0
  168. package/src/services/assets/asset-processing-service/browser-runtime-entry.factory.ts +78 -0
  169. package/src/services/assets/asset-processing-service/grouped-content-bundles.ts +104 -0
  170. package/src/services/assets/asset-processing-service/index.ts +6 -0
  171. package/src/services/assets/asset-processing-service/page-package.test.ts +100 -0
  172. package/src/services/assets/asset-processing-service/page-package.ts +93 -0
  173. package/src/services/assets/asset-processing-service/{processor.interface.d.ts → processor.interface.ts} +10 -5
  174. package/src/services/assets/asset-processing-service/processor.registry.ts +18 -0
  175. package/src/services/assets/asset-processing-service/processors/base/base-processor.test.ts +59 -0
  176. package/src/services/assets/asset-processing-service/processors/base/base-processor.ts +83 -0
  177. package/src/services/assets/asset-processing-service/processors/base/base-script-processor.ts +173 -0
  178. package/src/services/assets/asset-processing-service/processors/index.ts +5 -0
  179. package/src/services/assets/asset-processing-service/processors/script/content-script.processor.test.ts +195 -0
  180. package/src/services/assets/asset-processing-service/processors/script/content-script.processor.ts +137 -0
  181. package/src/services/assets/asset-processing-service/processors/script/file-script.processor.test.ts +326 -0
  182. package/src/services/assets/asset-processing-service/processors/script/file-script.processor.ts +116 -0
  183. package/src/services/assets/asset-processing-service/processors/script/node-module-script.processor.test.ts +227 -0
  184. package/src/services/assets/asset-processing-service/processors/script/node-module-script.processor.ts +89 -0
  185. package/src/services/assets/asset-processing-service/processors/stylesheet/content-stylesheet.processor.test.ts +261 -0
  186. package/src/services/assets/asset-processing-service/processors/stylesheet/content-stylesheet.processor.ts +72 -0
  187. package/src/services/assets/asset-processing-service/processors/stylesheet/file-stylesheet.processor.ts +83 -0
  188. package/src/services/assets/asset-processing-service/ungrouped-dependency-processing.ts +65 -0
  189. package/src/services/assets/browser-bundle.service.test.ts +66 -0
  190. package/src/services/assets/browser-bundle.service.ts +109 -0
  191. package/src/services/cache/cache.types.ts +126 -0
  192. package/src/services/cache/index.ts +18 -0
  193. package/src/services/cache/memory-cache-store.test.ts +225 -0
  194. package/src/services/cache/memory-cache-store.ts +130 -0
  195. package/src/services/cache/page-cache-service.test.ts +175 -0
  196. package/src/services/cache/page-cache-service.ts +202 -0
  197. package/src/services/cache/page-request-cache-coordinator.service.test.ts +79 -0
  198. package/src/services/cache/page-request-cache-coordinator.service.ts +131 -0
  199. package/src/services/html/html-rewriter-provider.service.test.ts +183 -0
  200. package/src/services/html/html-rewriter-provider.service.ts +104 -0
  201. package/src/services/html/html-transformer.service.test.ts +476 -0
  202. package/src/services/html/html-transformer.service.ts +275 -0
  203. package/src/services/invalidation/development-invalidation.service.test.ts +87 -0
  204. package/src/services/invalidation/development-invalidation.service.ts +262 -0
  205. package/src/services/module-loading/app-module-loader.service.ts +9 -0
  206. package/src/services/module-loading/app-server-module-transpiler.service.test.ts +130 -0
  207. package/src/services/module-loading/app-server-module-transpiler.service.ts +141 -0
  208. package/src/services/module-loading/host-module-loader-registry.ts +15 -0
  209. package/src/services/module-loading/{module-loading-types.d.ts → module-loading-types.ts} +1 -0
  210. package/src/services/module-loading/node-bootstrap-plugin.test.ts +335 -0
  211. package/src/services/module-loading/node-bootstrap-plugin.ts +311 -0
  212. package/src/services/module-loading/page-module-import.service.test.ts +504 -0
  213. package/src/services/module-loading/page-module-import.service.ts +251 -0
  214. package/src/services/module-loading/server-module-transpiler.service.test.ts +243 -0
  215. package/src/services/module-loading/server-module-transpiler.service.ts +104 -0
  216. package/src/services/module-loading/source-module-support.ts +19 -0
  217. package/src/services/runtime-state/dev-graph.service.ts +217 -0
  218. package/src/services/runtime-state/entrypoint-dependency-graph.service.ts +136 -0
  219. package/src/services/runtime-state/server-invalidation-state.service.ts +68 -0
  220. package/src/services/validation/schema-validation-service.test.ts +223 -0
  221. package/src/services/validation/schema-validation-service.ts +204 -0
  222. package/src/services/validation/{standard-schema.types.d.ts → standard-schema.types.ts} +20 -17
  223. package/src/static-site-generator/static-site-generator.test.ts +408 -0
  224. package/src/static-site-generator/static-site-generator.ts +445 -0
  225. package/src/types/internal-types.ts +243 -0
  226. package/src/types/public-types.ts +1459 -0
  227. package/src/utils/deep-merge.test.ts +114 -0
  228. package/src/utils/deep-merge.ts +47 -0
  229. package/src/utils/hash.ts +5 -0
  230. package/src/utils/html-escaping.ts +9 -0
  231. package/src/utils/invariant.test.ts +22 -0
  232. package/src/utils/invariant.ts +15 -0
  233. package/src/utils/locals-utils.ts +37 -0
  234. package/src/utils/parse-cli-args.test.ts +69 -0
  235. package/src/utils/parse-cli-args.ts +105 -0
  236. package/src/utils/path-utils.module.ts +14 -0
  237. package/src/utils/path-utils.test.ts +15 -0
  238. package/src/utils/resolve-work-dir.ts +45 -0
  239. package/src/utils/runtime.ts +44 -0
  240. package/src/utils/server-utils.module.ts +67 -0
  241. package/src/utils/server-utils.test.ts +38 -0
  242. package/src/watchers/project-watcher.integration.test.ts +337 -0
  243. package/src/watchers/project-watcher.test-helpers.ts +42 -0
  244. package/src/watchers/project-watcher.test.ts +768 -0
  245. package/src/watchers/project-watcher.ts +357 -0
  246. package/CHANGELOG.md +0 -66
  247. package/src/adapters/abstract/application-adapter.d.ts +0 -194
  248. package/src/adapters/abstract/application-adapter.js +0 -121
  249. package/src/adapters/abstract/router-adapter.d.ts +0 -26
  250. package/src/adapters/abstract/router-adapter.js +0 -5
  251. package/src/adapters/abstract/server-adapter.d.ts +0 -69
  252. package/src/adapters/abstract/server-adapter.js +0 -15
  253. package/src/adapters/bun/client-bridge.d.ts +0 -34
  254. package/src/adapters/bun/client-bridge.js +0 -48
  255. package/src/adapters/bun/create-app.d.ts +0 -52
  256. package/src/adapters/bun/create-app.js +0 -116
  257. package/src/adapters/bun/hmr-manager.d.ts +0 -143
  258. package/src/adapters/bun/hmr-manager.js +0 -333
  259. package/src/adapters/bun/index.d.ts +0 -2
  260. package/src/adapters/bun/index.js +0 -8
  261. package/src/adapters/bun/server-adapter.d.ts +0 -155
  262. package/src/adapters/bun/server-adapter.js +0 -374
  263. package/src/adapters/bun/server-lifecycle.d.ts +0 -63
  264. package/src/adapters/bun/server-lifecycle.js +0 -92
  265. package/src/adapters/create-app.d.ts +0 -20
  266. package/src/adapters/create-app.js +0 -66
  267. package/src/adapters/index.d.ts +0 -2
  268. package/src/adapters/index.js +0 -8
  269. package/src/adapters/node/create-app.d.ts +0 -18
  270. package/src/adapters/node/create-app.js +0 -149
  271. package/src/adapters/node/node-client-bridge.d.ts +0 -26
  272. package/src/adapters/node/node-client-bridge.js +0 -66
  273. package/src/adapters/node/node-hmr-manager.d.ts +0 -133
  274. package/src/adapters/node/node-hmr-manager.js +0 -311
  275. package/src/adapters/node/server-adapter.d.ts +0 -162
  276. package/src/adapters/node/server-adapter.js +0 -368
  277. package/src/adapters/node/static-content-server.d.ts +0 -60
  278. package/src/adapters/node/static-content-server.js +0 -194
  279. package/src/adapters/shared/api-response.d.ts +0 -52
  280. package/src/adapters/shared/api-response.js +0 -96
  281. package/src/adapters/shared/application-adapter.d.ts +0 -18
  282. package/src/adapters/shared/application-adapter.js +0 -90
  283. package/src/adapters/shared/define-api-handler.d.ts +0 -25
  284. package/src/adapters/shared/define-api-handler.js +0 -15
  285. package/src/adapters/shared/explicit-static-route-matcher.d.ts +0 -38
  286. package/src/adapters/shared/explicit-static-route-matcher.js +0 -103
  287. package/src/adapters/shared/file-route-middleware-pipeline.d.ts +0 -65
  288. package/src/adapters/shared/file-route-middleware-pipeline.js +0 -99
  289. package/src/adapters/shared/fs-server-response-factory.d.ts +0 -19
  290. package/src/adapters/shared/fs-server-response-factory.js +0 -97
  291. package/src/adapters/shared/fs-server-response-matcher.d.ts +0 -67
  292. package/src/adapters/shared/fs-server-response-matcher.js +0 -147
  293. package/src/adapters/shared/hmr-entrypoint-registrar.d.ts +0 -55
  294. package/src/adapters/shared/hmr-entrypoint-registrar.js +0 -87
  295. package/src/adapters/shared/hmr-html-response.d.ts +0 -22
  296. package/src/adapters/shared/hmr-html-response.js +0 -32
  297. package/src/adapters/shared/render-context.d.ts +0 -15
  298. package/src/adapters/shared/render-context.js +0 -72
  299. package/src/adapters/shared/runtime-bootstrap.d.ts +0 -38
  300. package/src/adapters/shared/runtime-bootstrap.js +0 -43
  301. package/src/adapters/shared/server-adapter.d.ts +0 -97
  302. package/src/adapters/shared/server-adapter.js +0 -390
  303. package/src/adapters/shared/server-route-handler.d.ts +0 -89
  304. package/src/adapters/shared/server-route-handler.js +0 -111
  305. package/src/adapters/shared/server-static-builder.d.ts +0 -71
  306. package/src/adapters/shared/server-static-builder.js +0 -100
  307. package/src/build/build-adapter.d.ts +0 -239
  308. package/src/build/build-adapter.js +0 -642
  309. package/src/build/build-manifest.d.ts +0 -27
  310. package/src/build/build-manifest.js +0 -30
  311. package/src/build/build-types.d.ts +0 -57
  312. package/src/build/build-types.js +0 -0
  313. package/src/build/dev-build-coordinator.d.ts +0 -72
  314. package/src/build/dev-build-coordinator.js +0 -154
  315. package/src/build/esbuild-build-adapter.d.ts +0 -78
  316. package/src/build/esbuild-build-adapter.js +0 -505
  317. package/src/build/runtime-build-executor.d.ts +0 -14
  318. package/src/build/runtime-build-executor.js +0 -22
  319. package/src/build/runtime-specifier-alias-plugin.d.ts +0 -15
  320. package/src/build/runtime-specifier-alias-plugin.js +0 -35
  321. package/src/build/runtime-specifier-aliases.d.ts +0 -5
  322. package/src/build/runtime-specifier-aliases.js +0 -95
  323. package/src/config/config-builder.d.ts +0 -252
  324. package/src/config/config-builder.js +0 -603
  325. package/src/config/constants.js +0 -25
  326. package/src/dev/sc-server.d.ts +0 -30
  327. package/src/dev/sc-server.js +0 -111
  328. package/src/eco/eco.browser.d.ts +0 -2
  329. package/src/eco/eco.browser.js +0 -83
  330. package/src/eco/eco.d.ts +0 -9
  331. package/src/eco/eco.js +0 -85
  332. package/src/eco/eco.types.d.ts +0 -178
  333. package/src/eco/eco.types.js +0 -0
  334. package/src/eco/eco.utils.d.ts +0 -1
  335. package/src/eco/eco.utils.js +0 -10
  336. package/src/eco/global-injector-map.d.ts +0 -16
  337. package/src/eco/global-injector-map.js +0 -80
  338. package/src/eco/lazy-injector-map.d.ts +0 -8
  339. package/src/eco/lazy-injector-map.js +0 -70
  340. package/src/eco/module-dependencies.d.ts +0 -18
  341. package/src/eco/module-dependencies.js +0 -49
  342. package/src/errors/http-error.d.ts +0 -31
  343. package/src/errors/http-error.js +0 -50
  344. package/src/errors/index.d.ts +0 -2
  345. package/src/errors/index.js +0 -4
  346. package/src/errors/locals-access-error.d.ts +0 -4
  347. package/src/errors/locals-access-error.js +0 -9
  348. package/src/global/app-logger.d.ts +0 -2
  349. package/src/global/app-logger.js +0 -6
  350. package/src/hmr/client/hmr-runtime.d.ts +0 -5
  351. package/src/hmr/client/hmr-runtime.js +0 -117
  352. package/src/hmr/hmr-strategy.d.ts +0 -162
  353. package/src/hmr/hmr-strategy.js +0 -44
  354. package/src/hmr/hmr.postcss.test.e2e.d.ts +0 -1
  355. package/src/hmr/hmr.postcss.test.e2e.js +0 -31
  356. package/src/hmr/hmr.test.e2e.d.ts +0 -1
  357. package/src/hmr/hmr.test.e2e.js +0 -43
  358. package/src/hmr/strategies/default-hmr-strategy.d.ts +0 -43
  359. package/src/hmr/strategies/default-hmr-strategy.js +0 -34
  360. package/src/hmr/strategies/js-hmr-strategy.d.ts +0 -139
  361. package/src/hmr/strategies/js-hmr-strategy.js +0 -178
  362. package/src/index.browser.d.ts +0 -3
  363. package/src/index.browser.js +0 -4
  364. package/src/index.d.ts +0 -6
  365. package/src/index.js +0 -21
  366. package/src/integrations/ghtml/ghtml-renderer.d.ts +0 -20
  367. package/src/integrations/ghtml/ghtml-renderer.js +0 -63
  368. package/src/integrations/ghtml/ghtml.constants.d.ts +0 -1
  369. package/src/integrations/ghtml/ghtml.constants.js +0 -4
  370. package/src/integrations/ghtml/ghtml.plugin.d.ts +0 -16
  371. package/src/integrations/ghtml/ghtml.plugin.js +0 -20
  372. package/src/plugins/alias-resolver-plugin.d.ts +0 -2
  373. package/src/plugins/alias-resolver-plugin.js +0 -53
  374. package/src/plugins/eco-component-meta-plugin.d.ts +0 -108
  375. package/src/plugins/eco-component-meta-plugin.js +0 -163
  376. package/src/plugins/foreign-jsx-override-plugin.d.ts +0 -31
  377. package/src/plugins/foreign-jsx-override-plugin.js +0 -35
  378. package/src/plugins/integration-plugin.d.ts +0 -219
  379. package/src/plugins/integration-plugin.js +0 -196
  380. package/src/plugins/processor.d.ts +0 -95
  381. package/src/plugins/processor.js +0 -136
  382. package/src/plugins/runtime-capability.js +0 -0
  383. package/src/plugins/source-transform.d.ts +0 -46
  384. package/src/plugins/source-transform.js +0 -71
  385. package/src/route-renderer/orchestration/boundary-planning.service.d.ts +0 -25
  386. package/src/route-renderer/orchestration/boundary-planning.service.js +0 -97
  387. package/src/route-renderer/orchestration/component-render-context.d.ts +0 -83
  388. package/src/route-renderer/orchestration/component-render-context.js +0 -147
  389. package/src/route-renderer/orchestration/integration-renderer.d.ts +0 -556
  390. package/src/route-renderer/orchestration/integration-renderer.js +0 -932
  391. package/src/route-renderer/orchestration/page-packaging.service.d.ts +0 -16
  392. package/src/route-renderer/orchestration/page-packaging.service.js +0 -66
  393. package/src/route-renderer/orchestration/processed-asset-dedupe.d.ts +0 -2
  394. package/src/route-renderer/orchestration/processed-asset-dedupe.js +0 -23
  395. package/src/route-renderer/orchestration/queued-boundary-runtime.service.d.ts +0 -89
  396. package/src/route-renderer/orchestration/queued-boundary-runtime.service.js +0 -155
  397. package/src/route-renderer/orchestration/render-execution.service.d.ts +0 -43
  398. package/src/route-renderer/orchestration/render-execution.service.js +0 -106
  399. package/src/route-renderer/orchestration/render-output.utils.d.ts +0 -66
  400. package/src/route-renderer/orchestration/render-output.utils.js +0 -171
  401. package/src/route-renderer/orchestration/render-preparation.service.d.ts +0 -120
  402. package/src/route-renderer/orchestration/render-preparation.service.js +0 -364
  403. package/src/route-renderer/orchestration/route-shell-composer.service.d.ts +0 -50
  404. package/src/route-renderer/orchestration/route-shell-composer.service.js +0 -81
  405. package/src/route-renderer/orchestration/template-serialization.d.ts +0 -38
  406. package/src/route-renderer/orchestration/template-serialization.js +0 -45
  407. package/src/route-renderer/page-loading/component-dependency-collection.d.ts +0 -37
  408. package/src/route-renderer/page-loading/component-dependency-collection.js +0 -125
  409. package/src/route-renderer/page-loading/declared-asset-collection.d.ts +0 -24
  410. package/src/route-renderer/page-loading/declared-asset-collection.js +0 -106
  411. package/src/route-renderer/page-loading/dependency-resolver.d.ts +0 -35
  412. package/src/route-renderer/page-loading/dependency-resolver.js +0 -117
  413. package/src/route-renderer/page-loading/ecopages-virtual-imports.d.ts +0 -11
  414. package/src/route-renderer/page-loading/ecopages-virtual-imports.js +0 -57
  415. package/src/route-renderer/page-loading/lazy-entry-collection.d.ts +0 -45
  416. package/src/route-renderer/page-loading/lazy-entry-collection.js +0 -105
  417. package/src/route-renderer/page-loading/lazy-trigger-planning.d.ts +0 -19
  418. package/src/route-renderer/page-loading/lazy-trigger-planning.js +0 -40
  419. package/src/route-renderer/page-loading/module-declaration-aggregation.d.ts +0 -5
  420. package/src/route-renderer/page-loading/module-declaration-aggregation.js +0 -33
  421. package/src/route-renderer/page-loading/module-declaration-scripts.d.ts +0 -3
  422. package/src/route-renderer/page-loading/module-declaration-scripts.js +0 -18
  423. package/src/route-renderer/page-loading/page-dependency-bundling.d.ts +0 -13
  424. package/src/route-renderer/page-loading/page-dependency-bundling.js +0 -115
  425. package/src/route-renderer/page-loading/page-module-loader.d.ts +0 -90
  426. package/src/route-renderer/page-loading/page-module-loader.js +0 -127
  427. package/src/route-renderer/route-renderer.d.ts +0 -67
  428. package/src/route-renderer/route-renderer.js +0 -103
  429. package/src/router/client/link-intent.js +0 -34
  430. package/src/router/client/link-intent.test.browser.d.ts +0 -1
  431. package/src/router/client/link-intent.test.browser.js +0 -43
  432. package/src/router/client/navigation-coordinator.d.ts +0 -169
  433. package/src/router/client/navigation-coordinator.js +0 -215
  434. package/src/router/server/fs-router-scanner.d.ts +0 -41
  435. package/src/router/server/fs-router-scanner.js +0 -161
  436. package/src/router/server/fs-router.d.ts +0 -26
  437. package/src/router/server/fs-router.js +0 -100
  438. package/src/services/assets/asset-processing-service/asset-dependency-keys.d.ts +0 -3
  439. package/src/services/assets/asset-processing-service/asset-dependency-keys.js +0 -56
  440. package/src/services/assets/asset-processing-service/asset-processing.service.d.ts +0 -103
  441. package/src/services/assets/asset-processing-service/asset-processing.service.js +0 -285
  442. package/src/services/assets/asset-processing-service/asset.factory.d.ts +0 -17
  443. package/src/services/assets/asset-processing-service/asset.factory.js +0 -82
  444. package/src/services/assets/asset-processing-service/assets.types.d.ts +0 -100
  445. package/src/services/assets/asset-processing-service/assets.types.js +0 -0
  446. package/src/services/assets/asset-processing-service/browser-runtime-asset.factory.d.ts +0 -55
  447. package/src/services/assets/asset-processing-service/browser-runtime-asset.factory.js +0 -49
  448. package/src/services/assets/asset-processing-service/browser-runtime-entry.factory.d.ts +0 -20
  449. package/src/services/assets/asset-processing-service/browser-runtime-entry.factory.js +0 -41
  450. package/src/services/assets/asset-processing-service/grouped-content-bundles.d.ts +0 -30
  451. package/src/services/assets/asset-processing-service/grouped-content-bundles.js +0 -65
  452. package/src/services/assets/asset-processing-service/index.d.ts +0 -5
  453. package/src/services/assets/asset-processing-service/index.js +0 -5
  454. package/src/services/assets/asset-processing-service/processor.interface.js +0 -6
  455. package/src/services/assets/asset-processing-service/processor.registry.d.ts +0 -8
  456. package/src/services/assets/asset-processing-service/processor.registry.js +0 -15
  457. package/src/services/assets/asset-processing-service/processors/base/base-processor.d.ts +0 -24
  458. package/src/services/assets/asset-processing-service/processors/base/base-processor.js +0 -65
  459. package/src/services/assets/asset-processing-service/processors/base/base-script-processor.d.ts +0 -22
  460. package/src/services/assets/asset-processing-service/processors/base/base-script-processor.js +0 -136
  461. package/src/services/assets/asset-processing-service/processors/index.d.ts +0 -5
  462. package/src/services/assets/asset-processing-service/processors/index.js +0 -5
  463. package/src/services/assets/asset-processing-service/processors/script/content-script.processor.d.ts +0 -6
  464. package/src/services/assets/asset-processing-service/processors/script/content-script.processor.js +0 -116
  465. package/src/services/assets/asset-processing-service/processors/script/file-script.processor.d.ts +0 -9
  466. package/src/services/assets/asset-processing-service/processors/script/file-script.processor.js +0 -91
  467. package/src/services/assets/asset-processing-service/processors/script/node-module-script.processor.d.ts +0 -7
  468. package/src/services/assets/asset-processing-service/processors/script/node-module-script.processor.js +0 -77
  469. package/src/services/assets/asset-processing-service/processors/stylesheet/content-stylesheet.processor.d.ts +0 -8
  470. package/src/services/assets/asset-processing-service/processors/stylesheet/content-stylesheet.processor.js +0 -58
  471. package/src/services/assets/asset-processing-service/processors/stylesheet/file-stylesheet.processor.d.ts +0 -9
  472. package/src/services/assets/asset-processing-service/processors/stylesheet/file-stylesheet.processor.js +0 -67
  473. package/src/services/assets/asset-processing-service/ungrouped-dependency-processing.d.ts +0 -18
  474. package/src/services/assets/asset-processing-service/ungrouped-dependency-processing.js +0 -45
  475. package/src/services/assets/browser-bundle.service.d.ts +0 -73
  476. package/src/services/assets/browser-bundle.service.js +0 -41
  477. package/src/services/cache/cache.types.d.ts +0 -107
  478. package/src/services/cache/cache.types.js +0 -0
  479. package/src/services/cache/index.d.ts +0 -7
  480. package/src/services/cache/index.js +0 -7
  481. package/src/services/cache/memory-cache-store.d.ts +0 -42
  482. package/src/services/cache/memory-cache-store.js +0 -98
  483. package/src/services/cache/page-cache-service.d.ts +0 -70
  484. package/src/services/cache/page-cache-service.js +0 -152
  485. package/src/services/cache/page-request-cache-coordinator.service.d.ts +0 -75
  486. package/src/services/cache/page-request-cache-coordinator.service.js +0 -109
  487. package/src/services/html/html-rewriter-provider.service.d.ts +0 -37
  488. package/src/services/html/html-rewriter-provider.service.js +0 -68
  489. package/src/services/html/html-transformer.service.d.ts +0 -87
  490. package/src/services/html/html-transformer.service.js +0 -216
  491. package/src/services/invalidation/development-invalidation.service.d.ts +0 -74
  492. package/src/services/invalidation/development-invalidation.service.js +0 -190
  493. package/src/services/module-loading/app-module-loader.service.d.ts +0 -7
  494. package/src/services/module-loading/app-module-loader.service.js +0 -0
  495. package/src/services/module-loading/app-server-module-transpiler.service.d.ts +0 -24
  496. package/src/services/module-loading/app-server-module-transpiler.service.js +0 -115
  497. package/src/services/module-loading/host-module-loader-registry.d.ts +0 -4
  498. package/src/services/module-loading/host-module-loader-registry.js +0 -15
  499. package/src/services/module-loading/module-loading-types.js +0 -0
  500. package/src/services/module-loading/node-bootstrap-plugin.d.ts +0 -42
  501. package/src/services/module-loading/node-bootstrap-plugin.js +0 -204
  502. package/src/services/module-loading/page-module-import.service.d.ts +0 -76
  503. package/src/services/module-loading/page-module-import.service.js +0 -170
  504. package/src/services/module-loading/server-module-transpiler.service.d.ts +0 -63
  505. package/src/services/module-loading/server-module-transpiler.service.js +0 -64
  506. package/src/services/module-loading/source-module-support.d.ts +0 -5
  507. package/src/services/module-loading/source-module-support.js +0 -8
  508. package/src/services/runtime-state/dev-graph.service.d.ts +0 -118
  509. package/src/services/runtime-state/dev-graph.service.js +0 -162
  510. package/src/services/runtime-state/entrypoint-dependency-graph.service.d.ts +0 -41
  511. package/src/services/runtime-state/entrypoint-dependency-graph.service.js +0 -85
  512. package/src/services/runtime-state/runtime-specifier-registry.service.d.ts +0 -69
  513. package/src/services/runtime-state/runtime-specifier-registry.service.js +0 -37
  514. package/src/services/runtime-state/server-invalidation-state.service.d.ts +0 -26
  515. package/src/services/runtime-state/server-invalidation-state.service.js +0 -35
  516. package/src/services/validation/schema-validation-service.d.ts +0 -122
  517. package/src/services/validation/schema-validation-service.js +0 -101
  518. package/src/services/validation/standard-schema.types.js +0 -0
  519. package/src/static-site-generator/static-site-generator.d.ts +0 -105
  520. package/src/static-site-generator/static-site-generator.js +0 -349
  521. package/src/types/internal-types.d.ts +0 -231
  522. package/src/types/internal-types.js +0 -0
  523. package/src/types/public-types.d.ts +0 -1257
  524. package/src/types/public-types.js +0 -0
  525. package/src/utils/deep-merge.d.ts +0 -14
  526. package/src/utils/deep-merge.js +0 -32
  527. package/src/utils/hash.d.ts +0 -1
  528. package/src/utils/hash.js +0 -7
  529. package/src/utils/html-escaping.d.ts +0 -7
  530. package/src/utils/html-escaping.js +0 -6
  531. package/src/utils/html.js +0 -4
  532. package/src/utils/invariant.d.ts +0 -5
  533. package/src/utils/invariant.js +0 -11
  534. package/src/utils/locals-utils.d.ts +0 -15
  535. package/src/utils/locals-utils.js +0 -24
  536. package/src/utils/parse-cli-args.d.ts +0 -27
  537. package/src/utils/parse-cli-args.js +0 -62
  538. package/src/utils/path-utils.module.d.ts +0 -5
  539. package/src/utils/path-utils.module.js +0 -14
  540. package/src/utils/resolve-work-dir.d.ts +0 -11
  541. package/src/utils/resolve-work-dir.js +0 -31
  542. package/src/utils/runtime.d.ts +0 -11
  543. package/src/utils/runtime.js +0 -40
  544. package/src/utils/server-utils.module.d.ts +0 -19
  545. package/src/utils/server-utils.module.js +0 -56
  546. package/src/watchers/project-watcher.d.ts +0 -136
  547. package/src/watchers/project-watcher.js +0 -275
  548. package/src/watchers/project-watcher.test-helpers.d.ts +0 -4
  549. package/src/watchers/project-watcher.test-helpers.js +0 -52
  550. /package/src/utils/{html.d.ts → html.ts} +0 -0
@@ -0,0 +1,334 @@
1
+ import { describe, expect, it, beforeAll, afterAll } from 'vitest';
2
+ import { JsHmrStrategy, type JsHmrContext } from './js-hmr-strategy';
3
+ import { HmrStrategyType } from '../hmr-strategy';
4
+ import { InMemoryDevGraphService, NoopDevGraphService } from '../../services/runtime-state/dev-graph.service.ts';
5
+ import fs from 'node:fs';
6
+ import path from 'node:path';
7
+ import os from 'node:os';
8
+
9
+ const TMP_DIR = path.join(os.tmpdir(), 'js-hmr-strategy-test');
10
+ const SRC_DIR = path.join(TMP_DIR, 'src');
11
+
12
+ function createMockContext(overrides: Partial<JsHmrContext> = {}): JsHmrContext {
13
+ return {
14
+ getWatchedFiles: () => new Map(),
15
+ getEntrypointDependencyGraph: () => new NoopDevGraphService(),
16
+ getDistDir: () => TMP_DIR,
17
+ getPlugins: () => [],
18
+ getSrcDir: () => SRC_DIR,
19
+ getPagesDir: () => path.join(SRC_DIR, 'pages'),
20
+ getLayoutsDir: () => path.join(SRC_DIR, 'layouts'),
21
+ getTemplateExtensions: () => ['.tsx'],
22
+ getBrowserBundleService: () => ({
23
+ bundle: async () => ({ success: true, logs: [], outputs: [] }),
24
+ }),
25
+ ...overrides,
26
+ };
27
+ }
28
+
29
+ describe('JsHmrStrategy', () => {
30
+ beforeAll(() => {
31
+ fs.mkdirSync(SRC_DIR, { recursive: true });
32
+ });
33
+
34
+ afterAll(() => {
35
+ fs.rmSync(TMP_DIR, { recursive: true, force: true });
36
+ });
37
+
38
+ describe('type', () => {
39
+ it('has SCRIPT type', () => {
40
+ const context = createMockContext();
41
+ const strategy = new JsHmrStrategy(context);
42
+ expect(strategy.type).toBe(HmrStrategyType.SCRIPT);
43
+ });
44
+
45
+ it('has default priority of 25', () => {
46
+ const context = createMockContext();
47
+ const strategy = new JsHmrStrategy(context);
48
+ expect(strategy.priority).toBe(25);
49
+ });
50
+ });
51
+
52
+ describe('matches', () => {
53
+ it('returns false when no watched files are registered', () => {
54
+ const context = createMockContext({
55
+ getWatchedFiles: () => new Map(),
56
+ });
57
+ const strategy = new JsHmrStrategy(context);
58
+
59
+ expect(strategy.matches(path.join(SRC_DIR, 'app.ts'))).toBe(false);
60
+ });
61
+
62
+ it('returns false for unrelated .ts files when dependency graph support is available', () => {
63
+ const devGraphService = new InMemoryDevGraphService();
64
+ const context = createMockContext({
65
+ getWatchedFiles: () => new Map([[path.join(SRC_DIR, 'entry.ts'), '/output.js']]),
66
+ getEntrypointDependencyGraph: () => devGraphService,
67
+ });
68
+ const strategy = new JsHmrStrategy(context);
69
+
70
+ expect(strategy.matches(path.join(SRC_DIR, 'component.ts'))).toBe(false);
71
+ });
72
+
73
+ it('returns true for dependency-connected .tsx files in src directory', () => {
74
+ const changedFile = path.join(SRC_DIR, 'component.tsx');
75
+ const devGraphService = new InMemoryDevGraphService();
76
+ devGraphService.setEntrypointDependencies(path.join(SRC_DIR, 'entry.ts'), [changedFile]);
77
+ const context = createMockContext({
78
+ getWatchedFiles: () => new Map([[path.join(SRC_DIR, 'entry.ts'), '/output.js']]),
79
+ getEntrypointDependencyGraph: () => devGraphService,
80
+ });
81
+ const strategy = new JsHmrStrategy(context);
82
+
83
+ expect(strategy.matches(changedFile)).toBe(true);
84
+ });
85
+
86
+ it('returns true for registered entrypoints even without dependency graph hits', () => {
87
+ const entrypoint = path.join(SRC_DIR, 'entry.tsx');
88
+ const devGraphService = new InMemoryDevGraphService();
89
+ const context = createMockContext({
90
+ getWatchedFiles: () => new Map([[entrypoint, '/output.js']]),
91
+ getEntrypointDependencyGraph: () => devGraphService,
92
+ });
93
+ const strategy = new JsHmrStrategy(context);
94
+
95
+ expect(strategy.matches(entrypoint)).toBe(true);
96
+ });
97
+
98
+ it('returns true for .js files in src directory', () => {
99
+ const context = createMockContext({
100
+ getWatchedFiles: () => new Map([[path.join(SRC_DIR, 'entry.ts'), '/output.js']]),
101
+ });
102
+ const strategy = new JsHmrStrategy(context);
103
+
104
+ expect(strategy.matches(path.join(SRC_DIR, 'utils.js'))).toBe(true);
105
+ });
106
+
107
+ it('returns true for .jsx files in src directory', () => {
108
+ const context = createMockContext({
109
+ getWatchedFiles: () => new Map([[path.join(SRC_DIR, 'entry.ts'), '/output.js']]),
110
+ });
111
+ const strategy = new JsHmrStrategy(context);
112
+
113
+ expect(strategy.matches(path.join(SRC_DIR, 'component.jsx'))).toBe(true);
114
+ });
115
+
116
+ it('returns false for .css files', () => {
117
+ const context = createMockContext({
118
+ getWatchedFiles: () => new Map([[path.join(SRC_DIR, 'entry.ts'), '/output.js']]),
119
+ });
120
+ const strategy = new JsHmrStrategy(context);
121
+
122
+ expect(strategy.matches(path.join(SRC_DIR, 'styles.css'))).toBe(false);
123
+ });
124
+
125
+ it('returns false for files outside src directory', () => {
126
+ const context = createMockContext({
127
+ getWatchedFiles: () => new Map([[path.join(SRC_DIR, 'entry.ts'), '/output.js']]),
128
+ });
129
+ const strategy = new JsHmrStrategy(context);
130
+
131
+ expect(strategy.matches('/other/path/file.ts')).toBe(false);
132
+ });
133
+
134
+ it('returns false for integration-owned route template files', () => {
135
+ const pagesDir = path.join(SRC_DIR, 'pages');
136
+ const context = createMockContext({
137
+ getWatchedFiles: () => new Map([[path.join(SRC_DIR, 'entry.ts'), '/output.js']]),
138
+ getPagesDir: () => pagesDir,
139
+ getTemplateExtensions: () => ['.kita.tsx', '.react.tsx'],
140
+ });
141
+ const strategy = new JsHmrStrategy(context);
142
+
143
+ expect(strategy.matches(path.join(pagesDir, 'index.kita.tsx'))).toBe(false);
144
+ expect(strategy.matches(path.join(pagesDir, 'home.react.tsx'))).toBe(false);
145
+ });
146
+
147
+ it('returns false for non-extension matches', () => {
148
+ const context = createMockContext({
149
+ getWatchedFiles: () => new Map([[path.join(SRC_DIR, 'entry.ts'), '/output.js']]),
150
+ });
151
+ const strategy = new JsHmrStrategy(context);
152
+
153
+ expect(strategy.matches(path.join(SRC_DIR, 'data.json'))).toBe(false);
154
+ expect(strategy.matches(path.join(SRC_DIR, 'readme.md'))).toBe(false);
155
+ });
156
+ });
157
+
158
+ describe('process', () => {
159
+ it('returns none when no watched files are registered', async () => {
160
+ const context = createMockContext({
161
+ getWatchedFiles: () => new Map(),
162
+ });
163
+ const strategy = new JsHmrStrategy(context);
164
+
165
+ const action = await strategy.process(path.join(SRC_DIR, 'app.ts'));
166
+
167
+ expect(action.type).toBe('none');
168
+ });
169
+
170
+ it('rebuilds only dependency-connected entrypoints when graph hit exists', async () => {
171
+ const entryA = path.join(SRC_DIR, 'entry-a.ts');
172
+ const entryB = path.join(SRC_DIR, 'entry-b.ts');
173
+ const depA = path.join(SRC_DIR, 'shared-a.ts');
174
+ const setEntrypointDependenciesCalls: Array<{ entrypointPath: string; dependencies: string[] }> = [];
175
+ let batchedEntrypoints: string[] = [];
176
+ const devGraphService = new InMemoryDevGraphService();
177
+ devGraphService.setEntrypointDependencies(entryA, [depA]);
178
+ devGraphService.setEntrypointDependencies(entryB, [entryB]);
179
+
180
+ const context = createMockContext({
181
+ getWatchedFiles: () =>
182
+ new Map([
183
+ [entryA, '/_hmr/entry-a.js'],
184
+ [entryB, '/_hmr/entry-b.js'],
185
+ ]),
186
+ getEntrypointDependencyGraph: () => ({
187
+ supportsSelectiveInvalidation: () => devGraphService.supportsSelectiveInvalidation(),
188
+ getDependencyEntrypoints: (filePath: string) => devGraphService.getDependencyEntrypoints(filePath),
189
+ setEntrypointDependencies: (entrypointPath: string, dependencies: string[]) => {
190
+ setEntrypointDependenciesCalls.push({ entrypointPath, dependencies });
191
+ devGraphService.setEntrypointDependencies(entrypointPath, dependencies);
192
+ },
193
+ clearEntrypointDependencies: (entrypointPath: string) =>
194
+ devGraphService.clearEntrypointDependencies(entrypointPath),
195
+ reset: () => devGraphService.reset(),
196
+ }),
197
+ });
198
+
199
+ const strategy = new JsHmrStrategy(context) as unknown as {
200
+ process: (filePath: string) => Promise<{ type: string; events?: unknown[] }>;
201
+ [key: string]: unknown;
202
+ };
203
+
204
+ strategy.bundleEntrypoints = async (entrypoints: string[]) => {
205
+ batchedEntrypoints = entrypoints;
206
+ const dependencies = new Map<string, string[]>();
207
+ for (const ep of entrypoints) {
208
+ dependencies.set(path.resolve(ep), [ep, depA]);
209
+ }
210
+ return { success: true, dependencies };
211
+ };
212
+
213
+ strategy.processOutput = async () => {
214
+ return { success: true, requiresReload: false };
215
+ };
216
+
217
+ const action = await strategy.process(depA);
218
+
219
+ expect(batchedEntrypoints).toEqual([entryA]);
220
+ expect(setEntrypointDependenciesCalls).toEqual([{ entrypointPath: entryA, dependencies: [entryA, depA] }]);
221
+ expect(action).toEqual({
222
+ type: 'broadcast',
223
+ events: [
224
+ {
225
+ type: 'update',
226
+ path: '/_hmr/entry-a.js',
227
+ timestamp: expect.any(Number),
228
+ },
229
+ ],
230
+ });
231
+ });
232
+
233
+ it('falls back to rebuilding all watched entrypoints when graph has no hit', async () => {
234
+ const entryA = path.join(SRC_DIR, 'entry-a.ts');
235
+ const entryB = path.join(SRC_DIR, 'entry-b.ts');
236
+ const changedFile = path.join(SRC_DIR, 'new-shared.ts');
237
+ let batchedEntrypoints: string[] = [];
238
+
239
+ const context = createMockContext({
240
+ getWatchedFiles: () =>
241
+ new Map([
242
+ [entryA, '/_hmr/entry-a.js'],
243
+ [entryB, '/_hmr/entry-b.js'],
244
+ ]),
245
+ getEntrypointDependencyGraph: () => new NoopDevGraphService(),
246
+ });
247
+
248
+ const strategy = new JsHmrStrategy(context) as unknown as {
249
+ process: (filePath: string) => Promise<{ type: string; events?: unknown[] }>;
250
+ [key: string]: unknown;
251
+ };
252
+
253
+ strategy.bundleEntrypoints = async (entrypoints: string[]) => {
254
+ batchedEntrypoints = entrypoints;
255
+ const dependencies = new Map<string, string[]>();
256
+ for (const ep of entrypoints) {
257
+ dependencies.set(path.resolve(ep), [ep]);
258
+ }
259
+ return { success: true, dependencies };
260
+ };
261
+
262
+ strategy.processOutput = async () => {
263
+ return { success: true, requiresReload: false };
264
+ };
265
+
266
+ const action = await strategy.process(changedFile);
267
+
268
+ expect(batchedEntrypoints).toEqual([entryA, entryB]);
269
+ expect(action).toEqual({
270
+ type: 'broadcast',
271
+ events: [
272
+ {
273
+ type: 'update',
274
+ path: '/_hmr/entry-a.js',
275
+ timestamp: expect.any(Number),
276
+ },
277
+ {
278
+ type: 'update',
279
+ path: '/_hmr/entry-b.js',
280
+ timestamp: expect.any(Number),
281
+ },
282
+ ],
283
+ });
284
+ });
285
+
286
+ it('skips watched entrypoints owned by higher-priority integration strategies', async () => {
287
+ const reactEntrypoint = path.join(SRC_DIR, 'react-page.tsx');
288
+ const scriptEntrypoint = path.join(SRC_DIR, 'widget.script.ts');
289
+ const changedFile = path.join(SRC_DIR, 'shared.ts');
290
+ let batchedEntrypoints: string[] = [];
291
+ const devGraphService = new InMemoryDevGraphService();
292
+ devGraphService.setEntrypointDependencies(reactEntrypoint, [changedFile]);
293
+ devGraphService.setEntrypointDependencies(scriptEntrypoint, [changedFile]);
294
+
295
+ const context = createMockContext({
296
+ getWatchedFiles: () =>
297
+ new Map([
298
+ [reactEntrypoint, '/_hmr/react-page.js'],
299
+ [scriptEntrypoint, '/_hmr/widget.script.js'],
300
+ ]),
301
+ getEntrypointDependencyGraph: () => devGraphService,
302
+ shouldProcessEntrypoint: (entrypointPath: string) => entrypointPath !== reactEntrypoint,
303
+ });
304
+
305
+ const strategy = new JsHmrStrategy(context) as unknown as {
306
+ process: (filePath: string) => Promise<{ type: string; events?: unknown[] }>;
307
+ [key: string]: unknown;
308
+ };
309
+
310
+ strategy.bundleEntrypoints = async (entrypoints: string[]) => {
311
+ batchedEntrypoints = entrypoints;
312
+ return { success: true, dependencies: new Map([[path.resolve(scriptEntrypoint), [scriptEntrypoint]]]) };
313
+ };
314
+
315
+ strategy.processOutput = async () => {
316
+ return { success: true, requiresReload: false };
317
+ };
318
+
319
+ const action = await strategy.process(changedFile);
320
+
321
+ expect(batchedEntrypoints).toEqual([scriptEntrypoint]);
322
+ expect(action).toEqual({
323
+ type: 'broadcast',
324
+ events: [
325
+ {
326
+ type: 'update',
327
+ path: '/_hmr/widget.script.js',
328
+ timestamp: expect.any(Number),
329
+ },
330
+ ],
331
+ });
332
+ });
333
+ });
334
+ });
@@ -0,0 +1,314 @@
1
+ /**
2
+ * JavaScript HMR Strategy
3
+ *
4
+ * Handles hot module replacement for JavaScript and TypeScript entrypoints.
5
+ * Bundles files, inspects the emitted output, and decides whether the browser
6
+ * can hot-accept the change or must reload.
7
+ *
8
+ * @module
9
+ */
10
+
11
+ import path from 'node:path';
12
+ import { fileSystem } from '@ecopages/file-system';
13
+ import { HmrStrategy, HmrStrategyType, type HmrAction } from '../hmr-strategy.ts';
14
+ import { appLogger } from '../../global/app-logger.ts';
15
+ import type { EcoBuildPlugin } from '../../build/build-types.ts';
16
+ import type { BrowserBundleExecutor } from '../../services/assets/browser-bundle.service.ts';
17
+ import type { EntrypointDependencyGraph } from '../../services/runtime-state/entrypoint-dependency-graph.service.ts';
18
+
19
+ /**
20
+ * Context interface providing access to HmrManager state.
21
+ * Required for JsHmrStrategy to access registered entrypoints and configuration.
22
+ */
23
+ export interface JsHmrContext {
24
+ /**
25
+ * Map of registered entrypoints to their output URLs.
26
+ */
27
+ getWatchedFiles(): Map<string, string>;
28
+
29
+ getEntrypointDependencyGraph(): EntrypointDependencyGraph;
30
+
31
+ /**
32
+ * Directory where HMR bundles are written.
33
+ */
34
+ getDistDir(): string;
35
+
36
+ /**
37
+ * Build plugins to use during bundling.
38
+ */
39
+ getPlugins(): EcoBuildPlugin[];
40
+
41
+ /**
42
+ * Absolute path to the source directory.
43
+ */
44
+ getSrcDir(): string;
45
+
46
+ /**
47
+ * Absolute path to the pages directory.
48
+ */
49
+ getPagesDir(): string;
50
+
51
+ /**
52
+ * Absolute path to the layouts directory.
53
+ */
54
+ getLayoutsDir(): string;
55
+
56
+ /**
57
+ * All configured route-template extensions across integrations.
58
+ */
59
+ getTemplateExtensions(): string[];
60
+
61
+ /**
62
+ * Browser bundler used to rebuild changed entrypoints.
63
+ */
64
+ getBrowserBundleService(): BrowserBundleExecutor;
65
+
66
+ /**
67
+ * Returns whether a watched entrypoint should be rebuilt by the generic JS strategy.
68
+ *
69
+ * @remarks
70
+ * Integrations with higher-priority HMR strategies can use this to keep the
71
+ * generic JS strategy from overwriting their emitted entrypoints when a shared
72
+ * dependency changes.
73
+ */
74
+ shouldProcessEntrypoint?(entrypointPath: string): boolean;
75
+ }
76
+
77
+ /**
78
+ * Strategy for handling JavaScript/TypeScript file changes with hot reloading.
79
+ *
80
+ * The processing steps are:
81
+ * 1. Check if any entrypoints are registered
82
+ * 2. Rebuild impacted entrypoints, or all watched entrypoints when no runtime
83
+ * dependency graph is available
84
+ * 3. Emit rebuilt entrypoint bundles for browser delivery
85
+ * 4. Inject generic HMR boilerplate
86
+ * 5. Broadcast update events for each rebuilt entrypoint
87
+ *
88
+ * @remarks
89
+ * Node can provide dependency-graph metadata, so this strategy can rebuild only
90
+ * the entrypoints impacted by a changed dependency. Runtimes that do not expose
91
+ * that metadata intentionally keep the rebuild-all fallback.
92
+ *
93
+ * @see https://bun.sh/docs/runtime/transpiler
94
+ *
95
+ * @example
96
+ * ```typescript
97
+ * const context = {
98
+ * getWatchedFiles: () => watchedFilesMap,
99
+ * getDistDir: () => '/path/to/dist/_hmr',
100
+ * getPlugins: () => [],
101
+ * getSrcDir: () => '/path/to/src'
102
+ * };
103
+ * const strategy = new JsHmrStrategy(context);
104
+ * ```
105
+ */
106
+ export class JsHmrStrategy extends HmrStrategy {
107
+ readonly type = HmrStrategyType.SCRIPT;
108
+ private context: JsHmrContext;
109
+
110
+ constructor(context: JsHmrContext) {
111
+ super();
112
+ this.context = context;
113
+ }
114
+
115
+ /**
116
+ * Determines if the file is a JS/TS file that could affect registered entrypoints.
117
+ *
118
+ * Matches if:
119
+ * 1. There are registered entrypoints to rebuild
120
+ * 2. The changed file is a JS/TS file in the src directory
121
+ *
122
+ * @param filePath - Absolute path to the changed file
123
+ * @returns True if this file should trigger entrypoint rebuilds
124
+ */
125
+ matches(filePath: string): boolean {
126
+ const watchedFiles = this.context.getWatchedFiles();
127
+ const isJsTs = /\.(ts|tsx|js|jsx)$/.test(filePath);
128
+ const isInSrc = filePath.startsWith(this.context.getSrcDir());
129
+ const isRouteTemplate =
130
+ filePath.startsWith(this.context.getPagesDir()) || filePath.startsWith(this.context.getLayoutsDir());
131
+ const isIntegrationTemplate =
132
+ isRouteTemplate && this.context.getTemplateExtensions().some((extension) => filePath.endsWith(extension));
133
+
134
+ if (watchedFiles.size === 0) {
135
+ return false;
136
+ }
137
+
138
+ if (!isJsTs || !isInSrc) {
139
+ return false;
140
+ }
141
+
142
+ if (isIntegrationTemplate) {
143
+ return false;
144
+ }
145
+
146
+ if (watchedFiles.has(filePath)) {
147
+ return true;
148
+ }
149
+
150
+ const entrypointDependencyGraph = this.context.getEntrypointDependencyGraph();
151
+ if (entrypointDependencyGraph.supportsSelectiveInvalidation()) {
152
+ return entrypointDependencyGraph.getDependencyEntrypoints(filePath).size > 0;
153
+ }
154
+
155
+ return true;
156
+ }
157
+
158
+ /**
159
+ * Processes a file change by rebuilding affected entrypoints.
160
+ *
161
+ * @param filePath - Absolute path to the changed file
162
+ *
163
+ * @remarks
164
+ * If runtime-specific dependency graph hooks are unavailable, this strategy
165
+ * falls back to rebuilding all watched entrypoints.
166
+ * When multiple entrypoints are impacted they are bundled in a single esbuild
167
+ * invocation to share AST parsing and chunk deduplication.
168
+ * @returns Action to broadcast update events
169
+ */
170
+ async process(filePath: string): Promise<HmrAction> {
171
+ appLogger.debug(`[JsHmrStrategy] Processing ${filePath}`);
172
+ const watchedFiles = this.context.getWatchedFiles();
173
+
174
+ if (watchedFiles.size === 0) {
175
+ appLogger.debug(`[JsHmrStrategy] No watched files to rebuild`);
176
+ return { type: 'none' };
177
+ }
178
+
179
+ const dependencyHits = this.context.getEntrypointDependencyGraph().getDependencyEntrypoints(filePath);
180
+ const hasDependencyHit = dependencyHits.size > 0;
181
+ const impactedEntrypoints = hasDependencyHit
182
+ ? Array.from(dependencyHits).filter((entrypoint) => watchedFiles.has(entrypoint))
183
+ : Array.from(watchedFiles.keys());
184
+ const buildableEntrypoints = impactedEntrypoints.filter(
185
+ (entrypoint) => this.context.shouldProcessEntrypoint?.(entrypoint) ?? true,
186
+ );
187
+
188
+ if (!hasDependencyHit) {
189
+ appLogger.debug('[JsHmrStrategy] Dependency graph miss, rebuilding all watched entrypoints');
190
+ }
191
+
192
+ if (buildableEntrypoints.length === 0) {
193
+ return { type: 'none' };
194
+ }
195
+
196
+ const buildResult = await this.bundleEntrypoints(buildableEntrypoints);
197
+
198
+ if (!buildResult.success) {
199
+ return { type: 'none' };
200
+ }
201
+
202
+ const updates: string[] = [];
203
+ let reloadRequired = false;
204
+
205
+ for (const entrypoint of buildableEntrypoints) {
206
+ const outputUrl = watchedFiles.get(entrypoint);
207
+ if (!outputUrl) continue;
208
+
209
+ if (buildResult.dependencies) {
210
+ const entrypointDeps = buildResult.dependencies.get(path.resolve(entrypoint)) ?? [];
211
+ this.context.getEntrypointDependencyGraph().setEntrypointDependencies(entrypoint, entrypointDeps);
212
+ }
213
+
214
+ const srcDir = this.context.getSrcDir();
215
+ const relativePath = path.relative(srcDir, entrypoint);
216
+ const relativePathJs = relativePath.replace(/\.(tsx?|jsx?|mdx?)$/, '.js');
217
+ const outputPath = path.join(this.context.getDistDir(), relativePathJs);
218
+
219
+ const result = await this.processOutput(outputPath, outputUrl);
220
+ if (result.success) {
221
+ updates.push(outputUrl);
222
+ if (result.requiresReload) {
223
+ reloadRequired = true;
224
+ }
225
+ }
226
+ }
227
+
228
+ if (updates.length > 0) {
229
+ if (reloadRequired) {
230
+ appLogger.debug(`[JsHmrStrategy] Full reload required (no HMR accept found)`);
231
+ return {
232
+ type: 'broadcast',
233
+ events: [{ type: 'reload' }],
234
+ };
235
+ }
236
+
237
+ return {
238
+ type: 'broadcast',
239
+ events: updates.map((p) => ({
240
+ type: 'update',
241
+ path: p,
242
+ timestamp: Date.now(),
243
+ })),
244
+ };
245
+ }
246
+
247
+ return { type: 'none' };
248
+ }
249
+
250
+ /**
251
+ * Bundles one or more entrypoints in a single esbuild invocation.
252
+ * Uses the source directory as the output base so that the directory structure
253
+ * is preserved under the HMR dist folder.
254
+ */
255
+ private async bundleEntrypoints(
256
+ entrypoints: string[],
257
+ ): Promise<{ success: boolean; dependencies?: Map<string, string[]> }> {
258
+ try {
259
+ const result = await this.context.getBrowserBundleService().bundle({
260
+ profile: 'hmr-entrypoint',
261
+ entrypoints,
262
+ outdir: this.context.getDistDir(),
263
+ outbase: this.context.getSrcDir(),
264
+ naming: '[dir]/[name]',
265
+ plugins: this.context.getPlugins(),
266
+ minify: false,
267
+ });
268
+
269
+ if (!result.success) {
270
+ appLogger.error('[JsHmrStrategy] Batched build failed:', result.logs);
271
+ return { success: false };
272
+ }
273
+
274
+ const dependencies = new Map<string, string[]>();
275
+ if (result.dependencyGraph?.entrypoints) {
276
+ for (const [entrypoint, deps] of Object.entries(result.dependencyGraph.entrypoints)) {
277
+ dependencies.set(path.resolve(entrypoint), deps);
278
+ }
279
+ }
280
+
281
+ return { success: true, dependencies };
282
+ } catch (error) {
283
+ appLogger.error('[JsHmrStrategy] Error in batched build:', error as Error);
284
+ return { success: false };
285
+ }
286
+ }
287
+
288
+ /**
289
+ * Processes bundled output and determines whether the browser can hot-accept
290
+ * the update or must fall back to a full reload.
291
+ *
292
+ * @param filepath - Path to the bundled output file
293
+ * @param url - URL path for the bundled file
294
+ * @returns True if processing was successful and update should be broadcast
295
+ */
296
+ private async processOutput(filepath: string, url: string): Promise<{ success: boolean; requiresReload: boolean }> {
297
+ try {
298
+ const code = await fileSystem.readFile(filepath);
299
+
300
+ if (code.includes('/* [ecopages] hmr */')) {
301
+ // Legacy safety: previously processed bundles already carry the marker.
302
+ return { success: true, requiresReload: !code.includes('import.meta.hot.accept') };
303
+ }
304
+
305
+ appLogger.debug(`[JsHmrStrategy] Processed ${url}`);
306
+
307
+ const hasHmrAccept = code.includes('import.meta.hot.accept');
308
+ return { success: true, requiresReload: !hasHmrAccept };
309
+ } catch (error) {
310
+ appLogger.error(`[JsHmrStrategy] Error processing output for ${url}:`, error as Error);
311
+ return { success: false, requiresReload: false };
312
+ }
313
+ }
314
+ }
@@ -0,0 +1,3 @@
1
+ export type * from './types/public-types.ts';
2
+ export type * from './eco/eco.types.ts';
3
+ export { eco } from './eco/eco.browser.ts';
package/src/index.ts ADDED
@@ -0,0 +1,15 @@
1
+ export type * from './types/public-types.ts';
2
+ export type * from './eco/eco.types.ts';
3
+ export { eco } from './eco/eco.ts';
4
+ export { defineApiHandler, defineGroupHandler, type GroupHandler } from './adapters/shared/define-api-handler.ts';
5
+ export {
6
+ createEcoBuildPluginFromSourceTransform,
7
+ createVitePluginsFromAppSourceTransforms,
8
+ getAppSourceTransforms,
9
+ createVitePluginFromSourceTransform,
10
+ normalizeTransformId,
11
+ type EcoSourceTransform,
12
+ type EcoSourceTransformResult,
13
+ type EcoViteCompatiblePlugin,
14
+ } from './plugins/source-transform.ts';
15
+ export { createEcoComponentMetaTransform } from './plugins/eco-component-meta-plugin.ts';