import { BuildConfiguration } from 'azion/config';
import { BuildContext } from 'azion/config';
import { BuildOptions } from 'esbuild';
import { Configuration } from 'webpack';
import { Plugin as Plugin_3 } from 'esbuild';
import { WebpackPluginInstance } from 'webpack';

export declare interface BundlerPluginFunctions<C extends BundlerProviderConfig> {
    applyPolyfills: (ctx: BuildContext) => (config: C) => (buildConfiguration: BuildConfiguration) => C;
    applyAzionModule: (ctx: BuildContext) => (config: C) => C;
}

export declare type BundlerProviderConfig = WebpackConfiguration | ESBuildConfiguration;

/**
 * Creates ESBuild bundler instance
 */
export declare const createAzionESBuildConfig: (buildConfig: BuildConfiguration, ctx: BuildContext) => ESBuildBundler;

/**
 * Creates Webpack bundler instance
 */
export declare const createAzionWebpackConfig: (buildConfig: BuildConfiguration, ctx: BuildContext) => WebpackBundler;

declare interface ESBuildBundler {
    baseConfig: ESBuildConfiguration;
    mergeConfig: (config: ESBuildConfiguration) => ESBuildConfiguration;
    applyConfig: (config: ESBuildConfiguration) => ESBuildConfiguration;
    executeBuild: (config: ESBuildBundler) => Promise<void>;
}

export declare type ESBuildConfiguration = {
    plugins?: Plugin_3[];
    define?: Record<string, string>;
} & BuildOptions & {
    banner?: {
        js?: string;
    };
};

export declare interface ESBuildPluginClasses {
    NodePolyfillsPlugin: (isProduction: boolean) => Plugin_3;
    AzionPolyfillsPlugin: (isProduction: boolean) => Plugin_3;
}

/**
 * Executes the esbuild build process
 */
export declare const executeESBuildBuild: (bundler: ESBuildBundler) => Promise<void>;

/**
 * Executes the webpack build process
 */
export declare const executeWebpackBuild: (bundler: WebpackBundler) => Promise<void>;

declare interface Plugin_2 {
    (config: Record<string, unknown>): Record<string, unknown>;
}
export { Plugin_2 as Plugin }

declare interface WebpackBundler {
    baseConfig: WebpackConfiguration;
    mergeConfig: (config: WebpackConfiguration) => WebpackConfiguration;
    applyConfig: (config: WebpackConfiguration) => WebpackConfiguration;
    executeBuild: (config: WebpackBundler) => Promise<void>;
}

export declare interface WebpackConfiguration extends Configuration {
    plugins?: WebpackPluginInstance[];
    banner?: {
        js?: string;
    };
    define?: Record<string, string>;
}

export declare interface WebpackPluginClasses {
    NodePolyfillsPlugin: new (isProduction: boolean) => WebpackPluginInstance;
    AzionPolyfillsPlugin: new (isProduction: boolean) => WebpackPluginInstance;
    BabelCustomLoaderPlugin: new (preset?: string, presetsAllowed?: string[]) => WebpackPluginInstance | undefined;
}

export { }
