axios-miniprogram/src/core/AxiosDomain.ts

183 lines
3.7 KiB
TypeScript
Raw Normal View History

import { isString, isUndefined } from '../helpers/isTypes';
2023-04-07 12:39:23 +08:00
import { deepMerge } from '../helpers/deepMerge';
import { mergeConfig } from './mergeConfig';
2023-04-09 15:20:10 +08:00
import {
AxiosRequestConfig,
AxiosRequestData,
AxiosResponse,
AxiosResponseData,
} from './Axios';
/**
*
*/
2023-04-07 08:47:54 +08:00
export interface AxiosDomainRequest {
<TData extends AxiosResponseData>(config: AxiosRequestConfig): Promise<
AxiosResponse<TData>
>;
2023-04-09 15:20:10 +08:00
<TData extends AxiosResponseData>(
url: string,
config?: AxiosRequestConfig,
): Promise<AxiosResponse<TData>>;
2023-04-07 08:47:54 +08:00
}
/**
*
*/
export type AxiosDomainRequestMethod = <TData extends AxiosResponseData>(
url: string,
config?: AxiosRequestConfig,
) => Promise<AxiosResponse<TData>>;
/**
*
*/
export type AxiosDomainRequestMethodWithParams = <
TData extends AxiosResponseData,
>(
url: string,
params?: AnyObject,
config?: AxiosRequestConfig,
) => Promise<AxiosResponse<TData>>;
/**
*
*/
export type AxiosDomainRequestMethodWithData = <
TData extends AxiosResponseData,
>(
url: string,
data?: AxiosRequestData,
config?: AxiosRequestConfig,
) => Promise<AxiosResponse<TData>>;
2023-04-18 19:50:40 +08:00
/**
*
*/
export const requestMethodNames = ['options', 'trace', 'connect'] as const;
2023-04-18 19:50:40 +08:00
/**
*
*/
export const requestMethodWithParamsNames = ['head', 'get', 'delete'] as const;
2023-04-18 19:50:40 +08:00
/**
*
*/
export const requestMethodWithDataNames = ['post', 'put', 'patch'] as const;
2023-04-18 19:50:40 +08:00
export default class AxiosDomain {
/**
*
*/
defaults: AxiosRequestConfig;
/**
*
*/
request!: AxiosDomainRequest;
/**
* options
*/
2023-04-18 19:50:40 +08:00
options!: AxiosDomainRequestMethod;
/**
* get
*/
2023-04-18 19:50:40 +08:00
get!: AxiosDomainRequestMethodWithParams;
/**
* head
*/
2023-04-18 19:50:40 +08:00
head!: AxiosDomainRequestMethodWithParams;
/**
* post
*/
2023-04-18 19:50:40 +08:00
post!: AxiosDomainRequestMethodWithData;
/**
* put
*/
2023-04-18 19:50:40 +08:00
put!: AxiosDomainRequestMethodWithData;
2023-04-14 18:16:39 +08:00
/**
* patch
*/
2023-04-18 19:50:40 +08:00
patch!: AxiosDomainRequestMethodWithData;
2023-04-14 18:16:39 +08:00
/**
* delete
*/
2023-04-18 19:50:40 +08:00
delete!: AxiosDomainRequestMethodWithParams;
/**
* trace
*/
2023-04-18 19:50:40 +08:00
trace!: AxiosDomainRequestMethod;
/**
* connect
*/
2023-04-18 19:50:40 +08:00
connect!: AxiosDomainRequestMethod;
constructor(
2023-04-10 22:53:15 +08:00
defaults: AxiosRequestConfig,
processRequest: (config: AxiosRequestConfig) => Promise<AxiosResponse>,
) {
this.defaults = defaults;
this.request = (
urlOrConfig: string | AxiosRequestConfig,
config: AxiosRequestConfig = {},
) => {
if (isString(urlOrConfig)) {
config.url = urlOrConfig;
} else {
config = urlOrConfig;
}
if (isUndefined(config.method)) {
config.method = 'get';
}
2023-04-07 12:39:23 +08:00
return processRequest(mergeConfig(this.defaults, config));
};
}
2023-04-17 19:27:44 +08:00
}
2023-04-18 19:50:40 +08:00
for (const method of requestMethodNames) {
AxiosDomain.prototype[method] = function processRequestMethod(
url,
config = {},
) {
config.method = method;
2023-04-17 19:27:44 +08:00
return this.request(url, config);
};
}
2023-04-18 19:50:40 +08:00
for (const method of requestMethodWithParamsNames) {
AxiosDomain.prototype[method] = function processRequestMethodWithParams(
2023-04-17 19:27:44 +08:00
url,
params = {},
config = {},
) {
2023-04-18 19:50:40 +08:00
config.method = method;
config.params = deepMerge(params, config.params ?? {});
2023-04-17 19:27:44 +08:00
return this.request(url, config);
};
}
2023-04-18 19:50:40 +08:00
for (const method of requestMethodWithDataNames) {
AxiosDomain.prototype[method] = function processRequestMethodWithData(
2023-04-17 19:27:44 +08:00
url,
data,
2023-04-17 19:27:44 +08:00
config = {},
) {
2023-04-18 19:50:40 +08:00
config.method = method;
config.data = data;
2023-04-17 19:27:44 +08:00
return this.request(url, config);
};
}