import { Readable } from 'node:stream';

export type Cmd = {
  exe: string;
  args?: string[];
  cwd?: string;
  tty?: boolean;
  expose5000?: boolean;
  input?: Readable;
  superuser?: boolean;
};

export type Translate = (cmd: Cmd) => Cmd;

export type Spawner = {
  run: (cmd: Cmd) => Promise<string>;
  runForegroundSync: (cmd: Cmd) => void;
  runForeground: (cmd: Cmd) => Promise<number | void>;
  runStreaming: (cmd: Cmd) => Promise<Readable>;
  resolvePath: (...paths: (string | undefined)[]) => string;
  readdir: (path?: string) => Promise<string[]>;
  readFile: (path: string) => Promise<string>;
  writeFile: (path: string, data: string) => Promise<void>;
  mkdirp: (path?: string) => Promise<void>;
  rename: (oldPath: string, newPath: string) => Promise<void>;
  rimraf: (path?: string) => Promise<void>;
  sanatizedrimraf: (path?: string) => Promise<void>;
  tar: (...paths: string[]) => Promise<Readable>;
  untar: (input: Readable, cwd?: string) => Promise<void>;
  exists: (path: string) => Promise<boolean>;
  walk: (dir?: string) => Promise<string[]>;
};
