From 2080de4c07c65d7730f0508e1a8444383787188e Mon Sep 17 00:00:00 2001 From: Mahmoud Hamdi Date: Sun, 29 Mar 2026 04:36:18 +0200 Subject: [PATCH] fix: use instanceof instead of constructor name in formatErrors Replace constructor name string comparison with instanceof checks for APIError and ValidationError, preventing production builds from silently dropping the error data field when class names are minified. --- .../payload/src/utilities/formatErrors.ts | 25 ++++++++----------- 1 file changed, 11 insertions(+), 14 deletions(-) diff --git a/packages/payload/src/utilities/formatErrors.ts b/packages/payload/src/utilities/formatErrors.ts index 9d26ee9c8c7..4f8365e1e81 100644 --- a/packages/payload/src/utilities/formatErrors.ts +++ b/packages/payload/src/utilities/formatErrors.ts @@ -1,33 +1,30 @@ import type { ErrorResult } from '../config/types.js' -import type { APIError } from '../errors/APIError.js' -import { APIErrorName } from '../errors/APIError.js' -import { ValidationErrorName } from '../errors/ValidationError.js' +import { APIError } from '../errors/APIError.js' +import { ValidationError } from '../errors/ValidationError.js' export const formatErrors = (incoming: { [key: string]: unknown } | APIError): ErrorResult => { if (incoming) { - // Cannot use `instanceof` to check error type: https://github.com/microsoft/TypeScript/issues/13965 - // Instead, get the prototype of the incoming error and check its constructor name - const proto = Object.getPrototypeOf(incoming) - // Payload 'ValidationError' and 'APIError' - if ( - (proto.constructor.name === ValidationErrorName || proto.constructor.name === APIErrorName) && - incoming.data - ) { + if ((incoming instanceof ValidationError || incoming instanceof APIError) && incoming.data) { return { errors: [ { - name: incoming.name as string, + name: incoming.name, data: incoming.data as Record, - message: incoming.message as string, + message: incoming.message, }, ], } } // Mongoose 'ValidationError': https://mongoosejs.com/docs/api/error.html#Error.ValidationError - if (proto.constructor.name === ValidationErrorName && 'errors' in incoming && incoming.errors) { + if ( + 'name' in incoming && + incoming.name === 'ValidationError' && + 'errors' in incoming && + incoming.errors + ) { return { errors: Object.keys(incoming.errors).reduce( (acc, key) => {