promisify-child-process
Version:
seriously like the best async child process library
69 lines • 4.68 kB
TypeScript
import { ChildProcess, IOType } from 'child_process';
import child_process from 'child_process';
import Stream, { Pipe, Readable, Writable } from 'stream';
type StdioElement = IOType | Stream | number | null | undefined;
type StdioOptions = IOType | [StdioElement, StdioElement, StdioElement, ...Array<StdioElement | 'ipc'>] | Array<StdioElement | 'ipc'>;
interface IOOptions {
silent?: boolean;
stdio?: StdioOptions;
encoding?: BufferEncoding | 'buffer' | null;
maxBuffer?: number;
}
type ChunkTypeHelper<MaxBuffer, Encoding> = MaxBuffer extends number ? Encoding extends BufferEncoding ? string : Buffer : Encoding extends BufferEncoding ? string : Encoding extends 'buffer' ? Buffer : undefined;
type ChunkType<Options extends IOOptions> = ChunkTypeHelper<'maxBuffer' extends keyof Options ? Options['maxBuffer'] : undefined, 'encoding' extends keyof Options ? Options['encoding'] : undefined>;
type IsPipeHelper<Stdio, Silent, Fd extends 0 | 1 | 2> = Stdio extends unknown[] ? Stdio[Fd] extends infer Value ? Value extends 'pipe' | 'overlapped' ? true : false : false : Stdio extends null | undefined | 'pipe' | 'overlapped' ? true : Stdio extends null | undefined ? Silent extends true ? false : true : false;
type IsPipe<Options extends IOOptions, Fd extends 0 | 1 | 2> = IsPipeHelper<'stdio' extends keyof Options ? Options['stdio'] : undefined, 'silent' extends keyof Options ? Options['silent'] : undefined, Fd>;
type Contains<A, T> = A extends [infer Head, ...infer Tail] ? Head extends T ? true : Contains<Tail, T> : false;
export interface ChildProcessResult<Options extends IOOptions> {
stdout: IsPipe<Options, 1> extends true ? ChunkType<Options> : undefined;
stderr: IsPipe<Options, 2> extends true ? ChunkType<Options> : undefined;
code: number | null;
signal: string | null;
killed: boolean;
}
type StdioStreams<Stdio> = { [K in keyof Stdio]: Stdio[K] extends 'pipe' | 'overlapped' ? K extends 0 | '0' ? Writable : Readable : null };
export interface ChildProcessPromise<Options extends IOOptions> extends ChildProcess, Promise<ChildProcessResult<Options>> {
stdin: IsPipe<Options, 0> extends true ? Writable : null;
stdout: IsPipe<Options, 1> extends true ? Readable : null;
stderr: IsPipe<Options, 2> extends true ? Readable : null;
readonly channel: Options['stdio'] extends infer Stdio ? Contains<Stdio, 'ipc'> extends true ? Pipe : undefined : undefined;
readonly stdio: Options['stdio'] extends infer Stdio ? Stdio extends unknown[] ? StdioStreams<Stdio> : Stdio extends null | undefined | 'pipe' | 'overlapped' ? [Writable, Readable, Readable, undefined, undefined] : [null, null, null, undefined, undefined] : [null, null, null, undefined, undefined];
}
interface PromisifyChildProcessBaseOptions extends IOOptions {
killSignal?: NodeJS.Signals | number;
}
export declare function promisifyChildProcess<Options extends PromisifyChildProcessBaseOptions>(child: ChildProcess, options?: Options): ChildProcessPromise<Options>;
export interface SpawnOptions extends child_process.SpawnOptions {
stdio?: StdioOptions;
encoding?: BufferEncoding;
maxBuffer?: number;
}
export declare function spawn<Options extends SpawnOptions>(command: string, args: readonly string[], options?: Options): ChildProcessPromise<Options>;
export declare function spawn<Options extends SpawnOptions>(command: string, options?: Options): ChildProcessPromise<Options>;
export interface ForkOptions extends child_process.ForkOptions {
stdio?: StdioOptions;
encoding?: BufferEncoding;
maxBuffer?: number;
}
export declare function fork<Options extends ForkOptions>(module: string, args: Array<string>, options?: Options): ChildProcessPromise<Options>;
export declare function fork<Options extends ForkOptions>(module: string, options?: Options): ChildProcessPromise<Options>;
export interface ExecOptions extends child_process.ExecOptions {
encoding?: BufferEncoding | 'buffer';
}
export declare const exec: <Options extends ExecOptions>(command: string, options?: Options) => ChildProcessPromise<Options>;
export interface ExecFileOptions extends child_process.ExecFileOptions {
encoding?: BufferEncoding | 'buffer';
}
export declare const execFile: {
<Options extends ExecFileOptions>(file: string, args: readonly string[], options?: Options): ChildProcessPromise<Options>;
<Options extends ExecFileOptions>(file: string, options?: Options): ChildProcessPromise<Options>;
};
export declare function isChildProcessError(error: unknown): error is Error & {
code: number | null;
signal: NodeJS.Signals | null;
killed: boolean;
stdout?: string | Buffer;
stderr?: string | Buffer;
};
export {};
//# sourceMappingURL=index.d.ts.map