import type { UserConfig as UserConfig_, ToolsConfig as ToolsConfig_, NewPluginConfig } from '@modern-js/core';
import type { UserConfig as LibuildUserConfig, Asset as LibuildAsset } from '@modern-js/libuild';
import { ModuleToolsHooks } from '..';
import type { DeepPartial } from '../utils';
import { BuildInPreset, presetList } from '../../constants/build-presets';
import type { CopyConfig } from '../copy';
import type { LessConfig, SassConfig, PostCSSConfig } from './style';
export * from './style';
export declare type BuildType = 'bundleless' | 'bundle';
export declare type BundlelessFormat = 'esm' | 'cjs';
export declare type BundleFormat = 'esm' | 'cjs' | 'umd' | 'iife';
export declare type Format = BundlelessFormat | BundleFormat;
export declare type Target = 'es5' | 'es6' | 'es2015' | 'es2016' | 'es2017' | 'es2018' | 'es2019' | 'es2020' | 'esnext';
export declare type Entry = Required<LibuildUserConfig>['input'];
export declare type DTSOptions = {
  distPath: string;
  tsconfigPath: string;
  only: boolean;
};
export declare type DTS = false | DTSOptions;
export interface Asset {
  path: LibuildAsset['outdir'];
  rebase: LibuildAsset['rebase'];
  name: LibuildAsset['name'];
  limit: LibuildAsset['limit'];
  publicPath: LibuildAsset['publicPath'];
}
export declare type SourceMap = Required<LibuildUserConfig>['sourceMap'];
export declare type SkipDeps = boolean | {
  dependencies?: boolean;
  devDependencies?: boolean;
  peerDependencies?: boolean;
};
export declare type JSX = Exclude<Required<LibuildUserConfig>['jsx'], 'preserve'>;
export interface BaseCommonBuildConfig {
  target: Target;
  dts: DTS;
  sourceMap: SourceMap;
  copy: CopyConfig;
  asset?: Asset;
  jsx: JSX;
  path: string;
}
export interface PartialBaseCommonBuildConfig {
  target?: Target;
  dts?: false | Partial<DTSOptions>;
  sourceMap?: SourceMap;
  copy?: CopyConfig;
  asset?: Partial<Asset>;
  jsx?: JSX;
  path?: string;
}
export declare type BundleOptions = {
  entry: Entry;
  platform: LibuildUserConfig['platform'];
  splitting: LibuildUserConfig['splitting'];
  minify: LibuildUserConfig['minify'];
  externals: LibuildUserConfig['external'];
  skipDeps: SkipDeps;
  entryNames: LibuildUserConfig['entryNames'];
  globals: LibuildUserConfig['globals'];
  metafile: LibuildUserConfig['metafile'];
  umdModuleName: ((chunkName: string) => string) | string | undefined;
};
export interface BaseBundleBuildConfig extends BaseCommonBuildConfig {
  buildType: 'bundle';
  format: BundleFormat;
  bundleOptions: BundleOptions;
}
export interface PartialBaseBundleBuildConfig extends PartialBaseCommonBuildConfig {
  buildType?: 'bundle';
  format?: BundleFormat;
  bundleOptions?: DeepPartial<BundleOptions>;
}
export declare type Assets = {
  path: string;
};
export declare type StyleCompileMode = 'with-source-code' | 'only-compiled-code';
export declare type BundlelessOptions = {
  sourceDir: string;
  styleCompileMode: StyleCompileMode;
};
export interface BaseBundlelessBuildConfig extends BaseCommonBuildConfig {
  buildType: 'bundleless';
  format: BundlelessFormat;
  bundlelessOptions: BundlelessOptions;
}
export interface PartialBaseBundlelessBuildConfig extends PartialBaseCommonBuildConfig {
  buildType?: 'bundleless';
  format?: BundlelessFormat;
  bundlelessOptions?: DeepPartial<BundlelessOptions>;
}
export declare type BaseBuildConfig = BaseBundleBuildConfig | BaseBundlelessBuildConfig;
export declare type PartialBaseBuildConfig = PartialBaseBundleBuildConfig | PartialBaseBundlelessBuildConfig;
export declare type BuildConfig = BaseBuildConfig | BaseBuildConfig[];
export declare type PartialBuildConfig = PartialBaseBuildConfig | PartialBaseBuildConfig[];
export declare type BuildPreset = keyof typeof presetList | ((options: {
  preset: typeof BuildInPreset;
}) => PartialBuildConfig | Promise<PartialBuildConfig>);
export declare type AliasOption = Record<string, string> | ((aliases: Record<string, string>) => Record<string, string> | void);
export interface SourceConfig {
  envVars: string[];
  globalVars: Record<string, string>;
  alias: AliasOption;
  /**
   * The configuration of `source.designSystem` is provided by `tailwindcss` plugin.
   * Please use `yarn new` or `pnpm new` to enable the corresponding capability.
   * @requires `tailwindcss` plugin
   */
  designSystem: Record<string, any>;
}
export interface ToolsConfig {
  less?: LessConfig;
  sass?: SassConfig;
  postcss?: PostCSSConfig;
  /**
   * The configuration of `tools.tailwindcss` is provided by `tailwindcss` plugin.
   * Please use `yarn new` or `pnpm new` to enable the corresponding capability.
   * @requires `tailwindcss` plugin
   */
  tailwindcss?: Record<string, any> | ((options: Record<string, any>) => Record<string, any> | void);
  jest?: Pick<Required<ToolsConfig_>, 'jest'>;
}
export interface StorybookDevConfig {
  name?: string;
}
export interface Dev {
  storybook: StorybookDevConfig;
}
export interface ResolvedConfig {
  source: SourceConfig;
  buildConfig?: BuildConfig;
  buildPreset?: BuildPreset;
  dev: Dev;
  tools?: ToolsConfig;
  plugins: NewPluginConfig<ModuleToolsHooks>;
  testing?: Pick<UserConfig_, 'testing'>;
}
export interface UserConfig {
  source?: Partial<SourceConfig>;
  buildConfig?: PartialBuildConfig;
  buildPreset?: BuildPreset;
  dev?: DeepPartial<Dev>;
  tools?: DeepPartial<ToolsConfig>;
  plugins?: NewPluginConfig<ModuleToolsHooks>;
  testing?: Pick<UserConfig_, 'testing'>;
}
export declare type Config = UserConfig | Promise<UserConfig> | ((env: any) => UserConfig | Promise<UserConfig>);