{"version":3,"file":"errors.cjs","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAEA,qDAMqB;AAErB;;;GAGG;AACH,MAAa,SAAU,SAAQ,KAAK;IASlC;;;;;;;;;;;OAWG;IACH,YACE,KAAoC,EACpC,OAA6B,EAAE;QAE/B,MAAM,OAAO,GAAG,IAAA,2BAAe,EAAC,KAAK,CAAC,CAAC;QACvC,KAAK,CAAC,OAAO,CAAC,CAAC;QAzBR,kCAAc;QAEd,qCAAiB;QAEjB,kCAA6B;QAE7B,mCAAgB;QAqBvB,uBAAA,IAAI,sBAAY,OAAO,MAAA,CAAC;QACxB,uBAAA,IAAI,mBAAS,IAAA,wBAAY,EAAC,KAAK,CAAC,MAAA,CAAC;QAEjC,MAAM,UAAU,GAAG,EAAE,GAAG,IAAA,wBAAY,EAAC,KAAK,CAAC,EAAE,GAAG,IAAI,EAAE,CAAC;QACvD,IAAI,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACvC,uBAAA,IAAI,mBAAS,UAAU,MAAA,CAAC;QAC1B,CAAC;QAED,uBAAA,IAAI,oBAAU,KAAK,CAAC,KAAK,MAAA,CAAC;IAC5B,CAAC;IAED;;;;OAIG;IACH,IAAI,IAAI;QACN,OAAO,WAAW,CAAC;IACrB,CAAC;IAED;;;;OAIG;IACH,IAAI,IAAI;QACN,OAAO,uBAAA,IAAI,uBAAM,CAAC;IACpB,CAAC;IAED;;;;OAIG;IACH,qEAAqE;IACrE,0BAA0B;IAC1B,IAAI,OAAO;QACT,OAAO,uBAAA,IAAI,0BAAS,CAAC;IACvB,CAAC;IAED;;;;OAIG;IACH,IAAI,IAAI;QACN,OAAO,uBAAA,IAAI,uBAAM,CAAC;IACpB,CAAC;IAED;;;;OAIG;IACH,qEAAqE;IACrE,0BAA0B;IAC1B,IAAI,KAAK;QACP,OAAO,uBAAA,IAAI,wBAAO,CAAC;IACrB,CAAC;IAED;;;;OAIG;IACH,MAAM;QACJ,OAAO;YACL,IAAI,EAAE,2BAAe;YACrB,OAAO,EAAE,8BAAkB;YAC3B,IAAI,EAAE;gBACJ,KAAK,EAAE;oBACL,IAAI,EAAE,IAAI,CAAC,IAAI;oBACf,OAAO,EAAE,IAAI,CAAC,OAAO;oBACrB,KAAK,EAAE,IAAI,CAAC,KAAK;oBACjB,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;iBAC1C;aACF;SACF,CAAC;IACJ,CAAC;IAED;;;;;OAKG;IACH,SAAS;QACP,OAAO,IAAI,CAAC,MAAM,EAAE,CAAC;IACvB,CAAC;CACF;AArHD,8BAqHC","sourcesContent":["import type { Json, JsonRpcError } from '@metamask/utils';\n\nimport {\n  getErrorCode,\n  getErrorData,\n  getErrorMessage,\n  SNAP_ERROR_CODE,\n  SNAP_ERROR_MESSAGE,\n} from './internals';\n\n/**\n * A generic error which can be thrown by a Snap, without it causing the Snap to\n * crash.\n */\nexport class SnapError extends Error {\n  readonly #code: number;\n\n  readonly #message: string;\n\n  readonly #data?: Record<string, Json>;\n\n  readonly #stack?: string;\n\n  /**\n   * Create a new `SnapError`.\n   *\n   * @param error - The error to create the `SnapError` from. If this is a\n   * `string`, it will be used as the error message. If this is an `Error`, its\n   * `message` property will be used as the error message. If this is a\n   * `JsonRpcError`, its `message` property will be used as the error message\n   * and its `code` property will be used as the error code. Otherwise, the\n   * error will be converted to a string and used as the error message.\n   * @param data - Additional data to include in the error. This will be merged\n   * with the error data, if any.\n   */\n  constructor(\n    error: string | Error | JsonRpcError,\n    data: Record<string, Json> = {},\n  ) {\n    const message = getErrorMessage(error);\n    super(message);\n\n    this.#message = message;\n    this.#code = getErrorCode(error);\n\n    const mergedData = { ...getErrorData(error), ...data };\n    if (Object.keys(mergedData).length > 0) {\n      this.#data = mergedData;\n    }\n\n    this.#stack = super.stack;\n  }\n\n  /**\n   * The error name.\n   *\n   * @returns The error name.\n   */\n  get name() {\n    return 'SnapError';\n  }\n\n  /**\n   * The error code.\n   *\n   * @returns The error code.\n   */\n  get code() {\n    return this.#code;\n  }\n\n  /**\n   * The error message.\n   *\n   * @returns The error message.\n   */\n  // This line is covered, but Jest doesn't pick it up for some reason.\n  /* istanbul ignore next */\n  get message() {\n    return this.#message;\n  }\n\n  /**\n   * Additional data for the error.\n   *\n   * @returns Additional data for the error.\n   */\n  get data() {\n    return this.#data;\n  }\n\n  /**\n   * The error stack.\n   *\n   * @returns The error stack.\n   */\n  // This line is covered, but Jest doesn't pick it up for some reason.\n  /* istanbul ignore next */\n  get stack() {\n    return this.#stack;\n  }\n\n  /**\n   * Convert the error to a JSON object.\n   *\n   * @returns The JSON object.\n   */\n  toJSON(): SerializedSnapError {\n    return {\n      code: SNAP_ERROR_CODE,\n      message: SNAP_ERROR_MESSAGE,\n      data: {\n        cause: {\n          code: this.code,\n          message: this.message,\n          stack: this.stack,\n          ...(this.data ? { data: this.data } : {}),\n        },\n      },\n    };\n  }\n\n  /**\n   * Serialize the error to a JSON object. This is called by\n   * `@metamask/rpc-errors` when serializing the error.\n   *\n   * @returns The JSON object.\n   */\n  serialize() {\n    return this.toJSON();\n  }\n}\n\n/**\n * A serialized {@link SnapError}. It's JSON-serializable, so it can be sent\n * over the RPC. The original error is wrapped in the `cause` property.\n *\n * @property code - The error code. This is always `-31002`.\n * @property message - The error message. This is always `'Snap Error'`.\n * @property data - The error data.\n * @property data.cause - The cause of the error.\n * @property data.cause.code - The error code.\n * @property data.cause.message - The error message.\n * @property data.cause.stack - The error stack.\n * @property data.cause.data - Additional data for the error.\n * @see SnapError\n */\nexport type SerializedSnapError = {\n  code: typeof SNAP_ERROR_CODE;\n  message: typeof SNAP_ERROR_MESSAGE;\n  data: {\n    cause: JsonRpcError;\n  };\n};\n"]}