@flyto/request 1.1.5 → 1.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs.js +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.esm.js +1 -1
- package/dist/index.umd.js +1 -1
- package/dist/index.umd.js.map +1 -1
- package/dist/types/index.d.ts +7 -2
- package/package.json +1 -1
package/dist/index.cjs.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";var e=require("qs"),t=require("axios");function r(r){let n;const o=()=>{n=setTimeout(()=>{r.toggleWarpLoading?.(!1)},10)},s=t.create({...r.axiosConfig,timeout:6e4});return s.interceptors.request.use(async t=>{if(Object.assign(t,{openLoading:t.openLoading??!0,method:t.method??"POST"}),r.beforeRequest)try{const e=await(r.beforeRequest?.(
|
|
1
|
+
"use strict";var e=require("qs"),t=require("axios");function r(r){let n;const o=()=>{n=setTimeout(()=>{r.toggleWarpLoading?.(!1)},10)},s=t.create({...r.axiosConfig,timeout:6e4});return s.interceptors.request.use(async t=>{if(Object.assign(t,{openLoading:t.openLoading??!0,method:t.method??"POST"}),r.beforeRequest)try{const e=JSON.parse(JSON.stringify(t)),n=await(r.beforeRequest?.(e));if(!1===n.success)return Promise.reject({message:n.message||"请求被拦截"});n.config&&(t=n.config)}catch(e){return Promise.reject(e)}t.openLoading&&(clearTimeout(n),r.toggleWarpLoading?.(!0,t.tip));const o=t.headers?.["Content-Type"]||"";return"get"===t.method||"GET"===t.method?t.params=t.data:o.includes("application/x-www-form-urlencoded")&&(t.notQsContentType||(t.data=e.stringify(t.data))),t}),s.interceptors.response.use(async e=>{if(o(),r.afterResponse)try{await(r.afterResponse?.(e))}catch(e){console.warn("[afterResponse 执行异常]",e)}if(!e.config.ignoreStandardHandler){const{config:t}=e,{ignoreErrorMsg:n=!1,ignoreSuccessMsg:o=!0}=t,s=e.data,i=s.Message?String(s.Message):"";if(0===s.Code&&s.Success)o||r.notify?.success?.(i||"成功");else if(!n)throw r.notify?.error?.(i||"错误,请联系相关人员!","normal"),s}return e},e=>{o();let t="";return t="string"==typeof e?e:"object"==typeof e?JSON.stringify(e):String(e),r.notify?.error?.(t,"network"),e}),s}function n(){const e=new Map;return{register(t={axiosConfig:{}},n){if(e.has(n))throw new Error(`"${n}" 已经存在请求实例,请勿重复注册`);e.set(n,function(e){const t=r(e);return{request:async function(e,r){if(!t)throw new Error("请先注册请求函数");const n="string"==typeof e?{method:"post",...r,url:e}:e,{data:o}=await t(n);return o},axiosIns:t}}(t))},get(t){const r=e.get(t);if(!r)throw new Error(`"${t}" 不存在任何请求客户端,请先注册`);return r},remove(t){e.delete(t)},reset(){e.clear()},getRequest(t){const r=e.get(t);if(!r)throw new Error(`"${t}" 不存在任何请求客户端,请先注册`);return r.request}}}const o=n(),s="default";const i=(a=()=>o.getRequest(s),(...e)=>a()(...e));var a;exports.createAxiosIns=r,exports.createRequestClientManager=n,exports.defineConfig=function(e){return"function"==typeof e?e():e},exports.getClient=function(){return o.get(s)},exports.registerClient=function(e){return o.register(e,s)},exports.request=i;
|
package/dist/index.d.ts
CHANGED
|
@@ -28,4 +28,4 @@ export declare const request: {
|
|
|
28
28
|
<D = number, T = import("./types").HttpResponse<D>>(url: string, config?: import("./types").StandardRequestConfig<unknown>): Promise<T>;
|
|
29
29
|
<D_1 = number, T_1 = import("./types").HttpResponse<D_1>>(config: import("./types").StandardRequestConfig<unknown>): Promise<T_1>;
|
|
30
30
|
};
|
|
31
|
-
export
|
|
31
|
+
export * from './types';
|
package/dist/index.esm.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import e from"qs";import t from"axios";function r(r){let
|
|
1
|
+
import e from"qs";import t from"axios";function r(r){let n;const o=()=>{n=setTimeout(()=>{r.toggleWarpLoading?.(!1)},10)},s=t.create({...r.axiosConfig,timeout:6e4});return s.interceptors.request.use(async t=>{if(Object.assign(t,{openLoading:t.openLoading??!0,method:t.method??"POST"}),r.beforeRequest)try{const e=JSON.parse(JSON.stringify(t)),n=await(r.beforeRequest?.(e));if(!1===n.success)return Promise.reject({message:n.message||"请求被拦截"});n.config&&(t=n.config)}catch(e){return Promise.reject(e)}t.openLoading&&(clearTimeout(n),r.toggleWarpLoading?.(!0,t.tip));const o=t.headers?.["Content-Type"]||"";return"get"===t.method||"GET"===t.method?t.params=t.data:o.includes("application/x-www-form-urlencoded")&&(t.notQsContentType||(t.data=e.stringify(t.data))),t}),s.interceptors.response.use(async e=>{if(o(),r.afterResponse)try{await(r.afterResponse?.(e))}catch(e){console.warn("[afterResponse 执行异常]",e)}if(!e.config.ignoreStandardHandler){const{config:t}=e,{ignoreErrorMsg:n=!1,ignoreSuccessMsg:o=!0}=t,s=e.data,i=s.Message?String(s.Message):"";if(0===s.Code&&s.Success)o||r.notify?.success?.(i||"成功");else if(!n)throw r.notify?.error?.(i||"错误,请联系相关人员!","normal"),s}return e},e=>{o();let t="";return t="string"==typeof e?e:"object"==typeof e?JSON.stringify(e):String(e),r.notify?.error?.(t,"network"),e}),s}function n(){const e=new Map;return{register(t={axiosConfig:{}},n){if(e.has(n))throw new Error(`"${n}" 已经存在请求实例,请勿重复注册`);e.set(n,function(e){const t=r(e);return{request:async function(e,r){if(!t)throw new Error("请先注册请求函数");const n="string"==typeof e?{method:"post",...r,url:e}:e,{data:o}=await t(n);return o},axiosIns:t}}(t))},get(t){const r=e.get(t);if(!r)throw new Error(`"${t}" 不存在任何请求客户端,请先注册`);return r},remove(t){e.delete(t)},reset(){e.clear()},getRequest(t){const r=e.get(t);if(!r)throw new Error(`"${t}" 不存在任何请求客户端,请先注册`);return r.request}}}function o(e){return"function"==typeof e?e():e}const s=n(),i="default";function a(e){return s.register(e,i)}function c(){return s.get(i)}const f=(u=()=>s.getRequest(i),(...e)=>u()(...e));var u;export{r as createAxiosIns,n as createRequestClientManager,o as defineConfig,c as getClient,a as registerClient,f as request};
|
package/dist/index.umd.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("qs"),require("axios")):"function"==typeof define&&define.amd?define(["exports","qs","axios"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).fRequest={},e.qs,e.axios)}(this,function(e,t,r){"use strict";function n(e){let n;const o=()=>{n=setTimeout(()=>{e.toggleWarpLoading?.(!1)},10)},s=r.create({...e.axiosConfig,timeout:6e4});return s.interceptors.request.use(async r=>{if(Object.assign(r,{openLoading:r.openLoading??!0,method:r.method??"POST"}),e.beforeRequest)try{const t=await(e.beforeRequest?.(
|
|
1
|
+
!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("qs"),require("axios")):"function"==typeof define&&define.amd?define(["exports","qs","axios"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).fRequest={},e.qs,e.axios)}(this,function(e,t,r){"use strict";function n(e){let n;const o=()=>{n=setTimeout(()=>{e.toggleWarpLoading?.(!1)},10)},s=r.create({...e.axiosConfig,timeout:6e4});return s.interceptors.request.use(async r=>{if(Object.assign(r,{openLoading:r.openLoading??!0,method:r.method??"POST"}),e.beforeRequest)try{const t=JSON.parse(JSON.stringify(r)),n=await(e.beforeRequest?.(t));if(!1===n.success)return Promise.reject({message:n.message||"请求被拦截"});n.config&&(r=n.config)}catch(e){return Promise.reject(e)}r.openLoading&&(clearTimeout(n),e.toggleWarpLoading?.(!0,r.tip));const o=r.headers?.["Content-Type"]||"";return"get"===r.method||"GET"===r.method?r.params=r.data:o.includes("application/x-www-form-urlencoded")&&(r.notQsContentType||(r.data=t.stringify(r.data))),r}),s.interceptors.response.use(async t=>{if(o(),e.afterResponse)try{await(e.afterResponse?.(t))}catch(e){console.warn("[afterResponse 执行异常]",e)}if(!t.config.ignoreStandardHandler){const{config:r}=t,{ignoreErrorMsg:n=!1,ignoreSuccessMsg:o=!0}=r,s=t.data,i=s.Message?String(s.Message):"";if(0===s.Code&&s.Success)o||e.notify?.success?.(i||"成功");else if(!n)throw e.notify?.error?.(i||"错误,请联系相关人员!","normal"),s}return t},t=>{o();let r="";return r="string"==typeof t?t:"object"==typeof t?JSON.stringify(t):String(t),e.notify?.error?.(r,"network"),t}),s}function o(){const e=new Map;return{register(t={axiosConfig:{}},r){if(e.has(r))throw new Error(`"${r}" 已经存在请求实例,请勿重复注册`);e.set(r,function(e){const t=n(e);return{request:async function(e,r){if(!t)throw new Error("请先注册请求函数");const n="string"==typeof e?{method:"post",...r,url:e}:e,{data:o}=await t(n);return o},axiosIns:t}}(t))},get(t){const r=e.get(t);if(!r)throw new Error(`"${t}" 不存在任何请求客户端,请先注册`);return r},remove(t){e.delete(t)},reset(){e.clear()},getRequest(t){const r=e.get(t);if(!r)throw new Error(`"${t}" 不存在任何请求客户端,请先注册`);return r.request}}}const s=o(),i="default";const a=(c=()=>s.getRequest(i),(...e)=>c()(...e));var c;e.createAxiosIns=n,e.createRequestClientManager=o,e.defineConfig=function(e){return"function"==typeof e?e():e},e.getClient=function(){return s.get(i)},e.registerClient=function(e){return s.register(e,i)},e.request=a});
|
|
2
2
|
//# sourceMappingURL=index.umd.js.map
|
package/dist/index.umd.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.umd.js","sources":["../src/core/axios.ts","../src/core/manager.ts","../src/core/client.ts","../src/index.ts","../src/core/proxy.ts","../src/core/config.ts"],"sourcesContent":["import qs from 'qs'\r\nimport axios, { type AxiosResponse } from 'axios'\r\nimport { HttpResponse, RequestOptions, StandardRequestConfig } from '../types'\r\n\r\n/** 默认 成功Code值 */\r\nconst SUCCESS_CODE = 0\r\n/** 需要通过qs转换的Content-Type */\r\nconst CONTENT_TYPE_TANSFORM = 'application/x-www-form-urlencoded'\r\n/** 请求超时时间 1分钟 */\r\nconst REQUEST_TIMEOUT = 1000 * 60 * 1\r\n\r\n/**\r\n * 创建一个已经对拦截器做过逻辑处理的Axios实例\r\n * @param options 配置项\r\n * @returns axios实例\r\n */\r\nexport function createAxiosIns(options: RequestOptions) {\r\n // #region loading遮罩层处理\r\n let tiemerId: NodeJS.Timeout\r\n /**\r\n * 关闭遮罩(会延时50ms)\r\n */\r\n const closeLoading = () => {\r\n // 遮罩延迟50毫秒关闭\r\n // 如果有两个连续的请求,使其动画不中断,体验感较好\r\n tiemerId = setTimeout(() => {\r\n options.toggleWarpLoading?.(false)\r\n }, 10)\r\n }\r\n // #endregion\r\n\r\n const axiosIns = axios.create({\r\n ...options.axiosConfig,\r\n timeout: REQUEST_TIMEOUT,\r\n })\r\n // 在发送请求之前做些什么\r\n axiosIns.interceptors.request.use(async (config: StandardRequestConfig) => {\r\n // 合并默认值\r\n Object.assign(config, {\r\n openLoading: config.openLoading ?? true,\r\n method: config.method ?? 'POST',\r\n })\r\n\r\n // 自定义在请求之前做些什么\r\n if (options.beforeRequest) {\r\n try {\r\n const result = await options.beforeRequest?.(config)\r\n if (result.success === false) {\r\n // 取消请求\r\n return Promise.reject({ message: result.message || '请求被拦截' })\r\n }\r\n } catch (err) {\r\n return Promise.reject(err)\r\n }\r\n }\r\n\r\n // 打开遮罩\r\n if (config.openLoading) {\r\n // 如果下一个请求马上进来了,则清除掉计时器\r\n clearTimeout(tiemerId)\r\n options.toggleWarpLoading?.(true, config.tip)\r\n }\r\n\r\n const contentType: string = config.headers?.['Content-Type'] || ''\r\n if (config.method === 'get' || config.method === 'GET') {\r\n config.params = config.data\r\n // 非默认的content-type,不进行qs的转换\r\n } else if (contentType.includes(CONTENT_TYPE_TANSFORM)) {\r\n // qs转格式\r\n if (!config.notQsContentType) {\r\n config.data = qs.stringify(config.data)\r\n }\r\n }\r\n\r\n return config\r\n })\r\n // 在请求成功后做些什么\r\n axiosIns.interceptors.response.use(\r\n async (\r\n response: AxiosResponse & {\r\n config: StandardRequestConfig\r\n },\r\n ) => {\r\n closeLoading()\r\n\r\n // 自定义在请求之后做些什么\r\n if (options.afterResponse) {\r\n try {\r\n await options.afterResponse?.(response)\r\n } catch (err) {\r\n console.warn('[afterResponse 执行异常]', err)\r\n }\r\n }\r\n\r\n // 使用标准返回结构体(HttpResponse)的通用错误处理\r\n // 非HttpResponse,请自行处理\r\n if (!response.config.ignoreStandardHandler) {\r\n const { config } = response\r\n const { ignoreErrorMsg = false, ignoreSuccessMsg = true } = config\r\n\r\n const data = response.data as HttpResponse\r\n const message = data.Message ? String(data.Message) : ''\r\n\r\n if (data.Code === SUCCESS_CODE && data.Success) {\r\n if (!ignoreSuccessMsg) {\r\n options.notify?.success?.(message || '成功')\r\n }\r\n } else if (!ignoreErrorMsg) {\r\n options.notify?.error?.(message || '错误,请联系相关人员!', 'normal')\r\n throw data\r\n }\r\n }\r\n\r\n return response\r\n },\r\n err => {\r\n // 只要服务器返回的code不是200,都会进入该函数,必须抛出实际错误\r\n closeLoading()\r\n\r\n let errStr = ''\r\n if (typeof err === 'string') {\r\n errStr = err\r\n } else if (typeof err === 'object') {\r\n errStr = JSON.stringify(err)\r\n } else {\r\n errStr = String(err)\r\n }\r\n\r\n options.notify?.error?.(errStr, 'network')\r\n return err\r\n },\r\n )\r\n\r\n return axiosIns\r\n}\r\n\r\nexport default null\r\n","import { RequestOptions } from '../types'\r\nimport { createRequestClient } from './client'\r\n\r\n/**\r\n * 创建请求客户端管理器\r\n * @returns 请求管理器对象\r\n */\r\nexport function createRequestClientManager() {\r\n type ClientType = ReturnType<typeof createRequestClient>\r\n type RequestType = ClientType['request']\r\n\r\n const instances = new Map<string, ClientType>()\r\n\r\n return {\r\n /**\r\n * 注册一个请求实例客户端\r\n * @param options 配置\r\n * @param key 客户端名\r\n */\r\n register(\r\n options: RequestOptions = {\r\n axiosConfig: {},\r\n },\r\n key: string,\r\n ) {\r\n if (instances.has(key)) {\r\n throw new Error(`\"${key}\" 已经存在请求实例,请勿重复注册`)\r\n }\r\n instances.set(key, createRequestClient(options))\r\n },\r\n\r\n /**\r\n * 获取一个指定的请求客户端\r\n * @param key 客户端名\r\n */\r\n get(key: string): ClientType {\r\n const ins = instances.get(key)\r\n if (!ins) {\r\n throw new Error(`\"${key}\" 不存在任何请求客户端,请先注册`)\r\n }\r\n\r\n return ins\r\n },\r\n\r\n /**\r\n * 移除一个请求实例客户端\r\n * @param key 客户端名\r\n */\r\n remove(key: string) {\r\n instances.delete(key)\r\n },\r\n\r\n /**\r\n * 移除当前管理器中的所有请求实例客户端\r\n */\r\n reset() {\r\n instances.clear()\r\n },\r\n\r\n /**\r\n * 根据客户端名,获取一个当前客户端下的请求实例\r\n * @param key 客户端名\r\n */\r\n getRequest(key: string): RequestType {\r\n const ins = instances.get(key)\r\n if (!ins) {\r\n throw new Error(`\"${key}\" 不存在任何请求客户端,请先注册`)\r\n }\r\n\r\n return ins.request\r\n },\r\n }\r\n}\r\n","import { HttpResponse, RequestOptions, StandardRequestConfig } from '../types'\r\nimport { createAxiosIns } from './axios'\r\n\r\n/**\r\n * 创建一个请求客户端\r\n * @param options 配置项\r\n */\r\nexport function createRequestClient(options: RequestOptions) {\r\n // axios实例 此实例针对拦截器进行了一些逻辑处理\r\n const axiosIns = createAxiosIns(options)\r\n\r\n /**\r\n * 标准请求方法\r\n * @template D 返回的值中,data的类型(例如HttpResponse中的Data)\r\n * @template T 返回值的类型,默认为HttpResponse\r\n * @param url 请求地址\r\n * @param config 配置项\r\n */\r\n async function request<D = number, T = HttpResponse<D>>(\r\n url: string,\r\n config?: StandardRequestConfig,\r\n ): Promise<T>\r\n /**\r\n * 标准请求方法\r\n * @template D 返回的值中,data的类型(例如HttpResponse中的Data)\r\n * @template T 返回值的类型,默认为HttpResponse\r\n * @param config 配置项\r\n */\r\n async function request<D = number, T = HttpResponse<D>>(\r\n config: StandardRequestConfig,\r\n ): Promise<T>\r\n async function request<D = number, T = HttpResponse<D>>(\r\n urlOrConfig: string | StandardRequestConfig,\r\n config?: StandardRequestConfig,\r\n ): Promise<T> {\r\n if (!axiosIns) {\r\n throw new Error('请先注册请求函数')\r\n }\r\n\r\n const params: StandardRequestConfig =\r\n typeof urlOrConfig === 'string'\r\n ? {\r\n method: 'post',\r\n ...config,\r\n url: urlOrConfig,\r\n }\r\n : urlOrConfig\r\n\r\n const { data }: { data: T } = await axiosIns(params)\r\n\r\n return data\r\n }\r\n\r\n return {\r\n request,\r\n axiosIns,\r\n }\r\n}\r\n","import { createRequestClientManager } from './core/manager'\r\nimport { proxyRequest } from './core/proxy'\r\nimport { RequestOptions } from './types'\r\n\r\nexport { defineConfig } from './core/config'\r\nexport { createAxiosIns } from './core/axios'\r\nexport { createRequestClientManager }\r\n\r\n// =====================\r\n// 默认单例(SPA / CSR 模式下可以直接使用)\r\n// =====================\r\nconst defaultManager = createRequestClientManager()\r\nconst DEFAULT_KEY = 'default'\r\n\r\n/**\r\n * 注册默认请求客户端\r\n *\r\n * @param opts 配置\r\n */\r\nexport function registerClient(opts: RequestOptions) {\r\n return defaultManager.register(opts, DEFAULT_KEY)\r\n}\r\n/**\r\n * 获取默认客户端\r\n */\r\nexport function getClient() {\r\n return defaultManager.get(DEFAULT_KEY)\r\n}\r\n/**\r\n * 直接发起请求\r\n *\r\n * 客户端:注册的默认客户端\r\n */\r\nexport const request = proxyRequest(() =>\r\n defaultManager.getRequest(DEFAULT_KEY),\r\n)\r\n\r\n// =====================\r\n// types\r\n// =====================\r\nexport { RequestOptions } from './types'\r\n","import { createRequestClient } from './client'\r\n\r\ntype RequestType = ReturnType<typeof createRequestClient>['request']\r\n\r\ntype RequestParams = Parameters<RequestType>\r\ntype RequestResult = ReturnType<RequestType>\r\n\r\nexport function proxyRequest(getter: () => RequestType): RequestType {\r\n const proxy = (...args: RequestParams): RequestResult => {\r\n return getter()(...args)\r\n }\r\n\r\n return proxy as RequestType\r\n}\r\n","import { RequestOptions } from '../types'\r\n\r\n/**\r\n * 定义一个标准的Request配置\r\n * @param config 配置\r\n * @returns\r\n */\r\nexport function defineConfig(config: RequestOptions | (() => RequestOptions)) {\r\n if (typeof config === 'function') {\r\n return config()\r\n }\r\n\r\n return config\r\n}\r\n\r\nexport default null\r\n"],"names":["createAxiosIns","options","tiemerId","closeLoading","setTimeout","toggleWarpLoading","axiosIns","axios","create","axiosConfig","timeout","interceptors","request","use","async","config","Object","assign","openLoading","method","beforeRequest","result","success","Promise","reject","message","err","clearTimeout","tip","contentType","headers","params","data","includes","notQsContentType","qs","stringify","response","afterResponse","console","warn","ignoreStandardHandler","ignoreErrorMsg","ignoreSuccessMsg","Message","String","Code","Success","notify","error","errStr","JSON","createRequestClientManager","instances","Map","register","key","has","Error","set","urlOrConfig","url","createRequestClient","get","ins","remove","delete","reset","clear","getRequest","defaultManager","DEFAULT_KEY","getter","args","opts"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.umd.js","sources":["../src/core/axios.ts","../src/core/manager.ts","../src/core/client.ts","../src/index.ts","../src/core/proxy.ts","../src/core/config.ts"],"sourcesContent":["import qs from 'qs'\r\nimport axios, { type AxiosResponse } from 'axios'\r\nimport { HttpResponse, RequestOptions, StandardRequestConfig } from '../types'\r\n\r\n/** 默认 成功Code值 */\r\nconst SUCCESS_CODE = 0\r\n/** 需要通过qs转换的Content-Type */\r\nconst CONTENT_TYPE_TANSFORM = 'application/x-www-form-urlencoded'\r\n/** 请求超时时间 1分钟 */\r\nconst REQUEST_TIMEOUT = 1000 * 60 * 1\r\n\r\n/**\r\n * 创建一个已经对拦截器做过逻辑处理的Axios实例\r\n * @param options 配置项\r\n * @returns axios实例\r\n */\r\nexport function createAxiosIns(options: RequestOptions) {\r\n // #region loading遮罩层处理\r\n let tiemerId: NodeJS.Timeout\r\n /**\r\n * 关闭遮罩(会延时50ms)\r\n */\r\n const closeLoading = () => {\r\n // 遮罩延迟50毫秒关闭\r\n // 如果有两个连续的请求,使其动画不中断,体验感较好\r\n tiemerId = setTimeout(() => {\r\n options.toggleWarpLoading?.(false)\r\n }, 10)\r\n }\r\n // #endregion\r\n\r\n const axiosIns = axios.create({\r\n ...options.axiosConfig,\r\n timeout: REQUEST_TIMEOUT,\r\n })\r\n // 在发送请求之前做些什么\r\n axiosIns.interceptors.request.use(async (config: StandardRequestConfig) => {\r\n // 合并默认值\r\n Object.assign(config, {\r\n openLoading: config.openLoading ?? true,\r\n method: config.method ?? 'POST',\r\n })\r\n\r\n // 自定义在请求之前做些什么\r\n if (options.beforeRequest) {\r\n try {\r\n // 深拷贝config后传出,避免直接修改config\r\n const deepConfig = JSON.parse(JSON.stringify(config))\r\n\r\n const result = await options.beforeRequest?.(deepConfig)\r\n if (result.success === false) {\r\n // 取消请求\r\n return Promise.reject({ message: result.message || '请求被拦截' })\r\n }\r\n if (result.config) {\r\n config = result.config\r\n }\r\n } catch (err) {\r\n return Promise.reject(err)\r\n }\r\n }\r\n\r\n // 打开遮罩\r\n if (config.openLoading) {\r\n // 如果下一个请求马上进来了,则清除掉计时器\r\n clearTimeout(tiemerId)\r\n options.toggleWarpLoading?.(true, config.tip)\r\n }\r\n\r\n const contentType: string = config.headers?.['Content-Type'] || ''\r\n if (config.method === 'get' || config.method === 'GET') {\r\n config.params = config.data\r\n // 非默认的content-type,不进行qs的转换\r\n } else if (contentType.includes(CONTENT_TYPE_TANSFORM)) {\r\n // qs转格式\r\n if (!config.notQsContentType) {\r\n config.data = qs.stringify(config.data)\r\n }\r\n }\r\n\r\n return config\r\n })\r\n // 在请求成功后做些什么\r\n axiosIns.interceptors.response.use(\r\n async (\r\n response: AxiosResponse & {\r\n config: StandardRequestConfig\r\n },\r\n ) => {\r\n closeLoading()\r\n\r\n // 自定义在请求之后做些什么\r\n if (options.afterResponse) {\r\n try {\r\n await options.afterResponse?.(response)\r\n } catch (err) {\r\n console.warn('[afterResponse 执行异常]', err)\r\n }\r\n }\r\n\r\n // 使用标准返回结构体(HttpResponse)的通用错误处理\r\n // 非HttpResponse,请自行处理\r\n if (!response.config.ignoreStandardHandler) {\r\n const { config } = response\r\n const { ignoreErrorMsg = false, ignoreSuccessMsg = true } = config\r\n\r\n const data = response.data as HttpResponse\r\n const message = data.Message ? String(data.Message) : ''\r\n\r\n if (data.Code === SUCCESS_CODE && data.Success) {\r\n if (!ignoreSuccessMsg) {\r\n options.notify?.success?.(message || '成功')\r\n }\r\n } else if (!ignoreErrorMsg) {\r\n options.notify?.error?.(message || '错误,请联系相关人员!', 'normal')\r\n throw data\r\n }\r\n }\r\n\r\n return response\r\n },\r\n err => {\r\n // 只要服务器返回的code不是200,都会进入该函数,必须抛出实际错误\r\n closeLoading()\r\n\r\n let errStr = ''\r\n if (typeof err === 'string') {\r\n errStr = err\r\n } else if (typeof err === 'object') {\r\n errStr = JSON.stringify(err)\r\n } else {\r\n errStr = String(err)\r\n }\r\n\r\n options.notify?.error?.(errStr, 'network')\r\n return err\r\n },\r\n )\r\n\r\n return axiosIns\r\n}\r\n\r\nexport default null\r\n","import { RequestOptions } from '../types'\r\nimport { createRequestClient } from './client'\r\n\r\n/**\r\n * 创建请求客户端管理器\r\n * @returns 请求管理器对象\r\n */\r\nexport function createRequestClientManager() {\r\n type ClientType = ReturnType<typeof createRequestClient>\r\n type RequestType = ClientType['request']\r\n\r\n const instances = new Map<string, ClientType>()\r\n\r\n return {\r\n /**\r\n * 注册一个请求实例客户端\r\n * @param options 配置\r\n * @param key 客户端名\r\n */\r\n register(\r\n options: RequestOptions = {\r\n axiosConfig: {},\r\n },\r\n key: string,\r\n ) {\r\n if (instances.has(key)) {\r\n throw new Error(`\"${key}\" 已经存在请求实例,请勿重复注册`)\r\n }\r\n instances.set(key, createRequestClient(options))\r\n },\r\n\r\n /**\r\n * 获取一个指定的请求客户端\r\n * @param key 客户端名\r\n */\r\n get(key: string): ClientType {\r\n const ins = instances.get(key)\r\n if (!ins) {\r\n throw new Error(`\"${key}\" 不存在任何请求客户端,请先注册`)\r\n }\r\n\r\n return ins\r\n },\r\n\r\n /**\r\n * 移除一个请求实例客户端\r\n * @param key 客户端名\r\n */\r\n remove(key: string) {\r\n instances.delete(key)\r\n },\r\n\r\n /**\r\n * 移除当前管理器中的所有请求实例客户端\r\n */\r\n reset() {\r\n instances.clear()\r\n },\r\n\r\n /**\r\n * 根据客户端名,获取一个当前客户端下的请求实例\r\n * @param key 客户端名\r\n */\r\n getRequest(key: string): RequestType {\r\n const ins = instances.get(key)\r\n if (!ins) {\r\n throw new Error(`\"${key}\" 不存在任何请求客户端,请先注册`)\r\n }\r\n\r\n return ins.request\r\n },\r\n }\r\n}\r\n","import { HttpResponse, RequestOptions, StandardRequestConfig } from '../types'\r\nimport { createAxiosIns } from './axios'\r\n\r\n/**\r\n * 创建一个请求客户端\r\n * @param options 配置项\r\n */\r\nexport function createRequestClient(options: RequestOptions) {\r\n // axios实例 此实例针对拦截器进行了一些逻辑处理\r\n const axiosIns = createAxiosIns(options)\r\n\r\n /**\r\n * 标准请求方法\r\n * @template D 返回的值中,data的类型(例如HttpResponse中的Data)\r\n * @template T 返回值的类型,默认为HttpResponse\r\n * @param url 请求地址\r\n * @param config 配置项\r\n */\r\n async function request<D = number, T = HttpResponse<D>>(\r\n url: string,\r\n config?: StandardRequestConfig,\r\n ): Promise<T>\r\n /**\r\n * 标准请求方法\r\n * @template D 返回的值中,data的类型(例如HttpResponse中的Data)\r\n * @template T 返回值的类型,默认为HttpResponse\r\n * @param config 配置项\r\n */\r\n async function request<D = number, T = HttpResponse<D>>(\r\n config: StandardRequestConfig,\r\n ): Promise<T>\r\n async function request<D = number, T = HttpResponse<D>>(\r\n urlOrConfig: string | StandardRequestConfig,\r\n config?: StandardRequestConfig,\r\n ): Promise<T> {\r\n if (!axiosIns) {\r\n throw new Error('请先注册请求函数')\r\n }\r\n\r\n const params: StandardRequestConfig =\r\n typeof urlOrConfig === 'string'\r\n ? {\r\n method: 'post',\r\n ...config,\r\n url: urlOrConfig,\r\n }\r\n : urlOrConfig\r\n\r\n const { data }: { data: T } = await axiosIns(params)\r\n\r\n return data\r\n }\r\n\r\n return {\r\n request,\r\n axiosIns,\r\n }\r\n}\r\n","import { createRequestClientManager } from './core/manager'\r\nimport { proxyRequest } from './core/proxy'\r\nimport { RequestOptions } from './types'\r\n\r\nexport { defineConfig } from './core/config'\r\nexport { createAxiosIns } from './core/axios'\r\nexport { createRequestClientManager }\r\n\r\n// =====================\r\n// 默认单例(SPA / CSR 模式下可以直接使用)\r\n// =====================\r\nconst defaultManager = createRequestClientManager()\r\nconst DEFAULT_KEY = 'default'\r\n\r\n/**\r\n * 注册默认请求客户端\r\n *\r\n * @param opts 配置\r\n */\r\nexport function registerClient(opts: RequestOptions) {\r\n return defaultManager.register(opts, DEFAULT_KEY)\r\n}\r\n/**\r\n * 获取默认客户端\r\n */\r\nexport function getClient() {\r\n return defaultManager.get(DEFAULT_KEY)\r\n}\r\n/**\r\n * 直接发起请求\r\n *\r\n * 客户端:注册的默认客户端\r\n */\r\nexport const request = proxyRequest(() =>\r\n defaultManager.getRequest(DEFAULT_KEY),\r\n)\r\n\r\n// =====================\r\n// types\r\n// =====================\r\nexport * from './types'\r\n","import { createRequestClient } from './client'\r\n\r\ntype RequestType = ReturnType<typeof createRequestClient>['request']\r\n\r\ntype RequestParams = Parameters<RequestType>\r\ntype RequestResult = ReturnType<RequestType>\r\n\r\nexport function proxyRequest(getter: () => RequestType): RequestType {\r\n const proxy = (...args: RequestParams): RequestResult => {\r\n return getter()(...args)\r\n }\r\n\r\n return proxy as RequestType\r\n}\r\n","import { RequestOptions } from '../types'\r\n\r\n/**\r\n * 定义一个标准的Request配置\r\n * @param config 配置\r\n * @returns\r\n */\r\nexport function defineConfig(config: RequestOptions | (() => RequestOptions)) {\r\n if (typeof config === 'function') {\r\n return config()\r\n }\r\n\r\n return config\r\n}\r\n\r\nexport default null\r\n"],"names":["createAxiosIns","options","tiemerId","closeLoading","setTimeout","toggleWarpLoading","axiosIns","axios","create","axiosConfig","timeout","interceptors","request","use","async","config","Object","assign","openLoading","method","beforeRequest","deepConfig","JSON","parse","stringify","result","success","Promise","reject","message","err","clearTimeout","tip","contentType","headers","params","data","includes","notQsContentType","qs","response","afterResponse","console","warn","ignoreStandardHandler","ignoreErrorMsg","ignoreSuccessMsg","Message","String","Code","Success","notify","error","errStr","createRequestClientManager","instances","Map","register","key","has","Error","set","urlOrConfig","url","createRequestClient","get","ins","remove","delete","reset","clear","getRequest","defaultManager","DEFAULT_KEY","getter","args","opts"],"mappings":"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"}
|
package/dist/types/index.d.ts
CHANGED
|
@@ -65,17 +65,22 @@ export interface RequestOptions {
|
|
|
65
65
|
error?(msg: string, type?: 'normal' | 'network'): void;
|
|
66
66
|
};
|
|
67
67
|
/**
|
|
68
|
-
*
|
|
68
|
+
* 在请求拦截器中执行
|
|
69
|
+
*
|
|
70
|
+
* 函数抛错 或者 返回success为false,会终止请求
|
|
71
|
+
* 返回了 config 时,会直接采用返回的config进行后续处理
|
|
69
72
|
*/
|
|
70
73
|
beforeRequest?: (config: StandardRequestConfig) => {
|
|
71
74
|
success: boolean;
|
|
72
75
|
message?: string;
|
|
76
|
+
config?: StandardRequestConfig;
|
|
73
77
|
} | Promise<{
|
|
74
78
|
success: boolean;
|
|
75
79
|
message?: string;
|
|
80
|
+
config?: StandardRequestConfig;
|
|
76
81
|
}>;
|
|
77
82
|
/**
|
|
78
|
-
*
|
|
83
|
+
* 在响应拦截器中成功返回后执行(不管 Code 是否为 0)
|
|
79
84
|
*/
|
|
80
85
|
afterResponse?: (response: AxiosResponse & {
|
|
81
86
|
config: StandardRequestConfig;
|