UNPKG

@sqlsmith/core

Version:

Core SQL schema merging engine with dependency resolution

110 lines 3.92 kB
import { ErrorCode, SqlMergerError } from '../types/errors.js'; import { Logger } from './logger.js'; export class ErrorHandler { #logger; constructor(logger) { this.#logger = logger; } /** * Handle an error with appropriate logging and optional re-throwing */ handleError(error, shouldRethrow = true) { if (error instanceof SqlMergerError) { this.#logger.error(error.getDetailedMessage()); if (error.originalError) { this.#logger.debug('Original error stack:', error.originalError.stack); } } else if (error instanceof Error) { this.#logger.error(`Unexpected error: ${error.message}`); this.#logger.debug('Error stack:', error.stack); } else { this.#logger.error(`Unknown error: ${String(error)}`); } if (shouldRethrow) { throw error; } } /** * Wrap a function with error handling */ wrapWithErrorHandling = (fn, context) => { return (...args) => { try { return fn(...args); } catch (error) { if (context) { this.#logger.debug(`Error in ${context}`); } this.handleError(error); // This line will never be reached due to handleError throwing, but needed for type safety throw error; } }; }; /** * Wrap an async function with error handling */ wrapWithAsyncErrorHandling = (fn, context) => { return async (...args) => { try { return await fn(...args); } catch (error) { if (context) { this.#logger.debug(`Error in ${context}`); } this.handleError(error); // This line will never be reached due to handleError throwing, but needed for type safety throw error; } }; }; /** * Create a SqlMergerError from a generic error */ createSqlMergerError(originalError, code, message, context) { const errorMessage = message || (originalError instanceof Error ? originalError.message : String(originalError)); const sqlError = new (class extends SqlMergerError { })(errorMessage, code, context, originalError instanceof Error ? originalError : undefined); return sqlError; } /** * Handle CLI command errors with proper exit codes */ handleCommandError(error, quiet = false) { // Don't log if already logged by handleError if (!(error instanceof SqlMergerError)) { const tempLogger = new Logger({ logLevel: quiet ? 'error' : 'info' }); tempLogger.error(error instanceof Error ? error.message : String(error)); } // Exit with appropriate code based on error type let exitCode = 1; if (error instanceof SqlMergerError) { switch (error.code) { case ErrorCode.DIRECTORY_NOT_FOUND: case ErrorCode.FILE_NOT_FOUND: case ErrorCode.NO_SQL_FILES: exitCode = 2; // Input/file errors break; case ErrorCode.CIRCULAR_DEPENDENCY: case ErrorCode.DUPLICATE_STATEMENT_NAMES: exitCode = 3; // Dependency errors break; case ErrorCode.INVALID_OPTIONS: case ErrorCode.MISSING_REQUIRED_OPTION: exitCode = 4; // Configuration errors break; default: exitCode = 1; // General errors } } process.exit(exitCode); } } //# sourceMappingURL=error-handler.js.map