every-plugin 0.5.0 → 0.6.0

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 (198) hide show
  1. package/dist/{chunk-QQAxy9l9.mjs → _virtual/rolldown_runtime.cjs} +3 -7
  2. package/dist/{chunk-zltIcp7o.cjs → _virtual/rolldown_runtime.mjs} +4 -28
  3. package/dist/build/rspack/dev-server-middleware.cjs +201 -0
  4. package/dist/build/rspack/dev-server-middleware.cjs.map +1 -0
  5. package/dist/build/rspack/dev-server-middleware.mjs +200 -0
  6. package/dist/build/rspack/dev-server-middleware.mjs.map +1 -0
  7. package/dist/build/rspack/index.cjs +2 -362
  8. package/dist/build/rspack/index.d.cts +2 -20
  9. package/dist/build/rspack/index.d.mts +2 -20
  10. package/dist/build/rspack/index.mjs +2 -360
  11. package/dist/build/rspack/module-federation.cjs +46 -0
  12. package/dist/build/rspack/module-federation.cjs.map +1 -0
  13. package/dist/build/rspack/module-federation.mjs +46 -0
  14. package/dist/build/rspack/module-federation.mjs.map +1 -0
  15. package/dist/build/rspack/plugin.cjs +90 -0
  16. package/dist/build/rspack/plugin.cjs.map +1 -0
  17. package/dist/build/rspack/plugin.d.cts +20 -0
  18. package/dist/build/rspack/plugin.d.cts.map +1 -0
  19. package/dist/build/rspack/plugin.d.mts +20 -0
  20. package/dist/build/rspack/plugin.d.mts.map +1 -0
  21. package/dist/build/rspack/plugin.mjs +89 -0
  22. package/dist/build/rspack/plugin.mjs.map +1 -0
  23. package/dist/build/rspack/utils.cjs +41 -0
  24. package/dist/build/rspack/utils.cjs.map +1 -0
  25. package/dist/build/rspack/utils.mjs +38 -0
  26. package/dist/build/rspack/utils.mjs.map +1 -0
  27. package/dist/errors.cjs +103 -3
  28. package/dist/errors.cjs.map +1 -0
  29. package/dist/errors.d.cts +103 -3
  30. package/dist/errors.d.cts.map +1 -0
  31. package/dist/errors.d.mts +103 -3
  32. package/dist/errors.d.mts.map +1 -0
  33. package/dist/errors.mjs +102 -3
  34. package/dist/errors.mjs.map +1 -0
  35. package/dist/index.cjs +9 -55
  36. package/dist/index.d.cts +6 -5
  37. package/dist/index.d.mts +6 -5
  38. package/dist/index.mjs +5 -51
  39. package/dist/orpc.cjs +1 -1
  40. package/dist/package.cjs +29 -0
  41. package/dist/package.cjs.map +1 -0
  42. package/dist/package.mjs +17 -0
  43. package/dist/package.mjs.map +1 -0
  44. package/dist/plugin.cjs +48 -0
  45. package/dist/plugin.cjs.map +1 -0
  46. package/dist/plugin.d.cts +62 -0
  47. package/dist/plugin.d.cts.map +1 -0
  48. package/dist/plugin.d.mts +62 -0
  49. package/dist/plugin.d.mts.map +1 -0
  50. package/dist/plugin.mjs +47 -0
  51. package/dist/plugin.mjs.map +1 -0
  52. package/dist/runtime/errors.cjs +97 -0
  53. package/dist/runtime/errors.cjs.map +1 -0
  54. package/dist/runtime/errors.d.cts +27 -0
  55. package/dist/runtime/errors.d.cts.map +1 -0
  56. package/dist/runtime/errors.d.mts +27 -0
  57. package/dist/runtime/errors.d.mts.map +1 -0
  58. package/dist/runtime/errors.mjs +93 -0
  59. package/dist/runtime/errors.mjs.map +1 -0
  60. package/dist/runtime/index.cjs +157 -5
  61. package/dist/runtime/index.cjs.map +1 -0
  62. package/dist/runtime/index.d.cts +43 -5
  63. package/dist/runtime/index.d.cts.map +1 -0
  64. package/dist/runtime/index.d.mts +43 -5
  65. package/dist/runtime/index.d.mts.map +1 -0
  66. package/dist/runtime/index.mjs +155 -4
  67. package/dist/runtime/index.mjs.map +1 -0
  68. package/dist/runtime/services/module-federation.service.cjs +142 -0
  69. package/dist/runtime/services/module-federation.service.cjs.map +1 -0
  70. package/dist/runtime/services/module-federation.service.d.cts +15 -0
  71. package/dist/runtime/services/module-federation.service.d.cts.map +1 -0
  72. package/dist/runtime/services/module-federation.service.d.mts +15 -0
  73. package/dist/runtime/services/module-federation.service.d.mts.map +1 -0
  74. package/dist/runtime/services/module-federation.service.mjs +141 -0
  75. package/dist/runtime/services/module-federation.service.mjs.map +1 -0
  76. package/dist/runtime/services/normalize.cjs +22 -2
  77. package/dist/runtime/services/normalize.cjs.map +1 -0
  78. package/dist/runtime/services/normalize.d.cts +21 -2
  79. package/dist/runtime/services/normalize.d.cts.map +1 -0
  80. package/dist/runtime/services/normalize.d.mts +21 -2
  81. package/dist/runtime/services/normalize.d.mts.map +1 -0
  82. package/dist/runtime/services/normalize.mjs +21 -2
  83. package/dist/runtime/services/normalize.mjs.map +1 -0
  84. package/dist/runtime/services/plugin-lifecycle.service.cjs +33 -0
  85. package/dist/runtime/services/plugin-lifecycle.service.cjs.map +1 -0
  86. package/dist/runtime/services/plugin-lifecycle.service.d.cts +17 -0
  87. package/dist/runtime/services/plugin-lifecycle.service.d.cts.map +1 -0
  88. package/dist/runtime/services/plugin-lifecycle.service.d.mts +17 -0
  89. package/dist/runtime/services/plugin-lifecycle.service.d.mts.map +1 -0
  90. package/dist/runtime/services/plugin-lifecycle.service.mjs +32 -0
  91. package/dist/runtime/services/plugin-lifecycle.service.mjs.map +1 -0
  92. package/dist/runtime/services/plugin-loader.service.cjs +132 -0
  93. package/dist/runtime/services/plugin-loader.service.cjs.map +1 -0
  94. package/dist/runtime/services/plugin-loader.service.d.cts +54 -0
  95. package/dist/runtime/services/plugin-loader.service.d.cts.map +1 -0
  96. package/dist/runtime/services/plugin-loader.service.d.mts +54 -0
  97. package/dist/runtime/services/plugin-loader.service.d.mts.map +1 -0
  98. package/dist/runtime/services/plugin-loader.service.mjs +128 -0
  99. package/dist/runtime/services/plugin-loader.service.mjs.map +1 -0
  100. package/dist/runtime/services/plugin.service.cjs +33 -0
  101. package/dist/runtime/services/plugin.service.cjs.map +1 -0
  102. package/dist/runtime/services/plugin.service.d.cts +42 -0
  103. package/dist/runtime/services/plugin.service.d.cts.map +1 -0
  104. package/dist/runtime/services/plugin.service.d.mts +42 -0
  105. package/dist/runtime/services/plugin.service.d.mts.map +1 -0
  106. package/dist/runtime/services/plugin.service.mjs +32 -0
  107. package/dist/runtime/services/plugin.service.mjs.map +1 -0
  108. package/dist/runtime/services/secrets.service.cjs +50 -0
  109. package/dist/runtime/services/secrets.service.cjs.map +1 -0
  110. package/dist/runtime/services/secrets.service.d.cts +16 -0
  111. package/dist/runtime/services/secrets.service.d.cts.map +1 -0
  112. package/dist/runtime/services/secrets.service.d.mts +16 -0
  113. package/dist/runtime/services/secrets.service.d.mts.map +1 -0
  114. package/dist/runtime/services/secrets.service.mjs +48 -0
  115. package/dist/runtime/services/secrets.service.mjs.map +1 -0
  116. package/dist/runtime/validation.cjs +18 -0
  117. package/dist/runtime/validation.cjs.map +1 -0
  118. package/dist/runtime/validation.mjs +17 -0
  119. package/dist/runtime/validation.mjs.map +1 -0
  120. package/dist/testing/index.cjs +2 -4
  121. package/dist/testing/index.cjs.map +1 -1
  122. package/dist/testing/index.d.cts +4 -4
  123. package/dist/testing/index.d.mts +4 -4
  124. package/dist/testing/index.mjs +1 -3
  125. package/dist/testing/index.mjs.map +1 -1
  126. package/dist/types.cjs +0 -0
  127. package/dist/types.d.cts +261 -0
  128. package/dist/types.d.cts.map +1 -0
  129. package/dist/types.d.mts +261 -0
  130. package/dist/types.d.mts.map +1 -0
  131. package/dist/types.mjs +1 -0
  132. package/dist/zod-core.cjs +9 -0
  133. package/dist/zod-core.d.cts +1 -0
  134. package/dist/zod-core.d.mts +1 -0
  135. package/dist/zod-core.mjs +3 -0
  136. package/dist/zod.cjs +13 -1
  137. package/dist/zod.cjs.map +1 -0
  138. package/dist/zod.d.cts +8 -2
  139. package/dist/zod.d.cts.map +1 -0
  140. package/dist/zod.d.mts +8 -2
  141. package/dist/zod.d.mts.map +1 -0
  142. package/dist/zod.mjs +9 -2
  143. package/dist/zod.mjs.map +1 -0
  144. package/package.json +17 -2
  145. package/dist/build/rspack/index.cjs.map +0 -1
  146. package/dist/build/rspack/index.d.cts.map +0 -1
  147. package/dist/build/rspack/index.d.mts.map +0 -1
  148. package/dist/build/rspack/index.mjs.map +0 -1
  149. package/dist/errors-9sNpYLv5.d.mts +0 -75
  150. package/dist/errors-9sNpYLv5.d.mts.map +0 -1
  151. package/dist/errors-CVnoPl9v.cjs +0 -68
  152. package/dist/errors-CVnoPl9v.cjs.map +0 -1
  153. package/dist/errors-D7keKf7a.mjs +0 -63
  154. package/dist/errors-D7keKf7a.mjs.map +0 -1
  155. package/dist/errors-DKPPPYYT.d.cts +0 -75
  156. package/dist/errors-DKPPPYYT.d.cts.map +0 -1
  157. package/dist/fetch-8DauUFDh.mjs +0 -335
  158. package/dist/fetch-8DauUFDh.mjs.map +0 -1
  159. package/dist/fetch-CrBvwsZ4.cjs +0 -336
  160. package/dist/fetch-CrBvwsZ4.cjs.map +0 -1
  161. package/dist/index-Bu2wtZrA.d.mts +0 -463
  162. package/dist/index-Bu2wtZrA.d.mts.map +0 -1
  163. package/dist/index-DtTqwV4f.d.cts +0 -462
  164. package/dist/index-DtTqwV4f.d.cts.map +0 -1
  165. package/dist/index.cjs.map +0 -1
  166. package/dist/index.mjs.map +0 -1
  167. package/dist/normalize-BW7kk8Lk.d.cts +0 -21
  168. package/dist/normalize-BW7kk8Lk.d.cts.map +0 -1
  169. package/dist/normalize-D4Qh0wVk.cjs +0 -28
  170. package/dist/normalize-D4Qh0wVk.cjs.map +0 -1
  171. package/dist/normalize-D7nae0Hn.mjs +0 -22
  172. package/dist/normalize-D7nae0Hn.mjs.map +0 -1
  173. package/dist/normalize-eB_j86fm.d.mts +0 -21
  174. package/dist/normalize-eB_j86fm.d.mts.map +0 -1
  175. package/dist/package-CaRYwbRi.mjs +0 -150
  176. package/dist/package-CaRYwbRi.mjs.map +0 -1
  177. package/dist/package-DyTuSutr.cjs +0 -155
  178. package/dist/package-DyTuSutr.cjs.map +0 -1
  179. package/dist/plugins-C6MGKdD-.mjs +0 -790
  180. package/dist/plugins-C6MGKdD-.mjs.map +0 -1
  181. package/dist/plugins-DNaNtkG7.cjs +0 -791
  182. package/dist/plugins-DNaNtkG7.cjs.map +0 -1
  183. package/dist/runtime-BNcFgWDG.cjs +0 -558
  184. package/dist/runtime-BNcFgWDG.cjs.map +0 -1
  185. package/dist/runtime-CAWcnrAk.mjs +0 -547
  186. package/dist/runtime-CAWcnrAk.mjs.map +0 -1
  187. package/dist/standard-CkH8zNkx.mjs +0 -584
  188. package/dist/standard-CkH8zNkx.mjs.map +0 -1
  189. package/dist/standard-v75BC6Z5.cjs +0 -685
  190. package/dist/standard-v75BC6Z5.cjs.map +0 -1
  191. package/dist/zod-A7Pti5IV.d.cts +0 -4
  192. package/dist/zod-A7Pti5IV.d.cts.map +0 -1
  193. package/dist/zod-BVo51kgJ.mjs +0 -10
  194. package/dist/zod-BVo51kgJ.mjs.map +0 -1
  195. package/dist/zod-DYghWCz1.cjs +0 -14
  196. package/dist/zod-DYghWCz1.cjs.map +0 -1
  197. package/dist/zod-Zw8dlP3j.d.mts +0 -4
  198. package/dist/zod-Zw8dlP3j.d.mts.map +0 -1
@@ -0,0 +1,32 @@
1
+ import { toPluginRuntimeError } from "../errors.mjs";
2
+ import { Effect, Ref } from "effect";
3
+
4
+ //#region src/runtime/services/plugin-lifecycle.service.ts
5
+ var PluginLifecycleService = class extends Effect.Service()("PluginLifecycleService", { effect: Effect.gen(function* () {
6
+ const activePlugins = yield* Ref.make(/* @__PURE__ */ new Set());
7
+ return {
8
+ register: (plugin) => Ref.update(activePlugins, (plugins) => new Set(plugins).add(plugin)),
9
+ unregister: (plugin) => Ref.update(activePlugins, (plugins) => {
10
+ const newSet = new Set(plugins);
11
+ newSet.delete(plugin);
12
+ return newSet;
13
+ }),
14
+ shutdown: (plugin) => Effect.gen(function* () {
15
+ yield* Ref.update(activePlugins, (plugins) => {
16
+ const newSet = new Set(plugins);
17
+ newSet.delete(plugin);
18
+ return newSet;
19
+ });
20
+ yield* plugin.plugin.shutdown().pipe(Effect.mapError((error) => toPluginRuntimeError(error, plugin.plugin.id, void 0, "shutdown-plugin", false)));
21
+ }),
22
+ cleanup: () => Effect.gen(function* () {
23
+ const plugins = yield* Ref.get(activePlugins);
24
+ yield* Effect.forEach(plugins, (plugin) => plugin.plugin.shutdown().pipe(Effect.mapError((error) => toPluginRuntimeError(error, plugin.plugin.id, void 0, "cleanup-shutdown", false)), Effect.catchAll((error) => Effect.logError(`Failed to shutdown plugin ${plugin.plugin.id} during cleanup`, error, { pluginId: plugin.plugin.id }))), { concurrency: "unbounded" });
25
+ yield* Ref.set(activePlugins, /* @__PURE__ */ new Set());
26
+ }).pipe(Effect.catchAll(() => Effect.void))
27
+ };
28
+ }) }) {};
29
+
30
+ //#endregion
31
+ export { PluginLifecycleService };
32
+ //# sourceMappingURL=plugin-lifecycle.service.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin-lifecycle.service.mjs","names":[],"sources":["../../../src/runtime/services/plugin-lifecycle.service.ts"],"sourcesContent":["import { Effect, Ref } from \"effect\";\nimport type { AnyPlugin, InitializedPlugin } from \"../../types\";\nimport { toPluginRuntimeError } from \"../errors\";\n\nexport class PluginLifecycleService extends Effect.Service<PluginLifecycleService>()(\"PluginLifecycleService\", {\n effect: Effect.gen(function* () {\n const activePlugins = yield* Ref.make(new Set<InitializedPlugin<AnyPlugin>>());\n\n return {\n register: <T extends AnyPlugin>(plugin: InitializedPlugin<T>) =>\n Ref.update(activePlugins, plugins =>\n new Set(plugins).add(plugin as InitializedPlugin<AnyPlugin>)\n ),\n\n unregister: (plugin: InitializedPlugin<AnyPlugin>) =>\n Ref.update(activePlugins, plugins => {\n const newSet = new Set(plugins);\n newSet.delete(plugin);\n return newSet;\n }),\n\n shutdown: (plugin: InitializedPlugin<AnyPlugin>) =>\n Effect.gen(function* () {\n // Remove from active plugins\n yield* Ref.update(activePlugins, plugins => {\n const newSet = new Set(plugins);\n newSet.delete(plugin);\n return newSet;\n });\n\n // Shutdown the plugin\n yield* plugin.plugin.shutdown().pipe(\n Effect.mapError(error =>\n toPluginRuntimeError(error, plugin.plugin.id, undefined, \"shutdown-plugin\", false)\n )\n );\n }),\n\n cleanup: () =>\n Effect.gen(function* () {\n const plugins = yield* Ref.get(activePlugins);\n\n // Shutdown all active plugins concurrently\n yield* Effect.forEach(\n plugins,\n plugin =>\n plugin.plugin.shutdown().pipe(\n Effect.mapError(error =>\n toPluginRuntimeError(error, plugin.plugin.id, undefined, \"cleanup-shutdown\", false)\n ),\n Effect.catchAll(error =>\n Effect.logError(\n `Failed to shutdown plugin ${plugin.plugin.id} during cleanup`,\n error,\n { pluginId: plugin.plugin.id }\n )\n )\n ),\n { concurrency: \"unbounded\" }\n );\n\n // Clear the active plugins set\n yield* Ref.set(activePlugins, new Set());\n }).pipe(\n Effect.catchAll(() => Effect.void) // Convert errors to void for cleanup\n ),\n };\n }),\n}) { }\n"],"mappings":";;;;AAIA,IAAa,yBAAb,cAA4C,OAAO,SAAiC,CAAC,0BAA0B,EAC7G,QAAQ,OAAO,IAAI,aAAa;CAC9B,MAAM,gBAAgB,OAAO,IAAI,qBAAK,IAAI,KAAmC,CAAC;AAE9E,QAAO;EACL,WAAgC,WAC9B,IAAI,OAAO,gBAAe,YACxB,IAAI,IAAI,QAAQ,CAAC,IAAI,OAAuC,CAC7D;EAEH,aAAa,WACX,IAAI,OAAO,gBAAe,YAAW;GACnC,MAAM,SAAS,IAAI,IAAI,QAAQ;AAC/B,UAAO,OAAO,OAAO;AACrB,UAAO;IACP;EAEJ,WAAW,WACT,OAAO,IAAI,aAAa;AAEtB,UAAO,IAAI,OAAO,gBAAe,YAAW;IAC1C,MAAM,SAAS,IAAI,IAAI,QAAQ;AAC/B,WAAO,OAAO,OAAO;AACrB,WAAO;KACP;AAGF,UAAO,OAAO,OAAO,UAAU,CAAC,KAC9B,OAAO,UAAS,UACd,qBAAqB,OAAO,OAAO,OAAO,IAAI,QAAW,mBAAmB,MAAM,CACnF,CACF;IACD;EAEJ,eACE,OAAO,IAAI,aAAa;GACtB,MAAM,UAAU,OAAO,IAAI,IAAI,cAAc;AAG7C,UAAO,OAAO,QACZ,UACA,WACE,OAAO,OAAO,UAAU,CAAC,KACvB,OAAO,UAAS,UACd,qBAAqB,OAAO,OAAO,OAAO,IAAI,QAAW,oBAAoB,MAAM,CACpF,EACD,OAAO,UAAS,UACd,OAAO,SACL,6BAA6B,OAAO,OAAO,GAAG,kBAC9C,OACA,EAAE,UAAU,OAAO,OAAO,IAAI,CAC/B,CACF,CACF,EACH,EAAE,aAAa,aAAa,CAC7B;AAGD,UAAO,IAAI,IAAI,+BAAe,IAAI,KAAK,CAAC;IACxC,CAAC,KACD,OAAO,eAAe,OAAO,KAAK,CACnC;EACJ;EACD,EACH,CAAC,CAAC"}
@@ -0,0 +1,132 @@
1
+ const require_rolldown_runtime = require('../../_virtual/rolldown_runtime.cjs');
2
+ const require_errors = require('../errors.cjs');
3
+ const require_module_federation_service = require('./module-federation.service.cjs');
4
+ const require_validation = require('../validation.cjs');
5
+ const require_secrets_service = require('./secrets.service.cjs');
6
+ let effect = require("effect");
7
+
8
+ //#region src/runtime/services/plugin-loader.service.ts
9
+ var PluginRegistryTag = class extends effect.Context.Tag("PluginRegistry")() {};
10
+ var PluginMapTag = class extends effect.Context.Tag("PluginMap")() {};
11
+ var RegistryService = class extends effect.Effect.Service()("RegistryService", { effect: effect.Effect.gen(function* () {
12
+ const registry = yield* PluginRegistryTag;
13
+ const pluginMap = yield* PluginMapTag;
14
+ return {
15
+ get: (pluginId) => effect.Effect.gen(function* () {
16
+ const entry = registry[pluginId];
17
+ if (!entry) return yield* effect.Effect.fail(new require_errors.PluginRuntimeError({
18
+ pluginId,
19
+ operation: "validate-plugin-id",
20
+ cause: /* @__PURE__ */ new Error(`Plugin ${pluginId} not found in registry`),
21
+ retryable: false
22
+ }));
23
+ if ("module" in entry) return {
24
+ constructor: entry.module,
25
+ metadata: {
26
+ remoteUrl: entry.remote || "",
27
+ version: entry.version,
28
+ description: entry.description
29
+ }
30
+ };
31
+ return {
32
+ constructor: null,
33
+ metadata: {
34
+ remoteUrl: entry.remote,
35
+ version: entry.version,
36
+ description: entry.description
37
+ }
38
+ };
39
+ }),
40
+ getModule: (pluginId) => effect.Effect.succeed(pluginMap[pluginId] || null)
41
+ };
42
+ }) }) {};
43
+ var PluginLoaderService = class extends effect.Effect.Service()("PluginLoaderService", { effect: effect.Effect.gen(function* () {
44
+ const moduleFederationService = yield* require_module_federation_service.ModuleFederationService;
45
+ const secretsService = yield* require_secrets_service.SecretsService;
46
+ const registryService = yield* RegistryService;
47
+ const resolveUrl = (baseUrl, version) => version && version !== "latest" ? baseUrl.replace("@latest", `@${version}`) : baseUrl;
48
+ return {
49
+ loadPlugin: (pluginId) => effect.Effect.gen(function* () {
50
+ const entry = yield* registryService.get(pluginId);
51
+ if (entry.constructor) {
52
+ yield* effect.Effect.logDebug("Loading plugin from direct module", { pluginId });
53
+ return {
54
+ ctor: entry.constructor,
55
+ metadata: entry.metadata
56
+ };
57
+ }
58
+ const url = entry.metadata.remoteUrl;
59
+ if (!url) return yield* effect.Effect.fail(new require_errors.PluginRuntimeError({
60
+ pluginId,
61
+ operation: "load-plugin",
62
+ cause: /* @__PURE__ */ new Error(`Plugin ${pluginId} has no module or remote URL configured`),
63
+ retryable: false
64
+ }));
65
+ const resolvedUrl = resolveUrl(url);
66
+ yield* moduleFederationService.registerRemote(pluginId, resolvedUrl).pipe(effect.Effect.mapError((error) => require_errors.toPluginRuntimeError(error, pluginId, void 0, "register-remote", true)));
67
+ yield* effect.Effect.logDebug("Loading plugin from remote", {
68
+ pluginId,
69
+ url: resolvedUrl
70
+ });
71
+ return {
72
+ ctor: yield* moduleFederationService.loadRemoteConstructor(pluginId, resolvedUrl).pipe(effect.Effect.mapError((error) => require_errors.toPluginRuntimeError(error, pluginId, void 0, "load-remote", false))),
73
+ metadata: entry.metadata
74
+ };
75
+ }),
76
+ instantiatePlugin: (pluginId, loadedPlugin) => effect.Effect.gen(function* () {
77
+ const instance = yield* effect.Effect.try(() => new loadedPlugin.ctor()).pipe(effect.Effect.mapError((error) => require_errors.toPluginRuntimeError(error, pluginId, void 0, "instantiate-plugin", false)));
78
+ instance.id = pluginId;
79
+ return {
80
+ plugin: instance,
81
+ metadata: loadedPlugin.metadata
82
+ };
83
+ }),
84
+ initializePlugin: (pluginInstance, config) => effect.Effect.gen(function* () {
85
+ const { plugin } = pluginInstance;
86
+ const validatedVariables = yield* require_validation.validate(plugin.configSchema.variables, config.variables, plugin.id, "config").pipe(effect.Effect.mapError((validationError) => new require_errors.PluginRuntimeError({
87
+ pluginId: plugin.id,
88
+ operation: "validate-config",
89
+ cause: validationError.zodError,
90
+ retryable: false
91
+ })));
92
+ const validatedSecrets = yield* require_validation.validate(plugin.configSchema.secrets, config.secrets, plugin.id, "config").pipe(effect.Effect.mapError((validationError) => new require_errors.PluginRuntimeError({
93
+ pluginId: plugin.id,
94
+ operation: "validate-secrets",
95
+ cause: validationError.zodError,
96
+ retryable: false
97
+ })));
98
+ const hydratedConfig = yield* secretsService.hydrateSecrets({
99
+ variables: validatedVariables,
100
+ secrets: validatedSecrets
101
+ });
102
+ const _variables = yield* require_validation.validate(plugin.configSchema.variables, hydratedConfig.variables, plugin.id, "config").pipe(effect.Effect.mapError((validationError) => new require_errors.PluginRuntimeError({
103
+ pluginId: plugin.id,
104
+ operation: "validate-hydrated-config",
105
+ cause: validationError.zodError,
106
+ retryable: false
107
+ })));
108
+ const scope = yield* effect.Scope.make();
109
+ const context = yield* plugin.initialize({
110
+ variables: _variables,
111
+ secrets: hydratedConfig.secrets
112
+ }).pipe(effect.Effect.provideService(effect.Scope.Scope, scope), effect.Effect.mapError((error) => require_errors.toPluginRuntimeError(error, plugin.id, void 0, "initialize-plugin", false)));
113
+ return {
114
+ plugin,
115
+ metadata: pluginInstance.metadata,
116
+ config: {
117
+ variables: _variables,
118
+ secrets: hydratedConfig.secrets
119
+ },
120
+ context,
121
+ scope
122
+ };
123
+ })
124
+ };
125
+ }) }) {};
126
+
127
+ //#endregion
128
+ exports.PluginLoaderService = PluginLoaderService;
129
+ exports.PluginMapTag = PluginMapTag;
130
+ exports.PluginRegistryTag = PluginRegistryTag;
131
+ exports.RegistryService = RegistryService;
132
+ //# sourceMappingURL=plugin-loader.service.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin-loader.service.cjs","names":["Context","Effect","PluginRuntimeError","ModuleFederationService","SecretsService","toPluginRuntimeError","validate","Scope"],"sources":["../../../src/runtime/services/plugin-loader.service.ts"],"sourcesContent":["import type { InferSchemaInput, InferSchemaOutput } from \"@orpc/contract\";\nimport { Context, Effect, Scope } from \"effect\";\nimport type { z } from \"zod\";\nimport type {\n\tAnyPlugin,\n\tAnyPluginConstructor,\n\tInitializedPlugin,\n\tLoadedPlugin,\n\tPluginInstance,\n\tPluginMetadata,\n\tPluginRegistry\n} from \"../../types\";\nimport { PluginRuntimeError, toPluginRuntimeError } from \"../errors\";\nimport { validate } from \"../validation\";\nimport { ModuleFederationService } from \"./module-federation.service\";\nimport { SecretsService } from \"./secrets.service\";\n\nexport class PluginRegistryTag extends Context.Tag(\"PluginRegistry\")<\n\tPluginRegistryTag,\n\tPluginRegistry\n>() { }\n\nexport class PluginMapTag extends Context.Tag(\"PluginMap\")<\n\tPluginMapTag,\n\tRecord<string, AnyPluginConstructor>\n>() { }\n\nexport class RegistryService extends Effect.Service<RegistryService>()(\"RegistryService\", {\n\teffect: Effect.gen(function* () {\n\t\tconst registry = yield* PluginRegistryTag;\n\t\tconst pluginMap = yield* PluginMapTag;\n\n\t\treturn {\n\t\t\tget: (pluginId: string) =>\n\t\t\t\tEffect.gen(function* () {\n\t\t\t\t\tconst entry = registry[pluginId];\n\t\t\t\t\t\n\t\t\t\t\tif (!entry) {\n\t\t\t\t\t\treturn yield* Effect.fail(\n\t\t\t\t\t\t\tnew PluginRuntimeError({\n\t\t\t\t\t\t\t\tpluginId,\n\t\t\t\t\t\t\t\toperation: \"validate-plugin-id\",\n\t\t\t\t\t\t\t\tcause: new Error(`Plugin ${pluginId} not found in registry`),\n\t\t\t\t\t\t\t\tretryable: false,\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\n\t\t\t\t\tif (\"module\" in entry) {\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\tconstructor: entry.module,\n\t\t\t\t\t\t\tmetadata: {\n\t\t\t\t\t\t\t\tremoteUrl: entry.remote || \"\",\n\t\t\t\t\t\t\t\tversion: entry.version,\n\t\t\t\t\t\t\t\tdescription: entry.description,\n\t\t\t\t\t\t\t} as PluginMetadata,\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\n\t\t\t\t\treturn {\n\t\t\t\t\t\tconstructor: null,\n\t\t\t\t\t\tmetadata: {\n\t\t\t\t\t\t\tremoteUrl: entry.remote,\n\t\t\t\t\t\t\tversion: entry.version,\n\t\t\t\t\t\t\tdescription: entry.description,\n\t\t\t\t\t\t} as PluginMetadata,\n\t\t\t\t\t};\n\t\t\t\t}),\n\n\t\t\tgetModule: (pluginId: string) =>\n\t\t\t\tEffect.succeed(pluginMap[pluginId] || null),\n\t\t};\n\t}),\n}) { }\n\nexport class PluginLoaderService extends Effect.Service<PluginLoaderService>()(\"PluginLoaderService\", {\n\teffect: Effect.gen(function* () {\n\t\tconst moduleFederationService = yield* ModuleFederationService;\n\t\tconst secretsService = yield* SecretsService;\n\t\tconst registryService = yield* RegistryService;\n\n\t\tconst resolveUrl = (baseUrl: string, version?: string): string =>\n\t\t\tversion && version !== \"latest\"\n\t\t\t\t? baseUrl.replace(\"@latest\", `@${version}`)\n\t\t\t\t: baseUrl;\n\n\t\treturn {\n\t\t\tloadPlugin: (pluginId: string) =>\n\t\t\t\tEffect.gen(function* () {\n\t\t\t\t\tconst entry = yield* registryService.get(pluginId);\n\n\t\t\t\t\tif (entry.constructor) {\n\t\t\t\t\t\tyield* Effect.logDebug(\"Loading plugin from direct module\", { pluginId });\n\t\t\t\t\t\t\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\tctor: entry.constructor,\n\t\t\t\t\t\t\tmetadata: entry.metadata,\n\t\t\t\t\t\t} satisfies LoadedPlugin;\n\t\t\t\t\t}\n\n\t\t\t\t\tconst url = entry.metadata.remoteUrl;\n\t\t\t\t\tif (!url) {\n\t\t\t\t\t\treturn yield* Effect.fail(\n\t\t\t\t\t\t\tnew PluginRuntimeError({\n\t\t\t\t\t\t\t\tpluginId,\n\t\t\t\t\t\t\t\toperation: \"load-plugin\",\n\t\t\t\t\t\t\t\tcause: new Error(`Plugin ${pluginId} has no module or remote URL configured`),\n\t\t\t\t\t\t\t\tretryable: false,\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\n\t\t\t\t\tconst resolvedUrl = resolveUrl(url);\n\n\t\t\t\t\tyield* moduleFederationService.registerRemote(pluginId, resolvedUrl).pipe(\n\t\t\t\t\t\tEffect.mapError((error) =>\n\t\t\t\t\t\t\ttoPluginRuntimeError(error, pluginId, undefined, \"register-remote\", true),\n\t\t\t\t\t\t),\n\t\t\t\t\t);\n\n\t\t\t\t\tyield* Effect.logDebug(\"Loading plugin from remote\", { pluginId, url: resolvedUrl });\n\n\t\t\t\t\tconst ctor = yield* moduleFederationService.loadRemoteConstructor(pluginId, resolvedUrl).pipe(\n\t\t\t\t\t\tEffect.mapError((error) =>\n\t\t\t\t\t\t\ttoPluginRuntimeError(error, pluginId, undefined, \"load-remote\", false),\n\t\t\t\t\t\t),\n\t\t\t\t\t);\n\n\t\t\t\t\treturn {\n\t\t\t\t\t\tctor,\n\t\t\t\t\t\tmetadata: entry.metadata,\n\t\t\t\t\t} satisfies LoadedPlugin;\n\t\t\t\t}),\n\n\t\t\tinstantiatePlugin: <T extends AnyPlugin>(\n\t\t\t\tpluginId: string,\n\t\t\t\tloadedPlugin: LoadedPlugin<T>,\n\t\t\t) =>\n\t\t\t\tEffect.gen(function* () {\n\t\t\t\t\tconst instance = yield* Effect.try(() => new loadedPlugin.ctor()).pipe(\n\t\t\t\t\t\tEffect.mapError((error) =>\n\t\t\t\t\t\t\ttoPluginRuntimeError(\n\t\t\t\t\t\t\t\terror,\n\t\t\t\t\t\t\t\tpluginId,\n\t\t\t\t\t\t\t\tundefined,\n\t\t\t\t\t\t\t\t\"instantiate-plugin\",\n\t\t\t\t\t\t\t\tfalse,\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t),\n\t\t\t\t\t);\n\n\t\t\t\t\t(instance.id as string) = pluginId;\n\n\t\t\t\t\treturn {\n\t\t\t\t\t\tplugin: instance,\n\t\t\t\t\t\tmetadata: loadedPlugin.metadata,\n\t\t\t\t\t} satisfies PluginInstance<T>;\n\t\t\t\t}),\n\n\t\t\tinitializePlugin: <T extends AnyPlugin>(\n\t\t\t\tpluginInstance: PluginInstance<T>,\n\t\t\t\tconfig: { variables: InferSchemaInput<T[\"configSchema\"][\"variables\"]>; secrets: InferSchemaInput<T[\"configSchema\"][\"secrets\"]> },\n\t\t\t) =>\n\t\t\t\tEffect.gen(function* () {\n\t\t\t\t\tconst { plugin } = pluginInstance;\n\n\t\t\t\t\t// Validate and hydrate config\n\t\t\t\t\tconst validatedVariables = yield* validate(\n\t\t\t\t\t\tplugin.configSchema.variables as z.ZodSchema<InferSchemaOutput<T[\"configSchema\"][\"variables\"]>>,\n\t\t\t\t\t\tconfig.variables,\n\t\t\t\t\t\tplugin.id,\n\t\t\t\t\t\t\"config\",\n\t\t\t\t\t).pipe(\n\t\t\t\t\t\tEffect.mapError((validationError) =>\n\t\t\t\t\t\t\tnew PluginRuntimeError({\n\t\t\t\t\t\t\t\tpluginId: plugin.id,\n\t\t\t\t\t\t\t\toperation: \"validate-config\",\n\t\t\t\t\t\t\t\tcause: validationError.zodError,\n\t\t\t\t\t\t\t\tretryable: false,\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t),\n\t\t\t\t\t);\n\n\t\t\t\t\t// Validate secrets\n\t\t\t\t\tconst validatedSecrets = yield* validate(\n\t\t\t\t\t\tplugin.configSchema.secrets as z.ZodSchema<InferSchemaOutput<T[\"configSchema\"][\"secrets\"]>>,\n\t\t\t\t\t\tconfig.secrets,\n\t\t\t\t\t\tplugin.id,\n\t\t\t\t\t\t\"config\",\n\t\t\t\t\t).pipe(\n\t\t\t\t\t\tEffect.mapError((validationError) =>\n\t\t\t\t\t\t\tnew PluginRuntimeError({\n\t\t\t\t\t\t\t\tpluginId: plugin.id,\n\t\t\t\t\t\t\t\toperation: \"validate-secrets\",\n\t\t\t\t\t\t\t\tcause: validationError.zodError,\n\t\t\t\t\t\t\t\tretryable: false,\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t),\n\t\t\t\t\t);\n\n\t\t\t\t\t// Hydrate secrets in variables\n\t\t\t\t\tconst hydratedConfig = yield* secretsService.hydrateSecrets({\n\t\t\t\t\t\tvariables: validatedVariables,\n\t\t\t\t\t\tsecrets: validatedSecrets,\n\t\t\t\t\t});\n\n\t\t\t\t\tconst _variables = yield* validate(\n\t\t\t\t\t\tplugin.configSchema.variables as z.ZodSchema<InferSchemaOutput<T[\"configSchema\"][\"variables\"]>>,\n\t\t\t\t\t\thydratedConfig.variables,\n\t\t\t\t\t\tplugin.id,\n\t\t\t\t\t\t\"config\",\n\t\t\t\t\t).pipe(\n\t\t\t\t\t\tEffect.mapError((validationError) =>\n\t\t\t\t\t\t\tnew PluginRuntimeError({\n\t\t\t\t\t\t\t\tpluginId: plugin.id,\n\t\t\t\t\t\t\t\toperation: \"validate-hydrated-config\",\n\t\t\t\t\t\t\t\tcause: validationError.zodError,\n\t\t\t\t\t\t\t\tretryable: false,\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t),\n\t\t\t\t\t);\n\n\t\t\t\t\t// Create a long-lived scope for this plugin instance\n\t\t\t\t\tconst scope = yield* Scope.make();\n\n\t\t\t\t\t// Initialize plugin within the scope\n\t\t\t\t\tconst context = yield* plugin.initialize({ variables: _variables, secrets: hydratedConfig.secrets }).pipe(\n\t\t\t\t\t\tEffect.provideService(Scope.Scope, scope),\n\t\t\t\t\t\tEffect.mapError((error) =>\n\t\t\t\t\t\t\ttoPluginRuntimeError(error, plugin.id, undefined, \"initialize-plugin\", false),\n\t\t\t\t\t\t)\n\t\t\t\t\t);\n\n\t\t\t\t\treturn {\n\t\t\t\t\t\tplugin,\n\t\t\t\t\t\tmetadata: pluginInstance.metadata,\n\t\t\t\t\t\tconfig: { variables: _variables, secrets: hydratedConfig.secrets },\n\t\t\t\t\t\tcontext,\n\t\t\t\t\t\tscope,\n\t\t\t\t\t} satisfies InitializedPlugin<T>;\n\t\t\t\t}),\n\t\t};\n\t}),\n}) {\n}\n"],"mappings":"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"}
@@ -0,0 +1,54 @@
1
+ import { AnyPlugin, AnyPluginConstructor, LoadedPlugin, PluginInstance, PluginMetadata, PluginRegistry } from "../../types.cjs";
2
+ import { PluginRuntimeError } from "../errors.cjs";
3
+ import { ModuleFederationService } from "./module-federation.service.cjs";
4
+ import { SecretsService } from "./secrets.service.cjs";
5
+ import { Context, Effect, Scope } from "effect";
6
+ import { InferSchemaInput, InferSchemaOutput } from "@orpc/contract";
7
+
8
+ //#region src/runtime/services/plugin-loader.service.d.ts
9
+ declare const PluginRegistryTag_base: Context.TagClass<PluginRegistryTag, "PluginRegistry", PluginRegistry>;
10
+ declare class PluginRegistryTag extends PluginRegistryTag_base {}
11
+ declare const PluginMapTag_base: Context.TagClass<PluginMapTag, "PluginMap", Record<string, AnyPluginConstructor>>;
12
+ declare class PluginMapTag extends PluginMapTag_base {}
13
+ declare const RegistryService_base: Effect.Service.Class<RegistryService, "RegistryService", {
14
+ readonly effect: Effect.Effect<{
15
+ get: (pluginId: string) => Effect.Effect<{
16
+ constructor: AnyPluginConstructor;
17
+ metadata: PluginMetadata;
18
+ } | {
19
+ constructor: null;
20
+ metadata: PluginMetadata;
21
+ }, PluginRuntimeError, never>;
22
+ getModule: (pluginId: string) => Effect.Effect<AnyPluginConstructor | null, never, never>;
23
+ }, never, PluginRegistryTag | PluginMapTag>;
24
+ }>;
25
+ declare class RegistryService extends RegistryService_base {}
26
+ declare const PluginLoaderService_base: Effect.Service.Class<PluginLoaderService, "PluginLoaderService", {
27
+ readonly effect: Effect.Effect<{
28
+ loadPlugin: (pluginId: string) => Effect.Effect<{
29
+ ctor: new () => AnyPlugin;
30
+ metadata: PluginMetadata;
31
+ }, PluginRuntimeError, never>;
32
+ instantiatePlugin: <T extends AnyPlugin>(pluginId: string, loadedPlugin: LoadedPlugin<T>) => Effect.Effect<{
33
+ plugin: T;
34
+ metadata: PluginMetadata;
35
+ }, PluginRuntimeError, never>;
36
+ initializePlugin: <T extends AnyPlugin>(pluginInstance: PluginInstance<T>, config: {
37
+ variables: InferSchemaInput<T["configSchema"]["variables"]>;
38
+ secrets: InferSchemaInput<T["configSchema"]["secrets"]>;
39
+ }) => Effect.Effect<{
40
+ plugin: T;
41
+ metadata: PluginMetadata;
42
+ config: {
43
+ variables: InferSchemaOutput<T["configSchema"]["variables"]>;
44
+ secrets: InferSchemaOutput<T["configSchema"]["secrets"]>;
45
+ };
46
+ context: any;
47
+ scope: Scope.CloseableScope;
48
+ }, PluginRuntimeError, never>;
49
+ }, never, ModuleFederationService | SecretsService | RegistryService>;
50
+ }>;
51
+ declare class PluginLoaderService extends PluginLoaderService_base {}
52
+ //#endregion
53
+ export { PluginLoaderService };
54
+ //# sourceMappingURL=plugin-loader.service.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin-loader.service.d.cts","names":[],"sources":["../../../src/runtime/services/plugin-loader.service.ts"],"sourcesContent":[],"mappings":";;;;;;;;cAemD;cAEtC,iBAAA,SAA0B,sBAAA;cAGhC;cAEM,YAAA,SAAqB,iBAAA;cAG3B;EARM,SAAA,MAAA,eAAkB,CAAA;IAGxB,GAAA,EAAA,CAAA,QAAA,EAAA,MAAA,EAAA,GAakB,MAAA,CAAA,MAblB,CAAA;;gBAmCK;;;gBAUD;IA3CE,CAAA,oBAAa,EAAQ,KAAA,CAAA;IAG3B,SAAA,EAAA,CAAA,QAAA,EAAA,MAAA,EAAA,GA4CwB,MAAA,CAAA,MA5CxB,CA4CwB,oBA5CxB,GAAA,IAAA,EAAA,KAAA,EAAA,KAAA,CAAA;;;AA8BK,cA5BC,eAAA,SAAwB,oBAAA,CA4BzB;cAkBN;EAxCmB,SAAA,MAAA,eAAA,CAAA;IAoCM,UAAA,EAAA,CAAA,QAAA,EAAA,MAAA,EAAA,GAkBC,MAAA,CAAA,MAlBD,CAAA;MAAA,IAAA,EAAA,OAAA,YAAA;;;kCAiEE,2CAEf,aAAa,OAAE,MAAA,CAAA;;;IA7GpB,CAAA,oBAAgB,EAAA,KAAQ,CAAA;IA8C/B,gBAAA,EAAA,CAAA,UAsF0B,SAtF1B,CAAA,CAAA,cAAA,EAuFc,cAvFd,CAuF6B,CAvF7B,CAAA,EAAA,MAAA,EAAA;iBAwFmB,iBAAiB;eAA0C,iBAAiB;UAA+B,MAAA,CAAA;;MA1EpG,QAAA,gBAAA;MA+CC,MAAA,EAAA;QAEF,SAAA,mBAAA,EAAA,CAAA,cAAA,CAAA,CAAA,WAAA,CAAA,CAAA;QAAb,OAAA,mBAAA,EAAA,CAAA,cAAA,CAAA,CAAA,SAAA,CAAA,CAAA;;;;IAAe,CAAA,oBAAA,EAAA,KAAA,CAAA;EAuBD,CAAA,EAAA,KAAA,yBAAA,iBAAA,kBAAA,CAAA;CACG,CAAA;AAAf,cArFP,mBAAA,SAA4B,wBAAA,CAqFrB"}
@@ -0,0 +1,54 @@
1
+ import { AnyPlugin, AnyPluginConstructor, LoadedPlugin, PluginInstance, PluginMetadata, PluginRegistry } from "../../types.mjs";
2
+ import { PluginRuntimeError } from "../errors.mjs";
3
+ import { ModuleFederationService } from "./module-federation.service.mjs";
4
+ import { SecretsService } from "./secrets.service.mjs";
5
+ import { Context, Effect, Scope } from "effect";
6
+ import { InferSchemaInput, InferSchemaOutput } from "@orpc/contract";
7
+
8
+ //#region src/runtime/services/plugin-loader.service.d.ts
9
+ declare const PluginRegistryTag_base: Context.TagClass<PluginRegistryTag, "PluginRegistry", PluginRegistry>;
10
+ declare class PluginRegistryTag extends PluginRegistryTag_base {}
11
+ declare const PluginMapTag_base: Context.TagClass<PluginMapTag, "PluginMap", Record<string, AnyPluginConstructor>>;
12
+ declare class PluginMapTag extends PluginMapTag_base {}
13
+ declare const RegistryService_base: Effect.Service.Class<RegistryService, "RegistryService", {
14
+ readonly effect: Effect.Effect<{
15
+ get: (pluginId: string) => Effect.Effect<{
16
+ constructor: AnyPluginConstructor;
17
+ metadata: PluginMetadata;
18
+ } | {
19
+ constructor: null;
20
+ metadata: PluginMetadata;
21
+ }, PluginRuntimeError, never>;
22
+ getModule: (pluginId: string) => Effect.Effect<AnyPluginConstructor | null, never, never>;
23
+ }, never, PluginRegistryTag | PluginMapTag>;
24
+ }>;
25
+ declare class RegistryService extends RegistryService_base {}
26
+ declare const PluginLoaderService_base: Effect.Service.Class<PluginLoaderService, "PluginLoaderService", {
27
+ readonly effect: Effect.Effect<{
28
+ loadPlugin: (pluginId: string) => Effect.Effect<{
29
+ ctor: new () => AnyPlugin;
30
+ metadata: PluginMetadata;
31
+ }, PluginRuntimeError, never>;
32
+ instantiatePlugin: <T extends AnyPlugin>(pluginId: string, loadedPlugin: LoadedPlugin<T>) => Effect.Effect<{
33
+ plugin: T;
34
+ metadata: PluginMetadata;
35
+ }, PluginRuntimeError, never>;
36
+ initializePlugin: <T extends AnyPlugin>(pluginInstance: PluginInstance<T>, config: {
37
+ variables: InferSchemaInput<T["configSchema"]["variables"]>;
38
+ secrets: InferSchemaInput<T["configSchema"]["secrets"]>;
39
+ }) => Effect.Effect<{
40
+ plugin: T;
41
+ metadata: PluginMetadata;
42
+ config: {
43
+ variables: InferSchemaOutput<T["configSchema"]["variables"]>;
44
+ secrets: InferSchemaOutput<T["configSchema"]["secrets"]>;
45
+ };
46
+ context: any;
47
+ scope: Scope.CloseableScope;
48
+ }, PluginRuntimeError, never>;
49
+ }, never, ModuleFederationService | SecretsService | RegistryService>;
50
+ }>;
51
+ declare class PluginLoaderService extends PluginLoaderService_base {}
52
+ //#endregion
53
+ export { PluginLoaderService };
54
+ //# sourceMappingURL=plugin-loader.service.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin-loader.service.d.mts","names":[],"sources":["../../../src/runtime/services/plugin-loader.service.ts"],"sourcesContent":[],"mappings":";;;;;;;;cAemD;cAEtC,iBAAA,SAA0B,sBAAA;cAGhC;cAEM,YAAA,SAAqB,iBAAA;cAG3B;EARM,SAAA,MAAA,eAAkB,CAAA;IAGxB,GAAA,EAAA,CAAA,QAAA,EAAA,MAAA,EAAA,GAakB,MAAA,CAAA,MAblB,CAAA;;gBAmCK;;;gBAUD;IA3CE,CAAA,oBAAa,EAAQ,KAAA,CAAA;IAG3B,SAAA,EAAA,CAAA,QAAA,EAAA,MAAA,EAAA,GA4CwB,MAAA,CAAA,MA5CxB,CA4CwB,oBA5CxB,GAAA,IAAA,EAAA,KAAA,EAAA,KAAA,CAAA;;;AA8BK,cA5BC,eAAA,SAAwB,oBAAA,CA4BzB;cAkBN;EAxCmB,SAAA,MAAA,eAAA,CAAA;IAoCM,UAAA,EAAA,CAAA,QAAA,EAAA,MAAA,EAAA,GAkBC,MAAA,CAAA,MAlBD,CAAA;MAAA,IAAA,EAAA,OAAA,YAAA;;;kCAiEE,2CAEf,aAAa,OAAE,MAAA,CAAA;;;IA7GpB,CAAA,oBAAgB,EAAA,KAAQ,CAAA;IA8C/B,gBAAA,EAAA,CAAA,UAsF0B,SAtF1B,CAAA,CAAA,cAAA,EAuFc,cAvFd,CAuF6B,CAvF7B,CAAA,EAAA,MAAA,EAAA;iBAwFmB,iBAAiB;eAA0C,iBAAiB;UAA+B,MAAA,CAAA;;MA1EpG,QAAA,gBAAA;MA+CC,MAAA,EAAA;QAEF,SAAA,mBAAA,EAAA,CAAA,cAAA,CAAA,CAAA,WAAA,CAAA,CAAA;QAAb,OAAA,mBAAA,EAAA,CAAA,cAAA,CAAA,CAAA,SAAA,CAAA,CAAA;;;;IAAe,CAAA,oBAAA,EAAA,KAAA,CAAA;EAuBD,CAAA,EAAA,KAAA,yBAAA,iBAAA,kBAAA,CAAA;CACG,CAAA;AAAf,cArFP,mBAAA,SAA4B,wBAAA,CAqFrB"}
@@ -0,0 +1,128 @@
1
+ import { PluginRuntimeError, toPluginRuntimeError } from "../errors.mjs";
2
+ import { ModuleFederationService } from "./module-federation.service.mjs";
3
+ import { validate } from "../validation.mjs";
4
+ import { SecretsService } from "./secrets.service.mjs";
5
+ import { Context, Effect, Scope } from "effect";
6
+
7
+ //#region src/runtime/services/plugin-loader.service.ts
8
+ var PluginRegistryTag = class extends Context.Tag("PluginRegistry")() {};
9
+ var PluginMapTag = class extends Context.Tag("PluginMap")() {};
10
+ var RegistryService = class extends Effect.Service()("RegistryService", { effect: Effect.gen(function* () {
11
+ const registry = yield* PluginRegistryTag;
12
+ const pluginMap = yield* PluginMapTag;
13
+ return {
14
+ get: (pluginId) => Effect.gen(function* () {
15
+ const entry = registry[pluginId];
16
+ if (!entry) return yield* Effect.fail(new PluginRuntimeError({
17
+ pluginId,
18
+ operation: "validate-plugin-id",
19
+ cause: /* @__PURE__ */ new Error(`Plugin ${pluginId} not found in registry`),
20
+ retryable: false
21
+ }));
22
+ if ("module" in entry) return {
23
+ constructor: entry.module,
24
+ metadata: {
25
+ remoteUrl: entry.remote || "",
26
+ version: entry.version,
27
+ description: entry.description
28
+ }
29
+ };
30
+ return {
31
+ constructor: null,
32
+ metadata: {
33
+ remoteUrl: entry.remote,
34
+ version: entry.version,
35
+ description: entry.description
36
+ }
37
+ };
38
+ }),
39
+ getModule: (pluginId) => Effect.succeed(pluginMap[pluginId] || null)
40
+ };
41
+ }) }) {};
42
+ var PluginLoaderService = class extends Effect.Service()("PluginLoaderService", { effect: Effect.gen(function* () {
43
+ const moduleFederationService = yield* ModuleFederationService;
44
+ const secretsService = yield* SecretsService;
45
+ const registryService = yield* RegistryService;
46
+ const resolveUrl = (baseUrl, version) => version && version !== "latest" ? baseUrl.replace("@latest", `@${version}`) : baseUrl;
47
+ return {
48
+ loadPlugin: (pluginId) => Effect.gen(function* () {
49
+ const entry = yield* registryService.get(pluginId);
50
+ if (entry.constructor) {
51
+ yield* Effect.logDebug("Loading plugin from direct module", { pluginId });
52
+ return {
53
+ ctor: entry.constructor,
54
+ metadata: entry.metadata
55
+ };
56
+ }
57
+ const url = entry.metadata.remoteUrl;
58
+ if (!url) return yield* Effect.fail(new PluginRuntimeError({
59
+ pluginId,
60
+ operation: "load-plugin",
61
+ cause: /* @__PURE__ */ new Error(`Plugin ${pluginId} has no module or remote URL configured`),
62
+ retryable: false
63
+ }));
64
+ const resolvedUrl = resolveUrl(url);
65
+ yield* moduleFederationService.registerRemote(pluginId, resolvedUrl).pipe(Effect.mapError((error) => toPluginRuntimeError(error, pluginId, void 0, "register-remote", true)));
66
+ yield* Effect.logDebug("Loading plugin from remote", {
67
+ pluginId,
68
+ url: resolvedUrl
69
+ });
70
+ return {
71
+ ctor: yield* moduleFederationService.loadRemoteConstructor(pluginId, resolvedUrl).pipe(Effect.mapError((error) => toPluginRuntimeError(error, pluginId, void 0, "load-remote", false))),
72
+ metadata: entry.metadata
73
+ };
74
+ }),
75
+ instantiatePlugin: (pluginId, loadedPlugin) => Effect.gen(function* () {
76
+ const instance = yield* Effect.try(() => new loadedPlugin.ctor()).pipe(Effect.mapError((error) => toPluginRuntimeError(error, pluginId, void 0, "instantiate-plugin", false)));
77
+ instance.id = pluginId;
78
+ return {
79
+ plugin: instance,
80
+ metadata: loadedPlugin.metadata
81
+ };
82
+ }),
83
+ initializePlugin: (pluginInstance, config) => Effect.gen(function* () {
84
+ const { plugin } = pluginInstance;
85
+ const validatedVariables = yield* validate(plugin.configSchema.variables, config.variables, plugin.id, "config").pipe(Effect.mapError((validationError) => new PluginRuntimeError({
86
+ pluginId: plugin.id,
87
+ operation: "validate-config",
88
+ cause: validationError.zodError,
89
+ retryable: false
90
+ })));
91
+ const validatedSecrets = yield* validate(plugin.configSchema.secrets, config.secrets, plugin.id, "config").pipe(Effect.mapError((validationError) => new PluginRuntimeError({
92
+ pluginId: plugin.id,
93
+ operation: "validate-secrets",
94
+ cause: validationError.zodError,
95
+ retryable: false
96
+ })));
97
+ const hydratedConfig = yield* secretsService.hydrateSecrets({
98
+ variables: validatedVariables,
99
+ secrets: validatedSecrets
100
+ });
101
+ const _variables = yield* validate(plugin.configSchema.variables, hydratedConfig.variables, plugin.id, "config").pipe(Effect.mapError((validationError) => new PluginRuntimeError({
102
+ pluginId: plugin.id,
103
+ operation: "validate-hydrated-config",
104
+ cause: validationError.zodError,
105
+ retryable: false
106
+ })));
107
+ const scope = yield* Scope.make();
108
+ const context = yield* plugin.initialize({
109
+ variables: _variables,
110
+ secrets: hydratedConfig.secrets
111
+ }).pipe(Effect.provideService(Scope.Scope, scope), Effect.mapError((error) => toPluginRuntimeError(error, plugin.id, void 0, "initialize-plugin", false)));
112
+ return {
113
+ plugin,
114
+ metadata: pluginInstance.metadata,
115
+ config: {
116
+ variables: _variables,
117
+ secrets: hydratedConfig.secrets
118
+ },
119
+ context,
120
+ scope
121
+ };
122
+ })
123
+ };
124
+ }) }) {};
125
+
126
+ //#endregion
127
+ export { PluginLoaderService, PluginMapTag, PluginRegistryTag, RegistryService };
128
+ //# sourceMappingURL=plugin-loader.service.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin-loader.service.mjs","names":[],"sources":["../../../src/runtime/services/plugin-loader.service.ts"],"sourcesContent":["import type { InferSchemaInput, InferSchemaOutput } from \"@orpc/contract\";\nimport { Context, Effect, Scope } from \"effect\";\nimport type { z } from \"zod\";\nimport type {\n\tAnyPlugin,\n\tAnyPluginConstructor,\n\tInitializedPlugin,\n\tLoadedPlugin,\n\tPluginInstance,\n\tPluginMetadata,\n\tPluginRegistry\n} from \"../../types\";\nimport { PluginRuntimeError, toPluginRuntimeError } from \"../errors\";\nimport { validate } from \"../validation\";\nimport { ModuleFederationService } from \"./module-federation.service\";\nimport { SecretsService } from \"./secrets.service\";\n\nexport class PluginRegistryTag extends Context.Tag(\"PluginRegistry\")<\n\tPluginRegistryTag,\n\tPluginRegistry\n>() { }\n\nexport class PluginMapTag extends Context.Tag(\"PluginMap\")<\n\tPluginMapTag,\n\tRecord<string, AnyPluginConstructor>\n>() { }\n\nexport class RegistryService extends Effect.Service<RegistryService>()(\"RegistryService\", {\n\teffect: Effect.gen(function* () {\n\t\tconst registry = yield* PluginRegistryTag;\n\t\tconst pluginMap = yield* PluginMapTag;\n\n\t\treturn {\n\t\t\tget: (pluginId: string) =>\n\t\t\t\tEffect.gen(function* () {\n\t\t\t\t\tconst entry = registry[pluginId];\n\t\t\t\t\t\n\t\t\t\t\tif (!entry) {\n\t\t\t\t\t\treturn yield* Effect.fail(\n\t\t\t\t\t\t\tnew PluginRuntimeError({\n\t\t\t\t\t\t\t\tpluginId,\n\t\t\t\t\t\t\t\toperation: \"validate-plugin-id\",\n\t\t\t\t\t\t\t\tcause: new Error(`Plugin ${pluginId} not found in registry`),\n\t\t\t\t\t\t\t\tretryable: false,\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\n\t\t\t\t\tif (\"module\" in entry) {\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\tconstructor: entry.module,\n\t\t\t\t\t\t\tmetadata: {\n\t\t\t\t\t\t\t\tremoteUrl: entry.remote || \"\",\n\t\t\t\t\t\t\t\tversion: entry.version,\n\t\t\t\t\t\t\t\tdescription: entry.description,\n\t\t\t\t\t\t\t} as PluginMetadata,\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\n\t\t\t\t\treturn {\n\t\t\t\t\t\tconstructor: null,\n\t\t\t\t\t\tmetadata: {\n\t\t\t\t\t\t\tremoteUrl: entry.remote,\n\t\t\t\t\t\t\tversion: entry.version,\n\t\t\t\t\t\t\tdescription: entry.description,\n\t\t\t\t\t\t} as PluginMetadata,\n\t\t\t\t\t};\n\t\t\t\t}),\n\n\t\t\tgetModule: (pluginId: string) =>\n\t\t\t\tEffect.succeed(pluginMap[pluginId] || null),\n\t\t};\n\t}),\n}) { }\n\nexport class PluginLoaderService extends Effect.Service<PluginLoaderService>()(\"PluginLoaderService\", {\n\teffect: Effect.gen(function* () {\n\t\tconst moduleFederationService = yield* ModuleFederationService;\n\t\tconst secretsService = yield* SecretsService;\n\t\tconst registryService = yield* RegistryService;\n\n\t\tconst resolveUrl = (baseUrl: string, version?: string): string =>\n\t\t\tversion && version !== \"latest\"\n\t\t\t\t? baseUrl.replace(\"@latest\", `@${version}`)\n\t\t\t\t: baseUrl;\n\n\t\treturn {\n\t\t\tloadPlugin: (pluginId: string) =>\n\t\t\t\tEffect.gen(function* () {\n\t\t\t\t\tconst entry = yield* registryService.get(pluginId);\n\n\t\t\t\t\tif (entry.constructor) {\n\t\t\t\t\t\tyield* Effect.logDebug(\"Loading plugin from direct module\", { pluginId });\n\t\t\t\t\t\t\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\tctor: entry.constructor,\n\t\t\t\t\t\t\tmetadata: entry.metadata,\n\t\t\t\t\t\t} satisfies LoadedPlugin;\n\t\t\t\t\t}\n\n\t\t\t\t\tconst url = entry.metadata.remoteUrl;\n\t\t\t\t\tif (!url) {\n\t\t\t\t\t\treturn yield* Effect.fail(\n\t\t\t\t\t\t\tnew PluginRuntimeError({\n\t\t\t\t\t\t\t\tpluginId,\n\t\t\t\t\t\t\t\toperation: \"load-plugin\",\n\t\t\t\t\t\t\t\tcause: new Error(`Plugin ${pluginId} has no module or remote URL configured`),\n\t\t\t\t\t\t\t\tretryable: false,\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\n\t\t\t\t\tconst resolvedUrl = resolveUrl(url);\n\n\t\t\t\t\tyield* moduleFederationService.registerRemote(pluginId, resolvedUrl).pipe(\n\t\t\t\t\t\tEffect.mapError((error) =>\n\t\t\t\t\t\t\ttoPluginRuntimeError(error, pluginId, undefined, \"register-remote\", true),\n\t\t\t\t\t\t),\n\t\t\t\t\t);\n\n\t\t\t\t\tyield* Effect.logDebug(\"Loading plugin from remote\", { pluginId, url: resolvedUrl });\n\n\t\t\t\t\tconst ctor = yield* moduleFederationService.loadRemoteConstructor(pluginId, resolvedUrl).pipe(\n\t\t\t\t\t\tEffect.mapError((error) =>\n\t\t\t\t\t\t\ttoPluginRuntimeError(error, pluginId, undefined, \"load-remote\", false),\n\t\t\t\t\t\t),\n\t\t\t\t\t);\n\n\t\t\t\t\treturn {\n\t\t\t\t\t\tctor,\n\t\t\t\t\t\tmetadata: entry.metadata,\n\t\t\t\t\t} satisfies LoadedPlugin;\n\t\t\t\t}),\n\n\t\t\tinstantiatePlugin: <T extends AnyPlugin>(\n\t\t\t\tpluginId: string,\n\t\t\t\tloadedPlugin: LoadedPlugin<T>,\n\t\t\t) =>\n\t\t\t\tEffect.gen(function* () {\n\t\t\t\t\tconst instance = yield* Effect.try(() => new loadedPlugin.ctor()).pipe(\n\t\t\t\t\t\tEffect.mapError((error) =>\n\t\t\t\t\t\t\ttoPluginRuntimeError(\n\t\t\t\t\t\t\t\terror,\n\t\t\t\t\t\t\t\tpluginId,\n\t\t\t\t\t\t\t\tundefined,\n\t\t\t\t\t\t\t\t\"instantiate-plugin\",\n\t\t\t\t\t\t\t\tfalse,\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t),\n\t\t\t\t\t);\n\n\t\t\t\t\t(instance.id as string) = pluginId;\n\n\t\t\t\t\treturn {\n\t\t\t\t\t\tplugin: instance,\n\t\t\t\t\t\tmetadata: loadedPlugin.metadata,\n\t\t\t\t\t} satisfies PluginInstance<T>;\n\t\t\t\t}),\n\n\t\t\tinitializePlugin: <T extends AnyPlugin>(\n\t\t\t\tpluginInstance: PluginInstance<T>,\n\t\t\t\tconfig: { variables: InferSchemaInput<T[\"configSchema\"][\"variables\"]>; secrets: InferSchemaInput<T[\"configSchema\"][\"secrets\"]> },\n\t\t\t) =>\n\t\t\t\tEffect.gen(function* () {\n\t\t\t\t\tconst { plugin } = pluginInstance;\n\n\t\t\t\t\t// Validate and hydrate config\n\t\t\t\t\tconst validatedVariables = yield* validate(\n\t\t\t\t\t\tplugin.configSchema.variables as z.ZodSchema<InferSchemaOutput<T[\"configSchema\"][\"variables\"]>>,\n\t\t\t\t\t\tconfig.variables,\n\t\t\t\t\t\tplugin.id,\n\t\t\t\t\t\t\"config\",\n\t\t\t\t\t).pipe(\n\t\t\t\t\t\tEffect.mapError((validationError) =>\n\t\t\t\t\t\t\tnew PluginRuntimeError({\n\t\t\t\t\t\t\t\tpluginId: plugin.id,\n\t\t\t\t\t\t\t\toperation: \"validate-config\",\n\t\t\t\t\t\t\t\tcause: validationError.zodError,\n\t\t\t\t\t\t\t\tretryable: false,\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t),\n\t\t\t\t\t);\n\n\t\t\t\t\t// Validate secrets\n\t\t\t\t\tconst validatedSecrets = yield* validate(\n\t\t\t\t\t\tplugin.configSchema.secrets as z.ZodSchema<InferSchemaOutput<T[\"configSchema\"][\"secrets\"]>>,\n\t\t\t\t\t\tconfig.secrets,\n\t\t\t\t\t\tplugin.id,\n\t\t\t\t\t\t\"config\",\n\t\t\t\t\t).pipe(\n\t\t\t\t\t\tEffect.mapError((validationError) =>\n\t\t\t\t\t\t\tnew PluginRuntimeError({\n\t\t\t\t\t\t\t\tpluginId: plugin.id,\n\t\t\t\t\t\t\t\toperation: \"validate-secrets\",\n\t\t\t\t\t\t\t\tcause: validationError.zodError,\n\t\t\t\t\t\t\t\tretryable: false,\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t),\n\t\t\t\t\t);\n\n\t\t\t\t\t// Hydrate secrets in variables\n\t\t\t\t\tconst hydratedConfig = yield* secretsService.hydrateSecrets({\n\t\t\t\t\t\tvariables: validatedVariables,\n\t\t\t\t\t\tsecrets: validatedSecrets,\n\t\t\t\t\t});\n\n\t\t\t\t\tconst _variables = yield* validate(\n\t\t\t\t\t\tplugin.configSchema.variables as z.ZodSchema<InferSchemaOutput<T[\"configSchema\"][\"variables\"]>>,\n\t\t\t\t\t\thydratedConfig.variables,\n\t\t\t\t\t\tplugin.id,\n\t\t\t\t\t\t\"config\",\n\t\t\t\t\t).pipe(\n\t\t\t\t\t\tEffect.mapError((validationError) =>\n\t\t\t\t\t\t\tnew PluginRuntimeError({\n\t\t\t\t\t\t\t\tpluginId: plugin.id,\n\t\t\t\t\t\t\t\toperation: \"validate-hydrated-config\",\n\t\t\t\t\t\t\t\tcause: validationError.zodError,\n\t\t\t\t\t\t\t\tretryable: false,\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t),\n\t\t\t\t\t);\n\n\t\t\t\t\t// Create a long-lived scope for this plugin instance\n\t\t\t\t\tconst scope = yield* Scope.make();\n\n\t\t\t\t\t// Initialize plugin within the scope\n\t\t\t\t\tconst context = yield* plugin.initialize({ variables: _variables, secrets: hydratedConfig.secrets }).pipe(\n\t\t\t\t\t\tEffect.provideService(Scope.Scope, scope),\n\t\t\t\t\t\tEffect.mapError((error) =>\n\t\t\t\t\t\t\ttoPluginRuntimeError(error, plugin.id, undefined, \"initialize-plugin\", false),\n\t\t\t\t\t\t)\n\t\t\t\t\t);\n\n\t\t\t\t\treturn {\n\t\t\t\t\t\tplugin,\n\t\t\t\t\t\tmetadata: pluginInstance.metadata,\n\t\t\t\t\t\tconfig: { variables: _variables, secrets: hydratedConfig.secrets },\n\t\t\t\t\t\tcontext,\n\t\t\t\t\t\tscope,\n\t\t\t\t\t} satisfies InitializedPlugin<T>;\n\t\t\t\t}),\n\t\t};\n\t}),\n}) {\n}\n"],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ const require_rolldown_runtime = require('../../_virtual/rolldown_runtime.cjs');
2
+ const require_module_federation_service = require('./module-federation.service.cjs');
3
+ const require_plugin_lifecycle_service = require('./plugin-lifecycle.service.cjs');
4
+ const require_secrets_service = require('./secrets.service.cjs');
5
+ const require_plugin_loader_service = require('./plugin-loader.service.cjs');
6
+ let effect = require("effect");
7
+
8
+ //#region src/runtime/services/plugin.service.ts
9
+ var PluginService = class PluginService extends effect.Effect.Service()("PluginService", { scoped: effect.Effect.gen(function* () {
10
+ const loader = yield* require_plugin_loader_service.PluginLoaderService;
11
+ const lifecycle = yield* require_plugin_lifecycle_service.PluginLifecycleService;
12
+ return {
13
+ loadPlugin: loader.loadPlugin,
14
+ instantiatePlugin: loader.instantiatePlugin,
15
+ initializePlugin: loader.initializePlugin,
16
+ shutdownPlugin: (plugin) => effect.Effect.gen(function* () {
17
+ yield* plugin.plugin.shutdown().pipe(effect.Effect.catchAll(() => effect.Effect.void));
18
+ yield* effect.Scope.close(plugin.scope, effect.Exit.succeed(void 0));
19
+ yield* lifecycle.unregister(plugin);
20
+ }),
21
+ cleanup: lifecycle.cleanup
22
+ };
23
+ }) }) {
24
+ static Live = (registry, secrets, pluginMap = {}) => {
25
+ const contextLayer = effect.Layer.mergeAll(effect.Layer.succeed(require_plugin_loader_service.PluginRegistryTag, registry), effect.Layer.succeed(require_secrets_service.SecretsConfigTag, secrets), effect.Layer.succeed(require_plugin_loader_service.PluginMapTag, pluginMap));
26
+ const servicesLayer = effect.Layer.mergeAll(require_module_federation_service.ModuleFederationService.Default, require_secrets_service.SecretsService.Default, require_plugin_loader_service.RegistryService.Default, require_plugin_lifecycle_service.PluginLifecycleService.Default).pipe(effect.Layer.provide(contextLayer));
27
+ return PluginService.Default.pipe(effect.Layer.provide(require_plugin_loader_service.PluginLoaderService.Default), effect.Layer.provide(servicesLayer));
28
+ };
29
+ };
30
+
31
+ //#endregion
32
+ exports.PluginService = PluginService;
33
+ //# sourceMappingURL=plugin.service.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin.service.cjs","names":["Effect","PluginLoaderService","PluginLifecycleService","Scope","Exit","Layer","PluginRegistryTag","SecretsConfigTag","PluginMapTag","ModuleFederationService","SecretsService","RegistryService"],"sources":["../../../src/runtime/services/plugin.service.ts"],"sourcesContent":["import { Effect, Exit, Layer, Scope } from \"effect\";\nimport type {\n\tAnyPlugin,\n\tAnyPluginConstructor,\n\tInitializedPlugin,\n\tPluginRegistry,\n\tSecretsConfig\n} from \"../../types\";\nimport { ModuleFederationService } from \"./module-federation.service\";\nimport { PluginLifecycleService } from \"./plugin-lifecycle.service\";\nimport { PluginLoaderService, PluginMapTag, PluginRegistryTag, RegistryService } from \"./plugin-loader.service\";\nimport { SecretsConfigTag, SecretsService } from \"./secrets.service\";\n\nexport class PluginService extends Effect.Service<PluginService>()(\"PluginService\", {\n\tscoped: Effect.gen(function* () {\n\t\tconst loader = yield* PluginLoaderService;\n\t\tconst lifecycle = yield* PluginLifecycleService;\n\n\t\treturn {\n\t\t\tloadPlugin: loader.loadPlugin,\n\t\t\tinstantiatePlugin: loader.instantiatePlugin,\n\t\t\tinitializePlugin: loader.initializePlugin,\n\t\t\tshutdownPlugin: (plugin: InitializedPlugin<AnyPlugin>) =>\n\t\t\t\tEffect.gen(function* () {\n\t\t\t\t\t// Shutdown the plugin first (graceful cleanup)\n\t\t\t\t\tyield* plugin.plugin.shutdown().pipe(\n\t\t\t\t\t\tEffect.catchAll(() => Effect.void)\n\t\t\t\t\t);\n\n\t\t\t\t\t// Close the plugin scope to interrupt fibers and release resources\n\t\t\t\t\tyield* Scope.close(plugin.scope, Exit.succeed(undefined));\n\n\t\t\t\t\t// Unregister from lifecycle tracking\n\t\t\t\t\tyield* lifecycle.unregister(plugin);\n\t\t\t\t}),\n\t\t\tcleanup: lifecycle.cleanup,\n\t\t};\n\t}),\n}) {\n\tstatic Live = (registry: PluginRegistry, secrets: SecretsConfig, pluginMap: Record<string, AnyPluginConstructor> = {}) => {\n\t\tconst contextLayer = Layer.mergeAll(\n\t\t\tLayer.succeed(PluginRegistryTag, registry),\n\t\t\tLayer.succeed(SecretsConfigTag, secrets),\n\t\t\tLayer.succeed(PluginMapTag, pluginMap),\n\t\t);\n\n\t\tconst servicesLayer = Layer.mergeAll(\n\t\t\tModuleFederationService.Default,\n\t\t\tSecretsService.Default,\n\t\t\tRegistryService.Default,\n\t\t\tPluginLifecycleService.Default,\n\t\t).pipe(\n\t\t\tLayer.provide(contextLayer)\n\t\t);\n\n\t\treturn PluginService.Default.pipe(\n\t\t\tLayer.provide(PluginLoaderService.Default),\n\t\t\tLayer.provide(servicesLayer)\n\t\t);\n\t}\n}\n"],"mappings":";;;;;;;;AAaA,IAAa,gBAAb,MAAa,sBAAsBA,cAAO,SAAwB,CAAC,iBAAiB,EACnF,QAAQA,cAAO,IAAI,aAAa;CAC/B,MAAM,SAAS,OAAOC;CACtB,MAAM,YAAY,OAAOC;AAEzB,QAAO;EACN,YAAY,OAAO;EACnB,mBAAmB,OAAO;EAC1B,kBAAkB,OAAO;EACzB,iBAAiB,WAChBF,cAAO,IAAI,aAAa;AAEvB,UAAO,OAAO,OAAO,UAAU,CAAC,KAC/BA,cAAO,eAAeA,cAAO,KAAK,CAClC;AAGD,UAAOG,aAAM,MAAM,OAAO,OAAOC,YAAK,QAAQ,OAAU,CAAC;AAGzD,UAAO,UAAU,WAAW,OAAO;IAClC;EACH,SAAS,UAAU;EACnB;EACA,EACF,CAAC,CAAC;CACF,OAAO,QAAQ,UAA0B,SAAwB,YAAkD,EAAE,KAAK;EACzH,MAAM,eAAeC,aAAM,SAC1BA,aAAM,QAAQC,iDAAmB,SAAS,EAC1CD,aAAM,QAAQE,0CAAkB,QAAQ,EACxCF,aAAM,QAAQG,4CAAc,UAAU,CACtC;EAED,MAAM,gBAAgBH,aAAM,SAC3BI,0DAAwB,SACxBC,uCAAe,SACfC,8CAAgB,SAChBT,wDAAuB,QACvB,CAAC,KACDG,aAAM,QAAQ,aAAa,CAC3B;AAED,SAAO,cAAc,QAAQ,KAC5BA,aAAM,QAAQJ,kDAAoB,QAAQ,EAC1CI,aAAM,QAAQ,cAAc,CAC5B"}
@@ -0,0 +1,42 @@
1
+ import { AnyPlugin, AnyPluginConstructor, InitializedPlugin, LoadedPlugin, PluginInstance, PluginMetadata, PluginRegistry, SecretsConfig } from "../../types.cjs";
2
+ import { PluginRuntimeError } from "../errors.cjs";
3
+ import { PluginLifecycleService } from "./plugin-lifecycle.service.cjs";
4
+ import { PluginLoaderService } from "./plugin-loader.service.cjs";
5
+ import "../../index.cjs";
6
+ import { Effect, Layer, Scope } from "effect";
7
+ import * as _orpc_contract0 from "@orpc/contract";
8
+
9
+ //#region src/runtime/services/plugin.service.d.ts
10
+ declare const PluginService_base: Effect.Service.Class<PluginService, "PluginService", {
11
+ readonly scoped: Effect.Effect<{
12
+ loadPlugin: (pluginId: string) => Effect.Effect<{
13
+ ctor: new () => AnyPlugin;
14
+ metadata: PluginMetadata;
15
+ }, PluginRuntimeError, never>;
16
+ instantiatePlugin: <T extends AnyPlugin>(pluginId: string, loadedPlugin: LoadedPlugin<T>) => Effect.Effect<{
17
+ plugin: T;
18
+ metadata: PluginMetadata;
19
+ }, PluginRuntimeError, never>;
20
+ initializePlugin: <T extends AnyPlugin>(pluginInstance: PluginInstance<T>, config: {
21
+ variables: _orpc_contract0.InferSchemaInput<T["configSchema"]["variables"]>;
22
+ secrets: _orpc_contract0.InferSchemaInput<T["configSchema"]["secrets"]>;
23
+ }) => Effect.Effect<{
24
+ plugin: T;
25
+ metadata: PluginMetadata;
26
+ config: {
27
+ variables: _orpc_contract0.InferSchemaOutput<T["configSchema"]["variables"]>;
28
+ secrets: _orpc_contract0.InferSchemaOutput<T["configSchema"]["secrets"]>;
29
+ };
30
+ context: any;
31
+ scope: Scope.CloseableScope;
32
+ }, PluginRuntimeError, never>;
33
+ shutdownPlugin: (plugin: InitializedPlugin<AnyPlugin>) => Effect.Effect<void, never, never>;
34
+ cleanup: () => Effect.Effect<void, never, never>;
35
+ }, never, PluginLoaderService | PluginLifecycleService>;
36
+ }>;
37
+ declare class PluginService extends PluginService_base {
38
+ static Live: (registry: PluginRegistry, secrets: SecretsConfig, pluginMap?: Record<string, AnyPluginConstructor>) => Layer.Layer<PluginService, never, never>;
39
+ }
40
+ //#endregion
41
+ export { PluginService };
42
+ //# sourceMappingURL=plugin.service.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin.service.d.cts","names":[],"sources":["../../../src/runtime/services/plugin.service.ts"],"sourcesContent":[],"mappings":";;;;;;;;;cAUgH;;;;;IAAA,CAAA,sBAAA,KAAA,CAAA;;;;;;;;;;;;;;;;;;6BAYpF,kBAAkB,eAAU,MAAA,CAAA;;;;cAT3C,aAAA,SAAsB,kBAAA;0BA0BT,yBAAyB,2BAA0B,eAAe,0BAA0B,KAAA,CAAA,MAAA"}
@@ -0,0 +1,42 @@
1
+ import { AnyPlugin, AnyPluginConstructor, InitializedPlugin, LoadedPlugin, PluginInstance, PluginMetadata, PluginRegistry, SecretsConfig } from "../../types.mjs";
2
+ import { PluginRuntimeError } from "../errors.mjs";
3
+ import { PluginLifecycleService } from "./plugin-lifecycle.service.mjs";
4
+ import { PluginLoaderService } from "./plugin-loader.service.mjs";
5
+ import "../../index.mjs";
6
+ import { Effect, Layer, Scope } from "effect";
7
+ import * as _orpc_contract0 from "@orpc/contract";
8
+
9
+ //#region src/runtime/services/plugin.service.d.ts
10
+ declare const PluginService_base: Effect.Service.Class<PluginService, "PluginService", {
11
+ readonly scoped: Effect.Effect<{
12
+ loadPlugin: (pluginId: string) => Effect.Effect<{
13
+ ctor: new () => AnyPlugin;
14
+ metadata: PluginMetadata;
15
+ }, PluginRuntimeError, never>;
16
+ instantiatePlugin: <T extends AnyPlugin>(pluginId: string, loadedPlugin: LoadedPlugin<T>) => Effect.Effect<{
17
+ plugin: T;
18
+ metadata: PluginMetadata;
19
+ }, PluginRuntimeError, never>;
20
+ initializePlugin: <T extends AnyPlugin>(pluginInstance: PluginInstance<T>, config: {
21
+ variables: _orpc_contract0.InferSchemaInput<T["configSchema"]["variables"]>;
22
+ secrets: _orpc_contract0.InferSchemaInput<T["configSchema"]["secrets"]>;
23
+ }) => Effect.Effect<{
24
+ plugin: T;
25
+ metadata: PluginMetadata;
26
+ config: {
27
+ variables: _orpc_contract0.InferSchemaOutput<T["configSchema"]["variables"]>;
28
+ secrets: _orpc_contract0.InferSchemaOutput<T["configSchema"]["secrets"]>;
29
+ };
30
+ context: any;
31
+ scope: Scope.CloseableScope;
32
+ }, PluginRuntimeError, never>;
33
+ shutdownPlugin: (plugin: InitializedPlugin<AnyPlugin>) => Effect.Effect<void, never, never>;
34
+ cleanup: () => Effect.Effect<void, never, never>;
35
+ }, never, PluginLoaderService | PluginLifecycleService>;
36
+ }>;
37
+ declare class PluginService extends PluginService_base {
38
+ static Live: (registry: PluginRegistry, secrets: SecretsConfig, pluginMap?: Record<string, AnyPluginConstructor>) => Layer.Layer<PluginService, never, never>;
39
+ }
40
+ //#endregion
41
+ export { PluginService };
42
+ //# sourceMappingURL=plugin.service.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin.service.d.mts","names":[],"sources":["../../../src/runtime/services/plugin.service.ts"],"sourcesContent":[],"mappings":";;;;;;;;;cAUgH;;;;;IAAA,CAAA,sBAAA,KAAA,CAAA;;;;;;;;;;;;;;;;;;6BAYpF,kBAAkB,eAAU,MAAA,CAAA;;;;cAT3C,aAAA,SAAsB,kBAAA;0BA0BT,yBAAyB,2BAA0B,eAAe,0BAA0B,KAAA,CAAA,MAAA"}