every-plugin 0.4.16 → 0.5.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 (37) hide show
  1. package/dist/build/rspack/index.cjs +1 -1
  2. package/dist/build/rspack/index.mjs +1 -1
  3. package/dist/{index-Coz54d1B.d.mts → index-Bu2wtZrA.d.mts} +111 -35
  4. package/dist/index-Bu2wtZrA.d.mts.map +1 -0
  5. package/dist/{index-G63gBZIY.d.cts → index-DtTqwV4f.d.cts} +111 -35
  6. package/dist/index-DtTqwV4f.d.cts.map +1 -0
  7. package/dist/index.cjs +2 -2
  8. package/dist/index.d.cts +1 -1
  9. package/dist/index.d.mts +1 -1
  10. package/dist/index.mjs +2 -2
  11. package/dist/{package-ClznSERE.mjs → package-CaRYwbRi.mjs} +2 -2
  12. package/dist/package-CaRYwbRi.mjs.map +1 -0
  13. package/dist/{package-DqhszuHi.cjs → package-DyTuSutr.cjs} +2 -2
  14. package/dist/package-DyTuSutr.cjs.map +1 -0
  15. package/dist/runtime/index.cjs +2 -2
  16. package/dist/runtime/index.d.cts +1 -1
  17. package/dist/runtime/index.d.mts +1 -1
  18. package/dist/runtime/index.mjs +2 -2
  19. package/dist/{runtime-BNKZYYMG.cjs → runtime-BNcFgWDG.cjs} +91 -74
  20. package/dist/runtime-BNcFgWDG.cjs.map +1 -0
  21. package/dist/{runtime-Da94Fyvr.mjs → runtime-CAWcnrAk.mjs} +92 -21
  22. package/dist/runtime-CAWcnrAk.mjs.map +1 -0
  23. package/dist/testing/index.cjs +34 -54
  24. package/dist/testing/index.cjs.map +1 -1
  25. package/dist/testing/index.d.cts +25 -30
  26. package/dist/testing/index.d.cts.map +1 -1
  27. package/dist/testing/index.d.mts +25 -30
  28. package/dist/testing/index.d.mts.map +1 -1
  29. package/dist/testing/index.mjs +35 -53
  30. package/dist/testing/index.mjs.map +1 -1
  31. package/package.json +1 -1
  32. package/dist/index-Coz54d1B.d.mts.map +0 -1
  33. package/dist/index-G63gBZIY.d.cts.map +0 -1
  34. package/dist/package-ClznSERE.mjs.map +0 -1
  35. package/dist/package-DqhszuHi.cjs.map +0 -1
  36. package/dist/runtime-BNKZYYMG.cjs.map +0 -1
  37. package/dist/runtime-Da94Fyvr.mjs.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime-CAWcnrAk.mjs","names":["pkg","entryUrl: string","hydrated: Record<string, unknown>","hydrated","runtime: ManagedRuntime.ManagedRuntime<PluginService, never>","registry: PluginRegistry","pluginMap: Record<string, AnyPluginConstructor>","normalized: Record<string, PluginRegistryEntry>"],"sources":["../src/runtime/errors.ts","../src/runtime/services/module-federation.service.ts","../src/runtime/services/plugin-lifecycle.service.ts","../src/runtime/validation.ts","../src/runtime/services/secrets.service.ts","../src/runtime/services/plugin-loader.service.ts","../src/runtime/services/plugin.service.ts","../src/runtime/index.ts"],"sourcesContent":["import { ORPCError } from \"@orpc/contract\";\nimport { Data } from \"effect\";\nimport type { z } from \"zod\";\n\nexport class PluginRuntimeError extends Data.TaggedError(\"PluginRuntimeError\")<{\n\treadonly pluginId?: string;\n\treadonly operation?: string;\n\treadonly procedureName?: string;\n\treadonly cause?: Error;\n\treadonly retryable: boolean;\n}> { }\n\nexport class ModuleFederationError extends Data.TaggedError(\n\t\"ModuleFederationError\",\n)<{\n\treadonly pluginId: string;\n\treadonly remoteUrl: string;\n\treadonly cause?: Error;\n}> { }\n\nexport class ValidationError extends Data.TaggedError(\"ValidationError\")<{\n\treadonly pluginId: string;\n\treadonly stage: \"config\" | \"input\" | \"output\" | \"state\";\n\treadonly zodError: z.ZodError;\n}> { }\n\n// Helper to determine if an oRPC error code is retryable\nexport const isRetryableORPCCode = (code: string): boolean => {\n\tswitch (code) {\n\t\tcase 'TOO_MANY_REQUESTS':\n\t\tcase 'SERVICE_UNAVAILABLE':\n\t\tcase 'BAD_GATEWAY':\n\t\tcase 'GATEWAY_TIMEOUT':\n\t\tcase 'TIMEOUT':\n\t\t\treturn true;\n\t\tdefault:\n\t\t\treturn false;\n\t}\n};\n\n// Convert ORPC errors from plugin procedures to PluginRuntimeError\nexport const wrapORPCError = (\n\torpcError: ORPCError<string, unknown>,\n\tpluginId?: string,\n\tprocedureName?: string,\n\toperation?: string\n): PluginRuntimeError => {\n\treturn new PluginRuntimeError({\n\t\tpluginId,\n\t\toperation,\n\t\tprocedureName,\n\t\tretryable: isRetryableORPCCode(orpcError.code),\n\t\tcause: orpcError as Error\n\t});\n};\n\n// Universal error converter for the runtime\nexport const toPluginRuntimeError = (\n\terror: unknown,\n\tpluginId?: string,\n\tprocedureName?: string,\n\toperation?: string,\n\tdefaultRetryable = false\n): PluginRuntimeError => {\n\tif (error instanceof ORPCError) {\n\t\treturn wrapORPCError(error, pluginId, procedureName, operation);\n\t}\n\n\tif (error instanceof PluginRuntimeError) {\n\t\treturn error; // Already converted\n\t}\n\n\treturn new PluginRuntimeError({\n\t\tpluginId,\n\t\toperation,\n\t\tprocedureName,\n\t\tretryable: defaultRetryable,\n\t\tcause: error instanceof Error ? error : new Error(String(error))\n\t});\n};\n","import { betterFetch } from \"@better-fetch/fetch\";\nimport {\n\tcreateInstance,\n\tgetInstance,\n} from \"@module-federation/enhanced/runtime\";\nimport { setGlobalFederationInstance } from \"@module-federation/runtime-core\";\nimport { Effect } from \"effect\";\nimport type { AnyPlugin } from \"../../types\";\nimport { ModuleFederationError } from \"../errors\";\nimport { getNormalizedRemoteName } from \"./normalize\";\n\ntype RemoteModule = \n | (new () => AnyPlugin)\n | { default: new () => AnyPlugin };\n\nimport pkg from \"../../../package.json\";\n\nconst createModuleFederationInstance = Effect.cached(\n\tEffect.sync(() => {\n\t\ttry {\n\t\t\tlet instance = getInstance();\n\n\t\t\tif (!instance) {\n\t\t\t\tinstance = createInstance({\n\t\t\t\t\tname: \"host\",\n\t\t\t\t\tremotes: [],\n\t\t\t\t\tshared: {\n\t\t\t\t\t\t\"every-plugin\": {\n\t\t\t\t\t\t\tversion: pkg.version,\n\t\t\t\t\t\t\tshareConfig: {\n\t\t\t\t\t\t\t\tsingleton: true,\n\t\t\t\t\t\t\t\trequiredVersion: `^${pkg.version}`,\n\t\t\t\t\t\t\t\teager: true,\n\t\t\t\t\t\t\t\tstrictVersion: false, // Allow bidirectional version compatibility\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\teffect: {\n\t\t\t\t\t\t\tversion: pkg.dependencies.effect,\n\t\t\t\t\t\t\tshareConfig: {\n\t\t\t\t\t\t\t\tsingleton: true,\n\t\t\t\t\t\t\t\trequiredVersion: \"^3.18.0\", // Allow any 3.18.x patch version\n\t\t\t\t\t\t\t\teager: true,\n\t\t\t\t\t\t\t\tstrictVersion: false, // Allow version flexibility for compatibility\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\tzod: {\n\t\t\t\t\t\t\tversion: pkg.dependencies.zod,\n\t\t\t\t\t\t\tshareConfig: {\n\t\t\t\t\t\t\t\tsingleton: true,\n\t\t\t\t\t\t\t\trequiredVersion: \"^4.1.0\", // Allow any 4.1.x patch version\n\t\t\t\t\t\t\t\teager: true,\n\t\t\t\t\t\t\t\tstrictVersion: false, // Allow version flexibility for compatibility\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\t\"@orpc/contract\": {\n\t\t\t\t\t\t\tversion: pkg.dependencies[\"@orpc/contract\"],\n\t\t\t\t\t\t\tshareConfig: {\n\t\t\t\t\t\t\t\tsingleton: true,\n\t\t\t\t\t\t\t\trequiredVersion: \"^1.8.0\", // Allow any 1.8.x patch version\n\t\t\t\t\t\t\t\teager: true,\n\t\t\t\t\t\t\t\tstrictVersion: false, // Allow version flexibility for compatibility\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\t\"@orpc/server\": {\n\t\t\t\t\t\t\tversion: pkg.dependencies[\"@orpc/server\"],\n\t\t\t\t\t\t\tshareConfig: {\n\t\t\t\t\t\t\t\tsingleton: true,\n\t\t\t\t\t\t\t\trequiredVersion: \"^1.8.0\", // Allow any 1.8.x patch version\n\t\t\t\t\t\t\t\teager: true,\n\t\t\t\t\t\t\t\tstrictVersion: false, // Allow version flexibility for compatibility\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t});\n\n\t\t\t\tsetGlobalFederationInstance(instance);\n\t\t\t}\n\n\t\t\treturn instance;\n\t\t} catch (error) {\n\t\t\tthrow new Error(`Failed to initialize Module Federation: ${error}`);\n\t\t}\n\t}),\n);\n\nexport class ModuleFederationService extends Effect.Service<ModuleFederationService>()(\"ModuleFederationService\", {\n\teffect: Effect.gen(function* () {\n\t\tconst mf = yield* Effect.flatten(createModuleFederationInstance);\n\n\t\treturn {\n\t\t\tregisterRemote: (pluginId: string, url: string) =>\n\t\t\t\tEffect.gen(function* () {\n\t\t\t\t\tconsole.log(`[MF] Registering ${pluginId}`);\n\n\t\t\t\t\tconst manifestUrl = url.endsWith('/')\n\t\t\t\t\t\t? `${url}mf-manifest.json`\n\t\t\t\t\t\t: `${url}/mf-manifest.json`;\n\n\t\t\t\t\t// Check if manifest is available (MF 2.0 with manifests)\n\t\t\t\t\tconst { error: manifestError } = yield* Effect.tryPromise({\n\t\t\t\t\t\ttry: () => betterFetch(manifestUrl, { method: \"HEAD\" }),\n\t\t\t\t\t\tcatch: (error) => error, // Don't fail yet, try fallback\n\t\t\t\t\t});\n\n\t\t\t\t\tlet entryUrl: string;\n\t\t\t\t\tlet isManifestMode = false;\n\n\t\t\t\t\tif (!manifestError) {\n\t\t\t\t\t\t// MF 2.0 manifest mode - use manifest URL\n\t\t\t\t\t\tentryUrl = manifestUrl;\n\t\t\t\t\t\tisManifestMode = true;\n\t\t\t\t\t\tconsole.log(`[MF] Using MF 2.0 manifest mode for ${pluginId}`);\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// Fallback to MF 1.5 direct mode - assume URL points to remoteEntry.js\n\t\t\t\t\t\tconsole.log(`[MF] ⚠️ Manifest not found, falling back to MF 1.5 mode for ${pluginId}`);\n\t\t\t\t\t\tentryUrl = url;\n\t\t\t\t\t\tisManifestMode = false;\n\t\t\t\t\t}\n\n\t\t\t\t\t// For MF 2.0, the name can be the pluginId (alias)\n\t\t\t\t\t// The manifest will contain the actual container name\n\t\t\t\t\tconst remoteName = isManifestMode ? pluginId : getNormalizedRemoteName(pluginId);\n\n\t\t\t\t\tyield* Effect.try({\n\t\t\t\t\t\ttry: () => mf.registerRemotes([{\n\t\t\t\t\t\t\tname: remoteName,\n\t\t\t\t\t\t\tentry: entryUrl,\n\t\t\t\t\t\t\t...(isManifestMode && { alias: pluginId }) // Explicit alias for clarity\n\t\t\t\t\t\t}]),\n\t\t\t\t\t\tcatch: (error): ModuleFederationError =>\n\t\t\t\t\t\t\tnew ModuleFederationError({\n\t\t\t\t\t\t\t\tpluginId,\n\t\t\t\t\t\t\t\tremoteUrl: url,\n\t\t\t\t\t\t\t\tcause:\n\t\t\t\t\t\t\t\t\terror instanceof Error ? error : new Error(String(error)),\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t});\n\n\t\t\t\t\tconsole.log(`[MF] ✅ Registered ${pluginId} (${isManifestMode ? 'MF 2.0' : 'MF 1.5'})`);\n\t\t\t\t}),\n\n\t\t\tloadRemoteConstructor: (pluginId: string, url: string) =>\n\t\t\t\tEffect.gen(function* () {\n\t\t\t\t\tconst remoteName = getNormalizedRemoteName(pluginId);\n\t\t\t\t\tconsole.log(`[MF] Loading remote ${remoteName}`);\n\t\t\t\t\tconst modulePath = `${remoteName}/plugin`;\n\n\t\t\t\t\treturn yield* Effect.tryPromise({\n\t\t\t\t\t\ttry: async () => {\n\n\t\t\t\t\t\t\tconst container = await mf.loadRemote<RemoteModule>(modulePath);\n\t\t\t\t\t\t\tif (!container) {\n\t\t\t\t\t\t\t\tthrow new Error(`No container returned for ${modulePath}`);\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t// Support multiple export patterns: direct function, default export, named exports\n\t\t\t\t\t\t\tconst Constructor =\n\t\t\t\t\t\t\t\ttypeof container === \"function\"\n\t\t\t\t\t\t\t\t\t? container // Direct function export\n\t\t\t\t\t\t\t\t\t: container.default\n\t\t\t\t\t\t\t\t\t? container.default // Default export\n\t\t\t\t\t\t\t\t\t: Object.values(container).find( // Named export fallback\n\t\t\t\t\t\t\t\t\t\t\t(exp) => typeof exp === \"function\" && exp.prototype?.constructor === exp\n\t\t\t\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\tif (!Constructor || typeof Constructor !== \"function\") {\n\t\t\t\t\t\t\t\tconst containerInfo = typeof container === \"object\"\n\t\t\t\t\t\t\t\t\t? `Available exports: ${Object.keys(container).join(', ')}`\n\t\t\t\t\t\t\t\t\t: `Container type: ${typeof container}`;\n\n\t\t\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t\t\t`No valid plugin constructor found for '${pluginId}'.\\n` +\n\t\t\t\t\t\t\t\t\t`Supported patterns:\\n` +\n\t\t\t\t\t\t\t\t\t` - export const YourPlugin = createPlugin({...})\\n` +\n\t\t\t\t\t\t\t\t\t` - export default createPlugin({...})\\n` +\n\t\t\t\t\t\t\t\t\t`${containerInfo}`,\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t// Validate it looks like a plugin constructor (has binding property)\n\t\t\t\t\t\t\tif (!(Constructor as any).binding) {\n\t\t\t\t\t\t\t\tconst containerInfo = typeof container === \"object\"\n\t\t\t\t\t\t\t\t\t? `Found exports: ${Object.keys(container).join(', ')}`\n\t\t\t\t\t\t\t\t\t: `Container type: ${typeof container}`;\n\n\t\t\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t\t\t`Invalid plugin constructor for '${pluginId}'. ` +\n\t\t\t\t\t\t\t\t\t`The exported value must be created with createPlugin(). ` +\n\t\t\t\t\t\t\t\t\t`Found a function but it's missing the required 'binding' property.\\n` +\n\t\t\t\t\t\t\t\t\t`${containerInfo}`,\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tconsole.log(`[MF] ✅ Loaded constructor for ${pluginId}`);\n\t\t\t\t\t\t\treturn Constructor;\n\t\t\t\t\t\t},\n\t\t\t\t\t\tcatch: (error): ModuleFederationError =>\n\t\t\t\t\t\t\tnew ModuleFederationError({\n\t\t\t\t\t\t\t\tpluginId,\n\t\t\t\t\t\t\t\tremoteUrl: url,\n\t\t\t\t\t\t\t\tcause:\n\t\t\t\t\t\t\t\t\terror instanceof Error ? error : new Error(String(error)),\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t});\n\t\t\t\t}),\n\t\t};\n\t}),\n}) {}\n","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","import { Effect } from \"effect\";\nimport type { z } from \"zod\";\nimport { ValidationError } from \"./errors\";\n\nexport const validate = <T>(\n\tschema: z.ZodSchema<T>,\n\tdata: unknown,\n\tpluginId: string,\n\tstage: \"config\" | \"input\" | \"output\" | \"state\",\n): Effect.Effect<T, ValidationError> =>\n\tEffect.gen(function* () {\n\t\tconst result = schema.safeParse(data);\n\t\tif (result.success) {\n\t\t\treturn result.data;\n\t\t}\n\t\treturn yield* Effect.fail(\n\t\t\tnew ValidationError({\n\t\t\t\tpluginId,\n\t\t\t\tstage,\n\t\t\t\tzodError: result.error,\n\t\t\t}),\n\t\t);\n\t});\n","import { Context, Effect } from \"effect\";\nimport { z } from \"zod\";\nimport type { SecretsConfig } from \"../../types\";\nimport { PluginRuntimeError } from \"../errors\";\n\nconst configSchema = z.object({\n\tsecrets: z.record(z.string(), z.unknown())\n}).loose();\n\nexport class SecretsConfigTag extends Context.Tag(\"SecretsConfig\")<\n\tSecretsConfigTag,\n\tSecretsConfig\n>() { }\n\nexport class SecretsService extends Effect.Service<SecretsService>()(\"SecretsService\", {\n\teffect: Effect.gen(function* () {\n\t\tconst secrets = yield* SecretsConfigTag;\n\n\t\tconst hydrateValue = (value: unknown): unknown => {\n\t\t\tif (typeof value === 'string') {\n\t\t\t\tlet result = value;\n\t\t\t\tfor (const [key, secretValue] of Object.entries(secrets)) {\n\t\t\t\t\tconst pattern = new RegExp(`{{${key}}}`, \"g\");\n\t\t\t\t\tresult = result.replace(pattern, String(secretValue));\n\t\t\t\t}\n\t\t\t\treturn result;\n\t\t\t}\n\n\t\t\tif (Array.isArray(value)) {\n\t\t\t\treturn value.map(hydrateValue);\n\t\t\t}\n\n\t\t\tif (value && typeof value === 'object') {\n\t\t\t\tconst isPlainObject = value.constructor === Object || value.constructor === undefined;\n\t\t\t\t\n\t\t\t\tif (isPlainObject) {\n\t\t\t\t\tconst hydrated: Record<string, unknown> = {};\n\t\t\t\t\tfor (const [key, val] of Object.entries(value)) {\n\t\t\t\t\t\thydrated[key] = hydrateValue(val);\n\t\t\t\t\t}\n\t\t\t\t\treturn hydrated;\n\t\t\t\t}\n\n\t\t\t\tconst hydrated = Object.create(Object.getPrototypeOf(value));\n\t\t\t\tfor (const [key, val] of Object.entries(value)) {\n\t\t\t\t\thydrated[key] = hydrateValue(val);\n\t\t\t\t}\n\t\t\t\treturn hydrated;\n\t\t\t}\n\n\t\t\treturn value;\n\t\t};\n\n\t\treturn {\n\t\t\thydrateSecrets: <T>(config: T) =>\n\t\t\t\tEffect.gen(function* () {\n\t\t\t\t\tconst parseResult = configSchema.parse(config);\n\t\t\t\t\ttry {\n\t\t\t\t\t\treturn hydrateValue(parseResult) as T;\n\t\t\t\t\t} catch (error) {\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\toperation: \"hydrate-secrets\",\n\t\t\t\t\t\t\t\tcause:\n\t\t\t\t\t\t\t\t\terror instanceof Error ? error : new Error(String(error)),\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\t\t\t\t}),\n\t\t};\n\t}),\n}) { }\n","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 = resolveUrl(entry.metadata.remoteUrl);\n\n\t\t\t\t\tyield* moduleFederationService.registerRemote(pluginId, url).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 });\n\n\t\t\t\t\tconst ctor = yield* moduleFederationService.loadRemoteConstructor(pluginId, url).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","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","import { createRouterClient } from \"@orpc/server\";\nimport { Cause, Effect, Exit, Hash, ManagedRuntime, Option } from \"effect\";\nimport type {\n\tAnyPlugin,\n\tAnyPluginConstructor,\n\tInferRegistryFromEntries,\n\tInitializedPlugin,\n\tLoadedPlugin,\n\tPluginClientType,\n\tPluginConfigInput,\n\tPluginInstance,\n\tPluginRegistry,\n\tPluginRegistryEntry,\n\tPluginRouterType,\n\tPluginRuntimeConfig,\n\tRegisteredPlugin,\n\tRegisteredPlugins,\n\tUsePluginResult\n} from \"../types\";\nimport { PluginRuntimeError } from \"./errors\";\nimport { PluginService } from \"./services/plugin.service\";\n\nexport class PluginRuntime<R = RegisteredPlugins> {\n\treadonly ['__registryType']?: R;\n\t\n\tprivate pluginCache = new Map<string, Effect.Effect<InitializedPlugin<AnyPlugin>, PluginRuntimeError>>();\n\n\tconstructor(\n\t\tprivate runtime: ManagedRuntime.ManagedRuntime<PluginService, never>,\n\t\tprivate registry: PluginRegistry\n\t) { }\n\n\tprivate generateCacheKey(pluginId: string, config: unknown): string {\n\t\tconst configHash = Hash.structure(config as object).toString();\n\t\treturn `${pluginId}:${configHash}`;\n\t}\n\n\tprivate validatePluginId(\n\t\tpluginId: string\n\t): Effect.Effect<string, PluginRuntimeError> {\n\t\tif (!(pluginId in this.registry)) {\n\t\t\treturn Effect.fail(new PluginRuntimeError({\n\t\t\t\tpluginId: String(pluginId),\n\t\t\t\toperation: \"validate-plugin-id\",\n\t\t\t\tcause: new Error(`Plugin ID '${String(pluginId)}' not found in registry.`),\n\t\t\t\tretryable: false,\n\t\t\t}));\n\t\t}\n\t\treturn Effect.succeed(String(pluginId));\n\t}\n\n\tprivate async runPromise<A, E>(\n\t\teffect: Effect.Effect<A, E, PluginService>\n\t): Promise<A> {\n\t\tconst exit = await this.runtime.runPromiseExit(effect);\n\n\t\tif (Exit.isFailure(exit)) {\n\t\t\tconst error = Cause.failureOption(exit.cause);\n\t\t\tif (Option.isSome(error)) {\n\t\t\t\tthrow error.value;\n\t\t\t}\n\t\t\tthrow Cause.squash(exit.cause);\n\t\t}\n\n\t\treturn exit.value;\n\t}\n\n\tasync usePlugin<K extends keyof R & string>(\n\t\tpluginId: K,\n\t\tconfig: PluginConfigInput<R[K]>\n\t): Promise<UsePluginResult<K, R>> {\n\t\tconst cacheKey = this.generateCacheKey(pluginId, config);\n\n\t\tlet cachedPlugin = this.pluginCache.get(cacheKey);\n\t\tif (!cachedPlugin) {\n\t\t\tconst operation = Effect.gen(this, function* () {\n\t\t\t\tconst pluginService = yield* PluginService;\n\t\t\t\tconst validatedId = yield* this.validatePluginId(pluginId);\n\n\t\t\t\t// Load → Instantiate → Initialize\n\t\t\t\tconst ctor = yield* pluginService.loadPlugin(validatedId);\n\t\t\t\tconst instance = yield* pluginService.instantiatePlugin(pluginId, ctor);\n\t\t\t\tconst initialized = yield* pluginService.initializePlugin(instance, config);\n\n\t\t\t\treturn initialized;\n\t\t\t}).pipe(Effect.provide(this.runtime));\n\n\t\t\tcachedPlugin = Effect.cached(operation).pipe(Effect.flatten);\n\t\t\tthis.pluginCache.set(cacheKey, cachedPlugin);\n\t\t}\n\n\t\tconst initialized = await this.runPromise(cachedPlugin);\n\t\tconst router = initialized.plugin.createRouter(initialized.context);\n\t\tconst client = createRouterClient(router);\n\n\t\treturn {\n\t\t\trouter: router as PluginRouterType<R[K]>,\n\t\t\tclient: client as PluginClientType<R[K]>,\n\t\t\tmetadata: initialized.metadata,\n\t\t\tinitialized: initialized as InitializedPlugin<RegisteredPlugin<K, R>>\n\t\t} as UsePluginResult<K, R>;\n\t}\n\n\tasync loadPlugin<K extends keyof R & string>(\n\t\tpluginId: K\n\t): Promise<LoadedPlugin<RegisteredPlugin<K, R>>> {\n\t\tconst effect = Effect.gen(function* () {\n\t\t\tconst pluginService = yield* PluginService;\n\t\t\treturn yield* pluginService.loadPlugin(pluginId);\n\t\t});\n\t\treturn this.runPromise(effect) as Promise<LoadedPlugin<RegisteredPlugin<K, R>>>;\n\t}\n\n\tasync instantiatePlugin<K extends keyof R & string>(\n\t\tpluginId: K,\n\t\tloadedPlugin: LoadedPlugin<RegisteredPlugin<K, R>>\n\t): Promise<PluginInstance<RegisteredPlugin<K, R>>> {\n\t\tconst effect = Effect.gen(function* () {\n\t\t\tconst pluginService = yield* PluginService;\n\t\t\treturn yield* pluginService.instantiatePlugin(pluginId, loadedPlugin);\n\t\t});\n\t\treturn this.runPromise(effect) as Promise<PluginInstance<RegisteredPlugin<K, R>>>;\n\t}\n\n\tasync initializePlugin<T extends AnyPlugin>(\n\t\tinstance: PluginInstance<T>,\n\t\tconfig: any\n\t): Promise<InitializedPlugin<T>> {\n\t\tconst effect = Effect.gen(function* () {\n\t\t\tconst pluginService = yield* PluginService;\n\t\t\treturn yield* pluginService.initializePlugin(instance, config);\n\t\t});\n\t\treturn this.runPromise(effect);\n\t}\n\n\tasync shutdown(): Promise<void> {\n\t\tconst effect = Effect.gen(function* () {\n\t\t\tconst pluginService = yield* PluginService;\n\t\t\tyield* pluginService.cleanup();\n\t\t});\n\t\treturn this.runPromise(effect);\n\t}\n\n\tasync evictPlugin<K extends keyof R & string>(\n\t\tpluginId: K,\n\t\tconfig: PluginConfigInput<R[K]>\n\t): Promise<void> {\n\t\tconst cacheKey = this.generateCacheKey(pluginId, config);\n\n\t\tconst effect = Effect.gen(this, function* () {\n\t\t\tconst pluginService = yield* PluginService;\n\t\t\tconst cachedPlugin = this.pluginCache.get(cacheKey);\n\n\t\t\tif (cachedPlugin) {\n\t\t\t\tthis.pluginCache.delete(cacheKey);\n\n\t\t\t\tconst pluginResult = yield* cachedPlugin.pipe(\n\t\t\t\t\tEffect.catchAll(() => Effect.succeed(null))\n\t\t\t\t);\n\n\t\t\t\tif (pluginResult) {\n\t\t\t\t\tyield* pluginService.shutdownPlugin(pluginResult).pipe(\n\t\t\t\t\t\tEffect.catchAll(() => Effect.void)\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t}).pipe(Effect.catchAll(() => Effect.void));\n\n\t\treturn this.runPromise(effect);\n\t}\n}\n\n/**\n * Normalizes a remote URL to ensure it points to remoteEntry.js\n * If the URL doesn't end with a file extension, appends /remoteEntry.js\n */\nfunction normalizeRemoteUrl(url: string): string {\n\tif (!url) return url;\n\tif (url.endsWith('.js')) return url;\n\treturn `${url.endsWith('/') ? url.slice(0, -1) : url}/remoteEntry.js`;\n}\n\n/**\n * Extract plugin map (module constructors) from registry entries\n */\nfunction extractPluginMap(registry: Record<string, PluginRegistryEntry>): Record<string, AnyPluginConstructor> {\n\tconst pluginMap: Record<string, AnyPluginConstructor> = {};\n\t\n\tfor (const [pluginId, entry] of Object.entries(registry)) {\n\t\tif (\"module\" in entry && entry.module) {\n\t\t\tpluginMap[pluginId] = entry.module;\n\t\t}\n\t}\n\t\n\treturn pluginMap;\n}\n\n/**\n * Normalize registry entries - ensure remote URLs are properly formatted\n */\nfunction normalizeRegistry(registry: Record<string, PluginRegistryEntry>): PluginRegistry {\n\tconst normalized: Record<string, PluginRegistryEntry> = {};\n\t\n\tfor (const [pluginId, entry] of Object.entries(registry)) {\n\t\tif (\"module\" in entry) {\n\t\t\tnormalized[pluginId] = {\n\t\t\t\t...entry,\n\t\t\t\tremote: entry.remote ? normalizeRemoteUrl(entry.remote) : undefined,\n\t\t\t};\n\t\t} else {\n\t\t\tnormalized[pluginId] = {\n\t\t\t\t...entry,\n\t\t\t\tremote: normalizeRemoteUrl(entry.remote),\n\t\t\t};\n\t\t}\n\t}\n\t\n\treturn normalized as PluginRegistry;\n}\n\n/**\n * Creates a plugin runtime with support for both module and remote plugin entries.\n * \n * @example\n * ```typescript\n * // With module entries (types inferred automatically)\n * const runtime = createPluginRuntime({\n * registry: {\n * telegram: { module: TelegramPlugin },\n * gopher: { remote: \"https://cdn.example.com/gopher/remoteEntry.js\" }\n * },\n * secrets: { API_KEY: \"...\" }\n * });\n * \n * // Types are automatically inferred from module entries!\n * const { client } = await runtime.usePlugin(\"telegram\", config);\n * ```\n */\nexport function createPluginRuntime<\n\tTRegistry extends Record<string, PluginRegistryEntry>\n>(\n\tconfig: PluginRuntimeConfig<TRegistry>\n): PluginRuntime<InferRegistryFromEntries<TRegistry>> {\n\tconst secrets = config.secrets || {};\n\tconst normalizedRegistry = normalizeRegistry(config.registry);\n\tconst pluginMap = extractPluginMap(config.registry);\n\n\tconst layer = PluginService.Live(normalizedRegistry, secrets, pluginMap);\n\tconst runtime = ManagedRuntime.make(layer);\n\n\treturn new PluginRuntime(runtime, normalizedRegistry) as PluginRuntime<InferRegistryFromEntries<TRegistry>>;\n}\n"],"mappings":"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"}
@@ -1,78 +1,58 @@
1
- const require_chunk = require('../chunk-zltIcp7o.cjs');
2
- const require_runtime = require('../runtime-BNKZYYMG.cjs');
1
+ const require_runtime = require('../runtime-BNcFgWDG.cjs');
3
2
  require('../normalize-D4Qh0wVk.cjs');
4
- require('../package-DqhszuHi.cjs');
5
- let effect = require("effect");
3
+ require('../package-DyTuSutr.cjs');
6
4
 
7
- //#region src/testing/mocks/module-federation.service.ts
8
- const createMockModuleFederationServiceLayer = (pluginMap) => effect.Layer.succeed(require_runtime.ModuleFederationService, {
9
- registerRemote: (pluginId, url) => effect.Effect.gen(function* () {
10
- console.log(`[MOCK] registerRemote called for ${pluginId}`);
11
- if (!(pluginId in pluginMap)) return yield* effect.Effect.fail(new require_runtime.ModuleFederationError({
12
- pluginId,
13
- remoteUrl: url,
14
- cause: /* @__PURE__ */ new Error(`Mock: Plugin ${pluginId} not available in test plugin map`)
15
- }));
16
- console.log(`[MOCK] registerRemote succeeded for ${pluginId}`);
17
- }),
18
- loadRemoteConstructor: (pluginId, url) => effect.Effect.gen(function* () {
19
- console.log(`[MOCK] loadRemoteConstructor called for ${pluginId}`);
20
- const PluginConstructor = pluginMap[pluginId];
21
- if (!PluginConstructor) return yield* effect.Effect.fail(new require_runtime.ModuleFederationError({
22
- pluginId,
23
- remoteUrl: url,
24
- cause: /* @__PURE__ */ new Error(`Mock: Constructor for ${pluginId} not found in test plugin map`)
25
- }));
26
- console.log(`[MOCK] loadRemoteConstructor succeeded for ${pluginId}`);
27
- return PluginConstructor;
28
- })
29
- });
30
-
31
- //#endregion
32
5
  //#region src/testing/index.ts
33
6
  /**
34
- * Creates a test layer with mock ModuleFederationService for unit testing.
35
- * This mirrors PluginService.Live() but uses mock ModuleFederationService.
7
+ * Converts old pluginMap format to new registry format
36
8
  */
37
- const createTestLayer = (config, pluginMap) => {
38
- const secrets = config.secrets || {};
39
- const contextLayer = effect.Layer.mergeAll(effect.Layer.succeed(require_runtime.PluginRegistryTag, config.registry), effect.Layer.succeed(require_runtime.SecretsConfigTag, secrets));
40
- const mockModuleFederationLayer = createMockModuleFederationServiceLayer(pluginMap);
41
- const servicesLayer = effect.Layer.mergeAll(mockModuleFederationLayer, require_runtime.SecretsService.Default, require_runtime.RegistryService.Default, require_runtime.PluginLifecycleService.Default).pipe(effect.Layer.provide(contextLayer));
42
- return require_runtime.PluginService.Default.pipe(effect.Layer.provide(require_runtime.PluginLoaderService.Default), effect.Layer.provide(servicesLayer));
43
- };
9
+ function convertPluginMapToRegistry(oldRegistry, pluginMap) {
10
+ const registry = {};
11
+ for (const [pluginId, ctor] of Object.entries(pluginMap)) {
12
+ const oldEntry = oldRegistry[pluginId];
13
+ registry[pluginId] = {
14
+ module: ctor,
15
+ remote: oldEntry?.remoteUrl,
16
+ version: oldEntry?.version,
17
+ description: oldEntry?.description
18
+ };
19
+ }
20
+ return registry;
21
+ }
44
22
  /**
45
23
  * Creates a plugin runtime for locally available plugins (non-remote).
46
24
  * Automatically infers type bindings from the plugin map, eliminating
47
25
  * the need for manual RegistryBindings definitions.
48
26
  *
49
- * Ideal for:
50
- * - Unit and integration tests
51
- * - Local development and debugging
52
- * - Monorepo setups where all plugins are in the same workspace
53
- *
54
- * For production with remote Module Federation plugins, use createPluginRuntime().
55
- *
27
+ * @deprecated Use `createPluginRuntime` with module entries directly instead.
56
28
  * @example
57
29
  * ```ts
58
- * const pluginMap = { "my-plugin": MyPlugin } as const;
59
- * const runtime = createLocalPluginRuntime({ registry, secrets }, pluginMap);
60
- *
61
- * // Types are automatically inferred - no manual bindings needed!
62
- * const plugin = await runtime.usePlugin("my-plugin", config);
30
+ * // Old API (deprecated)
31
+ * const runtime = createLocalPluginRuntime(
32
+ * { registry: { "my-plugin": { remoteUrl: "..." } }, secrets },
33
+ * { "my-plugin": MyPlugin }
34
+ * );
35
+ *
36
+ * // New API (recommended)
37
+ * const runtime = createPluginRuntime({
38
+ * registry: { "my-plugin": { module: MyPlugin } },
39
+ * secrets
40
+ * });
63
41
  * ```
64
42
  */
65
43
  function createLocalPluginRuntime(config, pluginMap) {
66
- const layer = createTestLayer(config, pluginMap);
67
- return new require_runtime.PluginRuntime(effect.ManagedRuntime.make(layer), config.registry);
44
+ return require_runtime.createPluginRuntime({
45
+ registry: convertPluginMapToRegistry(config.registry, pluginMap),
46
+ secrets: config.secrets,
47
+ options: config.options
48
+ });
68
49
  }
69
50
  /**
70
- * @deprecated Use `createLocalPluginRuntime` instead. This alias is kept for backward compatibility.
51
+ * @deprecated Use `createLocalPluginRuntime` or `createPluginRuntime` instead.
71
52
  */
72
53
  const createTestPluginRuntime = createLocalPluginRuntime;
73
54
 
74
55
  //#endregion
75
56
  exports.createLocalPluginRuntime = createLocalPluginRuntime;
76
- exports.createTestLayer = createTestLayer;
77
57
  exports.createTestPluginRuntime = createTestPluginRuntime;
78
58
  //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","names":["Layer","ModuleFederationService","Effect","ModuleFederationError","Layer","PluginRegistryTag","SecretsConfigTag","SecretsService","RegistryService","PluginLifecycleService","PluginService","PluginLoaderService","PluginRuntime","ManagedRuntime"],"sources":["../../src/testing/mocks/module-federation.service.ts","../../src/testing/index.ts"],"sourcesContent":["import { Effect, Layer } from \"effect\";\nimport type { LoadedPluginWithBinding } from \"../../plugin\";\nimport { ModuleFederationError } from \"../../runtime/errors\";\nimport { ModuleFederationService } from \"../../runtime/services/module-federation.service\";\n\nexport type PluginMap = Record<string, LoadedPluginWithBinding<any, any, any, any>>;\n\nexport const createMockModuleFederationServiceLayer = (pluginMap: PluginMap) =>\n Layer.succeed(\n ModuleFederationService,\n {\n registerRemote: (pluginId: string, url: string) =>\n Effect.gen(function* () {\n console.log(`[MOCK] registerRemote called for ${pluginId}`);\n if (!(pluginId in pluginMap)) {\n return yield* Effect.fail(\n new ModuleFederationError({\n pluginId,\n remoteUrl: url,\n cause: new Error(`Mock: Plugin ${pluginId} not available in test plugin map`),\n }),\n );\n }\n console.log(`[MOCK] registerRemote succeeded for ${pluginId}`);\n }),\n\n loadRemoteConstructor: (pluginId: string, url: string) =>\n Effect.gen(function* () {\n console.log(`[MOCK] loadRemoteConstructor called for ${pluginId}`);\n const PluginConstructor = pluginMap[pluginId];\n if (!PluginConstructor) {\n return yield* Effect.fail(\n new ModuleFederationError({\n pluginId,\n remoteUrl: url,\n cause: new Error(`Mock: Constructor for ${pluginId} not found in test plugin map`),\n }),\n );\n }\n console.log(`[MOCK] loadRemoteConstructor succeeded for ${pluginId}`);\n return PluginConstructor;\n }),\n } as any\n );\n","import { Layer, ManagedRuntime } from \"effect\";\nimport { PluginRuntime } from \"../runtime\";\nimport {\n\tPluginLifecycleService,\n\tPluginLoaderService,\n\tPluginRegistryTag,\n\tPluginService,\n\tRegistryService,\n\tSecretsConfigTag,\n\tSecretsService\n} from \"../runtime/services\";\nimport type { PluginRuntimeConfig, RegisteredPlugins } from \"../types\";\nimport { createMockModuleFederationServiceLayer, type PluginMap } from \"./mocks/module-federation.service\";\n\n/**\n * Validates that all plugin map keys exist in RegisteredPlugins.\n * This ensures proper type inference for client methods.\n */\ntype ValidatePluginMap<T extends PluginMap> = {\n\t[K in keyof T]: K extends keyof RegisteredPlugins\n\t\t? T[K]\n\t\t: `❌ Plugin key \"${K & string}\" not registered in RegisteredPlugins. Add it to your types.d.ts file.`;\n};\n\n/**\n * Simplified type inference for local plugin maps.\n * Just use the constructor types directly.\n *\n * @example\n * ```ts\n * const pluginMap = { \"my-plugin\": MyPlugin } as const;\n * type MyBindings = InferBindingsFromMap<typeof pluginMap>;\n * ```\n */\nexport type InferBindingsFromMap<T extends PluginMap> = {\n\t[K in keyof T]: T[K]\n} & RegisteredPlugins;\n\n/**\n * Creates a test layer with mock ModuleFederationService for unit testing.\n * This mirrors PluginService.Live() but uses mock ModuleFederationService.\n */\nexport const createTestLayer = <R extends RegisteredPlugins = RegisteredPlugins>(\n\tconfig: PluginRuntimeConfig<R>,\n\tpluginMap: PluginMap\n) => {\n\tconst secrets = config.secrets || {};\n\n\tconst contextLayer = Layer.mergeAll(\n\t\tLayer.succeed(PluginRegistryTag, config.registry),\n\t\tLayer.succeed(SecretsConfigTag, secrets),\n\t);\n\n\tconst mockModuleFederationLayer = createMockModuleFederationServiceLayer(pluginMap);\n\n\tconst servicesLayer = Layer.mergeAll(\n\t\tmockModuleFederationLayer,\n\t\tSecretsService.Default,\n\t\tRegistryService.Default,\n\t\tPluginLifecycleService.Default,\n\t).pipe(\n\t\tLayer.provide(contextLayer)\n\t);\n\n\treturn PluginService.Default.pipe(\n\t\tLayer.provide(PluginLoaderService.Default),\n\t\tLayer.provide(servicesLayer)\n\t);\n};\n\n/**\n * Creates a plugin runtime for locally available plugins (non-remote).\n * Automatically infers type bindings from the plugin map, eliminating\n * the need for manual RegistryBindings definitions.\n *\n * Ideal for:\n * - Unit and integration tests\n * - Local development and debugging\n * - Monorepo setups where all plugins are in the same workspace\n *\n * For production with remote Module Federation plugins, use createPluginRuntime().\n *\n * @example\n * ```ts\n * const pluginMap = { \"my-plugin\": MyPlugin } as const;\n * const runtime = createLocalPluginRuntime({ registry, secrets }, pluginMap);\n *\n * // Types are automatically inferred - no manual bindings needed!\n * const plugin = await runtime.usePlugin(\"my-plugin\", config);\n * ```\n */\nexport function createLocalPluginRuntime<TMap extends PluginMap & ValidatePluginMap<TMap>>(\n\tconfig: PluginRuntimeConfig,\n\tpluginMap: TMap\n): PluginRuntime<InferBindingsFromMap<TMap>> {\n\tconst layer = createTestLayer(config, pluginMap);\n\tconst runtime = ManagedRuntime.make(layer);\n\n\treturn new PluginRuntime<InferBindingsFromMap<TMap>>(runtime, config.registry);\n}\n\n/**\n * @deprecated Use `createLocalPluginRuntime` instead. This alias is kept for backward compatibility.\n */\nexport const createTestPluginRuntime = createLocalPluginRuntime;\n\n// Re-export useful types for tests\nexport type { EveryPlugin, PluginRegistry, RegisteredPlugins } from \"../types\";\nexport type { PluginMap, PluginRuntimeConfig };\n"],"mappings":";;;;;;;AAOA,MAAa,0CAA0C,cACrDA,aAAM,QACJC,yCACA;CACE,iBAAiB,UAAkB,QACjCC,cAAO,IAAI,aAAa;AACtB,UAAQ,IAAI,oCAAoC,WAAW;AAC3D,MAAI,EAAE,YAAY,WAChB,QAAO,OAAOA,cAAO,KACnB,IAAIC,sCAAsB;GACxB;GACA,WAAW;GACX,uBAAO,IAAI,MAAM,gBAAgB,SAAS,mCAAmC;GAC9E,CAAC,CACH;AAEH,UAAQ,IAAI,uCAAuC,WAAW;GAC9D;CAEJ,wBAAwB,UAAkB,QACxCD,cAAO,IAAI,aAAa;AACtB,UAAQ,IAAI,2CAA2C,WAAW;EAClE,MAAM,oBAAoB,UAAU;AACpC,MAAI,CAAC,kBACH,QAAO,OAAOA,cAAO,KACnB,IAAIC,sCAAsB;GACxB;GACA,WAAW;GACX,uBAAO,IAAI,MAAM,yBAAyB,SAAS,+BAA+B;GACnF,CAAC,CACH;AAEH,UAAQ,IAAI,8CAA8C,WAAW;AACrE,SAAO;GACP;CACL,CACF;;;;;;;;ACDH,MAAa,mBACZ,QACA,cACI;CACJ,MAAM,UAAU,OAAO,WAAW,EAAE;CAEpC,MAAM,eAAeC,aAAM,SAC1BA,aAAM,QAAQC,mCAAmB,OAAO,SAAS,EACjDD,aAAM,QAAQE,kCAAkB,QAAQ,CACxC;CAED,MAAM,4BAA4B,uCAAuC,UAAU;CAEnF,MAAM,gBAAgBF,aAAM,SAC3B,2BACAG,+BAAe,SACfC,gCAAgB,SAChBC,uCAAuB,QACvB,CAAC,KACDL,aAAM,QAAQ,aAAa,CAC3B;AAED,QAAOM,8BAAc,QAAQ,KAC5BN,aAAM,QAAQO,oCAAoB,QAAQ,EAC1CP,aAAM,QAAQ,cAAc,CAC5B;;;;;;;;;;;;;;;;;;;;;;;AAwBF,SAAgB,yBACf,QACA,WAC4C;CAC5C,MAAM,QAAQ,gBAAgB,QAAQ,UAAU;AAGhD,QAAO,IAAIQ,8BAFKC,sBAAe,KAAK,MAAM,EAEoB,OAAO,SAAS;;;;;AAM/E,MAAa,0BAA0B"}
1
+ {"version":3,"file":"index.cjs","names":["registry: Record<string, PluginRegistryEntry>","createPluginRuntime"],"sources":["../../src/testing/index.ts"],"sourcesContent":["import type { AnyPluginConstructor, InferRegistryFromEntries, PluginRegistryEntry, PluginRuntimeConfig } from \"../types\";\nimport { createPluginRuntime } from \"../runtime\";\nimport type { LoadedPluginWithBinding } from \"../plugin\";\n\nexport type PluginMap = Record<string, LoadedPluginWithBinding<any, any, any, any>>;\n\n/**\n * Simplified type inference for local plugin maps.\n * Just use the constructor types directly.\n *\n * @example\n * ```ts\n * const pluginMap = { \"my-plugin\": MyPlugin } as const;\n * type MyBindings = InferBindingsFromMap<typeof pluginMap>;\n * ```\n */\nexport type InferBindingsFromMap<T extends PluginMap> = {\n\t[K in keyof T]: T[K]\n};\n\n/**\n * Converts old pluginMap format to new registry format\n */\nfunction convertPluginMapToRegistry<T extends PluginMap>(\n\toldRegistry: Record<string, { remoteUrl: string; version?: string; description?: string }>,\n\tpluginMap: T\n): Record<keyof T, PluginRegistryEntry> {\n\tconst registry: Record<string, PluginRegistryEntry> = {};\n\t\n\tfor (const [pluginId, ctor] of Object.entries(pluginMap)) {\n\t\tconst oldEntry = oldRegistry[pluginId];\n\t\tregistry[pluginId] = {\n\t\t\tmodule: ctor as AnyPluginConstructor,\n\t\t\tremote: oldEntry?.remoteUrl,\n\t\t\tversion: oldEntry?.version,\n\t\t\tdescription: oldEntry?.description,\n\t\t};\n\t}\n\t\n\treturn registry as Record<keyof T, PluginRegistryEntry>;\n}\n\n/**\n * Creates a plugin runtime for locally available plugins (non-remote).\n * Automatically infers type bindings from the plugin map, eliminating\n * the need for manual RegistryBindings definitions.\n *\n * @deprecated Use `createPluginRuntime` with module entries directly instead.\n * @example\n * ```ts\n * // Old API (deprecated)\n * const runtime = createLocalPluginRuntime(\n * { registry: { \"my-plugin\": { remoteUrl: \"...\" } }, secrets },\n * { \"my-plugin\": MyPlugin }\n * );\n * \n * // New API (recommended)\n * const runtime = createPluginRuntime({\n * registry: { \"my-plugin\": { module: MyPlugin } },\n * secrets\n * });\n * ```\n */\nexport function createLocalPluginRuntime<TMap extends PluginMap>(\n\tconfig: {\n\t\tregistry: Record<string, { remoteUrl: string; version?: string; description?: string }>;\n\t\tsecrets?: Record<string, string>;\n\t\toptions?: any;\n\t},\n\tpluginMap: TMap\n) {\n\tconst newRegistry = convertPluginMapToRegistry(config.registry, pluginMap);\n\t\n\treturn createPluginRuntime({\n\t\tregistry: newRegistry,\n\t\tsecrets: config.secrets,\n\t\toptions: config.options,\n\t});\n}\n\n/**\n * @deprecated Use `createLocalPluginRuntime` or `createPluginRuntime` instead.\n */\nexport const createTestPluginRuntime = createLocalPluginRuntime;\n\nexport type { EveryPlugin, PluginRegistry, RegisteredPlugins } from \"../types\";\nexport type { PluginRuntimeConfig };\n"],"mappings":";;;;;;;;AAuBA,SAAS,2BACR,aACA,WACuC;CACvC,MAAMA,WAAgD,EAAE;AAExD,MAAK,MAAM,CAAC,UAAU,SAAS,OAAO,QAAQ,UAAU,EAAE;EACzD,MAAM,WAAW,YAAY;AAC7B,WAAS,YAAY;GACpB,QAAQ;GACR,QAAQ,UAAU;GAClB,SAAS,UAAU;GACnB,aAAa,UAAU;GACvB;;AAGF,QAAO;;;;;;;;;;;;;;;;;;;;;;;AAwBR,SAAgB,yBACf,QAKA,WACC;AAGD,QAAOC,oCAAoB;EAC1B,UAHmB,2BAA2B,OAAO,UAAU,UAAU;EAIzE,SAAS,OAAO;EAChB,SAAS,OAAO;EAChB,CAAC;;;;;AAMH,MAAa,0BAA0B"}
@@ -1,18 +1,10 @@
1
1
  import "../zod-A7Pti5IV.cjs";
2
2
  import "../errors-DKPPPYYT.cjs";
3
- import { a as EveryPlugin, g as PluginRuntimeConfig, m as PluginRegistry, r as PluginService, t as PluginRuntime, x as LoadedPluginWithBinding, y as RegisteredPlugins } from "../index-G63gBZIY.cjs";
3
+ import { S as LoadedPluginWithBinding, _ as PluginRuntimeConfig, a as InferRegistryFromEntries, b as RegisteredPlugins, h as PluginRegistryEntry, i as EveryPlugin, m as PluginRegistry, t as PluginRuntime } from "../index-DtTqwV4f.cjs";
4
4
  import "../normalize-BW7kk8Lk.cjs";
5
- import { Layer } from "effect";
6
5
 
7
- //#region src/testing/mocks/module-federation.service.d.ts
8
- type PluginMap = Record<string, LoadedPluginWithBinding<any, any, any, any>>;
9
- //#endregion
10
6
  //#region src/testing/index.d.ts
11
- /**
12
- * Validates that all plugin map keys exist in RegisteredPlugins.
13
- * This ensures proper type inference for client methods.
14
- */
15
- type ValidatePluginMap<T extends PluginMap> = { [K in keyof T]: K extends keyof RegisteredPlugins ? T[K] : `❌ Plugin key "${K & string}" not registered in RegisteredPlugins. Add it to your types.d.ts file.` };
7
+ type PluginMap = Record<string, LoadedPluginWithBinding<any, any, any, any>>;
16
8
  /**
17
9
  * Simplified type inference for local plugin maps.
18
10
  * Just use the constructor types directly.
@@ -23,38 +15,41 @@ type ValidatePluginMap<T extends PluginMap> = { [K in keyof T]: K extends keyof
23
15
  * type MyBindings = InferBindingsFromMap<typeof pluginMap>;
24
16
  * ```
25
17
  */
26
- type InferBindingsFromMap<T extends PluginMap> = { [K in keyof T]: T[K] } & RegisteredPlugins;
27
- /**
28
- * Creates a test layer with mock ModuleFederationService for unit testing.
29
- * This mirrors PluginService.Live() but uses mock ModuleFederationService.
30
- */
31
- declare const createTestLayer: <R extends RegisteredPlugins = RegisteredPlugins>(config: PluginRuntimeConfig<R>, pluginMap: PluginMap) => Layer.Layer<PluginService, never, never>;
18
+ type InferBindingsFromMap<T extends PluginMap> = { [K in keyof T]: T[K] };
32
19
  /**
33
20
  * Creates a plugin runtime for locally available plugins (non-remote).
34
21
  * Automatically infers type bindings from the plugin map, eliminating
35
22
  * the need for manual RegistryBindings definitions.
36
23
  *
37
- * Ideal for:
38
- * - Unit and integration tests
39
- * - Local development and debugging
40
- * - Monorepo setups where all plugins are in the same workspace
41
- *
42
- * For production with remote Module Federation plugins, use createPluginRuntime().
43
- *
24
+ * @deprecated Use `createPluginRuntime` with module entries directly instead.
44
25
  * @example
45
26
  * ```ts
46
- * const pluginMap = { "my-plugin": MyPlugin } as const;
47
- * const runtime = createLocalPluginRuntime({ registry, secrets }, pluginMap);
27
+ * // Old API (deprecated)
28
+ * const runtime = createLocalPluginRuntime(
29
+ * { registry: { "my-plugin": { remoteUrl: "..." } }, secrets },
30
+ * { "my-plugin": MyPlugin }
31
+ * );
48
32
  *
49
- * // Types are automatically inferred - no manual bindings needed!
50
- * const plugin = await runtime.usePlugin("my-plugin", config);
33
+ * // New API (recommended)
34
+ * const runtime = createPluginRuntime({
35
+ * registry: { "my-plugin": { module: MyPlugin } },
36
+ * secrets
37
+ * });
51
38
  * ```
52
39
  */
53
- declare function createLocalPluginRuntime<TMap extends PluginMap & ValidatePluginMap<TMap>>(config: PluginRuntimeConfig, pluginMap: TMap): PluginRuntime<InferBindingsFromMap<TMap>>;
40
+ declare function createLocalPluginRuntime<TMap extends PluginMap>(config: {
41
+ registry: Record<string, {
42
+ remoteUrl: string;
43
+ version?: string;
44
+ description?: string;
45
+ }>;
46
+ secrets?: Record<string, string>;
47
+ options?: any;
48
+ }, pluginMap: TMap): PluginRuntime<InferRegistryFromEntries<Record<keyof TMap, PluginRegistryEntry>>>;
54
49
  /**
55
- * @deprecated Use `createLocalPluginRuntime` instead. This alias is kept for backward compatibility.
50
+ * @deprecated Use `createLocalPluginRuntime` or `createPluginRuntime` instead.
56
51
  */
57
52
  declare const createTestPluginRuntime: typeof createLocalPluginRuntime;
58
53
  //#endregion
59
- export { type EveryPlugin, InferBindingsFromMap, type PluginMap, type PluginRegistry, type PluginRuntimeConfig, type RegisteredPlugins, createLocalPluginRuntime, createTestLayer, createTestPluginRuntime };
54
+ export { type EveryPlugin, InferBindingsFromMap, PluginMap, type PluginRegistry, type PluginRuntimeConfig, type RegisteredPlugins, createLocalPluginRuntime, createTestPluginRuntime };
60
55
  //# sourceMappingURL=index.d.cts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.cts","names":[],"sources":["../../src/testing/mocks/module-federation.service.ts","../../src/testing/index.ts"],"sourcesContent":[],"mappings":";;;;;;;KAKY,SAAA,GAAY,eAAe;;;;;AAAvC;;KCaK,4BAA4B,2BACpB,IAAI,gBAAgB,oBAC7B,EAAE,sBACe,oFATsF;;;;;;;;;AAsB3G;;AACa,KADD,oBACC,CAAA,UAD8B,SAC9B,CAAA,GAAA,QAAI,MAAJ,CAAI,GAAA,CAAA,CAAE,CAAF,CAAA,EAAE,GACf,iBADe;;;AAOnB;;AAA8D,cAAjD,eAAiD,EAAA,CAAA,UAApB,iBAAoB,GAAA,iBAAA,CAAA,CAAA,MAAA,EACrD,mBADqD,CACjC,CADiC,CAAA,EAAA,SAAA,EAElD,SAFkD,EAAA,GAEzC,KAAA,CAAA,KAFyC,CAEzC,aAFyC,EAAA,KAAA,EAAA,KAAA,CAAA;;;;;;;AAiD9D;;;;;;;;;;AAaA;;;;;iBAbgB,sCAAsC,YAAY,kBAAkB,eAC3E,gCACG,OACT,cAAc,qBAAqB;;;;cAUzB,gCAAuB"}
1
+ {"version":3,"file":"index.d.cts","names":[],"sources":["../../src/testing/index.ts"],"sourcesContent":[],"mappings":";;;;;;KAIY,SAAA,GAAY,eAAe;;;;AAAvC;AAYA;;;;;;AA+CgB,KA/CJ,oBA+C4B,CAAA,UA/CG,SA+CH,CAAA,GAAA,QAAc,MA9CzC,CA8CyC,GA9CrC,CA8CqC,CA9CnC,CA8CmC,CAAA,EAE1C;;;;;;;;;AAkBZ;;;;;;;;;;;;;iBApBgB,sCAAsC;YAE1C;;;;;YACA;;cAGA,OAAI,cAAA,yBAAA,aAAA,MAAA;;;;cAcH,gCAAuB"}
@@ -1,18 +1,10 @@
1
1
  import "../zod-Zw8dlP3j.mjs";
2
2
  import "../errors-9sNpYLv5.mjs";
3
- import { a as EveryPlugin, g as PluginRuntimeConfig, m as PluginRegistry, r as PluginService, t as PluginRuntime, x as LoadedPluginWithBinding, y as RegisteredPlugins } from "../index-Coz54d1B.mjs";
3
+ import { S as LoadedPluginWithBinding, _ as PluginRuntimeConfig, a as InferRegistryFromEntries, b as RegisteredPlugins, h as PluginRegistryEntry, i as EveryPlugin, m as PluginRegistry, t as PluginRuntime } from "../index-Bu2wtZrA.mjs";
4
4
  import "../normalize-eB_j86fm.mjs";
5
- import { Layer } from "effect";
6
5
 
7
- //#region src/testing/mocks/module-federation.service.d.ts
8
- type PluginMap = Record<string, LoadedPluginWithBinding<any, any, any, any>>;
9
- //#endregion
10
6
  //#region src/testing/index.d.ts
11
- /**
12
- * Validates that all plugin map keys exist in RegisteredPlugins.
13
- * This ensures proper type inference for client methods.
14
- */
15
- type ValidatePluginMap<T extends PluginMap> = { [K in keyof T]: K extends keyof RegisteredPlugins ? T[K] : `❌ Plugin key "${K & string}" not registered in RegisteredPlugins. Add it to your types.d.ts file.` };
7
+ type PluginMap = Record<string, LoadedPluginWithBinding<any, any, any, any>>;
16
8
  /**
17
9
  * Simplified type inference for local plugin maps.
18
10
  * Just use the constructor types directly.
@@ -23,38 +15,41 @@ type ValidatePluginMap<T extends PluginMap> = { [K in keyof T]: K extends keyof
23
15
  * type MyBindings = InferBindingsFromMap<typeof pluginMap>;
24
16
  * ```
25
17
  */
26
- type InferBindingsFromMap<T extends PluginMap> = { [K in keyof T]: T[K] } & RegisteredPlugins;
27
- /**
28
- * Creates a test layer with mock ModuleFederationService for unit testing.
29
- * This mirrors PluginService.Live() but uses mock ModuleFederationService.
30
- */
31
- declare const createTestLayer: <R extends RegisteredPlugins = RegisteredPlugins>(config: PluginRuntimeConfig<R>, pluginMap: PluginMap) => Layer.Layer<PluginService, never, never>;
18
+ type InferBindingsFromMap<T extends PluginMap> = { [K in keyof T]: T[K] };
32
19
  /**
33
20
  * Creates a plugin runtime for locally available plugins (non-remote).
34
21
  * Automatically infers type bindings from the plugin map, eliminating
35
22
  * the need for manual RegistryBindings definitions.
36
23
  *
37
- * Ideal for:
38
- * - Unit and integration tests
39
- * - Local development and debugging
40
- * - Monorepo setups where all plugins are in the same workspace
41
- *
42
- * For production with remote Module Federation plugins, use createPluginRuntime().
43
- *
24
+ * @deprecated Use `createPluginRuntime` with module entries directly instead.
44
25
  * @example
45
26
  * ```ts
46
- * const pluginMap = { "my-plugin": MyPlugin } as const;
47
- * const runtime = createLocalPluginRuntime({ registry, secrets }, pluginMap);
27
+ * // Old API (deprecated)
28
+ * const runtime = createLocalPluginRuntime(
29
+ * { registry: { "my-plugin": { remoteUrl: "..." } }, secrets },
30
+ * { "my-plugin": MyPlugin }
31
+ * );
48
32
  *
49
- * // Types are automatically inferred - no manual bindings needed!
50
- * const plugin = await runtime.usePlugin("my-plugin", config);
33
+ * // New API (recommended)
34
+ * const runtime = createPluginRuntime({
35
+ * registry: { "my-plugin": { module: MyPlugin } },
36
+ * secrets
37
+ * });
51
38
  * ```
52
39
  */
53
- declare function createLocalPluginRuntime<TMap extends PluginMap & ValidatePluginMap<TMap>>(config: PluginRuntimeConfig, pluginMap: TMap): PluginRuntime<InferBindingsFromMap<TMap>>;
40
+ declare function createLocalPluginRuntime<TMap extends PluginMap>(config: {
41
+ registry: Record<string, {
42
+ remoteUrl: string;
43
+ version?: string;
44
+ description?: string;
45
+ }>;
46
+ secrets?: Record<string, string>;
47
+ options?: any;
48
+ }, pluginMap: TMap): PluginRuntime<InferRegistryFromEntries<Record<keyof TMap, PluginRegistryEntry>>>;
54
49
  /**
55
- * @deprecated Use `createLocalPluginRuntime` instead. This alias is kept for backward compatibility.
50
+ * @deprecated Use `createLocalPluginRuntime` or `createPluginRuntime` instead.
56
51
  */
57
52
  declare const createTestPluginRuntime: typeof createLocalPluginRuntime;
58
53
  //#endregion
59
- export { type EveryPlugin, InferBindingsFromMap, type PluginMap, type PluginRegistry, type PluginRuntimeConfig, type RegisteredPlugins, createLocalPluginRuntime, createTestLayer, createTestPluginRuntime };
54
+ export { type EveryPlugin, InferBindingsFromMap, PluginMap, type PluginRegistry, type PluginRuntimeConfig, type RegisteredPlugins, createLocalPluginRuntime, createTestPluginRuntime };
60
55
  //# sourceMappingURL=index.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.mts","names":[],"sources":["../../src/testing/mocks/module-federation.service.ts","../../src/testing/index.ts"],"sourcesContent":[],"mappings":";;;;;;;KAKY,SAAA,GAAY,eAAe;;;;;AAAvC;;KCaK,4BAA4B,2BACpB,IAAI,gBAAgB,oBAC7B,EAAE,sBACe,oFATsF;;;;;;;;;AAsB3G;;AACa,KADD,oBACC,CAAA,UAD8B,SAC9B,CAAA,GAAA,QAAI,MAAJ,CAAI,GAAA,CAAA,CAAE,CAAF,CAAA,EAAE,GACf,iBADe;;;AAOnB;;AAA8D,cAAjD,eAAiD,EAAA,CAAA,UAApB,iBAAoB,GAAA,iBAAA,CAAA,CAAA,MAAA,EACrD,mBADqD,CACjC,CADiC,CAAA,EAAA,SAAA,EAElD,SAFkD,EAAA,GAEzC,KAAA,CAAA,KAFyC,CAEzC,aAFyC,EAAA,KAAA,EAAA,KAAA,CAAA;;;;;;;AAiD9D;;;;;;;;;;AAaA;;;;;iBAbgB,sCAAsC,YAAY,kBAAkB,eAC3E,gCACG,OACT,cAAc,qBAAqB;;;;cAUzB,gCAAuB"}
1
+ {"version":3,"file":"index.d.mts","names":[],"sources":["../../src/testing/index.ts"],"sourcesContent":[],"mappings":";;;;;;KAIY,SAAA,GAAY,eAAe;;;;AAAvC;AAYA;;;;;;AA+CgB,KA/CJ,oBA+C4B,CAAA,UA/CG,SA+CH,CAAA,GAAA,QAAc,MA9CzC,CA8CyC,GA9CrC,CA8CqC,CA9CnC,CA8CmC,CAAA,EAE1C;;;;;;;;;AAkBZ;;;;;;;;;;;;;iBApBgB,sCAAsC;YAE1C;;;;;YACA;;cAGA,OAAI,cAAA,yBAAA,aAAA,MAAA;;;;cAcH,gCAAuB"}
@@ -1,75 +1,57 @@
1
- import { a as PluginRegistryTag, c as SecretsService, d as ModuleFederationError, i as PluginLoaderService, l as PluginLifecycleService, o as RegistryService, r as PluginService, s as SecretsConfigTag, t as PluginRuntime, u as ModuleFederationService } from "../runtime-Da94Fyvr.mjs";
1
+ import { n as createPluginRuntime } from "../runtime-CAWcnrAk.mjs";
2
2
  import "../normalize-D7nae0Hn.mjs";
3
- import "../package-ClznSERE.mjs";
4
- import { Effect, Layer, ManagedRuntime } from "effect";
3
+ import "../package-CaRYwbRi.mjs";
5
4
 
6
- //#region src/testing/mocks/module-federation.service.ts
7
- const createMockModuleFederationServiceLayer = (pluginMap) => Layer.succeed(ModuleFederationService, {
8
- registerRemote: (pluginId, url) => Effect.gen(function* () {
9
- console.log(`[MOCK] registerRemote called for ${pluginId}`);
10
- if (!(pluginId in pluginMap)) return yield* Effect.fail(new ModuleFederationError({
11
- pluginId,
12
- remoteUrl: url,
13
- cause: /* @__PURE__ */ new Error(`Mock: Plugin ${pluginId} not available in test plugin map`)
14
- }));
15
- console.log(`[MOCK] registerRemote succeeded for ${pluginId}`);
16
- }),
17
- loadRemoteConstructor: (pluginId, url) => Effect.gen(function* () {
18
- console.log(`[MOCK] loadRemoteConstructor called for ${pluginId}`);
19
- const PluginConstructor = pluginMap[pluginId];
20
- if (!PluginConstructor) return yield* Effect.fail(new ModuleFederationError({
21
- pluginId,
22
- remoteUrl: url,
23
- cause: /* @__PURE__ */ new Error(`Mock: Constructor for ${pluginId} not found in test plugin map`)
24
- }));
25
- console.log(`[MOCK] loadRemoteConstructor succeeded for ${pluginId}`);
26
- return PluginConstructor;
27
- })
28
- });
29
-
30
- //#endregion
31
5
  //#region src/testing/index.ts
32
6
  /**
33
- * Creates a test layer with mock ModuleFederationService for unit testing.
34
- * This mirrors PluginService.Live() but uses mock ModuleFederationService.
7
+ * Converts old pluginMap format to new registry format
35
8
  */
36
- const createTestLayer = (config, pluginMap) => {
37
- const secrets = config.secrets || {};
38
- const contextLayer = Layer.mergeAll(Layer.succeed(PluginRegistryTag, config.registry), Layer.succeed(SecretsConfigTag, secrets));
39
- const mockModuleFederationLayer = createMockModuleFederationServiceLayer(pluginMap);
40
- const servicesLayer = Layer.mergeAll(mockModuleFederationLayer, SecretsService.Default, RegistryService.Default, PluginLifecycleService.Default).pipe(Layer.provide(contextLayer));
41
- return PluginService.Default.pipe(Layer.provide(PluginLoaderService.Default), Layer.provide(servicesLayer));
42
- };
9
+ function convertPluginMapToRegistry(oldRegistry, pluginMap) {
10
+ const registry = {};
11
+ for (const [pluginId, ctor] of Object.entries(pluginMap)) {
12
+ const oldEntry = oldRegistry[pluginId];
13
+ registry[pluginId] = {
14
+ module: ctor,
15
+ remote: oldEntry?.remoteUrl,
16
+ version: oldEntry?.version,
17
+ description: oldEntry?.description
18
+ };
19
+ }
20
+ return registry;
21
+ }
43
22
  /**
44
23
  * Creates a plugin runtime for locally available plugins (non-remote).
45
24
  * Automatically infers type bindings from the plugin map, eliminating
46
25
  * the need for manual RegistryBindings definitions.
47
26
  *
48
- * Ideal for:
49
- * - Unit and integration tests
50
- * - Local development and debugging
51
- * - Monorepo setups where all plugins are in the same workspace
52
- *
53
- * For production with remote Module Federation plugins, use createPluginRuntime().
54
- *
27
+ * @deprecated Use `createPluginRuntime` with module entries directly instead.
55
28
  * @example
56
29
  * ```ts
57
- * const pluginMap = { "my-plugin": MyPlugin } as const;
58
- * const runtime = createLocalPluginRuntime({ registry, secrets }, pluginMap);
59
- *
60
- * // Types are automatically inferred - no manual bindings needed!
61
- * const plugin = await runtime.usePlugin("my-plugin", config);
30
+ * // Old API (deprecated)
31
+ * const runtime = createLocalPluginRuntime(
32
+ * { registry: { "my-plugin": { remoteUrl: "..." } }, secrets },
33
+ * { "my-plugin": MyPlugin }
34
+ * );
35
+ *
36
+ * // New API (recommended)
37
+ * const runtime = createPluginRuntime({
38
+ * registry: { "my-plugin": { module: MyPlugin } },
39
+ * secrets
40
+ * });
62
41
  * ```
63
42
  */
64
43
  function createLocalPluginRuntime(config, pluginMap) {
65
- const layer = createTestLayer(config, pluginMap);
66
- return new PluginRuntime(ManagedRuntime.make(layer), config.registry);
44
+ return createPluginRuntime({
45
+ registry: convertPluginMapToRegistry(config.registry, pluginMap),
46
+ secrets: config.secrets,
47
+ options: config.options
48
+ });
67
49
  }
68
50
  /**
69
- * @deprecated Use `createLocalPluginRuntime` instead. This alias is kept for backward compatibility.
51
+ * @deprecated Use `createLocalPluginRuntime` or `createPluginRuntime` instead.
70
52
  */
71
53
  const createTestPluginRuntime = createLocalPluginRuntime;
72
54
 
73
55
  //#endregion
74
- export { createLocalPluginRuntime, createTestLayer, createTestPluginRuntime };
56
+ export { createLocalPluginRuntime, createTestPluginRuntime };
75
57
  //# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","names":[],"sources":["../../src/testing/mocks/module-federation.service.ts","../../src/testing/index.ts"],"sourcesContent":["import { Effect, Layer } from \"effect\";\nimport type { LoadedPluginWithBinding } from \"../../plugin\";\nimport { ModuleFederationError } from \"../../runtime/errors\";\nimport { ModuleFederationService } from \"../../runtime/services/module-federation.service\";\n\nexport type PluginMap = Record<string, LoadedPluginWithBinding<any, any, any, any>>;\n\nexport const createMockModuleFederationServiceLayer = (pluginMap: PluginMap) =>\n Layer.succeed(\n ModuleFederationService,\n {\n registerRemote: (pluginId: string, url: string) =>\n Effect.gen(function* () {\n console.log(`[MOCK] registerRemote called for ${pluginId}`);\n if (!(pluginId in pluginMap)) {\n return yield* Effect.fail(\n new ModuleFederationError({\n pluginId,\n remoteUrl: url,\n cause: new Error(`Mock: Plugin ${pluginId} not available in test plugin map`),\n }),\n );\n }\n console.log(`[MOCK] registerRemote succeeded for ${pluginId}`);\n }),\n\n loadRemoteConstructor: (pluginId: string, url: string) =>\n Effect.gen(function* () {\n console.log(`[MOCK] loadRemoteConstructor called for ${pluginId}`);\n const PluginConstructor = pluginMap[pluginId];\n if (!PluginConstructor) {\n return yield* Effect.fail(\n new ModuleFederationError({\n pluginId,\n remoteUrl: url,\n cause: new Error(`Mock: Constructor for ${pluginId} not found in test plugin map`),\n }),\n );\n }\n console.log(`[MOCK] loadRemoteConstructor succeeded for ${pluginId}`);\n return PluginConstructor;\n }),\n } as any\n );\n","import { Layer, ManagedRuntime } from \"effect\";\nimport { PluginRuntime } from \"../runtime\";\nimport {\n\tPluginLifecycleService,\n\tPluginLoaderService,\n\tPluginRegistryTag,\n\tPluginService,\n\tRegistryService,\n\tSecretsConfigTag,\n\tSecretsService\n} from \"../runtime/services\";\nimport type { PluginRuntimeConfig, RegisteredPlugins } from \"../types\";\nimport { createMockModuleFederationServiceLayer, type PluginMap } from \"./mocks/module-federation.service\";\n\n/**\n * Validates that all plugin map keys exist in RegisteredPlugins.\n * This ensures proper type inference for client methods.\n */\ntype ValidatePluginMap<T extends PluginMap> = {\n\t[K in keyof T]: K extends keyof RegisteredPlugins\n\t\t? T[K]\n\t\t: `❌ Plugin key \"${K & string}\" not registered in RegisteredPlugins. Add it to your types.d.ts file.`;\n};\n\n/**\n * Simplified type inference for local plugin maps.\n * Just use the constructor types directly.\n *\n * @example\n * ```ts\n * const pluginMap = { \"my-plugin\": MyPlugin } as const;\n * type MyBindings = InferBindingsFromMap<typeof pluginMap>;\n * ```\n */\nexport type InferBindingsFromMap<T extends PluginMap> = {\n\t[K in keyof T]: T[K]\n} & RegisteredPlugins;\n\n/**\n * Creates a test layer with mock ModuleFederationService for unit testing.\n * This mirrors PluginService.Live() but uses mock ModuleFederationService.\n */\nexport const createTestLayer = <R extends RegisteredPlugins = RegisteredPlugins>(\n\tconfig: PluginRuntimeConfig<R>,\n\tpluginMap: PluginMap\n) => {\n\tconst secrets = config.secrets || {};\n\n\tconst contextLayer = Layer.mergeAll(\n\t\tLayer.succeed(PluginRegistryTag, config.registry),\n\t\tLayer.succeed(SecretsConfigTag, secrets),\n\t);\n\n\tconst mockModuleFederationLayer = createMockModuleFederationServiceLayer(pluginMap);\n\n\tconst servicesLayer = Layer.mergeAll(\n\t\tmockModuleFederationLayer,\n\t\tSecretsService.Default,\n\t\tRegistryService.Default,\n\t\tPluginLifecycleService.Default,\n\t).pipe(\n\t\tLayer.provide(contextLayer)\n\t);\n\n\treturn PluginService.Default.pipe(\n\t\tLayer.provide(PluginLoaderService.Default),\n\t\tLayer.provide(servicesLayer)\n\t);\n};\n\n/**\n * Creates a plugin runtime for locally available plugins (non-remote).\n * Automatically infers type bindings from the plugin map, eliminating\n * the need for manual RegistryBindings definitions.\n *\n * Ideal for:\n * - Unit and integration tests\n * - Local development and debugging\n * - Monorepo setups where all plugins are in the same workspace\n *\n * For production with remote Module Federation plugins, use createPluginRuntime().\n *\n * @example\n * ```ts\n * const pluginMap = { \"my-plugin\": MyPlugin } as const;\n * const runtime = createLocalPluginRuntime({ registry, secrets }, pluginMap);\n *\n * // Types are automatically inferred - no manual bindings needed!\n * const plugin = await runtime.usePlugin(\"my-plugin\", config);\n * ```\n */\nexport function createLocalPluginRuntime<TMap extends PluginMap & ValidatePluginMap<TMap>>(\n\tconfig: PluginRuntimeConfig,\n\tpluginMap: TMap\n): PluginRuntime<InferBindingsFromMap<TMap>> {\n\tconst layer = createTestLayer(config, pluginMap);\n\tconst runtime = ManagedRuntime.make(layer);\n\n\treturn new PluginRuntime<InferBindingsFromMap<TMap>>(runtime, config.registry);\n}\n\n/**\n * @deprecated Use `createLocalPluginRuntime` instead. This alias is kept for backward compatibility.\n */\nexport const createTestPluginRuntime = createLocalPluginRuntime;\n\n// Re-export useful types for tests\nexport type { EveryPlugin, PluginRegistry, RegisteredPlugins } from \"../types\";\nexport type { PluginMap, PluginRuntimeConfig };\n"],"mappings":";;;;;;AAOA,MAAa,0CAA0C,cACrD,MAAM,QACJ,yBACA;CACE,iBAAiB,UAAkB,QACjC,OAAO,IAAI,aAAa;AACtB,UAAQ,IAAI,oCAAoC,WAAW;AAC3D,MAAI,EAAE,YAAY,WAChB,QAAO,OAAO,OAAO,KACnB,IAAI,sBAAsB;GACxB;GACA,WAAW;GACX,uBAAO,IAAI,MAAM,gBAAgB,SAAS,mCAAmC;GAC9E,CAAC,CACH;AAEH,UAAQ,IAAI,uCAAuC,WAAW;GAC9D;CAEJ,wBAAwB,UAAkB,QACxC,OAAO,IAAI,aAAa;AACtB,UAAQ,IAAI,2CAA2C,WAAW;EAClE,MAAM,oBAAoB,UAAU;AACpC,MAAI,CAAC,kBACH,QAAO,OAAO,OAAO,KACnB,IAAI,sBAAsB;GACxB;GACA,WAAW;GACX,uBAAO,IAAI,MAAM,yBAAyB,SAAS,+BAA+B;GACnF,CAAC,CACH;AAEH,UAAQ,IAAI,8CAA8C,WAAW;AACrE,SAAO;GACP;CACL,CACF;;;;;;;;ACDH,MAAa,mBACZ,QACA,cACI;CACJ,MAAM,UAAU,OAAO,WAAW,EAAE;CAEpC,MAAM,eAAe,MAAM,SAC1B,MAAM,QAAQ,mBAAmB,OAAO,SAAS,EACjD,MAAM,QAAQ,kBAAkB,QAAQ,CACxC;CAED,MAAM,4BAA4B,uCAAuC,UAAU;CAEnF,MAAM,gBAAgB,MAAM,SAC3B,2BACA,eAAe,SACf,gBAAgB,SAChB,uBAAuB,QACvB,CAAC,KACD,MAAM,QAAQ,aAAa,CAC3B;AAED,QAAO,cAAc,QAAQ,KAC5B,MAAM,QAAQ,oBAAoB,QAAQ,EAC1C,MAAM,QAAQ,cAAc,CAC5B;;;;;;;;;;;;;;;;;;;;;;;AAwBF,SAAgB,yBACf,QACA,WAC4C;CAC5C,MAAM,QAAQ,gBAAgB,QAAQ,UAAU;AAGhD,QAAO,IAAI,cAFK,eAAe,KAAK,MAAM,EAEoB,OAAO,SAAS;;;;;AAM/E,MAAa,0BAA0B"}
1
+ {"version":3,"file":"index.mjs","names":["registry: Record<string, PluginRegistryEntry>"],"sources":["../../src/testing/index.ts"],"sourcesContent":["import type { AnyPluginConstructor, InferRegistryFromEntries, PluginRegistryEntry, PluginRuntimeConfig } from \"../types\";\nimport { createPluginRuntime } from \"../runtime\";\nimport type { LoadedPluginWithBinding } from \"../plugin\";\n\nexport type PluginMap = Record<string, LoadedPluginWithBinding<any, any, any, any>>;\n\n/**\n * Simplified type inference for local plugin maps.\n * Just use the constructor types directly.\n *\n * @example\n * ```ts\n * const pluginMap = { \"my-plugin\": MyPlugin } as const;\n * type MyBindings = InferBindingsFromMap<typeof pluginMap>;\n * ```\n */\nexport type InferBindingsFromMap<T extends PluginMap> = {\n\t[K in keyof T]: T[K]\n};\n\n/**\n * Converts old pluginMap format to new registry format\n */\nfunction convertPluginMapToRegistry<T extends PluginMap>(\n\toldRegistry: Record<string, { remoteUrl: string; version?: string; description?: string }>,\n\tpluginMap: T\n): Record<keyof T, PluginRegistryEntry> {\n\tconst registry: Record<string, PluginRegistryEntry> = {};\n\t\n\tfor (const [pluginId, ctor] of Object.entries(pluginMap)) {\n\t\tconst oldEntry = oldRegistry[pluginId];\n\t\tregistry[pluginId] = {\n\t\t\tmodule: ctor as AnyPluginConstructor,\n\t\t\tremote: oldEntry?.remoteUrl,\n\t\t\tversion: oldEntry?.version,\n\t\t\tdescription: oldEntry?.description,\n\t\t};\n\t}\n\t\n\treturn registry as Record<keyof T, PluginRegistryEntry>;\n}\n\n/**\n * Creates a plugin runtime for locally available plugins (non-remote).\n * Automatically infers type bindings from the plugin map, eliminating\n * the need for manual RegistryBindings definitions.\n *\n * @deprecated Use `createPluginRuntime` with module entries directly instead.\n * @example\n * ```ts\n * // Old API (deprecated)\n * const runtime = createLocalPluginRuntime(\n * { registry: { \"my-plugin\": { remoteUrl: \"...\" } }, secrets },\n * { \"my-plugin\": MyPlugin }\n * );\n * \n * // New API (recommended)\n * const runtime = createPluginRuntime({\n * registry: { \"my-plugin\": { module: MyPlugin } },\n * secrets\n * });\n * ```\n */\nexport function createLocalPluginRuntime<TMap extends PluginMap>(\n\tconfig: {\n\t\tregistry: Record<string, { remoteUrl: string; version?: string; description?: string }>;\n\t\tsecrets?: Record<string, string>;\n\t\toptions?: any;\n\t},\n\tpluginMap: TMap\n) {\n\tconst newRegistry = convertPluginMapToRegistry(config.registry, pluginMap);\n\t\n\treturn createPluginRuntime({\n\t\tregistry: newRegistry,\n\t\tsecrets: config.secrets,\n\t\toptions: config.options,\n\t});\n}\n\n/**\n * @deprecated Use `createLocalPluginRuntime` or `createPluginRuntime` instead.\n */\nexport const createTestPluginRuntime = createLocalPluginRuntime;\n\nexport type { EveryPlugin, PluginRegistry, RegisteredPlugins } from \"../types\";\nexport type { PluginRuntimeConfig };\n"],"mappings":";;;;;;;;AAuBA,SAAS,2BACR,aACA,WACuC;CACvC,MAAMA,WAAgD,EAAE;AAExD,MAAK,MAAM,CAAC,UAAU,SAAS,OAAO,QAAQ,UAAU,EAAE;EACzD,MAAM,WAAW,YAAY;AAC7B,WAAS,YAAY;GACpB,QAAQ;GACR,QAAQ,UAAU;GAClB,SAAS,UAAU;GACnB,aAAa,UAAU;GACvB;;AAGF,QAAO;;;;;;;;;;;;;;;;;;;;;;;AAwBR,SAAgB,yBACf,QAKA,WACC;AAGD,QAAO,oBAAoB;EAC1B,UAHmB,2BAA2B,OAAO,UAAU,UAAU;EAIzE,SAAS,OAAO;EAChB,SAAS,OAAO;EAChB,CAAC;;;;;AAMH,MAAa,0BAA0B"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "every-plugin",
3
- "version": "0.4.16",
3
+ "version": "0.5.0",
4
4
  "type": "module",
5
5
  "main": "./dist/index.cjs",
6
6
  "module": "./dist/index.mjs",