UNPKG

houser-js-utils

Version:

A comprehensive collection of TypeScript utility functions for common development tasks including array manipulation, string processing, date handling, random number generation, validation, and much more.

1 lines 43.5 kB
{"version":3,"file":"ErrorUtils.mjs","sources":["../src/ErrorUtils.ts"],"sourcesContent":["/**\n * Error handling utilities and custom error types for better error management.\n *\n * This module provides a comprehensive set of error handling utilities and custom error types\n * for consistent error management across the application. It includes:\n *\n * - Custom error types for different error scenarios\n * - Error validation utilities\n * - Error reporting and logging functionality\n * - Type guards and validation functions\n *\n * @module ErrorUtils\n * @example\n * ```typescript\n * // Using custom error types\n * throw new AuthenticationError(\"Invalid credentials\");\n *\n * // Using validation utilities\n * ErrorUtils.validateEmail(\"user@example.com\");\n *\n * // Using error handling wrappers\n * const safeFunction = ErrorUtils.withErrorHandling(\n * () => riskyOperation(),\n * (error) => console.error(error)\n * );\n * ```\n */\n\n// DataDog type declarations\ndeclare global {\n interface Window {\n DD_LOGS?: {\n logger: {\n error: (message: string, context: Record<string, unknown>) => void;\n };\n };\n }\n}\n\n/**\n * Custom error class for authentication-related errors.\n * @extends Error\n */\nexport class AuthenticationError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"AuthenticationError\";\n }\n}\n\n/**\n * Custom error class for authorization-related errors.\n * @extends Error\n */\nexport class AuthorizationError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"AuthorizationError\";\n }\n}\n\n/**\n * Custom error class for network-related errors.\n * @extends Error\n */\nexport class NetworkError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"NetworkError\";\n }\n}\n\n/**\n * Custom error class for resource not found errors.\n * @extends Error\n */\nexport class NotFoundError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"NotFoundError\";\n }\n}\n\n/**\n * Custom error class for timeout-related errors.\n * @extends Error\n */\nexport class TimeoutError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"TimeoutError\";\n }\n}\n\n/**\n * Custom error class for validation-related errors.\n * @extends Error\n */\nexport class ValidationError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"ValidationError\";\n }\n}\n\n/**\n * Utility object containing error handling and validation functions.\n */\nexport const ErrorUtils = {\n /**\n * Captures and reports an error to DataDog.\n *\n * @param error - The error to capture and report\n * @param options - Options for error capture\n * @param options.log - Whether to log the error to console (default: true)\n * @param options.tags - Additional tags to add to the error in DataDog\n * @param options.context - Additional context to add to the error in DataDog\n *\n * @example\n * ```typescript\n * try {\n * // Some risky operation\n * } catch (error) {\n * ErrorUtils.captureError(error, {\n * tags: { component: 'UserService' },\n * context: { userId: '123' }\n * });\n * }\n * ```\n */\n captureError(\n error: Error | unknown,\n options: {\n log?: boolean;\n tags?: Record<string, string>;\n context?: Record<string, unknown>;\n } = {}\n ): void {\n const { log = true, tags = {}, context = {} } = options;\n\n // Convert unknown errors to Error objects\n const errorObj = error instanceof Error ? error : new Error(String(error));\n\n // Add error to DataDog\n if (typeof window !== \"undefined\" && window.DD_LOGS) {\n window.DD_LOGS.logger.error(errorObj.message, {\n error: errorObj,\n ...context,\n tags: {\n error_name: errorObj.name,\n error_stack: errorObj.stack,\n ...tags,\n },\n });\n }\n\n // Log to console if enabled\n if (log) {\n console.error(errorObj);\n }\n },\n\n /**\n * Checks if an error is a specific type of error.\n *\n * @param error - The error to check\n * @param errorType - The type of error to check against\n * @returns True if the error is of the specified type\n *\n * @example\n * ```typescript\n * const isAuthError = ErrorUtils.isErrorType(error, AuthenticationError);\n * ```\n */\n isErrorType(\n error: unknown,\n errorType: new (message: string) => Error\n ): boolean {\n return error instanceof errorType;\n },\n\n /**\n * Validates that a value is a valid array\n * @param value - Value to validate\n * @param message - Error message to throw if validation fails\n * @throws ValidationError if value is not a valid array\n */\n validateArray(value: unknown, message: string = \"Invalid array\"): void {\n if (!Array.isArray(value)) {\n throw new ValidationError(message);\n }\n },\n\n /**\n * Validates that a value is a valid array length\n * @param array - Array to validate\n * @param minLength - Minimum length\n * @param maxLength - Maximum length\n * @param message - Error message to throw if validation fails\n * @throws ValidationError if array length is invalid\n */\n validateArrayLength<T>(\n array: T[],\n minLength: number,\n maxLength: number,\n message: string = \"Invalid array length\"\n ): void {\n if (array.length < minLength || array.length > maxLength) {\n throw new ValidationError(message);\n }\n },\n\n /**\n * Validates that an array is not empty\n * @param array - Array to validate\n * @param message - Error message to throw if validation fails\n * @throws ValidationError if array is empty\n */\n validateArrayNotEmpty<T>(array: T[], message: string): void {\n if (array.length === 0) {\n throw new ValidationError(message);\n }\n },\n\n /**\n * Validates that a value is a valid bigint\n * @param value - Value to validate\n * @param message - Error message to throw if validation fails\n * @throws ValidationError if value is not a valid bigint\n */\n validateBigInt(value: unknown, message: string = \"Invalid bigint\"): void {\n if (typeof value !== \"bigint\") {\n throw new ValidationError(message);\n }\n },\n\n /**\n * Validates that a value is a valid boolean\n * @param value - Value to validate\n * @param message - Error message to throw if validation fails\n * @throws ValidationError if value is not a valid boolean\n */\n validateBoolean(\n value: unknown,\n message: string = \"Invalid boolean value\"\n ): void {\n if (typeof value !== \"boolean\") {\n throw new ValidationError(message);\n }\n },\n\n /**\n * Validates that a value is a valid credit card number\n * @param cardNumber - Credit card number to validate\n * @param message - Error message to throw if validation fails\n * @throws ValidationError if credit card number is invalid\n */\n validateCreditCard(\n cardNumber: string,\n message: string = \"Invalid credit card number\"\n ): void {\n // Remove spaces and dashes\n const cleanNumber = cardNumber.replace(/[\\s-]/g, \"\");\n\n // Check if it's a valid number\n if (!/^\\d+$/.test(cleanNumber)) {\n throw new ValidationError(message);\n }\n\n // Luhn algorithm for credit card validation\n let sum = 0;\n let isEven = false;\n\n for (let i = cleanNumber.length - 1; i >= 0; i--) {\n let digit = parseInt(cleanNumber.charAt(i));\n\n if (isEven) {\n digit *= 2;\n if (digit > 9) {\n digit -= 9;\n }\n }\n\n sum += digit;\n isEven = !isEven;\n }\n\n if (sum % 10 !== 0) {\n throw new ValidationError(message);\n }\n },\n\n /**\n * Validates that a value is a valid date\n * @param date - Date to validate\n * @param message - Error message to throw if validation fails\n * @throws ValidationError if date is invalid\n */\n validateDate(date: string | Date, message: string = \"Invalid date\"): void {\n const dateObj = new Date(date);\n if (isNaN(dateObj.getTime())) {\n throw new ValidationError(message);\n }\n },\n\n /**\n * Validates that a value is a valid date instance\n * @param value - Value to validate\n * @param message - Error message to throw if validation fails\n * @throws ValidationError if value is not a valid date instance\n */\n validateDateInstance(value: unknown, message: string = \"Invalid date\"): void {\n if (!(value instanceof Date) || isNaN(value.getTime())) {\n throw new ValidationError(message);\n }\n },\n\n /**\n * Validates that a value is a valid date range\n * @param startDate - Start date\n * @param endDate - End date\n * @param message - Error message to throw if validation fails\n * @throws ValidationError if date range is invalid\n */\n validateDateRange(\n startDate: Date | string,\n endDate: Date | string,\n message: string = \"Invalid date range\"\n ): void {\n const start = new Date(startDate);\n const end = new Date(endDate);\n\n if (isNaN(start.getTime()) || isNaN(end.getTime())) {\n throw new ValidationError(message);\n }\n\n if (start > end) {\n throw new ValidationError(message);\n }\n },\n\n /**\n * Validates that a value is a valid email address\n * @param email - Email address to validate\n * @param message - Error message to throw if validation fails\n * @throws ValidationError if email is invalid\n */\n validateEmail(\n email: string,\n message: string = \"Invalid email address\"\n ): void {\n const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n this.validateRegex(email, emailRegex, message);\n },\n\n /**\n * Validates that a value is a valid enum value\n * @param value - Value to validate\n * @param enumObj - Enum object to validate against\n * @param message - Error message to throw if validation fails\n * @throws ValidationError if value is not a valid enum value\n */\n validateEnum<T extends { [key: string]: string | number }>(\n value: string | number,\n enumObj: T,\n message: string = \"Invalid enum value\"\n ): void {\n if (!Object.values(enumObj).includes(value)) {\n throw new ValidationError(message);\n }\n },\n\n /**\n * Validates that a value is a valid file size\n * @param size - File size in bytes\n * @param maxSize - Maximum file size in bytes\n * @param message - Error message to throw if validation fails\n * @throws ValidationError if file size is invalid\n */\n validateFileSize(\n size: number,\n maxSize: number,\n message: string = \"File size exceeds maximum allowed size\"\n ): void {\n if (size < 0 || size > maxSize) {\n throw new ValidationError(message);\n }\n },\n\n /**\n * Validates that a value is a valid file type\n * @param file - File to validate\n * @param allowedTypes - Array of allowed MIME types\n * @param message - Error message to throw if validation fails\n * @throws ValidationError if file type is invalid\n */\n validateFileType(\n file: File,\n allowedTypes: string[],\n message: string = \"Invalid file type\"\n ): void {\n if (!allowedTypes.includes(file.type)) {\n throw new ValidationError(message);\n }\n },\n\n /**\n * Validates that a value is a valid function\n * @param value - Value to validate\n * @param message - Error message to throw if validation fails\n * @throws ValidationError if value is not a valid function\n */\n validateFunction(value: unknown, message: string = \"Invalid function\"): void {\n if (typeof value !== \"function\") {\n throw new ValidationError(message);\n }\n },\n\n /**\n * Validates that a value is a valid image dimension\n * @param width - Image width\n * @param height - Image height\n * @param maxWidth - Maximum width\n * @param maxHeight - Maximum height\n * @param message - Error message to throw if validation fails\n * @throws ValidationError if image dimension is invalid\n */\n validateImageDimension(\n width: number,\n height: number,\n maxWidth: number,\n maxHeight: number,\n message: string = \"Invalid image dimension\"\n ): void {\n if (width <= 0 || height <= 0 || width > maxWidth || height > maxHeight) {\n throw new ValidationError(message);\n }\n },\n\n /**\n * Validates that a value is a valid integer\n * @param value - Value to validate\n * @param message - Error message to throw if validation fails\n * @throws ValidationError if value is not a valid integer\n */\n validateInteger(value: unknown, message: string = \"Invalid integer\"): void {\n this.validateNumber(value, message);\n if (!Number.isInteger(value as number)) {\n throw new ValidationError(message);\n }\n },\n\n /**\n * Validates that a value is a valid IP address\n * @param ip - IP address to validate\n * @param version - IP version (4 or 6)\n * @param message - Error message to throw if validation fails\n * @throws ValidationError if IP address is invalid\n */\n validateIP(\n ip: string,\n version: 4 | 6 = 4,\n message: string = \"Invalid IP address\"\n ): void {\n const patterns = {\n 4: /^(\\d{1,3}\\.){3}\\d{1,3}$/,\n 6: /^([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}$/,\n };\n\n this.validateRegex(ip, patterns[version], message);\n\n if (version === 4) {\n const parts = ip.split(\".\");\n for (const part of parts) {\n const num = parseInt(part);\n if (num < 0 || num > 255) {\n throw new ValidationError(message);\n }\n }\n }\n },\n\n /**\n * Validates that a value is a valid MAC address\n * @param mac - MAC address to validate\n * @param message - Error message to throw if validation fails\n * @throws ValidationError if MAC address is invalid\n */\n validateMAC(mac: string, message: string = \"Invalid MAC address\"): void {\n const macRegex = /^([0-9A-Fa-f]{2}[:-]){5}([0-9A-Fa-f]{2})$/;\n this.validateRegex(mac, macRegex, message);\n },\n\n /**\n * Validates that a value is a valid map\n * @param value - Value to validate\n * @param message - Error message to throw if validation fails\n * @throws ValidationError if value is not a valid map\n */\n validateMap(value: unknown, message: string = \"Invalid map\"): void {\n if (!(value instanceof Map)) {\n throw new ValidationError(message);\n }\n },\n\n /**\n * Validates that a value is a valid negative number\n * @param value - Value to validate\n * @param message - Error message to throw if validation fails\n * @throws ValidationError if value is not a valid negative number\n */\n validateNegativeNumber(\n value: unknown,\n message: string = \"Invalid negative number\"\n ): void {\n this.validateNumber(value, message);\n if ((value as number) >= 0) {\n throw new ValidationError(message);\n }\n },\n\n /**\n * Validates that a value is a valid non-null\n * @param value - Value to validate\n * @param message - Error message to throw if validation fails\n * @throws ValidationError if value is null\n */\n validateNonNull<T>(\n value: T | null,\n message: string = \"Value must not be null\"\n ): asserts value is T {\n if (value === null) {\n throw new ValidationError(message);\n }\n },\n\n /**\n * Validates that a value is a valid non-null and non-undefined\n * @param value - Value to validate\n * @param message - Error message to throw if validation fails\n * @throws ValidationError if value is null or undefined\n */\n validateNonNullOrUndefined<T>(\n value: T | null | undefined,\n message: string = \"Value must not be null or undefined\"\n ): asserts value is T {\n if (value === null || value === undefined) {\n throw new ValidationError(message);\n }\n },\n\n /**\n * Validates that a value is a valid non-undefined\n * @param value - Value to validate\n * @param message - Error message to throw if validation fails\n * @throws ValidationError if value is undefined\n */\n validateNonUndefined<T>(\n value: T | undefined,\n message: string = \"Value must not be undefined\"\n ): asserts value is T {\n if (value === undefined) {\n throw new ValidationError(message);\n }\n },\n\n /**\n * Validates that a value is a valid null\n * @param value - Value to validate\n * @param message - Error message to throw if validation fails\n * @throws ValidationError if value is not null\n */\n validateNull(value: unknown, message: string = \"Value must be null\"): void {\n if (value !== null) {\n throw new ValidationError(message);\n }\n },\n\n /**\n * Validates that a value is a valid null or undefined\n * @param value - Value to validate\n * @param message - Error message to throw if validation fails\n * @throws ValidationError if value is not null or undefined\n */\n validateNullOrUndefined(\n value: unknown,\n message: string = \"Value must be null or undefined\"\n ): void {\n if (value !== null && value !== undefined) {\n throw new ValidationError(message);\n }\n },\n\n /**\n * Validates that a value is not null or undefined\n * @param value - Value to validate\n * @param message - Error message to throw if validation fails\n * @throws ValidationError if value is null or undefined\n */\n validateNotNull<T>(\n value: T | null | undefined,\n message: string\n ): asserts value is T {\n if (value === null || value === undefined) {\n throw new ValidationError(message);\n }\n },\n\n /**\n * Validates that a string is not empty\n * @param value - String to validate\n * @param message - Error message to throw if validation fails\n * @throws ValidationError if string is empty\n */\n validateNotEmpty(value: string, message: string): void {\n if (!value.trim()) {\n throw new ValidationError(message);\n }\n },\n\n /**\n * Validates that a value is a valid number\n * @param value - Value to validate\n * @param message - Error message to throw if validation fails\n * @throws ValidationError if value is not a valid number\n */\n validateNumber(value: unknown, message: string = \"Invalid number\"): void {\n if (typeof value !== \"number\" || isNaN(value)) {\n throw new ValidationError(message);\n }\n },\n\n /**\n * Validates that a value is a valid object\n * @param value - Value to validate\n * @param message - Error message to throw if validation fails\n * @throws ValidationError if value is not a valid object\n */\n validateObject(value: unknown, message: string = \"Invalid object\"): void {\n if (typeof value !== \"object\" || value === null) {\n throw new ValidationError(message);\n }\n },\n\n /**\n * Validates that a value is a valid object key\n * @param obj - Object to validate\n * @param key - Key to validate\n * @param message - Error message to throw if validation fails\n * @throws ValidationError if object key is invalid\n */\n validateObjectKey<T extends object>(\n obj: T,\n key: keyof T,\n message: string = \"Invalid object key\"\n ): void {\n if (!(key in obj)) {\n throw new ValidationError(message);\n }\n },\n\n /**\n * Validates that a value is a valid password\n * @param password - Password to validate\n * @param options - Password validation options\n * @throws ValidationError if password doesn't meet requirements\n */\n validatePassword(\n password: string,\n options: {\n minLength?: number;\n requireUppercase?: boolean;\n requireLowercase?: boolean;\n requireNumber?: boolean;\n requireSpecialChar?: boolean;\n message?: string;\n } = {}\n ): void {\n const {\n minLength = 8,\n requireUppercase = true,\n requireLowercase = true,\n requireNumber = true,\n requireSpecialChar = true,\n message = \"Invalid password\",\n } = options;\n\n if (password.length < minLength) {\n throw new ValidationError(`${message}: Minimum length is ${minLength}`);\n }\n\n if (requireUppercase && !/[A-Z]/.test(password)) {\n throw new ValidationError(`${message}: Must contain uppercase letter`);\n }\n\n if (requireLowercase && !/[a-z]/.test(password)) {\n throw new ValidationError(`${message}: Must contain lowercase letter`);\n }\n\n if (requireNumber && !/\\d/.test(password)) {\n throw new ValidationError(`${message}: Must contain number`);\n }\n\n if (requireSpecialChar && !/[!@#$%^&*(),.?\":{}|<>]/.test(password)) {\n throw new ValidationError(`${message}: Must contain special character`);\n }\n },\n\n /**\n * Validates that a value is a valid phone number\n * @param phone - Phone number to validate\n * @param message - Error message to throw if validation fails\n * @throws ValidationError if phone number is invalid\n */\n validatePhone(phone: string, message: string = \"Invalid phone number\"): void {\n const phoneRegex = /^\\+?[\\d\\s-()]{10,}$/;\n this.validateRegex(phone, phoneRegex, message);\n },\n\n /**\n * Validates that a value is a valid positive number\n * @param value - Value to validate\n * @param message - Error message to throw if validation fails\n * @throws ValidationError if value is not a valid positive number\n */\n validatePositiveNumber(\n value: unknown,\n message: string = \"Invalid positive number\"\n ): void {\n this.validateNumber(value, message);\n if ((value as number) <= 0) {\n throw new ValidationError(message);\n }\n },\n\n /**\n * Validates that a value is a valid postal code\n * @param postalCode - Postal code to validate\n * @param country - Country code for postal code format\n * @param message - Error message to throw if validation fails\n * @throws ValidationError if postal code is invalid\n */\n validatePostalCode(\n postalCode: string,\n country: \"US\" | \"CA\" | \"UK\" = \"US\",\n message: string = \"Invalid postal code\"\n ): void {\n const patterns = {\n US: /^\\d{5}(-\\d{4})?$/,\n CA: /^[A-Z]\\d[A-Z] \\d[A-Z]\\d$/,\n UK: /^[A-Z]{1,2}\\d[A-Z\\d]? ?\\d[A-Z]{2}$/,\n };\n\n this.validateRegex(postalCode, patterns[country], message);\n },\n\n /**\n * Validates that a value is a valid promise\n * @param value - Value to validate\n * @param message - Error message to throw if validation fails\n * @throws ValidationError if value is not a valid promise\n */\n validatePromise(value: unknown, message: string = \"Invalid promise\"): void {\n if (!(value instanceof Promise)) {\n throw new ValidationError(message);\n }\n },\n\n /**\n * Validates that a number is within a range\n * @param value - Number to validate\n * @param min - Minimum value (inclusive)\n * @param max - Maximum value (inclusive)\n * @param message - Error message to throw if validation fails\n * @throws ValidationError if number is outside range\n */\n validateRange(\n value: number,\n min: number,\n max: number,\n message: string\n ): void {\n if (value < min || value > max) {\n throw new ValidationError(message);\n }\n },\n\n /**\n * Validates that a value matches a regular expression\n * @param value - String to validate\n * @param regex - Regular expression to match against\n * @param message - Error message to throw if validation fails\n * @throws ValidationError if value doesn't match regex\n */\n validateRegex(value: string, regex: RegExp, message: string): void {\n if (!regex.test(value)) {\n throw new ValidationError(message);\n }\n },\n\n /**\n * Validates that a value is a valid regular expression\n * @param value - Value to validate\n * @param message - Error message to throw if validation fails\n * @throws ValidationError if value is not a valid regular expression\n */\n validateRegExp(\n value: unknown,\n message: string = \"Invalid regular expression\"\n ): void {\n if (!(value instanceof RegExp)) {\n throw new ValidationError(message);\n }\n },\n\n /**\n * Validates that a value is a valid set\n * @param value - Value to validate\n * @param message - Error message to throw if validation fails\n * @throws ValidationError if value is not a valid set\n */\n validateSet(value: unknown, message: string = \"Invalid set\"): void {\n if (!(value instanceof Set)) {\n throw new ValidationError(message);\n }\n },\n\n /**\n * Validates that a value is a valid social security number\n * @param ssn - Social security number to validate\n * @param message - Error message to throw if validation fails\n * @throws ValidationError if SSN is invalid\n */\n validateSSN(ssn: string, message: string = \"Invalid SSN\"): void {\n const ssnRegex =\n /^(?!000|666)[0-8][0-9]{2}-(?!00)[0-9]{2}-(?!0000)[0-9]{4}$/;\n this.validateRegex(ssn, ssnRegex, message);\n },\n\n /**\n * Validates that a value is a valid string\n * @param value - Value to validate\n * @param message - Error message to throw if validation fails\n * @throws ValidationError if value is not a valid string\n */\n validateString(value: unknown, message: string = \"Invalid string\"): void {\n if (typeof value !== \"string\") {\n throw new ValidationError(message);\n }\n },\n\n /**\n * Validates that a value is a valid symbol\n * @param value - Value to validate\n * @param message - Error message to throw if validation fails\n * @throws ValidationError if value is not a valid symbol\n */\n validateSymbol(value: unknown, message: string = \"Invalid symbol\"): void {\n if (typeof value !== \"symbol\") {\n throw new ValidationError(message);\n }\n },\n\n /**\n * Validates that a value is a valid time string\n * @param time - Time string to validate\n * @param format - Time format (12h or 24h)\n * @param message - Error message to throw if validation fails\n * @throws ValidationError if time string is invalid\n */\n validateTime(\n time: string,\n format: \"12h\" | \"24h\" = \"24h\",\n message: string = \"Invalid time\"\n ): void {\n const patterns = {\n \"12h\": /^(0?[1-9]|1[0-2]):[0-5][0-9] (AM|PM)$/i,\n \"24h\": /^([01]?[0-9]|2[0-3]):[0-5][0-9]$/,\n };\n\n this.validateRegex(time, patterns[format], message);\n },\n\n /**\n * Validates that a value is a valid undefined\n * @param value - Value to validate\n * @param message - Error message to throw if validation fails\n * @throws ValidationError if value is not undefined\n */\n validateUndefined(\n value: unknown,\n message: string = \"Value must be undefined\"\n ): void {\n if (value !== undefined) {\n throw new ValidationError(message);\n }\n },\n\n /**\n * Validates that a value is a valid URL\n * @param url - URL to validate\n * @param message - Error message to throw if validation fails\n * @throws ValidationError if URL is invalid\n */\n validateUrl(url: string, message: string = \"Invalid URL\"): void {\n try {\n new URL(url);\n } catch {\n throw new ValidationError(message);\n }\n },\n\n /**\n * Validates that a value is a valid UUID\n * @param uuid - UUID to validate\n * @param version - UUID version (1-5)\n * @param message - Error message to throw if validation fails\n * @throws ValidationError if UUID is invalid\n * @example\n * ```typescript\n * // Validate a random UUID (version 4)\n * ErrorUtils.validateUUID('123e4567-e89b-12d3-a456-426614174000', 4);\n *\n * // Validate a time-based UUID (version 1)\n * ErrorUtils.validateUUID('123e4567-e89b-12d3-a456-426614174000', 1);\n * ```\n */\n validateUUID(\n uuid: string,\n version: 1 | 2 | 3 | 4 | 5 = 4,\n message: string = \"Invalid UUID\"\n ): void {\n // First validate the basic UUID format\n const uuidRegex =\n /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;\n if (!uuidRegex.test(uuid)) {\n throw new ValidationError(message);\n }\n\n // Extract the version from the UUID\n const versionHex = uuid.charAt(14);\n const actualVersion = parseInt(versionHex, 16);\n\n // Validate the version\n if (actualVersion !== version) {\n throw new ValidationError(\n `${message}: Expected version ${version}, got version ${actualVersion}`\n );\n }\n\n // Get the clock sequence high bits for version-specific validation\n const clockSeqHi = parseInt(uuid.charAt(19), 16);\n\n // Additional version-specific validations\n switch (version) {\n case 1: // Time-based UUID\n // Version 1 UUIDs use the current timestamp and node ID\n // The clock_seq_hi_and_reserved field should have bits 6 and 7 set to 0 and 1\n if ((clockSeqHi & 0xc0) !== 0x80) {\n throw new ValidationError(\n `${message}: Invalid version 1 UUID clock sequence`\n );\n }\n break;\n case 2: // DCE Security UUID\n // Version 2 UUIDs are similar to version 1 but include local domain and local ID\n if ((clockSeqHi & 0xc0) !== 0x80) {\n throw new ValidationError(\n `${message}: Invalid version 2 UUID clock sequence`\n );\n }\n break;\n case 3: // Name-based UUID (MD5)\n // Version 3 UUIDs use MD5 hashing\n // The clock_seq_hi_and_reserved field should have bits 6 and 7 set to 1 and 0\n if ((clockSeqHi & 0xc0) !== 0x40) {\n throw new ValidationError(\n `${message}: Invalid version 3 UUID clock sequence`\n );\n }\n break;\n case 4: // Random UUID\n // Version 4 UUIDs use random or pseudo-random numbers\n // The clock_seq_hi_and_reserved field should have bits 6 and 7 set to 1 and 0\n if ((clockSeqHi & 0xc0) !== 0x40) {\n throw new ValidationError(\n `${message}: Invalid version 4 UUID clock sequence`\n );\n }\n break;\n case 5: // Name-based UUID (SHA-1)\n // Version 5 UUIDs use SHA-1 hashing\n // The clock_seq_hi_and_reserved field should have bits 6 and 7 set to 1 and 0\n if ((clockSeqHi & 0xc0) !== 0x40) {\n throw new ValidationError(\n `${message}: Invalid version 5 UUID clock sequence`\n );\n }\n break;\n }\n },\n\n /**\n * Validates that a value is a valid weak map\n * @param value - Value to validate\n * @param message - Error message to throw if validation fails\n * @throws ValidationError if value is not a valid weak map\n */\n validateWeakMap(value: unknown, message: string = \"Invalid weak map\"): void {\n if (!(value instanceof WeakMap)) {\n throw new ValidationError(message);\n }\n },\n\n /**\n * Validates that a value is a valid weak set\n * @param value - Value to validate\n * @param message - Error message to throw if validation fails\n * @throws ValidationError if value is not a valid weak set\n */\n validateWeakSet(value: unknown, message: string = \"Invalid weak set\"): void {\n if (!(value instanceof WeakSet)) {\n throw new ValidationError(message);\n }\n },\n\n /**\n * Wraps an async function with error handling\n * @param fn - Async function to wrap\n * @param errorHandler - Function to handle errors\n * @returns Wrapped async function\n */\n withAsyncErrorHandling<T extends (...args: any[]) => Promise<any>>(\n fn: T,\n errorHandler: (error: unknown) => void\n ): (...args: Parameters<T>) => Promise<Awaited<ReturnType<T>>> {\n return async (...args: Parameters<T>): Promise<Awaited<ReturnType<T>>> => {\n try {\n return await fn(...args);\n } catch (error) {\n errorHandler(error);\n throw error;\n }\n };\n },\n\n /**\n * Wraps a function with error handling\n * @param fn - Function to wrap\n * @param errorHandler - Function to handle errors\n * @returns Wrapped function\n */\n withErrorHandling<T extends (...args: any[]) => any>(\n fn: T,\n errorHandler: (error: unknown) => void\n ): (...args: Parameters<T>) => ReturnType<T> {\n return (...args: Parameters<T>): ReturnType<T> => {\n try {\n return fn(...args);\n } catch (error) {\n errorHandler(error);\n throw error;\n }\n };\n },\n};\n"],"names":[],"mappings":"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"}