import { TRPC_ERROR_CODE_KEY } from '../rpc/codes'; import { getCauseFromUnknown } from '../shared/getCauseFromUnknown'; export function getTRPCErrorFromUnknown(cause: unknown): TRPCError { if (cause instanceof TRPCError) { return cause; } if (cause instanceof Error && cause.name === 'TRPCError') { // https://github.com/trpc/trpc/pull/4848 return cause as TRPCError; } const trpcError = new TRPCError({ code: 'INTERNAL_SERVER_ERROR', cause, }); // Inherit stack from error if (cause instanceof Error && cause.stack) { trpcError.stack = cause.stack; } return trpcError; } export class TRPCError extends Error { // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore override doesn't work in all environments due to "This member cannot have an 'override' modifier because it is not declared in the base class 'Error'" public override readonly cause?: Error; public readonly code; constructor(opts: { message?: string; code: TRPC_ERROR_CODE_KEY; cause?: unknown; }) { const cause = getCauseFromUnknown(opts.cause); const message = opts.message ?? cause?.message ?? opts.code; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore https://github.com/tc39/proposal-error-cause super(message, { cause }); this.code = opts.code; this.name = 'TRPCError'; if (!this.cause) { // idk why this is needed, but it is this.cause = cause; } } }