import { ApplicationError as SemanticApplicationError, type ApplicationErrorCode, type SemanticApplicationErrorOptions, } from '../../data/model/application_error'; import { createApplicationErrorCorrelationId, getApplicationErrorCorrelationId } from './application_error_context'; export { APPLICATION_ERROR_METADATA, APPLICATION_ERROR_RECOVERY_IDS, type ApplicationErrorCode, type ApplicationErrorKind, type ApplicationErrorPublicRecord, type ApplicationErrorRecovery, type ApplicationErrorRecoveryId, } from '../../data/model/application_error'; export interface ApplicationErrorOptions extends Omit { readonly correlationId?: string; } /** Creates a semantic error and owns correlation identity outside the pure model. */ export class ApplicationError extends SemanticApplicationError { constructor(code: ApplicationErrorCode, message: string, options: ApplicationErrorOptions = {}) { super(code, message, { ...options, correlationId: options.correlationId ?? getApplicationErrorCorrelationId() ?? createApplicationErrorCorrelationId(), }); } } export function toApplicationError( error: unknown, code: ApplicationErrorCode, message: string, options: Omit = {}, ): ApplicationError { return error instanceof ApplicationError ? error : new ApplicationError(code, message, { ...options, cause: error }); }