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: '', filePath: '',
// 指定文件下载后存储的名称,选填
fileName: '',
}, },
{ {
download: true, download: true,

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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