{"version":3,"sources":["../../src/response.ts"],"sourcesContent":["import { lowerCaseObjectKeys } from './utils/index'\nimport { Request } from './request'\nimport type { Headers } from './types'\n\nexport const REGEXP_CONTENT_TYPE_JSON = /^application\\/(json|.*\\+json)/\n\nexport interface ResponseParams {\n  readonly status?: number\n  readonly rawData?: string\n  readonly headers?: Headers\n  readonly error?: Error\n}\n\n/**\n * @typedef Response\n * @param {Request} originalRequest, for auth it hides the password\n * @param {Integer} responseStatus\n * @param {String} responseData, defaults to null\n * @param {Object} responseHeaders, defaults to an empty object ({})\n * @param {Array<Error>} errors, defaults to an empty array ([])\n */\ntype SerializableJSON = number | string | boolean | null | Record<string, unknown>\nexport type ParsedJSON = SerializableJSON | SerializableJSON[]\nexport class Response<DataType extends ParsedJSON = ParsedJSON> {\n  public readonly originalRequest: Request\n  public readonly responseStatus: number\n  public readonly responseData: string | null\n  public readonly responseHeaders: Headers\n  // eslint-disable-next-line no-use-before-define\n  public readonly errors: Array<Error | string>\n  public timeElapsed: number | null\n\n  constructor(\n    originalRequest: Request,\n    responseStatus: number,\n    responseData?: string | null,\n    responseHeaders?: Headers,\n    errors?: Array<Error | string>\n  ) {\n    const auth = originalRequest.requestParams && originalRequest.requestParams.auth\n    if (auth) {\n      const maskedAuth = { ...auth, password: '***' }\n      this.originalRequest = originalRequest.enhance({ auth: maskedAuth })\n    } else {\n      this.originalRequest = originalRequest\n    }\n\n    this.responseStatus = responseStatus\n    this.responseData = responseData ?? null\n    this.responseHeaders = responseHeaders || {}\n    this.errors = errors || []\n    this.timeElapsed = null\n  }\n\n  public request() {\n    return this.originalRequest\n  }\n\n  public status() {\n    // IE sends 1223 instead of 204\n    if (this.responseStatus === 1223) {\n      return 204\n    }\n\n    return this.responseStatus\n  }\n\n  /**\n   * Returns true if status is greater or equal 200 or lower than 400\n   */\n  public success() {\n    const status = this.status()\n    return status >= 200 && status < 400\n  }\n\n  /**\n   * Returns an object with the headers. Header names are converted to\n   * lowercase\n   */\n  public headers() {\n    return lowerCaseObjectKeys(this.responseHeaders)\n  }\n\n  /**\n   * Utility method to get a header value by name\n   */\n  public header<T extends string | number | boolean>(name: string): T | undefined {\n    const key = name.toLowerCase()\n\n    if (key in this.headers()) {\n      return this.headers()[key] as T\n    }\n\n    return undefined\n  }\n\n  /**\n   * Returns the original response data\n   */\n  public rawData() {\n    return this.responseData\n  }\n\n  /**\n   * Returns the response data, if \"Content-Type\" is \"application/json\"\n   * it parses the response and returns an object.\n   * Friendly reminder:\n   *  - JSON.parse() can return null, an Array or an object.\n   */\n  public data<T = DataType>() {\n    if (this.isContentTypeJSON() && this.responseData !== null) {\n      try {\n        return JSON.parse(this.responseData) as T\n      } catch (e) {} // eslint-disable-line no-empty\n    }\n\n    return this.responseData as unknown as T\n  }\n\n  public isContentTypeJSON() {\n    const contentType = this.header<string>('content-type')\n\n    if (contentType === undefined) {\n      return false\n    }\n\n    return REGEXP_CONTENT_TYPE_JSON.test(contentType)\n  }\n\n  /**\n   * Returns the last error instance that caused the request to fail\n   */\n  public error() {\n    const lastError = this.errors[this.errors.length - 1] || null\n\n    if (typeof lastError === 'string') {\n      return new Error(lastError)\n    }\n\n    return lastError\n  }\n\n  /**\n   * Enhances current Response returning a new Response\n   *\n   * @param {Object} extras\n   *   @param {Integer} extras.status - it will replace the current status\n   *   @param {String} extras.rawData - it will replace the current rawData\n   *   @param {Object} extras.headers - it will be merged with current headers\n   *   @param {Error} extras.error    - it will be added to the list of errors\n   */\n  public enhance(extras: ResponseParams) {\n    const mergedHeaders = { ...this.headers(), ...(extras.headers || {}) }\n    const enhancedResponse = new Response<DataType>(\n      this.request(),\n      extras.status || this.status(),\n      extras.rawData || this.rawData(),\n      mergedHeaders,\n      extras.error ? [...this.errors, extras.error] : [...this.errors]\n    )\n    enhancedResponse.timeElapsed = this.timeElapsed\n\n    return enhancedResponse\n  }\n}\n\nexport default Response\n"],"mappings":";AAAA,SAAS,2BAA2B;AAI7B,IAAM,2BAA2B;AAmBjC,IAAM,WAAN,MAAM,UAAmD;AAAA,EAC9C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAEA;AAAA,EACT;AAAA,EAEP,YACE,iBACA,gBACA,cACA,iBACA,QACA;AACA,UAAM,OAAO,gBAAgB,iBAAiB,gBAAgB,cAAc;AAC5E,QAAI,MAAM;AACR,YAAM,aAAa,EAAE,GAAG,MAAM,UAAU,MAAM;AAC9C,WAAK,kBAAkB,gBAAgB,QAAQ,EAAE,MAAM,WAAW,CAAC;AAAA,IACrE,OAAO;AACL,WAAK,kBAAkB;AAAA,IACzB;AAEA,SAAK,iBAAiB;AACtB,SAAK,eAAe,gBAAgB;AACpC,SAAK,kBAAkB,mBAAmB,CAAC;AAC3C,SAAK,SAAS,UAAU,CAAC;AACzB,SAAK,cAAc;AAAA,EACrB;AAAA,EAEO,UAAU;AACf,WAAO,KAAK;AAAA,EACd;AAAA,EAEO,SAAS;AAEd,QAAI,KAAK,mBAAmB,MAAM;AAChC,aAAO;AAAA,IACT;AAEA,WAAO,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKO,UAAU;AACf,UAAM,SAAS,KAAK,OAAO;AAC3B,WAAO,UAAU,OAAO,SAAS;AAAA,EACnC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMO,UAAU;AACf,WAAO,oBAAoB,KAAK,eAAe;AAAA,EACjD;AAAA;AAAA;AAAA;AAAA,EAKO,OAA4C,MAA6B;AAC9E,UAAM,MAAM,KAAK,YAAY;AAE7B,QAAI,OAAO,KAAK,QAAQ,GAAG;AACzB,aAAO,KAAK,QAAQ,EAAE,GAAG;AAAA,IAC3B;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKO,UAAU;AACf,WAAO,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQO,OAAqB;AAC1B,QAAI,KAAK,kBAAkB,KAAK,KAAK,iBAAiB,MAAM;AAC1D,UAAI;AACF,eAAO,KAAK,MAAM,KAAK,YAAY;AAAA,MACrC,SAAS,GAAG;AAAA,MAAC;AAAA,IACf;AAEA,WAAO,KAAK;AAAA,EACd;AAAA,EAEO,oBAAoB;AACzB,UAAM,cAAc,KAAK,OAAe,cAAc;AAEtD,QAAI,gBAAgB,QAAW;AAC7B,aAAO;AAAA,IACT;AAEA,WAAO,yBAAyB,KAAK,WAAW;AAAA,EAClD;AAAA;AAAA;AAAA;AAAA,EAKO,QAAQ;AACb,UAAM,YAAY,KAAK,OAAO,KAAK,OAAO,SAAS,CAAC,KAAK;AAEzD,QAAI,OAAO,cAAc,UAAU;AACjC,aAAO,IAAI,MAAM,SAAS;AAAA,IAC5B;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWO,QAAQ,QAAwB;AACrC,UAAM,gBAAgB,EAAE,GAAG,KAAK,QAAQ,GAAG,GAAI,OAAO,WAAW,CAAC,EAAG;AACrE,UAAM,mBAAmB,IAAI;AAAA,MAC3B,KAAK,QAAQ;AAAA,MACb,OAAO,UAAU,KAAK,OAAO;AAAA,MAC7B,OAAO,WAAW,KAAK,QAAQ;AAAA,MAC/B;AAAA,MACA,OAAO,QAAQ,CAAC,GAAG,KAAK,QAAQ,OAAO,KAAK,IAAI,CAAC,GAAG,KAAK,MAAM;AAAA,IACjE;AACA,qBAAiB,cAAc,KAAK;AAEpC,WAAO;AAAA,EACT;AACF;AAEA,IAAO,mBAAQ;","names":[]}