@ecopages/core 0.2.0-alpha.2 → 0.2.0-alpha.21

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 (391) hide show
  1. package/CHANGELOG.md +26 -64
  2. package/README.md +212 -14
  3. package/package.json +116 -66
  4. package/src/adapters/README.md +39 -0
  5. package/src/adapters/abstract/application-adapter.d.ts +28 -2
  6. package/src/adapters/abstract/application-adapter.js +14 -2
  7. package/src/adapters/abstract/router-adapter.d.ts +1 -1
  8. package/src/adapters/abstract/server-adapter.d.ts +2 -2
  9. package/src/adapters/bun/client-bridge.d.ts +1 -1
  10. package/src/adapters/bun/create-app.d.ts +4 -12
  11. package/src/adapters/bun/create-app.js +4 -5
  12. package/src/adapters/bun/hmr-manager.d.ts +80 -21
  13. package/src/adapters/bun/hmr-manager.js +168 -62
  14. package/src/adapters/bun/index.d.ts +2 -3
  15. package/src/adapters/bun/index.js +3 -3
  16. package/src/adapters/bun/server-adapter.d.ts +5 -5
  17. package/src/adapters/bun/server-adapter.js +40 -34
  18. package/src/adapters/bun/server-lifecycle.d.ts +28 -17
  19. package/src/adapters/bun/server-lifecycle.js +34 -62
  20. package/src/{create-app.d.ts → adapters/create-app.d.ts} +9 -6
  21. package/src/{create-app.js → adapters/create-app.js} +4 -4
  22. package/src/adapters/index.d.ts +2 -6
  23. package/src/adapters/index.js +2 -8
  24. package/src/adapters/node/create-app.d.ts +6 -9
  25. package/src/adapters/node/create-app.js +12 -6
  26. package/src/adapters/node/node-client-bridge.d.ts +1 -1
  27. package/src/adapters/node/node-hmr-manager.d.ts +89 -18
  28. package/src/adapters/node/node-hmr-manager.js +185 -95
  29. package/src/adapters/node/server-adapter.d.ts +6 -35
  30. package/src/adapters/node/server-adapter.js +44 -105
  31. package/src/adapters/node/static-content-server.d.ts +37 -1
  32. package/src/adapters/node/static-content-server.js +29 -1
  33. package/src/adapters/shared/application-adapter.d.ts +1 -1
  34. package/src/{define-api-handler.d.ts → adapters/shared/define-api-handler.d.ts} +1 -1
  35. package/src/adapters/shared/explicit-static-route-matcher.d.ts +2 -2
  36. package/src/adapters/shared/explicit-static-route-matcher.js +4 -1
  37. package/src/adapters/shared/file-route-middleware-pipeline.d.ts +1 -1
  38. package/src/adapters/shared/file-route-middleware-pipeline.js +1 -0
  39. package/src/adapters/shared/fs-server-response-factory.d.ts +2 -2
  40. package/src/adapters/shared/fs-server-response-factory.js +1 -1
  41. package/src/adapters/shared/fs-server-response-matcher.d.ts +8 -12
  42. package/src/adapters/shared/fs-server-response-matcher.js +10 -18
  43. package/src/adapters/shared/hmr-entrypoint-registrar.d.ts +55 -0
  44. package/src/adapters/shared/hmr-entrypoint-registrar.js +87 -0
  45. package/src/adapters/shared/hmr-html-response.d.ts +22 -0
  46. package/src/adapters/shared/hmr-html-response.js +32 -0
  47. package/src/adapters/shared/render-context.d.ts +2 -1
  48. package/src/adapters/shared/render-context.js +6 -3
  49. package/src/adapters/shared/runtime-bootstrap.d.ts +38 -0
  50. package/src/adapters/shared/runtime-bootstrap.js +43 -0
  51. package/src/adapters/shared/server-adapter.d.ts +13 -3
  52. package/src/adapters/shared/server-adapter.js +42 -5
  53. package/src/adapters/shared/server-route-handler.d.ts +4 -4
  54. package/src/adapters/shared/server-route-handler.js +6 -15
  55. package/src/adapters/shared/server-static-builder.d.ts +38 -6
  56. package/src/adapters/shared/server-static-builder.js +64 -10
  57. package/src/build/README.md +107 -0
  58. package/src/build/build-adapter.d.ts +168 -3
  59. package/src/build/build-adapter.js +604 -16
  60. package/src/build/build-manifest.d.ts +27 -0
  61. package/src/build/build-manifest.js +30 -0
  62. package/src/build/dev-build-coordinator.d.ts +72 -0
  63. package/src/build/dev-build-coordinator.js +154 -0
  64. package/src/build/esbuild-build-adapter.d.ts +15 -6
  65. package/src/build/esbuild-build-adapter.js +189 -74
  66. package/src/build/runtime-build-executor.d.ts +14 -0
  67. package/src/build/runtime-build-executor.js +22 -0
  68. package/src/build/runtime-specifier-alias-plugin.d.ts +15 -0
  69. package/src/build/runtime-specifier-alias-plugin.js +35 -0
  70. package/src/build/runtime-specifier-aliases.d.ts +5 -0
  71. package/src/build/runtime-specifier-aliases.js +95 -0
  72. package/src/config/README.md +36 -0
  73. package/src/config/config-builder.d.ts +52 -27
  74. package/src/config/config-builder.js +260 -49
  75. package/src/{constants.d.ts → config/constants.d.ts} +13 -0
  76. package/src/{constants.js → config/constants.js} +4 -0
  77. package/src/declarations.d.ts +19 -14
  78. package/src/dev/sc-server.d.ts +1 -1
  79. package/src/dev/sc-server.js +1 -1
  80. package/src/eco/README.md +70 -16
  81. package/src/eco/eco.browser.d.ts +2 -0
  82. package/src/eco/eco.browser.js +83 -0
  83. package/src/eco/eco.js +32 -57
  84. package/src/eco/eco.types.d.ts +12 -4
  85. package/src/eco/eco.utils.d.ts +1 -40
  86. package/src/eco/eco.utils.js +5 -35
  87. package/src/eco/global-injector-map.d.ts +1 -1
  88. package/src/eco/lazy-injector-map.d.ts +1 -1
  89. package/src/hmr/README.md +26 -0
  90. package/src/hmr/client/hmr-runtime.d.ts +1 -6
  91. package/src/hmr/client/hmr-runtime.js +30 -7
  92. package/src/hmr/hmr-strategy.d.ts +16 -13
  93. package/src/hmr/hmr-strategy.js +22 -7
  94. package/src/hmr/hmr.postcss.test.e2e.d.ts +1 -0
  95. package/src/hmr/hmr.postcss.test.e2e.js +31 -0
  96. package/src/hmr/hmr.test.e2e.js +26 -33
  97. package/src/hmr/strategies/default-hmr-strategy.d.ts +2 -2
  98. package/src/hmr/strategies/default-hmr-strategy.js +1 -1
  99. package/src/hmr/strategies/js-hmr-strategy.d.ts +46 -43
  100. package/src/hmr/strategies/js-hmr-strategy.js +72 -73
  101. package/src/index.browser.d.ts +2 -2
  102. package/src/index.browser.js +1 -1
  103. package/src/index.d.ts +4 -3
  104. package/src/index.js +16 -5
  105. package/src/integrations/ghtml/ghtml-renderer.d.ts +7 -2
  106. package/src/integrations/ghtml/ghtml-renderer.js +33 -30
  107. package/src/integrations/ghtml/ghtml.constants.d.ts +1 -0
  108. package/src/integrations/ghtml/ghtml.constants.js +4 -0
  109. package/src/integrations/ghtml/ghtml.plugin.d.ts +2 -6
  110. package/src/integrations/ghtml/ghtml.plugin.js +3 -4
  111. package/src/plugins/README.md +35 -0
  112. package/src/plugins/alias-resolver-plugin.js +17 -3
  113. package/src/plugins/eco-component-meta-plugin.d.ts +14 -1
  114. package/src/plugins/eco-component-meta-plugin.js +27 -21
  115. package/src/plugins/foreign-jsx-override-plugin.d.ts +31 -0
  116. package/src/plugins/foreign-jsx-override-plugin.js +35 -0
  117. package/src/plugins/integration-plugin.d.ts +145 -28
  118. package/src/plugins/integration-plugin.js +109 -13
  119. package/src/plugins/processor.d.ts +15 -2
  120. package/src/plugins/processor.js +16 -2
  121. package/src/plugins/runtime-capability.d.ts +9 -0
  122. package/src/plugins/source-transform.d.ts +46 -0
  123. package/src/plugins/source-transform.js +71 -0
  124. package/src/route-renderer/GRAPH.md +64 -98
  125. package/src/route-renderer/README.md +67 -46
  126. package/src/route-renderer/orchestration/boundary-planning.service.d.ts +25 -0
  127. package/src/route-renderer/orchestration/boundary-planning.service.js +97 -0
  128. package/src/route-renderer/orchestration/component-render-context.d.ts +83 -0
  129. package/src/route-renderer/orchestration/component-render-context.js +147 -0
  130. package/src/route-renderer/orchestration/integration-renderer.d.ts +554 -0
  131. package/src/route-renderer/orchestration/integration-renderer.js +957 -0
  132. package/src/route-renderer/orchestration/queued-boundary-runtime.service.d.ts +89 -0
  133. package/src/route-renderer/orchestration/queued-boundary-runtime.service.js +155 -0
  134. package/src/route-renderer/orchestration/render-execution.service.d.ts +43 -0
  135. package/src/route-renderer/orchestration/render-execution.service.js +106 -0
  136. package/src/{eco/eco.utils.ts → route-renderer/orchestration/render-output.utils.d.ts} +10 -53
  137. package/src/route-renderer/orchestration/render-output.utils.js +65 -0
  138. package/src/route-renderer/{render-preparation.service.d.ts → orchestration/render-preparation.service.d.ts} +18 -10
  139. package/src/route-renderer/{render-preparation.service.js → orchestration/render-preparation.service.js} +115 -17
  140. package/src/route-renderer/orchestration/route-shell-composer.service.d.ts +50 -0
  141. package/src/route-renderer/orchestration/route-shell-composer.service.js +81 -0
  142. package/src/route-renderer/orchestration/template-serialization.d.ts +38 -0
  143. package/src/route-renderer/orchestration/template-serialization.js +45 -0
  144. package/src/route-renderer/{dependency-resolver.d.ts → page-loading/dependency-resolver.d.ts} +15 -4
  145. package/src/route-renderer/{dependency-resolver.js → page-loading/dependency-resolver.js} +28 -12
  146. package/src/route-renderer/page-loading/page-module-loader.d.ts +90 -0
  147. package/src/route-renderer/{page-module-loader.js → page-loading/page-module-loader.js} +39 -14
  148. package/src/route-renderer/route-renderer.d.ts +45 -4
  149. package/src/route-renderer/route-renderer.js +38 -3
  150. package/src/router/README.md +97 -0
  151. package/src/router/client/link-intent.d.ts +53 -0
  152. package/src/router/client/link-intent.js +34 -0
  153. package/src/router/client/link-intent.test.browser.d.ts +1 -0
  154. package/src/router/client/link-intent.test.browser.js +43 -0
  155. package/src/router/client/navigation-coordinator.d.ts +149 -0
  156. package/src/router/client/navigation-coordinator.js +215 -0
  157. package/src/router/{fs-router-scanner.d.ts → server/fs-router-scanner.d.ts} +3 -3
  158. package/src/router/{fs-router-scanner.js → server/fs-router-scanner.js} +14 -8
  159. package/src/router/{fs-router.d.ts → server/fs-router.d.ts} +1 -1
  160. package/src/router/{fs-router.js → server/fs-router.js} +1 -1
  161. package/src/services/README.md +29 -0
  162. package/src/services/assets/asset-processing-service/asset-processing.service.d.ts +120 -0
  163. package/src/services/{asset-processing-service → assets/asset-processing-service}/asset-processing.service.js +91 -10
  164. package/src/services/{asset-processing-service → assets/asset-processing-service}/asset.factory.d.ts +1 -1
  165. package/src/services/{asset-processing-service → assets/asset-processing-service}/asset.factory.js +2 -2
  166. package/src/services/{asset-processing-service → assets/asset-processing-service}/assets.types.d.ts +2 -1
  167. package/src/services/assets/asset-processing-service/browser-runtime-asset.factory.d.ts +55 -0
  168. package/src/services/assets/asset-processing-service/browser-runtime-asset.factory.js +48 -0
  169. package/src/services/assets/asset-processing-service/browser-runtime-entry.factory.d.ts +20 -0
  170. package/src/services/assets/asset-processing-service/browser-runtime-entry.factory.js +41 -0
  171. package/src/services/assets/asset-processing-service/index.d.ts +5 -0
  172. package/src/services/assets/asset-processing-service/index.js +5 -0
  173. package/src/services/{asset-processing-service → assets/asset-processing-service}/processor.interface.d.ts +2 -2
  174. package/src/services/{asset-processing-service → assets/asset-processing-service}/processor.registry.d.ts +2 -2
  175. package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/base/base-processor.d.ts +1 -1
  176. package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/base/base-processor.js +9 -4
  177. package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/base/base-script-processor.d.ts +5 -4
  178. package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/base/base-script-processor.js +15 -23
  179. package/src/services/assets/asset-processing-service/processors/index.d.ts +5 -0
  180. package/src/services/assets/asset-processing-service/processors/index.js +5 -0
  181. package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/script/content-script.processor.d.ts +2 -2
  182. package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/script/content-script.processor.js +1 -1
  183. package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/script/file-script.processor.d.ts +4 -3
  184. package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/script/file-script.processor.js +16 -4
  185. package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/script/node-module-script.processor.d.ts +3 -3
  186. package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/script/node-module-script.processor.js +6 -5
  187. package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/stylesheet/content-stylesheet.processor.d.ts +2 -2
  188. package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/stylesheet/content-stylesheet.processor.js +1 -1
  189. package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/stylesheet/file-stylesheet.processor.d.ts +2 -2
  190. package/src/services/{asset-processing-service → assets/asset-processing-service}/processors/stylesheet/file-stylesheet.processor.js +5 -2
  191. package/src/services/assets/browser-bundle.service.d.ts +32 -0
  192. package/src/services/assets/browser-bundle.service.js +33 -0
  193. package/src/services/{page-request-cache-coordinator.service.d.ts → cache/page-request-cache-coordinator.service.d.ts} +2 -2
  194. package/src/services/{page-request-cache-coordinator.service.js → cache/page-request-cache-coordinator.service.js} +3 -1
  195. package/src/services/html/html-rewriter-provider.service.d.ts +37 -0
  196. package/src/services/html/html-rewriter-provider.service.js +68 -0
  197. package/src/services/html/html-transformer.service.d.ts +77 -0
  198. package/src/services/html/html-transformer.service.js +215 -0
  199. package/src/services/invalidation/development-invalidation.service.d.ts +74 -0
  200. package/src/services/invalidation/development-invalidation.service.js +190 -0
  201. package/src/services/module-loading/app-module-loader.service.d.ts +28 -0
  202. package/src/services/module-loading/app-module-loader.service.js +35 -0
  203. package/src/services/module-loading/app-server-module-transpiler.service.d.ts +24 -0
  204. package/src/services/module-loading/app-server-module-transpiler.service.js +109 -0
  205. package/src/services/module-loading/host-module-loader-registry.d.ts +4 -0
  206. package/src/services/module-loading/host-module-loader-registry.js +15 -0
  207. package/src/services/module-loading/module-loading-types.d.ts +2 -0
  208. package/src/services/module-loading/node-bootstrap-plugin.d.ts +42 -0
  209. package/src/services/module-loading/node-bootstrap-plugin.js +204 -0
  210. package/src/services/module-loading/page-module-import.service.d.ts +76 -0
  211. package/src/services/module-loading/page-module-import.service.js +173 -0
  212. package/src/services/module-loading/server-module-transpiler.service.d.ts +72 -0
  213. package/src/services/module-loading/server-module-transpiler.service.js +64 -0
  214. package/src/services/runtime-state/dev-graph.service.d.ts +118 -0
  215. package/src/services/runtime-state/dev-graph.service.js +162 -0
  216. package/src/services/runtime-state/entrypoint-dependency-graph.service.d.ts +41 -0
  217. package/src/services/runtime-state/entrypoint-dependency-graph.service.js +85 -0
  218. package/src/services/runtime-state/runtime-specifier-registry.service.d.ts +69 -0
  219. package/src/services/runtime-state/runtime-specifier-registry.service.js +37 -0
  220. package/src/services/runtime-state/server-invalidation-state.service.d.ts +26 -0
  221. package/src/services/runtime-state/server-invalidation-state.service.js +35 -0
  222. package/src/services/{schema-validation-service.d.ts → validation/schema-validation-service.d.ts} +1 -1
  223. package/src/static-site-generator/README.md +26 -0
  224. package/src/static-site-generator/static-site-generator.d.ts +50 -3
  225. package/src/static-site-generator/static-site-generator.js +71 -5
  226. package/src/{internal-types.d.ts → types/internal-types.d.ts} +53 -22
  227. package/src/types/internal-types.js +0 -0
  228. package/src/{public-types.d.ts → types/public-types.d.ts} +146 -21
  229. package/src/types/public-types.js +0 -0
  230. package/src/utils/html-escaping.d.ts +7 -0
  231. package/src/utils/html-escaping.js +6 -0
  232. package/src/utils/locals-utils.d.ts +1 -1
  233. package/src/utils/parse-cli-args.d.ts +4 -1
  234. package/src/utils/parse-cli-args.js +16 -1
  235. package/src/utils/resolve-work-dir.d.ts +11 -0
  236. package/src/utils/resolve-work-dir.js +31 -0
  237. package/src/watchers/project-watcher.d.ts +40 -24
  238. package/src/watchers/project-watcher.js +129 -92
  239. package/src/watchers/project-watcher.test-helpers.d.ts +2 -2
  240. package/src/watchers/project-watcher.test-helpers.js +1 -0
  241. package/src/adapters/abstract/application-adapter.ts +0 -337
  242. package/src/adapters/abstract/router-adapter.ts +0 -30
  243. package/src/adapters/abstract/server-adapter.ts +0 -79
  244. package/src/adapters/bun/client-bridge.ts +0 -62
  245. package/src/adapters/bun/create-app.ts +0 -189
  246. package/src/adapters/bun/define-api-handler.d.ts +0 -61
  247. package/src/adapters/bun/define-api-handler.ts +0 -114
  248. package/src/adapters/bun/hmr-manager.ts +0 -281
  249. package/src/adapters/bun/index.ts +0 -3
  250. package/src/adapters/bun/server-adapter.ts +0 -492
  251. package/src/adapters/bun/server-lifecycle.ts +0 -154
  252. package/src/adapters/index.ts +0 -6
  253. package/src/adapters/node/create-app.ts +0 -179
  254. package/src/adapters/node/index.d.ts +0 -4
  255. package/src/adapters/node/index.js +0 -8
  256. package/src/adapters/node/index.ts +0 -9
  257. package/src/adapters/node/node-client-bridge.ts +0 -79
  258. package/src/adapters/node/node-hmr-manager.ts +0 -271
  259. package/src/adapters/node/server-adapter.ts +0 -561
  260. package/src/adapters/node/static-content-server.ts +0 -203
  261. package/src/adapters/shared/api-response.ts +0 -104
  262. package/src/adapters/shared/application-adapter.ts +0 -199
  263. package/src/adapters/shared/explicit-static-route-matcher.ts +0 -134
  264. package/src/adapters/shared/file-route-middleware-pipeline.ts +0 -123
  265. package/src/adapters/shared/fs-server-response-factory.ts +0 -118
  266. package/src/adapters/shared/fs-server-response-matcher.ts +0 -198
  267. package/src/adapters/shared/render-context.ts +0 -105
  268. package/src/adapters/shared/server-adapter.ts +0 -442
  269. package/src/adapters/shared/server-route-handler.ts +0 -166
  270. package/src/adapters/shared/server-static-builder.ts +0 -82
  271. package/src/build/build-adapter.ts +0 -132
  272. package/src/build/build-types.ts +0 -83
  273. package/src/build/esbuild-build-adapter.ts +0 -510
  274. package/src/config/config-builder.ts +0 -474
  275. package/src/constants.ts +0 -39
  276. package/src/create-app.ts +0 -87
  277. package/src/define-api-handler.js +0 -15
  278. package/src/define-api-handler.ts +0 -66
  279. package/src/dev/sc-server.ts +0 -143
  280. package/src/eco/component-render-context.d.ts +0 -105
  281. package/src/eco/component-render-context.js +0 -77
  282. package/src/eco/component-render-context.ts +0 -202
  283. package/src/eco/eco.ts +0 -221
  284. package/src/eco/eco.types.ts +0 -202
  285. package/src/eco/global-injector-map.ts +0 -112
  286. package/src/eco/lazy-injector-map.ts +0 -120
  287. package/src/eco/module-dependencies.ts +0 -75
  288. package/src/errors/http-error.ts +0 -72
  289. package/src/errors/index.ts +0 -2
  290. package/src/errors/locals-access-error.ts +0 -7
  291. package/src/global/app-logger.ts +0 -4
  292. 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
  293. package/src/hmr/client/__screenshots__/hmr-runtime.test.browser.ts/HMR-Runtime-HMR-Server-Integration-should-load-fixture-app-page-1.png +0 -0
  294. package/src/hmr/client/__screenshots__/hmr-runtime.test.browser.ts/HMR-Runtime-WebSocket-Connection-should-connect-to-correct-HMR-endpoint-1.png +0 -0
  295. package/src/hmr/client/hmr-runtime.ts +0 -121
  296. package/src/hmr/hmr-strategy.ts +0 -172
  297. package/src/hmr/hmr.test.e2e.ts +0 -75
  298. package/src/hmr/strategies/default-hmr-strategy.ts +0 -60
  299. package/src/hmr/strategies/js-hmr-strategy.ts +0 -308
  300. package/src/index.browser.ts +0 -3
  301. package/src/index.ts +0 -5
  302. package/src/integrations/ghtml/ghtml-renderer.ts +0 -93
  303. package/src/integrations/ghtml/ghtml.plugin.ts +0 -32
  304. package/src/internal-types.ts +0 -212
  305. package/src/plugins/alias-resolver-plugin.ts +0 -45
  306. package/src/plugins/eco-component-meta-plugin.ts +0 -474
  307. package/src/plugins/integration-plugin.ts +0 -184
  308. package/src/plugins/processor.ts +0 -220
  309. package/src/public-types.ts +0 -1255
  310. package/src/route-renderer/component-graph-executor.d.ts +0 -32
  311. package/src/route-renderer/component-graph-executor.js +0 -31
  312. package/src/route-renderer/component-graph-executor.ts +0 -84
  313. package/src/route-renderer/component-graph.d.ts +0 -42
  314. package/src/route-renderer/component-graph.js +0 -72
  315. package/src/route-renderer/component-graph.ts +0 -159
  316. package/src/route-renderer/component-marker.d.ts +0 -52
  317. package/src/route-renderer/component-marker.js +0 -46
  318. package/src/route-renderer/component-marker.ts +0 -117
  319. package/src/route-renderer/dependency-resolver.ts +0 -596
  320. package/src/route-renderer/html-post-processing.service.d.ts +0 -40
  321. package/src/route-renderer/html-post-processing.service.js +0 -86
  322. package/src/route-renderer/html-post-processing.service.ts +0 -103
  323. package/src/route-renderer/integration-renderer.d.ts +0 -339
  324. package/src/route-renderer/integration-renderer.js +0 -526
  325. package/src/route-renderer/integration-renderer.ts +0 -696
  326. package/src/route-renderer/marker-graph-resolver.d.ts +0 -76
  327. package/src/route-renderer/marker-graph-resolver.js +0 -93
  328. package/src/route-renderer/marker-graph-resolver.ts +0 -153
  329. package/src/route-renderer/page-module-loader.d.ts +0 -61
  330. package/src/route-renderer/page-module-loader.ts +0 -153
  331. package/src/route-renderer/render-execution.service.d.ts +0 -69
  332. package/src/route-renderer/render-execution.service.js +0 -91
  333. package/src/route-renderer/render-execution.service.ts +0 -158
  334. package/src/route-renderer/render-preparation.service.ts +0 -358
  335. package/src/route-renderer/route-renderer.ts +0 -80
  336. package/src/router/fs-router-scanner.ts +0 -217
  337. package/src/router/fs-router.ts +0 -122
  338. package/src/services/asset-processing-service/asset-processing.service.d.ts +0 -41
  339. package/src/services/asset-processing-service/asset-processing.service.ts +0 -306
  340. package/src/services/asset-processing-service/asset.factory.ts +0 -105
  341. package/src/services/asset-processing-service/assets.types.ts +0 -112
  342. package/src/services/asset-processing-service/index.d.ts +0 -3
  343. package/src/services/asset-processing-service/index.js +0 -3
  344. package/src/services/asset-processing-service/index.ts +0 -3
  345. package/src/services/asset-processing-service/processor.interface.ts +0 -27
  346. package/src/services/asset-processing-service/processor.registry.ts +0 -18
  347. package/src/services/asset-processing-service/processors/base/base-processor.ts +0 -76
  348. package/src/services/asset-processing-service/processors/base/base-script-processor.ts +0 -105
  349. package/src/services/asset-processing-service/processors/index.d.ts +0 -5
  350. package/src/services/asset-processing-service/processors/index.js +0 -5
  351. package/src/services/asset-processing-service/processors/index.ts +0 -5
  352. package/src/services/asset-processing-service/processors/script/content-script.processor.ts +0 -66
  353. package/src/services/asset-processing-service/processors/script/file-script.processor.ts +0 -88
  354. package/src/services/asset-processing-service/processors/script/node-module-script.processor.ts +0 -84
  355. package/src/services/asset-processing-service/processors/stylesheet/content-stylesheet.processor.ts +0 -27
  356. package/src/services/asset-processing-service/processors/stylesheet/file-stylesheet.processor.ts +0 -77
  357. package/src/services/cache/cache.types.ts +0 -126
  358. package/src/services/cache/index.ts +0 -18
  359. package/src/services/cache/memory-cache-store.ts +0 -130
  360. package/src/services/cache/page-cache-service.ts +0 -202
  361. package/src/services/html-transformer.service.d.ts +0 -50
  362. package/src/services/html-transformer.service.js +0 -163
  363. package/src/services/html-transformer.service.ts +0 -217
  364. package/src/services/page-module-import.service.d.ts +0 -37
  365. package/src/services/page-module-import.service.js +0 -88
  366. package/src/services/page-module-import.service.ts +0 -129
  367. package/src/services/page-request-cache-coordinator.service.ts +0 -128
  368. package/src/services/schema-validation-service.ts +0 -204
  369. package/src/services/validation/standard-schema.types.ts +0 -68
  370. package/src/static-site-generator/static-site-generator.ts +0 -359
  371. package/src/utils/css.d.ts +0 -1
  372. package/src/utils/css.js +0 -7
  373. package/src/utils/css.ts +0 -5
  374. package/src/utils/deep-merge.ts +0 -47
  375. package/src/utils/hash.ts +0 -5
  376. package/src/utils/html.ts +0 -1
  377. package/src/utils/invariant.ts +0 -15
  378. package/src/utils/locals-utils.ts +0 -37
  379. package/src/utils/parse-cli-args.ts +0 -83
  380. package/src/utils/path-utils.module.ts +0 -14
  381. package/src/utils/runtime.ts +0 -44
  382. package/src/utils/server-utils.module.ts +0 -67
  383. package/src/watchers/project-watcher.test-helpers.ts +0 -40
  384. package/src/watchers/project-watcher.ts +0 -306
  385. /package/src/adapters/{bun → shared}/define-api-handler.js +0 -0
  386. /package/src/{internal-types.js → plugins/runtime-capability.js} +0 -0
  387. /package/src/services/{asset-processing-service → assets/asset-processing-service}/assets.types.js +0 -0
  388. /package/src/services/{asset-processing-service → assets/asset-processing-service}/processor.interface.js +0 -0
  389. /package/src/services/{asset-processing-service → assets/asset-processing-service}/processor.registry.js +0 -0
  390. /package/src/{public-types.js → services/module-loading/module-loading-types.js} +0 -0
  391. /package/src/services/{schema-validation-service.js → validation/schema-validation-service.js} +0 -0
@@ -0,0 +1,83 @@
1
+ function createComponentFactory(options) {
2
+ const component2 = ((props) => options.render(props));
3
+ component2.config = {
4
+ __eco: options.__eco,
5
+ integration: options.integration,
6
+ dependencies: options.dependencies
7
+ };
8
+ return component2;
9
+ }
10
+ function component(options) {
11
+ return createComponentFactory(options);
12
+ }
13
+ function html(options) {
14
+ return createComponentFactory(options);
15
+ }
16
+ function layout(options) {
17
+ return createComponentFactory(options);
18
+ }
19
+ function page(options) {
20
+ const {
21
+ layout: pageLayout,
22
+ dependencies,
23
+ render,
24
+ staticPaths: staticPaths2,
25
+ staticProps: staticProps2,
26
+ metadata: metadata2,
27
+ cache,
28
+ requires,
29
+ middleware
30
+ } = options;
31
+ const pageComponent = createComponentFactory({
32
+ __eco: options.__eco,
33
+ integration: options.integration,
34
+ dependencies: pageLayout ? {
35
+ ...dependencies,
36
+ components: [...dependencies?.components ?? [], pageLayout]
37
+ } : dependencies,
38
+ render
39
+ });
40
+ if (pageLayout && pageComponent.config) {
41
+ pageComponent.config.layout = pageLayout;
42
+ }
43
+ if (staticPaths2) {
44
+ pageComponent.staticPaths = staticPaths2;
45
+ }
46
+ if (staticProps2) {
47
+ pageComponent.staticProps = staticProps2;
48
+ }
49
+ if (metadata2) {
50
+ pageComponent.metadata = metadata2;
51
+ }
52
+ if (cache) {
53
+ pageComponent.cache = cache;
54
+ }
55
+ if (requires) {
56
+ pageComponent.requires = requires;
57
+ }
58
+ if (middleware) {
59
+ pageComponent.middleware = middleware;
60
+ }
61
+ return pageComponent;
62
+ }
63
+ function metadata(fn) {
64
+ return fn;
65
+ }
66
+ function staticPaths(fn) {
67
+ return fn;
68
+ }
69
+ function staticProps(fn) {
70
+ return fn;
71
+ }
72
+ const eco = {
73
+ component,
74
+ html,
75
+ layout,
76
+ page,
77
+ metadata,
78
+ staticPaths,
79
+ staticProps
80
+ };
81
+ export {
82
+ eco
83
+ };
package/src/eco/eco.js CHANGED
@@ -1,60 +1,27 @@
1
- import { createNodeId, createPropsRef, createSlotRef, getComponentRenderContext } from "./component-render-context.js";
2
- import { createComponentMarker, parseComponentMarkers } from "../route-renderer/component-marker.js";
3
- import { addTriggerAttribute, isThenable, wrapWithScriptsInjector } from "./eco.utils.js";
1
+ import {
2
+ finalizeComponentRender,
3
+ interceptComponentBoundary
4
+ } from "../route-renderer/orchestration/component-render-context.js";
5
+ import { isThenable } from "../route-renderer/orchestration/render-output.utils.js";
4
6
  function createComponentFactory(options) {
5
7
  const integrationName = options.integration ?? options.__eco?.integration;
6
8
  const comp = ((props) => {
7
- const renderContext = getComponentRenderContext();
8
- const shouldEmitMarker = renderContext !== void 0 && renderContext.boundaryContext.decideBoundaryRender({
9
- currentIntegration: renderContext.currentIntegration,
10
- targetIntegration: integrationName,
11
- component: comp
12
- }) === "defer";
13
- if (shouldEmitMarker && renderContext) {
14
- const nodeId = createNodeId(renderContext);
15
- const propsRef = createPropsRef(renderContext);
16
- const componentRef = comp.config?.__eco?.id ?? comp.config?.__eco?.file;
17
- if (!componentRef) {
18
- throw new Error(
19
- "[ecopages] Missing component reference metadata for cross-integration marker emission."
20
- );
21
- }
22
- const componentProps = props ?? {};
23
- renderContext.propsByRef[propsRef] = componentProps;
24
- let slotRef;
25
- const children = componentProps.children;
26
- if (typeof children === "string" && children.includes("<eco-marker")) {
27
- const childMarkers = parseComponentMarkers(children);
28
- if (childMarkers.length > 0) {
29
- slotRef = createSlotRef(renderContext);
30
- renderContext.slotChildrenByRef[slotRef] = childMarkers.map((marker) => marker.nodeId);
31
- }
32
- }
33
- return createComponentMarker({
34
- nodeId,
35
- integration: integrationName,
36
- componentRef,
37
- propsRef,
38
- slotRef
39
- });
9
+ const componentProps = props ?? {};
10
+ const renderInline = () => finalizeComponentRender(comp, options.render(props));
11
+ const boundaryRender = interceptComponentBoundary({
12
+ component: comp,
13
+ props: componentProps,
14
+ targetIntegration: integrationName
15
+ });
16
+ if (isThenable(boundaryRender)) {
17
+ return boundaryRender.then(
18
+ (resolvedBoundaryRender) => resolvedBoundaryRender !== void 0 ? resolvedBoundaryRender : renderInline()
19
+ );
40
20
  }
41
- const content = options.render(props);
42
- const lazyTriggers = comp.config?._resolvedLazyTriggers;
43
- if (lazyTriggers && lazyTriggers.length > 0) {
44
- const triggerId = lazyTriggers[0].triggerId;
45
- if (isThenable(content)) {
46
- return content.then((resolvedContent) => addTriggerAttribute(resolvedContent, triggerId));
47
- }
48
- return addTriggerAttribute(content, triggerId);
21
+ if (boundaryRender !== void 0) {
22
+ return boundaryRender;
49
23
  }
50
- const lazyGroups = comp.config?._resolvedLazyScripts;
51
- if (lazyGroups && lazyGroups.length > 0) {
52
- if (isThenable(content)) {
53
- return content.then((resolvedContent) => wrapWithScriptsInjector(resolvedContent, lazyGroups));
54
- }
55
- return wrapWithScriptsInjector(content, lazyGroups);
56
- }
57
- return content;
24
+ return renderInline();
58
25
  });
59
26
  comp.config = {
60
27
  __eco: options.__eco,
@@ -66,20 +33,26 @@ function createComponentFactory(options) {
66
33
  function component(options) {
67
34
  return createComponentFactory(options);
68
35
  }
36
+ function html(options) {
37
+ return createComponentFactory(options);
38
+ }
39
+ function layout(options) {
40
+ return createComponentFactory(options);
41
+ }
69
42
  function page(options) {
70
- const { layout, dependencies, render, staticPaths: staticPaths2, staticProps: staticProps2, metadata: metadata2, cache, requires, middleware } = options;
43
+ const { layout: layout2, dependencies, render, staticPaths: staticPaths2, staticProps: staticProps2, metadata: metadata2, cache, requires, middleware } = options;
71
44
  const componentOptions = {
72
45
  __eco: options.__eco,
73
46
  integration: options.integration,
74
- dependencies: layout ? {
47
+ dependencies: layout2 ? {
75
48
  ...dependencies,
76
- components: [...dependencies?.components || [], layout]
49
+ components: [...dependencies?.components || [], layout2]
77
50
  } : dependencies,
78
51
  render
79
52
  };
80
53
  const pageComponent = createComponentFactory(componentOptions);
81
- if (layout && pageComponent.config) {
82
- pageComponent.config.layout = layout;
54
+ if (layout2 && pageComponent.config) {
55
+ pageComponent.config.layout = layout2;
83
56
  }
84
57
  if (staticPaths2) pageComponent.staticPaths = staticPaths2;
85
58
  if (staticProps2) pageComponent.staticProps = staticProps2;
@@ -100,6 +73,8 @@ function staticProps(fn) {
100
73
  }
101
74
  const eco = {
102
75
  component,
76
+ html,
77
+ layout,
103
78
  page,
104
79
  metadata,
105
80
  staticPaths,
@@ -2,7 +2,7 @@
2
2
  * Type definitions for the eco namespace API
3
3
  * @module
4
4
  */
5
- import type { DependencyLazyTrigger, EcoComponent, EcoComponentDependencies, EcoInjectedMeta, EcoPagesElement, GetMetadata, GetStaticPaths, GetStaticProps, Middleware, RequestLocals, RequestPageContext } from '../public-types.js';
5
+ import type { DependencyLazyTrigger, EcoComponent, EcoComponentDependencies, EcoHtmlComponent, EcoInjectedMeta, EcoLayoutComponent, EcoPageLayoutComponent, EcoPagesElement, GetMetadata, GetStaticPaths, GetStaticProps, HtmlTemplateProps, LayoutProps, Middleware, RequestLocals, RequestPageContext } from '../types/public-types.js';
6
6
  import type { CacheStrategy } from '../services/cache/cache.types.js';
7
7
  type WithRequiredLocals<K extends keyof RequestLocals> = Omit<RequestLocals, K> & {
8
8
  [P in K]-?: Exclude<RequestLocals[P], null | undefined>;
@@ -26,6 +26,8 @@ export interface ComponentOptions<P, E = EcoPagesElement> {
26
26
  dependencies?: EcoComponentDependencies;
27
27
  render: (props: P) => E | Promise<E>;
28
28
  }
29
+ export type HtmlOptions<E = EcoPagesElement> = ComponentOptions<HtmlTemplateProps, E>;
30
+ export type LayoutOptions<E = EcoPagesElement> = ComponentOptions<LayoutProps<E>, E>;
29
31
  /**
30
32
  * Base options shared by all page variants
31
33
  */
@@ -34,9 +36,7 @@ export interface PageOptionsBase<T, E = EcoPagesElement> {
34
36
  __eco?: EcoInjectedMeta;
35
37
  integration?: string;
36
38
  dependencies?: EcoComponentDependencies;
37
- layout?: EcoComponent<{
38
- children: E;
39
- } & Partial<RequestPageContext>>;
39
+ layout?: EcoPageLayoutComponent<E>;
40
40
  /**
41
41
  * Define static paths for dynamic routes (e.g., [slug].tsx).
42
42
  * Returns all possible paths that should be pre-rendered at build time.
@@ -139,6 +139,14 @@ export interface Eco {
139
139
  * @template E - Element/return type (EcoPagesElement for Kita, ReactNode for React)
140
140
  */
141
141
  component: <P = {}, E = EcoPagesElement>(options: ComponentOptions<P, E>) => EcoComponent<P, E>;
142
+ /**
143
+ * Create a document shell component for the HTML wrapper.
144
+ */
145
+ html: <E = EcoPagesElement>(options: HtmlOptions<E>) => EcoHtmlComponent<E>;
146
+ /**
147
+ * Create a route layout component.
148
+ */
149
+ layout: <E = EcoPagesElement>(options: LayoutOptions<E>) => EcoLayoutComponent<E>;
142
150
  /**
143
151
  * Create a page component with type-safe props from getStaticProps.
144
152
  * Returns an EcoPageComponent with attached staticPaths, staticProps, and metadata.
@@ -1,40 +1 @@
1
- import type { EcoComponent } from '../public-types.js';
2
- /**
3
- * Returns `true` when `value` is a thenable (Promise-like) object.
4
- *
5
- * Used to transparently handle both synchronous and asynchronous component
6
- * render results without requiring every caller to branch on `instanceof Promise`.
7
- *
8
- * @typeParam T Expected resolved type of the thenable.
9
- */
10
- export declare function isThenable<T>(value: unknown): value is PromiseLike<T>;
11
- /**
12
- * Injects `data-eco-trigger` into the first real HTML element opening tag of
13
- * a component's rendered output string.
14
- *
15
- * The scan skips over leading whitespace, HTML comments (`<!-- -->`), CDATA
16
- * sections, and doctype declarations so that the attribute is always placed on
17
- * the first actual element — not spurious markup that can precede it.
18
- *
19
- * The insertion point is the end of the element's tag name, before any existing
20
- * attributes or the closing `>`, which produces output like:
21
- *
22
- * ```html
23
- * <my-element data-eco-trigger="eco-trigger-abc123" class="foo">…</my-element>
24
- * ```
25
- *
26
- * When no eligible opening tag is found the original string is returned
27
- * unchanged so callers never receive a broken fragment.
28
- *
29
- * @param content Rendered HTML string (or any value coercible to string).
30
- * @param triggerId Stable trigger identifier produced by `buildResolvedLazyTriggers`.
31
- */
32
- export declare function addTriggerAttribute(content: unknown, triggerId: string): string;
33
- /**
34
- * Wraps rendered component output in a `<scripts-injector>` element that
35
- * carries an inline injector map for the legacy (non-global-injector) path.
36
- *
37
- * @param content Rendered component HTML.
38
- * @param lazyGroups Resolved lazy script groups attached to the component config.
39
- */
40
- export declare function wrapWithScriptsInjector(content: unknown, lazyGroups: NonNullable<EcoComponent['config']>['_resolvedLazyScripts']): string;
1
+ export { addTriggerAttribute, isThenable, wrapWithScriptsInjector, } from '../route-renderer/orchestration/render-output.utils.js';
@@ -1,38 +1,8 @@
1
- import { buildInjectorMapScript } from "./lazy-injector-map.js";
2
- function isThenable(value) {
3
- return typeof value === "object" && value !== null && "then" in value && typeof value.then === "function";
4
- }
5
- function addTriggerAttribute(content, triggerId) {
6
- const str = String(content);
7
- let i = 0;
8
- while (i < str.length) {
9
- if (str[i] !== "<") {
10
- i++;
11
- continue;
12
- }
13
- const next = str[i + 1];
14
- if (next === "!" || next === "?") {
15
- const end = str.indexOf(">", i);
16
- if (end === -1) break;
17
- i = end + 1;
18
- continue;
19
- }
20
- if (next && /[a-zA-Z]/.test(next)) {
21
- const tagSlice = str.slice(i + 1);
22
- const nameEnd = tagSlice.search(/[\s/>]/);
23
- if (nameEnd === -1) break;
24
- const insertAt = i + 1 + nameEnd;
25
- return `${str.slice(0, insertAt)} data-eco-trigger="${triggerId}"${str.slice(insertAt)}`;
26
- }
27
- break;
28
- }
29
- return str;
30
- }
31
- function wrapWithScriptsInjector(content, lazyGroups) {
32
- const wrappedContent = String(content);
33
- const injectorMapScript = buildInjectorMapScript(lazyGroups ?? []);
34
- return `<scripts-injector><script type="ecopages/injector-map">${injectorMapScript}<\/script>${wrappedContent}<\/scripts-injector>`;
35
- }
1
+ import {
2
+ addTriggerAttribute,
3
+ isThenable,
4
+ wrapWithScriptsInjector
5
+ } from "../route-renderer/orchestration/render-output.utils.js";
36
6
  export {
37
7
  addTriggerAttribute,
38
8
  isThenable,
@@ -1,4 +1,4 @@
1
- import type { ResolvedLazyTrigger } from '../public-types.js';
1
+ import type { ResolvedLazyTrigger } from '../types/public-types.js';
2
2
  /**
3
3
  * Serializes resolved lazy triggers into a JSON string safe for embedding
4
4
  * inside an inline `<script type="ecopages/global-injector-map">` tag.
@@ -1,4 +1,4 @@
1
- import type { ResolvedLazyScriptGroup } from '../public-types.js';
1
+ import type { ResolvedLazyScriptGroup } from '../types/public-types.js';
2
2
  /**
3
3
  * Creates a safe JSON payload string for `<script type="ecopages/injector-map">`.
4
4
  *
@@ -0,0 +1,26 @@
1
+ # HMR Layer
2
+
3
+ This directory contains the framework-owned hot-update strategy contracts used by runtime adapters and integrations.
4
+
5
+ ## Purpose
6
+
7
+ The HMR layer separates change classification from update execution.
8
+
9
+ It is responsible for:
10
+
11
+ - defining the shared HMR manager and strategy contracts
12
+ - letting integrations contribute framework-specific update strategies
13
+ - keeping adapter transports independent from update policy
14
+
15
+ ## How It Fits
16
+
17
+ 1. `ProjectWatcher` observes file changes.
18
+ 2. `DevelopmentInvalidationService` classifies the change.
19
+ 3. The active HMR manager selects a strategy.
20
+ 4. The strategy coordinates browser rebuilds, metadata reloads, and client broadcasts.
21
+
22
+ ## Design Rule
23
+
24
+ Generic invalidation policy belongs in core services.
25
+ Framework-specific update behavior belongs in HMR strategies.
26
+ Runtime-specific WebSocket or event-stream transport belongs in adapters.
@@ -2,9 +2,4 @@
2
2
  * Ecopages HMR Runtime
3
3
  * Injected into the browser to handle Hot Module Replacement updates.
4
4
  */
5
- interface HMRPayload {
6
- type: 'reload' | 'error' | 'update' | 'css-update' | 'layout-update';
7
- path?: string;
8
- message?: string;
9
- timestamp?: number;
10
- }
5
+ export {};
@@ -1,3 +1,4 @@
1
+ import { getEcoNavigationRuntime } from "../../router/client/navigation-coordinator.js";
1
2
  (function() {
2
3
  const WS_URL = "ws://" + location.host + "/_hmr";
3
4
  let socket;
@@ -24,14 +25,15 @@
24
25
  });
25
26
  }
26
27
  async function handleMessage(payload) {
28
+ const navigationRuntime = getEcoNavigationRuntime(window);
27
29
  switch (payload.type) {
28
30
  case "reload":
31
+ await waitForNavigationToSettle(navigationRuntime);
29
32
  location.reload();
30
33
  break;
31
34
  case "layout-update": {
32
- const reloadFn = window.__ecopages_reload_current_page__;
33
- if (typeof reloadFn === "function") {
34
- await reloadFn({ clearCache: true });
35
+ await waitForNavigationToSettle(navigationRuntime);
36
+ if (await navigationRuntime.reloadCurrentPage({ clearCache: true })) {
35
37
  } else {
36
38
  location.reload();
37
39
  }
@@ -55,20 +57,41 @@
55
57
  async function applyUpdate(path, timestamp) {
56
58
  try {
57
59
  const url = path + "?t=" + (timestamp || Date.now());
58
- const handlers = window.__ecopages_hmr_handlers__;
60
+ const handlers = window.__ECO_PAGES__?.hmrHandlers;
61
+ const navigationRuntime = getEcoNavigationRuntime(window);
62
+ await waitForNavigationToSettle(navigationRuntime);
59
63
  if (handlers?.[path]) {
60
64
  await handlers[path](url);
61
65
  return;
62
66
  }
63
67
  await import(url);
64
- const reloadFn = window.__ecopages_reload_current_page__;
65
- if (typeof reloadFn === "function") {
66
- await reloadFn({ clearCache: false });
68
+ if (await navigationRuntime.reloadCurrentPage({ clearCache: false })) {
67
69
  }
68
70
  } catch (e) {
69
71
  console.error("[ecopages] Failed to apply HMR update:", e);
70
72
  }
71
73
  }
74
+ async function waitForNavigationToSettle(navigationRuntime) {
75
+ if (!navigationRuntime.hasPendingNavigationTransaction()) {
76
+ return;
77
+ }
78
+ await new Promise((resolve) => {
79
+ const startedAt = performance.now();
80
+ const timeoutMs = 2e3;
81
+ const poll = () => {
82
+ if (!navigationRuntime.hasPendingNavigationTransaction()) {
83
+ resolve();
84
+ return;
85
+ }
86
+ if (performance.now() - startedAt >= timeoutMs) {
87
+ resolve();
88
+ return;
89
+ }
90
+ requestAnimationFrame(poll);
91
+ };
92
+ requestAnimationFrame(poll);
93
+ });
94
+ }
72
95
  function refreshStylesheet(path) {
73
96
  const filename = path.split("/").pop() || "";
74
97
  const links = document.querySelectorAll('link[rel="stylesheet"]');
@@ -1,4 +1,4 @@
1
- import type { ClientBridgeEvent } from '../public-types';
1
+ import type { ClientBridgeEvent } from '../types/public-types.js';
2
2
  /**
3
3
  * HMR Strategy Pattern
4
4
  *
@@ -18,11 +18,13 @@ import type { ClientBridgeEvent } from '../public-types';
18
18
  * async process(filePath: string): Promise<HmrAction> {
19
19
  * return {
20
20
  * type: 'broadcast',
21
- * events: [{ type: 'update', path: filePath, timestamp: Date.now() }]
21
+ * events: [{ type: 'update', path: filePath, timestamp: Date.now() }],
22
22
  * };
23
23
  * }
24
24
  * }
25
-
25
+ * ```
26
+ */
27
+ /**
26
28
  * Defines the category of an HMR strategy, which determines its execution priority.
27
29
  * Strategies are evaluated in descending order: INTEGRATION → ASSET → SCRIPT → FALLBACK.
28
30
  *
@@ -30,28 +32,29 @@ import type { ClientBridgeEvent } from '../public-types';
30
32
  * The numeric values represent base priorities. Strategies can fine-tune their priority
31
33
  * using the `priorityOffset` property.
32
34
  */
33
- export declare enum HmrStrategyType {
35
+ export declare const HmrStrategyType: {
34
36
  /**
35
37
  * Integration-specific strategies (React, Lit, etc.)
36
38
  * Highest priority to allow framework-specific HMR handling.
37
39
  */
38
- INTEGRATION = 100,
40
+ readonly INTEGRATION: 100;
39
41
  /**
40
42
  * Asset processing strategies (CSS, images, etc.)
41
43
  * High priority for specialized asset handling.
42
44
  */
43
- ASSET = 50,
45
+ readonly ASSET: 50;
44
46
  /**
45
47
  * Generic script bundling strategies (JS/TS)
46
48
  * Medium priority for standard script processing.
47
49
  */
48
- SCRIPT = 25,
50
+ readonly SCRIPT: 25;
49
51
  /**
50
52
  * Fallback strategy for unhandled file types.
51
53
  * Lowest priority, triggers full page reload.
52
54
  */
53
- FALLBACK = 0
54
- }
55
+ readonly FALLBACK: 0;
56
+ };
57
+ export type HmrStrategyType = (typeof HmrStrategyType)[keyof typeof HmrStrategyType];
55
58
  /**
56
59
  * Represents an action to be taken after processing a file change.
57
60
  */
@@ -62,7 +65,7 @@ export interface HmrAction {
62
65
  type: 'broadcast' | 'none';
63
66
  /**
64
67
  * The HMR events to broadcast, if type is 'broadcast'.
65
- * capable of broadcasting multiple events at once.
68
+ * Multiple events may be broadcast in one action.
66
69
  */
67
70
  events?: ClientBridgeEvent[];
68
71
  }
@@ -74,8 +77,8 @@ export interface HmrAction {
74
77
  * whether they match the changed file path.
75
78
  *
76
79
  * @remarks
77
- * Strategies should be stateless and idempotent. The same file change should always
78
- * produce the same result when processed by the same strategy.
80
+ * Strategies are expected to be stateless and idempotent. The same file change
81
+ * should produce the same result when processed by the same strategy.
79
82
  *
80
83
  * @example
81
84
  * ```typescript
@@ -120,7 +123,7 @@ export declare abstract class HmrStrategy {
120
123
  * Determines if this strategy can handle the given file path.
121
124
  *
122
125
  * @param filePath - Absolute path to the changed file
123
- * @returns True if this strategy should process the file
126
+ * @returns `true` when this strategy should process the file
124
127
  *
125
128
  * @example
126
129
  * ```typescript
@@ -1,10 +1,25 @@
1
- var HmrStrategyType = /* @__PURE__ */ ((HmrStrategyType2) => {
2
- HmrStrategyType2[HmrStrategyType2["INTEGRATION"] = 100] = "INTEGRATION";
3
- HmrStrategyType2[HmrStrategyType2["ASSET"] = 50] = "ASSET";
4
- HmrStrategyType2[HmrStrategyType2["SCRIPT"] = 25] = "SCRIPT";
5
- HmrStrategyType2[HmrStrategyType2["FALLBACK"] = 0] = "FALLBACK";
6
- return HmrStrategyType2;
7
- })(HmrStrategyType || {});
1
+ const HmrStrategyType = {
2
+ /**
3
+ * Integration-specific strategies (React, Lit, etc.)
4
+ * Highest priority to allow framework-specific HMR handling.
5
+ */
6
+ INTEGRATION: 100,
7
+ /**
8
+ * Asset processing strategies (CSS, images, etc.)
9
+ * High priority for specialized asset handling.
10
+ */
11
+ ASSET: 50,
12
+ /**
13
+ * Generic script bundling strategies (JS/TS)
14
+ * Medium priority for standard script processing.
15
+ */
16
+ SCRIPT: 25,
17
+ /**
18
+ * Fallback strategy for unhandled file types.
19
+ * Lowest priority, triggers full page reload.
20
+ */
21
+ FALLBACK: 0
22
+ };
8
23
  class HmrStrategy {
9
24
  /**
10
25
  * Optional offset to fine-tune priority within the same category.
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,31 @@
1
+ import { test, expect } from "@playwright/test";
2
+ import { readFileSync } from "node:fs";
3
+ import { writeFile } from "node:fs/promises";
4
+ import { resolve } from "node:path";
5
+ const FIXTURE_DIR = resolve(process.cwd(), "packages/core/__fixtures__/app");
6
+ const TEST_CSS_FILE = resolve(FIXTURE_DIR, "src/pages/postcss-hmr.css");
7
+ test.describe("HMR E2E PostCSS", () => {
8
+ test("should hot-update processor-owned CSS without a full page reload", async ({ page }) => {
9
+ const originalCss = readFileSync(TEST_CSS_FILE, "utf-8");
10
+ const title = page.locator(".postcss-title").first();
11
+ try {
12
+ await page.goto("/postcss-hmr", { waitUntil: "networkidle" });
13
+ await expect(title).toBeVisible();
14
+ const initialColor = await title.evaluate((el) => getComputedStyle(el).color);
15
+ expect(initialColor).toBeTruthy();
16
+ await page.evaluate(() => {
17
+ window.__postcssReloadProbe = "before-change";
18
+ });
19
+ const modifiedCss = originalCss.replace(".postcss-title {", ".postcss-title {\n color: rgb(255, 0, 0);");
20
+ await writeFile(TEST_CSS_FILE, modifiedCss, { flush: true });
21
+ await expect.poll(async () => title.evaluate((el) => getComputedStyle(el).color), { timeout: 1e4 }).toBe("rgb(255, 0, 0)");
22
+ await expect(
23
+ page.evaluate(
24
+ () => window.__postcssReloadProbe ?? null
25
+ )
26
+ ).resolves.toBe("before-change");
27
+ } finally {
28
+ await writeFile(TEST_CSS_FILE, originalCss, { flush: true });
29
+ }
30
+ });
31
+ });