import { ErrorMessageDetails, ValidationDetails } from "@storm-stack/types";
import { ErrorType, type StormErrorOptions } from "./types";
/**
 * Creates a new StormError instance
 *
 * @param cause - The cause of the error
 * @returns The newly created StormError
 */
export declare function createStormError<TCode extends string = string, TErrorType extends ErrorType = ErrorType, TData = undefined>({ code, name, type, message, cause, stack, data }: StormErrorOptions<TErrorType, TData> & {
    code?: TCode;
}): StormError<TCode, TErrorType, TData>;
/**
 * Gets the cause of an unknown error and returns it as a StormError
 *
 * @param cause - The cause of the error in an unknown type
 * @returns The cause of the error in a StormError object or undefined
 */
export declare function getCauseFromUnknown<TErrorType extends ErrorType = ErrorType, TData = undefined>(cause: unknown, type: TErrorType | undefined, data: TData): StormError<string, TErrorType, TData>;
/**
 * Type-check to determine if `obj` is a `StormError` object
 *
 * @param value - the object to check
 * @returns The function isStormError is returning a boolean value.
 */
export declare function isStormError<TCode extends string = string>(value: unknown): value is StormError<TCode>;
/**
 * A wrapper around the base JavaScript Error class to be used by Storm Software
 *
 * @decorator `@Serializable()`
 */
declare class StormError<TCode extends string = string, TErrorType extends ErrorType = typeof ErrorType.EXCEPTION, TData = undefined> extends Error {
    __proto__: any;
    /**
     * The stack trace
     */
    private _stack?;
    /**
     * The inner error
     */
    private _cause?;
    /**
     * The error code
     */
    code: TCode;
    /**
     * Additional data to be passed with the error
     */
    data: TData;
    /**
     * The type of error response message/event
     */
    type: TErrorType;
    /**
     * Creates a new StormError instance
     *
     * @param error - The error to create
     * @returns The newly created StormError
     */
    static create<TErrorType extends ErrorType = ErrorType, TData = undefined>(error?: unknown, type?: TErrorType, data?: TData): StormError<string, TErrorType, TData>;
    /**
     * Creates a new Exception StormError instance
     *
     * @param error - The validation details
     * @param data - The options to use
     * @returns The newly created StormError
     */
    static createException<TData = undefined>(error?: unknown, data?: TData): StormError<string, typeof ErrorType.EXCEPTION, TData>;
    /**
     * Creates a new Exception StormError instance
     *
     * @param data - The options to use
     * @returns The newly created StormError
     */
    static createFromData<TData = undefined>(data?: TData): StormError<string, typeof ErrorType.EXCEPTION, TData>;
    /**
     * Creates a new Validation StormError instance
     *
     * @param validationDetails - The validation details
     * @param options - The options to use
     * @returns The newly created StormError
     */
    static createValidation(validationDetails: ValidationDetails | ValidationDetails[], options?: Omit<StormErrorOptions, "type" | "data">): StormError<string, typeof ErrorType.VALIDATION, ValidationDetails[]>;
    /**
     * Creates a new Not Found StormError instance
     *
     * @param recordName - The name of the items returned (or in this case *not returned*) in the search results
     * @param options - The options to use
     * @returns The newly created StormError
     */
    static createNotFound(recordName?: string, options?: Omit<StormErrorOptions, "type" | "data">): StormError<string, typeof ErrorType.NOT_FOUND, string | undefined>;
    /**
     * Creates a new Security StormError instance
     *
     * @param data - Any relevant data related to the security issue
     * @param options - The options to use
     * @returns The newly created StormError
     */
    static createSecurity(data?: any, options?: Omit<StormErrorOptions, "type" | "data">): StormError<string, typeof ErrorType.NOT_FOUND, any>;
    /**
     * Creates a new Service Unavailable StormError instance
     *
     * @param serviceName - The name of the service that is currently unavailable
     * @param options - The options to use
     * @returns The newly created StormError
     */
    static createServiceUnavailable(serviceName: string, options?: Omit<StormErrorOptions, "type" | "data">): StormError<string, typeof ErrorType.SERVICE_UNAVAILABLE, string>;
    /**
     * Creates a new Action Unsupported StormError instance
     *
     * @param action - The action that is unsupported
     * @param options - The options to use
     * @returns The newly created StormError
     */
    static createActionUnsupported(action: string, options?: Omit<StormErrorOptions, "type" | "data">): StormError<string, typeof ErrorType.ACTION_UNSUPPORTED, string>;
    /**
     * Creates a new Unknown StormError instance
     *
     * @param data - The action that is unsupported
     * @param options - The options to use
     * @returns The newly created StormError
     */
    static createUnknown(data: any, options?: Omit<StormErrorOptions, "type" | "data">): StormError<string, typeof ErrorType.UNKNOWN, any>;
    constructor(code: TCode, options: StormErrorOptions<TErrorType, TData>);
    /**
     * The cause of the error
     */
    get cause(): StormError | undefined;
    /**
     * The cause of the error
     */
    set cause(_cause: unknown);
    /**
     * Prints a displayable/formatted stack trace
     *
     * @returns The stack trace string
     */
    get stack(): string;
    /**
     * Store the stack trace
     */
    set stack(_stack: string);
    /**
     * The unformatted stack trace
     *
     * @returns The stack trace string
     */
    get originalStack(): string;
    /**
     * Prints the display error message string
     *
     * @returns The display error message string
     */
    print(): string;
    /**
     * Prints the error message and stack trace
     *
     * @returns The error message and stack trace string
     */
    toString(stacktrace?: boolean): string;
    /**
     * Convert the error object into a message details object
     *
     * @returns The error message details object
     */
    toMessage(): ErrorMessageDetails;
}
export { StormError };
