diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index e18e900..bc9c156 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -34,7 +34,7 @@ pnpm cz 脚本列表 - `pnpm build` 打包源代码 -- `pnpm watch` 监听文件变更并运行 `build` +- `pnpm dev` 监听文件变更并运行 `build` - `pnpm test` 单元测试 - `pnpm test:watch` 监听文件变更并运行 `test` - `pnpm test:cov` 运行 `test` 并输出测试覆盖率 diff --git a/README.md b/README.md index dc22b88..bcd3590 100644 --- a/README.md +++ b/README.md @@ -2,19 +2,19 @@

- ci - - - npm + ci codecov - - npm bundle size - - license + license + + + npm bundle size + + + npm

@@ -63,7 +63,6 @@ axios-miniprogram 是一款为小程序平台量身定制的轻量级请求库 [提问点这里](https://github.com/zjxxxxxxxxx/axios-miniprogram/issues) - ## 跨端框架示例 ### Taro diff --git a/package.json b/package.json index bbfb58b..889ae21 100644 --- a/package.json +++ b/package.json @@ -37,7 +37,7 @@ "format": "prettier -w {src,test,scripts}/**/*.{ts,tsx,js,jsx}", "build": "esno scripts/build.ts", "build:assets": "esno scripts/build.assets.ts", - "watch": "pnpm build -a -w", + "dev": "pnpm build -a -w", "release": "esno scripts/release.ts", "publish:ci": "esno scripts/publish.ts", "changelog": "conventional-changelog -p angular -i CHANGELOG.md -s", diff --git a/src/adpater/createAdapter.ts b/src/adpater/createAdapter.ts index c04e762..ed62df3 100644 --- a/src/adpater/createAdapter.ts +++ b/src/adpater/createAdapter.ts @@ -261,47 +261,48 @@ export function createAdapter(platform: AxiosAdapterPlatform) { function transformOptions( config: AxiosAdapterRequestConfig, ): AxiosAdapterBaseOptions { + const { success, fail } = config; + return { ...config, header: config.headers, - success(_response: AxiosAdapterResponse) { - const response = transformResponse(_response) as AxiosAdapterResponse; - - config.success(response); + success(rawRes: AxiosAdapterResponse) { + const response = transformResponse(rawRes) as AxiosAdapterResponse; + success(response); }, - fail(_responseError: AxiosAdapterResponseError) { - const responseError = Object.assign(transformResponse(_responseError), { + fail(rawErr: AxiosAdapterResponseError) { + const responseError = { + ...transformResponse(rawErr), data: { errno: // 微信 | 飞书新规范 - _responseError.errno ?? + rawErr.errno ?? // 支付宝 | 钉钉 - _responseError.error ?? + rawErr.error ?? // 百度 | 360 | 飞书 - _responseError.errCode ?? + rawErr.errCode ?? // 抖音 - _responseError.errNo, + rawErr.errNo, errMsg: // 飞书新规范 - _responseError.errString ?? + rawErr.errString ?? // 微信 | 支付宝 | 百度 | 抖音 | QQ | 360 | 飞书 - _responseError.errMsg ?? + rawErr.errMsg ?? // 钉钉 - _responseError.errorMessage, + rawErr.errorMessage, }, - }); - - config.fail(responseError); + }; + fail(responseError); }, }; } function transformResponse( - _response: AxiosAdapterResponse | AxiosAdapterResponseError, + rawRes: AxiosAdapterResponse | AxiosAdapterResponseError, ) { - return Object.assign( - ignore( - _response, + return { + ...ignore( + rawRes, 'statusCode', 'header', @@ -316,45 +317,40 @@ export function createAdapter(platform: AxiosAdapterPlatform) { 'errorMessage', 'errString', ), - { - status: _response.status ?? _response.statusCode, - headers: _response.headers ?? _response.header, - }, - ); + status: rawRes.status ?? rawRes.statusCode, + headers: rawRes.headers ?? rawRes.header, + }; } function processRequest( request: AxiosAdapterRequest, - baseOptions: AxiosAdapterBaseOptions, + rawOpts: AxiosAdapterBaseOptions, ): AxiosAdapterPlatformTask { - return request(baseOptions); + return request(rawOpts); } function processDownload( download: AxiosAdapterDownload, - baseOptions: AxiosAdapterBaseOptions, + rawOpts: AxiosAdapterBaseOptions, ): AxiosAdapterPlatformTask { - const options = baseOptions as AxiosAdapterDownloadOptions; + const options = rawOpts as AxiosAdapterDownloadOptions; const { params, success } = options; options.filePath = params?.filePath; - options.success = (_response) => { - const response = Object.assign( - ignore(_response, 'tempFilePath', 'apFilePath', 'filePath', 'fileSize'), - { - data: { - filePath: _response.filePath, - tempFilePath: - _response.tempFilePath ?? - // 支付宝 - _response.apFilePath, - fileSize: - // 飞书 - _response.fileSize, - }, + options.success = (rawRes) => { + const response = { + ...ignore(rawRes, 'tempFilePath', 'apFilePath', 'filePath', 'fileSize'), + data: { + filePath: rawRes.filePath, + tempFilePath: + rawRes.tempFilePath ?? + // 支付宝 + rawRes.apFilePath, + fileSize: + // 飞书 + rawRes.fileSize, }, - ); - + }; success(response); }; @@ -364,10 +360,11 @@ export function createAdapter(platform: AxiosAdapterPlatform) { function processUpload( upload: AxiosAdapterUpload, - baseOptions: AxiosAdapterBaseOptions, + rawOpts: AxiosAdapterBaseOptions, ): AxiosAdapterPlatformTask { - const options = baseOptions as AxiosAdapterUploadOptions; - const { name, filePath, fileType, ...formData } = options.data as AnyObject; + const options = rawOpts as AxiosAdapterUploadOptions; + const { data, success } = options; + const { name, filePath, fileType, ...formData } = data as AnyObject; options.name = name; options.filePath = filePath; @@ -377,6 +374,17 @@ export function createAdapter(platform: AxiosAdapterPlatform) { options.fileName = name; // 支付宝 | 钉钉 options.fileType = fileType; + options.success = (rawRes) => { + const response = { ...rawRes }; + if (options.responseType === 'text' && options.dataType === 'json') { + try { + response.data = JSON.parse(rawRes.data); + } catch { + // + } + } + success(response); + }; orgIgnore(options, ['params', 'data']); return upload(options); diff --git a/test/adpater/createAdapter.test.ts b/test/adpater/createAdapter.test.ts index e98813d..a90bdbf 100644 --- a/test/adpater/createAdapter.test.ts +++ b/test/adpater/createAdapter.test.ts @@ -327,4 +327,33 @@ describe('src/adapter/createAdapter.ts', () => { createAdapter(p2)(c2); createAdapter(p3)(c3); }); + + test('响应数据应该进行JSON.parse', async () => { + const a = createAdapter({ + request: vi.fn(), + upload: (options) => { + options.success({ + data: '{"id":1}', + }); + }, + download: vi.fn(), + }); + + a({ + type: 'upload', + url: 'test', + method: 'POST', + dataType: 'json', + responseType: 'text', + data: {}, + success(res) { + expect(res.data).toBeTypeOf('object'); + // @ts-ignore + expect(res.data.id).toBe(1); + }, + fail() { + // + }, + }); + }); });