import { UserConfig, ResolvedConfig, InlineConfig } from 'vite';

type BuildStep = ViteBuildStep | CustomBuildStep;
interface ViteBuildStep {
    name: string;
    description?: string;
    config?: UserConfig;
    vite?: true;
}
interface CustomBuildStep {
    vite: false;
    name: string;
    description?: string;
    run(info: VaviteMultiBuildInfo, forwarded: Record<string, any>): void | Promise<void> | Record<string, any> | Promise<Record<string, any>>;
}
interface VaviteMultiBuildInfo {
    buildSteps: BuildStep[];
    currentStepIndex: number;
    currentStep: BuildStep;
}
interface MultibuildOptions {
    onMissingConfigFile?(resolvedConfig: ResolvedConfig): InlineConfig | undefined | Promise<InlineConfig | undefined>;
    onInitialConfigResolved?(resolvedConfig: ResolvedConfig): void | Promise<void>;
    onStartBuildStep?(info: VaviteMultiBuildInfo): void | Promise<void>;
}
declare function multibuild(config?: InlineConfig, options?: MultibuildOptions): Promise<void>;
declare module "vite" {
    interface UserConfig {
        buildSteps?: BuildStep[];
        currentBuildStep?: BuildStep;
    }
    interface Plugin {
        /**
         * Called before a build step starts.
         * @param info      Info about the build step (and build steps in general).
         * @param forwarded Data forwarded from the previous build step.
         */
        buildStepStart?(info: VaviteMultiBuildInfo, forwarded: any): void | Promise<void>;
        /**
         * Called after a build step has finished. The return value will be forwarded
         * to the next build step as a way of sharing information between steps.
         */
        buildStepEnd?(): any | Promise<any>;
    }
}

export { type BuildStep, type CustomBuildStep, type MultibuildOptions, type VaviteMultiBuildInfo, type ViteBuildStep, multibuild };
