declare module 'pretty-error' {
    namespace PrettyError {
        function start(): any;
        function stop(): any;

        class ParsedError {
            constructor(error: Error);
        }

        interface ConfigObject {
            skipPackages?: boolean | string[];
            skipPaths?: boolean | string[];
            skip?: boolean | PrettyError.Callback | PrettyError.Callback[];
            maxItems?: number;
            skipNodeFiles?: boolean | any; // assuming this is optional
            filters?: boolean | PrettyError.Callback | PrettyError.Callback[];
            parsedErrorFilters?:
            | boolean
            | PrettyError.Callback
            | PrettyError.Callback[];
            aliases?: boolean | Object;
        }

        type Callback = (traceLine: Object | any, lineNumber: number) => boolean;
    }

    class PrettyError {
        constructor();

        start(): PrettyError;
        stop(): any;
        config(configObject: PrettyError.ConfigObject): PrettyError;
        withoutColors(): PrettyError;
        withColors(): PrettyError;
        skipPackage(...packages: string[]): PrettyError;
        unskipPackage(...packages: string[]): PrettyError;
        unskipAllPackages(): PrettyError;
        skipPath(...paths: string[]): PrettyError;
        unskipPath(...paths: string[]): PrettyError;
        unskipAllPaths(): PrettyError;
        skip(callbacks: PrettyError.Callback): PrettyError;
        unskip(callbacks: PrettyError.Callback): PrettyError;
        unskipAll(): PrettyError;
        skipNodeFiles(): any;
        unskipNodeFiles(): any;
        filter(callbacks: PrettyError.Callback): PrettyError;
        removeFilter(callbacks: PrettyError.Callback): PrettyError;
        removeAllFilters(): PrettyError;
        filterParsedError(callbacks: PrettyError.Callback): PrettyError;
        removeParsedErrorFilter(callbacks: PrettyError.Callback): PrettyError;
        removeAllParsedErrorFilters(): PrettyError;
        setMaxItems(maxItems: number): PrettyError;
        alias(stringOrRx: string, alias: string): PrettyError;
        removeAlias(stringOrRx: string): PrettyError;
        removeAllAliases(): PrettyError;
        appendStyle(toAppend: Object): PrettyError;
        render(
            e: PrettyError.ParsedError,
            logIt?: boolean,
            useColors?: boolean
        ): string;
        getObject(e: Object): Object;
    }

    export = PrettyError;
}
