@ecopages/core 0.2.0-alpha.8 → 0.2.1-beta.0

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 (471) hide show
  1. package/README.md +79 -28
  2. package/package.json +94 -116
  3. package/src/adapters/README.md +2 -2
  4. package/src/adapters/abstract/application-adapter.d.ts +28 -2
  5. package/src/adapters/abstract/application-adapter.js +14 -2
  6. package/src/adapters/abstract/router-adapter.d.ts +1 -1
  7. package/src/adapters/abstract/server-adapter.d.ts +2 -2
  8. package/src/adapters/bun/client-bridge.d.ts +1 -1
  9. package/src/adapters/bun/create-app.d.ts +12 -12
  10. package/src/adapters/bun/create-app.js +64 -41
  11. package/src/adapters/bun/hmr-manager.d.ts +19 -115
  12. package/src/adapters/bun/hmr-manager.js +25 -301
  13. package/src/adapters/bun/index.d.ts +1 -1
  14. package/src/adapters/bun/index.js +2 -2
  15. package/src/adapters/bun/runtime-host.d.ts +52 -0
  16. package/src/adapters/bun/runtime-host.js +56 -0
  17. package/src/adapters/bun/server-adapter.d.ts +100 -32
  18. package/src/adapters/bun/server-adapter.js +142 -65
  19. package/src/adapters/bun/static-preview-host.d.ts +28 -0
  20. package/src/adapters/bun/static-preview-host.js +45 -0
  21. package/src/{create-app.d.ts → adapters/create-app.d.ts} +9 -6
  22. package/src/{create-app.js → adapters/create-app.js} +4 -4
  23. package/src/adapters/index.d.ts +1 -5
  24. package/src/adapters/index.js +1 -7
  25. package/src/adapters/node/create-app.d.ts +15 -12
  26. package/src/adapters/node/create-app.js +34 -85
  27. package/src/adapters/node/http-request-bridge.d.ts +57 -0
  28. package/src/adapters/node/http-request-bridge.js +118 -0
  29. package/src/adapters/node/node-client-bridge.d.ts +1 -1
  30. package/src/adapters/node/node-hmr-manager.d.ts +22 -103
  31. package/src/adapters/node/node-hmr-manager.js +26 -289
  32. package/src/adapters/node/runtime-host.d.ts +57 -0
  33. package/src/adapters/node/runtime-host.js +92 -0
  34. package/src/adapters/node/server-adapter-dependencies.d.ts +19 -0
  35. package/src/adapters/node/server-adapter-dependencies.js +18 -0
  36. package/src/adapters/node/server-adapter.d.ts +19 -42
  37. package/src/adapters/node/server-adapter.js +94 -139
  38. package/src/adapters/node/static-content-server.d.ts +1 -1
  39. package/src/adapters/node/static-content-server.js +1 -1
  40. package/src/adapters/node/static-preview-host.d.ts +55 -0
  41. package/src/adapters/node/static-preview-host.js +68 -0
  42. package/src/adapters/shared/application-adapter.d.ts +1 -1
  43. package/src/adapters/shared/define-api-handler.d.ts +1 -1
  44. package/src/adapters/shared/explicit-static-render-preparation.d.ts +25 -0
  45. package/src/adapters/shared/explicit-static-render-preparation.js +26 -0
  46. package/src/adapters/shared/explicit-static-route-matcher.d.ts +7 -4
  47. package/src/adapters/shared/explicit-static-route-matcher.js +14 -16
  48. package/src/adapters/shared/file-route-middleware-pipeline.d.ts +7 -10
  49. package/src/adapters/shared/file-route-middleware-pipeline.js +2 -11
  50. package/src/adapters/shared/fs-server-response-factory.d.ts +14 -10
  51. package/src/adapters/shared/fs-server-response-factory.js +11 -27
  52. package/src/adapters/shared/fs-server-response-matcher.d.ts +18 -18
  53. package/src/adapters/shared/fs-server-response-matcher.js +72 -46
  54. package/src/adapters/shared/hmr-entrypoint-registrar.js +1 -1
  55. package/src/adapters/shared/hmr-html-response.d.ts +1 -1
  56. package/src/adapters/shared/hmr-html-response.js +4 -3
  57. package/src/adapters/shared/render-context.d.ts +5 -3
  58. package/src/adapters/shared/render-context.js +24 -1
  59. package/src/adapters/shared/runtime-app-bootstrap.d.ts +26 -0
  60. package/src/adapters/shared/runtime-app-bootstrap.js +46 -0
  61. package/src/adapters/shared/runtime-host.d.ts +12 -0
  62. package/src/adapters/shared/server-adapter.d.ts +22 -11
  63. package/src/adapters/shared/server-adapter.js +183 -133
  64. package/src/adapters/shared/server-route-handler.d.ts +5 -5
  65. package/src/adapters/shared/server-route-handler.js +4 -4
  66. package/src/adapters/shared/server-static-builder.d.ts +8 -7
  67. package/src/adapters/shared/server-static-builder.js +6 -5
  68. package/src/adapters/shared/shared-hmr-manager.d.ts +59 -0
  69. package/src/adapters/shared/shared-hmr-manager.js +241 -0
  70. package/src/adapters/shared/static-preview-host.d.ts +10 -0
  71. package/src/build/README.md +57 -67
  72. package/src/build/browser-runtime-manifest.d.ts +31 -0
  73. package/src/build/browser-runtime-manifest.js +61 -0
  74. package/src/build/browser-runtime-plugin-helpers.d.ts +26 -0
  75. package/src/build/browser-runtime-plugin-helpers.js +14 -0
  76. package/src/build/browser-runtime-plugin.d.ts +78 -0
  77. package/src/build/browser-runtime-plugin.js +173 -0
  78. package/src/build/build-adapter.d.ts +384 -63
  79. package/src/build/build-adapter.js +129 -54
  80. package/src/build/build-manifest.d.ts +6 -0
  81. package/src/build/build-manifest.js +21 -2
  82. package/src/build/build-types.d.ts +2 -2
  83. package/src/build/rolldown-adapter-helpers.d.ts +58 -0
  84. package/src/build/rolldown-adapter-helpers.js +265 -0
  85. package/src/build/rolldown-build-adapter.d.ts +28 -0
  86. package/src/build/rolldown-build-adapter.js +65 -0
  87. package/src/build/rolldown-dev-build-adapter.d.ts +82 -0
  88. package/src/build/rolldown-dev-build-adapter.js +166 -0
  89. package/src/build/rolldown-plugin-bridge.d.ts +59 -0
  90. package/src/build/rolldown-plugin-bridge.js +199 -0
  91. package/src/build/runtime-build-executor.d.ts +15 -7
  92. package/src/build/runtime-build-executor.js +8 -9
  93. package/src/build/runtime-build-output-normalizer.d.ts +3 -0
  94. package/src/build/runtime-build-output-normalizer.js +111 -0
  95. package/src/build/serialized-build-executor.d.ts +64 -0
  96. package/src/build/serialized-build-executor.js +63 -0
  97. package/src/build/server-side-css-shim-plugin.d.ts +41 -0
  98. package/src/build/server-side-css-shim-plugin.js +35 -0
  99. package/src/cache/index.d.ts +6 -0
  100. package/src/cache/index.js +6 -0
  101. package/src/cache/module-parse-cache.d.ts +65 -0
  102. package/src/cache/module-parse-cache.js +75 -0
  103. package/src/config/README.md +5 -2
  104. package/src/config/config-builder.d.ts +41 -13
  105. package/src/config/config-builder.js +62 -24
  106. package/src/declarations.d.ts +1 -1
  107. package/src/dev/host-runtime.d.ts +10 -0
  108. package/src/dev/host-runtime.js +24 -0
  109. package/src/dev/sc-server.d.ts +1 -1
  110. package/src/dev/sc-server.js +1 -1
  111. package/src/eco/eco.browser.d.ts +2 -0
  112. package/src/eco/eco.browser.js +88 -0
  113. package/src/eco/eco.js +50 -45
  114. package/src/eco/eco.types.d.ts +60 -8
  115. package/src/eco/eco.utils.d.ts +1 -40
  116. package/src/eco/eco.utils.js +5 -35
  117. package/src/eco/global-injector-map.d.ts +3 -3
  118. package/src/eco/global-injector-map.js +2 -2
  119. package/src/eco/lazy-injector-map.d.ts +2 -2
  120. package/src/errors/index.d.ts +1 -0
  121. package/src/errors/index.js +3 -1
  122. package/src/hmr/client/hmr-runtime.js +9 -1
  123. package/src/hmr/hmr-strategy.d.ts +16 -13
  124. package/src/hmr/hmr-strategy.js +22 -7
  125. package/src/hmr/strategies/default-hmr-strategy.d.ts +2 -2
  126. package/src/hmr/strategies/default-hmr-strategy.js +1 -1
  127. package/src/hmr/strategies/js-hmr-strategy.d.ts +4 -9
  128. package/src/hmr/strategies/js-hmr-strategy.js +5 -10
  129. package/src/index.browser.d.ts +2 -2
  130. package/src/index.browser.js +1 -1
  131. package/src/index.d.ts +3 -2
  132. package/src/index.js +15 -4
  133. package/src/integrations/ghtml/ghtml-renderer.d.ts +2 -1
  134. package/src/integrations/ghtml/ghtml-renderer.js +24 -29
  135. package/src/integrations/ghtml/ghtml.constants.d.ts +1 -0
  136. package/src/integrations/ghtml/ghtml.constants.js +4 -0
  137. package/src/integrations/ghtml/ghtml.plugin.d.ts +2 -6
  138. package/src/integrations/ghtml/ghtml.plugin.js +3 -4
  139. package/src/plugins/README.md +1 -0
  140. package/src/plugins/alias-resolver-cache.d.ts +68 -0
  141. package/src/plugins/alias-resolver-cache.js +106 -0
  142. package/src/plugins/alias-resolver-plugin.d.ts +5 -1
  143. package/src/plugins/alias-resolver-plugin.js +19 -7
  144. package/src/plugins/eco-component-meta-plugin.d.ts +12 -1
  145. package/src/plugins/eco-component-meta-plugin.js +43 -25
  146. package/src/plugins/foreign-jsx-override-plugin.d.ts +33 -0
  147. package/src/plugins/foreign-jsx-override-plugin.js +41 -0
  148. package/src/plugins/integration-plugin.d.ts +136 -42
  149. package/src/plugins/integration-plugin.js +99 -31
  150. package/src/plugins/processor.d.ts +4 -2
  151. package/src/plugins/processor.js +8 -3
  152. package/src/plugins/source-transform.d.ts +46 -0
  153. package/src/plugins/source-transform.js +71 -0
  154. package/src/route-renderer/GRAPH.md +80 -318
  155. package/src/route-renderer/README.md +74 -78
  156. package/src/route-renderer/orchestration/component-render-context.d.ts +97 -0
  157. package/src/route-renderer/orchestration/component-render-context.js +147 -0
  158. package/src/route-renderer/orchestration/declared-ownership-graph.d.ts +18 -0
  159. package/src/route-renderer/orchestration/declared-ownership-graph.js +34 -0
  160. package/src/route-renderer/orchestration/foreign-subtree-execution.service.d.ts +110 -0
  161. package/src/route-renderer/orchestration/foreign-subtree-execution.service.js +233 -0
  162. package/src/route-renderer/orchestration/integration-renderer.d.ts +290 -128
  163. package/src/route-renderer/orchestration/integration-renderer.js +660 -258
  164. package/src/route-renderer/orchestration/ownership-planning.service.d.ts +24 -0
  165. package/src/route-renderer/orchestration/ownership-planning.service.js +63 -0
  166. package/src/route-renderer/orchestration/ownership-validation.service.d.ts +29 -0
  167. package/src/route-renderer/orchestration/ownership-validation.service.js +53 -0
  168. package/src/route-renderer/orchestration/processed-asset-dedupe.d.ts +3 -0
  169. package/src/route-renderer/orchestration/processed-asset-dedupe.js +27 -0
  170. package/src/route-renderer/orchestration/queued-foreign-subtree-resolution.service.d.ts +91 -0
  171. package/src/route-renderer/orchestration/queued-foreign-subtree-resolution.service.js +170 -0
  172. package/src/route-renderer/orchestration/render-output.utils.d.ts +66 -0
  173. package/src/route-renderer/orchestration/render-output.utils.js +171 -0
  174. package/src/route-renderer/orchestration/route-render-orchestrator.d.ts +156 -0
  175. package/src/route-renderer/orchestration/route-render-orchestrator.js +577 -0
  176. package/src/route-renderer/orchestration/template-serialization.d.ts +38 -0
  177. package/src/route-renderer/orchestration/template-serialization.js +45 -0
  178. package/src/route-renderer/page-loading/component-dependency-collection.d.ts +37 -0
  179. package/src/route-renderer/page-loading/component-dependency-collection.js +132 -0
  180. package/src/route-renderer/page-loading/declared-asset-collection.d.ts +24 -0
  181. package/src/route-renderer/page-loading/declared-asset-collection.js +106 -0
  182. package/src/route-renderer/page-loading/dependency-resolver.d.ts +2 -2
  183. package/src/route-renderer/page-loading/dependency-resolver.js +27 -354
  184. package/src/route-renderer/page-loading/ecopages-virtual-imports.d.ts +11 -0
  185. package/src/route-renderer/page-loading/ecopages-virtual-imports.js +57 -0
  186. package/src/route-renderer/page-loading/lazy-entry-collection.d.ts +45 -0
  187. package/src/route-renderer/page-loading/lazy-entry-collection.js +105 -0
  188. package/src/route-renderer/page-loading/lazy-trigger-planning.d.ts +19 -0
  189. package/src/route-renderer/page-loading/lazy-trigger-planning.js +40 -0
  190. package/src/route-renderer/page-loading/module-declaration-aggregation.d.ts +5 -0
  191. package/src/route-renderer/page-loading/module-declaration-aggregation.js +33 -0
  192. package/src/route-renderer/page-loading/module-declaration-scripts.d.ts +3 -0
  193. package/src/route-renderer/page-loading/module-declaration-scripts.js +18 -0
  194. package/src/route-renderer/page-loading/page-dependency-bundling.d.ts +13 -0
  195. package/src/route-renderer/page-loading/page-dependency-bundling.js +137 -0
  196. package/src/route-renderer/page-loading/page-module-loader.d.ts +7 -4
  197. package/src/route-renderer/page-loading/page-module-loader.js +8 -5
  198. package/src/route-renderer/route-renderer.d.ts +31 -23
  199. package/src/route-renderer/route-renderer.js +17 -24
  200. package/src/router/README.md +76 -8
  201. package/src/router/client/navigation-coordinator.d.ts +20 -0
  202. package/src/router/client/navigation-coordinator.js +2 -2
  203. package/src/router/server/route-registry.d.ts +78 -0
  204. package/src/router/server/route-registry.js +262 -0
  205. package/src/services/README.md +1 -2
  206. package/src/services/assets/asset-processing-service/asset-dependency-keys.d.ts +3 -0
  207. package/src/services/assets/asset-processing-service/asset-dependency-keys.js +56 -0
  208. package/src/services/assets/asset-processing-service/asset-processing.service.d.ts +3 -20
  209. package/src/services/assets/asset-processing-service/asset-processing.service.js +52 -98
  210. package/src/services/assets/asset-processing-service/asset.factory.d.ts +1 -1
  211. package/src/services/assets/asset-processing-service/asset.factory.js +2 -2
  212. package/src/services/assets/asset-processing-service/assets.types.d.ts +14 -0
  213. package/src/services/assets/asset-processing-service/browser-runtime-asset.factory.d.ts +2 -0
  214. package/src/services/assets/asset-processing-service/browser-runtime-asset.factory.js +1 -0
  215. package/src/services/assets/asset-processing-service/grouped-content-bundles.d.ts +30 -0
  216. package/src/services/assets/asset-processing-service/grouped-content-bundles.js +65 -0
  217. package/src/services/assets/asset-processing-service/index.d.ts +6 -5
  218. package/src/services/assets/asset-processing-service/index.js +6 -5
  219. package/src/services/assets/asset-processing-service/page-package.d.ts +6 -0
  220. package/src/services/assets/asset-processing-service/page-package.js +80 -0
  221. package/src/services/assets/asset-processing-service/processor.interface.d.ts +2 -2
  222. package/src/services/assets/asset-processing-service/processor.registry.d.ts +2 -2
  223. package/src/services/assets/asset-processing-service/processors/base/base-processor.d.ts +1 -1
  224. package/src/services/assets/asset-processing-service/processors/base/base-processor.js +3 -2
  225. package/src/services/assets/asset-processing-service/processors/base/base-script-processor.d.ts +10 -5
  226. package/src/services/assets/asset-processing-service/processors/base/base-script-processor.js +69 -5
  227. package/src/services/assets/asset-processing-service/processors/index.d.ts +5 -5
  228. package/src/services/assets/asset-processing-service/processors/index.js +5 -5
  229. package/src/services/assets/asset-processing-service/processors/script/content-script.processor.d.ts +3 -2
  230. package/src/services/assets/asset-processing-service/processors/script/content-script.processor.js +66 -3
  231. package/src/services/assets/asset-processing-service/processors/script/file-script.processor.d.ts +4 -3
  232. package/src/services/assets/asset-processing-service/processors/script/file-script.processor.js +27 -6
  233. package/src/services/assets/asset-processing-service/processors/script/node-module-script.processor.d.ts +38 -3
  234. package/src/services/assets/asset-processing-service/processors/script/node-module-script.processor.js +57 -6
  235. package/src/services/assets/asset-processing-service/processors/stylesheet/content-stylesheet.processor.d.ts +5 -2
  236. package/src/services/assets/asset-processing-service/processors/stylesheet/content-stylesheet.processor.js +39 -5
  237. package/src/services/assets/asset-processing-service/processors/stylesheet/file-stylesheet.processor.d.ts +2 -2
  238. package/src/services/assets/asset-processing-service/processors/stylesheet/file-stylesheet.processor.js +5 -2
  239. package/src/services/assets/asset-processing-service/ungrouped-dependency-processing.d.ts +18 -0
  240. package/src/services/assets/asset-processing-service/ungrouped-dependency-processing.js +45 -0
  241. package/src/services/assets/browser-bundle.service.d.ts +44 -3
  242. package/src/services/assets/browser-bundle.service.js +15 -7
  243. package/src/services/html/html-rewriter-provider.service.d.ts +3 -0
  244. package/src/services/html/html-rewriter-provider.service.js +4 -1
  245. package/src/services/html/html-transformer.service.d.ts +22 -3
  246. package/src/services/html/html-transformer.service.js +101 -35
  247. package/src/services/invalidation/development-invalidation.service.d.ts +1 -1
  248. package/src/services/invalidation/development-invalidation.service.js +1 -0
  249. package/src/services/module-loading/app-module-loader.service.d.ts +7 -0
  250. package/src/services/module-loading/app-module-loader.service.js +0 -0
  251. package/src/services/module-loading/app-server-module-transpiler.service.d.ts +9 -1
  252. package/src/services/module-loading/app-server-module-transpiler.service.js +102 -6
  253. package/src/services/module-loading/host-module-loader-registry.d.ts +4 -0
  254. package/src/services/module-loading/host-module-loader-registry.js +15 -0
  255. package/src/services/module-loading/module-loading-types.d.ts +2 -0
  256. package/src/services/module-loading/module-loading-types.js +0 -0
  257. package/src/services/module-loading/page-module-import.service.d.ts +32 -8
  258. package/src/services/module-loading/page-module-import.service.js +83 -22
  259. package/src/services/module-loading/server-module-transpiler.service.d.ts +8 -14
  260. package/src/services/module-loading/server-module-transpiler.service.js +5 -2
  261. package/src/services/module-loading/source-module-support.d.ts +5 -0
  262. package/src/services/module-loading/source-module-support.js +8 -0
  263. package/src/services/runtime-state/dev-graph.service.d.ts +6 -6
  264. package/src/services/runtime-state/dev-graph.service.js +10 -10
  265. package/src/services/runtime-state/entrypoint-dependency-graph.service.d.ts +1 -1
  266. package/src/services/runtime-state/server-invalidation-state.service.d.ts +1 -1
  267. package/src/static-site-generator/static-site-generator.d.ts +23 -28
  268. package/src/static-site-generator/static-site-generator.js +119 -156
  269. package/src/{internal-types.d.ts → types/internal-types.d.ts} +34 -23
  270. package/src/types/internal-types.js +0 -0
  271. package/src/{public-types.d.ts → types/public-types.d.ts} +195 -37
  272. package/src/types/public-types.js +0 -0
  273. package/src/utils/html-escaping.d.ts +7 -0
  274. package/src/utils/html-escaping.js +6 -0
  275. package/src/utils/locals-utils.d.ts +1 -1
  276. package/src/utils/parse-cli-args.d.ts +4 -1
  277. package/src/utils/parse-cli-args.js +16 -1
  278. package/src/utils/resolve-work-dir.js +1 -1
  279. package/src/watchers/project-watcher.d.ts +4 -4
  280. package/src/watchers/project-watcher.js +35 -41
  281. package/src/watchers/project-watcher.test-helpers.d.ts +2 -2
  282. package/src/watchers/project-watcher.test-helpers.js +5 -5
  283. package/CHANGELOG.md +0 -31
  284. package/src/adapters/abstract/application-adapter.ts +0 -337
  285. package/src/adapters/abstract/router-adapter.ts +0 -30
  286. package/src/adapters/abstract/server-adapter.ts +0 -79
  287. package/src/adapters/bun/client-bridge.ts +0 -62
  288. package/src/adapters/bun/create-app.ts +0 -189
  289. package/src/adapters/bun/hmr-manager.ts +0 -409
  290. package/src/adapters/bun/index.ts +0 -2
  291. package/src/adapters/bun/server-adapter.ts +0 -499
  292. package/src/adapters/bun/server-lifecycle.d.ts +0 -63
  293. package/src/adapters/bun/server-lifecycle.js +0 -92
  294. package/src/adapters/bun/server-lifecycle.ts +0 -124
  295. package/src/adapters/index.ts +0 -6
  296. package/src/adapters/node/bootstrap-dependency-resolver.d.ts +0 -44
  297. package/src/adapters/node/bootstrap-dependency-resolver.js +0 -172
  298. package/src/adapters/node/bootstrap-dependency-resolver.ts +0 -301
  299. package/src/adapters/node/create-app.ts +0 -179
  300. package/src/adapters/node/index.d.ts +0 -6
  301. package/src/adapters/node/index.js +0 -11
  302. package/src/adapters/node/index.ts +0 -16
  303. package/src/adapters/node/node-client-bridge.ts +0 -79
  304. package/src/adapters/node/node-hmr-manager.ts +0 -381
  305. package/src/adapters/node/runtime-adapter.d.ts +0 -46
  306. package/src/adapters/node/runtime-adapter.js +0 -306
  307. package/src/adapters/node/runtime-adapter.ts +0 -439
  308. package/src/adapters/node/server-adapter.ts +0 -488
  309. package/src/adapters/node/static-content-server.ts +0 -239
  310. package/src/adapters/node/write-runtime-manifest.d.ts +0 -26
  311. package/src/adapters/node/write-runtime-manifest.js +0 -12
  312. package/src/adapters/node/write-runtime-manifest.ts +0 -38
  313. package/src/adapters/shared/api-response.ts +0 -104
  314. package/src/adapters/shared/application-adapter.ts +0 -199
  315. package/src/adapters/shared/define-api-handler.ts +0 -66
  316. package/src/adapters/shared/explicit-static-route-matcher.ts +0 -140
  317. package/src/adapters/shared/file-route-middleware-pipeline.ts +0 -127
  318. package/src/adapters/shared/fs-server-response-factory.ts +0 -118
  319. package/src/adapters/shared/fs-server-response-matcher.ts +0 -205
  320. package/src/adapters/shared/hmr-entrypoint-registrar.ts +0 -149
  321. package/src/adapters/shared/hmr-html-response.ts +0 -52
  322. package/src/adapters/shared/render-context.ts +0 -120
  323. package/src/adapters/shared/runtime-bootstrap.d.ts +0 -38
  324. package/src/adapters/shared/runtime-bootstrap.js +0 -43
  325. package/src/adapters/shared/runtime-bootstrap.ts +0 -79
  326. package/src/adapters/shared/server-adapter.ts +0 -489
  327. package/src/adapters/shared/server-route-handler.ts +0 -153
  328. package/src/adapters/shared/server-static-builder.ts +0 -166
  329. package/src/build/build-adapter.ts +0 -361
  330. package/src/build/build-manifest.ts +0 -54
  331. package/src/build/build-types.ts +0 -83
  332. package/src/build/dev-build-coordinator.d.ts +0 -74
  333. package/src/build/dev-build-coordinator.js +0 -161
  334. package/src/build/dev-build-coordinator.ts +0 -221
  335. package/src/build/esbuild-build-adapter.d.ts +0 -72
  336. package/src/build/esbuild-build-adapter.js +0 -422
  337. package/src/build/esbuild-build-adapter.ts +0 -559
  338. package/src/build/runtime-build-executor.ts +0 -34
  339. package/src/build/runtime-specifier-alias-plugin.d.ts +0 -15
  340. package/src/build/runtime-specifier-alias-plugin.js +0 -31
  341. package/src/build/runtime-specifier-alias-plugin.ts +0 -58
  342. package/src/config/config-builder.ts +0 -706
  343. package/src/constants.ts +0 -54
  344. package/src/create-app.ts +0 -87
  345. package/src/dev/sc-server.ts +0 -143
  346. package/src/eco/component-render-context.d.ts +0 -105
  347. package/src/eco/component-render-context.js +0 -87
  348. package/src/eco/component-render-context.ts +0 -224
  349. package/src/eco/eco.ts +0 -242
  350. package/src/eco/eco.types.ts +0 -221
  351. package/src/eco/eco.utils.ts +0 -89
  352. package/src/eco/global-injector-map.ts +0 -112
  353. package/src/eco/lazy-injector-map.ts +0 -120
  354. package/src/eco/module-dependencies.ts +0 -75
  355. package/src/errors/http-error.ts +0 -72
  356. package/src/errors/index.ts +0 -2
  357. package/src/errors/locals-access-error.ts +0 -7
  358. package/src/global/app-logger.ts +0 -4
  359. package/src/hmr/client/hmr-runtime.ts +0 -152
  360. package/src/hmr/hmr-strategy.ts +0 -172
  361. package/src/hmr/hmr.postcss.test.e2e.ts +0 -41
  362. package/src/hmr/hmr.test.e2e.ts +0 -66
  363. package/src/hmr/strategies/default-hmr-strategy.ts +0 -60
  364. package/src/hmr/strategies/js-hmr-strategy.ts +0 -320
  365. package/src/index.browser.ts +0 -3
  366. package/src/index.ts +0 -5
  367. package/src/integrations/ghtml/ghtml-renderer.ts +0 -96
  368. package/src/integrations/ghtml/ghtml.plugin.ts +0 -32
  369. package/src/internal-types.ts +0 -232
  370. package/src/plugins/alias-resolver-plugin.ts +0 -63
  371. package/src/plugins/eco-component-meta-plugin.ts +0 -481
  372. package/src/plugins/integration-plugin.ts +0 -226
  373. package/src/plugins/processor.ts +0 -240
  374. package/src/plugins/runtime-capability.ts +0 -14
  375. package/src/public-types.ts +0 -1317
  376. package/src/route-renderer/component-graph/component-graph-executor.d.ts +0 -32
  377. package/src/route-renderer/component-graph/component-graph-executor.js +0 -31
  378. package/src/route-renderer/component-graph/component-graph-executor.ts +0 -84
  379. package/src/route-renderer/component-graph/component-graph.d.ts +0 -42
  380. package/src/route-renderer/component-graph/component-graph.js +0 -72
  381. package/src/route-renderer/component-graph/component-graph.ts +0 -159
  382. package/src/route-renderer/component-graph/component-marker.d.ts +0 -52
  383. package/src/route-renderer/component-graph/component-marker.js +0 -46
  384. package/src/route-renderer/component-graph/component-marker.ts +0 -117
  385. package/src/route-renderer/component-graph/component-reference.d.ts +0 -10
  386. package/src/route-renderer/component-graph/component-reference.js +0 -19
  387. package/src/route-renderer/component-graph/component-reference.ts +0 -29
  388. package/src/route-renderer/component-graph/marker-graph-resolver.d.ts +0 -77
  389. package/src/route-renderer/component-graph/marker-graph-resolver.js +0 -95
  390. package/src/route-renderer/component-graph/marker-graph-resolver.ts +0 -155
  391. package/src/route-renderer/orchestration/integration-renderer.ts +0 -790
  392. package/src/route-renderer/orchestration/render-execution.service.d.ts +0 -103
  393. package/src/route-renderer/orchestration/render-execution.service.js +0 -121
  394. package/src/route-renderer/orchestration/render-execution.service.ts +0 -230
  395. package/src/route-renderer/orchestration/render-preparation.service.d.ts +0 -121
  396. package/src/route-renderer/orchestration/render-preparation.service.js +0 -332
  397. package/src/route-renderer/orchestration/render-preparation.service.ts +0 -476
  398. package/src/route-renderer/page-loading/dependency-resolver.ts +0 -612
  399. package/src/route-renderer/page-loading/page-module-loader.ts +0 -181
  400. package/src/route-renderer/route-renderer.ts +0 -115
  401. package/src/router/client/link-intent.test.browser.ts +0 -51
  402. package/src/router/client/link-intent.ts +0 -92
  403. package/src/router/client/navigation-coordinator.ts +0 -433
  404. package/src/router/server/fs-router-scanner.d.ts +0 -41
  405. package/src/router/server/fs-router-scanner.js +0 -156
  406. package/src/router/server/fs-router-scanner.ts +0 -219
  407. package/src/router/server/fs-router.d.ts +0 -26
  408. package/src/router/server/fs-router.js +0 -100
  409. package/src/router/server/fs-router.ts +0 -122
  410. package/src/services/assets/asset-processing-service/asset-processing.service.ts +0 -401
  411. package/src/services/assets/asset-processing-service/asset.factory.ts +0 -105
  412. package/src/services/assets/asset-processing-service/assets.types.ts +0 -113
  413. package/src/services/assets/asset-processing-service/browser-runtime-asset.factory.ts +0 -95
  414. package/src/services/assets/asset-processing-service/browser-runtime-entry.factory.ts +0 -78
  415. package/src/services/assets/asset-processing-service/index.ts +0 -5
  416. package/src/services/assets/asset-processing-service/processor.interface.ts +0 -27
  417. package/src/services/assets/asset-processing-service/processor.registry.ts +0 -18
  418. package/src/services/assets/asset-processing-service/processors/base/base-processor.ts +0 -82
  419. package/src/services/assets/asset-processing-service/processors/base/base-script-processor.ts +0 -95
  420. package/src/services/assets/asset-processing-service/processors/index.ts +0 -5
  421. package/src/services/assets/asset-processing-service/processors/script/content-script.processor.ts +0 -66
  422. package/src/services/assets/asset-processing-service/processors/script/file-script.processor.ts +0 -88
  423. package/src/services/assets/asset-processing-service/processors/script/node-module-script.processor.ts +0 -85
  424. package/src/services/assets/asset-processing-service/processors/stylesheet/content-stylesheet.processor.ts +0 -27
  425. package/src/services/assets/asset-processing-service/processors/stylesheet/file-stylesheet.processor.ts +0 -80
  426. package/src/services/assets/browser-bundle.service.ts +0 -53
  427. package/src/services/cache/cache.types.ts +0 -126
  428. package/src/services/cache/index.ts +0 -18
  429. package/src/services/cache/memory-cache-store.ts +0 -130
  430. package/src/services/cache/page-cache-service.ts +0 -202
  431. package/src/services/cache/page-request-cache-coordinator.service.ts +0 -131
  432. package/src/services/html/html-rewriter-provider.service.ts +0 -103
  433. package/src/services/html/html-transformer.service.ts +0 -279
  434. package/src/services/invalidation/development-invalidation.service.ts +0 -261
  435. package/src/services/module-loading/app-server-module-transpiler.service.ts +0 -52
  436. package/src/services/module-loading/page-module-import.service.ts +0 -200
  437. package/src/services/module-loading/server-loader.service.d.ts +0 -96
  438. package/src/services/module-loading/server-loader.service.js +0 -32
  439. package/src/services/module-loading/server-loader.service.ts +0 -130
  440. package/src/services/module-loading/server-module-transpiler.service.ts +0 -105
  441. package/src/services/runtime-manifest/node-runtime-manifest.service.d.ts +0 -35
  442. package/src/services/runtime-manifest/node-runtime-manifest.service.js +0 -60
  443. package/src/services/runtime-manifest/node-runtime-manifest.service.ts +0 -101
  444. package/src/services/runtime-state/dev-graph.service.ts +0 -217
  445. package/src/services/runtime-state/entrypoint-dependency-graph.service.ts +0 -136
  446. package/src/services/runtime-state/runtime-specifier-registry.service.d.ts +0 -69
  447. package/src/services/runtime-state/runtime-specifier-registry.service.js +0 -37
  448. package/src/services/runtime-state/runtime-specifier-registry.service.ts +0 -96
  449. package/src/services/runtime-state/server-invalidation-state.service.ts +0 -68
  450. package/src/services/validation/schema-validation-service.ts +0 -204
  451. package/src/services/validation/standard-schema.types.ts +0 -68
  452. package/src/static-site-generator/static-site-generator.ts +0 -462
  453. package/src/utils/css.d.ts +0 -1
  454. package/src/utils/css.js +0 -7
  455. package/src/utils/css.ts +0 -5
  456. package/src/utils/deep-merge.ts +0 -47
  457. package/src/utils/hash.ts +0 -5
  458. package/src/utils/html.ts +0 -1
  459. package/src/utils/invariant.ts +0 -15
  460. package/src/utils/locals-utils.ts +0 -37
  461. package/src/utils/parse-cli-args.ts +0 -83
  462. package/src/utils/path-utils.module.ts +0 -14
  463. package/src/utils/resolve-work-dir.ts +0 -45
  464. package/src/utils/runtime.ts +0 -44
  465. package/src/utils/server-utils.module.ts +0 -67
  466. package/src/watchers/project-watcher.test-helpers.ts +0 -41
  467. package/src/watchers/project-watcher.ts +0 -363
  468. /package/src/{internal-types.js → adapters/shared/runtime-host.js} +0 -0
  469. /package/src/{public-types.js → adapters/shared/static-preview-host.js} +0 -0
  470. /package/src/{constants.d.ts → config/constants.d.ts} +0 -0
  471. /package/src/{constants.js → config/constants.js} +0 -0
@@ -1,120 +0,0 @@
1
- import type { InjectorMapConfig } from '@ecopages/scripts-injector/types';
2
- import type { ResolvedLazyScriptGroup } from '../public-types.ts';
3
-
4
- /**
5
- * Normalizes a comma-separated scripts string into absolute script URLs.
6
- *
7
- * @param scripts Comma-separated script paths.
8
- * @returns Normalized script path list.
9
- */
10
- function normalizeScripts(scripts: string): string[] {
11
- return scripts
12
- .split(',')
13
- .map((scriptPath) => scriptPath.trim())
14
- .filter(Boolean)
15
- .map((scriptPath) => {
16
- if (scriptPath.startsWith('/')) {
17
- return scriptPath;
18
- }
19
-
20
- const normalizedRelativePath = scriptPath.replace(/^\/+/, '').replace(/^(\.\/)+/, '');
21
- return `/${normalizedRelativePath}`;
22
- });
23
- }
24
-
25
- /**
26
- * Deduplicates comma-separated values while preserving first-seen order.
27
- *
28
- * @param values CSV value list.
29
- * @returns A single normalized CSV string.
30
- */
31
- function dedupeCsvValues(values: string[]): string {
32
- const seen = new Set<string>();
33
-
34
- for (const value of values) {
35
- for (const token of value
36
- .split(',')
37
- .map((part) => part.trim())
38
- .filter(Boolean)) {
39
- seen.add(token);
40
- }
41
- }
42
-
43
- return Array.from(seen).join(',');
44
- }
45
-
46
- /**
47
- * Builds a scripts-injector map config from resolved lazy script groups.
48
- *
49
- * @param lazyGroups Lazy script groups resolved during dependency processing.
50
- * @returns Injector map config keyed by lazy trigger.
51
- */
52
- function buildInjectorMap(lazyGroups: ResolvedLazyScriptGroup[]): InjectorMapConfig {
53
- const map: InjectorMapConfig = {};
54
-
55
- for (const group of lazyGroups) {
56
- const scripts = normalizeScripts(group.scripts);
57
- const lazy = group.lazy;
58
-
59
- if ('on:idle' in lazy) {
60
- map['on:idle'] = {
61
- scripts: [...(map['on:idle']?.scripts ?? []), ...scripts],
62
- };
63
- continue;
64
- }
65
-
66
- if ('on:interaction' in lazy) {
67
- const currentValue = map['on:interaction']?.value;
68
- const nextValue = lazy['on:interaction'];
69
-
70
- map['on:interaction'] = {
71
- value: typeof currentValue === 'string' ? dedupeCsvValues([currentValue, nextValue]) : nextValue,
72
- scripts: [...(map['on:interaction']?.scripts ?? []), ...scripts],
73
- };
74
- continue;
75
- }
76
-
77
- if ('on:visible' in lazy) {
78
- const currentValue = map['on:visible']?.value;
79
- const currentThreshold = typeof currentValue === 'string' ? currentValue : undefined;
80
- const nextValue = lazy['on:visible'];
81
-
82
- map['on:visible'] = {
83
- ...(nextValue === true
84
- ? currentThreshold
85
- ? { value: currentThreshold }
86
- : {}
87
- : { value: String(nextValue) }),
88
- scripts: [...(map['on:visible']?.scripts ?? []), ...scripts],
89
- };
90
- continue;
91
- }
92
-
93
- throw new Error(
94
- `Invalid lazy options: must specify on:idle, on:interaction, or on:visible. Received: ${JSON.stringify(lazy)}`,
95
- );
96
- }
97
-
98
- for (const key of Object.keys(map)) {
99
- const scripts = map[key]?.scripts;
100
- if (scripts) {
101
- map[key] = {
102
- ...map[key],
103
- scripts: Array.from(new Set(scripts)),
104
- };
105
- }
106
- }
107
-
108
- return map;
109
- }
110
-
111
- /**
112
- * Creates a safe JSON payload string for `<script type="ecopages/injector-map">`.
113
- *
114
- * @param lazyGroups Lazy script groups resolved during dependency processing.
115
- * @returns Escaped JSON string safe for inline script embedding.
116
- */
117
- export function buildInjectorMapScript(lazyGroups: ResolvedLazyScriptGroup[]): string {
118
- const map = buildInjectorMap(lazyGroups);
119
- return JSON.stringify(map).replace(/<\/script/gi, '<\\/script');
120
- }
@@ -1,75 +0,0 @@
1
- export type ModuleDependencyDeclaration = {
2
- from: string;
3
- imports?: string[];
4
- };
5
-
6
- function normalizeImports(imports: string[] | undefined): string[] | undefined {
7
- if (!imports || imports.length === 0) {
8
- return undefined;
9
- }
10
-
11
- const normalized = Array.from(new Set(imports.map((entry) => entry.trim()).filter((entry) => entry.length > 0)));
12
-
13
- return normalized.length > 0 ? normalized : undefined;
14
- }
15
-
16
- /**
17
- * Parses a module grammar declaration into normalized object form.
18
- *
19
- * Supported input examples:
20
- * - `react-aria-components`
21
- * - `react-aria-components{Table,Select}`
22
- */
23
- export function parseModuleDeclaration(value: string): ModuleDependencyDeclaration {
24
- const source = value.trim();
25
- if (source.length === 0) {
26
- throw new Error('Module declaration cannot be empty');
27
- }
28
-
29
- const openBraceIndex = source.indexOf('{');
30
- if (openBraceIndex < 0) {
31
- return { from: source };
32
- }
33
-
34
- const closeBraceIndex = source.lastIndexOf('}');
35
- if (closeBraceIndex !== source.length - 1 || closeBraceIndex <= openBraceIndex) {
36
- throw new Error(`Invalid module declaration '${value}'`);
37
- }
38
-
39
- const from = source.slice(0, openBraceIndex).trim();
40
- if (from.length === 0) {
41
- throw new Error(`Invalid module declaration '${value}'`);
42
- }
43
-
44
- const importsSlice = source.slice(openBraceIndex + 1, closeBraceIndex);
45
- const imports = normalizeImports(importsSlice.split(','));
46
-
47
- return {
48
- from,
49
- imports,
50
- };
51
- }
52
-
53
- /**
54
- * Normalizes and deduplicates module declarations from `modules`.
55
- *
56
- * Returns canonical object declarations suitable for downstream bundling logic.
57
- */
58
- export function normalizeModuleDeclarations(modules?: string[]): ModuleDependencyDeclaration[] {
59
- const declarations = modules ?? [];
60
-
61
- const output: ModuleDependencyDeclaration[] = [];
62
- const seen = new Set<string>();
63
-
64
- for (const declaration of declarations) {
65
- const normalized = parseModuleDeclaration(declaration);
66
- const key = `${normalized.from}::${(normalized.imports ?? []).join(',')}`;
67
-
68
- if (!seen.has(key)) {
69
- seen.add(key);
70
- output.push(normalized);
71
- }
72
- }
73
-
74
- return output;
75
- }
@@ -1,72 +0,0 @@
1
- export interface HttpErrorDetails {
2
- [key: string]: unknown;
3
- }
4
-
5
- export interface HttpErrorJson {
6
- error: string;
7
- status: number;
8
- details?: HttpErrorDetails;
9
- }
10
-
11
- /**
12
- * HTTP error class for structured error handling in route handlers.
13
- * Provides static factory methods for common HTTP error responses.
14
- */
15
- export class HttpError extends Error {
16
- readonly status: number;
17
- readonly details?: HttpErrorDetails;
18
-
19
- constructor(status: number, message: string, details?: HttpErrorDetails) {
20
- super(message);
21
- this.name = 'HttpError';
22
- this.status = status;
23
- this.details = details;
24
- }
25
-
26
- /**
27
- * Serialize error to JSON for API responses.
28
- */
29
- toJSON(): HttpErrorJson {
30
- const json: HttpErrorJson = {
31
- error: this.message,
32
- status: this.status,
33
- };
34
-
35
- if (this.details) {
36
- json.details = this.details;
37
- }
38
-
39
- return json;
40
- }
41
-
42
- /**
43
- * Create a Response object from this error.
44
- */
45
- toResponse(): Response {
46
- return Response.json(this.toJSON(), { status: this.status });
47
- }
48
-
49
- static BadRequest(message = 'Bad Request', details?: HttpErrorDetails): HttpError {
50
- return new HttpError(400, message, details);
51
- }
52
-
53
- static Unauthorized(message = 'Unauthorized'): HttpError {
54
- return new HttpError(401, message);
55
- }
56
-
57
- static Forbidden(message = 'Forbidden'): HttpError {
58
- return new HttpError(403, message);
59
- }
60
-
61
- static NotFound(message = 'Not Found'): HttpError {
62
- return new HttpError(404, message);
63
- }
64
-
65
- static Conflict(message = 'Conflict', details?: HttpErrorDetails): HttpError {
66
- return new HttpError(409, message, details);
67
- }
68
-
69
- static InternalServerError(message = 'Internal Server Error'): HttpError {
70
- return new HttpError(500, message);
71
- }
72
- }
@@ -1,2 +0,0 @@
1
- export { HttpError } from './http-error.ts';
2
- export type { HttpErrorDetails, HttpErrorJson } from './http-error.ts';
@@ -1,7 +0,0 @@
1
- export class LocalsAccessError extends Error {
2
- override name = 'LocalsAccessError';
3
-
4
- constructor(message: string) {
5
- super(message);
6
- }
7
- }
@@ -1,4 +0,0 @@
1
- import { Logger } from '@ecopages/logger';
2
-
3
- const debug = process.env.ECOPAGES_LOGGER_DEBUG === 'true';
4
- export const appLogger = new Logger('[@ecopages/core]', { debug });
@@ -1,152 +0,0 @@
1
- /**
2
- * Ecopages HMR Runtime
3
- * Injected into the browser to handle Hot Module Replacement updates.
4
- */
5
-
6
- import { getEcoNavigationRuntime } from '../../router/client/navigation-coordinator.ts';
7
-
8
- interface HMRPayload {
9
- type: 'reload' | 'error' | 'update' | 'css-update' | 'layout-update';
10
- path?: string;
11
- message?: string;
12
- timestamp?: number;
13
- }
14
-
15
- (function () {
16
- const WS_URL = 'ws://' + location.host + '/_hmr';
17
- let socket: WebSocket;
18
- let reconnectAttempts = 0;
19
-
20
- function connect() {
21
- socket = new WebSocket(WS_URL);
22
-
23
- socket.addEventListener('open', () => {
24
- console.log('[ecopages] HMR Connected');
25
- reconnectAttempts = 0;
26
- });
27
-
28
- socket.addEventListener('message', async (event) => {
29
- try {
30
- const payload: HMRPayload = JSON.parse(event.data);
31
- handleMessage(payload);
32
- } catch (e) {
33
- console.error('[ecopages] Invalid HMR message:', e);
34
- }
35
- });
36
-
37
- socket.addEventListener('close', () => {
38
- if (reconnectAttempts < 10) {
39
- setTimeout(connect, 1000 * 2 ** reconnectAttempts);
40
- reconnectAttempts++;
41
- }
42
- });
43
- }
44
-
45
- async function handleMessage(payload: HMRPayload) {
46
- const navigationRuntime = getEcoNavigationRuntime(window);
47
-
48
- switch (payload.type) {
49
- case 'reload':
50
- await waitForNavigationToSettle(navigationRuntime);
51
- location.reload();
52
- break;
53
- case 'layout-update': {
54
- await waitForNavigationToSettle(navigationRuntime);
55
- if (await navigationRuntime.reloadCurrentPage({ clearCache: true })) {
56
- } else {
57
- location.reload();
58
- }
59
- break;
60
- }
61
- case 'error':
62
- console.error('[ecopages] HMR Error:', payload.message);
63
- break;
64
- case 'update':
65
- if (payload.path) {
66
- await applyUpdate(payload.path, payload.timestamp);
67
- }
68
- break;
69
- case 'css-update':
70
- if (payload.path) {
71
- refreshStylesheet(payload.path);
72
- }
73
- break;
74
- }
75
- }
76
-
77
- /**
78
- * Applies a module update by calling registered HMR handlers or re-importing the module.
79
- * @param path - The module path to update
80
- * @param timestamp - Optional timestamp for cache busting
81
- */
82
- async function applyUpdate(path: string, timestamp?: number) {
83
- try {
84
- const url = path + '?t=' + (timestamp || Date.now());
85
- const handlers = window.__ECO_PAGES__?.hmrHandlers;
86
- const navigationRuntime = getEcoNavigationRuntime(window);
87
- await waitForNavigationToSettle(navigationRuntime);
88
-
89
- if (handlers?.[path]) {
90
- await handlers[path](url);
91
- return;
92
- }
93
-
94
- await import(url);
95
-
96
- // If we're inside the EcoRouter, we need to trigger a router navigation to render the new component.
97
- // Passing clearCache: false preserves the persisted layout cache.
98
- if (await navigationRuntime.reloadCurrentPage({ clearCache: false })) {
99
- }
100
- } catch (e) {
101
- console.error('[ecopages] Failed to apply HMR update:', e);
102
- }
103
- }
104
-
105
- async function waitForNavigationToSettle(navigationRuntime: ReturnType<typeof getEcoNavigationRuntime>) {
106
- if (!navigationRuntime.hasPendingNavigationTransaction()) {
107
- return;
108
- }
109
-
110
- await new Promise<void>((resolve) => {
111
- const startedAt = performance.now();
112
- const timeoutMs = 2000;
113
-
114
- const poll = () => {
115
- if (!navigationRuntime.hasPendingNavigationTransaction()) {
116
- resolve();
117
- return;
118
- }
119
-
120
- if (performance.now() - startedAt >= timeoutMs) {
121
- resolve();
122
- return;
123
- }
124
-
125
- requestAnimationFrame(poll);
126
- };
127
-
128
- requestAnimationFrame(poll);
129
- });
130
- }
131
-
132
- /**
133
- * Hot-reload CSS by updating stylesheet link href with cache-busting query param.
134
- * This causes the browser to re-fetch the stylesheet without a full page reload.
135
- */
136
- function refreshStylesheet(path: string) {
137
- const filename = path.split('/').pop() || '';
138
- const links = document.querySelectorAll('link[rel="stylesheet"]');
139
-
140
- links.forEach((link) => {
141
- const href = (link as HTMLLinkElement).href;
142
- if (href.includes(filename) || href.includes(path.replace(/^.*\/src\//, '/assets/'))) {
143
- const url = new URL(href, location.origin);
144
- url.searchParams.set('t', Date.now().toString());
145
- (link as HTMLLinkElement).href = url.toString();
146
- console.log('[ecopages] CSS updated:', filename);
147
- }
148
- });
149
- }
150
-
151
- connect();
152
- })();
@@ -1,172 +0,0 @@
1
- import type { ClientBridgeEvent } from '../public-types';
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
- * Defines the category of an HMR strategy, which determines its execution priority.
28
- * Strategies are evaluated in descending order: INTEGRATION → ASSET → SCRIPT → FALLBACK.
29
- *
30
- * @remarks
31
- * The numeric values represent base priorities. Strategies can fine-tune their priority
32
- * using the `priorityOffset` property.
33
- */
34
- export enum HmrStrategyType {
35
- /**
36
- * Integration-specific strategies (React, Lit, etc.)
37
- * Highest priority to allow framework-specific HMR handling.
38
- */
39
- INTEGRATION = 100,
40
-
41
- /**
42
- * Asset processing strategies (CSS, images, etc.)
43
- * High priority for specialized asset handling.
44
- */
45
- ASSET = 50,
46
-
47
- /**
48
- * Generic script bundling strategies (JS/TS)
49
- * Medium priority for standard script processing.
50
- */
51
- SCRIPT = 25,
52
-
53
- /**
54
- * Fallback strategy for unhandled file types.
55
- * Lowest priority, triggers full page reload.
56
- */
57
- FALLBACK = 0,
58
- }
59
-
60
- /**
61
- * Represents an action to be taken after processing a file change.
62
- */
63
- export interface HmrAction {
64
- /**
65
- * Whether to broadcast an HMR event to connected clients.
66
- */
67
- type: 'broadcast' | 'none';
68
-
69
- /**
70
- * The HMR events to broadcast, if type is 'broadcast'.
71
- * capable of broadcasting multiple events at once.
72
- */
73
- events?: ClientBridgeEvent[];
74
- }
75
-
76
- /**
77
- * Base class for HMR strategies.
78
- *
79
- * Each strategy handles a specific type of file change and determines how to process it.
80
- * Strategies are selected based on their priority (higher values are evaluated first) and
81
- * whether they match the changed file path.
82
- *
83
- * @remarks
84
- * Strategies should be stateless and idempotent. The same file change should always
85
- * produce the same result when processed by the same strategy.
86
- *
87
- * @example
88
- * ```typescript
89
- * class MyAssetStrategy extends HmrStrategy {
90
- * readonly type = HmrStrategyType.ASSET;
91
- * readonly priorityOffset = 5;
92
- *
93
- * matches(filePath: string): boolean {
94
- * return /\.(png|jpg|svg)$/.test(filePath);
95
- * }
96
- *
97
- * async process(filePath: string): Promise<HmrAction> {
98
- * await this.optimizeImage(filePath);
99
- * return {
100
- * type: 'broadcast',
101
- * events: [{ type: 'update', path: filePath, timestamp: Date.now() }]
102
- * };
103
- * }
104
- * }
105
- * ```
106
- */
107
- export abstract class HmrStrategy {
108
- /**
109
- * The category of this strategy, determining its base priority.
110
- */
111
- abstract readonly type: HmrStrategyType;
112
-
113
- /**
114
- * Optional offset to fine-tune priority within the same category.
115
- * Useful when multiple strategies share the same type.
116
- *
117
- * @defaultValue 0
118
- */
119
- readonly priorityOffset: number = 0;
120
-
121
- /**
122
- * Computed priority for strategy selection.
123
- * Higher values are evaluated first.
124
- *
125
- * @returns The sum of the strategy type and priority offset
126
- */
127
- get priority(): number {
128
- return this.type + this.priorityOffset;
129
- }
130
-
131
- /**
132
- * Determines if this strategy can handle the given file path.
133
- *
134
- * @param filePath - Absolute path to the changed file
135
- * @returns True if this strategy should process the file
136
- *
137
- * @example
138
- * ```typescript
139
- * matches(filePath: string): boolean {
140
- * return filePath.endsWith('.css');
141
- * }
142
- * ```
143
- */
144
- abstract matches(filePath: string): boolean;
145
-
146
- /**
147
- * Processes a file change and returns the action to take.
148
- *
149
- * This method may perform side effects such as:
150
- * - Rebuilding files
151
- * - Writing to disk
152
- * - Transforming code
153
- * - Updating caches
154
- *
155
- * @param filePath - Absolute path to the changed file
156
- * @returns Action to take (broadcast event or none)
157
- *
158
- * @example
159
- * ```typescript
160
- * async process(filePath: string): Promise<HmrAction> {
161
- * const processed = await this.transform(filePath);
162
- * await Bun.write(outputPath, processed);
163
- *
164
- * return {
165
- * type: 'broadcast',
166
- * events: [{ type: 'update', path: outputPath, timestamp: Date.now() }]
167
- * };
168
- * }
169
- * ```
170
- */
171
- abstract process(filePath: string): Promise<HmrAction>;
172
- }
@@ -1,41 +0,0 @@
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
- });