import type { JSONSchema } from '../json-schema/index.js';
import { type BuiltInSimplificationPlugin, type BuiltInSimplificationPluginOverrides } from '../built-in-plugins/index.js';
import { type ExtractionPlugin, type SimplificationPlugin, type SimplificationPluginWithType, type ValidationPlugin, type Plugin } from '../plugin/index.js';
import { type ValidateFunction } from '../validate/index.js';
import type { JSONSchemaType } from '../json-schema-type/index.js';
export type Options = {
    /**
       * If a schema does not have an `$id` or the `$id` is a relative URI, a
       * `baseURI` can be provided in the `Options` object. For example, this could
       * be the schema's retrieval URI.
       *
       * Providing a non relative baseURI (either as part of the `Options` object or
       * `$id`) is important if the schema contains relative `$ref`s.
       *
       * In functions that accept more than one schema as arguments (like
       * {@link schemaDescribesSubset} or {@link schemasAreEquivalent}) `baseURI`
       * can be an array of strings which correspond to each schema.
       *
       */
    baseURI?: string | (string | null | undefined)[] | undefined;
    /**
       * Referenced schema resources (`$ref`) are not retrieved via their url. If a
       * referenced resource is not part of the schema itself, it needs to be
       * provided here.
       *
       * TODO: make this also accept an object with retrieval urls as keys. This
       * would also support referenced to boolean schemas better.
       *
       */
    definitions?: /* Awkward `Exclude` on purpose instead of simply using
     * JSONSchemaObject. This will generate a better documentation,
     * since JSONSchema is well documented */ Exclude<JSONSchema, boolean>[] | undefined;
    /**
     * Support non standard custom keywords by adding {@link Plugin | plugins}.
     * There is one predefined custom plugin: {@link formatPlugin}.
     *
     */
    plugins?: Plugin[] | undefined;
};
export type OptionsPlugin<Options_ extends Options | undefined> = OptionsSimplificationPlugin<Options_> | ExtractionPlugin | ValidationPlugin;
export declare function getOptionsPlugins<const Options_ extends Options | undefined>(options: Options_): OptionsPlugin<Options_>[];
export type ExtractSimplificationPlugin<Plugins> = Plugins extends Plugin[] | undefined ? Extract<FlatArray<Exclude<Plugins, undefined>, 1>, SimplificationPlugin> : SimplificationPlugin;
export type OptionsSimplificationPlugin<Options_> = Options_ extends undefined ? never : Options_ extends {
    plugins?: Plugin[] | undefined;
} | undefined ? ExtractSimplificationPlugin<Exclude<Options_, undefined>['plugins']> : SimplificationPlugin;
export declare function getOptionsSimplificationPlugins<const Options_ extends Options | undefined>(options: Options_): OptionsSimplificationPlugin<Options_>[];
export type OptionsSimplificationPluginOverrides<Options_ extends Options> = Options_ extends {
    builtInPluginOverrides: {
        simplifications: infer SimplificationPluginOverrides extends BuiltInSimplificationPluginOverrides;
    };
} ? SimplificationPluginOverrides : object;
/**
 * An internally used, differently structured version of {@link Options}.
 *
 */
export interface InternalOptions<SimplificationPlugin_ extends SimplificationPlugin = SimplificationPlugin> {
    validate: ValidateFunction;
    plugins: {
        extractions: ExtractionPlugin[];
        simplifications: (BuiltInSimplificationPlugin | SimplificationPlugin_)[];
    };
}
export declare function toInternalOptions<Options_ extends Options | undefined>(options: Options_): InternalOptions<OptionsSimplificationPlugin<Options_>>;
export declare function getBuiltInAndOptionsExtractionPlugins(options: Options | undefined): ExtractionPlugin[];
export type BuiltInOrOptionsSimplificationPlugin<Options_ extends Options | undefined> = BuiltInSimplificationPlugin | OptionsSimplificationPlugin<Options_>;
export declare function getBuiltInAndOptionsSimplificationPlugins<Options_ extends Options | undefined>(options: Options_): BuiltInOrOptionsSimplificationPlugin<Options_>[];
export declare function getSimplificationPluginsForTypeFromInternalOptions<Type extends JSONSchemaType, SimplificationPlugin_ extends SimplificationPlugin>(options: InternalOptions<SimplificationPlugin_>, type: Type): SimplificationPluginWithType<SimplificationPlugin_, Type>[];
