@round2ai/r2-cli 1.0.1 → 1.0.2
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/api.d.ts +45 -0
- package/dist/api.d.ts.map +1 -0
- package/dist/api.js +90 -0
- package/dist/api.js.map +1 -0
- package/dist/auth.d.ts +35 -0
- package/dist/auth.d.ts.map +1 -0
- package/dist/auth.js +240 -0
- package/dist/auth.js.map +1 -0
- package/dist/commands/ai/chat.d.ts +9 -0
- package/dist/commands/ai/chat.d.ts.map +1 -0
- package/dist/commands/ai/chat.js +16 -0
- package/dist/commands/ai/chat.js.map +1 -0
- package/dist/commands/ai/skills.d.ts +9 -0
- package/dist/commands/ai/skills.d.ts.map +1 -0
- package/dist/commands/ai/skills.js +16 -0
- package/dist/commands/ai/skills.js.map +1 -0
- package/dist/commands/auth/login.d.ts +24 -0
- package/dist/commands/auth/login.d.ts.map +1 -0
- package/dist/commands/auth/login.js +288 -0
- package/dist/commands/auth/login.js.map +1 -0
- package/dist/commands/auth/logout.d.ts +16 -0
- package/dist/commands/auth/logout.d.ts.map +1 -0
- package/dist/commands/auth/logout.js +49 -0
- package/dist/commands/auth/logout.js.map +1 -0
- package/dist/commands/auth/status.d.ts +28 -0
- package/dist/commands/auth/status.d.ts.map +1 -0
- package/dist/commands/auth/status.js +92 -0
- package/dist/commands/auth/status.js.map +1 -0
- package/dist/commands/base.d.ts +107 -0
- package/dist/commands/base.d.ts.map +1 -0
- package/dist/commands/base.js +153 -0
- package/dist/commands/base.js.map +1 -0
- package/dist/commands/business/pricing.d.ts +9 -0
- package/dist/commands/business/pricing.d.ts.map +1 -0
- package/dist/commands/business/pricing.js +16 -0
- package/dist/commands/business/pricing.js.map +1 -0
- package/dist/commands/business/report.d.ts +9 -0
- package/dist/commands/business/report.d.ts.map +1 -0
- package/dist/commands/business/report.js +16 -0
- package/dist/commands/business/report.js.map +1 -0
- package/dist/commands/inventory/risk.d.ts +9 -0
- package/dist/commands/inventory/risk.d.ts.map +1 -0
- package/dist/commands/inventory/risk.js +16 -0
- package/dist/commands/inventory/risk.js.map +1 -0
- package/dist/config.d.ts +54 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +111 -0
- package/dist/config.js.map +1 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +66 -116
- package/dist/index.js.map +1 -1
- package/dist/query/executor.d.ts +138 -0
- package/dist/query/executor.d.ts.map +1 -0
- package/dist/query/executor.js +232 -0
- package/dist/query/executor.js.map +1 -0
- package/dist/query/types.d.ts +116 -0
- package/dist/query/types.d.ts.map +1 -0
- package/dist/query/types.js +15 -0
- package/dist/query/types.js.map +1 -0
- package/dist/query/utils.d.ts +99 -0
- package/dist/query/utils.d.ts.map +1 -0
- package/dist/query/utils.js +151 -0
- package/dist/query/utils.js.map +1 -0
- package/dist/services/ServiceContainer.d.ts +110 -0
- package/dist/services/ServiceContainer.d.ts.map +1 -0
- package/dist/services/ServiceContainer.js +242 -0
- package/dist/services/ServiceContainer.js.map +1 -0
- package/dist/services/api/client.d.ts +88 -0
- package/dist/services/api/client.d.ts.map +1 -0
- package/dist/services/api/client.js +188 -0
- package/dist/services/api/client.js.map +1 -0
- package/dist/services/api/types.d.ts +233 -0
- package/dist/services/api/types.d.ts.map +1 -0
- package/dist/services/api/types.js +83 -0
- package/dist/services/api/types.js.map +1 -0
- package/dist/services/auth/provider.d.ts +73 -0
- package/dist/services/auth/provider.d.ts.map +1 -0
- package/dist/services/auth/provider.js +339 -0
- package/dist/services/auth/provider.js.map +1 -0
- package/dist/services/auth/session.d.ts +73 -0
- package/dist/services/auth/session.d.ts.map +1 -0
- package/dist/services/auth/session.js +200 -0
- package/dist/services/auth/session.js.map +1 -0
- package/dist/services/business/demand.d.ts +70 -0
- package/dist/services/business/demand.d.ts.map +1 -0
- package/dist/services/business/demand.js +240 -0
- package/dist/services/business/demand.js.map +1 -0
- package/dist/services/business/fulfillment.d.ts +122 -0
- package/dist/services/business/fulfillment.d.ts.map +1 -0
- package/dist/services/business/fulfillment.js +267 -0
- package/dist/services/business/fulfillment.js.map +1 -0
- package/dist/services/business/inventory.d.ts +54 -0
- package/dist/services/business/inventory.d.ts.map +1 -0
- package/dist/services/business/inventory.js +245 -0
- package/dist/services/business/inventory.js.map +1 -0
- package/dist/services/business/pricing.d.ts +41 -0
- package/dist/services/business/pricing.d.ts.map +1 -0
- package/dist/services/business/pricing.js +133 -0
- package/dist/services/business/pricing.js.map +1 -0
- package/dist/services/business/report.d.ts +74 -0
- package/dist/services/business/report.d.ts.map +1 -0
- package/dist/services/business/report.js +380 -0
- package/dist/services/business/report.js.map +1 -0
- package/dist/services/config/manager.d.ts +105 -0
- package/dist/services/config/manager.d.ts.map +1 -0
- package/dist/services/config/manager.js +324 -0
- package/dist/services/config/manager.js.map +1 -0
- package/dist/services/config/types.d.ts +128 -0
- package/dist/services/config/types.d.ts.map +1 -0
- package/dist/services/config/types.js +209 -0
- package/dist/services/config/types.js.map +1 -0
- package/dist/services/index.d.ts +17 -0
- package/dist/services/index.d.ts.map +1 -0
- package/dist/services/index.js +44 -0
- package/dist/services/index.js.map +1 -0
- package/dist/services/storage/index.d.ts +63 -0
- package/dist/services/storage/index.d.ts.map +1 -0
- package/dist/services/storage/index.js +136 -0
- package/dist/services/storage/index.js.map +1 -0
- package/dist/types/api.d.ts +58 -0
- package/dist/types/api.d.ts.map +1 -0
- package/dist/types/api.js +5 -0
- package/dist/types/api.js.map +1 -0
- package/dist/types/auth.d.ts +59 -0
- package/dist/types/auth.d.ts.map +1 -0
- package/dist/types/auth.js +11 -0
- package/dist/types/auth.js.map +1 -0
- package/dist/types/business.d.ts +201 -0
- package/dist/types/business.d.ts.map +1 -0
- package/dist/types/business.js +5 -0
- package/dist/types/business.js.map +1 -0
- package/dist/types/command.d.ts +106 -0
- package/dist/types/command.d.ts.map +1 -0
- package/dist/types/command.js +5 -0
- package/dist/types/command.js.map +1 -0
- package/dist/types/config.d.ts +66 -0
- package/dist/types/config.d.ts.map +1 -0
- package/dist/types/config.js +5 -0
- package/dist/types/config.js.map +1 -0
- package/dist/utils/async.d.ts +79 -0
- package/dist/utils/async.d.ts.map +1 -0
- package/dist/utils/async.js +179 -0
- package/dist/utils/async.js.map +1 -0
- package/dist/utils/format.d.ts +90 -0
- package/dist/utils/format.d.ts.map +1 -0
- package/dist/utils/format.js +227 -0
- package/dist/utils/format.js.map +1 -0
- package/dist/utils/logger.d.ts +136 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +249 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/validation.d.ts +100 -0
- package/dist/utils/validation.d.ts.map +1 -0
- package/dist/utils/validation.js +334 -0
- package/dist/utils/validation.js.map +1 -0
- package/package.json +6 -2
|
@@ -0,0 +1,249 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 日志工具函数
|
|
3
|
+
*/
|
|
4
|
+
import chalk from "chalk";
|
|
5
|
+
/**
|
|
6
|
+
* 日志记录器
|
|
7
|
+
*/
|
|
8
|
+
export class Logger {
|
|
9
|
+
level;
|
|
10
|
+
prefix;
|
|
11
|
+
timestamp;
|
|
12
|
+
colored;
|
|
13
|
+
json;
|
|
14
|
+
constructor(config = {}) {
|
|
15
|
+
this.level = config.level || "info";
|
|
16
|
+
this.prefix = config.prefix || "";
|
|
17
|
+
this.timestamp = config.timestamp ?? true;
|
|
18
|
+
this.colored = config.colored ?? true;
|
|
19
|
+
this.json = config.json ?? false;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* 记录调试信息
|
|
23
|
+
*/
|
|
24
|
+
debug(message, ...args) {
|
|
25
|
+
this.log("debug", message, ...args);
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* 记录信息
|
|
29
|
+
*/
|
|
30
|
+
info(message, ...args) {
|
|
31
|
+
this.log("info", message, ...args);
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* 记录警告
|
|
35
|
+
*/
|
|
36
|
+
warn(message, ...args) {
|
|
37
|
+
this.log("warn", message, ...args);
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* 记录错误
|
|
41
|
+
*/
|
|
42
|
+
error(message, ...args) {
|
|
43
|
+
this.log("error", message, ...args);
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* 格式化日志消息
|
|
47
|
+
*/
|
|
48
|
+
log(level, message, ...args) {
|
|
49
|
+
if (!this.shouldLog(level)) {
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
const timestamp = this.timestamp ? this.getTimestamp() : "";
|
|
53
|
+
const prefix = this.prefix ? `[${this.prefix}]` : "";
|
|
54
|
+
const levelName = level.toUpperCase();
|
|
55
|
+
const levelColor = this.getLevelColor(level);
|
|
56
|
+
const formattedMessage = `${timestamp} ${prefix} ${levelColor(levelName)}: ${message}`;
|
|
57
|
+
if (args.length > 0) {
|
|
58
|
+
if (this.json) {
|
|
59
|
+
this.logJson(level, message, args);
|
|
60
|
+
}
|
|
61
|
+
else {
|
|
62
|
+
console.log(formattedMessage, ...args);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
else {
|
|
66
|
+
console.log(formattedMessage);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* 检查是否应该记录该级别的日志
|
|
71
|
+
*/
|
|
72
|
+
shouldLog(level) {
|
|
73
|
+
const levels = ["debug", "info", "warn", "error"];
|
|
74
|
+
return levels.indexOf(level) >= levels.indexOf(this.level);
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* 获取时间戳
|
|
78
|
+
*/
|
|
79
|
+
getTimestamp() {
|
|
80
|
+
const now = new Date();
|
|
81
|
+
return `[${now.toISOString()}]`;
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* 获取日志级别颜色
|
|
85
|
+
*/
|
|
86
|
+
getLevelColor(level) {
|
|
87
|
+
switch (level) {
|
|
88
|
+
case "debug":
|
|
89
|
+
return chalk.gray;
|
|
90
|
+
case "info":
|
|
91
|
+
return chalk.blue;
|
|
92
|
+
case "warn":
|
|
93
|
+
return chalk.yellow;
|
|
94
|
+
case "error":
|
|
95
|
+
return chalk.red;
|
|
96
|
+
default:
|
|
97
|
+
return chalk.white;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* 以 JSON 格式记录日志
|
|
102
|
+
*/
|
|
103
|
+
logJson(level, message, args) {
|
|
104
|
+
const logEntry = {
|
|
105
|
+
timestamp: new Date().toISOString(),
|
|
106
|
+
level,
|
|
107
|
+
message,
|
|
108
|
+
prefix: this.prefix,
|
|
109
|
+
args,
|
|
110
|
+
};
|
|
111
|
+
console.log(JSON.stringify(logEntry));
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* 创建带前缀的 logger
|
|
116
|
+
*/
|
|
117
|
+
export function createLogger(prefix, config) {
|
|
118
|
+
return new Logger({ ...config, prefix });
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* 默认 logger
|
|
122
|
+
*/
|
|
123
|
+
export const logger = new Logger();
|
|
124
|
+
/**
|
|
125
|
+
* 性能计时器(带日志)
|
|
126
|
+
*/
|
|
127
|
+
export class Profiler {
|
|
128
|
+
startTime;
|
|
129
|
+
logger;
|
|
130
|
+
name;
|
|
131
|
+
constructor(name, logger) {
|
|
132
|
+
this.startTime = performance.now();
|
|
133
|
+
this.logger = logger || logger;
|
|
134
|
+
this.name = name;
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* 结束计时并记录日志
|
|
138
|
+
*/
|
|
139
|
+
end() {
|
|
140
|
+
const duration = performance.now() - this.startTime;
|
|
141
|
+
this.logger.debug(`${this.name} 完成,耗时 ${duration.toFixed(2)}ms`);
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* 记录性能标记
|
|
145
|
+
*/
|
|
146
|
+
mark(label) {
|
|
147
|
+
const duration = performance.now() - this.startTime;
|
|
148
|
+
this.logger.debug(`${this.name} - ${label}: ${duration.toFixed(2)}ms`);
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* 创建带标签的性能计时器
|
|
153
|
+
*/
|
|
154
|
+
export function profile(name, logger) {
|
|
155
|
+
return new Profiler(name, logger);
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* 创建上下文日志记录器
|
|
159
|
+
*/
|
|
160
|
+
export class ContextLogger {
|
|
161
|
+
logger;
|
|
162
|
+
context = {};
|
|
163
|
+
constructor(logger) {
|
|
164
|
+
this.logger = logger;
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* 设置上下文
|
|
168
|
+
*/
|
|
169
|
+
setContext(key, value) {
|
|
170
|
+
this.context[key] = value;
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* 记录带上下文的日志
|
|
174
|
+
*/
|
|
175
|
+
info(message, ...args) {
|
|
176
|
+
this.logWithContext("info", message, ...args);
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* 记录错误日志
|
|
180
|
+
*/
|
|
181
|
+
error(message, ...args) {
|
|
182
|
+
this.logWithContext("error", message, ...args);
|
|
183
|
+
}
|
|
184
|
+
/**
|
|
185
|
+
* 记录带上下文的日志
|
|
186
|
+
*/
|
|
187
|
+
logWithContext(level, message, ...args) {
|
|
188
|
+
if (Object.keys(this.context).length > 0) {
|
|
189
|
+
const contextStr = ` [${JSON.stringify(this.context)}]`;
|
|
190
|
+
this.log(level, message + contextStr, ...args);
|
|
191
|
+
}
|
|
192
|
+
else {
|
|
193
|
+
this.log(level, message, ...args);
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
/**
|
|
197
|
+
* 清除上下文
|
|
198
|
+
*/
|
|
199
|
+
clearContext() {
|
|
200
|
+
this.context = {};
|
|
201
|
+
}
|
|
202
|
+
log(level, message, ...args) {
|
|
203
|
+
this.logger[level](message, ...args);
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
/**
|
|
207
|
+
* 创建上下文日志记录器
|
|
208
|
+
*/
|
|
209
|
+
export function createContextLogger(logger) {
|
|
210
|
+
return new ContextLogger(logger);
|
|
211
|
+
}
|
|
212
|
+
/**
|
|
213
|
+
* 测试代码的性能工具
|
|
214
|
+
*/
|
|
215
|
+
export function benchmark(fn, iterations = 1, logger) {
|
|
216
|
+
const loggerInstance = logger || logger;
|
|
217
|
+
loggerInstance.debug(`开始性能测试,执行 ${iterations} 次迭代`);
|
|
218
|
+
const results = [];
|
|
219
|
+
async function runIteration(index) {
|
|
220
|
+
const start = performance.now();
|
|
221
|
+
await fn();
|
|
222
|
+
const end = performance.now();
|
|
223
|
+
const duration = end - start;
|
|
224
|
+
results.push(duration);
|
|
225
|
+
loggerInstance.debug(`第 ${index + 1} 次迭代耗时: ${duration.toFixed(2)}ms`);
|
|
226
|
+
}
|
|
227
|
+
async function runAll() {
|
|
228
|
+
if (iterations === 1) {
|
|
229
|
+
await runIteration(0);
|
|
230
|
+
}
|
|
231
|
+
else {
|
|
232
|
+
const promises = Array.from({ length: iterations }, (_, i) => runIteration(i));
|
|
233
|
+
await Promise.all(promises);
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
return runAll().then(() => {
|
|
237
|
+
const total = results.reduce((sum, time) => sum + time, 0);
|
|
238
|
+
const avg = total / iterations;
|
|
239
|
+
const min = Math.min(...results);
|
|
240
|
+
const max = Math.max(...results);
|
|
241
|
+
loggerInstance.debug(`性能测试完成`);
|
|
242
|
+
loggerInstance.debug(`平均耗时: ${avg.toFixed(2)}ms`);
|
|
243
|
+
loggerInstance.debug(`最小耗时: ${min.toFixed(2)}ms`);
|
|
244
|
+
loggerInstance.debug(`最大耗时: ${max.toFixed(2)}ms`);
|
|
245
|
+
loggerInstance.debug(`总耗时: ${total.toFixed(2)}ms`);
|
|
246
|
+
return { avg, min, max, total };
|
|
247
|
+
});
|
|
248
|
+
}
|
|
249
|
+
//# sourceMappingURL=logger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 输入验证工具函数
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* 验证规则
|
|
6
|
+
*/
|
|
7
|
+
export interface ValidationRule {
|
|
8
|
+
required?: boolean;
|
|
9
|
+
type?: "string" | "number" | "boolean" | "array" | "object";
|
|
10
|
+
min?: number;
|
|
11
|
+
max?: number;
|
|
12
|
+
pattern?: RegExp | string;
|
|
13
|
+
enum?: unknown[];
|
|
14
|
+
validator?: (value: unknown) => boolean | string;
|
|
15
|
+
message?: string;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* 验证结果
|
|
19
|
+
*/
|
|
20
|
+
export interface ValidationResult {
|
|
21
|
+
isValid: boolean;
|
|
22
|
+
errors?: string[];
|
|
23
|
+
value?: unknown;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* 验证对象
|
|
27
|
+
*/
|
|
28
|
+
export declare class ValidationSchema {
|
|
29
|
+
private rules;
|
|
30
|
+
constructor(rules: Record<string, ValidationRule>);
|
|
31
|
+
/**
|
|
32
|
+
* 验证数据
|
|
33
|
+
*/
|
|
34
|
+
validate(data: Record<string, unknown>): ValidationResult;
|
|
35
|
+
/**
|
|
36
|
+
* 验证单个值
|
|
37
|
+
*/
|
|
38
|
+
private validateValue;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* 验证邮箱
|
|
42
|
+
*/
|
|
43
|
+
export declare function validateEmail(email: string): boolean;
|
|
44
|
+
/**
|
|
45
|
+
* 验证手机号(中国大陆)
|
|
46
|
+
*/
|
|
47
|
+
export declare function validatePhone(phone: string): boolean;
|
|
48
|
+
/**
|
|
49
|
+
* 验证SKU格式
|
|
50
|
+
*/
|
|
51
|
+
export declare function validateSKU(sku: string): boolean;
|
|
52
|
+
/**
|
|
53
|
+
* 验证地区代码
|
|
54
|
+
*/
|
|
55
|
+
export declare function validateRegionCode(code: string): boolean;
|
|
56
|
+
/**
|
|
57
|
+
* 验证金额
|
|
58
|
+
*/
|
|
59
|
+
export declare function validateCurrency(amount: unknown): amount is number;
|
|
60
|
+
/**
|
|
61
|
+
* 验证URL
|
|
62
|
+
*/
|
|
63
|
+
export declare function validateURL(url: string): boolean;
|
|
64
|
+
/**
|
|
65
|
+
* 验证日期
|
|
66
|
+
*/
|
|
67
|
+
export declare function validateDate(date: string | Date): boolean;
|
|
68
|
+
/**
|
|
69
|
+
* 验证时间段
|
|
70
|
+
*/
|
|
71
|
+
export declare function validateDateRange(startDate: string | Date, endDate: string | Date): boolean;
|
|
72
|
+
/**
|
|
73
|
+
* 验证整数范围
|
|
74
|
+
*/
|
|
75
|
+
export declare function validateIntegerRange(value: unknown, min?: number, max?: number): boolean;
|
|
76
|
+
/**
|
|
77
|
+
* 验证字符串长度
|
|
78
|
+
*/
|
|
79
|
+
export declare function validateStringLength(value: unknown, min?: number, max?: number): boolean;
|
|
80
|
+
/**
|
|
81
|
+
* 验证数组
|
|
82
|
+
*/
|
|
83
|
+
export declare function validateArray(value: unknown, min?: number, max?: number): boolean;
|
|
84
|
+
/**
|
|
85
|
+
* 验证对象
|
|
86
|
+
*/
|
|
87
|
+
export declare function validateObject(value: unknown, requiredKeys?: string[]): boolean;
|
|
88
|
+
/**
|
|
89
|
+
* 验证JSON字符串
|
|
90
|
+
*/
|
|
91
|
+
export declare function validateJSON(json: string): boolean;
|
|
92
|
+
/**
|
|
93
|
+
* 创建验证器
|
|
94
|
+
*/
|
|
95
|
+
export declare function createValidator(rules: Record<string, ValidationRule>): ValidationSchema;
|
|
96
|
+
/**
|
|
97
|
+
* 快速验证
|
|
98
|
+
*/
|
|
99
|
+
export declare function validate(data: unknown, rules: Record<string, ValidationRule>): ValidationResult;
|
|
100
|
+
//# sourceMappingURL=validation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../../src/utils/validation.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,334 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 输入验证工具函数
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* 验证对象
|
|
6
|
+
*/
|
|
7
|
+
export class ValidationSchema {
|
|
8
|
+
rules;
|
|
9
|
+
constructor(rules) {
|
|
10
|
+
this.rules = rules;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* 验证数据
|
|
14
|
+
*/
|
|
15
|
+
validate(data) {
|
|
16
|
+
const errors = [];
|
|
17
|
+
const result = {};
|
|
18
|
+
for (const [key, rule] of Object.entries(this.rules)) {
|
|
19
|
+
const value = data[key];
|
|
20
|
+
const validation = this.validateValue(value, rule);
|
|
21
|
+
if (!validation.isValid) {
|
|
22
|
+
errors.push(validation.error || `字段 ${key} 验证失败`);
|
|
23
|
+
}
|
|
24
|
+
else if (validation.value !== undefined) {
|
|
25
|
+
result[key] = validation.value;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
return {
|
|
29
|
+
isValid: errors.length === 0,
|
|
30
|
+
errors: errors.length > 0 ? errors : undefined,
|
|
31
|
+
value: errors.length === 0 ? result : undefined,
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* 验证单个值
|
|
36
|
+
*/
|
|
37
|
+
validateValue(value, rule) {
|
|
38
|
+
// 检查必填
|
|
39
|
+
if (rule.required) {
|
|
40
|
+
if (value === undefined || value === null || value === "") {
|
|
41
|
+
return {
|
|
42
|
+
isValid: false,
|
|
43
|
+
error: rule.message || "此字段为必填项",
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
// 如果值为空且非必填,跳过其他验证
|
|
48
|
+
if (value === undefined || value === null || value === "") {
|
|
49
|
+
return { isValid: true };
|
|
50
|
+
}
|
|
51
|
+
// 类型验证
|
|
52
|
+
if (rule.type) {
|
|
53
|
+
const type = typeof value;
|
|
54
|
+
const expectedType = rule.type;
|
|
55
|
+
if (expectedType === "number") {
|
|
56
|
+
if (type !== "number") {
|
|
57
|
+
return {
|
|
58
|
+
isValid: false,
|
|
59
|
+
error: rule.message || "必须是数字",
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
else if (expectedType === "boolean") {
|
|
64
|
+
if (type !== "boolean") {
|
|
65
|
+
return {
|
|
66
|
+
isValid: false,
|
|
67
|
+
error: rule.message || "必须是布尔值",
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
else if (expectedType === "array") {
|
|
72
|
+
if (!Array.isArray(value)) {
|
|
73
|
+
return {
|
|
74
|
+
isValid: false,
|
|
75
|
+
error: rule.message || "必须是数组",
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
else if (expectedType === "object") {
|
|
80
|
+
if (type !== "object" || Array.isArray(value)) {
|
|
81
|
+
return {
|
|
82
|
+
isValid: false,
|
|
83
|
+
error: rule.message || "必须是对象",
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
else if (expectedType === "string" && type !== "string") {
|
|
88
|
+
return {
|
|
89
|
+
isValid: false,
|
|
90
|
+
error: rule.message || "必须是字符串",
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
// 最小值验证
|
|
95
|
+
if (rule.type === "number" && typeof value === "number" && rule.min !== undefined) {
|
|
96
|
+
if (value < rule.min) {
|
|
97
|
+
return {
|
|
98
|
+
isValid: false,
|
|
99
|
+
error: rule.message || `不能小于 ${rule.min}`,
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
// 最大值验证
|
|
104
|
+
if (rule.type === "number" && typeof value === "number" && rule.max !== undefined) {
|
|
105
|
+
if (value > rule.max) {
|
|
106
|
+
return {
|
|
107
|
+
isValid: false,
|
|
108
|
+
error: rule.message || `不能大于 ${rule.max}`,
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
// 最小长度验证
|
|
113
|
+
if ((rule.type === "string" && typeof value === "string" && rule.min !== undefined) ||
|
|
114
|
+
(rule.type === "array" && Array.isArray(value) && rule.min !== undefined)) {
|
|
115
|
+
if (value.length < rule.min) {
|
|
116
|
+
return {
|
|
117
|
+
isValid: false,
|
|
118
|
+
error: rule.message || `长度不能小于 ${rule.min}`,
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
// 最大长度验证
|
|
123
|
+
if ((rule.type === "string" && typeof value === "string" && rule.max !== undefined) ||
|
|
124
|
+
(rule.type === "array" && Array.isArray(value) && rule.max !== undefined)) {
|
|
125
|
+
if (value.length > rule.max) {
|
|
126
|
+
return {
|
|
127
|
+
isValid: false,
|
|
128
|
+
error: rule.message || `长度不能大于 ${rule.max}`,
|
|
129
|
+
};
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
// 正则表达式验证
|
|
133
|
+
if (typeof value === "string" && rule.pattern) {
|
|
134
|
+
const regex = typeof rule.pattern === "string" ? new RegExp(rule.pattern) : rule.pattern;
|
|
135
|
+
if (!regex.test(value)) {
|
|
136
|
+
return {
|
|
137
|
+
isValid: false,
|
|
138
|
+
error: rule.message || "格式不正确",
|
|
139
|
+
};
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
// 枚举验证
|
|
143
|
+
if (rule.enum && !rule.enum.includes(value)) {
|
|
144
|
+
return {
|
|
145
|
+
isValid: false,
|
|
146
|
+
error: rule.message || `必须是以下值之一: ${rule.enum.join(", ")}`,
|
|
147
|
+
};
|
|
148
|
+
}
|
|
149
|
+
// 自定义验证器
|
|
150
|
+
if (rule.validator) {
|
|
151
|
+
const validatorResult = rule.validator(value);
|
|
152
|
+
if (typeof validatorResult === "string") {
|
|
153
|
+
return {
|
|
154
|
+
isValid: false,
|
|
155
|
+
error: validatorResult,
|
|
156
|
+
};
|
|
157
|
+
}
|
|
158
|
+
else if (!validatorResult) {
|
|
159
|
+
return {
|
|
160
|
+
isValid: false,
|
|
161
|
+
error: rule.message || "验证失败",
|
|
162
|
+
};
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
return {
|
|
166
|
+
isValid: true,
|
|
167
|
+
value,
|
|
168
|
+
};
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* 验证邮箱
|
|
173
|
+
*/
|
|
174
|
+
export function validateEmail(email) {
|
|
175
|
+
const pattern = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
|
|
176
|
+
return pattern.test(email);
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* 验证手机号(中国大陆)
|
|
180
|
+
*/
|
|
181
|
+
export function validatePhone(phone) {
|
|
182
|
+
const pattern = /^1[3-9]\d{9}$/;
|
|
183
|
+
return pattern.test(phone);
|
|
184
|
+
}
|
|
185
|
+
/**
|
|
186
|
+
* 验证SKU格式
|
|
187
|
+
*/
|
|
188
|
+
export function validateSKU(sku) {
|
|
189
|
+
// SKU格式示例:CH-FLAP-001-A
|
|
190
|
+
const pattern = /^[A-Z0-9]+(?:-[A-Z0-9]+)*$/;
|
|
191
|
+
return pattern.test(sku);
|
|
192
|
+
}
|
|
193
|
+
/**
|
|
194
|
+
* 验证地区代码
|
|
195
|
+
*/
|
|
196
|
+
export function validateRegionCode(code) {
|
|
197
|
+
const pattern = /^[A-Z]{2,4}(?:-[A-Z0-9]+)*$/;
|
|
198
|
+
return pattern.test(code);
|
|
199
|
+
}
|
|
200
|
+
/**
|
|
201
|
+
* 验证金额
|
|
202
|
+
*/
|
|
203
|
+
export function validateCurrency(amount) {
|
|
204
|
+
if (typeof amount !== "number") {
|
|
205
|
+
return false;
|
|
206
|
+
}
|
|
207
|
+
if (isNaN(amount) || !isFinite(amount)) {
|
|
208
|
+
return false;
|
|
209
|
+
}
|
|
210
|
+
return amount >= 0;
|
|
211
|
+
}
|
|
212
|
+
/**
|
|
213
|
+
* 验证URL
|
|
214
|
+
*/
|
|
215
|
+
export function validateURL(url) {
|
|
216
|
+
try {
|
|
217
|
+
new URL(url);
|
|
218
|
+
return true;
|
|
219
|
+
}
|
|
220
|
+
catch {
|
|
221
|
+
return false;
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
/**
|
|
225
|
+
* 验证日期
|
|
226
|
+
*/
|
|
227
|
+
export function validateDate(date) {
|
|
228
|
+
if (date instanceof Date) {
|
|
229
|
+
return !isNaN(date.getTime());
|
|
230
|
+
}
|
|
231
|
+
if (typeof date !== "string") {
|
|
232
|
+
return false;
|
|
233
|
+
}
|
|
234
|
+
const parsed = new Date(date);
|
|
235
|
+
return !isNaN(parsed.getTime());
|
|
236
|
+
}
|
|
237
|
+
/**
|
|
238
|
+
* 验证时间段
|
|
239
|
+
*/
|
|
240
|
+
export function validateDateRange(startDate, endDate) {
|
|
241
|
+
const start = startDate instanceof Date ? startDate : new Date(startDate);
|
|
242
|
+
const end = endDate instanceof Date ? endDate : new Date(endDate);
|
|
243
|
+
if (isNaN(start.getTime()) || isNaN(end.getTime())) {
|
|
244
|
+
return false;
|
|
245
|
+
}
|
|
246
|
+
return start <= end;
|
|
247
|
+
}
|
|
248
|
+
/**
|
|
249
|
+
* 验证整数范围
|
|
250
|
+
*/
|
|
251
|
+
export function validateIntegerRange(value, min, max) {
|
|
252
|
+
if (typeof value !== "number" || !Number.isInteger(value)) {
|
|
253
|
+
return false;
|
|
254
|
+
}
|
|
255
|
+
if (min !== undefined && value < min) {
|
|
256
|
+
return false;
|
|
257
|
+
}
|
|
258
|
+
if (max !== undefined && value > max) {
|
|
259
|
+
return false;
|
|
260
|
+
}
|
|
261
|
+
return true;
|
|
262
|
+
}
|
|
263
|
+
/**
|
|
264
|
+
* 验证字符串长度
|
|
265
|
+
*/
|
|
266
|
+
export function validateStringLength(value, min, max) {
|
|
267
|
+
if (typeof value !== "string") {
|
|
268
|
+
return false;
|
|
269
|
+
}
|
|
270
|
+
if (min !== undefined && value.length < min) {
|
|
271
|
+
return false;
|
|
272
|
+
}
|
|
273
|
+
if (max !== undefined && value.length > max) {
|
|
274
|
+
return false;
|
|
275
|
+
}
|
|
276
|
+
return true;
|
|
277
|
+
}
|
|
278
|
+
/**
|
|
279
|
+
* 验证数组
|
|
280
|
+
*/
|
|
281
|
+
export function validateArray(value, min, max) {
|
|
282
|
+
if (!Array.isArray(value)) {
|
|
283
|
+
return false;
|
|
284
|
+
}
|
|
285
|
+
if (min !== undefined && value.length < min) {
|
|
286
|
+
return false;
|
|
287
|
+
}
|
|
288
|
+
if (max !== undefined && value.length > max) {
|
|
289
|
+
return false;
|
|
290
|
+
}
|
|
291
|
+
return true;
|
|
292
|
+
}
|
|
293
|
+
/**
|
|
294
|
+
* 验证对象
|
|
295
|
+
*/
|
|
296
|
+
export function validateObject(value, requiredKeys) {
|
|
297
|
+
if (typeof value !== "object" || value === null || Array.isArray(value)) {
|
|
298
|
+
return false;
|
|
299
|
+
}
|
|
300
|
+
if (requiredKeys) {
|
|
301
|
+
for (const key of requiredKeys) {
|
|
302
|
+
if (!(key in value)) {
|
|
303
|
+
return false;
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
return true;
|
|
308
|
+
}
|
|
309
|
+
/**
|
|
310
|
+
* 验证JSON字符串
|
|
311
|
+
*/
|
|
312
|
+
export function validateJSON(json) {
|
|
313
|
+
try {
|
|
314
|
+
JSON.parse(json);
|
|
315
|
+
return true;
|
|
316
|
+
}
|
|
317
|
+
catch {
|
|
318
|
+
return false;
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
/**
|
|
322
|
+
* 创建验证器
|
|
323
|
+
*/
|
|
324
|
+
export function createValidator(rules) {
|
|
325
|
+
return new ValidationSchema(rules);
|
|
326
|
+
}
|
|
327
|
+
/**
|
|
328
|
+
* 快速验证
|
|
329
|
+
*/
|
|
330
|
+
export function validate(data, rules) {
|
|
331
|
+
const schema = new ValidationSchema(rules);
|
|
332
|
+
return schema.validate(data);
|
|
333
|
+
}
|
|
334
|
+
//# sourceMappingURL=validation.js.map
|