feat: fileName 替换为 name

pull/41/head
zjx0905 2023-04-06 15:16:12 +08:00
parent 4116df95eb
commit 69044f3583
10 changed files with 282 additions and 79 deletions

View File

@ -11,8 +11,6 @@ axios
{
// 指定文件下载后存储的路径 (本地路径),选填
filePath: '',
// 指定文件下载后存储的名称,选填
fileName: '',
},
{
download: true,

View File

@ -9,14 +9,12 @@ axios.post(
'/file',
{
// 文件名称,必填
fileName: 'image.png',
name: 'image.png',
// 文件路径,必填
filePath: '/file/image.png',
// 文件类型,选填
fileType: 'image' | 'video' | 'audio';
// 可以传入更多自定义字段,这些自定义字段最终会以 formData 的形式发送给服务端 (前提是平台支持)
custom1: 'name',
custom2: 'id'
custom2: 'id',
},
{
upload: true,

View File

@ -25,15 +25,36 @@ export type AxiosAdapterRequestMethod =
| 'CONNECT';
export interface AxiosAdapterResponse<TData = unknown> extends AnyObject {
/**
*
*/
status: number;
/**
*
*/
statusText: string;
/**
*
*/
headers: AnyObject;
/**
*
*/
data: TData;
}
export interface AxiosAdapterResponseError extends AnyObject {
/**
*
*/
status: number;
/**
*
*/
statusText: string;
/**
*
*/
headers: AnyObject;
}
@ -90,17 +111,15 @@ export interface AxiosAdapterBaseOptions extends AxiosAdapterRequestConfig {
fail(error: unknown): void;
}
export interface AxiosAdapterUploadOptions extends AxiosAdapterBaseOptions {
filePath: string;
name: string;
export interface AxiosAdapterUploadOptions
extends AxiosAdapterBaseOptions,
AxiosRequestFormData {
fileName: string;
fileType: 'image' | 'video' | 'audio';
formData?: AnyObject;
}
export interface AxiosAdapterDownloadOptions extends AxiosAdapterBaseOptions {
filePath?: string;
fileName?: string;
}
export interface AxiosAdapterRequest {
@ -149,7 +168,6 @@ export function getAdapterDefault(): AxiosAdapter | undefined {
while (!isEmptyArray(tryGetPlatforms) && !isPlatform(platform)) {
try {
const tryGetPlatform = tryGetPlatforms.shift();
if (isPlainObject((platform = tryGetPlatform!()))) {
platform = revisePlatformApiNames(platform);
}
@ -176,49 +194,54 @@ export function createAdapter(platform: AxiosPlatform): AxiosAdapter {
switch (config.type) {
case 'request':
return callRequest(platform.request, baseOptions);
return processRequest(platform.request, baseOptions);
case 'upload':
return callUpload(platform.upload, baseOptions);
return processUpload(platform.upload, baseOptions);
case 'download':
return callDownload(platform.download, baseOptions);
return processDownload(platform.download, baseOptions);
default:
throwError(`无法识别的请求类型 ${config.type}`);
}
}
function callRequest(
function processRequest(
request: AxiosAdapterRequest,
baseOptions: AxiosAdapterBaseOptions,
): AxiosAdapterTask {
return request(baseOptions);
}
function callUpload(
function processUpload(
upload: AxiosAdapterUpload,
baseOptions: AxiosAdapterBaseOptions,
): AxiosAdapterTask {
const { fileName, filePath, fileType, ...formData } =
const { name, filePath, fileType, ...formData } =
baseOptions.data as AxiosRequestFormData;
const options = {
...baseOptions,
name: fileName,
fileName: fileName,
name,
/**
* [ fileName name](https://open.dingtalk.com/document/orgapp/dd-upload-objects#title-ngk-rr1-eow)
*/
fileName: name,
filePath,
fileType: fileType ?? 'image',
/**
* |
*/
fileType,
formData,
};
return upload(options);
}
function callDownload(
function processDownload(
download: AxiosAdapterDownload,
baseOptions: AxiosAdapterBaseOptions,
): AxiosAdapterTask {
const options = {
...baseOptions,
filePath: baseOptions.params?.filePath,
fileName: baseOptions.params?.fileName,
success(response: AnyObject): void {
injectDownloadData(response);
baseOptions.success(response);

View File

@ -12,23 +12,63 @@ import { AxiosAdapter, createAdapter, AxiosPlatform } from './adapter';
import defaults from './defaults';
export interface AxiosInstanceDefaults extends AxiosRequestConfig {
/**
*
*/
headers: Required<AxiosRequestHeaders>;
}
export interface AxiosInstance extends Axios {
/**
*
*/
defaults: AxiosInstanceDefaults;
<TData = unknown>(config: AxiosRequestConfig): Promise<AxiosResponse<TData>>;
<TData = unknown>(url: string, config?: AxiosRequestConfig): Promise<
AxiosResponse<TData>
>;
<TData = unknown>(
/**
*
*/
config: AxiosRequestConfig,
): Promise<AxiosResponse<TData>>;
<TData = unknown>(
/**
*
*/
url: string,
/**
*
*/
config?: AxiosRequestConfig,
): Promise<AxiosResponse<TData>>;
}
export interface AxiosStatic extends AxiosInstance {
/**
* Axios
*/
Axios: AxiosConstructor;
/**
*
*/
CancelToken: CancelTokenConstructor;
/**
* axios
*
* @param defaults
*/
create(defaults?: AxiosRequestConfig): AxiosInstance;
/**
*
*
* @param platform
*/
createAdapter(platform: AxiosPlatform): AxiosAdapter;
/**
* Cancel
*/
isCancel: typeof isCancel;
/**
* AxiosError
*/
isAxiosError: typeof isAxiosError;
}

View File

@ -25,23 +25,57 @@ export type AxiosRequestMethod =
| 'connect';
export interface AxiosRequestHeaders extends AnyObject {
/**
*
*/
common?: AnyObject;
/**
* options
*/
options?: AnyObject;
/**
* get
*/
get?: AnyObject;
/**
* head
*/
head?: AnyObject;
/**
* post
*/
post?: AnyObject;
/**
* put
*/
put?: AnyObject;
/**
* delete
*/
delete?: AnyObject;
/**
* trace
*/
trace?: AnyObject;
/**
* connect
*/
connect?: AnyObject;
}
export interface AxiosRequestFormData extends AnyObject {
fileName: string;
/**
*
*/
name: string;
/**
*
*/
filePath: string;
fileType?: 'image' | 'video' | 'audio';
}
export type AxiosRequestData = AnyObject | AxiosRequestFormData;
export interface AxiosProgressEvent {
progress: number;
totalBytesSent: number;
@ -72,7 +106,7 @@ export interface AxiosRequestConfig
/**
*
*/
data?: AnyObject | AxiosRequestFormData;
data?: AxiosRequestData;
/**
*
*/
@ -125,13 +159,28 @@ export interface AxiosRequestConfig
export interface AxiosResponse<TData = unknown>
extends AxiosAdapterResponse<TData> {
/**
*
*/
config?: AxiosRequestConfig;
/**
*
*/
request?: AxiosAdapterTask;
}
export interface AxiosResponseError extends AxiosAdapterResponseError {
/**
* fail
*/
isFail: true;
/**
*
*/
config?: AxiosRequestConfig;
/**
*
*/
request?: AxiosAdapterTask;
}
@ -139,63 +188,131 @@ export interface AxiosConstructor {
new (config: AxiosRequestConfig): Axios;
}
export interface AxiosAliasMethod {
<TData = unknown>(
/**
*
*/
url: string,
/**
*
*/
config?: AxiosRequestConfig,
): Promise<AxiosResponse<TData>>;
}
export interface AxiosWithParamsAliasMethod {
<TData = unknown>(
/**
*
*/
url: string,
/**
*
*/
params?: AnyObject,
/**
*
*/
config?: AxiosRequestConfig,
): Promise<AxiosResponse<TData>>;
}
export interface AxiosWithDataAliasMethod {
<TData = unknown>(
/**
*
*/
url: string,
/**
*
*/
data?: AnyObject,
/**
*
*/
config?: AxiosRequestConfig,
): Promise<AxiosResponse<TData>>;
}
export default class Axios {
/**
*
*/
public static as = ['options', 'trace', 'connect'] as const;
/**
*
*/
public static pas = ['head', 'get', 'delete'] as const;
/**
*
*/
public static das = ['post', 'put'] as const;
/**
*
*/
public defaults: AxiosRequestConfig;
/**
*
*/
public interceptors = {
/**
*
*/
request: new InterceptorManager<AxiosRequestConfig>(),
/**
*
*/
response: new InterceptorManager<AxiosResponse>(),
};
public options!: <TData = unknown>(
url: string,
config?: AxiosRequestConfig,
) => Promise<AxiosResponse<TData>>;
/**
* options
*/
public options!: AxiosAliasMethod;
public get!: <TData = unknown>(
url: string,
params?: AnyObject,
config?: AxiosRequestConfig,
) => Promise<AxiosResponse<TData>>;
/**
* get
*/
public get!: AxiosWithParamsAliasMethod;
public head!: <TData = unknown>(
url: string,
params?: AnyObject,
config?: AxiosRequestConfig,
) => Promise<AxiosResponse<TData>>;
/**
* head
*/
public head!: AxiosWithParamsAliasMethod;
public post!: <TData = unknown>(
url: string,
data?: AnyObject | AxiosRequestFormData,
config?: AxiosRequestConfig,
) => Promise<AxiosResponse<TData>>;
/**
* post
*/
public post!: AxiosWithDataAliasMethod;
public put!: <TData = unknown>(
url: string,
data?: AnyObject | AxiosRequestFormData,
config?: AxiosRequestConfig,
) => Promise<AxiosResponse<TData>>;
/**
* put
*/
public put!: AxiosWithDataAliasMethod;
public delete!: <TData = unknown>(
url: string,
params?: AnyObject,
config?: AxiosRequestConfig,
) => Promise<AxiosResponse<TData>>;
/**
* delete
*/
public delete!: AxiosWithParamsAliasMethod;
public trace!: <TData = unknown>(
url: string,
config?: AxiosRequestConfig,
) => Promise<AxiosResponse<TData>>;
/**
* trace
*/
public trace!: AxiosAliasMethod;
public connect!: <TData = unknown>(
url: string,
config?: AxiosRequestConfig,
) => Promise<AxiosResponse<TData>>;
/**
* connect
*/
public connect!: AxiosAliasMethod;
/**
*
*
* @param defaults
*/
public constructor(defaults: AxiosRequestConfig = {}) {
this.defaults = defaults;
@ -221,7 +338,7 @@ export default class Axios {
}
for (const alias of Axios.das) {
this[alias] = (url, data, config) => {
this[alias] = (url, data, config = {}) => {
return this.request({
...config,
method: alias,
@ -241,6 +358,11 @@ export default class Axios {
return buildURL(url, params, paramsSerializer).replace(/^\?/, '');
}
/**
*
*
* @param config
*/
public request<TData = unknown>(
config: AxiosRequestConfig,
): Promise<AxiosResponse<TData>> {

View File

@ -1,13 +1,29 @@
export interface CancelAction {
(message?: string): void;
(
/**
*
*/
message?: string,
): void;
}
export interface CancelExecutor {
(cancel: CancelAction): void;
(
/**
*
*/
cancel: CancelAction,
): void;
}
export interface CancelTokenSource {
/**
*
*/
token: CancelToken;
/**
*
*/
cancel: CancelAction;
}

View File

@ -6,9 +6,7 @@ export type AxiosErrorResponse = AxiosResponse | AxiosResponseError;
class AxiosError extends Error {
public config: AxiosRequestConfig;
public request: AxiosAdapterTask;
public response: AxiosErrorResponse;
public constructor(

View File

@ -1,17 +1,24 @@
import { isArray, isUndefined } from '../helpers/isTypes';
import { AxiosRequestFormData } from './Axios';
import { AxiosRequestData } from './Axios';
export interface AxiosTransformer {
(data?: AnyObject | AxiosRequestFormData, headers?: AnyObject):
| AnyObject
| AxiosRequestFormData;
(
/**
*
*/
data?: AxiosRequestData,
/**
*
*/
headers?: AnyObject,
): AxiosRequestData;
}
export function transformData(
data?: AnyObject | AxiosRequestFormData,
data?: AxiosRequestData,
headers?: AnyObject,
transforms?: AxiosTransformer | AxiosTransformer[],
): AnyObject | AxiosRequestFormData | undefined {
): AxiosRequestData | undefined {
if (isUndefined(transforms)) {
return data;
}

View File

@ -2,6 +2,7 @@ import axios from './axios';
export type {
AxiosRequestConfig,
AxiosRequestData,
AxiosRequestFormData,
AxiosResponse,
AxiosResponseError,

View File

@ -50,7 +50,7 @@ describe('src/adapter.ts', () => {
type: 'download' as const,
url: 'test',
method: 'GET' as const,
params: { fileName: '', filePath: '' },
params: { filePath: '' },
success: noop,
fail: noop,
};