import { humanizeErrors } from '../../modules/errors' export function StatusCodeError (statusCode, body, options, response) { this.name = 'StatusCodeError' this.statusCode = statusCode this.message = statusCode + ' - ' + (JSON && JSON.stringify ? JSON.stringify(body) : body) this.error = body // legacy attribute this.options = options this.response = response if (Error.captureStackTrace) { // required for non-V8 environments Error.captureStackTrace(this) } } StatusCodeError.prototype = Object.create(Error.prototype) StatusCodeError.prototype.constructor = StatusCodeError export class RegistrationError extends Error { constructor (error) { super() if (Error.captureStackTrace) { Error.captureStackTrace(this) } try { // the error is probably a JSON object with a single key, "errors", whose value is another JSON object containing the real errors if (typeof error === 'string') { error = JSON.parse(error) // eslint-disable-next-line if (error.hasOwnProperty('error')) { error = JSON.parse(error.error) } } if (typeof error === 'object') { const errorContents = JSON.parse(error.error) // keys will have the property that has the error, for example 'ap_id', // 'email' or 'captcha', the value will be an array of its error // like "ap_id": ["has been taken"] or "captcha": ["Invalid CAPTCHA"] // replace ap_id with username if (errorContents.ap_id) { errorContents.username = errorContents.ap_id delete errorContents.ap_id } this.message = humanizeErrors(errorContents) } else { this.message = error } } catch (e) { // can't parse it, so just treat it like a string this.message = error } } }