All files / src/lib/validation throwCustomError.ts

100% Statements 12/12
82.35% Branches 14/17
100% Functions 3/3
100% Lines 12/12

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54              1x 2x   2x     4x   4x       4x 4x   4x     2x     1x         6x       6x                                
import { GraphQLError } from 'graphql';
import type {
  ErrorOptions,
  ErrorTypeDefinition,
  ZodIssueMinimal,
} from './types';
 
const buildFieldErrorsFromZodIssues = (issues: ZodIssueMinimal[]) => {
  const fieldErrors: Record<string, string[]> = {};
 
  for (const issue of issues) {
    // Safely handle path segments (converting symbols to strings if any)
    const path =
      issue.path
        .map((segment) =>
          typeof segment === 'symbol' ? segment.toString() : segment,
        )
        .join('.') || '_root';
 
    Eif (!fieldErrors[path]) {
      fieldErrors[path] = [];
    }
    fieldErrors[path].push(issue.message);
  }
 
  return fieldErrors;
};
 
export const throwCustomError = (
  message: string,
  errorType: ErrorTypeDefinition,
  options?: ErrorOptions,
): never => {
  const zodDetails = options?.zodIssues
    ? buildFieldErrorsFromZodIssues(options.zodIssues)
    : undefined;
 
  throw new GraphQLError(message, {
    extensions: {
      code: errorType.errorCode,
      messageKey: options?.messageKey ?? null,
      http: {
        status: errorType.errorStatus,
      },
      details: zodDetails ?? options?.details ?? null,
      stacktrace: process.env.NODE_ENV === 'development' ? undefined : null,
    },
    originalError:
      options?.originalError instanceof Error
        ? options.originalError
        : undefined,
  });
};