@alibarbar/common 1.0.9 → 1.0.10

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.
Files changed (176) hide show
  1. package/dist/{chunk-O3O67R4I.js → algorithm.cjs} +0 -2
  2. package/dist/algorithm.js +130 -44
  3. package/dist/{chunk-LOAZSPGQ.js → array.cjs} +0 -2
  4. package/dist/array.js +135 -84
  5. package/dist/{chunk-Y364QIQH.js → color.cjs} +0 -2
  6. package/dist/color.js +127 -40
  7. package/dist/{chunk-DYBSRI7V.js → crypto.cjs} +0 -2
  8. package/dist/crypto.js +172 -60
  9. package/dist/{chunk-BHCRFURU.js → data-structure.cjs} +0 -2
  10. package/dist/data-structure.js +481 -32
  11. package/dist/{chunk-I3L42475.js → date.cjs} +0 -2
  12. package/dist/date.js +125 -72
  13. package/dist/{chunk-JK2SE3I2.js → dom.cjs} +0 -2
  14. package/dist/dom.js +84 -56
  15. package/dist/{chunk-7V5UQXIO.js → file.cjs} +0 -2
  16. package/dist/file.js +79 -32
  17. package/dist/{chunk-OX5PLOWB.js → i18n.cjs} +0 -2
  18. package/dist/i18n.js +78 -40
  19. package/dist/index.cjs +4132 -0
  20. package/dist/index.d.mts +3 -159
  21. package/dist/index.d.ts +3 -159
  22. package/dist/index.js +3364 -17427
  23. package/dist/{chunk-4RGXV4SJ.js → network.cjs} +0 -2
  24. package/dist/network.js +97 -28
  25. package/dist/{chunk-3FRYJPHG.js → number.cjs} +0 -2
  26. package/dist/number.js +77 -56
  27. package/dist/{chunk-27UDDVLZ.js → object.cjs} +0 -2
  28. package/dist/object.js +237 -80
  29. package/dist/{chunk-JQZBPAPO.js → performance.cjs} +0 -2
  30. package/dist/performance.js +145 -40
  31. package/dist/services.cjs +291 -0
  32. package/dist/services.d.mts +161 -0
  33. package/dist/services.d.ts +161 -0
  34. package/dist/services.js +281 -0
  35. package/dist/{chunk-WZDOPUJW.js → storage.cjs} +216 -17
  36. package/dist/storage.js +550 -31
  37. package/dist/{chunk-D7CS5EKF.js → string.cjs} +0 -2
  38. package/dist/string.js +91 -68
  39. package/dist/{chunk-56W6YECK.js → tracking.cjs} +0 -2
  40. package/dist/tracking.js +359 -52
  41. package/dist/{chunk-ZDMFMUDR.js → transform.cjs} +0 -2
  42. package/dist/transform.js +299 -32
  43. package/dist/{chunk-NJARVI6X.mjs → upload.cjs} +41 -14
  44. package/dist/upload.js +402 -20
  45. package/dist/{chunk-KGFTD255.js → url.cjs} +0 -2
  46. package/dist/url.js +91 -44
  47. package/dist/{chunk-TQN37HIN.js → validation.cjs} +0 -2
  48. package/dist/validation.js +77 -60
  49. package/package.json +7 -2
  50. package/dist/algorithm.js.map +0 -1
  51. package/dist/algorithm.mjs +0 -4
  52. package/dist/algorithm.mjs.map +0 -1
  53. package/dist/array.js.map +0 -1
  54. package/dist/array.mjs +0 -4
  55. package/dist/array.mjs.map +0 -1
  56. package/dist/chunk-27UDDVLZ.js.map +0 -1
  57. package/dist/chunk-2R2QWFJC.mjs +0 -138
  58. package/dist/chunk-2R2QWFJC.mjs.map +0 -1
  59. package/dist/chunk-3FRYJPHG.js.map +0 -1
  60. package/dist/chunk-4RGXV4SJ.js.map +0 -1
  61. package/dist/chunk-56W6YECK.js.map +0 -1
  62. package/dist/chunk-5BGSUGTI.mjs +0 -128
  63. package/dist/chunk-5BGSUGTI.mjs.map +0 -1
  64. package/dist/chunk-7E6GELHJ.mjs +0 -302
  65. package/dist/chunk-7E6GELHJ.mjs.map +0 -1
  66. package/dist/chunk-7V5UQXIO.js.map +0 -1
  67. package/dist/chunk-A4SWQXX7.mjs +0 -484
  68. package/dist/chunk-A4SWQXX7.mjs.map +0 -1
  69. package/dist/chunk-BHCRFURU.js.map +0 -1
  70. package/dist/chunk-CDSGEAOK.mjs +0 -80
  71. package/dist/chunk-CDSGEAOK.mjs.map +0 -1
  72. package/dist/chunk-D7CS5EKF.js.map +0 -1
  73. package/dist/chunk-DYBSRI7V.js.map +0 -1
  74. package/dist/chunk-FEBKPX5A.js +0 -386
  75. package/dist/chunk-FEBKPX5A.js.map +0 -1
  76. package/dist/chunk-FJ6ZGZIA.mjs +0 -39
  77. package/dist/chunk-FJ6ZGZIA.mjs.map +0 -1
  78. package/dist/chunk-HLDFI7R2.mjs +0 -175
  79. package/dist/chunk-HLDFI7R2.mjs.map +0 -1
  80. package/dist/chunk-I3L42475.js.map +0 -1
  81. package/dist/chunk-JBLX27WD.mjs +0 -240
  82. package/dist/chunk-JBLX27WD.mjs.map +0 -1
  83. package/dist/chunk-JHZ7M2MR.mjs +0 -133
  84. package/dist/chunk-JHZ7M2MR.mjs.map +0 -1
  85. package/dist/chunk-JK2SE3I2.js.map +0 -1
  86. package/dist/chunk-JQZBPAPO.js.map +0 -1
  87. package/dist/chunk-JXYGC2C5.mjs +0 -100
  88. package/dist/chunk-JXYGC2C5.mjs.map +0 -1
  89. package/dist/chunk-KGFTD255.js.map +0 -1
  90. package/dist/chunk-LBHBNPNJ.mjs +0 -148
  91. package/dist/chunk-LBHBNPNJ.mjs.map +0 -1
  92. package/dist/chunk-LF4CILQS.mjs +0 -87
  93. package/dist/chunk-LF4CILQS.mjs.map +0 -1
  94. package/dist/chunk-LOAZSPGQ.js.map +0 -1
  95. package/dist/chunk-NJARVI6X.mjs.map +0 -1
  96. package/dist/chunk-NSSDYX2U.mjs +0 -80
  97. package/dist/chunk-NSSDYX2U.mjs.map +0 -1
  98. package/dist/chunk-O3O67R4I.js.map +0 -1
  99. package/dist/chunk-OIXQ3E6W.mjs +0 -354
  100. package/dist/chunk-OIXQ3E6W.mjs.map +0 -1
  101. package/dist/chunk-OX5PLOWB.js.map +0 -1
  102. package/dist/chunk-PJ7UCTX4.mjs +0 -362
  103. package/dist/chunk-PJ7UCTX4.mjs.map +0 -1
  104. package/dist/chunk-PR4QN5HX.js +0 -44
  105. package/dist/chunk-PR4QN5HX.js.map +0 -1
  106. package/dist/chunk-QIBE7GVN.mjs +0 -81
  107. package/dist/chunk-QIBE7GVN.mjs.map +0 -1
  108. package/dist/chunk-QIOC54LQ.mjs +0 -130
  109. package/dist/chunk-QIOC54LQ.mjs.map +0 -1
  110. package/dist/chunk-TQN37HIN.js.map +0 -1
  111. package/dist/chunk-WZDOPUJW.js.map +0 -1
  112. package/dist/chunk-XJTZDXSR.mjs +0 -94
  113. package/dist/chunk-XJTZDXSR.mjs.map +0 -1
  114. package/dist/chunk-Y364QIQH.js.map +0 -1
  115. package/dist/chunk-YXM6Q4JS.mjs +0 -94
  116. package/dist/chunk-YXM6Q4JS.mjs.map +0 -1
  117. package/dist/chunk-ZDMFMUDR.js.map +0 -1
  118. package/dist/chunk-ZVJ6NQUM.mjs +0 -82
  119. package/dist/chunk-ZVJ6NQUM.mjs.map +0 -1
  120. package/dist/color.js.map +0 -1
  121. package/dist/color.mjs +0 -4
  122. package/dist/color.mjs.map +0 -1
  123. package/dist/crypto.js.map +0 -1
  124. package/dist/crypto.mjs +0 -4
  125. package/dist/crypto.mjs.map +0 -1
  126. package/dist/data-structure.js.map +0 -1
  127. package/dist/data-structure.mjs +0 -4
  128. package/dist/data-structure.mjs.map +0 -1
  129. package/dist/date.js.map +0 -1
  130. package/dist/date.mjs +0 -4
  131. package/dist/date.mjs.map +0 -1
  132. package/dist/dom.js.map +0 -1
  133. package/dist/dom.mjs +0 -4
  134. package/dist/dom.mjs.map +0 -1
  135. package/dist/file.js.map +0 -1
  136. package/dist/file.mjs +0 -4
  137. package/dist/file.mjs.map +0 -1
  138. package/dist/i18n.js.map +0 -1
  139. package/dist/i18n.mjs +0 -4
  140. package/dist/i18n.mjs.map +0 -1
  141. package/dist/index.js.map +0 -1
  142. package/dist/index.mjs +0 -17155
  143. package/dist/index.mjs.map +0 -1
  144. package/dist/network.js.map +0 -1
  145. package/dist/network.mjs +0 -4
  146. package/dist/network.mjs.map +0 -1
  147. package/dist/number.js.map +0 -1
  148. package/dist/number.mjs +0 -4
  149. package/dist/number.mjs.map +0 -1
  150. package/dist/object.js.map +0 -1
  151. package/dist/object.mjs +0 -4
  152. package/dist/object.mjs.map +0 -1
  153. package/dist/performance.js.map +0 -1
  154. package/dist/performance.mjs +0 -4
  155. package/dist/performance.mjs.map +0 -1
  156. package/dist/storage.js.map +0 -1
  157. package/dist/storage.mjs +0 -5
  158. package/dist/storage.mjs.map +0 -1
  159. package/dist/string.js.map +0 -1
  160. package/dist/string.mjs +0 -4
  161. package/dist/string.mjs.map +0 -1
  162. package/dist/tracking.js.map +0 -1
  163. package/dist/tracking.mjs +0 -4
  164. package/dist/tracking.mjs.map +0 -1
  165. package/dist/transform.js.map +0 -1
  166. package/dist/transform.mjs +0 -4
  167. package/dist/transform.mjs.map +0 -1
  168. package/dist/upload.js.map +0 -1
  169. package/dist/upload.mjs +0 -5
  170. package/dist/upload.mjs.map +0 -1
  171. package/dist/url.js.map +0 -1
  172. package/dist/url.mjs +0 -4
  173. package/dist/url.mjs.map +0 -1
  174. package/dist/validation.js.map +0 -1
  175. package/dist/validation.mjs +0 -4
  176. package/dist/validation.mjs.map +0 -1
@@ -1,41 +1,146 @@
1
- 'use strict';
1
+ // src/helper/performance.ts
2
+ function debounce(fn, delay) {
3
+ let timeoutId = null;
4
+ return function(...args) {
5
+ if (timeoutId) {
6
+ clearTimeout(timeoutId);
7
+ }
8
+ timeoutId = setTimeout(() => {
9
+ fn.apply(this, args);
10
+ timeoutId = null;
11
+ }, delay);
12
+ };
13
+ }
14
+ function throttle(fn, delay) {
15
+ let lastCall = 0;
16
+ let timeoutId = null;
17
+ return function(...args) {
18
+ const now = Date.now();
19
+ const timeSinceLastCall = now - lastCall;
20
+ if (timeSinceLastCall >= delay) {
21
+ lastCall = now;
22
+ fn.apply(this, args);
23
+ } else {
24
+ if (timeoutId) {
25
+ clearTimeout(timeoutId);
26
+ }
27
+ timeoutId = setTimeout(() => {
28
+ lastCall = Date.now();
29
+ fn.apply(this, args);
30
+ timeoutId = null;
31
+ }, delay - timeSinceLastCall);
32
+ }
33
+ };
34
+ }
35
+ function memoize(fn, keyFn) {
36
+ const cache = /* @__PURE__ */ new Map();
37
+ return ((...args) => {
38
+ const key = keyFn ? keyFn(...args) : JSON.stringify(args);
39
+ if (cache.has(key)) {
40
+ return cache.get(key);
41
+ }
42
+ const result = fn(...args);
43
+ cache.set(key, result);
44
+ return result;
45
+ });
46
+ }
47
+ function once(fn) {
48
+ let called = false;
49
+ let result;
50
+ return ((...args) => {
51
+ if (!called) {
52
+ called = true;
53
+ result = fn(...args);
54
+ }
55
+ return result;
56
+ });
57
+ }
58
+ async function retry(fn, retryCount = 3, retryDelay = 1e3) {
59
+ let lastError = null;
60
+ for (let i = 0; i <= retryCount; i++) {
61
+ try {
62
+ return await fn();
63
+ } catch (error) {
64
+ lastError = error instanceof Error ? error : new Error(String(error));
65
+ if (i < retryCount) {
66
+ await new Promise((resolve) => setTimeout(resolve, retryDelay));
67
+ }
68
+ }
69
+ }
70
+ throw lastError || new Error("Retry failed");
71
+ }
72
+ async function timeout(fn, timeout2) {
73
+ return Promise.race([
74
+ fn(),
75
+ new Promise((_, reject) => {
76
+ setTimeout(() => reject(new Error(`Operation timeout after ${timeout2}ms`)), timeout2);
77
+ })
78
+ ]);
79
+ }
80
+ async function batch(items, fn, batchSize = 10) {
81
+ const results = [];
82
+ for (let i = 0; i < items.length; i += batchSize) {
83
+ const batch2 = items.slice(i, i + batchSize);
84
+ const batchResults = await Promise.all(batch2.map(fn));
85
+ results.push(...batchResults);
86
+ }
87
+ return results;
88
+ }
89
+ var Queue = class {
90
+ constructor() {
91
+ this.items = [];
92
+ this.processing = false;
93
+ }
94
+ /**
95
+ * 添加项到队列
96
+ * @param item - 要添加的项
97
+ */
98
+ enqueue(item) {
99
+ this.items.push(item);
100
+ if (!this.processing && this.processor) {
101
+ this.processItems();
102
+ }
103
+ }
104
+ /**
105
+ * 设置处理函数并开始处理
106
+ * @param processor - 处理函数
107
+ */
108
+ async start(processor) {
109
+ this.processor = processor;
110
+ if (!this.processing) {
111
+ await this.processItems();
112
+ }
113
+ }
114
+ /**
115
+ * 处理队列
116
+ */
117
+ async processItems() {
118
+ if (!this.processor || this.processing) return;
119
+ this.processing = true;
120
+ while (this.items.length > 0) {
121
+ const item = this.items.shift();
122
+ if (item && this.processor) {
123
+ try {
124
+ await this.processor(item);
125
+ } catch (error) {
126
+ console.error("Queue processing error:", error);
127
+ }
128
+ }
129
+ }
130
+ this.processing = false;
131
+ }
132
+ /**
133
+ * 清空队列
134
+ */
135
+ clear() {
136
+ this.items = [];
137
+ }
138
+ /**
139
+ * 获取队列长度
140
+ */
141
+ get length() {
142
+ return this.items.length;
143
+ }
144
+ };
2
145
 
3
- var chunkJQZBPAPO_js = require('./chunk-JQZBPAPO.js');
4
- require('./chunk-PR4QN5HX.js');
5
-
6
-
7
-
8
- Object.defineProperty(exports, "Queue", {
9
- enumerable: true,
10
- get: function () { return chunkJQZBPAPO_js.Queue; }
11
- });
12
- Object.defineProperty(exports, "batch", {
13
- enumerable: true,
14
- get: function () { return chunkJQZBPAPO_js.batch; }
15
- });
16
- Object.defineProperty(exports, "debounce", {
17
- enumerable: true,
18
- get: function () { return chunkJQZBPAPO_js.debounce; }
19
- });
20
- Object.defineProperty(exports, "memoize", {
21
- enumerable: true,
22
- get: function () { return chunkJQZBPAPO_js.memoize; }
23
- });
24
- Object.defineProperty(exports, "once", {
25
- enumerable: true,
26
- get: function () { return chunkJQZBPAPO_js.once; }
27
- });
28
- Object.defineProperty(exports, "retry", {
29
- enumerable: true,
30
- get: function () { return chunkJQZBPAPO_js.retry; }
31
- });
32
- Object.defineProperty(exports, "throttle", {
33
- enumerable: true,
34
- get: function () { return chunkJQZBPAPO_js.throttle; }
35
- });
36
- Object.defineProperty(exports, "timeout", {
37
- enumerable: true,
38
- get: function () { return chunkJQZBPAPO_js.timeout; }
39
- });
40
- //# sourceMappingURL=performance.js.map
41
- //# sourceMappingURL=performance.js.map
146
+ export { Queue, batch, debounce, memoize, once, retry, throttle, timeout };
@@ -0,0 +1,291 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ var Qs = require('qs');
6
+ var axios = require('axios');
7
+
8
+ function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
9
+
10
+ var Qs__default = /*#__PURE__*/_interopDefault(Qs);
11
+ var axios__default = /*#__PURE__*/_interopDefault(axios);
12
+
13
+ // src/services/index.ts
14
+ var serviceEventHandlers = {
15
+ message: null
16
+ };
17
+ function setServiceEventHandlers(handlers = {}) {
18
+ Object.assign(serviceEventHandlers, handlers);
19
+ }
20
+ function emitMessageEvent(payload) {
21
+ const handler = serviceEventHandlers.message;
22
+ if (typeof handler === "function") {
23
+ handler(payload);
24
+ return;
25
+ }
26
+ const { type = "error", message, code, status } = payload;
27
+ const prefix = `[service][${type}]`;
28
+ const extra = [];
29
+ if (typeof code !== "undefined") extra.push(`code=${code}`);
30
+ if (typeof status !== "undefined") extra.push(`status=${status}`);
31
+ const suffix = extra.length ? ` (${extra.join(", ")})` : "";
32
+ if (type === "info" || type === "success") {
33
+ console.info(`${prefix} ${message}${suffix}`);
34
+ } else if (type === "warn" || type === "warning") {
35
+ console.warn(`${prefix} ${message}${suffix}`);
36
+ } else {
37
+ console.error(`${prefix} ${message}${suffix}`);
38
+ }
39
+ }
40
+ function filterEmptyKey(params, emptyString) {
41
+ Object.keys(params).forEach((key) => {
42
+ if (params[key] === null || emptyString && params[key] === "" || emptyString && Array.isArray(params[key]) && params[key].length <= 0) {
43
+ delete params[key];
44
+ }
45
+ });
46
+ }
47
+ function getTransformRequest(contentType) {
48
+ if (!contentType) {
49
+ return (data) => Qs__default.default.stringify(data);
50
+ }
51
+ const normalizedType = contentType.toLowerCase().trim();
52
+ if (normalizedType.startsWith("application/json")) {
53
+ return (data) => JSON.stringify(data);
54
+ }
55
+ if (normalizedType.startsWith("application/x-www-form-urlencoded")) {
56
+ return (data) => Qs__default.default.stringify(data);
57
+ }
58
+ return void 0;
59
+ }
60
+ var service = axios__default.default.create({
61
+ baseURL: "",
62
+ timeout: 6e4,
63
+ // 不设置默认 transformRequest,根据 Content-Type 自动选择
64
+ headers: {
65
+ "Cache-Control": "no-cache",
66
+ "Content-Type": "application/x-www-form-urlencoded",
67
+ "X-Requested-With": "XMLHttpRequest"
68
+ }
69
+ });
70
+ service.interceptors.request.use(
71
+ async (config) => {
72
+ const contentType = config.headers?.["Content-Type"] || config.headers?.["content-type"];
73
+ if (!config.transformRequest && contentType) {
74
+ const transformRequest = getTransformRequest(
75
+ typeof contentType === "string" ? contentType : void 0
76
+ );
77
+ if (transformRequest) {
78
+ config.transformRequest = transformRequest;
79
+ }
80
+ } else if (!config.transformRequest) {
81
+ config.transformRequest = (data) => Qs__default.default.stringify(data);
82
+ }
83
+ if (config.method === "post" || config.method === "put" || config.method === "patch") {
84
+ const params = { ...config.data || {} };
85
+ filterEmptyKey(params, config.emptyParams ?? false);
86
+ config.data = params;
87
+ } else if (config.method === "get" || config.method === "delete") {
88
+ if (!config.disableTimestamp) {
89
+ config.params = {
90
+ _t: Math.floor(Date.now() / 1e3),
91
+ ...config.params || {}
92
+ };
93
+ }
94
+ filterEmptyKey(config.params, true);
95
+ }
96
+ return config;
97
+ },
98
+ (error) => Promise.reject(error)
99
+ );
100
+ function extractErrorMessage(responseData) {
101
+ return responseData?.errorMessage || responseData?.message || responseData?.msg || "Unknown server error";
102
+ }
103
+ function handle401Error(config, error) {
104
+ emitMessageEvent({
105
+ type: "info",
106
+ message: "Authentication required",
107
+ status: 401,
108
+ config,
109
+ error
110
+ });
111
+ }
112
+ function isServiceResponseData(data) {
113
+ return typeof data === "object" && data !== null && !(data instanceof Blob) && ("success" in data || "code" in data || "data" in data || "message" in data || "msg" in data);
114
+ }
115
+ function hasDataField(responseData) {
116
+ return "data" in responseData && responseData.data !== void 0;
117
+ }
118
+ function extractResponseData(response) {
119
+ const { data } = response;
120
+ if (data instanceof Blob) {
121
+ return data;
122
+ }
123
+ if (!isServiceResponseData(data)) {
124
+ return data;
125
+ }
126
+ if (hasDataField(data)) {
127
+ return data.data;
128
+ }
129
+ return data;
130
+ }
131
+ service.interceptors.response.use(
132
+ (res) => {
133
+ const { data, config } = res;
134
+ const extendedConfig = config;
135
+ if (extendedConfig.file && res.status === 200 && data instanceof Blob) {
136
+ convertRes2Blob(res);
137
+ return void 0;
138
+ }
139
+ if (!isServiceResponseData(data)) {
140
+ return data;
141
+ }
142
+ const responseData = data;
143
+ if ((!responseData.success || responseData.success === "false") && responseData.code !== 200 && responseData.code !== 0) {
144
+ const msg = extractErrorMessage(responseData);
145
+ const code = responseData.errorCode || responseData.code || -1e3;
146
+ if (!extendedConfig.hidden) {
147
+ emitMessageEvent({
148
+ type: code === 401 ? "info" : "error",
149
+ message: `${extendedConfig.action || "Request"} failed: ${msg}`,
150
+ code,
151
+ status: res.status,
152
+ config: extendedConfig
153
+ });
154
+ }
155
+ return Promise.reject({ code, message: msg });
156
+ }
157
+ const extractedData = extractResponseData(res);
158
+ return extractedData;
159
+ },
160
+ (error) => {
161
+ try {
162
+ const axiosError = error;
163
+ const config = axiosError.config || {};
164
+ const status = axiosError.response?.status;
165
+ const messageText = String(axiosError?.message || "");
166
+ const isAborted = axiosError.code === "ECONNABORTED";
167
+ if (status === 401) {
168
+ handle401Error(config, error);
169
+ }
170
+ if (isAborted && config && !config._noAutoRetry) {
171
+ config._retryCount = config._retryCount || 0;
172
+ if (config._retryCount < 2) {
173
+ config._retryCount++;
174
+ console.debug(
175
+ `[request] aborted, retry attempt #${config._retryCount} -> ${config.url || ""}`
176
+ );
177
+ return new Promise((resolve) => setTimeout(resolve, 300)).then(
178
+ () => service.request(config)
179
+ );
180
+ }
181
+ }
182
+ if (!config?.hidden && !isAborted) {
183
+ let friendly = messageText;
184
+ if (status === 403) friendly = "No permission";
185
+ else if (status === 502) friendly = "System is upgrading or unavailable";
186
+ else if (status === 504) friendly = "System timeout";
187
+ emitMessageEvent({
188
+ type: status === 401 ? "info" : "error",
189
+ message: `${config.action || "Request"} failed: ${friendly}`,
190
+ status,
191
+ config,
192
+ error
193
+ });
194
+ }
195
+ } catch (e) {
196
+ console.error("error in response error handler", e);
197
+ }
198
+ return Promise.reject(error);
199
+ }
200
+ );
201
+ service.json = function(url, params, config) {
202
+ const newConfig = {
203
+ headers: { "Content-Type": "application/json", ...config?.headers },
204
+ ...config
205
+ };
206
+ return service.post(
207
+ url,
208
+ Array.isArray(params) ? params : params,
209
+ newConfig
210
+ );
211
+ };
212
+ service.put = function(url, params, config) {
213
+ const newConfig = {
214
+ headers: { "Content-Type": "application/json", ...config?.headers },
215
+ ...config
216
+ };
217
+ return service.put(url, Array.isArray(params) ? params : params, newConfig).then((res) => res);
218
+ };
219
+ service.arrayGet = function(url, config) {
220
+ if (config) {
221
+ config.paramsSerializer = (params) => Qs__default.default.stringify(params, { arrayFormat: "repeat" });
222
+ }
223
+ return service.get(url, config);
224
+ };
225
+ service.download = function(url, config = {}) {
226
+ const { type = "get", params } = config;
227
+ const newConfig = {
228
+ headers: {
229
+ Accept: "application/json",
230
+ "Content-Type": "application/json; charset=utf-8",
231
+ ...config.headers
232
+ },
233
+ withCredentials: true,
234
+ file: true,
235
+ responseType: "blob",
236
+ ...config
237
+ };
238
+ if (type === "get") {
239
+ newConfig.params = params;
240
+ return service.get(url, newConfig);
241
+ } else {
242
+ newConfig.params = {};
243
+ return service.post(url, params, newConfig).then(() => void 0);
244
+ }
245
+ };
246
+ function convertRes2Blob(response) {
247
+ const contentDisposition = response.headers["content-disposition"];
248
+ let fileName = "file.xlsx";
249
+ if (contentDisposition) {
250
+ const rfc5987Match = contentDisposition.match(/filename\*=UTF-8''([^;]+)/i);
251
+ if (rfc5987Match) {
252
+ fileName = decodeURIComponent(rfc5987Match[1]);
253
+ } else {
254
+ const standardMatch = contentDisposition.match(/filename[^;=\n]*=((['"]).*?\2|[^;\n]*)/i);
255
+ if (standardMatch) {
256
+ fileName = standardMatch[1];
257
+ fileName = fileName.replace(/^['"]|['"]$/g, "");
258
+ try {
259
+ fileName = decodeURIComponent(fileName);
260
+ } catch (e) {
261
+ try {
262
+ fileName = decodeURI(fileName);
263
+ } catch (e2) {
264
+ }
265
+ }
266
+ }
267
+ }
268
+ fileName = fileName.trim().replace(/^_+|_+$/g, "");
269
+ }
270
+ const blob = new Blob([response.data], { type: "application/vnd.ms-excel;charset=utf-8" });
271
+ if (typeof window.navigator.msSaveBlob !== "undefined") {
272
+ window.navigator.msSaveBlob(blob, fileName);
273
+ } else {
274
+ const blobURL = window.URL.createObjectURL(blob);
275
+ const tempLink = document.createElement("a");
276
+ tempLink.style.display = "none";
277
+ tempLink.href = blobURL;
278
+ tempLink.setAttribute("download", fileName);
279
+ if (typeof tempLink.download === "undefined") {
280
+ tempLink.setAttribute("target", "_blank");
281
+ }
282
+ document.body.appendChild(tempLink);
283
+ tempLink.click();
284
+ document.body.removeChild(tempLink);
285
+ window.URL.revokeObjectURL(blobURL);
286
+ }
287
+ }
288
+ var services_default = service;
289
+
290
+ exports.default = services_default;
291
+ exports.setServiceEventHandlers = setServiceEventHandlers;
@@ -0,0 +1,161 @@
1
+ import { AxiosRequestConfig, AxiosInstance } from 'axios';
2
+
3
+ /**
4
+ * 扩展 Navigator 接口以支持 msSaveBlob
5
+ */
6
+ declare global {
7
+ interface Navigator {
8
+ msSaveBlob?: (blob: Blob, fileName: string) => boolean;
9
+ }
10
+ }
11
+ /**
12
+ * 消息事件类型
13
+ */
14
+ type MessageEventType = 'info' | 'success' | 'warn' | 'warning' | 'error';
15
+ /**
16
+ * 消息事件载荷
17
+ */
18
+ interface MessageEventPayload {
19
+ /** 消息类型 */
20
+ type: MessageEventType;
21
+ /** 消息内容 */
22
+ message: string;
23
+ /** 错误代码(可选) */
24
+ code?: number;
25
+ /** HTTP 状态码(可选) */
26
+ status?: number;
27
+ /** 请求配置(可选) */
28
+ config?: AxiosRequestConfig;
29
+ /** 错误对象(可选) */
30
+ error?: unknown;
31
+ }
32
+ /**
33
+ * 消息事件处理器
34
+ */
35
+ type MessageEventHandler = (payload: MessageEventPayload) => void;
36
+ /**
37
+ * 服务事件处理器配置
38
+ */
39
+ interface ServiceEventHandlers {
40
+ /** 统一消息/错误事件处理器 */
41
+ message?: MessageEventHandler | null;
42
+ }
43
+ /**
44
+ * 扩展的 Axios 请求配置
45
+ * 只声明扩展的属性,继承的属性不需要重复声明
46
+ */
47
+ interface ExtendedAxiosRequestConfig extends AxiosRequestConfig {
48
+ /** 是否隐藏错误提示 */
49
+ hidden?: boolean;
50
+ /** 操作名称(用于错误提示) */
51
+ action?: string;
52
+ /** 是否清空空参数 */
53
+ emptyParams?: boolean;
54
+ /** 是否为文件下载 */
55
+ file?: boolean;
56
+ /** 重试计数(内部使用) */
57
+ _retryCount?: number;
58
+ /** 是否禁用自动重试 */
59
+ _noAutoRetry?: boolean;
60
+ /** 是否禁用自动添加时间戳(仅对 GET 请求有效) */
61
+ disableTimestamp?: boolean;
62
+ }
63
+ /**
64
+ * 服务响应数据类型
65
+ */
66
+ interface ServiceResponseData<T = unknown> {
67
+ success?: boolean | string;
68
+ code?: number;
69
+ errorCode?: number;
70
+ errorMessage?: string;
71
+ message?: string;
72
+ msg?: string;
73
+ data?: T;
74
+ }
75
+ /**
76
+ * 错误响应类型
77
+ */
78
+ interface ServiceError {
79
+ code: number;
80
+ message: string;
81
+ }
82
+ /**
83
+ * 设置 service 的事件处理函数
84
+ * @param handlers - 事件处理器配置
85
+ */
86
+ declare function setServiceEventHandlers(handlers?: Partial<ServiceEventHandlers>): void;
87
+ declare const service: AxiosInstance & ServiceInstance;
88
+ /**
89
+ * Service 实例扩展接口
90
+ */
91
+ interface ServiceInstance extends AxiosInstance {
92
+ /**
93
+ * GET 请求
94
+ * @param url - 请求 URL
95
+ * @param config - 请求配置
96
+ */
97
+ get<TResponse = unknown>(url: string, config?: ExtendedAxiosRequestConfig): Promise<TResponse>;
98
+ /**
99
+ * POST 请求
100
+ * @param url - 请求 URL
101
+ * @param data - 请求数据
102
+ * @param config - 请求配置
103
+ */
104
+ post<TResponse = unknown, TData = unknown>(url: string, data?: TData, config?: ExtendedAxiosRequestConfig): Promise<TResponse>;
105
+ /**
106
+ * DELETE 请求
107
+ * @param url - 请求 URL
108
+ * @param config - 请求配置
109
+ */
110
+ delete<TResponse = unknown>(url: string, config?: ExtendedAxiosRequestConfig): Promise<TResponse>;
111
+ /**
112
+ * PATCH 请求
113
+ * @param url - 请求 URL
114
+ * @param data - 请求数据
115
+ * @param config - 请求配置
116
+ */
117
+ patch<TResponse = unknown, TData = unknown>(url: string, data?: TData, config?: ExtendedAxiosRequestConfig): Promise<TResponse>;
118
+ /**
119
+ * HEAD 请求
120
+ * @param url - 请求 URL
121
+ * @param config - 请求配置
122
+ */
123
+ head<TResponse = unknown>(url: string, config?: ExtendedAxiosRequestConfig): Promise<TResponse>;
124
+ /**
125
+ * OPTIONS 请求
126
+ * @param url - 请求 URL
127
+ * @param config - 请求配置
128
+ */
129
+ options<TResponse = unknown>(url: string, config?: ExtendedAxiosRequestConfig): Promise<TResponse>;
130
+ /**
131
+ * JSON 格式 POST 请求
132
+ * @param url - 请求 URL
133
+ * @param params - 请求参数
134
+ * @param config - 请求配置
135
+ */
136
+ json<TResponse = unknown, TParams = unknown>(url: string, params?: TParams | TParams[], config?: ExtendedAxiosRequestConfig): Promise<TResponse>;
137
+ /**
138
+ * PUT 请求(JSON 格式)
139
+ * @param url - 请求 URL
140
+ * @param params - 请求参数
141
+ * @param config - 请求配置
142
+ */
143
+ put<TResponse = unknown, TParams = unknown>(url: string, params?: TParams | TParams[], config?: ExtendedAxiosRequestConfig): Promise<TResponse>;
144
+ /**
145
+ * 数组格式 GET 请求
146
+ * @param url - 请求 URL
147
+ * @param config - 请求配置
148
+ */
149
+ arrayGet<TResponse = unknown>(url: string, config?: ExtendedAxiosRequestConfig): Promise<TResponse>;
150
+ /**
151
+ * 文件下载
152
+ * @param url - 下载 URL
153
+ * @param config - 下载配置
154
+ */
155
+ download<TParams = unknown>(url: string, config?: {
156
+ type?: 'get' | 'json';
157
+ params?: TParams;
158
+ } & ExtendedAxiosRequestConfig): Promise<void>;
159
+ }
160
+
161
+ export { type ExtendedAxiosRequestConfig, type MessageEventHandler, type MessageEventPayload, type MessageEventType, type ServiceError, type ServiceEventHandlers, type ServiceInstance, type ServiceResponseData, service as default, setServiceEventHandlers };