优化代码

pull/1/head
early-autumn 2020-04-24 09:24:43 +08:00
parent 796b80370a
commit 8d21d89dc8
15 changed files with 150 additions and 207 deletions

21
.vscode/launch.json vendored Normal file
View File

@ -0,0 +1,21 @@
{
// 使 IntelliSense
//
// 访: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"type": "node",
"name": "vscode-jest-tests",
"request": "launch",
"args": [
"--runInBand"
],
"cwd": "${workspaceFolder}",
"console": "integratedTerminal",
"internalConsoleOptions": "neverOpen",
"disableOptimisticBPs": true,
"program": "${workspaceFolder}/node_modules/jest/bin/jest"
}
]
}

View File

@ -37,7 +37,9 @@
}, },
"keywords": [ "keywords": [
"axios", "axios",
"miniprogram" "miniprogram",
"request",
"promise"
], ],
"author": "early-autumn", "author": "early-autumn",
"license": "MIT", "license": "MIT",

View File

@ -2,7 +2,7 @@
* @Author: early-autumn * @Author: early-autumn
* @Date: 2020-04-17 12:18:25 * @Date: 2020-04-17 12:18:25
* @LastEditors: early-autumn * @LastEditors: early-autumn
* @LastEditTime: 2020-04-22 13:24:28 * @LastEditTime: 2020-04-23 10:53:50
*/ */
import { Adapter, Platform } from './types'; import { Adapter, Platform } from './types';
@ -19,24 +19,24 @@ declare let tt: Platform;
// QQ 小程序 // QQ 小程序
declare let qq: Platform; declare let qq: Platform;
const stack = [ /**
*
*/
function adaptive(): Adapter | undefined {
const stack = [
() => uni.request, () => uni.request,
() => wx.request, () => wx.request,
() => my.request, () => my.request,
() => swan.request, () => swan.request,
() => tt.request, () => tt.request,
() => qq.request, () => qq.request,
]; ];
/**
*
*/
function adaptive(): Adapter | undefined {
let adapter: Adapter | undefined; let adapter: Adapter | undefined;
while (stack.length !== 0 && adapter === undefined) { while (stack.length !== 0 && adapter === undefined) {
try { try {
adapter = (stack.shift() as () => Adapter | undefined)(); adapter = stack.shift()?.();
} catch (err) {} } catch (err) {}
} }

View File

@ -2,7 +2,7 @@
* @Author: early-autumn * @Author: early-autumn
* @Date: 2020-04-15 12:45:18 * @Date: 2020-04-15 12:45:18
* @LastEditors: early-autumn * @LastEditors: early-autumn
* @LastEditTime: 2020-04-23 10:44:18 * @LastEditTime: 2020-04-24 09:16:56
*/ */
import { AxiosRequestConfig, Data, AxiosResponse, AxiosBaseInstance, AxiosInstance } from './types'; import { AxiosRequestConfig, Data, AxiosResponse, AxiosBaseInstance, AxiosInstance } from './types';
import Axios from './core/Axios'; import Axios from './core/Axios';
@ -16,8 +16,8 @@ import defaults from './defaults';
* *
* Axios * Axios
*/ */
function createInstance(config: AxiosRequestConfig): AxiosInstance { function createInstance(defaults: AxiosRequestConfig = {}): AxiosInstance {
const instance = new Axios(config); const instance = new Axios(defaults);
/** /**
* axios * axios
@ -26,18 +26,16 @@ function createInstance(config: AxiosRequestConfig): AxiosInstance {
url: AxiosRequestConfig | string, url: AxiosRequestConfig | string,
config: AxiosRequestConfig = {} config: AxiosRequestConfig = {}
): Promise<AxiosResponse<T>> { ): Promise<AxiosResponse<T>> {
let requestConfig: AxiosRequestConfig;
// 调用方式一处理请求配置 // 调用方式一处理请求配置
if (typeof url !== 'string') { if (typeof url !== 'string') {
requestConfig = url; config = url;
} }
// 调用方式二处理请求配置 // 调用方式二处理请求配置
else { else {
requestConfig = { ...config, url }; config = { ...config, url };
} }
return instance.request(requestConfig); return instance.request(config);
} }
// instance 的属性合并到 axios 函数中 // instance 的属性合并到 axios 函数中
@ -54,8 +52,8 @@ function createInstance(config: AxiosRequestConfig): AxiosInstance {
const axios = createInstance(defaults); const axios = createInstance(defaults);
// 添加 create 工厂方法 // 添加 create 工厂方法
axios.create = function create(config: AxiosRequestConfig = {}): AxiosBaseInstance { axios.create = function create(defaults: AxiosRequestConfig = {}): AxiosBaseInstance {
return createInstance(mergeConfig(axios.defaults, config)); return createInstance(mergeConfig(axios.defaults, defaults));
}; };
// 添加 Axios 类 // 添加 Axios 类
@ -68,3 +66,11 @@ axios.CancelToken = CancelToken;
axios.isCancel = isCancel; axios.isCancel = isCancel;
export default axios; export default axios;
export type En<T, U> = T extends U ? never : T;
export type Enn = En<number | string, string>;
export type Eni<T, U> = T extends U ? T : never;
export type Enni = Eni<number | string, string>;

View File

@ -2,16 +2,15 @@
* @Author: early-autumn * @Author: early-autumn
* @Date: 2020-04-13 21:14:53 * @Date: 2020-04-13 21:14:53
* @LastEditors: early-autumn * @LastEditors: early-autumn
* @LastEditTime: 2020-04-22 17:38:43 * @LastEditTime: 2020-04-23 20:56:34
*/ */
import { Cancel } from '../types'; import { Cancel } from '../types';
export default class CancelStatic implements Cancel { export default class CancelStatic implements Cancel {
public message?: string; /**
* @param message
constructor(message?: string) { */
this.message = message; constructor(public message?: string) {}
}
public toString() { public toString() {
const message = this.message ? `: ${this.message}` : ''; const message = this.message ? `: ${this.message}` : '';

View File

@ -2,7 +2,7 @@
* @Author: early-autumn * @Author: early-autumn
* @Date: 2020-04-14 09:23:25 * @Date: 2020-04-14 09:23:25
* @LastEditors: early-autumn * @LastEditors: early-autumn
* @LastEditTime: 2020-04-20 15:15:27 * @LastEditTime: 2020-04-23 22:44:43
*/ */
import Cancel from './Cancel'; import Cancel from './Cancel';
@ -11,6 +11,6 @@ import Cancel from './Cancel';
* *
* @param value * @param value
*/ */
export default function isCancel(value: any): boolean { export default function isCancel(value: any): value is Cancel {
return !!value && value instanceof Cancel; return value instanceof Cancel;
} }

View File

@ -2,7 +2,7 @@
* @Author: early-autumn * @Author: early-autumn
* @Date: 2020-04-13 18:00:27 * @Date: 2020-04-13 18:00:27
* @LastEditors: early-autumn * @LastEditors: early-autumn
* @LastEditTime: 2020-04-23 10:12:56 * @LastEditTime: 2020-04-23 23:43:00
*/ */
import { Method, Params, Data, Interceptors, AxiosRequestConfig, AxiosResponse, Axios } from '../types'; import { Method, Params, Data, Interceptors, AxiosRequestConfig, AxiosResponse, Axios } from '../types';
import buildURL from '../helpers/buildURL'; import buildURL from '../helpers/buildURL';
@ -11,26 +11,18 @@ import InterceptorManager from './InterceptorManager';
import dispatchRequest from './dispatchRequest'; import dispatchRequest from './dispatchRequest';
export default class AxiosStatic implements Axios { export default class AxiosStatic implements Axios {
/**
*
*/
public defaults: AxiosRequestConfig;
/** /**
* Axios * Axios
*/ */
public interceptors: Interceptors; public interceptors: Interceptors = {
/**
* @param config
*/
constructor(config: AxiosRequestConfig = {}) {
this.defaults = config;
this.interceptors = {
request: new InterceptorManager<AxiosRequestConfig>(), request: new InterceptorManager<AxiosRequestConfig>(),
response: new InterceptorManager<AxiosResponse>(), response: new InterceptorManager<AxiosResponse>(),
}; };
}
/**
* @param defaults
*/
constructor(public defaults: AxiosRequestConfig = {}) {}
/** /**
* url params URI * url params URI

View File

@ -2,7 +2,7 @@
* @Author: early-autumn * @Author: early-autumn
* @Date: 2020-04-15 17:50:50 * @Date: 2020-04-15 17:50:50
* @LastEditors: early-autumn * @LastEditors: early-autumn
* @LastEditTime: 2020-04-23 09:16:23 * @LastEditTime: 2020-04-23 20:54:24
*/ */
import { import {
InterceptorResolved, InterceptorResolved,
@ -19,17 +19,12 @@ export default class InterceptorManagerStatic<T> implements InterceptorManager<T
/** /**
* id * id
*/ */
private _id: number; private _id = 0;
/** /**
* *
*/ */
private _interceptors: Record<number, Interceptor<T>>; private _interceptors: Record<number, Interceptor<T>> = {};
constructor() {
this._id = 0;
this._interceptors = {};
}
/** /**
* *

View File

@ -2,7 +2,7 @@
* @Author: early-autumn * @Author: early-autumn
* @Date: 2020-04-14 22:23:39 * @Date: 2020-04-14 22:23:39
* @LastEditors: early-autumn * @LastEditors: early-autumn
* @LastEditTime: 2020-04-23 10:34:18 * @LastEditTime: 2020-04-23 23:47:26
*/ */
import { AxiosRequestConfig, RequestConfig, AxiosResponse } from '../types'; import { AxiosRequestConfig, RequestConfig, AxiosResponse } from '../types';
@ -13,22 +13,7 @@ class AxiosError extends Error {
/** /**
* Axios * Axios
*/ */
public isAxiosError: boolean; public isAxiosError = true;
/**
* Axios
*/
public config: AxiosRequestConfig;
/**
*
*/
public request: RequestConfig;
/**
* Axios
*/
public response?: AxiosResponse;
/** /**
* @param message * @param message
@ -36,14 +21,14 @@ class AxiosError extends Error {
* @param request * @param request
* @param response Axios * @param response Axios
*/ */
constructor(message: string, config: AxiosRequestConfig, request: RequestConfig, response?: AxiosResponse) { constructor(
message: string,
public config: AxiosRequestConfig,
public request: RequestConfig,
public response?: AxiosResponse
) {
super(message); super(message);
this.isAxiosError = true;
this.config = config;
this.request = request;
this.response = response;
// 修复继承系统自带类 prototype 设置失败的问题 // 修复继承系统自带类 prototype 设置失败的问题
Object.setPrototypeOf(this, AxiosError.prototype); Object.setPrototypeOf(this, AxiosError.prototype);
} }

View File

@ -2,11 +2,31 @@
* @Author: early-autumn * @Author: early-autumn
* @Date: 2020-04-15 22:48:25 * @Date: 2020-04-15 22:48:25
* @LastEditors: early-autumn * @LastEditors: early-autumn
* @LastEditTime: 2020-04-21 10:43:39 * @LastEditTime: 2020-04-23 23:55:19
*/ */
import { AnyObject, AxiosRequestConfig } from '../types'; import { AnyObject, AxiosRequestConfig } from '../types';
import { isPlainObject, deepMerge } from '../helpers/utils'; import { isPlainObject, deepMerge } from '../helpers/utils';
type OnlyFromConfig2Key = 'url' | 'data';
type PriorityFromConfig2Key =
| 'adapter'
| 'baseURL'
| 'method'
| 'validateStatus'
| 'paramsSerializer'
| 'transformRequest'
| 'transformResponse'
| 'errorHandler'
| 'cancelToken'
| 'dataType'
| 'responseType'
| 'timeout'
| 'enableHttp2'
| 'enableQuic'
| 'enableCache'
| 'sslVerify';
type DeepMergeConfigKey = 'params' | 'headers';
/** /**
* config2 * config2
* *
@ -14,7 +34,7 @@ import { isPlainObject, deepMerge } from '../helpers/utils';
* @param config * @param config
* @param config2 * @param config2
*/ */
function onlyFromConfig2(keys: ['url', 'data'], config: AxiosRequestConfig, config2: AxiosRequestConfig) { function onlyFromConfig2(keys: OnlyFromConfig2Key[], config: AxiosRequestConfig, config2: AxiosRequestConfig) {
keys.forEach((key) => { keys.forEach((key) => {
if (config2[key] !== undefined) { if (config2[key] !== undefined) {
config[key] = config2[key] as any; config[key] = config2[key] as any;
@ -31,24 +51,7 @@ function onlyFromConfig2(keys: ['url', 'data'], config: AxiosRequestConfig, conf
* @param config2 * @param config2
*/ */
function priorityFromConfig2( function priorityFromConfig2(
keys: [ keys: PriorityFromConfig2Key[],
'adapter',
'baseURL',
'method',
'validateStatus',
'paramsSerializer',
'transformRequest',
'transformResponse',
'errorHandler',
'cancelToken',
'dataType',
'responseType',
'timeout',
'enableHttp2',
'enableQuic',
'enableCache',
'sslVerify'
],
config: AxiosRequestConfig, config: AxiosRequestConfig,
config1: AxiosRequestConfig, config1: AxiosRequestConfig,
config2: AxiosRequestConfig config2: AxiosRequestConfig
@ -71,7 +74,7 @@ function priorityFromConfig2(
* @param config2 * @param config2
*/ */
function deepMergeConfig( function deepMergeConfig(
keys: ['headers', 'params'], keys: DeepMergeConfigKey[],
config: AxiosRequestConfig, config: AxiosRequestConfig,
config1: AxiosRequestConfig, config1: AxiosRequestConfig,
config2: AxiosRequestConfig config2: AxiosRequestConfig
@ -96,10 +99,8 @@ export default function mergeConfig(
config2: AxiosRequestConfig = {} config2: AxiosRequestConfig = {}
): AxiosRequestConfig { ): AxiosRequestConfig {
const config: AxiosRequestConfig = {}; const config: AxiosRequestConfig = {};
const onlyFromConfig2Keys: OnlyFromConfig2Key[] = ['url', 'data'];
onlyFromConfig2(['url', 'data'], config, config2); const priorityFromConfig2Keys: PriorityFromConfig2Key[] = [
priorityFromConfig2(
[
'adapter', 'adapter',
'baseURL', 'baseURL',
'method', 'method',
@ -116,12 +117,12 @@ export default function mergeConfig(
'enableQuic', 'enableQuic',
'enableCache', 'enableCache',
'sslVerify', 'sslVerify',
], ];
config, const deepMergeConfigKeys: DeepMergeConfigKey[] = ['headers', 'params'];
config1,
config2 onlyFromConfig2(onlyFromConfig2Keys, config, config2);
); priorityFromConfig2(priorityFromConfig2Keys, config, config1, config2);
deepMergeConfig(['headers', 'params'], config, config1, config2); deepMergeConfig(deepMergeConfigKeys, config, config1, config2);
return config; return config;
} }

View File

@ -2,14 +2,14 @@
* @Author: early-autumn * @Author: early-autumn
* @Date: 2020-04-16 22:37:44 * @Date: 2020-04-16 22:37:44
* @LastEditors: early-autumn * @LastEditors: early-autumn
* @LastEditTime: 2020-04-17 13:42:13 * @LastEditTime: 2020-04-23 23:09:24
*/ */
import { Data, Headers, TransformData } from '../types'; import { Data, Headers, TransformData } from '../types';
/** /**
* *
* *
* @param data * @param data
* @param headers * @param headers
* @param transforms * @param transforms
*/ */

View File

@ -2,7 +2,7 @@
* @Author: early-autumn * @Author: early-autumn
* @Date: 2020-04-17 15:05:43 * @Date: 2020-04-17 15:05:43
* @LastEditors: early-autumn * @LastEditors: early-autumn
* @LastEditTime: 2020-04-20 13:41:15 * @LastEditTime: 2020-04-24 08:53:57
*/ */
import { AxiosRequestConfig, RequestConfig } from '../types'; import { AxiosRequestConfig, RequestConfig } from '../types';
import { pick } from '../helpers/utils'; import { pick } from '../helpers/utils';
@ -11,17 +11,6 @@ import combineURL from '../helpers/combineURL';
import buildURL from '../helpers/buildURL'; import buildURL from '../helpers/buildURL';
import { methodToUppercase } from './transformMethod'; import { methodToUppercase } from './transformMethod';
type PickKeys =
| 'data'
| 'headers'
| 'dataType'
| 'responseType'
| 'timeout'
| 'enableHttp2'
| 'enableQuic'
| 'enableCache'
| 'sslVerify';
/** /**
* baseURL url params URL * baseURL url params URL
* *
@ -42,9 +31,11 @@ function transformURL(config: AxiosRequestConfig): string {
* @param config Axios * @param config Axios
*/ */
export default function transformRequest(config: AxiosRequestConfig): RequestConfig { export default function transformRequest(config: AxiosRequestConfig): RequestConfig {
const url = transformURL(config); return {
const method = methodToUppercase(config.method); url: transformURL(config),
const pickRequest = pick<AxiosRequestConfig, PickKeys>( method: methodToUppercase(config.method),
header: config.headers,
...pick(
config, config,
'data', 'data',
'headers', 'headers',
@ -55,12 +46,6 @@ export default function transformRequest(config: AxiosRequestConfig): RequestCon
'enableQuic', 'enableQuic',
'enableCache', 'enableCache',
'sslVerify' 'sslVerify'
); ),
return {
url,
method,
header: config.headers,
...pickRequest,
} as RequestConfig; } as RequestConfig;
} }

View File

@ -2,7 +2,7 @@
* @Author: early-autumn * @Author: early-autumn
* @Date: 2020-04-17 14:09:16 * @Date: 2020-04-17 14:09:16
* @LastEditors: early-autumn * @LastEditors: early-autumn
* @LastEditTime: 2020-04-22 13:06:27 * @LastEditTime: 2020-04-24 08:54:42
*/ */
import { AxiosRequestConfig, AxiosResponse, Response } from '../types'; import { AxiosRequestConfig, AxiosResponse, Response } from '../types';
import { pick } from '../helpers/utils'; import { pick } from '../helpers/utils';
@ -26,6 +26,6 @@ export default function transformResponse(response: Response, config: AxiosReque
statusText, statusText,
headers, headers,
config, config,
...pick<Response, 'data' | 'cookies' | 'profile'>(response, 'data', 'cookies', 'profile'), ...pick(response, 'data', 'cookies', 'profile'),
}; };
} }

View File

@ -2,7 +2,7 @@
* @Author: early-autumn * @Author: early-autumn
* @Date: 2020-04-13 21:55:40 * @Date: 2020-04-13 21:55:40
* @LastEditors: early-autumn * @LastEditors: early-autumn
* @LastEditTime: 2020-04-22 13:02:06 * @LastEditTime: 2020-04-23 22:38:30
*/ */
import { AnyObject } from '../types'; import { AnyObject } from '../types';

View File

@ -2,13 +2,15 @@
* @Author: early-autumn * @Author: early-autumn
* @Date: 2020-04-13 15:23:53 * @Date: 2020-04-13 15:23:53
* @LastEditors: early-autumn * @LastEditors: early-autumn
* @LastEditTime: 2020-04-23 10:43:58 * @LastEditTime: 2020-04-24 09:00:02
*/ */
/** /**
* *
*/ */
export declare type AnyObject<T extends any = any> = Record<string, T>; export declare interface AnyObject<T extends any = any> {
[x: string]: T;
}
/** /**
* *
@ -38,52 +40,7 @@ export declare type Data = string | AnyObject | ArrayBuffer;
/** /**
* Axios * Axios
*/ */
export declare interface Headers { export declare interface Headers extends Partial<Record<'common' | AliasMethod, AnyObject<string>>> {
/**
*
*/
common?: AnyObject<string>;
/**
* options
*/
options?: AnyObject<string>;
/**
* get
*/
get?: AnyObject<string>;
/**
* head
*/
head?: AnyObject<string>;
/**
* post
*/
post?: AnyObject<string>;
/**
* put
*/
put?: AnyObject<string>;
/**
* delete
*/
delete?: AnyObject<string>;
/**
* trace
*/
trace?: AnyObject<string>;
/**
* connect
*/
connect?: AnyObject<string>;
/** /**
* *
*/ */
@ -727,7 +684,7 @@ export declare interface AxiosInstance extends AxiosBaseInstance {
* *
* @param config * @param config
*/ */
create(config?: AxiosRequestConfig): AxiosBaseInstance; create(defaults?: AxiosRequestConfig): AxiosBaseInstance;
/** /**
* Axios * Axios