import { Config as Config$1, CommandUtils } from '@dovenv/core';
import * as zod from 'zod';
import { Prettify, getPaths, ValidateInfer } from '@dovenv/core/utils';

declare const TYPE: {
    readonly CONFIG: "config";
    readonly PATH: "path";
    readonly JSDOC: "jsdoc";
    readonly MULTIPLE: "multiple";
    readonly CUSTOM: "custom";
};

declare const consts_TYPE: typeof TYPE;
declare namespace consts {
  export { consts_TYPE as TYPE };
}

declare const schema: zod.ZodRecord<zod.ZodString, zod.ZodObject<{
    title: zod.ZodOptional<zod.ZodString>;
    desc: zod.ZodOptional<zod.ZodString>;
    outro: zod.ZodOptional<zod.ZodString>;
    data: zod.ZodRecord<zod.ZodString, zod.ZodObject<{
        input: zod.ZodString;
        title: zod.ZodOptional<zod.ZodString>;
        type: zod.ZodOptional<zod.ZodString>;
        desc: zod.ZodOptional<zod.ZodString>;
        outro: zod.ZodOptional<zod.ZodString>;
    }, "strip", zod.ZodTypeAny, {
        input: string;
        title?: string | undefined;
        type?: string | undefined;
        desc?: string | undefined;
        outro?: string | undefined;
    }, {
        input: string;
        title?: string | undefined;
        type?: string | undefined;
        desc?: string | undefined;
        outro?: string | undefined;
    }>>;
}, "strip", zod.ZodTypeAny, {
    data: Record<string, {
        input: string;
        title?: string | undefined;
        type?: string | undefined;
        desc?: string | undefined;
        outro?: string | undefined;
    }>;
    title?: string | undefined;
    desc?: string | undefined;
    outro?: string | undefined;
}, {
    data: Record<string, {
        input: string;
        title?: string | undefined;
        type?: string | undefined;
        desc?: string | undefined;
        outro?: string | undefined;
    }>;
    title?: string | undefined;
    desc?: string | undefined;
    outro?: string | undefined;
}>>;

type ExampleProps = {
    [key in string]: {
        /**
         * Title of the example (optional).
         */
        title?: string;
        /**
         * General description of the example (optional).
         */
        desc?: string;
        /**
         * Outro or conclusion of the example (optional).
         */
        outro?: string;
        /**
         * Additional data of the example.
         * Each element must comply with the structure defined in `infoSchema`.
         */
        data: {
            [key in string]: {
                /**
                 * Main input for the data.
                 */
                input: string;
                /**
                 * Title of the data (optional).
                 */
                title?: string;
                /**
                 * Type of the data (optional).
                 */
                type?: string;
                /**
                 * Description of the data (optional).
                 */
                desc?: string;
                /**
                 * Outro or conclusion of the data (optional).
                 */
                outro?: string;
            };
        };
    };
};
type ExampleConfig = ExampleProps extends ValidateInfer<typeof schema> ? ExampleProps : never;
type Shared = {
    /** Write a output if you want */
    output?: string;
    /**
     * h1 for markdown
     * @default 'Examples'
     */
    title?: string | false;
    /**
     * Description
     * @default 'Examples'
     */
    desc?: string;
};
type ExampleConfigFileProps = Prettify<Shared & {
    /** Override your config input */
    config?: ExampleConfig;
    /**
     * Input of your config (path or config object)
     *
     * Path formats: JSON, YAML, TOML JS etc
     */
    input: string | ExampleConfig;
}>;
type ExampleType = typeof TYPE[keyof typeof TYPE];
type ExamplePathProps = Prettify<Shared & {
    /** Input pattern */
    input: string[];
    /** Options for input patterns */
    opts?: Parameters<typeof getPaths>[1];
}>;
type ExampleJsdocProps = ExamplePathProps;
type ExampleMultipleProps = Prettify<Shared & {
    [TYPE.JSDOC]?: Omit<ExampleJsdocProps, 'output'>;
    [TYPE.CONFIG]?: Omit<ExampleConfigFileProps, 'output'>;
    [TYPE.PATH]?: Omit<ExamplePathProps, 'output'>;
}>;
type ExampleCustomProps = {
    fn: (data: {
        /** Dovenv configration */
        config: Config$1;
        /** "Example" functions to run */
        run: {
            [TYPE.JSDOC]: (data: ExampleJsdocProps) => Promise<string>;
            [TYPE.CONFIG]: (data: ExampleConfigFileProps) => Promise<string>;
            [TYPE.PATH]: (data: ExamplePathProps) => Promise<string>;
            [TYPE.MULTIPLE]: (data: ExampleMultipleProps) => Promise<string>;
        };
    }) => Promise<unknown>;
};
type Set<T extends ExampleType, V extends object> = ({
    /** type of configuration */
    type: T;
} & V);
type ConfigValue = Prettify<Set<typeof TYPE.PATH, ExamplePathProps> | Set<typeof TYPE.CONFIG, ExampleConfigFileProps> | Set<typeof TYPE.JSDOC, ExampleJsdocProps> | Set<typeof TYPE.MULTIPLE, ExampleMultipleProps> | Set<typeof TYPE.CUSTOM, ExampleCustomProps>>;
type Config = {
    [key in string]: ConfigValue;
};

declare class Examples {
    #private;
    const: typeof consts;
    protected utils: CommandUtils;
    opts: Config | undefined;
    constructor(data: {
        opts?: Config;
        utils: CommandUtils;
    });
    fromConfig(data: ExampleConfigFileProps): Promise<string>;
    fromPath(data: ExamplePathProps): Promise<string>;
    /**
     * Process jsdoc examples.
     * @param data - Example data.
     * @returns Resolved example content.
     * @see https://github.com/jsdoc2md/jsdoc-api/blob/master/docs/api.md
     */
    fromJsdoc(data: ExampleJsdocProps): Promise<string>;
    /**
     * Process multiple examples.
     * @param data - Example data.
     * @returns Resolved example content.
     */
    fromMultiple(data: ExampleMultipleProps): Promise<string>;
    /**
     * Processes custom example data using provided handlers.
     *
     * This method allows dynamic processing of example data based on the type
     * by binding specific handler functions for each type. The function received
     * in the data parameter is invoked with an object containing these handlers.
     * @param data - Object containing the function to execute with the handlers.
     * @returns A promise that resolves to the result of the executed function.
     */
    fromCustom(data: ExampleCustomProps): Promise<unknown>;
    /**
     * Get a custom Example content template.
     *
     * Perfect method to be used outside an `Dovenv` environment.
     * @param data - Configuration object.
     * @returns A promise that resolves to the processed content as a string.
     */
    get(data: Config[number]): Promise<any>;
    /**
     * Process examples from the configuration object.
     * @param pattern - An array of examples names to process. If not provided, all examples will be processed.
     * @returns A promise that resolves to an object containing the content of each processed example.
     */
    run(pattern?: string[]): Promise<Record<string, string> | undefined>;
}

/**
 * A plugin for `dovenv` providing tools for managing example paths.
 * @param {Config} [conf] - Configuration for the plugin.
 * @returns {DovenvConfig} - The plugin configuration with custom examples.
 */
declare const examplesPlugin: (conf?: Config) => Config$1;

export { type Config, type ExampleConfigFileProps, type ExampleCustomProps, type ExampleJsdocProps, type ExampleMultipleProps, type ExamplePathProps, Examples, examplesPlugin as default, examplesPlugin };
