sino-bc-cli 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (60) hide show
  1. package/README.md +311 -0
  2. package/dist/SKILL.md +466 -0
  3. package/dist/commands/bc-mcp.command.d.ts +53 -0
  4. package/dist/commands/bc-mcp.command.js +208 -0
  5. package/dist/commands/bc-mcp.command.js.map +1 -0
  6. package/dist/commands/homepage.command.d.ts +19 -0
  7. package/dist/commands/homepage.command.js +96 -0
  8. package/dist/commands/homepage.command.js.map +1 -0
  9. package/dist/commands/index.d.ts +10 -0
  10. package/dist/commands/index.js +23 -0
  11. package/dist/commands/index.js.map +1 -0
  12. package/dist/commands/nexus-swagger.command.d.ts +19 -0
  13. package/dist/commands/nexus-swagger.command.js +95 -0
  14. package/dist/commands/nexus-swagger.command.js.map +1 -0
  15. package/dist/constants/api-doc.d.ts +6 -0
  16. package/dist/constants/api-doc.js +80 -0
  17. package/dist/constants/api-doc.js.map +1 -0
  18. package/dist/constants/gateway.d.ts +31 -0
  19. package/dist/constants/gateway.js +109 -0
  20. package/dist/constants/gateway.js.map +1 -0
  21. package/dist/constants/index.d.ts +38 -0
  22. package/dist/constants/index.js +52 -0
  23. package/dist/constants/index.js.map +1 -0
  24. package/dist/core/cli-app.d.ts +51 -0
  25. package/dist/core/cli-app.js +281 -0
  26. package/dist/core/cli-app.js.map +1 -0
  27. package/dist/core/command-registry.d.ts +71 -0
  28. package/dist/core/command-registry.js +195 -0
  29. package/dist/core/command-registry.js.map +1 -0
  30. package/dist/core/index.d.ts +2 -0
  31. package/dist/core/index.js +9 -0
  32. package/dist/core/index.js.map +1 -0
  33. package/dist/index.d.ts +12 -0
  34. package/dist/index.js +34 -0
  35. package/dist/index.js.map +1 -0
  36. package/dist/types/index.d.ts +120 -0
  37. package/dist/types/index.js +46 -0
  38. package/dist/types/index.js.map +1 -0
  39. package/dist/utils/browser.d.ts +36 -0
  40. package/dist/utils/browser.js +143 -0
  41. package/dist/utils/browser.js.map +1 -0
  42. package/dist/utils/common.d.ts +97 -0
  43. package/dist/utils/common.js +198 -0
  44. package/dist/utils/common.js.map +1 -0
  45. package/dist/utils/crypto.d.ts +53 -0
  46. package/dist/utils/crypto.js +153 -0
  47. package/dist/utils/crypto.js.map +1 -0
  48. package/dist/utils/http.d.ts +58 -0
  49. package/dist/utils/http.js +187 -0
  50. package/dist/utils/http.js.map +1 -0
  51. package/dist/utils/index.d.ts +6 -0
  52. package/dist/utils/index.js +16 -0
  53. package/dist/utils/index.js.map +1 -0
  54. package/dist/utils/logger.d.ts +56 -0
  55. package/dist/utils/logger.js +161 -0
  56. package/dist/utils/logger.js.map +1 -0
  57. package/dist/utils/prompt.d.ts +18 -0
  58. package/dist/utils/prompt.js +77 -0
  59. package/dist/utils/prompt.js.map +1 -0
  60. package/package.json +63 -0
@@ -0,0 +1,97 @@
1
+ import dayjs from 'dayjs';
2
+ /**
3
+ * 通用工具类
4
+ * 封装常用的通用工具方法,使用 lodash 和 dayjs 提升开发效率
5
+ * 所有方法均为无副作用的纯函数,便于测试和复用
6
+ */
7
+ export declare class CommonUtils {
8
+ /**
9
+ * 格式化日期时间
10
+ * 封装 dayjs,提供统一的日期格式化入口
11
+ * @param date 日期(Date 对象、时间戳、日期字符串等)
12
+ * @param format 格式化模板,默认 'YYYY-MM-DD HH:mm:ss'
13
+ * @returns 格式化后的日期字符串
14
+ */
15
+ static formatDate(date?: dayjs.ConfigType, format?: string): string;
16
+ /**
17
+ * 计算两个日期之间的差值(天数)
18
+ * @param start 开始日期
19
+ * @param end 结束日期,默认为当前时间
20
+ * @returns 相差天数(取整)
21
+ */
22
+ static diffDays(start: dayjs.ConfigType, end?: dayjs.ConfigType): number;
23
+ /**
24
+ * 生成唯一 ID(基于时间戳 + 随机数)
25
+ * 使用 lodash 的 uniqueId 结合时间戳,避免 ID 碰撞
26
+ * @param prefix 可选的前缀
27
+ * @returns 唯一 ID 字符串
28
+ */
29
+ static generateUniqueId(prefix?: string): string;
30
+ /**
31
+ * 深拷贝对象
32
+ * 封装 lodash 的 cloneDeep,提供类型安全的深拷贝
33
+ * @param obj 待拷贝对象
34
+ * @returns 深拷贝后的对象
35
+ */
36
+ static deepClone<T>(obj: T): T;
37
+ /**
38
+ * 深度比较两个对象是否相等
39
+ * 封装 lodash 的 isEqual
40
+ * @param a 对象 A
41
+ * @param b 对象 B
42
+ * @returns 是否深度相等
43
+ */
44
+ static deepEqual(a: unknown, b: unknown): boolean;
45
+ /**
46
+ * 防抖函数包装
47
+ * 封装 lodash 的 debounce
48
+ * @param func 要防抖的函数
49
+ * @param wait 等待时间(毫秒),默认 300ms
50
+ * @returns 防抖后的函数
51
+ */
52
+ static debounce<T extends (...args: unknown[]) => unknown>(func: T, wait?: number): (...args: Parameters<T>) => void;
53
+ /**
54
+ * 节流函数包装
55
+ * 封装 lodash 的 throttle
56
+ * @param func 要节流的函数
57
+ * @param wait 节流间隔(毫秒),默认 300ms
58
+ * @returns 节流后的函数
59
+ */
60
+ static throttle<T extends (...args: unknown[]) => unknown>(func: T, wait?: number): (...args: Parameters<T>) => ReturnType<T> | undefined;
61
+ /**
62
+ * 从对象中提取指定的属性
63
+ * 封装 lodash 的 pick,提供类型安全的属性提取
64
+ * @param obj 源对象
65
+ * @param keys 要提取的属性名数组
66
+ * @returns 包含指定属性的新对象
67
+ */
68
+ static pick<T extends object, K extends keyof T>(obj: T, keys: K[]): Pick<T, K>;
69
+ /**
70
+ * 从对象中排除指定的属性
71
+ * 封装 lodash 的 omit,提供类型安全的属性排除
72
+ * @param obj 源对象
73
+ * @param keys 要排除的属性名数组
74
+ * @returns 排除指定属性后的新对象
75
+ */
76
+ static omit<T extends object, K extends keyof T>(obj: T, keys: K[]): Omit<T, K>;
77
+ /**
78
+ * 延迟执行(Promise 封装的 setTimeout)
79
+ * @param ms 延迟毫秒数
80
+ */
81
+ static sleep(ms: number): Promise<void>;
82
+ /**
83
+ * 安全解析 JSON 字符串
84
+ * 解析失败时返回默认值而不是抛出异常
85
+ * @param jsonString JSON 字符串
86
+ * @param defaultValue 解析失败时的默认值,默认 undefined
87
+ * @returns 解析后的对象或默认值
88
+ */
89
+ static safeJsonParse<T = unknown>(jsonString: string, defaultValue?: T): T | undefined;
90
+ /**
91
+ * 截断字符串并添加省略号
92
+ * @param str 源字符串
93
+ * @param maxLength 最大长度
94
+ * @param suffix 后缀,默认 '...'
95
+ */
96
+ static truncate(str: string, maxLength: number, suffix?: string): string;
97
+ }
@@ -0,0 +1,198 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.CommonUtils = void 0;
40
+ const _ = __importStar(require("lodash"));
41
+ const dayjs_1 = __importDefault(require("dayjs"));
42
+ const logger_1 = require("./logger");
43
+ /**
44
+ * 通用工具类
45
+ * 封装常用的通用工具方法,使用 lodash 和 dayjs 提升开发效率
46
+ * 所有方法均为无副作用的纯函数,便于测试和复用
47
+ */
48
+ class CommonUtils {
49
+ /**
50
+ * 格式化日期时间
51
+ * 封装 dayjs,提供统一的日期格式化入口
52
+ * @param date 日期(Date 对象、时间戳、日期字符串等)
53
+ * @param format 格式化模板,默认 'YYYY-MM-DD HH:mm:ss'
54
+ * @returns 格式化后的日期字符串
55
+ */
56
+ static formatDate(date, format = 'YYYY-MM-DD HH:mm:ss') {
57
+ if (_.isNil(date)) {
58
+ return (0, dayjs_1.default)().format(format);
59
+ }
60
+ const d = (0, dayjs_1.default)(date);
61
+ if (!d.isValid()) {
62
+ logger_1.logger.warn(`无效的日期值: ${String(date)}`);
63
+ return '';
64
+ }
65
+ return d.format(format);
66
+ }
67
+ /**
68
+ * 计算两个日期之间的差值(天数)
69
+ * @param start 开始日期
70
+ * @param end 结束日期,默认为当前时间
71
+ * @returns 相差天数(取整)
72
+ */
73
+ static diffDays(start, end = (0, dayjs_1.default)()) {
74
+ const startDate = (0, dayjs_1.default)(start);
75
+ const endDate = (0, dayjs_1.default)(end);
76
+ if (!startDate.isValid() || !endDate.isValid()) {
77
+ logger_1.logger.warn('计算日期差值时存在无效日期');
78
+ return 0;
79
+ }
80
+ return endDate.diff(startDate, 'day');
81
+ }
82
+ /**
83
+ * 生成唯一 ID(基于时间戳 + 随机数)
84
+ * 使用 lodash 的 uniqueId 结合时间戳,避免 ID 碰撞
85
+ * @param prefix 可选的前缀
86
+ * @returns 唯一 ID 字符串
87
+ */
88
+ static generateUniqueId(prefix = '') {
89
+ const timestamp = (0, dayjs_1.default)().valueOf().toString(36);
90
+ const random = Math.random().toString(36).substring(2, 8);
91
+ const uniquePart = _.uniqueId();
92
+ return _.isEmpty(prefix)
93
+ ? `${timestamp}-${random}-${uniquePart}`
94
+ : `${prefix}-${timestamp}-${random}-${uniquePart}`;
95
+ }
96
+ /**
97
+ * 深拷贝对象
98
+ * 封装 lodash 的 cloneDeep,提供类型安全的深拷贝
99
+ * @param obj 待拷贝对象
100
+ * @returns 深拷贝后的对象
101
+ */
102
+ static deepClone(obj) {
103
+ return _.cloneDeep(obj);
104
+ }
105
+ /**
106
+ * 深度比较两个对象是否相等
107
+ * 封装 lodash 的 isEqual
108
+ * @param a 对象 A
109
+ * @param b 对象 B
110
+ * @returns 是否深度相等
111
+ */
112
+ static deepEqual(a, b) {
113
+ return _.isEqual(a, b);
114
+ }
115
+ /**
116
+ * 防抖函数包装
117
+ * 封装 lodash 的 debounce
118
+ * @param func 要防抖的函数
119
+ * @param wait 等待时间(毫秒),默认 300ms
120
+ * @returns 防抖后的函数
121
+ */
122
+ static debounce(func, wait = 300) {
123
+ return _.debounce(func, wait);
124
+ }
125
+ /**
126
+ * 节流函数包装
127
+ * 封装 lodash 的 throttle
128
+ * @param func 要节流的函数
129
+ * @param wait 节流间隔(毫秒),默认 300ms
130
+ * @returns 节流后的函数
131
+ */
132
+ static throttle(func, wait = 300) {
133
+ return _.throttle(func, wait);
134
+ }
135
+ /**
136
+ * 从对象中提取指定的属性
137
+ * 封装 lodash 的 pick,提供类型安全的属性提取
138
+ * @param obj 源对象
139
+ * @param keys 要提取的属性名数组
140
+ * @returns 包含指定属性的新对象
141
+ */
142
+ static pick(obj, keys) {
143
+ return _.pick(obj, keys);
144
+ }
145
+ /**
146
+ * 从对象中排除指定的属性
147
+ * 封装 lodash 的 omit,提供类型安全的属性排除
148
+ * @param obj 源对象
149
+ * @param keys 要排除的属性名数组
150
+ * @returns 排除指定属性后的新对象
151
+ */
152
+ static omit(obj, keys) {
153
+ return _.omit(obj, keys);
154
+ }
155
+ /**
156
+ * 延迟执行(Promise 封装的 setTimeout)
157
+ * @param ms 延迟毫秒数
158
+ */
159
+ static sleep(ms) {
160
+ return new Promise((resolve) => setTimeout(resolve, ms));
161
+ }
162
+ /**
163
+ * 安全解析 JSON 字符串
164
+ * 解析失败时返回默认值而不是抛出异常
165
+ * @param jsonString JSON 字符串
166
+ * @param defaultValue 解析失败时的默认值,默认 undefined
167
+ * @returns 解析后的对象或默认值
168
+ */
169
+ static safeJsonParse(jsonString, defaultValue) {
170
+ if (_.isEmpty(jsonString) || !_.isString(jsonString)) {
171
+ return defaultValue;
172
+ }
173
+ try {
174
+ return JSON.parse(jsonString);
175
+ }
176
+ catch (error) {
177
+ logger_1.logger.warn('JSON 解析失败:', error instanceof Error ? error.message : String(error));
178
+ return defaultValue;
179
+ }
180
+ }
181
+ /**
182
+ * 截断字符串并添加省略号
183
+ * @param str 源字符串
184
+ * @param maxLength 最大长度
185
+ * @param suffix 后缀,默认 '...'
186
+ */
187
+ static truncate(str, maxLength, suffix = '...') {
188
+ if (!_.isString(str)) {
189
+ return '';
190
+ }
191
+ if (str.length <= maxLength) {
192
+ return str;
193
+ }
194
+ return str.substring(0, maxLength - suffix.length) + suffix;
195
+ }
196
+ }
197
+ exports.CommonUtils = CommonUtils;
198
+ //# sourceMappingURL=common.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"common.js","sourceRoot":"","sources":["../../src/utils/common.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,53 @@
1
+ /**
2
+ * 加密工具类
3
+ * 封装 CryptoJS 常用加密/解密方法,提供统一的加密服务
4
+ * 遵循高内聚原则,将所有加解密相关逻辑集中在此模块
5
+ */
6
+ export declare class CryptoUtils {
7
+ /**
8
+ * 计算字符串的 MD5 哈希值
9
+ * @param input 输入字符串
10
+ * @returns MD5 哈希值(32位小写)
11
+ */
12
+ static md5(input: string): string;
13
+ /**
14
+ * 计算字符串的 SHA-256 哈希值
15
+ * @param input 输入字符串
16
+ * @returns SHA-256 哈希值
17
+ */
18
+ static sha256(input: string): string;
19
+ /**
20
+ * 使用 AES 加密字符串
21
+ * @param plaintext 明文
22
+ * @param secretKey 密钥
23
+ * @returns 加密后的密文(Base64 编码)
24
+ */
25
+ static aesEncrypt(plaintext: string, secretKey: string): string;
26
+ /**
27
+ * 使用 AES 解密字符串
28
+ * @param ciphertext 密文
29
+ * @param secretKey 密钥
30
+ * @returns 解密后的明文,失败返回空字符串
31
+ */
32
+ static aesDecrypt(ciphertext: string, secretKey: string): string;
33
+ /**
34
+ * 使用 Base64 编码字符串
35
+ * @param input 输入字符串
36
+ * @returns Base64 编码结果
37
+ */
38
+ static base64Encode(input: string): string;
39
+ /**
40
+ * 使用 Base64 解码字符串
41
+ * @param input Base64 编码字符串
42
+ * @returns 解码后的字符串
43
+ */
44
+ static base64Decode(input: string): string;
45
+ /**
46
+ * 生成带时间戳的签名(用于接口请求等场景)
47
+ * 组合应用ID、时间戳、密钥进行签名,防止请求篡改
48
+ * @param appId 应用ID
49
+ * @param secretKey 密钥
50
+ * @returns 签名字符串
51
+ */
52
+ static generateSignature(appId: string, secretKey: string): string;
53
+ }
@@ -0,0 +1,153 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.CryptoUtils = void 0;
40
+ const _ = __importStar(require("lodash"));
41
+ const CryptoJS = __importStar(require("crypto-js"));
42
+ const dayjs_1 = __importDefault(require("dayjs"));
43
+ const logger_1 = require("./logger");
44
+ /**
45
+ * 加密工具类
46
+ * 封装 CryptoJS 常用加密/解密方法,提供统一的加密服务
47
+ * 遵循高内聚原则,将所有加解密相关逻辑集中在此模块
48
+ */
49
+ class CryptoUtils {
50
+ /**
51
+ * 计算字符串的 MD5 哈希值
52
+ * @param input 输入字符串
53
+ * @returns MD5 哈希值(32位小写)
54
+ */
55
+ static md5(input) {
56
+ if (_.isEmpty(input)) {
57
+ return '';
58
+ }
59
+ return CryptoJS.MD5(input).toString();
60
+ }
61
+ /**
62
+ * 计算字符串的 SHA-256 哈希值
63
+ * @param input 输入字符串
64
+ * @returns SHA-256 哈希值
65
+ */
66
+ static sha256(input) {
67
+ if (_.isEmpty(input)) {
68
+ return '';
69
+ }
70
+ return CryptoJS.SHA256(input).toString();
71
+ }
72
+ /**
73
+ * 使用 AES 加密字符串
74
+ * @param plaintext 明文
75
+ * @param secretKey 密钥
76
+ * @returns 加密后的密文(Base64 编码)
77
+ */
78
+ static aesEncrypt(plaintext, secretKey) {
79
+ if (_.isEmpty(plaintext) || _.isEmpty(secretKey)) {
80
+ return '';
81
+ }
82
+ try {
83
+ return CryptoJS.AES.encrypt(plaintext, secretKey).toString();
84
+ }
85
+ catch (error) {
86
+ logger_1.logger.error('AES 加密失败:', error);
87
+ return '';
88
+ }
89
+ }
90
+ /**
91
+ * 使用 AES 解密字符串
92
+ * @param ciphertext 密文
93
+ * @param secretKey 密钥
94
+ * @returns 解密后的明文,失败返回空字符串
95
+ */
96
+ static aesDecrypt(ciphertext, secretKey) {
97
+ if (_.isEmpty(ciphertext) || _.isEmpty(secretKey)) {
98
+ return '';
99
+ }
100
+ try {
101
+ const bytes = CryptoJS.AES.decrypt(ciphertext, secretKey);
102
+ return bytes.toString(CryptoJS.enc.Utf8);
103
+ }
104
+ catch (error) {
105
+ logger_1.logger.error('AES 解密失败:', error);
106
+ return '';
107
+ }
108
+ }
109
+ /**
110
+ * 使用 Base64 编码字符串
111
+ * @param input 输入字符串
112
+ * @returns Base64 编码结果
113
+ */
114
+ static base64Encode(input) {
115
+ if (_.isEmpty(input)) {
116
+ return '';
117
+ }
118
+ const wordArray = CryptoJS.enc.Utf8.parse(input);
119
+ return CryptoJS.enc.Base64.stringify(wordArray);
120
+ }
121
+ /**
122
+ * 使用 Base64 解码字符串
123
+ * @param input Base64 编码字符串
124
+ * @returns 解码后的字符串
125
+ */
126
+ static base64Decode(input) {
127
+ if (_.isEmpty(input)) {
128
+ return '';
129
+ }
130
+ try {
131
+ const words = CryptoJS.enc.Base64.parse(input);
132
+ return words.toString(CryptoJS.enc.Utf8);
133
+ }
134
+ catch (error) {
135
+ logger_1.logger.error('Base64 解码失败:', error);
136
+ return '';
137
+ }
138
+ }
139
+ /**
140
+ * 生成带时间戳的签名(用于接口请求等场景)
141
+ * 组合应用ID、时间戳、密钥进行签名,防止请求篡改
142
+ * @param appId 应用ID
143
+ * @param secretKey 密钥
144
+ * @returns 签名字符串
145
+ */
146
+ static generateSignature(appId, secretKey) {
147
+ const timestamp = (0, dayjs_1.default)().unix().toString();
148
+ const rawString = `${appId}${timestamp}${secretKey}`;
149
+ return this.sha256(rawString);
150
+ }
151
+ }
152
+ exports.CryptoUtils = CryptoUtils;
153
+ //# sourceMappingURL=crypto.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"crypto.js","sourceRoot":"","sources":["../../src/utils/crypto.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,58 @@
1
+ import { AxiosRequestConfig } from 'axios';
2
+ /**
3
+ * HTTP 请求工具类
4
+ * 封装 axios,提供统一的 HTTP 请求接口,包含请求拦截、响应拦截、错误处理
5
+ * 具备超时设置、自动重试、日志记录等功能
6
+ */
7
+ export declare class HttpUtils {
8
+ /** axios 实例 */
9
+ private static instance;
10
+ /**
11
+ * 获取 axios 实例(单例模式)
12
+ */
13
+ private static getInstance;
14
+ /**
15
+ * 发送 GET 请求
16
+ * @param url 请求 URL
17
+ * @param config 请求配置
18
+ * @returns Promise<T> 响应数据
19
+ */
20
+ static get<T = unknown>(url: string, config?: AxiosRequestConfig): Promise<T>;
21
+ /**
22
+ * 发送 POST 请求
23
+ * @param url 请求 URL
24
+ * @param data 请求数据
25
+ * @param config 请求配置
26
+ * @returns Promise<T> 响应数据
27
+ */
28
+ static post<T = unknown>(url: string, data?: unknown, config?: AxiosRequestConfig): Promise<T>;
29
+ /**
30
+ * 发送 PUT 请求
31
+ * @param url 请求 URL
32
+ * @param data 请求数据
33
+ * @param config 请求配置
34
+ * @returns Promise<T> 响应数据
35
+ */
36
+ static put<T = unknown>(url: string, data?: unknown, config?: AxiosRequestConfig): Promise<T>;
37
+ /**
38
+ * 发送 DELETE 请求
39
+ * @param url 请求 URL
40
+ * @param config 请求配置
41
+ * @returns Promise<T> 响应数据
42
+ */
43
+ static delete<T = unknown>(url: string, config?: AxiosRequestConfig): Promise<T>;
44
+ /**
45
+ * 带重试机制的 GET 请求
46
+ * @param url 请求 URL
47
+ * @param maxRetries 最大重试次数,默认 3 次
48
+ * @param retryDelay 重试间隔(毫秒),默认 1000ms
49
+ * @param config 请求配置
50
+ * @returns Promise<T> 响应数据
51
+ */
52
+ static getWithRetry<T = unknown>(url: string, maxRetries?: number, retryDelay?: number, config?: AxiosRequestConfig): Promise<T>;
53
+ /**
54
+ * 延时函数
55
+ * @param ms 延时毫秒数
56
+ */
57
+ private static sleep;
58
+ }