@ecopages/core 0.2.0-alpha.53 → 0.2.0-alpha.54

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 (590) hide show
  1. package/README.md +2 -3
  2. package/package.json +97 -182
  3. package/src/adapters/abstract/application-adapter.test.ts +218 -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 +214 -0
  9. package/src/adapters/bun/hmr-manager.test.ts +265 -0
  10. package/src/adapters/bun/hmr-manager.ts +88 -0
  11. package/src/adapters/bun/index.ts +2 -0
  12. package/src/adapters/bun/runtime-host.ts +76 -0
  13. package/src/adapters/bun/server-adapter.ts +605 -0
  14. package/src/adapters/bun/static-preview-host.ts +70 -0
  15. package/src/adapters/create-app.test.ts +10 -0
  16. package/src/adapters/create-app.ts +91 -0
  17. package/src/adapters/index.ts +2 -0
  18. package/src/adapters/node/create-app.test.ts +76 -0
  19. package/src/adapters/node/create-app.ts +116 -0
  20. package/src/adapters/node/http-request-bridge.test.ts +146 -0
  21. package/src/adapters/node/http-request-bridge.ts +176 -0
  22. package/src/adapters/node/node-client-bridge.test.ts +198 -0
  23. package/src/adapters/node/node-client-bridge.ts +79 -0
  24. package/src/adapters/node/node-hmr-manager.test.ts +374 -0
  25. package/src/adapters/node/node-hmr-manager.ts +72 -0
  26. package/src/adapters/node/runtime-host.test.ts +49 -0
  27. package/src/adapters/node/runtime-host.ts +113 -0
  28. package/src/adapters/node/server-adapter-dependencies.ts +28 -0
  29. package/src/adapters/node/server-adapter.test.ts +84 -0
  30. package/src/adapters/node/server-adapter.ts +423 -0
  31. package/src/adapters/node/static-content-server.test.ts +60 -0
  32. package/src/adapters/node/static-content-server.ts +239 -0
  33. package/src/adapters/node/static-preview-host.test.ts +89 -0
  34. package/src/adapters/node/static-preview-host.ts +101 -0
  35. package/src/adapters/shared/api-response.test.ts +97 -0
  36. package/src/adapters/shared/api-response.ts +104 -0
  37. package/src/adapters/shared/application-adapter.ts +199 -0
  38. package/src/adapters/shared/define-api-handler.ts +66 -0
  39. package/src/adapters/shared/explicit-static-render-preparation.ts +58 -0
  40. package/src/adapters/shared/explicit-static-route-matcher.test.ts +381 -0
  41. package/src/adapters/shared/explicit-static-route-matcher.ts +131 -0
  42. package/src/adapters/shared/file-route-middleware-pipeline.test.ts +85 -0
  43. package/src/adapters/shared/file-route-middleware-pipeline.ts +118 -0
  44. package/src/adapters/shared/fs-server-response-factory.test.ts +176 -0
  45. package/src/adapters/shared/fs-server-response-factory.ts +96 -0
  46. package/src/adapters/shared/fs-server-response-matcher.test.ts +311 -0
  47. package/src/adapters/shared/fs-server-response-matcher.ts +240 -0
  48. package/src/adapters/shared/hmr-entrypoint-registrar.ts +149 -0
  49. package/src/adapters/shared/hmr-html-response.ts +54 -0
  50. package/src/adapters/shared/hmr-manager.contract.test.ts +228 -0
  51. package/src/adapters/shared/hmr-manager.dispatch.test.ts +229 -0
  52. package/src/adapters/shared/render-context.test.ts +244 -0
  53. package/src/adapters/shared/render-context.ts +161 -0
  54. package/src/adapters/shared/runtime-app-bootstrap.test.ts +96 -0
  55. package/src/adapters/shared/runtime-app-bootstrap.ts +72 -0
  56. package/src/adapters/shared/runtime-host.ts +11 -0
  57. package/src/adapters/shared/server-adapter.test.ts +130 -0
  58. package/src/adapters/shared/server-adapter.ts +571 -0
  59. package/src/adapters/shared/server-route-handler.test.ts +112 -0
  60. package/src/adapters/shared/server-route-handler.ts +153 -0
  61. package/src/adapters/shared/server-static-builder.test.ts +338 -0
  62. package/src/adapters/shared/server-static-builder.ts +170 -0
  63. package/src/adapters/shared/shared-hmr-manager.ts +298 -0
  64. package/src/adapters/shared/static-preview-host.ts +12 -0
  65. package/src/build/README.md +57 -73
  66. package/src/build/browser-runtime-manifest.test.ts +121 -0
  67. package/src/build/browser-runtime-manifest.ts +105 -0
  68. package/src/build/browser-runtime-plugin-helpers.test.ts +49 -0
  69. package/src/build/browser-runtime-plugin-helpers.ts +37 -0
  70. package/src/build/browser-runtime-plugin.test.ts +256 -0
  71. package/src/build/browser-runtime-plugin.ts +306 -0
  72. package/src/build/build-adapter.test.ts +463 -0
  73. package/src/build/build-adapter.ts +788 -0
  74. package/src/build/build-manifest.ts +79 -0
  75. package/src/build/build-types.ts +83 -0
  76. package/src/build/rolldown-build-adapter.test.ts +352 -0
  77. package/src/build/rolldown-build-adapter.ts +363 -0
  78. package/src/build/rolldown-plugin-bridge.test.ts +256 -0
  79. package/src/build/rolldown-plugin-bridge.ts +309 -0
  80. package/src/build/runtime-build-executor.test.ts +130 -0
  81. package/src/build/runtime-build-executor.ts +37 -0
  82. package/src/build/runtime-build-output-normalizer.ts +137 -0
  83. package/src/build/serialized-build-executor.test.ts +96 -0
  84. package/src/build/serialized-build-executor.ts +90 -0
  85. package/src/build/server-side-css-shim-plugin.ts +77 -0
  86. package/src/cache/index.ts +6 -0
  87. package/src/cache/module-parse-cache.test.ts +73 -0
  88. package/src/cache/module-parse-cache.ts +137 -0
  89. package/src/config/README.md +1 -1
  90. package/src/config/config-builder.test.ts +456 -0
  91. package/src/config/config-builder.ts +728 -0
  92. package/src/config/config-builder.typecheck.test.ts +96 -0
  93. package/src/config/{constants.d.ts → constants.ts} +22 -13
  94. package/src/dev/host-runtime.ts +34 -0
  95. package/src/dev/sc-server.ts +143 -0
  96. package/src/eco/eco.browser.test.ts +43 -0
  97. package/src/eco/eco.browser.ts +137 -0
  98. package/src/eco/eco.test.ts +781 -0
  99. package/src/eco/eco.ts +262 -0
  100. package/src/eco/eco.types.ts +293 -0
  101. package/src/eco/eco.utils.test.ts +219 -0
  102. package/src/eco/eco.utils.ts +5 -0
  103. package/src/eco/global-injector-map.test.ts +42 -0
  104. package/src/eco/global-injector-map.ts +112 -0
  105. package/src/eco/lazy-injector-map.test.ts +66 -0
  106. package/src/eco/lazy-injector-map.ts +120 -0
  107. package/src/eco/module-dependencies.test.ts +30 -0
  108. package/src/eco/module-dependencies.ts +75 -0
  109. package/src/errors/http-error.test.ts +134 -0
  110. package/src/errors/http-error.ts +72 -0
  111. package/src/errors/index.ts +3 -0
  112. package/src/errors/locals-access-error.ts +7 -0
  113. package/src/global/app-logger.ts +4 -0
  114. package/src/global/utils.test.ts +12 -0
  115. 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
  116. package/src/hmr/client/__screenshots__/hmr-runtime.test.browser.ts/HMR-Runtime-HMR-Server-Integration-should-load-fixture-app-page-1.png +0 -0
  117. package/src/hmr/client/__screenshots__/hmr-runtime.test.browser.ts/HMR-Runtime-WebSocket-Connection-should-connect-to-correct-HMR-endpoint-1.png +0 -0
  118. package/src/hmr/client/hmr-runtime.ts +162 -0
  119. package/src/hmr/hmr-strategy.test.ts +124 -0
  120. package/src/hmr/hmr-strategy.ts +177 -0
  121. package/src/hmr/hmr.postcss.test.e2e.ts +41 -0
  122. package/src/hmr/hmr.test.e2e.ts +66 -0
  123. package/src/hmr/strategies/default-hmr-strategy.ts +60 -0
  124. package/src/hmr/strategies/js-hmr-strategy.test.ts +344 -0
  125. package/src/hmr/strategies/js-hmr-strategy.ts +307 -0
  126. package/src/index.browser.ts +3 -0
  127. package/src/index.ts +15 -0
  128. package/src/integrations/ghtml/ghtml-renderer.test.ts +253 -0
  129. package/src/integrations/ghtml/ghtml-renderer.ts +87 -0
  130. package/src/integrations/ghtml/ghtml.constants.ts +1 -0
  131. package/src/integrations/ghtml/ghtml.plugin.ts +28 -0
  132. package/src/plugins/alias-resolver-cache.test.ts +110 -0
  133. package/src/plugins/alias-resolver-cache.ts +145 -0
  134. package/src/plugins/alias-resolver-plugin.test.ts +41 -0
  135. package/src/plugins/alias-resolver-plugin.ts +75 -0
  136. package/src/plugins/eco-component-meta-plugin.test.ts +421 -0
  137. package/src/plugins/eco-component-meta-plugin.ts +518 -0
  138. package/src/plugins/foreign-jsx-override-plugin.test.ts +65 -0
  139. package/src/plugins/foreign-jsx-override-plugin.ts +76 -0
  140. package/src/plugins/integration-plugin.test.ts +151 -0
  141. package/src/plugins/integration-plugin.ts +344 -0
  142. package/src/plugins/processor.test.ts +148 -0
  143. package/src/plugins/processor.ts +257 -0
  144. package/src/plugins/{runtime-capability.d.ts → runtime-capability.ts} +8 -3
  145. package/src/plugins/source-transform.test.ts +82 -0
  146. package/src/plugins/source-transform.ts +123 -0
  147. package/src/route-renderer/orchestration/component-render-context.ts +338 -0
  148. package/src/route-renderer/orchestration/declared-ownership-graph.ts +62 -0
  149. package/src/route-renderer/orchestration/foreign-subtree-execution.service.ts +431 -0
  150. package/src/route-renderer/orchestration/integration-renderer.test.ts +2251 -0
  151. package/src/route-renderer/orchestration/integration-renderer.ts +1384 -0
  152. package/src/route-renderer/orchestration/ownership-planning.service.ts +97 -0
  153. package/src/route-renderer/orchestration/ownership-validation.service.ts +76 -0
  154. package/src/route-renderer/orchestration/processed-asset-dedupe.ts +29 -0
  155. package/src/route-renderer/orchestration/queued-foreign-subtree-resolution.service.test.ts +435 -0
  156. package/src/route-renderer/orchestration/queued-foreign-subtree-resolution.service.ts +310 -0
  157. package/src/route-renderer/orchestration/render-output.utils.ts +310 -0
  158. package/src/route-renderer/orchestration/route-render-orchestrator.prepare-render-options.test.ts +1365 -0
  159. package/src/route-renderer/orchestration/route-render-orchestrator.test.ts +267 -0
  160. package/src/route-renderer/orchestration/route-render-orchestrator.ts +879 -0
  161. package/src/route-renderer/orchestration/template-serialization.test.ts +110 -0
  162. package/src/route-renderer/orchestration/template-serialization.ts +117 -0
  163. package/src/route-renderer/page-loading/component-dependency-collection.ts +202 -0
  164. package/src/route-renderer/page-loading/declared-asset-collection.ts +153 -0
  165. package/src/route-renderer/page-loading/dependency-resolver.test.ts +761 -0
  166. package/src/route-renderer/page-loading/dependency-resolver.ts +144 -0
  167. package/src/route-renderer/page-loading/ecopages-virtual-imports.ts +75 -0
  168. package/src/route-renderer/page-loading/lazy-entry-collection.ts +167 -0
  169. package/src/route-renderer/page-loading/lazy-trigger-planning.ts +74 -0
  170. package/src/route-renderer/page-loading/module-declaration-aggregation.ts +60 -0
  171. package/src/route-renderer/page-loading/module-declaration-scripts.ts +16 -0
  172. package/src/route-renderer/page-loading/page-dependency-bundling.ts +244 -0
  173. package/src/route-renderer/page-loading/page-module-loader.test.ts +183 -0
  174. package/src/route-renderer/page-loading/page-module-loader.ts +184 -0
  175. package/src/route-renderer/route-renderer.ts +133 -0
  176. package/src/router/client/link-intent.test.browser.ts +51 -0
  177. package/src/router/client/link-intent.ts +92 -0
  178. package/src/router/client/navigation-coordinator.test.ts +237 -0
  179. package/src/router/client/navigation-coordinator.ts +453 -0
  180. package/src/router/server/route-registry.test.ts +176 -0
  181. package/src/router/server/route-registry.ts +382 -0
  182. package/src/services/assets/asset-processing-service/asset-dependency-keys.ts +66 -0
  183. package/src/services/assets/asset-processing-service/asset-processing.service.test.ts +473 -0
  184. package/src/services/assets/asset-processing-service/asset-processing.service.ts +344 -0
  185. package/src/services/assets/asset-processing-service/asset.factory.test.ts +63 -0
  186. package/src/services/assets/asset-processing-service/asset.factory.ts +105 -0
  187. package/src/services/assets/asset-processing-service/assets.types.ts +128 -0
  188. package/src/services/assets/asset-processing-service/browser-runtime-asset.factory.test.ts +74 -0
  189. package/src/services/assets/asset-processing-service/browser-runtime-asset.factory.ts +98 -0
  190. package/src/services/assets/asset-processing-service/browser-runtime-entry.factory.test.ts +67 -0
  191. package/src/services/assets/asset-processing-service/browser-runtime-entry.factory.ts +78 -0
  192. package/src/services/assets/asset-processing-service/grouped-content-bundles.ts +104 -0
  193. package/src/services/assets/asset-processing-service/index.ts +6 -0
  194. package/src/services/assets/asset-processing-service/page-package.test.ts +135 -0
  195. package/src/services/assets/asset-processing-service/page-package.ts +103 -0
  196. package/src/services/assets/asset-processing-service/{processor.interface.d.ts → processor.interface.ts} +10 -5
  197. package/src/services/assets/asset-processing-service/processor.registry.ts +18 -0
  198. package/src/services/assets/asset-processing-service/processors/base/base-processor.test.ts +59 -0
  199. package/src/services/assets/asset-processing-service/processors/base/base-processor.ts +83 -0
  200. package/src/services/assets/asset-processing-service/processors/base/base-script-processor.ts +173 -0
  201. package/src/services/assets/asset-processing-service/processors/index.ts +5 -0
  202. package/src/services/assets/asset-processing-service/processors/script/content-script.processor.test.ts +188 -0
  203. package/src/services/assets/asset-processing-service/processors/script/content-script.processor.ts +138 -0
  204. package/src/services/assets/asset-processing-service/processors/script/file-script.processor.test.ts +326 -0
  205. package/src/services/assets/asset-processing-service/processors/script/file-script.processor.ts +116 -0
  206. package/src/services/assets/asset-processing-service/processors/script/node-module-script.processor.test.ts +270 -0
  207. package/src/services/assets/asset-processing-service/processors/script/node-module-script.processor.ts +145 -0
  208. package/src/services/assets/asset-processing-service/processors/stylesheet/content-stylesheet.processor.test.ts +261 -0
  209. package/src/services/assets/asset-processing-service/processors/stylesheet/content-stylesheet.processor.ts +72 -0
  210. package/src/services/assets/asset-processing-service/processors/stylesheet/file-stylesheet.processor.ts +83 -0
  211. package/src/services/assets/asset-processing-service/ungrouped-dependency-processing.ts +65 -0
  212. package/src/services/assets/browser-bundle.service.test.ts +66 -0
  213. package/src/services/assets/browser-bundle.service.ts +109 -0
  214. package/src/services/cache/cache.types.ts +126 -0
  215. package/src/services/cache/index.ts +18 -0
  216. package/src/services/cache/memory-cache-store.test.ts +225 -0
  217. package/src/services/cache/memory-cache-store.ts +130 -0
  218. package/src/services/cache/page-cache-service.test.ts +175 -0
  219. package/src/services/cache/page-cache-service.ts +202 -0
  220. package/src/services/cache/page-request-cache-coordinator.service.test.ts +79 -0
  221. package/src/services/cache/page-request-cache-coordinator.service.ts +131 -0
  222. package/src/services/html/html-rewriter-provider.service.test.ts +183 -0
  223. package/src/services/html/html-rewriter-provider.service.ts +105 -0
  224. package/src/services/html/html-transformer.service.test.ts +544 -0
  225. package/src/services/html/html-transformer.service.ts +369 -0
  226. package/src/services/invalidation/development-invalidation.service.test.ts +87 -0
  227. package/src/services/invalidation/development-invalidation.service.ts +262 -0
  228. package/src/services/module-loading/app-module-loader.service.ts +9 -0
  229. package/src/services/module-loading/app-server-module-transpiler.service.test.ts +297 -0
  230. package/src/services/module-loading/app-server-module-transpiler.service.ts +168 -0
  231. package/src/services/module-loading/host-module-loader-registry.ts +15 -0
  232. package/src/services/module-loading/{module-loading-types.d.ts → module-loading-types.ts} +1 -0
  233. package/src/services/module-loading/page-module-import.service.test.ts +652 -0
  234. package/src/services/module-loading/page-module-import.service.ts +302 -0
  235. package/src/services/module-loading/server-module-transpiler.service.test.ts +242 -0
  236. package/src/services/module-loading/server-module-transpiler.service.ts +104 -0
  237. package/src/services/module-loading/source-module-support.ts +19 -0
  238. package/src/services/runtime-state/dev-graph.service.ts +217 -0
  239. package/src/services/runtime-state/entrypoint-dependency-graph.service.ts +136 -0
  240. package/src/services/runtime-state/server-invalidation-state.service.ts +68 -0
  241. package/src/services/validation/schema-validation-service.test.ts +223 -0
  242. package/src/services/validation/schema-validation-service.ts +204 -0
  243. package/src/services/validation/{standard-schema.types.d.ts → standard-schema.types.ts} +20 -17
  244. package/src/static-site-generator/static-site-generator.test.ts +408 -0
  245. package/src/static-site-generator/static-site-generator.ts +445 -0
  246. package/src/types/internal-types.ts +243 -0
  247. package/src/types/public-types.ts +1508 -0
  248. package/src/utils/deep-merge.test.ts +114 -0
  249. package/src/utils/deep-merge.ts +47 -0
  250. package/src/utils/hash.ts +5 -0
  251. package/src/utils/html-escaping.ts +9 -0
  252. package/src/utils/invariant.test.ts +22 -0
  253. package/src/utils/invariant.ts +15 -0
  254. package/src/utils/locals-utils.ts +37 -0
  255. package/src/utils/parse-cli-args.test.ts +69 -0
  256. package/src/utils/parse-cli-args.ts +105 -0
  257. package/src/utils/path-utils.module.ts +14 -0
  258. package/src/utils/path-utils.test.ts +15 -0
  259. package/src/utils/resolve-work-dir.ts +45 -0
  260. package/src/utils/runtime.ts +44 -0
  261. package/src/utils/server-utils.module.ts +67 -0
  262. package/src/utils/server-utils.test.ts +38 -0
  263. package/src/watchers/project-watcher.integration.test.ts +337 -0
  264. package/src/watchers/project-watcher.test-helpers.ts +42 -0
  265. package/src/watchers/project-watcher.test.ts +768 -0
  266. package/src/watchers/project-watcher.ts +357 -0
  267. package/src/adapters/abstract/application-adapter.d.ts +0 -194
  268. package/src/adapters/abstract/application-adapter.js +0 -121
  269. package/src/adapters/abstract/router-adapter.d.ts +0 -26
  270. package/src/adapters/abstract/router-adapter.js +0 -5
  271. package/src/adapters/abstract/server-adapter.d.ts +0 -69
  272. package/src/adapters/abstract/server-adapter.js +0 -15
  273. package/src/adapters/bun/client-bridge.d.ts +0 -34
  274. package/src/adapters/bun/client-bridge.js +0 -48
  275. package/src/adapters/bun/create-app.d.ts +0 -60
  276. package/src/adapters/bun/create-app.js +0 -140
  277. package/src/adapters/bun/hmr-manager.d.ts +0 -47
  278. package/src/adapters/bun/hmr-manager.js +0 -58
  279. package/src/adapters/bun/index.d.ts +0 -2
  280. package/src/adapters/bun/index.js +0 -8
  281. package/src/adapters/bun/runtime-host.d.ts +0 -52
  282. package/src/adapters/bun/runtime-host.js +0 -56
  283. package/src/adapters/bun/server-adapter.d.ts +0 -216
  284. package/src/adapters/bun/server-adapter.js +0 -445
  285. package/src/adapters/bun/static-preview-host.d.ts +0 -28
  286. package/src/adapters/bun/static-preview-host.js +0 -45
  287. package/src/adapters/create-app.d.ts +0 -20
  288. package/src/adapters/create-app.js +0 -66
  289. package/src/adapters/index.d.ts +0 -2
  290. package/src/adapters/index.js +0 -8
  291. package/src/adapters/node/create-app.d.ts +0 -24
  292. package/src/adapters/node/create-app.js +0 -92
  293. package/src/adapters/node/http-request-bridge.d.ts +0 -57
  294. package/src/adapters/node/http-request-bridge.js +0 -118
  295. package/src/adapters/node/node-client-bridge.d.ts +0 -26
  296. package/src/adapters/node/node-client-bridge.js +0 -66
  297. package/src/adapters/node/node-hmr-manager.d.ts +0 -52
  298. package/src/adapters/node/node-hmr-manager.js +0 -49
  299. package/src/adapters/node/runtime-host.d.ts +0 -57
  300. package/src/adapters/node/runtime-host.js +0 -92
  301. package/src/adapters/node/server-adapter-dependencies.d.ts +0 -19
  302. package/src/adapters/node/server-adapter-dependencies.js +0 -18
  303. package/src/adapters/node/server-adapter.d.ts +0 -138
  304. package/src/adapters/node/server-adapter.js +0 -315
  305. package/src/adapters/node/static-content-server.d.ts +0 -60
  306. package/src/adapters/node/static-content-server.js +0 -194
  307. package/src/adapters/node/static-preview-host.d.ts +0 -55
  308. package/src/adapters/node/static-preview-host.js +0 -68
  309. package/src/adapters/shared/api-response.d.ts +0 -52
  310. package/src/adapters/shared/api-response.js +0 -96
  311. package/src/adapters/shared/application-adapter.d.ts +0 -18
  312. package/src/adapters/shared/application-adapter.js +0 -90
  313. package/src/adapters/shared/define-api-handler.d.ts +0 -25
  314. package/src/adapters/shared/define-api-handler.js +0 -15
  315. package/src/adapters/shared/explicit-static-render-preparation.d.ts +0 -25
  316. package/src/adapters/shared/explicit-static-render-preparation.js +0 -26
  317. package/src/adapters/shared/explicit-static-route-matcher.d.ts +0 -41
  318. package/src/adapters/shared/explicit-static-route-matcher.js +0 -101
  319. package/src/adapters/shared/file-route-middleware-pipeline.d.ts +0 -62
  320. package/src/adapters/shared/file-route-middleware-pipeline.js +0 -90
  321. package/src/adapters/shared/fs-server-response-factory.d.ts +0 -23
  322. package/src/adapters/shared/fs-server-response-factory.js +0 -81
  323. package/src/adapters/shared/fs-server-response-matcher.d.ts +0 -75
  324. package/src/adapters/shared/fs-server-response-matcher.js +0 -186
  325. package/src/adapters/shared/hmr-entrypoint-registrar.d.ts +0 -55
  326. package/src/adapters/shared/hmr-entrypoint-registrar.js +0 -87
  327. package/src/adapters/shared/hmr-html-response.d.ts +0 -22
  328. package/src/adapters/shared/hmr-html-response.js +0 -33
  329. package/src/adapters/shared/render-context.d.ts +0 -16
  330. package/src/adapters/shared/render-context.js +0 -93
  331. package/src/adapters/shared/runtime-app-bootstrap.d.ts +0 -26
  332. package/src/adapters/shared/runtime-app-bootstrap.js +0 -46
  333. package/src/adapters/shared/runtime-host.d.ts +0 -12
  334. package/src/adapters/shared/runtime-host.js +0 -0
  335. package/src/adapters/shared/server-adapter.d.ts +0 -108
  336. package/src/adapters/shared/server-adapter.js +0 -436
  337. package/src/adapters/shared/server-route-handler.d.ts +0 -89
  338. package/src/adapters/shared/server-route-handler.js +0 -111
  339. package/src/adapters/shared/server-static-builder.d.ts +0 -71
  340. package/src/adapters/shared/server-static-builder.js +0 -100
  341. package/src/adapters/shared/shared-hmr-manager.d.ts +0 -59
  342. package/src/adapters/shared/shared-hmr-manager.js +0 -241
  343. package/src/adapters/shared/static-preview-host.d.ts +0 -10
  344. package/src/adapters/shared/static-preview-host.js +0 -0
  345. package/src/build/browser-runtime-import-rewrite-plugin.d.ts +0 -26
  346. package/src/build/browser-runtime-import-rewrite-plugin.js +0 -165
  347. package/src/build/browser-runtime-manifest.d.ts +0 -31
  348. package/src/build/browser-runtime-manifest.js +0 -61
  349. package/src/build/build-adapter.d.ts +0 -247
  350. package/src/build/build-adapter.js +0 -671
  351. package/src/build/build-manifest.d.ts +0 -33
  352. package/src/build/build-manifest.js +0 -52
  353. package/src/build/build-types.d.ts +0 -57
  354. package/src/build/build-types.js +0 -0
  355. package/src/build/dev-build-coordinator.d.ts +0 -72
  356. package/src/build/dev-build-coordinator.js +0 -154
  357. package/src/build/esbuild-build-adapter.d.ts +0 -79
  358. package/src/build/esbuild-build-adapter.js +0 -521
  359. package/src/build/runtime-build-executor.d.ts +0 -14
  360. package/src/build/runtime-build-executor.js +0 -22
  361. package/src/build/runtime-specifier-alias-plugin.d.ts +0 -15
  362. package/src/build/runtime-specifier-alias-plugin.js +0 -31
  363. package/src/config/config-builder.d.ts +0 -252
  364. package/src/config/config-builder.js +0 -598
  365. package/src/config/constants.js +0 -25
  366. package/src/dev/host-runtime.d.ts +0 -10
  367. package/src/dev/host-runtime.js +0 -24
  368. package/src/dev/sc-server.d.ts +0 -30
  369. package/src/dev/sc-server.js +0 -111
  370. package/src/eco/eco.browser.d.ts +0 -2
  371. package/src/eco/eco.browser.js +0 -88
  372. package/src/eco/eco.d.ts +0 -9
  373. package/src/eco/eco.js +0 -119
  374. package/src/eco/eco.types.d.ts +0 -233
  375. package/src/eco/eco.types.js +0 -0
  376. package/src/eco/eco.utils.d.ts +0 -1
  377. package/src/eco/eco.utils.js +0 -10
  378. package/src/eco/global-injector-map.d.ts +0 -16
  379. package/src/eco/global-injector-map.js +0 -80
  380. package/src/eco/lazy-injector-map.d.ts +0 -8
  381. package/src/eco/lazy-injector-map.js +0 -70
  382. package/src/eco/module-dependencies.d.ts +0 -18
  383. package/src/eco/module-dependencies.js +0 -49
  384. package/src/errors/http-error.d.ts +0 -31
  385. package/src/errors/http-error.js +0 -50
  386. package/src/errors/index.d.ts +0 -3
  387. package/src/errors/index.js +0 -6
  388. package/src/errors/locals-access-error.d.ts +0 -4
  389. package/src/errors/locals-access-error.js +0 -9
  390. package/src/global/app-logger.d.ts +0 -2
  391. package/src/global/app-logger.js +0 -6
  392. package/src/hmr/client/hmr-runtime.d.ts +0 -5
  393. package/src/hmr/client/hmr-runtime.js +0 -117
  394. package/src/hmr/hmr-strategy.d.ts +0 -162
  395. package/src/hmr/hmr-strategy.js +0 -44
  396. package/src/hmr/hmr.postcss.test.e2e.d.ts +0 -1
  397. package/src/hmr/hmr.postcss.test.e2e.js +0 -31
  398. package/src/hmr/hmr.test.e2e.d.ts +0 -1
  399. package/src/hmr/hmr.test.e2e.js +0 -43
  400. package/src/hmr/strategies/default-hmr-strategy.d.ts +0 -43
  401. package/src/hmr/strategies/default-hmr-strategy.js +0 -34
  402. package/src/hmr/strategies/js-hmr-strategy.d.ts +0 -134
  403. package/src/hmr/strategies/js-hmr-strategy.js +0 -173
  404. package/src/index.browser.d.ts +0 -3
  405. package/src/index.browser.js +0 -4
  406. package/src/index.d.ts +0 -6
  407. package/src/index.js +0 -21
  408. package/src/integrations/ghtml/ghtml-renderer.d.ts +0 -16
  409. package/src/integrations/ghtml/ghtml-renderer.js +0 -57
  410. package/src/integrations/ghtml/ghtml.constants.d.ts +0 -1
  411. package/src/integrations/ghtml/ghtml.constants.js +0 -4
  412. package/src/integrations/ghtml/ghtml.plugin.d.ts +0 -16
  413. package/src/integrations/ghtml/ghtml.plugin.js +0 -20
  414. package/src/plugins/alias-resolver-plugin.d.ts +0 -3
  415. package/src/plugins/alias-resolver-plugin.js +0 -61
  416. package/src/plugins/eco-component-meta-plugin.d.ts +0 -108
  417. package/src/plugins/eco-component-meta-plugin.js +0 -175
  418. package/src/plugins/foreign-jsx-override-plugin.d.ts +0 -33
  419. package/src/plugins/foreign-jsx-override-plugin.js +0 -41
  420. package/src/plugins/integration-plugin.d.ts +0 -230
  421. package/src/plugins/integration-plugin.js +0 -201
  422. package/src/plugins/processor.d.ts +0 -97
  423. package/src/plugins/processor.js +0 -141
  424. package/src/plugins/runtime-capability.js +0 -0
  425. package/src/plugins/source-transform.d.ts +0 -46
  426. package/src/plugins/source-transform.js +0 -71
  427. package/src/route-renderer/orchestration/component-render-context.d.ts +0 -97
  428. package/src/route-renderer/orchestration/component-render-context.js +0 -147
  429. package/src/route-renderer/orchestration/declared-ownership-graph.d.ts +0 -18
  430. package/src/route-renderer/orchestration/declared-ownership-graph.js +0 -34
  431. package/src/route-renderer/orchestration/foreign-subtree-execution.service.d.ts +0 -110
  432. package/src/route-renderer/orchestration/foreign-subtree-execution.service.js +0 -233
  433. package/src/route-renderer/orchestration/integration-renderer.d.ts +0 -534
  434. package/src/route-renderer/orchestration/integration-renderer.js +0 -991
  435. package/src/route-renderer/orchestration/ownership-planning.service.d.ts +0 -24
  436. package/src/route-renderer/orchestration/ownership-planning.service.js +0 -63
  437. package/src/route-renderer/orchestration/ownership-validation.service.d.ts +0 -29
  438. package/src/route-renderer/orchestration/ownership-validation.service.js +0 -53
  439. package/src/route-renderer/orchestration/processed-asset-dedupe.d.ts +0 -3
  440. package/src/route-renderer/orchestration/processed-asset-dedupe.js +0 -27
  441. package/src/route-renderer/orchestration/queued-foreign-subtree-resolution.service.d.ts +0 -91
  442. package/src/route-renderer/orchestration/queued-foreign-subtree-resolution.service.js +0 -170
  443. package/src/route-renderer/orchestration/render-output.utils.d.ts +0 -66
  444. package/src/route-renderer/orchestration/render-output.utils.js +0 -171
  445. package/src/route-renderer/orchestration/route-render-orchestrator.d.ts +0 -156
  446. package/src/route-renderer/orchestration/route-render-orchestrator.js +0 -577
  447. package/src/route-renderer/orchestration/template-serialization.d.ts +0 -38
  448. package/src/route-renderer/orchestration/template-serialization.js +0 -45
  449. package/src/route-renderer/page-loading/component-dependency-collection.d.ts +0 -37
  450. package/src/route-renderer/page-loading/component-dependency-collection.js +0 -132
  451. package/src/route-renderer/page-loading/declared-asset-collection.d.ts +0 -24
  452. package/src/route-renderer/page-loading/declared-asset-collection.js +0 -106
  453. package/src/route-renderer/page-loading/dependency-resolver.d.ts +0 -35
  454. package/src/route-renderer/page-loading/dependency-resolver.js +0 -115
  455. package/src/route-renderer/page-loading/ecopages-virtual-imports.d.ts +0 -11
  456. package/src/route-renderer/page-loading/ecopages-virtual-imports.js +0 -57
  457. package/src/route-renderer/page-loading/lazy-entry-collection.d.ts +0 -45
  458. package/src/route-renderer/page-loading/lazy-entry-collection.js +0 -105
  459. package/src/route-renderer/page-loading/lazy-trigger-planning.d.ts +0 -19
  460. package/src/route-renderer/page-loading/lazy-trigger-planning.js +0 -40
  461. package/src/route-renderer/page-loading/module-declaration-aggregation.d.ts +0 -5
  462. package/src/route-renderer/page-loading/module-declaration-aggregation.js +0 -33
  463. package/src/route-renderer/page-loading/module-declaration-scripts.d.ts +0 -3
  464. package/src/route-renderer/page-loading/module-declaration-scripts.js +0 -18
  465. package/src/route-renderer/page-loading/page-dependency-bundling.d.ts +0 -13
  466. package/src/route-renderer/page-loading/page-dependency-bundling.js +0 -137
  467. package/src/route-renderer/page-loading/page-module-loader.d.ts +0 -90
  468. package/src/route-renderer/page-loading/page-module-loader.js +0 -127
  469. package/src/route-renderer/route-renderer.d.ts +0 -69
  470. package/src/route-renderer/route-renderer.js +0 -80
  471. package/src/router/client/link-intent.js +0 -34
  472. package/src/router/client/link-intent.test.browser.d.ts +0 -1
  473. package/src/router/client/link-intent.test.browser.js +0 -43
  474. package/src/router/client/navigation-coordinator.d.ts +0 -169
  475. package/src/router/client/navigation-coordinator.js +0 -215
  476. package/src/router/server/route-registry.d.ts +0 -78
  477. package/src/router/server/route-registry.js +0 -262
  478. package/src/services/assets/asset-processing-service/asset-dependency-keys.d.ts +0 -3
  479. package/src/services/assets/asset-processing-service/asset-dependency-keys.js +0 -56
  480. package/src/services/assets/asset-processing-service/asset-processing.service.d.ts +0 -103
  481. package/src/services/assets/asset-processing-service/asset-processing.service.js +0 -285
  482. package/src/services/assets/asset-processing-service/asset.factory.d.ts +0 -17
  483. package/src/services/assets/asset-processing-service/asset.factory.js +0 -82
  484. package/src/services/assets/asset-processing-service/assets.types.d.ts +0 -103
  485. package/src/services/assets/asset-processing-service/assets.types.js +0 -0
  486. package/src/services/assets/asset-processing-service/browser-runtime-asset.factory.d.ts +0 -57
  487. package/src/services/assets/asset-processing-service/browser-runtime-asset.factory.js +0 -49
  488. package/src/services/assets/asset-processing-service/browser-runtime-entry.factory.d.ts +0 -20
  489. package/src/services/assets/asset-processing-service/browser-runtime-entry.factory.js +0 -41
  490. package/src/services/assets/asset-processing-service/grouped-content-bundles.d.ts +0 -30
  491. package/src/services/assets/asset-processing-service/grouped-content-bundles.js +0 -65
  492. package/src/services/assets/asset-processing-service/index.d.ts +0 -6
  493. package/src/services/assets/asset-processing-service/index.js +0 -6
  494. package/src/services/assets/asset-processing-service/page-package.d.ts +0 -6
  495. package/src/services/assets/asset-processing-service/page-package.js +0 -80
  496. package/src/services/assets/asset-processing-service/processor.interface.js +0 -6
  497. package/src/services/assets/asset-processing-service/processor.registry.d.ts +0 -8
  498. package/src/services/assets/asset-processing-service/processor.registry.js +0 -15
  499. package/src/services/assets/asset-processing-service/processors/base/base-processor.d.ts +0 -24
  500. package/src/services/assets/asset-processing-service/processors/base/base-processor.js +0 -65
  501. package/src/services/assets/asset-processing-service/processors/base/base-script-processor.d.ts +0 -22
  502. package/src/services/assets/asset-processing-service/processors/base/base-script-processor.js +0 -136
  503. package/src/services/assets/asset-processing-service/processors/index.d.ts +0 -5
  504. package/src/services/assets/asset-processing-service/processors/index.js +0 -5
  505. package/src/services/assets/asset-processing-service/processors/script/content-script.processor.d.ts +0 -6
  506. package/src/services/assets/asset-processing-service/processors/script/content-script.processor.js +0 -120
  507. package/src/services/assets/asset-processing-service/processors/script/file-script.processor.d.ts +0 -9
  508. package/src/services/assets/asset-processing-service/processors/script/file-script.processor.js +0 -97
  509. package/src/services/assets/asset-processing-service/processors/script/node-module-script.processor.d.ts +0 -42
  510. package/src/services/assets/asset-processing-service/processors/script/node-module-script.processor.js +0 -126
  511. package/src/services/assets/asset-processing-service/processors/stylesheet/content-stylesheet.processor.d.ts +0 -8
  512. package/src/services/assets/asset-processing-service/processors/stylesheet/content-stylesheet.processor.js +0 -59
  513. package/src/services/assets/asset-processing-service/processors/stylesheet/file-stylesheet.processor.d.ts +0 -9
  514. package/src/services/assets/asset-processing-service/processors/stylesheet/file-stylesheet.processor.js +0 -69
  515. package/src/services/assets/asset-processing-service/ungrouped-dependency-processing.d.ts +0 -18
  516. package/src/services/assets/asset-processing-service/ungrouped-dependency-processing.js +0 -45
  517. package/src/services/assets/browser-bundle.service.d.ts +0 -73
  518. package/src/services/assets/browser-bundle.service.js +0 -41
  519. package/src/services/cache/cache.types.d.ts +0 -107
  520. package/src/services/cache/cache.types.js +0 -0
  521. package/src/services/cache/index.d.ts +0 -7
  522. package/src/services/cache/index.js +0 -7
  523. package/src/services/cache/memory-cache-store.d.ts +0 -42
  524. package/src/services/cache/memory-cache-store.js +0 -98
  525. package/src/services/cache/page-cache-service.d.ts +0 -70
  526. package/src/services/cache/page-cache-service.js +0 -152
  527. package/src/services/cache/page-request-cache-coordinator.service.d.ts +0 -75
  528. package/src/services/cache/page-request-cache-coordinator.service.js +0 -109
  529. package/src/services/html/html-rewriter-provider.service.d.ts +0 -40
  530. package/src/services/html/html-rewriter-provider.service.js +0 -68
  531. package/src/services/html/html-transformer.service.d.ts +0 -96
  532. package/src/services/html/html-transformer.service.js +0 -287
  533. package/src/services/invalidation/development-invalidation.service.d.ts +0 -74
  534. package/src/services/invalidation/development-invalidation.service.js +0 -190
  535. package/src/services/module-loading/app-module-loader.service.d.ts +0 -7
  536. package/src/services/module-loading/app-module-loader.service.js +0 -0
  537. package/src/services/module-loading/app-server-module-transpiler.service.d.ts +0 -24
  538. package/src/services/module-loading/app-server-module-transpiler.service.js +0 -151
  539. package/src/services/module-loading/host-module-loader-registry.d.ts +0 -4
  540. package/src/services/module-loading/host-module-loader-registry.js +0 -15
  541. package/src/services/module-loading/module-loading-types.js +0 -0
  542. package/src/services/module-loading/node-bootstrap-plugin.d.ts +0 -38
  543. package/src/services/module-loading/node-bootstrap-plugin.js +0 -215
  544. package/src/services/module-loading/page-module-import.service.d.ts +0 -95
  545. package/src/services/module-loading/page-module-import.service.js +0 -191
  546. package/src/services/module-loading/server-module-transpiler.service.d.ts +0 -63
  547. package/src/services/module-loading/server-module-transpiler.service.js +0 -64
  548. package/src/services/module-loading/source-module-support.d.ts +0 -5
  549. package/src/services/module-loading/source-module-support.js +0 -8
  550. package/src/services/runtime-state/dev-graph.service.d.ts +0 -118
  551. package/src/services/runtime-state/dev-graph.service.js +0 -162
  552. package/src/services/runtime-state/entrypoint-dependency-graph.service.d.ts +0 -41
  553. package/src/services/runtime-state/entrypoint-dependency-graph.service.js +0 -85
  554. package/src/services/runtime-state/server-invalidation-state.service.d.ts +0 -26
  555. package/src/services/runtime-state/server-invalidation-state.service.js +0 -35
  556. package/src/services/validation/schema-validation-service.d.ts +0 -122
  557. package/src/services/validation/schema-validation-service.js +0 -101
  558. package/src/services/validation/standard-schema.types.js +0 -0
  559. package/src/static-site-generator/static-site-generator.d.ts +0 -104
  560. package/src/static-site-generator/static-site-generator.js +0 -316
  561. package/src/types/internal-types.d.ts +0 -232
  562. package/src/types/internal-types.js +0 -0
  563. package/src/types/public-types.d.ts +0 -1307
  564. package/src/types/public-types.js +0 -0
  565. package/src/utils/deep-merge.d.ts +0 -14
  566. package/src/utils/deep-merge.js +0 -32
  567. package/src/utils/hash.d.ts +0 -1
  568. package/src/utils/hash.js +0 -7
  569. package/src/utils/html-escaping.d.ts +0 -7
  570. package/src/utils/html-escaping.js +0 -6
  571. package/src/utils/html.js +0 -4
  572. package/src/utils/invariant.d.ts +0 -5
  573. package/src/utils/invariant.js +0 -11
  574. package/src/utils/locals-utils.d.ts +0 -15
  575. package/src/utils/locals-utils.js +0 -24
  576. package/src/utils/parse-cli-args.d.ts +0 -27
  577. package/src/utils/parse-cli-args.js +0 -62
  578. package/src/utils/path-utils.module.d.ts +0 -5
  579. package/src/utils/path-utils.module.js +0 -14
  580. package/src/utils/resolve-work-dir.d.ts +0 -11
  581. package/src/utils/resolve-work-dir.js +0 -31
  582. package/src/utils/runtime.d.ts +0 -11
  583. package/src/utils/runtime.js +0 -40
  584. package/src/utils/server-utils.module.d.ts +0 -19
  585. package/src/utils/server-utils.module.js +0 -56
  586. package/src/watchers/project-watcher.d.ts +0 -136
  587. package/src/watchers/project-watcher.js +0 -275
  588. package/src/watchers/project-watcher.test-helpers.d.ts +0 -4
  589. package/src/watchers/project-watcher.test-helpers.js +0 -52
  590. /package/src/utils/{html.d.ts → html.ts} +0 -0
@@ -0,0 +1,177 @@
1
+ import type { ClientBridgeEvent } from '../types/public-types.ts';
2
+
3
+ /**
4
+ * HMR Strategy Pattern
5
+ *
6
+ * This module defines the base classes and types for Hot Module Replacement strategies.
7
+ * Each strategy handles a specific type of file change and determines how to process it.
8
+ *
9
+ * @module
10
+ * @example
11
+ * ```typescript
12
+ * class CustomHmrStrategy extends HmrStrategy {
13
+ * readonly type = HmrStrategyType.INTEGRATION;
14
+ *
15
+ * matches(filePath: string): boolean {
16
+ * return filePath.endsWith('.custom');
17
+ * }
18
+ *
19
+ * async process(filePath: string): Promise<HmrAction> {
20
+ * return {
21
+ * type: 'broadcast',
22
+ * events: [{ type: 'update', path: filePath, timestamp: Date.now() }],
23
+ * };
24
+ * }
25
+ * }
26
+ * ```
27
+ */
28
+
29
+ /**
30
+ * Defines the category of an HMR strategy, which determines its execution priority.
31
+ * Strategies are evaluated in descending order: INTEGRATION → ASSET → SCRIPT → FALLBACK.
32
+ *
33
+ * @remarks
34
+ * The numeric values represent base priorities. Strategies can fine-tune their priority
35
+ * using the `priorityOffset` property.
36
+ */
37
+ export const HmrStrategyType = {
38
+ /**
39
+ * Integration-specific strategies (React, Lit, etc.)
40
+ * Highest priority to allow framework-specific HMR handling.
41
+ */
42
+ INTEGRATION: 100,
43
+
44
+ /**
45
+ * Asset processing strategies (CSS, images, etc.)
46
+ * High priority for specialized asset handling.
47
+ */
48
+ ASSET: 50,
49
+
50
+ /**
51
+ * Generic script bundling strategies (JS/TS)
52
+ * Medium priority for standard script processing.
53
+ */
54
+ SCRIPT: 25,
55
+
56
+ /**
57
+ * Fallback strategy for unhandled file types.
58
+ * Lowest priority, triggers full page reload.
59
+ */
60
+ FALLBACK: 0,
61
+ } as const;
62
+
63
+ export type HmrStrategyType = (typeof HmrStrategyType)[keyof typeof HmrStrategyType];
64
+
65
+ /**
66
+ * Represents an action to be taken after processing a file change.
67
+ */
68
+ export interface HmrAction {
69
+ /**
70
+ * Whether to broadcast an HMR event to connected clients.
71
+ */
72
+ type: 'broadcast' | 'none';
73
+
74
+ /**
75
+ * The HMR events to broadcast, if type is 'broadcast'.
76
+ * Multiple events may be broadcast in one action.
77
+ */
78
+ events?: ClientBridgeEvent[];
79
+ }
80
+
81
+ /**
82
+ * Base class for HMR strategies.
83
+ *
84
+ * Each strategy handles a specific type of file change and determines how to process it.
85
+ * Strategies are selected based on their priority (higher values are evaluated first) and
86
+ * whether they match the changed file path.
87
+ *
88
+ * @remarks
89
+ * Strategies are expected to be stateless and idempotent. The same file change
90
+ * should produce the same result when processed by the same strategy.
91
+ *
92
+ * @example
93
+ * ```typescript
94
+ * class MyAssetStrategy extends HmrStrategy {
95
+ * readonly type = HmrStrategyType.ASSET;
96
+ * readonly priorityOffset = 5;
97
+ *
98
+ * matches(filePath: string): boolean {
99
+ * return /\.(png|jpg|svg)$/.test(filePath);
100
+ * }
101
+ *
102
+ * async process(filePath: string): Promise<HmrAction> {
103
+ * await this.optimizeImage(filePath);
104
+ * return {
105
+ * type: 'broadcast',
106
+ * events: [{ type: 'update', path: filePath, timestamp: Date.now() }]
107
+ * };
108
+ * }
109
+ * }
110
+ * ```
111
+ */
112
+ export abstract class HmrStrategy {
113
+ /**
114
+ * The category of this strategy, determining its base priority.
115
+ */
116
+ abstract readonly type: HmrStrategyType;
117
+
118
+ /**
119
+ * Optional offset to fine-tune priority within the same category.
120
+ * Useful when multiple strategies share the same type.
121
+ *
122
+ * @defaultValue 0
123
+ */
124
+ readonly priorityOffset: number = 0;
125
+
126
+ /**
127
+ * Computed priority for strategy selection.
128
+ * Higher values are evaluated first.
129
+ *
130
+ * @returns The sum of the strategy type and priority offset
131
+ */
132
+ get priority(): number {
133
+ return this.type + this.priorityOffset;
134
+ }
135
+
136
+ /**
137
+ * Determines if this strategy can handle the given file path.
138
+ *
139
+ * @param filePath - Absolute path to the changed file
140
+ * @returns `true` when this strategy should process the file
141
+ *
142
+ * @example
143
+ * ```typescript
144
+ * matches(filePath: string): boolean {
145
+ * return filePath.endsWith('.css');
146
+ * }
147
+ * ```
148
+ */
149
+ abstract matches(filePath: string): boolean;
150
+
151
+ /**
152
+ * Processes a file change and returns the action to take.
153
+ *
154
+ * This method may perform side effects such as:
155
+ * - Rebuilding files
156
+ * - Writing to disk
157
+ * - Transforming code
158
+ * - Updating caches
159
+ *
160
+ * @param filePath - Absolute path to the changed file
161
+ * @returns Action to take (broadcast event or none)
162
+ *
163
+ * @example
164
+ * ```typescript
165
+ * async process(filePath: string): Promise<HmrAction> {
166
+ * const processed = await this.transform(filePath);
167
+ * await Bun.write(outputPath, processed);
168
+ *
169
+ * return {
170
+ * type: 'broadcast',
171
+ * events: [{ type: 'update', path: outputPath, timestamp: Date.now() }]
172
+ * };
173
+ * }
174
+ * ```
175
+ */
176
+ abstract process(filePath: string): Promise<HmrAction>;
177
+ }
@@ -0,0 +1,41 @@
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
+
6
+ const FIXTURE_DIR = resolve(process.cwd(), 'packages/core/__fixtures__/app');
7
+ const TEST_CSS_FILE = resolve(FIXTURE_DIR, 'src/pages/postcss-hmr.css');
8
+
9
+ test.describe('HMR E2E PostCSS', () => {
10
+ test('should hot-update processor-owned CSS without a full page reload', async ({ page }) => {
11
+ const originalCss = readFileSync(TEST_CSS_FILE, 'utf-8');
12
+ const title = page.locator('.postcss-title').first();
13
+
14
+ try {
15
+ await page.goto('/postcss-hmr', { waitUntil: 'networkidle' });
16
+ await expect(title).toBeVisible();
17
+
18
+ const initialColor = await title.evaluate((el) => getComputedStyle(el).color);
19
+ expect(initialColor).toBeTruthy();
20
+ await page.evaluate(() => {
21
+ (window as typeof window & { __postcssReloadProbe?: string }).__postcssReloadProbe = 'before-change';
22
+ });
23
+
24
+ const modifiedCss = originalCss.replace('.postcss-title {', '.postcss-title {\n\tcolor: rgb(255, 0, 0);');
25
+
26
+ await writeFile(TEST_CSS_FILE, modifiedCss, { flush: true });
27
+
28
+ await expect
29
+ .poll(async () => title.evaluate((el) => getComputedStyle(el).color), { timeout: 10000 })
30
+ .toBe('rgb(255, 0, 0)');
31
+
32
+ await expect(
33
+ page.evaluate(
34
+ () => (window as typeof window & { __postcssReloadProbe?: string }).__postcssReloadProbe ?? null,
35
+ ),
36
+ ).resolves.toBe('before-change');
37
+ } finally {
38
+ await writeFile(TEST_CSS_FILE, originalCss, { flush: true });
39
+ }
40
+ });
41
+ });
@@ -0,0 +1,66 @@
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
+
6
+ /**
7
+ * HMR E2E Tests
8
+ *
9
+ * True end-to-end tests for Hot Module Replacement using Playwright.
10
+ * These tests modify actual source files and verify the browser updates.
11
+ *
12
+ * Run with: bunx playwright test packages/core/src/hmr/hmr.e2e.test.ts
13
+ */
14
+
15
+ const FIXTURE_DIR = resolve(process.cwd(), 'packages/core/__fixtures__/app');
16
+ const TEST_CSS_FILE = resolve(FIXTURE_DIR, 'src/pages/index.css');
17
+
18
+ test.describe('HMR E2E', () => {
19
+ test('should load page with .main-title element', async ({ page }) => {
20
+ await page.goto('/', { waitUntil: 'networkidle' });
21
+ const title = page.locator('.main-title').first();
22
+ await expect(title).toBeVisible();
23
+ });
24
+
25
+ test('should connect to HMR WebSocket', async ({ page }) => {
26
+ const socketPromise = page.waitForEvent('websocket', {
27
+ predicate: (socket) => socket.url().endsWith('/_hmr'),
28
+ timeout: 10000,
29
+ });
30
+
31
+ await page.goto('/', { waitUntil: 'networkidle' });
32
+ const socket = await socketPromise;
33
+
34
+ expect(socket.url()).toMatch(/\/_hmr$/);
35
+ });
36
+
37
+ test('should fall back to a full page reload when raw CSS file changes', async ({ page }) => {
38
+ const originalCss = readFileSync(TEST_CSS_FILE, 'utf-8');
39
+ const title = page.locator('.main-title').first();
40
+
41
+ try {
42
+ await page.goto('/', { waitUntil: 'networkidle' });
43
+ await expect(title).toBeVisible();
44
+
45
+ const initialColor = await title.evaluate((el) => getComputedStyle(el).color);
46
+ expect(initialColor).toBeTruthy();
47
+
48
+ const modifiedCss = originalCss.replace('.main-title {', '.main-title {\n\tcolor: rgb(255, 0, 0);');
49
+ const reloadPromise = page.waitForEvent('framenavigated', {
50
+ predicate: (frame) => frame === page.mainFrame(),
51
+ timeout: 10000,
52
+ });
53
+
54
+ await writeFile(TEST_CSS_FILE, modifiedCss, { flush: true });
55
+
56
+ await reloadPromise;
57
+ await page.waitForLoadState('networkidle');
58
+
59
+ await expect
60
+ .poll(async () => title.evaluate((el) => getComputedStyle(el).color), { timeout: 10000 })
61
+ .toBe('rgb(255, 0, 0)');
62
+ } finally {
63
+ await writeFile(TEST_CSS_FILE, originalCss, { flush: true });
64
+ }
65
+ });
66
+ });
@@ -0,0 +1,60 @@
1
+ /**
2
+ * Default HMR Strategy
3
+ *
4
+ * Fallback strategy for file types that don't have specialized handling.
5
+ * Triggers a full page reload to ensure changes are reflected.
6
+ *
7
+ * @module
8
+ */
9
+
10
+ import { HmrStrategy, HmrStrategyType, type HmrAction } from '../hmr-strategy.ts';
11
+
12
+ /**
13
+ * Default fallback strategy for unhandled file types.
14
+ *
15
+ * This strategy matches all files and triggers a full page reload.
16
+ * It has the lowest priority (FALLBACK) and acts as a catch-all when
17
+ * no other strategy matches the changed file.
18
+ *
19
+ * @remarks
20
+ * This strategy ensures that all file changes result in some action,
21
+ * even if we don't have specialized handling for that file type.
22
+ *
23
+ * @example
24
+ * ```typescript
25
+ * const strategy = new DefaultHmrStrategy();
26
+ * const action = await strategy.process('/path/to/unknown.file');
27
+ * ```
28
+ */
29
+ export class DefaultHmrStrategy extends HmrStrategy {
30
+ readonly type = HmrStrategyType.FALLBACK;
31
+
32
+ /**
33
+ * Matches all file paths.
34
+ *
35
+ * @param _filePath - Absolute path to the changed file (unused)
36
+ * @returns Always returns true as this is a catch-all strategy
37
+ */
38
+ matches(_filePath: string): boolean {
39
+ return true;
40
+ }
41
+
42
+ /**
43
+ * Processes a file change by triggering a full page reload.
44
+ *
45
+ * @param filePath - Absolute path to the changed file
46
+ * @returns Action to broadcast a reload event
47
+ */
48
+ async process(filePath: string): Promise<HmrAction> {
49
+ return {
50
+ type: 'broadcast',
51
+ events: [
52
+ {
53
+ type: 'reload',
54
+ path: filePath,
55
+ message: 'fallback-strategy',
56
+ },
57
+ ],
58
+ };
59
+ }
60
+ }
@@ -0,0 +1,344 @@
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: () => ['.kita.tsx', '.react.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 true for unrelated .ts files when watched entrypoints exist', () => {
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(true);
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 integration-owned server templates outside pages and layouts', () => {
148
+ const context = createMockContext({
149
+ getWatchedFiles: () => new Map([[path.join(SRC_DIR, 'entry.ts'), '/output.js']]),
150
+ getTemplateExtensions: () => ['.kita.tsx', '.react.tsx'],
151
+ });
152
+ const strategy = new JsHmrStrategy(context);
153
+
154
+ expect(strategy.matches(path.join(SRC_DIR, 'views', 'explicit-team-view.kita.tsx'))).toBe(false);
155
+ });
156
+
157
+ it('returns false for non-extension matches', () => {
158
+ const context = createMockContext({
159
+ getWatchedFiles: () => new Map([[path.join(SRC_DIR, 'entry.ts'), '/output.js']]),
160
+ });
161
+ const strategy = new JsHmrStrategy(context);
162
+
163
+ expect(strategy.matches(path.join(SRC_DIR, 'data.json'))).toBe(false);
164
+ expect(strategy.matches(path.join(SRC_DIR, 'readme.md'))).toBe(false);
165
+ });
166
+ });
167
+
168
+ describe('process', () => {
169
+ it('returns none when no watched files are registered', async () => {
170
+ const context = createMockContext({
171
+ getWatchedFiles: () => new Map(),
172
+ });
173
+ const strategy = new JsHmrStrategy(context);
174
+
175
+ const action = await strategy.process(path.join(SRC_DIR, 'app.ts'));
176
+
177
+ expect(action.type).toBe('none');
178
+ });
179
+
180
+ it('rebuilds only dependency-connected entrypoints when graph hit exists', async () => {
181
+ const entryA = path.join(SRC_DIR, 'entry-a.ts');
182
+ const entryB = path.join(SRC_DIR, 'entry-b.ts');
183
+ const depA = path.join(SRC_DIR, 'shared-a.ts');
184
+ const setEntrypointDependenciesCalls: Array<{ entrypointPath: string; dependencies: string[] }> = [];
185
+ let batchedEntrypoints: string[] = [];
186
+ const devGraphService = new InMemoryDevGraphService();
187
+ devGraphService.setEntrypointDependencies(entryA, [depA]);
188
+ devGraphService.setEntrypointDependencies(entryB, [entryB]);
189
+
190
+ const context = createMockContext({
191
+ getWatchedFiles: () =>
192
+ new Map([
193
+ [entryA, '/_hmr/entry-a.js'],
194
+ [entryB, '/_hmr/entry-b.js'],
195
+ ]),
196
+ getEntrypointDependencyGraph: () => ({
197
+ supportsSelectiveInvalidation: () => devGraphService.supportsSelectiveInvalidation(),
198
+ getDependencyEntrypoints: (filePath: string) => devGraphService.getDependencyEntrypoints(filePath),
199
+ setEntrypointDependencies: (entrypointPath: string, dependencies: string[]) => {
200
+ setEntrypointDependenciesCalls.push({ entrypointPath, dependencies });
201
+ devGraphService.setEntrypointDependencies(entrypointPath, dependencies);
202
+ },
203
+ clearEntrypointDependencies: (entrypointPath: string) =>
204
+ devGraphService.clearEntrypointDependencies(entrypointPath),
205
+ reset: () => devGraphService.reset(),
206
+ }),
207
+ });
208
+
209
+ const strategy = new JsHmrStrategy(context) as unknown as {
210
+ process: (filePath: string) => Promise<{ type: string; events?: unknown[] }>;
211
+ [key: string]: unknown;
212
+ };
213
+
214
+ strategy.bundleEntrypoints = async (entrypoints: string[]) => {
215
+ batchedEntrypoints = entrypoints;
216
+ const dependencies = new Map<string, string[]>();
217
+ for (const ep of entrypoints) {
218
+ dependencies.set(path.resolve(ep), [ep, depA]);
219
+ }
220
+ return { success: true, dependencies };
221
+ };
222
+
223
+ strategy.processOutput = async () => {
224
+ return { success: true, requiresReload: false };
225
+ };
226
+
227
+ const action = await strategy.process(depA);
228
+
229
+ expect(batchedEntrypoints).toEqual([entryA]);
230
+ expect(setEntrypointDependenciesCalls).toEqual([{ entrypointPath: entryA, dependencies: [entryA, depA] }]);
231
+ expect(action).toEqual({
232
+ type: 'broadcast',
233
+ events: [
234
+ {
235
+ type: 'update',
236
+ path: '/_hmr/entry-a.js',
237
+ timestamp: expect.any(Number),
238
+ },
239
+ ],
240
+ });
241
+ });
242
+
243
+ it('falls back to rebuilding all watched entrypoints when graph has no hit', async () => {
244
+ const entryA = path.join(SRC_DIR, 'entry-a.ts');
245
+ const entryB = path.join(SRC_DIR, 'entry-b.ts');
246
+ const changedFile = path.join(SRC_DIR, 'new-shared.ts');
247
+ let batchedEntrypoints: string[] = [];
248
+
249
+ const context = createMockContext({
250
+ getWatchedFiles: () =>
251
+ new Map([
252
+ [entryA, '/_hmr/entry-a.js'],
253
+ [entryB, '/_hmr/entry-b.js'],
254
+ ]),
255
+ getEntrypointDependencyGraph: () => new NoopDevGraphService(),
256
+ });
257
+
258
+ const strategy = new JsHmrStrategy(context) as unknown as {
259
+ process: (filePath: string) => Promise<{ type: string; events?: unknown[] }>;
260
+ [key: string]: unknown;
261
+ };
262
+
263
+ strategy.bundleEntrypoints = async (entrypoints: string[]) => {
264
+ batchedEntrypoints = entrypoints;
265
+ const dependencies = new Map<string, string[]>();
266
+ for (const ep of entrypoints) {
267
+ dependencies.set(path.resolve(ep), [ep]);
268
+ }
269
+ return { success: true, dependencies };
270
+ };
271
+
272
+ strategy.processOutput = async () => {
273
+ return { success: true, requiresReload: false };
274
+ };
275
+
276
+ const action = await strategy.process(changedFile);
277
+
278
+ expect(batchedEntrypoints).toEqual([entryA, entryB]);
279
+ expect(action).toEqual({
280
+ type: 'broadcast',
281
+ events: [
282
+ {
283
+ type: 'update',
284
+ path: '/_hmr/entry-a.js',
285
+ timestamp: expect.any(Number),
286
+ },
287
+ {
288
+ type: 'update',
289
+ path: '/_hmr/entry-b.js',
290
+ timestamp: expect.any(Number),
291
+ },
292
+ ],
293
+ });
294
+ });
295
+
296
+ it('skips watched entrypoints owned by higher-priority integration strategies', async () => {
297
+ const reactEntrypoint = path.join(SRC_DIR, 'react-page.tsx');
298
+ const scriptEntrypoint = path.join(SRC_DIR, 'widget.script.ts');
299
+ const changedFile = path.join(SRC_DIR, 'shared.ts');
300
+ let batchedEntrypoints: string[] = [];
301
+ const devGraphService = new InMemoryDevGraphService();
302
+ devGraphService.setEntrypointDependencies(reactEntrypoint, [changedFile]);
303
+ devGraphService.setEntrypointDependencies(scriptEntrypoint, [changedFile]);
304
+
305
+ const context = createMockContext({
306
+ getWatchedFiles: () =>
307
+ new Map([
308
+ [reactEntrypoint, '/_hmr/react-page.js'],
309
+ [scriptEntrypoint, '/_hmr/widget.script.js'],
310
+ ]),
311
+ getEntrypointDependencyGraph: () => devGraphService,
312
+ shouldProcessEntrypoint: (entrypointPath: string) => entrypointPath !== reactEntrypoint,
313
+ });
314
+
315
+ const strategy = new JsHmrStrategy(context) as unknown as {
316
+ process: (filePath: string) => Promise<{ type: string; events?: unknown[] }>;
317
+ [key: string]: unknown;
318
+ };
319
+
320
+ strategy.bundleEntrypoints = async (entrypoints: string[]) => {
321
+ batchedEntrypoints = entrypoints;
322
+ return { success: true, dependencies: new Map([[path.resolve(scriptEntrypoint), [scriptEntrypoint]]]) };
323
+ };
324
+
325
+ strategy.processOutput = async () => {
326
+ return { success: true, requiresReload: false };
327
+ };
328
+
329
+ const action = await strategy.process(changedFile);
330
+
331
+ expect(batchedEntrypoints).toEqual([scriptEntrypoint]);
332
+ expect(action).toEqual({
333
+ type: 'broadcast',
334
+ events: [
335
+ {
336
+ type: 'update',
337
+ path: '/_hmr/widget.script.js',
338
+ timestamp: expect.any(Number),
339
+ },
340
+ ],
341
+ });
342
+ });
343
+ });
344
+ });