ejv 2.1.5 → 2.1.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -21
- package/README-KR.md +604 -650
- package/README.md +608 -655
- package/build/cjs/{constants.js → src/constants.js} +0 -10
- package/build/cjs/src/constants.js.map +1 -0
- package/build/cjs/{ejv.js → src/ejv.js} +8 -87
- package/build/cjs/src/ejv.js.map +1 -0
- package/build/cjs/{index.js → src/index.js} +3 -3
- package/build/cjs/src/index.js.map +1 -0
- package/build/{esm → cjs/src}/interfaces.js.map +1 -1
- package/build/cjs/{tester.js → src/tester.js} +126 -146
- package/build/cjs/src/tester.js.map +1 -0
- package/build/cjs/{util.js → src/util.js} +16 -15
- package/build/cjs/src/util.js.map +1 -0
- package/build/esm/{constants.js → src/constants.js} +0 -10
- package/build/esm/src/constants.js.map +1 -0
- package/build/esm/{ejv.js → src/ejv.js} +6 -86
- package/build/esm/src/ejv.js.map +1 -0
- package/build/esm/src/index.js +4 -0
- package/build/esm/src/index.js.map +1 -0
- package/build/esm/src/interfaces.js.map +1 -0
- package/build/esm/{tester.js → src/tester.js} +77 -94
- package/build/esm/src/tester.js.map +1 -0
- package/build/esm/{util.js → src/util.js} +8 -8
- package/build/esm/src/util.js.map +1 -0
- package/build/{constants.d.ts → src/constants.d.ts} +1 -11
- package/build/src/ejv.d.ts +2 -0
- package/build/{interfaces.d.ts → src/interfaces.d.ts} +1 -7
- package/build/src/tester.d.ts +35 -0
- package/build/src/util.d.ts +7 -0
- package/eslint.config.mjs +0 -1
- package/package.json +55 -55
- package/spec/ArrayScheme.ts +12 -113
- package/spec/DateScheme.ts +8 -12
- package/spec/NumberScheme.ts +14 -23
- package/spec/ObjectScheme.ts +9 -12
- package/spec/RegExpScheme.ts +2 -2
- package/spec/StringScheme.ts +18 -34
- package/spec/common-test-util.ts +10 -13
- package/spec/testers.spec.ts +1 -35
- package/src/constants.ts +1 -14
- package/src/ejv.ts +2 -109
- package/src/interfaces.ts +1 -13
- package/src/tester.ts +77 -99
- package/src/util.ts +9 -9
- package/tsconfig.json +8 -2
- package/tsconfig.scripts.json +1 -1
- package/build/cjs/constants.js.map +0 -1
- package/build/cjs/ejv.js.map +0 -1
- package/build/cjs/index.js.map +0 -1
- package/build/cjs/interfaces.js.map +0 -1
- package/build/cjs/tester.js.map +0 -1
- package/build/cjs/util.js.map +0 -1
- package/build/ejv.d.ts +0 -2
- package/build/esm/constants.js.map +0 -1
- package/build/esm/ejv.js.map +0 -1
- package/build/esm/index.js +0 -4
- package/build/esm/index.js.map +0 -1
- package/build/esm/tester.js.map +0 -1
- package/build/esm/util.js.map +0 -1
- package/build/tester.d.ts +0 -39
- package/build/util.d.ts +0 -7
- package/spec/BufferScheme.ts +0 -406
- /package/build/cjs/{interfaces.js → src/interfaces.js} +0 -0
- /package/build/esm/{interfaces.js → src/interfaces.js} +0 -0
- /package/build/{index.d.ts → src/index.d.ts} +0 -0
package/README-KR.md
CHANGED
|
@@ -1,650 +1,604 @@
|
|
|
1
|
-

|
|
2
|
-

|
|
3
|
-
|
|
4
|
-
[English](https://github.com/han41858/ejv/blob/master/README.md)
|
|
5
|
-
|
|
6
|
-
# ejv - Easy JSON Validator
|
|
7
|
-
|
|
8
|
-

|
|
9
|
-

|
|
10
|
-

|
|
11
|
-
|
|
12
|
-
ejv는 JSON 객체를 검사할 때 사용하는 라이브러리입니다. 복잡한 JSON 객체를 간단한 문법으로 검사해 보세요.
|
|
13
|
-
|
|
14
|
-
> ejv 는 TypeScript로 작성되었으며 JavaScript 코드로 컴파일되어 배포됩니다. 따라서 TypeScript 문법으로 사용할 수도 있고 JavaScript 문법으로 사용할 수도 있습니다.
|
|
15
|
-
|
|
16
|
-
## 설치방법
|
|
17
|
-
|
|
18
|
-
```bash
|
|
19
|
-
npm install ejv
|
|
20
|
-
```
|
|
21
|
-
|
|
22
|
-
## `ejv(data : object, schemes : Scheme[])`
|
|
23
|
-
|
|
24
|
-
ejv 라이브러리는 단 하나의 함수만 제공합니다.
|
|
25
|
-
모든 검사는 이 함수를 사용합니다.
|
|
26
|
-
|
|
27
|
-
`ejv()` 함수는 단순하게 사용할 수 있는 순수 동기 함수입니다.
|
|
28
|
-
이 함수는 Promise 나 Observable 에도 불편함없이 사용할 수 있습니다.
|
|
29
|
-
이 함수는 검사하는 JSON 객체를 변경하지 않습니다.
|
|
30
|
-
|
|
31
|
-
### 심볼 로드
|
|
32
|
-
|
|
33
|
-
- TypeScript, JavaScript (ES6 부터)
|
|
34
|
-
|
|
35
|
-
```typescript
|
|
36
|
-
import { ejv, EjvError } from 'ejv';
|
|
37
|
-
```
|
|
38
|
-
|
|
39
|
-
> `import { ejv } from 'ejv'`를 사용하면 ES Module 방식으로 빌드된 `build/esm` 폴더를 사용합니다.
|
|
40
|
-
|
|
41
|
-
- JavaScript (ES6 이전)
|
|
42
|
-
|
|
43
|
-
```javascript
|
|
44
|
-
var _ejv = require('ejv');
|
|
45
|
-
var ejv = _ejv.ejv;
|
|
46
|
-
```
|
|
47
|
-
|
|
48
|
-
> `require('ejv')`를 사용하면 CommonJS 방식으로 빌드된 `build/cjs` 폴더를 사용합니다.
|
|
49
|
-
|
|
50
|
-
### 사용방법
|
|
51
|
-
|
|
52
|
-
- TypeScript
|
|
53
|
-
|
|
54
|
-
```typescript
|
|
55
|
-
const error: null | EjvError = ejv({
|
|
56
|
-
a: 10
|
|
57
|
-
}, [{
|
|
58
|
-
key: 'a',
|
|
59
|
-
type: 'number'
|
|
60
|
-
}]);
|
|
61
|
-
|
|
62
|
-
if (!error) {
|
|
63
|
-
console.log('검사 성공');
|
|
64
|
-
}
|
|
65
|
-
else {
|
|
66
|
-
console.log('검사 실패');
|
|
67
|
-
}
|
|
68
|
-
```
|
|
69
|
-
|
|
70
|
-
- JavaScript
|
|
71
|
-
|
|
72
|
-
```javascript
|
|
73
|
-
var error = ejv({
|
|
74
|
-
a: 10
|
|
75
|
-
}, [{
|
|
76
|
-
key: 'a',
|
|
77
|
-
type: 'number'
|
|
78
|
-
}]);
|
|
79
|
-
|
|
80
|
-
if (!error) {
|
|
81
|
-
console.log('검사 성공');
|
|
82
|
-
} else {
|
|
83
|
-
console.log('검사 실패');
|
|
84
|
-
}
|
|
85
|
-
```
|
|
86
|
-
|
|
87
|
-
## `Scheme`
|
|
88
|
-
|
|
89
|
-
`ejv()` 함수로 JSON 객체를 검사하려면 이 함수의 두 번째 인자로 *검사 규칙*을 전달해야 합니다.
|
|
90
|
-
|
|
91
|
-
이 때 검사 규칙은 배열 형태로 정의합니다.
|
|
92
|
-
ejv는 배열에 있는 검사 규칙을 순서대로 확인하기 때문에 검사항목의 우선순위를 지정할 수 있으며, 함수의 실행 결과는 항상 같습니다.
|
|
93
|
-
|
|
94
|
-
### 필수 항목
|
|
95
|
-
|
|
96
|
-
#### `key` : `string`
|
|
97
|
-
|
|
98
|
-
검사할 프로퍼티의 이름을 지정합니다.
|
|
99
|
-
JSON 객체에 있는 `a` 프로퍼티를 검사하려면 `key : 'a'`라고 지정합니다.
|
|
100
|
-
|
|
101
|
-
> 이 프로퍼티는 `array` 타입에 `items` 옵션을 사용할 때 생략할 수 있습니다.
|
|
102
|
-
|
|
103
|
-
#### `type` : [`DataType`](#DataType) | `DataType[]`
|
|
104
|
-
|
|
105
|
-
프로퍼티의 형식을 지정합니다.
|
|
106
|
-
타입이 하나만 지정되면 해당 타입인지 검사합니다.
|
|
107
|
-
그리고 배열로 지정되면 배열에 있는 항목 중 하나에 해당되는지 검사합니다.
|
|
108
|
-
|
|
109
|
-
### 옵션 항목
|
|
110
|
-
|
|
111
|
-
#### 공통
|
|
112
|
-
|
|
113
|
-
- `optional : boolean`
|
|
114
|
-
|
|
115
|
-
`true`로 설정하면 `undefined` 값을 허용합니다.
|
|
116
|
-
이 옵션은 모든 검사규칙에 사용할 수 있습니다.
|
|
117
|
-
|
|
118
|
-
```typescript
|
|
119
|
-
ejv({
|
|
120
|
-
// 빈 객체
|
|
121
|
-
}, [{
|
|
122
|
-
key: 'a',
|
|
123
|
-
optional: true // 프로퍼티가 선언되지 않아도 에러가 발생하지 않습니다.
|
|
124
|
-
}]);
|
|
125
|
-
```
|
|
126
|
-
|
|
127
|
-
- `nullable : boolean`
|
|
128
|
-
|
|
129
|
-
`true`로 설정하면 `null` 값을 허용합니다.
|
|
130
|
-
이 옵션은 모든 검사규칙에 사용할 수 있습니다.
|
|
131
|
-
|
|
132
|
-
```typescript
|
|
133
|
-
ejv({
|
|
134
|
-
a: null
|
|
135
|
-
}, [{
|
|
136
|
-
key: 'a',
|
|
137
|
-
nullable: true
|
|
138
|
-
}]);
|
|
139
|
-
```
|
|
140
|
-
|
|
141
|
-
- `enum : number[] | string[]`
|
|
142
|
-
|
|
143
|
-
배열로 전달되는 값만 허용합니다.
|
|
144
|
-
이 옵션은 `type : number`과 `type : string` 검사규칙에 사용할 수 있습니다.
|
|
145
|
-
|
|
146
|
-
```typescript
|
|
147
|
-
ejv({
|
|
148
|
-
a: 1,
|
|
149
|
-
b: 'hello'
|
|
150
|
-
}, [{
|
|
151
|
-
key: 'a',
|
|
152
|
-
type: 'number',
|
|
153
|
-
enum: [1, 2, 3] // 1, 2, 3 값을 허용합니다.
|
|
154
|
-
}, {
|
|
155
|
-
key: 'b',
|
|
156
|
-
type: 'string',
|
|
157
|
-
enum: ['hello', 'ejv'] // 'hello'나 'ejv' 값을 허용합니다.
|
|
158
|
-
}]);
|
|
159
|
-
```
|
|
160
|
-
|
|
161
|
-
- `notEnumse : number[] | string[]`
|
|
162
|
-
|
|
163
|
-
배열로 전달되는 값을 허용하지 않습니다. 이 옵션의 결과는 `enum` 옵션의 결과와 반대입니다.
|
|
164
|
-
이 옵션은 `type : number`과 `type : string` 검사규칙에 사용할 수 있습니다.
|
|
165
|
-
|
|
166
|
-
```typescript
|
|
167
|
-
ejv({
|
|
168
|
-
a: 1,
|
|
169
|
-
b: 'hello'
|
|
170
|
-
}, [{
|
|
171
|
-
key: 'a',
|
|
172
|
-
type: 'number',
|
|
173
|
-
notEnum: [1, 2, 3] // 1, 2, 3 값을 허용하지 않습니다.
|
|
174
|
-
}, {
|
|
175
|
-
key: 'b',
|
|
176
|
-
type: 'string',
|
|
177
|
-
notEnum: ['hello', 'ejv'] // 'hello'나 'ejv' 값을 허용하지 않습니다.
|
|
178
|
-
}]);
|
|
179
|
-
```
|
|
180
|
-
|
|
181
|
-
#### `'number'` 타입 옵션
|
|
182
|
-
|
|
183
|
-
- `min : number`
|
|
184
|
-
|
|
185
|
-
최소값을 검사합니다.
|
|
186
|
-
이 값보다 작은 숫자이면 에러가 발생합니다.
|
|
187
|
-
|
|
188
|
-
- `exclusiveMin : boolean`
|
|
189
|
-
|
|
190
|
-
`true`로 지정하면 최소 한계값과 같은 값을 허용하지 않습니다.
|
|
191
|
-
이 옵션을 생략하거나 `false`로 지정하면 최소 한계값과 같은 값을 허용합니다.
|
|
192
|
-
이 옵션은 `min` 옵션이 사용되었을 때만 유효합니다.
|
|
193
|
-
|
|
194
|
-
```typescript
|
|
195
|
-
ejv({
|
|
196
|
-
num1: 10,
|
|
197
|
-
num2: 10
|
|
198
|
-
}, [{
|
|
199
|
-
key: 'num1',
|
|
200
|
-
type: 'number',
|
|
201
|
-
min: 10 // 성공
|
|
202
|
-
}, {
|
|
203
|
-
key: 'num2',
|
|
204
|
-
type: 'number',
|
|
205
|
-
min: 10,
|
|
206
|
-
exclusiveMin: true // 실패
|
|
207
|
-
}]);
|
|
208
|
-
```
|
|
209
|
-
|
|
210
|
-
- `max : number`
|
|
211
|
-
|
|
212
|
-
최대값을 검사합니다.
|
|
213
|
-
이 값보다 큰 숫자이면 에러가 발생합니다.
|
|
214
|
-
|
|
215
|
-
- `exclusiveMax : boolean`
|
|
216
|
-
|
|
217
|
-
`true`로 지정하면 최대 한계값과 같은 값을 허용하지 않습니다.
|
|
218
|
-
이 옵션을 생략하거나 `false`로 지정하면 최대 한계값과 같은 값을 허용합니다.
|
|
219
|
-
이 옵션은 `max` 옵션이 사용되었을 때만 유효합니다.
|
|
220
|
-
|
|
221
|
-
```typescript
|
|
222
|
-
ejv({
|
|
223
|
-
num1: 10,
|
|
224
|
-
num2: 10
|
|
225
|
-
}, [{
|
|
226
|
-
key: 'num1',
|
|
227
|
-
type: 'number',
|
|
228
|
-
max: 10 // 성공
|
|
229
|
-
}, {
|
|
230
|
-
key: 'num2',
|
|
231
|
-
type: 'number',
|
|
232
|
-
max: 10,
|
|
233
|
-
exclusiveMax: true // 실패
|
|
234
|
-
}]);
|
|
235
|
-
```
|
|
236
|
-
|
|
237
|
-
- `format : NumberFormat | NumberFormat[]`
|
|
238
|
-
|
|
239
|
-
숫자의 형식을 검사합니다.
|
|
240
|
-
배열로 지정된 경우에는 주어진 형식 중 하나에 해당되면 검사를 통과합니다.
|
|
241
|
-
사용할 수 있는 값은 다음과 같습니다.
|
|
242
|
-
|
|
243
|
-
포맷 | 예
|
|
244
|
-
-------------|--------------------------------------------------------------------------
|
|
245
|
-
`'integer'` | 정수만 허용합니다. ex) -1, 0, 1, ...
|
|
246
|
-
`'index'` | 인덱스만 허용합니다. `format : 'integer', min : 0`을 설정한 것과 같습니다. ex) 0, 1, 2, ...
|
|
247
|
-
|
|
248
|
-
#### `'string'` 타입 옵션
|
|
249
|
-
|
|
250
|
-
- `format : StringFormat | StringFormat[]`
|
|
251
|
-
|
|
252
|
-
문자열의 형식을 검사합니다. 배열로 지정된 경우에는 주어진 형식 중 하나에 해당되면 검사를 통과합니다. 사용할 수 있는 값은 다음과 같습니다.
|
|
253
|
-
|
|
254
|
-
포맷 | 예
|
|
255
|
-
---------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
|
256
|
-
`'email'` | 이메일 형식인지 검사합니다. [RFC 5322 3.4.1](https://tools.ietf.org/html/rfc5322#section-3.4.1) 스펙을 기준으로 합니다. ex) `'email@domain.com'`
|
|
257
|
-
`'date'` | 날짜 형식인지 검사합니다. [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) 스펙을 기준으로 합니다. ex) `'2018-12-29'`
|
|
258
|
-
`'time'` | 시간 형식인지 검사합니다. [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) 스펙을 기준으로 합니다. ex) `'21:07:35'`
|
|
259
|
-
`'date-time'` | 날짜-시간 형식인지 검사합니다. [RFC 3339](https://www.ietf.org/rfc/rfc3339.txt) 스펙과 [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) 스펙을 기준으로 합니다. ex) `'2018-12-29T21:07:35Z'`
|
|
260
|
-
|
|
261
|
-
- `length : number`
|
|
262
|
-
|
|
263
|
-
문자열의 길이를 검사합니다.
|
|
264
|
-
|
|
265
|
-
```typescript
|
|
266
|
-
ejv({
|
|
267
|
-
str: 'hello'
|
|
268
|
-
}, [{
|
|
269
|
-
key: 'str',
|
|
270
|
-
type: 'string',
|
|
271
|
-
length: 5
|
|
272
|
-
}]);
|
|
273
|
-
````
|
|
274
|
-
|
|
275
|
-
- `minLength : number`
|
|
276
|
-
|
|
277
|
-
문자열의 최소 길이를 검사합니다.
|
|
278
|
-
|
|
279
|
-
```typescript
|
|
280
|
-
ejv({
|
|
281
|
-
str: 'hello'
|
|
282
|
-
}, [{
|
|
283
|
-
key: 'str',
|
|
284
|
-
type: 'string',
|
|
285
|
-
minLength: 5
|
|
286
|
-
}]);
|
|
287
|
-
````
|
|
288
|
-
|
|
289
|
-
- `maxLength : string`
|
|
290
|
-
|
|
291
|
-
문자열의 최대 길이를 검사합니다.
|
|
292
|
-
|
|
293
|
-
```typescript
|
|
294
|
-
ejv({
|
|
295
|
-
str: 'hello'
|
|
296
|
-
}, [{
|
|
297
|
-
key: 'str',
|
|
298
|
-
type: 'string',
|
|
299
|
-
maxLength: 5
|
|
300
|
-
}]);
|
|
301
|
-
````
|
|
302
|
-
|
|
303
|
-
- `pattern : string | string[] | RegExp | RegExp[]`
|
|
304
|
-
|
|
305
|
-
문자열의 형식을 검사합니다.
|
|
306
|
-
문자열로 지정되면 이 문자열을 정규표현식으로 변환해서 검사하며, 정규표현식으로 지정되면 정규표현식을 통과하는지 검사합니다.
|
|
307
|
-
이 옵션의 값이 배열로 지정되면 배열 중 하나를 통과하면 검사를 통과합니다.
|
|
308
|
-
|
|
309
|
-
```typescript
|
|
310
|
-
ejv({
|
|
311
|
-
str: 'abc'
|
|
312
|
-
}, [{
|
|
313
|
-
key: 'str',
|
|
314
|
-
type: 'string',
|
|
315
|
-
pattern: 'abc'
|
|
316
|
-
}, {
|
|
317
|
-
key: 'str',
|
|
318
|
-
type: 'string',
|
|
319
|
-
pattern: ['abc', 'ac']
|
|
320
|
-
}, {
|
|
321
|
-
key: 'str',
|
|
322
|
-
type: 'string',
|
|
323
|
-
pattern: /abc/
|
|
324
|
-
}, {
|
|
325
|
-
key: 'str',
|
|
326
|
-
type: 'string',
|
|
327
|
-
pattern: [/abc/, /ac/]
|
|
328
|
-
}]);
|
|
329
|
-
```
|
|
330
|
-
|
|
331
|
-
#### `'object'` 타입 옵션
|
|
332
|
-
|
|
333
|
-
- `allowNoProperty : boolean`
|
|
334
|
-
|
|
335
|
-
객체에 프로퍼티가 최소한 1개 이상 있는지 검사합니다.
|
|
336
|
-
이 옵션에 `false`를 지정하면 프로퍼티가 없는 객체를 허용하지 않습니다.
|
|
337
|
-
이 옵션을 생략하거나 `true`로 지정하면 프로퍼티가 없는 객체를 허용합니다.
|
|
338
|
-
|
|
339
|
-
```typescript
|
|
340
|
-
ejv({
|
|
341
|
-
obj: {}
|
|
342
|
-
}, [{
|
|
343
|
-
key: 'obj',
|
|
344
|
-
type: 'object',
|
|
345
|
-
allowNoProperty: false // 실패
|
|
346
|
-
}]);
|
|
347
|
-
```
|
|
348
|
-
|
|
349
|
-
- `properties : Scheme[]`
|
|
350
|
-
|
|
351
|
-
객체의 세부 형식을 지정합니다.
|
|
352
|
-
검사 대상으로 지정된 객체는 ejv()가 재귀적으로 검사합니다.
|
|
353
|
-
|
|
354
|
-
```typescript
|
|
355
|
-
ejv({
|
|
356
|
-
data: {
|
|
357
|
-
num: 10,
|
|
358
|
-
str: 'ejv'
|
|
359
|
-
}
|
|
360
|
-
}, [{
|
|
361
|
-
key: 'data',
|
|
362
|
-
type: 'object',
|
|
363
|
-
properties: [{
|
|
364
|
-
key: 'num',
|
|
365
|
-
type: 'number'
|
|
366
|
-
}, {
|
|
367
|
-
key: 'str',
|
|
368
|
-
type: 'string'
|
|
369
|
-
}]
|
|
370
|
-
}]);
|
|
371
|
-
```
|
|
372
|
-
|
|
373
|
-
#### `'date'` 타입 옵션
|
|
374
|
-
|
|
375
|
-
- `min : Date | string`
|
|
376
|
-
|
|
377
|
-
날짜의 최소값을 검사합니다.
|
|
378
|
-
이 값보다 이전 날짜이면 에러가 발생합니다.
|
|
379
|
-
최소값은 `Date` 객체나 날짜를 표현하는 문자열을 사용할 수 있습니다.
|
|
380
|
-
|
|
381
|
-
- `exclusiveMin : boolean`
|
|
382
|
-
|
|
383
|
-
`true`로 지정하면 날짜의 최소값과 같은 값을 허용하지 않습니다.
|
|
384
|
-
이 옵션을 생략하거나 `false`로 지정하면 날짜의 최소값과 같은 값을 허용합니다.
|
|
385
|
-
이 옵션은 `min` 옵션이 사용되었을 때만 유효합니다.
|
|
386
|
-
|
|
387
|
-
```typescript
|
|
388
|
-
ejv({
|
|
389
|
-
date1: new Date(2019, 11, 30)
|
|
390
|
-
}, [{
|
|
391
|
-
key: 'date1',
|
|
392
|
-
type: 'date',
|
|
393
|
-
min: new Date(2019, 11, 30) // 성공
|
|
394
|
-
}, {
|
|
395
|
-
key: 'date1',
|
|
396
|
-
type: 'date',
|
|
397
|
-
min: new Date(2019, 11, 30),
|
|
398
|
-
exclusiveMin: true // 실패
|
|
399
|
-
}, {
|
|
400
|
-
key: 'date1',
|
|
401
|
-
type: 'date',
|
|
402
|
-
min: '2019-12-30T00:00:00Z' // 성공
|
|
403
|
-
}, {
|
|
404
|
-
key: 'date1',
|
|
405
|
-
type: 'date',
|
|
406
|
-
min: '2019-12-30T00:00:00Z',
|
|
407
|
-
exclusiveMin: true // 실패
|
|
408
|
-
}]);
|
|
409
|
-
```
|
|
410
|
-
|
|
411
|
-
- `max : Date | string`
|
|
412
|
-
|
|
413
|
-
날짜의 최대값을 검사합니다.
|
|
414
|
-
이 값보다 이후 날짜이면 에러가 발생합니다.
|
|
415
|
-
최대값은 `Date` 객체나 날짜를 표현하는 문자열을 사용할 수 있습니다.
|
|
416
|
-
|
|
417
|
-
- `exclusiveMax : boolean`
|
|
418
|
-
|
|
419
|
-
`true`로 지정하면 날짜의 최대값과 같은 값을 허용하지 않습니다.
|
|
420
|
-
이 옵션을 생략하거나 `false`로 지정하면 날짜의 최대값과 같은 값을 허용합니다.
|
|
421
|
-
이 옵션은 `max` 옵션이 사용되었을 때만 유효합니다.
|
|
422
|
-
|
|
423
|
-
```typescript
|
|
424
|
-
ejv({
|
|
425
|
-
date1: new Date(2019, 11, 30)
|
|
426
|
-
}, [{
|
|
427
|
-
key: 'date1',
|
|
428
|
-
type: 'date',
|
|
429
|
-
max: new Date(2019, 11, 30) // 성공
|
|
430
|
-
}, {
|
|
431
|
-
key: 'date1',
|
|
432
|
-
type: 'date',
|
|
433
|
-
max: new Date(2019, 11, 30),
|
|
434
|
-
exclusiveMax: true // 실패
|
|
435
|
-
}, {
|
|
436
|
-
key: 'date1',
|
|
437
|
-
type: 'date',
|
|
438
|
-
max: '2019-12-30T00:00:00Z' // 성공
|
|
439
|
-
}, {
|
|
440
|
-
key: 'date1',
|
|
441
|
-
type: 'date',
|
|
442
|
-
max: '2019-12-30T00:00:00Z',
|
|
443
|
-
exclusiveMax: true // 실패
|
|
444
|
-
}]);
|
|
445
|
-
```
|
|
446
|
-
|
|
447
|
-
#### `'array'` 타입 옵션
|
|
448
|
-
|
|
449
|
-
- `length : number`
|
|
450
|
-
|
|
451
|
-
배열의 길이를 검사합니다.
|
|
452
|
-
|
|
453
|
-
```typescript
|
|
454
|
-
ejv({
|
|
455
|
-
arr: [1, 2]
|
|
456
|
-
}, [{
|
|
457
|
-
key: 'arr',
|
|
458
|
-
type: 'array',
|
|
459
|
-
length: 2
|
|
460
|
-
}]);
|
|
461
|
-
````
|
|
462
|
-
|
|
463
|
-
- `minLength : number`
|
|
464
|
-
|
|
465
|
-
배열의 최소 길이를 검사합니다.
|
|
466
|
-
|
|
467
|
-
```typescript
|
|
468
|
-
ejv({
|
|
469
|
-
arr: [1, 2]
|
|
470
|
-
}, [{
|
|
471
|
-
key: 'arr',
|
|
472
|
-
type: 'array',
|
|
473
|
-
minLength: 2
|
|
474
|
-
}]);
|
|
475
|
-
````
|
|
476
|
-
|
|
477
|
-
- `maxLength : string`
|
|
478
|
-
|
|
479
|
-
배열의 최대 길이를 검사합니다.
|
|
480
|
-
|
|
481
|
-
```typescript
|
|
482
|
-
ejv({
|
|
483
|
-
arr: [1, 2, 3]
|
|
484
|
-
}, [{
|
|
485
|
-
key: 'arr',
|
|
486
|
-
type: 'array',
|
|
487
|
-
maxLength: 3
|
|
488
|
-
}]);
|
|
489
|
-
````
|
|
490
|
-
|
|
491
|
-
- `unique : boolean`
|
|
492
|
-
|
|
493
|
-
배열의 항목이 모두 다른지 검사합니다.
|
|
494
|
-
`true`로 지정하면 배열의 값이 중복되는 것을 허용하지 않습니다.
|
|
495
|
-
이 옵션을 생략하거나 `false`로 지정하면 배열의 값이 중복되는 것을 허용합니다.
|
|
496
|
-
|
|
497
|
-
- `items : Scheme[]`
|
|
498
|
-
|
|
499
|
-
배열의 항목을 검사할 규칙을 지정합니다.
|
|
500
|
-
이 때 지정하는 Scheme은 ejv() 함수에 사용하는 Scheme과 같은 형식이지만 `key`는 생략합니다.
|
|
501
|
-
배열로 지정한 규칙은 ejv()가 재귀적으로 검사하며, 배열에 지정된 순서대로 처리됩니다.
|
|
502
|
-
|
|
503
|
-
```typescript
|
|
504
|
-
ejv({
|
|
505
|
-
arr: [1, 2, 3]
|
|
506
|
-
}, [{
|
|
507
|
-
key: 'arr',
|
|
508
|
-
type: 'array',
|
|
509
|
-
items: [{
|
|
510
|
-
type: 'number',
|
|
511
|
-
min: 1,
|
|
512
|
-
max: 3
|
|
513
|
-
}]
|
|
514
|
-
}])
|
|
515
|
-
```
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
}
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
- `
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
|
|
573
|
-
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
`
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
|
|
591
|
-
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
|
|
597
|
-
|
|
598
|
-
|
|
599
|
-
|
|
600
|
-
|
|
601
|
-
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
사용방법)
|
|
607
|
-
|
|
608
|
-
```typescript
|
|
609
|
-
import { ejv, EjvError } from 'ejv';
|
|
610
|
-
|
|
611
|
-
const error: null | EjvError = ejv({
|
|
612
|
-
a: 10
|
|
613
|
-
}, [{
|
|
614
|
-
key: 'a',
|
|
615
|
-
type: 'string'
|
|
616
|
-
}]);
|
|
617
|
-
|
|
618
|
-
console.log(error.type); // 'TYPE_MISMATCH'
|
|
619
|
-
console.log(error.message); // 'the value should be a string'
|
|
620
|
-
console.log(error.path); // 'a'
|
|
621
|
-
console.log(error.data); // { a : 10 }
|
|
622
|
-
console.log(error.errorData); // 10
|
|
623
|
-
```
|
|
624
|
-
|
|
625
|
-
## 옵션
|
|
626
|
-
|
|
627
|
-
`ejv()` 함수를 사용할 때 3번째 인자로 옵션을 지정할 수 있습니다.
|
|
628
|
-
|
|
629
|
-
- `customErrorMsg: object`
|
|
630
|
-
|
|
631
|
-
ejv가 제공하는 에러 메시지를 다른 내용으로 변경하려면 `EjvError.type`에 해당하는 키로 에러 메시지를 오버라이드 할 수 있습니다.
|
|
632
|
-
|
|
633
|
-
이 옵션은 `object` 형태로 사용합니다. 오버라이드하려는 에러에 해당하는 `ErrorType`를 키로 사용해서 원하는 문구를 지정해 보세요.
|
|
634
|
-
|
|
635
|
-
```typescript
|
|
636
|
-
import { ejv, EjvError, ErrorType } from 'ejv';
|
|
637
|
-
|
|
638
|
-
const error: null | EjvError = ejv({
|
|
639
|
-
a: 10
|
|
640
|
-
}, [{
|
|
641
|
-
key: 'a',
|
|
642
|
-
type: 'string'
|
|
643
|
-
}, {
|
|
644
|
-
customErrorMsg: {
|
|
645
|
-
[ErrorType.TYPE_MISMATCH]: 'property "a" should be a "string".'
|
|
646
|
-
}
|
|
647
|
-
}]);
|
|
648
|
-
|
|
649
|
-
console.log(error.message); // 'property "a" should be a "string".'
|
|
650
|
-
```
|
|
1
|
+

|
|
2
|
+

|
|
3
|
+
|
|
4
|
+
[English](https://github.com/han41858/ejv/blob/master/README.md)
|
|
5
|
+
|
|
6
|
+
# ejv - Easy JSON Validator
|
|
7
|
+
|
|
8
|
+

|
|
9
|
+

|
|
10
|
+

|
|
11
|
+
|
|
12
|
+
ejv는 JSON 객체를 검사할 때 사용하는 라이브러리입니다. 복잡한 JSON 객체를 간단한 문법으로 검사해 보세요.
|
|
13
|
+
|
|
14
|
+
> ejv 는 TypeScript로 작성되었으며 JavaScript 코드로 컴파일되어 배포됩니다. 따라서 TypeScript 문법으로 사용할 수도 있고 JavaScript 문법으로 사용할 수도 있습니다.
|
|
15
|
+
|
|
16
|
+
## 설치방법
|
|
17
|
+
|
|
18
|
+
```bash
|
|
19
|
+
npm install ejv
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
## `ejv(data : object, schemes : Scheme[])`
|
|
23
|
+
|
|
24
|
+
ejv 라이브러리는 단 하나의 함수만 제공합니다.
|
|
25
|
+
모든 검사는 이 함수를 사용합니다.
|
|
26
|
+
|
|
27
|
+
`ejv()` 함수는 단순하게 사용할 수 있는 순수 동기 함수입니다.
|
|
28
|
+
이 함수는 Promise 나 Observable 에도 불편함없이 사용할 수 있습니다.
|
|
29
|
+
이 함수는 검사하는 JSON 객체를 변경하지 않습니다.
|
|
30
|
+
|
|
31
|
+
### 심볼 로드
|
|
32
|
+
|
|
33
|
+
- TypeScript, JavaScript (ES6 부터)
|
|
34
|
+
|
|
35
|
+
```typescript
|
|
36
|
+
import { ejv, EjvError } from 'ejv';
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
> `import { ejv } from 'ejv'`를 사용하면 ES Module 방식으로 빌드된 `build/esm` 폴더를 사용합니다.
|
|
40
|
+
|
|
41
|
+
- JavaScript (ES6 이전)
|
|
42
|
+
|
|
43
|
+
```javascript
|
|
44
|
+
var _ejv = require('ejv');
|
|
45
|
+
var ejv = _ejv.ejv;
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
> `require('ejv')`를 사용하면 CommonJS 방식으로 빌드된 `build/cjs` 폴더를 사용합니다.
|
|
49
|
+
|
|
50
|
+
### 사용방법
|
|
51
|
+
|
|
52
|
+
- TypeScript
|
|
53
|
+
|
|
54
|
+
```typescript
|
|
55
|
+
const error: null | EjvError = ejv({
|
|
56
|
+
a: 10
|
|
57
|
+
}, [{
|
|
58
|
+
key: 'a',
|
|
59
|
+
type: 'number'
|
|
60
|
+
}]);
|
|
61
|
+
|
|
62
|
+
if (!error) {
|
|
63
|
+
console.log('검사 성공');
|
|
64
|
+
}
|
|
65
|
+
else {
|
|
66
|
+
console.log('검사 실패');
|
|
67
|
+
}
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
- JavaScript
|
|
71
|
+
|
|
72
|
+
```javascript
|
|
73
|
+
var error = ejv({
|
|
74
|
+
a: 10
|
|
75
|
+
}, [{
|
|
76
|
+
key: 'a',
|
|
77
|
+
type: 'number'
|
|
78
|
+
}]);
|
|
79
|
+
|
|
80
|
+
if (!error) {
|
|
81
|
+
console.log('검사 성공');
|
|
82
|
+
} else {
|
|
83
|
+
console.log('검사 실패');
|
|
84
|
+
}
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
## `Scheme`
|
|
88
|
+
|
|
89
|
+
`ejv()` 함수로 JSON 객체를 검사하려면 이 함수의 두 번째 인자로 *검사 규칙*을 전달해야 합니다.
|
|
90
|
+
|
|
91
|
+
이 때 검사 규칙은 배열 형태로 정의합니다.
|
|
92
|
+
ejv는 배열에 있는 검사 규칙을 순서대로 확인하기 때문에 검사항목의 우선순위를 지정할 수 있으며, 함수의 실행 결과는 항상 같습니다.
|
|
93
|
+
|
|
94
|
+
### 필수 항목
|
|
95
|
+
|
|
96
|
+
#### `key` : `string`
|
|
97
|
+
|
|
98
|
+
검사할 프로퍼티의 이름을 지정합니다.
|
|
99
|
+
JSON 객체에 있는 `a` 프로퍼티를 검사하려면 `key : 'a'`라고 지정합니다.
|
|
100
|
+
|
|
101
|
+
> 이 프로퍼티는 `array` 타입에 `items` 옵션을 사용할 때 생략할 수 있습니다.
|
|
102
|
+
|
|
103
|
+
#### `type` : [`DataType`](#DataType) | `DataType[]`
|
|
104
|
+
|
|
105
|
+
프로퍼티의 형식을 지정합니다.
|
|
106
|
+
타입이 하나만 지정되면 해당 타입인지 검사합니다.
|
|
107
|
+
그리고 배열로 지정되면 배열에 있는 항목 중 하나에 해당되는지 검사합니다.
|
|
108
|
+
|
|
109
|
+
### 옵션 항목
|
|
110
|
+
|
|
111
|
+
#### 공통
|
|
112
|
+
|
|
113
|
+
- `optional : boolean`
|
|
114
|
+
|
|
115
|
+
`true`로 설정하면 `undefined` 값을 허용합니다.
|
|
116
|
+
이 옵션은 모든 검사규칙에 사용할 수 있습니다.
|
|
117
|
+
|
|
118
|
+
```typescript
|
|
119
|
+
ejv({
|
|
120
|
+
// 빈 객체
|
|
121
|
+
}, [{
|
|
122
|
+
key: 'a',
|
|
123
|
+
optional: true // 프로퍼티가 선언되지 않아도 에러가 발생하지 않습니다.
|
|
124
|
+
}]);
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
- `nullable : boolean`
|
|
128
|
+
|
|
129
|
+
`true`로 설정하면 `null` 값을 허용합니다.
|
|
130
|
+
이 옵션은 모든 검사규칙에 사용할 수 있습니다.
|
|
131
|
+
|
|
132
|
+
```typescript
|
|
133
|
+
ejv({
|
|
134
|
+
a: null
|
|
135
|
+
}, [{
|
|
136
|
+
key: 'a',
|
|
137
|
+
nullable: true
|
|
138
|
+
}]);
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
- `enum : number[] | string[]`
|
|
142
|
+
|
|
143
|
+
배열로 전달되는 값만 허용합니다.
|
|
144
|
+
이 옵션은 `type : number`과 `type : string` 검사규칙에 사용할 수 있습니다.
|
|
145
|
+
|
|
146
|
+
```typescript
|
|
147
|
+
ejv({
|
|
148
|
+
a: 1,
|
|
149
|
+
b: 'hello'
|
|
150
|
+
}, [{
|
|
151
|
+
key: 'a',
|
|
152
|
+
type: 'number',
|
|
153
|
+
enum: [1, 2, 3] // 1, 2, 3 값을 허용합니다.
|
|
154
|
+
}, {
|
|
155
|
+
key: 'b',
|
|
156
|
+
type: 'string',
|
|
157
|
+
enum: ['hello', 'ejv'] // 'hello'나 'ejv' 값을 허용합니다.
|
|
158
|
+
}]);
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
- `notEnumse : number[] | string[]`
|
|
162
|
+
|
|
163
|
+
배열로 전달되는 값을 허용하지 않습니다. 이 옵션의 결과는 `enum` 옵션의 결과와 반대입니다.
|
|
164
|
+
이 옵션은 `type : number`과 `type : string` 검사규칙에 사용할 수 있습니다.
|
|
165
|
+
|
|
166
|
+
```typescript
|
|
167
|
+
ejv({
|
|
168
|
+
a: 1,
|
|
169
|
+
b: 'hello'
|
|
170
|
+
}, [{
|
|
171
|
+
key: 'a',
|
|
172
|
+
type: 'number',
|
|
173
|
+
notEnum: [1, 2, 3] // 1, 2, 3 값을 허용하지 않습니다.
|
|
174
|
+
}, {
|
|
175
|
+
key: 'b',
|
|
176
|
+
type: 'string',
|
|
177
|
+
notEnum: ['hello', 'ejv'] // 'hello'나 'ejv' 값을 허용하지 않습니다.
|
|
178
|
+
}]);
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
#### `'number'` 타입 옵션
|
|
182
|
+
|
|
183
|
+
- `min : number`
|
|
184
|
+
|
|
185
|
+
최소값을 검사합니다.
|
|
186
|
+
이 값보다 작은 숫자이면 에러가 발생합니다.
|
|
187
|
+
|
|
188
|
+
- `exclusiveMin : boolean`
|
|
189
|
+
|
|
190
|
+
`true`로 지정하면 최소 한계값과 같은 값을 허용하지 않습니다.
|
|
191
|
+
이 옵션을 생략하거나 `false`로 지정하면 최소 한계값과 같은 값을 허용합니다.
|
|
192
|
+
이 옵션은 `min` 옵션이 사용되었을 때만 유효합니다.
|
|
193
|
+
|
|
194
|
+
```typescript
|
|
195
|
+
ejv({
|
|
196
|
+
num1: 10,
|
|
197
|
+
num2: 10
|
|
198
|
+
}, [{
|
|
199
|
+
key: 'num1',
|
|
200
|
+
type: 'number',
|
|
201
|
+
min: 10 // 성공
|
|
202
|
+
}, {
|
|
203
|
+
key: 'num2',
|
|
204
|
+
type: 'number',
|
|
205
|
+
min: 10,
|
|
206
|
+
exclusiveMin: true // 실패
|
|
207
|
+
}]);
|
|
208
|
+
```
|
|
209
|
+
|
|
210
|
+
- `max : number`
|
|
211
|
+
|
|
212
|
+
최대값을 검사합니다.
|
|
213
|
+
이 값보다 큰 숫자이면 에러가 발생합니다.
|
|
214
|
+
|
|
215
|
+
- `exclusiveMax : boolean`
|
|
216
|
+
|
|
217
|
+
`true`로 지정하면 최대 한계값과 같은 값을 허용하지 않습니다.
|
|
218
|
+
이 옵션을 생략하거나 `false`로 지정하면 최대 한계값과 같은 값을 허용합니다.
|
|
219
|
+
이 옵션은 `max` 옵션이 사용되었을 때만 유효합니다.
|
|
220
|
+
|
|
221
|
+
```typescript
|
|
222
|
+
ejv({
|
|
223
|
+
num1: 10,
|
|
224
|
+
num2: 10
|
|
225
|
+
}, [{
|
|
226
|
+
key: 'num1',
|
|
227
|
+
type: 'number',
|
|
228
|
+
max: 10 // 성공
|
|
229
|
+
}, {
|
|
230
|
+
key: 'num2',
|
|
231
|
+
type: 'number',
|
|
232
|
+
max: 10,
|
|
233
|
+
exclusiveMax: true // 실패
|
|
234
|
+
}]);
|
|
235
|
+
```
|
|
236
|
+
|
|
237
|
+
- `format : NumberFormat | NumberFormat[]`
|
|
238
|
+
|
|
239
|
+
숫자의 형식을 검사합니다.
|
|
240
|
+
배열로 지정된 경우에는 주어진 형식 중 하나에 해당되면 검사를 통과합니다.
|
|
241
|
+
사용할 수 있는 값은 다음과 같습니다.
|
|
242
|
+
|
|
243
|
+
포맷 | 예
|
|
244
|
+
-------------|--------------------------------------------------------------------------
|
|
245
|
+
`'integer'` | 정수만 허용합니다. ex) -1, 0, 1, ...
|
|
246
|
+
`'index'` | 인덱스만 허용합니다. `format : 'integer', min : 0`을 설정한 것과 같습니다. ex) 0, 1, 2, ...
|
|
247
|
+
|
|
248
|
+
#### `'string'` 타입 옵션
|
|
249
|
+
|
|
250
|
+
- `format : StringFormat | StringFormat[]`
|
|
251
|
+
|
|
252
|
+
문자열의 형식을 검사합니다. 배열로 지정된 경우에는 주어진 형식 중 하나에 해당되면 검사를 통과합니다. 사용할 수 있는 값은 다음과 같습니다.
|
|
253
|
+
|
|
254
|
+
포맷 | 예
|
|
255
|
+
---------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
|
256
|
+
`'email'` | 이메일 형식인지 검사합니다. [RFC 5322 3.4.1](https://tools.ietf.org/html/rfc5322#section-3.4.1) 스펙을 기준으로 합니다. ex) `'email@domain.com'`
|
|
257
|
+
`'date'` | 날짜 형식인지 검사합니다. [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) 스펙을 기준으로 합니다. ex) `'2018-12-29'`
|
|
258
|
+
`'time'` | 시간 형식인지 검사합니다. [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) 스펙을 기준으로 합니다. ex) `'21:07:35'`
|
|
259
|
+
`'date-time'` | 날짜-시간 형식인지 검사합니다. [RFC 3339](https://www.ietf.org/rfc/rfc3339.txt) 스펙과 [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) 스펙을 기준으로 합니다. ex) `'2018-12-29T21:07:35Z'`
|
|
260
|
+
|
|
261
|
+
- `length : number`
|
|
262
|
+
|
|
263
|
+
문자열의 길이를 검사합니다.
|
|
264
|
+
|
|
265
|
+
```typescript
|
|
266
|
+
ejv({
|
|
267
|
+
str: 'hello'
|
|
268
|
+
}, [{
|
|
269
|
+
key: 'str',
|
|
270
|
+
type: 'string',
|
|
271
|
+
length: 5
|
|
272
|
+
}]);
|
|
273
|
+
````
|
|
274
|
+
|
|
275
|
+
- `minLength : number`
|
|
276
|
+
|
|
277
|
+
문자열의 최소 길이를 검사합니다.
|
|
278
|
+
|
|
279
|
+
```typescript
|
|
280
|
+
ejv({
|
|
281
|
+
str: 'hello'
|
|
282
|
+
}, [{
|
|
283
|
+
key: 'str',
|
|
284
|
+
type: 'string',
|
|
285
|
+
minLength: 5
|
|
286
|
+
}]);
|
|
287
|
+
````
|
|
288
|
+
|
|
289
|
+
- `maxLength : string`
|
|
290
|
+
|
|
291
|
+
문자열의 최대 길이를 검사합니다.
|
|
292
|
+
|
|
293
|
+
```typescript
|
|
294
|
+
ejv({
|
|
295
|
+
str: 'hello'
|
|
296
|
+
}, [{
|
|
297
|
+
key: 'str',
|
|
298
|
+
type: 'string',
|
|
299
|
+
maxLength: 5
|
|
300
|
+
}]);
|
|
301
|
+
````
|
|
302
|
+
|
|
303
|
+
- `pattern : string | string[] | RegExp | RegExp[]`
|
|
304
|
+
|
|
305
|
+
문자열의 형식을 검사합니다.
|
|
306
|
+
문자열로 지정되면 이 문자열을 정규표현식으로 변환해서 검사하며, 정규표현식으로 지정되면 정규표현식을 통과하는지 검사합니다.
|
|
307
|
+
이 옵션의 값이 배열로 지정되면 배열 중 하나를 통과하면 검사를 통과합니다.
|
|
308
|
+
|
|
309
|
+
```typescript
|
|
310
|
+
ejv({
|
|
311
|
+
str: 'abc'
|
|
312
|
+
}, [{
|
|
313
|
+
key: 'str',
|
|
314
|
+
type: 'string',
|
|
315
|
+
pattern: 'abc'
|
|
316
|
+
}, {
|
|
317
|
+
key: 'str',
|
|
318
|
+
type: 'string',
|
|
319
|
+
pattern: ['abc', 'ac']
|
|
320
|
+
}, {
|
|
321
|
+
key: 'str',
|
|
322
|
+
type: 'string',
|
|
323
|
+
pattern: /abc/
|
|
324
|
+
}, {
|
|
325
|
+
key: 'str',
|
|
326
|
+
type: 'string',
|
|
327
|
+
pattern: [/abc/, /ac/]
|
|
328
|
+
}]);
|
|
329
|
+
```
|
|
330
|
+
|
|
331
|
+
#### `'object'` 타입 옵션
|
|
332
|
+
|
|
333
|
+
- `allowNoProperty : boolean`
|
|
334
|
+
|
|
335
|
+
객체에 프로퍼티가 최소한 1개 이상 있는지 검사합니다.
|
|
336
|
+
이 옵션에 `false`를 지정하면 프로퍼티가 없는 객체를 허용하지 않습니다.
|
|
337
|
+
이 옵션을 생략하거나 `true`로 지정하면 프로퍼티가 없는 객체를 허용합니다.
|
|
338
|
+
|
|
339
|
+
```typescript
|
|
340
|
+
ejv({
|
|
341
|
+
obj: {}
|
|
342
|
+
}, [{
|
|
343
|
+
key: 'obj',
|
|
344
|
+
type: 'object',
|
|
345
|
+
allowNoProperty: false // 실패
|
|
346
|
+
}]);
|
|
347
|
+
```
|
|
348
|
+
|
|
349
|
+
- `properties : Scheme[]`
|
|
350
|
+
|
|
351
|
+
객체의 세부 형식을 지정합니다.
|
|
352
|
+
검사 대상으로 지정된 객체는 ejv()가 재귀적으로 검사합니다.
|
|
353
|
+
|
|
354
|
+
```typescript
|
|
355
|
+
ejv({
|
|
356
|
+
data: {
|
|
357
|
+
num: 10,
|
|
358
|
+
str: 'ejv'
|
|
359
|
+
}
|
|
360
|
+
}, [{
|
|
361
|
+
key: 'data',
|
|
362
|
+
type: 'object',
|
|
363
|
+
properties: [{
|
|
364
|
+
key: 'num',
|
|
365
|
+
type: 'number'
|
|
366
|
+
}, {
|
|
367
|
+
key: 'str',
|
|
368
|
+
type: 'string'
|
|
369
|
+
}]
|
|
370
|
+
}]);
|
|
371
|
+
```
|
|
372
|
+
|
|
373
|
+
#### `'date'` 타입 옵션
|
|
374
|
+
|
|
375
|
+
- `min : Date | string`
|
|
376
|
+
|
|
377
|
+
날짜의 최소값을 검사합니다.
|
|
378
|
+
이 값보다 이전 날짜이면 에러가 발생합니다.
|
|
379
|
+
최소값은 `Date` 객체나 날짜를 표현하는 문자열을 사용할 수 있습니다.
|
|
380
|
+
|
|
381
|
+
- `exclusiveMin : boolean`
|
|
382
|
+
|
|
383
|
+
`true`로 지정하면 날짜의 최소값과 같은 값을 허용하지 않습니다.
|
|
384
|
+
이 옵션을 생략하거나 `false`로 지정하면 날짜의 최소값과 같은 값을 허용합니다.
|
|
385
|
+
이 옵션은 `min` 옵션이 사용되었을 때만 유효합니다.
|
|
386
|
+
|
|
387
|
+
```typescript
|
|
388
|
+
ejv({
|
|
389
|
+
date1: new Date(2019, 11, 30)
|
|
390
|
+
}, [{
|
|
391
|
+
key: 'date1',
|
|
392
|
+
type: 'date',
|
|
393
|
+
min: new Date(2019, 11, 30) // 성공
|
|
394
|
+
}, {
|
|
395
|
+
key: 'date1',
|
|
396
|
+
type: 'date',
|
|
397
|
+
min: new Date(2019, 11, 30),
|
|
398
|
+
exclusiveMin: true // 실패
|
|
399
|
+
}, {
|
|
400
|
+
key: 'date1',
|
|
401
|
+
type: 'date',
|
|
402
|
+
min: '2019-12-30T00:00:00Z' // 성공
|
|
403
|
+
}, {
|
|
404
|
+
key: 'date1',
|
|
405
|
+
type: 'date',
|
|
406
|
+
min: '2019-12-30T00:00:00Z',
|
|
407
|
+
exclusiveMin: true // 실패
|
|
408
|
+
}]);
|
|
409
|
+
```
|
|
410
|
+
|
|
411
|
+
- `max : Date | string`
|
|
412
|
+
|
|
413
|
+
날짜의 최대값을 검사합니다.
|
|
414
|
+
이 값보다 이후 날짜이면 에러가 발생합니다.
|
|
415
|
+
최대값은 `Date` 객체나 날짜를 표현하는 문자열을 사용할 수 있습니다.
|
|
416
|
+
|
|
417
|
+
- `exclusiveMax : boolean`
|
|
418
|
+
|
|
419
|
+
`true`로 지정하면 날짜의 최대값과 같은 값을 허용하지 않습니다.
|
|
420
|
+
이 옵션을 생략하거나 `false`로 지정하면 날짜의 최대값과 같은 값을 허용합니다.
|
|
421
|
+
이 옵션은 `max` 옵션이 사용되었을 때만 유효합니다.
|
|
422
|
+
|
|
423
|
+
```typescript
|
|
424
|
+
ejv({
|
|
425
|
+
date1: new Date(2019, 11, 30)
|
|
426
|
+
}, [{
|
|
427
|
+
key: 'date1',
|
|
428
|
+
type: 'date',
|
|
429
|
+
max: new Date(2019, 11, 30) // 성공
|
|
430
|
+
}, {
|
|
431
|
+
key: 'date1',
|
|
432
|
+
type: 'date',
|
|
433
|
+
max: new Date(2019, 11, 30),
|
|
434
|
+
exclusiveMax: true // 실패
|
|
435
|
+
}, {
|
|
436
|
+
key: 'date1',
|
|
437
|
+
type: 'date',
|
|
438
|
+
max: '2019-12-30T00:00:00Z' // 성공
|
|
439
|
+
}, {
|
|
440
|
+
key: 'date1',
|
|
441
|
+
type: 'date',
|
|
442
|
+
max: '2019-12-30T00:00:00Z',
|
|
443
|
+
exclusiveMax: true // 실패
|
|
444
|
+
}]);
|
|
445
|
+
```
|
|
446
|
+
|
|
447
|
+
#### `'array'` 타입 옵션
|
|
448
|
+
|
|
449
|
+
- `length : number`
|
|
450
|
+
|
|
451
|
+
배열의 길이를 검사합니다.
|
|
452
|
+
|
|
453
|
+
```typescript
|
|
454
|
+
ejv({
|
|
455
|
+
arr: [1, 2]
|
|
456
|
+
}, [{
|
|
457
|
+
key: 'arr',
|
|
458
|
+
type: 'array',
|
|
459
|
+
length: 2
|
|
460
|
+
}]);
|
|
461
|
+
````
|
|
462
|
+
|
|
463
|
+
- `minLength : number`
|
|
464
|
+
|
|
465
|
+
배열의 최소 길이를 검사합니다.
|
|
466
|
+
|
|
467
|
+
```typescript
|
|
468
|
+
ejv({
|
|
469
|
+
arr: [1, 2]
|
|
470
|
+
}, [{
|
|
471
|
+
key: 'arr',
|
|
472
|
+
type: 'array',
|
|
473
|
+
minLength: 2
|
|
474
|
+
}]);
|
|
475
|
+
````
|
|
476
|
+
|
|
477
|
+
- `maxLength : string`
|
|
478
|
+
|
|
479
|
+
배열의 최대 길이를 검사합니다.
|
|
480
|
+
|
|
481
|
+
```typescript
|
|
482
|
+
ejv({
|
|
483
|
+
arr: [1, 2, 3]
|
|
484
|
+
}, [{
|
|
485
|
+
key: 'arr',
|
|
486
|
+
type: 'array',
|
|
487
|
+
maxLength: 3
|
|
488
|
+
}]);
|
|
489
|
+
````
|
|
490
|
+
|
|
491
|
+
- `unique : boolean`
|
|
492
|
+
|
|
493
|
+
배열의 항목이 모두 다른지 검사합니다.
|
|
494
|
+
`true`로 지정하면 배열의 값이 중복되는 것을 허용하지 않습니다.
|
|
495
|
+
이 옵션을 생략하거나 `false`로 지정하면 배열의 값이 중복되는 것을 허용합니다.
|
|
496
|
+
|
|
497
|
+
- `items : Scheme[]`
|
|
498
|
+
|
|
499
|
+
배열의 항목을 검사할 규칙을 지정합니다.
|
|
500
|
+
이 때 지정하는 Scheme은 ejv() 함수에 사용하는 Scheme과 같은 형식이지만 `key`는 생략합니다.
|
|
501
|
+
배열로 지정한 규칙은 ejv()가 재귀적으로 검사하며, 배열에 지정된 순서대로 처리됩니다.
|
|
502
|
+
|
|
503
|
+
```typescript
|
|
504
|
+
ejv({
|
|
505
|
+
arr: [1, 2, 3]
|
|
506
|
+
}, [{
|
|
507
|
+
key: 'arr',
|
|
508
|
+
type: 'array',
|
|
509
|
+
items: [{
|
|
510
|
+
type: 'number',
|
|
511
|
+
min: 1,
|
|
512
|
+
max: 3
|
|
513
|
+
}]
|
|
514
|
+
}])
|
|
515
|
+
```
|
|
516
|
+
|
|
517
|
+
## `DataType`
|
|
518
|
+
|
|
519
|
+
검사할 프로퍼티의 타입을 지정합니다.
|
|
520
|
+
사용할 수 있는 값은 다음과 같습니다.
|
|
521
|
+
|
|
522
|
+
타입 | 예
|
|
523
|
+
-------------|-------------------------------
|
|
524
|
+
`'boolean'` | `true`, `false`
|
|
525
|
+
`'number'` | `0`, `1`, `1.5`, ...
|
|
526
|
+
`'string'` | `'ejv'`, `'hello'`, ...
|
|
527
|
+
`'object'` | `{}`, `{ key : 123 }`, ...
|
|
528
|
+
`'date'` | `new Date`
|
|
529
|
+
`'regexp'` | `new RegExp(/./)`, `/./`, ...
|
|
530
|
+
`'array'` | `[]`, `[1, 2, 3]`, ...
|
|
531
|
+
|
|
532
|
+
## `EjvError`
|
|
533
|
+
|
|
534
|
+
객체가 검사 규칙을 통과하면 `null` 객체를 반환하지만, 검사 규칙을 통과하지 못하면 `EjvError` 타입의 인스턴스를 반환합니다.
|
|
535
|
+
`EjvError` 객체는 이 때 발생한 에러를 표현하는 객체입니다.
|
|
536
|
+
|
|
537
|
+
> `EjvError` 형식을 꼭 사용할 필요는 없습니다.
|
|
538
|
+
> 하지만 TypeScript를 사용한다면 이 객체의 프로퍼티를 참조할 때 활용할 수 있습니다.
|
|
539
|
+
|
|
540
|
+
- `type : ErrorKey`
|
|
541
|
+
|
|
542
|
+
발생한 에러의 타입을 표현합니다.
|
|
543
|
+
|
|
544
|
+
- `message : string`
|
|
545
|
+
|
|
546
|
+
발생한 에러의 내용을 설명합니다.
|
|
547
|
+
|
|
548
|
+
- `path : string`
|
|
549
|
+
|
|
550
|
+
에러가 발생한 데이터 위치를 가리킵니다.
|
|
551
|
+
|
|
552
|
+
- `data : any`
|
|
553
|
+
|
|
554
|
+
`ejv()`로 전달한 데이터 자체를 의미합니다.
|
|
555
|
+
|
|
556
|
+
- `errorData : any`
|
|
557
|
+
|
|
558
|
+
에러가 발생한 데이터를 의미합니다.
|
|
559
|
+
|
|
560
|
+
사용방법)
|
|
561
|
+
|
|
562
|
+
```typescript
|
|
563
|
+
import { ejv, EjvError } from 'ejv';
|
|
564
|
+
|
|
565
|
+
const error: null | EjvError = ejv({
|
|
566
|
+
a: 10
|
|
567
|
+
}, [{
|
|
568
|
+
key: 'a',
|
|
569
|
+
type: 'string'
|
|
570
|
+
}]);
|
|
571
|
+
|
|
572
|
+
console.log(error.type); // 'TYPE_MISMATCH'
|
|
573
|
+
console.log(error.message); // 'the value should be a string'
|
|
574
|
+
console.log(error.path); // 'a'
|
|
575
|
+
console.log(error.data); // { a : 10 }
|
|
576
|
+
console.log(error.errorData); // 10
|
|
577
|
+
```
|
|
578
|
+
|
|
579
|
+
## 옵션
|
|
580
|
+
|
|
581
|
+
`ejv()` 함수를 사용할 때 3번째 인자로 옵션을 지정할 수 있습니다.
|
|
582
|
+
|
|
583
|
+
- `customErrorMsg: object`
|
|
584
|
+
|
|
585
|
+
ejv가 제공하는 에러 메시지를 다른 내용으로 변경하려면 `EjvError.type`에 해당하는 키로 에러 메시지를 오버라이드 할 수 있습니다.
|
|
586
|
+
|
|
587
|
+
이 옵션은 `object` 형태로 사용합니다. 오버라이드하려는 에러에 해당하는 `ErrorType`를 키로 사용해서 원하는 문구를 지정해 보세요.
|
|
588
|
+
|
|
589
|
+
```typescript
|
|
590
|
+
import { ejv, EjvError, ErrorType } from 'ejv';
|
|
591
|
+
|
|
592
|
+
const error: null | EjvError = ejv({
|
|
593
|
+
a: 10
|
|
594
|
+
}, [{
|
|
595
|
+
key: 'a',
|
|
596
|
+
type: 'string'
|
|
597
|
+
}, {
|
|
598
|
+
customErrorMsg: {
|
|
599
|
+
[ErrorType.TYPE_MISMATCH]: 'property "a" should be a "string".'
|
|
600
|
+
}
|
|
601
|
+
}]);
|
|
602
|
+
|
|
603
|
+
console.log(error.message); // 'property "a" should be a "string".'
|
|
604
|
+
```
|