export const EXIT = { OK: 0, GENERIC: 1, AUTH: 2, NOT_FOUND: 3, CONFLICT: 4, PERMISSION: 5, TIMEOUT: 6, } as const; export type ExitCode = (typeof EXIT)[keyof typeof EXIT]; export class TangleError extends Error { constructor( message: string, public readonly code: ExitCode, public readonly errorName: string, ) { super(message); this.name = "TangleError"; } } export class AuthError extends TangleError { constructor(message: string) { super(message, EXIT.AUTH, "AuthError"); } } export class NotFoundError extends TangleError { constructor(message: string) { super(message, EXIT.NOT_FOUND, "NotFoundError"); } } export class ConflictError extends TangleError { constructor(message: string) { super(message, EXIT.CONFLICT, "ConflictError"); } } export class PermissionError extends TangleError { constructor(message: string) { super(message, EXIT.PERMISSION, "PermissionError"); } } export class TimeoutError extends TangleError { constructor(message: string) { super(message, EXIT.TIMEOUT, "TimeoutError"); } } export class ValidationError extends TangleError { constructor(message: string) { super(message, EXIT.GENERIC, "ValidationError"); } }