@ecopages/core 0.2.0-alpha.1

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 (342) hide show
  1. package/CHANGELOG.md +89 -0
  2. package/LICENSE +21 -0
  3. package/README.md +32 -0
  4. package/package.json +279 -0
  5. package/src/adapters/abstract/application-adapter.d.ts +168 -0
  6. package/src/adapters/abstract/application-adapter.js +109 -0
  7. package/src/adapters/abstract/application-adapter.ts +337 -0
  8. package/src/adapters/abstract/router-adapter.d.ts +26 -0
  9. package/src/adapters/abstract/router-adapter.js +5 -0
  10. package/src/adapters/abstract/router-adapter.ts +30 -0
  11. package/src/adapters/abstract/server-adapter.d.ts +69 -0
  12. package/src/adapters/abstract/server-adapter.js +15 -0
  13. package/src/adapters/abstract/server-adapter.ts +79 -0
  14. package/src/adapters/bun/client-bridge.d.ts +34 -0
  15. package/src/adapters/bun/client-bridge.js +48 -0
  16. package/src/adapters/bun/client-bridge.ts +62 -0
  17. package/src/adapters/bun/create-app.d.ts +60 -0
  18. package/src/adapters/bun/create-app.js +117 -0
  19. package/src/adapters/bun/create-app.ts +189 -0
  20. package/src/adapters/bun/define-api-handler.d.ts +61 -0
  21. package/src/adapters/bun/define-api-handler.js +15 -0
  22. package/src/adapters/bun/define-api-handler.ts +114 -0
  23. package/src/adapters/bun/hmr-manager.d.ts +84 -0
  24. package/src/adapters/bun/hmr-manager.js +227 -0
  25. package/src/adapters/bun/hmr-manager.ts +281 -0
  26. package/src/adapters/bun/index.d.ts +3 -0
  27. package/src/adapters/bun/index.js +8 -0
  28. package/src/adapters/bun/index.ts +3 -0
  29. package/src/adapters/bun/server-adapter.d.ts +155 -0
  30. package/src/adapters/bun/server-adapter.js +368 -0
  31. package/src/adapters/bun/server-adapter.ts +492 -0
  32. package/src/adapters/bun/server-lifecycle.d.ts +52 -0
  33. package/src/adapters/bun/server-lifecycle.js +120 -0
  34. package/src/adapters/bun/server-lifecycle.ts +154 -0
  35. package/src/adapters/index.d.ts +6 -0
  36. package/src/adapters/index.js +14 -0
  37. package/src/adapters/index.ts +6 -0
  38. package/src/adapters/node/create-app.d.ts +21 -0
  39. package/src/adapters/node/create-app.js +143 -0
  40. package/src/adapters/node/create-app.ts +179 -0
  41. package/src/adapters/node/index.d.ts +4 -0
  42. package/src/adapters/node/index.js +8 -0
  43. package/src/adapters/node/index.ts +9 -0
  44. package/src/adapters/node/node-client-bridge.d.ts +26 -0
  45. package/src/adapters/node/node-client-bridge.js +66 -0
  46. package/src/adapters/node/node-client-bridge.ts +79 -0
  47. package/src/adapters/node/node-hmr-manager.d.ts +62 -0
  48. package/src/adapters/node/node-hmr-manager.js +221 -0
  49. package/src/adapters/node/node-hmr-manager.ts +271 -0
  50. package/src/adapters/node/server-adapter.d.ts +190 -0
  51. package/src/adapters/node/server-adapter.js +420 -0
  52. package/src/adapters/node/server-adapter.ts +561 -0
  53. package/src/adapters/node/static-content-server.d.ts +24 -0
  54. package/src/adapters/node/static-content-server.js +166 -0
  55. package/src/adapters/node/static-content-server.ts +203 -0
  56. package/src/adapters/shared/api-response.d.ts +52 -0
  57. package/src/adapters/shared/api-response.js +96 -0
  58. package/src/adapters/shared/api-response.ts +104 -0
  59. package/src/adapters/shared/application-adapter.d.ts +18 -0
  60. package/src/adapters/shared/application-adapter.js +90 -0
  61. package/src/adapters/shared/application-adapter.ts +199 -0
  62. package/src/adapters/shared/explicit-static-route-matcher.d.ts +38 -0
  63. package/src/adapters/shared/explicit-static-route-matcher.js +100 -0
  64. package/src/adapters/shared/explicit-static-route-matcher.ts +134 -0
  65. package/src/adapters/shared/file-route-middleware-pipeline.d.ts +65 -0
  66. package/src/adapters/shared/file-route-middleware-pipeline.js +98 -0
  67. package/src/adapters/shared/file-route-middleware-pipeline.ts +123 -0
  68. package/src/adapters/shared/fs-server-response-factory.d.ts +19 -0
  69. package/src/adapters/shared/fs-server-response-factory.js +97 -0
  70. package/src/adapters/shared/fs-server-response-factory.ts +118 -0
  71. package/src/adapters/shared/fs-server-response-matcher.d.ts +71 -0
  72. package/src/adapters/shared/fs-server-response-matcher.js +155 -0
  73. package/src/adapters/shared/fs-server-response-matcher.ts +198 -0
  74. package/src/adapters/shared/render-context.d.ts +14 -0
  75. package/src/adapters/shared/render-context.js +69 -0
  76. package/src/adapters/shared/render-context.ts +105 -0
  77. package/src/adapters/shared/server-adapter.d.ts +87 -0
  78. package/src/adapters/shared/server-adapter.js +353 -0
  79. package/src/adapters/shared/server-adapter.ts +442 -0
  80. package/src/adapters/shared/server-route-handler.d.ts +89 -0
  81. package/src/adapters/shared/server-route-handler.js +120 -0
  82. package/src/adapters/shared/server-route-handler.ts +166 -0
  83. package/src/adapters/shared/server-static-builder.d.ts +38 -0
  84. package/src/adapters/shared/server-static-builder.js +46 -0
  85. package/src/adapters/shared/server-static-builder.ts +82 -0
  86. package/src/build/build-adapter.d.ts +74 -0
  87. package/src/build/build-adapter.js +54 -0
  88. package/src/build/build-adapter.ts +132 -0
  89. package/src/build/build-types.d.ts +57 -0
  90. package/src/build/build-types.js +0 -0
  91. package/src/build/build-types.ts +83 -0
  92. package/src/build/esbuild-build-adapter.d.ts +69 -0
  93. package/src/build/esbuild-build-adapter.js +390 -0
  94. package/src/build/esbuild-build-adapter.ts +510 -0
  95. package/src/config/config-builder.d.ts +227 -0
  96. package/src/config/config-builder.js +392 -0
  97. package/src/config/config-builder.ts +474 -0
  98. package/src/constants.d.ts +32 -0
  99. package/src/constants.js +21 -0
  100. package/src/constants.ts +39 -0
  101. package/src/create-app.d.ts +17 -0
  102. package/src/create-app.js +66 -0
  103. package/src/create-app.ts +87 -0
  104. package/src/declarations.d.ts +26 -0
  105. package/src/define-api-handler.d.ts +25 -0
  106. package/src/define-api-handler.js +15 -0
  107. package/src/define-api-handler.ts +66 -0
  108. package/src/dev/sc-server.d.ts +30 -0
  109. package/src/dev/sc-server.js +111 -0
  110. package/src/dev/sc-server.ts +143 -0
  111. package/src/eco/README.md +636 -0
  112. package/src/eco/component-render-context.d.ts +105 -0
  113. package/src/eco/component-render-context.js +77 -0
  114. package/src/eco/component-render-context.ts +202 -0
  115. package/src/eco/eco.d.ts +9 -0
  116. package/src/eco/eco.js +110 -0
  117. package/src/eco/eco.ts +221 -0
  118. package/src/eco/eco.types.d.ts +170 -0
  119. package/src/eco/eco.types.js +0 -0
  120. package/src/eco/eco.types.ts +202 -0
  121. package/src/eco/eco.utils.d.ts +40 -0
  122. package/src/eco/eco.utils.js +40 -0
  123. package/src/eco/eco.utils.ts +89 -0
  124. package/src/eco/global-injector-map.d.ts +16 -0
  125. package/src/eco/global-injector-map.js +80 -0
  126. package/src/eco/global-injector-map.ts +112 -0
  127. package/src/eco/lazy-injector-map.d.ts +8 -0
  128. package/src/eco/lazy-injector-map.js +70 -0
  129. package/src/eco/lazy-injector-map.ts +120 -0
  130. package/src/eco/module-dependencies.d.ts +18 -0
  131. package/src/eco/module-dependencies.js +49 -0
  132. package/src/eco/module-dependencies.ts +75 -0
  133. package/src/env.d.ts +20 -0
  134. package/src/errors/http-error.d.ts +31 -0
  135. package/src/errors/http-error.js +50 -0
  136. package/src/errors/http-error.ts +72 -0
  137. package/src/errors/index.d.ts +2 -0
  138. package/src/errors/index.js +4 -0
  139. package/src/errors/index.ts +2 -0
  140. package/src/errors/locals-access-error.d.ts +4 -0
  141. package/src/errors/locals-access-error.js +9 -0
  142. package/src/errors/locals-access-error.ts +7 -0
  143. package/src/global/app-logger.d.ts +2 -0
  144. package/src/global/app-logger.js +6 -0
  145. package/src/global/app-logger.ts +4 -0
  146. 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
  147. package/src/hmr/client/__screenshots__/hmr-runtime.test.browser.ts/HMR-Runtime-HMR-Server-Integration-should-load-fixture-app-page-1.png +0 -0
  148. package/src/hmr/client/__screenshots__/hmr-runtime.test.browser.ts/HMR-Runtime-WebSocket-Connection-should-connect-to-correct-HMR-endpoint-1.png +0 -0
  149. package/src/hmr/client/hmr-runtime.d.ts +10 -0
  150. package/src/hmr/client/hmr-runtime.js +86 -0
  151. package/src/hmr/client/hmr-runtime.ts +121 -0
  152. package/src/hmr/hmr-strategy.d.ts +159 -0
  153. package/src/hmr/hmr-strategy.js +29 -0
  154. package/src/hmr/hmr-strategy.ts +172 -0
  155. package/src/hmr/hmr.test.e2e.d.ts +1 -0
  156. package/src/hmr/hmr.test.e2e.js +50 -0
  157. package/src/hmr/hmr.test.e2e.ts +75 -0
  158. package/src/hmr/strategies/default-hmr-strategy.d.ts +43 -0
  159. package/src/hmr/strategies/default-hmr-strategy.js +34 -0
  160. package/src/hmr/strategies/default-hmr-strategy.ts +60 -0
  161. package/src/hmr/strategies/js-hmr-strategy.d.ts +136 -0
  162. package/src/hmr/strategies/js-hmr-strategy.js +179 -0
  163. package/src/hmr/strategies/js-hmr-strategy.ts +308 -0
  164. package/src/index.browser.d.ts +3 -0
  165. package/src/index.browser.js +4 -0
  166. package/src/index.browser.ts +3 -0
  167. package/src/index.d.ts +5 -0
  168. package/src/index.js +10 -0
  169. package/src/index.ts +5 -0
  170. package/src/integrations/ghtml/ghtml-renderer.d.ts +15 -0
  171. package/src/integrations/ghtml/ghtml-renderer.js +60 -0
  172. package/src/integrations/ghtml/ghtml-renderer.ts +93 -0
  173. package/src/integrations/ghtml/ghtml.plugin.d.ts +20 -0
  174. package/src/integrations/ghtml/ghtml.plugin.js +21 -0
  175. package/src/integrations/ghtml/ghtml.plugin.ts +32 -0
  176. package/src/internal-types.d.ts +200 -0
  177. package/src/internal-types.js +0 -0
  178. package/src/internal-types.ts +212 -0
  179. package/src/plugins/alias-resolver-plugin.d.ts +2 -0
  180. package/src/plugins/alias-resolver-plugin.js +39 -0
  181. package/src/plugins/alias-resolver-plugin.ts +45 -0
  182. package/src/plugins/eco-component-meta-plugin.d.ts +95 -0
  183. package/src/plugins/eco-component-meta-plugin.js +157 -0
  184. package/src/plugins/eco-component-meta-plugin.ts +474 -0
  185. package/src/plugins/integration-plugin.d.ts +102 -0
  186. package/src/plugins/integration-plugin.js +100 -0
  187. package/src/plugins/integration-plugin.ts +184 -0
  188. package/src/plugins/processor.d.ts +82 -0
  189. package/src/plugins/processor.js +122 -0
  190. package/src/plugins/processor.ts +220 -0
  191. package/src/public-types.d.ts +1094 -0
  192. package/src/public-types.js +0 -0
  193. package/src/public-types.ts +1255 -0
  194. package/src/route-renderer/GRAPH.md +387 -0
  195. package/src/route-renderer/README.md +135 -0
  196. package/src/route-renderer/component-graph-executor.d.ts +32 -0
  197. package/src/route-renderer/component-graph-executor.js +31 -0
  198. package/src/route-renderer/component-graph-executor.ts +84 -0
  199. package/src/route-renderer/component-graph.d.ts +42 -0
  200. package/src/route-renderer/component-graph.js +72 -0
  201. package/src/route-renderer/component-graph.ts +159 -0
  202. package/src/route-renderer/component-marker.d.ts +52 -0
  203. package/src/route-renderer/component-marker.js +46 -0
  204. package/src/route-renderer/component-marker.ts +117 -0
  205. package/src/route-renderer/dependency-resolver.d.ts +24 -0
  206. package/src/route-renderer/dependency-resolver.js +428 -0
  207. package/src/route-renderer/dependency-resolver.ts +596 -0
  208. package/src/route-renderer/html-post-processing.service.d.ts +40 -0
  209. package/src/route-renderer/html-post-processing.service.js +86 -0
  210. package/src/route-renderer/html-post-processing.service.ts +103 -0
  211. package/src/route-renderer/integration-renderer.d.ts +339 -0
  212. package/src/route-renderer/integration-renderer.js +526 -0
  213. package/src/route-renderer/integration-renderer.ts +696 -0
  214. package/src/route-renderer/marker-graph-resolver.d.ts +76 -0
  215. package/src/route-renderer/marker-graph-resolver.js +93 -0
  216. package/src/route-renderer/marker-graph-resolver.ts +153 -0
  217. package/src/route-renderer/page-module-loader.d.ts +61 -0
  218. package/src/route-renderer/page-module-loader.js +102 -0
  219. package/src/route-renderer/page-module-loader.ts +153 -0
  220. package/src/route-renderer/render-execution.service.d.ts +69 -0
  221. package/src/route-renderer/render-execution.service.js +91 -0
  222. package/src/route-renderer/render-execution.service.ts +158 -0
  223. package/src/route-renderer/render-preparation.service.d.ts +112 -0
  224. package/src/route-renderer/render-preparation.service.js +243 -0
  225. package/src/route-renderer/render-preparation.service.ts +358 -0
  226. package/src/route-renderer/route-renderer.d.ts +26 -0
  227. package/src/route-renderer/route-renderer.js +68 -0
  228. package/src/route-renderer/route-renderer.ts +80 -0
  229. package/src/router/fs-router-scanner.d.ts +41 -0
  230. package/src/router/fs-router-scanner.js +155 -0
  231. package/src/router/fs-router-scanner.ts +217 -0
  232. package/src/router/fs-router.d.ts +26 -0
  233. package/src/router/fs-router.js +100 -0
  234. package/src/router/fs-router.ts +122 -0
  235. package/src/services/asset-processing-service/asset-processing.service.d.ts +41 -0
  236. package/src/services/asset-processing-service/asset-processing.service.js +250 -0
  237. package/src/services/asset-processing-service/asset-processing.service.ts +306 -0
  238. package/src/services/asset-processing-service/asset.factory.d.ts +17 -0
  239. package/src/services/asset-processing-service/asset.factory.js +82 -0
  240. package/src/services/asset-processing-service/asset.factory.ts +105 -0
  241. package/src/services/asset-processing-service/assets.types.d.ts +88 -0
  242. package/src/services/asset-processing-service/assets.types.js +0 -0
  243. package/src/services/asset-processing-service/assets.types.ts +112 -0
  244. package/src/services/asset-processing-service/index.d.ts +3 -0
  245. package/src/services/asset-processing-service/index.js +3 -0
  246. package/src/services/asset-processing-service/index.ts +3 -0
  247. package/src/services/asset-processing-service/processor.interface.d.ts +22 -0
  248. package/src/services/asset-processing-service/processor.interface.js +6 -0
  249. package/src/services/asset-processing-service/processor.interface.ts +27 -0
  250. package/src/services/asset-processing-service/processor.registry.d.ts +8 -0
  251. package/src/services/asset-processing-service/processor.registry.js +15 -0
  252. package/src/services/asset-processing-service/processor.registry.ts +18 -0
  253. package/src/services/asset-processing-service/processors/base/base-processor.d.ts +24 -0
  254. package/src/services/asset-processing-service/processors/base/base-processor.js +59 -0
  255. package/src/services/asset-processing-service/processors/base/base-processor.ts +76 -0
  256. package/src/services/asset-processing-service/processors/base/base-script-processor.d.ts +16 -0
  257. package/src/services/asset-processing-service/processors/base/base-script-processor.js +80 -0
  258. package/src/services/asset-processing-service/processors/base/base-script-processor.ts +105 -0
  259. package/src/services/asset-processing-service/processors/index.d.ts +5 -0
  260. package/src/services/asset-processing-service/processors/index.js +5 -0
  261. package/src/services/asset-processing-service/processors/index.ts +5 -0
  262. package/src/services/asset-processing-service/processors/script/content-script.processor.d.ts +5 -0
  263. package/src/services/asset-processing-service/processors/script/content-script.processor.js +57 -0
  264. package/src/services/asset-processing-service/processors/script/content-script.processor.ts +66 -0
  265. package/src/services/asset-processing-service/processors/script/file-script.processor.d.ts +8 -0
  266. package/src/services/asset-processing-service/processors/script/file-script.processor.js +76 -0
  267. package/src/services/asset-processing-service/processors/script/file-script.processor.ts +88 -0
  268. package/src/services/asset-processing-service/processors/script/node-module-script.processor.d.ts +7 -0
  269. package/src/services/asset-processing-service/processors/script/node-module-script.processor.js +74 -0
  270. package/src/services/asset-processing-service/processors/script/node-module-script.processor.ts +84 -0
  271. package/src/services/asset-processing-service/processors/stylesheet/content-stylesheet.processor.d.ts +5 -0
  272. package/src/services/asset-processing-service/processors/stylesheet/content-stylesheet.processor.js +25 -0
  273. package/src/services/asset-processing-service/processors/stylesheet/content-stylesheet.processor.ts +27 -0
  274. package/src/services/asset-processing-service/processors/stylesheet/file-stylesheet.processor.d.ts +9 -0
  275. package/src/services/asset-processing-service/processors/stylesheet/file-stylesheet.processor.js +63 -0
  276. package/src/services/asset-processing-service/processors/stylesheet/file-stylesheet.processor.ts +77 -0
  277. package/src/services/cache/cache.types.d.ts +107 -0
  278. package/src/services/cache/cache.types.js +0 -0
  279. package/src/services/cache/cache.types.ts +126 -0
  280. package/src/services/cache/index.d.ts +7 -0
  281. package/src/services/cache/index.js +7 -0
  282. package/src/services/cache/index.ts +18 -0
  283. package/src/services/cache/memory-cache-store.d.ts +42 -0
  284. package/src/services/cache/memory-cache-store.js +98 -0
  285. package/src/services/cache/memory-cache-store.ts +130 -0
  286. package/src/services/cache/page-cache-service.d.ts +70 -0
  287. package/src/services/cache/page-cache-service.js +152 -0
  288. package/src/services/cache/page-cache-service.ts +202 -0
  289. package/src/services/html-transformer.service.d.ts +50 -0
  290. package/src/services/html-transformer.service.js +163 -0
  291. package/src/services/html-transformer.service.ts +217 -0
  292. package/src/services/page-module-import.service.d.ts +37 -0
  293. package/src/services/page-module-import.service.js +88 -0
  294. package/src/services/page-module-import.service.ts +129 -0
  295. package/src/services/page-request-cache-coordinator.service.d.ts +75 -0
  296. package/src/services/page-request-cache-coordinator.service.js +107 -0
  297. package/src/services/page-request-cache-coordinator.service.ts +128 -0
  298. package/src/services/schema-validation-service.d.ts +122 -0
  299. package/src/services/schema-validation-service.js +101 -0
  300. package/src/services/schema-validation-service.ts +204 -0
  301. package/src/services/validation/standard-schema.types.d.ts +65 -0
  302. package/src/services/validation/standard-schema.types.js +0 -0
  303. package/src/services/validation/standard-schema.types.ts +68 -0
  304. package/src/static-site-generator/static-site-generator.d.ts +57 -0
  305. package/src/static-site-generator/static-site-generator.js +272 -0
  306. package/src/static-site-generator/static-site-generator.ts +359 -0
  307. package/src/utils/css.d.ts +1 -0
  308. package/src/utils/css.js +7 -0
  309. package/src/utils/css.ts +5 -0
  310. package/src/utils/deep-merge.d.ts +14 -0
  311. package/src/utils/deep-merge.js +32 -0
  312. package/src/utils/deep-merge.ts +47 -0
  313. package/src/utils/hash.d.ts +1 -0
  314. package/src/utils/hash.js +7 -0
  315. package/src/utils/hash.ts +5 -0
  316. package/src/utils/html.d.ts +1 -0
  317. package/src/utils/html.js +4 -0
  318. package/src/utils/html.ts +1 -0
  319. package/src/utils/invariant.d.ts +5 -0
  320. package/src/utils/invariant.js +11 -0
  321. package/src/utils/invariant.ts +15 -0
  322. package/src/utils/locals-utils.d.ts +15 -0
  323. package/src/utils/locals-utils.js +24 -0
  324. package/src/utils/locals-utils.ts +37 -0
  325. package/src/utils/parse-cli-args.d.ts +24 -0
  326. package/src/utils/parse-cli-args.js +47 -0
  327. package/src/utils/parse-cli-args.ts +83 -0
  328. package/src/utils/path-utils.module.d.ts +5 -0
  329. package/src/utils/path-utils.module.js +14 -0
  330. package/src/utils/path-utils.module.ts +14 -0
  331. package/src/utils/runtime.d.ts +11 -0
  332. package/src/utils/runtime.js +40 -0
  333. package/src/utils/runtime.ts +44 -0
  334. package/src/utils/server-utils.module.d.ts +19 -0
  335. package/src/utils/server-utils.module.js +56 -0
  336. package/src/utils/server-utils.module.ts +67 -0
  337. package/src/watchers/project-watcher.d.ts +120 -0
  338. package/src/watchers/project-watcher.js +238 -0
  339. package/src/watchers/project-watcher.test-helpers.d.ts +4 -0
  340. package/src/watchers/project-watcher.test-helpers.js +51 -0
  341. package/src/watchers/project-watcher.test-helpers.ts +40 -0
  342. package/src/watchers/project-watcher.ts +306 -0
@@ -0,0 +1,428 @@
1
+ import path from "node:path";
2
+ import { readFileSync } from "node:fs";
3
+ import { rapidhash } from "../utils/hash.js";
4
+ import { AssetFactory } from "../services/asset-processing-service/index.js";
5
+ import { normalizeModuleDeclarations } from "../eco/module-dependencies.js";
6
+ import { parseSync } from "oxc-parser";
7
+ const DEPENDENCY_ERRORS = {
8
+ INVALID_STYLESHEET_ENTRY: "Invalid stylesheet dependency entry: expected src or content",
9
+ INVALID_SCRIPT_ENTRY: "Invalid script dependency entry: expected src or content",
10
+ LAZY_SCRIPT_MISSING_SRC: "Lazy script dependency entry in dependencies.scripts requires a src value"
11
+ };
12
+ function extractEcopagesVirtualImports(file) {
13
+ let source;
14
+ try {
15
+ source = readFileSync(file, "utf-8");
16
+ } catch {
17
+ return [];
18
+ }
19
+ let result;
20
+ try {
21
+ result = parseSync(file, source, { sourceType: "module" });
22
+ } catch {
23
+ return [];
24
+ }
25
+ const found = /* @__PURE__ */ new Map();
26
+ for (const node of result.program.body ?? []) {
27
+ if (node.type !== "ImportDeclaration") continue;
28
+ if (node.importKind === "type") continue;
29
+ const specifier = node.source?.value ?? "";
30
+ if (!specifier.startsWith("ecopages:")) continue;
31
+ if (found.get(specifier) === null) {
32
+ continue;
33
+ }
34
+ const namedImports = [];
35
+ for (const spec of node.specifiers ?? []) {
36
+ if (spec.type === "ImportSpecifier") {
37
+ const importedName = spec.imported?.type === "Identifier" ? spec.imported.name : spec.imported?.type === "Literal" ? spec.imported.value : spec.local?.name;
38
+ namedImports.push(importedName);
39
+ }
40
+ }
41
+ if (namedImports.length === 0) {
42
+ found.set(specifier, null);
43
+ continue;
44
+ }
45
+ const existing = found.get(specifier);
46
+ if (!existing) {
47
+ found.set(specifier, new Set(namedImports));
48
+ continue;
49
+ }
50
+ for (const imported of namedImports) {
51
+ existing.add(imported);
52
+ }
53
+ }
54
+ return Array.from(found.entries()).map(([from, importsSet]) => ({
55
+ from,
56
+ imports: importsSet ? Array.from(importsSet) : void 0
57
+ }));
58
+ }
59
+ function createModuleScriptName(from, imports) {
60
+ const normalizedImports = imports ? [...imports].sort().join(",") : "*";
61
+ const hash = rapidhash(`${from}|${normalizedImports}`).toString(16);
62
+ return `module-${hash}`;
63
+ }
64
+ function createNamedImportModuleSource(from, imports) {
65
+ const namedImports = imports.join(", ");
66
+ return `export { ${namedImports} } from '${from}';`;
67
+ }
68
+ function createNamespaceImportModuleSource(from) {
69
+ return `export * from '${from}';`;
70
+ }
71
+ function resolveDependencyPath(componentDir, pathUrl) {
72
+ return path.join(componentDir, pathUrl);
73
+ }
74
+ function isDependencyEntryObject(entry) {
75
+ return typeof entry === "object" && entry !== null;
76
+ }
77
+ function getDependencyEntrySrc(entry) {
78
+ return isDependencyEntryObject(entry) ? entry.src : entry;
79
+ }
80
+ function getDependencyEntryContent(entry) {
81
+ return isDependencyEntryObject(entry) ? entry.content : void 0;
82
+ }
83
+ function getDependencyEntryAttributes(entry) {
84
+ return isDependencyEntryObject(entry) ? entry.attributes : void 0;
85
+ }
86
+ function getDependencyEntrySrcOrThrow(entry, errorMessage) {
87
+ const src = getDependencyEntrySrc(entry);
88
+ if (!src) {
89
+ throw new Error(errorMessage);
90
+ }
91
+ return src;
92
+ }
93
+ function getLazyTriggerKey(lazy) {
94
+ if ("on:idle" in lazy) {
95
+ return "on:idle";
96
+ }
97
+ if ("on:interaction" in lazy) {
98
+ return `on:interaction:${lazy["on:interaction"]}`;
99
+ }
100
+ if ("on:visible" in lazy) {
101
+ const value = lazy["on:visible"];
102
+ return `on:visible:${value === true ? "true" : value}`;
103
+ }
104
+ return JSON.stringify(lazy);
105
+ }
106
+ function resolveLazyScripts(appConfig, componentDir, scripts) {
107
+ const getSafeFileName = (filepath) => {
108
+ const EXTENSIONS_TO_JS = ["ts", "tsx"];
109
+ const safe = filepath.replace(new RegExp(`\\.(${EXTENSIONS_TO_JS.join("|")})$`), ".js");
110
+ return safe.startsWith("./") ? safe.slice(2) : safe;
111
+ };
112
+ const baseDir = componentDir.split(appConfig.srcDir)[1] ?? "";
113
+ const resolvedPaths = scripts.map((script) => {
114
+ const relativePath = [AssetFactory.RESOLVED_ASSETS_DIR, baseDir, getSafeFileName(script)].filter(Boolean).join("/").replace(/\/+/g, "/");
115
+ return `/${relativePath.replace(/^\/+/, "")}`;
116
+ });
117
+ return resolvedPaths.join(",");
118
+ }
119
+ function buildResolvedLazyTriggers(config, groups) {
120
+ if (groups.length === 0) return [];
121
+ const componentFile = config.__eco?.file ?? "";
122
+ const sortedUrls = groups.flatMap((group) => group.scripts).sort().join(",");
123
+ const triggerId = `eco-trigger-${rapidhash(`${componentFile}:${sortedUrls}`).toString(16)}`;
124
+ const rules = groups.map((group) => {
125
+ const { scripts, lazy } = group;
126
+ if ("on:idle" in lazy) {
127
+ return { "on:idle": { scripts } };
128
+ }
129
+ if ("on:interaction" in lazy) {
130
+ return { "on:interaction": { value: lazy["on:interaction"], scripts } };
131
+ }
132
+ if ("on:visible" in lazy) {
133
+ const visibleSelector = lazy["on:visible"];
134
+ if (visibleSelector === true) return { "on:visible": { scripts } };
135
+ return { "on:visible": { value: String(visibleSelector), scripts } };
136
+ }
137
+ throw new Error(`Unknown lazy trigger kind: ${JSON.stringify(lazy)}`);
138
+ });
139
+ return [{ triggerId, rules }];
140
+ }
141
+ class DependencyResolverService {
142
+ constructor(appConfig, assetProcessingService) {
143
+ this.appConfig = appConfig;
144
+ this.assetProcessingService = assetProcessingService;
145
+ }
146
+ resolveDependencyPath(componentDir, pathUrl) {
147
+ return resolveDependencyPath(componentDir, pathUrl);
148
+ }
149
+ /**
150
+ * Maps lazy script source entries to deterministic fallback public URLs
151
+ * used when bundling output URLs are unavailable.
152
+ */
153
+ resolveLazyScripts(componentDir, scripts) {
154
+ return resolveLazyScripts(this.appConfig, componentDir, scripts);
155
+ }
156
+ /**
157
+ * Collects and processes component dependencies (styles, scripts, modules, lazy scripts).
158
+ * Lazy dependencies are always resolved into global-injector trigger maps.
159
+ */
160
+ async processComponentDependencies(components, integrationName) {
161
+ if (!this.assetProcessingService?.processDependencies) return [];
162
+ const dependencies = [];
163
+ const lazyScriptsByConfig = /* @__PURE__ */ new Map();
164
+ const lazyDependencyKeys = /* @__PURE__ */ new Set();
165
+ for (const component of components) {
166
+ const componentFile = component.config?.__eco?.file;
167
+ if (!componentFile) continue;
168
+ const stylesheetDependencyKeys = /* @__PURE__ */ new Set();
169
+ const scriptDependencyKeys = /* @__PURE__ */ new Set();
170
+ const modulesMap = /* @__PURE__ */ new Map();
171
+ const collect = (config) => {
172
+ if (!config) return;
173
+ const file = config.__eco?.file;
174
+ if (!file) return;
175
+ const dir = path.dirname(file);
176
+ const dependenciesConfig = config.dependencies;
177
+ const registerLazyScript = ({
178
+ lazy,
179
+ lazyKey,
180
+ fallbackUrl
181
+ }) => {
182
+ let grouped = lazyScriptsByConfig.get(config);
183
+ if (!grouped) {
184
+ grouped = /* @__PURE__ */ new Map();
185
+ lazyScriptsByConfig.set(config, grouped);
186
+ }
187
+ const triggerKey = getLazyTriggerKey(lazy);
188
+ const existing = grouped.get(triggerKey) ?? { lazy, scripts: [] };
189
+ existing.scripts.push({ lazyKey, fallbackUrl });
190
+ grouped.set(triggerKey, existing);
191
+ };
192
+ if (dependenciesConfig?.stylesheets) {
193
+ for (const style of dependenciesConfig.stylesheets) {
194
+ const content = getDependencyEntryContent(style);
195
+ const src = getDependencyEntrySrc(style);
196
+ const attributes = getDependencyEntryAttributes(style);
197
+ if (content) {
198
+ const depKey2 = `style:content:${content}:${JSON.stringify(attributes ?? {})}`;
199
+ if (stylesheetDependencyKeys.has(depKey2)) {
200
+ continue;
201
+ }
202
+ stylesheetDependencyKeys.add(depKey2);
203
+ dependencies.push(
204
+ AssetFactory.createContentStylesheet({
205
+ content,
206
+ position: "head",
207
+ attributes
208
+ })
209
+ );
210
+ continue;
211
+ }
212
+ if (!src) {
213
+ throw new Error(DEPENDENCY_ERRORS.INVALID_STYLESHEET_ENTRY);
214
+ }
215
+ const resolvedPath = resolveDependencyPath(dir, src);
216
+ const depKey = `style:file:${resolvedPath}:${JSON.stringify(attributes ?? {})}`;
217
+ if (stylesheetDependencyKeys.has(depKey)) {
218
+ continue;
219
+ }
220
+ stylesheetDependencyKeys.add(depKey);
221
+ dependencies.push(
222
+ AssetFactory.createFileStylesheet({
223
+ filepath: resolvedPath,
224
+ position: "head",
225
+ attributes: {
226
+ rel: "stylesheet",
227
+ ...attributes
228
+ }
229
+ })
230
+ );
231
+ }
232
+ }
233
+ if (dependenciesConfig?.scripts) {
234
+ for (const script of dependenciesConfig.scripts) {
235
+ if (isDependencyEntryObject(script) && script.lazy) {
236
+ continue;
237
+ }
238
+ const content = getDependencyEntryContent(script);
239
+ const src = getDependencyEntrySrc(script);
240
+ const attributes = getDependencyEntryAttributes(script);
241
+ if (content) {
242
+ const depKey2 = `script:content:${content}:${JSON.stringify(attributes ?? {})}`;
243
+ if (scriptDependencyKeys.has(depKey2)) {
244
+ continue;
245
+ }
246
+ scriptDependencyKeys.add(depKey2);
247
+ dependencies.push(
248
+ AssetFactory.createContentScript({
249
+ position: "head",
250
+ content,
251
+ attributes: {
252
+ type: "module",
253
+ defer: "",
254
+ ...attributes
255
+ }
256
+ })
257
+ );
258
+ continue;
259
+ }
260
+ if (!src) {
261
+ throw new Error(DEPENDENCY_ERRORS.INVALID_SCRIPT_ENTRY);
262
+ }
263
+ const resolvedPath = resolveDependencyPath(dir, src);
264
+ const depKey = `script:file:${resolvedPath}:${JSON.stringify(attributes ?? {})}`;
265
+ if (scriptDependencyKeys.has(depKey)) {
266
+ continue;
267
+ }
268
+ scriptDependencyKeys.add(depKey);
269
+ dependencies.push(
270
+ AssetFactory.createFileScript({
271
+ filepath: resolvedPath,
272
+ position: "head",
273
+ attributes: {
274
+ type: "module",
275
+ defer: "",
276
+ ...attributes
277
+ }
278
+ })
279
+ );
280
+ }
281
+ }
282
+ const normalizedModules = normalizeModuleDeclarations(dependenciesConfig?.modules);
283
+ for (const declaration of normalizedModules) {
284
+ const existing = modulesMap.get(declaration.from);
285
+ if (!declaration.imports || declaration.imports.length === 0) {
286
+ modulesMap.set(declaration.from, null);
287
+ continue;
288
+ }
289
+ if (existing === null) {
290
+ continue;
291
+ }
292
+ const merged = existing ?? /* @__PURE__ */ new Set();
293
+ for (const imported of declaration.imports) {
294
+ merged.add(imported);
295
+ }
296
+ modulesMap.set(declaration.from, merged);
297
+ }
298
+ for (const [index, scriptEntry] of (dependenciesConfig?.scripts ?? []).entries()) {
299
+ if (!isDependencyEntryObject(scriptEntry) || !scriptEntry.lazy) {
300
+ continue;
301
+ }
302
+ const lazy = scriptEntry.lazy;
303
+ const content = scriptEntry.content;
304
+ const src = scriptEntry.src;
305
+ const attributes = scriptEntry.attributes;
306
+ if (content) {
307
+ const lazyKey2 = `lazy:${rapidhash(`${file}:entry:${index}:${content}`).toString(16)}`;
308
+ const depKey2 = `lazy:entry:content:${getLazyTriggerKey(lazy)}:${content}:${JSON.stringify(attributes ?? {})}`;
309
+ if (!lazyDependencyKeys.has(depKey2)) {
310
+ lazyDependencyKeys.add(depKey2);
311
+ dependencies.push(
312
+ AssetFactory.createContentScript({
313
+ position: "head",
314
+ content,
315
+ excludeFromHtml: true,
316
+ attributes: {
317
+ type: "module",
318
+ defer: "",
319
+ "data-eco-lazy-key": lazyKey2,
320
+ ...attributes
321
+ }
322
+ })
323
+ );
324
+ }
325
+ registerLazyScript({
326
+ lazy,
327
+ lazyKey: lazyKey2
328
+ });
329
+ continue;
330
+ }
331
+ const script = src ?? getDependencyEntrySrcOrThrow(scriptEntry, DEPENDENCY_ERRORS.LAZY_SCRIPT_MISSING_SRC);
332
+ const resolvedPath = this.resolveDependencyPath(dir, script);
333
+ const fallbackUrl = this.resolveLazyScripts(dir, [script]).split(",")[0] ?? "";
334
+ const lazyKey = `lazy:${rapidhash(`${resolvedPath}:${getLazyTriggerKey(lazy)}`).toString(16)}`;
335
+ const depKey = `lazy:entry:file:${getLazyTriggerKey(lazy)}:${resolvedPath}:${JSON.stringify(attributes ?? {})}`;
336
+ if (!lazyDependencyKeys.has(depKey)) {
337
+ lazyDependencyKeys.add(depKey);
338
+ dependencies.push(
339
+ AssetFactory.createFileScript({
340
+ filepath: resolvedPath,
341
+ position: "head",
342
+ excludeFromHtml: true,
343
+ attributes: {
344
+ type: "module",
345
+ defer: "",
346
+ "data-eco-lazy-key": lazyKey,
347
+ ...attributes
348
+ }
349
+ })
350
+ );
351
+ }
352
+ registerLazyScript({
353
+ lazy,
354
+ lazyKey,
355
+ fallbackUrl
356
+ });
357
+ }
358
+ if (dependenciesConfig?.components) {
359
+ for (const nestedComponent of dependenciesConfig.components) {
360
+ if (nestedComponent.config) {
361
+ collect(nestedComponent.config);
362
+ }
363
+ }
364
+ }
365
+ const autoVirtualImports = extractEcopagesVirtualImports(file);
366
+ for (const { from, imports } of autoVirtualImports) {
367
+ const existing = modulesMap.get(from);
368
+ if (!imports || imports.length === 0) {
369
+ if (existing !== null) modulesMap.set(from, null);
370
+ continue;
371
+ }
372
+ if (existing === null) continue;
373
+ const merged = existing ?? /* @__PURE__ */ new Set();
374
+ for (const imported of imports) merged.add(imported);
375
+ modulesMap.set(from, merged);
376
+ }
377
+ };
378
+ collect(component.config);
379
+ dependencies.push(
380
+ ...Array.from(modulesMap.entries()).map(([from, importsSet]) => {
381
+ const imports = importsSet ? Array.from(importsSet) : void 0;
382
+ return AssetFactory.createContentScript({
383
+ position: "head",
384
+ name: createModuleScriptName(from, imports),
385
+ content: imports && imports.length > 0 ? createNamedImportModuleSource(from, imports) : createNamespaceImportModuleSource(from),
386
+ attributes: {
387
+ type: "module",
388
+ defer: ""
389
+ }
390
+ });
391
+ })
392
+ );
393
+ }
394
+ const hasLazyDependencies = dependencies.some((dep) => dep.kind === "script" && dep.excludeFromHtml === true);
395
+ const processedDependencies = await this.assetProcessingService.processDependencies(
396
+ dependencies,
397
+ integrationName
398
+ );
399
+ const lazyKeyToOutputUrl = /* @__PURE__ */ new Map();
400
+ for (const dependency of processedDependencies) {
401
+ if (dependency.kind === "script" && dependency.srcUrl) {
402
+ const lazyKey = dependency.attributes?.["data-eco-lazy-key"];
403
+ if (lazyKey) {
404
+ lazyKeyToOutputUrl.set(lazyKey, dependency.srcUrl);
405
+ }
406
+ }
407
+ }
408
+ for (const [config, lazyGroupsMap] of lazyScriptsByConfig.entries()) {
409
+ const rawGroups = [];
410
+ for (const group of lazyGroupsMap.values()) {
411
+ const resolvedUrls = group.scripts.map(({ lazyKey, fallbackUrl }) => lazyKeyToOutputUrl.get(lazyKey) ?? fallbackUrl).filter((url) => Boolean(url && url.length > 0));
412
+ if (resolvedUrls.length === 0) {
413
+ continue;
414
+ }
415
+ rawGroups.push({ lazy: group.lazy, scripts: Array.from(new Set(resolvedUrls)) });
416
+ }
417
+ if (hasLazyDependencies) {
418
+ config._resolvedLazyTriggers = buildResolvedLazyTriggers(config, rawGroups);
419
+ config._resolvedLazyScripts = void 0;
420
+ }
421
+ }
422
+ return processedDependencies;
423
+ }
424
+ }
425
+ export {
426
+ DEPENDENCY_ERRORS,
427
+ DependencyResolverService
428
+ };