vafast 0.3.2 → 0.3.4
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/auth/token.d.ts +13 -11
- package/dist/auth/token.js +118 -111
- package/dist/auth/token.js.map +1 -0
- package/dist/defineRoute.d.ts +5 -2
- package/dist/defineRoute.js +7 -2
- package/dist/defineRoute.js.map +1 -0
- package/dist/index.d.ts +30 -14
- package/dist/index.js +2247 -15
- package/dist/index.js.map +1 -0
- package/dist/middleware/auth.d.ts +8 -6
- package/dist/middleware/auth.js +198 -99
- package/dist/middleware/auth.js.map +1 -0
- package/dist/middleware/authMiddleware.d.ts +5 -2
- package/dist/middleware/authMiddleware.js +55 -11
- package/dist/middleware/authMiddleware.js.map +1 -0
- package/dist/middleware/component-renderer.d.ts +4 -2
- package/dist/middleware/component-renderer.js +87 -80
- package/dist/middleware/component-renderer.js.map +1 -0
- package/dist/middleware/component-router.d.ts +8 -3
- package/dist/middleware/component-router.js +33 -39
- package/dist/middleware/component-router.js.map +1 -0
- package/dist/middleware/cors.d.ts +6 -3
- package/dist/middleware/cors.js +42 -29
- package/dist/middleware/cors.js.map +1 -0
- package/dist/middleware/rateLimit.d.ts +5 -3
- package/dist/middleware/rateLimit.js +45 -29
- package/dist/middleware/rateLimit.js.map +1 -0
- package/dist/middleware.d.ts +6 -3
- package/dist/middleware.js +97 -51
- package/dist/middleware.js.map +1 -0
- package/dist/monitoring/index.d.ts +11 -4
- package/dist/monitoring/index.js +1299 -17
- package/dist/monitoring/index.js.map +1 -0
- package/dist/monitoring/native-monitor.d.ts +12 -6
- package/dist/monitoring/native-monitor.js +1258 -161
- package/dist/monitoring/native-monitor.js.map +1 -0
- package/dist/monitoring/types.d.ts +8 -6
- package/dist/monitoring/types.js +1 -1
- package/dist/monitoring/types.js.map +1 -0
- package/dist/node-server/index.d.ts +4 -22
- package/dist/node-server/index.js +254 -21
- package/dist/node-server/index.js.map +1 -0
- package/dist/node-server/request.d.ts +6 -2
- package/dist/node-server/request.js +102 -134
- package/dist/node-server/request.js.map +1 -0
- package/dist/node-server/response.d.ts +7 -3
- package/dist/node-server/response.js +67 -89
- package/dist/node-server/response.js.map +1 -0
- package/dist/node-server/serve.d.ts +11 -7
- package/dist/node-server/serve.js +231 -82
- package/dist/node-server/serve.js.map +1 -0
- package/dist/router/index.d.ts +3 -5
- package/dist/router/index.js +228 -7
- package/dist/router/index.js.map +1 -0
- package/dist/router/radix-tree.d.ts +7 -4
- package/dist/router/radix-tree.js +186 -218
- package/dist/router/radix-tree.js.map +1 -0
- package/dist/router.d.ts +7 -3
- package/dist/router.js +37 -83
- package/dist/router.js.map +1 -0
- package/dist/serve.d.ts +2 -12
- package/dist/serve.js +237 -11
- package/dist/serve.js.map +1 -0
- package/dist/server/base-server.d.ts +5 -2
- package/dist/server/base-server.js +124 -135
- package/dist/server/base-server.js.map +1 -0
- package/dist/server/component-server.d.ts +9 -4
- package/dist/server/component-server.js +481 -139
- package/dist/server/component-server.js.map +1 -0
- package/dist/server/index.d.ts +8 -7
- package/dist/server/index.js +985 -11
- package/dist/server/index.js.map +1 -0
- package/dist/server/server-factory.d.ts +11 -5
- package/dist/server/server-factory.js +979 -67
- package/dist/server/server-factory.js.map +1 -0
- package/dist/server/server.d.ts +7 -3
- package/dist/server/server.js +553 -112
- package/dist/server/server.js.map +1 -0
- package/dist/types/component-route.d.ts +8 -4
- package/dist/types/component-route.js +1 -1
- package/dist/types/component-route.js.map +1 -0
- package/dist/types/index.d.ts +5 -5
- package/dist/types/index.js +21 -4
- package/dist/types/index.js.map +1 -0
- package/dist/types/route.d.ts +13 -10
- package/dist/types/route.js +10 -9
- package/dist/types/route.js.map +1 -0
- package/dist/types/schema.d.ts +11 -7
- package/dist/types/schema.js +1 -1
- package/dist/types/schema.js.map +1 -0
- package/dist/types/types.d.ts +11 -9
- package/dist/types/types.js +1 -1
- package/dist/types/types.js.map +1 -0
- package/dist/utils/base64url.d.ts +4 -2
- package/dist/utils/base64url.js +12 -9
- package/dist/utils/base64url.js.map +1 -0
- package/dist/utils/create-handler.d.ts +11 -7
- package/dist/utils/create-handler.js +393 -217
- package/dist/utils/create-handler.js.map +1 -0
- package/dist/utils/dependency-manager.d.ts +3 -1
- package/dist/utils/dependency-manager.js +67 -69
- package/dist/utils/dependency-manager.js.map +1 -0
- package/dist/utils/go-await.d.ts +3 -1
- package/dist/utils/go-await.js +8 -22
- package/dist/utils/go-await.js.map +1 -0
- package/dist/utils/handle.d.ts +6 -4
- package/dist/utils/handle.js +44 -25
- package/dist/utils/handle.js.map +1 -0
- package/dist/utils/html-renderer.d.ts +3 -1
- package/dist/utils/html-renderer.js +25 -24
- package/dist/utils/html-renderer.js.map +1 -0
- package/dist/utils/index.d.ts +13 -13
- package/dist/utils/index.js +832 -21
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/parsers.d.ts +15 -13
- package/dist/utils/parsers.js +138 -188
- package/dist/utils/parsers.js.map +1 -0
- package/dist/utils/path-matcher.d.ts +3 -1
- package/dist/utils/path-matcher.js +68 -78
- package/dist/utils/path-matcher.js.map +1 -0
- package/dist/utils/request-validator.d.ts +13 -10
- package/dist/utils/request-validator.js +234 -84
- package/dist/utils/request-validator.js.map +1 -0
- package/dist/utils/response.d.ts +9 -7
- package/dist/utils/response.js +93 -102
- package/dist/utils/response.js.map +1 -0
- package/dist/utils/validators/schema-validator.d.ts +13 -9
- package/dist/utils/validators/schema-validator.js +228 -209
- package/dist/utils/validators/schema-validator.js.map +1 -0
- package/dist/utils/validators/schema-validators-ultra.d.ts +15 -12
- package/dist/utils/validators/schema-validators-ultra.js +233 -256
- package/dist/utils/validators/schema-validators-ultra.js.map +1 -0
- package/dist/utils/validators/validators.d.ts +15 -12
- package/dist/utils/validators/validators.js +81 -122
- package/dist/utils/validators/validators.js.map +1 -0
- package/package.json +5 -4
|
@@ -1,222 +1,241 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
/**
|
|
13
|
-
* 验证单个Schema配置项
|
|
14
|
-
* @param schema Schema定义
|
|
15
|
-
* @param data 要验证的数据
|
|
16
|
-
* @param fieldName 字段名称(用于错误标识)
|
|
17
|
-
* @returns 验证结果
|
|
18
|
-
*/
|
|
19
|
-
function validateSingleSchema(schema, data, fieldName) {
|
|
20
|
-
return validateSchema(schema, data);
|
|
1
|
+
// src/utils/validators/validators.ts
|
|
2
|
+
import { Type } from "@sinclair/typebox";
|
|
3
|
+
import { TypeCompiler } from "@sinclair/typebox/compiler";
|
|
4
|
+
var compilerCache = /* @__PURE__ */ new WeakMap();
|
|
5
|
+
function getCompiledValidator(schema) {
|
|
6
|
+
let compiler = compilerCache.get(schema);
|
|
7
|
+
if (!compiler) {
|
|
8
|
+
compiler = TypeCompiler.Compile(schema);
|
|
9
|
+
compilerCache.set(schema, compiler);
|
|
10
|
+
}
|
|
11
|
+
return compiler;
|
|
21
12
|
}
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
const validatedData = {};
|
|
31
|
-
// 验证body
|
|
32
|
-
if (config.body && data.body !== undefined) {
|
|
33
|
-
const result = validateSingleSchema(config.body, data.body, "body");
|
|
34
|
-
if (result.success) {
|
|
35
|
-
validatedData.body = result.data;
|
|
36
|
-
}
|
|
37
|
-
else {
|
|
38
|
-
errors.push({ field: "body", error: result });
|
|
39
|
-
}
|
|
40
|
-
}
|
|
41
|
-
else if (data.body !== undefined) {
|
|
42
|
-
validatedData.body = data.body;
|
|
43
|
-
}
|
|
44
|
-
// 验证query
|
|
45
|
-
if (config.query && data.query !== undefined) {
|
|
46
|
-
const result = validateSingleSchema(config.query, data.query, "query");
|
|
47
|
-
if (result.success) {
|
|
48
|
-
validatedData.query = result.data;
|
|
49
|
-
}
|
|
50
|
-
else {
|
|
51
|
-
errors.push({ field: "query", error: result });
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
|
-
else if (data.query !== undefined) {
|
|
55
|
-
validatedData.query = data.query;
|
|
56
|
-
}
|
|
57
|
-
// 验证params
|
|
58
|
-
if (config.params && data.params !== undefined) {
|
|
59
|
-
const result = validateSingleSchema(config.params, data.params, "params");
|
|
60
|
-
if (result.success) {
|
|
61
|
-
validatedData.params = result.data;
|
|
62
|
-
}
|
|
63
|
-
else {
|
|
64
|
-
errors.push({ field: "params", error: result });
|
|
65
|
-
}
|
|
66
|
-
}
|
|
67
|
-
else if (data.params !== undefined) {
|
|
68
|
-
validatedData.params = data.params;
|
|
69
|
-
}
|
|
70
|
-
// 验证headers
|
|
71
|
-
if (config.headers && data.headers !== undefined) {
|
|
72
|
-
const result = validateSingleSchema(config.headers, data.headers, "headers");
|
|
73
|
-
if (result.success) {
|
|
74
|
-
validatedData.headers = result.data;
|
|
75
|
-
}
|
|
76
|
-
else {
|
|
77
|
-
errors.push({ field: "headers", error: result });
|
|
78
|
-
}
|
|
79
|
-
}
|
|
80
|
-
else if (data.headers !== undefined) {
|
|
81
|
-
validatedData.headers = data.headers;
|
|
82
|
-
}
|
|
83
|
-
// 验证cookies
|
|
84
|
-
if (config.cookies && data.cookies !== undefined) {
|
|
85
|
-
const result = validateSingleSchema(config.cookies, data.cookies, "cookies");
|
|
86
|
-
if (result.success) {
|
|
87
|
-
validatedData.cookies = result.data;
|
|
88
|
-
}
|
|
89
|
-
else {
|
|
90
|
-
errors.push({ field: "cookies", error: result });
|
|
91
|
-
}
|
|
92
|
-
}
|
|
93
|
-
else if (data.cookies !== undefined) {
|
|
94
|
-
validatedData.cookies = data.cookies;
|
|
95
|
-
}
|
|
96
|
-
// 添加所有未配置但存在的数据字段
|
|
97
|
-
if (data.body !== undefined && !config.body) {
|
|
98
|
-
validatedData.body = data.body;
|
|
99
|
-
}
|
|
100
|
-
if (data.query !== undefined && !config.query) {
|
|
101
|
-
validatedData.query = data.query;
|
|
102
|
-
}
|
|
103
|
-
if (data.params !== undefined && !config.params) {
|
|
104
|
-
validatedData.params = data.params;
|
|
105
|
-
}
|
|
106
|
-
if (data.headers !== undefined && !config.headers) {
|
|
107
|
-
validatedData.headers = data.headers;
|
|
108
|
-
}
|
|
109
|
-
if (data.cookies !== undefined && !config.cookies) {
|
|
110
|
-
validatedData.cookies = data.cookies;
|
|
13
|
+
function validateSchema(schema, data) {
|
|
14
|
+
try {
|
|
15
|
+
const compiler = getCompiledValidator(schema);
|
|
16
|
+
if (compiler.Check(data)) {
|
|
17
|
+
return {
|
|
18
|
+
success: true,
|
|
19
|
+
data
|
|
20
|
+
};
|
|
111
21
|
}
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
22
|
+
const errors = [];
|
|
23
|
+
const errorIterator = compiler.Errors(data);
|
|
24
|
+
for (const error of errorIterator) {
|
|
25
|
+
errors.push({
|
|
26
|
+
path: error.path,
|
|
27
|
+
message: error.message,
|
|
28
|
+
code: "VALIDATION_FAILED",
|
|
29
|
+
value: error.value,
|
|
30
|
+
schema: error.schema
|
|
31
|
+
});
|
|
118
32
|
}
|
|
119
|
-
// 验证成功,返回验证后的数据
|
|
120
33
|
return {
|
|
121
|
-
|
|
122
|
-
|
|
34
|
+
success: false,
|
|
35
|
+
errors
|
|
123
36
|
};
|
|
124
|
-
}
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
const validatedData = {};
|
|
134
|
-
// 并行验证所有Schema以提高性能
|
|
135
|
-
const validationPromises = [];
|
|
136
|
-
// 收集所有需要验证的字段
|
|
137
|
-
if (config.body && data.body !== undefined) {
|
|
138
|
-
validationPromises.push(Promise.resolve({
|
|
139
|
-
field: "body",
|
|
140
|
-
result: validateSingleSchema(config.body, data.body, "body"),
|
|
141
|
-
}));
|
|
142
|
-
}
|
|
143
|
-
if (config.query && data.query !== undefined) {
|
|
144
|
-
validationPromises.push(Promise.resolve({
|
|
145
|
-
field: "query",
|
|
146
|
-
result: validateSingleSchema(config.query, data.query, "query"),
|
|
147
|
-
}));
|
|
148
|
-
}
|
|
149
|
-
if (config.params && data.params !== undefined) {
|
|
150
|
-
validationPromises.push(Promise.resolve({
|
|
151
|
-
field: "params",
|
|
152
|
-
result: validateSingleSchema(config.params, data.params, "params"),
|
|
153
|
-
}));
|
|
154
|
-
}
|
|
155
|
-
if (config.headers && data.headers !== undefined) {
|
|
156
|
-
validationPromises.push(Promise.resolve({
|
|
157
|
-
field: "headers",
|
|
158
|
-
result: validateSingleSchema(config.headers, data.headers, "headers"),
|
|
159
|
-
}));
|
|
160
|
-
}
|
|
161
|
-
if (config.cookies && data.cookies !== undefined) {
|
|
162
|
-
validationPromises.push(Promise.resolve({
|
|
163
|
-
field: "cookies",
|
|
164
|
-
result: validateSingleSchema(config.cookies, data.cookies, "cookies"),
|
|
165
|
-
}));
|
|
166
|
-
}
|
|
167
|
-
// 等待所有验证完成
|
|
168
|
-
const results = await Promise.all(validationPromises);
|
|
169
|
-
// 处理验证结果
|
|
170
|
-
for (const { field, result } of results) {
|
|
171
|
-
if (result.success) {
|
|
172
|
-
validatedData[field] = result.data;
|
|
173
|
-
}
|
|
174
|
-
else {
|
|
175
|
-
errors.push({ field, error: result });
|
|
37
|
+
} catch (error) {
|
|
38
|
+
return {
|
|
39
|
+
success: false,
|
|
40
|
+
errors: [
|
|
41
|
+
{
|
|
42
|
+
path: "",
|
|
43
|
+
message: error instanceof Error ? error.message : "Unknown validation error",
|
|
44
|
+
code: "VALIDATION_EXCEPTION",
|
|
45
|
+
value: data
|
|
176
46
|
}
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
}
|
|
196
|
-
|
|
47
|
+
]
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
// src/utils/validators/schema-validator.ts
|
|
53
|
+
function validateSingleSchema(schema, data, fieldName) {
|
|
54
|
+
return validateSchema(schema, data);
|
|
55
|
+
}
|
|
56
|
+
function validateSchemaConfig(config, data) {
|
|
57
|
+
const errors = [];
|
|
58
|
+
const validatedData = {};
|
|
59
|
+
if (config.body && data.body !== void 0) {
|
|
60
|
+
const result = validateSingleSchema(config.body, data.body, "body");
|
|
61
|
+
if (result.success) {
|
|
62
|
+
validatedData.body = result.data;
|
|
63
|
+
} else {
|
|
64
|
+
errors.push({ field: "body", error: result });
|
|
65
|
+
}
|
|
66
|
+
} else if (data.body !== void 0) {
|
|
67
|
+
validatedData.body = data.body;
|
|
68
|
+
}
|
|
69
|
+
if (config.query && data.query !== void 0) {
|
|
70
|
+
const result = validateSingleSchema(config.query, data.query, "query");
|
|
71
|
+
if (result.success) {
|
|
72
|
+
validatedData.query = result.data;
|
|
73
|
+
} else {
|
|
74
|
+
errors.push({ field: "query", error: result });
|
|
75
|
+
}
|
|
76
|
+
} else if (data.query !== void 0) {
|
|
77
|
+
validatedData.query = data.query;
|
|
78
|
+
}
|
|
79
|
+
if (config.params && data.params !== void 0) {
|
|
80
|
+
const result = validateSingleSchema(config.params, data.params, "params");
|
|
81
|
+
if (result.success) {
|
|
82
|
+
validatedData.params = result.data;
|
|
83
|
+
} else {
|
|
84
|
+
errors.push({ field: "params", error: result });
|
|
85
|
+
}
|
|
86
|
+
} else if (data.params !== void 0) {
|
|
87
|
+
validatedData.params = data.params;
|
|
88
|
+
}
|
|
89
|
+
if (config.headers && data.headers !== void 0) {
|
|
90
|
+
const result = validateSingleSchema(
|
|
91
|
+
config.headers,
|
|
92
|
+
data.headers,
|
|
93
|
+
"headers"
|
|
94
|
+
);
|
|
95
|
+
if (result.success) {
|
|
96
|
+
validatedData.headers = result.data;
|
|
97
|
+
} else {
|
|
98
|
+
errors.push({ field: "headers", error: result });
|
|
99
|
+
}
|
|
100
|
+
} else if (data.headers !== void 0) {
|
|
101
|
+
validatedData.headers = data.headers;
|
|
102
|
+
}
|
|
103
|
+
if (config.cookies && data.cookies !== void 0) {
|
|
104
|
+
const result = validateSingleSchema(
|
|
105
|
+
config.cookies,
|
|
106
|
+
data.cookies,
|
|
107
|
+
"cookies"
|
|
108
|
+
);
|
|
109
|
+
if (result.success) {
|
|
110
|
+
validatedData.cookies = result.data;
|
|
111
|
+
} else {
|
|
112
|
+
errors.push({ field: "cookies", error: result });
|
|
113
|
+
}
|
|
114
|
+
} else if (data.cookies !== void 0) {
|
|
115
|
+
validatedData.cookies = data.cookies;
|
|
116
|
+
}
|
|
117
|
+
if (data.body !== void 0 && !config.body) {
|
|
118
|
+
validatedData.body = data.body;
|
|
119
|
+
}
|
|
120
|
+
if (data.query !== void 0 && !config.query) {
|
|
121
|
+
validatedData.query = data.query;
|
|
122
|
+
}
|
|
123
|
+
if (data.params !== void 0 && !config.params) {
|
|
124
|
+
validatedData.params = data.params;
|
|
125
|
+
}
|
|
126
|
+
if (data.headers !== void 0 && !config.headers) {
|
|
127
|
+
validatedData.headers = data.headers;
|
|
128
|
+
}
|
|
129
|
+
if (data.cookies !== void 0 && !config.cookies) {
|
|
130
|
+
validatedData.cookies = data.cookies;
|
|
131
|
+
}
|
|
132
|
+
if (errors.length > 0) {
|
|
197
133
|
return {
|
|
198
|
-
|
|
199
|
-
|
|
134
|
+
success: false,
|
|
135
|
+
errors
|
|
200
136
|
};
|
|
137
|
+
}
|
|
138
|
+
return {
|
|
139
|
+
success: true,
|
|
140
|
+
data: validatedData
|
|
141
|
+
};
|
|
201
142
|
}
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
143
|
+
async function validateSchemaConfigAsync(config, data) {
|
|
144
|
+
const errors = [];
|
|
145
|
+
const validatedData = {};
|
|
146
|
+
const validationPromises = [];
|
|
147
|
+
if (config.body && data.body !== void 0) {
|
|
148
|
+
validationPromises.push(
|
|
149
|
+
Promise.resolve({
|
|
150
|
+
field: "body",
|
|
151
|
+
result: validateSingleSchema(config.body, data.body, "body")
|
|
152
|
+
})
|
|
153
|
+
);
|
|
154
|
+
}
|
|
155
|
+
if (config.query && data.query !== void 0) {
|
|
156
|
+
validationPromises.push(
|
|
157
|
+
Promise.resolve({
|
|
158
|
+
field: "query",
|
|
159
|
+
result: validateSingleSchema(config.query, data.query, "query")
|
|
160
|
+
})
|
|
161
|
+
);
|
|
162
|
+
}
|
|
163
|
+
if (config.params && data.params !== void 0) {
|
|
164
|
+
validationPromises.push(
|
|
165
|
+
Promise.resolve({
|
|
166
|
+
field: "params",
|
|
167
|
+
result: validateSingleSchema(config.params, data.params, "params")
|
|
168
|
+
})
|
|
169
|
+
);
|
|
170
|
+
}
|
|
171
|
+
if (config.headers && data.headers !== void 0) {
|
|
172
|
+
validationPromises.push(
|
|
173
|
+
Promise.resolve({
|
|
174
|
+
field: "headers",
|
|
175
|
+
result: validateSingleSchema(config.headers, data.headers, "headers")
|
|
176
|
+
})
|
|
177
|
+
);
|
|
178
|
+
}
|
|
179
|
+
if (config.cookies && data.cookies !== void 0) {
|
|
180
|
+
validationPromises.push(
|
|
181
|
+
Promise.resolve({
|
|
182
|
+
field: "cookies",
|
|
183
|
+
result: validateSingleSchema(config.cookies, data.cookies, "cookies")
|
|
184
|
+
})
|
|
185
|
+
);
|
|
186
|
+
}
|
|
187
|
+
const results = await Promise.all(validationPromises);
|
|
188
|
+
for (const { field, result } of results) {
|
|
189
|
+
if (result.success) {
|
|
190
|
+
validatedData[field] = result.data;
|
|
191
|
+
} else {
|
|
192
|
+
errors.push({ field, error: result });
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
if (data.body !== void 0 && !config.body) validatedData.body = data.body;
|
|
196
|
+
if (data.query !== void 0 && !config.query)
|
|
197
|
+
validatedData.query = data.query;
|
|
198
|
+
if (data.params !== void 0 && !config.params)
|
|
199
|
+
validatedData.params = data.params;
|
|
200
|
+
if (data.headers !== void 0 && !config.headers)
|
|
201
|
+
validatedData.headers = data.headers;
|
|
202
|
+
if (data.cookies !== void 0 && !config.cookies)
|
|
203
|
+
validatedData.cookies = data.cookies;
|
|
204
|
+
if (errors.length > 0) {
|
|
205
|
+
return {
|
|
206
|
+
success: false,
|
|
207
|
+
errors
|
|
210
208
|
};
|
|
209
|
+
}
|
|
210
|
+
return {
|
|
211
|
+
success: true,
|
|
212
|
+
data: validatedData
|
|
213
|
+
};
|
|
214
|
+
}
|
|
215
|
+
function createSchemaValidator(config) {
|
|
216
|
+
return (data) => {
|
|
217
|
+
return validateSchemaConfig(config, data);
|
|
218
|
+
};
|
|
211
219
|
}
|
|
220
|
+
function createAsyncSchemaValidator(config) {
|
|
221
|
+
return (data) => {
|
|
222
|
+
return validateSchemaConfigAsync(config, data);
|
|
223
|
+
};
|
|
224
|
+
}
|
|
225
|
+
export {
|
|
226
|
+
createAsyncSchemaValidator,
|
|
227
|
+
createSchemaValidator,
|
|
228
|
+
validateSchemaConfig,
|
|
229
|
+
validateSchemaConfigAsync
|
|
230
|
+
};
|
|
212
231
|
/**
|
|
213
|
-
*
|
|
214
|
-
*
|
|
215
|
-
*
|
|
232
|
+
* Schema配置验证器
|
|
233
|
+
*
|
|
234
|
+
* 使用validateSchema函数对SchemaConfig结构的数据进行验证
|
|
235
|
+
* 提供统一的验证接口和错误处理
|
|
236
|
+
*
|
|
237
|
+
* @author Framework Team
|
|
238
|
+
* @version 1.0.0
|
|
239
|
+
* @license MIT
|
|
216
240
|
*/
|
|
217
|
-
|
|
218
|
-
return (data) => {
|
|
219
|
-
return validateSchemaConfigAsync(config, data);
|
|
220
|
-
};
|
|
221
|
-
}
|
|
222
|
-
// 类型已经在上面定义并导出,无需重复导出
|
|
241
|
+
//# sourceMappingURL=schema-validator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/utils/validators/validators.ts","../../../src/utils/validators/schema-validator.ts"],"sourcesContent":["// src/utils/validators.ts\n/**\n * 高性能 Schema 验证器\n *\n * 使用 TypeBox TypeCompiler 进行 JIT 编译\n * 编译后的验证器会被缓存,避免重复编译开销\n *\n * @version 2.0.0 - 添加预编译缓存\n */\n\nimport { Type } from \"@sinclair/typebox\";\nimport type { Static, TSchema } from \"@sinclair/typebox\";\nimport { TypeCompiler, type TypeCheck } from \"@sinclair/typebox/compiler\";\n\n/** 验证错误接口 */\nexport interface ValidationError {\n path: string;\n message: string;\n code: string;\n value?: unknown;\n schema?: unknown;\n}\n\n/** 验证失败结果接口 */\nexport interface ValidationFailure {\n success: false;\n errors: ValidationError[];\n}\n\n/** 验证成功结果接口 */\nexport interface ValidationSuccess<T> {\n success: true;\n data: T;\n}\n\n/** 验证结果联合类型 */\nexport type ValidationResult<T = unknown> =\n | ValidationSuccess<T>\n | ValidationFailure;\n\n/**\n * 编译器缓存\n * 使用 WeakMap 避免内存泄漏(Schema 对象被垃圾回收时,缓存也会自动清理)\n */\nconst compilerCache = new WeakMap<TSchema, TypeCheck<TSchema>>();\n\n/**\n * 获取或创建编译后的验证器\n * @param schema TypeBox Schema\n * @returns 编译后的验证器\n */\nfunction getCompiledValidator<T extends TSchema>(schema: T): TypeCheck<T> {\n let compiler = compilerCache.get(schema);\n if (!compiler) {\n compiler = TypeCompiler.Compile(schema);\n compilerCache.set(schema, compiler);\n }\n return compiler as TypeCheck<T>;\n}\n\n/**\n * 预编译 Schema(在启动时调用,避免首次请求的编译开销)\n * @param schemas 要预编译的 Schema 数组\n */\nexport function precompileSchemas(schemas: TSchema[]): void {\n for (const schema of schemas) {\n getCompiledValidator(schema);\n }\n}\n\n/**\n * 使用TypeBox Schema验证数据(带缓存优化)\n * @param schema TypeBox Schema\n * @param data 要验证的数据\n * @returns 验证结果,包含类型安全的数据或详细错误信息\n */\nexport function validateSchema<T extends TSchema>(\n schema: T,\n data: unknown,\n): ValidationResult<Static<T>> {\n try {\n // 从缓存获取或编译验证器\n const compiler = getCompiledValidator(schema);\n\n if (compiler.Check(data)) {\n return {\n success: true,\n data: data as Static<T>,\n };\n }\n\n // 验证失败时,使用Errors函数生成详细的错误信息\n const errors: ValidationError[] = [];\n const errorIterator = compiler.Errors(data);\n\n // 收集所有错误(可以根据需要限制数量)\n for (const error of errorIterator) {\n errors.push({\n path: error.path,\n message: error.message,\n code: \"VALIDATION_FAILED\",\n value: error.value,\n schema: error.schema,\n });\n }\n\n return {\n success: false,\n errors,\n };\n } catch (error) {\n // 处理验证过程中的异常\n return {\n success: false,\n errors: [\n {\n path: \"\",\n message:\n error instanceof Error ? error.message : \"Unknown validation error\",\n code: \"VALIDATION_EXCEPTION\",\n value: data,\n },\n ],\n };\n }\n}\n\n/**\n * 创建类型特化的验证器(最高性能)\n * 适用于频繁验证同一 Schema 的场景\n * @param schema TypeBox Schema\n * @returns 类型安全的验证函数\n */\nexport function createValidator<T extends TSchema>(\n schema: T,\n): (data: unknown) => ValidationResult<Static<T>> {\n const compiler = getCompiledValidator(schema);\n\n return (data: unknown): ValidationResult<Static<T>> => {\n if (compiler.Check(data)) {\n return { success: true, data: data as Static<T> };\n }\n\n const errors: ValidationError[] = [];\n for (const error of compiler.Errors(data)) {\n errors.push({\n path: error.path,\n message: error.message,\n code: \"VALIDATION_FAILED\",\n value: error.value,\n schema: error.schema,\n });\n }\n return { success: false, errors };\n };\n}\n\n/**\n * 快速验证(只返回布尔值,不收集错误)\n * 适用于只需要知道验证结果的场景\n * @param schema TypeBox Schema\n * @param data 要验证的数据\n * @returns 验证是否通过\n */\nexport function validateFast<T extends TSchema>(\n schema: T,\n data: unknown,\n): data is Static<T> {\n const compiler = getCompiledValidator(schema);\n return compiler.Check(data);\n}\n\n/**\n * 获取缓存统计信息(用于调试)\n */\nexport function getValidatorCacheStats(): { cacheType: string; note: string } {\n return {\n cacheType: \"WeakMap\",\n note: \"WeakMap 不支持 size 属性,缓存会随 Schema 对象自动清理\",\n };\n}\n\n// 导出常用的TypeBox类型,方便使用\nexport { Type, Static, TSchema };\n","/**\n * Schema配置验证器\n *\n * 使用validateSchema函数对SchemaConfig结构的数据进行验证\n * 提供统一的验证接口和错误处理\n *\n * @author Framework Team\n * @version 1.0.0\n * @license MIT\n */\n\nimport type { TSchema } from \"@sinclair/typebox\";\nimport { validateSchema, type ValidationResult } from \"./validators\";\n\n// 统一的Schema配置接口\nexport interface SchemaConfig {\n body?: TSchema;\n query?: TSchema;\n params?: TSchema;\n headers?: TSchema;\n cookies?: TSchema;\n}\n\n// 请求数据结构接口\nexport interface RequestData {\n body?: unknown;\n query?: unknown;\n params?: unknown;\n headers?: unknown;\n cookies?: unknown;\n}\n\n// 验证结果数据结构\nexport interface SchemaValidationResult {\n success: boolean;\n data?: {\n body?: unknown;\n query?: unknown;\n params?: unknown;\n headers?: unknown;\n cookies?: unknown;\n };\n errors?: Array<{\n field: keyof SchemaConfig;\n error: ValidationResult<unknown>;\n }>;\n}\n\n/**\n * 验证单个Schema配置项\n * @param schema Schema定义\n * @param data 要验证的数据\n * @param fieldName 字段名称(用于错误标识)\n * @returns 验证结果\n */\nfunction validateSingleSchema(\n schema: TSchema,\n data: unknown,\n fieldName: keyof SchemaConfig,\n): ValidationResult<unknown> {\n return validateSchema(schema, data);\n}\n\n/**\n * 使用SchemaConfig验证完整的请求数据\n * @param config Schema配置\n * @param data 请求数据\n * @returns 验证结果\n */\nexport function validateSchemaConfig(\n config: SchemaConfig,\n data: RequestData,\n): SchemaValidationResult {\n const errors: Array<{\n field: keyof SchemaConfig;\n error: ValidationResult<unknown>;\n }> = [];\n const validatedData: RequestData = {};\n\n // 验证body\n if (config.body && data.body !== undefined) {\n const result = validateSingleSchema(config.body, data.body, \"body\");\n if (result.success) {\n validatedData.body = result.data;\n } else {\n errors.push({ field: \"body\", error: result });\n }\n } else if (data.body !== undefined) {\n validatedData.body = data.body;\n }\n\n // 验证query\n if (config.query && data.query !== undefined) {\n const result = validateSingleSchema(config.query, data.query, \"query\");\n if (result.success) {\n validatedData.query = result.data;\n } else {\n errors.push({ field: \"query\", error: result });\n }\n } else if (data.query !== undefined) {\n validatedData.query = data.query;\n }\n\n // 验证params\n if (config.params && data.params !== undefined) {\n const result = validateSingleSchema(config.params, data.params, \"params\");\n if (result.success) {\n validatedData.params = result.data;\n } else {\n errors.push({ field: \"params\", error: result });\n }\n } else if (data.params !== undefined) {\n validatedData.params = data.params;\n }\n\n // 验证headers\n if (config.headers && data.headers !== undefined) {\n const result = validateSingleSchema(\n config.headers,\n data.headers,\n \"headers\",\n );\n if (result.success) {\n validatedData.headers = result.data;\n } else {\n errors.push({ field: \"headers\", error: result });\n }\n } else if (data.headers !== undefined) {\n validatedData.headers = data.headers;\n }\n\n // 验证cookies\n if (config.cookies && data.cookies !== undefined) {\n const result = validateSingleSchema(\n config.cookies,\n data.cookies,\n \"cookies\",\n );\n if (result.success) {\n validatedData.cookies = result.data;\n } else {\n errors.push({ field: \"cookies\", error: result });\n }\n } else if (data.cookies !== undefined) {\n validatedData.cookies = data.cookies;\n }\n\n // 添加所有未配置但存在的数据字段\n if (data.body !== undefined && !config.body) {\n validatedData.body = data.body;\n }\n if (data.query !== undefined && !config.query) {\n validatedData.query = data.query;\n }\n if (data.params !== undefined && !config.params) {\n validatedData.params = data.params;\n }\n if (data.headers !== undefined && !config.headers) {\n validatedData.headers = data.headers;\n }\n if (data.cookies !== undefined && !config.cookies) {\n validatedData.cookies = data.cookies;\n }\n\n // 如果有错误,返回失败结果\n if (errors.length > 0) {\n return {\n success: false,\n errors,\n };\n }\n\n // 验证成功,返回验证后的数据\n return {\n success: true,\n data: validatedData,\n };\n}\n\n/**\n * 异步验证SchemaConfig(支持异步验证器)\n * @param config Schema配置\n * @param data 请求数据\n * @returns Promise<验证结果>\n */\nexport async function validateSchemaConfigAsync(\n config: SchemaConfig,\n data: RequestData,\n): Promise<SchemaValidationResult> {\n const errors: Array<{\n field: keyof SchemaConfig;\n error: ValidationResult<unknown>;\n }> = [];\n const validatedData: RequestData = {};\n\n // 并行验证所有Schema以提高性能\n const validationPromises: Array<\n Promise<{ field: keyof SchemaConfig; result: ValidationResult<unknown> }>\n > = [];\n\n // 收集所有需要验证的字段\n if (config.body && data.body !== undefined) {\n validationPromises.push(\n Promise.resolve({\n field: \"body\" as keyof SchemaConfig,\n result: validateSingleSchema(config.body, data.body, \"body\"),\n }),\n );\n }\n if (config.query && data.query !== undefined) {\n validationPromises.push(\n Promise.resolve({\n field: \"query\" as keyof SchemaConfig,\n result: validateSingleSchema(config.query, data.query, \"query\"),\n }),\n );\n }\n if (config.params && data.params !== undefined) {\n validationPromises.push(\n Promise.resolve({\n field: \"params\" as keyof SchemaConfig,\n result: validateSingleSchema(config.params, data.params, \"params\"),\n }),\n );\n }\n if (config.headers && data.headers !== undefined) {\n validationPromises.push(\n Promise.resolve({\n field: \"headers\" as keyof SchemaConfig,\n result: validateSingleSchema(config.headers, data.headers, \"headers\"),\n }),\n );\n }\n if (config.cookies && data.cookies !== undefined) {\n validationPromises.push(\n Promise.resolve({\n field: \"cookies\" as keyof SchemaConfig,\n result: validateSingleSchema(config.cookies, data.cookies, \"cookies\"),\n }),\n );\n }\n\n // 等待所有验证完成\n const results = await Promise.all(validationPromises);\n\n // 处理验证结果\n for (const { field, result } of results) {\n if (result.success) {\n validatedData[field] = result.data;\n } else {\n errors.push({ field, error: result });\n }\n }\n\n // 添加未验证但存在的数据\n if (data.body !== undefined && !config.body) validatedData.body = data.body;\n if (data.query !== undefined && !config.query)\n validatedData.query = data.query;\n if (data.params !== undefined && !config.params)\n validatedData.params = data.params;\n if (data.headers !== undefined && !config.headers)\n validatedData.headers = data.headers;\n if (data.cookies !== undefined && !config.cookies)\n validatedData.cookies = data.cookies;\n\n // 如果有错误,返回失败结果\n if (errors.length > 0) {\n return {\n success: false,\n errors,\n };\n }\n\n // 验证成功,返回验证后的数据\n return {\n success: true,\n data: validatedData,\n };\n}\n\n/**\n * 创建验证器工厂函数\n * @param config Schema配置\n * @returns 验证器函数\n */\nexport function createSchemaValidator(config: SchemaConfig) {\n return (data: RequestData): SchemaValidationResult => {\n return validateSchemaConfig(config, data);\n };\n}\n\n/**\n * 创建异步验证器工厂函数\n * @param config Schema配置\n * @returns 异步验证器函数\n */\nexport function createAsyncSchemaValidator(config: SchemaConfig) {\n return (data: RequestData): Promise<SchemaValidationResult> => {\n return validateSchemaConfigAsync(config, data);\n };\n}\n\n// 类型已经在上面定义并导出,无需重复导出\n"],"mappings":"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","names":[]}
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import { TSchema } from '@sinclair/typebox';
|
|
2
|
+
|
|
1
3
|
/**
|
|
2
4
|
* 超优化版Schema验证器 v5.0.0
|
|
3
5
|
*
|
|
@@ -17,26 +19,26 @@
|
|
|
17
19
|
* @version 5.0.0
|
|
18
20
|
* @license MIT
|
|
19
21
|
*/
|
|
20
|
-
|
|
21
|
-
|
|
22
|
+
|
|
23
|
+
interface SchemaConfig {
|
|
22
24
|
body?: TSchema;
|
|
23
25
|
query?: TSchema;
|
|
24
26
|
params?: TSchema;
|
|
25
27
|
headers?: TSchema;
|
|
26
28
|
cookies?: TSchema;
|
|
27
29
|
}
|
|
28
|
-
|
|
29
|
-
|
|
30
|
+
declare function validateSchemaUltra(schema: TSchema | undefined, data: any, context: string): any;
|
|
31
|
+
declare function validateAllSchemasUltra(config: SchemaConfig, data: {
|
|
30
32
|
body: any;
|
|
31
33
|
query: any;
|
|
32
34
|
params: any;
|
|
33
35
|
headers: any;
|
|
34
36
|
cookies: any;
|
|
35
37
|
}): any;
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
38
|
+
declare function precompileSchemasUltra(config: SchemaConfig): void;
|
|
39
|
+
declare function createTypedValidatorUltra<T>(schema: TSchema): (data: T) => T;
|
|
40
|
+
declare function validateBatchUltra<T>(schema: TSchema, dataArray: T[]): T[];
|
|
41
|
+
declare function getCacheStats(): {
|
|
40
42
|
totalSchemas: number;
|
|
41
43
|
totalHits: number;
|
|
42
44
|
hitRate: string;
|
|
@@ -45,7 +47,8 @@ export declare function getCacheStats(): {
|
|
|
45
47
|
stringPoolSize: number;
|
|
46
48
|
memoryEfficiency: string;
|
|
47
49
|
};
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
50
|
+
declare function smartClearUltraCache(keepTop?: number): void;
|
|
51
|
+
declare function clearUltraCache(): void;
|
|
52
|
+
declare function withPerformanceMonitoring<T extends (...args: any[]) => any>(fn: T, name: string): T;
|
|
53
|
+
|
|
54
|
+
export { type SchemaConfig, clearUltraCache as clearCache, clearUltraCache, createTypedValidatorUltra as createTypedValidator, createTypedValidatorUltra, getCacheStats, precompileSchemasUltra, smartClearUltraCache as smartClearCache, smartClearUltraCache, validateAllSchemasUltra as validateAllSchemas, validateAllSchemasUltra, validateBatchUltra as validateBatch, validateBatchUltra, validateSchemaUltra, withPerformanceMonitoring };
|