UNPKG

every-plugin

Version:
76 lines 4.61 kB
import { Context, Effect, Layer, Scope } from "effect"; import { AnyContractRouter, AnySchema, InferSchemaOutput } from "@orpc/contract"; import { Implementer, Router } from "@orpc/server"; //#region src/plugin.d.ts type ContextOutput<T> = T extends AnySchema ? InferSchemaOutput<T> : Record<string, never>; type PluginConfigFor<V extends AnySchema, S extends AnySchema, TRequestContext extends AnySchema | undefined> = { variables: V; secrets: S; context: TRequestContext; }; type PluginInitializeInput<V extends AnySchema, S extends AnySchema> = { variables: InferSchemaOutput<V>; secrets: InferSchemaOutput<S>; }; /** * Tools provided to plugin initialize/services for building long-lived scoped resources. */ type ServiceOf<T> = T extends Context.Tag<any, infer S> ? S : never; type PluginServicesTools = { buildService: <T>(tag: T, layer: Layer.Layer<any, any, any>) => Effect.Effect<ServiceOf<T>>; }; declare const PluginIdTag_base: Context.TagClass<PluginIdTag, "PluginId", string>; declare class PluginIdTag extends PluginIdTag_base {} type PluginDefinition<V extends AnySchema, S extends AnySchema, TContract extends AnyContractRouter, TRequestContext extends AnySchema | undefined, TDeps extends Record<string, any>, P extends Record<string, unknown>> = { 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<V, S>, plugins: P, tools: PluginServicesTools) => Effect.Effect<TDeps, Error, Scope.Scope>; createRouter: (deps: TDeps, builder: Implementer<TContract, ContextOutput<TRequestContext>, ContextOutput<TRequestContext>>) => Router<TContract, any>; shutdown?: (deps: TDeps) => Effect.Effect<void, Error, never>; }; /** * Loaded plugin with static binding property */ interface LoadedPluginWithBinding<TContract extends AnyContractRouter, TVariables extends AnySchema, TSecrets extends AnySchema, TRequestContext extends AnySchema | undefined, TDeps extends Record<string, any> = Record<never, never>> { new (): Plugin<TContract, TVariables, TSecrets, TRequestContext, TDeps>; binding: { contract: TContract; variables: TVariables; secrets: TSecrets; context: TRequestContext; }; } /** * Plugin interface */ interface Plugin<TContract extends AnyContractRouter, TVariables extends AnySchema, TSecrets extends AnySchema, TRequestContext extends AnySchema | undefined, TDeps extends Record<string, any> = Record<never, never>> { readonly id: string; readonly contract: TContract; readonly configSchema: PluginConfigFor<TVariables, TSecrets, TRequestContext>; initialize(config: PluginInitializeInput<TVariables, TSecrets>, plugins: Record<string, unknown>, tools: PluginServicesTools): Effect.Effect<TDeps, unknown, Scope.Scope>; shutdown(): Effect.Effect<void, never>; /** * 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<TContract, any>; } interface CreatePluginFn { <V extends AnySchema, S extends AnySchema, TContract extends AnyContractRouter, TRequestContext extends AnySchema | undefined = undefined, TDeps extends Record<string, any> = Record<never, never>, P extends Record<string, unknown> = Record<string, never>>(config: PluginDefinition<V, S, TContract, TRequestContext, TDeps, P>): LoadedPluginWithBinding<TContract, V, S, TRequestContext, TDeps>; withPlugins: <P extends Record<string, unknown>>() => CreatePluginWithPlugins<P>; } declare const createPlugin: CreatePluginFn; type CreatePluginWithPlugins<P extends Record<string, unknown>> = <V extends AnySchema, S extends AnySchema, TContract extends AnyContractRouter, TRequestContext extends AnySchema | undefined = undefined, TDeps extends Record<string, any> = Record<never, never>>(config: PluginDefinition<V, S, TContract, TRequestContext, TDeps, P>) => LoadedPluginWithBinding<TContract, V, S, TRequestContext, TDeps>; declare function withPlugins<P extends Record<string, unknown>>(): CreatePluginWithPlugins<P>; //#endregion export { CreatePluginFn, CreatePluginWithPlugins, LoadedPluginWithBinding, Plugin, PluginConfigFor, PluginIdTag, PluginServicesTools, createPlugin, withPlugins }; //# sourceMappingURL=plugin.d.cts.map