repo_description: Promise based HTTP client for the browser and node.js
repo_topics: hacktoberfest http-client javascript nodejs promise
code: 'use strict';
  
  import utils from '../utils.js';
  
  class AxiosError extends Error {
    static from(error, code, config, request, response, customProps) {
      const axiosError = new AxiosError(error.message, code || error.code, config, request, response);
      axiosError.cause = error;
      axiosError.name = error.name;
  
      // Preserve status from the original error if not already set from response
      if (error.status != null && axiosError.status == null) {
        axiosError.status = error.status;
      }
  
      customProps && Object.assign(axiosError, customProps);
      return axiosError;
    }
  
    /**
     * Create an Error with the specified message, config, error code, request and response.
     *
     * @param {string} message The error message.
     * @param {string} [code] The error code (for example, 'ECONNABORTED').
     * @param {Object} [config] The config.
     * @param {Object} [request] The request.
     * @param {Object} [response] The response.
     *
     * @returns {Error} The created error.
     */
    constructor(message, code, config, request, response) {
      super(message);
  
      // Make message enumerable to maintain backward compatibility
      // The native Error constructor sets message as non-enumerable,
      // but axios < v1.13.3 had it as enumerable
      Object.defineProperty(this, 'message', {
        value: message,
        enumerable: true,
        writable: true,
        configurable: true,
      });
  
      this.name = 'AxiosError';
      this.isAxiosError = true;
      code && (this.code = code);
      config && (this.config = config);
      request && (this.request = request);
      if (response) {
        this.response = response;
        this.status = response.status;
      }
    }
  
    toJSON() {
      return {
        // Standard
        message: this.message,
        name: this.name,
        // Microsoft
        description: this.description,
        number: this.number,
        // Mozilla
        fileName: this.fileName,
        lineNumber: this.lineNumber,
        columnNumber: this.columnNumber,
        stack: this.stack,
        // Axios
        config: utils.toJSONObject(this.config),
        code: this.code,
        status: this.status,
      };
    }
  }
  
  // This can be changed to static properties as soon as the parser options in .eslint.cjs are updated.
  AxiosError.ERR_BAD_OPTION_VALUE = 'ERR_BAD_OPTION_VALUE';
  AxiosError.ERR_BAD_OPTION = 'ERR_BAD_OPTION';
  AxiosError.ECONNABORTED = 'ECONNABORTED';
  AxiosError.ETIMEDOUT = 'ETIMEDOUT';
  AxiosError.ERR_NETWORK = 'ERR_NETWORK';
  AxiosError.ERR_FR_TOO_MANY_REDIRECTS = 'ERR_FR_TOO_MANY_REDIRECTS';
  AxiosError.ERR_DEPRECATED = 'ERR_DEPRECATED';
  AxiosError.ERR_BAD_RESPONSE = 'ERR_BAD_RESPONSE';
  AxiosError.ERR_BAD_REQUEST = 'ERR_BAD_REQUEST';
  AxiosError.ERR_CANCELED = 'ERR_CANCELED';
  AxiosError.ERR_NOT_SUPPORT = 'ERR_NOT_SUPPORT';
  AxiosError.ERR_INVALID_URL = 'ERR_INVALID_URL';
  AxiosError.ERR_FORM_DATA_DEPTH_EXCEEDED = 'ERR_FORM_DATA_DEPTH_EXCEEDED';
  
  export default AxiosError;
  