@boo-dreamer/request 0.0.3
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 +444 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.ts +304 -0
- package/dist/index.mjs +444 -0
- package/dist/index.mjs.map +1 -0
- package/package.json +46 -0
package/dist/index.cjs
ADDED
|
@@ -0,0 +1,444 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
4
|
+
var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
|
|
5
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
6
|
+
const axios = require("axios");
|
|
7
|
+
const DEFAULT_CODE_MESSAGE_MAP = {
|
|
8
|
+
200: "操作成功",
|
|
9
|
+
201: "创建成功",
|
|
10
|
+
400: "请求参数错误",
|
|
11
|
+
401: "未授权,请重新登录",
|
|
12
|
+
403: "拒绝访问",
|
|
13
|
+
404: "请求资源不存在",
|
|
14
|
+
500: "服务器内部错误",
|
|
15
|
+
502: "网关错误",
|
|
16
|
+
503: "服务不可用",
|
|
17
|
+
504: "网关超时"
|
|
18
|
+
};
|
|
19
|
+
const DEFAULT_HTTP_STATUS_MESSAGE_MAP = {
|
|
20
|
+
400: "请求参数错误",
|
|
21
|
+
401: "未授权,请重新登录",
|
|
22
|
+
403: "拒绝访问",
|
|
23
|
+
404: "请求资源不存在",
|
|
24
|
+
405: "请求方法不允许",
|
|
25
|
+
408: "请求超时",
|
|
26
|
+
500: "服务器内部错误",
|
|
27
|
+
501: "服务未实现",
|
|
28
|
+
502: "网关错误",
|
|
29
|
+
503: "服务不可用",
|
|
30
|
+
504: "网关超时"
|
|
31
|
+
};
|
|
32
|
+
const DEFAULT_SUCCESS_CODE = [200, 0];
|
|
33
|
+
const DEFAULT_TIMEOUT = 1e4;
|
|
34
|
+
class ConfigManager {
|
|
35
|
+
constructor() {
|
|
36
|
+
__publicField(this, "config", {
|
|
37
|
+
baseResponseType: void 0,
|
|
38
|
+
successCode: DEFAULT_SUCCESS_CODE,
|
|
39
|
+
codeMessageMap: { ...DEFAULT_CODE_MESSAGE_MAP },
|
|
40
|
+
httpStatusMessageMap: { ...DEFAULT_HTTP_STATUS_MESSAGE_MAP },
|
|
41
|
+
timeout: DEFAULT_TIMEOUT,
|
|
42
|
+
interceptors: {},
|
|
43
|
+
onError: void 0
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* 获取当前配置
|
|
48
|
+
*/
|
|
49
|
+
getConfig() {
|
|
50
|
+
return { ...this.config };
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* 设置全局配置
|
|
54
|
+
*/
|
|
55
|
+
setConfig(config) {
|
|
56
|
+
this.config = {
|
|
57
|
+
...this.config,
|
|
58
|
+
...config,
|
|
59
|
+
// 深度合并映射表
|
|
60
|
+
codeMessageMap: {
|
|
61
|
+
...this.config.codeMessageMap,
|
|
62
|
+
...config.codeMessageMap
|
|
63
|
+
},
|
|
64
|
+
httpStatusMessageMap: {
|
|
65
|
+
...this.config.httpStatusMessageMap,
|
|
66
|
+
...config.httpStatusMessageMap
|
|
67
|
+
},
|
|
68
|
+
// 合并拦截器配置
|
|
69
|
+
interceptors: {
|
|
70
|
+
...this.config.interceptors,
|
|
71
|
+
...config.interceptors
|
|
72
|
+
}
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* 获取成功状态码
|
|
77
|
+
*/
|
|
78
|
+
getSuccessCodes() {
|
|
79
|
+
const codes = this.config.successCode ?? DEFAULT_SUCCESS_CODE;
|
|
80
|
+
return Array.isArray(codes) ? codes : [codes];
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* 检查是否为成功状态码
|
|
84
|
+
*/
|
|
85
|
+
isSuccessCode(code) {
|
|
86
|
+
return this.getSuccessCodes().includes(code);
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* 根据 Code 获取提示消息
|
|
90
|
+
*/
|
|
91
|
+
getMessageByCode(code) {
|
|
92
|
+
var _a;
|
|
93
|
+
return (_a = this.config.codeMessageMap) == null ? void 0 : _a[code];
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* 根据 HTTP 状态码获取提示消息
|
|
97
|
+
*/
|
|
98
|
+
getMessageByHttpStatus(status) {
|
|
99
|
+
var _a;
|
|
100
|
+
return (_a = this.config.httpStatusMessageMap) == null ? void 0 : _a[status];
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* 获取超时时间
|
|
104
|
+
*/
|
|
105
|
+
getTimeout() {
|
|
106
|
+
return this.config.timeout ?? DEFAULT_TIMEOUT;
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* 获取拦截器配置
|
|
110
|
+
*/
|
|
111
|
+
getInterceptors() {
|
|
112
|
+
return this.config.interceptors ?? {};
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* 获取错误处理钩子
|
|
116
|
+
*/
|
|
117
|
+
getErrorHandler() {
|
|
118
|
+
return this.config.onError ?? void 0;
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* 重置为默认配置
|
|
122
|
+
*/
|
|
123
|
+
reset() {
|
|
124
|
+
this.config = {
|
|
125
|
+
baseResponseType: void 0,
|
|
126
|
+
successCode: DEFAULT_SUCCESS_CODE,
|
|
127
|
+
codeMessageMap: { ...DEFAULT_CODE_MESSAGE_MAP },
|
|
128
|
+
httpStatusMessageMap: { ...DEFAULT_HTTP_STATUS_MESSAGE_MAP },
|
|
129
|
+
timeout: DEFAULT_TIMEOUT,
|
|
130
|
+
interceptors: {},
|
|
131
|
+
onError: void 0
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
const configManager = new ConfigManager();
|
|
136
|
+
class RequestError extends Error {
|
|
137
|
+
constructor(options) {
|
|
138
|
+
super(options.message);
|
|
139
|
+
/** 错误码(业务码或 HTTP 状态码) */
|
|
140
|
+
__publicField(this, "code");
|
|
141
|
+
/** 原始错误对象 */
|
|
142
|
+
__publicField(this, "originalError");
|
|
143
|
+
/** 是否为业务错误 */
|
|
144
|
+
__publicField(this, "isBusinessError");
|
|
145
|
+
/** 是否为 HTTP 错误 */
|
|
146
|
+
__publicField(this, "isHttpError");
|
|
147
|
+
/** 请求配置 */
|
|
148
|
+
__publicField(this, "config");
|
|
149
|
+
this.name = "RequestError";
|
|
150
|
+
this.code = options.code;
|
|
151
|
+
this.originalError = options.originalError;
|
|
152
|
+
this.isBusinessError = options.isBusinessError ?? false;
|
|
153
|
+
this.isHttpError = options.isHttpError ?? false;
|
|
154
|
+
this.config = options.config;
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
function isAxiosError(error) {
|
|
158
|
+
return typeof error === "object" && error !== null && "isAxiosError" in error && error.isAxiosError === true;
|
|
159
|
+
}
|
|
160
|
+
function isBusinessResponse(response) {
|
|
161
|
+
return typeof response === "object" && response !== null && "code" in response && typeof response.code === "number";
|
|
162
|
+
}
|
|
163
|
+
function handleHttpError(error) {
|
|
164
|
+
var _a;
|
|
165
|
+
const status = ((_a = error.response) == null ? void 0 : _a.status) ?? 0;
|
|
166
|
+
const defaultMessage = "网络请求错误";
|
|
167
|
+
const message = configManager.getMessageByHttpStatus(status) ?? defaultMessage;
|
|
168
|
+
return new RequestError({
|
|
169
|
+
message,
|
|
170
|
+
code: status,
|
|
171
|
+
originalError: error,
|
|
172
|
+
isHttpError: true,
|
|
173
|
+
config: error.config
|
|
174
|
+
});
|
|
175
|
+
}
|
|
176
|
+
function handleRequestError(error) {
|
|
177
|
+
let message = "请求失败";
|
|
178
|
+
let code = -1;
|
|
179
|
+
if (error.code === "ECONNABORTED") {
|
|
180
|
+
message = "请求超时,请稍后重试";
|
|
181
|
+
code = 408;
|
|
182
|
+
} else if (error.code === "ERR_NETWORK") {
|
|
183
|
+
message = "网络连接失败,请检查网络";
|
|
184
|
+
code = "NETWORK_ERROR";
|
|
185
|
+
} else if (error.code === "ERR_CANCELED") {
|
|
186
|
+
message = "请求已取消";
|
|
187
|
+
code = "CANCELED";
|
|
188
|
+
}
|
|
189
|
+
return new RequestError({
|
|
190
|
+
message,
|
|
191
|
+
code,
|
|
192
|
+
originalError: error,
|
|
193
|
+
config: error.config
|
|
194
|
+
});
|
|
195
|
+
}
|
|
196
|
+
function handleError(error) {
|
|
197
|
+
let requestError;
|
|
198
|
+
if (isAxiosError(error)) {
|
|
199
|
+
if (error.response) {
|
|
200
|
+
requestError = handleHttpError(error);
|
|
201
|
+
} else {
|
|
202
|
+
requestError = handleRequestError(error);
|
|
203
|
+
}
|
|
204
|
+
} else if (error instanceof RequestError) {
|
|
205
|
+
requestError = error;
|
|
206
|
+
} else if (error instanceof Error) {
|
|
207
|
+
requestError = new RequestError({
|
|
208
|
+
message: error.message,
|
|
209
|
+
code: "UNKNOWN_ERROR",
|
|
210
|
+
originalError: error
|
|
211
|
+
});
|
|
212
|
+
} else {
|
|
213
|
+
requestError = new RequestError({
|
|
214
|
+
message: "未知错误",
|
|
215
|
+
code: "UNKNOWN_ERROR",
|
|
216
|
+
originalError: error
|
|
217
|
+
});
|
|
218
|
+
}
|
|
219
|
+
const errorHandler = configManager.getErrorHandler();
|
|
220
|
+
if (errorHandler) {
|
|
221
|
+
try {
|
|
222
|
+
errorHandler(requestError);
|
|
223
|
+
} catch (e) {
|
|
224
|
+
console.error("[Request] 错误处理钩子执行失败:", e);
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
return requestError;
|
|
228
|
+
}
|
|
229
|
+
function isSuccessResponse(response) {
|
|
230
|
+
const data = response.data;
|
|
231
|
+
if (!isBusinessResponse(data)) {
|
|
232
|
+
return true;
|
|
233
|
+
}
|
|
234
|
+
return configManager.isSuccessCode(data.code);
|
|
235
|
+
}
|
|
236
|
+
const __vite_import_meta_env__ = {};
|
|
237
|
+
function getBaseURL() {
|
|
238
|
+
const env = __vite_import_meta_env__;
|
|
239
|
+
const prefix = env == null ? void 0 : env.VITE_BASE_API_PREFIX;
|
|
240
|
+
if (prefix === void 0) {
|
|
241
|
+
console.warn("[Request] VITE_BASE_API_PREFIX 未定义,使用空字符串作为基础路径");
|
|
242
|
+
return "";
|
|
243
|
+
}
|
|
244
|
+
return prefix;
|
|
245
|
+
}
|
|
246
|
+
function objectToQueryString(obj) {
|
|
247
|
+
const params = new URLSearchParams();
|
|
248
|
+
Object.entries(obj).forEach(([key, value]) => {
|
|
249
|
+
if (value === void 0 || value === null) {
|
|
250
|
+
return;
|
|
251
|
+
}
|
|
252
|
+
if (Array.isArray(value)) {
|
|
253
|
+
value.forEach((item) => params.append(key, String(item)));
|
|
254
|
+
} else {
|
|
255
|
+
params.append(key, String(value));
|
|
256
|
+
}
|
|
257
|
+
});
|
|
258
|
+
return params.toString();
|
|
259
|
+
}
|
|
260
|
+
function buildURL(url, params) {
|
|
261
|
+
if (!params || Object.keys(params).length === 0) {
|
|
262
|
+
return url;
|
|
263
|
+
}
|
|
264
|
+
const queryString = objectToQueryString(params);
|
|
265
|
+
const separator = url.includes("?") ? "&" : "?";
|
|
266
|
+
return `${url}${separator}${queryString}`;
|
|
267
|
+
}
|
|
268
|
+
class RequestClass {
|
|
269
|
+
constructor() {
|
|
270
|
+
__publicField(this, "instance");
|
|
271
|
+
this.instance = axios.create({
|
|
272
|
+
baseURL: getBaseURL(),
|
|
273
|
+
timeout: configManager.getTimeout(),
|
|
274
|
+
headers: {
|
|
275
|
+
"Content-Type": "application/json"
|
|
276
|
+
}
|
|
277
|
+
});
|
|
278
|
+
this.setupInterceptors();
|
|
279
|
+
}
|
|
280
|
+
/**
|
|
281
|
+
* 配置对象
|
|
282
|
+
* 用于全局配置访问
|
|
283
|
+
*/
|
|
284
|
+
get config() {
|
|
285
|
+
return {
|
|
286
|
+
set: (config) => configManager.setConfig(config),
|
|
287
|
+
get: () => configManager.getConfig(),
|
|
288
|
+
reset: () => configManager.reset()
|
|
289
|
+
};
|
|
290
|
+
}
|
|
291
|
+
/**
|
|
292
|
+
* 设置拦截器
|
|
293
|
+
*/
|
|
294
|
+
setupInterceptors() {
|
|
295
|
+
const interceptors = configManager.getInterceptors();
|
|
296
|
+
this.instance.interceptors.request.use(
|
|
297
|
+
(config) => {
|
|
298
|
+
if (interceptors.request) {
|
|
299
|
+
return interceptors.request(config);
|
|
300
|
+
}
|
|
301
|
+
return config;
|
|
302
|
+
},
|
|
303
|
+
(error) => {
|
|
304
|
+
if (interceptors.requestError) {
|
|
305
|
+
return Promise.reject(interceptors.requestError(error));
|
|
306
|
+
}
|
|
307
|
+
return Promise.reject(handleError(error));
|
|
308
|
+
}
|
|
309
|
+
);
|
|
310
|
+
this.instance.interceptors.response.use(
|
|
311
|
+
(response) => {
|
|
312
|
+
if (!isSuccessResponse(response)) {
|
|
313
|
+
return Promise.reject(handleError(response));
|
|
314
|
+
}
|
|
315
|
+
if (interceptors.response) {
|
|
316
|
+
return interceptors.response(response);
|
|
317
|
+
}
|
|
318
|
+
return response;
|
|
319
|
+
},
|
|
320
|
+
(error) => {
|
|
321
|
+
if (interceptors.responseError) {
|
|
322
|
+
return Promise.reject(interceptors.responseError(error));
|
|
323
|
+
}
|
|
324
|
+
return Promise.reject(handleError(error));
|
|
325
|
+
}
|
|
326
|
+
);
|
|
327
|
+
}
|
|
328
|
+
/**
|
|
329
|
+
* 创建取消令牌
|
|
330
|
+
*/
|
|
331
|
+
createCancelToken() {
|
|
332
|
+
const controller = new AbortController();
|
|
333
|
+
return {
|
|
334
|
+
token: controller.signal,
|
|
335
|
+
cancel: () => controller.abort()
|
|
336
|
+
};
|
|
337
|
+
}
|
|
338
|
+
/**
|
|
339
|
+
* GET 请求
|
|
340
|
+
* @template P - 请求参数类型
|
|
341
|
+
* @template R - 响应 data 字段类型
|
|
342
|
+
*/
|
|
343
|
+
async get(url, params, config) {
|
|
344
|
+
const fullURL = buildURL(url, params);
|
|
345
|
+
const response = await this.instance.get(fullURL, config);
|
|
346
|
+
return response.data;
|
|
347
|
+
}
|
|
348
|
+
/**
|
|
349
|
+
* DELETE 请求
|
|
350
|
+
* @template P - 请求参数类型
|
|
351
|
+
* @template R - 响应 data 字段类型
|
|
352
|
+
*/
|
|
353
|
+
async delete(url, params, config) {
|
|
354
|
+
const fullURL = buildURL(url, params);
|
|
355
|
+
const response = await this.instance.delete(fullURL, config);
|
|
356
|
+
return response.data;
|
|
357
|
+
}
|
|
358
|
+
/**
|
|
359
|
+
* POST 请求
|
|
360
|
+
* @template P - 请求参数类型
|
|
361
|
+
* @template R - 响应 data 字段类型
|
|
362
|
+
*/
|
|
363
|
+
async post(url, data, config) {
|
|
364
|
+
const response = await this.instance.post(url, data, config);
|
|
365
|
+
return response.data;
|
|
366
|
+
}
|
|
367
|
+
/**
|
|
368
|
+
* PUT 请求
|
|
369
|
+
* @template P - 请求参数类型
|
|
370
|
+
* @template R - 响应 data 字段类型
|
|
371
|
+
*/
|
|
372
|
+
async put(url, data, config) {
|
|
373
|
+
const response = await this.instance.put(url, data, config);
|
|
374
|
+
return response.data;
|
|
375
|
+
}
|
|
376
|
+
/**
|
|
377
|
+
* PATCH 请求
|
|
378
|
+
* @template P - 请求参数类型
|
|
379
|
+
* @template R - 响应 data 字段类型
|
|
380
|
+
*/
|
|
381
|
+
async patch(url, data, config) {
|
|
382
|
+
const response = await this.instance.patch(url, data, config);
|
|
383
|
+
return response.data;
|
|
384
|
+
}
|
|
385
|
+
/**
|
|
386
|
+
* POST 表单请求(multipart/form-data)
|
|
387
|
+
* @template P - 请求参数类型
|
|
388
|
+
* @template R - 响应 data 字段类型
|
|
389
|
+
*/
|
|
390
|
+
async postForm(url, data, config) {
|
|
391
|
+
const formData = new FormData();
|
|
392
|
+
if (data) {
|
|
393
|
+
Object.entries(data).forEach(([key, value]) => {
|
|
394
|
+
if (value !== void 0 && value !== null) {
|
|
395
|
+
if (value instanceof File || value instanceof Blob) {
|
|
396
|
+
formData.append(key, value);
|
|
397
|
+
} else {
|
|
398
|
+
formData.append(key, String(value));
|
|
399
|
+
}
|
|
400
|
+
}
|
|
401
|
+
});
|
|
402
|
+
}
|
|
403
|
+
const response = await this.instance.post(url, formData, {
|
|
404
|
+
...config,
|
|
405
|
+
headers: {
|
|
406
|
+
...config == null ? void 0 : config.headers,
|
|
407
|
+
"Content-Type": "multipart/form-data"
|
|
408
|
+
}
|
|
409
|
+
});
|
|
410
|
+
return response.data;
|
|
411
|
+
}
|
|
412
|
+
/**
|
|
413
|
+
* 通用请求方法
|
|
414
|
+
* @template P - 请求参数类型
|
|
415
|
+
* @template R - 响应 data 字段类型
|
|
416
|
+
*/
|
|
417
|
+
async request(method, url, paramsOrData, config) {
|
|
418
|
+
switch (method) {
|
|
419
|
+
case "get":
|
|
420
|
+
return this.get(url, paramsOrData, config);
|
|
421
|
+
case "delete":
|
|
422
|
+
return this.delete(url, paramsOrData, config);
|
|
423
|
+
case "post":
|
|
424
|
+
return this.post(url, paramsOrData, config);
|
|
425
|
+
case "put":
|
|
426
|
+
return this.put(url, paramsOrData, config);
|
|
427
|
+
case "patch":
|
|
428
|
+
return this.patch(url, paramsOrData, config);
|
|
429
|
+
default:
|
|
430
|
+
throw new Error(`[Request] 不支持的请求方法: ${method}`);
|
|
431
|
+
}
|
|
432
|
+
}
|
|
433
|
+
}
|
|
434
|
+
const Request = new RequestClass();
|
|
435
|
+
exports.DEFAULT_CODE_MESSAGE_MAP = DEFAULT_CODE_MESSAGE_MAP;
|
|
436
|
+
exports.DEFAULT_HTTP_STATUS_MESSAGE_MAP = DEFAULT_HTTP_STATUS_MESSAGE_MAP;
|
|
437
|
+
exports.DEFAULT_SUCCESS_CODE = DEFAULT_SUCCESS_CODE;
|
|
438
|
+
exports.DEFAULT_TIMEOUT = DEFAULT_TIMEOUT;
|
|
439
|
+
exports.Request = Request;
|
|
440
|
+
exports.RequestError = RequestError;
|
|
441
|
+
exports.configManager = configManager;
|
|
442
|
+
exports.handleError = handleError;
|
|
443
|
+
exports.isSuccessResponse = isSuccessResponse;
|
|
444
|
+
//# sourceMappingURL=index.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.cjs","sources":["../src/config.ts","../src/types.ts","../src/error-handler.ts","../src/request.ts"],"sourcesContent":["import type { GlobalConfig, CodeMessageMap, HttpStatusMessageMap, InterceptorConfig } from './types.js';\n\n/**\n * 默认 Code 提示映射表\n */\nexport const DEFAULT_CODE_MESSAGE_MAP: CodeMessageMap = {\n 200: '操作成功',\n 201: '创建成功',\n 400: '请求参数错误',\n 401: '未授权,请重新登录',\n 403: '拒绝访问',\n 404: '请求资源不存在',\n 500: '服务器内部错误',\n 502: '网关错误',\n 503: '服务不可用',\n 504: '网关超时',\n};\n\n/**\n * 默认 HTTP 状态码提示映射表\n */\nexport const DEFAULT_HTTP_STATUS_MESSAGE_MAP: HttpStatusMessageMap = {\n 400: '请求参数错误',\n 401: '未授权,请重新登录',\n 403: '拒绝访问',\n 404: '请求资源不存在',\n 405: '请求方法不允许',\n 408: '请求超时',\n 500: '服务器内部错误',\n 501: '服务未实现',\n 502: '网关错误',\n 503: '服务不可用',\n 504: '网关超时',\n};\n\n/**\n * 默认成功状态码\n */\nexport const DEFAULT_SUCCESS_CODE: number[] = [200, 0];\n\n/**\n * 默认超时时间(10秒)\n */\nexport const DEFAULT_TIMEOUT = 10000;\n\n/**\n * 配置管理类\n */\nclass ConfigManager {\n private config: GlobalConfig = {\n baseResponseType: undefined,\n successCode: DEFAULT_SUCCESS_CODE,\n codeMessageMap: { ...DEFAULT_CODE_MESSAGE_MAP },\n httpStatusMessageMap: { ...DEFAULT_HTTP_STATUS_MESSAGE_MAP },\n timeout: DEFAULT_TIMEOUT,\n interceptors: {},\n onError: undefined,\n };\n\n /**\n * 获取当前配置\n */\n getConfig(): GlobalConfig {\n return { ...this.config };\n }\n\n /**\n * 设置全局配置\n */\n setConfig(config: GlobalConfig): void {\n this.config = {\n ...this.config,\n ...config,\n // 深度合并映射表\n codeMessageMap: {\n ...this.config.codeMessageMap,\n ...config.codeMessageMap,\n },\n httpStatusMessageMap: {\n ...this.config.httpStatusMessageMap,\n ...config.httpStatusMessageMap,\n },\n // 合并拦截器配置\n interceptors: {\n ...this.config.interceptors,\n ...config.interceptors,\n },\n };\n }\n\n /**\n * 获取成功状态码\n */\n getSuccessCodes(): number[] {\n const codes = this.config.successCode ?? DEFAULT_SUCCESS_CODE;\n return Array.isArray(codes) ? codes : [codes];\n }\n\n /**\n * 检查是否为成功状态码\n */\n isSuccessCode(code: number): boolean {\n return this.getSuccessCodes().includes(code);\n }\n\n /**\n * 根据 Code 获取提示消息\n */\n getMessageByCode(code: number | string): string | undefined {\n return this.config.codeMessageMap?.[code];\n }\n\n /**\n * 根据 HTTP 状态码获取提示消息\n */\n getMessageByHttpStatus(status: number): string | undefined {\n return this.config.httpStatusMessageMap?.[status];\n }\n\n /**\n * 获取超时时间\n */\n getTimeout(): number {\n return this.config.timeout ?? DEFAULT_TIMEOUT;\n }\n\n /**\n * 获取拦截器配置\n */\n getInterceptors(): InterceptorConfig {\n return this.config.interceptors ?? {};\n }\n\n /**\n * 获取错误处理钩子\n */\n getErrorHandler(): ((error: unknown) => void) | undefined {\n return this.config.onError ?? undefined;\n }\n\n /**\n * 重置为默认配置\n */\n reset(): void {\n this.config = {\n baseResponseType: undefined,\n successCode: DEFAULT_SUCCESS_CODE,\n codeMessageMap: { ...DEFAULT_CODE_MESSAGE_MAP },\n httpStatusMessageMap: { ...DEFAULT_HTTP_STATUS_MESSAGE_MAP },\n timeout: DEFAULT_TIMEOUT,\n interceptors: {},\n onError: undefined,\n };\n }\n}\n\n/**\n * 全局配置管理器实例\n */\nexport const configManager = new ConfigManager();\n","import type { AxiosRequestConfig, AxiosResponse, InternalAxiosRequestConfig, Canceler } from 'axios';\n\n/**\n * 默认响应数据格式\n * @template T - data 字段的数据类型\n */\nexport interface BaseResponse<T = unknown> {\n /** 业务状态码 */\n code: number;\n /** 响应数据 */\n data: T;\n /** 提示消息 */\n msg: string;\n /** 是否成功 */\n success: boolean;\n}\n\n/**\n * 自定义响应数据格式接口\n * 用户可通过继承此接口实现自定义响应格式\n */\nexport interface CustomResponse<T = unknown> {\n [key: string]: unknown;\n data?: T;\n}\n\n/**\n * 请求配置选项\n */\nexport interface RequestConfig extends AxiosRequestConfig {\n /** 是否显示错误提示 */\n showError?: boolean;\n /** 自定义错误提示消息 */\n errorMessage?: string;\n /** 是否携带 token */\n withToken?: boolean;\n}\n\n/**\n * 请求拦截器函数类型\n */\nexport type RequestInterceptor = (\n config: InternalAxiosRequestConfig\n) => InternalAxiosRequestConfig | Promise<InternalAxiosRequestConfig>;\n\n/**\n * 响应拦截器函数类型\n */\nexport type ResponseInterceptor<T = unknown> = (\n response: AxiosResponse<T>\n) => AxiosResponse<T> | Promise<AxiosResponse<T>>;\n\n/**\n * 错误拦截器函数类型\n */\nexport type ErrorInterceptor = (error: unknown) => unknown;\n\n/**\n * 拦截器配置\n */\nexport interface InterceptorConfig {\n /** 请求拦截器 */\n request?: RequestInterceptor;\n /** 请求错误拦截器 */\n requestError?: ErrorInterceptor;\n /** 响应拦截器 */\n response?: ResponseInterceptor;\n /** 响应错误拦截器 */\n responseError?: ErrorInterceptor;\n}\n\n/**\n * Code 提示映射表\n */\nexport type CodeMessageMap = Record<number | string, string>;\n\n/**\n * HTTP 状态码提示映射表\n */\nexport type HttpStatusMessageMap = Record<number, string>;\n\n/**\n * 全局配置选项\n */\nexport interface GlobalConfig<T = unknown> {\n /** 基础响应数据类型(用于类型推断) */\n baseResponseType?: T;\n /** 成功状态码 */\n successCode?: number | number[];\n /** Code 提示映射表 */\n codeMessageMap?: CodeMessageMap;\n /** HTTP 状态码提示映射表 */\n httpStatusMessageMap?: HttpStatusMessageMap;\n /** 默认超时时间(毫秒) */\n timeout?: number;\n /** 请求拦截器配置 */\n interceptors?: InterceptorConfig;\n /** 错误处理钩子(预留 event-bus 接入点) */\n onError?: (error: unknown) => void;\n}\n\n/**\n * 请求错误类\n */\nexport class RequestError extends Error {\n /** 错误码(业务码或 HTTP 状态码) */\n code: number | string;\n /** 原始错误对象 */\n originalError: unknown;\n /** 是否为业务错误 */\n isBusinessError: boolean;\n /** 是否为 HTTP 错误 */\n isHttpError: boolean;\n /** 请求配置 */\n config?: AxiosRequestConfig;\n\n constructor(options: {\n message: string;\n code: number | string;\n originalError: unknown;\n isBusinessError?: boolean;\n isHttpError?: boolean;\n config?: AxiosRequestConfig;\n }) {\n super(options.message);\n this.name = 'RequestError';\n this.code = options.code;\n this.originalError = options.originalError;\n this.isBusinessError = options.isBusinessError ?? false;\n this.isHttpError = options.isHttpError ?? false;\n this.config = options.config;\n }\n}\n\n/**\n * 取消请求控制器\n */\nexport interface CancelTokenController {\n /** 取消函数 */\n cancel: Canceler;\n /** 取消令牌 */\n token: AbortSignal;\n}\n\n/**\n * 请求方法类型定义\n */\nexport type RequestMethod = 'get' | 'post' | 'put' | 'delete' | 'patch';\n\n/**\n * 请求参数类型(对象格式)\n * 使用宽泛的类型约束以支持任意对象\n */\nexport type RequestParams = object;\n","import type { AxiosError, AxiosResponse } from 'axios';\nimport { RequestError } from './types.js';\nimport { configManager } from './config.js';\n\n/**\n * 判断是否为 Axios 错误\n */\nfunction isAxiosError(error: unknown): error is AxiosError {\n return (\n typeof error === 'object' &&\n error !== null &&\n 'isAxiosError' in error &&\n (error as AxiosError).isAxiosError === true\n );\n}\n\n/**\n * 判断是否为业务响应错误\n */\nfunction isBusinessResponse(response: unknown): response is { code: number; msg?: string; message?: string } {\n return (\n typeof response === 'object' &&\n response !== null &&\n 'code' in response &&\n typeof (response as { code: unknown }).code === 'number'\n );\n}\n\n/**\n * 处理 HTTP 错误\n */\nfunction handleHttpError(error: AxiosError): RequestError {\n const status = error.response?.status ?? 0;\n const defaultMessage = '网络请求错误';\n const message = configManager.getMessageByHttpStatus(status) ?? defaultMessage;\n\n return new RequestError({\n message,\n code: status,\n originalError: error,\n isHttpError: true,\n config: error.config,\n });\n}\n\n/**\n * 处理业务错误\n */\nfunction handleBusinessError(response: AxiosResponse): RequestError {\n const data = response.data;\n const code = isBusinessResponse(data) ? data.code : -1;\n const msg = isBusinessResponse(data) ? (data.msg ?? data.message ?? '业务处理失败') : '业务处理失败';\n const message = configManager.getMessageByCode(code) ?? msg;\n\n return new RequestError({\n message,\n code,\n originalError: data,\n isBusinessError: true,\n });\n}\n\n// 导出业务错误处理函数供外部使用\nexport { handleBusinessError };\n\n/**\n * 处理请求错误(网络错误、超时等)\n */\nfunction handleRequestError(error: AxiosError): RequestError {\n let message = '请求失败';\n let code: number | string = -1;\n\n if (error.code === 'ECONNABORTED') {\n message = '请求超时,请稍后重试';\n code = 408;\n } else if (error.code === 'ERR_NETWORK') {\n message = '网络连接失败,请检查网络';\n code = 'NETWORK_ERROR';\n } else if (error.code === 'ERR_CANCELED') {\n message = '请求已取消';\n code = 'CANCELED';\n }\n\n return new RequestError({\n message,\n code,\n originalError: error,\n config: error.config,\n });\n}\n\n/**\n * 统一错误处理入口\n */\nexport function handleError(error: unknown): RequestError {\n let requestError: RequestError;\n\n if (isAxiosError(error)) {\n // HTTP 错误(有响应但状态码非 2xx)\n if (error.response) {\n requestError = handleHttpError(error);\n } else {\n // 请求错误(无响应,网络问题、超时等)\n requestError = handleRequestError(error);\n }\n } else if (error instanceof RequestError) {\n requestError = error;\n } else if (error instanceof Error) {\n requestError = new RequestError({\n message: error.message,\n code: 'UNKNOWN_ERROR',\n originalError: error,\n });\n } else {\n requestError = new RequestError({\n message: '未知错误',\n code: 'UNKNOWN_ERROR',\n originalError: error,\n });\n }\n\n // 触发错误处理钩子(预留 event-bus 接入点)\n const errorHandler = configManager.getErrorHandler();\n if (errorHandler) {\n try {\n errorHandler(requestError);\n } catch (e) {\n console.error('[Request] 错误处理钩子执行失败:', e);\n }\n }\n\n return requestError;\n}\n\n/**\n * 检查响应是否为成功响应\n */\nexport function isSuccessResponse(response: AxiosResponse): boolean {\n const data = response.data;\n\n if (!isBusinessResponse(data)) {\n // 如果不是标准业务响应格式,默认认为成功(HTTP 2xx)\n return true;\n }\n\n return configManager.isSuccessCode(data.code);\n}\n\nexport { isAxiosError, isBusinessResponse };\n","import axios, { type AxiosInstance, type AxiosResponse, type InternalAxiosRequestConfig } from 'axios';\nimport type { BaseResponse, RequestConfig, RequestParams, GlobalConfig } from './types.js';\nimport { configManager } from './config.js';\nimport { handleError, isSuccessResponse } from './error-handler.js';\n\n/**\n * 获取基础 URL\n * 优先从环境变量读取,未定义时返回空字符串\n */\nfunction getBaseURL(): string {\n // 使用类型断言访问 Vite 环境变量\n const env = (import.meta as unknown as { env: Record<string, string | undefined> }).env;\n const prefix = env?.VITE_BASE_API_PREFIX;\n\n if (prefix === undefined) {\n console.warn('[Request] VITE_BASE_API_PREFIX 未定义,使用空字符串作为基础路径');\n return '';\n }\n\n return prefix;\n}\n\n/**\n * 将对象转换为 URL 查询字符串\n */\nfunction objectToQueryString(obj: RequestParams): string {\n const params = new URLSearchParams();\n\n Object.entries(obj).forEach(([key, value]) => {\n if (value === undefined || value === null) {\n return;\n }\n\n if (Array.isArray(value)) {\n value.forEach((item) => params.append(key, String(item)));\n } else {\n params.append(key, String(value));\n }\n });\n\n return params.toString();\n}\n\n/**\n * 构建完整 URL(带查询参数)\n */\nfunction buildURL(url: string, params?: RequestParams): string {\n if (!params || Object.keys(params).length === 0) {\n return url;\n }\n\n const queryString = objectToQueryString(params);\n const separator = url.includes('?') ? '&' : '?';\n\n return `${url}${separator}${queryString}`;\n}\n\n/**\n * 请求类\n */\nclass RequestClass {\n private instance: AxiosInstance;\n\n constructor() {\n this.instance = axios.create({\n baseURL: getBaseURL(),\n timeout: configManager.getTimeout(),\n headers: {\n 'Content-Type': 'application/json',\n },\n });\n\n this.setupInterceptors();\n }\n\n /**\n * 配置对象\n * 用于全局配置访问\n */\n get config(): {\n set: (config: GlobalConfig) => void;\n get: () => ReturnType<typeof configManager.getConfig>;\n reset: () => void;\n } {\n return {\n set: (config: GlobalConfig) => configManager.setConfig(config),\n get: () => configManager.getConfig(),\n reset: () => configManager.reset(),\n };\n }\n\n /**\n * 设置拦截器\n */\n private setupInterceptors(): void {\n const interceptors = configManager.getInterceptors();\n\n // 请求拦截器\n this.instance.interceptors.request.use(\n (config: InternalAxiosRequestConfig) => {\n // 应用用户自定义请求拦截器\n if (interceptors.request) {\n return interceptors.request(config);\n }\n return config;\n },\n (error: unknown) => {\n if (interceptors.requestError) {\n return Promise.reject(interceptors.requestError(error));\n }\n return Promise.reject(handleError(error));\n }\n );\n\n // 响应拦截器\n this.instance.interceptors.response.use(\n (response: AxiosResponse) => {\n // 检查业务状态码\n if (!isSuccessResponse(response)) {\n return Promise.reject(handleError(response));\n }\n\n // 应用用户自定义响应拦截器\n if (interceptors.response) {\n return interceptors.response(response);\n }\n\n return response;\n },\n (error: unknown) => {\n if (interceptors.responseError) {\n return Promise.reject(interceptors.responseError(error));\n }\n return Promise.reject(handleError(error));\n }\n );\n }\n\n /**\n * 创建取消令牌\n */\n createCancelToken(): { token: AbortSignal; cancel: () => void } {\n const controller = new AbortController();\n return {\n token: controller.signal,\n cancel: () => controller.abort(),\n };\n }\n\n /**\n * GET 请求\n * @template P - 请求参数类型\n * @template R - 响应 data 字段类型\n */\n async get<P extends RequestParams = RequestParams, R = unknown>(\n url: string,\n params?: P,\n config?: RequestConfig\n ): Promise<BaseResponse<R>> {\n const fullURL = buildURL(url, params);\n\n const response = await this.instance.get<BaseResponse<R>>(fullURL, config);\n return response.data;\n }\n\n /**\n * DELETE 请求\n * @template P - 请求参数类型\n * @template R - 响应 data 字段类型\n */\n async delete<P extends RequestParams = RequestParams, R = unknown>(\n url: string,\n params?: P,\n config?: RequestConfig\n ): Promise<BaseResponse<R>> {\n const fullURL = buildURL(url, params);\n\n const response = await this.instance.delete<BaseResponse<R>>(fullURL, config);\n return response.data;\n }\n\n /**\n * POST 请求\n * @template P - 请求参数类型\n * @template R - 响应 data 字段类型\n */\n async post<P extends RequestParams = RequestParams, R = unknown>(\n url: string,\n data?: P,\n config?: RequestConfig\n ): Promise<BaseResponse<R>> {\n const response = await this.instance.post<BaseResponse<R>>(url, data, config);\n return response.data;\n }\n\n /**\n * PUT 请求\n * @template P - 请求参数类型\n * @template R - 响应 data 字段类型\n */\n async put<P extends RequestParams = RequestParams, R = unknown>(\n url: string,\n data?: P,\n config?: RequestConfig\n ): Promise<BaseResponse<R>> {\n const response = await this.instance.put<BaseResponse<R>>(url, data, config);\n return response.data;\n }\n\n /**\n * PATCH 请求\n * @template P - 请求参数类型\n * @template R - 响应 data 字段类型\n */\n async patch<P extends RequestParams = RequestParams, R = unknown>(\n url: string,\n data?: P,\n config?: RequestConfig\n ): Promise<BaseResponse<R>> {\n const response = await this.instance.patch<BaseResponse<R>>(url, data, config);\n return response.data;\n }\n\n /**\n * POST 表单请求(multipart/form-data)\n * @template P - 请求参数类型\n * @template R - 响应 data 字段类型\n */\n async postForm<P extends RequestParams = RequestParams, R = unknown>(\n url: string,\n data?: P,\n config?: RequestConfig\n ): Promise<BaseResponse<R>> {\n const formData = new FormData();\n\n if (data) {\n Object.entries(data).forEach(([key, value]) => {\n if (value !== undefined && value !== null) {\n if (value instanceof File || value instanceof Blob) {\n formData.append(key, value);\n } else {\n formData.append(key, String(value));\n }\n }\n });\n }\n\n const response = await this.instance.post<BaseResponse<R>>(url, formData, {\n ...config,\n headers: {\n ...config?.headers,\n 'Content-Type': 'multipart/form-data',\n },\n });\n\n return response.data;\n }\n\n /**\n * 通用请求方法\n * @template P - 请求参数类型\n * @template R - 响应 data 字段类型\n */\n async request<P extends RequestParams = RequestParams, R = unknown>(\n method: 'get' | 'post' | 'put' | 'delete' | 'patch',\n url: string,\n paramsOrData?: P,\n config?: RequestConfig\n ): Promise<BaseResponse<R>> {\n switch (method) {\n case 'get':\n return this.get<P, R>(url, paramsOrData, config);\n case 'delete':\n return this.delete<P, R>(url, paramsOrData, config);\n case 'post':\n return this.post<P, R>(url, paramsOrData, config);\n case 'put':\n return this.put<P, R>(url, paramsOrData, config);\n case 'patch':\n return this.patch<P, R>(url, paramsOrData, config);\n default:\n throw new Error(`[Request] 不支持的请求方法: ${method}`);\n }\n }\n}\n\n/**\n * Request 实例\n */\nexport const Request = new RequestClass();\n\n/**\n * 重新初始化 Request(配置变更后调用)\n * @internal\n */\nexport function reinitializeRequest(): void {\n // 通过创建新实例来应用新配置\n Object.setPrototypeOf(Request, new RequestClass());\n}\n"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,304 @@
|
|
|
1
|
+
import { AxiosRequestConfig } from 'axios';
|
|
2
|
+
import { AxiosResponse } from 'axios';
|
|
3
|
+
import { Canceler } from 'axios';
|
|
4
|
+
import { InternalAxiosRequestConfig } from 'axios';
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* 默认响应数据格式
|
|
8
|
+
* @template T - data 字段的数据类型
|
|
9
|
+
*/
|
|
10
|
+
export declare interface BaseResponse<T = unknown> {
|
|
11
|
+
/** 业务状态码 */
|
|
12
|
+
code: number;
|
|
13
|
+
/** 响应数据 */
|
|
14
|
+
data: T;
|
|
15
|
+
/** 提示消息 */
|
|
16
|
+
msg: string;
|
|
17
|
+
/** 是否成功 */
|
|
18
|
+
success: boolean;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* 取消请求控制器
|
|
23
|
+
*/
|
|
24
|
+
export declare interface CancelTokenController {
|
|
25
|
+
/** 取消函数 */
|
|
26
|
+
cancel: Canceler;
|
|
27
|
+
/** 取消令牌 */
|
|
28
|
+
token: AbortSignal;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* Code 提示映射表
|
|
33
|
+
*/
|
|
34
|
+
export declare type CodeMessageMap = Record<number | string, string>;
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* 配置管理类
|
|
38
|
+
*/
|
|
39
|
+
declare class ConfigManager {
|
|
40
|
+
private config;
|
|
41
|
+
/**
|
|
42
|
+
* 获取当前配置
|
|
43
|
+
*/
|
|
44
|
+
getConfig(): GlobalConfig;
|
|
45
|
+
/**
|
|
46
|
+
* 设置全局配置
|
|
47
|
+
*/
|
|
48
|
+
setConfig(config: GlobalConfig): void;
|
|
49
|
+
/**
|
|
50
|
+
* 获取成功状态码
|
|
51
|
+
*/
|
|
52
|
+
getSuccessCodes(): number[];
|
|
53
|
+
/**
|
|
54
|
+
* 检查是否为成功状态码
|
|
55
|
+
*/
|
|
56
|
+
isSuccessCode(code: number): boolean;
|
|
57
|
+
/**
|
|
58
|
+
* 根据 Code 获取提示消息
|
|
59
|
+
*/
|
|
60
|
+
getMessageByCode(code: number | string): string | undefined;
|
|
61
|
+
/**
|
|
62
|
+
* 根据 HTTP 状态码获取提示消息
|
|
63
|
+
*/
|
|
64
|
+
getMessageByHttpStatus(status: number): string | undefined;
|
|
65
|
+
/**
|
|
66
|
+
* 获取超时时间
|
|
67
|
+
*/
|
|
68
|
+
getTimeout(): number;
|
|
69
|
+
/**
|
|
70
|
+
* 获取拦截器配置
|
|
71
|
+
*/
|
|
72
|
+
getInterceptors(): InterceptorConfig;
|
|
73
|
+
/**
|
|
74
|
+
* 获取错误处理钩子
|
|
75
|
+
*/
|
|
76
|
+
getErrorHandler(): ((error: unknown) => void) | undefined;
|
|
77
|
+
/**
|
|
78
|
+
* 重置为默认配置
|
|
79
|
+
*/
|
|
80
|
+
reset(): void;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
/**
|
|
84
|
+
* 全局配置管理器实例
|
|
85
|
+
*/
|
|
86
|
+
export declare const configManager: ConfigManager;
|
|
87
|
+
|
|
88
|
+
/**
|
|
89
|
+
* 自定义响应数据格式接口
|
|
90
|
+
* 用户可通过继承此接口实现自定义响应格式
|
|
91
|
+
*/
|
|
92
|
+
export declare interface CustomResponse<T = unknown> {
|
|
93
|
+
[key: string]: unknown;
|
|
94
|
+
data?: T;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
/**
|
|
98
|
+
* 默认 Code 提示映射表
|
|
99
|
+
*/
|
|
100
|
+
export declare const DEFAULT_CODE_MESSAGE_MAP: CodeMessageMap;
|
|
101
|
+
|
|
102
|
+
/**
|
|
103
|
+
* 默认 HTTP 状态码提示映射表
|
|
104
|
+
*/
|
|
105
|
+
export declare const DEFAULT_HTTP_STATUS_MESSAGE_MAP: HttpStatusMessageMap;
|
|
106
|
+
|
|
107
|
+
/**
|
|
108
|
+
* 默认成功状态码
|
|
109
|
+
*/
|
|
110
|
+
export declare const DEFAULT_SUCCESS_CODE: number[];
|
|
111
|
+
|
|
112
|
+
/**
|
|
113
|
+
* 默认超时时间(10秒)
|
|
114
|
+
*/
|
|
115
|
+
export declare const DEFAULT_TIMEOUT = 10000;
|
|
116
|
+
|
|
117
|
+
/**
|
|
118
|
+
* 错误拦截器函数类型
|
|
119
|
+
*/
|
|
120
|
+
export declare type ErrorInterceptor = (error: unknown) => unknown;
|
|
121
|
+
|
|
122
|
+
/**
|
|
123
|
+
* 全局配置选项
|
|
124
|
+
*/
|
|
125
|
+
export declare interface GlobalConfig<T = unknown> {
|
|
126
|
+
/** 基础响应数据类型(用于类型推断) */
|
|
127
|
+
baseResponseType?: T;
|
|
128
|
+
/** 成功状态码 */
|
|
129
|
+
successCode?: number | number[];
|
|
130
|
+
/** Code 提示映射表 */
|
|
131
|
+
codeMessageMap?: CodeMessageMap;
|
|
132
|
+
/** HTTP 状态码提示映射表 */
|
|
133
|
+
httpStatusMessageMap?: HttpStatusMessageMap;
|
|
134
|
+
/** 默认超时时间(毫秒) */
|
|
135
|
+
timeout?: number;
|
|
136
|
+
/** 请求拦截器配置 */
|
|
137
|
+
interceptors?: InterceptorConfig;
|
|
138
|
+
/** 错误处理钩子(预留 event-bus 接入点) */
|
|
139
|
+
onError?: (error: unknown) => void;
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
/**
|
|
143
|
+
* 统一错误处理入口
|
|
144
|
+
*/
|
|
145
|
+
export declare function handleError(error: unknown): RequestError;
|
|
146
|
+
|
|
147
|
+
/**
|
|
148
|
+
* HTTP 状态码提示映射表
|
|
149
|
+
*/
|
|
150
|
+
export declare type HttpStatusMessageMap = Record<number, string>;
|
|
151
|
+
|
|
152
|
+
/**
|
|
153
|
+
* 拦截器配置
|
|
154
|
+
*/
|
|
155
|
+
export declare interface InterceptorConfig {
|
|
156
|
+
/** 请求拦截器 */
|
|
157
|
+
request?: RequestInterceptor;
|
|
158
|
+
/** 请求错误拦截器 */
|
|
159
|
+
requestError?: ErrorInterceptor;
|
|
160
|
+
/** 响应拦截器 */
|
|
161
|
+
response?: ResponseInterceptor;
|
|
162
|
+
/** 响应错误拦截器 */
|
|
163
|
+
responseError?: ErrorInterceptor;
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
/**
|
|
167
|
+
* 检查响应是否为成功响应
|
|
168
|
+
*/
|
|
169
|
+
export declare function isSuccessResponse(response: AxiosResponse): boolean;
|
|
170
|
+
|
|
171
|
+
/**
|
|
172
|
+
* Request 实例
|
|
173
|
+
*/
|
|
174
|
+
declare const Request_2: RequestClass;
|
|
175
|
+
export { Request_2 as Request }
|
|
176
|
+
|
|
177
|
+
/**
|
|
178
|
+
* 请求类
|
|
179
|
+
*/
|
|
180
|
+
declare class RequestClass {
|
|
181
|
+
private instance;
|
|
182
|
+
constructor();
|
|
183
|
+
/**
|
|
184
|
+
* 配置对象
|
|
185
|
+
* 用于全局配置访问
|
|
186
|
+
*/
|
|
187
|
+
get config(): {
|
|
188
|
+
set: (config: GlobalConfig) => void;
|
|
189
|
+
get: () => ReturnType<typeof configManager.getConfig>;
|
|
190
|
+
reset: () => void;
|
|
191
|
+
};
|
|
192
|
+
/**
|
|
193
|
+
* 设置拦截器
|
|
194
|
+
*/
|
|
195
|
+
private setupInterceptors;
|
|
196
|
+
/**
|
|
197
|
+
* 创建取消令牌
|
|
198
|
+
*/
|
|
199
|
+
createCancelToken(): {
|
|
200
|
+
token: AbortSignal;
|
|
201
|
+
cancel: () => void;
|
|
202
|
+
};
|
|
203
|
+
/**
|
|
204
|
+
* GET 请求
|
|
205
|
+
* @template P - 请求参数类型
|
|
206
|
+
* @template R - 响应 data 字段类型
|
|
207
|
+
*/
|
|
208
|
+
get<P extends RequestParams = RequestParams, R = unknown>(url: string, params?: P, config?: RequestConfig): Promise<BaseResponse<R>>;
|
|
209
|
+
/**
|
|
210
|
+
* DELETE 请求
|
|
211
|
+
* @template P - 请求参数类型
|
|
212
|
+
* @template R - 响应 data 字段类型
|
|
213
|
+
*/
|
|
214
|
+
delete<P extends RequestParams = RequestParams, R = unknown>(url: string, params?: P, config?: RequestConfig): Promise<BaseResponse<R>>;
|
|
215
|
+
/**
|
|
216
|
+
* POST 请求
|
|
217
|
+
* @template P - 请求参数类型
|
|
218
|
+
* @template R - 响应 data 字段类型
|
|
219
|
+
*/
|
|
220
|
+
post<P extends RequestParams = RequestParams, R = unknown>(url: string, data?: P, config?: RequestConfig): Promise<BaseResponse<R>>;
|
|
221
|
+
/**
|
|
222
|
+
* PUT 请求
|
|
223
|
+
* @template P - 请求参数类型
|
|
224
|
+
* @template R - 响应 data 字段类型
|
|
225
|
+
*/
|
|
226
|
+
put<P extends RequestParams = RequestParams, R = unknown>(url: string, data?: P, config?: RequestConfig): Promise<BaseResponse<R>>;
|
|
227
|
+
/**
|
|
228
|
+
* PATCH 请求
|
|
229
|
+
* @template P - 请求参数类型
|
|
230
|
+
* @template R - 响应 data 字段类型
|
|
231
|
+
*/
|
|
232
|
+
patch<P extends RequestParams = RequestParams, R = unknown>(url: string, data?: P, config?: RequestConfig): Promise<BaseResponse<R>>;
|
|
233
|
+
/**
|
|
234
|
+
* POST 表单请求(multipart/form-data)
|
|
235
|
+
* @template P - 请求参数类型
|
|
236
|
+
* @template R - 响应 data 字段类型
|
|
237
|
+
*/
|
|
238
|
+
postForm<P extends RequestParams = RequestParams, R = unknown>(url: string, data?: P, config?: RequestConfig): Promise<BaseResponse<R>>;
|
|
239
|
+
/**
|
|
240
|
+
* 通用请求方法
|
|
241
|
+
* @template P - 请求参数类型
|
|
242
|
+
* @template R - 响应 data 字段类型
|
|
243
|
+
*/
|
|
244
|
+
request<P extends RequestParams = RequestParams, R = unknown>(method: 'get' | 'post' | 'put' | 'delete' | 'patch', url: string, paramsOrData?: P, config?: RequestConfig): Promise<BaseResponse<R>>;
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
/**
|
|
248
|
+
* 请求配置选项
|
|
249
|
+
*/
|
|
250
|
+
export declare interface RequestConfig extends AxiosRequestConfig {
|
|
251
|
+
/** 是否显示错误提示 */
|
|
252
|
+
showError?: boolean;
|
|
253
|
+
/** 自定义错误提示消息 */
|
|
254
|
+
errorMessage?: string;
|
|
255
|
+
/** 是否携带 token */
|
|
256
|
+
withToken?: boolean;
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
/**
|
|
260
|
+
* 请求错误类
|
|
261
|
+
*/
|
|
262
|
+
export declare class RequestError extends Error {
|
|
263
|
+
/** 错误码(业务码或 HTTP 状态码) */
|
|
264
|
+
code: number | string;
|
|
265
|
+
/** 原始错误对象 */
|
|
266
|
+
originalError: unknown;
|
|
267
|
+
/** 是否为业务错误 */
|
|
268
|
+
isBusinessError: boolean;
|
|
269
|
+
/** 是否为 HTTP 错误 */
|
|
270
|
+
isHttpError: boolean;
|
|
271
|
+
/** 请求配置 */
|
|
272
|
+
config?: AxiosRequestConfig;
|
|
273
|
+
constructor(options: {
|
|
274
|
+
message: string;
|
|
275
|
+
code: number | string;
|
|
276
|
+
originalError: unknown;
|
|
277
|
+
isBusinessError?: boolean;
|
|
278
|
+
isHttpError?: boolean;
|
|
279
|
+
config?: AxiosRequestConfig;
|
|
280
|
+
});
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
/**
|
|
284
|
+
* 请求拦截器函数类型
|
|
285
|
+
*/
|
|
286
|
+
export declare type RequestInterceptor = (config: InternalAxiosRequestConfig) => InternalAxiosRequestConfig | Promise<InternalAxiosRequestConfig>;
|
|
287
|
+
|
|
288
|
+
/**
|
|
289
|
+
* 请求方法类型定义
|
|
290
|
+
*/
|
|
291
|
+
export declare type RequestMethod = 'get' | 'post' | 'put' | 'delete' | 'patch';
|
|
292
|
+
|
|
293
|
+
/**
|
|
294
|
+
* 请求参数类型(对象格式)
|
|
295
|
+
* 使用宽泛的类型约束以支持任意对象
|
|
296
|
+
*/
|
|
297
|
+
export declare type RequestParams = object;
|
|
298
|
+
|
|
299
|
+
/**
|
|
300
|
+
* 响应拦截器函数类型
|
|
301
|
+
*/
|
|
302
|
+
export declare type ResponseInterceptor<T = unknown> = (response: AxiosResponse<T>) => AxiosResponse<T> | Promise<AxiosResponse<T>>;
|
|
303
|
+
|
|
304
|
+
export { }
|
package/dist/index.mjs
ADDED
|
@@ -0,0 +1,444 @@
|
|
|
1
|
+
var __defProp = Object.defineProperty;
|
|
2
|
+
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
3
|
+
var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
|
|
4
|
+
import axios from "axios";
|
|
5
|
+
const DEFAULT_CODE_MESSAGE_MAP = {
|
|
6
|
+
200: "操作成功",
|
|
7
|
+
201: "创建成功",
|
|
8
|
+
400: "请求参数错误",
|
|
9
|
+
401: "未授权,请重新登录",
|
|
10
|
+
403: "拒绝访问",
|
|
11
|
+
404: "请求资源不存在",
|
|
12
|
+
500: "服务器内部错误",
|
|
13
|
+
502: "网关错误",
|
|
14
|
+
503: "服务不可用",
|
|
15
|
+
504: "网关超时"
|
|
16
|
+
};
|
|
17
|
+
const DEFAULT_HTTP_STATUS_MESSAGE_MAP = {
|
|
18
|
+
400: "请求参数错误",
|
|
19
|
+
401: "未授权,请重新登录",
|
|
20
|
+
403: "拒绝访问",
|
|
21
|
+
404: "请求资源不存在",
|
|
22
|
+
405: "请求方法不允许",
|
|
23
|
+
408: "请求超时",
|
|
24
|
+
500: "服务器内部错误",
|
|
25
|
+
501: "服务未实现",
|
|
26
|
+
502: "网关错误",
|
|
27
|
+
503: "服务不可用",
|
|
28
|
+
504: "网关超时"
|
|
29
|
+
};
|
|
30
|
+
const DEFAULT_SUCCESS_CODE = [200, 0];
|
|
31
|
+
const DEFAULT_TIMEOUT = 1e4;
|
|
32
|
+
class ConfigManager {
|
|
33
|
+
constructor() {
|
|
34
|
+
__publicField(this, "config", {
|
|
35
|
+
baseResponseType: void 0,
|
|
36
|
+
successCode: DEFAULT_SUCCESS_CODE,
|
|
37
|
+
codeMessageMap: { ...DEFAULT_CODE_MESSAGE_MAP },
|
|
38
|
+
httpStatusMessageMap: { ...DEFAULT_HTTP_STATUS_MESSAGE_MAP },
|
|
39
|
+
timeout: DEFAULT_TIMEOUT,
|
|
40
|
+
interceptors: {},
|
|
41
|
+
onError: void 0
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* 获取当前配置
|
|
46
|
+
*/
|
|
47
|
+
getConfig() {
|
|
48
|
+
return { ...this.config };
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* 设置全局配置
|
|
52
|
+
*/
|
|
53
|
+
setConfig(config) {
|
|
54
|
+
this.config = {
|
|
55
|
+
...this.config,
|
|
56
|
+
...config,
|
|
57
|
+
// 深度合并映射表
|
|
58
|
+
codeMessageMap: {
|
|
59
|
+
...this.config.codeMessageMap,
|
|
60
|
+
...config.codeMessageMap
|
|
61
|
+
},
|
|
62
|
+
httpStatusMessageMap: {
|
|
63
|
+
...this.config.httpStatusMessageMap,
|
|
64
|
+
...config.httpStatusMessageMap
|
|
65
|
+
},
|
|
66
|
+
// 合并拦截器配置
|
|
67
|
+
interceptors: {
|
|
68
|
+
...this.config.interceptors,
|
|
69
|
+
...config.interceptors
|
|
70
|
+
}
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* 获取成功状态码
|
|
75
|
+
*/
|
|
76
|
+
getSuccessCodes() {
|
|
77
|
+
const codes = this.config.successCode ?? DEFAULT_SUCCESS_CODE;
|
|
78
|
+
return Array.isArray(codes) ? codes : [codes];
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* 检查是否为成功状态码
|
|
82
|
+
*/
|
|
83
|
+
isSuccessCode(code) {
|
|
84
|
+
return this.getSuccessCodes().includes(code);
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* 根据 Code 获取提示消息
|
|
88
|
+
*/
|
|
89
|
+
getMessageByCode(code) {
|
|
90
|
+
var _a;
|
|
91
|
+
return (_a = this.config.codeMessageMap) == null ? void 0 : _a[code];
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* 根据 HTTP 状态码获取提示消息
|
|
95
|
+
*/
|
|
96
|
+
getMessageByHttpStatus(status) {
|
|
97
|
+
var _a;
|
|
98
|
+
return (_a = this.config.httpStatusMessageMap) == null ? void 0 : _a[status];
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* 获取超时时间
|
|
102
|
+
*/
|
|
103
|
+
getTimeout() {
|
|
104
|
+
return this.config.timeout ?? DEFAULT_TIMEOUT;
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* 获取拦截器配置
|
|
108
|
+
*/
|
|
109
|
+
getInterceptors() {
|
|
110
|
+
return this.config.interceptors ?? {};
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* 获取错误处理钩子
|
|
114
|
+
*/
|
|
115
|
+
getErrorHandler() {
|
|
116
|
+
return this.config.onError ?? void 0;
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* 重置为默认配置
|
|
120
|
+
*/
|
|
121
|
+
reset() {
|
|
122
|
+
this.config = {
|
|
123
|
+
baseResponseType: void 0,
|
|
124
|
+
successCode: DEFAULT_SUCCESS_CODE,
|
|
125
|
+
codeMessageMap: { ...DEFAULT_CODE_MESSAGE_MAP },
|
|
126
|
+
httpStatusMessageMap: { ...DEFAULT_HTTP_STATUS_MESSAGE_MAP },
|
|
127
|
+
timeout: DEFAULT_TIMEOUT,
|
|
128
|
+
interceptors: {},
|
|
129
|
+
onError: void 0
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
const configManager = new ConfigManager();
|
|
134
|
+
class RequestError extends Error {
|
|
135
|
+
constructor(options) {
|
|
136
|
+
super(options.message);
|
|
137
|
+
/** 错误码(业务码或 HTTP 状态码) */
|
|
138
|
+
__publicField(this, "code");
|
|
139
|
+
/** 原始错误对象 */
|
|
140
|
+
__publicField(this, "originalError");
|
|
141
|
+
/** 是否为业务错误 */
|
|
142
|
+
__publicField(this, "isBusinessError");
|
|
143
|
+
/** 是否为 HTTP 错误 */
|
|
144
|
+
__publicField(this, "isHttpError");
|
|
145
|
+
/** 请求配置 */
|
|
146
|
+
__publicField(this, "config");
|
|
147
|
+
this.name = "RequestError";
|
|
148
|
+
this.code = options.code;
|
|
149
|
+
this.originalError = options.originalError;
|
|
150
|
+
this.isBusinessError = options.isBusinessError ?? false;
|
|
151
|
+
this.isHttpError = options.isHttpError ?? false;
|
|
152
|
+
this.config = options.config;
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
function isAxiosError(error) {
|
|
156
|
+
return typeof error === "object" && error !== null && "isAxiosError" in error && error.isAxiosError === true;
|
|
157
|
+
}
|
|
158
|
+
function isBusinessResponse(response) {
|
|
159
|
+
return typeof response === "object" && response !== null && "code" in response && typeof response.code === "number";
|
|
160
|
+
}
|
|
161
|
+
function handleHttpError(error) {
|
|
162
|
+
var _a;
|
|
163
|
+
const status = ((_a = error.response) == null ? void 0 : _a.status) ?? 0;
|
|
164
|
+
const defaultMessage = "网络请求错误";
|
|
165
|
+
const message = configManager.getMessageByHttpStatus(status) ?? defaultMessage;
|
|
166
|
+
return new RequestError({
|
|
167
|
+
message,
|
|
168
|
+
code: status,
|
|
169
|
+
originalError: error,
|
|
170
|
+
isHttpError: true,
|
|
171
|
+
config: error.config
|
|
172
|
+
});
|
|
173
|
+
}
|
|
174
|
+
function handleRequestError(error) {
|
|
175
|
+
let message = "请求失败";
|
|
176
|
+
let code = -1;
|
|
177
|
+
if (error.code === "ECONNABORTED") {
|
|
178
|
+
message = "请求超时,请稍后重试";
|
|
179
|
+
code = 408;
|
|
180
|
+
} else if (error.code === "ERR_NETWORK") {
|
|
181
|
+
message = "网络连接失败,请检查网络";
|
|
182
|
+
code = "NETWORK_ERROR";
|
|
183
|
+
} else if (error.code === "ERR_CANCELED") {
|
|
184
|
+
message = "请求已取消";
|
|
185
|
+
code = "CANCELED";
|
|
186
|
+
}
|
|
187
|
+
return new RequestError({
|
|
188
|
+
message,
|
|
189
|
+
code,
|
|
190
|
+
originalError: error,
|
|
191
|
+
config: error.config
|
|
192
|
+
});
|
|
193
|
+
}
|
|
194
|
+
function handleError(error) {
|
|
195
|
+
let requestError;
|
|
196
|
+
if (isAxiosError(error)) {
|
|
197
|
+
if (error.response) {
|
|
198
|
+
requestError = handleHttpError(error);
|
|
199
|
+
} else {
|
|
200
|
+
requestError = handleRequestError(error);
|
|
201
|
+
}
|
|
202
|
+
} else if (error instanceof RequestError) {
|
|
203
|
+
requestError = error;
|
|
204
|
+
} else if (error instanceof Error) {
|
|
205
|
+
requestError = new RequestError({
|
|
206
|
+
message: error.message,
|
|
207
|
+
code: "UNKNOWN_ERROR",
|
|
208
|
+
originalError: error
|
|
209
|
+
});
|
|
210
|
+
} else {
|
|
211
|
+
requestError = new RequestError({
|
|
212
|
+
message: "未知错误",
|
|
213
|
+
code: "UNKNOWN_ERROR",
|
|
214
|
+
originalError: error
|
|
215
|
+
});
|
|
216
|
+
}
|
|
217
|
+
const errorHandler = configManager.getErrorHandler();
|
|
218
|
+
if (errorHandler) {
|
|
219
|
+
try {
|
|
220
|
+
errorHandler(requestError);
|
|
221
|
+
} catch (e) {
|
|
222
|
+
console.error("[Request] 错误处理钩子执行失败:", e);
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
return requestError;
|
|
226
|
+
}
|
|
227
|
+
function isSuccessResponse(response) {
|
|
228
|
+
const data = response.data;
|
|
229
|
+
if (!isBusinessResponse(data)) {
|
|
230
|
+
return true;
|
|
231
|
+
}
|
|
232
|
+
return configManager.isSuccessCode(data.code);
|
|
233
|
+
}
|
|
234
|
+
const __vite_import_meta_env__ = {};
|
|
235
|
+
function getBaseURL() {
|
|
236
|
+
const env = __vite_import_meta_env__;
|
|
237
|
+
const prefix = env == null ? void 0 : env.VITE_BASE_API_PREFIX;
|
|
238
|
+
if (prefix === void 0) {
|
|
239
|
+
console.warn("[Request] VITE_BASE_API_PREFIX 未定义,使用空字符串作为基础路径");
|
|
240
|
+
return "";
|
|
241
|
+
}
|
|
242
|
+
return prefix;
|
|
243
|
+
}
|
|
244
|
+
function objectToQueryString(obj) {
|
|
245
|
+
const params = new URLSearchParams();
|
|
246
|
+
Object.entries(obj).forEach(([key, value]) => {
|
|
247
|
+
if (value === void 0 || value === null) {
|
|
248
|
+
return;
|
|
249
|
+
}
|
|
250
|
+
if (Array.isArray(value)) {
|
|
251
|
+
value.forEach((item) => params.append(key, String(item)));
|
|
252
|
+
} else {
|
|
253
|
+
params.append(key, String(value));
|
|
254
|
+
}
|
|
255
|
+
});
|
|
256
|
+
return params.toString();
|
|
257
|
+
}
|
|
258
|
+
function buildURL(url, params) {
|
|
259
|
+
if (!params || Object.keys(params).length === 0) {
|
|
260
|
+
return url;
|
|
261
|
+
}
|
|
262
|
+
const queryString = objectToQueryString(params);
|
|
263
|
+
const separator = url.includes("?") ? "&" : "?";
|
|
264
|
+
return `${url}${separator}${queryString}`;
|
|
265
|
+
}
|
|
266
|
+
class RequestClass {
|
|
267
|
+
constructor() {
|
|
268
|
+
__publicField(this, "instance");
|
|
269
|
+
this.instance = axios.create({
|
|
270
|
+
baseURL: getBaseURL(),
|
|
271
|
+
timeout: configManager.getTimeout(),
|
|
272
|
+
headers: {
|
|
273
|
+
"Content-Type": "application/json"
|
|
274
|
+
}
|
|
275
|
+
});
|
|
276
|
+
this.setupInterceptors();
|
|
277
|
+
}
|
|
278
|
+
/**
|
|
279
|
+
* 配置对象
|
|
280
|
+
* 用于全局配置访问
|
|
281
|
+
*/
|
|
282
|
+
get config() {
|
|
283
|
+
return {
|
|
284
|
+
set: (config) => configManager.setConfig(config),
|
|
285
|
+
get: () => configManager.getConfig(),
|
|
286
|
+
reset: () => configManager.reset()
|
|
287
|
+
};
|
|
288
|
+
}
|
|
289
|
+
/**
|
|
290
|
+
* 设置拦截器
|
|
291
|
+
*/
|
|
292
|
+
setupInterceptors() {
|
|
293
|
+
const interceptors = configManager.getInterceptors();
|
|
294
|
+
this.instance.interceptors.request.use(
|
|
295
|
+
(config) => {
|
|
296
|
+
if (interceptors.request) {
|
|
297
|
+
return interceptors.request(config);
|
|
298
|
+
}
|
|
299
|
+
return config;
|
|
300
|
+
},
|
|
301
|
+
(error) => {
|
|
302
|
+
if (interceptors.requestError) {
|
|
303
|
+
return Promise.reject(interceptors.requestError(error));
|
|
304
|
+
}
|
|
305
|
+
return Promise.reject(handleError(error));
|
|
306
|
+
}
|
|
307
|
+
);
|
|
308
|
+
this.instance.interceptors.response.use(
|
|
309
|
+
(response) => {
|
|
310
|
+
if (!isSuccessResponse(response)) {
|
|
311
|
+
return Promise.reject(handleError(response));
|
|
312
|
+
}
|
|
313
|
+
if (interceptors.response) {
|
|
314
|
+
return interceptors.response(response);
|
|
315
|
+
}
|
|
316
|
+
return response;
|
|
317
|
+
},
|
|
318
|
+
(error) => {
|
|
319
|
+
if (interceptors.responseError) {
|
|
320
|
+
return Promise.reject(interceptors.responseError(error));
|
|
321
|
+
}
|
|
322
|
+
return Promise.reject(handleError(error));
|
|
323
|
+
}
|
|
324
|
+
);
|
|
325
|
+
}
|
|
326
|
+
/**
|
|
327
|
+
* 创建取消令牌
|
|
328
|
+
*/
|
|
329
|
+
createCancelToken() {
|
|
330
|
+
const controller = new AbortController();
|
|
331
|
+
return {
|
|
332
|
+
token: controller.signal,
|
|
333
|
+
cancel: () => controller.abort()
|
|
334
|
+
};
|
|
335
|
+
}
|
|
336
|
+
/**
|
|
337
|
+
* GET 请求
|
|
338
|
+
* @template P - 请求参数类型
|
|
339
|
+
* @template R - 响应 data 字段类型
|
|
340
|
+
*/
|
|
341
|
+
async get(url, params, config) {
|
|
342
|
+
const fullURL = buildURL(url, params);
|
|
343
|
+
const response = await this.instance.get(fullURL, config);
|
|
344
|
+
return response.data;
|
|
345
|
+
}
|
|
346
|
+
/**
|
|
347
|
+
* DELETE 请求
|
|
348
|
+
* @template P - 请求参数类型
|
|
349
|
+
* @template R - 响应 data 字段类型
|
|
350
|
+
*/
|
|
351
|
+
async delete(url, params, config) {
|
|
352
|
+
const fullURL = buildURL(url, params);
|
|
353
|
+
const response = await this.instance.delete(fullURL, config);
|
|
354
|
+
return response.data;
|
|
355
|
+
}
|
|
356
|
+
/**
|
|
357
|
+
* POST 请求
|
|
358
|
+
* @template P - 请求参数类型
|
|
359
|
+
* @template R - 响应 data 字段类型
|
|
360
|
+
*/
|
|
361
|
+
async post(url, data, config) {
|
|
362
|
+
const response = await this.instance.post(url, data, config);
|
|
363
|
+
return response.data;
|
|
364
|
+
}
|
|
365
|
+
/**
|
|
366
|
+
* PUT 请求
|
|
367
|
+
* @template P - 请求参数类型
|
|
368
|
+
* @template R - 响应 data 字段类型
|
|
369
|
+
*/
|
|
370
|
+
async put(url, data, config) {
|
|
371
|
+
const response = await this.instance.put(url, data, config);
|
|
372
|
+
return response.data;
|
|
373
|
+
}
|
|
374
|
+
/**
|
|
375
|
+
* PATCH 请求
|
|
376
|
+
* @template P - 请求参数类型
|
|
377
|
+
* @template R - 响应 data 字段类型
|
|
378
|
+
*/
|
|
379
|
+
async patch(url, data, config) {
|
|
380
|
+
const response = await this.instance.patch(url, data, config);
|
|
381
|
+
return response.data;
|
|
382
|
+
}
|
|
383
|
+
/**
|
|
384
|
+
* POST 表单请求(multipart/form-data)
|
|
385
|
+
* @template P - 请求参数类型
|
|
386
|
+
* @template R - 响应 data 字段类型
|
|
387
|
+
*/
|
|
388
|
+
async postForm(url, data, config) {
|
|
389
|
+
const formData = new FormData();
|
|
390
|
+
if (data) {
|
|
391
|
+
Object.entries(data).forEach(([key, value]) => {
|
|
392
|
+
if (value !== void 0 && value !== null) {
|
|
393
|
+
if (value instanceof File || value instanceof Blob) {
|
|
394
|
+
formData.append(key, value);
|
|
395
|
+
} else {
|
|
396
|
+
formData.append(key, String(value));
|
|
397
|
+
}
|
|
398
|
+
}
|
|
399
|
+
});
|
|
400
|
+
}
|
|
401
|
+
const response = await this.instance.post(url, formData, {
|
|
402
|
+
...config,
|
|
403
|
+
headers: {
|
|
404
|
+
...config == null ? void 0 : config.headers,
|
|
405
|
+
"Content-Type": "multipart/form-data"
|
|
406
|
+
}
|
|
407
|
+
});
|
|
408
|
+
return response.data;
|
|
409
|
+
}
|
|
410
|
+
/**
|
|
411
|
+
* 通用请求方法
|
|
412
|
+
* @template P - 请求参数类型
|
|
413
|
+
* @template R - 响应 data 字段类型
|
|
414
|
+
*/
|
|
415
|
+
async request(method, url, paramsOrData, config) {
|
|
416
|
+
switch (method) {
|
|
417
|
+
case "get":
|
|
418
|
+
return this.get(url, paramsOrData, config);
|
|
419
|
+
case "delete":
|
|
420
|
+
return this.delete(url, paramsOrData, config);
|
|
421
|
+
case "post":
|
|
422
|
+
return this.post(url, paramsOrData, config);
|
|
423
|
+
case "put":
|
|
424
|
+
return this.put(url, paramsOrData, config);
|
|
425
|
+
case "patch":
|
|
426
|
+
return this.patch(url, paramsOrData, config);
|
|
427
|
+
default:
|
|
428
|
+
throw new Error(`[Request] 不支持的请求方法: ${method}`);
|
|
429
|
+
}
|
|
430
|
+
}
|
|
431
|
+
}
|
|
432
|
+
const Request = new RequestClass();
|
|
433
|
+
export {
|
|
434
|
+
DEFAULT_CODE_MESSAGE_MAP,
|
|
435
|
+
DEFAULT_HTTP_STATUS_MESSAGE_MAP,
|
|
436
|
+
DEFAULT_SUCCESS_CODE,
|
|
437
|
+
DEFAULT_TIMEOUT,
|
|
438
|
+
Request,
|
|
439
|
+
RequestError,
|
|
440
|
+
configManager,
|
|
441
|
+
handleError,
|
|
442
|
+
isSuccessResponse
|
|
443
|
+
};
|
|
444
|
+
//# sourceMappingURL=index.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.mjs","sources":["../src/config.ts","../src/types.ts","../src/error-handler.ts","../src/request.ts"],"sourcesContent":["import type { GlobalConfig, CodeMessageMap, HttpStatusMessageMap, InterceptorConfig } from './types.js';\n\n/**\n * 默认 Code 提示映射表\n */\nexport const DEFAULT_CODE_MESSAGE_MAP: CodeMessageMap = {\n 200: '操作成功',\n 201: '创建成功',\n 400: '请求参数错误',\n 401: '未授权,请重新登录',\n 403: '拒绝访问',\n 404: '请求资源不存在',\n 500: '服务器内部错误',\n 502: '网关错误',\n 503: '服务不可用',\n 504: '网关超时',\n};\n\n/**\n * 默认 HTTP 状态码提示映射表\n */\nexport const DEFAULT_HTTP_STATUS_MESSAGE_MAP: HttpStatusMessageMap = {\n 400: '请求参数错误',\n 401: '未授权,请重新登录',\n 403: '拒绝访问',\n 404: '请求资源不存在',\n 405: '请求方法不允许',\n 408: '请求超时',\n 500: '服务器内部错误',\n 501: '服务未实现',\n 502: '网关错误',\n 503: '服务不可用',\n 504: '网关超时',\n};\n\n/**\n * 默认成功状态码\n */\nexport const DEFAULT_SUCCESS_CODE: number[] = [200, 0];\n\n/**\n * 默认超时时间(10秒)\n */\nexport const DEFAULT_TIMEOUT = 10000;\n\n/**\n * 配置管理类\n */\nclass ConfigManager {\n private config: GlobalConfig = {\n baseResponseType: undefined,\n successCode: DEFAULT_SUCCESS_CODE,\n codeMessageMap: { ...DEFAULT_CODE_MESSAGE_MAP },\n httpStatusMessageMap: { ...DEFAULT_HTTP_STATUS_MESSAGE_MAP },\n timeout: DEFAULT_TIMEOUT,\n interceptors: {},\n onError: undefined,\n };\n\n /**\n * 获取当前配置\n */\n getConfig(): GlobalConfig {\n return { ...this.config };\n }\n\n /**\n * 设置全局配置\n */\n setConfig(config: GlobalConfig): void {\n this.config = {\n ...this.config,\n ...config,\n // 深度合并映射表\n codeMessageMap: {\n ...this.config.codeMessageMap,\n ...config.codeMessageMap,\n },\n httpStatusMessageMap: {\n ...this.config.httpStatusMessageMap,\n ...config.httpStatusMessageMap,\n },\n // 合并拦截器配置\n interceptors: {\n ...this.config.interceptors,\n ...config.interceptors,\n },\n };\n }\n\n /**\n * 获取成功状态码\n */\n getSuccessCodes(): number[] {\n const codes = this.config.successCode ?? DEFAULT_SUCCESS_CODE;\n return Array.isArray(codes) ? codes : [codes];\n }\n\n /**\n * 检查是否为成功状态码\n */\n isSuccessCode(code: number): boolean {\n return this.getSuccessCodes().includes(code);\n }\n\n /**\n * 根据 Code 获取提示消息\n */\n getMessageByCode(code: number | string): string | undefined {\n return this.config.codeMessageMap?.[code];\n }\n\n /**\n * 根据 HTTP 状态码获取提示消息\n */\n getMessageByHttpStatus(status: number): string | undefined {\n return this.config.httpStatusMessageMap?.[status];\n }\n\n /**\n * 获取超时时间\n */\n getTimeout(): number {\n return this.config.timeout ?? DEFAULT_TIMEOUT;\n }\n\n /**\n * 获取拦截器配置\n */\n getInterceptors(): InterceptorConfig {\n return this.config.interceptors ?? {};\n }\n\n /**\n * 获取错误处理钩子\n */\n getErrorHandler(): ((error: unknown) => void) | undefined {\n return this.config.onError ?? undefined;\n }\n\n /**\n * 重置为默认配置\n */\n reset(): void {\n this.config = {\n baseResponseType: undefined,\n successCode: DEFAULT_SUCCESS_CODE,\n codeMessageMap: { ...DEFAULT_CODE_MESSAGE_MAP },\n httpStatusMessageMap: { ...DEFAULT_HTTP_STATUS_MESSAGE_MAP },\n timeout: DEFAULT_TIMEOUT,\n interceptors: {},\n onError: undefined,\n };\n }\n}\n\n/**\n * 全局配置管理器实例\n */\nexport const configManager = new ConfigManager();\n","import type { AxiosRequestConfig, AxiosResponse, InternalAxiosRequestConfig, Canceler } from 'axios';\n\n/**\n * 默认响应数据格式\n * @template T - data 字段的数据类型\n */\nexport interface BaseResponse<T = unknown> {\n /** 业务状态码 */\n code: number;\n /** 响应数据 */\n data: T;\n /** 提示消息 */\n msg: string;\n /** 是否成功 */\n success: boolean;\n}\n\n/**\n * 自定义响应数据格式接口\n * 用户可通过继承此接口实现自定义响应格式\n */\nexport interface CustomResponse<T = unknown> {\n [key: string]: unknown;\n data?: T;\n}\n\n/**\n * 请求配置选项\n */\nexport interface RequestConfig extends AxiosRequestConfig {\n /** 是否显示错误提示 */\n showError?: boolean;\n /** 自定义错误提示消息 */\n errorMessage?: string;\n /** 是否携带 token */\n withToken?: boolean;\n}\n\n/**\n * 请求拦截器函数类型\n */\nexport type RequestInterceptor = (\n config: InternalAxiosRequestConfig\n) => InternalAxiosRequestConfig | Promise<InternalAxiosRequestConfig>;\n\n/**\n * 响应拦截器函数类型\n */\nexport type ResponseInterceptor<T = unknown> = (\n response: AxiosResponse<T>\n) => AxiosResponse<T> | Promise<AxiosResponse<T>>;\n\n/**\n * 错误拦截器函数类型\n */\nexport type ErrorInterceptor = (error: unknown) => unknown;\n\n/**\n * 拦截器配置\n */\nexport interface InterceptorConfig {\n /** 请求拦截器 */\n request?: RequestInterceptor;\n /** 请求错误拦截器 */\n requestError?: ErrorInterceptor;\n /** 响应拦截器 */\n response?: ResponseInterceptor;\n /** 响应错误拦截器 */\n responseError?: ErrorInterceptor;\n}\n\n/**\n * Code 提示映射表\n */\nexport type CodeMessageMap = Record<number | string, string>;\n\n/**\n * HTTP 状态码提示映射表\n */\nexport type HttpStatusMessageMap = Record<number, string>;\n\n/**\n * 全局配置选项\n */\nexport interface GlobalConfig<T = unknown> {\n /** 基础响应数据类型(用于类型推断) */\n baseResponseType?: T;\n /** 成功状态码 */\n successCode?: number | number[];\n /** Code 提示映射表 */\n codeMessageMap?: CodeMessageMap;\n /** HTTP 状态码提示映射表 */\n httpStatusMessageMap?: HttpStatusMessageMap;\n /** 默认超时时间(毫秒) */\n timeout?: number;\n /** 请求拦截器配置 */\n interceptors?: InterceptorConfig;\n /** 错误处理钩子(预留 event-bus 接入点) */\n onError?: (error: unknown) => void;\n}\n\n/**\n * 请求错误类\n */\nexport class RequestError extends Error {\n /** 错误码(业务码或 HTTP 状态码) */\n code: number | string;\n /** 原始错误对象 */\n originalError: unknown;\n /** 是否为业务错误 */\n isBusinessError: boolean;\n /** 是否为 HTTP 错误 */\n isHttpError: boolean;\n /** 请求配置 */\n config?: AxiosRequestConfig;\n\n constructor(options: {\n message: string;\n code: number | string;\n originalError: unknown;\n isBusinessError?: boolean;\n isHttpError?: boolean;\n config?: AxiosRequestConfig;\n }) {\n super(options.message);\n this.name = 'RequestError';\n this.code = options.code;\n this.originalError = options.originalError;\n this.isBusinessError = options.isBusinessError ?? false;\n this.isHttpError = options.isHttpError ?? false;\n this.config = options.config;\n }\n}\n\n/**\n * 取消请求控制器\n */\nexport interface CancelTokenController {\n /** 取消函数 */\n cancel: Canceler;\n /** 取消令牌 */\n token: AbortSignal;\n}\n\n/**\n * 请求方法类型定义\n */\nexport type RequestMethod = 'get' | 'post' | 'put' | 'delete' | 'patch';\n\n/**\n * 请求参数类型(对象格式)\n * 使用宽泛的类型约束以支持任意对象\n */\nexport type RequestParams = object;\n","import type { AxiosError, AxiosResponse } from 'axios';\nimport { RequestError } from './types.js';\nimport { configManager } from './config.js';\n\n/**\n * 判断是否为 Axios 错误\n */\nfunction isAxiosError(error: unknown): error is AxiosError {\n return (\n typeof error === 'object' &&\n error !== null &&\n 'isAxiosError' in error &&\n (error as AxiosError).isAxiosError === true\n );\n}\n\n/**\n * 判断是否为业务响应错误\n */\nfunction isBusinessResponse(response: unknown): response is { code: number; msg?: string; message?: string } {\n return (\n typeof response === 'object' &&\n response !== null &&\n 'code' in response &&\n typeof (response as { code: unknown }).code === 'number'\n );\n}\n\n/**\n * 处理 HTTP 错误\n */\nfunction handleHttpError(error: AxiosError): RequestError {\n const status = error.response?.status ?? 0;\n const defaultMessage = '网络请求错误';\n const message = configManager.getMessageByHttpStatus(status) ?? defaultMessage;\n\n return new RequestError({\n message,\n code: status,\n originalError: error,\n isHttpError: true,\n config: error.config,\n });\n}\n\n/**\n * 处理业务错误\n */\nfunction handleBusinessError(response: AxiosResponse): RequestError {\n const data = response.data;\n const code = isBusinessResponse(data) ? data.code : -1;\n const msg = isBusinessResponse(data) ? (data.msg ?? data.message ?? '业务处理失败') : '业务处理失败';\n const message = configManager.getMessageByCode(code) ?? msg;\n\n return new RequestError({\n message,\n code,\n originalError: data,\n isBusinessError: true,\n });\n}\n\n// 导出业务错误处理函数供外部使用\nexport { handleBusinessError };\n\n/**\n * 处理请求错误(网络错误、超时等)\n */\nfunction handleRequestError(error: AxiosError): RequestError {\n let message = '请求失败';\n let code: number | string = -1;\n\n if (error.code === 'ECONNABORTED') {\n message = '请求超时,请稍后重试';\n code = 408;\n } else if (error.code === 'ERR_NETWORK') {\n message = '网络连接失败,请检查网络';\n code = 'NETWORK_ERROR';\n } else if (error.code === 'ERR_CANCELED') {\n message = '请求已取消';\n code = 'CANCELED';\n }\n\n return new RequestError({\n message,\n code,\n originalError: error,\n config: error.config,\n });\n}\n\n/**\n * 统一错误处理入口\n */\nexport function handleError(error: unknown): RequestError {\n let requestError: RequestError;\n\n if (isAxiosError(error)) {\n // HTTP 错误(有响应但状态码非 2xx)\n if (error.response) {\n requestError = handleHttpError(error);\n } else {\n // 请求错误(无响应,网络问题、超时等)\n requestError = handleRequestError(error);\n }\n } else if (error instanceof RequestError) {\n requestError = error;\n } else if (error instanceof Error) {\n requestError = new RequestError({\n message: error.message,\n code: 'UNKNOWN_ERROR',\n originalError: error,\n });\n } else {\n requestError = new RequestError({\n message: '未知错误',\n code: 'UNKNOWN_ERROR',\n originalError: error,\n });\n }\n\n // 触发错误处理钩子(预留 event-bus 接入点)\n const errorHandler = configManager.getErrorHandler();\n if (errorHandler) {\n try {\n errorHandler(requestError);\n } catch (e) {\n console.error('[Request] 错误处理钩子执行失败:', e);\n }\n }\n\n return requestError;\n}\n\n/**\n * 检查响应是否为成功响应\n */\nexport function isSuccessResponse(response: AxiosResponse): boolean {\n const data = response.data;\n\n if (!isBusinessResponse(data)) {\n // 如果不是标准业务响应格式,默认认为成功(HTTP 2xx)\n return true;\n }\n\n return configManager.isSuccessCode(data.code);\n}\n\nexport { isAxiosError, isBusinessResponse };\n","import axios, { type AxiosInstance, type AxiosResponse, type InternalAxiosRequestConfig } from 'axios';\nimport type { BaseResponse, RequestConfig, RequestParams, GlobalConfig } from './types.js';\nimport { configManager } from './config.js';\nimport { handleError, isSuccessResponse } from './error-handler.js';\n\n/**\n * 获取基础 URL\n * 优先从环境变量读取,未定义时返回空字符串\n */\nfunction getBaseURL(): string {\n // 使用类型断言访问 Vite 环境变量\n const env = (import.meta as unknown as { env: Record<string, string | undefined> }).env;\n const prefix = env?.VITE_BASE_API_PREFIX;\n\n if (prefix === undefined) {\n console.warn('[Request] VITE_BASE_API_PREFIX 未定义,使用空字符串作为基础路径');\n return '';\n }\n\n return prefix;\n}\n\n/**\n * 将对象转换为 URL 查询字符串\n */\nfunction objectToQueryString(obj: RequestParams): string {\n const params = new URLSearchParams();\n\n Object.entries(obj).forEach(([key, value]) => {\n if (value === undefined || value === null) {\n return;\n }\n\n if (Array.isArray(value)) {\n value.forEach((item) => params.append(key, String(item)));\n } else {\n params.append(key, String(value));\n }\n });\n\n return params.toString();\n}\n\n/**\n * 构建完整 URL(带查询参数)\n */\nfunction buildURL(url: string, params?: RequestParams): string {\n if (!params || Object.keys(params).length === 0) {\n return url;\n }\n\n const queryString = objectToQueryString(params);\n const separator = url.includes('?') ? '&' : '?';\n\n return `${url}${separator}${queryString}`;\n}\n\n/**\n * 请求类\n */\nclass RequestClass {\n private instance: AxiosInstance;\n\n constructor() {\n this.instance = axios.create({\n baseURL: getBaseURL(),\n timeout: configManager.getTimeout(),\n headers: {\n 'Content-Type': 'application/json',\n },\n });\n\n this.setupInterceptors();\n }\n\n /**\n * 配置对象\n * 用于全局配置访问\n */\n get config(): {\n set: (config: GlobalConfig) => void;\n get: () => ReturnType<typeof configManager.getConfig>;\n reset: () => void;\n } {\n return {\n set: (config: GlobalConfig) => configManager.setConfig(config),\n get: () => configManager.getConfig(),\n reset: () => configManager.reset(),\n };\n }\n\n /**\n * 设置拦截器\n */\n private setupInterceptors(): void {\n const interceptors = configManager.getInterceptors();\n\n // 请求拦截器\n this.instance.interceptors.request.use(\n (config: InternalAxiosRequestConfig) => {\n // 应用用户自定义请求拦截器\n if (interceptors.request) {\n return interceptors.request(config);\n }\n return config;\n },\n (error: unknown) => {\n if (interceptors.requestError) {\n return Promise.reject(interceptors.requestError(error));\n }\n return Promise.reject(handleError(error));\n }\n );\n\n // 响应拦截器\n this.instance.interceptors.response.use(\n (response: AxiosResponse) => {\n // 检查业务状态码\n if (!isSuccessResponse(response)) {\n return Promise.reject(handleError(response));\n }\n\n // 应用用户自定义响应拦截器\n if (interceptors.response) {\n return interceptors.response(response);\n }\n\n return response;\n },\n (error: unknown) => {\n if (interceptors.responseError) {\n return Promise.reject(interceptors.responseError(error));\n }\n return Promise.reject(handleError(error));\n }\n );\n }\n\n /**\n * 创建取消令牌\n */\n createCancelToken(): { token: AbortSignal; cancel: () => void } {\n const controller = new AbortController();\n return {\n token: controller.signal,\n cancel: () => controller.abort(),\n };\n }\n\n /**\n * GET 请求\n * @template P - 请求参数类型\n * @template R - 响应 data 字段类型\n */\n async get<P extends RequestParams = RequestParams, R = unknown>(\n url: string,\n params?: P,\n config?: RequestConfig\n ): Promise<BaseResponse<R>> {\n const fullURL = buildURL(url, params);\n\n const response = await this.instance.get<BaseResponse<R>>(fullURL, config);\n return response.data;\n }\n\n /**\n * DELETE 请求\n * @template P - 请求参数类型\n * @template R - 响应 data 字段类型\n */\n async delete<P extends RequestParams = RequestParams, R = unknown>(\n url: string,\n params?: P,\n config?: RequestConfig\n ): Promise<BaseResponse<R>> {\n const fullURL = buildURL(url, params);\n\n const response = await this.instance.delete<BaseResponse<R>>(fullURL, config);\n return response.data;\n }\n\n /**\n * POST 请求\n * @template P - 请求参数类型\n * @template R - 响应 data 字段类型\n */\n async post<P extends RequestParams = RequestParams, R = unknown>(\n url: string,\n data?: P,\n config?: RequestConfig\n ): Promise<BaseResponse<R>> {\n const response = await this.instance.post<BaseResponse<R>>(url, data, config);\n return response.data;\n }\n\n /**\n * PUT 请求\n * @template P - 请求参数类型\n * @template R - 响应 data 字段类型\n */\n async put<P extends RequestParams = RequestParams, R = unknown>(\n url: string,\n data?: P,\n config?: RequestConfig\n ): Promise<BaseResponse<R>> {\n const response = await this.instance.put<BaseResponse<R>>(url, data, config);\n return response.data;\n }\n\n /**\n * PATCH 请求\n * @template P - 请求参数类型\n * @template R - 响应 data 字段类型\n */\n async patch<P extends RequestParams = RequestParams, R = unknown>(\n url: string,\n data?: P,\n config?: RequestConfig\n ): Promise<BaseResponse<R>> {\n const response = await this.instance.patch<BaseResponse<R>>(url, data, config);\n return response.data;\n }\n\n /**\n * POST 表单请求(multipart/form-data)\n * @template P - 请求参数类型\n * @template R - 响应 data 字段类型\n */\n async postForm<P extends RequestParams = RequestParams, R = unknown>(\n url: string,\n data?: P,\n config?: RequestConfig\n ): Promise<BaseResponse<R>> {\n const formData = new FormData();\n\n if (data) {\n Object.entries(data).forEach(([key, value]) => {\n if (value !== undefined && value !== null) {\n if (value instanceof File || value instanceof Blob) {\n formData.append(key, value);\n } else {\n formData.append(key, String(value));\n }\n }\n });\n }\n\n const response = await this.instance.post<BaseResponse<R>>(url, formData, {\n ...config,\n headers: {\n ...config?.headers,\n 'Content-Type': 'multipart/form-data',\n },\n });\n\n return response.data;\n }\n\n /**\n * 通用请求方法\n * @template P - 请求参数类型\n * @template R - 响应 data 字段类型\n */\n async request<P extends RequestParams = RequestParams, R = unknown>(\n method: 'get' | 'post' | 'put' | 'delete' | 'patch',\n url: string,\n paramsOrData?: P,\n config?: RequestConfig\n ): Promise<BaseResponse<R>> {\n switch (method) {\n case 'get':\n return this.get<P, R>(url, paramsOrData, config);\n case 'delete':\n return this.delete<P, R>(url, paramsOrData, config);\n case 'post':\n return this.post<P, R>(url, paramsOrData, config);\n case 'put':\n return this.put<P, R>(url, paramsOrData, config);\n case 'patch':\n return this.patch<P, R>(url, paramsOrData, config);\n default:\n throw new Error(`[Request] 不支持的请求方法: ${method}`);\n }\n }\n}\n\n/**\n * Request 实例\n */\nexport const Request = new RequestClass();\n\n/**\n * 重新初始化 Request(配置变更后调用)\n * @internal\n */\nexport function reinitializeRequest(): void {\n // 通过创建新实例来应用新配置\n Object.setPrototypeOf(Request, new RequestClass());\n}\n"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@boo-dreamer/request",
|
|
3
|
+
"version": "0.0.3",
|
|
4
|
+
"description": "基于 axios 的请求工具封装",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "./dist/index.cjs",
|
|
7
|
+
"module": "./dist/index.mjs",
|
|
8
|
+
"types": "./dist/index.d.ts",
|
|
9
|
+
"exports": {
|
|
10
|
+
".": {
|
|
11
|
+
"import": "./dist/index.mjs",
|
|
12
|
+
"require": "./dist/index.cjs",
|
|
13
|
+
"types": "./dist/index.d.ts"
|
|
14
|
+
}
|
|
15
|
+
},
|
|
16
|
+
"files": [
|
|
17
|
+
"dist"
|
|
18
|
+
],
|
|
19
|
+
"sideEffects": false,
|
|
20
|
+
"keywords": [
|
|
21
|
+
"request",
|
|
22
|
+
"axios",
|
|
23
|
+
"http",
|
|
24
|
+
"typescript"
|
|
25
|
+
],
|
|
26
|
+
"author": "",
|
|
27
|
+
"license": "MIT",
|
|
28
|
+
"engines": {
|
|
29
|
+
"node": ">=18.0.0"
|
|
30
|
+
},
|
|
31
|
+
"publishConfig": {
|
|
32
|
+
"access": "public"
|
|
33
|
+
},
|
|
34
|
+
"dependencies": {
|
|
35
|
+
"axios": "^1.13.5"
|
|
36
|
+
},
|
|
37
|
+
"peerDependencies": {
|
|
38
|
+
"axios": "^1.6.0"
|
|
39
|
+
},
|
|
40
|
+
"scripts": {
|
|
41
|
+
"build": "vite build",
|
|
42
|
+
"dev": "vite build --watch",
|
|
43
|
+
"typecheck": "tsc --noEmit",
|
|
44
|
+
"clean": "rm -rf dist"
|
|
45
|
+
}
|
|
46
|
+
}
|