import { AnyContractRouter, AnySchema, InferSchemaOutput } from "@orpc/contract"; import { Context, Effect, Layer, Scope } from "effect"; import { Implementer, Router } from "@orpc/server"; //#region src/plugin.d.ts type ContextOutput = T extends AnySchema ? InferSchemaOutput : Record; type PluginConfigFor = { variables: V; secrets: S; context: TRequestContext; }; type PluginInitializeInput = { variables: InferSchemaOutput; secrets: InferSchemaOutput; }; /** * Tools provided to plugin initialize/services for building long-lived scoped resources. */ type ServiceOf = T extends Context.Tag ? S : never; type PluginServicesTools = { buildService: (tag: T, layer: Layer.Layer) => Effect.Effect>; }; declare const PluginIdTag_base: Context.TagClass; declare class PluginIdTag extends PluginIdTag_base {} type PluginDefinition, P extends Record> = { variables: V; secrets: S; contract: TContract; context?: TRequestContext; /** * Initialize the plugin and build dependencies. * A third argument `tools` is provided for building long-lived scoped resources * (e.g. database pools) via `tools.buildService(tag, layer)`. */ initialize?: (config: PluginInitializeInput, plugins: P, tools: PluginServicesTools) => Effect.Effect; createRouter: (deps: TDeps, builder: Implementer, ContextOutput>) => Router; shutdown?: (deps: TDeps) => Effect.Effect; }; /** * Loaded plugin with static binding property */ interface LoadedPluginWithBinding = Record> { new (): Plugin; binding: { contract: TContract; variables: TVariables; secrets: TSecrets; context: TRequestContext; }; } /** * Plugin interface */ interface Plugin = Record> { readonly id: string; readonly contract: TContract; readonly configSchema: PluginConfigFor; initialize(config: PluginInitializeInput, plugins: Record, tools: PluginServicesTools): Effect.Effect; shutdown(): Effect.Effect; /** * Creates the strongly-typed oRPC router for this plugin. * The router's procedure types are inferred directly from the contract. * @param deps The initialized plugin dependencies * @returns A router with procedures matching the plugin's contract */ createRouter(deps: TDeps): Router; } interface CreatePluginFn { = Record, P extends Record = Record>(config: PluginDefinition): LoadedPluginWithBinding; withPlugins:

>() => CreatePluginWithPlugins

; } declare const createPlugin: CreatePluginFn; type CreatePluginWithPlugins

> = = Record>(config: PluginDefinition) => LoadedPluginWithBinding; declare function withPlugins

>(): CreatePluginWithPlugins

; //#endregion export { CreatePluginFn, CreatePluginWithPlugins, LoadedPluginWithBinding, Plugin, PluginConfigFor, PluginIdTag, PluginServicesTools, createPlugin, withPlugins }; //# sourceMappingURL=plugin.d.mts.map