import { ProjectsConfigurations, ProjectGraph } from '@nx/devkit';
import { TypeScriptBuildOptions, AdditionalCLIOptions } from '@storm-software/build-tools';
import { StormWorkspaceConfig } from '@storm-software/config';
import { TsconfigRaw, BuildResult } from 'esbuild';
import { Options } from 'tsup';

type ESBuildOptions = Omit<Options, "outDir" | "entryPoints"> & Required<Pick<TypeScriptBuildOptions, "projectRoot">> & Pick<TypeScriptBuildOptions, "assets" | "sourceRoot" | "outputPath" | "generatePackageJson" | "includeSrc" | "mode"> & {
    userOptions?: any;
    distDir?: string;
    tsconfig?: string | null;
    tsconfigRaw?: TsconfigRaw;
    verbose?: boolean;
};
type ESBuildResult = BuildResult;
type ESBuildCLIOptions = AdditionalCLIOptions & Pick<ESBuildOptions, "name" | "entry" | "outputPath" | "platform" | "format" | "bundle" | "target" | "watch" | "clean" | "mode" | "banner" | "footer" | "splitting" | "treeshake" | "generatePackageJson" | "metafile" | "minify" | "includeSrc" | "dts" | "shims">;
type ESBuildContext = {
    options: ESBuildOptions;
    clean: boolean;
    workspaceConfig: StormWorkspaceConfig;
    projectConfigurations: ProjectsConfigurations;
    projectName: string;
    projectGraph: ProjectGraph;
    sourceRoot: string;
    outputPath: string;
    result?: BuildResult;
};
type MaybePromise<T> = T | Promise<T>;
interface ModuleExport {
    kind: "module";
    sourceFileName: string;
    destFileName: string;
    moduleName: string;
    isTypeOnly: boolean;
}
interface NamedExport {
    kind: "named";
    sourceFileName: string;
    destFileName: string;
    alias: string;
    name: string;
    isTypeOnly: boolean;
}
type ExportDeclaration = ModuleExport | NamedExport;

export type { ESBuildCLIOptions, ESBuildContext, ESBuildOptions, ESBuildResult, ExportDeclaration, MaybePromise };
