{"version":3,"file":"zoderrors.js","sources":["../../../src/integrations/zoderrors.ts"],"sourcesContent":["import type { IntegrationFn } from '@sentry/types';\nimport type { Event, EventHint } from '@sentry/types';\nimport { isError, truncate } from '@sentry/utils';\nimport { defineIntegration } from '../integration';\n\ninterface ZodErrorsOptions {\n key?: string;\n limit?: number;\n}\n\nconst DEFAULT_LIMIT = 10;\nconst INTEGRATION_NAME = 'ZodErrors';\n\n// Simplified ZodIssue type definition\ninterface ZodIssue {\n path: (string | number)[];\n message?: string;\n expected?: string | number;\n received?: string | number;\n unionErrors?: unknown[];\n keys?: unknown[];\n}\n\ninterface ZodError extends Error {\n issues: ZodIssue[];\n\n get errors(): ZodError['issues'];\n}\n\nfunction originalExceptionIsZodError(originalException: unknown): originalException is ZodError {\n return (\n isError(originalException) &&\n originalException.name === 'ZodError' &&\n Array.isArray((originalException as ZodError).errors)\n );\n}\n\ntype SingleLevelZodIssue = {\n [P in keyof T]: T[P] extends string | number | undefined\n ? T[P]\n : T[P] extends unknown[]\n ? string | undefined\n : unknown;\n};\n\n/**\n * Formats child objects or arrays to a string\n * That is preserved when sent to Sentry\n */\nfunction formatIssueTitle(issue: ZodIssue): SingleLevelZodIssue {\n return {\n ...issue,\n path: 'path' in issue && Array.isArray(issue.path) ? issue.path.join('.') : undefined,\n keys: 'keys' in issue ? JSON.stringify(issue.keys) : undefined,\n unionErrors: 'unionErrors' in issue ? JSON.stringify(issue.unionErrors) : undefined,\n };\n}\n\n/**\n * Zod error message is a stringified version of ZodError.issues\n * This doesn't display well in the Sentry UI. Replace it with something shorter.\n */\nfunction formatIssueMessage(zodError: ZodError): string {\n const errorKeyMap = new Set();\n for (const iss of zodError.issues) {\n if (iss.path && iss.path[0]) {\n errorKeyMap.add(iss.path[0]);\n }\n }\n const errorKeys = Array.from(errorKeyMap);\n\n return `Failed to validate keys: ${truncate(errorKeys.join(', '), 100)}`;\n}\n\n/**\n * Applies ZodError issues to an event extras and replaces the error message\n */\nexport function applyZodErrorsToEvent(limit: number, event: Event, hint?: EventHint): Event {\n if (\n !event.exception ||\n !event.exception.values ||\n !hint ||\n !hint.originalException ||\n !originalExceptionIsZodError(hint.originalException) ||\n hint.originalException.issues.length === 0\n ) {\n return event;\n }\n\n return {\n ...event,\n exception: {\n ...event.exception,\n values: [\n {\n ...event.exception.values[0],\n value: formatIssueMessage(hint.originalException),\n },\n ...event.exception.values.slice(1),\n ],\n },\n extra: {\n ...event.extra,\n 'zoderror.issues': hint.originalException.errors.slice(0, limit).map(formatIssueTitle),\n },\n };\n}\n\nconst _zodErrorsIntegration = ((options: ZodErrorsOptions = {}) => {\n const limit = options.limit || DEFAULT_LIMIT;\n\n return {\n name: INTEGRATION_NAME,\n processEvent(originalEvent, hint) {\n const processedEvent = applyZodErrorsToEvent(limit, originalEvent, hint);\n return processedEvent;\n },\n };\n}) satisfies IntegrationFn;\n\nexport const zodErrorsIntegration = defineIntegration(_zodErrorsIntegration);\n"],"names":[],"mappings":"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"}