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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (590) hide show
  1. package/README.md +2 -3
  2. package/package.json +97 -182
  3. package/src/adapters/abstract/application-adapter.test.ts +218 -0
  4. package/src/adapters/abstract/application-adapter.ts +379 -0
  5. package/src/adapters/abstract/router-adapter.ts +30 -0
  6. package/src/adapters/abstract/server-adapter.ts +79 -0
  7. package/src/adapters/bun/client-bridge.ts +62 -0
  8. package/src/adapters/bun/create-app.ts +214 -0
  9. package/src/adapters/bun/hmr-manager.test.ts +265 -0
  10. package/src/adapters/bun/hmr-manager.ts +88 -0
  11. package/src/adapters/bun/index.ts +2 -0
  12. package/src/adapters/bun/runtime-host.ts +76 -0
  13. package/src/adapters/bun/server-adapter.ts +605 -0
  14. package/src/adapters/bun/static-preview-host.ts +70 -0
  15. package/src/adapters/create-app.test.ts +10 -0
  16. package/src/adapters/create-app.ts +91 -0
  17. package/src/adapters/index.ts +2 -0
  18. package/src/adapters/node/create-app.test.ts +76 -0
  19. package/src/adapters/node/create-app.ts +116 -0
  20. package/src/adapters/node/http-request-bridge.test.ts +146 -0
  21. package/src/adapters/node/http-request-bridge.ts +176 -0
  22. package/src/adapters/node/node-client-bridge.test.ts +198 -0
  23. package/src/adapters/node/node-client-bridge.ts +79 -0
  24. package/src/adapters/node/node-hmr-manager.test.ts +374 -0
  25. package/src/adapters/node/node-hmr-manager.ts +72 -0
  26. package/src/adapters/node/runtime-host.test.ts +49 -0
  27. package/src/adapters/node/runtime-host.ts +113 -0
  28. package/src/adapters/node/server-adapter-dependencies.ts +28 -0
  29. package/src/adapters/node/server-adapter.test.ts +84 -0
  30. package/src/adapters/node/server-adapter.ts +423 -0
  31. package/src/adapters/node/static-content-server.test.ts +60 -0
  32. package/src/adapters/node/static-content-server.ts +239 -0
  33. package/src/adapters/node/static-preview-host.test.ts +89 -0
  34. package/src/adapters/node/static-preview-host.ts +101 -0
  35. package/src/adapters/shared/api-response.test.ts +97 -0
  36. package/src/adapters/shared/api-response.ts +104 -0
  37. package/src/adapters/shared/application-adapter.ts +199 -0
  38. package/src/adapters/shared/define-api-handler.ts +66 -0
  39. package/src/adapters/shared/explicit-static-render-preparation.ts +58 -0
  40. package/src/adapters/shared/explicit-static-route-matcher.test.ts +381 -0
  41. package/src/adapters/shared/explicit-static-route-matcher.ts +131 -0
  42. package/src/adapters/shared/file-route-middleware-pipeline.test.ts +85 -0
  43. package/src/adapters/shared/file-route-middleware-pipeline.ts +118 -0
  44. package/src/adapters/shared/fs-server-response-factory.test.ts +176 -0
  45. package/src/adapters/shared/fs-server-response-factory.ts +96 -0
  46. package/src/adapters/shared/fs-server-response-matcher.test.ts +311 -0
  47. package/src/adapters/shared/fs-server-response-matcher.ts +240 -0
  48. package/src/adapters/shared/hmr-entrypoint-registrar.ts +149 -0
  49. package/src/adapters/shared/hmr-html-response.ts +54 -0
  50. package/src/adapters/shared/hmr-manager.contract.test.ts +228 -0
  51. package/src/adapters/shared/hmr-manager.dispatch.test.ts +229 -0
  52. package/src/adapters/shared/render-context.test.ts +244 -0
  53. package/src/adapters/shared/render-context.ts +161 -0
  54. package/src/adapters/shared/runtime-app-bootstrap.test.ts +96 -0
  55. package/src/adapters/shared/runtime-app-bootstrap.ts +72 -0
  56. package/src/adapters/shared/runtime-host.ts +11 -0
  57. package/src/adapters/shared/server-adapter.test.ts +130 -0
  58. package/src/adapters/shared/server-adapter.ts +571 -0
  59. package/src/adapters/shared/server-route-handler.test.ts +112 -0
  60. package/src/adapters/shared/server-route-handler.ts +153 -0
  61. package/src/adapters/shared/server-static-builder.test.ts +338 -0
  62. package/src/adapters/shared/server-static-builder.ts +170 -0
  63. package/src/adapters/shared/shared-hmr-manager.ts +298 -0
  64. package/src/adapters/shared/static-preview-host.ts +12 -0
  65. package/src/build/README.md +57 -73
  66. package/src/build/browser-runtime-manifest.test.ts +121 -0
  67. package/src/build/browser-runtime-manifest.ts +105 -0
  68. package/src/build/browser-runtime-plugin-helpers.test.ts +49 -0
  69. package/src/build/browser-runtime-plugin-helpers.ts +37 -0
  70. package/src/build/browser-runtime-plugin.test.ts +256 -0
  71. package/src/build/browser-runtime-plugin.ts +306 -0
  72. package/src/build/build-adapter.test.ts +463 -0
  73. package/src/build/build-adapter.ts +788 -0
  74. package/src/build/build-manifest.ts +79 -0
  75. package/src/build/build-types.ts +83 -0
  76. package/src/build/rolldown-build-adapter.test.ts +352 -0
  77. package/src/build/rolldown-build-adapter.ts +363 -0
  78. package/src/build/rolldown-plugin-bridge.test.ts +256 -0
  79. package/src/build/rolldown-plugin-bridge.ts +309 -0
  80. package/src/build/runtime-build-executor.test.ts +130 -0
  81. package/src/build/runtime-build-executor.ts +37 -0
  82. package/src/build/runtime-build-output-normalizer.ts +137 -0
  83. package/src/build/serialized-build-executor.test.ts +96 -0
  84. package/src/build/serialized-build-executor.ts +90 -0
  85. package/src/build/server-side-css-shim-plugin.ts +77 -0
  86. package/src/cache/index.ts +6 -0
  87. package/src/cache/module-parse-cache.test.ts +73 -0
  88. package/src/cache/module-parse-cache.ts +137 -0
  89. package/src/config/README.md +1 -1
  90. package/src/config/config-builder.test.ts +456 -0
  91. package/src/config/config-builder.ts +728 -0
  92. package/src/config/config-builder.typecheck.test.ts +96 -0
  93. package/src/config/{constants.d.ts → constants.ts} +22 -13
  94. package/src/dev/host-runtime.ts +34 -0
  95. package/src/dev/sc-server.ts +143 -0
  96. package/src/eco/eco.browser.test.ts +43 -0
  97. package/src/eco/eco.browser.ts +137 -0
  98. package/src/eco/eco.test.ts +781 -0
  99. package/src/eco/eco.ts +262 -0
  100. package/src/eco/eco.types.ts +293 -0
  101. package/src/eco/eco.utils.test.ts +219 -0
  102. package/src/eco/eco.utils.ts +5 -0
  103. package/src/eco/global-injector-map.test.ts +42 -0
  104. package/src/eco/global-injector-map.ts +112 -0
  105. package/src/eco/lazy-injector-map.test.ts +66 -0
  106. package/src/eco/lazy-injector-map.ts +120 -0
  107. package/src/eco/module-dependencies.test.ts +30 -0
  108. package/src/eco/module-dependencies.ts +75 -0
  109. package/src/errors/http-error.test.ts +134 -0
  110. package/src/errors/http-error.ts +72 -0
  111. package/src/errors/index.ts +3 -0
  112. package/src/errors/locals-access-error.ts +7 -0
  113. package/src/global/app-logger.ts +4 -0
  114. package/src/global/utils.test.ts +12 -0
  115. package/src/hmr/client/__screenshots__/hmr-runtime.test.browser.ts/HMR-Runtime-HMR-Server-Integration-should-have-HMR-script-injected-in-page-1.png +0 -0
  116. package/src/hmr/client/__screenshots__/hmr-runtime.test.browser.ts/HMR-Runtime-HMR-Server-Integration-should-load-fixture-app-page-1.png +0 -0
  117. package/src/hmr/client/__screenshots__/hmr-runtime.test.browser.ts/HMR-Runtime-WebSocket-Connection-should-connect-to-correct-HMR-endpoint-1.png +0 -0
  118. package/src/hmr/client/hmr-runtime.ts +162 -0
  119. package/src/hmr/hmr-strategy.test.ts +124 -0
  120. package/src/hmr/hmr-strategy.ts +177 -0
  121. package/src/hmr/hmr.postcss.test.e2e.ts +41 -0
  122. package/src/hmr/hmr.test.e2e.ts +66 -0
  123. package/src/hmr/strategies/default-hmr-strategy.ts +60 -0
  124. package/src/hmr/strategies/js-hmr-strategy.test.ts +344 -0
  125. package/src/hmr/strategies/js-hmr-strategy.ts +307 -0
  126. package/src/index.browser.ts +3 -0
  127. package/src/index.ts +15 -0
  128. package/src/integrations/ghtml/ghtml-renderer.test.ts +253 -0
  129. package/src/integrations/ghtml/ghtml-renderer.ts +87 -0
  130. package/src/integrations/ghtml/ghtml.constants.ts +1 -0
  131. package/src/integrations/ghtml/ghtml.plugin.ts +28 -0
  132. package/src/plugins/alias-resolver-cache.test.ts +110 -0
  133. package/src/plugins/alias-resolver-cache.ts +145 -0
  134. package/src/plugins/alias-resolver-plugin.test.ts +41 -0
  135. package/src/plugins/alias-resolver-plugin.ts +75 -0
  136. package/src/plugins/eco-component-meta-plugin.test.ts +421 -0
  137. package/src/plugins/eco-component-meta-plugin.ts +518 -0
  138. package/src/plugins/foreign-jsx-override-plugin.test.ts +65 -0
  139. package/src/plugins/foreign-jsx-override-plugin.ts +76 -0
  140. package/src/plugins/integration-plugin.test.ts +151 -0
  141. package/src/plugins/integration-plugin.ts +344 -0
  142. package/src/plugins/processor.test.ts +148 -0
  143. package/src/plugins/processor.ts +257 -0
  144. package/src/plugins/{runtime-capability.d.ts → runtime-capability.ts} +8 -3
  145. package/src/plugins/source-transform.test.ts +82 -0
  146. package/src/plugins/source-transform.ts +123 -0
  147. package/src/route-renderer/orchestration/component-render-context.ts +338 -0
  148. package/src/route-renderer/orchestration/declared-ownership-graph.ts +62 -0
  149. package/src/route-renderer/orchestration/foreign-subtree-execution.service.ts +431 -0
  150. package/src/route-renderer/orchestration/integration-renderer.test.ts +2251 -0
  151. package/src/route-renderer/orchestration/integration-renderer.ts +1384 -0
  152. package/src/route-renderer/orchestration/ownership-planning.service.ts +97 -0
  153. package/src/route-renderer/orchestration/ownership-validation.service.ts +76 -0
  154. package/src/route-renderer/orchestration/processed-asset-dedupe.ts +29 -0
  155. package/src/route-renderer/orchestration/queued-foreign-subtree-resolution.service.test.ts +435 -0
  156. package/src/route-renderer/orchestration/queued-foreign-subtree-resolution.service.ts +310 -0
  157. package/src/route-renderer/orchestration/render-output.utils.ts +310 -0
  158. package/src/route-renderer/orchestration/route-render-orchestrator.prepare-render-options.test.ts +1365 -0
  159. package/src/route-renderer/orchestration/route-render-orchestrator.test.ts +267 -0
  160. package/src/route-renderer/orchestration/route-render-orchestrator.ts +879 -0
  161. package/src/route-renderer/orchestration/template-serialization.test.ts +110 -0
  162. package/src/route-renderer/orchestration/template-serialization.ts +117 -0
  163. package/src/route-renderer/page-loading/component-dependency-collection.ts +202 -0
  164. package/src/route-renderer/page-loading/declared-asset-collection.ts +153 -0
  165. package/src/route-renderer/page-loading/dependency-resolver.test.ts +761 -0
  166. package/src/route-renderer/page-loading/dependency-resolver.ts +144 -0
  167. package/src/route-renderer/page-loading/ecopages-virtual-imports.ts +75 -0
  168. package/src/route-renderer/page-loading/lazy-entry-collection.ts +167 -0
  169. package/src/route-renderer/page-loading/lazy-trigger-planning.ts +74 -0
  170. package/src/route-renderer/page-loading/module-declaration-aggregation.ts +60 -0
  171. package/src/route-renderer/page-loading/module-declaration-scripts.ts +16 -0
  172. package/src/route-renderer/page-loading/page-dependency-bundling.ts +244 -0
  173. package/src/route-renderer/page-loading/page-module-loader.test.ts +183 -0
  174. package/src/route-renderer/page-loading/page-module-loader.ts +184 -0
  175. package/src/route-renderer/route-renderer.ts +133 -0
  176. package/src/router/client/link-intent.test.browser.ts +51 -0
  177. package/src/router/client/link-intent.ts +92 -0
  178. package/src/router/client/navigation-coordinator.test.ts +237 -0
  179. package/src/router/client/navigation-coordinator.ts +453 -0
  180. package/src/router/server/route-registry.test.ts +176 -0
  181. package/src/router/server/route-registry.ts +382 -0
  182. package/src/services/assets/asset-processing-service/asset-dependency-keys.ts +66 -0
  183. package/src/services/assets/asset-processing-service/asset-processing.service.test.ts +473 -0
  184. package/src/services/assets/asset-processing-service/asset-processing.service.ts +344 -0
  185. package/src/services/assets/asset-processing-service/asset.factory.test.ts +63 -0
  186. package/src/services/assets/asset-processing-service/asset.factory.ts +105 -0
  187. package/src/services/assets/asset-processing-service/assets.types.ts +128 -0
  188. package/src/services/assets/asset-processing-service/browser-runtime-asset.factory.test.ts +74 -0
  189. package/src/services/assets/asset-processing-service/browser-runtime-asset.factory.ts +98 -0
  190. package/src/services/assets/asset-processing-service/browser-runtime-entry.factory.test.ts +67 -0
  191. package/src/services/assets/asset-processing-service/browser-runtime-entry.factory.ts +78 -0
  192. package/src/services/assets/asset-processing-service/grouped-content-bundles.ts +104 -0
  193. package/src/services/assets/asset-processing-service/index.ts +6 -0
  194. package/src/services/assets/asset-processing-service/page-package.test.ts +135 -0
  195. package/src/services/assets/asset-processing-service/page-package.ts +103 -0
  196. package/src/services/assets/asset-processing-service/{processor.interface.d.ts → processor.interface.ts} +10 -5
  197. package/src/services/assets/asset-processing-service/processor.registry.ts +18 -0
  198. package/src/services/assets/asset-processing-service/processors/base/base-processor.test.ts +59 -0
  199. package/src/services/assets/asset-processing-service/processors/base/base-processor.ts +83 -0
  200. package/src/services/assets/asset-processing-service/processors/base/base-script-processor.ts +173 -0
  201. package/src/services/assets/asset-processing-service/processors/index.ts +5 -0
  202. package/src/services/assets/asset-processing-service/processors/script/content-script.processor.test.ts +188 -0
  203. package/src/services/assets/asset-processing-service/processors/script/content-script.processor.ts +138 -0
  204. package/src/services/assets/asset-processing-service/processors/script/file-script.processor.test.ts +326 -0
  205. package/src/services/assets/asset-processing-service/processors/script/file-script.processor.ts +116 -0
  206. package/src/services/assets/asset-processing-service/processors/script/node-module-script.processor.test.ts +270 -0
  207. package/src/services/assets/asset-processing-service/processors/script/node-module-script.processor.ts +145 -0
  208. package/src/services/assets/asset-processing-service/processors/stylesheet/content-stylesheet.processor.test.ts +261 -0
  209. package/src/services/assets/asset-processing-service/processors/stylesheet/content-stylesheet.processor.ts +72 -0
  210. package/src/services/assets/asset-processing-service/processors/stylesheet/file-stylesheet.processor.ts +83 -0
  211. package/src/services/assets/asset-processing-service/ungrouped-dependency-processing.ts +65 -0
  212. package/src/services/assets/browser-bundle.service.test.ts +66 -0
  213. package/src/services/assets/browser-bundle.service.ts +109 -0
  214. package/src/services/cache/cache.types.ts +126 -0
  215. package/src/services/cache/index.ts +18 -0
  216. package/src/services/cache/memory-cache-store.test.ts +225 -0
  217. package/src/services/cache/memory-cache-store.ts +130 -0
  218. package/src/services/cache/page-cache-service.test.ts +175 -0
  219. package/src/services/cache/page-cache-service.ts +202 -0
  220. package/src/services/cache/page-request-cache-coordinator.service.test.ts +79 -0
  221. package/src/services/cache/page-request-cache-coordinator.service.ts +131 -0
  222. package/src/services/html/html-rewriter-provider.service.test.ts +183 -0
  223. package/src/services/html/html-rewriter-provider.service.ts +105 -0
  224. package/src/services/html/html-transformer.service.test.ts +544 -0
  225. package/src/services/html/html-transformer.service.ts +369 -0
  226. package/src/services/invalidation/development-invalidation.service.test.ts +87 -0
  227. package/src/services/invalidation/development-invalidation.service.ts +262 -0
  228. package/src/services/module-loading/app-module-loader.service.ts +9 -0
  229. package/src/services/module-loading/app-server-module-transpiler.service.test.ts +297 -0
  230. package/src/services/module-loading/app-server-module-transpiler.service.ts +168 -0
  231. package/src/services/module-loading/host-module-loader-registry.ts +15 -0
  232. package/src/services/module-loading/{module-loading-types.d.ts → module-loading-types.ts} +1 -0
  233. package/src/services/module-loading/page-module-import.service.test.ts +652 -0
  234. package/src/services/module-loading/page-module-import.service.ts +302 -0
  235. package/src/services/module-loading/server-module-transpiler.service.test.ts +242 -0
  236. package/src/services/module-loading/server-module-transpiler.service.ts +104 -0
  237. package/src/services/module-loading/source-module-support.ts +19 -0
  238. package/src/services/runtime-state/dev-graph.service.ts +217 -0
  239. package/src/services/runtime-state/entrypoint-dependency-graph.service.ts +136 -0
  240. package/src/services/runtime-state/server-invalidation-state.service.ts +68 -0
  241. package/src/services/validation/schema-validation-service.test.ts +223 -0
  242. package/src/services/validation/schema-validation-service.ts +204 -0
  243. package/src/services/validation/{standard-schema.types.d.ts → standard-schema.types.ts} +20 -17
  244. package/src/static-site-generator/static-site-generator.test.ts +408 -0
  245. package/src/static-site-generator/static-site-generator.ts +445 -0
  246. package/src/types/internal-types.ts +243 -0
  247. package/src/types/public-types.ts +1508 -0
  248. package/src/utils/deep-merge.test.ts +114 -0
  249. package/src/utils/deep-merge.ts +47 -0
  250. package/src/utils/hash.ts +5 -0
  251. package/src/utils/html-escaping.ts +9 -0
  252. package/src/utils/invariant.test.ts +22 -0
  253. package/src/utils/invariant.ts +15 -0
  254. package/src/utils/locals-utils.ts +37 -0
  255. package/src/utils/parse-cli-args.test.ts +69 -0
  256. package/src/utils/parse-cli-args.ts +105 -0
  257. package/src/utils/path-utils.module.ts +14 -0
  258. package/src/utils/path-utils.test.ts +15 -0
  259. package/src/utils/resolve-work-dir.ts +45 -0
  260. package/src/utils/runtime.ts +44 -0
  261. package/src/utils/server-utils.module.ts +67 -0
  262. package/src/utils/server-utils.test.ts +38 -0
  263. package/src/watchers/project-watcher.integration.test.ts +337 -0
  264. package/src/watchers/project-watcher.test-helpers.ts +42 -0
  265. package/src/watchers/project-watcher.test.ts +768 -0
  266. package/src/watchers/project-watcher.ts +357 -0
  267. package/src/adapters/abstract/application-adapter.d.ts +0 -194
  268. package/src/adapters/abstract/application-adapter.js +0 -121
  269. package/src/adapters/abstract/router-adapter.d.ts +0 -26
  270. package/src/adapters/abstract/router-adapter.js +0 -5
  271. package/src/adapters/abstract/server-adapter.d.ts +0 -69
  272. package/src/adapters/abstract/server-adapter.js +0 -15
  273. package/src/adapters/bun/client-bridge.d.ts +0 -34
  274. package/src/adapters/bun/client-bridge.js +0 -48
  275. package/src/adapters/bun/create-app.d.ts +0 -60
  276. package/src/adapters/bun/create-app.js +0 -140
  277. package/src/adapters/bun/hmr-manager.d.ts +0 -47
  278. package/src/adapters/bun/hmr-manager.js +0 -58
  279. package/src/adapters/bun/index.d.ts +0 -2
  280. package/src/adapters/bun/index.js +0 -8
  281. package/src/adapters/bun/runtime-host.d.ts +0 -52
  282. package/src/adapters/bun/runtime-host.js +0 -56
  283. package/src/adapters/bun/server-adapter.d.ts +0 -216
  284. package/src/adapters/bun/server-adapter.js +0 -445
  285. package/src/adapters/bun/static-preview-host.d.ts +0 -28
  286. package/src/adapters/bun/static-preview-host.js +0 -45
  287. package/src/adapters/create-app.d.ts +0 -20
  288. package/src/adapters/create-app.js +0 -66
  289. package/src/adapters/index.d.ts +0 -2
  290. package/src/adapters/index.js +0 -8
  291. package/src/adapters/node/create-app.d.ts +0 -24
  292. package/src/adapters/node/create-app.js +0 -92
  293. package/src/adapters/node/http-request-bridge.d.ts +0 -57
  294. package/src/adapters/node/http-request-bridge.js +0 -118
  295. package/src/adapters/node/node-client-bridge.d.ts +0 -26
  296. package/src/adapters/node/node-client-bridge.js +0 -66
  297. package/src/adapters/node/node-hmr-manager.d.ts +0 -52
  298. package/src/adapters/node/node-hmr-manager.js +0 -49
  299. package/src/adapters/node/runtime-host.d.ts +0 -57
  300. package/src/adapters/node/runtime-host.js +0 -92
  301. package/src/adapters/node/server-adapter-dependencies.d.ts +0 -19
  302. package/src/adapters/node/server-adapter-dependencies.js +0 -18
  303. package/src/adapters/node/server-adapter.d.ts +0 -138
  304. package/src/adapters/node/server-adapter.js +0 -315
  305. package/src/adapters/node/static-content-server.d.ts +0 -60
  306. package/src/adapters/node/static-content-server.js +0 -194
  307. package/src/adapters/node/static-preview-host.d.ts +0 -55
  308. package/src/adapters/node/static-preview-host.js +0 -68
  309. package/src/adapters/shared/api-response.d.ts +0 -52
  310. package/src/adapters/shared/api-response.js +0 -96
  311. package/src/adapters/shared/application-adapter.d.ts +0 -18
  312. package/src/adapters/shared/application-adapter.js +0 -90
  313. package/src/adapters/shared/define-api-handler.d.ts +0 -25
  314. package/src/adapters/shared/define-api-handler.js +0 -15
  315. package/src/adapters/shared/explicit-static-render-preparation.d.ts +0 -25
  316. package/src/adapters/shared/explicit-static-render-preparation.js +0 -26
  317. package/src/adapters/shared/explicit-static-route-matcher.d.ts +0 -41
  318. package/src/adapters/shared/explicit-static-route-matcher.js +0 -101
  319. package/src/adapters/shared/file-route-middleware-pipeline.d.ts +0 -62
  320. package/src/adapters/shared/file-route-middleware-pipeline.js +0 -90
  321. package/src/adapters/shared/fs-server-response-factory.d.ts +0 -23
  322. package/src/adapters/shared/fs-server-response-factory.js +0 -81
  323. package/src/adapters/shared/fs-server-response-matcher.d.ts +0 -75
  324. package/src/adapters/shared/fs-server-response-matcher.js +0 -186
  325. package/src/adapters/shared/hmr-entrypoint-registrar.d.ts +0 -55
  326. package/src/adapters/shared/hmr-entrypoint-registrar.js +0 -87
  327. package/src/adapters/shared/hmr-html-response.d.ts +0 -22
  328. package/src/adapters/shared/hmr-html-response.js +0 -33
  329. package/src/adapters/shared/render-context.d.ts +0 -16
  330. package/src/adapters/shared/render-context.js +0 -93
  331. package/src/adapters/shared/runtime-app-bootstrap.d.ts +0 -26
  332. package/src/adapters/shared/runtime-app-bootstrap.js +0 -46
  333. package/src/adapters/shared/runtime-host.d.ts +0 -12
  334. package/src/adapters/shared/runtime-host.js +0 -0
  335. package/src/adapters/shared/server-adapter.d.ts +0 -108
  336. package/src/adapters/shared/server-adapter.js +0 -436
  337. package/src/adapters/shared/server-route-handler.d.ts +0 -89
  338. package/src/adapters/shared/server-route-handler.js +0 -111
  339. package/src/adapters/shared/server-static-builder.d.ts +0 -71
  340. package/src/adapters/shared/server-static-builder.js +0 -100
  341. package/src/adapters/shared/shared-hmr-manager.d.ts +0 -59
  342. package/src/adapters/shared/shared-hmr-manager.js +0 -241
  343. package/src/adapters/shared/static-preview-host.d.ts +0 -10
  344. package/src/adapters/shared/static-preview-host.js +0 -0
  345. package/src/build/browser-runtime-import-rewrite-plugin.d.ts +0 -26
  346. package/src/build/browser-runtime-import-rewrite-plugin.js +0 -165
  347. package/src/build/browser-runtime-manifest.d.ts +0 -31
  348. package/src/build/browser-runtime-manifest.js +0 -61
  349. package/src/build/build-adapter.d.ts +0 -247
  350. package/src/build/build-adapter.js +0 -671
  351. package/src/build/build-manifest.d.ts +0 -33
  352. package/src/build/build-manifest.js +0 -52
  353. package/src/build/build-types.d.ts +0 -57
  354. package/src/build/build-types.js +0 -0
  355. package/src/build/dev-build-coordinator.d.ts +0 -72
  356. package/src/build/dev-build-coordinator.js +0 -154
  357. package/src/build/esbuild-build-adapter.d.ts +0 -79
  358. package/src/build/esbuild-build-adapter.js +0 -521
  359. package/src/build/runtime-build-executor.d.ts +0 -14
  360. package/src/build/runtime-build-executor.js +0 -22
  361. package/src/build/runtime-specifier-alias-plugin.d.ts +0 -15
  362. package/src/build/runtime-specifier-alias-plugin.js +0 -31
  363. package/src/config/config-builder.d.ts +0 -252
  364. package/src/config/config-builder.js +0 -598
  365. package/src/config/constants.js +0 -25
  366. package/src/dev/host-runtime.d.ts +0 -10
  367. package/src/dev/host-runtime.js +0 -24
  368. package/src/dev/sc-server.d.ts +0 -30
  369. package/src/dev/sc-server.js +0 -111
  370. package/src/eco/eco.browser.d.ts +0 -2
  371. package/src/eco/eco.browser.js +0 -88
  372. package/src/eco/eco.d.ts +0 -9
  373. package/src/eco/eco.js +0 -119
  374. package/src/eco/eco.types.d.ts +0 -233
  375. package/src/eco/eco.types.js +0 -0
  376. package/src/eco/eco.utils.d.ts +0 -1
  377. package/src/eco/eco.utils.js +0 -10
  378. package/src/eco/global-injector-map.d.ts +0 -16
  379. package/src/eco/global-injector-map.js +0 -80
  380. package/src/eco/lazy-injector-map.d.ts +0 -8
  381. package/src/eco/lazy-injector-map.js +0 -70
  382. package/src/eco/module-dependencies.d.ts +0 -18
  383. package/src/eco/module-dependencies.js +0 -49
  384. package/src/errors/http-error.d.ts +0 -31
  385. package/src/errors/http-error.js +0 -50
  386. package/src/errors/index.d.ts +0 -3
  387. package/src/errors/index.js +0 -6
  388. package/src/errors/locals-access-error.d.ts +0 -4
  389. package/src/errors/locals-access-error.js +0 -9
  390. package/src/global/app-logger.d.ts +0 -2
  391. package/src/global/app-logger.js +0 -6
  392. package/src/hmr/client/hmr-runtime.d.ts +0 -5
  393. package/src/hmr/client/hmr-runtime.js +0 -117
  394. package/src/hmr/hmr-strategy.d.ts +0 -162
  395. package/src/hmr/hmr-strategy.js +0 -44
  396. package/src/hmr/hmr.postcss.test.e2e.d.ts +0 -1
  397. package/src/hmr/hmr.postcss.test.e2e.js +0 -31
  398. package/src/hmr/hmr.test.e2e.d.ts +0 -1
  399. package/src/hmr/hmr.test.e2e.js +0 -43
  400. package/src/hmr/strategies/default-hmr-strategy.d.ts +0 -43
  401. package/src/hmr/strategies/default-hmr-strategy.js +0 -34
  402. package/src/hmr/strategies/js-hmr-strategy.d.ts +0 -134
  403. package/src/hmr/strategies/js-hmr-strategy.js +0 -173
  404. package/src/index.browser.d.ts +0 -3
  405. package/src/index.browser.js +0 -4
  406. package/src/index.d.ts +0 -6
  407. package/src/index.js +0 -21
  408. package/src/integrations/ghtml/ghtml-renderer.d.ts +0 -16
  409. package/src/integrations/ghtml/ghtml-renderer.js +0 -57
  410. package/src/integrations/ghtml/ghtml.constants.d.ts +0 -1
  411. package/src/integrations/ghtml/ghtml.constants.js +0 -4
  412. package/src/integrations/ghtml/ghtml.plugin.d.ts +0 -16
  413. package/src/integrations/ghtml/ghtml.plugin.js +0 -20
  414. package/src/plugins/alias-resolver-plugin.d.ts +0 -3
  415. package/src/plugins/alias-resolver-plugin.js +0 -61
  416. package/src/plugins/eco-component-meta-plugin.d.ts +0 -108
  417. package/src/plugins/eco-component-meta-plugin.js +0 -175
  418. package/src/plugins/foreign-jsx-override-plugin.d.ts +0 -33
  419. package/src/plugins/foreign-jsx-override-plugin.js +0 -41
  420. package/src/plugins/integration-plugin.d.ts +0 -230
  421. package/src/plugins/integration-plugin.js +0 -201
  422. package/src/plugins/processor.d.ts +0 -97
  423. package/src/plugins/processor.js +0 -141
  424. package/src/plugins/runtime-capability.js +0 -0
  425. package/src/plugins/source-transform.d.ts +0 -46
  426. package/src/plugins/source-transform.js +0 -71
  427. package/src/route-renderer/orchestration/component-render-context.d.ts +0 -97
  428. package/src/route-renderer/orchestration/component-render-context.js +0 -147
  429. package/src/route-renderer/orchestration/declared-ownership-graph.d.ts +0 -18
  430. package/src/route-renderer/orchestration/declared-ownership-graph.js +0 -34
  431. package/src/route-renderer/orchestration/foreign-subtree-execution.service.d.ts +0 -110
  432. package/src/route-renderer/orchestration/foreign-subtree-execution.service.js +0 -233
  433. package/src/route-renderer/orchestration/integration-renderer.d.ts +0 -534
  434. package/src/route-renderer/orchestration/integration-renderer.js +0 -991
  435. package/src/route-renderer/orchestration/ownership-planning.service.d.ts +0 -24
  436. package/src/route-renderer/orchestration/ownership-planning.service.js +0 -63
  437. package/src/route-renderer/orchestration/ownership-validation.service.d.ts +0 -29
  438. package/src/route-renderer/orchestration/ownership-validation.service.js +0 -53
  439. package/src/route-renderer/orchestration/processed-asset-dedupe.d.ts +0 -3
  440. package/src/route-renderer/orchestration/processed-asset-dedupe.js +0 -27
  441. package/src/route-renderer/orchestration/queued-foreign-subtree-resolution.service.d.ts +0 -91
  442. package/src/route-renderer/orchestration/queued-foreign-subtree-resolution.service.js +0 -170
  443. package/src/route-renderer/orchestration/render-output.utils.d.ts +0 -66
  444. package/src/route-renderer/orchestration/render-output.utils.js +0 -171
  445. package/src/route-renderer/orchestration/route-render-orchestrator.d.ts +0 -156
  446. package/src/route-renderer/orchestration/route-render-orchestrator.js +0 -577
  447. package/src/route-renderer/orchestration/template-serialization.d.ts +0 -38
  448. package/src/route-renderer/orchestration/template-serialization.js +0 -45
  449. package/src/route-renderer/page-loading/component-dependency-collection.d.ts +0 -37
  450. package/src/route-renderer/page-loading/component-dependency-collection.js +0 -132
  451. package/src/route-renderer/page-loading/declared-asset-collection.d.ts +0 -24
  452. package/src/route-renderer/page-loading/declared-asset-collection.js +0 -106
  453. package/src/route-renderer/page-loading/dependency-resolver.d.ts +0 -35
  454. package/src/route-renderer/page-loading/dependency-resolver.js +0 -115
  455. package/src/route-renderer/page-loading/ecopages-virtual-imports.d.ts +0 -11
  456. package/src/route-renderer/page-loading/ecopages-virtual-imports.js +0 -57
  457. package/src/route-renderer/page-loading/lazy-entry-collection.d.ts +0 -45
  458. package/src/route-renderer/page-loading/lazy-entry-collection.js +0 -105
  459. package/src/route-renderer/page-loading/lazy-trigger-planning.d.ts +0 -19
  460. package/src/route-renderer/page-loading/lazy-trigger-planning.js +0 -40
  461. package/src/route-renderer/page-loading/module-declaration-aggregation.d.ts +0 -5
  462. package/src/route-renderer/page-loading/module-declaration-aggregation.js +0 -33
  463. package/src/route-renderer/page-loading/module-declaration-scripts.d.ts +0 -3
  464. package/src/route-renderer/page-loading/module-declaration-scripts.js +0 -18
  465. package/src/route-renderer/page-loading/page-dependency-bundling.d.ts +0 -13
  466. package/src/route-renderer/page-loading/page-dependency-bundling.js +0 -137
  467. package/src/route-renderer/page-loading/page-module-loader.d.ts +0 -90
  468. package/src/route-renderer/page-loading/page-module-loader.js +0 -127
  469. package/src/route-renderer/route-renderer.d.ts +0 -69
  470. package/src/route-renderer/route-renderer.js +0 -80
  471. package/src/router/client/link-intent.js +0 -34
  472. package/src/router/client/link-intent.test.browser.d.ts +0 -1
  473. package/src/router/client/link-intent.test.browser.js +0 -43
  474. package/src/router/client/navigation-coordinator.d.ts +0 -169
  475. package/src/router/client/navigation-coordinator.js +0 -215
  476. package/src/router/server/route-registry.d.ts +0 -78
  477. package/src/router/server/route-registry.js +0 -262
  478. package/src/services/assets/asset-processing-service/asset-dependency-keys.d.ts +0 -3
  479. package/src/services/assets/asset-processing-service/asset-dependency-keys.js +0 -56
  480. package/src/services/assets/asset-processing-service/asset-processing.service.d.ts +0 -103
  481. package/src/services/assets/asset-processing-service/asset-processing.service.js +0 -285
  482. package/src/services/assets/asset-processing-service/asset.factory.d.ts +0 -17
  483. package/src/services/assets/asset-processing-service/asset.factory.js +0 -82
  484. package/src/services/assets/asset-processing-service/assets.types.d.ts +0 -103
  485. package/src/services/assets/asset-processing-service/assets.types.js +0 -0
  486. package/src/services/assets/asset-processing-service/browser-runtime-asset.factory.d.ts +0 -57
  487. package/src/services/assets/asset-processing-service/browser-runtime-asset.factory.js +0 -49
  488. package/src/services/assets/asset-processing-service/browser-runtime-entry.factory.d.ts +0 -20
  489. package/src/services/assets/asset-processing-service/browser-runtime-entry.factory.js +0 -41
  490. package/src/services/assets/asset-processing-service/grouped-content-bundles.d.ts +0 -30
  491. package/src/services/assets/asset-processing-service/grouped-content-bundles.js +0 -65
  492. package/src/services/assets/asset-processing-service/index.d.ts +0 -6
  493. package/src/services/assets/asset-processing-service/index.js +0 -6
  494. package/src/services/assets/asset-processing-service/page-package.d.ts +0 -6
  495. package/src/services/assets/asset-processing-service/page-package.js +0 -80
  496. package/src/services/assets/asset-processing-service/processor.interface.js +0 -6
  497. package/src/services/assets/asset-processing-service/processor.registry.d.ts +0 -8
  498. package/src/services/assets/asset-processing-service/processor.registry.js +0 -15
  499. package/src/services/assets/asset-processing-service/processors/base/base-processor.d.ts +0 -24
  500. package/src/services/assets/asset-processing-service/processors/base/base-processor.js +0 -65
  501. package/src/services/assets/asset-processing-service/processors/base/base-script-processor.d.ts +0 -22
  502. package/src/services/assets/asset-processing-service/processors/base/base-script-processor.js +0 -136
  503. package/src/services/assets/asset-processing-service/processors/index.d.ts +0 -5
  504. package/src/services/assets/asset-processing-service/processors/index.js +0 -5
  505. package/src/services/assets/asset-processing-service/processors/script/content-script.processor.d.ts +0 -6
  506. package/src/services/assets/asset-processing-service/processors/script/content-script.processor.js +0 -120
  507. package/src/services/assets/asset-processing-service/processors/script/file-script.processor.d.ts +0 -9
  508. package/src/services/assets/asset-processing-service/processors/script/file-script.processor.js +0 -97
  509. package/src/services/assets/asset-processing-service/processors/script/node-module-script.processor.d.ts +0 -42
  510. package/src/services/assets/asset-processing-service/processors/script/node-module-script.processor.js +0 -126
  511. package/src/services/assets/asset-processing-service/processors/stylesheet/content-stylesheet.processor.d.ts +0 -8
  512. package/src/services/assets/asset-processing-service/processors/stylesheet/content-stylesheet.processor.js +0 -59
  513. package/src/services/assets/asset-processing-service/processors/stylesheet/file-stylesheet.processor.d.ts +0 -9
  514. package/src/services/assets/asset-processing-service/processors/stylesheet/file-stylesheet.processor.js +0 -69
  515. package/src/services/assets/asset-processing-service/ungrouped-dependency-processing.d.ts +0 -18
  516. package/src/services/assets/asset-processing-service/ungrouped-dependency-processing.js +0 -45
  517. package/src/services/assets/browser-bundle.service.d.ts +0 -73
  518. package/src/services/assets/browser-bundle.service.js +0 -41
  519. package/src/services/cache/cache.types.d.ts +0 -107
  520. package/src/services/cache/cache.types.js +0 -0
  521. package/src/services/cache/index.d.ts +0 -7
  522. package/src/services/cache/index.js +0 -7
  523. package/src/services/cache/memory-cache-store.d.ts +0 -42
  524. package/src/services/cache/memory-cache-store.js +0 -98
  525. package/src/services/cache/page-cache-service.d.ts +0 -70
  526. package/src/services/cache/page-cache-service.js +0 -152
  527. package/src/services/cache/page-request-cache-coordinator.service.d.ts +0 -75
  528. package/src/services/cache/page-request-cache-coordinator.service.js +0 -109
  529. package/src/services/html/html-rewriter-provider.service.d.ts +0 -40
  530. package/src/services/html/html-rewriter-provider.service.js +0 -68
  531. package/src/services/html/html-transformer.service.d.ts +0 -96
  532. package/src/services/html/html-transformer.service.js +0 -287
  533. package/src/services/invalidation/development-invalidation.service.d.ts +0 -74
  534. package/src/services/invalidation/development-invalidation.service.js +0 -190
  535. package/src/services/module-loading/app-module-loader.service.d.ts +0 -7
  536. package/src/services/module-loading/app-module-loader.service.js +0 -0
  537. package/src/services/module-loading/app-server-module-transpiler.service.d.ts +0 -24
  538. package/src/services/module-loading/app-server-module-transpiler.service.js +0 -151
  539. package/src/services/module-loading/host-module-loader-registry.d.ts +0 -4
  540. package/src/services/module-loading/host-module-loader-registry.js +0 -15
  541. package/src/services/module-loading/module-loading-types.js +0 -0
  542. package/src/services/module-loading/node-bootstrap-plugin.d.ts +0 -38
  543. package/src/services/module-loading/node-bootstrap-plugin.js +0 -215
  544. package/src/services/module-loading/page-module-import.service.d.ts +0 -95
  545. package/src/services/module-loading/page-module-import.service.js +0 -191
  546. package/src/services/module-loading/server-module-transpiler.service.d.ts +0 -63
  547. package/src/services/module-loading/server-module-transpiler.service.js +0 -64
  548. package/src/services/module-loading/source-module-support.d.ts +0 -5
  549. package/src/services/module-loading/source-module-support.js +0 -8
  550. package/src/services/runtime-state/dev-graph.service.d.ts +0 -118
  551. package/src/services/runtime-state/dev-graph.service.js +0 -162
  552. package/src/services/runtime-state/entrypoint-dependency-graph.service.d.ts +0 -41
  553. package/src/services/runtime-state/entrypoint-dependency-graph.service.js +0 -85
  554. package/src/services/runtime-state/server-invalidation-state.service.d.ts +0 -26
  555. package/src/services/runtime-state/server-invalidation-state.service.js +0 -35
  556. package/src/services/validation/schema-validation-service.d.ts +0 -122
  557. package/src/services/validation/schema-validation-service.js +0 -101
  558. package/src/services/validation/standard-schema.types.js +0 -0
  559. package/src/static-site-generator/static-site-generator.d.ts +0 -104
  560. package/src/static-site-generator/static-site-generator.js +0 -316
  561. package/src/types/internal-types.d.ts +0 -232
  562. package/src/types/internal-types.js +0 -0
  563. package/src/types/public-types.d.ts +0 -1307
  564. package/src/types/public-types.js +0 -0
  565. package/src/utils/deep-merge.d.ts +0 -14
  566. package/src/utils/deep-merge.js +0 -32
  567. package/src/utils/hash.d.ts +0 -1
  568. package/src/utils/hash.js +0 -7
  569. package/src/utils/html-escaping.d.ts +0 -7
  570. package/src/utils/html-escaping.js +0 -6
  571. package/src/utils/html.js +0 -4
  572. package/src/utils/invariant.d.ts +0 -5
  573. package/src/utils/invariant.js +0 -11
  574. package/src/utils/locals-utils.d.ts +0 -15
  575. package/src/utils/locals-utils.js +0 -24
  576. package/src/utils/parse-cli-args.d.ts +0 -27
  577. package/src/utils/parse-cli-args.js +0 -62
  578. package/src/utils/path-utils.module.d.ts +0 -5
  579. package/src/utils/path-utils.module.js +0 -14
  580. package/src/utils/resolve-work-dir.d.ts +0 -11
  581. package/src/utils/resolve-work-dir.js +0 -31
  582. package/src/utils/runtime.d.ts +0 -11
  583. package/src/utils/runtime.js +0 -40
  584. package/src/utils/server-utils.module.d.ts +0 -19
  585. package/src/utils/server-utils.module.js +0 -56
  586. package/src/watchers/project-watcher.d.ts +0 -136
  587. package/src/watchers/project-watcher.js +0 -275
  588. package/src/watchers/project-watcher.test-helpers.d.ts +0 -4
  589. package/src/watchers/project-watcher.test-helpers.js +0 -52
  590. /package/src/utils/{html.d.ts → html.ts} +0 -0
@@ -0,0 +1,121 @@
1
+ import assert from 'node:assert/strict';
2
+ import { test } from 'vitest';
3
+ import {
4
+ BrowserRuntimeManifestConflictError,
5
+ createBrowserRuntimeManifest,
6
+ getBrowserRuntimeSpecifierMap,
7
+ mergeBrowserRuntimeManifests,
8
+ } from './browser-runtime-manifest.ts';
9
+
10
+ test('createBrowserRuntimeManifest indexes runtime assets by specifier', () => {
11
+ const manifest = createBrowserRuntimeManifest([
12
+ {
13
+ specifier: 'react',
14
+ owner: '@ecopages/react',
15
+ importPath: 'react',
16
+ publicPath: '/assets/vendors/react.js',
17
+ mode: 'development',
18
+ externals: ['react-dom'],
19
+ },
20
+ ]);
21
+
22
+ assert.equal(manifest.assets.length, 1);
23
+ assert.deepEqual(manifest.bySpecifier.get('react'), {
24
+ specifier: 'react',
25
+ owner: '@ecopages/react',
26
+ importPath: 'react',
27
+ publicPath: '/assets/vendors/react.js',
28
+ mode: 'development',
29
+ externals: ['react-dom'],
30
+ });
31
+ });
32
+
33
+ test('createBrowserRuntimeManifest deduplicates identical declarations', () => {
34
+ const manifest = createBrowserRuntimeManifest([
35
+ {
36
+ specifier: 'react',
37
+ owner: '@ecopages/react',
38
+ importPath: 'react',
39
+ publicPath: '/assets/vendors/react.js',
40
+ },
41
+ {
42
+ specifier: 'react',
43
+ owner: '@ecopages/react',
44
+ importPath: 'react',
45
+ publicPath: '/assets/vendors/react.js',
46
+ },
47
+ ]);
48
+
49
+ assert.equal(manifest.assets.length, 1);
50
+ });
51
+
52
+ test('createBrowserRuntimeManifest rejects conflicting declarations', () => {
53
+ assert.throws(
54
+ () =>
55
+ createBrowserRuntimeManifest([
56
+ {
57
+ specifier: 'react',
58
+ owner: '@ecopages/react',
59
+ importPath: 'react',
60
+ publicPath: '/assets/vendors/react.js',
61
+ },
62
+ {
63
+ specifier: 'react',
64
+ owner: 'custom-runtime',
65
+ importPath: 'react',
66
+ publicPath: '/assets/custom/react.js',
67
+ },
68
+ ]),
69
+ (error) => {
70
+ assert.ok(error instanceof BrowserRuntimeManifestConflictError);
71
+ assert.equal(error.specifier, 'react');
72
+ assert.match(error.message, /@ecopages\/react maps to \/assets\/vendors\/react\.js/u);
73
+ return true;
74
+ },
75
+ );
76
+ });
77
+
78
+ test('mergeBrowserRuntimeManifests combines manifest declarations with conflict detection', () => {
79
+ const reactManifest = createBrowserRuntimeManifest([
80
+ {
81
+ specifier: 'react',
82
+ owner: '@ecopages/react',
83
+ importPath: 'react',
84
+ publicPath: '/assets/vendors/react.js',
85
+ },
86
+ ]);
87
+ const routerManifest = createBrowserRuntimeManifest([
88
+ {
89
+ specifier: '@ecopages/react-router/browser',
90
+ owner: '@ecopages/react-router',
91
+ importPath: '@ecopages/react-router/browser',
92
+ publicPath: '/assets/vendors/react-router.js',
93
+ },
94
+ ]);
95
+
96
+ const manifest = mergeBrowserRuntimeManifests(reactManifest, undefined, routerManifest);
97
+
98
+ assert.deepEqual(Array.from(manifest.bySpecifier.keys()), ['react', '@ecopages/react-router/browser']);
99
+ });
100
+
101
+ test('getBrowserRuntimeSpecifierMap returns concrete public URLs for rewriting', () => {
102
+ const manifest = createBrowserRuntimeManifest([
103
+ {
104
+ specifier: 'react',
105
+ owner: '@ecopages/react',
106
+ importPath: 'react',
107
+ publicPath: '/assets/vendors/react.js',
108
+ },
109
+ {
110
+ specifier: 'react-dom/client',
111
+ owner: '@ecopages/react',
112
+ importPath: 'react-dom/client',
113
+ publicPath: '/assets/vendors/react-dom-client.js',
114
+ },
115
+ ]);
116
+
117
+ assert.deepEqual(Array.from(getBrowserRuntimeSpecifierMap(manifest).entries()), [
118
+ ['react', '/assets/vendors/react.js'],
119
+ ['react-dom/client', '/assets/vendors/react-dom-client.js'],
120
+ ]);
121
+ });
@@ -0,0 +1,105 @@
1
+ export type BrowserRuntimeMode = 'development' | 'production';
2
+
3
+ export type BrowserRuntimeAssetDeclaration = {
4
+ /** Bare or virtual specifier used by authored/generated browser modules. */
5
+ specifier: string;
6
+ /** Integration, processor, or core subsystem that owns this runtime asset. */
7
+ owner: string;
8
+ /** Source import path used to build or resolve the runtime asset. */
9
+ importPath: string;
10
+ /** Concrete browser URL emitted or served for this runtime asset. */
11
+ publicPath: string;
12
+ /** Runtime mode this declaration applies to. Omit when the URL is mode-independent. */
13
+ mode?: BrowserRuntimeMode;
14
+ /** Specifiers that should be treated as external while building this runtime asset. */
15
+ externals?: readonly string[];
16
+ };
17
+
18
+ export type BrowserRuntimeAsset = BrowserRuntimeAssetDeclaration & {
19
+ externals: readonly string[];
20
+ };
21
+
22
+ export type BrowserRuntimeManifest = {
23
+ assets: readonly BrowserRuntimeAsset[];
24
+ bySpecifier: ReadonlyMap<string, BrowserRuntimeAsset>;
25
+ };
26
+
27
+ export class BrowserRuntimeManifestConflictError extends Error {
28
+ readonly specifier: string;
29
+ readonly existing: BrowserRuntimeAsset;
30
+ readonly incoming: BrowserRuntimeAsset;
31
+
32
+ constructor(specifier: string, existing: BrowserRuntimeAsset, incoming: BrowserRuntimeAsset) {
33
+ super(
34
+ `Browser runtime asset conflict for ${specifier}: ${existing.owner} maps to ${existing.publicPath}, ` +
35
+ `${incoming.owner} maps to ${incoming.publicPath}`,
36
+ );
37
+ this.name = 'BrowserRuntimeManifestConflictError';
38
+ this.specifier = specifier;
39
+ this.existing = existing;
40
+ this.incoming = incoming;
41
+ }
42
+ }
43
+
44
+ function normalizeDeclaration(declaration: BrowserRuntimeAssetDeclaration): BrowserRuntimeAsset {
45
+ return {
46
+ ...declaration,
47
+ externals: declaration.externals ?? [],
48
+ };
49
+ }
50
+
51
+ function hasCompatibleRuntimeAsset(existing: BrowserRuntimeAsset, incoming: BrowserRuntimeAsset): boolean {
52
+ return (
53
+ existing.owner === incoming.owner &&
54
+ existing.importPath === incoming.importPath &&
55
+ existing.publicPath === incoming.publicPath &&
56
+ existing.mode === incoming.mode &&
57
+ arrayEquals(existing.externals, incoming.externals)
58
+ );
59
+ }
60
+
61
+ function arrayEquals(left: readonly string[], right: readonly string[]): boolean {
62
+ if (left.length !== right.length) {
63
+ return false;
64
+ }
65
+
66
+ return left.every((value, index) => value === right[index]);
67
+ }
68
+
69
+ export function createBrowserRuntimeManifest(
70
+ declarations: readonly BrowserRuntimeAssetDeclaration[] = [],
71
+ ): BrowserRuntimeManifest {
72
+ const assets: BrowserRuntimeAsset[] = [];
73
+ const bySpecifier = new Map<string, BrowserRuntimeAsset>();
74
+
75
+ for (const declaration of declarations) {
76
+ const asset = normalizeDeclaration(declaration);
77
+ const existing = bySpecifier.get(asset.specifier);
78
+
79
+ if (existing) {
80
+ if (!hasCompatibleRuntimeAsset(existing, asset)) {
81
+ throw new BrowserRuntimeManifestConflictError(asset.specifier, existing, asset);
82
+ }
83
+
84
+ continue;
85
+ }
86
+
87
+ assets.push(asset);
88
+ bySpecifier.set(asset.specifier, asset);
89
+ }
90
+
91
+ return {
92
+ assets,
93
+ bySpecifier,
94
+ };
95
+ }
96
+
97
+ export function mergeBrowserRuntimeManifests(
98
+ ...manifests: Array<BrowserRuntimeManifest | undefined>
99
+ ): BrowserRuntimeManifest {
100
+ return createBrowserRuntimeManifest(manifests.flatMap((manifest) => manifest?.assets ?? []));
101
+ }
102
+
103
+ export function getBrowserRuntimeSpecifierMap(manifest: BrowserRuntimeManifest): ReadonlyMap<string, string> {
104
+ return new Map(manifest.assets.map((asset) => [asset.specifier, asset.publicPath]));
105
+ }
@@ -0,0 +1,49 @@
1
+ import assert from 'node:assert/strict';
2
+ import { test } from 'vitest';
3
+ import { buildSpecifierFilter, escapeRegExp } from './browser-runtime-plugin-helpers.ts';
4
+
5
+ test('escapeRegExp escapes all regex metacharacters', () => {
6
+ const sample = 'a.b*c+d?e^f$g{h}i(j)k|l[m]n\\o';
7
+ const escaped = escapeRegExp(sample);
8
+ assert.equal(escaped, 'a\\.b\\*c\\+d\\?e\\^f\\$g\\{h\\}i\\(j\\)k\\|l\\[m\\]n\\\\o');
9
+ const matcher = new RegExp(`^${escaped}$`);
10
+ assert.equal(matcher.test(sample), true);
11
+ assert.equal(matcher.test('aXbXcXdXeXfXgXhXiXjXkXlXmXnXo'), false);
12
+ });
13
+
14
+ test('buildSpecifierFilter returns null for an empty map', () => {
15
+ assert.equal(buildSpecifierFilter(new Map()), null);
16
+ });
17
+
18
+ test('buildSpecifierFilter matches a single specifier exactly', () => {
19
+ const filter = buildSpecifierFilter(new Map([['react', '/vendor/react.js']]))!;
20
+ assert.equal(filter.test('react'), true);
21
+ assert.equal(filter.test('react-dom'), false);
22
+ assert.equal(filter.test('react/extra'), false);
23
+ assert.equal(filter.test('xreact'), false);
24
+ });
25
+
26
+ test('buildSpecifierFilter matches any of multiple specifiers', () => {
27
+ const filter = buildSpecifierFilter(
28
+ new Map([
29
+ ['react', '/vendor/react.js'],
30
+ ['react-dom', '/vendor/react-dom.js'],
31
+ ]),
32
+ )!;
33
+ assert.equal(filter.test('react'), true);
34
+ assert.equal(filter.test('react-dom'), true);
35
+ assert.equal(filter.test('vue'), false);
36
+ });
37
+
38
+ test('buildSpecifierFilter escapes regex metacharacters in specifier keys', () => {
39
+ const filter = buildSpecifierFilter(
40
+ new Map([
41
+ ['@scope/pkg', '/vendor/scope-pkg.js'],
42
+ ['plain.spec', '/vendor/plain.js'],
43
+ ]),
44
+ )!;
45
+ assert.equal(filter.test('@scope/pkg'), true);
46
+ assert.equal(filter.test('@scopeXpkg'), false, 'dot must be escaped, not interpreted as wildcard');
47
+ assert.equal(filter.test('plain.spec'), true);
48
+ assert.equal(filter.test('plainXspec'), false);
49
+ });
@@ -0,0 +1,37 @@
1
+ /**
2
+ * Shared helpers for the browser-runtime plugin.
3
+ *
4
+ * @remarks
5
+ * `createBrowserRuntimePlugin` needs to:
6
+ *
7
+ * 1. Escape each specifier for inclusion in a regex filter.
8
+ * 2. Build a `RegExp` whose alternation matches any of those specifiers.
9
+ *
10
+ * These utilities are extracted here so the plugin does not duplicate
11
+ * the same code path.
12
+ */
13
+
14
+ /**
15
+ * Escapes a literal specifier for inclusion in a regular expression.
16
+ *
17
+ * Only the regex metacharacters are escaped: `. * + ? ^ $ { } ( ) | [ ] \`
18
+ */
19
+ export function escapeRegExp(value: string): string {
20
+ return value.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
21
+ }
22
+
23
+ /**
24
+ * Builds a `RegExp` whose alternation matches any of the keys in
25
+ * `specifierMap`.
26
+ *
27
+ * Returns `null` for an empty map so callers can short-circuit and
28
+ * avoid registering a no-op `onResolve` / `onLoad` filter.
29
+ */
30
+ export function buildSpecifierFilter(specifierMap: ReadonlyMap<string, string>): RegExp | null {
31
+ if (specifierMap.size === 0) {
32
+ return null;
33
+ }
34
+
35
+ const alternation = Array.from(specifierMap.keys()).map(escapeRegExp).join('|');
36
+ return new RegExp(`^(${alternation})$`);
37
+ }
@@ -0,0 +1,256 @@
1
+ import assert from 'node:assert/strict';
2
+ import { mkdtempSync, rmSync, writeFileSync } from 'node:fs';
3
+ import { tmpdir } from 'node:os';
4
+ import path from 'node:path';
5
+
6
+ import { test } from 'vitest';
7
+ import { createBrowserRuntimeManifest } from './browser-runtime-manifest.ts';
8
+ import {
9
+ BROWSER_RUNTIME_IMPORT_REWRITE_MAP,
10
+ DEFAULT_BROWSER_RUNTIME_PLUGIN_NAME,
11
+ createBrowserRuntimePlugin,
12
+ getBrowserRuntimeImportRewriteMap,
13
+ } from './browser-runtime-plugin.ts';
14
+ import type { EcoBuildOnLoadResult, EcoBuildOnResolveResult } from './build-types.ts';
15
+
16
+ const manifest = createBrowserRuntimeManifest([
17
+ {
18
+ specifier: 'react',
19
+ owner: '@ecopages/react',
20
+ importPath: 'react',
21
+ publicPath: '/assets/vendors/react.js',
22
+ },
23
+ {
24
+ specifier: 'react-dom/client',
25
+ owner: '@ecopages/react',
26
+ importPath: 'react-dom/client',
27
+ publicPath: '/assets/vendors/react-dom.js',
28
+ },
29
+ ]);
30
+
31
+ type ResolveCallback = (args: {
32
+ path: string;
33
+ }) => EcoBuildOnResolveResult | undefined | Promise<EcoBuildOnResolveResult | undefined>;
34
+ type LoadCallback = (args: {
35
+ path: string;
36
+ }) => EcoBuildOnLoadResult | undefined | Promise<EcoBuildOnLoadResult | undefined>;
37
+
38
+ function captureCallbacks(): {
39
+ resolveCallbacks: ResolveCallback[];
40
+ loadCallbacks: LoadCallback[];
41
+ } {
42
+ const resolveCallbacks: ResolveCallback[] = [];
43
+ const loadCallbacks: LoadCallback[] = [];
44
+ return {
45
+ resolveCallbacks,
46
+ loadCallbacks,
47
+ };
48
+ }
49
+
50
+ function setupPlugin(
51
+ plugin: ReturnType<typeof createBrowserRuntimePlugin>,
52
+ callbacks: ReturnType<typeof captureCallbacks>,
53
+ ): void {
54
+ assert.ok(plugin);
55
+ plugin.setup({
56
+ onResolve(_options, callback) {
57
+ callbacks.resolveCallbacks.push(callback as ResolveCallback);
58
+ },
59
+ onLoad(_options, callback) {
60
+ callbacks.loadCallbacks.push(callback as LoadCallback);
61
+ },
62
+ module() {},
63
+ });
64
+ }
65
+
66
+ test('createBrowserRuntimePlugin returns null for an empty manifest', () => {
67
+ assert.equal(createBrowserRuntimePlugin({ manifest: createBrowserRuntimeManifest() }), null);
68
+ });
69
+
70
+ test('createBrowserRuntimePlugin uses default name when not provided', () => {
71
+ const plugin = createBrowserRuntimePlugin({ manifest });
72
+ assert.ok(plugin);
73
+ assert.equal(plugin.name, DEFAULT_BROWSER_RUNTIME_PLUGIN_NAME);
74
+ });
75
+
76
+ test('createBrowserRuntimePlugin honors a custom name', () => {
77
+ const plugin = createBrowserRuntimePlugin({ manifest, name: 'custom-runtime-plugin' });
78
+ assert.ok(plugin);
79
+ assert.equal(plugin.name, 'custom-runtime-plugin');
80
+ });
81
+
82
+ test('createBrowserRuntimePlugin exposes the specifier map under the canonical symbol', () => {
83
+ const plugin = createBrowserRuntimePlugin({ manifest });
84
+ assert.ok(plugin);
85
+ const map = getBrowserRuntimeImportRewriteMap(plugin);
86
+ assert.ok(map);
87
+ assert.deepEqual(Array.from(map.entries()), [
88
+ ['react', '/assets/vendors/react.js'],
89
+ ['react-dom/client', '/assets/vendors/react-dom.js'],
90
+ ]);
91
+ assert.equal((plugin as Record<symbol, unknown>)[BROWSER_RUNTIME_IMPORT_REWRITE_MAP], map);
92
+ });
93
+
94
+ test('createBrowserRuntimePlugin in full mode registers alias, publicPath, and onLoad hooks', () => {
95
+ const callbacks = captureCallbacks();
96
+ const plugin = createBrowserRuntimePlugin({ manifest });
97
+ setupPlugin(plugin, callbacks);
98
+ assert.equal(callbacks.resolveCallbacks.length, 2, 'alias + publicPath');
99
+ assert.equal(callbacks.loadCallbacks.length, 1, 'source rewrite');
100
+ });
101
+
102
+ test('createBrowserRuntimePlugin in alias-only mode skips rewrite and publicPath hooks', () => {
103
+ const callbacks = captureCallbacks();
104
+ const plugin = createBrowserRuntimePlugin({
105
+ manifest,
106
+ name: 'alias-only',
107
+ rewriteImports: false,
108
+ matchPublicPaths: false,
109
+ });
110
+ setupPlugin(plugin, callbacks);
111
+ assert.equal(callbacks.resolveCallbacks.length, 1, 'alias only');
112
+ assert.equal(callbacks.loadCallbacks.length, 0, 'no source rewrite');
113
+ });
114
+
115
+ test('createBrowserRuntimePlugin in rewrite-only mode registers alias and onLoad but skips publicPath', () => {
116
+ const callbacks = captureCallbacks();
117
+ const plugin = createBrowserRuntimePlugin({
118
+ manifest,
119
+ name: 'rewrite-only',
120
+ external: false,
121
+ matchPublicPaths: false,
122
+ });
123
+ setupPlugin(plugin, callbacks);
124
+ assert.equal(callbacks.resolveCallbacks.length, 1, 'alias only');
125
+ assert.equal(callbacks.loadCallbacks.length, 1, 'source rewrite still on');
126
+ });
127
+
128
+ test('createBrowserRuntimePlugin alias resolve honors custom external flag', async () => {
129
+ const callbacks = captureCallbacks();
130
+ const plugin = createBrowserRuntimePlugin({ manifest, external: false });
131
+ setupPlugin(plugin, callbacks);
132
+ const resolve = async (specifier: string) => {
133
+ for (const callback of callbacks.resolveCallbacks) {
134
+ const result = await callback({ path: specifier });
135
+ if (result) return result;
136
+ }
137
+ return undefined;
138
+ };
139
+ assert.deepEqual(await resolve('react'), {
140
+ path: '/assets/vendors/react.js',
141
+ external: false,
142
+ });
143
+ });
144
+
145
+ test('createBrowserRuntimePlugin alias resolve defaults to external: true', async () => {
146
+ const callbacks = captureCallbacks();
147
+ const plugin = createBrowserRuntimePlugin({ manifest });
148
+ setupPlugin(plugin, callbacks);
149
+ const resolve = async (specifier: string) => {
150
+ for (const callback of callbacks.resolveCallbacks) {
151
+ const result = await callback({ path: specifier });
152
+ if (result) return result;
153
+ }
154
+ return undefined;
155
+ };
156
+ assert.deepEqual(await resolve('react'), {
157
+ path: '/assets/vendors/react.js',
158
+ external: true,
159
+ });
160
+ });
161
+
162
+ test('createBrowserRuntimePlugin publicPath resolve only matches in-set paths', async () => {
163
+ const callbacks = captureCallbacks();
164
+ const plugin = createBrowserRuntimePlugin({ manifest, name: 'with-public-paths' });
165
+ setupPlugin(plugin, callbacks);
166
+ const resolve = async (specifier: string) => {
167
+ for (const callback of callbacks.resolveCallbacks) {
168
+ const result = await callback({ path: specifier });
169
+ if (result) return result;
170
+ }
171
+ return undefined;
172
+ };
173
+ assert.deepEqual(await resolve('/assets/vendors/react.js'), {
174
+ path: '/assets/vendors/react.js',
175
+ external: true,
176
+ });
177
+ assert.equal(await resolve('/assets/vendors/other.js'), undefined);
178
+ assert.deepEqual(
179
+ await resolve('react'),
180
+ {
181
+ path: '/assets/vendors/react.js',
182
+ external: true,
183
+ },
184
+ 'alias filter still matches plain specifiers',
185
+ );
186
+ });
187
+
188
+ test('createBrowserRuntimePlugin with matchPublicPaths: false skips /-prefixed resolves', async () => {
189
+ const callbacks = captureCallbacks();
190
+ const plugin = createBrowserRuntimePlugin({
191
+ manifest,
192
+ name: 'no-public-paths',
193
+ matchPublicPaths: false,
194
+ });
195
+ setupPlugin(plugin, callbacks);
196
+ const resolve = async (specifier: string) => {
197
+ for (const callback of callbacks.resolveCallbacks) {
198
+ const result = await callback({ path: specifier });
199
+ if (result) return result;
200
+ }
201
+ return undefined;
202
+ };
203
+ assert.deepEqual(
204
+ await resolve('react'),
205
+ {
206
+ path: '/assets/vendors/react.js',
207
+ external: true,
208
+ },
209
+ 'alias filter still active',
210
+ );
211
+ assert.equal(await resolve('/assets/vendors/react.js'), undefined, 'no publicPath hook registered');
212
+ });
213
+
214
+ test('createBrowserRuntimePlugin onLoad rewrites JS/TS sources that import manifest specifiers', async () => {
215
+ const tempDir = mkdtempSync(path.join(tmpdir(), 'ecopages-unified-rewrite-'));
216
+ const filePath = path.join(tempDir, 'entry.tsx');
217
+ writeFileSync(filePath, "import React from 'react';\n", 'utf-8');
218
+
219
+ try {
220
+ const callbacks = captureCallbacks();
221
+ const plugin = createBrowserRuntimePlugin({ manifest });
222
+ setupPlugin(plugin, callbacks);
223
+ assert.equal(callbacks.loadCallbacks.length, 1);
224
+ assert.deepEqual(await callbacks.loadCallbacks[0]?.({ path: filePath }), {
225
+ contents: "import React from '/assets/vendors/react.js';\n",
226
+ loader: 'tsx',
227
+ resolveDir: tempDir,
228
+ });
229
+ } finally {
230
+ rmSync(tempDir, { recursive: true, force: true });
231
+ }
232
+ });
233
+
234
+ test('createBrowserRuntimePlugin onLoad short-circuits when the source has no manifest specifier', async () => {
235
+ const tempDir = mkdtempSync(path.join(tmpdir(), 'ecopages-unified-rewrite-'));
236
+ const filePath = path.join(tempDir, 'entry.tsx');
237
+ writeFileSync(filePath, "import { foo } from 'local-package';\n", 'utf-8');
238
+
239
+ try {
240
+ const callbacks = captureCallbacks();
241
+ const plugin = createBrowserRuntimePlugin({ manifest });
242
+ setupPlugin(plugin, callbacks);
243
+ assert.equal(callbacks.loadCallbacks.length, 1);
244
+ assert.equal(await callbacks.loadCallbacks[0]?.({ path: filePath }), undefined);
245
+ } finally {
246
+ rmSync(tempDir, { recursive: true, force: true });
247
+ }
248
+ });
249
+
250
+ test('createBrowserRuntimePlugin onLoad returns undefined for non-absolute paths', async () => {
251
+ const callbacks = captureCallbacks();
252
+ const plugin = createBrowserRuntimePlugin({ manifest });
253
+ setupPlugin(plugin, callbacks);
254
+ assert.equal(callbacks.loadCallbacks.length, 1);
255
+ assert.equal(await callbacks.loadCallbacks[0]?.({ path: 'virtual:entry' }), undefined);
256
+ });