import { z } from "zod"; class ResourceNotFoundError extends Error { statusCode = 404; resourceId: string | null; resourceType: string; constructor(resource: string, id: string | null) { super(id ? `${resource} with ID ${id} not found` : `${resource} not found`); this.name = "ResourceNotFoundError"; this.resourceType = resource; this.resourceId = id; } } class InvalidInputError extends Error { statusCode = 400; constructor(message: string) { super(message); this.name = "InvalidInputError"; } } class ValidationError extends Error { statusCode = 400; constructor(message: string) { super(message); this.name = "ValidationError"; } } class UnknownError extends Error { statusCode = 500; constructor(message: string) { super(message); this.name = "UnknownError"; } } class DatabaseError extends Error { statusCode = 500; constructor(message: string) { super(message); this.name = "DatabaseError"; } } class UniqueConstraintError extends Error { statusCode = 409; constructor(message: string) { super(message); this.name = "UniqueConstraintError"; } } class ForeignKeyConstraintError extends Error { statusCode = 409; constructor(message: string) { super(message); this.name = "ForeignKeyConstraintError"; } } class OperationNotAllowedError extends Error { statusCode = 403; constructor(message: string) { super(message); this.name = "OperationNotAllowedError"; } } class AuthenticationError extends Error { statusCode = 401; constructor(message: string) { super(message); this.name = "AuthenticationError"; } } class AuthorizationError extends Error { statusCode = 403; constructor(message: string) { super(message); this.name = "AuthorizationError"; } } interface NetworkError { code: "network_error"; message: string; status: number; url: URL; responseMessage?: string; details?: Record; } interface ForbiddenError { code: "forbidden"; message: string; status: number; url: URL; responseMessage?: string; details?: Record; } export const ZErrorHandler = z.function({ input: [z.any()], output: z.void(), }); export { ResourceNotFoundError, InvalidInputError, ValidationError, DatabaseError, UniqueConstraintError, UnknownError, ForeignKeyConstraintError, OperationNotAllowedError, AuthenticationError, AuthorizationError, }; export type { NetworkError, ForbiddenError }; export interface ApiErrorResponse { code: | "not_found" | "gone" | "bad_request" | "internal_server_error" | "unauthorized" | "method_not_allowed" | "not_authenticated" | "forbidden" | "network_error"; message: string; status: number; url: URL; details?: Record; responseMessage?: string; }