/**
 * xe-ajax 异步请求库，用于浏览器和 node.js 的 HTTP 客户端
 * MIT License.
 */
declare namespace XEAjax {

  interface AbortSignal extends EventTarget {
      readonly aborted: boolean;
      onabort: ((this: AbortSignal, ev: Event) => any) | null;
  }

  interface AbortController {
      readonly signal: AbortSignal;
      abort(): void;
  }

  export var AbortController: {
      prototype: AbortController;
      new(): AbortController;
  };

  interface Headers {
      append(name: string, value: string): void;
      delete(name: string): void;
      get(name: string): string | null;
      has(name: string): boolean;
      set(name: string, value: string): void;
      forEach(callbackfn: (value: string, key: string, parent: Headers) => void, thisArg?: any): void;
  }

  export var Headers: {
      prototype: Headers;
      new(init?: any): Headers;
  };

  interface Response {
      readonly headers: Headers;
      readonly ok: boolean;
      readonly redirected: boolean;
      readonly status: number;
      readonly statusText: string;
      readonly trailer: Promise<Headers>;
      readonly type: any;
      readonly url: string;
      clone(): Response;
  }

  export interface XEAjaxRequest<T> {
      /**
       * 请求地址
       */
      url?: string;
      /**
       * 基础路径
       */
      baseURL?: string;
      /**
       * 改变目标源
       */
      origin?: string;
      /**
       * 请求方法
       */
      method?: string;
      /**
       * 表单查询参数
       */
      params?: any;
      /**
       * 提交主体内容
       */
      body?: any;
      /**
       * 提交主体内容方式，可以设置json-data,form-data
       */
      bodyType?: string | 'json-data' | 'form-data';
      /**
       * 请求的模式, 可以设置cors,no-cors,same-origin
       */
      mode?: string;
      /**
       * 处理缓存方式,可以设置default,no-store,no-cache,reload,force-cache,only-if-cached
       */
      cache?: string;
      /**
       * 设置 cookie 是否随请求一起发送,可以设置: omit,same-origin,include
       */
      credentials?: string;
      /**
       * 重定向模式, 可以设置follow,error,manual
       */
      redirect?: string;
      /**
       * 可以设置no-referrer,client或URL
       */
      referrer?: string;
      /**
       * 可以设置: no-referrer,no-referrer-when-downgrade,origin,origin-when-cross-origin,unsafe-url
       */
      referrerPolicy?: string;
      /**
       * 选项可用于允许请求超过页面的生存时间
       */
      keepalive?: string;
      /**
       * integrity
       */
      integrity?: string;
      /**
       * jsonp入参属性名
       */
      jsonp?: string;
      /**
       * jsonp响应结果的回调函数名
       */
      jsonpCallback?: string;
      /**
       * 设置请求超时
       */
      timeout?: number;
      /**
       * 请求头包含信息
       */
      headers?: any;
      /**
       * 用于改变URL参数
       */
      transformParams?: (params: any) => any;
      /**
       * 自定义URL序列化函数
       */
      paramsSerializer?: (params: any) => string;
      /**
       * 用于改变提交数据
       */
      transformBody?: (body: any) => any;
      /**
       * 自定义转换提交数据的函数
       */
      stringifyBody?: (body: any) => any;
      /**
       * 自定义校验请求是否成功
       */
      validateStatus?: (response: Response) => boolean;
  }

  export interface XEAjaxResponseSchema<T> {
      /**
       * 响应的数据
       */
      data: any;
      /**
       * 响应的状态码
       */
      status: number;
      /**
       * 响应的状态信息
       */
      statusText: string;
      /**
       * 响应头信息
       */
      headers: any;
  }

  export interface XEProgress<T> {
      autoCompute: boolean;
      fixed: number;
      meanSpeed: number;
      onDownloadProgress: (event: Event) => any;
      onUploadProgress: (event: Event) => any;
      value: number;
      total: number;
      loaded: number;
  }

  export interface XERequestInterceptors {
      /**
       * 请求之前拦截器
       * @param resolve 请求发送之前执行
       */
      use(
          resolve: (
              /**
               * Request 对象
               */
              request: XEAjaxRequest<any>,
              /**
               * 继续执行下一个拦截器
               */
              next: () => void
          ) => void
      ): void;
  }

  interface aResponse {

  }

  export interface XEResponseInterceptors {
      /**
       * 响应之后拦截器
       * @param onRejected 请求完成之后执行
       * @param onRejectd 发生错误之后执行
       */
      use(
          onRejected: (
              /**
               * Response 对象
               */
              response: Response,
              /**
               * 继续执行下一个拦截器
               */
              next: (resp?: any) => void,
              request?: XEAjaxRequest<any>
          ) => void,
          onRejectd?: (
              /**
               * Error 对象
               */
              error: TypeError,
              /**
               * 继续执行下一个拦截器
               */
              next: (resp?: any) => void,
              /**
               * Request 对象
               */
              request?: XEAjaxRequest<any>
          ) => void
      ): void;
  }

  export interface XEAjaxInterceptors {
      /**
       * 请求之前拦截器
       */
      request: XERequestInterceptors;
      /**
       * 响应之后拦截器
       */
      response: XEResponseInterceptors;
  }

  export interface PluginObject<T> {
      install(xAjax: typeof XEAjax): any;
  }

  export var version: string;
  /**
   * 安装插件
   * @param plugin 插件
   * @param options 参数
   */
  export function use(plugin: PluginObject<any>, ...options: any[]): void;

  /**
   * 设置全局参数
   * @param options 全局参数
   */
  export function setup(options: XEAjaxRequest<any>): void;

  /**
   * 允许用您自己的实用函数扩展到 XEAjax
   * @param methods 扩展函数集
   */
  export function mixin(methods: any): void;

  /**
   * 将表单序列化为可以在 Ajax 请求中发送到服务器的查询字符串。
   * @param params 表单参数
   */
  export function serialize(params: any): string;

  /**
   * 请求之前、响应之后拦截器
   * @since 3.0.0
   */
  export var interceptors: XEAjaxInterceptors;

  /**
   * 上传、下载进度监听
   * @since 3.4.9
   */
  export var Progress: XEProgress<any>;

  /**
   * 取消控制器
   * @since 3.2.0
   */
  export var AbortController: typeof AbortController;

  /**
   * @param options 请求参数
   */
  export function ajax(options: XEAjaxRequest<any>): Promise<Response>;

  /**
   * doAll 使用对象参数, 用法和 Promise.all 一致
   * @param iterable 对象数组 或 Promise 数组
   */
  export function doAll(iterable: any[]): Promise<any[]>;

  /**
   * 发送 Jsonp 请求，返回一个结果为 Response 的 Promise 对象
   * @param url 请求地址
   * @param params 表单查询参数
   * @param options 可选参数
   */
  export function fetchJsonp(url: string, params?: any, options?: XEAjaxRequest<any>): Promise<Response>;

  /**
   * 发送 GET 请求，返回一个结果为 Response 的 Promise 对象
   * @param url 请求地址
   * @param params 表单查询参数
   * @param options 可选参数
   */
  export function fetchGet(url: string, params?: any, options?: XEAjaxRequest<any>): Promise<Response>;

  /**
   * 发送 POST 请求，返回一个结果为 Response 的 Promise 对象
   * @param url 请求地址
   * @param body 表单提交参数
   * @param options 可选参数
   */
  export function fetchPost(url: string, body?: any, options?: XEAjaxRequest<any>): Promise<Response>;

  /**
   * 发送 PUT 请求，返回一个结果为 Response 的 Promise 对象
   * @param url 请求地址
   * @param body 表单提交参数
   * @param options 可选参数
   */
  export function fetchPut(url: string, body?: any, options?: XEAjaxRequest<any>): Promise<Response>;

  /**
   * 发送 DELETE 请求，返回一个结果为 Response 的 Promise 对象
   * @param url 请求地址
   * @param options 可选参数
   */
  export function fetchDelete(url: string, options?: XEAjaxRequest<any>): Promise<Response>;

  /**
   * 发送 PATCH 请求，返回一个结果为 Response 的 Promise 对象
   * @param url 请求地址
   * @param options 可选参数
   */
  export function fetchPatch(url: string, options?: XEAjaxRequest<any>): Promise<Response>;

  /**
   * 发送 HEAD 请求，返回一个结果为 Response 的 Promise 对象
   * @param url 请求地址
   * @param options 可选参数
   */
  export function fetchHead(url: string, options?: XEAjaxRequest<any>): Promise<Response>;

  /**
   * 发送请求，返回一个结果为 Response 的 Promise 对象
   * @param url 请求地址
   * @param options 可选参数
   */
  export function fetch(url: string, options?: XEAjaxRequest<any>): Promise<Response>;

  /**
   * 发送 Jsonp 请求，返回一个包含响应信息的 Peomise 对象
   * @param url 请求地址
   * @param params 表单查询参数
   * @param options 可选参数
   * @since 3.4.0
   */
  export function doJsonp(url: string, params?: any, options?: XEAjaxRequest<any>): Promise<XEAjaxResponseSchema<any>>;

  /**
   * 发送 GET 请求，返回一个包含响应信息的 Peomise 对象
   * @param url 请求地址
   * @param params 表单查询参数
   * @param options 可选参数
   * @since 3.4.0
   */
  export function doGet(url: string, params?: any, options?: XEAjaxRequest<any>): Promise<XEAjaxResponseSchema<any>>;

  /**
   * 发送 POST 请求，返回一个包含响应信息的 Peomise 对象
   * @param url 请求地址
   * @param body 表单提交参数
   * @param options 可选参数
   * @since 3.4.0
   */
  export function doPost(url: string, body?: any, options?: XEAjaxRequest<any>): Promise<XEAjaxResponseSchema<any>>;

  /**
   * 发送 PUT 请求，返回一个包含响应信息的 Peomise 对象
   * @param url 请求地址
   * @param body 表单提交参数
   * @param options 可选参数
   * @since 3.4.0
   */
  export function doPut(url: string, body?: any, options?: XEAjaxRequest<any>): Promise<XEAjaxResponseSchema<any>>;

  /**
   * 发送 DELETE 请求，返回一个包含响应信息的 Peomise 对象
   * @param url 请求地址
   * @param options 可选参数
   * @since 3.4.0
   */
  export function doDelete(url: string, options?: XEAjaxRequest<any>): Promise<XEAjaxResponseSchema<any>>;

  /**
   * 发送 PATCH 请求，返回一个包含响应信息的 Peomise 对象
   * @param url 请求地址
   * @param options 可选参数
   * @since 3.4.0
   */
  export function doPatch(url: string, options?: XEAjaxRequest<any>): Promise<XEAjaxResponseSchema<any>>;

  /**
   * 发送 HEAD 请求，返回一个包含响应信息的 Peomise 对象
   * @param url 请求地址
   * @param options 可选参数
   * @since 3.4.0
   */
  export function doHead(url: string, options?: XEAjaxRequest<any>): Promise<XEAjaxResponseSchema<any>>;

  /**
   * 发送 Jsonp 请求，返回响应结果为 JSON 的 Peomise 对象
   * @param url 请求地址
   * @param params 表单查询参数
   * @param options 可选参数
   */
  export function jsonp(url: string, params?: any, options?: XEAjaxRequest<any>): Promise<any>;


  /**
   * 发送 GET 请求，返回响应结果为 JSON 的 Peomise 对象
   * @param url 请求地址
   * @param params 表单查询参数
   * @param options 可选参数
   */
  export function getJSON(url: string, params?: any, options?: XEAjaxRequest<any>): Promise<any>;

  /**
   * 发送 POST 请求，返回响应结果为 JSON 的 Peomise 对象
   * @param url 请求地址
   * @param body 表单提交参数
   * @param options 可选参数
   */
  export function postJSON(url: string, body?: any, options?: XEAjaxRequest<any>): Promise<any>;


  /**
   * 发送 PUT 请求，返回响应结果为 JSON 的 Peomise 对象
   * @param url 请求地址
   * @param body 表单提交参数
   * @param options 可选参数
   */
  export function putJSON(url: string, body?: any, options?: XEAjaxRequest<any>): Promise<any>;

  /**
   * 发送 DELETE 请求，返回响应结果为 JSON 的 Peomise 对象
   * @param url 请求地址
   * @param options 可选参数
   */
  export function deleteJSON(url: string, options?: XEAjaxRequest<any>): Promise<any>;

  /**
   * 发送 PATCH 请求，返回响应结果为 JSON 的 Peomise 对象
   * @param url 请求地址
   * @param options 可选参数
   */
  export function patchJSON(url: string, options?: XEAjaxRequest<any>): Promise<any>;

  /**
   * 发送 HEAD 请求，返回响应结果为 JSON 的 Peomise 对象
   * @param url 请求地址
   * @param options 可选参数
   */
  export function headJSON(url: string, options?: XEAjaxRequest<any>): Promise<any>;

  /**
   * 发送 GET 请求，返回响应结果为 JSON 的 Peomise 对象
   * @param url 请求地址
   * @param params 表单查询参数
   * @param options 可选参数
   */
  export function get(url: string, params?: any, options?: XEAjaxRequest<any>): Promise<any>;

  /**
   * 发送 POST 请求，返回响应结果为 JSON 的 Peomise 对象
   * @param url 请求地址
   * @param body 表单提交参数
   * @param options 可选参数
   */
  export function post(url: string, body?: any, options?: XEAjaxRequest<any>): Promise<any>;

  /**
   * 发送 PUT 请求，返回响应结果为 JSON 的 Peomise 对象
   * @param url 请求地址
   * @param body 表单提交参数
   * @param options 可选参数
   */
  export function put(url: string, body?: any, options?: XEAjaxRequest<any>): Promise<any>;

  /**
   * 发送 PATCH 请求，返回响应结果为 JSON 的 Peomise 对象
   * @param url 请求地址
   * @param options 可选参数
   */
  export function patch(url: string, options?: XEAjaxRequest<any>): Promise<any>;

  /**
   * 发送 HEAD 请求，返回响应结果为 JSON 的 Peomise 对象
   * @param url 请求地址
   * @param options 可选参数
   */
  export function head(url: string, options?: XEAjaxRequest<any>): Promise<any>;

}