@zipbul/baker 0.0.1
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 -0
- package/README.ko.md +448 -0
- package/README.md +448 -0
- package/dist/index-6pbm9cq6.js +15 -0
- package/dist/index-6pbm9cq6.js.map +17 -0
- package/dist/index-fww37qs9.js +5 -0
- package/dist/index-fww37qs9.js.map +20 -0
- package/dist/index-w36xamck.js +6 -0
- package/dist/index-w36xamck.js.map +10 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.js +145 -0
- package/dist/index.js.map +18 -0
- package/dist/src/aot/array.d.ts +7 -0
- package/dist/src/aot/common.d.ts +15 -0
- package/dist/src/aot/date.d.ts +3 -0
- package/dist/src/aot/index.d.ts +9 -0
- package/dist/src/aot/index.js +5 -0
- package/dist/src/aot/index.js.map +18 -0
- package/dist/src/aot/locales.d.ts +5 -0
- package/dist/src/aot/number.d.ts +6 -0
- package/dist/src/aot/object.d.ts +6 -0
- package/dist/src/aot/string.d.ts +72 -0
- package/dist/src/aot/transform.d.ts +25 -0
- package/dist/src/aot/typechecker.d.ts +10 -0
- package/dist/src/collect.d.ts +12 -0
- package/dist/src/create-rule.d.ts +31 -0
- package/dist/src/decorators/array.d.ts +13 -0
- package/dist/src/decorators/common.d.ts +33 -0
- package/dist/src/decorators/date.d.ts +5 -0
- package/dist/src/decorators/index.d.ts +11 -0
- package/dist/src/decorators/index.js +5 -0
- package/dist/src/decorators/index.js.map +9 -0
- package/dist/src/decorators/locales.d.ts +9 -0
- package/dist/src/decorators/number.d.ts +11 -0
- package/dist/src/decorators/object.d.ts +9 -0
- package/dist/src/decorators/string.d.ts +72 -0
- package/dist/src/decorators/transform.d.ts +68 -0
- package/dist/src/decorators/typechecker.d.ts +18 -0
- package/dist/src/errors.d.ts +37 -0
- package/dist/src/functions/deserialize.d.ts +8 -0
- package/dist/src/functions/index.d.ts +2 -0
- package/dist/src/functions/serialize.d.ts +8 -0
- package/dist/src/interfaces.d.ts +47 -0
- package/dist/src/registry.d.ts +16 -0
- package/dist/src/rules/array.d.ts +7 -0
- package/dist/src/rules/common.d.ts +7 -0
- package/dist/src/rules/date.d.ts +3 -0
- package/dist/src/rules/index.d.ts +11 -0
- package/dist/src/rules/index.js +5 -0
- package/dist/src/rules/index.js.map +9 -0
- package/dist/src/rules/locales.d.ts +5 -0
- package/dist/src/rules/number.d.ts +6 -0
- package/dist/src/rules/object.d.ts +7 -0
- package/dist/src/rules/string.d.ts +145 -0
- package/dist/src/rules/typechecker.d.ts +14 -0
- package/dist/src/seal/circular-analyzer.d.ts +13 -0
- package/dist/src/seal/deserialize-builder.d.ts +5 -0
- package/dist/src/seal/expose-validator.d.ts +11 -0
- package/dist/src/seal/index.d.ts +5 -0
- package/dist/src/seal/seal.d.ts +27 -0
- package/dist/src/seal/serialize-builder.d.ts +7 -0
- package/dist/src/symbols.d.ts +8 -0
- package/dist/src/symbols.js +5 -0
- package/dist/src/symbols.js.map +9 -0
- package/dist/src/types.d.ts +119 -0
- package/package.json +83 -0
package/README.md
ADDED
|
@@ -0,0 +1,448 @@
|
|
|
1
|
+
<p align="center">
|
|
2
|
+
<h1 align="center">@zipbul/baker</h1>
|
|
3
|
+
<p align="center">
|
|
4
|
+
<strong>Decorator-based validate + transform with inline code generation</strong>
|
|
5
|
+
</p>
|
|
6
|
+
<p align="center">
|
|
7
|
+
class-validator DX · AOT-level performance · zero reflect-metadata
|
|
8
|
+
</p>
|
|
9
|
+
<p align="center">
|
|
10
|
+
<a href="https://github.com/zipbul/baker/actions"><img src="https://github.com/zipbul/baker/actions/workflows/ci.yml/badge.svg" alt="CI"></a>
|
|
11
|
+
<a href="https://www.npmjs.com/package/@zipbul/baker"><img src="https://img.shields.io/npm/v/@zipbul/baker.svg" alt="npm version"></a>
|
|
12
|
+
<a href="https://www.npmjs.com/package/@zipbul/baker"><img src="https://img.shields.io/npm/dm/@zipbul/baker.svg" alt="npm downloads"></a>
|
|
13
|
+
<a href="https://github.com/zipbul/baker/blob/main/LICENSE"><img src="https://img.shields.io/npm/l/@zipbul/baker.svg" alt="license"></a>
|
|
14
|
+
</p>
|
|
15
|
+
</p>
|
|
16
|
+
|
|
17
|
+
<p align="center">
|
|
18
|
+
<a href="./README.ko.md">한국어</a>
|
|
19
|
+
</p>
|
|
20
|
+
|
|
21
|
+
---
|
|
22
|
+
|
|
23
|
+
## 🤔 Why Baker?
|
|
24
|
+
|
|
25
|
+
| | class-validator | Zod | TypeBox | **Baker** |
|
|
26
|
+
|---|---|---|---|---|
|
|
27
|
+
| Schema style | Decorators | Function chaining | JSON Schema builder | **Decorators** |
|
|
28
|
+
| Performance | Runtime interpreter | Runtime interpreter | JIT compile | **`new Function()` inline codegen** |
|
|
29
|
+
| Transform built-in | Separate package | `.transform()` | ✗ | **Unified** |
|
|
30
|
+
| reflect-metadata | Required | N/A | N/A | **Not needed** |
|
|
31
|
+
| class-validator migration | — | Full rewrite | Full rewrite | **Near drop-in** |
|
|
32
|
+
|
|
33
|
+
Baker gives you the **familiar decorator DX** of class-validator while generating optimized validation + transformation functions via `new Function()` at seal time — delivering **AOT-equivalent performance without a compiler plugin**.
|
|
34
|
+
|
|
35
|
+
---
|
|
36
|
+
|
|
37
|
+
## ✨ Features
|
|
38
|
+
|
|
39
|
+
- 🎯 **Decorator-first** — `@IsString()`, `@Min()`, `@IsEmail()` and 80+ built-in validators
|
|
40
|
+
- ⚡ **Inline code generation** — `seal()` compiles validators into optimized functions, no runtime interpretation
|
|
41
|
+
- 🔄 **Unified validate + transform** — `deserialize()` and `serialize()` in one async call
|
|
42
|
+
- 🪶 **Zero reflect-metadata** — no `reflect-metadata` import needed
|
|
43
|
+
- 🔁 **Circular reference detection** — automatic static analysis at seal time
|
|
44
|
+
- 🏷️ **Group-based validation** — apply different rules per request with `groups`
|
|
45
|
+
- 🧩 **Custom rules** — `createRule()` for user-defined validators with codegen support
|
|
46
|
+
- 🚀 **AOT mode** — zipbul CLI generates code at build time, eliminating runtime `seal()` cost
|
|
47
|
+
|
|
48
|
+
---
|
|
49
|
+
|
|
50
|
+
## 📦 Installation
|
|
51
|
+
|
|
52
|
+
```bash
|
|
53
|
+
bun add @zipbul/baker
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
> **Requirements:** Bun ≥ 1.0, `experimentalDecorators: true` in tsconfig.json
|
|
57
|
+
|
|
58
|
+
```jsonc
|
|
59
|
+
// tsconfig.json
|
|
60
|
+
{
|
|
61
|
+
"compilerOptions": {
|
|
62
|
+
"experimentalDecorators": true
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
---
|
|
68
|
+
|
|
69
|
+
## 🚀 Quick Start
|
|
70
|
+
|
|
71
|
+
### 1. Define a DTO
|
|
72
|
+
|
|
73
|
+
```typescript
|
|
74
|
+
import { IsString, IsInt, IsEmail, Min, Max } from '@zipbul/baker/decorators';
|
|
75
|
+
|
|
76
|
+
class CreateUserDto {
|
|
77
|
+
@IsString()
|
|
78
|
+
name!: string;
|
|
79
|
+
|
|
80
|
+
@IsInt()
|
|
81
|
+
@Min(0)
|
|
82
|
+
@Max(120)
|
|
83
|
+
age!: number;
|
|
84
|
+
|
|
85
|
+
@IsEmail()
|
|
86
|
+
email!: string;
|
|
87
|
+
}
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
### 2. Seal at startup
|
|
91
|
+
|
|
92
|
+
```typescript
|
|
93
|
+
import { seal } from '@zipbul/baker';
|
|
94
|
+
|
|
95
|
+
// Compiles all registered DTOs into optimized validators
|
|
96
|
+
seal();
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
### 3. Deserialize per request
|
|
100
|
+
|
|
101
|
+
```typescript
|
|
102
|
+
import { deserialize, BakerValidationError } from '@zipbul/baker';
|
|
103
|
+
|
|
104
|
+
try {
|
|
105
|
+
const user = await deserialize(CreateUserDto, requestBody);
|
|
106
|
+
// user is a validated CreateUserDto instance
|
|
107
|
+
} catch (e) {
|
|
108
|
+
if (e instanceof BakerValidationError) {
|
|
109
|
+
console.log(e.errors); // BakerError[]
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
### 4. Serialize
|
|
115
|
+
|
|
116
|
+
```typescript
|
|
117
|
+
import { serialize } from '@zipbul/baker';
|
|
118
|
+
|
|
119
|
+
const plain = await serialize(userInstance);
|
|
120
|
+
// plain: Record<string, unknown>
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
---
|
|
124
|
+
|
|
125
|
+
## 🏗️ Decorators
|
|
126
|
+
|
|
127
|
+
### Type Checkers
|
|
128
|
+
|
|
129
|
+
| Decorator | Description |
|
|
130
|
+
|---|---|
|
|
131
|
+
| `@IsString()` | `typeof === 'string'` |
|
|
132
|
+
| `@IsNumber(opts?)` | `typeof === 'number'` with NaN/Infinity checks |
|
|
133
|
+
| `@IsInt()` | Integer check |
|
|
134
|
+
| `@IsBoolean()` | `typeof === 'boolean'` |
|
|
135
|
+
| `@IsDate()` | `instanceof Date && !isNaN` |
|
|
136
|
+
| `@IsEnum(enumObj)` | Enum value check |
|
|
137
|
+
| `@IsArray()` | `Array.isArray()` |
|
|
138
|
+
| `@IsObject()` | `typeof === 'object'`, excludes null/Array |
|
|
139
|
+
|
|
140
|
+
### Common
|
|
141
|
+
|
|
142
|
+
| Decorator | Description |
|
|
143
|
+
|---|---|
|
|
144
|
+
| `@IsDefined()` | `!== undefined && !== null` |
|
|
145
|
+
| `@IsOptional()` | Skip subsequent rules if value is absent |
|
|
146
|
+
| `@IsNotEmpty()` | `!== undefined && !== null && !== ''` |
|
|
147
|
+
| `@IsEmpty()` | `=== undefined \|\| === null \|\| === ''` |
|
|
148
|
+
| `@Equals(val)` | `=== val` |
|
|
149
|
+
| `@NotEquals(val)` | `!== val` |
|
|
150
|
+
| `@IsIn(values)` | Value is in the given array |
|
|
151
|
+
| `@IsNotIn(values)` | Value is not in the given array |
|
|
152
|
+
| `@ValidateNested()` | Validate nested DTO |
|
|
153
|
+
| `@ValidateIf(fn)` | Conditional validation |
|
|
154
|
+
|
|
155
|
+
### Number
|
|
156
|
+
|
|
157
|
+
| Decorator | Description |
|
|
158
|
+
|---|---|
|
|
159
|
+
| `@Min(n)` | `value >= n` |
|
|
160
|
+
| `@Max(n)` | `value <= n` |
|
|
161
|
+
| `@IsPositive()` | `value > 0` |
|
|
162
|
+
| `@IsNegative()` | `value < 0` |
|
|
163
|
+
| `@IsInRange(min, max)` | `min <= value <= max` |
|
|
164
|
+
| `@IsDivisibleBy(n)` | `value % n === 0` |
|
|
165
|
+
|
|
166
|
+
### String
|
|
167
|
+
|
|
168
|
+
<details>
|
|
169
|
+
<summary>50+ string validators — click to expand</summary>
|
|
170
|
+
|
|
171
|
+
| Decorator | Description |
|
|
172
|
+
|---|---|
|
|
173
|
+
| `@MinLength(n)` | Minimum length |
|
|
174
|
+
| `@MaxLength(n)` | Maximum length |
|
|
175
|
+
| `@Length(min, max)` | Length range |
|
|
176
|
+
| `@Contains(seed)` | Contains substring |
|
|
177
|
+
| `@NotContains(seed)` | Does not contain substring |
|
|
178
|
+
| `@Matches(pattern)` | Regex match |
|
|
179
|
+
| `@IsAlpha()` | Alphabetic only |
|
|
180
|
+
| `@IsAlphanumeric()` | Alphanumeric only |
|
|
181
|
+
| `@IsNumeric()` | Numeric string |
|
|
182
|
+
| `@IsEmail(opts?)` | Email format |
|
|
183
|
+
| `@IsURL(opts?)` | URL format |
|
|
184
|
+
| `@IsUUID(version?)` | UUID v1–v5 |
|
|
185
|
+
| `@IsIP(version?)` | IPv4 / IPv6 |
|
|
186
|
+
| `@IsMACAddress()` | MAC address |
|
|
187
|
+
| `@IsISBN(version?)` | ISBN-10 / ISBN-13 |
|
|
188
|
+
| `@IsISIN()` | ISIN |
|
|
189
|
+
| `@IsIBAN()` | IBAN |
|
|
190
|
+
| `@IsJSON()` | Parseable JSON string |
|
|
191
|
+
| `@IsBase64()` | Base64 encoded |
|
|
192
|
+
| `@IsBase32()` | Base32 encoded |
|
|
193
|
+
| `@IsBase58()` | Base58 encoded |
|
|
194
|
+
| `@IsHexColor()` | Hex color code |
|
|
195
|
+
| `@IsHSL()` | HSL color |
|
|
196
|
+
| `@IsRgbColor()` | RGB color |
|
|
197
|
+
| `@IsHexadecimal()` | Hex string |
|
|
198
|
+
| `@IsBIC()` | BIC/SWIFT code |
|
|
199
|
+
| `@IsISRC()` | ISRC code |
|
|
200
|
+
| `@IsEAN()` | EAN barcode |
|
|
201
|
+
| `@IsMimeType()` | MIME type |
|
|
202
|
+
| `@IsMagnetURI()` | Magnet URI |
|
|
203
|
+
| `@IsCreditCard()` | Credit card number |
|
|
204
|
+
| `@IsHash(algorithm)` | Hash (`md5 \| sha1 \| sha256 \| sha512` etc.) |
|
|
205
|
+
| `@IsRFC3339()` | RFC 3339 date |
|
|
206
|
+
| `@IsMilitaryTime()` | 24h format (`HH:MM`) |
|
|
207
|
+
| `@IsLatitude()` | Latitude (-90 ~ 90) |
|
|
208
|
+
| `@IsLongitude()` | Longitude (-180 ~ 180) |
|
|
209
|
+
| `@IsEthereumAddress()` | Ethereum address |
|
|
210
|
+
| `@IsBtcAddress()` | Bitcoin address (P2PKH/P2SH/bech32) |
|
|
211
|
+
| `@IsISO4217CurrencyCode()` | ISO 4217 currency code |
|
|
212
|
+
| `@IsPhoneNumber()` | E.164 international phone number |
|
|
213
|
+
| `@IsStrongPassword(opts?)` | Strong password |
|
|
214
|
+
| `@IsSemVer()` | Semantic version |
|
|
215
|
+
| `@IsISO8601()` | ISO 8601 date string |
|
|
216
|
+
| `@IsMongoId()` | MongoDB ObjectId |
|
|
217
|
+
| `@IsTaxId(locale)` | Tax ID by locale |
|
|
218
|
+
|
|
219
|
+
</details>
|
|
220
|
+
|
|
221
|
+
### Date
|
|
222
|
+
|
|
223
|
+
| Decorator | Description |
|
|
224
|
+
|---|---|
|
|
225
|
+
| `@MinDate(date)` | Minimum date |
|
|
226
|
+
| `@MaxDate(date)` | Maximum date |
|
|
227
|
+
|
|
228
|
+
### Array
|
|
229
|
+
|
|
230
|
+
| Decorator | Description |
|
|
231
|
+
|---|---|
|
|
232
|
+
| `@ArrayContains(values)` | Contains all given elements |
|
|
233
|
+
| `@ArrayNotContains(values)` | Contains none of the given elements |
|
|
234
|
+
| `@ArrayMinSize(n)` | Minimum array length |
|
|
235
|
+
| `@ArrayMaxSize(n)` | Maximum array length |
|
|
236
|
+
| `@ArrayUnique()` | No duplicates |
|
|
237
|
+
| `@ArrayNotEmpty()` | Not empty |
|
|
238
|
+
|
|
239
|
+
### Locale-specific
|
|
240
|
+
|
|
241
|
+
| Decorator | Description |
|
|
242
|
+
|---|---|
|
|
243
|
+
| `@IsMobilePhone(locale)` | Mobile phone by locale |
|
|
244
|
+
| `@IsPostalCode(locale)` | Postal code by locale |
|
|
245
|
+
| `@IsIdentityCard(locale)` | Identity card by locale |
|
|
246
|
+
| `@IsPassportNumber(locale)` | Passport number by locale |
|
|
247
|
+
|
|
248
|
+
### Transform & Type
|
|
249
|
+
|
|
250
|
+
| Decorator | Description |
|
|
251
|
+
|---|---|
|
|
252
|
+
| `@Transform(fn, opts?)` | Custom transform function |
|
|
253
|
+
| `@Type(fn)` | Nested DTO type + implicit conversion |
|
|
254
|
+
| `@Expose(opts?)` | Control property exposure |
|
|
255
|
+
| `@Exclude(opts?)` | Exclude property from serialization |
|
|
256
|
+
|
|
257
|
+
---
|
|
258
|
+
|
|
259
|
+
## ⚙️ Validation Options
|
|
260
|
+
|
|
261
|
+
Every validation decorator accepts `ValidationOptions` as its last argument:
|
|
262
|
+
|
|
263
|
+
```typescript
|
|
264
|
+
interface ValidationOptions {
|
|
265
|
+
each?: boolean; // Apply rule to each array element
|
|
266
|
+
groups?: string[]; // Groups this rule belongs to
|
|
267
|
+
message?: string | ((args: {
|
|
268
|
+
property: string;
|
|
269
|
+
value: unknown;
|
|
270
|
+
constraints: unknown[];
|
|
271
|
+
}) => string); // Custom error message
|
|
272
|
+
context?: unknown; // Arbitrary context attached to error
|
|
273
|
+
}
|
|
274
|
+
```
|
|
275
|
+
|
|
276
|
+
**Example:**
|
|
277
|
+
|
|
278
|
+
```typescript
|
|
279
|
+
class UserDto {
|
|
280
|
+
@IsString({ message: 'Name must be a string' })
|
|
281
|
+
name!: string;
|
|
282
|
+
|
|
283
|
+
@IsInt({
|
|
284
|
+
message: ({ property }) => `${property} must be an integer`,
|
|
285
|
+
context: { httpStatus: 400 },
|
|
286
|
+
})
|
|
287
|
+
age!: number;
|
|
288
|
+
}
|
|
289
|
+
```
|
|
290
|
+
|
|
291
|
+
---
|
|
292
|
+
|
|
293
|
+
## 🚨 Error Handling
|
|
294
|
+
|
|
295
|
+
When validation fails, `deserialize()` throws a `BakerValidationError`:
|
|
296
|
+
|
|
297
|
+
```typescript
|
|
298
|
+
class BakerValidationError extends Error {
|
|
299
|
+
readonly errors: BakerError[];
|
|
300
|
+
readonly className: string;
|
|
301
|
+
}
|
|
302
|
+
```
|
|
303
|
+
|
|
304
|
+
Each error follows the `BakerError` interface:
|
|
305
|
+
|
|
306
|
+
```typescript
|
|
307
|
+
interface BakerError {
|
|
308
|
+
readonly path: string; // Field path ('user.address.city')
|
|
309
|
+
readonly code: string; // Error code ('isString', 'min', 'isEmail')
|
|
310
|
+
readonly message?: string; // Custom message (when message option is set)
|
|
311
|
+
readonly context?: unknown; // Custom context (when context option is set)
|
|
312
|
+
}
|
|
313
|
+
```
|
|
314
|
+
|
|
315
|
+
---
|
|
316
|
+
|
|
317
|
+
## 📋 Array Validation
|
|
318
|
+
|
|
319
|
+
Use `each: true` to apply rules to each element of an Array, Set, or Map:
|
|
320
|
+
|
|
321
|
+
```typescript
|
|
322
|
+
class TagsDto {
|
|
323
|
+
@IsString({ each: true })
|
|
324
|
+
tags!: string[];
|
|
325
|
+
}
|
|
326
|
+
```
|
|
327
|
+
|
|
328
|
+
---
|
|
329
|
+
|
|
330
|
+
## 🏷️ Group-based Validation
|
|
331
|
+
|
|
332
|
+
Apply different rules depending on the use case:
|
|
333
|
+
|
|
334
|
+
```typescript
|
|
335
|
+
class UserDto {
|
|
336
|
+
@IsString({ groups: ['create'] })
|
|
337
|
+
name!: string;
|
|
338
|
+
|
|
339
|
+
@IsEmail({ groups: ['create', 'update'] })
|
|
340
|
+
email!: string;
|
|
341
|
+
}
|
|
342
|
+
|
|
343
|
+
// Only validate rules in the 'create' group
|
|
344
|
+
const user = await deserialize(UserDto, body, { groups: ['create'] });
|
|
345
|
+
```
|
|
346
|
+
|
|
347
|
+
---
|
|
348
|
+
|
|
349
|
+
## 🪆 Nested Objects
|
|
350
|
+
|
|
351
|
+
```typescript
|
|
352
|
+
import { ValidateNested, Type } from '@zipbul/baker/decorators';
|
|
353
|
+
|
|
354
|
+
class AddressDto {
|
|
355
|
+
@IsString()
|
|
356
|
+
city!: string;
|
|
357
|
+
}
|
|
358
|
+
|
|
359
|
+
class UserDto {
|
|
360
|
+
@ValidateNested()
|
|
361
|
+
@Type(() => AddressDto)
|
|
362
|
+
address!: AddressDto;
|
|
363
|
+
}
|
|
364
|
+
```
|
|
365
|
+
|
|
366
|
+
---
|
|
367
|
+
|
|
368
|
+
## 🧩 Custom Rules
|
|
369
|
+
|
|
370
|
+
Create user-defined validation rules with codegen support:
|
|
371
|
+
|
|
372
|
+
```typescript
|
|
373
|
+
import { createRule } from '@zipbul/baker';
|
|
374
|
+
|
|
375
|
+
const isPositiveInt = createRule({
|
|
376
|
+
name: 'isPositiveInt',
|
|
377
|
+
validate: (value) => Number.isInteger(value) && (value as number) > 0,
|
|
378
|
+
emit: (varName, ctx) =>
|
|
379
|
+
`if (!Number.isInteger(${varName}) || ${varName} <= 0) ${ctx.fail('isPositiveInt')};`,
|
|
380
|
+
});
|
|
381
|
+
```
|
|
382
|
+
|
|
383
|
+
---
|
|
384
|
+
|
|
385
|
+
## ⚙️ Seal Options
|
|
386
|
+
|
|
387
|
+
```typescript
|
|
388
|
+
seal({
|
|
389
|
+
enableImplicitConversion: false, // Auto-convert types based on decorators
|
|
390
|
+
enableCircularCheck: 'auto', // Detect circular references ('auto' | true | false)
|
|
391
|
+
exposeDefaultValues: false, // Use class defaults for missing keys
|
|
392
|
+
stopAtFirstError: false, // Stop at first error or collect all
|
|
393
|
+
debug: false, // Store generated source for inspection
|
|
394
|
+
});
|
|
395
|
+
```
|
|
396
|
+
|
|
397
|
+
---
|
|
398
|
+
|
|
399
|
+
## 🔧 AOT Mode
|
|
400
|
+
|
|
401
|
+
With the **zipbul CLI**, you can generate validation code at build time — eliminating the runtime `seal()` cost entirely.
|
|
402
|
+
|
|
403
|
+
In AOT mode, use the `/aot` import (no-op stub decorators):
|
|
404
|
+
|
|
405
|
+
```typescript
|
|
406
|
+
import { IsString } from '@zipbul/baker/aot';
|
|
407
|
+
```
|
|
408
|
+
|
|
409
|
+
The CLI replaces these stubs with pre-generated validation code during the build step.
|
|
410
|
+
|
|
411
|
+
---
|
|
412
|
+
|
|
413
|
+
## 📂 Subpath Exports
|
|
414
|
+
|
|
415
|
+
| Import path | Purpose |
|
|
416
|
+
|---|---|
|
|
417
|
+
| `@zipbul/baker` | Main API: `seal`, `deserialize`, `serialize`, all decorators |
|
|
418
|
+
| `@zipbul/baker/decorators` | Decorators only |
|
|
419
|
+
| `@zipbul/baker/aot` | No-op stub decorators for AOT mode |
|
|
420
|
+
| `@zipbul/baker/rules` | Raw rule objects |
|
|
421
|
+
| `@zipbul/baker/symbols` | Internal symbols |
|
|
422
|
+
|
|
423
|
+
---
|
|
424
|
+
|
|
425
|
+
## 🔍 How It Works
|
|
426
|
+
|
|
427
|
+
```
|
|
428
|
+
┌─────────────┐ ┌──────────────┐ ┌─────────────────────┐
|
|
429
|
+
│ Decorators │ ──▶ │ seal() │ ──▶ │ new Function() code │
|
|
430
|
+
│ (metadata) │ │ at startup │ │ (inline codegen) │
|
|
431
|
+
└─────────────┘ └──────────────┘ └──────────┬──────────┘
|
|
432
|
+
│
|
|
433
|
+
┌──────────▼──────────┐
|
|
434
|
+
│ deserialize() / │
|
|
435
|
+
│ serialize() │
|
|
436
|
+
│ (execute generated) │
|
|
437
|
+
└─────────────────────┘
|
|
438
|
+
```
|
|
439
|
+
|
|
440
|
+
1. **Decorators** attach validation metadata to class properties at definition time
|
|
441
|
+
2. **`seal()`** reads all metadata, analyzes circular references, and generates inline JavaScript functions via `new Function()`
|
|
442
|
+
3. **`deserialize()` / `serialize()`** execute the generated function — no interpretation loops, just straight-line optimized code
|
|
443
|
+
|
|
444
|
+
---
|
|
445
|
+
|
|
446
|
+
## 📄 License
|
|
447
|
+
|
|
448
|
+
[MIT](./LICENSE) © [Junhyung Park](https://github.com/parkrevil)
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
// @bun
|
|
2
|
+
function vz(z){let Q=(Z)=>Z===z;return Q.emit=(Z,$)=>{let K=$.addRef(z);return`if (${Z} !== _refs[${K}]) ${$.fail("equals")};`},Q.ruleName="equals",Q}function ez(z){let Q=(Z)=>Z!==z;return Q.emit=(Z,$)=>{let K=$.addRef(z);return`if (${Z} === _refs[${K}]) ${$.fail("notEquals")};`},Q.ruleName="notEquals",Q}var O=(z)=>z===void 0||z===null||z==="";O.emit=(z,Q)=>`if (${z} !== undefined && ${z} !== null && ${z} !== '') ${Q.fail("isEmpty")};`;O.ruleName="isEmpty";var az=O,g=(z)=>z!==void 0&&z!==null&&z!=="";g.emit=(z,Q)=>`if (${z} === undefined || ${z} === null || ${z} === '') ${Q.fail("isNotEmpty")};`;g.ruleName="isNotEmpty";var zQ=g;function QQ(z){let Q=(Z)=>z.indexOf(Z)!==-1;return Q.emit=(Z,$)=>{return`if (_refs[${$.addRef(z)}].indexOf(${Z}) === -1) ${$.fail("isIn")};`},Q.ruleName="isIn",Q}function ZQ(z){let Q=(Z)=>z.indexOf(Z)===-1;return Q.emit=(Z,$)=>{return`if (_refs[${$.addRef(z)}].indexOf(${Z}) !== -1) ${$.fail("isNotIn")};`},Q.ruleName="isNotIn",Q}var T=(z)=>typeof z==="string";T.emit=(z,Q)=>`if (typeof ${z} !== 'string') ${Q.fail("isString")};`;T.ruleName="isString";var KQ=T;function jQ(z){let Q=z?.allowNaN??!1,Z=z?.allowInfinity??!1,$=z?.maxDecimalPlaces,K=(j)=>{if(typeof j!=="number")return!1;if(isNaN(j))return Q;if(!isFinite(j))return Z;if($!==void 0){let J=j.toString(),W=J.indexOf(".");if(W!==-1&&J.length-W-1>$)return!1}return!0};return K.emit=(j,J)=>{let W=`if (typeof ${j} !== 'number') ${J.fail("isNumber")};`;if(!Q)W+=`
|
|
3
|
+
else if (isNaN(${j})) ${J.fail("isNumber")};`;if(!Z)W+=`
|
|
4
|
+
else if (${j} === Infinity || ${j} === -Infinity) ${J.fail("isNumber")};`;if($!==void 0)W+=`
|
|
5
|
+
else { var _s=${j}.toString(); var _d=_s.indexOf('.'); if(_d!==-1&&_s.length-_d-1>${$}) ${J.fail("isNumber")}; }`;return W},K.ruleName="isNumber",K}var L=(z)=>typeof z==="boolean";L.emit=(z,Q)=>`if (typeof ${z} !== 'boolean') ${Q.fail("isBoolean")};`;L.ruleName="isBoolean";var JQ=L,A=(z)=>z instanceof Date&&!isNaN(z.getTime());A.emit=(z,Q)=>`if (!(${z} instanceof Date) || isNaN(${z}.getTime())) ${Q.fail("isDate")};`;A.ruleName="isDate";var qQ=A;function wQ(z){let Q=Object.values(z),Z=($)=>Q.indexOf($)!==-1;return Z.emit=($,K)=>{return`if (_refs[${K.addRef(Q)}].indexOf(${$}) === -1) ${K.fail("isEnum")};`},Z.ruleName="isEnum",Z}var I=(z)=>typeof z==="number"&&Number.isInteger(z);I.emit=(z,Q)=>`if (typeof ${z} !== 'number' || !Number.isInteger(${z})) ${Q.fail("isInt")};`;I.ruleName="isInt";var WQ=I,d=(z)=>Array.isArray(z);d.emit=(z,Q)=>`if (!Array.isArray(${z})) ${Q.fail("isArray")};`;d.ruleName="isArray";var bQ=d,S=(z)=>typeof z==="object"&&z!==null&&!Array.isArray(z);S.emit=(z,Q)=>`if (typeof ${z} !== 'object' || ${z} === null || Array.isArray(${z})) ${Q.fail("isObject")};`;S.ruleName="isObject";var YQ=S;function GQ(z){let Q=(Z)=>Z>=z;return Q.emit=(Z,$)=>`if (${Z} < ${z}) ${$.fail("min")};`,Q.ruleName="min",Q.requiresType="number",Q}function FQ(z){let Q=(Z)=>Z<=z;return Q.emit=(Z,$)=>`if (${Z} > ${z}) ${$.fail("max")};`,Q.ruleName="max",Q.requiresType="number",Q}var Y=(z)=>z>0;Y.emit=(z,Q)=>`if (${z} <= 0) ${Q.fail("isPositive")};`;Y.ruleName="isPositive";Y.requiresType="number";var MQ=Y,V=(z)=>z<0;V.emit=(z,Q)=>`if (${z} >= 0) ${Q.fail("isNegative")};`;V.ruleName="isNegative";V.requiresType="number";var XQ=V;function UQ(z){let Q=(Z)=>Z%z===0;return Q.emit=(Z,$)=>`if (${Z} % ${z} !== 0) ${$.fail("isDivisibleBy")};`,Q.ruleName="isDivisibleBy",Q.requiresType="number",Q}function HQ(z){let Q=z.getTime(),Z=($)=>$ instanceof Date&&$.getTime()>=Q;return Z.emit=($,K)=>{let j=K.addRef(Q);return`if (!(${$} instanceof Date) || ${$}.getTime() < _refs[${j}]) ${K.fail("minDate")};`},Z.ruleName="minDate",Z}function BQ(z){let Q=z.getTime(),Z=($)=>$ instanceof Date&&$.getTime()<=Q;return Z.emit=($,K)=>{let j=K.addRef(Q);return`if (!(${$} instanceof Date) || ${$}.getTime() > _refs[${j}]) ${K.fail("maxDate")};`},Z.ruleName="maxDate",Z}function q(z,Q,Z,$="string"){let K=(j)=>{if(typeof j!=="string")return!1;return Q(j)};if(K.emit=Z,K.ruleName=z,$!==void 0)K.requiresType=$;return K}function PQ(z){let Q=(Z)=>typeof Z==="string"&&Z.length>=z;return Q.emit=(Z,$)=>`if (${Z}.length < ${z}) ${$.fail("minLength")};`,Q.ruleName="minLength",Q.requiresType="string",Q}function kQ(z){let Q=(Z)=>typeof Z==="string"&&Z.length<=z;return Q.emit=(Z,$)=>`if (${Z}.length > ${z}) ${$.fail("maxLength")};`,Q.ruleName="maxLength",Q.requiresType="string",Q}function yQ(z,Q){let Z=($)=>typeof $==="string"&&$.length>=z&&$.length<=Q;return Z.emit=($,K)=>`if (${$}.length < ${z} || ${$}.length > ${Q}) ${K.fail("length")};`,Z.ruleName="length",Z.requiresType="string",Z}function CQ(z){let Q=(Z)=>typeof Z==="string"&&Z.includes(z);return Q.emit=(Z,$)=>{let K=$.addRef(z);return`if (${Z}.indexOf(_refs[${K}]) === -1) ${$.fail("contains")};`},Q.ruleName="contains",Q.requiresType="string",Q}function OQ(z){let Q=(Z)=>typeof Z==="string"&&!Z.includes(z);return Q.emit=(Z,$)=>{let K=$.addRef(z);return`if (${Z}.indexOf(_refs[${K}]) !== -1) ${$.fail("notContains")};`},Q.ruleName="notContains",Q.requiresType="string",Q}function gQ(z,Q){let Z=z instanceof RegExp?z:new RegExp(z,Q),$=(K)=>typeof K==="string"&&Z.test(K);return $.emit=(K,j)=>{return`if (!_re[${j.addRegex(Z)}].test(${K})) ${j.fail("matches")};`},$.ruleName="matches",$.requiresType="string",$}var U=(z)=>typeof z==="string"&&z===z.toLowerCase();U.emit=(z,Q)=>`if (${z} !== ${z}.toLowerCase()) ${Q.fail("isLowercase")};`;U.ruleName="isLowercase";U.requiresType="string";var TQ=U,h=(z)=>typeof z==="string"&&z===z.toUpperCase();h.emit=(z,Q)=>`if (${z} !== ${z}.toUpperCase()) ${Q.fail("isUppercase")};`;h.ruleName="isUppercase";h.requiresType="string";var LQ=h,_=/^[\x00-\x7F]*$/,AQ=q("isAscii",(z)=>_.test(z),(z,Q)=>{return`if (!_re[${Q.addRegex(_)}].test(${z})) ${Q.fail("isAscii")};`}),Oz=/^[a-zA-Z]+$/;function dz(z){return typeof z==="string"&&z.length>0&&Oz.test(z)}var H=function z(Q){if(Q===void 0)return z;return dz(Q)};H.emit=(z,Q)=>{return`if (!_re[${Q.addRegex(Oz)}].test(${z})) ${Q.fail("isAlpha")};`};H.ruleName="isAlpha";H.requiresType="string";var IQ=H,gz=/^[a-zA-Z0-9]+$/;function Sz(z){return typeof z==="string"&&z.length>0&&gz.test(z)}var B=function z(Q){if(Q===void 0)return z;return Sz(Q)};B.emit=(z,Q)=>{return`if (!_re[${Q.addRegex(gz)}].test(${z})) ${Q.fail("isAlphanumeric")};`};B.ruleName="isAlphanumeric";B.requiresType="string";var dQ=B,D=(z)=>z==="true"||z==="false"||z==="1"||z==="0";D.emit=(z,Q)=>`if (${z} !== 'true' && ${z} !== 'false' && ${z} !== '1' && ${z} !== '0') ${Q.fail("isBooleanString")};`;D.ruleName="isBooleanString";D.requiresType="string";var SQ=D;function pQ(z){return q("isNumberString",(Q)=>{if(Q.length===0)return!1;let Z=Number(Q);return!isNaN(Z)&&isFinite(Z)},(Q,Z)=>{let $=(j)=>{if(j.length===0)return!1;let J=Number(j);return!isNaN(J)&&isFinite(J)};return`if (!_refs[${Z.addRef($)}](${Q})) ${Z.fail("isNumberString")};`})}function fQ(z){let Q=/^[-+]?(?:\d+(?:\.\d*)?|\.\d+)$/;return q("isDecimal",(Z)=>Q.test(Z),(Z,$)=>{return`if (!_re[${$.addRegex(Q)}].test(${Z})) ${$.fail("isDecimal")};`})}var M=/[^\u0020-\u007E\uFF61-\uFF9F]/,oQ=q("isFullWidth",(z)=>z.length>0&&M.test(z),(z,Q)=>{let Z=Q.addRegex(M);return`if (${z}.length === 0 || !_re[${Z}].test(${z})) ${Q.fail("isFullWidth")};`}),X=/[\u0020-\u007E\uFF61-\uFF9F]/,RQ=q("isHalfWidth",(z)=>z.length>0&&X.test(z),(z,Q)=>{let Z=Q.addRegex(X);return`if (${z}.length === 0 || !_re[${Z}].test(${z})) ${Q.fail("isHalfWidth")};`}),EQ=q("isVariableWidth",(z)=>M.test(z)&&X.test(z),(z,Q)=>{let Z=Q.addRegex(M),$=Q.addRegex(X);return`if (!_re[${Z}].test(${z}) || !_re[${$}].test(${z})) ${Q.fail("isVariableWidth")};`}),s=/[^\x00-\xFF]/,_Q=q("isMultibyte",(z)=>z.length>0&&s.test(z),(z,Q)=>{let Z=Q.addRegex(s);return`if (${z}.length === 0 || !_re[${Z}].test(${z})) ${Q.fail("isMultibyte")};`}),N=/[\uD800-\uDBFF][\uDC00-\uDFFF]/,sQ=q("isSurrogatePair",(z)=>z.length>0&&N.test(z),(z,Q)=>{let Z=Q.addRegex(N);return`if (${z}.length === 0 || !_re[${Z}].test(${z})) ${Q.fail("isSurrogatePair")};`}),i=/^[0-9a-fA-F]+$/,NQ=q("isHexadecimal",(z)=>i.test(z),(z,Q)=>{return`if (!_re[${Q.addRegex(i)}].test(${z})) ${Q.fail("isHexadecimal")};`}),n=/^(0[oO])?[0-7]+$/,iQ=q("isOctal",(z)=>z.length>0&&n.test(z),(z,Q)=>{let Z=Q.addRegex(n);return`if (${z}.length === 0 || !_re[${Z}].test(${z})) ${Q.fail("isOctal")};`}),u=/^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*\.[a-zA-Z]{2,}$/;function nQ(z){return q("isEmail",(Q)=>u.test(Q),(Q,Z)=>{return`if (!_re[${Z.addRegex(u)}].test(${Q})) ${Z.fail("isEmail")};`})}var pz=["http","https","ftp"];function uQ(z){let Z=(z?.protocols??pz).map((j)=>j.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")).join("|"),$=new RegExp(`^(?:${Z}):\\/\\/(?:[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*)(?::\\d{1,5})?(?:\\/[^\\s]*)?$`),K=(j)=>{if(typeof j!=="string"||j.length===0)return!1;return $.test(j)};return K.emit=(j,J)=>{return`if (!_re[${J.addRegex($)}].test(${j})) ${J.fail("isURL")};`},K.ruleName="isURL",K.requiresType="string",K}var p={all:/^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$/,1:/^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-1[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}$/,2:/^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-2[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}$/,3:/^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-3[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}$/,4:/^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}$/,5:/^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-5[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}$/};function xQ(z){let Q=z!=null?p[z]??p.all:p.all;return q("isUUID",(Z)=>Q.test(Z),(Z,$)=>{return`if (!_re[${$.addRegex(Q)}].test(${Z})) ${$.fail("isUUID")};`})}var G=/^(25[0-5]|2[0-4]\d|1\d{2}|[1-9]\d|\d)\.(25[0-5]|2[0-4]\d|1\d{2}|[1-9]\d|\d)\.(25[0-5]|2[0-4]\d|1\d{2}|[1-9]\d|\d)\.(25[0-5]|2[0-4]\d|1\d{2}|[1-9]\d|\d)$/,F=/^(?:[0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}$|^::(?:[0-9a-fA-F]{1,4}:){0,6}[0-9a-fA-F]{1,4}$|^(?:[0-9a-fA-F]{1,4}:){1,7}:$|^(?:[0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}$|^(?:[0-9a-fA-F]{1,4}:){1,5}(?::[0-9a-fA-F]{1,4}){1,2}$|^(?:[0-9a-fA-F]{1,4}:){1,4}(?::[0-9a-fA-F]{1,4}){1,3}$|^(?:[0-9a-fA-F]{1,4}:){1,3}(?::[0-9a-fA-F]{1,4}){1,4}$|^(?:[0-9a-fA-F]{1,4}:){1,2}(?::[0-9a-fA-F]{1,4}){1,5}$|^[0-9a-fA-F]{1,4}:(?::[0-9a-fA-F]{1,4}){1,6}$|^::$|^::1$|^::(?:ffff(?::0{1,4})?:)?(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.(?:25[0-5]|2[0-4]\d|[01]?\d\d?)$|^(?:[0-9a-fA-F]{1,4}:){1,4}:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.(?:25[0-5]|2[0-4]\d|[01]?\d\d?)$/;function mQ(z){let Q=(Z)=>{if(typeof Z!=="string")return!1;if(z===4)return G.test(Z);if(z===6)return F.test(Z);return G.test(Z)||F.test(Z)};return Q.emit=(Z,$)=>{if(z===4)return`if (!_re[${$.addRegex(G)}].test(${Z})) ${$.fail("isIP")};`;if(z===6)return`if (!_re[${$.addRegex(F)}].test(${Z})) ${$.fail("isIP")};`;let K=$.addRegex(G),j=$.addRegex(F);return`if (!_re[${K}].test(${Z}) && !_re[${j}].test(${Z})) ${$.fail("isIP")};`},Q.ruleName="isIP",Q.requiresType="string",Q}var x=/^#([0-9a-fA-F]{3}|[0-9a-fA-F]{4}|[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$/,lQ=q("isHexColor",(z)=>x.test(z),(z,Q)=>{return`if (!_re[${Q.addRegex(x)}].test(${z})) ${Q.fail("isHexColor")};`}),m=/^rgb\(\s*(25[0-5]|2[0-4]\d|1\d{2}|[1-9]\d|\d)\s*,\s*(25[0-5]|2[0-4]\d|1\d{2}|[1-9]\d|\d)\s*,\s*(25[0-5]|2[0-4]\d|1\d{2}|[1-9]\d|\d)\s*\)$/,l=/^rgba\(\s*(25[0-5]|2[0-4]\d|1\d{2}|[1-9]\d|\d)\s*,\s*(25[0-5]|2[0-4]\d|1\d{2}|[1-9]\d|\d)\s*,\s*(25[0-5]|2[0-4]\d|1\d{2}|[1-9]\d|\d)\s*,\s*(0|0?\.\d+|1(\.0+)?)\s*\)$/,c=/^rgba?\(\s*(\d{1,2}|100)%\s*,\s*(\d{1,2}|100)%\s*,\s*(\d{1,2}|100)%(?:\s*,\s*(0|0?\.\d+|1(?:\.0+)?))?\s*\)$/;function cQ(z=!1){let Q=(Z)=>{if(typeof Z!=="string")return!1;if(z)return c.test(Z);return m.test(Z)||l.test(Z)};return Q.emit=(Z,$)=>{if(z)return`if (!_re[${$.addRegex(c)}].test(${Z})) ${$.fail("isRgbColor")};`;let K=$.addRegex(m),j=$.addRegex(l);return`if (!_re[${K}].test(${Z}) && !_re[${j}].test(${Z})) ${$.fail("isRgbColor")};`},Q.ruleName="isRgbColor",Q.requiresType="string",Q}var r=/^hsla?\(\s*(360|3[0-5]\d|[12]\d{2}|[1-9]\d|\d)\s*,\s*(100|[1-9]\d|\d)%\s*,\s*(100|[1-9]\d|\d)%(?:\s*,\s*(0|0?\.\d+|1(?:\.0+)?))?\s*\)$/,rQ=q("isHSL",(z)=>r.test(z),(z,Q)=>{return`if (!_re[${Q.addRegex(r)}].test(${z})) ${Q.fail("isHSL")};`}),t=/^[0-9a-fA-F]{2}(?::[0-9a-fA-F]{2}){5}$/,v=/^[0-9a-fA-F]{2}(?:-[0-9a-fA-F]{2}){5}$/,e=/^[0-9a-fA-F]{12}$/;function tQ(z){let Q=(Z)=>{if(typeof Z!=="string")return!1;if(z?.no_separators)return e.test(Z);return t.test(Z)||v.test(Z)};return Q.emit=(Z,$)=>{if(z?.no_separators)return`if (!_re[${$.addRegex(e)}].test(${Z})) ${$.fail("isMACAddress")};`;let K=$.addRegex(t),j=$.addRegex(v);return`if (!_re[${K}].test(${Z}) && !_re[${j}].test(${Z})) ${$.fail("isMACAddress")};`},Q.ruleName="isMACAddress",Q.requiresType="string",Q}function a(z){let Q=z.replace(/[-\s]/g,"");if(!/^\d{9}[\dX]$/.test(Q))return!1;let Z=0;for(let K=0;K<9;K++)Z+=(10-K)*(Q.charCodeAt(K)-48);let $=Q[9]==="X"?10:Q.charCodeAt(9)-48;return Z+=$,Z%11===0}function zz(z){let Q=z.replace(/[-\s]/g,"");if(!/^\d{13}$/.test(Q))return!1;let Z=0;for(let K=0;K<12;K++)Z+=(Q.charCodeAt(K)-48)*(K%2===0?1:3);return(10-Z%10)%10===Q.charCodeAt(12)-48}function vQ(z){let Q=(Z)=>{if(typeof Z!=="string")return!1;if(z===10)return a(Z);if(z===13)return zz(Z);return a(Z)||zz(Z)};return Q.emit=(Z,$)=>{return`if (!_refs[${$.addRef(Q)}](${Z})) ${$.fail("isISBN")};`},Q.ruleName="isISBN",Q.requiresType="string",Q}var fz=/^[A-Z]{2}[A-Z0-9]{9}[0-9]$/;function Qz(z){if(!fz.test(z))return!1;let Q=z.split("").map((K)=>{let j=K.charCodeAt(0);return j>=65?String(j-55):K}).join(""),Z=0,$=!1;for(let K=Q.length-1;K>=0;K--){let j=parseInt(Q[K],10);if($){if(j*=2,j>9)j-=9}Z+=j,$=!$}return Z%10===0}var eQ=q("isISIN",Qz,(z,Q)=>{return`if (!_refs[${Q.addRef(Qz)}](${z})) ${Q.fail("isISIN")};`}),f=/^\d{4}(?:-\d{2}(?:-\d{2}(?:T\d{2}:\d{2}:\d{2}(?:\.\d+)?(?:Z|[+-]\d{2}:?\d{2})?)?)?)?$/;function oz(z){if(!f.test(z))return!1;let Q=z.match(/^(\d{4})-(\d{2})-(\d{2})/);if(!Q)return!0;let Z=Number(Q[2]),$=Number(Q[3]);if(Z<1||Z>12)return!1;let K=new Date(Number(Q[1]),Z,0).getDate();return $>=1&&$<=K}function aQ(z){if(z?.strict){let Q=(Z)=>{if(typeof Z!=="string")return!1;return oz(Z)};return Q.ruleName="isISO8601",Q.emit=(Z,$)=>{return`if (!_refs[${$.addRef(Q)}](${Z})) ${$.fail("isISO8601")};`},Q}return q("isISO8601",(Q)=>f.test(Q),(Q,Z)=>{return`if (!_re[${Z.addRegex(f)}].test(${Q})) ${Z.fail("isISO8601")};`})}var Zz=/^[A-Z]{2}-[A-Z0-9]{3}-\d{2}-\d{5}$|^[A-Z]{2}[A-Z0-9]{3}\d{7}$/,zZ=q("isISRC",(z)=>Zz.test(z),(z,Q)=>{return`if (!_re[${Q.addRegex(Zz)}].test(${z})) ${Q.fail("isISRC")};`});function Rz(z,Q){let Z=Q?.requireHyphen!==!1,$=Z?z:z.replace(/-/g,"");if(!(Z?/^\d{4}-\d{3}[\dX]$/:/^\d{7}[\dX]$/).test($))return!1;let j=$.replace(/-/g,""),J=0;for(let w=0;w<7;w++)J+=(8-w)*(j.charCodeAt(w)-48);let W=j[7]==="X"?10:j.charCodeAt(7)-48;return J+=W,J%11===0}function QZ(z){let Q=(Z)=>{if(typeof Z!=="string")return!1;return Rz(Z,z)};return Q.emit=(Z,$)=>{return`if (!_refs[${$.addRef(Q)}](${Z})) ${$.fail("isISSN")};`},Q.ruleName="isISSN",Q.requiresType="string",Q}var $z=/^[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+$/,ZZ=q("isJWT",(z)=>$z.test(z),(z,Q)=>{return`if (!_re[${Q.addRegex($z)}].test(${z})) ${Q.fail("isJWT")};`}),Kz=/^[-+]?([1-8]?\d(?:\.\d+)?|90(?:\.0+)?),\s*[-+]?(180(?:\.0+)?|1[0-7]\d(?:\.\d+)?|\d{1,2}(?:\.\d+)?)$/;function $Z(z){return q("isLatLong",(Q)=>Kz.test(Q),(Q,Z)=>{return`if (!_re[${Z.addRegex(Kz)}].test(${Q})) ${Z.fail("isLatLong")};`})}var jz=/^[a-zA-Z]{2,3}(?:-[a-zA-Z]{4})?(?:-(?:[a-zA-Z]{2}|\d{3}))?(?:-[a-zA-Z\d]{5,8})*$/,KZ=q("isLocale",(z)=>jz.test(z),(z,Q)=>{return`if (!_re[${Q.addRegex(jz)}].test(${z})) ${Q.fail("isLocale")};`}),Jz=/^data:([a-zA-Z0-9!#$&\-^_]+\/[a-zA-Z0-9!#$&\-^_]+)(?:;[a-zA-Z0-9\-]+=[a-zA-Z0-9\-]+)*(?:;base64)?,[\s\S]*$/,jZ=q("isDataURI",(z)=>Jz.test(z),(z,Q)=>{return`if (!_re[${Q.addRegex(Jz)}].test(${z})) ${Q.fail("isDataURI")};`});function JZ(z){let Q=z?.require_tld!==!1,Z=($)=>{if(typeof $!=="string")return!1;let K=$;if(z?.allow_trailing_dot&&K.endsWith("."))K=K.slice(0,-1);if(K.length===0)return!1;let j=K.split(".");if(Q&&j.length<2)return!1;if(Q){let J=j[j.length-1];if(!J||J.length<2||!/^[a-zA-Z]{2,}$/.test(J))return!1}return j.every((J)=>{if(J.length===0||J.length>63)return!1;if(z?.allow_underscores)return/^[a-zA-Z0-9_-]+$/.test(J);return/^[a-zA-Z0-9-]+$/.test(J)&&!J.startsWith("-")&&!J.endsWith("-")})};return Z.emit=($,K)=>{return`if (!_refs[${K.addRef(Z)}](${$})) ${K.fail("isFQDN")};`},Z.ruleName="isFQDN",Z.requiresType="string",Z}var qz=/^(?:6553[0-5]|655[0-2]\d|65[0-4]\d{2}|6[0-4]\d{3}|[1-5]\d{4}|[1-9]\d{1,3}|\d)$/,qZ=q("isPort",(z)=>qz.test(z),(z,Q)=>{return`if (!_re[${Q.addRegex(qz)}].test(${z})) ${Q.fail("isPort")};`});function wz(z){if(!/^\d{8}$/.test(z)&&!/^\d{13}$/.test(z))return!1;let Q=z.split("").map(Number),Z=Q.length,$=0;for(let j=0;j<Z-1;j++)$+=Q[j]*(Z===8?j%2===0?3:1:j%2===0?1:3);return(10-$%10)%10===Q[Z-1]}var wZ=q("isEAN",wz,(z,Q)=>{return`if (!_refs[${Q.addRef(wz)}](${z})) ${Q.fail("isEAN")};`}),Tz=new Set(["AD","AE","AF","AG","AI","AL","AM","AO","AQ","AR","AS","AT","AU","AW","AX","AZ","BA","BB","BD","BE","BF","BG","BH","BI","BJ","BL","BM","BN","BO","BQ","BR","BS","BT","BV","BW","BY","BZ","CA","CC","CD","CF","CG","CH","CI","CK","CL","CM","CN","CO","CR","CU","CV","CW","CX","CY","CZ","DE","DJ","DK","DM","DO","DZ","EC","EE","EG","EH","ER","ES","ET","FI","FJ","FK","FM","FO","FR","GA","GB","GD","GE","GF","GG","GH","GI","GL","GM","GN","GP","GQ","GR","GS","GT","GU","GW","GY","HK","HM","HN","HR","HT","HU","ID","IE","IL","IM","IN","IO","IQ","IR","IS","IT","JE","JM","JO","JP","KE","KG","KH","KI","KM","KN","KP","KR","KW","KY","KZ","LA","LB","LC","LI","LK","LR","LS","LT","LU","LV","LY","MA","MC","MD","ME","MF","MG","MH","MK","ML","MM","MN","MO","MP","MQ","MR","MS","MT","MU","MV","MW","MX","MY","MZ","NA","NC","NE","NF","NG","NI","NL","NO","NP","NR","NU","NZ","OM","PA","PE","PF","PG","PH","PK","PL","PM","PN","PR","PS","PT","PW","PY","QA","RE","RO","RS","RU","RW","SA","SB","SC","SD","SE","SG","SH","SI","SJ","SK","SL","SM","SN","SO","SR","SS","ST","SV","SX","SY","SZ","TC","TD","TF","TG","TH","TJ","TK","TL","TM","TN","TO","TR","TT","TV","TW","TZ","UA","UG","UM","US","UY","UZ","VA","VC","VE","VG","VI","VN","VU","WF","WS","YE","YT","ZA","ZM","ZW"]),P=(z)=>{if(typeof z!=="string")return!1;return Tz.has(z.toUpperCase())};P.emit=(z,Q)=>{return`if (!_refs[${Q.addRef(Tz)}].has(${z}.toUpperCase())) ${Q.fail("isISO31661Alpha2")};`};P.ruleName="isISO31661Alpha2";P.requiresType="string";var WZ=P,Lz=new Set(["ABW","AFG","AGO","AIA","ALA","ALB","AND","ANT","ARE","ARG","ARM","ASM","ATA","ATF","ATG","AUS","AUT","AZE","BDI","BEL","BEN","BES","BFA","BGD","BGR","BHR","BHS","BIH","BLM","BLR","BLZ","BMU","BOL","BRA","BRB","BRN","BTN","BVT","BWA","CAF","CAN","CCK","CHE","CHL","CHN","CIV","CMR","COD","COG","COK","COL","COM","CPV","CRI","CUB","CUW","CXR","CYM","CYP","CZE","DEU","DJI","DMA","DNK","DOM","DZA","ECU","EGY","ERI","ESH","ESP","EST","ETH","FIN","FJI","FLK","FRA","FRO","FSM","GAB","GBR","GEO","GGY","GHA","GIB","GIN","GLP","GMB","GNB","GNQ","GRC","GRD","GRL","GTM","GUF","GUM","GUY","HKG","HMD","HND","HRV","HTI","HUN","IDN","IMN","IND","IOT","IRL","IRN","IRQ","ISL","ISR","ITA","JAM","JEY","JOR","JPN","KAZ","KEN","KGZ","KHM","KIR","KNA","KOR","KWT","LAO","LBN","LBR","LBY","LCA","LIE","LKA","LSO","LTU","LUX","LVA","MAC","MAF","MAR","MCO","MDA","MDG","MDV","MEX","MHL","MKD","MLI","MLT","MMR","MNE","MNG","MNP","MOZ","MRT","MSR","MTQ","MUS","MWI","MYS","MYT","NAM","NCL","NER","NFK","NGA","NIC","NIU","NLD","NOR","NPL","NRU","NZL","OMN","PAK","PAN","PCN","PER","PHL","PLW","PNG","POL","PRI","PRK","PRT","PRY","PSE","PYF","QAT","REU","ROU","RUS","RWA","SAU","SDN","SEN","SGP","SGS","SHN","SJM","SLB","SLE","SLV","SMR","SOM","SPM","SRB","SSD","STP","SUR","SVK","SVN","SWE","SWZ","SXM","SYC","SYR","TCA","TCD","TGO","THA","TJK","TKL","TKM","TLS","TON","TTO","TUN","TUR","TUV","TWN","TZA","UGA","UKR","UMI","URY","USA","UZB","VAT","VCT","VEN","VGB","VIR","VNM","VUT","WLF","WSM","YEM","ZAF","ZMB","ZWE"]),k=(z)=>{if(typeof z!=="string")return!1;return Lz.has(z.toUpperCase())};k.emit=(z,Q)=>{return`if (!_refs[${Q.addRef(Lz)}].has(${z}.toUpperCase())) ${Q.fail("isISO31661Alpha3")};`};k.ruleName="isISO31661Alpha3";k.requiresType="string";var bZ=k,Wz=/^[A-Z]{6}[A-Z0-9]{2}(?:[A-Z0-9]{3})?$/,YZ=q("isBIC",(z)=>Wz.test(z.toUpperCase()),(z,Q)=>{return`if (!_re[${Q.addRegex(Wz)}].test(${z}.toUpperCase())) ${Q.fail("isBIC")};`}),bz=/^[a-zA-Z0-9_-]{20}$/,VZ=q("isFirebasePushId",(z)=>bz.test(z),(z,Q)=>{return`if (!_re[${Q.addRegex(bz)}].test(${z})) ${Q.fail("isFirebasePushId")};`}),Yz=/^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-((?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\.(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\+([0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-]+)*))?$/,GZ=q("isSemVer",(z)=>Yz.test(z),(z,Q)=>{return`if (!_re[${Q.addRegex(Yz)}].test(${z})) ${Q.fail("isSemVer")};`}),Vz=/^[0-9a-fA-F]{24}$/,FZ=q("isMongoId",(z)=>Vz.test(z),(z,Q)=>{return`if (!_re[${Q.addRegex(Vz)}].test(${z})) ${Q.fail("isMongoId")};`}),y=(z)=>{if(typeof z!=="string")return!1;try{return JSON.parse(z),!0}catch{return!1}};y.emit=(z,Q)=>{return`if (!_refs[${Q.addRef(($)=>{try{return JSON.parse($),!0}catch{return!1}})}](${z})) ${Q.fail("isJSON")};`};y.ruleName="isJSON";y.requiresType="string";var MZ=y,Ez=/^[A-Z2-7]+=*$/i;function XZ(z){let Q=Ez;return q("isBase32",(Z)=>{if(Z.length===0)return!1;if(Z.length%8!==0)return!1;return Q.test(Z)},(Z,$)=>{let K=$.addRegex(Q);return`if (${Z}.length === 0 || ${Z}.length % 8 !== 0 || !_re[${K}].test(${Z})) ${$.fail("isBase32")};`})}var Gz=/^[1-9A-HJ-NP-Za-km-z]+$/,UZ=q("isBase58",(z)=>Gz.test(z),(z,Q)=>{return`if (!_re[${Q.addRegex(Gz)}].test(${z})) ${Q.fail("isBase58")};`}),_z=/^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=|[A-Za-z0-9+/]{4})$/,sz=/^[A-Za-z0-9_-]+={0,2}$/;function hZ(z){let Q=z?.urlSafe?sz:_z;return q("isBase64",(Z)=>{if(Z.length===0)return!1;return Q.test(Z)},(Z,$)=>{let K=$.addRegex(Q);return`if (${Z}.length === 0 || !_re[${K}].test(${Z})) ${$.fail("isBase64")};`})}var Fz=/^\d{4}-(?:0[1-9]|1[0-2])-(?:0[1-9]|[12]\d|3[01])$/;function HZ(z){return q("isDateString",(Q)=>Fz.test(Q),(Q,Z)=>{return`if (!_re[${Z.addRegex(Fz)}].test(${Q})) ${Z.fail("isDateString")};`})}var Mz=/^(application|audio|font|image|message|model|multipart|text|video)\/[a-zA-Z0-9][a-zA-Z0-9!#$&\-^_.+]*(?:;.+)?$/,BZ=q("isMimeType",(z)=>Mz.test(z),(z,Q)=>{return`if (!_re[${Q.addRegex(Mz)}].test(${z})) ${Q.fail("isMimeType")};`}),Xz=/^[-+]?(?:[,.\d]+)(?:[.,]\d{2})?$|^\$?-?(?:\d+|\d{1,3}(?:,\d{3})*)(?:\.\d{1,2})?$/;function DZ(z){return q("isCurrency",(Q)=>{if(Q.length===0)return!1;return Xz.test(Q)},(Q,Z)=>{let $=Z.addRegex(Xz);return`if (${Q}.length === 0 || !_re[${$}].test(${Q})) ${Z.fail("isCurrency")};`})}var Uz=/^magnet:\?xt=urn:[a-z0-9]+:[a-z0-9]{32,40}/i,PZ=q("isMagnetURI",(z)=>Uz.test(z),(z,Q)=>{return`if (!_re[${Q.addRegex(Uz)}].test(${z})) ${Q.fail("isMagnetURI")};`});function Nz(z){let Q=z.replace(/[\s-]/g,"");if(Q.length===0||!/^\d+$/.test(Q))return!1;let Z=0,$=!1;for(let K=Q.length-1;K>=0;K--){let j=Q.charCodeAt(K)-48;if($){if(j*=2,j>9)j-=9}Z+=j,$=!$}return Z%10===0}var C=(z)=>{if(typeof z!=="string")return!1;return Nz(z)};C.emit=(z,Q)=>`{
|
|
6
|
+
var _cs=${z}.replace(/[\\s-]/g,'');
|
|
7
|
+
if(_cs.length===0||!/^\\d+$/.test(_cs)){${Q.fail("isCreditCard")}}
|
|
8
|
+
else{var _sum=0,_alt=false;
|
|
9
|
+
for(var _ci=_cs.length-1;_ci>=0;_ci--){var _cn=_cs.charCodeAt(_ci)-48;if(_alt){_cn*=2;if(_cn>9)_cn-=9;}_sum+=_cn;_alt=!_alt;}
|
|
10
|
+
if(_sum%10!==0)${Q.fail("isCreditCard")};}
|
|
11
|
+
}`;C.ruleName="isCreditCard";C.requiresType="string";var kZ=C,iz={AD:24,AE:23,AL:28,AT:20,AZ:28,BA:20,BE:16,BG:22,BH:22,BR:29,CH:21,CR:22,CY:28,CZ:24,DE:22,DK:18,DO:28,EE:20,ES:24,FI:18,FO:18,FR:27,GB:22,GE:22,GI:23,GL:18,GR:27,GT:28,HR:21,HU:28,IE:22,IL:23,IS:26,IT:27,JO:30,KW:30,KZ:20,LB:28,LC:32,LI:21,LT:20,LU:20,LV:21,MC:27,MD:24,ME:22,MK:19,MR:27,MT:31,MU:30,NL:18,NO:15,PK:24,PL:28,PS:29,PT:25,QA:29,RO:24,RS:22,SA:24,SC:31,SE:24,SI:19,SK:24,SM:27,ST:25,SV:28,TL:23,TN:24,TR:26,UA:29,VA:22,VG:24,XK:20};function nz(z,Q){let Z=Q?.allowSpaces?z.replace(/\s/g,""):z;if(Z=Z.toUpperCase(),!/^[A-Z]{2}\d{2}[A-Z0-9]+$/.test(Z))return!1;let $=Z.slice(0,2),K=iz[$];if(K!==void 0&&Z.length!==K)return!1;let J=(Z.slice(4)+Z.slice(0,4)).replace(/[A-Z]/g,(w)=>String(w.charCodeAt(0)-55)),W=0;for(let w=0;w<J.length;w+=7){let b=String(W)+J.slice(w,w+7);W=parseInt(b,10)%97}return W===1}function yZ(z){let Q=(Z)=>{if(typeof Z!=="string")return!1;return nz(Z,z)};return Q.emit=(Z,$)=>{return`if (!_refs[${$.addRef(Q)}](${Z})) ${$.fail("isIBAN")};`},Q.ruleName="isIBAN",Q.requiresType="string",Q}function CZ(z,Q){let Z=($)=>{if(typeof $!=="string")return!1;let K=Buffer.byteLength($,"utf8");if(K<z)return!1;if(Q!==void 0&&K>Q)return!1;return!0};return Z.emit=($,K)=>{let j=(W)=>{let w=Buffer.byteLength(W,"utf8");if(w<z)return!1;if(Q!==void 0&&w>Q)return!1;return!0};return`if (!_refs[${K.addRef(j)}](${$})) ${K.fail("isByteLength")};`},Z.ruleName="isByteLength",Z.requiresType="string",Z}var uz={md5:/^[a-f0-9]{32}$/i,md4:/^[a-f0-9]{32}$/i,md2:/^[a-f0-9]{32}$/i,sha1:/^[a-f0-9]{40}$/i,sha256:/^[a-f0-9]{64}$/i,sha384:/^[a-f0-9]{96}$/i,sha512:/^[a-f0-9]{128}$/i,ripemd128:/^[a-f0-9]{32}$/i,ripemd160:/^[a-f0-9]{40}$/i,"tiger128,3":/^[a-f0-9]{32}$/i,"tiger128,4":/^[a-f0-9]{32}$/i,"tiger160,3":/^[a-f0-9]{40}$/i,"tiger160,4":/^[a-f0-9]{40}$/i,"tiger192,3":/^[a-f0-9]{48}$/i,"tiger192,4":/^[a-f0-9]{48}$/i,crc32:/^[a-f0-9]{8}$/i,crc32b:/^[a-f0-9]{8}$/i};function OZ(z){let Q=uz[z],Z=($)=>{if(typeof $!=="string")return!1;if(!Q)return!1;return Q.test($)};return Z.emit=($,K)=>{if(!Q)return K.fail("isHash")+";";return`if (!_re[${K.addRegex(Q)}].test(${$})) ${K.fail("isHash")};`},Z.ruleName="isHash",Z.requiresType="string",Z}var hz=/^\d{4}-\d{2}-\d{2}[T ]\d{2}:\d{2}:\d{2}(\.\d+)?(Z|[+-]\d{2}:\d{2})$/i,gZ=q("isRFC3339",(z)=>hz.test(z),(z,Q)=>{return`if (!_re[${Q.addRegex(hz)}].test(${z})) ${Q.fail("isRFC3339")};`}),Hz=/^([01]\d|2[0-3]):[0-5]\d$/,TZ=q("isMilitaryTime",(z)=>Hz.test(z),(z,Q)=>{return`if (!_re[${Q.addRegex(Hz)}].test(${z})) ${Q.fail("isMilitaryTime")};`});function Az(z){if(typeof z==="number")return z>=-90&&z<=90;if(typeof z==="string"){let Q=parseFloat(z);if(isNaN(Q))return!1;if(String(Q)!==z&&z!==String(Q)){if(!/^-?\d+(\.\d+)?$/.test(z))return!1}return Q>=-90&&Q<=90}return!1}var o=(z)=>Az(z);o.emit=(z,Q)=>{return`if (!_refs[${Q.addRef(Az)}](${z})) ${Q.fail("isLatitude")};`};o.ruleName="isLatitude";var LZ=o;function Iz(z){if(typeof z==="number")return z>=-180&&z<=180;if(typeof z==="string"){let Q=parseFloat(z);if(isNaN(Q))return!1;if(!/^-?\d+(\.\d+)?$/.test(z))return!1;return Q>=-180&&Q<=180}return!1}var R=(z)=>Iz(z);R.emit=(z,Q)=>{return`if (!_refs[${Q.addRef(Iz)}](${z})) ${Q.fail("isLongitude")};`};R.ruleName="isLongitude";var AZ=R,Bz=/^0x[0-9a-fA-F]{40}$/,IZ=q("isEthereumAddress",(z)=>Bz.test(z),(z,Q)=>{return`if (!_re[${Q.addRegex(Bz)}].test(${z})) ${Q.fail("isEthereumAddress")};`}),Dz=/^1[a-km-zA-HJ-NP-Z1-9]{25,34}$/,Pz=/^3[a-km-zA-HJ-NP-Z1-9]{25,34}$/,kz=/^(bc1)[a-z0-9]{6,87}$/,dZ=q("isBtcAddress",(z)=>Dz.test(z)||Pz.test(z)||kz.test(z),(z,Q)=>{let Z=Q.addRegex(Dz),$=Q.addRegex(Pz),K=Q.addRegex(kz);return`if (!_re[${Z}].test(${z}) && !_re[${$}].test(${z}) && !_re[${K}].test(${z})) ${Q.fail("isBtcAddress")};`}),yz=new Set(["AED","AFN","ALL","AMD","ANG","AOA","ARS","AUD","AWG","AZN","BAM","BBD","BDT","BGN","BHD","BIF","BMD","BND","BOB","BOV","BRL","BSD","BTN","BWP","BYN","BZD","CAD","CDF","CHE","CHF","CHW","CLF","CLP","CNY","COP","COU","CRC","CUC","CUP","CVE","CZK","DJF","DKK","DOP","DZD","EGP","ERN","ETB","EUR","FJD","FKP","GBP","GEL","GHS","GIP","GMD","GNF","GTQ","GYD","HKD","HNL","HRK","HTG","HUF","IDR","ILS","INR","IQD","IRR","ISK","JMD","JOD","JPY","KES","KGS","KHR","KMF","KPW","KRW","KWD","KYD","KZT","LAK","LBP","LKR","LRD","LSL","LYD","MAD","MDL","MGA","MKD","MMK","MNT","MOP","MRU","MUR","MVR","MWK","MXN","MXV","MYR","MZN","NAD","NGN","NIO","NOK","NPR","NZD","OMR","PAB","PEN","PGK","PHP","PKR","PLN","PYG","QAR","RON","RSD","RUB","RWF","SAR","SBD","SCR","SDG","SEK","SGD","SHP","SLE","SLL","SOS","SRD","SSP","STN","SVC","SYP","SZL","THB","TJS","TMT","TND","TOP","TRY","TTD","TWD","TZS","UAH","UGX","USD","USN","UYI","UYU","UYW","UZS","VED","VES","VND","VUV","WST","XAF","XAG","XAU","XBA","XBB","XBC","XBD","XCD","XDR","XOF","XPD","XPF","XPT","XSU","XTS","XUA","YER","ZAR","ZMW","ZWL"]),SZ=q("isISO4217CurrencyCode",(z)=>yz.has(z),(z,Q)=>{return`if (!_refs[${Q.addRef(yz)}].has(${z})) ${Q.fail("isISO4217CurrencyCode")};`}),Cz=/^\+[1-9]\d{6,14}$/,pZ=q("isPhoneNumber",(z)=>Cz.test(z),(z,Q)=>{return`if (!_re[${Q.addRegex(Cz)}].test(${z})) ${Q.fail("isPhoneNumber")};`});function fZ(z){let Q=z?.minLength??8,Z=z?.minLowercase??1,$=z?.minUppercase??1,K=z?.minNumbers??1,j=z?.minSymbols??1,J=(w)=>{if(w.length<Q)return!1;if(Z>0){if((w.match(/[a-z]/g)||[]).length<Z)return!1}if($>0){if((w.match(/[A-Z]/g)||[]).length<$)return!1}if(K>0){if((w.match(/[0-9]/g)||[]).length<K)return!1}if(j>0){if((w.match(/[^a-zA-Z0-9]/g)||[]).length<j)return!1}return!0},W=(w)=>{if(typeof w!=="string")return!1;return J(w)};return W.emit=(w,b)=>{return`if (!_refs[${b.addRef(J)}](${w})) ${b.fail("isStrongPassword")};`},W.ruleName="isStrongPassword",W.requiresType="string",W}var xz={US:/^\d{2}-\d{7}$/,KR:/^\d{3}-\d{2}-\d{5}$/,DE:/^\d{11}$/,FR:/^[0-9]{13}$/,GB:/^\d{10}$/,IT:/^[A-Z]{6}\d{2}[A-Z]\d{2}[A-Z]\d{3}[A-Z]$/i,ES:/^[0-9A-Z]\d{7}[0-9A-Z]$/i,AU:/^\d{11}$/,CA:/^\d{9}$/,IN:/^[A-Z]{5}\d{4}[A-Z]$/i};function oZ(z){let Q=xz[z],Z=($)=>{if(typeof $!=="string")return!1;if(!Q)return!1;return Q.test($)};return Z.emit=($,K)=>{if(!Q)return K.fail("isTaxId")+";";return`if (!_re[${K.addRegex(Q)}].test(${$})) ${K.fail("isTaxId")};`},Z.ruleName="isTaxId",Z.requiresType="string",Z}function EZ(z){let Q=(Z)=>{if(!Array.isArray(Z))return!1;return z.every(($)=>Z.includes($))};return Q.emit=(Z,$)=>{return`if (!_refs[${$.addRef(z)}].every(function(v){return ${Z}.indexOf(v)!==-1;})) ${$.fail("arrayContains")};`},Q.ruleName="arrayContains",Q}function _Z(z){let Q=(Z)=>{if(!Array.isArray(Z))return!1;return z.every(($)=>!Z.includes($))};return Q.emit=(Z,$)=>{return`if (_refs[${$.addRef(z)}].some(function(v){return ${Z}.indexOf(v)!==-1;})) ${$.fail("arrayNotContains")};`},Q.ruleName="arrayNotContains",Q}function sZ(z){let Q=(Z)=>Array.isArray(Z)&&Z.length>=z;return Q.emit=(Z,$)=>`if (${Z}.length < ${z}) ${$.fail("arrayMinSize")};`,Q.ruleName="arrayMinSize",Q}function NZ(z){let Q=(Z)=>Array.isArray(Z)&&Z.length<=z;return Q.emit=(Z,$)=>`if (${Z}.length > ${z}) ${$.fail("arrayMaxSize")};`,Q.ruleName="arrayMaxSize",Q}function iZ(z){let Q=(Z)=>{if(!Array.isArray(Z))return!1;if(z){let $=Z.map(z);return new Set($).size===$.length}return new Set(Z).size===Z.length};return Q.emit=(Z,$)=>{if(z){let K=$.addRef(z);return`{var _keys=${Z}.map(_refs[${K}]);if(new Set(_keys).size!==_keys.length)${$.fail("arrayUnique")};}`}return`if(new Set(${Z}).size!==${Z}.length)${$.fail("arrayUnique")};`},Q.ruleName="arrayUnique",Q}var E=(z)=>Array.isArray(z)&&z.length>0;E.emit=(z,Q)=>`if (${z}.length === 0) ${Q.fail("arrayNotEmpty")};`;E.ruleName="arrayNotEmpty";var nZ=E;function xZ(z){let Q=(Z)=>{if(Z===null||typeof Z!=="object"||Array.isArray(Z))return!1;let $=Object.keys(Z);if(z?.nullable)return $.some((K)=>Z[K]!=null);return $.length>0};return Q.emit=(Z,$)=>{if(z?.nullable)return`if (!_refs[${$.addRef(Q)}](${Z})) ${$.fail("isNotEmptyObject")};`;return`if (Object.keys(${Z}).length === 0) ${$.fail("isNotEmptyObject")};`},Q.ruleName="isNotEmptyObject",Q}function mZ(z){let Q=(Z)=>Z instanceof z;return Q.emit=(Z,$)=>{let K=$.addRef(z);return`if (!(${Z} instanceof _refs[${K}])) ${$.fail("isInstance")};`},Q.ruleName="isInstance",Q}var mz={"ko-KR":/^(\+?82|0)1[016789]\d{7,8}$/,"en-US":/^\+?1?[2-9]\d{2}[2-9]\d{6}$/,"zh-CN":/^(\+?86)?1[3-9]\d{9}$/,"zh-TW":/^(\+?886)?9\d{8}$/,"ja-JP":/^(\+?81)?0?[789]0[0-9]{8}$/,"de-DE":/^(\+?49)?1(5\d|6[0-9]|7[0-9])\d{8}$/,"fr-FR":/^(\+?33)?[67]\d{8}$/,"en-GB":/^(\+?44)?7[1-9]\d{8}$/,"ru-RU":/^(\+?7)?9\d{9}$/,"pt-BR":/^(\+?55)?[1-9]{2}9?\d{8}$/,"in-IN":/^(\+?91)?[6-9]\d{9}$/,"ar-SA":/^(\+?966)?5\d{8}$/,"ar-EG":/^(\+?20)?1[0125]\d{8}$/,"vi-VN":/^(\+?84)?[35789]\d{8}$/,"th-TH":/^(\+?66)?[689]\d{8}$/,"id-ID":/^(\+?62)?8\d{9,11}$/,"ms-MY":/^(\+?60)?1\d{8,9}$/,"nl-NL":/^(\+?31)?6\d{8}$/,"it-IT":/^(\+?39)?3\d{9}$/,"es-ES":/^(\+?34)?[67]\d{8}$/,"pl-PL":/^(\+?48)?[45789]\d{8}$/};function cZ(z){let Q=mz[z],Z=($)=>{if(typeof $!=="string")return!1;if(!Q)return!1;return Q.test($)};return Z.emit=($,K)=>{if(!Q)return K.fail("isMobilePhone")+";";return`if (!_re[${K.addRegex(Q)}].test(${$})) ${K.fail("isMobilePhone")};`},Z.ruleName="isMobilePhone",Z.requiresType="string",Z}var lz={AD:/^AD\d{3}$/,AT:/^\d{4}$/,AU:/^\d{4}$/,AZ:/^\d{4}$/,BE:/^\d{4}$/,BG:/^\d{4}$/,BR:/^\d{5}-?\d{3}$/,BY:/^\d{6}$/,CA:/^[ABCEGHJKLMNPRSTVXY]\d[ABCEGHJ-NPRSTV-Z] ?\d[ABCEGHJ-NPRSTV-Z]\d$/i,CH:/^\d{4}$/,CN:/^\d{6}$/,CZ:/^\d{3} ?\d{2}$/,DE:/^\d{5}$/,DK:/^\d{4}$/,EE:/^\d{5}$/,ES:/^\d{5}$/,FI:/^\d{5}$/,FR:/^\d{2} ?\d{3}$/,GB:/^(GIR ?0AA|[A-PR-UWYZ]([0-9]{1,2}|([A-HK-Y][0-9]([0-9ABEHMNPRV-Y])?)|[0-9][A-HJKPSTUW]) ?[0-9][ABD-HJLNP-UW-Z]{2})$/i,GR:/^\d{3} ?\d{2}$/,HR:/^\d{5}$/,HU:/^\d{4}$/,ID:/^\d{5}$/,IL:/^\d{5}(\d{2})?$/,IN:/^\d{6}$/,IS:/^\d{3}$/,IT:/^\d{5}$/,JP:/^\d{3}-?\d{4}$/,KR:/^\d{5}$/,LI:/^(948[5-9]|949[0-7])$/,LT:/^LT-\d{5}$/,LU:/^\d{4}$/,LV:/^LV-\d{4}$/,MX:/^\d{5}$/,MT:/^[A-Z]{3} ?\d{4}$/i,MZ:/^\d{4}$/,NL:/^\d{4} ?[A-Z]{2}$/i,NO:/^\d{4}$/,NP:/^\d{5}$/,NZ:/^\d{4}$/,PH:/^\d{4}$/,PK:/^\d{5}$/,PL:/^\d{2}-\d{3}$/,PR:/^009\d{2}([ -]\d{4})?$/,PT:/^\d{4}-\d{3}$/,RO:/^\d{6}$/,RU:/^\d{6}$/,SE:/^\d{3} ?\d{2}$/,SG:/^\d{6}$/,SI:/^\d{4}$/,SK:/^\d{3} ?\d{2}$/,TH:/^\d{5}$/,TN:/^\d{4}$/,TW:/^\d{3}(\d{2})?$/,UA:/^\d{5}$/,US:/^\d{5}(-\d{4})?$/,ZA:/^\d{4}$/,ZM:/^\d{5}$/};function rZ(z){let Q=lz[z],Z=($)=>{if(typeof $!=="string")return!1;if(!Q)return!1;return Q.test($)};return Z.emit=($,K)=>{if(!Q)return K.fail("isPostalCode")+";";return`if (!_re[${K.addRegex(Q)}].test(${$})) ${K.fail("isPostalCode")};`},Z.ruleName="isPostalCode",Z.requiresType="string",Z}var cz={AF:/^\d{8}$/,AL:/^[A-Z]\d{8}[A-Z]$/i,AR:/^\d{7,8}$/,AZ:/^AZE\d{8}$/,BE:/^\d{11}$/,BG:/^\d{10}$/,BR:/^\d{9}$/,BY:/^[A-Z]{2}\d{7}$/i,CA:/^\d{9}$/,CH:/^756\d{10}$/,CN:/^\d{15}(\d{2}[0-9xX])?$/,CY:/^\d{7}[A-Z]$/i,CZ:/^\d{9,10}$/,DE:/^[LI TOUAEVBMNPRSZDFGHCK]{9}$/i,DK:/^\d{10}$/,EE:/^\d{11}$/,ES:/^[0-9X-Z]\d{7}[TRWAGMYFPDXBNJZSQVHLCKE]$/i,FI:/^\d{6}[+-A]\d{3}[0-9A-FHJ-NPR-Y]$/,FR:/^\d{8,9}[0-9\u00C1-\u00FF]{1}$/i,GB:/^[A-Z]{2}\d{6}[A-Z]$/i,GR:/^[A-Z]{2}\d{6}$/i,HR:/^\d{11}$/,HU:/^\d{8}[A-Z]{2}$/i,ID:/^\d{16}$/,IE:/^\d{7}[A-W][A-W]?$/,IL:/^\d{9}$/,IN:/^\d{12}$/,IR:/^\d{10}$/,IS:/^\d{10}$/,IT:/^[A-Z]{6}\d{2}[A-Z]\d{2}[A-Z]\d{3}[A-Z]$/i,JP:/^\d{12}$/,KR:/^\d{6}-\d{7}$/,LT:/^\d{11}$/,LU:/^\d{13}$/,LV:/^\d{6}-\d{5}$/,MK:/^\d{13}$/,MX:/^[A-Z]{4}\d{6}[HM][A-Z]{2}[B-DF-HJ-NP-TV-Z]{3}[A-Z0-9]\d$/i,MT:/^\d{7}[A-Z]$/i,NL:/^\d{9}$/,NO:/^\d{11}$/,PL:/^\d{11}$/,PT:/^[1-9]\d{7}[0-9TV]$/i,RO:/^\d{13}$/,RS:/^\d{13}$/,RU:/^\d{10}$/,SE:/^\d{10,12}$/,SI:/^\d{13}$/,SK:/^\d{9,10}$/,TH:/^\d{13}$/,TR:/^\d{11}$/,TW:/^[A-Z]\d{9}$/i,UA:/^\d{9}$/,US:/^\d{3}-\d{2}-\d{4}$/,ZA:/^\d{13}$/};function tZ(z){let Q=cz[z],Z=($)=>{if(typeof $!=="string")return!1;if(!Q)return!1;return Q.test($)};return Z.emit=($,K)=>{if(!Q)return K.fail("isIdentityCard")+";";return`if (!_re[${K.addRegex(Q)}].test(${$})) ${K.fail("isIdentityCard")};`},Z.ruleName="isIdentityCard",Z.requiresType="string",Z}var rz={AM:/^[A-Z]{2}\d{7}$/i,AR:/^[A-Z]{3}\d{6}$/i,AT:/^[A-Z]\d{7}$/i,AU:/^[A-Z]\d{7}$/i,AZ:/^[Aa]\d{8}$/,BE:/^[A-Z]{2}\d{6}$/i,BG:/^\d{9}$/,BH:/^[A-Z]{2}\d{6}$/i,BR:/^[A-Z]{2}\d{6}$/i,BY:/^[A-Z]{2}\d{7}$/i,CA:/^[A-Z]{2}\d{6}$/i,CH:/^[A-Z]\d{7}$/i,CN:/^G\d{8}$/,CY:/^[A-Z](\d{6}|\d{8})$/i,CZ:/^\d{8}$/,DE:/^[CFGHJKLMNPRTVWXYZ0-9]{9}$/i,DK:/^\d{9}$/,EE:/^([A-Z]\d{7}|[A-Z]{2}\d{7})$/i,ES:/^[A-Z0-9]{2}([A-Z0-9]?)\d{6}$/i,FI:/^[A-Z]{2}\d{7}$/i,FR:/[A-Z0-9]{9}/i,GB:/^\d{9}$/,GR:/^[A-Z]{2}\d{7}$/i,HR:/^\d{9}$/,HU:/^[A-Z]{2}(\d{6}|\d{7})$/i,ID:/^[A-C]\d{7}$/i,IE:/^[A-Z0-9]{2}\d{7}$/i,IL:/^\d{9}$/,IN:/^[A-Z]\d{7}$/i,IR:/^[A-Z]\d{8}$/i,IS:/^(A)\d{7}$/i,IT:/^[A-Z0-9]{9}$/i,JO:/^[A-Z]{2}\d{7}$/i,JP:/^[A-Z]{2}\d{7}$/i,KR:/^[A-Z][A-Z0-9]\d{7}$/i,KW:/^\d{8}$/,KZ:/^[A-Z]\d{8}$/i,LI:/^[A-Z]\d{6}X$/i,LT:/^[A-Z0-9]{8}$/i,LU:/^[A-Z0-9]{8}$/i,LV:/^[A-Z0-9]{2}\d{7}$/i,LY:/^[A-Z]{2}\d{7}$/i,MA:/^[A-Z0-9]{2}\d{7}$/i,MD:/^[A-Z]{2}\d{7}$/i,ME:/^[A-Z]{2}\d{7}$/i,MK:/^[A-Z]\d{7}$/i,MT:/^\d{7}$/,MX:/^[A-Z]\d{8}$/i,MY:/^[AHK]\d{8}[A-Z]$/i,NL:/^[A-NP-Z]{2}[A-NP-Z0-9]{6}\d$/i,NO:/^\d{9}$/,NZ:/^[A-Z]{2}\d{6}$/i,PH:/^[A-Z]\d{7}[A-Z]$/i,PK:/^[A-Z]{2}\d{7}$/i,PL:/^[A-Z]{2}\d{7}$/i,PT:/^[A-Z]\d{6}$/i,RO:/^\d{8}$/,RS:/^\d{9}$/,RU:/^\d{9}$/,SA:/^[A-Z]\d{8}$/i,SE:/^\d{8}$/,SL:/^(P)[A-Z]\d{7}$/i,SK:/^[0-9A-Z]\d{7}$/i,TH:/^[A-Z]{1,2}\d{6,7}$/i,TN:/^\d{8}$/,TR:/^[A-Z]\d{8}$/i,TW:/^[A-Z]\d{9}$/i,UA:/^[A-Z]{2}\d{6}$/i,US:/^\d{9}$/,ZA:/^[A-Z]\d{8}$/i};function vZ(z){let Q=rz[z],Z=($)=>{if(typeof $!=="string")return!1;if(!Q)return!1;return Q.test($)};return Z.emit=($,K)=>{if(!Q)return K.fail("isPassportNumber")+";";return`if (!_re[${K.addRegex(Q)}].test(${$})) ${K.fail("isPassportNumber")};`},Z.ruleName="isPassportNumber",Z.requiresType="string",Z}
|
|
12
|
+
export{vz as eb,ez as fb,az as gb,zQ as hb,QQ as ib,ZQ as jb,KQ as kb,jQ as lb,JQ as mb,qQ as nb,wQ as ob,WQ as pb,bQ as qb,YQ as rb,GQ as sb,FQ as tb,MQ as ub,XQ as vb,UQ as wb,HQ as xb,BQ as yb,PQ as zb,kQ as Ab,yQ as Bb,CQ as Cb,OQ as Db,gQ as Eb,TQ as Fb,LQ as Gb,AQ as Hb,IQ as Ib,dQ as Jb,SQ as Kb,pQ as Lb,fQ as Mb,oQ as Nb,RQ as Ob,EQ as Pb,_Q as Qb,sQ as Rb,NQ as Sb,iQ as Tb,nQ as Ub,uQ as Vb,xQ as Wb,mQ as Xb,lQ as Yb,cQ as Zb,rQ as _b,tQ as $b,vQ as ac,eQ as bc,aQ as cc,zZ as dc,QZ as ec,ZZ as fc,$Z as gc,KZ as hc,jZ as ic,JZ as jc,qZ as kc,wZ as lc,WZ as mc,bZ as nc,YZ as oc,VZ as pc,GZ as qc,FZ as rc,MZ as sc,XZ as tc,UZ as uc,hZ as vc,HZ as wc,BZ as xc,DZ as yc,PZ as zc,kZ as Ac,yZ as Bc,CZ as Cc,OZ as Dc,gZ as Ec,TZ as Fc,LZ as Gc,AZ as Hc,IZ as Ic,dZ as Jc,SZ as Kc,pZ as Lc,fZ as Mc,oZ as Nc,EZ as Oc,_Z as Pc,sZ as Qc,NZ as Rc,iZ as Sc,nZ as Tc,xZ as Uc,mZ as Vc,cZ as Wc,rZ as Xc,tZ as Yc,vZ as Zc};
|
|
13
|
+
|
|
14
|
+
//# debugId=4B47A8B54E42A7B464756E2164756E21
|
|
15
|
+
//# sourceMappingURL=index-6pbm9cq6.js.map
|