@yeepay/client-utils 2.4.0 → 3.0.0
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/README.md +2 -0
- package/dist/index.d.ts +22 -18
- package/dist/index.js +176 -224
- package/package.json +11 -12
- package/dist/index.d.mts +0 -32
- package/dist/index.mjs +0 -203
package/README.md
CHANGED
|
@@ -2,6 +2,8 @@
|
|
|
2
2
|
|
|
3
3
|
[](https://npmjs.com/package/@yeepay/client-utils)
|
|
4
4
|
|
|
5
|
+
> 3.0 版本之后,ESMOnly.
|
|
6
|
+
|
|
5
7
|
- **getQueryObject**: 获取 url 参数
|
|
6
8
|
- **setTokenFromUrl(key)**: 通过 url 中的参数 key 设置 TOKEN, 并存入 cookie 中
|
|
7
9
|
- **getToken**: 从 cookie 中获取 TOKEN
|
package/dist/index.d.ts
CHANGED
|
@@ -1,32 +1,36 @@
|
|
|
1
|
-
import { AxiosInstance, AxiosResponse, InternalAxiosRequestConfig } from
|
|
2
|
-
|
|
3
|
-
declare function getQueryObject(url?: string): Record<string, string>;
|
|
1
|
+
import { AxiosInstance, AxiosResponse, InternalAxiosRequestConfig } from "axios";
|
|
4
2
|
|
|
3
|
+
//#region src/request/index.d.ts
|
|
5
4
|
interface ServiceFactoryOptions {
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
5
|
+
baseUrl?: string;
|
|
6
|
+
timeout?: number;
|
|
7
|
+
headers?: Record<string, string>;
|
|
8
|
+
code?: string | number;
|
|
9
|
+
debug?: boolean;
|
|
10
|
+
mockModules?: Record<string, unknown | (() => Promise<unknown>)>;
|
|
11
11
|
}
|
|
12
12
|
interface ServiceFactoryCallbacks {
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
13
|
+
successCallback?: (response: AxiosResponse<any>) => any;
|
|
14
|
+
failCallback?: (error: any) => any;
|
|
15
|
+
unauthorizedCallback?: (response: AxiosResponse<any>) => any;
|
|
16
|
+
forbiddenCallback?: (response: AxiosResponse<any> | any) => any;
|
|
17
|
+
notfoundCallback?: (response: AxiosResponse<any> | any) => any;
|
|
18
|
+
requestInterceptor?: (config: InternalAxiosRequestConfig) => InternalAxiosRequestConfig;
|
|
19
|
+
responseInterceptor?: (response: AxiosResponse<any>) => AxiosResponse<any>;
|
|
20
20
|
}
|
|
21
21
|
type ServiceFactoryCallbacksCompatible = [ServiceFactoryCallbacks['successCallback']?, ServiceFactoryCallbacks['failCallback']?, ServiceFactoryCallbacks['unauthorizedCallback']?, ServiceFactoryCallbacks['forbiddenCallback']?, ServiceFactoryCallbacks['notfoundCallback']?, ServiceFactoryCallbacks['requestInterceptor']?, ServiceFactoryCallbacks['responseInterceptor']?];
|
|
22
22
|
declare function serviceFactory(options: ServiceFactoryOptions, callbacks: ServiceFactoryCallbacks): AxiosInstance;
|
|
23
23
|
declare function serviceFactory(options: ServiceFactoryOptions, ...callbacks: ServiceFactoryCallbacksCompatible): AxiosInstance;
|
|
24
|
-
|
|
24
|
+
//#endregion
|
|
25
|
+
//#region src/request/token.d.ts
|
|
25
26
|
declare function getToken(): string | undefined;
|
|
26
27
|
/**
|
|
27
28
|
* method set token from url.
|
|
28
29
|
*/
|
|
29
30
|
declare function setTokenFromUrl(key: string): void;
|
|
30
31
|
declare function removeToken(): void;
|
|
31
|
-
|
|
32
|
-
|
|
32
|
+
//#endregion
|
|
33
|
+
//#region src/utils.d.ts
|
|
34
|
+
declare function getQueryObject(url?: string): Record<string, string>;
|
|
35
|
+
//#endregion
|
|
36
|
+
export { getQueryObject, getToken, removeToken, serviceFactory, setTokenFromUrl };
|
package/dist/index.js
CHANGED
|
@@ -1,244 +1,196 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
6
|
-
var __getProtoOf = Object.getPrototypeOf;
|
|
7
|
-
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
8
|
-
var __export = (target, all) => {
|
|
9
|
-
for (var name in all)
|
|
10
|
-
__defProp(target, name, { get: all[name], enumerable: true });
|
|
11
|
-
};
|
|
12
|
-
var __copyProps = (to, from, except, desc) => {
|
|
13
|
-
if (from && typeof from === "object" || typeof from === "function") {
|
|
14
|
-
for (let key of __getOwnPropNames(from))
|
|
15
|
-
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
16
|
-
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
17
|
-
}
|
|
18
|
-
return to;
|
|
19
|
-
};
|
|
20
|
-
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
21
|
-
// If the importer is in node compatibility mode or this is not an ESM
|
|
22
|
-
// file that has been converted to a CommonJS file using a Babel-
|
|
23
|
-
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
24
|
-
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
25
|
-
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
26
|
-
mod
|
|
27
|
-
));
|
|
28
|
-
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
1
|
+
import { toArray } from "@imyangyong/utils";
|
|
2
|
+
import axios from "axios";
|
|
3
|
+
import AxiosMockAdapter from "axios-mock-adapter";
|
|
4
|
+
import Cookie from "js-cookie";
|
|
29
5
|
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
6
|
+
//#region src/request/mock.ts
|
|
7
|
+
/**
|
|
8
|
+
* 查找数组中最长相同前缀子序列
|
|
9
|
+
*/
|
|
10
|
+
function longestCommonPrefix(strs) {
|
|
11
|
+
if (!strs || strs.length === 0) return "";
|
|
12
|
+
let prefix = strs[0];
|
|
13
|
+
for (let i = 1; i < strs.length; i++) while (strs[i].indexOf(prefix) !== 0) {
|
|
14
|
+
prefix = prefix.substring(0, prefix.length - 1);
|
|
15
|
+
if (!prefix) return "";
|
|
16
|
+
}
|
|
17
|
+
return prefix;
|
|
18
|
+
}
|
|
19
|
+
function setupMockAdapter(axiosInstance, mockModules) {
|
|
20
|
+
if (!mockModules) return;
|
|
21
|
+
const mock = new AxiosMockAdapter(axiosInstance);
|
|
22
|
+
const paths = Object.keys(mockModules);
|
|
23
|
+
const longestPrefix = longestCommonPrefix(paths);
|
|
24
|
+
paths.forEach((path) => {
|
|
25
|
+
const longestPrefixIndex = longestPrefix.lastIndexOf("/");
|
|
26
|
+
const dotIndex = path.lastIndexOf(".");
|
|
27
|
+
const uri = path.slice(longestPrefixIndex, dotIndex);
|
|
28
|
+
const registerMock = (mod) => {
|
|
29
|
+
mock.onAny(new RegExp(uri)).reply(200, mod);
|
|
30
|
+
};
|
|
31
|
+
if (typeof mockModules[path] === "function") mockModules[path]().then(registerMock).catch((error) => {
|
|
32
|
+
console.error(`@yeepay/client-utils mock trying to loading ${path} failed`, error);
|
|
33
|
+
});
|
|
34
|
+
else registerMock(mockModules[path]);
|
|
35
|
+
});
|
|
36
|
+
}
|
|
40
37
|
|
|
41
|
-
|
|
38
|
+
//#endregion
|
|
39
|
+
//#region src/utils.ts
|
|
42
40
|
function getQueryObject(url) {
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
41
|
+
url = !url ? window.location.href : url;
|
|
42
|
+
const search = url.substring(url.lastIndexOf("?") + 1);
|
|
43
|
+
const obj = {};
|
|
44
|
+
const reg = /([^?&=]+)=([^?&=]*)/g;
|
|
45
|
+
search.replace(reg, (rs, $1, $2) => {
|
|
46
|
+
const name = decodeURIComponent($1);
|
|
47
|
+
let val = decodeURIComponent($2);
|
|
48
|
+
val = String(val);
|
|
49
|
+
obj[name] = val;
|
|
50
|
+
return rs;
|
|
51
|
+
});
|
|
52
|
+
return obj;
|
|
55
53
|
}
|
|
56
54
|
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
// src/request/token.ts
|
|
62
|
-
var import_js_cookie = __toESM(require("js-cookie"));
|
|
63
|
-
var TokenKey = "TOKEN";
|
|
64
|
-
var urlToken = "";
|
|
55
|
+
//#endregion
|
|
56
|
+
//#region src/request/token.ts
|
|
57
|
+
const TokenKey = "TOKEN";
|
|
58
|
+
let urlToken = "";
|
|
65
59
|
function getToken() {
|
|
66
|
-
|
|
60
|
+
return urlToken || Cookie.get(TokenKey);
|
|
67
61
|
}
|
|
62
|
+
/**
|
|
63
|
+
* method set token from url.
|
|
64
|
+
*/
|
|
68
65
|
function setTokenFromUrl(key) {
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
null,
|
|
79
|
-
"",
|
|
80
|
-
window.location.href.replace(reg, (_matched) => "")
|
|
81
|
-
);
|
|
82
|
-
}
|
|
66
|
+
urlToken = getQueryObject(window.location.href)[key];
|
|
67
|
+
if (urlToken) {
|
|
68
|
+
const hashIndex = urlToken.indexOf("#");
|
|
69
|
+
if (hashIndex !== -1) urlToken = urlToken.slice(0, hashIndex);
|
|
70
|
+
urlToken = `Bearer ${urlToken}`;
|
|
71
|
+
Cookie.set(TokenKey, urlToken);
|
|
72
|
+
const reg = /* @__PURE__ */ new RegExp(`(${key}=[^&]+&?)`);
|
|
73
|
+
window.history.replaceState(null, "", window.location.href.replace(reg, (_matched) => ""));
|
|
74
|
+
}
|
|
83
75
|
}
|
|
84
76
|
function removeToken() {
|
|
85
|
-
|
|
77
|
+
return Cookie.remove(TokenKey);
|
|
86
78
|
}
|
|
87
79
|
|
|
88
|
-
|
|
80
|
+
//#endregion
|
|
81
|
+
//#region src/request/index.ts
|
|
89
82
|
function verifySuccessCode(code, customCode) {
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
return code === 0 || code === "0" || code === "000000" || code === 200 || !code;
|
|
83
|
+
if (customCode) return toArray(customCode).includes(code) || !code;
|
|
84
|
+
return code === 0 || code === "0" || code === "000000" || code === 200 || !code;
|
|
93
85
|
}
|
|
94
86
|
function compatibleCallback(compatibleCallbacks = []) {
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
} else {
|
|
106
|
-
return compatibleCallbacks[0];
|
|
107
|
-
}
|
|
87
|
+
if (Array.isArray(compatibleCallbacks) && compatibleCallbacks.length && typeof compatibleCallbacks[0] === "function") return {
|
|
88
|
+
successCallback: compatibleCallbacks[0] || (() => ({})),
|
|
89
|
+
failCallback: compatibleCallbacks[1] || (() => ({})),
|
|
90
|
+
unauthorizedCallback: compatibleCallbacks[2] || (() => ({})),
|
|
91
|
+
forbiddenCallback: compatibleCallbacks[3] || (() => ({})),
|
|
92
|
+
notfoundCallback: compatibleCallbacks[4] || (() => ({})),
|
|
93
|
+
requestInterceptor: compatibleCallbacks[5] || ((c) => c),
|
|
94
|
+
responseInterceptor: compatibleCallbacks[6] || ((r) => r)
|
|
95
|
+
};
|
|
96
|
+
else return compatibleCallbacks[0];
|
|
108
97
|
}
|
|
109
98
|
function blobToJson(blob) {
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
99
|
+
return new Promise((resolve, reject) => {
|
|
100
|
+
const reader = new FileReader();
|
|
101
|
+
reader.onload = (event) => {
|
|
102
|
+
try {
|
|
103
|
+
const jsonString = event.target?.result;
|
|
104
|
+
const jsonObject = JSON.parse(jsonString);
|
|
105
|
+
resolve(jsonObject);
|
|
106
|
+
} catch (error) {
|
|
107
|
+
reject(error);
|
|
108
|
+
}
|
|
109
|
+
};
|
|
110
|
+
reader.onerror = (event) => {
|
|
111
|
+
reject(/* @__PURE__ */ new Error(`Resolve Blob JSON error: ${event.target?.error?.message || "unknown error"}`));
|
|
112
|
+
};
|
|
113
|
+
reader.readAsText(blob);
|
|
114
|
+
});
|
|
126
115
|
}
|
|
127
116
|
function serviceFactory(options, ...callbacks) {
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
} else {
|
|
205
|
-
failCallback(response);
|
|
206
|
-
return Promise.reject(response);
|
|
207
|
-
}
|
|
208
|
-
},
|
|
209
|
-
(error) => {
|
|
210
|
-
if (import_axios.default.isCancel(error))
|
|
211
|
-
return Promise.reject(error);
|
|
212
|
-
let status = 0;
|
|
213
|
-
try {
|
|
214
|
-
status = error.response.status || error.response.data.status;
|
|
215
|
-
} catch (e) {
|
|
216
|
-
if (error.toString().includes("Error: timeout"))
|
|
217
|
-
return Promise.reject(error);
|
|
218
|
-
}
|
|
219
|
-
if (status) {
|
|
220
|
-
if (status === 403)
|
|
221
|
-
forbiddenCallback(error);
|
|
222
|
-
else if (status === 404)
|
|
223
|
-
notfoundCallback(error);
|
|
224
|
-
else
|
|
225
|
-
failCallback(error);
|
|
226
|
-
} else {
|
|
227
|
-
failCallback(error);
|
|
228
|
-
}
|
|
229
|
-
return Promise.reject(error);
|
|
230
|
-
}
|
|
231
|
-
);
|
|
232
|
-
service.interceptors.response.use(responseInterceptor, (error) => {
|
|
233
|
-
return Promise.reject(error);
|
|
234
|
-
});
|
|
235
|
-
return service;
|
|
117
|
+
const { baseUrl = "/", timeout = 12e5, headers, code, debug, mockModules } = options;
|
|
118
|
+
const { successCallback = (_response) => ({}), failCallback = (_error) => ({}), unauthorizedCallback = (_response) => ({}), forbiddenCallback = (_response) => ({}), notfoundCallback = (_response) => ({}), requestInterceptor = (c) => c, responseInterceptor = (r) => r } = compatibleCallback(callbacks);
|
|
119
|
+
const service = axios.create({
|
|
120
|
+
baseURL: baseUrl,
|
|
121
|
+
timeout,
|
|
122
|
+
headers,
|
|
123
|
+
validateStatus(status) {
|
|
124
|
+
return status >= 200 && status < 300 || status === 401 || status === 403 || status === 400 || status === 500;
|
|
125
|
+
}
|
|
126
|
+
});
|
|
127
|
+
/**
|
|
128
|
+
* request拦截器, 先入栈后执行
|
|
129
|
+
*/
|
|
130
|
+
service.interceptors.request.use(requestInterceptor, (error) => {
|
|
131
|
+
console.log(error);
|
|
132
|
+
Promise.reject(error);
|
|
133
|
+
});
|
|
134
|
+
service.interceptors.request.use((config) => {
|
|
135
|
+
config.headers.Authorization = getToken();
|
|
136
|
+
const { method, url = "" } = config;
|
|
137
|
+
if (method === "get") {
|
|
138
|
+
if (!debug) if (url.includes("?")) config.url = `${url}&_t=${(/* @__PURE__ */ new Date()).getTime()}`;
|
|
139
|
+
else config.url = `${url}?_t=${(/* @__PURE__ */ new Date()).getTime()}`;
|
|
140
|
+
}
|
|
141
|
+
return config;
|
|
142
|
+
}, (error) => {
|
|
143
|
+
console.log(error);
|
|
144
|
+
Promise.reject(error);
|
|
145
|
+
});
|
|
146
|
+
/**
|
|
147
|
+
* response 拦截器, 先入栈先执行
|
|
148
|
+
* Blob application/json 类型数据, 需要转换为 json 对象
|
|
149
|
+
*/
|
|
150
|
+
service.interceptors.response.use(async (response) => {
|
|
151
|
+
if (response.data instanceof Blob && response.headers["content-type"]?.split(";")[0]?.trim() === "application/json") {
|
|
152
|
+
response.data = await blobToJson(response.data);
|
|
153
|
+
return response;
|
|
154
|
+
}
|
|
155
|
+
return response;
|
|
156
|
+
}, async (error) => {
|
|
157
|
+
if (error.response.data instanceof Blob && error.response.headers["content-type"]?.split(";")[0]?.trim() === "application/json") error.response.data = await blobToJson(error.response.data);
|
|
158
|
+
return Promise.reject(error);
|
|
159
|
+
});
|
|
160
|
+
service.interceptors.response.use((response) => {
|
|
161
|
+
if (response.status && response.status === 401) return unauthorizedCallback(response);
|
|
162
|
+
if (response.status && response.status === 403) return forbiddenCallback(response);
|
|
163
|
+
if (response.status && (response.status === 400 || response.status === 500)) {
|
|
164
|
+
failCallback(response);
|
|
165
|
+
return Promise.reject(response);
|
|
166
|
+
}
|
|
167
|
+
if (verifySuccessCode(response.data.code, code)) {
|
|
168
|
+
successCallback(response);
|
|
169
|
+
return response;
|
|
170
|
+
} else {
|
|
171
|
+
failCallback(response);
|
|
172
|
+
return Promise.reject(response);
|
|
173
|
+
}
|
|
174
|
+
}, (error) => {
|
|
175
|
+
if (axios.isCancel(error)) return Promise.reject(error);
|
|
176
|
+
let status = 0;
|
|
177
|
+
try {
|
|
178
|
+
status = error.response.status || error.response.data.status;
|
|
179
|
+
} catch {
|
|
180
|
+
if (error.toString().includes("Error: timeout")) return Promise.reject(error);
|
|
181
|
+
}
|
|
182
|
+
if (status) if (status === 403) forbiddenCallback(error);
|
|
183
|
+
else if (status === 404) notfoundCallback(error);
|
|
184
|
+
else failCallback(error);
|
|
185
|
+
else failCallback(error);
|
|
186
|
+
return Promise.reject(error);
|
|
187
|
+
});
|
|
188
|
+
service.interceptors.response.use(responseInterceptor, (error) => {
|
|
189
|
+
return Promise.reject(error);
|
|
190
|
+
});
|
|
191
|
+
if (mockModules) setupMockAdapter(service, mockModules);
|
|
192
|
+
return service;
|
|
236
193
|
}
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
getToken,
|
|
241
|
-
removeToken,
|
|
242
|
-
serviceFactory,
|
|
243
|
-
setTokenFromUrl
|
|
244
|
-
});
|
|
194
|
+
|
|
195
|
+
//#endregion
|
|
196
|
+
export { getQueryObject, getToken, removeToken, serviceFactory, setTokenFromUrl };
|
package/package.json
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@yeepay/client-utils",
|
|
3
|
-
"
|
|
3
|
+
"type": "module",
|
|
4
|
+
"version": "3.0.0",
|
|
4
5
|
"description": "shared utilities for yeepay client packages",
|
|
5
|
-
"author": "
|
|
6
|
+
"author": "Yong Yang",
|
|
6
7
|
"homepage": "http://gitlab.yeepay.com/ued/client-utils#readme",
|
|
7
8
|
"keywords": [
|
|
8
9
|
"utils",
|
|
@@ -10,11 +11,9 @@
|
|
|
10
11
|
],
|
|
11
12
|
"exports": {
|
|
12
13
|
".": {
|
|
13
|
-
"import": "./dist/index.
|
|
14
|
-
"require": "./dist/index.js"
|
|
14
|
+
"import": "./dist/index.js"
|
|
15
15
|
}
|
|
16
16
|
},
|
|
17
|
-
"main": "./dist/index.js",
|
|
18
17
|
"types": "./dist/index.d.ts",
|
|
19
18
|
"files": [
|
|
20
19
|
"dist"
|
|
@@ -22,18 +21,19 @@
|
|
|
22
21
|
"dependencies": {
|
|
23
22
|
"@imyangyong/utils": "^0.8.0",
|
|
24
23
|
"axios": "^1.7.0",
|
|
24
|
+
"axios-mock-adapter": "^2.1.0",
|
|
25
25
|
"js-cookie": "^3.0.5"
|
|
26
26
|
},
|
|
27
27
|
"devDependencies": {
|
|
28
28
|
"@antfu/ni": "^0.21.12",
|
|
29
29
|
"@types/js-cookie": "^3.0.6",
|
|
30
|
-
"@yeepay/eslint-config": "^
|
|
30
|
+
"@yeepay/eslint-config": "^4.17.0",
|
|
31
31
|
"bumpp": "^9.4.1",
|
|
32
|
-
"eslint": "^9.
|
|
32
|
+
"eslint": "^9.32.0",
|
|
33
33
|
"eslint-plugin-format": "^0.1.1",
|
|
34
34
|
"lint-staged": "^15.2.2",
|
|
35
35
|
"simple-git-hooks": "^2.11.1",
|
|
36
|
-
"
|
|
36
|
+
"tsdown": "^0.14.1",
|
|
37
37
|
"typescript": "^5.4.5",
|
|
38
38
|
"vitest": "^1.6.0"
|
|
39
39
|
},
|
|
@@ -44,10 +44,9 @@
|
|
|
44
44
|
"*": "eslint --fix"
|
|
45
45
|
},
|
|
46
46
|
"scripts": {
|
|
47
|
-
"build": "
|
|
48
|
-
"
|
|
49
|
-
"
|
|
50
|
-
"watch": "tsup --format esm,cjs --watch",
|
|
47
|
+
"build": "tsdown",
|
|
48
|
+
"dev": "tsdown --watch",
|
|
49
|
+
"watch": "tsdown --watch",
|
|
51
50
|
"lint": "eslint .",
|
|
52
51
|
"release": "bumpp && pnpm publish",
|
|
53
52
|
"test": "vitest"
|
package/dist/index.d.mts
DELETED
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
import { AxiosInstance, AxiosResponse, InternalAxiosRequestConfig } from 'axios';
|
|
2
|
-
|
|
3
|
-
declare function getQueryObject(url?: string): Record<string, string>;
|
|
4
|
-
|
|
5
|
-
interface ServiceFactoryOptions {
|
|
6
|
-
baseUrl?: string;
|
|
7
|
-
timeout?: number;
|
|
8
|
-
headers?: Record<string, string>;
|
|
9
|
-
code?: string | number;
|
|
10
|
-
debug?: boolean;
|
|
11
|
-
}
|
|
12
|
-
interface ServiceFactoryCallbacks {
|
|
13
|
-
successCallback?: (response: AxiosResponse<any>) => any;
|
|
14
|
-
failCallback?: (error: any) => any;
|
|
15
|
-
unauthorizedCallback?: (response: AxiosResponse<any>) => any;
|
|
16
|
-
forbiddenCallback?: (response: AxiosResponse<any> | any) => any;
|
|
17
|
-
notfoundCallback?: (response: AxiosResponse<any> | any) => any;
|
|
18
|
-
requestInterceptor?: (config: InternalAxiosRequestConfig) => InternalAxiosRequestConfig;
|
|
19
|
-
responseInterceptor?: (response: AxiosResponse<any>) => AxiosResponse<any>;
|
|
20
|
-
}
|
|
21
|
-
type ServiceFactoryCallbacksCompatible = [ServiceFactoryCallbacks['successCallback']?, ServiceFactoryCallbacks['failCallback']?, ServiceFactoryCallbacks['unauthorizedCallback']?, ServiceFactoryCallbacks['forbiddenCallback']?, ServiceFactoryCallbacks['notfoundCallback']?, ServiceFactoryCallbacks['requestInterceptor']?, ServiceFactoryCallbacks['responseInterceptor']?];
|
|
22
|
-
declare function serviceFactory(options: ServiceFactoryOptions, callbacks: ServiceFactoryCallbacks): AxiosInstance;
|
|
23
|
-
declare function serviceFactory(options: ServiceFactoryOptions, ...callbacks: ServiceFactoryCallbacksCompatible): AxiosInstance;
|
|
24
|
-
|
|
25
|
-
declare function getToken(): string | undefined;
|
|
26
|
-
/**
|
|
27
|
-
* method set token from url.
|
|
28
|
-
*/
|
|
29
|
-
declare function setTokenFromUrl(key: string): void;
|
|
30
|
-
declare function removeToken(): void;
|
|
31
|
-
|
|
32
|
-
export { getQueryObject, getToken, removeToken, serviceFactory, setTokenFromUrl };
|
package/dist/index.mjs
DELETED
|
@@ -1,203 +0,0 @@
|
|
|
1
|
-
// src/utils.ts
|
|
2
|
-
function getQueryObject(url) {
|
|
3
|
-
url = !url ? window.location.href : url;
|
|
4
|
-
const search = url.substring(url.lastIndexOf("?") + 1);
|
|
5
|
-
const obj = {};
|
|
6
|
-
const reg = /([^?&=]+)=([^?&=]*)/g;
|
|
7
|
-
search.replace(reg, (rs, $1, $2) => {
|
|
8
|
-
const name = decodeURIComponent($1);
|
|
9
|
-
let val = decodeURIComponent($2);
|
|
10
|
-
val = String(val);
|
|
11
|
-
obj[name] = val;
|
|
12
|
-
return rs;
|
|
13
|
-
});
|
|
14
|
-
return obj;
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
// src/request/index.ts
|
|
18
|
-
import axios from "axios";
|
|
19
|
-
import { toArray } from "@imyangyong/utils";
|
|
20
|
-
|
|
21
|
-
// src/request/token.ts
|
|
22
|
-
import Cookie from "js-cookie";
|
|
23
|
-
var TokenKey = "TOKEN";
|
|
24
|
-
var urlToken = "";
|
|
25
|
-
function getToken() {
|
|
26
|
-
return urlToken || Cookie.get(TokenKey);
|
|
27
|
-
}
|
|
28
|
-
function setTokenFromUrl(key) {
|
|
29
|
-
urlToken = getQueryObject(window.location.href)[key];
|
|
30
|
-
if (urlToken) {
|
|
31
|
-
const hashIndex = urlToken.indexOf("#");
|
|
32
|
-
if (hashIndex !== -1)
|
|
33
|
-
urlToken = urlToken.slice(0, hashIndex);
|
|
34
|
-
urlToken = `Bearer ${urlToken}`;
|
|
35
|
-
Cookie.set(TokenKey, urlToken);
|
|
36
|
-
const reg = new RegExp(`(${key}=[^&]+&?)`);
|
|
37
|
-
window.history.replaceState(
|
|
38
|
-
null,
|
|
39
|
-
"",
|
|
40
|
-
window.location.href.replace(reg, (_matched) => "")
|
|
41
|
-
);
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
function removeToken() {
|
|
45
|
-
return Cookie.remove(TokenKey);
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
// src/request/index.ts
|
|
49
|
-
function verifySuccessCode(code, customCode) {
|
|
50
|
-
if (customCode)
|
|
51
|
-
return toArray(customCode).includes(code) || !code;
|
|
52
|
-
return code === 0 || code === "0" || code === "000000" || code === 200 || !code;
|
|
53
|
-
}
|
|
54
|
-
function compatibleCallback(compatibleCallbacks = []) {
|
|
55
|
-
if (Array.isArray(compatibleCallbacks) && compatibleCallbacks.length && typeof compatibleCallbacks[0] === "function") {
|
|
56
|
-
return {
|
|
57
|
-
successCallback: compatibleCallbacks[0] || (() => ({})),
|
|
58
|
-
failCallback: compatibleCallbacks[1] || (() => ({})),
|
|
59
|
-
unauthorizedCallback: compatibleCallbacks[2] || (() => ({})),
|
|
60
|
-
forbiddenCallback: compatibleCallbacks[3] || (() => ({})),
|
|
61
|
-
notfoundCallback: compatibleCallbacks[4] || (() => ({})),
|
|
62
|
-
requestInterceptor: compatibleCallbacks[5] || ((c) => c),
|
|
63
|
-
responseInterceptor: compatibleCallbacks[6] || ((r) => r)
|
|
64
|
-
};
|
|
65
|
-
} else {
|
|
66
|
-
return compatibleCallbacks[0];
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
function blobToJson(blob) {
|
|
70
|
-
return new Promise((resolve, reject) => {
|
|
71
|
-
const reader = new FileReader();
|
|
72
|
-
reader.onload = (event) => {
|
|
73
|
-
try {
|
|
74
|
-
const jsonString = event.target?.result;
|
|
75
|
-
const jsonObject = JSON.parse(jsonString);
|
|
76
|
-
resolve(jsonObject);
|
|
77
|
-
} catch (error) {
|
|
78
|
-
reject(error);
|
|
79
|
-
}
|
|
80
|
-
};
|
|
81
|
-
reader.onerror = (event) => {
|
|
82
|
-
reject(new Error(`Resolve Blob JSON error: ${event.target?.error?.message || "unknown error"}`));
|
|
83
|
-
};
|
|
84
|
-
reader.readAsText(blob);
|
|
85
|
-
});
|
|
86
|
-
}
|
|
87
|
-
function serviceFactory(options, ...callbacks) {
|
|
88
|
-
const {
|
|
89
|
-
baseUrl = "/",
|
|
90
|
-
timeout = 12e5,
|
|
91
|
-
// 默认 2 分钟
|
|
92
|
-
headers,
|
|
93
|
-
code,
|
|
94
|
-
debug
|
|
95
|
-
} = options;
|
|
96
|
-
const {
|
|
97
|
-
successCallback = (_response) => ({}),
|
|
98
|
-
failCallback = (_error) => ({}),
|
|
99
|
-
unauthorizedCallback = (_response) => ({}),
|
|
100
|
-
forbiddenCallback = (_response) => ({}),
|
|
101
|
-
notfoundCallback = (_response) => ({}),
|
|
102
|
-
requestInterceptor = (c) => c,
|
|
103
|
-
responseInterceptor = (r) => r
|
|
104
|
-
} = compatibleCallback(callbacks);
|
|
105
|
-
const service = axios.create({
|
|
106
|
-
baseURL: baseUrl,
|
|
107
|
-
timeout,
|
|
108
|
-
// 请求超时时间
|
|
109
|
-
headers,
|
|
110
|
-
validateStatus(status) {
|
|
111
|
-
return status >= 200 && status < 300 || status === 401 || status === 403 || status === 400 || status === 500;
|
|
112
|
-
}
|
|
113
|
-
});
|
|
114
|
-
service.interceptors.request.use(requestInterceptor, (error) => {
|
|
115
|
-
console.log(error);
|
|
116
|
-
void Promise.reject(error);
|
|
117
|
-
});
|
|
118
|
-
service.interceptors.request.use(
|
|
119
|
-
(config) => {
|
|
120
|
-
config.headers.Authorization = getToken();
|
|
121
|
-
const { method, url = "" } = config;
|
|
122
|
-
if (method === "get") {
|
|
123
|
-
if (!debug) {
|
|
124
|
-
if (url.includes("?"))
|
|
125
|
-
config.url = `${url}&_t=${(/* @__PURE__ */ new Date()).getTime()}`;
|
|
126
|
-
else
|
|
127
|
-
config.url = `${url}?_t=${(/* @__PURE__ */ new Date()).getTime()}`;
|
|
128
|
-
}
|
|
129
|
-
}
|
|
130
|
-
return config;
|
|
131
|
-
},
|
|
132
|
-
(error) => {
|
|
133
|
-
console.log(error);
|
|
134
|
-
void Promise.reject(error);
|
|
135
|
-
}
|
|
136
|
-
);
|
|
137
|
-
service.interceptors.response.use(
|
|
138
|
-
async (response) => {
|
|
139
|
-
if (response.data instanceof Blob && response.headers["content-type"]?.split(";")[0]?.trim() === "application/json") {
|
|
140
|
-
response.data = await blobToJson(response.data);
|
|
141
|
-
return response;
|
|
142
|
-
}
|
|
143
|
-
return response;
|
|
144
|
-
},
|
|
145
|
-
async (error) => {
|
|
146
|
-
if (error.response.data instanceof Blob && error.response.headers["content-type"]?.split(";")[0]?.trim() === "application/json")
|
|
147
|
-
error.response.data = await blobToJson(error.response.data);
|
|
148
|
-
return Promise.reject(error);
|
|
149
|
-
}
|
|
150
|
-
);
|
|
151
|
-
service.interceptors.response.use(
|
|
152
|
-
(response) => {
|
|
153
|
-
if (response.status && response.status === 401)
|
|
154
|
-
return unauthorizedCallback(response);
|
|
155
|
-
if (response.status && response.status === 403)
|
|
156
|
-
return forbiddenCallback(response);
|
|
157
|
-
if (response.status && (response.status === 400 || response.status === 500)) {
|
|
158
|
-
failCallback(response);
|
|
159
|
-
return Promise.reject(response);
|
|
160
|
-
}
|
|
161
|
-
if (verifySuccessCode(response.data.code, code)) {
|
|
162
|
-
successCallback(response);
|
|
163
|
-
return response;
|
|
164
|
-
} else {
|
|
165
|
-
failCallback(response);
|
|
166
|
-
return Promise.reject(response);
|
|
167
|
-
}
|
|
168
|
-
},
|
|
169
|
-
(error) => {
|
|
170
|
-
if (axios.isCancel(error))
|
|
171
|
-
return Promise.reject(error);
|
|
172
|
-
let status = 0;
|
|
173
|
-
try {
|
|
174
|
-
status = error.response.status || error.response.data.status;
|
|
175
|
-
} catch (e) {
|
|
176
|
-
if (error.toString().includes("Error: timeout"))
|
|
177
|
-
return Promise.reject(error);
|
|
178
|
-
}
|
|
179
|
-
if (status) {
|
|
180
|
-
if (status === 403)
|
|
181
|
-
forbiddenCallback(error);
|
|
182
|
-
else if (status === 404)
|
|
183
|
-
notfoundCallback(error);
|
|
184
|
-
else
|
|
185
|
-
failCallback(error);
|
|
186
|
-
} else {
|
|
187
|
-
failCallback(error);
|
|
188
|
-
}
|
|
189
|
-
return Promise.reject(error);
|
|
190
|
-
}
|
|
191
|
-
);
|
|
192
|
-
service.interceptors.response.use(responseInterceptor, (error) => {
|
|
193
|
-
return Promise.reject(error);
|
|
194
|
-
});
|
|
195
|
-
return service;
|
|
196
|
-
}
|
|
197
|
-
export {
|
|
198
|
-
getQueryObject,
|
|
199
|
-
getToken,
|
|
200
|
-
removeToken,
|
|
201
|
-
serviceFactory,
|
|
202
|
-
setTokenFromUrl
|
|
203
|
-
};
|