ts-deco 1.0.3

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 (54) hide show
  1. package/README.md +294 -0
  2. package/dist/decorators/utils/apply-decorators.d.ts +21 -0
  3. package/dist/decorators/utils/apply-decorators.d.ts.map +1 -0
  4. package/dist/decorators/utils/apply-decorators.js +52 -0
  5. package/dist/decorators/utils/apply-decorators.js.map +1 -0
  6. package/dist/decorators/validators/boolean.decorator.d.ts +6 -0
  7. package/dist/decorators/validators/boolean.decorator.d.ts.map +1 -0
  8. package/dist/decorators/validators/boolean.decorator.js +40 -0
  9. package/dist/decorators/validators/boolean.decorator.js.map +1 -0
  10. package/dist/decorators/validators/date.decorator.d.ts +6 -0
  11. package/dist/decorators/validators/date.decorator.d.ts.map +1 -0
  12. package/dist/decorators/validators/date.decorator.js +24 -0
  13. package/dist/decorators/validators/date.decorator.js.map +1 -0
  14. package/dist/decorators/validators/enum.decorator.d.ts +6 -0
  15. package/dist/decorators/validators/enum.decorator.d.ts.map +1 -0
  16. package/dist/decorators/validators/enum.decorator.js +15 -0
  17. package/dist/decorators/validators/enum.decorator.js.map +1 -0
  18. package/dist/decorators/validators/number.decorator.d.ts +7 -0
  19. package/dist/decorators/validators/number.decorator.d.ts.map +1 -0
  20. package/dist/decorators/validators/number.decorator.js +45 -0
  21. package/dist/decorators/validators/number.decorator.js.map +1 -0
  22. package/dist/decorators/validators/property.decorator.d.ts +14 -0
  23. package/dist/decorators/validators/property.decorator.d.ts.map +1 -0
  24. package/dist/decorators/validators/property.decorator.js +58 -0
  25. package/dist/decorators/validators/property.decorator.js.map +1 -0
  26. package/dist/decorators/validators/string.decorator.d.ts +6 -0
  27. package/dist/decorators/validators/string.decorator.d.ts.map +1 -0
  28. package/dist/decorators/validators/string.decorator.js +15 -0
  29. package/dist/decorators/validators/string.decorator.js.map +1 -0
  30. package/dist/decorators/validators/utils/common-decorators.d.ts +46 -0
  31. package/dist/decorators/validators/utils/common-decorators.d.ts.map +1 -0
  32. package/dist/decorators/validators/utils/common-decorators.js +75 -0
  33. package/dist/decorators/validators/utils/common-decorators.js.map +1 -0
  34. package/dist/decorators/validators/utils/swagger.decorator.d.ts +8 -0
  35. package/dist/decorators/validators/utils/swagger.decorator.d.ts.map +1 -0
  36. package/dist/decorators/validators/utils/swagger.decorator.js +38 -0
  37. package/dist/decorators/validators/utils/swagger.decorator.js.map +1 -0
  38. package/dist/decorators/validators/utils/swagger.types.d.ts +45 -0
  39. package/dist/decorators/validators/utils/swagger.types.d.ts.map +1 -0
  40. package/dist/decorators/validators/utils/swagger.types.js +3 -0
  41. package/dist/decorators/validators/utils/swagger.types.js.map +1 -0
  42. package/dist/decorators/validators/utils/validator-options.d.ts +8 -0
  43. package/dist/decorators/validators/utils/validator-options.d.ts.map +1 -0
  44. package/dist/decorators/validators/utils/validator-options.js +11 -0
  45. package/dist/decorators/validators/utils/validator-options.js.map +1 -0
  46. package/dist/decorators/validators/validator.type.d.ts +20 -0
  47. package/dist/decorators/validators/validator.type.d.ts.map +1 -0
  48. package/dist/decorators/validators/validator.type.js +3 -0
  49. package/dist/decorators/validators/validator.type.js.map +1 -0
  50. package/dist/index.d.ts +11 -0
  51. package/dist/index.d.ts.map +1 -0
  52. package/dist/index.js +31 -0
  53. package/dist/index.js.map +1 -0
  54. package/package.json +40 -0
package/README.md ADDED
@@ -0,0 +1,294 @@
1
+ # ts-deco
2
+
3
+ TypeScript decorator utilities with **strict validation standards**
4
+
5
+ ## νŠΉμ§•
6
+
7
+ ### πŸ”’ μ—„κ²©ν•œ 검증 κΈ°μ€€
8
+
9
+ 기쑴의 λ„λ„ν•œ μ»€μŠ€ν…€ λ°μ½”λ ˆμ΄ν„° 방식과 달리, `ts-deco`λŠ” **μ—„κ²©ν•œ νƒ€μž… 검증과 검증 κ·œμΉ™**을 μ œκ³΅ν•©λ‹ˆλ‹€.
10
+
11
+ - βœ… **νƒ€μž… μ•ˆμ „μ„±**: λͺ¨λ“  λ°μ½”λ ˆμ΄ν„°λŠ” μ—„κ²©ν•œ νƒ€μž… 체크λ₯Ό κ±°μΉ©λ‹ˆλ‹€
12
+ - βœ… **λͺ…μ‹œμ  검증**: μ˜΅μ…˜κ³Ό 검증 κ·œμΉ™μ΄ λͺ…ν™•ν•˜κ²Œ μ •μ˜λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€
13
+ - βœ… **μΌκ΄€λœ λ™μž‘**: λͺ¨λ“  λ°μ½”λ ˆμ΄ν„°κ°€ λ™μΌν•œ κΈ°μ€€μœΌλ‘œ λ™μž‘ν•©λ‹ˆλ‹€
14
+ - βœ… **λŸ°νƒ€μž„ μ•ˆμ •μ„±**: 잘λͺ»λœ νƒ€μž…μ΄λ‚˜ 값에 λŒ€ν•΄ λͺ…ν™•ν•œ μ—λŸ¬λ₯Ό μ œκ³΅ν•©λ‹ˆλ‹€
15
+
16
+ ### κΈ°μ‘΄ 방식 vs ts-deco
17
+
18
+ | κΈ°μ‘΄ μ»€μŠ€ν…€ 방식 | ts-deco |
19
+ |----------------|---------|
20
+ | λŠμŠ¨ν•œ νƒ€μž… 체크 | μ—„κ²©ν•œ νƒ€μž… 검증 |
21
+ | 뢈λͺ…ν™•ν•œ 검증 κ·œμΉ™ | λͺ…μ‹œμ  검증 μ˜΅μ…˜ |
22
+ | 일관성 μ—†λŠ” λ™μž‘ | ν‘œμ€€ν™”λœ λ™μž‘ |
23
+ | λŸ°νƒ€μž„ μ—λŸ¬ κ°€λŠ₯μ„± | νƒ€μž… μ•ˆμ „μ„± 보μž₯ |
24
+
25
+ ## μ„€μΉ˜
26
+
27
+ ```bash
28
+ npm install ts-deco
29
+ ```
30
+
31
+ ## 배포
32
+
33
+ ### 사전 μ€€λΉ„
34
+
35
+ #### 1. npm 둜그인
36
+
37
+ λ°°ν¬ν•˜κΈ° 전에 npm에 λ‘œκ·ΈμΈν•΄μ•Ό ν•©λ‹ˆλ‹€:
38
+
39
+ ```bash
40
+ npm login
41
+ ```
42
+
43
+ npm 계정이 μ—†λ‹€λ©΄ [npmjs.com](https://www.npmjs.com)μ—μ„œ 계정을 μƒμ„±ν•˜μ„Έμš”.
44
+
45
+ #### 2. 2단계 인증 (2FA) μ„€μ •
46
+
47
+ npm νŒ¨ν‚€μ§€ 배포λ₯Ό μœ„ν•΄μ„œλŠ” **2단계 인증(2FA)** λ˜λŠ” **granular access token**이 ν•„μš”ν•©λ‹ˆλ‹€.
48
+
49
+ **방법 1: 2FA ν™œμ„±ν™” (ꢌμž₯)**
50
+
51
+ 1. [npmjs.com](https://www.npmjs.com)에 둜그인
52
+ 2. 계정 μ„€μ • β†’ "Two-Factor Authentication" ν™œμ„±ν™”
53
+ 3. 인증 μ•±(Google Authenticator λ“±)으둜 QR μ½”λ“œ μŠ€μΊ”
54
+ 4. 배포 μ‹œ OTP μ½”λ“œ μž…λ ₯
55
+
56
+ **방법 2: Granular Access Token μ‚¬μš©**
57
+
58
+ 1. [npmjs.com](https://www.npmjs.com) β†’ Account Settings β†’ Access Tokens
59
+ 2. "Generate New Token" β†’ "Granular Access Token" 선택
60
+ 3. κΆŒν•œ: "Publish" 선택
61
+ 4. "Bypass 2FA" μ˜΅μ…˜ ν™œμ„±ν™” (선택사항)
62
+ 5. μƒμ„±λœ 토큰을 μ‚¬μš©ν•˜μ—¬ 둜그인:
63
+
64
+ ```bash
65
+ npm login --auth-type=legacy
66
+ # λ˜λŠ” ν™˜κ²½λ³€μˆ˜λ‘œ μ„€μ •
67
+ export NPM_TOKEN=your_token_here
68
+ ```
69
+
70
+ > **μ°Έκ³ **: Granular Access Token을 μ‚¬μš©ν•˜λ©΄ 2FAλ₯Ό μš°νšŒν•  수 μžˆμ§€λ§Œ, λ³΄μ•ˆμ„ μœ„ν•΄ 2FA ν™œμ„±ν™”λ₯Ό ꢌμž₯ν•©λ‹ˆλ‹€.
71
+
72
+ ### npm 슀크립트 μ‚¬μš©
73
+
74
+ ```bash
75
+ # 패치 버전 (1.0.0 -> 1.0.1)
76
+ npm run publish:patch
77
+
78
+ # λ§ˆμ΄λ„ˆ 버전 (1.0.0 -> 1.1.0)
79
+ npm run publish:minor
80
+
81
+ # 메이저 버전 (1.0.0 -> 2.0.0)
82
+ npm run publish:major
83
+
84
+ # 배포 μ „ 확인 (μ‹€μ œ λ°°ν¬ν•˜μ§€ μ•ŠμŒ)
85
+ npm run publish:dry-run
86
+ ```
87
+
88
+ ### 배포 슀크립트 μ‚¬μš©
89
+
90
+ ```bash
91
+ # 패치 버전 배포
92
+ ./deploy.sh patch
93
+
94
+ # λ§ˆμ΄λ„ˆ 버전 배포
95
+ ./deploy.sh minor
96
+
97
+ # 메이저 버전 배포
98
+ ./deploy.sh major
99
+ ```
100
+
101
+ > **μ°Έκ³ **: 배포 전에 μžλ™μœΌλ‘œ λΉŒλ“œκ°€ μ‹€ν–‰λ˜λ©°, `prepublishOnly` 훅을 톡해 λΉŒλ“œκ°€ ν™•μΈλ©λ‹ˆλ‹€.
102
+
103
+ ## μ£Όμš” κΈ°λŠ₯
104
+
105
+ - **μ—„κ²©ν•œ νƒ€μž… 검증**을 μ œκ³΅ν•˜λŠ” DTO 검증 λ°μ½”λ ˆμ΄ν„°
106
+ - `DtoString`: λ¬Έμžμ—΄ νƒ€μž… 엄격 검증
107
+ - `DtoNumber`: 숫자 νƒ€μž… 및 λ²”μœ„ 검증 (min/max)
108
+ - `DtoDate`: λ‚ μ§œ νƒ€μž… 검증 및 λ³€ν™˜
109
+ - `DtoBoolean`: 뢈린 νƒ€μž… 검증 및 λ³€ν™˜
110
+ - `DtoEnum`: μ—΄κ±°ν˜• νƒ€μž… 엄격 검증
111
+ - `Property`: 톡합 νƒ€μž… 기반 검증
112
+ - **νƒ€μž… μ•ˆμ „ν•œ** μœ ν‹Έλ¦¬ν‹° ν•¨μˆ˜ (`applyDecorators`)
113
+
114
+ ## μ‚¬μš© μ˜ˆμ‹œ
115
+
116
+ ### κΈ°λ³Έ μ‚¬μš©λ²•
117
+
118
+ ```typescript
119
+ import { DtoString, DtoNumber, Property } from 'ts-deco';
120
+
121
+ class CreateUserDto {
122
+ // ν•„μˆ˜ λ¬Έμžμ—΄ ν•„λ“œ (μ—„κ²©ν•œ 검증)
123
+ @DtoString({ optional: false })
124
+ name: string;
125
+
126
+ // 숫자 λ²”μœ„ 검증 (0 ~ 120)
127
+ @DtoNumber({ min: 0, max: 120 })
128
+ age: number;
129
+
130
+ // 선택적 λ¬Έμžμ—΄ ν•„λ“œ
131
+ @Property({ type: String, optional: true })
132
+ email?: string;
133
+ }
134
+ ```
135
+
136
+ ### μ—„κ²©ν•œ 검증 μ˜ˆμ‹œ
137
+
138
+ ```typescript
139
+ import { DtoNumber, DtoEnum } from 'ts-deco';
140
+
141
+ enum UserRole {
142
+ ADMIN = 'admin',
143
+ USER = 'user',
144
+ }
145
+
146
+ class UpdateUserDto {
147
+ // μ΅œμ†Œ/μ΅œλŒ€κ°’μ΄ λͺ…μ‹œμ μœΌλ‘œ 검증됨
148
+ @DtoNumber({
149
+ min: 1,
150
+ max: 100,
151
+ isInt: true, // μ •μˆ˜λ§Œ ν—ˆμš©
152
+ minMessage: 'μ΅œμ†Œκ°’μ€ 1 이상이어야 ν•©λ‹ˆλ‹€',
153
+ maxMessage: 'μ΅œλŒ€κ°’μ€ 100 μ΄ν•˜μ—¬μ•Ό ν•©λ‹ˆλ‹€'
154
+ })
155
+ score: number;
156
+
157
+ // μ—΄κ±°ν˜• κ°’λ§Œ ν—ˆμš© (μ—„κ²©ν•œ νƒ€μž… 체크)
158
+ @DtoEnum(UserRole, {
159
+ optional: false,
160
+ exclude: [] // νŠΉμ • κ°’ μ œμ™Έ κ°€λŠ₯
161
+ })
162
+ role: UserRole;
163
+ }
164
+ ```
165
+
166
+ ## applyDecorators
167
+
168
+ μ—¬λŸ¬ λ°μ½”λ ˆμ΄ν„°λ₯Ό ν•˜λ‚˜λ‘œ ν•©μΉ˜λŠ” μœ ν‹Έλ¦¬ν‹° ν•¨μˆ˜μž…λ‹ˆλ‹€.
169
+
170
+ ```typescript
171
+ import { applyDecorators } from 'ts-deco';
172
+ import { ApiProperty } from '@nestjs/swagger';
173
+ import { IsString } from 'class-validator';
174
+
175
+ const MyDecorator = applyDecorators(
176
+ ApiProperty(),
177
+ IsString()
178
+ );
179
+ ```
180
+
181
+ ### μ£Όμ˜μ‚¬ν•­
182
+
183
+ ⚠️ **λͺ¨λ“  λ°μ½”λ ˆμ΄ν„°λŠ” λ™μΌν•œ νƒ€μž…μ΄μ–΄μ•Ό ν•©λ‹ˆλ‹€.**
184
+ - `ClassDecorator`끼리만 ν•©μΉ  수 μžˆμŠ΅λ‹ˆλ‹€
185
+ - `PropertyDecorator`끼리만 ν•©μΉ  수 μžˆμŠ΅λ‹ˆλ‹€
186
+ - `MethodDecorator`끼리만 ν•©μΉ  수 μžˆμŠ΅λ‹ˆλ‹€
187
+ - `ParameterDecorator`끼리만 ν•©μΉ  수 μžˆμŠ΅λ‹ˆλ‹€
188
+
189
+ ### λ°μ½”λ ˆμ΄ν„° νƒ€μž…λ³„ λ°˜ν™˜κ°’
190
+
191
+ - **ClassDecorator**: `Function | void` λ°˜ν™˜ κ°€λŠ₯
192
+ - **MethodDecorator**: `PropertyDescriptor | void` λ°˜ν™˜ κ°€λŠ₯
193
+ - **PropertyDecorator**: λ°˜ν™˜κ°’ μ—†μŒ (void)
194
+ - **ParameterDecorator**: λ°˜ν™˜κ°’ μ—†μŒ (void)
195
+
196
+ ## μ—„κ²©ν•œ 검증 κ·œμΉ™
197
+
198
+ `ts-deco`λŠ” λ‹€μŒκ³Ό 같은 μ—„κ²©ν•œ 검증 κ·œμΉ™μ„ μ μš©ν•©λ‹ˆλ‹€:
199
+
200
+ - **νƒ€μž… 뢈일치 μ‹œ μ¦‰μ‹œ μ—λŸ¬**: 잘λͺ»λœ νƒ€μž…μ΄ μ „λ‹¬λ˜λ©΄ λͺ…ν™•ν•œ μ—λŸ¬ λ©”μ‹œμ§€ 제곡
201
+ - **λ²”μœ„ 검증**: `min`/`max` μ˜΅μ…˜μ΄ 제곡되면 λ°˜λ“œμ‹œ 검증
202
+ - **ν•„μˆ˜ ν•„λ“œ 검증**: `optional: false`인 경우 값이 μ—†μœΌλ©΄ μ—λŸ¬
203
+ - **λ°°μ—΄ 검증**: `isArray: true`인 경우 λ°°μ—΄ νƒ€μž…λ§Œ ν—ˆμš©
204
+ - **μ—΄κ±°ν˜• 검증**: `DtoEnum`은 제곡된 enum κ°’λ§Œ ν—ˆμš©
205
+
206
+ ## λ°μ½”λ ˆμ΄ν„° 지원
207
+
208
+ ### Legacy Decorators (ν˜„μž¬ 지원)
209
+
210
+ ⚠️ **이 μœ ν‹Έλ¦¬ν‹°λŠ” TypeScript legacy decoratorsλ₯Ό μ§€μ›ν•©λ‹ˆλ‹€.**
211
+
212
+ ν˜„μž¬ 이 λΌμ΄λΈŒλŸ¬λ¦¬λŠ” **Legacy Decorators** (λ˜λŠ” Stage 2 Decorators)λ₯Ό 기반으둜 μž‘λ™ν•©λ‹ˆλ‹€. μ΄λŠ” TypeScriptμ—μ„œ μ˜€λž«λ™μ•ˆ μ‚¬μš©λ˜μ–΄ 온 μ•ˆμ •μ μΈ λ°μ½”λ ˆμ΄ν„° μ‹œμŠ€ν…œμž…λ‹ˆλ‹€.
213
+
214
+ ### Stage 3 DecoratorsλŠ” 아직 μ§€μ›ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€
215
+
216
+ **Stage 3 Decoratorsλž€?**
217
+
218
+ - JavaScript/TypeScript의 μƒˆλ‘œμš΄ λ°μ½”λ ˆμ΄ν„° μ œμ•ˆμœΌλ‘œ, ECMAScript ν‘œμ€€ν™” κ³Όμ •μ˜ Stage 3 단계에 μžˆλŠ” μ œμ•ˆμž…λ‹ˆλ‹€
219
+ - TypeScript 5.0 이후에 λ„μž…λœ μƒˆλ‘œμš΄ λ°μ½”λ ˆμ΄ν„° APIμž…λ‹ˆλ‹€
220
+ - κΈ°μ‘΄ Legacy Decoratorsμ™€λŠ” λ‹€λ₯Έ 문법과 λ™μž‘ 방식을 κ°€μ§‘λ‹ˆλ‹€
221
+
222
+ **μ™œ 아직 μ§€μ›ν•˜μ§€ μ•Šλ‚˜μš”?**
223
+
224
+ 1. **ν˜Έν™˜μ„±**: ν˜„μž¬ λŒ€λΆ€λΆ„μ˜ NestJS, class-validator, class-transformer λ“± μ£Όμš” λΌμ΄λΈŒλŸ¬λ¦¬λ“€μ΄ Legacy Decoratorsλ₯Ό 기반으둜 μž‘λ™ν•©λ‹ˆλ‹€
225
+ 2. **μ•ˆμ •μ„±**: Legacy DecoratorsλŠ” μ˜€λž«λ™μ•ˆ κ²€μ¦λœ μ•ˆμ •μ μΈ μ‹œμŠ€ν…œμž…λ‹ˆλ‹€
226
+ 3. **ν‘œμ€€ν™” μ§„ν–‰ 쀑**: Stage 3 DecoratorsλŠ” 아직 Stage 4(μ΅œμ’… ν‘œμ€€)κ°€ μ•„λ‹ˆλ©°, 사양이 변경될 수 μžˆμŠ΅λ‹ˆλ‹€
227
+
228
+ **Legacy Decorators vs Stage 3 Decorators**
229
+
230
+ | ν•­λͺ© | Legacy Decorators (ν˜„μž¬ 지원) | Stage 3 Decorators (미지원) |
231
+ |------|------------------------------|----------------------------|
232
+ | TypeScript μ„€μ • | `experimentalDecorators: true` | 별도 μ„€μ • ν•„μš” |
233
+ | 문법 | `@decorator` ν˜•νƒœ | `@decorator` ν˜•νƒœ (λ‚΄λΆ€ λ™μž‘ 닀름) |
234
+ | νƒ€μž… μ‹œκ·Έλ‹ˆμ²˜ | `(target, propertyKey, descriptor)` | `(value, context)` |
235
+ | 라이브러리 ν˜Έν™˜μ„± | NestJS, class-validator λ“±κ³Ό ν˜Έν™˜ | 아직 일뢀 라이브러리만 지원 |
236
+ | μ•ˆμ •μ„± | 검증됨 | ν‘œμ€€ν™” μ§„ν–‰ 쀑 |
237
+
238
+ **μ°Έκ³ **: Stage 3 Decoratorsκ°€ ν‘œμ€€ν™”λ˜κ³  μ£Όμš” λΌμ΄λΈŒλŸ¬λ¦¬λ“€μ΄ μ§€μ›ν•˜κ²Œ 되면, ν–₯ν›„ λ²„μ „μ—μ„œ 지원을 μΆ”κ°€ν•  μ˜ˆμ •μž…λ‹ˆλ‹€.
239
+
240
+ ## μ˜μ‘΄μ„±
241
+
242
+ 이 λΌμ΄λΈŒλŸ¬λ¦¬λŠ” λ‹€μŒ νŒ¨ν‚€μ§€λ“€μ„ **peer dependencies**둜 μ‚¬μš©ν•©λ‹ˆλ‹€:
243
+
244
+ ### Peer Dependencies
245
+
246
+ | νŒ¨ν‚€μ§€ | 버전 | μš©λ„ | λΌμ΄μ„ μŠ€ |
247
+ |--------|------|------|----------|
248
+ | `@nestjs/swagger` | ^7.0.0 | API λ¬Έμ„œν™” λ°μ½”λ ˆμ΄ν„° (`ApiProperty`, `ApiPropertyOptional`) | MIT |
249
+ | `class-transformer` | ^0.5.0 | νƒ€μž… λ³€ν™˜ λ°μ½”λ ˆμ΄ν„° (`Type`, `Transform`) | MIT |
250
+ | `class-validator` | ^0.14.0 | 검증 λ°μ½”λ ˆμ΄ν„° (`IsString`, `IsNumber`, `IsDate`, `IsBoolean`, `IsEnum`, `IsArray`, `IsDefined`, `IsNotEmpty`, `IsOptional`, `Min`, `Max` λ“±) | MIT |
251
+
252
+ ### 개발 μ˜μ‘΄μ„±
253
+
254
+ - `typescript`: ^5.0.0 (컴파일 νƒ€μž„ νƒ€μž… 검사 및 트랜슀파일)
255
+
256
+ > **μ°Έκ³ **: 이 λΌμ΄λΈŒλŸ¬λ¦¬λŠ” λŸ°νƒ€μž„μ— μœ„ νŒ¨ν‚€μ§€λ“€μ΄ μ„€μΉ˜λ˜μ–΄ μžˆμ–΄μ•Ό ν•©λ‹ˆλ‹€. `npm install` μ‹œ μžλ™μœΌλ‘œ μ„€μΉ˜λ˜μ§€ μ•ŠμœΌλ―€λ‘œ, ν”„λ‘œμ νŠΈμ— 직접 μ„€μΉ˜ν•΄μ•Ό ν•©λ‹ˆλ‹€.
257
+
258
+ ## λΌμ΄μ„ μŠ€
259
+
260
+ ### λ³Έ ν”„λ‘œμ νŠΈ λΌμ΄μ„ μŠ€
261
+
262
+ 이 ν”„λ‘œμ νŠΈλŠ” **ISC (Internet Systems Consortium) License** ν•˜μ— λ°°ν¬λ©λ‹ˆλ‹€.
263
+
264
+ ```
265
+ ISC License
266
+
267
+ Copyright (c) 2025 ts-deco contributors
268
+
269
+ Permission to use, copy, modify, and/or distribute this software for any
270
+ purpose with or without fee is hereby granted, provided that the above
271
+ copyright notice and this permission notice appear in all copies.
272
+
273
+ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
274
+ WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
275
+ MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
276
+ ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
277
+ WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
278
+ ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
279
+ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
280
+ ```
281
+
282
+ ### μ˜μ‘΄μ„± λΌμ΄μ„ μŠ€
283
+
284
+ 이 ν”„λ‘œμ νŠΈκ°€ μ‚¬μš©ν•˜λŠ” λͺ¨λ“  μ˜μ‘΄μ„±μ€ **MIT License** ν•˜μ— 배포되며, ISC License와 ν˜Έν™˜λ©λ‹ˆλ‹€.
285
+
286
+ - `@nestjs/swagger`: MIT License
287
+ - `class-transformer`: MIT License
288
+ - `class-validator`: MIT License
289
+
290
+ 각 νŒ¨ν‚€μ§€μ˜ λΌμ΄μ„ μŠ€ 전문은 ν•΄λ‹Ή νŒ¨ν‚€μ§€μ˜ `LICENSE` 파일 λ˜λŠ” npm νŒ¨ν‚€μ§€ νŽ˜μ΄μ§€μ—μ„œ 확인할 수 μžˆμŠ΅λ‹ˆλ‹€.
291
+
292
+ ### λΌμ΄μ„ μŠ€ ν˜Έν™˜μ„±
293
+
294
+ ISC LicenseλŠ” MIT License와 맀우 μœ μ‚¬ν•˜λ©°, 두 λΌμ΄μ„ μŠ€ λͺ¨λ‘ 맀우 κ΄€λŒ€ν•œ(permissive) μ˜€ν”ˆμ†ŒμŠ€ λΌμ΄μ„ μŠ€μž…λ‹ˆλ‹€. 이 ν”„λ‘œμ νŠΈμ™€ μ˜μ‘΄μ„± νŒ¨ν‚€μ§€λ“€μ€ λͺ¨λ‘ μƒν˜Έ ν˜Έν™˜λ˜λŠ” λΌμ΄μ„ μŠ€λ₯Ό μ‚¬μš©ν•˜λ―€λ‘œ 법적 λ¬Έμ œκ°€ μ—†μŠ΅λ‹ˆλ‹€.
@@ -0,0 +1,21 @@
1
+ /**
2
+ * μ—¬λŸ¬ λ°μ½”λ ˆμ΄ν„°λ₯Ό ν•˜λ‚˜λ‘œ ν•©μΉ˜λŠ” μœ ν‹Έλ¦¬ν‹° ν•¨μˆ˜
3
+ * TypeScript의 λͺ¨λ“  λ°μ½”λ ˆμ΄ν„° νƒ€μž…μ„ μ§€μ›ν•©λ‹ˆλ‹€.
4
+ */
5
+ /**
6
+ * Class λ°μ½”λ ˆμ΄ν„°λ₯Ό ν•©μΉ©λ‹ˆλ‹€.
7
+ */
8
+ export declare function applyDecorators(...decorators: ClassDecorator[]): ClassDecorator;
9
+ /**
10
+ * Property λ°μ½”λ ˆμ΄ν„°λ₯Ό ν•©μΉ©λ‹ˆλ‹€.
11
+ */
12
+ export declare function applyDecorators(...decorators: PropertyDecorator[]): PropertyDecorator;
13
+ /**
14
+ * Method λ°μ½”λ ˆμ΄ν„°λ₯Ό ν•©μΉ©λ‹ˆλ‹€.
15
+ */
16
+ export declare function applyDecorators(...decorators: MethodDecorator[]): MethodDecorator;
17
+ /**
18
+ * Parameter λ°μ½”λ ˆμ΄ν„°λ₯Ό ν•©μΉ©λ‹ˆλ‹€.
19
+ */
20
+ export declare function applyDecorators(...decorators: ParameterDecorator[]): ParameterDecorator;
21
+ //# sourceMappingURL=apply-decorators.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"apply-decorators.d.ts","sourceRoot":"","sources":["../../../src/decorators/utils/apply-decorators.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;GAEG;AACH,wBAAgB,eAAe,CAAC,GAAG,UAAU,EAAE,cAAc,EAAE,GAAG,cAAc,CAAC;AAEjF;;GAEG;AACH,wBAAgB,eAAe,CAAC,GAAG,UAAU,EAAE,iBAAiB,EAAE,GAAG,iBAAiB,CAAC;AAEvF;;GAEG;AACH,wBAAgB,eAAe,CAAC,GAAG,UAAU,EAAE,eAAe,EAAE,GAAG,eAAe,CAAC;AAEnF;;GAEG;AACH,wBAAgB,eAAe,CAAC,GAAG,UAAU,EAAE,kBAAkB,EAAE,GAAG,kBAAkB,CAAC"}
@@ -0,0 +1,52 @@
1
+ "use strict";
2
+ /**
3
+ * μ—¬λŸ¬ λ°μ½”λ ˆμ΄ν„°λ₯Ό ν•˜λ‚˜λ‘œ ν•©μΉ˜λŠ” μœ ν‹Έλ¦¬ν‹° ν•¨μˆ˜
4
+ * TypeScript의 λͺ¨λ“  λ°μ½”λ ˆμ΄ν„° νƒ€μž…μ„ μ§€μ›ν•©λ‹ˆλ‹€.
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.applyDecorators = applyDecorators;
8
+ /**
9
+ * μ—¬λŸ¬ λ°μ½”λ ˆμ΄ν„°λ₯Ό ν•˜λ‚˜λ‘œ ν•©μΉ˜λŠ” κ΅¬ν˜„ ν•¨μˆ˜
10
+ *
11
+ * ⚠️ 주의: λͺ¨λ“  λ°μ½”λ ˆμ΄ν„°λŠ” λ™μΌν•œ νƒ€μž…μ΄μ–΄μ•Ό ν•©λ‹ˆλ‹€.
12
+ * (ClassDecorator, PropertyDecorator, MethodDecorator, ParameterDecorator 쀑 ν•˜λ‚˜)
13
+ */
14
+ function applyDecorators(...decorators) {
15
+ return function (target, propertyKey, descriptorOrIndex) {
16
+ for (const decorator of decorators) {
17
+ if (descriptorOrIndex !== undefined) {
18
+ if (typeof descriptorOrIndex === 'number') {
19
+ // ParameterDecorator: (target, propertyKey, parameterIndex) => void
20
+ // λ°˜ν™˜κ°’ μ—†μŒ (void)
21
+ decorator(target, propertyKey, descriptorOrIndex);
22
+ }
23
+ else {
24
+ // MethodDecorator: (target, propertyKey, descriptor) => PropertyDescriptor | void
25
+ // PropertyDescriptorλ₯Ό λ°˜ν™˜ν•  수 있음
26
+ const result = decorator(target, propertyKey, descriptorOrIndex);
27
+ if (result !== undefined) {
28
+ descriptorOrIndex = result;
29
+ }
30
+ }
31
+ }
32
+ else if (propertyKey !== undefined) {
33
+ // PropertyDecorator: (target, propertyKey) => void
34
+ // λ°˜ν™˜κ°’ μ—†μŒ (void)
35
+ decorator(target, propertyKey);
36
+ }
37
+ else {
38
+ // ClassDecorator: (target) => Function | void
39
+ // Function을 λ°˜ν™˜ν•  수 있음
40
+ const result = decorator(target);
41
+ if (result !== undefined) {
42
+ target = result;
43
+ }
44
+ }
45
+ }
46
+ // MethodDecorator일 λ•ŒλŠ” PropertyDescriptor λ°˜ν™˜
47
+ // ClassDecorator일 λ•ŒλŠ” Function λ°˜ν™˜
48
+ // PropertyDecorator/ParameterDecorator일 λ•ŒλŠ” λ°˜ν™˜κ°’ μ—†μŒ (undefined)
49
+ return descriptorOrIndex ?? target;
50
+ };
51
+ }
52
+ //# sourceMappingURL=apply-decorators.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"apply-decorators.js","sourceRoot":"","sources":["../../../src/decorators/utils/apply-decorators.ts"],"names":[],"mappings":";AAAA;;;GAGG;;AA4BH,0CAmCC;AAzCD;;;;;GAKG;AACH,SAAgB,eAAe,CAAC,GAAG,UAAiB;IAChD,OAAO,UAAU,MAAW,EAAE,WAA6B,EAAE,iBAA+C;QACxG,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;YACjC,IAAI,iBAAiB,KAAK,SAAS,EAAE,CAAC;gBAClC,IAAI,OAAO,iBAAiB,KAAK,QAAQ,EAAE,CAAC;oBACxC,oEAAoE;oBACpE,gBAAgB;oBAChB,SAAS,CAAC,MAAM,EAAE,WAAW,EAAE,iBAAiB,CAAC,CAAC;gBACtD,CAAC;qBAAM,CAAC;oBACJ,kFAAkF;oBAClF,+BAA+B;oBAC/B,MAAM,MAAM,GAAG,SAAS,CAAC,MAAM,EAAE,WAAW,EAAE,iBAAiB,CAAC,CAAC;oBACjE,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;wBACvB,iBAAiB,GAAG,MAAM,CAAC;oBAC/B,CAAC;gBACL,CAAC;YACL,CAAC;iBAAM,IAAI,WAAW,KAAK,SAAS,EAAE,CAAC;gBACnC,mDAAmD;gBACnD,gBAAgB;gBAChB,SAAS,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;YACnC,CAAC;iBAAM,CAAC;gBACJ,8CAA8C;gBAC9C,qBAAqB;gBACrB,MAAM,MAAM,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC;gBACjC,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;oBACvB,MAAM,GAAG,MAAM,CAAC;gBACpB,CAAC;YACL,CAAC;QACL,CAAC;QAED,4CAA4C;QAC5C,iCAAiC;QACjC,8DAA8D;QAC9D,OAAO,iBAAiB,IAAI,MAAM,CAAC;IACvC,CAAC,CAAC;AACN,CAAC"}
@@ -0,0 +1,6 @@
1
+ import { ApiPropertyOptions } from '@nestjs/swagger';
2
+ import { DtoValidatorOptions } from './validator.type';
3
+ type DtoBooleanOptions = ApiPropertyOptions & DtoValidatorOptions;
4
+ export default function DtoBoolean(options?: DtoBooleanOptions): PropertyDecorator;
5
+ export {};
6
+ //# sourceMappingURL=boolean.decorator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"boolean.decorator.d.ts","sourceRoot":"","sources":["../../../src/decorators/validators/boolean.decorator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAKrD,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAGvD,KAAK,iBAAiB,GAAG,kBAAkB,GAAG,mBAAmB,CAAC;AAElE,MAAM,CAAC,OAAO,UAAU,UAAU,CAAC,OAAO,CAAC,EAAE,iBAAiB,qBAgC7D"}
@@ -0,0 +1,40 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.default = DtoBoolean;
4
+ const class_validator_1 = require("class-validator");
5
+ const apply_decorators_1 = require("../utils/apply-decorators");
6
+ const class_transformer_1 = require("class-transformer");
7
+ const validator_options_1 = require("./utils/validator-options");
8
+ const common_decorators_1 = require("./utils/common-decorators");
9
+ function DtoBoolean(options) {
10
+ const { isArray = false, optional = false, validatorMessage, arrayMessage, ...swaggerOptions } = options || {};
11
+ const validatorOption = (0, validator_options_1.getValidatorOptions)({ isArray, validatorMessage });
12
+ const each = validatorOption.each ?? false;
13
+ return (0, apply_decorators_1.applyDecorators)((0, common_decorators_1.getApiPropertyDecorator)(optional, Boolean, isArray, swaggerOptions), (0, class_transformer_1.Transform)(({ value }) => {
14
+ if (Array.isArray(value)) {
15
+ return value.map(v => {
16
+ if (typeof v === 'boolean')
17
+ return v;
18
+ if (typeof v === 'string') {
19
+ const lower = v.toLowerCase();
20
+ if (['true', '1'].includes(lower))
21
+ return true;
22
+ if (['false', '0'].includes(lower))
23
+ return false;
24
+ }
25
+ return v;
26
+ });
27
+ }
28
+ if (typeof value === 'boolean')
29
+ return value;
30
+ if (typeof value === 'string') {
31
+ const lower = value.toLowerCase();
32
+ if (['true', '1'].includes(lower))
33
+ return true;
34
+ if (['false', '0'].includes(lower))
35
+ return false;
36
+ }
37
+ return value;
38
+ }), (0, common_decorators_1.getRequiredValidator)(optional, each), ...(0, common_decorators_1.getIsArrayDecorator)(isArray, arrayMessage), (0, class_validator_1.IsBoolean)(validatorOption));
39
+ }
40
+ //# sourceMappingURL=boolean.decorator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"boolean.decorator.js","sourceRoot":"","sources":["../../../src/decorators/validators/boolean.decorator.ts"],"names":[],"mappings":";;AAUA,6BAgCC;AAzCD,qDAA4C;AAC5C,gEAA4D;AAC5D,yDAA8C;AAC9C,iEAAgE;AAEhE,iEAA+G;AAI/G,SAAwB,UAAU,CAAC,OAA2B;IAC1D,MAAM,EAAE,OAAO,GAAG,KAAK,EAAE,QAAQ,GAAG,KAAK,EAAE,gBAAgB,EAAE,YAAY,EAAE,GAAG,cAAc,EAAE,GAAG,OAAO,IAAI,EAAE,CAAC;IAE/G,MAAM,eAAe,GAAG,IAAA,uCAAmB,EAAC,EAAE,OAAO,EAAE,gBAAgB,EAAE,CAAC,CAAC;IAC3E,MAAM,IAAI,GAAG,eAAe,CAAC,IAAI,IAAI,KAAK,CAAC;IAE3C,OAAO,IAAA,kCAAe,EAClB,IAAA,2CAAuB,EAAC,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,cAAc,CAAC,EACnE,IAAA,6BAAS,EAAC,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE;QACpB,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YACvB,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE;gBACjB,IAAI,OAAO,CAAC,KAAK,SAAS;oBAAE,OAAO,CAAC,CAAC;gBACrC,IAAI,OAAO,CAAC,KAAK,QAAQ,EAAE,CAAC;oBACxB,MAAM,KAAK,GAAG,CAAC,CAAC,WAAW,EAAE,CAAC;oBAC9B,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC;wBAAE,OAAO,IAAI,CAAC;oBAC/C,IAAI,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC;wBAAE,OAAO,KAAK,CAAC;gBACrD,CAAC;gBACD,OAAO,CAAC,CAAC;YACb,CAAC,CAAC,CAAC;QACP,CAAC;QACD,IAAI,OAAO,KAAK,KAAK,SAAS;YAAE,OAAO,KAAK,CAAC;QAC7C,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC5B,MAAM,KAAK,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;YAClC,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC;gBAAE,OAAO,IAAI,CAAC;YAC/C,IAAI,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC;gBAAE,OAAO,KAAK,CAAC;QACrD,CAAC;QACD,OAAO,KAAK,CAAC;IACjB,CAAC,CAAC,EACF,IAAA,wCAAoB,EAAC,QAAQ,EAAE,IAAI,CAAC,EACpC,GAAG,IAAA,uCAAmB,EAAC,OAAO,EAAE,YAAY,CAAC,EAC7C,IAAA,2BAAS,EAAC,eAAe,CAAC,CAC7B,CAAC;AACN,CAAC"}
@@ -0,0 +1,6 @@
1
+ import { ApiPropertyOptions } from '@nestjs/swagger';
2
+ import { DtoValidatorOptions } from './validator.type';
3
+ type DtoDateOptions = ApiPropertyOptions & DtoValidatorOptions;
4
+ export default function DtoDate(options?: DtoDateOptions): PropertyDecorator;
5
+ export {};
6
+ //# sourceMappingURL=date.decorator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"date.decorator.d.ts","sourceRoot":"","sources":["../../../src/decorators/validators/date.decorator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAKrD,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAGvD,KAAK,cAAc,GAAG,kBAAkB,GAAG,mBAAmB,CAAC;AAE/D,MAAM,CAAC,OAAO,UAAU,OAAO,CAAC,OAAO,CAAC,EAAE,cAAc,qBAsBvD"}
@@ -0,0 +1,24 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.default = DtoDate;
4
+ const class_validator_1 = require("class-validator");
5
+ const apply_decorators_1 = require("../utils/apply-decorators");
6
+ const class_transformer_1 = require("class-transformer");
7
+ const validator_options_1 = require("./utils/validator-options");
8
+ const common_decorators_1 = require("./utils/common-decorators");
9
+ function DtoDate(options) {
10
+ const { isArray = false, optional = false, validatorMessage, arrayMessage, ...swaggerOptions } = options || {};
11
+ const validatorOption = (0, validator_options_1.getValidatorOptions)({ isArray, validatorMessage });
12
+ const each = validatorOption.each ?? false;
13
+ return (0, apply_decorators_1.applyDecorators)((0, common_decorators_1.getApiPropertyDecorator)(optional, Date, isArray, swaggerOptions), (0, class_transformer_1.Transform)(({ value }) => {
14
+ if (Array.isArray(value)) {
15
+ return value.map(v => {
16
+ const d = new Date(v);
17
+ return isNaN(d.getTime()) ? v : d;
18
+ });
19
+ }
20
+ const d = new Date(value);
21
+ return isNaN(d.getTime()) ? value : d;
22
+ }), (0, common_decorators_1.getRequiredValidator)(optional, each), ...(0, common_decorators_1.getIsArrayDecorator)(isArray, arrayMessage), (0, class_validator_1.IsDate)(validatorOption));
23
+ }
24
+ //# sourceMappingURL=date.decorator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"date.decorator.js","sourceRoot":"","sources":["../../../src/decorators/validators/date.decorator.ts"],"names":[],"mappings":";;AAUA,0BAsBC;AA/BD,qDAAyC;AACzC,gEAA4D;AAC5D,yDAA8C;AAC9C,iEAAgE;AAEhE,iEAA+G;AAI/G,SAAwB,OAAO,CAAC,OAAwB;IACpD,MAAM,EAAE,OAAO,GAAG,KAAK,EAAE,QAAQ,GAAG,KAAK,EAAE,gBAAgB,EAAE,YAAY,EAAE,GAAG,cAAc,EAAE,GAAG,OAAO,IAAI,EAAE,CAAC;IAE/G,MAAM,eAAe,GAAG,IAAA,uCAAmB,EAAC,EAAE,OAAO,EAAE,gBAAgB,EAAE,CAAC,CAAC;IAC3E,MAAM,IAAI,GAAG,eAAe,CAAC,IAAI,IAAI,KAAK,CAAC;IAE3C,OAAO,IAAA,kCAAe,EAClB,IAAA,2CAAuB,EAAC,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,cAAc,CAAC,EAChE,IAAA,6BAAS,EAAC,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE;QACpB,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YACvB,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE;gBACjB,MAAM,CAAC,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC;gBACtB,OAAO,KAAK,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACtC,CAAC,CAAC,CAAC;QACP,CAAC;QACD,MAAM,CAAC,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC;QAC1B,OAAO,KAAK,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAC1C,CAAC,CAAC,EACF,IAAA,wCAAoB,EAAC,QAAQ,EAAE,IAAI,CAAC,EACpC,GAAG,IAAA,uCAAmB,EAAC,OAAO,EAAE,YAAY,CAAC,EAC7C,IAAA,wBAAM,EAAC,eAAe,CAAC,CAC1B,CAAC;AACN,CAAC"}
@@ -0,0 +1,6 @@
1
+ import { ApiPropertyOptions } from '@nestjs/swagger';
2
+ import { DtoEnumValidatorOptions } from './validator.type';
3
+ type DtoEnumOptions = ApiPropertyOptions & DtoEnumValidatorOptions;
4
+ export default function DtoEnum(enumType: object, options?: DtoEnumOptions): PropertyDecorator;
5
+ export {};
6
+ //# sourceMappingURL=enum.decorator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"enum.decorator.d.ts","sourceRoot":"","sources":["../../../src/decorators/validators/enum.decorator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAIrD,OAAO,EAAE,uBAAuB,EAAE,MAAM,kBAAkB,CAAC;AAG3D,KAAK,cAAc,GAAG,kBAAkB,GAAG,uBAAuB,CAAC;AAEnE,MAAM,CAAC,OAAO,UAAU,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,cAAc,qBAmBzE"}
@@ -0,0 +1,15 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.default = DtoEnum;
4
+ const class_validator_1 = require("class-validator");
5
+ const apply_decorators_1 = require("../utils/apply-decorators");
6
+ const validator_options_1 = require("./utils/validator-options");
7
+ const common_decorators_1 = require("./utils/common-decorators");
8
+ function DtoEnum(enumType, options) {
9
+ const { isArray = false, optional = false, exclude = [], validatorMessage, arrayMessage, ...swaggerOptions } = options || {};
10
+ const validatorOption = (0, validator_options_1.getValidatorOptions)({ isArray, validatorMessage });
11
+ const each = validatorOption.each ?? false;
12
+ const enumValues = Object.values(enumType).filter(v => !exclude.includes(v));
13
+ return (0, apply_decorators_1.applyDecorators)((0, common_decorators_1.getApiPropertyDecorator)(optional, undefined, isArray, { enum: enumValues, ...swaggerOptions }), (0, common_decorators_1.getRequiredValidator)(optional, each), ...(0, common_decorators_1.getIsArrayDecorator)(isArray, arrayMessage), (0, class_validator_1.IsEnum)(enumValues, validatorOption));
14
+ }
15
+ //# sourceMappingURL=enum.decorator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"enum.decorator.js","sourceRoot":"","sources":["../../../src/decorators/validators/enum.decorator.ts"],"names":[],"mappings":";;AASA,0BAmBC;AA3BD,qDAAyC;AACzC,gEAA4D;AAC5D,iEAAgE;AAEhE,iEAA+G;AAI/G,SAAwB,OAAO,CAAC,QAAgB,EAAE,OAAwB;IACtE,MAAM,EACF,OAAO,GAAG,KAAK,EACf,QAAQ,GAAG,KAAK,EAChB,OAAO,GAAG,EAAE,EACZ,gBAAgB,EAChB,YAAY,EACZ,GAAG,cAAc,EACpB,GAAG,OAAO,IAAI,EAAE,CAAC;IAClB,MAAM,eAAe,GAAG,IAAA,uCAAmB,EAAC,EAAE,OAAO,EAAE,gBAAgB,EAAE,CAAC,CAAC;IAC3E,MAAM,IAAI,GAAG,eAAe,CAAC,IAAI,IAAI,KAAK,CAAC;IAC3C,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;IAE7E,OAAO,IAAA,kCAAe,EAClB,IAAA,2CAAuB,EAAC,QAAQ,EAAE,SAAS,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,cAAc,EAAE,CAAC,EAC9F,IAAA,wCAAoB,EAAC,QAAQ,EAAE,IAAI,CAAC,EACpC,GAAG,IAAA,uCAAmB,EAAC,OAAO,EAAE,YAAY,CAAC,EAC7C,IAAA,wBAAM,EAAC,UAAiB,EAAE,eAAe,CAAC,CAC7C,CAAC;AACN,CAAC"}
@@ -0,0 +1,7 @@
1
+ import { ApiPropertyOptions } from '@nestjs/swagger';
2
+ import { IsNumberOptions } from 'class-validator';
3
+ import { DtoNumberValidatorOptions } from './validator.type';
4
+ type DtoNumberOptions = ApiPropertyOptions & IsNumberOptions & DtoNumberValidatorOptions;
5
+ export default function DtoNumber(options?: DtoNumberOptions): PropertyDecorator;
6
+ export {};
7
+ //# sourceMappingURL=number.decorator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"number.decorator.d.ts","sourceRoot":"","sources":["../../../src/decorators/validators/number.decorator.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAErD,OAAO,EAAmB,eAAe,EAAY,MAAM,iBAAiB,CAAC;AAC7E,OAAO,EAAE,yBAAyB,EAAE,MAAM,kBAAkB,CAAC;AAI7D,KAAK,gBAAgB,GAAG,kBAAkB,GAAG,eAAe,GAAG,yBAAyB,CAAC;AAEzF,MAAM,CAAC,OAAO,UAAU,SAAS,CAAC,OAAO,CAAC,EAAE,gBAAgB,qBAoE3D"}
@@ -0,0 +1,45 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.default = DtoNumber;
4
+ const apply_decorators_1 = require("../utils/apply-decorators");
5
+ const class_transformer_1 = require("class-transformer");
6
+ const class_validator_1 = require("class-validator");
7
+ const validator_options_1 = require("./utils/validator-options");
8
+ const common_decorators_1 = require("./utils/common-decorators");
9
+ function DtoNumber(options) {
10
+ const { isArray = false, optional = false, isInt = false, validatorMessage, arrayMessage, min, max,
11
+ // IsNumberOptions
12
+ allowNaN = false, allowInfinity = false, maxDecimalPlaces = 0, minMessage, maxMessage,
13
+ // ApiPropertyOptions
14
+ ...swaggerOptions } = options || {};
15
+ const validatorOption = (0, validator_options_1.getValidatorOptions)({ isArray, validatorMessage });
16
+ const each = validatorOption.each ?? false;
17
+ // Min/Max κ²€μ¦μš© μ˜΅μ…˜ (message μ œμ™Έ, minMessage/maxMessageκ°€ μš°μ„ )
18
+ const { message: _, ...minMaxValidatorOption } = validatorOption;
19
+ const isNumberOption = allowNaN !== undefined || allowInfinity !== undefined || maxDecimalPlaces !== undefined
20
+ ? {
21
+ ...(allowNaN !== undefined && { allowNaN }),
22
+ ...(allowInfinity !== undefined && { allowInfinity }),
23
+ ...(maxDecimalPlaces !== undefined && { maxDecimalPlaces }),
24
+ }
25
+ : undefined;
26
+ // 숫자 검증 λ°μ½”λ ˆμ΄ν„°
27
+ const numberValidator = isInt ? (0, class_validator_1.IsInt)(validatorOption) : (0, class_validator_1.IsNumber)(isNumberOption, validatorOption);
28
+ const minMaxValidators = [];
29
+ if (min !== undefined) {
30
+ minMaxValidators.push((0, class_validator_1.Min)(min, {
31
+ ...minMaxValidatorOption,
32
+ each,
33
+ message: minMessage,
34
+ }));
35
+ }
36
+ if (max !== undefined) {
37
+ minMaxValidators.push((0, class_validator_1.Max)(max, {
38
+ ...minMaxValidatorOption,
39
+ each,
40
+ message: maxMessage,
41
+ }));
42
+ }
43
+ return (0, apply_decorators_1.applyDecorators)((0, common_decorators_1.getApiPropertyDecorator)(optional, Number, isArray, swaggerOptions), (0, common_decorators_1.getRequiredValidator)(optional, each), (0, class_transformer_1.Transform)(({ value }) => (Array.isArray(value) ? value.map(Number) : Number(value))), numberValidator, ...(0, common_decorators_1.getIsArrayDecorator)(isArray, arrayMessage), ...minMaxValidators);
44
+ }
45
+ //# sourceMappingURL=number.decorator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"number.decorator.js","sourceRoot":"","sources":["../../../src/decorators/validators/number.decorator.ts"],"names":[],"mappings":";;AAUA,4BAoEC;AA9ED,gEAA4D;AAE5D,yDAA8C;AAC9C,qDAA6E;AAE7E,iEAAgE;AAChE,iEAA+G;AAI/G,SAAwB,SAAS,CAAC,OAA0B;IACxD,MAAM,EACF,OAAO,GAAG,KAAK,EACf,QAAQ,GAAG,KAAK,EAChB,KAAK,GAAG,KAAK,EACb,gBAAgB,EAChB,YAAY,EACZ,GAAG,EACH,GAAG;IAEH,kBAAkB;IAClB,QAAQ,GAAG,KAAK,EAChB,aAAa,GAAG,KAAK,EACrB,gBAAgB,GAAG,CAAC,EACpB,UAAU,EACV,UAAU;IAEV,qBAAqB;IACrB,GAAG,cAAc,EACpB,GAAG,OAAO,IAAI,EAAE,CAAC;IAElB,MAAM,eAAe,GAAG,IAAA,uCAAmB,EAAC,EAAE,OAAO,EAAE,gBAAgB,EAAE,CAAC,CAAC;IAC3E,MAAM,IAAI,GAAG,eAAe,CAAC,IAAI,IAAI,KAAK,CAAC;IAE3C,yDAAyD;IACzD,MAAM,EAAE,OAAO,EAAE,CAAC,EAAE,GAAG,qBAAqB,EAAE,GAAG,eAAe,CAAC;IAEjE,MAAM,cAAc,GAChB,QAAQ,KAAK,SAAS,IAAI,aAAa,KAAK,SAAS,IAAI,gBAAgB,KAAK,SAAS;QACnF,CAAC,CAAC;YACI,GAAG,CAAC,QAAQ,KAAK,SAAS,IAAI,EAAE,QAAQ,EAAE,CAAC;YAC3C,GAAG,CAAC,aAAa,KAAK,SAAS,IAAI,EAAE,aAAa,EAAE,CAAC;YACrD,GAAG,CAAC,gBAAgB,KAAK,SAAS,IAAI,EAAE,gBAAgB,EAAE,CAAC;SAC9D;QACH,CAAC,CAAC,SAAS,CAAC;IAEpB,cAAc;IACd,MAAM,eAAe,GAAG,KAAK,CAAC,CAAC,CAAC,IAAA,uBAAK,EAAC,eAAe,CAAC,CAAC,CAAC,CAAC,IAAA,0BAAQ,EAAC,cAAc,EAAE,eAAe,CAAC,CAAC;IAEnG,MAAM,gBAAgB,GAAwB,EAAE,CAAC;IAEjD,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;QACpB,gBAAgB,CAAC,IAAI,CACjB,IAAA,qBAAG,EAAC,GAAG,EAAE;YACL,GAAG,qBAAqB;YACxB,IAAI;YACJ,OAAO,EAAE,UAAU;SACtB,CAAC,CACL,CAAC;IACN,CAAC;IACD,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;QACpB,gBAAgB,CAAC,IAAI,CACjB,IAAA,qBAAG,EAAC,GAAG,EAAE;YACL,GAAG,qBAAqB;YACxB,IAAI;YACJ,OAAO,EAAE,UAAU;SACtB,CAAC,CACL,CAAC;IACN,CAAC;IAED,OAAO,IAAA,kCAAe,EAClB,IAAA,2CAAuB,EAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc,CAAC,EAClE,IAAA,wCAAoB,EAAC,QAAQ,EAAE,IAAI,CAAC,EACpC,IAAA,6BAAS,EAAC,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EACpF,eAAe,EACf,GAAG,IAAA,uCAAmB,EAAC,OAAO,EAAE,YAAY,CAAC,EAC7C,GAAG,gBAAgB,CACtB,CAAC;AACN,CAAC"}
@@ -0,0 +1,14 @@
1
+ import { ApiPropertyOptions } from '@nestjs/swagger';
2
+ import { IsNumberOptions } from 'class-validator';
3
+ import { DtoEnumValidatorOptions, DtoNumberValidatorOptions, DtoValidatorOptions } from './validator.type';
4
+ type PropertyStringOptions = ApiPropertyOptions & DtoValidatorOptions;
5
+ type PropertyNumberOptions = ApiPropertyOptions & IsNumberOptions & DtoNumberValidatorOptions;
6
+ type PropertyDateOptions = ApiPropertyOptions & DtoValidatorOptions;
7
+ type PropertyBooleanOptions = ApiPropertyOptions & DtoValidatorOptions;
8
+ type PropertyEnumOptions = ApiPropertyOptions & DtoEnumValidatorOptions & {
9
+ enum: object;
10
+ };
11
+ type PropertyOptions = PropertyStringOptions | PropertyNumberOptions | PropertyDateOptions | PropertyBooleanOptions | PropertyEnumOptions;
12
+ export default function Property(options: PropertyOptions): PropertyDecorator;
13
+ export {};
14
+ //# sourceMappingURL=property.decorator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"property.decorator.d.ts","sourceRoot":"","sources":["../../../src/decorators/validators/property.decorator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AACrD,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAMlD,OAAO,EAAE,uBAAuB,EAAE,yBAAyB,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAG3G,KAAK,qBAAqB,GAAG,kBAAkB,GAAG,mBAAmB,CAAC;AACtE,KAAK,qBAAqB,GAAG,kBAAkB,GAAG,eAAe,GAAG,yBAAyB,CAAC;AAC9F,KAAK,mBAAmB,GAAG,kBAAkB,GAAG,mBAAmB,CAAC;AACpE,KAAK,sBAAsB,GAAG,kBAAkB,GAAG,mBAAmB,CAAC;AACvE,KAAK,mBAAmB,GAAG,kBAAkB,GAAG,uBAAuB,GAAG;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AAG3F,KAAK,eAAe,GACd,qBAAqB,GACrB,qBAAqB,GACrB,mBAAmB,GACnB,sBAAsB,GACtB,mBAAmB,CAAC;AAE1B,MAAM,CAAC,OAAO,UAAU,QAAQ,CAAC,OAAO,EAAE,eAAe,GAAG,iBAAiB,CAkD5E"}
@@ -0,0 +1,58 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.default = Property;
7
+ const string_decorator_1 = __importDefault(require("./string.decorator"));
8
+ const number_decorator_1 = __importDefault(require("./number.decorator"));
9
+ const date_decorator_1 = __importDefault(require("./date.decorator"));
10
+ const boolean_decorator_1 = __importDefault(require("./boolean.decorator"));
11
+ const enum_decorator_1 = __importDefault(require("./enum.decorator"));
12
+ function Property(options) {
13
+ // enum이 있으면 enum 처리
14
+ if ('enum' in options && options.enum) {
15
+ const { enum: enumType, ...restOptions } = options;
16
+ return (0, enum_decorator_1.default)(enumType, restOptions);
17
+ }
18
+ // type이 μ—†μœΌλ©΄ μ—λŸ¬
19
+ if (!options.type) {
20
+ throw new Error('type λ˜λŠ” enum 속성이 ν•„μš”ν•©λ‹ˆλ‹€.');
21
+ }
22
+ const { type, ...restOptions } = options;
23
+ // type이 μƒμ„±μž ν•¨μˆ˜μΈ 경우 name으둜 λΆ„κΈ° 처리
24
+ if (typeof type === 'function') {
25
+ const typeName = type.name;
26
+ switch (typeName) {
27
+ case 'String':
28
+ return (0, string_decorator_1.default)(restOptions);
29
+ case 'Number':
30
+ return (0, number_decorator_1.default)(restOptions);
31
+ case 'Date':
32
+ return (0, date_decorator_1.default)(restOptions);
33
+ case 'Boolean':
34
+ return (0, boolean_decorator_1.default)(restOptions);
35
+ default:
36
+ throw new Error(`μ§€μ›ν•˜μ§€ μ•ŠλŠ” νƒ€μž…μž…λ‹ˆλ‹€.: ${typeName}`);
37
+ }
38
+ }
39
+ // type이 λ¬Έμžμ—΄μΈ κ²½μš°λ„ 처리 (ν•˜μœ„ ν˜Έν™˜μ„±)
40
+ if (typeof type === 'string') {
41
+ const typeStr = type;
42
+ if (typeStr === 'string' || typeStr === 'String') {
43
+ return (0, string_decorator_1.default)(restOptions);
44
+ }
45
+ if (typeStr === 'number' || typeStr === 'Number') {
46
+ return (0, number_decorator_1.default)(restOptions);
47
+ }
48
+ if (typeStr === 'date' || typeStr === 'Date') {
49
+ return (0, date_decorator_1.default)(restOptions);
50
+ }
51
+ if (typeStr === 'boolean' || typeStr === 'Boolean') {
52
+ return (0, boolean_decorator_1.default)(restOptions);
53
+ }
54
+ throw new Error(`μ§€μ›ν•˜μ§€ μ•ŠλŠ” νƒ€μž…μž…λ‹ˆλ‹€.: ${typeStr}`);
55
+ }
56
+ throw new Error('μ§€μ›ν•˜μ§€ μ•ŠλŠ” type ν˜•μ‹μž…λ‹ˆλ‹€.');
57
+ }
58
+ //# sourceMappingURL=property.decorator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"property.decorator.js","sourceRoot":"","sources":["../../../src/decorators/validators/property.decorator.ts"],"names":[],"mappings":";;;;;AAwBA,2BAkDC;AAxED,0EAA2C;AAC3C,0EAA2C;AAC3C,sEAAuC;AACvC,4EAA6C;AAC7C,sEAAuC;AAkBvC,SAAwB,QAAQ,CAAC,OAAwB;IACrD,oBAAoB;IACpB,IAAI,MAAM,IAAI,OAAO,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;QACpC,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,WAAW,EAAE,GAAG,OAAO,CAAC;QACnD,OAAO,IAAA,wBAAO,EAAC,QAAQ,EAAE,WAA4C,CAAC,CAAC;IAC3E,CAAC;IAED,eAAe;IACf,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;QAChB,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;IAC/C,CAAC;IAED,MAAM,EAAE,IAAI,EAAE,GAAG,WAAW,EAAE,GAAG,OAAO,CAAC;IAEzC,gCAAgC;IAChC,IAAI,OAAO,IAAI,KAAK,UAAU,EAAE,CAAC;QAC7B,MAAM,QAAQ,GAAI,IAAiB,CAAC,IAAI,CAAC;QACzC,QAAQ,QAAQ,EAAE,CAAC;YACf,KAAK,QAAQ;gBACT,OAAO,IAAA,0BAAS,EAAC,WAA8C,CAAC,CAAC;YACrE,KAAK,QAAQ;gBACT,OAAO,IAAA,0BAAS,EAAC,WAA8C,CAAC,CAAC;YACrE,KAAK,MAAM;gBACP,OAAO,IAAA,wBAAO,EAAC,WAA4C,CAAC,CAAC;YACjE,KAAK,SAAS;gBACV,OAAO,IAAA,2BAAU,EAAC,WAA+C,CAAC,CAAC;YACvE;gBACI,MAAM,IAAI,KAAK,CAAC,mBAAmB,QAAQ,EAAE,CAAC,CAAC;QACvD,CAAC;IACL,CAAC;IAED,6BAA6B;IAC7B,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC3B,MAAM,OAAO,GAAG,IAAW,CAAC;QAC5B,IAAI,OAAO,KAAK,QAAQ,IAAI,OAAO,KAAK,QAAQ,EAAE,CAAC;YAC/C,OAAO,IAAA,0BAAS,EAAC,WAA8C,CAAC,CAAC;QACrE,CAAC;QACD,IAAI,OAAO,KAAK,QAAQ,IAAI,OAAO,KAAK,QAAQ,EAAE,CAAC;YAC/C,OAAO,IAAA,0BAAS,EAAC,WAA8C,CAAC,CAAC;QACrE,CAAC;QACD,IAAI,OAAO,KAAK,MAAM,IAAI,OAAO,KAAK,MAAM,EAAE,CAAC;YAC3C,OAAO,IAAA,wBAAO,EAAC,WAA4C,CAAC,CAAC;QACjE,CAAC;QACD,IAAI,OAAO,KAAK,SAAS,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;YACjD,OAAO,IAAA,2BAAU,EAAC,WAA+C,CAAC,CAAC;QACvE,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,mBAAmB,OAAO,EAAE,CAAC,CAAC;IAClD,CAAC;IAED,MAAM,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAC;AAC3C,CAAC"}
@@ -0,0 +1,6 @@
1
+ import { ApiPropertyOptions } from '@nestjs/swagger';
2
+ import { DtoValidatorOptions } from './validator.type';
3
+ type DtoStringOptions = ApiPropertyOptions & DtoValidatorOptions;
4
+ export default function DtoString(options?: DtoStringOptions): PropertyDecorator;
5
+ export {};
6
+ //# sourceMappingURL=string.decorator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"string.decorator.d.ts","sourceRoot":"","sources":["../../../src/decorators/validators/string.decorator.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AACrD,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAKvD,KAAK,gBAAgB,GAAG,kBAAkB,GAAG,mBAAmB,CAAC;AAEjE,MAAM,CAAC,OAAO,UAAU,SAAS,CAAC,OAAO,CAAC,EAAE,gBAAgB,qBAoB3D"}
@@ -0,0 +1,15 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.default = DtoString;
4
+ const class_transformer_1 = require("class-transformer");
5
+ const class_validator_1 = require("class-validator");
6
+ const validator_options_1 = require("./utils/validator-options");
7
+ const common_decorators_1 = require("./utils/common-decorators");
8
+ const apply_decorators_1 = require("../utils/apply-decorators");
9
+ function DtoString(options) {
10
+ const { isArray = false, optional = false, validatorMessage, notEmptyMessage, arrayMessage, ...swaggerOptions } = options || {};
11
+ const validatorOption = (0, validator_options_1.getValidatorOptions)({ isArray, validatorMessage });
12
+ const each = validatorOption.each ?? false;
13
+ return (0, apply_decorators_1.applyDecorators)((0, common_decorators_1.getApiPropertyDecorator)(optional, String, isArray, swaggerOptions), (0, class_transformer_1.Type)(() => String), (0, common_decorators_1.getRequiredValidator)(optional, each, true, notEmptyMessage), ...(0, common_decorators_1.getIsArrayDecorator)(isArray, arrayMessage), (0, class_validator_1.IsString)(validatorOption));
14
+ }
15
+ //# sourceMappingURL=string.decorator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"string.decorator.js","sourceRoot":"","sources":["../../../src/decorators/validators/string.decorator.ts"],"names":[],"mappings":";;AAUA,4BAoBC;AA9BD,yDAAyC;AACzC,qDAA2C;AAG3C,iEAAgE;AAChE,iEAA+G;AAC/G,gEAA4D;AAI5D,SAAwB,SAAS,CAAC,OAA0B;IACxD,MAAM,EACF,OAAO,GAAG,KAAK,EACf,QAAQ,GAAG,KAAK,EAChB,gBAAgB,EAChB,eAAe,EACf,YAAY,EACZ,GAAG,cAAc,EACpB,GAAG,OAAO,IAAI,EAAE,CAAC;IAElB,MAAM,eAAe,GAAG,IAAA,uCAAmB,EAAC,EAAE,OAAO,EAAE,gBAAgB,EAAE,CAAC,CAAC;IAC3E,MAAM,IAAI,GAAG,eAAe,CAAC,IAAI,IAAI,KAAK,CAAC;IAE3C,OAAO,IAAA,kCAAe,EAClB,IAAA,2CAAuB,EAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc,CAAC,EAClE,IAAA,wBAAI,EAAC,GAAG,EAAE,CAAC,MAAM,CAAC,EAClB,IAAA,wCAAoB,EAAC,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,eAAe,CAAC,EAC3D,GAAG,IAAA,uCAAmB,EAAC,OAAO,EAAE,YAAY,CAAC,EAC7C,IAAA,0BAAQ,EAAC,eAAe,CAAC,CAC5B,CAAC;AACN,CAAC"}
@@ -0,0 +1,46 @@
1
+ import { ApiPropertyOptions } from '@nestjs/swagger';
2
+ import { DtoValidatorOptions } from '../validator.type';
3
+ /**
4
+ * PropertyDecorator νƒ€μž… μ •μ˜
5
+ * TypeScript의 κΈ°λ³Έ PropertyDecorator와 ν˜Έν™˜λ˜λ„λ‘ μ •μ˜
6
+ */
7
+ export type PropertyDecorator = (target: any, propertyKey: string | symbol) => void;
8
+ /**
9
+ * 곡톡 μ˜΅μ…˜ μΆ”μΆœ νƒ€μž…
10
+ */
11
+ export type CommonOptions = DtoValidatorOptions & {
12
+ isArray?: boolean;
13
+ };
14
+ /**
15
+ * 곡톡 μ˜΅μ…˜μ—μ„œ ν‘œμ€€ μ˜΅μ…˜ μΆ”μΆœ
16
+ */
17
+ export declare const extractCommonOptions: <T extends CommonOptions>(options?: T) => {
18
+ isArray: boolean;
19
+ optional: boolean;
20
+ validatorMessage: string | undefined;
21
+ arrayMessage: string | undefined;
22
+ notEmptyMessage: string | undefined;
23
+ swaggerOptions: Omit<T, keyof CommonOptions>;
24
+ };
25
+ /**
26
+ * ApiProperty λ˜λŠ” ApiPropertyOptional λ°μ½”λ ˆμ΄ν„° λ°˜ν™˜
27
+ */
28
+ export declare const getApiPropertyDecorator: (optional: boolean, type: ApiPropertyOptions["type"], isArray: boolean, swaggerOptions?: Partial<ApiPropertyOptions>) => globalThis.PropertyDecorator;
29
+ /**
30
+ * IsOptional λ˜λŠ” IsDefined/IsNotEmpty λ°μ½”λ ˆμ΄ν„° λ°˜ν™˜
31
+ */
32
+ export declare const getRequiredValidator: (optional: boolean, each: boolean, useIsNotEmpty?: boolean, notEmptyMessage?: string) => globalThis.PropertyDecorator;
33
+ /**
34
+ * IsArray λ°μ½”λ ˆμ΄ν„° 쑰건뢀 λ°˜ν™˜
35
+ */
36
+ export declare const getIsArrayDecorator: (isArray: boolean, arrayMessage?: string) => globalThis.PropertyDecorator[];
37
+ /**
38
+ * 곡톡 λ°μ½”λ ˆμ΄ν„° λ°°μ—΄ 생성 (ApiProperty, Type λ³€ν™˜, ν•„μˆ˜/선택 검증, λ°°μ—΄ 검증)
39
+ */
40
+ export declare const createCommonDecorators: (options: CommonOptions & {
41
+ type: ApiPropertyOptions["type"];
42
+ typeTransformer?: PropertyDecorator;
43
+ customValidator?: PropertyDecorator | PropertyDecorator[];
44
+ useIsNotEmpty?: boolean;
45
+ }) => PropertyDecorator;
46
+ //# sourceMappingURL=common-decorators.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"common-decorators.d.ts","sourceRoot":"","sources":["../../../../src/decorators/validators/utils/common-decorators.ts"],"names":[],"mappings":"AAAA,OAAO,EAAoC,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAGvF,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAGxD;;;GAGG;AACH,MAAM,MAAM,iBAAiB,GAAG,CAAC,MAAM,EAAE,GAAG,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,KAAK,IAAI,CAAC;AAEpF;;GAEG;AACH,MAAM,MAAM,aAAa,GAAG,mBAAmB,GAAG;IAC9C,OAAO,CAAC,EAAE,OAAO,CAAC;CACrB,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,oBAAoB,GAAI,CAAC,SAAS,aAAa,EAAE,UAAU,CAAC;;;;;;oBAgB/B,IAAI,CAAC,CAAC,EAAE,MAAM,aAAa,CAAC;CAErE,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,uBAAuB,GAChC,UAAU,OAAO,EACjB,MAAM,kBAAkB,CAAC,MAAM,CAAC,EAChC,SAAS,OAAO,EAChB,iBAAiB,OAAO,CAAC,kBAAkB,CAAC,iCAS/C,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,oBAAoB,GAC7B,UAAU,OAAO,EACjB,MAAM,OAAO,EACb,gBAAe,OAAe,EAC9B,kBAAkB,MAAM,iCAS3B,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,mBAAmB,GAAI,SAAS,OAAO,EAAE,eAAe,MAAM,mCAE1E,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,sBAAsB,GAC/B,SAAS,aAAa,GAAG;IACrB,IAAI,EAAE,kBAAkB,CAAC,MAAM,CAAC,CAAC;IACjC,eAAe,CAAC,EAAE,iBAAiB,CAAC;IACpC,eAAe,CAAC,EAAE,iBAAiB,GAAG,iBAAiB,EAAE,CAAC;IAC1D,aAAa,CAAC,EAAE,OAAO,CAAC;CAC3B,KACF,iBAkBF,CAAC"}
@@ -0,0 +1,75 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createCommonDecorators = exports.getIsArrayDecorator = exports.getRequiredValidator = exports.getApiPropertyDecorator = exports.extractCommonOptions = void 0;
4
+ const swagger_1 = require("@nestjs/swagger");
5
+ const class_validator_1 = require("class-validator");
6
+ const apply_decorators_1 = require("../../utils/apply-decorators");
7
+ const validator_options_1 = require("./validator-options");
8
+ /**
9
+ * 곡톡 μ˜΅μ…˜μ—μ„œ ν‘œμ€€ μ˜΅μ…˜ μΆ”μΆœ
10
+ */
11
+ const extractCommonOptions = (options) => {
12
+ const { isArray = false, optional = false, validatorMessage, arrayMessage, notEmptyMessage, ...swaggerOptions } = options || {};
13
+ return {
14
+ isArray,
15
+ optional,
16
+ validatorMessage,
17
+ arrayMessage,
18
+ notEmptyMessage,
19
+ swaggerOptions: swaggerOptions,
20
+ };
21
+ };
22
+ exports.extractCommonOptions = extractCommonOptions;
23
+ /**
24
+ * ApiProperty λ˜λŠ” ApiPropertyOptional λ°μ½”λ ˆμ΄ν„° λ°˜ν™˜
25
+ */
26
+ const getApiPropertyDecorator = (optional, type, isArray, swaggerOptions) => {
27
+ const apiOptions = {
28
+ type,
29
+ isArray,
30
+ ...swaggerOptions,
31
+ };
32
+ return optional ? (0, swagger_1.ApiPropertyOptional)(apiOptions) : (0, swagger_1.ApiProperty)(apiOptions);
33
+ };
34
+ exports.getApiPropertyDecorator = getApiPropertyDecorator;
35
+ /**
36
+ * IsOptional λ˜λŠ” IsDefined/IsNotEmpty λ°μ½”λ ˆμ΄ν„° λ°˜ν™˜
37
+ */
38
+ const getRequiredValidator = (optional, each, useIsNotEmpty = false, notEmptyMessage) => {
39
+ if (optional) {
40
+ return (0, class_validator_1.IsOptional)({ each });
41
+ }
42
+ if (useIsNotEmpty) {
43
+ return (0, class_validator_1.IsNotEmpty)({ message: notEmptyMessage ?? undefined, each });
44
+ }
45
+ return (0, class_validator_1.IsDefined)({ each });
46
+ };
47
+ exports.getRequiredValidator = getRequiredValidator;
48
+ /**
49
+ * IsArray λ°μ½”λ ˆμ΄ν„° 쑰건뢀 λ°˜ν™˜
50
+ */
51
+ const getIsArrayDecorator = (isArray, arrayMessage) => {
52
+ return isArray ? [(0, class_validator_1.IsArray)({ message: arrayMessage ?? undefined })] : [];
53
+ };
54
+ exports.getIsArrayDecorator = getIsArrayDecorator;
55
+ /**
56
+ * 곡톡 λ°μ½”λ ˆμ΄ν„° λ°°μ—΄ 생성 (ApiProperty, Type λ³€ν™˜, ν•„μˆ˜/선택 검증, λ°°μ—΄ 검증)
57
+ */
58
+ const createCommonDecorators = (options) => {
59
+ const extracted = (0, exports.extractCommonOptions)(options);
60
+ const { isArray, optional, validatorMessage, arrayMessage, notEmptyMessage, swaggerOptions } = extracted;
61
+ const { type, typeTransformer, customValidator, useIsNotEmpty } = options;
62
+ const validatorOption = (0, validator_options_1.getValidatorOptions)({ isArray, validatorMessage });
63
+ const each = validatorOption.each ?? false;
64
+ const useIsNotEmptyValue = useIsNotEmpty ?? false;
65
+ const decorators = [
66
+ (0, exports.getApiPropertyDecorator)(optional, type, isArray, swaggerOptions),
67
+ ...(typeTransformer ? [typeTransformer] : []),
68
+ (0, exports.getRequiredValidator)(optional, each, useIsNotEmptyValue, notEmptyMessage),
69
+ ...(0, exports.getIsArrayDecorator)(isArray, arrayMessage),
70
+ ...(customValidator ? (Array.isArray(customValidator) ? customValidator : [customValidator]) : []),
71
+ ];
72
+ return (0, apply_decorators_1.applyDecorators)(...decorators);
73
+ };
74
+ exports.createCommonDecorators = createCommonDecorators;
75
+ //# sourceMappingURL=common-decorators.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"common-decorators.js","sourceRoot":"","sources":["../../../../src/decorators/validators/utils/common-decorators.ts"],"names":[],"mappings":";;;AAAA,6CAAuF;AACvF,qDAA6E;AAC7E,mEAA+D;AAE/D,2DAA0D;AAe1D;;GAEG;AACI,MAAM,oBAAoB,GAAG,CAA0B,OAAW,EAAE,EAAE;IACzE,MAAM,EACF,OAAO,GAAG,KAAK,EACf,QAAQ,GAAG,KAAK,EAChB,gBAAgB,EAChB,YAAY,EACZ,eAAe,EACf,GAAG,cAAc,EACpB,GAAG,OAAO,IAAI,EAAE,CAAC;IAElB,OAAO;QACH,OAAO;QACP,QAAQ;QACR,gBAAgB;QAChB,YAAY;QACZ,eAAe;QACf,cAAc,EAAE,cAA8C;KACjE,CAAC;AACN,CAAC,CAAC;AAlBW,QAAA,oBAAoB,wBAkB/B;AAEF;;GAEG;AACI,MAAM,uBAAuB,GAAG,CACnC,QAAiB,EACjB,IAAgC,EAChC,OAAgB,EAChB,cAA4C,EAC9C,EAAE;IACA,MAAM,UAAU,GAAG;QACf,IAAI;QACJ,OAAO;QACP,GAAG,cAAc;KACE,CAAC;IAExB,OAAO,QAAQ,CAAC,CAAC,CAAC,IAAA,6BAAmB,EAAC,UAAU,CAAC,CAAC,CAAC,CAAC,IAAA,qBAAW,EAAC,UAAU,CAAC,CAAC;AAChF,CAAC,CAAC;AAbW,QAAA,uBAAuB,2BAalC;AAEF;;GAEG;AACI,MAAM,oBAAoB,GAAG,CAChC,QAAiB,EACjB,IAAa,EACb,gBAAyB,KAAK,EAC9B,eAAwB,EAC1B,EAAE;IACA,IAAI,QAAQ,EAAE,CAAC;QACX,OAAO,IAAA,4BAAU,EAAC,EAAE,IAAI,EAAE,CAAC,CAAC;IAChC,CAAC;IACD,IAAI,aAAa,EAAE,CAAC;QAChB,OAAO,IAAA,4BAAU,EAAC,EAAE,OAAO,EAAE,eAAe,IAAI,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACvE,CAAC;IACD,OAAO,IAAA,2BAAS,EAAC,EAAE,IAAI,EAAE,CAAC,CAAC;AAC/B,CAAC,CAAC;AAbW,QAAA,oBAAoB,wBAa/B;AAEF;;GAEG;AACI,MAAM,mBAAmB,GAAG,CAAC,OAAgB,EAAE,YAAqB,EAAE,EAAE;IAC3E,OAAO,OAAO,CAAC,CAAC,CAAC,CAAC,IAAA,yBAAO,EAAC,EAAE,OAAO,EAAE,YAAY,IAAI,SAAS,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;AAC5E,CAAC,CAAC;AAFW,QAAA,mBAAmB,uBAE9B;AAEF;;GAEG;AACI,MAAM,sBAAsB,GAAG,CAClC,OAKC,EACgB,EAAE;IACnB,MAAM,SAAS,GAAG,IAAA,4BAAoB,EAAC,OAAO,CAAC,CAAC;IAChD,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,gBAAgB,EAAE,YAAY,EAAE,eAAe,EAAE,cAAc,EAAE,GAAG,SAAS,CAAC;IACzG,MAAM,EAAE,IAAI,EAAE,eAAe,EAAE,eAAe,EAAE,aAAa,EAAE,GAAG,OAAO,CAAC;IAE1E,MAAM,eAAe,GAAG,IAAA,uCAAmB,EAAC,EAAE,OAAO,EAAE,gBAAgB,EAAE,CAAC,CAAC;IAC3E,MAAM,IAAI,GAAG,eAAe,CAAC,IAAI,IAAI,KAAK,CAAC;IAC3C,MAAM,kBAAkB,GAAY,aAAa,IAAI,KAAK,CAAC;IAE3D,MAAM,UAAU,GAAG;QACf,IAAA,+BAAuB,EAAC,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,cAAc,CAAC;QAChE,GAAG,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAC7C,IAAA,4BAAoB,EAAC,QAAQ,EAAE,IAAI,EAAE,kBAAkB,EAAE,eAAe,CAAC;QACzE,GAAG,IAAA,2BAAmB,EAAC,OAAO,EAAE,YAAY,CAAC;QAC7C,GAAG,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;KACrG,CAAC;IAEF,OAAO,IAAA,kCAAe,EAAC,GAAG,UAAU,CAAC,CAAC;AAC1C,CAAC,CAAC;AAzBW,QAAA,sBAAsB,0BAyBjC"}
@@ -0,0 +1,8 @@
1
+ import { SwaggerPropertyOptions } from './swagger.types';
2
+ import { PropertyDecorator } from './common-decorators';
3
+ /**
4
+ * Swagger ApiProperty λ˜λŠ” ApiPropertyOptional λ°μ½”λ ˆμ΄ν„°λ₯Ό μ‘°κ±΄λΆ€λ‘œ 적용
5
+ * @nestjs/swaggerκ°€ μ„€μΉ˜λ˜μ–΄ 있으면 적용, μ—†μœΌλ©΄ no-op λ°μ½”λ ˆμ΄ν„° λ°˜ν™˜
6
+ */
7
+ export declare function getSwaggerDecorator(optional: boolean, options: SwaggerPropertyOptions): PropertyDecorator;
8
+ //# sourceMappingURL=swagger.decorator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"swagger.decorator.d.ts","sourceRoot":"","sources":["../../../../src/decorators/validators/utils/swagger.decorator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AACzD,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAcxD;;;GAGG;AACH,wBAAgB,mBAAmB,CAC/B,QAAQ,EAAE,OAAO,EACjB,OAAO,EAAE,sBAAsB,GAChC,iBAAiB,CAmBnB"}
@@ -0,0 +1,38 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getSwaggerDecorator = getSwaggerDecorator;
4
+ /**
5
+ * @nestjs/swagger νŒ¨ν‚€μ§€ 쑴재 μ—¬λΆ€ 확인
6
+ */
7
+ function hasSwaggerPackage() {
8
+ try {
9
+ require.resolve('@nestjs/swagger');
10
+ return true;
11
+ }
12
+ catch {
13
+ return false;
14
+ }
15
+ }
16
+ /**
17
+ * Swagger ApiProperty λ˜λŠ” ApiPropertyOptional λ°μ½”λ ˆμ΄ν„°λ₯Ό μ‘°κ±΄λΆ€λ‘œ 적용
18
+ * @nestjs/swaggerκ°€ μ„€μΉ˜λ˜μ–΄ 있으면 적용, μ—†μœΌλ©΄ no-op λ°μ½”λ ˆμ΄ν„° λ°˜ν™˜
19
+ */
20
+ function getSwaggerDecorator(optional, options) {
21
+ if (!hasSwaggerPackage()) {
22
+ // Swagger νŒ¨ν‚€μ§€κ°€ μ—†μœΌλ©΄ no-op λ°μ½”λ ˆμ΄ν„° λ°˜ν™˜
23
+ return () => { };
24
+ }
25
+ try {
26
+ // 동적 import둜 @nestjs/swagger λ‘œλ“œ
27
+ const { ApiProperty, ApiPropertyOptional } = require('@nestjs/swagger');
28
+ // ApiPropertyOptions νƒ€μž…κ³Ό ν˜Έν™˜λ˜λ„λ‘ λ³€ν™˜
29
+ const apiOptions = options;
30
+ return optional ? ApiPropertyOptional(apiOptions) : ApiProperty(apiOptions);
31
+ }
32
+ catch (error) {
33
+ // λ‘œλ“œ μ‹€νŒ¨ μ‹œ no-op λ°μ½”λ ˆμ΄ν„° λ°˜ν™˜
34
+ console.warn('[ts-deco] @nestjs/swaggerλ₯Ό λ‘œλ“œν•  수 μ—†μŠ΅λ‹ˆλ‹€. Swagger λ°μ½”λ ˆμ΄ν„°λŠ” κ±΄λ„ˆλœλ‹ˆλ‹€.');
35
+ return () => { };
36
+ }
37
+ }
38
+ //# sourceMappingURL=swagger.decorator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"swagger.decorator.js","sourceRoot":"","sources":["../../../../src/decorators/validators/utils/swagger.decorator.ts"],"names":[],"mappings":";;AAmBA,kDAsBC;AAtCD;;GAEG;AACH,SAAS,iBAAiB;IACtB,IAAI,CAAC;QACD,OAAO,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC;QACnC,OAAO,IAAI,CAAC;IAChB,CAAC;IAAC,MAAM,CAAC;QACL,OAAO,KAAK,CAAC;IACjB,CAAC;AACL,CAAC;AAED;;;GAGG;AACH,SAAgB,mBAAmB,CAC/B,QAAiB,EACjB,OAA+B;IAE/B,IAAI,CAAC,iBAAiB,EAAE,EAAE,CAAC;QACvB,kCAAkC;QAClC,OAAO,GAAG,EAAE,GAAE,CAAC,CAAC;IACpB,CAAC;IAED,IAAI,CAAC;QACD,gCAAgC;QAChC,MAAM,EAAE,WAAW,EAAE,mBAAmB,EAAE,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAC;QAExE,kCAAkC;QAClC,MAAM,UAAU,GAAG,OAAc,CAAC;QAElC,OAAO,QAAQ,CAAC,CAAC,CAAC,mBAAmB,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC;IAChF,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACb,yBAAyB;QACzB,OAAO,CAAC,IAAI,CAAC,8DAA8D,CAAC,CAAC;QAC7E,OAAO,GAAG,EAAE,GAAE,CAAC,CAAC;IACpB,CAAC;AACL,CAAC"}
@@ -0,0 +1,45 @@
1
+ /**
2
+ * Swagger Property Options νƒ€μž… μ •μ˜
3
+ * @nestjs/swagger의 ApiPropertyOptions와 ν˜Έν™˜λ˜μ§€λ§Œ λ…λ¦½μ μœΌλ‘œ μ‚¬μš© κ°€λŠ₯
4
+ */
5
+ export interface SwaggerPropertyOptions {
6
+ type?: any;
7
+ isArray?: boolean;
8
+ enum?: any[] | {
9
+ [key: string]: any;
10
+ };
11
+ description?: string;
12
+ example?: any;
13
+ examples?: any;
14
+ required?: boolean | string[];
15
+ default?: any;
16
+ format?: string;
17
+ minimum?: number;
18
+ maximum?: number;
19
+ exclusiveMinimum?: number | boolean;
20
+ exclusiveMaximum?: number | boolean;
21
+ minLength?: number;
22
+ maxLength?: number;
23
+ pattern?: string;
24
+ multipleOf?: number;
25
+ minItems?: number;
26
+ maxItems?: number;
27
+ uniqueItems?: boolean;
28
+ minProperties?: number;
29
+ maxProperties?: number;
30
+ additionalProperties?: boolean | object;
31
+ nullable?: boolean;
32
+ readOnly?: boolean;
33
+ writeOnly?: boolean;
34
+ xml?: any;
35
+ externalDocs?: any;
36
+ deprecated?: boolean;
37
+ title?: string;
38
+ allOf?: any[];
39
+ oneOf?: any[];
40
+ anyOf?: any[];
41
+ not?: any;
42
+ discriminator?: any;
43
+ [key: string]: any;
44
+ }
45
+ //# sourceMappingURL=swagger.types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"swagger.types.d.ts","sourceRoot":"","sources":["../../../../src/decorators/validators/utils/swagger.types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,WAAW,sBAAsB;IACnC,IAAI,CAAC,EAAE,GAAG,CAAC;IACX,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,IAAI,CAAC,EAAE,GAAG,EAAE,GAAG;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAA;KAAE,CAAC;IACtC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,GAAG,CAAC;IACd,QAAQ,CAAC,EAAE,GAAG,CAAC;IACf,QAAQ,CAAC,EAAE,OAAO,GAAG,MAAM,EAAE,CAAC;IAC9B,OAAO,CAAC,EAAE,GAAG,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,gBAAgB,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IACpC,gBAAgB,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IACpC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,oBAAoB,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;IACxC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,GAAG,CAAC,EAAE,GAAG,CAAC;IACV,YAAY,CAAC,EAAE,GAAG,CAAC;IACnB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,GAAG,EAAE,CAAC;IACd,KAAK,CAAC,EAAE,GAAG,EAAE,CAAC;IACd,KAAK,CAAC,EAAE,GAAG,EAAE,CAAC;IACd,GAAG,CAAC,EAAE,GAAG,CAAC;IACV,aAAa,CAAC,EAAE,GAAG,CAAC;IACpB,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACtB"}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=swagger.types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"swagger.types.js","sourceRoot":"","sources":["../../../../src/decorators/validators/utils/swagger.types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,8 @@
1
+ export declare const getValidatorOptions: ({ isArray, validatorMessage, }: {
2
+ isArray?: boolean;
3
+ validatorMessage?: string;
4
+ }) => {
5
+ message?: string | undefined;
6
+ each?: boolean | undefined;
7
+ };
8
+ //# sourceMappingURL=validator-options.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validator-options.d.ts","sourceRoot":"","sources":["../../../../src/decorators/validators/utils/validator-options.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,mBAAmB,GAAI,gCAGjC;IACC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC7B;;;CAKA,CAAC"}
@@ -0,0 +1,11 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getValidatorOptions = void 0;
4
+ const getValidatorOptions = ({ isArray, validatorMessage, }) => {
5
+ return {
6
+ ...(isArray && { each: true }),
7
+ ...(validatorMessage && { message: validatorMessage }),
8
+ };
9
+ };
10
+ exports.getValidatorOptions = getValidatorOptions;
11
+ //# sourceMappingURL=validator-options.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validator-options.js","sourceRoot":"","sources":["../../../../src/decorators/validators/utils/validator-options.ts"],"names":[],"mappings":";;;AAAO,MAAM,mBAAmB,GAAG,CAAC,EAChC,OAAO,EACP,gBAAgB,GAInB,EAAE,EAAE;IACD,OAAO;QACH,GAAG,CAAC,OAAO,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;QAC9B,GAAG,CAAC,gBAAgB,IAAI,EAAE,OAAO,EAAE,gBAAgB,EAAE,CAAC;KACzD,CAAC;AACN,CAAC,CAAC;AAXW,QAAA,mBAAmB,uBAW9B"}
@@ -0,0 +1,20 @@
1
+ /** base validator options */
2
+ export type DtoValidatorOptions = {
3
+ optional?: boolean;
4
+ validatorMessage?: string;
5
+ notEmptyMessage?: string;
6
+ arrayMessage?: string;
7
+ };
8
+ /** number validator options */
9
+ export type DtoNumberValidatorOptions = DtoValidatorOptions & {
10
+ isInt?: boolean;
11
+ min?: number;
12
+ max?: number;
13
+ minMessage?: string;
14
+ maxMessage?: string;
15
+ };
16
+ /** enum validator options */
17
+ export type DtoEnumValidatorOptions = DtoValidatorOptions & {
18
+ exclude?: any[];
19
+ };
20
+ //# sourceMappingURL=validator.type.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validator.type.d.ts","sourceRoot":"","sources":["../../../src/decorators/validators/validator.type.ts"],"names":[],"mappings":"AAAA,6BAA6B;AAC7B,MAAM,MAAM,mBAAmB,GAAG;IAC9B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,YAAY,CAAC,EAAE,MAAM,CAAC;CACzB,CAAC;AAEF,+BAA+B;AAC/B,MAAM,MAAM,yBAAyB,GAAG,mBAAmB,GAAG;IAC1D,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;CACvB,CAAC;AAEF,6BAA6B;AAC7B,MAAM,MAAM,uBAAuB,GAAG,mBAAmB,GAAG;IACxD,OAAO,CAAC,EAAE,GAAG,EAAE,CAAC;CACnB,CAAC"}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=validator.type.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validator.type.js","sourceRoot":"","sources":["../../../src/decorators/validators/validator.type.ts"],"names":[],"mappings":""}
@@ -0,0 +1,11 @@
1
+ export { default as DtoString } from './decorators/validators/string.decorator';
2
+ export { default as DtoNumber } from './decorators/validators/number.decorator';
3
+ export { default as DtoDate } from './decorators/validators/date.decorator';
4
+ export { default as DtoBoolean } from './decorators/validators/boolean.decorator';
5
+ export { default as DtoEnum } from './decorators/validators/enum.decorator';
6
+ export { default as Property } from './decorators/validators/property.decorator';
7
+ export type { DtoValidatorOptions, DtoNumberValidatorOptions, DtoEnumValidatorOptions, } from './decorators/validators/validator.type';
8
+ export { getApiPropertyDecorator, getRequiredValidator, getIsArrayDecorator, createCommonDecorators, extractCommonOptions, } from './decorators/validators/utils/common-decorators';
9
+ export { getValidatorOptions } from './decorators/validators/utils/validator-options';
10
+ export { applyDecorators } from './decorators/utils/apply-decorators';
11
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,0CAA0C,CAAC;AAChF,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,0CAA0C,CAAC;AAChF,OAAO,EAAE,OAAO,IAAI,OAAO,EAAE,MAAM,wCAAwC,CAAC;AAC5E,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,2CAA2C,CAAC;AAClF,OAAO,EAAE,OAAO,IAAI,OAAO,EAAE,MAAM,wCAAwC,CAAC;AAC5E,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,MAAM,4CAA4C,CAAC;AAGjF,YAAY,EACR,mBAAmB,EACnB,yBAAyB,EACzB,uBAAuB,GAC1B,MAAM,wCAAwC,CAAC;AAGhD,OAAO,EACH,uBAAuB,EACvB,oBAAoB,EACpB,mBAAmB,EACnB,sBAAsB,EACtB,oBAAoB,GACvB,MAAM,iDAAiD,CAAC;AACzD,OAAO,EAAE,mBAAmB,EAAE,MAAM,iDAAiD,CAAC;AACtF,OAAO,EAAE,eAAe,EAAE,MAAM,qCAAqC,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,31 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.applyDecorators = exports.getValidatorOptions = exports.extractCommonOptions = exports.createCommonDecorators = exports.getIsArrayDecorator = exports.getRequiredValidator = exports.getApiPropertyDecorator = exports.Property = exports.DtoEnum = exports.DtoBoolean = exports.DtoDate = exports.DtoNumber = exports.DtoString = void 0;
7
+ // Validators
8
+ var string_decorator_1 = require("./decorators/validators/string.decorator");
9
+ Object.defineProperty(exports, "DtoString", { enumerable: true, get: function () { return __importDefault(string_decorator_1).default; } });
10
+ var number_decorator_1 = require("./decorators/validators/number.decorator");
11
+ Object.defineProperty(exports, "DtoNumber", { enumerable: true, get: function () { return __importDefault(number_decorator_1).default; } });
12
+ var date_decorator_1 = require("./decorators/validators/date.decorator");
13
+ Object.defineProperty(exports, "DtoDate", { enumerable: true, get: function () { return __importDefault(date_decorator_1).default; } });
14
+ var boolean_decorator_1 = require("./decorators/validators/boolean.decorator");
15
+ Object.defineProperty(exports, "DtoBoolean", { enumerable: true, get: function () { return __importDefault(boolean_decorator_1).default; } });
16
+ var enum_decorator_1 = require("./decorators/validators/enum.decorator");
17
+ Object.defineProperty(exports, "DtoEnum", { enumerable: true, get: function () { return __importDefault(enum_decorator_1).default; } });
18
+ var property_decorator_1 = require("./decorators/validators/property.decorator");
19
+ Object.defineProperty(exports, "Property", { enumerable: true, get: function () { return __importDefault(property_decorator_1).default; } });
20
+ // Utils
21
+ var common_decorators_1 = require("./decorators/validators/utils/common-decorators");
22
+ Object.defineProperty(exports, "getApiPropertyDecorator", { enumerable: true, get: function () { return common_decorators_1.getApiPropertyDecorator; } });
23
+ Object.defineProperty(exports, "getRequiredValidator", { enumerable: true, get: function () { return common_decorators_1.getRequiredValidator; } });
24
+ Object.defineProperty(exports, "getIsArrayDecorator", { enumerable: true, get: function () { return common_decorators_1.getIsArrayDecorator; } });
25
+ Object.defineProperty(exports, "createCommonDecorators", { enumerable: true, get: function () { return common_decorators_1.createCommonDecorators; } });
26
+ Object.defineProperty(exports, "extractCommonOptions", { enumerable: true, get: function () { return common_decorators_1.extractCommonOptions; } });
27
+ var validator_options_1 = require("./decorators/validators/utils/validator-options");
28
+ Object.defineProperty(exports, "getValidatorOptions", { enumerable: true, get: function () { return validator_options_1.getValidatorOptions; } });
29
+ var apply_decorators_1 = require("./decorators/utils/apply-decorators");
30
+ Object.defineProperty(exports, "applyDecorators", { enumerable: true, get: function () { return apply_decorators_1.applyDecorators; } });
31
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;AAAA,aAAa;AACb,6EAAgF;AAAvE,8HAAA,OAAO,OAAa;AAC7B,6EAAgF;AAAvE,8HAAA,OAAO,OAAa;AAC7B,yEAA4E;AAAnE,0HAAA,OAAO,OAAW;AAC3B,+EAAkF;AAAzE,gIAAA,OAAO,OAAc;AAC9B,yEAA4E;AAAnE,0HAAA,OAAO,OAAW;AAC3B,iFAAiF;AAAxE,+HAAA,OAAO,OAAY;AAS5B,QAAQ;AACR,qFAMyD;AALrD,4HAAA,uBAAuB,OAAA;AACvB,yHAAA,oBAAoB,OAAA;AACpB,wHAAA,mBAAmB,OAAA;AACnB,2HAAA,sBAAsB,OAAA;AACtB,yHAAA,oBAAoB,OAAA;AAExB,qFAAsF;AAA7E,wHAAA,mBAAmB,OAAA;AAC5B,wEAAsE;AAA7D,mHAAA,eAAe,OAAA"}
package/package.json ADDED
@@ -0,0 +1,40 @@
1
+ {
2
+ "name": "ts-deco",
3
+ "version": "1.0.3",
4
+ "description": "TypeScript decorator utilities for NestJS",
5
+ "main": "dist/index.js",
6
+ "types": "dist/index.d.ts",
7
+ "files": [
8
+ "dist",
9
+ "README.md"
10
+ ],
11
+ "scripts": {
12
+ "build": "tsc",
13
+ "prepublishOnly": "npm run build",
14
+ "test": "echo \"Error: no test specified\" && exit 1",
15
+ "publish:patch": "npm version patch --no-git-tag-version && npm publish",
16
+ "publish:minor": "npm version minor --no-git-tag-version && npm publish",
17
+ "publish:major": "npm version major --no-git-tag-version && npm publish",
18
+ "publish:dry-run": "npm publish --dry-run"
19
+ },
20
+ "keywords": [
21
+ "typescript",
22
+ "decorator",
23
+ "nestjs",
24
+ "validation",
25
+ "dto"
26
+ ],
27
+ "author": "",
28
+ "license": "ISC",
29
+ "peerDependencies": {
30
+ "@nestjs/swagger": "^7.0.0",
31
+ "class-transformer": "^0.5.0",
32
+ "class-validator": "^0.14.0"
33
+ },
34
+ "devDependencies": {
35
+ "@nestjs/swagger": "^7.0.0",
36
+ "class-transformer": "^0.5.0",
37
+ "class-validator": "^0.14.0",
38
+ "typescript": "^5.0.0"
39
+ }
40
+ }