@hestjs/validation 0.1.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.
@@ -0,0 +1,221 @@
1
+ import { type TSchema } from "@sinclair/typebox";
2
+ import "reflect-metadata";
3
+ /**
4
+ * 自定义验证装饰器 - 允许用户完全使用 TypeBox API
5
+ *
6
+ * @param schema TypeBox schema
7
+ * @param options 验证选项
8
+ *
9
+ * @example
10
+ * ```typescript
11
+ * import { Type } from '@sinclair/typebox';
12
+ * import { Custom } from '@hestjs/validation';
13
+ *
14
+ * class UserDto {
15
+ * // 自定义字符串验证
16
+ * @Custom(Type.String({ minLength: 3, maxLength: 20, pattern: '^[a-zA-Z]+$' }))
17
+ * username!: string;
18
+ *
19
+ * // 自定义数字验证
20
+ * @Custom(Type.Number({ minimum: 18, maximum: 65, multipleOf: 1 }))
21
+ * age!: number;
22
+ *
23
+ * // 自定义联合类型
24
+ * @Custom(Type.Union([Type.Literal('admin'), Type.Literal('user'), Type.Literal('guest')]))
25
+ * role!: 'admin' | 'user' | 'guest';
26
+ *
27
+ * // 自定义数组验证
28
+ * @Custom(Type.Array(Type.String({ format: 'email' }), { minItems: 1, maxItems: 5 }))
29
+ * emails!: string[];
30
+ *
31
+ * // 自定义对象验证
32
+ * @Custom(Type.Object({
33
+ * street: Type.String(),
34
+ * city: Type.String(),
35
+ * zipCode: Type.String({ pattern: '^\\d{5}$' })
36
+ * }))
37
+ * address!: { street: string; city: string; zipCode: string };
38
+ *
39
+ * // 自定义日期验证
40
+ * @Custom(Type.String({ format: 'date-time' }))
41
+ * createdAt!: string;
42
+ *
43
+ * // 复杂的条件验证
44
+ * @Custom(Type.Intersect([
45
+ * Type.Object({ type: Type.Literal('premium') }),
46
+ * Type.Object({ features: Type.Array(Type.String(), { minItems: 1 }) })
47
+ * ]))
48
+ * subscription?: { type: 'premium'; features: string[] };
49
+ * }
50
+ * ```
51
+ */
52
+ export declare function Custom(schema: any, options?: {
53
+ message?: string;
54
+ optional?: boolean;
55
+ }): (target: any, propertyKey: string | symbol) => void;
56
+ /**
57
+ * TypeBox Schema 工厂类 - 提供常用的 schema 构建器
58
+ */
59
+ export declare class SchemaFactory {
60
+ /**
61
+ * 创建枚举 schema
62
+ */
63
+ static enum<T extends readonly string[]>(values: T, options?: {
64
+ message?: string;
65
+ }): import("@sinclair/typebox").TUnion<import("@sinclair/typebox").TLiteral<string>[]>;
66
+ /**
67
+ * 创建条件 schema
68
+ */
69
+ static conditional(condition: TSchema, thenSchema: TSchema, elseSchema: TSchema): import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TIntersect<[TSchema, TSchema]>, import("@sinclair/typebox").TIntersect<[import("@sinclair/typebox").TNot<TSchema>, TSchema]>]>;
70
+ /**
71
+ * 创建递归 schema
72
+ */
73
+ static recursive<T>(callback: (self: TSchema) => TSchema): import("@sinclair/typebox").TRecursive<TSchema>;
74
+ /**
75
+ * 创建模板字符串 schema
76
+ */
77
+ static template(pattern: string): import("@sinclair/typebox").TString;
78
+ /**
79
+ * 创建范围验证 schema
80
+ */
81
+ static range(min: number, max: number, options?: {
82
+ exclusive?: boolean;
83
+ }): import("@sinclair/typebox").TNumber;
84
+ /**
85
+ * 创建文件验证 schema
86
+ */
87
+ static file(options?: {
88
+ maxSize?: number;
89
+ allowedTypes?: string[];
90
+ required?: boolean;
91
+ }): import("@sinclair/typebox").TObject<{
92
+ filename: import("@sinclair/typebox").TString;
93
+ mimetype: import("@sinclair/typebox").TString;
94
+ size: import("@sinclair/typebox").TNumber;
95
+ buffer: import("@sinclair/typebox").TAny;
96
+ }> | import("@sinclair/typebox").TIntersect<[import("@sinclair/typebox").TObject<{
97
+ filename: import("@sinclair/typebox").TString;
98
+ mimetype: import("@sinclair/typebox").TString;
99
+ size: import("@sinclair/typebox").TNumber;
100
+ buffer: import("@sinclair/typebox").TAny;
101
+ }>, import("@sinclair/typebox").TObject<{
102
+ size: import("@sinclair/typebox").TNumber;
103
+ }>]> | import("@sinclair/typebox").TIntersect<[import("@sinclair/typebox").TObject<{
104
+ filename: import("@sinclair/typebox").TString;
105
+ mimetype: import("@sinclair/typebox").TString;
106
+ size: import("@sinclair/typebox").TNumber;
107
+ buffer: import("@sinclair/typebox").TAny;
108
+ }>, import("@sinclair/typebox").TObject<{
109
+ mimetype: import("@sinclair/typebox").TUnion<import("@sinclair/typebox").TLiteral<string>[]>;
110
+ }>]>;
111
+ /**
112
+ * 创建分页参数 schema
113
+ */
114
+ static pagination(): import("@sinclair/typebox").TObject<{
115
+ page: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
116
+ limit: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
117
+ sort: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
118
+ order: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"asc">, import("@sinclair/typebox").TLiteral<"desc">]>>;
119
+ }>;
120
+ /**
121
+ * 创建搜索参数 schema
122
+ */
123
+ static search(): import("@sinclair/typebox").TObject<{
124
+ q: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
125
+ fields: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TArray<import("@sinclair/typebox").TString>>;
126
+ filters: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TRecord<import("@sinclair/typebox").TString, import("@sinclair/typebox").TAny>>;
127
+ }>;
128
+ /**
129
+ * 创建 UUID schema
130
+ */
131
+ static uuid(): import("@sinclair/typebox").TString;
132
+ /**
133
+ * 创建 MongoDB ObjectId schema
134
+ */
135
+ static objectId(): import("@sinclair/typebox").TString;
136
+ /**
137
+ * 创建颜色值 schema (hex)
138
+ */
139
+ static hexColor(): import("@sinclair/typebox").TString;
140
+ /**
141
+ * 创建信用卡号 schema
142
+ */
143
+ static creditCard(): import("@sinclair/typebox").TString;
144
+ /**
145
+ * 创建手机号 schema (中国)
146
+ */
147
+ static chinesePhoneNumber(): import("@sinclair/typebox").TString;
148
+ /**
149
+ * 创建身份证号 schema (中国)
150
+ */
151
+ static chineseIdCard(): import("@sinclair/typebox").TString;
152
+ }
153
+ /**
154
+ * 预定义的常用验证装饰器
155
+ */
156
+ export declare class CommonValidators {
157
+ /**
158
+ * UUID 验证
159
+ */
160
+ static UUID(options?: {
161
+ message?: string;
162
+ optional?: boolean;
163
+ }): (target: any, propertyKey: string | symbol) => void;
164
+ /**
165
+ * ObjectId 验证
166
+ */
167
+ static ObjectId(options?: {
168
+ message?: string;
169
+ optional?: boolean;
170
+ }): (target: any, propertyKey: string | symbol) => void;
171
+ /**
172
+ * 十六进制颜色验证
173
+ */
174
+ static HexColor(options?: {
175
+ message?: string;
176
+ optional?: boolean;
177
+ }): (target: any, propertyKey: string | symbol) => void;
178
+ /**
179
+ * 信用卡号验证
180
+ */
181
+ static CreditCard(options?: {
182
+ message?: string;
183
+ optional?: boolean;
184
+ }): (target: any, propertyKey: string | symbol) => void;
185
+ /**
186
+ * 中国手机号验证
187
+ */
188
+ static ChinesePhone(options?: {
189
+ message?: string;
190
+ optional?: boolean;
191
+ }): (target: any, propertyKey: string | symbol) => void;
192
+ /**
193
+ * 中国身份证号验证
194
+ */
195
+ static ChineseIdCard(options?: {
196
+ message?: string;
197
+ optional?: boolean;
198
+ }): (target: any, propertyKey: string | symbol) => void;
199
+ /**
200
+ * JSON 字符串验证
201
+ */
202
+ static JsonString(options?: {
203
+ message?: string;
204
+ optional?: boolean;
205
+ }): (target: any, propertyKey: string | symbol) => void;
206
+ /**
207
+ * Base64 字符串验证
208
+ */
209
+ static Base64(options?: {
210
+ message?: string;
211
+ optional?: boolean;
212
+ }): (target: any, propertyKey: string | symbol) => void;
213
+ /**
214
+ * IP 地址验证
215
+ */
216
+ static IPAddress(version?: "v4" | "v6", options?: {
217
+ message?: string;
218
+ optional?: boolean;
219
+ }): (target: any, propertyKey: string | symbol) => void;
220
+ }
221
+ //# sourceMappingURL=custom.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"custom.d.ts","sourceRoot":"","sources":["../../src/decorators/custom.ts"],"names":[],"mappings":"AAAA,OAAO,EAAQ,KAAK,OAAO,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,kBAAkB,CAAC;AAO1B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgDG;AACH,wBAAgB,MAAM,CACpB,MAAM,EAAE,GAAG,EACX,OAAO,GAAE;IAAE,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,OAAO,CAAA;CAAO,IAErC,QAAQ,GAAG,EAAE,aAAa,MAAM,GAAG,MAAM,UAoB3D;AAED;;GAEG;AACH,qBAAa,aAAa;IACxB;;OAEG;IACH,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,SAAS,MAAM,EAAE,EACrC,MAAM,EAAE,CAAC,EACT,OAAO,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE;IAKhC;;OAEG;IACH,MAAM,CAAC,WAAW,CAChB,SAAS,EAAE,OAAO,EAClB,UAAU,EAAE,OAAO,EACnB,UAAU,EAAE,OAAO;IAQrB;;OAEG;IACH,MAAM,CAAC,SAAS,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,OAAO;IAIxD;;OAEG;IACH,MAAM,CAAC,QAAQ,CAAC,OAAO,EAAE,MAAM;IAI/B;;OAEG;IACH,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,OAAO,CAAA;KAAE;IAaxE;;OAEG;IACH,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE;QACpB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;QACxB,QAAQ,CAAC,EAAE,OAAO,CAAC;KACpB;;;;;;;;;;;;;;;;;;;;IA+BD;;OAEG;IACH,MAAM,CAAC,UAAU;;;;;;IAajB;;OAEG;IACH,MAAM,CAAC,MAAM;;;;;IAQb;;OAEG;IACH,MAAM,CAAC,IAAI;IAOX;;OAEG;IACH,MAAM,CAAC,QAAQ;IAQf;;OAEG;IACH,MAAM,CAAC,QAAQ;IAMf;;OAEG;IACH,MAAM,CAAC,UAAU;IAOjB;;OAEG;IACH,MAAM,CAAC,kBAAkB;IAMzB;;OAEG;IACH,MAAM,CAAC,aAAa;CAMrB;AAED;;GAEG;AACH,qBAAa,gBAAgB;IAC3B;;OAEG;IACH,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,OAAO,CAAA;KAAE,YApNrC,GAAG,eAAe,MAAM,GAAG,MAAM;IAwN1D;;OAEG;IACH,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,OAAO,CAAA;KAAE,YA3NzC,GAAG,eAAe,MAAM,GAAG,MAAM;IA+N1D;;OAEG;IACH,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,OAAO,CAAA;KAAE,YAlOzC,GAAG,eAAe,MAAM,GAAG,MAAM;IAsO1D;;OAEG;IACH,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,OAAO,CAAA;KAAE,YAzO3C,GAAG,eAAe,MAAM,GAAG,MAAM;IA6O1D;;OAEG;IACH,MAAM,CAAC,YAAY,CAAC,OAAO,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,OAAO,CAAA;KAAE,YAhP7C,GAAG,eAAe,MAAM,GAAG,MAAM;IAoP1D;;OAEG;IACH,MAAM,CAAC,aAAa,CAAC,OAAO,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,OAAO,CAAA;KAAE,YAvP9C,GAAG,eAAe,MAAM,GAAG,MAAM;IA2P1D;;OAEG;IACH,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,OAAO,CAAA;KAAE,YA9P3C,GAAG,eAAe,MAAM,GAAG,MAAM;IAqQ1D;;OAEG;IACH,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,OAAO,CAAA;KAAE,YAxQvC,GAAG,eAAe,MAAM,GAAG,MAAM;IAiR1D;;OAEG;IACH,MAAM,CAAC,SAAS,CACd,OAAO,CAAC,EAAE,IAAI,GAAG,IAAI,EACrB,OAAO,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,OAAO,CAAA;KAAE,YAtR3B,GAAG,eAAe,MAAM,GAAG,MAAM;CAmS3D"}
@@ -0,0 +1,283 @@
1
+ import { Type } from "@sinclair/typebox";
2
+ import "reflect-metadata";
3
+ import { VALIDATION_METADATA_KEY, } from "./validation";
4
+ /**
5
+ * 自定义验证装饰器 - 允许用户完全使用 TypeBox API
6
+ *
7
+ * @param schema TypeBox schema
8
+ * @param options 验证选项
9
+ *
10
+ * @example
11
+ * ```typescript
12
+ * import { Type } from '@sinclair/typebox';
13
+ * import { Custom } from '@hestjs/validation';
14
+ *
15
+ * class UserDto {
16
+ * // 自定义字符串验证
17
+ * @Custom(Type.String({ minLength: 3, maxLength: 20, pattern: '^[a-zA-Z]+$' }))
18
+ * username!: string;
19
+ *
20
+ * // 自定义数字验证
21
+ * @Custom(Type.Number({ minimum: 18, maximum: 65, multipleOf: 1 }))
22
+ * age!: number;
23
+ *
24
+ * // 自定义联合类型
25
+ * @Custom(Type.Union([Type.Literal('admin'), Type.Literal('user'), Type.Literal('guest')]))
26
+ * role!: 'admin' | 'user' | 'guest';
27
+ *
28
+ * // 自定义数组验证
29
+ * @Custom(Type.Array(Type.String({ format: 'email' }), { minItems: 1, maxItems: 5 }))
30
+ * emails!: string[];
31
+ *
32
+ * // 自定义对象验证
33
+ * @Custom(Type.Object({
34
+ * street: Type.String(),
35
+ * city: Type.String(),
36
+ * zipCode: Type.String({ pattern: '^\\d{5}$' })
37
+ * }))
38
+ * address!: { street: string; city: string; zipCode: string };
39
+ *
40
+ * // 自定义日期验证
41
+ * @Custom(Type.String({ format: 'date-time' }))
42
+ * createdAt!: string;
43
+ *
44
+ * // 复杂的条件验证
45
+ * @Custom(Type.Intersect([
46
+ * Type.Object({ type: Type.Literal('premium') }),
47
+ * Type.Object({ features: Type.Array(Type.String(), { minItems: 1 }) })
48
+ * ]))
49
+ * subscription?: { type: 'premium'; features: string[] };
50
+ * }
51
+ * ```
52
+ */
53
+ export function Custom(schema, options = {}) {
54
+ return function (target, propertyKey) {
55
+ const existingMetadata = Reflect.getMetadata(VALIDATION_METADATA_KEY, target.constructor) || { properties: [] };
56
+ const propertyMetadata = {
57
+ propertyKey,
58
+ schema: schema,
59
+ isOptional: options.optional,
60
+ message: options.message,
61
+ };
62
+ existingMetadata.properties.push(propertyMetadata);
63
+ Reflect.defineMetadata(VALIDATION_METADATA_KEY, existingMetadata, target.constructor);
64
+ };
65
+ }
66
+ /**
67
+ * TypeBox Schema 工厂类 - 提供常用的 schema 构建器
68
+ */
69
+ export class SchemaFactory {
70
+ /**
71
+ * 创建枚举 schema
72
+ */
73
+ static enum(values, options) {
74
+ return Type.Union(values.map((value) => Type.Literal(value)));
75
+ }
76
+ /**
77
+ * 创建条件 schema
78
+ */
79
+ static conditional(condition, thenSchema, elseSchema) {
80
+ return Type.Union([
81
+ Type.Intersect([condition, thenSchema]),
82
+ Type.Intersect([Type.Not(condition), elseSchema]),
83
+ ]);
84
+ }
85
+ /**
86
+ * 创建递归 schema
87
+ */
88
+ static recursive(callback) {
89
+ return Type.Recursive(callback);
90
+ }
91
+ /**
92
+ * 创建模板字符串 schema
93
+ */
94
+ static template(pattern) {
95
+ return Type.String({ pattern });
96
+ }
97
+ /**
98
+ * 创建范围验证 schema
99
+ */
100
+ static range(min, max, options) {
101
+ if (options?.exclusive) {
102
+ return Type.Number({
103
+ exclusiveMinimum: min,
104
+ exclusiveMaximum: max,
105
+ });
106
+ }
107
+ return Type.Number({
108
+ minimum: min,
109
+ maximum: max,
110
+ });
111
+ }
112
+ /**
113
+ * 创建文件验证 schema
114
+ */
115
+ static file(options) {
116
+ const baseSchema = Type.Object({
117
+ filename: Type.String(),
118
+ mimetype: Type.String(),
119
+ size: Type.Number({ minimum: 0 }),
120
+ buffer: Type.Any(), // 或者使用 Type.Uint8Array()
121
+ });
122
+ if (options?.maxSize) {
123
+ return Type.Intersect([
124
+ baseSchema,
125
+ Type.Object({
126
+ size: Type.Number({ maximum: options.maxSize }),
127
+ }),
128
+ ]);
129
+ }
130
+ if (options?.allowedTypes) {
131
+ return Type.Intersect([
132
+ baseSchema,
133
+ Type.Object({
134
+ mimetype: Type.Union(options.allowedTypes.map((type) => Type.Literal(type))),
135
+ }),
136
+ ]);
137
+ }
138
+ return baseSchema;
139
+ }
140
+ /**
141
+ * 创建分页参数 schema
142
+ */
143
+ static pagination() {
144
+ return Type.Object({
145
+ page: Type.Optional(Type.Number({ minimum: 1, default: 1 })),
146
+ limit: Type.Optional(Type.Number({ minimum: 1, maximum: 100, default: 10 })),
147
+ sort: Type.Optional(Type.String()),
148
+ order: Type.Optional(Type.Union([Type.Literal("asc"), Type.Literal("desc")])),
149
+ });
150
+ }
151
+ /**
152
+ * 创建搜索参数 schema
153
+ */
154
+ static search() {
155
+ return Type.Object({
156
+ q: Type.Optional(Type.String({ minLength: 1 })),
157
+ fields: Type.Optional(Type.Array(Type.String())),
158
+ filters: Type.Optional(Type.Record(Type.String(), Type.Any())),
159
+ });
160
+ }
161
+ /**
162
+ * 创建 UUID schema
163
+ */
164
+ static uuid() {
165
+ return Type.String({
166
+ pattern: "^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$",
167
+ });
168
+ }
169
+ /**
170
+ * 创建 MongoDB ObjectId schema
171
+ */
172
+ static objectId() {
173
+ return Type.String({
174
+ pattern: "^[0-9a-fA-F]{24}$",
175
+ minLength: 24,
176
+ maxLength: 24,
177
+ });
178
+ }
179
+ /**
180
+ * 创建颜色值 schema (hex)
181
+ */
182
+ static hexColor() {
183
+ return Type.String({
184
+ pattern: "^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$",
185
+ });
186
+ }
187
+ /**
188
+ * 创建信用卡号 schema
189
+ */
190
+ static creditCard() {
191
+ return Type.String({
192
+ pattern: "^(?:4[0-9]{12}(?:[0-9]{3})?|5[1-5][0-9]{14}|3[47][0-9]{13}|3[0-9]{13}|6(?:011|5[0-9]{2})[0-9]{12})$",
193
+ });
194
+ }
195
+ /**
196
+ * 创建手机号 schema (中国)
197
+ */
198
+ static chinesePhoneNumber() {
199
+ return Type.String({
200
+ pattern: "^1[3-9]\\d{9}$",
201
+ });
202
+ }
203
+ /**
204
+ * 创建身份证号 schema (中国)
205
+ */
206
+ static chineseIdCard() {
207
+ return Type.String({
208
+ pattern: "^[1-9]\\d{5}(18|19|20)\\d{2}((0[1-9])|(1[0-2]))(([0-2][1-9])|10|20|30|31)\\d{3}[0-9Xx]$",
209
+ });
210
+ }
211
+ }
212
+ /**
213
+ * 预定义的常用验证装饰器
214
+ */
215
+ export class CommonValidators {
216
+ /**
217
+ * UUID 验证
218
+ */
219
+ static UUID(options) {
220
+ return Custom(SchemaFactory.uuid(), options);
221
+ }
222
+ /**
223
+ * ObjectId 验证
224
+ */
225
+ static ObjectId(options) {
226
+ return Custom(SchemaFactory.objectId(), options);
227
+ }
228
+ /**
229
+ * 十六进制颜色验证
230
+ */
231
+ static HexColor(options) {
232
+ return Custom(SchemaFactory.hexColor(), options);
233
+ }
234
+ /**
235
+ * 信用卡号验证
236
+ */
237
+ static CreditCard(options) {
238
+ return Custom(SchemaFactory.creditCard(), options);
239
+ }
240
+ /**
241
+ * 中国手机号验证
242
+ */
243
+ static ChinesePhone(options) {
244
+ return Custom(SchemaFactory.chinesePhoneNumber(), options);
245
+ }
246
+ /**
247
+ * 中国身份证号验证
248
+ */
249
+ static ChineseIdCard(options) {
250
+ return Custom(SchemaFactory.chineseIdCard(), options);
251
+ }
252
+ /**
253
+ * JSON 字符串验证
254
+ */
255
+ static JsonString(options) {
256
+ return Custom(Type.String(), {
257
+ ...options,
258
+ message: options?.message || "Must be a valid JSON string",
259
+ });
260
+ }
261
+ /**
262
+ * Base64 字符串验证
263
+ */
264
+ static Base64(options) {
265
+ return Custom(Type.String({
266
+ pattern: "^[A-Za-z0-9+/]*={0,2}$",
267
+ }), options);
268
+ }
269
+ /**
270
+ * IP 地址验证
271
+ */
272
+ static IPAddress(version, options) {
273
+ const patterns = {
274
+ v4: "^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$",
275
+ v6: "^(?:[0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}$",
276
+ };
277
+ const pattern = version
278
+ ? patterns[version]
279
+ : `(${patterns.v4})|(${patterns.v6})`;
280
+ return Custom(Type.String({ pattern }), options);
281
+ }
282
+ }
283
+ //# sourceMappingURL=custom.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"custom.js","sourceRoot":"","sources":["../../src/decorators/custom.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,120 @@
1
+ import { type TSchema } from '@sinclair/typebox';
2
+ import 'reflect-metadata';
3
+ declare global {
4
+ namespace Reflect {
5
+ function defineMetadata(key: any, value: any, target: any, propertyKey?: string | symbol): void;
6
+ function getMetadata(key: any, target: any, propertyKey?: string | symbol): any;
7
+ }
8
+ }
9
+ /**
10
+ * 验证元数据键
11
+ */
12
+ export declare const VALIDATION_METADATA_KEY: unique symbol;
13
+ /**
14
+ * 属性验证元数据
15
+ */
16
+ export interface PropertyValidationMetadata {
17
+ propertyKey: string | symbol;
18
+ schema: TSchema;
19
+ isOptional?: boolean;
20
+ message?: string;
21
+ }
22
+ /**
23
+ * 类验证元数据
24
+ */
25
+ export interface ClassValidationMetadata {
26
+ properties: PropertyValidationMetadata[];
27
+ }
28
+ /**
29
+ * 字符串验证装饰器
30
+ */
31
+ export declare function IsString(options?: {
32
+ message?: string;
33
+ minLength?: number;
34
+ maxLength?: number;
35
+ pattern?: string;
36
+ }): (target: any, propertyKey: string | symbol) => void;
37
+ /**
38
+ * 数字验证装饰器
39
+ */
40
+ export declare function IsNumber(options?: {
41
+ message?: string;
42
+ minimum?: number;
43
+ maximum?: number;
44
+ multipleOf?: number;
45
+ }): (target: any, propertyKey: string | symbol) => void;
46
+ /**
47
+ * 整数验证装饰器
48
+ */
49
+ export declare function IsInteger(options?: {
50
+ message?: string;
51
+ minimum?: number;
52
+ maximum?: number;
53
+ }): (target: any, propertyKey: string | symbol) => void;
54
+ /**
55
+ * 布尔值验证装饰器
56
+ */
57
+ export declare function IsBoolean(options?: {
58
+ message?: string;
59
+ }): (target: any, propertyKey: string | symbol) => void;
60
+ /**
61
+ * 邮箱验证装饰器
62
+ */
63
+ export declare function IsEmail(options?: {
64
+ message?: string;
65
+ }): (target: any, propertyKey: string | symbol) => void;
66
+ /**
67
+ * URL 验证装饰器
68
+ */
69
+ export declare function IsUrl(options?: {
70
+ message?: string;
71
+ }): (target: any, propertyKey: string | symbol) => void;
72
+ /**
73
+ * 数组验证装饰器
74
+ */
75
+ export declare function IsArray(itemSchema?: TSchema, options?: {
76
+ message?: string;
77
+ minItems?: number;
78
+ maxItems?: number;
79
+ }): (target: any, propertyKey: string | symbol) => void;
80
+ /**
81
+ * 枚举验证装饰器
82
+ */
83
+ export declare function IsEnum(enumValues: any[], options?: {
84
+ message?: string;
85
+ }): (target: any, propertyKey: string | symbol) => void;
86
+ /**
87
+ * 日期验证装饰器
88
+ */
89
+ export declare function IsDate(options?: {
90
+ message?: string;
91
+ }): (target: any, propertyKey: string | symbol) => void;
92
+ /**
93
+ * 可选字段装饰器
94
+ */
95
+ export declare function IsOptional(): (target: any, propertyKey: string | symbol) => void;
96
+ /**
97
+ * 长度验证装饰器
98
+ */
99
+ export declare function Length(min: number, max?: number, options?: {
100
+ message?: string;
101
+ }): (target: any, propertyKey: string | symbol) => void;
102
+ /**
103
+ * 最小值验证装饰器
104
+ */
105
+ export declare function Min(value: number, options?: {
106
+ message?: string;
107
+ }): (target: any, propertyKey: string | symbol) => void;
108
+ /**
109
+ * 最大值验证装饰器
110
+ */
111
+ export declare function Max(value: number, options?: {
112
+ message?: string;
113
+ }): (target: any, propertyKey: string | symbol) => void;
114
+ /**
115
+ * 模式匹配验证装饰器
116
+ */
117
+ export declare function Matches(pattern: string | RegExp, options?: {
118
+ message?: string;
119
+ }): (target: any, propertyKey: string | symbol) => void;
120
+ //# sourceMappingURL=validation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../../src/decorators/validation.ts"],"names":[],"mappings":"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"}