@ecopages/core 0.2.0-alpha.22 → 0.2.0-alpha.24

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 (515) hide show
  1. package/package.json +93 -226
  2. package/src/adapters/abstract/application-adapter.test.ts +172 -0
  3. package/src/adapters/abstract/application-adapter.ts +379 -0
  4. package/src/adapters/abstract/router-adapter.ts +30 -0
  5. package/src/adapters/abstract/server-adapter.ts +79 -0
  6. package/src/adapters/bun/client-bridge.ts +62 -0
  7. package/src/adapters/bun/create-app.ts +180 -0
  8. package/src/adapters/bun/hmr-manager.test.ts +267 -0
  9. package/src/adapters/bun/hmr-manager.ts +406 -0
  10. package/src/adapters/bun/index.ts +2 -0
  11. package/src/adapters/bun/server-adapter.ts +500 -0
  12. package/src/adapters/bun/server-lifecycle.ts +124 -0
  13. package/src/adapters/create-app.test.ts +10 -0
  14. package/src/adapters/create-app.ts +91 -0
  15. package/src/adapters/index.ts +2 -0
  16. package/src/adapters/node/create-app.test.ts +53 -0
  17. package/src/adapters/node/create-app.ts +183 -0
  18. package/src/adapters/node/node-client-bridge.test.ts +198 -0
  19. package/src/adapters/node/node-client-bridge.ts +79 -0
  20. package/src/adapters/node/node-hmr-manager.test.ts +322 -0
  21. package/src/adapters/node/node-hmr-manager.ts +378 -0
  22. package/src/adapters/node/server-adapter.ts +502 -0
  23. package/src/adapters/node/static-content-server.test.ts +60 -0
  24. package/src/adapters/node/static-content-server.ts +239 -0
  25. package/src/adapters/shared/api-response.test.ts +97 -0
  26. package/src/adapters/shared/api-response.ts +104 -0
  27. package/src/adapters/shared/application-adapter.ts +199 -0
  28. package/src/adapters/shared/define-api-handler.ts +66 -0
  29. package/src/adapters/shared/explicit-static-route-matcher.test.ts +381 -0
  30. package/src/adapters/shared/explicit-static-route-matcher.ts +140 -0
  31. package/src/adapters/shared/file-route-middleware-pipeline.test.ts +90 -0
  32. package/src/adapters/shared/file-route-middleware-pipeline.ts +127 -0
  33. package/src/adapters/shared/fs-server-response-factory.test.ts +187 -0
  34. package/src/adapters/shared/fs-server-response-factory.ts +118 -0
  35. package/src/adapters/shared/fs-server-response-matcher.test.ts +285 -0
  36. package/src/adapters/shared/fs-server-response-matcher.ts +189 -0
  37. package/src/adapters/shared/hmr-entrypoint-registrar.ts +149 -0
  38. package/src/adapters/shared/hmr-html-response.ts +52 -0
  39. package/src/adapters/shared/hmr-manager.contract.test.ts +232 -0
  40. package/src/adapters/shared/hmr-manager.dispatch.test.ts +220 -0
  41. package/src/adapters/shared/render-context.test.ts +150 -0
  42. package/src/adapters/shared/render-context.ts +123 -0
  43. package/src/adapters/shared/runtime-bootstrap.ts +79 -0
  44. package/src/adapters/shared/server-adapter.test.ts +77 -0
  45. package/src/adapters/shared/server-adapter.ts +493 -0
  46. package/src/adapters/shared/server-route-handler.test.ts +110 -0
  47. package/src/adapters/shared/server-route-handler.ts +153 -0
  48. package/src/adapters/shared/server-static-builder.test.ts +338 -0
  49. package/src/adapters/shared/server-static-builder.ts +170 -0
  50. package/src/build/build-adapter-serialization.test.ts +281 -0
  51. package/src/build/build-adapter.test.ts +1240 -0
  52. package/src/build/build-adapter.ts +1012 -0
  53. package/src/build/build-manifest.ts +54 -0
  54. package/src/build/build-types.ts +83 -0
  55. package/src/build/dev-build-coordinator.ts +220 -0
  56. package/src/build/esbuild-build-adapter.ts +660 -0
  57. package/src/build/runtime-build-executor.test.ts +81 -0
  58. package/src/build/runtime-build-executor.ts +40 -0
  59. package/src/build/runtime-specifier-alias-plugin.test.ts +67 -0
  60. package/src/build/runtime-specifier-alias-plugin.ts +62 -0
  61. package/src/build/runtime-specifier-aliases.ts +135 -0
  62. package/src/config/config-builder.test.ts +443 -0
  63. package/src/config/config-builder.ts +742 -0
  64. package/src/config/config-builder.typecheck.test.ts +96 -0
  65. package/src/config/{constants.d.ts → constants.ts} +22 -13
  66. package/src/dev/sc-server.ts +143 -0
  67. package/src/eco/eco.browser.test.ts +43 -0
  68. package/src/eco/eco.browser.ts +118 -0
  69. package/src/eco/eco.test.ts +654 -0
  70. package/src/eco/eco.ts +205 -0
  71. package/src/eco/eco.types.ts +221 -0
  72. package/src/eco/eco.utils.test.ts +219 -0
  73. package/src/eco/eco.utils.ts +5 -0
  74. package/src/eco/global-injector-map.test.ts +42 -0
  75. package/src/eco/global-injector-map.ts +112 -0
  76. package/src/eco/lazy-injector-map.test.ts +66 -0
  77. package/src/eco/lazy-injector-map.ts +120 -0
  78. package/src/eco/module-dependencies.test.ts +30 -0
  79. package/src/eco/module-dependencies.ts +75 -0
  80. package/src/errors/http-error.test.ts +134 -0
  81. package/src/errors/http-error.ts +72 -0
  82. package/src/errors/{index.d.ts → index.ts} +2 -2
  83. package/src/errors/locals-access-error.ts +7 -0
  84. package/src/global/app-logger.ts +4 -0
  85. package/src/global/utils.test.ts +12 -0
  86. 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
  87. package/src/hmr/client/__screenshots__/hmr-runtime.test.browser.ts/HMR-Runtime-HMR-Server-Integration-should-load-fixture-app-page-1.png +0 -0
  88. package/src/hmr/client/__screenshots__/hmr-runtime.test.browser.ts/HMR-Runtime-WebSocket-Connection-should-connect-to-correct-HMR-endpoint-1.png +0 -0
  89. package/src/hmr/client/hmr-runtime.ts +160 -0
  90. package/src/hmr/hmr-strategy.test.ts +124 -0
  91. package/src/hmr/hmr-strategy.ts +177 -0
  92. package/src/hmr/hmr.postcss.test.e2e.ts +41 -0
  93. package/src/hmr/hmr.test.e2e.ts +66 -0
  94. package/src/hmr/strategies/default-hmr-strategy.ts +60 -0
  95. package/src/hmr/strategies/js-hmr-strategy.test.ts +335 -0
  96. package/src/hmr/strategies/js-hmr-strategy.ts +320 -0
  97. package/src/index.browser.ts +3 -0
  98. package/src/index.ts +15 -0
  99. package/src/integrations/ghtml/ghtml-renderer.test.ts +253 -0
  100. package/src/integrations/ghtml/ghtml-renderer.ts +97 -0
  101. package/src/integrations/ghtml/ghtml.constants.ts +1 -0
  102. package/src/integrations/ghtml/ghtml.plugin.ts +28 -0
  103. package/src/plugins/alias-resolver-plugin.test.ts +41 -0
  104. package/src/plugins/alias-resolver-plugin.ts +63 -0
  105. package/src/plugins/eco-component-meta-plugin.test.ts +406 -0
  106. package/src/plugins/eco-component-meta-plugin.ts +495 -0
  107. package/src/plugins/foreign-jsx-override-plugin.test.ts +65 -0
  108. package/src/plugins/foreign-jsx-override-plugin.ts +67 -0
  109. package/src/plugins/integration-plugin.test.ts +156 -0
  110. package/src/plugins/integration-plugin.ts +311 -0
  111. package/src/plugins/processor.test.ts +148 -0
  112. package/src/plugins/processor.ts +240 -0
  113. package/src/plugins/{runtime-capability.d.ts → runtime-capability.ts} +8 -3
  114. package/src/plugins/source-transform.test.ts +82 -0
  115. package/src/plugins/source-transform.ts +123 -0
  116. package/src/route-renderer/orchestration/boundary-planning.service.ts +146 -0
  117. package/src/route-renderer/orchestration/component-render-context.ts +318 -0
  118. package/src/route-renderer/orchestration/integration-renderer.test.ts +2088 -0
  119. package/src/route-renderer/orchestration/integration-renderer.ts +1285 -0
  120. package/src/route-renderer/orchestration/page-packaging.service.test.ts +76 -0
  121. package/src/route-renderer/orchestration/page-packaging.service.ts +85 -0
  122. package/src/route-renderer/orchestration/processed-asset-dedupe.ts +25 -0
  123. package/src/route-renderer/orchestration/queued-boundary-runtime.service.test.ts +319 -0
  124. package/src/route-renderer/orchestration/queued-boundary-runtime.service.ts +289 -0
  125. package/src/route-renderer/orchestration/render-execution.service.test.ts +196 -0
  126. package/src/route-renderer/orchestration/render-execution.service.ts +182 -0
  127. package/src/route-renderer/orchestration/render-output.utils.ts +302 -0
  128. package/src/route-renderer/orchestration/render-preparation.service.test.ts +569 -0
  129. package/src/route-renderer/orchestration/render-preparation.service.ts +508 -0
  130. package/src/route-renderer/orchestration/route-shell-composer.service.ts +162 -0
  131. package/src/route-renderer/orchestration/template-serialization.test.ts +110 -0
  132. package/src/route-renderer/orchestration/template-serialization.ts +117 -0
  133. package/src/route-renderer/page-loading/component-dependency-collection.ts +196 -0
  134. package/src/route-renderer/page-loading/declared-asset-collection.ts +156 -0
  135. package/src/route-renderer/page-loading/dependency-resolver.test.ts +665 -0
  136. package/src/route-renderer/page-loading/dependency-resolver.ts +150 -0
  137. package/src/route-renderer/page-loading/ecopages-virtual-imports.ts +75 -0
  138. package/src/route-renderer/page-loading/lazy-entry-collection.ts +167 -0
  139. package/src/route-renderer/page-loading/lazy-trigger-planning.ts +74 -0
  140. package/src/route-renderer/page-loading/module-declaration-aggregation.ts +60 -0
  141. package/src/route-renderer/page-loading/module-declaration-scripts.ts +16 -0
  142. package/src/route-renderer/page-loading/page-dependency-bundling.ts +205 -0
  143. package/src/route-renderer/page-loading/page-module-loader.test.ts +183 -0
  144. package/src/route-renderer/page-loading/page-module-loader.ts +184 -0
  145. package/src/route-renderer/route-renderer.ts +136 -0
  146. package/src/router/client/link-intent.test.browser.ts +51 -0
  147. package/src/router/client/link-intent.ts +92 -0
  148. package/src/router/client/navigation-coordinator.test.ts +237 -0
  149. package/src/router/client/navigation-coordinator.ts +453 -0
  150. package/src/router/server/fs-router-scanner.test.ts +83 -0
  151. package/src/router/server/fs-router-scanner.ts +224 -0
  152. package/src/router/server/fs-router.test.ts +214 -0
  153. package/src/router/server/fs-router.ts +122 -0
  154. package/src/services/assets/asset-processing-service/asset-dependency-keys.ts +66 -0
  155. package/src/services/assets/asset-processing-service/asset-processing.service.test.ts +476 -0
  156. package/src/services/assets/asset-processing-service/asset-processing.service.ts +345 -0
  157. package/src/services/assets/asset-processing-service/asset.factory.test.ts +63 -0
  158. package/src/services/assets/asset-processing-service/asset.factory.ts +105 -0
  159. package/src/services/assets/asset-processing-service/assets.types.ts +125 -0
  160. package/src/services/assets/asset-processing-service/browser-runtime-asset.factory.test.ts +74 -0
  161. package/src/services/assets/asset-processing-service/browser-runtime-asset.factory.ts +96 -0
  162. package/src/services/assets/asset-processing-service/browser-runtime-entry.factory.test.ts +67 -0
  163. package/src/services/assets/asset-processing-service/browser-runtime-entry.factory.ts +78 -0
  164. package/src/services/assets/asset-processing-service/grouped-content-bundles.ts +104 -0
  165. package/src/services/assets/asset-processing-service/index.ts +5 -0
  166. package/src/services/assets/asset-processing-service/{processor.interface.d.ts → processor.interface.ts} +10 -5
  167. package/src/services/assets/asset-processing-service/processor.registry.ts +18 -0
  168. package/src/services/assets/asset-processing-service/processors/base/base-processor.test.ts +59 -0
  169. package/src/services/assets/asset-processing-service/processors/base/base-processor.ts +83 -0
  170. package/src/services/assets/asset-processing-service/processors/base/base-script-processor.ts +174 -0
  171. package/src/services/assets/asset-processing-service/processors/index.ts +5 -0
  172. package/src/services/assets/asset-processing-service/processors/script/content-script.processor.test.ts +192 -0
  173. package/src/services/assets/asset-processing-service/processors/script/content-script.processor.ts +134 -0
  174. package/src/services/assets/asset-processing-service/processors/script/file-script.processor.test.ts +326 -0
  175. package/src/services/assets/asset-processing-service/processors/script/file-script.processor.ts +110 -0
  176. package/src/services/assets/asset-processing-service/processors/script/node-module-script.processor.test.ts +227 -0
  177. package/src/services/assets/asset-processing-service/processors/script/node-module-script.processor.ts +87 -0
  178. package/src/services/assets/asset-processing-service/processors/stylesheet/content-stylesheet.processor.test.ts +261 -0
  179. package/src/services/assets/asset-processing-service/processors/stylesheet/content-stylesheet.processor.ts +71 -0
  180. package/src/services/assets/asset-processing-service/processors/stylesheet/file-stylesheet.processor.ts +81 -0
  181. package/src/services/assets/asset-processing-service/ungrouped-dependency-processing.ts +65 -0
  182. package/src/services/assets/browser-bundle.service.test.ts +66 -0
  183. package/src/services/assets/browser-bundle.service.ts +109 -0
  184. package/src/services/cache/cache.types.ts +126 -0
  185. package/src/services/cache/index.ts +18 -0
  186. package/src/services/cache/memory-cache-store.test.ts +225 -0
  187. package/src/services/cache/memory-cache-store.ts +130 -0
  188. package/src/services/cache/page-cache-service.test.ts +175 -0
  189. package/src/services/cache/page-cache-service.ts +202 -0
  190. package/src/services/cache/page-request-cache-coordinator.service.test.ts +79 -0
  191. package/src/services/cache/page-request-cache-coordinator.service.ts +131 -0
  192. package/src/services/html/html-rewriter-provider.service.test.ts +183 -0
  193. package/src/services/html/html-rewriter-provider.service.ts +104 -0
  194. package/src/services/html/html-transformer.service.test.ts +479 -0
  195. package/src/services/html/html-transformer.service.ts +275 -0
  196. package/src/services/invalidation/development-invalidation.service.test.ts +87 -0
  197. package/src/services/invalidation/development-invalidation.service.ts +262 -0
  198. package/src/services/module-loading/app-module-loader.service.ts +9 -0
  199. package/src/services/module-loading/app-server-module-transpiler.service.test.ts +130 -0
  200. package/src/services/module-loading/app-server-module-transpiler.service.ts +143 -0
  201. package/src/services/module-loading/host-module-loader-registry.ts +15 -0
  202. package/src/services/module-loading/{module-loading-types.d.ts → module-loading-types.ts} +1 -0
  203. package/src/services/module-loading/node-bootstrap-plugin.test.ts +335 -0
  204. package/src/services/module-loading/node-bootstrap-plugin.ts +297 -0
  205. package/src/services/module-loading/page-module-import.service.test.ts +504 -0
  206. package/src/services/module-loading/page-module-import.service.ts +252 -0
  207. package/src/services/module-loading/server-module-transpiler.service.test.ts +243 -0
  208. package/src/services/module-loading/server-module-transpiler.service.ts +104 -0
  209. package/src/services/module-loading/source-module-support.ts +19 -0
  210. package/src/services/runtime-state/dev-graph.service.ts +217 -0
  211. package/src/services/runtime-state/entrypoint-dependency-graph.service.ts +136 -0
  212. package/src/services/runtime-state/runtime-specifier-registry.service.ts +96 -0
  213. package/src/services/runtime-state/server-invalidation-state.service.ts +68 -0
  214. package/src/services/validation/schema-validation-service.test.ts +223 -0
  215. package/src/services/validation/schema-validation-service.ts +204 -0
  216. package/src/services/validation/{standard-schema.types.d.ts → standard-schema.types.ts} +20 -17
  217. package/src/static-site-generator/static-site-generator.test.ts +316 -0
  218. package/src/static-site-generator/static-site-generator.ts +462 -0
  219. package/src/types/internal-types.ts +242 -0
  220. package/src/types/public-types.ts +1443 -0
  221. package/src/utils/deep-merge.test.ts +114 -0
  222. package/src/utils/deep-merge.ts +47 -0
  223. package/src/utils/hash.ts +5 -0
  224. package/src/utils/html-escaping.ts +9 -0
  225. package/src/utils/invariant.test.ts +22 -0
  226. package/src/utils/invariant.ts +15 -0
  227. package/src/utils/locals-utils.ts +37 -0
  228. package/src/utils/parse-cli-args.test.ts +69 -0
  229. package/src/utils/parse-cli-args.ts +105 -0
  230. package/src/utils/path-utils.module.ts +14 -0
  231. package/src/utils/path-utils.test.ts +15 -0
  232. package/src/utils/resolve-work-dir.ts +45 -0
  233. package/src/utils/runtime.ts +44 -0
  234. package/src/utils/server-utils.module.ts +67 -0
  235. package/src/utils/server-utils.test.ts +38 -0
  236. package/src/watchers/project-watcher.integration.test.ts +337 -0
  237. package/src/watchers/project-watcher.test-helpers.ts +41 -0
  238. package/src/watchers/project-watcher.test.ts +768 -0
  239. package/src/watchers/project-watcher.ts +357 -0
  240. package/CHANGELOG.md +0 -51
  241. package/src/adapters/abstract/application-adapter.d.ts +0 -194
  242. package/src/adapters/abstract/application-adapter.js +0 -121
  243. package/src/adapters/abstract/router-adapter.d.ts +0 -26
  244. package/src/adapters/abstract/router-adapter.js +0 -5
  245. package/src/adapters/abstract/server-adapter.d.ts +0 -69
  246. package/src/adapters/abstract/server-adapter.js +0 -15
  247. package/src/adapters/bun/client-bridge.d.ts +0 -34
  248. package/src/adapters/bun/client-bridge.js +0 -48
  249. package/src/adapters/bun/create-app.d.ts +0 -52
  250. package/src/adapters/bun/create-app.js +0 -116
  251. package/src/adapters/bun/hmr-manager.d.ts +0 -143
  252. package/src/adapters/bun/hmr-manager.js +0 -333
  253. package/src/adapters/bun/index.d.ts +0 -2
  254. package/src/adapters/bun/index.js +0 -8
  255. package/src/adapters/bun/server-adapter.d.ts +0 -155
  256. package/src/adapters/bun/server-adapter.js +0 -374
  257. package/src/adapters/bun/server-lifecycle.d.ts +0 -63
  258. package/src/adapters/bun/server-lifecycle.js +0 -92
  259. package/src/adapters/create-app.d.ts +0 -20
  260. package/src/adapters/create-app.js +0 -66
  261. package/src/adapters/index.d.ts +0 -2
  262. package/src/adapters/index.js +0 -8
  263. package/src/adapters/node/create-app.d.ts +0 -18
  264. package/src/adapters/node/create-app.js +0 -149
  265. package/src/adapters/node/node-client-bridge.d.ts +0 -26
  266. package/src/adapters/node/node-client-bridge.js +0 -66
  267. package/src/adapters/node/node-hmr-manager.d.ts +0 -133
  268. package/src/adapters/node/node-hmr-manager.js +0 -311
  269. package/src/adapters/node/server-adapter.d.ts +0 -161
  270. package/src/adapters/node/server-adapter.js +0 -359
  271. package/src/adapters/node/static-content-server.d.ts +0 -60
  272. package/src/adapters/node/static-content-server.js +0 -194
  273. package/src/adapters/shared/api-response.d.ts +0 -52
  274. package/src/adapters/shared/api-response.js +0 -96
  275. package/src/adapters/shared/application-adapter.d.ts +0 -18
  276. package/src/adapters/shared/application-adapter.js +0 -90
  277. package/src/adapters/shared/define-api-handler.d.ts +0 -25
  278. package/src/adapters/shared/define-api-handler.js +0 -15
  279. package/src/adapters/shared/explicit-static-route-matcher.d.ts +0 -38
  280. package/src/adapters/shared/explicit-static-route-matcher.js +0 -103
  281. package/src/adapters/shared/file-route-middleware-pipeline.d.ts +0 -65
  282. package/src/adapters/shared/file-route-middleware-pipeline.js +0 -99
  283. package/src/adapters/shared/fs-server-response-factory.d.ts +0 -19
  284. package/src/adapters/shared/fs-server-response-factory.js +0 -97
  285. package/src/adapters/shared/fs-server-response-matcher.d.ts +0 -67
  286. package/src/adapters/shared/fs-server-response-matcher.js +0 -147
  287. package/src/adapters/shared/hmr-entrypoint-registrar.d.ts +0 -55
  288. package/src/adapters/shared/hmr-entrypoint-registrar.js +0 -87
  289. package/src/adapters/shared/hmr-html-response.d.ts +0 -22
  290. package/src/adapters/shared/hmr-html-response.js +0 -32
  291. package/src/adapters/shared/render-context.d.ts +0 -15
  292. package/src/adapters/shared/render-context.js +0 -72
  293. package/src/adapters/shared/runtime-bootstrap.d.ts +0 -38
  294. package/src/adapters/shared/runtime-bootstrap.js +0 -43
  295. package/src/adapters/shared/server-adapter.d.ts +0 -97
  296. package/src/adapters/shared/server-adapter.js +0 -390
  297. package/src/adapters/shared/server-route-handler.d.ts +0 -89
  298. package/src/adapters/shared/server-route-handler.js +0 -111
  299. package/src/adapters/shared/server-static-builder.d.ts +0 -70
  300. package/src/adapters/shared/server-static-builder.js +0 -100
  301. package/src/build/build-adapter.d.ts +0 -239
  302. package/src/build/build-adapter.js +0 -642
  303. package/src/build/build-manifest.d.ts +0 -27
  304. package/src/build/build-manifest.js +0 -30
  305. package/src/build/build-types.d.ts +0 -57
  306. package/src/build/build-types.js +0 -0
  307. package/src/build/dev-build-coordinator.d.ts +0 -72
  308. package/src/build/dev-build-coordinator.js +0 -154
  309. package/src/build/esbuild-build-adapter.d.ts +0 -78
  310. package/src/build/esbuild-build-adapter.js +0 -505
  311. package/src/build/runtime-build-executor.d.ts +0 -14
  312. package/src/build/runtime-build-executor.js +0 -22
  313. package/src/build/runtime-specifier-alias-plugin.d.ts +0 -15
  314. package/src/build/runtime-specifier-alias-plugin.js +0 -35
  315. package/src/build/runtime-specifier-aliases.d.ts +0 -5
  316. package/src/build/runtime-specifier-aliases.js +0 -95
  317. package/src/config/config-builder.d.ts +0 -252
  318. package/src/config/config-builder.js +0 -603
  319. package/src/config/constants.js +0 -25
  320. package/src/dev/sc-server.d.ts +0 -30
  321. package/src/dev/sc-server.js +0 -111
  322. package/src/eco/eco.browser.d.ts +0 -2
  323. package/src/eco/eco.browser.js +0 -83
  324. package/src/eco/eco.d.ts +0 -9
  325. package/src/eco/eco.js +0 -85
  326. package/src/eco/eco.types.d.ts +0 -178
  327. package/src/eco/eco.types.js +0 -0
  328. package/src/eco/eco.utils.d.ts +0 -1
  329. package/src/eco/eco.utils.js +0 -10
  330. package/src/eco/global-injector-map.d.ts +0 -16
  331. package/src/eco/global-injector-map.js +0 -80
  332. package/src/eco/lazy-injector-map.d.ts +0 -8
  333. package/src/eco/lazy-injector-map.js +0 -70
  334. package/src/eco/module-dependencies.d.ts +0 -18
  335. package/src/eco/module-dependencies.js +0 -49
  336. package/src/errors/http-error.d.ts +0 -31
  337. package/src/errors/http-error.js +0 -50
  338. package/src/errors/index.js +0 -4
  339. package/src/errors/locals-access-error.d.ts +0 -4
  340. package/src/errors/locals-access-error.js +0 -9
  341. package/src/global/app-logger.d.ts +0 -2
  342. package/src/global/app-logger.js +0 -6
  343. package/src/hmr/client/hmr-runtime.d.ts +0 -5
  344. package/src/hmr/client/hmr-runtime.js +0 -109
  345. package/src/hmr/hmr-strategy.d.ts +0 -162
  346. package/src/hmr/hmr-strategy.js +0 -44
  347. package/src/hmr/hmr.postcss.test.e2e.d.ts +0 -1
  348. package/src/hmr/hmr.postcss.test.e2e.js +0 -31
  349. package/src/hmr/hmr.test.e2e.d.ts +0 -1
  350. package/src/hmr/hmr.test.e2e.js +0 -43
  351. package/src/hmr/strategies/default-hmr-strategy.d.ts +0 -43
  352. package/src/hmr/strategies/default-hmr-strategy.js +0 -34
  353. package/src/hmr/strategies/js-hmr-strategy.d.ts +0 -139
  354. package/src/hmr/strategies/js-hmr-strategy.js +0 -178
  355. package/src/index.browser.d.ts +0 -3
  356. package/src/index.browser.js +0 -4
  357. package/src/index.d.ts +0 -6
  358. package/src/index.js +0 -21
  359. package/src/integrations/ghtml/ghtml-renderer.d.ts +0 -20
  360. package/src/integrations/ghtml/ghtml-renderer.js +0 -63
  361. package/src/integrations/ghtml/ghtml.constants.d.ts +0 -1
  362. package/src/integrations/ghtml/ghtml.constants.js +0 -4
  363. package/src/integrations/ghtml/ghtml.plugin.d.ts +0 -16
  364. package/src/integrations/ghtml/ghtml.plugin.js +0 -20
  365. package/src/plugins/alias-resolver-plugin.d.ts +0 -2
  366. package/src/plugins/alias-resolver-plugin.js +0 -53
  367. package/src/plugins/eco-component-meta-plugin.d.ts +0 -108
  368. package/src/plugins/eco-component-meta-plugin.js +0 -163
  369. package/src/plugins/foreign-jsx-override-plugin.d.ts +0 -31
  370. package/src/plugins/foreign-jsx-override-plugin.js +0 -35
  371. package/src/plugins/integration-plugin.d.ts +0 -219
  372. package/src/plugins/integration-plugin.js +0 -196
  373. package/src/plugins/processor.d.ts +0 -95
  374. package/src/plugins/processor.js +0 -136
  375. package/src/plugins/runtime-capability.js +0 -0
  376. package/src/plugins/source-transform.d.ts +0 -46
  377. package/src/plugins/source-transform.js +0 -71
  378. package/src/route-renderer/orchestration/boundary-planning.service.d.ts +0 -25
  379. package/src/route-renderer/orchestration/boundary-planning.service.js +0 -97
  380. package/src/route-renderer/orchestration/component-render-context.d.ts +0 -83
  381. package/src/route-renderer/orchestration/component-render-context.js +0 -147
  382. package/src/route-renderer/orchestration/integration-renderer.d.ts +0 -554
  383. package/src/route-renderer/orchestration/integration-renderer.js +0 -957
  384. package/src/route-renderer/orchestration/queued-boundary-runtime.service.d.ts +0 -89
  385. package/src/route-renderer/orchestration/queued-boundary-runtime.service.js +0 -155
  386. package/src/route-renderer/orchestration/render-execution.service.d.ts +0 -43
  387. package/src/route-renderer/orchestration/render-execution.service.js +0 -106
  388. package/src/route-renderer/orchestration/render-output.utils.d.ts +0 -46
  389. package/src/route-renderer/orchestration/render-output.utils.js +0 -65
  390. package/src/route-renderer/orchestration/render-preparation.service.d.ts +0 -120
  391. package/src/route-renderer/orchestration/render-preparation.service.js +0 -341
  392. package/src/route-renderer/orchestration/route-shell-composer.service.d.ts +0 -50
  393. package/src/route-renderer/orchestration/route-shell-composer.service.js +0 -81
  394. package/src/route-renderer/orchestration/template-serialization.d.ts +0 -38
  395. package/src/route-renderer/orchestration/template-serialization.js +0 -45
  396. package/src/route-renderer/page-loading/dependency-resolver.d.ts +0 -35
  397. package/src/route-renderer/page-loading/dependency-resolver.js +0 -444
  398. package/src/route-renderer/page-loading/page-module-loader.d.ts +0 -90
  399. package/src/route-renderer/page-loading/page-module-loader.js +0 -127
  400. package/src/route-renderer/route-renderer.d.ts +0 -67
  401. package/src/route-renderer/route-renderer.js +0 -103
  402. package/src/router/client/link-intent.js +0 -34
  403. package/src/router/client/link-intent.test.browser.d.ts +0 -1
  404. package/src/router/client/link-intent.test.browser.js +0 -43
  405. package/src/router/client/navigation-coordinator.d.ts +0 -149
  406. package/src/router/client/navigation-coordinator.js +0 -215
  407. package/src/router/server/fs-router-scanner.d.ts +0 -41
  408. package/src/router/server/fs-router-scanner.js +0 -161
  409. package/src/router/server/fs-router.d.ts +0 -26
  410. package/src/router/server/fs-router.js +0 -100
  411. package/src/services/assets/asset-processing-service/asset-processing.service.d.ts +0 -120
  412. package/src/services/assets/asset-processing-service/asset-processing.service.js +0 -331
  413. package/src/services/assets/asset-processing-service/asset.factory.d.ts +0 -17
  414. package/src/services/assets/asset-processing-service/asset.factory.js +0 -82
  415. package/src/services/assets/asset-processing-service/assets.types.d.ts +0 -89
  416. package/src/services/assets/asset-processing-service/assets.types.js +0 -0
  417. package/src/services/assets/asset-processing-service/browser-runtime-asset.factory.d.ts +0 -55
  418. package/src/services/assets/asset-processing-service/browser-runtime-asset.factory.js +0 -48
  419. package/src/services/assets/asset-processing-service/browser-runtime-entry.factory.d.ts +0 -20
  420. package/src/services/assets/asset-processing-service/browser-runtime-entry.factory.js +0 -41
  421. package/src/services/assets/asset-processing-service/index.d.ts +0 -5
  422. package/src/services/assets/asset-processing-service/index.js +0 -5
  423. package/src/services/assets/asset-processing-service/processor.interface.js +0 -6
  424. package/src/services/assets/asset-processing-service/processor.registry.d.ts +0 -8
  425. package/src/services/assets/asset-processing-service/processor.registry.js +0 -15
  426. package/src/services/assets/asset-processing-service/processors/base/base-processor.d.ts +0 -24
  427. package/src/services/assets/asset-processing-service/processors/base/base-processor.js +0 -64
  428. package/src/services/assets/asset-processing-service/processors/base/base-script-processor.d.ts +0 -17
  429. package/src/services/assets/asset-processing-service/processors/base/base-script-processor.js +0 -72
  430. package/src/services/assets/asset-processing-service/processors/index.d.ts +0 -5
  431. package/src/services/assets/asset-processing-service/processors/index.js +0 -5
  432. package/src/services/assets/asset-processing-service/processors/script/content-script.processor.d.ts +0 -5
  433. package/src/services/assets/asset-processing-service/processors/script/content-script.processor.js +0 -57
  434. package/src/services/assets/asset-processing-service/processors/script/file-script.processor.d.ts +0 -9
  435. package/src/services/assets/asset-processing-service/processors/script/file-script.processor.js +0 -88
  436. package/src/services/assets/asset-processing-service/processors/script/node-module-script.processor.d.ts +0 -7
  437. package/src/services/assets/asset-processing-service/processors/script/node-module-script.processor.js +0 -75
  438. package/src/services/assets/asset-processing-service/processors/stylesheet/content-stylesheet.processor.d.ts +0 -5
  439. package/src/services/assets/asset-processing-service/processors/stylesheet/content-stylesheet.processor.js +0 -25
  440. package/src/services/assets/asset-processing-service/processors/stylesheet/file-stylesheet.processor.d.ts +0 -9
  441. package/src/services/assets/asset-processing-service/processors/stylesheet/file-stylesheet.processor.js +0 -66
  442. package/src/services/assets/browser-bundle.service.d.ts +0 -32
  443. package/src/services/assets/browser-bundle.service.js +0 -33
  444. package/src/services/cache/cache.types.d.ts +0 -107
  445. package/src/services/cache/cache.types.js +0 -0
  446. package/src/services/cache/index.d.ts +0 -7
  447. package/src/services/cache/index.js +0 -7
  448. package/src/services/cache/memory-cache-store.d.ts +0 -42
  449. package/src/services/cache/memory-cache-store.js +0 -98
  450. package/src/services/cache/page-cache-service.d.ts +0 -70
  451. package/src/services/cache/page-cache-service.js +0 -152
  452. package/src/services/cache/page-request-cache-coordinator.service.d.ts +0 -75
  453. package/src/services/cache/page-request-cache-coordinator.service.js +0 -109
  454. package/src/services/html/html-rewriter-provider.service.d.ts +0 -37
  455. package/src/services/html/html-rewriter-provider.service.js +0 -68
  456. package/src/services/html/html-transformer.service.d.ts +0 -77
  457. package/src/services/html/html-transformer.service.js +0 -215
  458. package/src/services/invalidation/development-invalidation.service.d.ts +0 -74
  459. package/src/services/invalidation/development-invalidation.service.js +0 -190
  460. package/src/services/module-loading/app-module-loader.service.d.ts +0 -28
  461. package/src/services/module-loading/app-module-loader.service.js +0 -35
  462. package/src/services/module-loading/app-server-module-transpiler.service.d.ts +0 -24
  463. package/src/services/module-loading/app-server-module-transpiler.service.js +0 -109
  464. package/src/services/module-loading/host-module-loader-registry.d.ts +0 -4
  465. package/src/services/module-loading/host-module-loader-registry.js +0 -15
  466. package/src/services/module-loading/module-loading-types.js +0 -0
  467. package/src/services/module-loading/node-bootstrap-plugin.d.ts +0 -42
  468. package/src/services/module-loading/node-bootstrap-plugin.js +0 -204
  469. package/src/services/module-loading/page-module-import.service.d.ts +0 -76
  470. package/src/services/module-loading/page-module-import.service.js +0 -173
  471. package/src/services/module-loading/server-module-transpiler.service.d.ts +0 -72
  472. package/src/services/module-loading/server-module-transpiler.service.js +0 -64
  473. package/src/services/runtime-state/dev-graph.service.d.ts +0 -118
  474. package/src/services/runtime-state/dev-graph.service.js +0 -162
  475. package/src/services/runtime-state/entrypoint-dependency-graph.service.d.ts +0 -41
  476. package/src/services/runtime-state/entrypoint-dependency-graph.service.js +0 -85
  477. package/src/services/runtime-state/runtime-specifier-registry.service.d.ts +0 -69
  478. package/src/services/runtime-state/runtime-specifier-registry.service.js +0 -37
  479. package/src/services/runtime-state/server-invalidation-state.service.d.ts +0 -26
  480. package/src/services/runtime-state/server-invalidation-state.service.js +0 -35
  481. package/src/services/validation/schema-validation-service.d.ts +0 -122
  482. package/src/services/validation/schema-validation-service.js +0 -101
  483. package/src/services/validation/standard-schema.types.js +0 -0
  484. package/src/static-site-generator/static-site-generator.d.ts +0 -104
  485. package/src/static-site-generator/static-site-generator.js +0 -338
  486. package/src/types/internal-types.d.ts +0 -231
  487. package/src/types/internal-types.js +0 -0
  488. package/src/types/public-types.d.ts +0 -1219
  489. package/src/types/public-types.js +0 -0
  490. package/src/utils/deep-merge.d.ts +0 -14
  491. package/src/utils/deep-merge.js +0 -32
  492. package/src/utils/hash.d.ts +0 -1
  493. package/src/utils/hash.js +0 -7
  494. package/src/utils/html-escaping.d.ts +0 -7
  495. package/src/utils/html-escaping.js +0 -6
  496. package/src/utils/html.js +0 -4
  497. package/src/utils/invariant.d.ts +0 -5
  498. package/src/utils/invariant.js +0 -11
  499. package/src/utils/locals-utils.d.ts +0 -15
  500. package/src/utils/locals-utils.js +0 -24
  501. package/src/utils/parse-cli-args.d.ts +0 -27
  502. package/src/utils/parse-cli-args.js +0 -62
  503. package/src/utils/path-utils.module.d.ts +0 -5
  504. package/src/utils/path-utils.module.js +0 -14
  505. package/src/utils/resolve-work-dir.d.ts +0 -11
  506. package/src/utils/resolve-work-dir.js +0 -31
  507. package/src/utils/runtime.d.ts +0 -11
  508. package/src/utils/runtime.js +0 -40
  509. package/src/utils/server-utils.module.d.ts +0 -19
  510. package/src/utils/server-utils.module.js +0 -56
  511. package/src/watchers/project-watcher.d.ts +0 -136
  512. package/src/watchers/project-watcher.js +0 -275
  513. package/src/watchers/project-watcher.test-helpers.d.ts +0 -4
  514. package/src/watchers/project-watcher.test-helpers.js +0 -52
  515. /package/src/utils/{html.d.ts → html.ts} +0 -0
@@ -0,0 +1,96 @@
1
+ import type { EcoBuildPlugin } from '../../../build/build-types.ts';
2
+ import { AssetFactory } from './asset.factory.ts';
3
+ import type { AssetDefinition } from './assets.types.ts';
4
+ import {
5
+ createBrowserRuntimeEntryModule,
6
+ type BrowserRuntimeEntryModuleConfig,
7
+ } from './browser-runtime-entry.factory.ts';
8
+
9
+ export const BROWSER_RUNTIME_SCRIPT_ATTRIBUTES = {
10
+ type: 'module',
11
+ defer: '',
12
+ } as const;
13
+
14
+ /**
15
+ * Builds the public vendor URL used for generated browser runtime assets.
16
+ */
17
+ export function buildBrowserRuntimeAssetUrl(fileName: string): string {
18
+ return `/${AssetFactory.RESOLVED_ASSETS_VENDORS_DIR}/${fileName}`;
19
+ }
20
+
21
+ /**
22
+ * Declares a browser runtime script asset backed by one importable module.
23
+ *
24
+ * @remarks
25
+ * Runtime assets are emitted as excluded head scripts because integrations often
26
+ * need the bundler output and specifier registration without injecting the raw
27
+ * asset directly into HTML during dependency resolution.
28
+ */
29
+ export function createBrowserRuntimeScriptAsset(options: {
30
+ importPath: string;
31
+ name: string;
32
+ fileName: string;
33
+ bundleOptions?: {
34
+ define?: Record<string, string>;
35
+ minify?: boolean;
36
+ external?: string[];
37
+ naming?: string;
38
+ plugins?: EcoBuildPlugin[];
39
+ };
40
+ attributes?: Record<string, string>;
41
+ }): AssetDefinition {
42
+ return AssetFactory.createNodeModuleScript({
43
+ position: 'head',
44
+ importPath: options.importPath,
45
+ name: options.name,
46
+ packageRole: 'runtime',
47
+ excludeFromHtml: true,
48
+ bundleOptions: {
49
+ naming: options.fileName,
50
+ ...options.bundleOptions,
51
+ },
52
+ attributes: {
53
+ ...BROWSER_RUNTIME_SCRIPT_ATTRIBUTES,
54
+ ...(options.attributes ?? {}),
55
+ },
56
+ });
57
+ }
58
+
59
+ /**
60
+ * Creates a browser runtime asset from a generated re-export entry module.
61
+ *
62
+ * @remarks
63
+ * This is the shared "module list -> generated entry file -> runtime asset"
64
+ * path used by integrations that need browser-side runtime bundles without
65
+ * owning bespoke entry-file generation logic.
66
+ */
67
+ export function createBrowserRuntimeModuleAsset(options: {
68
+ modules: BrowserRuntimeEntryModuleConfig[];
69
+ name: string;
70
+ fileName: string;
71
+ cacheDirName?: string;
72
+ rootDir?: string;
73
+ bundleOptions?: {
74
+ define?: Record<string, string>;
75
+ minify?: boolean;
76
+ external?: string[];
77
+ naming?: string;
78
+ plugins?: EcoBuildPlugin[];
79
+ };
80
+ attributes?: Record<string, string>;
81
+ }): AssetDefinition {
82
+ const importPath = createBrowserRuntimeEntryModule({
83
+ modules: options.modules,
84
+ fileName: `${options.name}-entry.mjs`,
85
+ rootDir: options.rootDir,
86
+ cacheDirName: options.cacheDirName,
87
+ });
88
+
89
+ return createBrowserRuntimeScriptAsset({
90
+ importPath,
91
+ name: options.name,
92
+ fileName: options.fileName,
93
+ bundleOptions: options.bundleOptions,
94
+ attributes: options.attributes,
95
+ });
96
+ }
@@ -0,0 +1,67 @@
1
+ import assert from 'node:assert/strict';
2
+ import fs from 'node:fs';
3
+ import path from 'node:path';
4
+ import { tmpdir } from 'node:os';
5
+ import { test } from 'vitest';
6
+ import { createBrowserRuntimeEntryModule } from './browser-runtime-entry.factory.ts';
7
+
8
+ test('createBrowserRuntimeEntryModule writes a shared runtime entry file', () => {
9
+ const rootDir = fs.mkdtempSync(path.join(tmpdir(), 'eco-browser-runtime-entry-'));
10
+ fs.writeFileSync(path.join(rootDir, 'package.json'), '{}', 'utf8');
11
+
12
+ try {
13
+ const filePath = createBrowserRuntimeEntryModule({
14
+ rootDir,
15
+ cacheDirName: 'ecopages-react-runtime-test',
16
+ fileName: 'runtime-entry.mjs',
17
+ modules: [{ specifier: 'node:path' }, { specifier: 'node:fs' }],
18
+ });
19
+
20
+ assert.equal(path.basename(filePath), 'runtime-entry.mjs');
21
+ assert.equal(
22
+ filePath,
23
+ path.join(rootDir, 'node_modules', '.cache', 'ecopages-react-runtime-test', 'runtime-entry.mjs'),
24
+ );
25
+
26
+ const contents = fs.readFileSync(filePath, 'utf8');
27
+ assert.match(contents, /export \{ .*basename.* \} from 'node:path';/);
28
+ assert.match(contents, /export \{ .*readFileSync.* \} from 'node:fs';/);
29
+ } finally {
30
+ fs.rmSync(rootDir, { recursive: true, force: true });
31
+ }
32
+ });
33
+
34
+ test('createBrowserRuntimeEntryModule preserves a default export and deduplicates named exports', () => {
35
+ const rootDir = fs.mkdtempSync(path.join(tmpdir(), 'eco-browser-runtime-entry-'));
36
+ fs.writeFileSync(path.join(rootDir, 'package.json'), '{}', 'utf8');
37
+ fs.mkdirSync(path.join(rootDir, 'node_modules', 'runtime-a'), { recursive: true });
38
+ fs.mkdirSync(path.join(rootDir, 'node_modules', 'runtime-b'), { recursive: true });
39
+ fs.writeFileSync(
40
+ path.join(rootDir, 'node_modules', 'runtime-a', 'index.js'),
41
+ "module.exports = { default: 'runtime-a', alpha: 'a', shared: 'shared-a' };",
42
+ 'utf8',
43
+ );
44
+ fs.writeFileSync(
45
+ path.join(rootDir, 'node_modules', 'runtime-b', 'index.js'),
46
+ "module.exports = { beta: 'b', shared: 'shared-b' };",
47
+ 'utf8',
48
+ );
49
+
50
+ try {
51
+ const filePath = createBrowserRuntimeEntryModule({
52
+ rootDir,
53
+ cacheDirName: 'ecopages-react-runtime-test',
54
+ fileName: 'runtime-entry.mjs',
55
+ modules: [{ specifier: 'runtime-a', defaultExport: true }, { specifier: 'runtime-b' }],
56
+ });
57
+
58
+ const contents = fs.readFileSync(filePath, 'utf8');
59
+ assert.match(contents, /import __ecopages_default_export__ from 'runtime-a';/);
60
+ assert.match(contents, /export default __ecopages_default_export__;/);
61
+ assert.match(contents, /export \{ alpha, shared \} from 'runtime-a';/);
62
+ assert.match(contents, /export \{ beta \} from 'runtime-b';/);
63
+ assert.doesNotMatch(contents, /export \{ .*shared.* \} from 'runtime-b';/);
64
+ } finally {
65
+ fs.rmSync(rootDir, { recursive: true, force: true });
66
+ }
67
+ });
@@ -0,0 +1,78 @@
1
+ import fs from 'node:fs';
2
+ import path from 'node:path';
3
+ import { createRequire } from 'node:module';
4
+
5
+ export type BrowserRuntimeEntryModuleConfig = {
6
+ specifier: string;
7
+ defaultExport?: boolean;
8
+ };
9
+
10
+ /**
11
+ * Creates a generated ESM entry module that re-exports runtime modules through
12
+ * one stable file.
13
+ *
14
+ * @remarks
15
+ * Integrations use this helper when they need a browser runtime asset composed
16
+ * from multiple bare specifiers but do not want to own temporary file assembly
17
+ * logic themselves. The generated file lives under a cache directory inside the
18
+ * consuming app root so repeated runs can reuse the same location.
19
+ */
20
+ export function createBrowserRuntimeEntryModule(options: {
21
+ modules: BrowserRuntimeEntryModuleConfig[];
22
+ fileName: string;
23
+ rootDir?: string;
24
+ cacheDirName?: string;
25
+ }): string {
26
+ const rootDir = options.rootDir ?? process.cwd();
27
+ const artifactsDir = path.join(
28
+ rootDir,
29
+ 'node_modules',
30
+ '.cache',
31
+ options.cacheDirName ?? 'ecopages-browser-runtime',
32
+ );
33
+ fs.mkdirSync(artifactsDir, { recursive: true });
34
+
35
+ const requireFromRoot = createRequire(path.join(rootDir, 'package.json'));
36
+ const seenExports = new Set<string>();
37
+ const statements: string[] = [];
38
+
39
+ for (const module of options.modules) {
40
+ if (module.defaultExport) {
41
+ statements.push(`import __ecopages_default_export__ from '${module.specifier}';`);
42
+ statements.push('export default __ecopages_default_export__;');
43
+ }
44
+
45
+ const exportNames = getModuleExportNames(module.specifier, requireFromRoot).filter(
46
+ (name) => !seenExports.has(name),
47
+ );
48
+
49
+ if (exportNames.length > 0) {
50
+ statements.push(`export { ${exportNames.join(', ')} } from '${module.specifier}';`);
51
+ for (const exportName of exportNames) {
52
+ seenExports.add(exportName);
53
+ }
54
+ }
55
+ }
56
+
57
+ const filePath = path.join(artifactsDir, options.fileName);
58
+ fs.writeFileSync(filePath, statements.join('\n'), 'utf-8');
59
+ return filePath;
60
+ }
61
+
62
+ /**
63
+ * Reads the named runtime exports that should be re-exported from a generated
64
+ * runtime entry module.
65
+ *
66
+ * @remarks
67
+ * Default exports are handled separately because generated runtime entry files
68
+ * need to emit a synthetic default binding only when the caller explicitly asks
69
+ * for it.
70
+ */
71
+ function getModuleExportNames(specifier: string, requireFromRoot: ReturnType<typeof createRequire>): string[] {
72
+ const moduleExports = requireFromRoot(specifier);
73
+
74
+ return Object.keys(moduleExports)
75
+ .filter((name) => name !== '__esModule' && name !== 'default')
76
+ .filter((name) => /^[$A-Z_a-z][$\w]*$/.test(name))
77
+ .sort();
78
+ }
@@ -0,0 +1,104 @@
1
+ import type { AssetDefinition, ProcessedAsset } from './assets.types.ts';
2
+
3
+ /**
4
+ * Splits grouped content-script dependencies from ordinary dependencies so callers can
5
+ * route them through `processGrouped` without changing ordering for the remaining assets.
6
+ */
7
+ export function partitionGroupedContentScriptDependencies(typeDeps: AssetDefinition[]): {
8
+ groupedBundleDeps: Map<string, AssetDefinition[]>;
9
+ ungroupedDeps: AssetDefinition[];
10
+ } {
11
+ const groupedBundleDeps = new Map<string, AssetDefinition[]>();
12
+ const ungroupedDeps: AssetDefinition[] = [];
13
+
14
+ for (const dep of typeDeps) {
15
+ if (dep.kind === 'script' && dep.source === 'content' && dep.groupedBundle?.id) {
16
+ const existing = groupedBundleDeps.get(dep.groupedBundle.id) ?? [];
17
+ existing.push(dep);
18
+ groupedBundleDeps.set(dep.groupedBundle.id, existing);
19
+ continue;
20
+ }
21
+
22
+ ungroupedDeps.push(dep);
23
+ }
24
+
25
+ return {
26
+ groupedBundleDeps,
27
+ ungroupedDeps,
28
+ };
29
+ }
30
+
31
+ type GroupedBundleProcessor = {
32
+ processGrouped?: (deps: AssetDefinition[]) => Promise<ProcessedAsset[]>;
33
+ };
34
+
35
+ type ProcessGroupedDependencyBundlesOptions = {
36
+ bundles: AssetDefinition[][];
37
+ key: string;
38
+ getCachedAsset: (dep: AssetDefinition, depKey: string) => ProcessedAsset | null;
39
+ getDependencyKey: (dep: AssetDefinition) => string;
40
+ getGroupedProcessor: () => GroupedBundleProcessor | undefined;
41
+ resolveProcessedAssetSrcUrl: (processed: ProcessedAsset) => string | undefined;
42
+ setCachedAsset: (dep: AssetDefinition, depKey: string, processed: ProcessedAsset) => void;
43
+ logError: (error: unknown) => void;
44
+ };
45
+
46
+ /**
47
+ * Processes grouped content-script bundles while preserving per-entry cache keys.
48
+ *
49
+ * When every dependency in a bundle already has a cached processed asset, the cached
50
+ * entries are returned directly and the grouped processor is skipped.
51
+ */
52
+ export async function processGroupedDependencyBundles(
53
+ options: ProcessGroupedDependencyBundlesOptions,
54
+ ): Promise<ProcessedAsset[]> {
55
+ const {
56
+ bundles,
57
+ key,
58
+ getCachedAsset,
59
+ getDependencyKey,
60
+ getGroupedProcessor,
61
+ resolveProcessedAssetSrcUrl,
62
+ setCachedAsset,
63
+ logError,
64
+ } = options;
65
+
66
+ const groupedPromises = bundles.map(async (bundleDeps) => {
67
+ const cachedResults = bundleDeps.map((dep) => {
68
+ const cached = getCachedAsset(dep, getDependencyKey(dep));
69
+ return cached ? ({ key, ...cached } as ProcessedAsset) : null;
70
+ });
71
+
72
+ if (cachedResults.every((result) => result !== null)) {
73
+ return cachedResults.filter((result): result is ProcessedAsset => result !== null);
74
+ }
75
+
76
+ const processor = getGroupedProcessor();
77
+ if (!processor?.processGrouped) {
78
+ return [];
79
+ }
80
+
81
+ try {
82
+ const processedResults = await processor.processGrouped(bundleDeps);
83
+
84
+ return processedResults.map((processed, index) => {
85
+ const dep = bundleDeps[index]!;
86
+ const depKey = getDependencyKey(dep);
87
+ const srcUrl = resolveProcessedAssetSrcUrl(processed);
88
+ const processedWithKey = {
89
+ key,
90
+ ...processed,
91
+ srcUrl,
92
+ };
93
+
94
+ setCachedAsset(dep, depKey, processedWithKey);
95
+ return processedWithKey as ProcessedAsset;
96
+ });
97
+ } catch (error) {
98
+ logError(error);
99
+ return [];
100
+ }
101
+ });
102
+
103
+ return (await Promise.all(groupedPromises)).flat();
104
+ }
@@ -0,0 +1,5 @@
1
+ export * from './asset.factory.ts';
2
+ export * from './asset-processing.service.ts';
3
+ export * from './assets.types.ts';
4
+ export * from './browser-runtime-asset.factory.ts';
5
+ export * from './browser-runtime-entry.factory.ts';
@@ -1,22 +1,27 @@
1
- import type { IHmrManager } from '../../../types/internal-types.js';
2
- import type { AssetDefinition, ProcessedAsset } from './assets.types.js';
1
+ import type { IHmrManager } from '../../../types/internal-types.ts';
2
+ import type { AssetDefinition, ProcessedAsset } from './assets.types.ts';
3
+
3
4
  /**
4
5
  * Base interface for asset processors.
5
6
  * Processors transform asset definitions into processed assets.
6
7
  */
7
8
  export interface AssetProcessor<T extends AssetDefinition = AssetDefinition> {
8
- process(asset: T): Promise<ProcessedAsset>;
9
+ process(asset: T): Promise<ProcessedAsset>;
9
10
  }
11
+
10
12
  /**
11
13
  * Interface for processors that support HMR (Hot Module Replacement).
12
14
  * These processors can receive an HMR manager to enable hot reloading capabilities.
13
15
  */
14
16
  export interface HmrAwareProcessor extends AssetProcessor {
15
- setHmrManager(hmrManager: IHmrManager): void;
17
+ setHmrManager(hmrManager: IHmrManager): void;
16
18
  }
19
+
17
20
  /**
18
21
  * Type guard to check if a processor supports HMR.
19
22
  * @param processor - The processor to check
20
23
  * @returns True if the processor implements HmrAwareProcessor
21
24
  */
22
- export declare function isHmrAware(processor: AssetProcessor): processor is HmrAwareProcessor;
25
+ export function isHmrAware(processor: AssetProcessor): processor is HmrAwareProcessor {
26
+ return 'setHmrManager' in processor && typeof (processor as HmrAwareProcessor).setHmrManager === 'function';
27
+ }
@@ -0,0 +1,18 @@
1
+ import type { AssetKind, AssetSource } from './assets.types.ts';
2
+ import type { BaseProcessor } from './processors/base/base-processor.ts';
3
+
4
+ export class ProcessorRegistry {
5
+ private processors = new Map<`${AssetKind}-${AssetSource}`, BaseProcessor<any>>();
6
+
7
+ register(kind: AssetKind, variant: AssetSource, processor: BaseProcessor<any>) {
8
+ this.processors.set(`${kind}-${variant}`, processor);
9
+ }
10
+
11
+ getProcessor(kind: AssetKind, variant: AssetSource): BaseProcessor<any> | undefined {
12
+ return this.processors.get(`${kind}-${variant}`);
13
+ }
14
+
15
+ getAllProcessors(): Map<`${AssetKind}-${AssetSource}`, BaseProcessor<any>> {
16
+ return this.processors;
17
+ }
18
+ }
@@ -0,0 +1,59 @@
1
+ import { afterEach, beforeEach, expect, test, vi } from 'vitest';
2
+ import { fileSystem } from '@ecopages/file-system';
3
+ import type { BaseAsset, ProcessedAsset } from '../../assets.types.ts';
4
+ import { BaseProcessor } from './base-processor.ts';
5
+
6
+ type TestAsset = BaseAsset & {
7
+ name: string;
8
+ };
9
+
10
+ class TestProcessor extends BaseProcessor<TestAsset> {
11
+ processCalls = 0;
12
+
13
+ async process(dep: TestAsset): Promise<ProcessedAsset> {
14
+ return this.getOrProcess(dep.name, async () => {
15
+ this.processCalls += 1;
16
+ return {
17
+ filepath: `/test/dist/assets/${dep.name}.js`,
18
+ kind: dep.kind,
19
+ inline: false,
20
+ };
21
+ });
22
+ }
23
+ }
24
+
25
+ const originalExists = fileSystem.exists;
26
+
27
+ beforeEach(() => {
28
+ fileSystem.exists = vi.fn(() => true);
29
+ });
30
+
31
+ afterEach(() => {
32
+ fileSystem.exists = originalExists;
33
+ vi.restoreAllMocks();
34
+ });
35
+
36
+ test('BaseProcessor - rebuilds cached outputs when emitted file was deleted', async () => {
37
+ const existsMock = vi
38
+ .fn()
39
+ .mockImplementationOnce(() => false)
40
+ .mockImplementation(() => true);
41
+ fileSystem.exists = existsMock;
42
+
43
+ const processor = new TestProcessor({
44
+ appConfig: {
45
+ absolutePaths: { distDir: '/test/dist' },
46
+ } as any,
47
+ });
48
+
49
+ const asset: TestAsset = {
50
+ kind: 'script',
51
+ source: 'file',
52
+ name: 'runtime-vendor',
53
+ };
54
+
55
+ await processor.process(asset);
56
+ await processor.process(asset);
57
+
58
+ expect(processor.processCalls).toBe(2);
59
+ });
@@ -0,0 +1,83 @@
1
+ import path from 'node:path';
2
+ import { RESOLVED_ASSETS_DIR } from '../../../../../config/constants.ts';
3
+ import type { EcoPagesAppConfig } from '../../../../../types/internal-types.ts';
4
+ import { rapidhash } from '../../../../../utils/hash.ts';
5
+ import { isDevelopmentRuntime, isProductionRuntime } from '../../../../../utils/runtime.ts';
6
+ import type { BaseAsset, ProcessedAsset } from '../../assets.types.ts';
7
+ import { fileSystem } from '@ecopages/file-system';
8
+
9
+ export abstract class BaseProcessor<T extends BaseAsset> {
10
+ protected appConfig: EcoPagesAppConfig;
11
+ /**
12
+ * Cache for processed assets to avoid reprocessing the same asset multiple times.
13
+ * The cache key is a combination of the asset name and its hash.
14
+ * The cache value is the processed asset.
15
+ */
16
+ protected cache: Map<string, ProcessedAsset> = new Map();
17
+
18
+ constructor({ appConfig }: { appConfig: EcoPagesAppConfig }) {
19
+ this.appConfig = appConfig;
20
+ }
21
+
22
+ get isDevelopment(): boolean {
23
+ return isDevelopmentRuntime();
24
+ }
25
+
26
+ get isProduction(): boolean {
27
+ return isProductionRuntime();
28
+ }
29
+
30
+ abstract process(dep: T): Promise<ProcessedAsset>;
31
+
32
+ protected getAssetsDir(): string {
33
+ return path.join(this.appConfig.absolutePaths.distDir, RESOLVED_ASSETS_DIR);
34
+ }
35
+
36
+ protected writeCacheFile(key: string, path: ProcessedAsset): void {
37
+ this.cache.set(key, path);
38
+ }
39
+
40
+ protected getCacheFile(key: string): ProcessedAsset | undefined {
41
+ return this.cache.get(key);
42
+ }
43
+
44
+ protected hasCacheFile(key: string): boolean {
45
+ return this.cache.has(key);
46
+ }
47
+
48
+ protected generateHash(content: string): string {
49
+ return rapidhash(content).toString();
50
+ }
51
+
52
+ protected buildCacheKey(identifier: string, contentHash: string, dep: T): string {
53
+ const attrsHash = dep.attributes ? this.generateHash(JSON.stringify(dep.attributes)) : '';
54
+ const position = dep.position ?? '';
55
+ const packageRole = dep.packageRole ?? '';
56
+ return `${identifier}:${contentHash}:${position}:${attrsHash}:${packageRole}`;
57
+ }
58
+
59
+ protected getOrProcess(
60
+ cacheKey: string,
61
+ processFn: () => ProcessedAsset | Promise<ProcessedAsset>,
62
+ ): Promise<ProcessedAsset> {
63
+ if (this.hasCacheFile(cacheKey)) {
64
+ const cached = this.getCacheFile(cacheKey) as ProcessedAsset;
65
+ if (!cached.filepath || fileSystem.exists(cached.filepath)) {
66
+ return Promise.resolve(cached);
67
+ }
68
+
69
+ this.cache.delete(cacheKey);
70
+ }
71
+
72
+ const result = processFn();
73
+ if (result instanceof Promise) {
74
+ return result.then((asset) => {
75
+ this.writeCacheFile(cacheKey, asset);
76
+ return asset;
77
+ });
78
+ }
79
+
80
+ this.writeCacheFile(cacheKey, result);
81
+ return Promise.resolve(result);
82
+ }
83
+ }