import { moduleFederationPlugin } from '@module-federation/sdk';
import { Configuration, Compiler } from '@rspack/core';
import { Config } from 'jest';

type BuildMode = "production" | "development";
type BuildTarget = "client" | "server";

type DeepPartial<T> = {
    [P in keyof T]?: T[P] extends (...args: any[]) => any ? T[P] : T[P] extends object ? DeepPartial<T[P]> : T[P];
};
type OutputOptions = {
    dir: string;
};
type ClientOptions = {
    enabled: boolean;
    entry: string;
    template: string;
    publicPath: string;
    assetsDir: string;
    envFilter: (key: string, value?: string) => boolean;
};
type ServerOptions = {
    runtime: "serverless" | "standalone";
    enabled: boolean;
    entry: string;
};
type DevelopmentOptions = {
    port: number;
    open: boolean;
};
type AppConfig$1 = {
    appName: string;
    output: OutputOptions;
    development: DevelopmentOptions;
    client: ClientOptions;
    server: ServerOptions;
    moduleFederation?: moduleFederationPlugin.ModuleFederationPluginOptions;
    /**
     * @deprecated use `rspack` instead
     */
    webpack?: (config: Configuration, target: BuildTarget) => Configuration;
    rspack: (config: Configuration, target: BuildTarget) => Configuration;
    jest: (config: Config) => Config;
    plugins: ReturnType<RepackedPluginFactory>[];
};
type ConsumerAppConfig = DeepPartial<AppConfig$1> & {
    plugins?: ReturnType<RepackedPluginFactory>[];
};
type RepackedPluginConfig = {
    target: BuildTarget;
    appConfig: AppConfig$1;
};
type RepackedPluginReturn = {
    apply: (compiler: Compiler) => void;
    updateConfig?: (config: Configuration) => void;
};
type RepackedPluginFactory<Options = unknown> = (customOptions: Options) => (config: RepackedPluginConfig) => RepackedPluginReturn;

declare const runTest: (argv: string[], appConfig: AppConfig$1) => Promise<void>;

declare const serve: (mode: BuildMode, appConfig: AppConfig$1) => Promise<void>;

declare const build: (mode: BuildMode, appConfig: AppConfig$1) => Promise<void>;

type AppConfig = ConsumerAppConfig;

export { type AppConfig, type RepackedPluginConfig, type RepackedPluginFactory, build, serve, runTest as test };
