every-plugin 2.10.1 → 3.0.0-rc.3

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 (462) hide show
  1. package/bin/every-plugin-serve.mjs +12 -0
  2. package/bin/every-plugin.mjs +59 -0
  3. package/dist/_virtual/_rolldown/runtime.cjs +1 -2
  4. package/dist/build/artifact-names.cjs +119 -0
  5. package/dist/build/artifact-names.cjs.map +1 -0
  6. package/dist/build/artifact-names.d.cts +68 -0
  7. package/dist/build/artifact-names.d.cts.map +1 -0
  8. package/dist/build/artifact-names.d.mts +68 -0
  9. package/dist/build/artifact-names.d.mts.map +1 -0
  10. package/dist/build/artifact-names.mjs +102 -0
  11. package/dist/build/artifact-names.mjs.map +1 -0
  12. package/dist/build/contract-types.cjs +89 -0
  13. package/dist/build/contract-types.cjs.map +1 -0
  14. package/dist/build/contract-types.mjs +81 -0
  15. package/dist/build/contract-types.mjs.map +1 -0
  16. package/dist/build/rspack/build-report-plugin.cjs +37 -0
  17. package/dist/build/rspack/build-report-plugin.cjs.map +1 -0
  18. package/dist/build/rspack/build-report-plugin.d.cts +18 -0
  19. package/dist/build/rspack/build-report-plugin.d.cts.map +1 -0
  20. package/dist/build/rspack/build-report-plugin.d.mts +18 -0
  21. package/dist/build/rspack/build-report-plugin.d.mts.map +1 -0
  22. package/dist/build/rspack/build-report-plugin.mjs +37 -0
  23. package/dist/build/rspack/build-report-plugin.mjs.map +1 -0
  24. package/dist/build/rspack/chunk-completeness-plugin.cjs +47 -0
  25. package/dist/build/rspack/chunk-completeness-plugin.cjs.map +1 -0
  26. package/dist/build/rspack/chunk-completeness-plugin.mjs +47 -0
  27. package/dist/build/rspack/chunk-completeness-plugin.mjs.map +1 -0
  28. package/dist/build/rspack/compose.cjs +69 -0
  29. package/dist/build/rspack/compose.cjs.map +1 -0
  30. package/dist/build/rspack/compose.d.cts +20 -0
  31. package/dist/build/rspack/compose.d.cts.map +1 -0
  32. package/dist/build/rspack/compose.d.mts +20 -0
  33. package/dist/build/rspack/compose.d.mts.map +1 -0
  34. package/dist/build/rspack/compose.mjs +65 -0
  35. package/dist/build/rspack/compose.mjs.map +1 -0
  36. package/dist/build/rspack/fix-mf-data-uri-plugin.cjs +11 -11
  37. package/dist/build/rspack/fix-mf-data-uri-plugin.cjs.map +1 -1
  38. package/dist/build/rspack/fix-mf-data-uri-plugin.d.cts +2 -0
  39. package/dist/build/rspack/fix-mf-data-uri-plugin.d.cts.map +1 -1
  40. package/dist/build/rspack/fix-mf-data-uri-plugin.d.mts +2 -0
  41. package/dist/build/rspack/fix-mf-data-uri-plugin.d.mts.map +1 -1
  42. package/dist/build/rspack/fix-mf-data-uri-plugin.mjs +11 -10
  43. package/dist/build/rspack/fix-mf-data-uri-plugin.mjs.map +1 -1
  44. package/dist/build/rspack/generated-config.cjs +35 -0
  45. package/dist/build/rspack/generated-config.cjs.map +1 -0
  46. package/dist/build/rspack/generated-config.mjs +32 -0
  47. package/dist/build/rspack/generated-config.mjs.map +1 -0
  48. package/dist/build/rspack/index.cjs +8 -5
  49. package/dist/build/rspack/index.d.cts +5 -3
  50. package/dist/build/rspack/index.d.mts +5 -3
  51. package/dist/build/rspack/index.mjs +5 -3
  52. package/dist/build/rspack/module-federation.cjs +2 -2
  53. package/dist/build/rspack/module-federation.cjs.map +1 -1
  54. package/dist/build/rspack/module-federation.mjs +1 -1
  55. package/dist/build/rspack/module-federation.mjs.map +1 -1
  56. package/dist/build/rspack/plugin.cjs +44 -69
  57. package/dist/build/rspack/plugin.cjs.map +1 -1
  58. package/dist/build/rspack/plugin.d.cts +4 -13
  59. package/dist/build/rspack/plugin.d.cts.map +1 -1
  60. package/dist/build/rspack/plugin.d.mts +4 -13
  61. package/dist/build/rspack/plugin.d.mts.map +1 -1
  62. package/dist/build/rspack/plugin.mjs +44 -69
  63. package/dist/build/rspack/plugin.mjs.map +1 -1
  64. package/dist/build/rspack/utils.cjs +7 -5
  65. package/dist/build/rspack/utils.cjs.map +1 -1
  66. package/dist/build/rspack/utils.mjs +7 -6
  67. package/dist/build/rspack/utils.mjs.map +1 -1
  68. package/dist/build/ui/factory.cjs +88 -0
  69. package/dist/build/ui/factory.cjs.map +1 -0
  70. package/dist/build/ui/factory.d.cts +11 -0
  71. package/dist/build/ui/factory.d.cts.map +1 -0
  72. package/dist/build/ui/factory.d.mts +11 -0
  73. package/dist/build/ui/factory.d.mts.map +1 -0
  74. package/dist/build/ui/factory.mjs +80 -0
  75. package/dist/build/ui/factory.mjs.map +1 -0
  76. package/dist/build/ui/generated-config.cjs +118 -0
  77. package/dist/build/ui/generated-config.cjs.map +1 -0
  78. package/dist/build/ui/generated-config.d.cts +33 -0
  79. package/dist/build/ui/generated-config.d.cts.map +1 -0
  80. package/dist/build/ui/generated-config.d.mts +33 -0
  81. package/dist/build/ui/generated-config.d.mts.map +1 -0
  82. package/dist/build/ui/generated-config.mjs +111 -0
  83. package/dist/build/ui/generated-config.mjs.map +1 -0
  84. package/dist/build/ui/hash-artifacts-plugin.cjs +61 -0
  85. package/dist/build/ui/hash-artifacts-plugin.cjs.map +1 -0
  86. package/dist/build/ui/hash-artifacts-plugin.d.cts +20 -0
  87. package/dist/build/ui/hash-artifacts-plugin.d.cts.map +1 -0
  88. package/dist/build/ui/hash-artifacts-plugin.d.mts +20 -0
  89. package/dist/build/ui/hash-artifacts-plugin.d.mts.map +1 -0
  90. package/dist/build/ui/hash-artifacts-plugin.mjs +58 -0
  91. package/dist/build/ui/hash-artifacts-plugin.mjs.map +1 -0
  92. package/dist/build/ui/index.cjs +90 -0
  93. package/dist/build/ui/index.cjs.map +1 -0
  94. package/dist/build/ui/index.d.cts +29 -0
  95. package/dist/build/ui/index.d.cts.map +1 -0
  96. package/dist/build/ui/index.d.mts +29 -0
  97. package/dist/build/ui/index.d.mts.map +1 -0
  98. package/dist/build/ui/index.mjs +68 -0
  99. package/dist/build/ui/index.mjs.map +1 -0
  100. package/dist/build/ui/manifest-plugin.cjs +37 -0
  101. package/dist/build/ui/manifest-plugin.cjs.map +1 -0
  102. package/dist/build/ui/manifest-plugin.d.cts +19 -0
  103. package/dist/build/ui/manifest-plugin.d.cts.map +1 -0
  104. package/dist/build/ui/manifest-plugin.d.mts +19 -0
  105. package/dist/build/ui/manifest-plugin.d.mts.map +1 -0
  106. package/dist/build/ui/manifest-plugin.mjs +37 -0
  107. package/dist/build/ui/manifest-plugin.mjs.map +1 -0
  108. package/dist/build/ui/rsbuild-config.cjs +203 -0
  109. package/dist/build/ui/rsbuild-config.cjs.map +1 -0
  110. package/dist/build/ui/rsbuild-config.d.cts +45 -0
  111. package/dist/build/ui/rsbuild-config.d.cts.map +1 -0
  112. package/dist/build/ui/rsbuild-config.d.mts +45 -0
  113. package/dist/build/ui/rsbuild-config.d.mts.map +1 -0
  114. package/dist/build/ui/rsbuild-config.mjs +200 -0
  115. package/dist/build/ui/rsbuild-config.mjs.map +1 -0
  116. package/dist/build/ui/stubs.cjs +107 -0
  117. package/dist/build/ui/stubs.cjs.map +1 -0
  118. package/dist/build/ui/stubs.d.cts +25 -0
  119. package/dist/build/ui/stubs.d.cts.map +1 -0
  120. package/dist/build/ui/stubs.d.mts +25 -0
  121. package/dist/build/ui/stubs.d.mts.map +1 -0
  122. package/dist/build/ui/stubs.mjs +106 -0
  123. package/dist/build/ui/stubs.mjs.map +1 -0
  124. package/dist/cli.cjs +83 -0
  125. package/dist/cli.cjs.map +1 -0
  126. package/dist/cli.d.cts +6 -0
  127. package/dist/cli.d.cts.map +1 -0
  128. package/dist/cli.d.mts +6 -0
  129. package/dist/cli.d.mts.map +1 -0
  130. package/dist/cli.mjs +82 -0
  131. package/dist/cli.mjs.map +1 -0
  132. package/dist/dev/serve.cjs +390 -0
  133. package/dist/dev/serve.cjs.map +1 -0
  134. package/dist/dev/serve.d.cts +23 -0
  135. package/dist/dev/serve.d.cts.map +1 -0
  136. package/dist/dev/serve.d.mts +23 -0
  137. package/dist/dev/serve.d.mts.map +1 -0
  138. package/dist/dev/serve.mjs +384 -0
  139. package/dist/dev/serve.mjs.map +1 -0
  140. package/dist/dev/watch-kill.cjs +39 -0
  141. package/dist/dev/watch-kill.cjs.map +1 -0
  142. package/dist/dev/watch-kill.mjs +38 -0
  143. package/dist/dev/watch-kill.mjs.map +1 -0
  144. package/dist/effect-helpers.cjs +23 -0
  145. package/dist/effect-helpers.cjs.map +1 -0
  146. package/dist/effect-helpers.d.cts +20 -0
  147. package/dist/effect-helpers.d.cts.map +1 -0
  148. package/dist/effect-helpers.d.mts +20 -0
  149. package/dist/effect-helpers.d.mts.map +1 -0
  150. package/dist/effect-helpers.mjs +22 -0
  151. package/dist/effect-helpers.mjs.map +1 -0
  152. package/dist/errors.cjs +50 -69
  153. package/dist/errors.cjs.map +1 -1
  154. package/dist/errors.d.cts +13 -96
  155. package/dist/errors.d.cts.map +1 -1
  156. package/dist/errors.d.mts +13 -96
  157. package/dist/errors.d.mts.map +1 -1
  158. package/dist/errors.mjs +16 -34
  159. package/dist/errors.mjs.map +1 -1
  160. package/dist/identity.cjs +19 -0
  161. package/dist/identity.cjs.map +1 -0
  162. package/dist/identity.d.cts +33 -0
  163. package/dist/identity.d.cts.map +1 -0
  164. package/dist/identity.d.mts +33 -0
  165. package/dist/identity.d.mts.map +1 -0
  166. package/dist/identity.mjs +16 -0
  167. package/dist/identity.mjs.map +1 -0
  168. package/dist/index.cjs +9 -5
  169. package/dist/index.d.cts +8 -6
  170. package/dist/index.d.mts +8 -6
  171. package/dist/index.mjs +6 -4
  172. package/dist/plugin.cjs +13 -26
  173. package/dist/plugin.cjs.map +1 -1
  174. package/dist/plugin.d.cts +57 -24
  175. package/dist/plugin.d.cts.map +1 -1
  176. package/dist/plugin.d.mts +58 -25
  177. package/dist/plugin.d.mts.map +1 -1
  178. package/dist/plugin.mjs +16 -29
  179. package/dist/plugin.mjs.map +1 -1
  180. package/dist/remote-entry.cjs +103 -0
  181. package/dist/remote-entry.cjs.map +1 -0
  182. package/dist/remote-entry.d.cts +53 -0
  183. package/dist/remote-entry.d.cts.map +1 -0
  184. package/dist/remote-entry.d.mts +53 -0
  185. package/dist/remote-entry.d.mts.map +1 -0
  186. package/dist/remote-entry.mjs +98 -0
  187. package/dist/remote-entry.mjs.map +1 -0
  188. package/dist/runtime/errors.cjs +159 -33
  189. package/dist/runtime/errors.cjs.map +1 -1
  190. package/dist/runtime/errors.d.cts +64 -7
  191. package/dist/runtime/errors.d.cts.map +1 -1
  192. package/dist/runtime/errors.d.mts +64 -7
  193. package/dist/runtime/errors.d.mts.map +1 -1
  194. package/dist/runtime/errors.mjs +154 -30
  195. package/dist/runtime/errors.mjs.map +1 -1
  196. package/dist/runtime/index.cjs +95 -23
  197. package/dist/runtime/index.cjs.map +1 -1
  198. package/dist/runtime/index.d.cts +16 -0
  199. package/dist/runtime/index.d.cts.map +1 -1
  200. package/dist/runtime/index.d.mts +16 -0
  201. package/dist/runtime/index.d.mts.map +1 -1
  202. package/dist/runtime/index.mjs +98 -26
  203. package/dist/runtime/index.mjs.map +1 -1
  204. package/dist/runtime/mf-config.cjs +3 -78
  205. package/dist/runtime/mf-config.cjs.map +1 -1
  206. package/dist/runtime/mf-config.d.cts +3 -49
  207. package/dist/runtime/mf-config.d.cts.map +1 -1
  208. package/dist/runtime/mf-config.d.mts +3 -49
  209. package/dist/runtime/mf-config.d.mts.map +1 -1
  210. package/dist/runtime/mf-config.mjs +5 -78
  211. package/dist/runtime/mf-config.mjs.map +1 -1
  212. package/dist/runtime/services/module-federation.service.cjs +57 -12
  213. package/dist/runtime/services/module-federation.service.cjs.map +1 -1
  214. package/dist/runtime/services/module-federation.service.d.cts +4 -13
  215. package/dist/runtime/services/module-federation.service.d.mts +4 -13
  216. package/dist/runtime/services/module-federation.service.mjs +57 -14
  217. package/dist/runtime/services/module-federation.service.mjs.map +1 -1
  218. package/dist/runtime/services/normalize.cjs +2 -22
  219. package/dist/runtime/services/normalize.d.cts +2 -21
  220. package/dist/runtime/services/normalize.d.mts +2 -21
  221. package/dist/runtime/services/normalize.mjs +2 -21
  222. package/dist/runtime/services/plugin-lifecycle.service.cjs +9 -11
  223. package/dist/runtime/services/plugin-lifecycle.service.cjs.map +1 -1
  224. package/dist/runtime/services/plugin-lifecycle.service.d.cts +3 -16
  225. package/dist/runtime/services/plugin-lifecycle.service.d.mts +3 -16
  226. package/dist/runtime/services/plugin-lifecycle.service.mjs +10 -13
  227. package/dist/runtime/services/plugin-lifecycle.service.mjs.map +1 -1
  228. package/dist/runtime/services/plugin-loader.service.cjs +56 -30
  229. package/dist/runtime/services/plugin-loader.service.cjs.map +1 -1
  230. package/dist/runtime/services/plugin-loader.service.d.cts +6 -53
  231. package/dist/runtime/services/plugin-loader.service.d.mts +6 -53
  232. package/dist/runtime/services/plugin-loader.service.mjs +55 -31
  233. package/dist/runtime/services/plugin-loader.service.mjs.map +1 -1
  234. package/dist/runtime/services/plugin.service.cjs +10 -12
  235. package/dist/runtime/services/plugin.service.cjs.map +1 -1
  236. package/dist/runtime/services/plugin.service.d.cts +14 -36
  237. package/dist/runtime/services/plugin.service.d.cts.map +1 -1
  238. package/dist/runtime/services/plugin.service.d.mts +14 -36
  239. package/dist/runtime/services/plugin.service.d.mts.map +1 -1
  240. package/dist/runtime/services/plugin.service.mjs +14 -18
  241. package/dist/runtime/services/plugin.service.mjs.map +1 -1
  242. package/dist/runtime/services/secrets.service.cjs +12 -12
  243. package/dist/runtime/services/secrets.service.cjs.map +1 -1
  244. package/dist/runtime/services/secrets.service.d.cts +3 -15
  245. package/dist/runtime/services/secrets.service.d.mts +3 -15
  246. package/dist/runtime/services/secrets.service.mjs +12 -13
  247. package/dist/runtime/services/secrets.service.mjs.map +1 -1
  248. package/dist/runtime/services/shared-identity.cjs +40 -0
  249. package/dist/runtime/services/shared-identity.cjs.map +1 -0
  250. package/dist/runtime/services/shared-identity.mjs +38 -0
  251. package/dist/runtime/services/shared-identity.mjs.map +1 -0
  252. package/dist/runtime/validation.cjs +2 -2
  253. package/dist/runtime/validation.cjs.map +1 -1
  254. package/dist/runtime/validation.mjs +2 -2
  255. package/dist/runtime/validation.mjs.map +1 -1
  256. package/dist/shared-deps-spec.cjs +384 -0
  257. package/dist/shared-deps-spec.cjs.map +1 -0
  258. package/dist/shared-deps-spec.d.cts +182 -0
  259. package/dist/shared-deps-spec.d.cts.map +1 -0
  260. package/dist/shared-deps-spec.d.mts +182 -0
  261. package/dist/shared-deps-spec.d.mts.map +1 -0
  262. package/dist/shared-deps-spec.mjs +368 -0
  263. package/dist/shared-deps-spec.mjs.map +1 -0
  264. package/dist/types.d.cts +25 -41
  265. package/dist/types.d.cts.map +1 -1
  266. package/dist/types.d.mts +25 -41
  267. package/dist/types.d.mts.map +1 -1
  268. package/dist/ui/manifest/construct.cjs +268 -0
  269. package/dist/ui/manifest/construct.cjs.map +1 -0
  270. package/dist/ui/manifest/construct.d.cts +48 -0
  271. package/dist/ui/manifest/construct.d.cts.map +1 -0
  272. package/dist/ui/manifest/construct.d.mts +48 -0
  273. package/dist/ui/manifest/construct.d.mts.map +1 -0
  274. package/dist/ui/manifest/construct.mjs +268 -0
  275. package/dist/ui/manifest/construct.mjs.map +1 -0
  276. package/dist/ui/manifest/contract.cjs +34 -0
  277. package/dist/ui/manifest/contract.cjs.map +1 -0
  278. package/dist/ui/manifest/contract.d.cts +26 -0
  279. package/dist/ui/manifest/contract.d.cts.map +1 -0
  280. package/dist/ui/manifest/contract.d.mts +26 -0
  281. package/dist/ui/manifest/contract.d.mts.map +1 -0
  282. package/dist/ui/manifest/contract.mjs +26 -0
  283. package/dist/ui/manifest/contract.mjs.map +1 -0
  284. package/dist/ui/manifest/descriptor.cjs +64 -0
  285. package/dist/ui/manifest/descriptor.cjs.map +1 -0
  286. package/dist/ui/manifest/descriptor.d.cts +60 -0
  287. package/dist/ui/manifest/descriptor.d.cts.map +1 -0
  288. package/dist/ui/manifest/descriptor.d.mts +60 -0
  289. package/dist/ui/manifest/descriptor.d.mts.map +1 -0
  290. package/dist/ui/manifest/descriptor.mjs +61 -0
  291. package/dist/ui/manifest/descriptor.mjs.map +1 -0
  292. package/dist/ui/manifest/generator.cjs +128 -0
  293. package/dist/ui/manifest/generator.cjs.map +1 -0
  294. package/dist/ui/manifest/generator.d.cts +41 -0
  295. package/dist/ui/manifest/generator.d.cts.map +1 -0
  296. package/dist/ui/manifest/generator.d.mts +41 -0
  297. package/dist/ui/manifest/generator.d.mts.map +1 -0
  298. package/dist/ui/manifest/generator.mjs +125 -0
  299. package/dist/ui/manifest/generator.mjs.map +1 -0
  300. package/dist/ui/manifest/index.cjs +35 -0
  301. package/dist/ui/manifest/index.d.cts +9 -0
  302. package/dist/ui/manifest/index.d.mts +9 -0
  303. package/dist/ui/manifest/index.mjs +9 -0
  304. package/dist/ui/manifest/manifest-schema.cjs +97 -0
  305. package/dist/ui/manifest/manifest-schema.cjs.map +1 -0
  306. package/dist/ui/manifest/manifest-schema.d.cts +132 -0
  307. package/dist/ui/manifest/manifest-schema.d.cts.map +1 -0
  308. package/dist/ui/manifest/manifest-schema.d.mts +132 -0
  309. package/dist/ui/manifest/manifest-schema.d.mts.map +1 -0
  310. package/dist/ui/manifest/manifest-schema.mjs +90 -0
  311. package/dist/ui/manifest/manifest-schema.mjs.map +1 -0
  312. package/dist/ui/manifest/mount-registry.cjs +52 -0
  313. package/dist/ui/manifest/mount-registry.cjs.map +1 -0
  314. package/dist/ui/manifest/mount-registry.d.cts +61 -0
  315. package/dist/ui/manifest/mount-registry.d.cts.map +1 -0
  316. package/dist/ui/manifest/mount-registry.d.mts +61 -0
  317. package/dist/ui/manifest/mount-registry.d.mts.map +1 -0
  318. package/dist/ui/manifest/mount-registry.mjs +48 -0
  319. package/dist/ui/manifest/mount-registry.mjs.map +1 -0
  320. package/dist/ui/manifest/nav.cjs +13 -0
  321. package/dist/ui/manifest/nav.cjs.map +1 -0
  322. package/dist/ui/manifest/nav.d.cts +34 -0
  323. package/dist/ui/manifest/nav.d.cts.map +1 -0
  324. package/dist/ui/manifest/nav.d.mts +34 -0
  325. package/dist/ui/manifest/nav.d.mts.map +1 -0
  326. package/dist/ui/manifest/nav.mjs +13 -0
  327. package/dist/ui/manifest/nav.mjs.map +1 -0
  328. package/dist/ui/manifest/route-config.cjs +33 -0
  329. package/dist/ui/manifest/route-config.cjs.map +1 -0
  330. package/dist/ui/manifest/route-config.d.cts +40 -0
  331. package/dist/ui/manifest/route-config.d.cts.map +1 -0
  332. package/dist/ui/manifest/route-config.d.mts +40 -0
  333. package/dist/ui/manifest/route-config.d.mts.map +1 -0
  334. package/dist/ui/manifest/route-config.mjs +33 -0
  335. package/dist/ui/manifest/route-config.mjs.map +1 -0
  336. package/dist/version-manifest.cjs +65 -0
  337. package/dist/version-manifest.cjs.map +1 -0
  338. package/dist/version-manifest.d.cts +52 -0
  339. package/dist/version-manifest.d.cts.map +1 -0
  340. package/dist/version-manifest.d.mts +52 -0
  341. package/dist/version-manifest.d.mts.map +1 -0
  342. package/dist/version-manifest.mjs +63 -0
  343. package/dist/version-manifest.mjs.map +1 -0
  344. package/package.json +165 -68
  345. package/skills/plugin-client/SKILL.md +24 -5
  346. package/skills/plugin-development/SKILL.md +79 -47
  347. package/skills/plugin-testing/SKILL.md +41 -12
  348. package/src/build/artifact-names.ts +117 -0
  349. package/src/build/contract-types.ts +101 -0
  350. package/src/build/rspack/build-report-plugin.ts +34 -0
  351. package/src/build/rspack/chunk-completeness-plugin.ts +57 -0
  352. package/src/build/rspack/compose.ts +87 -0
  353. package/src/build/rspack/fix-mf-data-uri-plugin.ts +23 -12
  354. package/src/build/rspack/generated-config.ts +35 -0
  355. package/src/build/rspack/index.ts +10 -5
  356. package/src/build/rspack/module-federation.ts +1 -1
  357. package/src/build/rspack/plugin.ts +103 -105
  358. package/src/build/rspack/utils.ts +8 -2
  359. package/src/build/ui/factory.ts +96 -0
  360. package/src/build/ui/generated-config.ts +133 -0
  361. package/src/build/ui/hash-artifacts-plugin.ts +79 -0
  362. package/src/build/ui/index.ts +98 -0
  363. package/src/build/ui/manifest-plugin.ts +54 -0
  364. package/src/build/ui/rsbuild-config.ts +256 -0
  365. package/src/build/ui/stubs.ts +103 -0
  366. package/src/cli.ts +100 -0
  367. package/src/dev/serve.ts +477 -0
  368. package/src/dev/watch-kill.ts +58 -0
  369. package/src/effect-helpers.ts +25 -0
  370. package/src/errors.ts +17 -18
  371. package/src/identity.ts +36 -0
  372. package/src/index.ts +4 -0
  373. package/src/plugin.ts +88 -91
  374. package/src/remote-entry.ts +171 -0
  375. package/src/runtime/errors.ts +229 -26
  376. package/src/runtime/index.ts +132 -43
  377. package/src/runtime/mf-config.ts +12 -107
  378. package/src/runtime/services/module-federation.service.ts +218 -117
  379. package/src/runtime/services/normalize.ts +1 -18
  380. package/src/runtime/services/plugin-lifecycle.service.ts +66 -75
  381. package/src/runtime/services/plugin-loader.service.ts +271 -212
  382. package/src/runtime/services/plugin.service.ts +61 -43
  383. package/src/runtime/services/secrets.service.ts +20 -15
  384. package/src/runtime/services/shared-identity.ts +68 -0
  385. package/src/runtime/validation.ts +5 -7
  386. package/src/shared-deps-spec.ts +478 -0
  387. package/src/types.ts +25 -48
  388. package/src/ui/manifest/construct.ts +403 -0
  389. package/src/ui/manifest/contract.ts +33 -0
  390. package/src/ui/manifest/descriptor.ts +96 -0
  391. package/src/ui/manifest/generator.ts +238 -0
  392. package/src/ui/manifest/index.ts +55 -0
  393. package/src/ui/manifest/manifest-schema.ts +107 -0
  394. package/src/ui/manifest/mount-registry.ts +50 -0
  395. package/src/ui/manifest/nav.ts +43 -0
  396. package/src/ui/manifest/route-config.ts +82 -0
  397. package/src/version-manifest.ts +88 -0
  398. package/dist/build/rspack/dev-server-middleware.cjs +0 -248
  399. package/dist/build/rspack/dev-server-middleware.cjs.map +0 -1
  400. package/dist/build/rspack/dev-server-middleware.mjs +0 -247
  401. package/dist/build/rspack/dev-server-middleware.mjs.map +0 -1
  402. package/dist/build/shared-deps.cjs +0 -83
  403. package/dist/build/shared-deps.cjs.map +0 -1
  404. package/dist/build/shared-deps.d.cts +0 -67
  405. package/dist/build/shared-deps.d.cts.map +0 -1
  406. package/dist/build/shared-deps.d.mts +0 -67
  407. package/dist/build/shared-deps.d.mts.map +0 -1
  408. package/dist/build/shared-deps.mjs +0 -79
  409. package/dist/build/shared-deps.mjs.map +0 -1
  410. package/dist/effect.cjs +0 -9
  411. package/dist/effect.d.cts +0 -1
  412. package/dist/effect.d.mts +0 -1
  413. package/dist/effect.mjs +0 -3
  414. package/dist/orpc-openapi.cjs +0 -17
  415. package/dist/orpc-openapi.d.cts +0 -2
  416. package/dist/orpc-openapi.d.mts +0 -2
  417. package/dist/orpc-openapi.mjs +0 -5
  418. package/dist/orpc.cjs +0 -46
  419. package/dist/orpc.d.cts +0 -7
  420. package/dist/orpc.d.mts +0 -7
  421. package/dist/orpc.mjs +0 -11
  422. package/dist/package.cjs +0 -23
  423. package/dist/package.cjs.map +0 -1
  424. package/dist/package.mjs +0 -17
  425. package/dist/package.mjs.map +0 -1
  426. package/dist/runtime/services/module-federation.service.d.cts.map +0 -1
  427. package/dist/runtime/services/module-federation.service.d.mts.map +0 -1
  428. package/dist/runtime/services/normalize.cjs.map +0 -1
  429. package/dist/runtime/services/normalize.d.cts.map +0 -1
  430. package/dist/runtime/services/normalize.d.mts.map +0 -1
  431. package/dist/runtime/services/normalize.mjs.map +0 -1
  432. package/dist/runtime/services/plugin-lifecycle.service.d.cts.map +0 -1
  433. package/dist/runtime/services/plugin-lifecycle.service.d.mts.map +0 -1
  434. package/dist/runtime/services/plugin-loader.service.d.cts.map +0 -1
  435. package/dist/runtime/services/plugin-loader.service.d.mts.map +0 -1
  436. package/dist/runtime/services/secrets.service.d.cts.map +0 -1
  437. package/dist/runtime/services/secrets.service.d.mts.map +0 -1
  438. package/dist/testing/index.cjs +0 -57
  439. package/dist/testing/index.cjs.map +0 -1
  440. package/dist/testing/index.d.cts +0 -54
  441. package/dist/testing/index.d.cts.map +0 -1
  442. package/dist/testing/index.d.mts +0 -54
  443. package/dist/testing/index.d.mts.map +0 -1
  444. package/dist/testing/index.mjs +0 -55
  445. package/dist/testing/index.mjs.map +0 -1
  446. package/dist/zod-core.cjs +0 -9
  447. package/dist/zod-core.d.cts +0 -1
  448. package/dist/zod-core.d.mts +0 -1
  449. package/dist/zod-core.mjs +0 -3
  450. package/dist/zod.cjs +0 -11
  451. package/dist/zod.d.cts +0 -2
  452. package/dist/zod.d.mts +0 -2
  453. package/dist/zod.mjs +0 -3
  454. package/src/build/rspack/dev-server-middleware.ts +0 -324
  455. package/src/build/shared-deps.ts +0 -102
  456. package/src/effect.ts +0 -1
  457. package/src/orpc-openapi.ts +0 -2
  458. package/src/orpc.ts +0 -9
  459. package/src/testing/index.ts +0 -87
  460. package/src/testing/mocks/module-federation.service.ts +0 -41
  461. package/src/zod-core.ts +0 -1
  462. package/src/zod.ts +0 -3
@@ -1,7 +1,7 @@
1
1
  import type { InferSchemaInput, InferSchemaOutput } from "@orpc/contract";
2
- import { Context, Effect, Context as EffectContext, Exit, Layer, Scope } from "effect";
2
+ import { Context, Effect, Exit, Layer, Scope } from "effect";
3
3
  import type { z } from "zod";
4
- import { PluginIdTag, type PluginServicesTools } from "../../plugin";
4
+ import { PluginIdTag } from "../../plugin";
5
5
  import type {
6
6
  AnyPlugin,
7
7
  AnyPluginConstructor,
@@ -11,23 +11,65 @@ import type {
11
11
  PluginMetadata,
12
12
  PluginRegistry,
13
13
  } from "../../types";
14
+ import type { PluginWarningInfo } from "../errors";
14
15
  import { PluginRuntimeError, toPluginRuntimeError } from "../errors";
15
16
  import { validate } from "../validation";
16
17
  import { ModuleFederationService } from "./module-federation.service";
17
18
  import { SecretsService } from "./secrets.service";
18
19
 
19
- export class PluginRegistryTag extends Context.Tag("PluginRegistry")<
20
- PluginRegistryTag,
21
- PluginRegistry
22
- >() {}
20
+ /**
21
+ * Evaluate a plugin's `warnings` function against the validated config.
22
+ * Fail-safe: a throwing warnings function becomes a warning itself rather
23
+ * than failing initialization. Strings are normalized to `PluginWarningInfo`
24
+ * with the plugin's registry key.
25
+ */
26
+ const collectPluginWarnings = (
27
+ plugin: AnyPlugin,
28
+ config: { variables: unknown; secrets: unknown },
29
+ ): PluginWarningInfo[] => {
30
+ const warningsFn = plugin.warnings;
31
+ if (!warningsFn) return [];
32
+ try {
33
+ const raw = warningsFn(config as never);
34
+ return raw.map((warning) =>
35
+ typeof warning === "string" ? { pluginKey: plugin.id, message: warning } : warning,
36
+ );
37
+ } catch (error) {
38
+ return [
39
+ {
40
+ pluginKey: plugin.id,
41
+ message: `Plugin warnings check failed: ${error instanceof Error ? error.message : String(error)}`,
42
+ },
43
+ ];
44
+ }
45
+ };
46
+
47
+ export class PluginRegistryTag extends Context.Service<PluginRegistryTag, PluginRegistry>()(
48
+ "PluginRegistry",
49
+ ) {}
23
50
 
24
- export class PluginMapTag extends Context.Tag("PluginMap")<
51
+ export class PluginMapTag extends Context.Service<
25
52
  PluginMapTag,
26
53
  Record<string, AnyPluginConstructor>
27
- >() {}
54
+ >()("PluginMap") {}
55
+
56
+ export interface RegistryServiceShape {
57
+ get: (
58
+ pluginId: string,
59
+ ) => Effect.Effect<
60
+ { constructor: (new () => AnyPlugin) | null; metadata: PluginMetadata },
61
+ PluginRuntimeError
62
+ >;
63
+ getModule: (pluginId: string) => Effect.Effect<AnyPluginConstructor | null>;
64
+ }
65
+
66
+ export class RegistryService extends Context.Service<RegistryService, RegistryServiceShape>()(
67
+ "RegistryService",
68
+ ) {}
28
69
 
29
- export class RegistryService extends Effect.Service<RegistryService>()("RegistryService", {
30
- effect: Effect.gen(function* () {
70
+ export const RegistryServiceDefault = Layer.effect(
71
+ RegistryService,
72
+ Effect.gen(function* () {
31
73
  const registry = yield* PluginRegistryTag;
32
74
  const pluginMap = yield* PluginMapTag;
33
75
 
@@ -37,14 +79,11 @@ export class RegistryService extends Effect.Service<RegistryService>()("Registry
37
79
  const entry = registry[pluginId];
38
80
 
39
81
  if (!entry) {
40
- return yield* Effect.fail(
41
- new PluginRuntimeError({
42
- pluginId,
43
- operation: "validate-plugin-id",
44
- cause: new Error(`Plugin ${pluginId} not found in registry`),
45
- retryable: false,
46
- }),
47
- );
82
+ return yield* new PluginRuntimeError({
83
+ pluginId,
84
+ operation: "validate-plugin-id",
85
+ cause: new Error(`Plugin ${pluginId} not found in registry`),
86
+ });
48
87
  }
49
88
 
50
89
  if ("module" in entry) {
@@ -71,223 +110,243 @@ export class RegistryService extends Effect.Service<RegistryService>()("Registry
71
110
  getModule: (pluginId: string) => Effect.succeed(pluginMap[pluginId] || null),
72
111
  };
73
112
  }),
74
- }) {}
75
-
76
- export class PluginLoaderService extends Effect.Service<PluginLoaderService>()(
77
- "PluginLoaderService",
78
- {
79
- effect: Effect.gen(function* () {
80
- const moduleFederationService = yield* ModuleFederationService;
81
- const secretsService = yield* SecretsService;
82
- const registryService = yield* RegistryService;
83
-
84
- const resolveUrl = (baseUrl: string, version?: string): string =>
85
- version && version !== "latest" ? baseUrl.replace("@latest", `@${version}`) : baseUrl;
86
-
87
- return {
88
- loadPlugin: (pluginId: string) =>
89
- Effect.gen(function* () {
90
- const entry = yield* registryService.get(pluginId);
91
-
92
- if (entry.constructor) {
93
- yield* Effect.logDebug("Loading plugin from direct module", { pluginId });
94
-
95
- return {
96
- ctor: entry.constructor,
97
- metadata: entry.metadata,
98
- } satisfies LoadedPlugin;
99
- }
100
-
101
- const url = entry.metadata.remoteUrl;
102
- if (!url) {
103
- return yield* Effect.fail(
104
- new PluginRuntimeError({
105
- pluginId,
106
- operation: "load-plugin",
107
- cause: new Error(`Plugin ${pluginId} has no module or remote URL configured`),
108
- retryable: false,
109
- }),
110
- );
111
- }
112
-
113
- const resolvedUrl = resolveUrl(url);
113
+ );
114
+
115
+ export interface PluginLoaderServiceShape {
116
+ loadPlugin: (pluginId: string) => Effect.Effect<LoadedPlugin, PluginRuntimeError>;
117
+ instantiatePlugin: <T extends AnyPlugin>(
118
+ pluginId: string,
119
+ loadedPlugin: LoadedPlugin<T>,
120
+ ) => Effect.Effect<PluginInstance<T>, PluginRuntimeError>;
121
+ initializePlugin: <T extends AnyPlugin>(
122
+ pluginInstance: PluginInstance<T>,
123
+ config: {
124
+ variables: InferSchemaInput<T["configSchema"]["variables"]>;
125
+ secrets: InferSchemaInput<T["configSchema"]["secrets"]>;
126
+ },
127
+ plugins?: Record<string, unknown>,
128
+ ) => Effect.Effect<InitializedPlugin<T>, PluginRuntimeError>;
129
+ }
130
+
131
+ export class PluginLoaderService extends Context.Service<
132
+ PluginLoaderService,
133
+ PluginLoaderServiceShape
134
+ >()("PluginLoaderService") {}
135
+
136
+ export const PluginLoaderServiceDefault = Layer.effect(
137
+ PluginLoaderService,
138
+ Effect.gen(function* () {
139
+ const moduleFederationService = yield* ModuleFederationService;
140
+ const secretsService = yield* SecretsService;
141
+ const registryService = yield* RegistryService;
142
+
143
+ const resolveUrl = (baseUrl: string, version?: string): string =>
144
+ version && version !== "latest" ? baseUrl.replace("@latest", `@${version}`) : baseUrl;
114
145
 
115
- yield* moduleFederationService.registerRemote(pluginId, resolvedUrl).pipe(
116
- Effect.tapError((error) =>
117
- Effect.logError(`Plugin ${pluginId} failed during register-remote: ${error}`),
118
- ),
119
- Effect.mapError((error) =>
120
- toPluginRuntimeError(error, pluginId, undefined, "register-remote", true),
121
- ),
122
- );
123
-
124
- yield* Effect.logDebug("Loading plugin from remote", { pluginId, url: resolvedUrl });
146
+ return {
147
+ loadPlugin: (pluginId: string) =>
148
+ Effect.gen(function* () {
149
+ const entry = yield* registryService.get(pluginId);
125
150
 
126
- const ctor = yield* moduleFederationService
127
- .loadRemoteConstructor(pluginId, resolvedUrl)
128
- .pipe(
129
- Effect.tapError((error) =>
130
- Effect.logError(`Plugin ${pluginId} failed during load-remote: ${error}`),
131
- ),
132
- Effect.mapError((error) =>
133
- toPluginRuntimeError(error, pluginId, undefined, "load-remote", false),
134
- ),
135
- );
151
+ if (entry.constructor) {
152
+ yield* Effect.logDebug("Loading plugin from direct module", { pluginId });
136
153
 
137
154
  return {
138
- ctor,
155
+ ctor: entry.constructor,
139
156
  metadata: entry.metadata,
140
157
  } satisfies LoadedPlugin;
141
- }),
158
+ }
142
159
 
143
- instantiatePlugin: <T extends AnyPlugin>(pluginId: string, loadedPlugin: LoadedPlugin<T>) =>
144
- Effect.gen(function* () {
145
- const instance = yield* Effect.try(() => new loadedPlugin.ctor()).pipe(
146
- Effect.tapError((error) =>
147
- Effect.logError(`Plugin ${pluginId} failed during instantiate-plugin: ${error}`),
148
- ),
149
- Effect.mapError((error) =>
150
- toPluginRuntimeError(error, pluginId, undefined, "instantiate-plugin", false),
151
- ),
152
- );
160
+ const url = entry.metadata.remoteUrl;
161
+ if (!url) {
162
+ return yield* new PluginRuntimeError({
163
+ pluginId,
164
+ operation: "load-plugin",
165
+ cause: new Error(`Plugin ${pluginId} has no module or remote URL configured`),
166
+ });
167
+ }
153
168
 
154
- (instance.id as string) = pluginId;
169
+ const resolvedUrl = resolveUrl(url);
155
170
 
156
- return {
157
- plugin: instance,
158
- metadata: loadedPlugin.metadata,
159
- } satisfies PluginInstance<T>;
160
- }),
161
-
162
- initializePlugin: <T extends AnyPlugin>(
163
- pluginInstance: PluginInstance<T>,
164
- config: {
165
- variables: InferSchemaInput<T["configSchema"]["variables"]>;
166
- secrets: InferSchemaInput<T["configSchema"]["secrets"]>;
167
- },
168
- plugins?: Record<string, unknown>,
169
- ) =>
170
- Effect.gen(function* () {
171
- const { plugin } = pluginInstance;
172
-
173
- // Validate and hydrate config
174
- const validatedVariables = yield* validate(
175
- plugin.configSchema.variables as z.ZodSchema<
176
- InferSchemaOutput<T["configSchema"]["variables"]>
177
- >,
178
- config.variables,
179
- plugin.id,
180
- "config",
181
- ).pipe(
182
- Effect.mapError(
183
- (validationError) =>
184
- new PluginRuntimeError({
185
- pluginId: plugin.id,
186
- operation: "validate-config",
187
- cause: validationError.zodError,
188
- retryable: false,
189
- }),
190
- ),
191
- );
171
+ yield* moduleFederationService.registerRemote(pluginId, resolvedUrl).pipe(
172
+ Effect.tapError((error) =>
173
+ Effect.logError(`Plugin ${pluginId} failed during register-remote: ${String(error)}`),
174
+ ),
175
+ Effect.mapError((error) =>
176
+ toPluginRuntimeError(error, pluginId, undefined, "register-remote"),
177
+ ),
178
+ );
192
179
 
193
- // Validate secrets
194
- const validatedSecrets = yield* validate(
195
- plugin.configSchema.secrets as z.ZodSchema<
196
- InferSchemaOutput<T["configSchema"]["secrets"]>
197
- >,
198
- config.secrets,
199
- plugin.id,
200
- "config",
201
- ).pipe(
202
- Effect.mapError(
203
- (validationError) =>
204
- new PluginRuntimeError({
205
- pluginId: plugin.id,
206
- operation: "validate-secrets",
207
- cause: validationError.zodError,
208
- retryable: false,
209
- }),
210
- ),
211
- );
180
+ yield* Effect.logDebug("Loading plugin from remote", { pluginId, url: resolvedUrl });
212
181
 
213
- // Hydrate secrets in variables
214
- const hydratedConfig = yield* secretsService.hydrateSecrets({
215
- variables: validatedVariables,
216
- secrets: validatedSecrets,
217
- });
218
-
219
- const _variables = yield* validate(
220
- plugin.configSchema.variables as z.ZodSchema<
221
- InferSchemaOutput<T["configSchema"]["variables"]>
222
- >,
223
- hydratedConfig.variables,
224
- plugin.id,
225
- "config",
226
- ).pipe(
227
- Effect.mapError(
228
- (validationError) =>
229
- new PluginRuntimeError({
230
- pluginId: plugin.id,
231
- operation: "validate-hydrated-config",
232
- cause: validationError.zodError,
233
- retryable: false,
234
- }),
182
+ const ctor = yield* moduleFederationService
183
+ .loadRemoteConstructor(pluginId, resolvedUrl)
184
+ .pipe(
185
+ Effect.tapError((error) =>
186
+ Effect.logError(`Plugin ${pluginId} failed during load-remote: ${String(error)}`),
187
+ ),
188
+ Effect.mapError((error) =>
189
+ toPluginRuntimeError(error, pluginId, undefined, "load-remote"),
235
190
  ),
236
191
  );
237
192
 
238
- // Create a long-lived scope for this plugin instance
239
- const scope = yield* Scope.make();
193
+ return {
194
+ ctor,
195
+ metadata: entry.metadata,
196
+ } satisfies LoadedPlugin;
197
+ }),
240
198
 
241
- // Create a per-plugin MemoMap so tool-built layers are memoized
242
- const memoMap = yield* Layer.makeMemoMap;
199
+ instantiatePlugin: <T extends AnyPlugin>(pluginId: string, loadedPlugin: LoadedPlugin<T>) =>
200
+ Effect.gen(function* () {
201
+ const instance = yield* Effect.try(() => new loadedPlugin.ctor()).pipe(
202
+ Effect.tapError((error) =>
203
+ Effect.logError(`Plugin ${pluginId} failed during instantiate-plugin: ${error}`),
204
+ ),
205
+ Effect.mapError((error) =>
206
+ toPluginRuntimeError(error, pluginId, undefined, "instantiate-plugin"),
207
+ ),
208
+ );
243
209
 
244
- const tools: PluginServicesTools = {
245
- buildService: (tag: any, layer: any) =>
246
- (Layer.buildWithMemoMap(layer, memoMap, scope) as any).pipe(
247
- Effect.map((ctx: any) => EffectContext.get(ctx, tag)) as any,
248
- ),
249
- };
210
+ (instance.id as string) = pluginId;
250
211
 
251
- // Initialize plugin within the scope.
252
- // If initialize fails, close the scope immediately so scoped
253
- // resources (DB pools, caches) are released — otherwise every
254
- // failed initialization leaks until the process exits.
255
- const context = yield* plugin
256
- .initialize(
257
- { variables: _variables, secrets: hydratedConfig.secrets },
258
- plugins ?? {},
259
- tools,
260
- )
212
+ return {
213
+ plugin: instance,
214
+ metadata: loadedPlugin.metadata,
215
+ } satisfies PluginInstance<T>;
216
+ }),
217
+
218
+ initializePlugin: <T extends AnyPlugin>(
219
+ pluginInstance: PluginInstance<T>,
220
+ config: {
221
+ variables: InferSchemaInput<T["configSchema"]["variables"]>;
222
+ secrets: InferSchemaInput<T["configSchema"]["secrets"]>;
223
+ },
224
+ plugins?: Record<string, unknown>,
225
+ ) =>
226
+ Effect.gen(function* () {
227
+ const { plugin } = pluginInstance;
228
+
229
+ // Validate and hydrate config
230
+ const validatedVariables = yield* validate(
231
+ plugin.configSchema.variables as z.ZodSchema<
232
+ InferSchemaOutput<T["configSchema"]["variables"]>
233
+ >,
234
+ config.variables,
235
+ plugin.id,
236
+ "config",
237
+ ).pipe(
238
+ Effect.mapError(
239
+ (validationError) =>
240
+ new PluginRuntimeError({
241
+ pluginId: plugin.id,
242
+ operation: "validate-config",
243
+ cause: validationError.zodError,
244
+ }),
245
+ ),
246
+ );
247
+
248
+ // Validate secrets
249
+ const validatedSecrets = yield* validate(
250
+ plugin.configSchema.secrets as z.ZodSchema<
251
+ InferSchemaOutput<T["configSchema"]["secrets"]>
252
+ >,
253
+ config.secrets,
254
+ plugin.id,
255
+ "config",
256
+ ).pipe(
257
+ Effect.mapError(
258
+ (validationError) =>
259
+ new PluginRuntimeError({
260
+ pluginId: plugin.id,
261
+ operation: "validate-secrets",
262
+ cause: validationError.zodError,
263
+ }),
264
+ ),
265
+ );
266
+
267
+ // Hydrate secrets in variables
268
+ const hydratedConfig = yield* secretsService.hydrateSecrets({
269
+ variables: validatedVariables,
270
+ secrets: validatedSecrets,
271
+ });
272
+
273
+ const _variables = yield* validate(
274
+ plugin.configSchema.variables as z.ZodSchema<
275
+ InferSchemaOutput<T["configSchema"]["variables"]>
276
+ >,
277
+ hydratedConfig.variables,
278
+ plugin.id,
279
+ "config",
280
+ ).pipe(
281
+ Effect.mapError(
282
+ (validationError) =>
283
+ new PluginRuntimeError({
284
+ pluginId: plugin.id,
285
+ operation: "validate-hydrated-config",
286
+ cause: validationError.zodError,
287
+ }),
288
+ ),
289
+ );
290
+
291
+ // Create a long-lived scope for this plugin instance. Initialize
292
+ // returns a Layer which is built against this scope, so scoped
293
+ // resources (DB pools, caches) release on plugin shutdown.
294
+ const scope = yield* Scope.make();
295
+
296
+ // Build the plugin's Layer within the scope.
297
+ // On failure, close the scope immediately so scoped resources
298
+ // (DB pools, caches) are released — otherwise every failed
299
+ // initialization leaks until the process exits.
300
+ const effectContext = yield* Effect.gen(function* () {
301
+ const layer = yield* plugin
302
+ .initialize({ variables: _variables, secrets: hydratedConfig.secrets }, plugins ?? {})
261
303
  .pipe(
262
304
  Effect.provideService(PluginIdTag, plugin.id),
263
305
  Effect.provideService(Scope.Scope, scope),
264
- Effect.tapError(() =>
265
- Scope.close(scope, Exit.succeed(undefined)).pipe(
266
- Effect.catchAll((closeError) =>
306
+ );
307
+
308
+ return yield* Layer.buildWithScope(layer, scope).pipe(
309
+ Effect.provideService(PluginIdTag, plugin.id),
310
+ Effect.provideService(Scope.Scope, scope),
311
+ Effect.mapError((error) =>
312
+ toPluginRuntimeError(error, plugin.id, undefined, "initialize-layer"),
313
+ ),
314
+ );
315
+ }).pipe(
316
+ Effect.onExit((exit) =>
317
+ Exit.isSuccess(exit)
318
+ ? Effect.void
319
+ : Scope.close(scope, exit).pipe(
320
+ Effect.catchCause((closeCause) =>
267
321
  Effect.logWarning(
268
322
  `Failed to close scope for plugin ${plugin.id} after initialize error`,
269
- closeError,
323
+ closeCause,
270
324
  ),
271
325
  ),
272
326
  ),
273
- ),
274
- Effect.tapError((error) =>
275
- Effect.logError(`Plugin ${plugin.id} failed during initialize-plugin: ${error}`),
276
- ),
277
- Effect.mapError((error) =>
278
- toPluginRuntimeError(error, plugin.id, undefined, "initialize-plugin", false),
279
- ),
280
- );
327
+ ),
328
+ Effect.tapError((error) =>
329
+ Effect.logError(
330
+ `Plugin ${plugin.id} failed during initialize-plugin: ${String(error)}`,
331
+ ),
332
+ ),
333
+ Effect.mapError((error) =>
334
+ toPluginRuntimeError(error, plugin.id, undefined, "initialize-plugin"),
335
+ ),
336
+ );
281
337
 
282
- return {
283
- plugin,
284
- metadata: pluginInstance.metadata,
285
- config: { variables: _variables, secrets: hydratedConfig.secrets },
286
- context,
287
- scope,
288
- } satisfies InitializedPlugin<T>;
289
- }),
290
- };
291
- }),
292
- },
293
- ) {}
338
+ return {
339
+ plugin,
340
+ metadata: pluginInstance.metadata,
341
+ config: { variables: _variables, secrets: hydratedConfig.secrets },
342
+ effectContext,
343
+ scope,
344
+ warnings: collectPluginWarnings(plugin, {
345
+ variables: _variables,
346
+ secrets: hydratedConfig.secrets,
347
+ }),
348
+ } satisfies InitializedPlugin<T>;
349
+ }),
350
+ };
351
+ }),
352
+ );
@@ -1,23 +1,48 @@
1
- import { Effect, Exit, Layer, Scope } from "effect";
1
+ import { Context, Effect, Exit, Layer, Scope } from "effect";
2
2
  import type {
3
3
  AnyPlugin,
4
4
  AnyPluginConstructor,
5
5
  InitializedPlugin,
6
+ LoadedPlugin,
7
+ PluginInstance,
6
8
  PluginRegistry,
7
9
  SecretsConfig,
8
10
  } from "../../types";
9
- import { ModuleFederationService } from "./module-federation.service";
10
- import { PluginLifecycleService } from "./plugin-lifecycle.service";
11
+ import type { PluginRuntimeError } from "../errors";
12
+ import { ModuleFederationServiceDefault } from "./module-federation.service";
13
+ import { PluginLifecycleService, PluginLifecycleServiceDefault } from "./plugin-lifecycle.service";
11
14
  import {
12
15
  PluginLoaderService,
16
+ PluginLoaderServiceDefault,
13
17
  PluginMapTag,
14
18
  PluginRegistryTag,
15
- RegistryService,
19
+ RegistryServiceDefault,
16
20
  } from "./plugin-loader.service";
17
- import { SecretsConfigTag, SecretsService } from "./secrets.service";
21
+ import { SecretsConfigTag, SecretsServiceDefault } from "./secrets.service";
18
22
 
19
- export class PluginService extends Effect.Service<PluginService>()("PluginService", {
20
- scoped: Effect.gen(function* () {
23
+ export interface PluginServiceShape {
24
+ loadPlugin: (pluginId: string) => Effect.Effect<LoadedPlugin, PluginRuntimeError>;
25
+ instantiatePlugin: <T extends AnyPlugin>(
26
+ pluginId: string,
27
+ loadedPlugin: LoadedPlugin<T>,
28
+ ) => Effect.Effect<PluginInstance<T>, PluginRuntimeError>;
29
+ initializePlugin: <T extends AnyPlugin>(
30
+ pluginInstance: PluginInstance<T>,
31
+ config: any,
32
+ plugins?: Record<string, unknown>,
33
+ ) => Effect.Effect<InitializedPlugin<T>, PluginRuntimeError>;
34
+ registerPlugin: (plugin: InitializedPlugin<AnyPlugin>) => Effect.Effect<void>;
35
+ shutdownPlugin: (plugin: InitializedPlugin<AnyPlugin>) => Effect.Effect<void>;
36
+ cleanup: Effect.Effect<void>;
37
+ }
38
+
39
+ export class PluginService extends Context.Service<PluginService, PluginServiceShape>()(
40
+ "PluginService",
41
+ ) {}
42
+
43
+ export const PluginServiceDefault = Layer.effect(
44
+ PluginService,
45
+ Effect.gen(function* () {
21
46
  const loader = yield* PluginLoaderService;
22
47
  const lifecycle = yield* PluginLifecycleService;
23
48
 
@@ -27,44 +52,37 @@ export class PluginService extends Effect.Service<PluginService>()("PluginServic
27
52
  initializePlugin: loader.initializePlugin,
28
53
  registerPlugin: (plugin: InitializedPlugin<AnyPlugin>) => lifecycle.register(plugin),
29
54
  shutdownPlugin: (plugin: InitializedPlugin<AnyPlugin>) =>
30
- Effect.gen(function* () {
31
- yield* plugin.plugin
32
- .shutdown()
33
- .pipe(
34
- Effect.catchAll((error) =>
35
- Effect.logWarning(`Failed to shutdown plugin ${plugin.plugin.id}`, error),
36
- ),
37
- );
38
-
39
- yield* Scope.close(plugin.scope, Exit.succeed(undefined));
40
-
41
- yield* lifecycle.unregister(plugin);
42
- }),
55
+ Scope.close(plugin.scope, Exit.succeed(undefined)).pipe(
56
+ Effect.catchCause((cause) =>
57
+ Effect.logWarning(`Failed to shutdown plugin ${plugin.plugin.id}`, cause),
58
+ ),
59
+ Effect.ensuring(lifecycle.unregister(plugin)),
60
+ ),
43
61
  cleanup: lifecycle.cleanup,
44
62
  };
45
63
  }),
46
- }) {
47
- static Live = (
48
- registry: PluginRegistry,
49
- secrets: SecretsConfig,
50
- pluginMap: Record<string, AnyPluginConstructor> = {},
51
- ) => {
52
- const contextLayer = Layer.mergeAll(
53
- Layer.succeed(PluginRegistryTag, registry),
54
- Layer.succeed(SecretsConfigTag, secrets),
55
- Layer.succeed(PluginMapTag, pluginMap),
56
- );
64
+ );
57
65
 
58
- const servicesLayer = Layer.mergeAll(
59
- ModuleFederationService.Default,
60
- SecretsService.Default,
61
- RegistryService.Default,
62
- PluginLifecycleService.Default,
63
- ).pipe(Layer.provide(contextLayer));
66
+ export const PluginServiceLive = (
67
+ registry: PluginRegistry,
68
+ secrets: SecretsConfig,
69
+ pluginMap: Record<string, AnyPluginConstructor> = {},
70
+ ) => {
71
+ const contextLayer = Layer.mergeAll(
72
+ Layer.succeed(PluginRegistryTag, registry),
73
+ Layer.succeed(SecretsConfigTag, secrets),
74
+ Layer.succeed(PluginMapTag, pluginMap),
75
+ );
64
76
 
65
- return PluginService.Default.pipe(
66
- Layer.provide(PluginLoaderService.Default),
67
- Layer.provide(servicesLayer),
68
- );
69
- };
70
- }
77
+ const servicesLayer = Layer.mergeAll(
78
+ ModuleFederationServiceDefault,
79
+ SecretsServiceDefault,
80
+ RegistryServiceDefault,
81
+ PluginLifecycleServiceDefault,
82
+ ).pipe(Layer.provide(contextLayer));
83
+
84
+ return PluginServiceDefault.pipe(
85
+ Layer.provide(PluginLoaderServiceDefault),
86
+ Layer.provide(servicesLayer),
87
+ );
88
+ };