优化代码

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": [
"axios",
"miniprogram"
"miniprogram",
"request",
"promise"
],
"author": "early-autumn",
"license": "MIT",

View File

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

View File

@ -2,7 +2,7 @@
* @Author: early-autumn
* @Date: 2020-04-15 12:45:18
* @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 Axios from './core/Axios';
@ -16,8 +16,8 @@ import defaults from './defaults';
*
* Axios
*/
function createInstance(config: AxiosRequestConfig): AxiosInstance {
const instance = new Axios(config);
function createInstance(defaults: AxiosRequestConfig = {}): AxiosInstance {
const instance = new Axios(defaults);
/**
* axios
@ -26,18 +26,16 @@ function createInstance(config: AxiosRequestConfig): AxiosInstance {
url: AxiosRequestConfig | string,
config: AxiosRequestConfig = {}
): Promise<AxiosResponse<T>> {
let requestConfig: AxiosRequestConfig;
// 调用方式一处理请求配置
if (typeof url !== 'string') {
requestConfig = url;
config = url;
}
// 调用方式二处理请求配置
else {
requestConfig = { ...config, url };
config = { ...config, url };
}
return instance.request(requestConfig);
return instance.request(config);
}
// instance 的属性合并到 axios 函数中
@ -54,8 +52,8 @@ function createInstance(config: AxiosRequestConfig): AxiosInstance {
const axios = createInstance(defaults);
// 添加 create 工厂方法
axios.create = function create(config: AxiosRequestConfig = {}): AxiosBaseInstance {
return createInstance(mergeConfig(axios.defaults, config));
axios.create = function create(defaults: AxiosRequestConfig = {}): AxiosBaseInstance {
return createInstance(mergeConfig(axios.defaults, defaults));
};
// 添加 Axios 类
@ -68,3 +66,11 @@ axios.CancelToken = CancelToken;
axios.isCancel = isCancel;
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
* @Date: 2020-04-13 21:14:53
* @LastEditors: early-autumn
* @LastEditTime: 2020-04-22 17:38:43
* @LastEditTime: 2020-04-23 20:56:34
*/
import { Cancel } from '../types';
export default class CancelStatic implements Cancel {
public message?: string;
constructor(message?: string) {
this.message = message;
}
/**
* @param message
*/
constructor(public message?: string) {}
public toString() {
const message = this.message ? `: ${this.message}` : '';

View File

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

View File

@ -2,7 +2,7 @@
* @Author: early-autumn
* @Date: 2020-04-13 18:00:27
* @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 buildURL from '../helpers/buildURL';
@ -11,26 +11,18 @@ import InterceptorManager from './InterceptorManager';
import dispatchRequest from './dispatchRequest';
export default class AxiosStatic implements Axios {
/**
*
*/
public defaults: AxiosRequestConfig;
/**
* Axios
*/
public interceptors: Interceptors;
/**
* @param config
*/
constructor(config: AxiosRequestConfig = {}) {
this.defaults = config;
this.interceptors = {
public interceptors: Interceptors = {
request: new InterceptorManager<AxiosRequestConfig>(),
response: new InterceptorManager<AxiosResponse>(),
};
}
/**
* @param defaults
*/
constructor(public defaults: AxiosRequestConfig = {}) {}
/**
* url params URI

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -2,13 +2,15 @@
* @Author: early-autumn
* @Date: 2020-04-13 15:23:53
* @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
*/
export declare interface Headers {
/**
*
*/
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>;
export declare interface Headers extends Partial<Record<'common' | AliasMethod, AnyObject<string>>> {
/**
*
*/
@ -727,7 +684,7 @@ export declare interface AxiosInstance extends AxiosBaseInstance {
*
* @param config
*/
create(config?: AxiosRequestConfig): AxiosBaseInstance;
create(defaults?: AxiosRequestConfig): AxiosBaseInstance;
/**
* Axios