@yeepay/client-utils 2.4.0 → 3.0.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/README.md CHANGED
@@ -2,6 +2,8 @@
2
2
 
3
3
  [![npm](https://img.shields.io/npm/v/@yeepay/client-utils?color=444&label=)](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 'axios';
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
- baseUrl?: string;
7
- timeout?: number;
8
- headers?: Record<string, string>;
9
- code?: string | number;
10
- debug?: boolean;
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
- 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>;
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
- export { getQueryObject, getToken, removeToken, serviceFactory, setTokenFromUrl };
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,199 @@
1
- "use strict";
2
- var __create = Object.create;
3
- var __defProp = Object.defineProperty;
4
- var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
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
- // src/index.ts
31
- var src_exports = {};
32
- __export(src_exports, {
33
- getQueryObject: () => getQueryObject,
34
- getToken: () => getToken,
35
- removeToken: () => removeToken,
36
- serviceFactory: () => serviceFactory,
37
- setTokenFromUrl: () => setTokenFromUrl
38
- });
39
- module.exports = __toCommonJS(src_exports);
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 escapeRegExp(string) {
20
+ return string.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
21
+ }
22
+ function setupMockAdapter(axiosInstance, mockModules) {
23
+ if (!mockModules) return;
24
+ const mock = new AxiosMockAdapter(axiosInstance);
25
+ const paths = Object.keys(mockModules);
26
+ const longestPrefix = longestCommonPrefix(paths);
27
+ paths.forEach((path) => {
28
+ const longestPrefixIndex = longestPrefix.lastIndexOf("/");
29
+ const dotIndex = path.lastIndexOf(".");
30
+ const uri = path.slice(longestPrefixIndex, dotIndex);
31
+ const registerMock = (mod) => {
32
+ mock.onAny(/* @__PURE__ */ new RegExp(`^${escapeRegExp(uri)}$`)).reply(200, mod);
33
+ };
34
+ if (typeof mockModules[path] === "function") mockModules[path]().then(registerMock).catch((error) => {
35
+ console.error(`@yeepay/client-utils mock trying to loading ${path} failed`, error);
36
+ });
37
+ else registerMock(mockModules[path]);
38
+ });
39
+ }
40
40
 
41
- // src/utils.ts
41
+ //#endregion
42
+ //#region src/utils.ts
42
43
  function getQueryObject(url) {
43
- url = !url ? window.location.href : url;
44
- const search = url.substring(url.lastIndexOf("?") + 1);
45
- const obj = {};
46
- const reg = /([^?&=]+)=([^?&=]*)/g;
47
- search.replace(reg, (rs, $1, $2) => {
48
- const name = decodeURIComponent($1);
49
- let val = decodeURIComponent($2);
50
- val = String(val);
51
- obj[name] = val;
52
- return rs;
53
- });
54
- return obj;
44
+ url = !url ? window.location.href : url;
45
+ const search = url.substring(url.lastIndexOf("?") + 1);
46
+ const obj = {};
47
+ const reg = /([^?&=]+)=([^?&=]*)/g;
48
+ search.replace(reg, (rs, $1, $2) => {
49
+ const name = decodeURIComponent($1);
50
+ let val = decodeURIComponent($2);
51
+ val = String(val);
52
+ obj[name] = val;
53
+ return rs;
54
+ });
55
+ return obj;
55
56
  }
56
57
 
57
- // src/request/index.ts
58
- var import_axios = __toESM(require("axios"));
59
- var import_utils2 = require("@imyangyong/utils");
60
-
61
- // src/request/token.ts
62
- var import_js_cookie = __toESM(require("js-cookie"));
63
- var TokenKey = "TOKEN";
64
- var urlToken = "";
58
+ //#endregion
59
+ //#region src/request/token.ts
60
+ const TokenKey = "TOKEN";
61
+ let urlToken = "";
65
62
  function getToken() {
66
- return urlToken || import_js_cookie.default.get(TokenKey);
63
+ return urlToken || Cookie.get(TokenKey);
67
64
  }
65
+ /**
66
+ * method set token from url.
67
+ */
68
68
  function setTokenFromUrl(key) {
69
- urlToken = getQueryObject(window.location.href)[key];
70
- if (urlToken) {
71
- const hashIndex = urlToken.indexOf("#");
72
- if (hashIndex !== -1)
73
- urlToken = urlToken.slice(0, hashIndex);
74
- urlToken = `Bearer ${urlToken}`;
75
- import_js_cookie.default.set(TokenKey, urlToken);
76
- const reg = new RegExp(`(${key}=[^&]+&?)`);
77
- window.history.replaceState(
78
- null,
79
- "",
80
- window.location.href.replace(reg, (_matched) => "")
81
- );
82
- }
69
+ urlToken = getQueryObject(window.location.href)[key];
70
+ if (urlToken) {
71
+ const hashIndex = urlToken.indexOf("#");
72
+ if (hashIndex !== -1) urlToken = urlToken.slice(0, hashIndex);
73
+ urlToken = `Bearer ${urlToken}`;
74
+ Cookie.set(TokenKey, urlToken);
75
+ const reg = /* @__PURE__ */ new RegExp(`(${key}=[^&]+&?)`);
76
+ window.history.replaceState(null, "", window.location.href.replace(reg, (_matched) => ""));
77
+ }
83
78
  }
84
79
  function removeToken() {
85
- return import_js_cookie.default.remove(TokenKey);
80
+ return Cookie.remove(TokenKey);
86
81
  }
87
82
 
88
- // src/request/index.ts
83
+ //#endregion
84
+ //#region src/request/index.ts
89
85
  function verifySuccessCode(code, customCode) {
90
- if (customCode)
91
- return (0, import_utils2.toArray)(customCode).includes(code) || !code;
92
- return code === 0 || code === "0" || code === "000000" || code === 200 || !code;
86
+ if (customCode) return toArray(customCode).includes(code) || !code;
87
+ return code === 0 || code === "0" || code === "000000" || code === 200 || !code;
93
88
  }
94
89
  function compatibleCallback(compatibleCallbacks = []) {
95
- if (Array.isArray(compatibleCallbacks) && compatibleCallbacks.length && typeof compatibleCallbacks[0] === "function") {
96
- return {
97
- successCallback: compatibleCallbacks[0] || (() => ({})),
98
- failCallback: compatibleCallbacks[1] || (() => ({})),
99
- unauthorizedCallback: compatibleCallbacks[2] || (() => ({})),
100
- forbiddenCallback: compatibleCallbacks[3] || (() => ({})),
101
- notfoundCallback: compatibleCallbacks[4] || (() => ({})),
102
- requestInterceptor: compatibleCallbacks[5] || ((c) => c),
103
- responseInterceptor: compatibleCallbacks[6] || ((r) => r)
104
- };
105
- } else {
106
- return compatibleCallbacks[0];
107
- }
90
+ if (Array.isArray(compatibleCallbacks) && compatibleCallbacks.length && typeof compatibleCallbacks[0] === "function") return {
91
+ successCallback: compatibleCallbacks[0] || (() => ({})),
92
+ failCallback: compatibleCallbacks[1] || (() => ({})),
93
+ unauthorizedCallback: compatibleCallbacks[2] || (() => ({})),
94
+ forbiddenCallback: compatibleCallbacks[3] || (() => ({})),
95
+ notfoundCallback: compatibleCallbacks[4] || (() => ({})),
96
+ requestInterceptor: compatibleCallbacks[5] || ((c) => c),
97
+ responseInterceptor: compatibleCallbacks[6] || ((r) => r)
98
+ };
99
+ else return compatibleCallbacks[0];
108
100
  }
109
101
  function blobToJson(blob) {
110
- return new Promise((resolve, reject) => {
111
- const reader = new FileReader();
112
- reader.onload = (event) => {
113
- try {
114
- const jsonString = event.target?.result;
115
- const jsonObject = JSON.parse(jsonString);
116
- resolve(jsonObject);
117
- } catch (error) {
118
- reject(error);
119
- }
120
- };
121
- reader.onerror = (event) => {
122
- reject(new Error(`Resolve Blob JSON error: ${event.target?.error?.message || "unknown error"}`));
123
- };
124
- reader.readAsText(blob);
125
- });
102
+ return new Promise((resolve, reject) => {
103
+ const reader = new FileReader();
104
+ reader.onload = (event) => {
105
+ try {
106
+ const jsonString = event.target?.result;
107
+ const jsonObject = JSON.parse(jsonString);
108
+ resolve(jsonObject);
109
+ } catch (error) {
110
+ reject(error);
111
+ }
112
+ };
113
+ reader.onerror = (event) => {
114
+ reject(/* @__PURE__ */ new Error(`Resolve Blob JSON error: ${event.target?.error?.message || "unknown error"}`));
115
+ };
116
+ reader.readAsText(blob);
117
+ });
126
118
  }
127
119
  function serviceFactory(options, ...callbacks) {
128
- const {
129
- baseUrl = "/",
130
- timeout = 12e5,
131
- // 默认 2 分钟
132
- headers,
133
- code,
134
- debug
135
- } = options;
136
- const {
137
- successCallback = (_response) => ({}),
138
- failCallback = (_error) => ({}),
139
- unauthorizedCallback = (_response) => ({}),
140
- forbiddenCallback = (_response) => ({}),
141
- notfoundCallback = (_response) => ({}),
142
- requestInterceptor = (c) => c,
143
- responseInterceptor = (r) => r
144
- } = compatibleCallback(callbacks);
145
- const service = import_axios.default.create({
146
- baseURL: baseUrl,
147
- timeout,
148
- // 请求超时时间
149
- headers,
150
- validateStatus(status) {
151
- return status >= 200 && status < 300 || status === 401 || status === 403 || status === 400 || status === 500;
152
- }
153
- });
154
- service.interceptors.request.use(requestInterceptor, (error) => {
155
- console.log(error);
156
- void Promise.reject(error);
157
- });
158
- service.interceptors.request.use(
159
- (config) => {
160
- config.headers.Authorization = getToken();
161
- const { method, url = "" } = config;
162
- if (method === "get") {
163
- if (!debug) {
164
- if (url.includes("?"))
165
- config.url = `${url}&_t=${(/* @__PURE__ */ new Date()).getTime()}`;
166
- else
167
- config.url = `${url}?_t=${(/* @__PURE__ */ new Date()).getTime()}`;
168
- }
169
- }
170
- return config;
171
- },
172
- (error) => {
173
- console.log(error);
174
- void Promise.reject(error);
175
- }
176
- );
177
- service.interceptors.response.use(
178
- async (response) => {
179
- if (response.data instanceof Blob && response.headers["content-type"]?.split(";")[0]?.trim() === "application/json") {
180
- response.data = await blobToJson(response.data);
181
- return response;
182
- }
183
- return response;
184
- },
185
- async (error) => {
186
- if (error.response.data instanceof Blob && error.response.headers["content-type"]?.split(";")[0]?.trim() === "application/json")
187
- error.response.data = await blobToJson(error.response.data);
188
- return Promise.reject(error);
189
- }
190
- );
191
- service.interceptors.response.use(
192
- (response) => {
193
- if (response.status && response.status === 401)
194
- return unauthorizedCallback(response);
195
- if (response.status && response.status === 403)
196
- return forbiddenCallback(response);
197
- if (response.status && (response.status === 400 || response.status === 500)) {
198
- failCallback(response);
199
- return Promise.reject(response);
200
- }
201
- if (verifySuccessCode(response.data.code, code)) {
202
- successCallback(response);
203
- return response;
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;
120
+ const { baseUrl = "/", timeout = 12e5, headers, code, debug, mockModules } = options;
121
+ const { successCallback = (_response) => ({}), failCallback = (_error) => ({}), unauthorizedCallback = (_response) => ({}), forbiddenCallback = (_response) => ({}), notfoundCallback = (_response) => ({}), requestInterceptor = (c) => c, responseInterceptor = (r) => r } = compatibleCallback(callbacks);
122
+ const service = axios.create({
123
+ baseURL: baseUrl,
124
+ timeout,
125
+ headers,
126
+ validateStatus(status) {
127
+ return status >= 200 && status < 300 || status === 401 || status === 403 || status === 400 || status === 500;
128
+ }
129
+ });
130
+ /**
131
+ * request拦截器, 先入栈后执行
132
+ */
133
+ service.interceptors.request.use(requestInterceptor, (error) => {
134
+ console.log(error);
135
+ Promise.reject(error);
136
+ });
137
+ service.interceptors.request.use((config) => {
138
+ config.headers.Authorization = getToken();
139
+ const { method, url = "" } = config;
140
+ if (method === "get") {
141
+ if (!debug) if (url.includes("?")) config.url = `${url}&_t=${(/* @__PURE__ */ new Date()).getTime()}`;
142
+ else config.url = `${url}?_t=${(/* @__PURE__ */ new Date()).getTime()}`;
143
+ }
144
+ return config;
145
+ }, (error) => {
146
+ console.log(error);
147
+ Promise.reject(error);
148
+ });
149
+ /**
150
+ * response 拦截器, 先入栈先执行
151
+ * Blob application/json 类型数据, 需要转换为 json 对象
152
+ */
153
+ service.interceptors.response.use(async (response) => {
154
+ if (response.data instanceof Blob && response.headers["content-type"]?.split(";")[0]?.trim() === "application/json") {
155
+ response.data = await blobToJson(response.data);
156
+ return response;
157
+ }
158
+ return response;
159
+ }, async (error) => {
160
+ if (error.response.data instanceof Blob && error.response.headers["content-type"]?.split(";")[0]?.trim() === "application/json") error.response.data = await blobToJson(error.response.data);
161
+ return Promise.reject(error);
162
+ });
163
+ service.interceptors.response.use((response) => {
164
+ if (response.status && response.status === 401) return unauthorizedCallback(response);
165
+ if (response.status && response.status === 403) return forbiddenCallback(response);
166
+ if (response.status && (response.status === 400 || response.status === 500)) {
167
+ failCallback(response);
168
+ return Promise.reject(response);
169
+ }
170
+ if (verifySuccessCode(response.data.code, code)) {
171
+ successCallback(response);
172
+ return response;
173
+ } else {
174
+ failCallback(response);
175
+ return Promise.reject(response);
176
+ }
177
+ }, (error) => {
178
+ if (axios.isCancel(error)) return Promise.reject(error);
179
+ let status = 0;
180
+ try {
181
+ status = error.response.status || error.response.data.status;
182
+ } catch {
183
+ if (error.toString().includes("Error: timeout")) return Promise.reject(error);
184
+ }
185
+ if (status) if (status === 403) forbiddenCallback(error);
186
+ else if (status === 404) notfoundCallback(error);
187
+ else failCallback(error);
188
+ else failCallback(error);
189
+ return Promise.reject(error);
190
+ });
191
+ service.interceptors.response.use(responseInterceptor, (error) => {
192
+ return Promise.reject(error);
193
+ });
194
+ if (mockModules) setupMockAdapter(service, mockModules);
195
+ return service;
236
196
  }
237
- // Annotate the CommonJS export names for ESM import in node:
238
- 0 && (module.exports = {
239
- getQueryObject,
240
- getToken,
241
- removeToken,
242
- serviceFactory,
243
- setTokenFromUrl
244
- });
197
+
198
+ //#endregion
199
+ export { getQueryObject, getToken, removeToken, serviceFactory, setTokenFromUrl };
package/package.json CHANGED
@@ -1,8 +1,9 @@
1
1
  {
2
2
  "name": "@yeepay/client-utils",
3
- "version": "2.4.0",
3
+ "type": "module",
4
+ "version": "3.0.1",
4
5
  "description": "shared utilities for yeepay client packages",
5
- "author": "Angus Yang",
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.mjs",
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": "^1.7.0",
30
+ "@yeepay/eslint-config": "^4.17.0",
31
31
  "bumpp": "^9.4.1",
32
- "eslint": "^9.3.0",
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
- "tsup": "^8.0.2",
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": "tsup --format esm,cjs --clean --dts",
48
- "stub": "tsup --format esm",
49
- "dev": "tsup --format esm,cjs --watch",
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
- };