{"version":3,"file":"format-graphql-error.mjs","sources":["../../server/src/format-graphql-error.ts"],"sourcesContent":["import { toUpper, snakeCase, pick, isEmpty } from 'lodash/fp';\nimport { errors } from '@strapi/utils';\nimport { unwrapResolverError } from '@apollo/server/errors';\nimport { GraphQLError, type GraphQLFormattedError } from 'graphql';\n\nconst { HttpError, ForbiddenError, UnauthorizedError, ApplicationError, ValidationError } = errors;\n\nconst formatToCode = (name: string) => `STRAPI_${toUpper(snakeCase(name))}`;\nconst formatErrorToExtension = (error: any) => ({\n  error: pick(['name', 'message', 'details'])(error),\n});\n\nfunction createFormattedError(\n  formattedError: GraphQLFormattedError,\n  message: string,\n  code: string,\n  originalError: unknown\n) {\n  const options = {\n    ...formattedError,\n    extensions: {\n      ...formattedError.extensions,\n      ...formatErrorToExtension(originalError),\n      code,\n    },\n  };\n\n  return new GraphQLError(message, options);\n}\n\n/**\n * The handler for Apollo Server v4's formatError config option\n *\n * Intercepts specific Strapi error types to send custom error response codes in the GraphQL response\n */\nexport function formatGraphqlError(formattedError: GraphQLFormattedError, error: unknown) {\n  const originalError = unwrapResolverError(error);\n\n  // If this error doesn't have an associated originalError, it\n  if (isEmpty(originalError)) {\n    return formattedError;\n  }\n\n  const { message = '', name = 'UNKNOWN' } = originalError as Error;\n\n  if (originalError instanceof ForbiddenError || originalError instanceof UnauthorizedError) {\n    return createFormattedError(formattedError, message, 'FORBIDDEN', originalError);\n  }\n\n  if (originalError instanceof ValidationError) {\n    return createFormattedError(formattedError, message, 'BAD_USER_INPUT', originalError);\n  }\n\n  if (originalError instanceof ApplicationError || originalError instanceof HttpError) {\n    const errorName = formatToCode(name);\n    return createFormattedError(formattedError, message, errorName, originalError);\n  }\n\n  if (originalError instanceof GraphQLError) {\n    return formattedError;\n  }\n\n  // else if originalError doesn't appear to be from Strapi or GraphQL..\n\n  // Log the error\n  strapi.log.error(originalError);\n\n  // Create a generic 500 to send so we don't risk leaking any data\n  return createFormattedError(\n    new GraphQLError('Internal Server Error'),\n    'Internal Server Error',\n    'INTERNAL_SERVER_ERROR',\n    originalError\n  );\n}\n"],"names":["HttpError","ForbiddenError","UnauthorizedError","ApplicationError","ValidationError","errors","formatToCode","name","toUpper","snakeCase","formatErrorToExtension","error","pick","createFormattedError","formattedError","message","code","originalError","options","extensions","GraphQLError","formatGraphqlError","unwrapResolverError","isEmpty","errorName","strapi","log"],"mappings":";;;;;AAKA,MAAM,EAAEA,SAAS,EAAEC,cAAc,EAAEC,iBAAiB,EAAEC,gBAAgB,EAAEC,eAAe,EAAE,GAAGC,MAAAA;AAE5F,MAAMC,YAAAA,GAAe,CAACC,IAAiB,GAAA,CAAC,OAAO,EAAEC,OAAAA,CAAQC,SAAUF,CAAAA,IAAAA,CAAAA,CAAAA,CAAO,CAAC;AAC3E,MAAMG,sBAAAA,GAAyB,CAACC,KAAAA,IAAgB;AAC9CA,QAAAA,KAAAA,EAAOC,IAAK,CAAA;AAAC,YAAA,MAAA;AAAQ,YAAA,SAAA;AAAW,YAAA;SAAU,CAAED,CAAAA,KAAAA;KAC9C,CAAA;AAEA,SAASE,qBACPC,cAAqC,EACrCC,OAAe,EACfC,IAAY,EACZC,aAAsB,EAAA;AAEtB,IAAA,MAAMC,OAAU,GAAA;AACd,QAAA,GAAGJ,cAAc;QACjBK,UAAY,EAAA;AACV,YAAA,GAAGL,eAAeK,UAAU;AAC5B,YAAA,GAAGT,uBAAuBO,aAAc,CAAA;AACxCD,YAAAA;AACF;AACF,KAAA;IAEA,OAAO,IAAII,aAAaL,OAASG,EAAAA,OAAAA,CAAAA;AACnC;AAEA;;;;AAIC,IACM,SAASG,kBAAmBP,CAAAA,cAAqC,EAAEH,KAAc,EAAA;AACtF,IAAA,MAAMM,gBAAgBK,mBAAoBX,CAAAA,KAAAA,CAAAA;;AAG1C,IAAA,IAAIY,QAAQN,aAAgB,CAAA,EAAA;QAC1B,OAAOH,cAAAA;AACT;AAEA,IAAA,MAAM,EAAEC,OAAU,GAAA,EAAE,EAAER,IAAO,GAAA,SAAS,EAAE,GAAGU,aAAAA;IAE3C,IAAIA,aAAAA,YAAyBhB,cAAkBgB,IAAAA,aAAAA,YAAyBf,iBAAmB,EAAA;QACzF,OAAOW,oBAAAA,CAAqBC,cAAgBC,EAAAA,OAAAA,EAAS,WAAaE,EAAAA,aAAAA,CAAAA;AACpE;AAEA,IAAA,IAAIA,yBAAyBb,eAAiB,EAAA;QAC5C,OAAOS,oBAAAA,CAAqBC,cAAgBC,EAAAA,OAAAA,EAAS,gBAAkBE,EAAAA,aAAAA,CAAAA;AACzE;IAEA,IAAIA,aAAAA,YAAyBd,gBAAoBc,IAAAA,aAAAA,YAAyBjB,SAAW,EAAA;AACnF,QAAA,MAAMwB,YAAYlB,YAAaC,CAAAA,IAAAA,CAAAA;QAC/B,OAAOM,oBAAAA,CAAqBC,cAAgBC,EAAAA,OAAAA,EAASS,SAAWP,EAAAA,aAAAA,CAAAA;AAClE;AAEA,IAAA,IAAIA,yBAAyBG,YAAc,EAAA;QACzC,OAAON,cAAAA;AACT;;;IAKAW,MAAOC,CAAAA,GAAG,CAACf,KAAK,CAACM,aAAAA,CAAAA;;AAGjB,IAAA,OAAOJ,oBACL,CAAA,IAAIO,YAAa,CAAA,uBAAA,CAAA,EACjB,yBACA,uBACAH,EAAAA,aAAAA,CAAAA;AAEJ;;;;"}