import type { Simplify } from 'type-fest';
import type { Arguments, CliArguments } from './arguments';
import type { CliEnv, Env } from './env';
/**
 * Available GraphQL Mesh CLI commands
 */
export declare type Command = 'build' | 'dev' | 'serve-source' | 'start' | 'validate';
/**
 * Command Options that can be passed to a node:child_process.
 */
export declare type CommandOptions<TArgs extends Arguments = Arguments, TEnv extends Env = Env> = {
    args: TArgs;
    env: TEnv;
};
/**
 * Arguments used by all CLI commands
 */
export declare type SharedArgs = Pick<Arguments, 'dir' | 'require'>;
/**
 * Arguments used by the build command
 */
export declare type BuildArgs = Simplify<SharedArgs & Pick<Arguments, 'fileType'>>;
/**
 * Arguments used by the dev command
 */
export declare type DevArgs = Simplify<SharedArgs & Pick<Arguments, 'port'>>;
/**
 * Arguments used by the serve-source command
 */
export declare type ServeSourceArgs = SharedArgs;
/**
 * Arguments used by the start command
 */
export declare type StartArgs = Simplify<SharedArgs & Pick<Arguments, 'port'>>;
/**
 * Arguments used by the validate command
 */
export declare type ValidateArgs = SharedArgs;
/**
 * Options used by the GraphQL Mesh CLI commands
 */
export declare type Options<TCommand extends Command> = TCommand extends 'build' ? CommandOptions<BuildArgs> : TCommand extends 'dev' ? CommandOptions<DevArgs> : TCommand extends 'serve-source' ? CommandOptions<ServeSourceArgs> : TCommand extends 'start' ? CommandOptions<StartArgs> : TCommand extends 'validate' ? CommandOptions<ValidateArgs> : CommandOptions;
/**
 * Command Options in a format that can be passed to the GraphQL Mesh CLI.
 */
export declare type CommandCliOptions<TOptions extends CommandOptions> = {
    args: CliArguments<TOptions['args']>;
    env: CliEnv<TOptions['env']>;
};
export declare const getCommandOptions: <TCommand extends Command, TOptions extends Options<TCommand> = Options<TCommand>>(options: TOptions) => CommandCliOptions<TOptions>;
