@dangao/bun-server 1.7.1 → 1.8.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 (116) hide show
  1. package/README.md +129 -21
  2. package/dist/di/decorators.d.ts +37 -0
  3. package/dist/di/decorators.d.ts.map +1 -1
  4. package/dist/di/index.d.ts +1 -1
  5. package/dist/di/index.d.ts.map +1 -1
  6. package/dist/di/module-registry.d.ts +17 -0
  7. package/dist/di/module-registry.d.ts.map +1 -1
  8. package/dist/events/decorators.d.ts +52 -0
  9. package/dist/events/decorators.d.ts.map +1 -0
  10. package/dist/events/event-module.d.ts +97 -0
  11. package/dist/events/event-module.d.ts.map +1 -0
  12. package/dist/events/index.d.ts +5 -0
  13. package/dist/events/index.d.ts.map +1 -0
  14. package/dist/events/service.d.ts +76 -0
  15. package/dist/events/service.d.ts.map +1 -0
  16. package/dist/events/types.d.ts +184 -0
  17. package/dist/events/types.d.ts.map +1 -0
  18. package/dist/index.d.ts +5 -3
  19. package/dist/index.d.ts.map +1 -1
  20. package/dist/index.js +1511 -11
  21. package/dist/security/filter.d.ts +23 -0
  22. package/dist/security/filter.d.ts.map +1 -1
  23. package/dist/security/guards/builtin/auth-guard.d.ts +44 -0
  24. package/dist/security/guards/builtin/auth-guard.d.ts.map +1 -0
  25. package/dist/security/guards/builtin/index.d.ts +3 -0
  26. package/dist/security/guards/builtin/index.d.ts.map +1 -0
  27. package/dist/security/guards/builtin/roles-guard.d.ts +66 -0
  28. package/dist/security/guards/builtin/roles-guard.d.ts.map +1 -0
  29. package/dist/security/guards/decorators.d.ts +50 -0
  30. package/dist/security/guards/decorators.d.ts.map +1 -0
  31. package/dist/security/guards/execution-context.d.ts +56 -0
  32. package/dist/security/guards/execution-context.d.ts.map +1 -0
  33. package/dist/security/guards/guard-registry.d.ts +67 -0
  34. package/dist/security/guards/guard-registry.d.ts.map +1 -0
  35. package/dist/security/guards/index.d.ts +7 -0
  36. package/dist/security/guards/index.d.ts.map +1 -0
  37. package/dist/security/guards/reflector.d.ts +57 -0
  38. package/dist/security/guards/reflector.d.ts.map +1 -0
  39. package/dist/security/guards/types.d.ts +126 -0
  40. package/dist/security/guards/types.d.ts.map +1 -0
  41. package/dist/security/index.d.ts +1 -0
  42. package/dist/security/index.d.ts.map +1 -1
  43. package/dist/security/security-module.d.ts +20 -0
  44. package/dist/security/security-module.d.ts.map +1 -1
  45. package/dist/validation/class-validator.d.ts +108 -0
  46. package/dist/validation/class-validator.d.ts.map +1 -0
  47. package/dist/validation/custom-validator.d.ts +130 -0
  48. package/dist/validation/custom-validator.d.ts.map +1 -0
  49. package/dist/validation/errors.d.ts +22 -2
  50. package/dist/validation/errors.d.ts.map +1 -1
  51. package/dist/validation/index.d.ts +7 -1
  52. package/dist/validation/index.d.ts.map +1 -1
  53. package/dist/validation/rules/array.d.ts +33 -0
  54. package/dist/validation/rules/array.d.ts.map +1 -0
  55. package/dist/validation/rules/common.d.ts +90 -0
  56. package/dist/validation/rules/common.d.ts.map +1 -0
  57. package/dist/validation/rules/conditional.d.ts +30 -0
  58. package/dist/validation/rules/conditional.d.ts.map +1 -0
  59. package/dist/validation/rules/index.d.ts +5 -0
  60. package/dist/validation/rules/index.d.ts.map +1 -0
  61. package/dist/validation/rules/object.d.ts +30 -0
  62. package/dist/validation/rules/object.d.ts.map +1 -0
  63. package/dist/validation/types.d.ts +52 -1
  64. package/dist/validation/types.d.ts.map +1 -1
  65. package/docs/events.md +494 -0
  66. package/docs/guards.md +376 -0
  67. package/docs/guide.md +309 -1
  68. package/docs/request-lifecycle.md +444 -0
  69. package/docs/validation.md +407 -0
  70. package/docs/zh/events.md +494 -0
  71. package/docs/zh/guards.md +376 -0
  72. package/docs/zh/guide.md +309 -1
  73. package/docs/zh/request-lifecycle.md +444 -0
  74. package/docs/zh/validation.md +407 -0
  75. package/package.json +1 -1
  76. package/src/di/decorators.ts +46 -0
  77. package/src/di/index.ts +10 -1
  78. package/src/di/module-registry.ts +39 -0
  79. package/src/events/decorators.ts +103 -0
  80. package/src/events/event-module.ts +272 -0
  81. package/src/events/index.ts +32 -0
  82. package/src/events/service.ts +352 -0
  83. package/src/events/types.ts +223 -0
  84. package/src/index.ts +133 -1
  85. package/src/security/filter.ts +88 -8
  86. package/src/security/guards/builtin/auth-guard.ts +68 -0
  87. package/src/security/guards/builtin/index.ts +3 -0
  88. package/src/security/guards/builtin/roles-guard.ts +165 -0
  89. package/src/security/guards/decorators.ts +124 -0
  90. package/src/security/guards/execution-context.ts +152 -0
  91. package/src/security/guards/guard-registry.ts +164 -0
  92. package/src/security/guards/index.ts +7 -0
  93. package/src/security/guards/reflector.ts +99 -0
  94. package/src/security/guards/types.ts +144 -0
  95. package/src/security/index.ts +1 -0
  96. package/src/security/security-module.ts +72 -2
  97. package/src/validation/class-validator.ts +322 -0
  98. package/src/validation/custom-validator.ts +289 -0
  99. package/src/validation/errors.ts +50 -2
  100. package/src/validation/index.ts +103 -1
  101. package/src/validation/rules/array.ts +118 -0
  102. package/src/validation/rules/common.ts +286 -0
  103. package/src/validation/rules/conditional.ts +52 -0
  104. package/src/validation/rules/index.ts +51 -0
  105. package/src/validation/rules/object.ts +86 -0
  106. package/src/validation/types.ts +61 -1
  107. package/tests/di/global-module.test.ts +487 -0
  108. package/tests/events/event-decorators.test.ts +173 -0
  109. package/tests/events/event-emitter.test.ts +373 -0
  110. package/tests/events/event-module.test.ts +373 -0
  111. package/tests/security/guards/guards-integration.test.ts +371 -0
  112. package/tests/security/guards/guards.test.ts +775 -0
  113. package/tests/security/security-module.test.ts +2 -2
  114. package/tests/validation/class-validator.test.ts +349 -0
  115. package/tests/validation/custom-validator.test.ts +335 -0
  116. package/tests/validation/rules.test.ts +543 -0
@@ -0,0 +1,108 @@
1
+ import 'reflect-metadata';
2
+ import type { ValidationRuleDefinition, ClassValidationMetadata, ValidationOptions } from './types';
3
+ import { type ValidationIssue } from './errors';
4
+ /**
5
+ * 标记类需要验证
6
+ * 应用此装饰器后,类的实例可以使用 validateObject 函数进行验证
7
+ */
8
+ export declare function ValidateClass(): ClassDecorator;
9
+ /**
10
+ * 属性验证装饰器
11
+ * 用于 DTO 类的属性级别验证
12
+ *
13
+ * @example
14
+ * @ValidateClass()
15
+ * class CreateUserDto {
16
+ * @Property(IsString(), MinLength(2))
17
+ * name: string;
18
+ *
19
+ * @Property(IsEmail())
20
+ * email: string;
21
+ *
22
+ * @Property(IsOptional(), IsNumber())
23
+ * age?: number;
24
+ * }
25
+ */
26
+ export declare function Property(...rules: ValidationRuleDefinition[]): PropertyDecorator;
27
+ /**
28
+ * 获取类的验证元数据
29
+ */
30
+ export declare function getClassValidationMetadata(target: new () => unknown): ClassValidationMetadata[];
31
+ /**
32
+ * 检查类是否标记为需要验证
33
+ */
34
+ export declare function isValidateClass(target: new () => unknown): boolean;
35
+ /**
36
+ * 验证对象
37
+ *
38
+ * @param obj - 要验证的对象
39
+ * @param targetClass - DTO 类
40
+ * @param options - 验证选项
41
+ * @throws {ValidationError} 验证失败时抛出
42
+ *
43
+ * @example
44
+ * @ValidateClass()
45
+ * class CreateUserDto {
46
+ * @Property(IsString(), MinLength(2))
47
+ * name: string;
48
+ *
49
+ * @Property(IsEmail())
50
+ * email: string;
51
+ * }
52
+ *
53
+ * const dto = { name: 'A', email: 'invalid' };
54
+ * validateObject(dto, CreateUserDto); // throws ValidationError
55
+ */
56
+ export declare function validateObject<T>(obj: unknown, targetClass: new () => T, options?: ValidationOptions): void;
57
+ /**
58
+ * 验证对象并返回验证结果(不抛出异常)
59
+ *
60
+ * @param obj - 要验证的对象
61
+ * @param targetClass - DTO 类
62
+ * @param options - 验证选项
63
+ * @returns 验证结果
64
+ */
65
+ export declare function validateObjectSync<T>(obj: unknown, targetClass: new () => T, options?: ValidationOptions): {
66
+ valid: boolean;
67
+ issues: ValidationIssue[];
68
+ };
69
+ /**
70
+ * 带嵌套类型的属性验证装饰器
71
+ * 用于嵌套对象验证
72
+ *
73
+ * @example
74
+ * @ValidateClass()
75
+ * class AddressDto {
76
+ * @Property(IsString())
77
+ * city: string;
78
+ * }
79
+ *
80
+ * @ValidateClass()
81
+ * class CreateUserDto {
82
+ * @Property(IsString())
83
+ * name: string;
84
+ *
85
+ * @NestedProperty(AddressDto)
86
+ * address: AddressDto;
87
+ * }
88
+ */
89
+ export declare function NestedProperty<T>(nestedClass: new () => T): PropertyDecorator;
90
+ /**
91
+ * 数组嵌套属性验证装饰器
92
+ * 用于数组中每个元素的验证
93
+ *
94
+ * @example
95
+ * @ValidateClass()
96
+ * class ItemDto {
97
+ * @Property(IsString())
98
+ * name: string;
99
+ * }
100
+ *
101
+ * @ValidateClass()
102
+ * class OrderDto {
103
+ * @ArrayNestedProperty(ItemDto)
104
+ * items: ItemDto[];
105
+ * }
106
+ */
107
+ export declare function ArrayNestedProperty<T>(nestedClass: new () => T): PropertyDecorator;
108
+ //# sourceMappingURL=class-validator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"class-validator.d.ts","sourceRoot":"","sources":["../../src/validation/class-validator.ts"],"names":[],"mappings":"AAAA,OAAO,kBAAkB,CAAC;AAC1B,OAAO,KAAK,EAAE,wBAAwB,EAAE,uBAAuB,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AACpG,OAAO,EAAmB,KAAK,eAAe,EAAE,MAAM,UAAU,CAAC;AAMjE;;;GAGG;AACH,wBAAgB,aAAa,IAAI,cAAc,CAI9C;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,QAAQ,CAAC,GAAG,KAAK,EAAE,wBAAwB,EAAE,GAAG,iBAAiB,CAuBhF;AAED;;GAEG;AACH,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,UAAU,OAAO,GAAG,uBAAuB,EAAE,CAE/F;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,UAAU,OAAO,GAAG,OAAO,CAElE;AAoGD;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,cAAc,CAAC,CAAC,EAC9B,GAAG,EAAE,OAAO,EACZ,WAAW,EAAE,UAAU,CAAC,EACxB,OAAO,GAAE,iBAAsB,GAC9B,IAAI,CAUN;AAED;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAAC,CAAC,EAClC,GAAG,EAAE,OAAO,EACZ,WAAW,EAAE,UAAU,CAAC,EACxB,OAAO,GAAE,iBAAsB,GAC9B;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,eAAe,EAAE,CAAA;CAAE,CAQ/C;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,cAAc,CAAC,CAAC,EAAE,WAAW,EAAE,UAAU,CAAC,GAAG,iBAAiB,CAyB7E;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,mBAAmB,CAAC,CAAC,EAAE,WAAW,EAAE,UAAU,CAAC,GAAG,iBAAiB,CA0BlF"}
@@ -0,0 +1,130 @@
1
+ import type { ValidationRuleDefinition } from './types';
2
+ export interface CustomValidatorOptions {
3
+ message?: string;
4
+ }
5
+ /**
6
+ * 创建自定义验证器
7
+ *
8
+ * @param name - 验证器名称
9
+ * @param validate - 验证函数,接收值和可选参数,返回布尔值
10
+ * @param defaultMessage - 默认错误消息
11
+ * @returns 验证规则工厂函数
12
+ *
13
+ * @example
14
+ * // 创建手机号验证器
15
+ * const IsPhoneNumber = createCustomValidator(
16
+ * 'isPhoneNumber',
17
+ * (value) => typeof value === 'string' && /^1[3-9]\d{9}$/.test(value),
18
+ * '必须是有效的手机号码'
19
+ * );
20
+ *
21
+ * // 使用
22
+ * class UserDto {
23
+ * @Validate(IsPhoneNumber())
24
+ * phone: string;
25
+ * }
26
+ *
27
+ * @example
28
+ * // 创建带参数的验证器
29
+ * const IsDivisibleBy = createCustomValidator(
30
+ * 'isDivisibleBy',
31
+ * (value, divisor: number) => typeof value === 'number' && value % divisor === 0,
32
+ * (divisor: number) => `必须能被 ${divisor} 整除`
33
+ * );
34
+ *
35
+ * // 使用
36
+ * class NumberDto {
37
+ * @Validate(IsDivisibleBy(5))
38
+ * value: number;
39
+ * }
40
+ */
41
+ export declare function createCustomValidator<TArgs extends unknown[] = []>(name: string, validate: (value: unknown, ...args: TArgs) => boolean, defaultMessage: string | ((...args: TArgs) => string)): (...args: TArgs) => (options?: CustomValidatorOptions) => ValidationRuleDefinition;
42
+ /**
43
+ * 创建简单自定义验证器(无参数)
44
+ *
45
+ * @param name - 验证器名称
46
+ * @param validate - 验证函数
47
+ * @param defaultMessage - 默认错误消息
48
+ * @returns 验证规则工厂函数
49
+ *
50
+ * @example
51
+ * const IsPhoneNumber = createSimpleValidator(
52
+ * 'isPhoneNumber',
53
+ * (value) => typeof value === 'string' && /^1[3-9]\d{9}$/.test(value),
54
+ * '必须是有效的手机号码'
55
+ * );
56
+ *
57
+ * // 使用
58
+ * @Validate(IsPhoneNumber())
59
+ * phone: string;
60
+ */
61
+ export declare function createSimpleValidator(name: string, validate: (value: unknown) => boolean, defaultMessage: string): (options?: CustomValidatorOptions) => ValidationRuleDefinition;
62
+ /**
63
+ * 创建正则表达式验证器
64
+ *
65
+ * @param name - 验证器名称
66
+ * @param pattern - 正则表达式
67
+ * @param defaultMessage - 默认错误消息
68
+ * @returns 验证规则工厂函数
69
+ *
70
+ * @example
71
+ * const IsSlug = createRegexValidator(
72
+ * 'isSlug',
73
+ * /^[a-z0-9]+(?:-[a-z0-9]+)*$/,
74
+ * '必须是有效的 slug 格式'
75
+ * );
76
+ */
77
+ export declare function createRegexValidator(name: string, pattern: RegExp, defaultMessage: string): (options?: CustomValidatorOptions) => ValidationRuleDefinition;
78
+ /**
79
+ * 验证中国大陆手机号
80
+ */
81
+ export declare const IsPhoneNumber: (options?: CustomValidatorOptions) => ValidationRuleDefinition;
82
+ /**
83
+ * 验证中国身份证号
84
+ */
85
+ export declare const IsIdCard: (options?: CustomValidatorOptions) => ValidationRuleDefinition;
86
+ /**
87
+ * 验证 IP 地址 (IPv4)
88
+ */
89
+ export declare const IsIPv4: (options?: CustomValidatorOptions) => ValidationRuleDefinition;
90
+ /**
91
+ * 验证端口号
92
+ */
93
+ export declare const IsPort: (options?: CustomValidatorOptions) => ValidationRuleDefinition;
94
+ /**
95
+ * 验证邮政编码(中国)
96
+ */
97
+ export declare const IsPostalCode: (options?: CustomValidatorOptions) => ValidationRuleDefinition;
98
+ /**
99
+ * 验证信用卡号(Luhn 算法)
100
+ */
101
+ export declare const IsCreditCard: (options?: CustomValidatorOptions) => ValidationRuleDefinition;
102
+ /**
103
+ * 验证十六进制颜色值
104
+ */
105
+ export declare const IsHexColor: (options?: CustomValidatorOptions) => ValidationRuleDefinition;
106
+ /**
107
+ * 验证 MAC 地址
108
+ */
109
+ export declare const IsMacAddress: (options?: CustomValidatorOptions) => ValidationRuleDefinition;
110
+ /**
111
+ * 验证语义化版本号
112
+ */
113
+ export declare const IsSemVer: (options?: CustomValidatorOptions) => ValidationRuleDefinition;
114
+ /**
115
+ * 创建能被指定数字整除的验证器
116
+ */
117
+ export declare const IsDivisibleBy: (divisor: number) => (options?: CustomValidatorOptions) => ValidationRuleDefinition;
118
+ /**
119
+ * 创建范围验证器
120
+ */
121
+ export declare const IsBetween: (min: number, max: number) => (options?: CustomValidatorOptions) => ValidationRuleDefinition;
122
+ /**
123
+ * 验证是否包含指定子字符串
124
+ */
125
+ export declare const Contains: (substring: string) => (options?: CustomValidatorOptions) => ValidationRuleDefinition;
126
+ /**
127
+ * 验证是否不包含指定子字符串
128
+ */
129
+ export declare const NotContains: (substring: string) => (options?: CustomValidatorOptions) => ValidationRuleDefinition;
130
+ //# sourceMappingURL=custom-validator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"custom-validator.d.ts","sourceRoot":"","sources":["../../src/validation/custom-validator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,SAAS,CAAC;AAExD,MAAM,WAAW,sBAAsB;IACrC,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,SAAS,OAAO,EAAE,GAAG,EAAE,EAChE,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,IAAI,EAAE,KAAK,KAAK,OAAO,EACrD,cAAc,EAAE,MAAM,GAAG,CAAC,CAAC,GAAG,IAAI,EAAE,KAAK,KAAK,MAAM,CAAC,GACpD,CAAC,GAAG,IAAI,EAAE,KAAK,KAAK,CAAC,OAAO,CAAC,EAAE,sBAAsB,KAAK,wBAAwB,CAapF;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,qBAAqB,CACnC,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,OAAO,EACrC,cAAc,EAAE,MAAM,GACrB,CAAC,OAAO,CAAC,EAAE,sBAAsB,KAAK,wBAAwB,CAMhE;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,EACf,cAAc,EAAE,MAAM,GACrB,CAAC,OAAO,CAAC,EAAE,sBAAsB,KAAK,wBAAwB,CAMhE;AAID;;GAEG;AACH,eAAO,MAAM,aAAa,aAxCZ,sBAAsB,KAAK,wBA4CxC,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,QAAQ,aAjDP,sBAAsB,KAAK,wBA4DxC,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,MAAM,aAjEL,sBAAsB,KAAK,wBA6ExC,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,MAAM,aAlFL,sBAAsB,KAAK,wBA+FxC,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,YAAY,aApGX,sBAAsB,KAAK,wBAwGxC,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,YAAY,aA7GX,sBAAsB,KAAK,wBAmIxC,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,UAAU,aAxIT,sBAAsB,KAAK,wBA4IxC,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,YAAY,aAjJX,sBAAsB,KAAK,wBAuJxC,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,QAAQ,aA5JP,sBAAsB,KAAK,wBAoKxC,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,aAAa,uBA/MH,CAAC,OAAO,CAAC,EAAE,sBAAsB,KAAK,wBAoN5D,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,SAAS,gCAzNC,CAAC,OAAO,CAAC,EAAE,sBAAsB,KAAK,wBA8N5D,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,QAAQ,yBAnOE,CAAC,OAAO,CAAC,EAAE,sBAAsB,KAAK,wBAwO5D,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,WAAW,yBA7OD,CAAC,OAAO,CAAC,EAAE,sBAAsB,KAAK,wBAkP5D,CAAC"}
@@ -1,8 +1,12 @@
1
1
  export interface ValidationIssue {
2
2
  /**
3
- * 参数索引
3
+ * 参数索引(参数级别验证使用)
4
4
  */
5
- index: number;
5
+ index?: number;
6
+ /**
7
+ * 属性路径(类级别验证使用,支持嵌套如 'user.address.city')
8
+ */
9
+ property?: string;
6
10
  /**
7
11
  * 失败的规则名称
8
12
  */
@@ -11,9 +15,25 @@ export interface ValidationIssue {
11
15
  * 错误信息
12
16
  */
13
17
  message: string;
18
+ /**
19
+ * 验证失败的值
20
+ */
21
+ value?: unknown;
22
+ /**
23
+ * 嵌套错误(用于嵌套对象验证)
24
+ */
25
+ children?: ValidationIssue[];
14
26
  }
15
27
  export declare class ValidationError extends Error {
16
28
  readonly issues: ValidationIssue[];
17
29
  constructor(message: string, issues: ValidationIssue[]);
30
+ /**
31
+ * 获取所有错误的扁平化列表
32
+ */
33
+ getFlattened(): ValidationIssue[];
34
+ /**
35
+ * 转换为简单的错误对象
36
+ */
37
+ toJSON(): Record<string, unknown>;
18
38
  }
19
39
  //# sourceMappingURL=errors.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/validation/errors.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,eAAe;IAC9B;;OAEG;IACH,KAAK,EAAE,MAAM,CAAC;IAEd;;OAEG;IACH,IAAI,EAAE,MAAM,CAAC;IAEb;;OAEG;IACH,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,qBAAa,eAAgB,SAAQ,KAAK;IACxC,SAAgB,MAAM,EAAE,eAAe,EAAE,CAAC;gBAEvB,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,eAAe,EAAE;CAK9D"}
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/validation/errors.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,eAAe;IAC9B;;OAEG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf;;OAEG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB;;OAEG;IACH,IAAI,EAAE,MAAM,CAAC;IAEb;;OAEG;IACH,OAAO,EAAE,MAAM,CAAC;IAEhB;;OAEG;IACH,KAAK,CAAC,EAAE,OAAO,CAAC;IAEhB;;OAEG;IACH,QAAQ,CAAC,EAAE,eAAe,EAAE,CAAC;CAC9B;AAED,qBAAa,eAAgB,SAAQ,KAAK;IACxC,SAAgB,MAAM,EAAE,eAAe,EAAE,CAAC;gBAEvB,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,eAAe,EAAE;IAM7D;;OAEG;IACI,YAAY,IAAI,eAAe,EAAE;IAmBxC;;OAEG;IACI,MAAM,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;CAOzC"}
@@ -1,5 +1,11 @@
1
1
  export { Validate, IsString, IsNumber, IsEmail, IsOptional, MinLength, getValidationMetadata, } from './decorators';
2
- export type { ValidationRuleDefinition, ValidationMetadata } from './types';
2
+ export type { ValidationRuleDefinition, ValidationMetadata, ClassValidationMetadata, ValidationOptions, } from './types';
3
3
  export { validateParameters } from './validator';
4
4
  export { ValidationError, type ValidationIssue } from './errors';
5
+ export { IsObject, IsNotEmpty, IsNotEmptyObject, ValidateNested, type ObjectRuleOptions, type ValidateNestedOptions, } from './rules/object';
6
+ export { IsArray, ArrayMinSize, ArrayMaxSize, ArrayUnique, ArrayContains, ArrayNotContains, ArrayNotEmpty, type ArrayRuleOptions, } from './rules/array';
7
+ export { IsBoolean, IsInt, IsPositive, IsNegative, Min, Max, IsDate, IsUUID, Length, MaxLength, Matches, IsIn, IsNotIn, IsUrl, IsJSON, Equals, NotEquals, IsDefined, IsAlphanumeric, IsAlpha, IsNumberString, type RuleOptions, type UUIDVersion, } from './rules/common';
8
+ export { ValidateIf, Transform, type ConditionalRuleOptions, } from './rules/conditional';
9
+ export { createCustomValidator, createSimpleValidator, createRegexValidator, IsPhoneNumber, IsIdCard, IsIPv4, IsPort, IsPostalCode, IsCreditCard, IsHexColor, IsMacAddress, IsSemVer, IsDivisibleBy, IsBetween, Contains, NotContains, type CustomValidatorOptions, } from './custom-validator';
10
+ export { ValidateClass, Property, NestedProperty, ArrayNestedProperty, validateObject, validateObjectSync, getClassValidationMetadata, isValidateClass, } from './class-validator';
5
11
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/validation/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,OAAO,EACP,UAAU,EACV,SAAS,EACT,qBAAqB,GACtB,MAAM,cAAc,CAAC;AACtB,YAAY,EAAE,wBAAwB,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC;AAC5E,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EAAE,eAAe,EAAE,KAAK,eAAe,EAAE,MAAM,UAAU,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/validation/index.ts"],"names":[],"mappings":"AACA,OAAO,EACL,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,OAAO,EACP,UAAU,EACV,SAAS,EACT,qBAAqB,GACtB,MAAM,cAAc,CAAC;AAGtB,YAAY,EACV,wBAAwB,EACxB,kBAAkB,EAClB,uBAAuB,EACvB,iBAAiB,GAClB,MAAM,SAAS,CAAC;AAGjB,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAGjD,OAAO,EAAE,eAAe,EAAE,KAAK,eAAe,EAAE,MAAM,UAAU,CAAC;AAGjE,OAAO,EACL,QAAQ,EACR,UAAU,EACV,gBAAgB,EAChB,cAAc,EACd,KAAK,iBAAiB,EACtB,KAAK,qBAAqB,GAC3B,MAAM,gBAAgB,CAAC;AAGxB,OAAO,EACL,OAAO,EACP,YAAY,EACZ,YAAY,EACZ,WAAW,EACX,aAAa,EACb,gBAAgB,EAChB,aAAa,EACb,KAAK,gBAAgB,GACtB,MAAM,eAAe,CAAC;AAGvB,OAAO,EACL,SAAS,EACT,KAAK,EACL,UAAU,EACV,UAAU,EACV,GAAG,EACH,GAAG,EACH,MAAM,EACN,MAAM,EACN,MAAM,EACN,SAAS,EACT,OAAO,EACP,IAAI,EACJ,OAAO,EACP,KAAK,EACL,MAAM,EACN,MAAM,EACN,SAAS,EACT,SAAS,EACT,cAAc,EACd,OAAO,EACP,cAAc,EACd,KAAK,WAAW,EAChB,KAAK,WAAW,GACjB,MAAM,gBAAgB,CAAC;AAGxB,OAAO,EACL,UAAU,EACV,SAAS,EACT,KAAK,sBAAsB,GAC5B,MAAM,qBAAqB,CAAC;AAG7B,OAAO,EACL,qBAAqB,EACrB,qBAAqB,EACrB,oBAAoB,EAEpB,aAAa,EACb,QAAQ,EACR,MAAM,EACN,MAAM,EACN,YAAY,EACZ,YAAY,EACZ,UAAU,EACV,YAAY,EACZ,QAAQ,EACR,aAAa,EACb,SAAS,EACT,QAAQ,EACR,WAAW,EACX,KAAK,sBAAsB,GAC5B,MAAM,oBAAoB,CAAC;AAG5B,OAAO,EACL,aAAa,EACb,QAAQ,EACR,cAAc,EACd,mBAAmB,EACnB,cAAc,EACd,kBAAkB,EAClB,0BAA0B,EAC1B,eAAe,GAChB,MAAM,mBAAmB,CAAC"}
@@ -0,0 +1,33 @@
1
+ import type { ValidationRuleDefinition } from '../types';
2
+ export interface ArrayRuleOptions {
3
+ message?: string;
4
+ }
5
+ /**
6
+ * 验证值是否为数组
7
+ */
8
+ export declare function IsArray(options?: ArrayRuleOptions): ValidationRuleDefinition;
9
+ /**
10
+ * 验证数组最小长度
11
+ */
12
+ export declare function ArrayMinSize(min: number, options?: ArrayRuleOptions): ValidationRuleDefinition;
13
+ /**
14
+ * 验证数组最大长度
15
+ */
16
+ export declare function ArrayMaxSize(max: number, options?: ArrayRuleOptions): ValidationRuleDefinition;
17
+ /**
18
+ * 验证数组元素是否唯一
19
+ */
20
+ export declare function ArrayUnique(options?: ArrayRuleOptions): ValidationRuleDefinition;
21
+ /**
22
+ * 验证数组是否包含指定的值
23
+ */
24
+ export declare function ArrayContains(values: unknown[], options?: ArrayRuleOptions): ValidationRuleDefinition;
25
+ /**
26
+ * 验证数组是否不包含指定的值
27
+ */
28
+ export declare function ArrayNotContains(values: unknown[], options?: ArrayRuleOptions): ValidationRuleDefinition;
29
+ /**
30
+ * 验证数组是否为非空数组
31
+ */
32
+ export declare function ArrayNotEmpty(options?: ArrayRuleOptions): ValidationRuleDefinition;
33
+ //# sourceMappingURL=array.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"array.d.ts","sourceRoot":"","sources":["../../../src/validation/rules/array.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,UAAU,CAAC;AAEzD,MAAM,WAAW,gBAAgB;IAC/B,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,wBAAgB,OAAO,CAAC,OAAO,GAAE,gBAAqB,GAAG,wBAAwB,CAMhF;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,GAAE,gBAAqB,GAAG,wBAAwB,CAMlG;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,GAAE,gBAAqB,GAAG,wBAAwB,CAMlG;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,OAAO,GAAE,gBAAqB,GAAG,wBAAwB,CAoBpF;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,OAAO,EAAE,EAAE,OAAO,GAAE,gBAAqB,GAAG,wBAAwB,CAiBzG;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,OAAO,EAAE,EAAE,OAAO,GAAE,gBAAqB,GAAG,wBAAwB,CAiB5G;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,OAAO,GAAE,gBAAqB,GAAG,wBAAwB,CAMtF"}
@@ -0,0 +1,90 @@
1
+ import type { ValidationRuleDefinition } from '../types';
2
+ export interface RuleOptions {
3
+ message?: string;
4
+ }
5
+ /**
6
+ * 验证值是否为布尔值
7
+ */
8
+ export declare function IsBoolean(options?: RuleOptions): ValidationRuleDefinition;
9
+ /**
10
+ * 验证值是否为整数
11
+ */
12
+ export declare function IsInt(options?: RuleOptions): ValidationRuleDefinition;
13
+ /**
14
+ * 验证值是否为正数
15
+ */
16
+ export declare function IsPositive(options?: RuleOptions): ValidationRuleDefinition;
17
+ /**
18
+ * 验证值是否为负数
19
+ */
20
+ export declare function IsNegative(options?: RuleOptions): ValidationRuleDefinition;
21
+ /**
22
+ * 验证数字最小值
23
+ */
24
+ export declare function Min(min: number, options?: RuleOptions): ValidationRuleDefinition;
25
+ /**
26
+ * 验证数字最大值
27
+ */
28
+ export declare function Max(max: number, options?: RuleOptions): ValidationRuleDefinition;
29
+ /**
30
+ * 验证值是否为日期
31
+ */
32
+ export declare function IsDate(options?: RuleOptions): ValidationRuleDefinition;
33
+ export type UUIDVersion = '3' | '4' | '5' | 'all';
34
+ /**
35
+ * 验证值是否为 UUID
36
+ */
37
+ export declare function IsUUID(version?: UUIDVersion, options?: RuleOptions): ValidationRuleDefinition;
38
+ /**
39
+ * 验证字符串长度
40
+ */
41
+ export declare function Length(min: number, max?: number, options?: RuleOptions): ValidationRuleDefinition;
42
+ /**
43
+ * 验证字符串最大长度
44
+ */
45
+ export declare function MaxLength(max: number, options?: RuleOptions): ValidationRuleDefinition;
46
+ /**
47
+ * 验证值是否匹配正则表达式
48
+ */
49
+ export declare function Matches(pattern: RegExp, options?: RuleOptions): ValidationRuleDefinition;
50
+ /**
51
+ * 验证值是否在指定列表中
52
+ */
53
+ export declare function IsIn(values: unknown[], options?: RuleOptions): ValidationRuleDefinition;
54
+ /**
55
+ * 验证值是否不在指定列表中
56
+ */
57
+ export declare function IsNotIn(values: unknown[], options?: RuleOptions): ValidationRuleDefinition;
58
+ /**
59
+ * 验证值是否为 URL
60
+ */
61
+ export declare function IsUrl(options?: RuleOptions): ValidationRuleDefinition;
62
+ /**
63
+ * 验证值是否为 JSON 字符串
64
+ */
65
+ export declare function IsJSON(options?: RuleOptions): ValidationRuleDefinition;
66
+ /**
67
+ * 验证值是否相等
68
+ */
69
+ export declare function Equals(comparison: unknown, options?: RuleOptions): ValidationRuleDefinition;
70
+ /**
71
+ * 验证值是否不相等
72
+ */
73
+ export declare function NotEquals(comparison: unknown, options?: RuleOptions): ValidationRuleDefinition;
74
+ /**
75
+ * 验证是否为 null 或 undefined
76
+ */
77
+ export declare function IsDefined(options?: RuleOptions): ValidationRuleDefinition;
78
+ /**
79
+ * 验证字符串是否只包含字母数字字符
80
+ */
81
+ export declare function IsAlphanumeric(options?: RuleOptions): ValidationRuleDefinition;
82
+ /**
83
+ * 验证字符串是否只包含字母
84
+ */
85
+ export declare function IsAlpha(options?: RuleOptions): ValidationRuleDefinition;
86
+ /**
87
+ * 验证字符串是否只包含数字
88
+ */
89
+ export declare function IsNumberString(options?: RuleOptions): ValidationRuleDefinition;
90
+ //# sourceMappingURL=common.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"common.d.ts","sourceRoot":"","sources":["../../../src/validation/rules/common.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,UAAU,CAAC;AAEzD,MAAM,WAAW,WAAW;IAC1B,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,OAAO,GAAE,WAAgB,GAAG,wBAAwB,CAM7E;AAED;;GAEG;AACH,wBAAgB,KAAK,CAAC,OAAO,GAAE,WAAgB,GAAG,wBAAwB,CAMzE;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,OAAO,GAAE,WAAgB,GAAG,wBAAwB,CAM9E;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,OAAO,GAAE,WAAgB,GAAG,wBAAwB,CAM9E;AAED;;GAEG;AACH,wBAAgB,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,GAAE,WAAgB,GAAG,wBAAwB,CAMpF;AAED;;GAEG;AACH,wBAAgB,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,GAAE,WAAgB,GAAG,wBAAwB,CAMpF;AAED;;GAEG;AACH,wBAAgB,MAAM,CAAC,OAAO,GAAE,WAAgB,GAAG,wBAAwB,CAe1E;AAED,MAAM,MAAM,WAAW,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,KAAK,CAAC;AASlD;;GAEG;AACH,wBAAgB,MAAM,CAAC,OAAO,GAAE,WAAmB,EAAE,OAAO,GAAE,WAAgB,GAAG,wBAAwB,CAMxG;AAED;;GAEG;AACH,wBAAgB,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,EAAE,OAAO,GAAE,WAAgB,GAAG,wBAAwB,CAkBrG;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,GAAE,WAAgB,GAAG,wBAAwB,CAM1F;AAED;;GAEG;AACH,wBAAgB,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE,WAAgB,GAAG,wBAAwB,CAM5F;AAED;;GAEG;AACH,wBAAgB,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,EAAE,OAAO,GAAE,WAAgB,GAAG,wBAAwB,CAM3F;AAED;;GAEG;AACH,wBAAgB,OAAO,CAAC,MAAM,EAAE,OAAO,EAAE,EAAE,OAAO,GAAE,WAAgB,GAAG,wBAAwB,CAM9F;AAED;;GAEG;AACH,wBAAgB,KAAK,CAAC,OAAO,GAAE,WAAgB,GAAG,wBAAwB,CAgBzE;AAED;;GAEG;AACH,wBAAgB,MAAM,CAAC,OAAO,GAAE,WAAgB,GAAG,wBAAwB,CAgB1E;AAED;;GAEG;AACH,wBAAgB,MAAM,CAAC,UAAU,EAAE,OAAO,EAAE,OAAO,GAAE,WAAgB,GAAG,wBAAwB,CAM/F;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,UAAU,EAAE,OAAO,EAAE,OAAO,GAAE,WAAgB,GAAG,wBAAwB,CAMlG;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,OAAO,GAAE,WAAgB,GAAG,wBAAwB,CAM7E;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,OAAO,GAAE,WAAgB,GAAG,wBAAwB,CAMlF;AAED;;GAEG;AACH,wBAAgB,OAAO,CAAC,OAAO,GAAE,WAAgB,GAAG,wBAAwB,CAM3E;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,OAAO,GAAE,WAAgB,GAAG,wBAAwB,CAMlF"}
@@ -0,0 +1,30 @@
1
+ import type { ValidationRuleDefinition } from '../types';
2
+ export interface ConditionalRuleOptions {
3
+ message?: string;
4
+ }
5
+ /**
6
+ * 条件验证装饰器
7
+ * 只有当条件函数返回 true 时才执行后续验证
8
+ *
9
+ * @example
10
+ * class UpdateUserDto {
11
+ * @Validate(ValidateIf((value, obj) => obj.type === 'premium'), IsEmail())
12
+ * email?: string;
13
+ * }
14
+ */
15
+ export declare function ValidateIf(condition: (value: unknown, obj?: unknown) => boolean, options?: ConditionalRuleOptions): ValidationRuleDefinition;
16
+ /**
17
+ * 转换装饰器
18
+ * 在验证前转换值
19
+ *
20
+ * @example
21
+ * class CreateUserDto {
22
+ * @Validate(Transform((value) => value?.trim()), IsString())
23
+ * name: string;
24
+ *
25
+ * @Validate(Transform((value) => Number(value)), IsInt(), Min(0))
26
+ * age: number;
27
+ * }
28
+ */
29
+ export declare function Transform(transformFn: (value: unknown) => unknown, options?: ConditionalRuleOptions): ValidationRuleDefinition;
30
+ //# sourceMappingURL=conditional.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"conditional.d.ts","sourceRoot":"","sources":["../../../src/validation/rules/conditional.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,UAAU,CAAC;AAEzD,MAAM,WAAW,sBAAsB;IACrC,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;;;;;;;;GASG;AACH,wBAAgB,UAAU,CACxB,SAAS,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,CAAC,EAAE,OAAO,KAAK,OAAO,EACrD,OAAO,GAAE,sBAA2B,GACnC,wBAAwB,CAO1B;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,SAAS,CACvB,WAAW,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,OAAO,EACxC,OAAO,GAAE,sBAA2B,GACnC,wBAAwB,CAO1B"}
@@ -0,0 +1,5 @@
1
+ export { IsObject, IsNotEmpty, IsNotEmptyObject, ValidateNested, type ObjectRuleOptions, type ValidateNestedOptions, } from './object';
2
+ export { IsArray, ArrayMinSize, ArrayMaxSize, ArrayUnique, ArrayContains, ArrayNotContains, ArrayNotEmpty, type ArrayRuleOptions, } from './array';
3
+ export { IsBoolean, IsInt, IsPositive, IsNegative, Min, Max, IsDate, IsUUID, Length, MaxLength, Matches, IsIn, IsNotIn, IsUrl, IsJSON, Equals, NotEquals, IsDefined, IsAlphanumeric, IsAlpha, IsNumberString, type RuleOptions, type UUIDVersion, } from './common';
4
+ export { ValidateIf, Transform, type ConditionalRuleOptions, } from './conditional';
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/validation/rules/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,QAAQ,EACR,UAAU,EACV,gBAAgB,EAChB,cAAc,EACd,KAAK,iBAAiB,EACtB,KAAK,qBAAqB,GAC3B,MAAM,UAAU,CAAC;AAElB,OAAO,EACL,OAAO,EACP,YAAY,EACZ,YAAY,EACZ,WAAW,EACX,aAAa,EACb,gBAAgB,EAChB,aAAa,EACb,KAAK,gBAAgB,GACtB,MAAM,SAAS,CAAC;AAEjB,OAAO,EACL,SAAS,EACT,KAAK,EACL,UAAU,EACV,UAAU,EACV,GAAG,EACH,GAAG,EACH,MAAM,EACN,MAAM,EACN,MAAM,EACN,SAAS,EACT,OAAO,EACP,IAAI,EACJ,OAAO,EACP,KAAK,EACL,MAAM,EACN,MAAM,EACN,SAAS,EACT,SAAS,EACT,cAAc,EACd,OAAO,EACP,cAAc,EACd,KAAK,WAAW,EAChB,KAAK,WAAW,GACjB,MAAM,UAAU,CAAC;AAElB,OAAO,EACL,UAAU,EACV,SAAS,EACT,KAAK,sBAAsB,GAC5B,MAAM,eAAe,CAAC"}
@@ -0,0 +1,30 @@
1
+ import type { ValidationRuleDefinition } from '../types';
2
+ export interface ObjectRuleOptions {
3
+ message?: string;
4
+ }
5
+ /**
6
+ * 验证值是否为对象
7
+ */
8
+ export declare function IsObject(options?: ObjectRuleOptions): ValidationRuleDefinition;
9
+ /**
10
+ * 验证值是否为非空(不是 null、undefined、空字符串、空数组、空对象)
11
+ */
12
+ export declare function IsNotEmpty(options?: ObjectRuleOptions): ValidationRuleDefinition;
13
+ /**
14
+ * 验证值是否为非空对象(对象且至少有一个属性)
15
+ */
16
+ export declare function IsNotEmptyObject(options?: ObjectRuleOptions): ValidationRuleDefinition;
17
+ export interface ValidateNestedOptions {
18
+ message?: string;
19
+ /**
20
+ * 是否对数组每个元素执行验证
21
+ * @default false
22
+ */
23
+ each?: boolean;
24
+ }
25
+ /**
26
+ * 嵌套对象验证装饰器
27
+ * 用于标记属性需要嵌套验证
28
+ */
29
+ export declare function ValidateNested(options?: ValidateNestedOptions): ValidationRuleDefinition;
30
+ //# sourceMappingURL=object.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"object.d.ts","sourceRoot":"","sources":["../../../src/validation/rules/object.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,UAAU,CAAC;AAEzD,MAAM,WAAW,iBAAiB;IAChC,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,OAAO,GAAE,iBAAsB,GAAG,wBAAwB,CAMlF;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,OAAO,GAAE,iBAAsB,GAAG,wBAAwB,CAoBpF;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,GAAE,iBAAsB,GAAG,wBAAwB,CAW1F;AAED,MAAM,WAAW,qBAAqB;IACpC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;;OAGG;IACH,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,OAAO,GAAE,qBAA0B,GAAG,wBAAwB,CAc5F"}
@@ -9,12 +9,35 @@ export interface ValidationRuleDefinition {
9
9
  message: string;
10
10
  /**
11
11
  * 校验函数
12
+ * @param value - 要验证的值
13
+ * @param obj - 完整对象(用于条件验证)
12
14
  */
13
- validate: (value: unknown) => boolean;
15
+ validate: (value: unknown, obj?: unknown) => boolean;
14
16
  /**
15
17
  * 是否为可选字段
16
18
  */
17
19
  optional?: boolean;
20
+ /**
21
+ * 条件验证函数
22
+ * 返回 true 时执行验证,返回 false 时跳过
23
+ */
24
+ condition?: (value: unknown, obj?: unknown) => boolean;
25
+ /**
26
+ * 转换函数(在验证前执行)
27
+ */
28
+ transform?: (value: unknown) => unknown;
29
+ /**
30
+ * 是否为嵌套验证
31
+ */
32
+ nested?: boolean;
33
+ /**
34
+ * 嵌套验证的类型
35
+ */
36
+ nestedType?: new () => unknown;
37
+ /**
38
+ * 是否对数组每个元素执行嵌套验证
39
+ */
40
+ each?: boolean;
18
41
  }
19
42
  export interface ValidationMetadata {
20
43
  /**
@@ -26,4 +49,32 @@ export interface ValidationMetadata {
26
49
  */
27
50
  rules: ValidationRuleDefinition[];
28
51
  }
52
+ /**
53
+ * 类级别验证元数据
54
+ */
55
+ export interface ClassValidationMetadata {
56
+ /**
57
+ * 属性名
58
+ */
59
+ property: string;
60
+ /**
61
+ * 规则列表
62
+ */
63
+ rules: ValidationRuleDefinition[];
64
+ }
65
+ /**
66
+ * 验证选项
67
+ */
68
+ export interface ValidationOptions {
69
+ /**
70
+ * 是否在第一个错误时停止验证
71
+ * @default false
72
+ */
73
+ stopAtFirstError?: boolean;
74
+ /**
75
+ * 是否跳过缺失的属性
76
+ * @default false
77
+ */
78
+ skipMissingProperties?: boolean;
79
+ }
29
80
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/validation/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,wBAAwB;IACvC;;OAEG;IACH,IAAI,EAAE,MAAM,CAAC;IAEb;;OAEG;IACH,OAAO,EAAE,MAAM,CAAC;IAEhB;;OAEG;IACH,QAAQ,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,OAAO,CAAC;IAEtC;;OAEG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,kBAAkB;IACjC;;OAEG;IACH,KAAK,EAAE,MAAM,CAAC;IAEd;;OAEG;IACH,KAAK,EAAE,wBAAwB,EAAE,CAAC;CACnC"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/validation/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,wBAAwB;IACvC;;OAEG;IACH,IAAI,EAAE,MAAM,CAAC;IAEb;;OAEG;IACH,OAAO,EAAE,MAAM,CAAC;IAEhB;;;;OAIG;IACH,QAAQ,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,CAAC,EAAE,OAAO,KAAK,OAAO,CAAC;IAErD;;OAEG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;IAEnB;;;OAGG;IACH,SAAS,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,CAAC,EAAE,OAAO,KAAK,OAAO,CAAC;IAEvD;;OAEG;IACH,SAAS,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,OAAO,CAAC;IAExC;;OAEG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC;IAEjB;;OAEG;IACH,UAAU,CAAC,EAAE,UAAU,OAAO,CAAC;IAE/B;;OAEG;IACH,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,MAAM,WAAW,kBAAkB;IACjC;;OAEG;IACH,KAAK,EAAE,MAAM,CAAC;IAEd;;OAEG;IACH,KAAK,EAAE,wBAAwB,EAAE,CAAC;CACnC;AAED;;GAEG;AACH,MAAM,WAAW,uBAAuB;IACtC;;OAEG;IACH,QAAQ,EAAE,MAAM,CAAC;IAEjB;;OAEG;IACH,KAAK,EAAE,wBAAwB,EAAE,CAAC;CACnC;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC;;;OAGG;IACH,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAE3B;;;OAGG;IACH,qBAAqB,CAAC,EAAE,OAAO,CAAC;CACjC"}