import { o as MiddlewareBuilder } from "./types-CnTpHR1F.js";

//#region src/plugins/middleware.d.ts
declare const PLUGIN_CONFIG_RESOLVERS: unique symbol;
type PluginConfigureContext<TCtx = unknown> = {
  ctx: TCtx;
};
type PluginConfigureResolver<TOptions, TCtx = unknown> = (args: PluginConfigureContext<TCtx>) => TOptions | undefined;
type PluginConfigureInput<TOptions, TCtx = unknown> = TOptions | PluginConfigureResolver<TOptions, TCtx>;
type PluginApiScope<TKey extends string, TApi extends object> = {
  api: Record<string, unknown> & Record<TKey, TApi>;
};
type PluginMiddlewareHelpers<TKey extends string, TApi extends object> = {
  middleware: () => MiddlewareBuilder<any, any, PluginApiScope<TKey, TApi>, unknown>;
};
type PluginMiddlewareFactory = (...args: never[]) => MiddlewareBuilder<any, any, any, unknown>;
type PluginNamedMiddlewareFactories = Record<string, PluginMiddlewareFactory>;
type PluginExtensionFactories = PluginNamedMiddlewareFactories & {
  middleware?: PluginMiddlewareFactory;
};
type Plugin<TKey extends string = string, TOptions = undefined, TApi extends object = {}, TCtx = unknown, TMiddlewares extends PluginNamedMiddlewareFactories = {}> = {
  readonly key: TKey;
  readonly configure: <TNextCtx = TCtx>(input: PluginConfigureInput<TOptions, TNextCtx>) => Plugin<TKey, TOptions, TApi, TNextCtx, TMiddlewares>;
  readonly middleware: () => MiddlewareBuilder<any, any, PluginApiScope<TKey, TApi>, unknown>;
  readonly extend: <TNextExtensions extends PluginExtensionFactories>(build: (helpers: PluginMiddlewareHelpers<TKey, TApi>) => TNextExtensions) => Plugin<TKey, TOptions, TApi, TCtx, TMiddlewares & Omit<TNextExtensions, 'middleware'>>;
  readonly [PLUGIN_CONFIG_RESOLVERS]?: readonly PluginConfigureResolver<TOptions, TCtx>[];
} & TMiddlewares;
declare function resolvePluginOptions<TPlugin extends Plugin<any, any, any, any>, TCtx = unknown>(plugin: TPlugin, args: PluginConfigureContext<TCtx>): TPlugin extends Plugin<any, infer TOptions, any, any> ? TOptions | undefined : never;
declare function definePlugin<TKey extends string, TOptions = undefined, TApi extends object = {}>(key: TKey, provide: (args: {
  ctx: unknown;
  options?: TOptions;
}) => TApi): Plugin<TKey, TOptions, TApi, unknown, {}>;
//#endregion
export { PluginConfigureResolver as a, PluginConfigureInput as i, PluginApiScope as n, definePlugin as o, PluginConfigureContext as r, resolvePluginOptions as s, Plugin as t };