From 5d45cd9670c3bc8b58437d2defc58753ebc6392e Mon Sep 17 00:00:00 2001 From: zjxxxxxxxxx <43126836+zjxxxxxxxxx@users.noreply.github.com> Date: Wed, 10 Jan 2024 19:33:33 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E8=AE=BE=E7=BD=AE?= =?UTF-8?q?=E8=AF=B7=E6=B1=82=20headers=20=E5=BD=B1=E5=93=8D=E4=BA=86?= =?UTF-8?q?=E5=85=A8=E5=B1=80=E9=85=8D=E7=BD=AE=20(#56)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit #55 --- README.md | 16 +++--- docs/.vitepress/utils/link-intro.ts | 9 ++- src/core/Axios.ts | 87 ++++++++++++++++++----------- src/core/InterceptorManager.ts | 20 ++++--- src/core/MiddlewareManager.ts | 8 ++- src/core/mergeConfig.ts | 8 +-- src/request/cancel.ts | 17 +++--- test/core/mergeConfig.test.ts | 19 +++++++ 8 files changed, 119 insertions(+), 65 deletions(-) diff --git a/README.md b/README.md index bcd3590..32226b8 100644 --- a/README.md +++ b/README.md @@ -1,24 +1,26 @@

axios-miniprogram

-

- +

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

-

中文文档

+

+ 中文文档 +

## axios-miniprogram 是什么? diff --git a/docs/.vitepress/utils/link-intro.ts b/docs/.vitepress/utils/link-intro.ts index e0d064a..517b5da 100644 --- a/docs/.vitepress/utils/link-intro.ts +++ b/docs/.vitepress/utils/link-intro.ts @@ -1,4 +1,4 @@ -import { linkSync } from 'node:fs'; +import { linkSync, unlinkSync } from 'node:fs'; import { resolve } from '../../../scripts/utils'; const readmePath = resolve('README.md'); @@ -6,6 +6,9 @@ const introPath = resolve('docs/pages/guide/intro.md'); export function linkIntro() { try { - linkSync(readmePath, introPath); - } catch {} + unlinkSync(introPath); + } catch { + // + } + linkSync(readmePath, introPath); } diff --git a/src/core/Axios.ts b/src/core/Axios.ts index d2fb981..e9ed84b 100644 --- a/src/core/Axios.ts +++ b/src/core/Axios.ts @@ -354,14 +354,16 @@ export interface AxiosConstructor { export default class Axios { /** + * @internal + * * 父级实例 */ - #parent?: Axios; + private declare parent?: Axios; /** * 默认请求配置 */ - defaults: AxiosRequestConfig; + declare defaults: AxiosRequestConfig; /** * 拦截器 @@ -378,54 +380,56 @@ export default class Axios { }; /** + * @internal + * * 中间件 */ - #middleware = new MiddlewareManager(); + private middleware = new MiddlewareManager(); /** * 发送 options 请求 */ - options!: AxiosRequestMethodFn; + declare options: AxiosRequestMethodFn; /** * 发送 get 请求 */ - get!: AxiosRequestMethodFnWithParams; + declare get: AxiosRequestMethodFnWithParams; /** * 发送 head 请求 */ - head!: AxiosRequestMethodFnWithParams; + declare head: AxiosRequestMethodFnWithParams; /** * 发送 post 请求 */ - post!: AxiosRequestMethodFnWithData; + declare post: AxiosRequestMethodFnWithData; /** * 发送 put 请求 */ - put!: AxiosRequestMethodFnWithData; + declare put: AxiosRequestMethodFnWithData; /** * 发送 patch 请求 */ - patch!: AxiosRequestMethodFnWithData; + declare patch: AxiosRequestMethodFnWithData; /** * 发送 delete 请求 */ - delete!: AxiosRequestMethodFnWithParams; + declare delete: AxiosRequestMethodFnWithParams; /** * 发送 trace 请求 */ - trace!: AxiosRequestMethodFn; + declare trace: AxiosRequestMethodFn; /** * 发送 connect 请求 */ - connect!: AxiosRequestMethodFn; + declare connect: AxiosRequestMethodFn; /** * @@ -434,7 +438,7 @@ export default class Axios { */ constructor(config: AxiosRequestConfig, parent?: Axios) { this.defaults = config; - this.#parent = parent; + this.parent = parent; } /** @@ -454,7 +458,7 @@ export default class Axios { 'get') as AxiosRequestMethod; const requestHandler = { - resolved: this.#handleRequest, + resolved: this.handleRequest, }; const errorHandler = { rejected: config.errorHandler, @@ -464,11 +468,11 @@ export default class Axios { | Partial> )[] = []; - this.#eachRequestInterceptors((requestInterceptor) => { + this.eachRequestInterceptors((requestInterceptor) => { chain.unshift(requestInterceptor); }); chain.push(requestHandler); - this.#eachResponseInterceptors((responseInterceptor) => { + this.eachResponseInterceptors((responseInterceptor) => { chain.push(responseInterceptor); }); chain.push(errorHandler); @@ -484,17 +488,27 @@ export default class Axios { ) as Promise; }; - #eachRequestInterceptors(executor: InterceptorExecutor) { + /** + * @internal + */ + private eachRequestInterceptors( + executor: InterceptorExecutor, + ) { this.interceptors.request.forEach(executor); - if (this.#parent) { - this.#parent.#eachRequestInterceptors(executor); + if (this.parent) { + this.parent.eachRequestInterceptors(executor); } } - #eachResponseInterceptors(executor: InterceptorExecutor) { + /** + * @internal + */ + private eachResponseInterceptors( + executor: InterceptorExecutor, + ) { this.interceptors.response.forEach(executor); - if (this.#parent) { - this.#parent.#eachResponseInterceptors(executor); + if (this.parent) { + this.parent.eachResponseInterceptors(executor); } } @@ -526,28 +540,37 @@ export default class Axios { * ``` */ use = (middleware: MiddlewareCallback) => { - this.#middleware.use(middleware); + this.middleware.use(middleware); return this; }; - #handleRequest = async (config: AxiosRequestConfig) => { - const ctx = this.#middleware.createContext(config); - await this.#run(ctx, this.#handleResponse); + /** + * @internal + */ + private handleRequest = async (config: AxiosRequestConfig) => { + const ctx = this.middleware.createContext(config); + await this.run(ctx, this.handleResponse); return ctx.res as AxiosResponse; }; - #handleResponse = async (ctx: MiddlewareContext) => { + /** + * @internal + */ + private async handleResponse(ctx: MiddlewareContext) { ctx.res = await dispatchRequest(ctx.req); - }; + } - #run = ( + /** + * @internal + */ + private run = ( ctx: MiddlewareContext, respond: MiddlewareCallback, ): Promise => { - if (!this.#parent) { - return this.#middleware.run(ctx, respond); + if (!this.parent) { + return this.middleware.run(ctx, respond); } - return this.#middleware.enhanceRun(this.#parent.#run)(ctx, respond); + return this.middleware.enhanceRun(this.parent.run)(ctx, respond); }; } diff --git a/src/core/InterceptorManager.ts b/src/core/InterceptorManager.ts index 815b573..26cbf4c 100644 --- a/src/core/InterceptorManager.ts +++ b/src/core/InterceptorManager.ts @@ -29,14 +29,18 @@ export interface InterceptorExecutor { */ export default class InterceptorManager { /** + * @internal + * * 生成拦截器标识符 */ - #id = 0; + private id = 0; /** + * @internal + * * 拦截器缓存池 */ - #interceptors = new Map>(); + private interceptors = new Map>(); /** * @internal @@ -44,7 +48,7 @@ export default class InterceptorManager { * 拦截器数量 */ get size() { - return this.#interceptors.size; + return this.interceptors.size; } /** @@ -58,12 +62,12 @@ export default class InterceptorManager { resolved: InterceptorResolved, rejected?: InterceptorRejected, ): number { - this.#interceptors.set(++this.#id, { + this.interceptors.set(++this.id, { resolved, rejected, }); - return this.#id; + return this.id; } /** @@ -72,14 +76,14 @@ export default class InterceptorManager { * @param id 拦截器标识符 */ eject(id: number): boolean { - return this.#interceptors.delete(id); + return this.interceptors.delete(id); } /** * 清空拦截器 */ clear() { - this.#interceptors.clear(); + this.interceptors.clear(); } /** @@ -90,6 +94,6 @@ export default class InterceptorManager { * @param executor 执行器 */ forEach(executor: InterceptorExecutor): void { - this.#interceptors.forEach(executor); + this.interceptors.forEach(executor); } } diff --git a/src/core/MiddlewareManager.ts b/src/core/MiddlewareManager.ts index 0b99f0f..cc6257c 100644 --- a/src/core/MiddlewareManager.ts +++ b/src/core/MiddlewareManager.ts @@ -34,16 +34,18 @@ export interface MiddlewareCallback { */ export default class MiddlewareManager { /** + * @internal + * * 中间件缓存池 */ - #middlewares: MiddlewareCallback[] = []; + private middlewares: MiddlewareCallback[] = []; /** * 注册中间件 */ use(middleware: MiddlewareCallback) { assert(isFunction(middleware), 'middleware 不是一个 function'); - this.#middlewares.push(middleware); + this.middlewares.push(middleware); } /** @@ -67,7 +69,7 @@ export default class MiddlewareManager { * @param respond 目标函数 */ run(ctx: MiddlewareContext, respond: MiddlewareCallback) { - const middlewares = [...this.#middlewares, respond]; + const middlewares = [...this.middlewares, respond]; async function next() { await middlewares.shift()!(ctx, next); } diff --git a/src/core/mergeConfig.ts b/src/core/mergeConfig.ts index 1f7961f..40e988d 100644 --- a/src/core/mergeConfig.ts +++ b/src/core/mergeConfig.ts @@ -39,12 +39,10 @@ export function mergeConfig( } // 深度合并 config1 和 config2 中的对象 else if (deepMergeConfigMap[key]) { - if (isPlainObject(val1) && isPlainObject(val2)) { - config[key] = deepMerge(val1, val2); + if (isPlainObject(val1)) { + config[key] = deepMerge(val1, isPlainObject(val2) ? val2 : {}); } else if (isPlainObject(val2)) { - config[key] = val2; - } else if (isPlainObject(val1)) { - config[key] = val1; + config[key] = deepMerge(val2, {}); } } // 优先从 config2 中取值,如果没有值就从 config1 中取值 diff --git a/src/request/cancel.ts b/src/request/cancel.ts index 96af486..47604a3 100644 --- a/src/request/cancel.ts +++ b/src/request/cancel.ts @@ -44,24 +44,27 @@ export function isCancel(value: unknown): value is Cancel { } export class CancelToken { - #reason?: Cancel; + /** + * @internal + */ + private declare reason?: Cancel; /** * @internal */ - onCancel: Promise['then']; + declare onCancel: Promise['then']; constructor(executor: CancelExecutor) { let action!: CancelAction; const promise = new Promise((resolve) => { action = (message) => { - if (this.#reason) { + if (this.reason) { return; } - this.#reason = new Cancel(message); + this.reason = new Cancel(message); - resolve(this.#reason); + resolve(this.reason); }; }); @@ -86,8 +89,8 @@ export class CancelToken { * @internal */ throwIfRequested(): void { - if (this.#reason) { - throw this.#reason; + if (this.reason) { + throw this.reason; } } } diff --git a/test/core/mergeConfig.test.ts b/test/core/mergeConfig.test.ts index 428c848..51fdc2d 100644 --- a/test/core/mergeConfig.test.ts +++ b/test/core/mergeConfig.test.ts @@ -127,6 +127,25 @@ describe('src/core/mergeConfig.ts', () => { expect(mergeConfig(c1 as any, c2 as any)).toEqual({}); }); + test('深度合并应该返回新的对象', () => { + const c1 = { + headers: { t: 1 }, + params: {}, + }; + const c2 = { + headers: {}, + params: { t: 1 }, + }; + const c3 = mergeConfig(c1 as any, c2 as any); + + expect(c3.headers === c1.headers).toBeFalsy(); + expect(c3.params === c1.params).toBeFalsy(); + expect(c3.headers === c2.headers).toBeFalsy(); + expect(c3.params === c2.params).toBeFalsy(); + expect(c3.headers).toEqual(c1.headers); + expect(c3.params).toEqual(c2.params); + }); + test('应该优先取 config2', () => { const c1 = { adapter: vi.fn(),