sibyl-ts 0.5.0 → 0.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +26 -0
- package/README.md +213 -3
- package/dist/cjs/index.d.ts +3 -0
- package/dist/cjs/index.d.ts.map +1 -1
- package/dist/cjs/index.js +2 -0
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/refine.d.ts +3 -0
- package/dist/cjs/refine.d.ts.map +1 -0
- package/dist/cjs/refine.js +23 -0
- package/dist/cjs/refine.js.map +1 -0
- package/dist/cjs/transform.d.ts +3 -0
- package/dist/cjs/transform.d.ts.map +1 -0
- package/dist/cjs/transform.js +14 -0
- package/dist/cjs/transform.js.map +1 -0
- package/dist/cjs/validators/number.d.ts +3 -0
- package/dist/cjs/validators/number.d.ts.map +1 -1
- package/dist/cjs/validators/number.js +9 -0
- package/dist/cjs/validators/number.js.map +1 -1
- package/dist/cjs/validators/object/index.d.ts +2 -1
- package/dist/cjs/validators/object/index.d.ts.map +1 -1
- package/dist/cjs/validators/object/index.js +2 -1
- package/dist/cjs/validators/object/index.js.map +1 -1
- package/dist/cjs/validators/object/object.d.ts +0 -3
- package/dist/cjs/validators/object/object.d.ts.map +1 -1
- package/dist/cjs/validators/object/object.js.map +1 -1
- package/dist/cjs/validators/object/pick.d.ts +5 -0
- package/dist/cjs/validators/object/pick.d.ts.map +1 -0
- package/dist/cjs/validators/object/pick.js +54 -0
- package/dist/cjs/validators/object/pick.js.map +1 -0
- package/dist/cjs/validators/string/string.d.ts +3 -0
- package/dist/cjs/validators/string/string.d.ts.map +1 -1
- package/dist/cjs/validators/string/string.js +14 -3
- package/dist/cjs/validators/string/string.js.map +1 -1
- package/dist/esm/index.d.ts +3 -0
- package/dist/esm/index.d.ts.map +1 -1
- package/dist/esm/index.js +2 -0
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/refine.d.ts +3 -0
- package/dist/esm/refine.d.ts.map +1 -0
- package/dist/esm/refine.js +19 -0
- package/dist/esm/refine.js.map +1 -0
- package/dist/esm/transform.d.ts +3 -0
- package/dist/esm/transform.d.ts.map +1 -0
- package/dist/esm/transform.js +10 -0
- package/dist/esm/transform.js.map +1 -0
- package/dist/esm/validators/number.d.ts +3 -0
- package/dist/esm/validators/number.d.ts.map +1 -1
- package/dist/esm/validators/number.js +9 -0
- package/dist/esm/validators/number.js.map +1 -1
- package/dist/esm/validators/object/index.d.ts +2 -1
- package/dist/esm/validators/object/index.d.ts.map +1 -1
- package/dist/esm/validators/object/index.js +2 -1
- package/dist/esm/validators/object/index.js.map +1 -1
- package/dist/esm/validators/object/object.d.ts +0 -3
- package/dist/esm/validators/object/object.d.ts.map +1 -1
- package/dist/esm/validators/object/object.js.map +1 -1
- package/dist/esm/validators/object/pick.d.ts +5 -0
- package/dist/esm/validators/object/pick.d.ts.map +1 -0
- package/dist/esm/validators/object/pick.js +50 -0
- package/dist/esm/validators/object/pick.js.map +1 -0
- package/dist/esm/validators/string/string.d.ts +3 -0
- package/dist/esm/validators/string/string.d.ts.map +1 -1
- package/dist/esm/validators/string/string.js +14 -3
- package/dist/esm/validators/string/string.js.map +1 -1
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -5,6 +5,32 @@ All notable changes to this project will be documented in this file.
|
|
|
5
5
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
|
6
6
|
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
7
|
|
|
8
|
+
## [0.7.0] - 2026-01-25
|
|
9
|
+
|
|
10
|
+
### Added
|
|
11
|
+
|
|
12
|
+
- `pick()` validator for creating validators by selecting specific object properties
|
|
13
|
+
- New options for `str()` validator: `startsWith`, `endsWith`, and `trim`
|
|
14
|
+
- New options for `num()` validator: `int`, `positive`, and `negative`
|
|
15
|
+
|
|
16
|
+
## [0.6.1] - 2026-01-23
|
|
17
|
+
|
|
18
|
+
### Fixed
|
|
19
|
+
|
|
20
|
+
- ESLint issue in codebase
|
|
21
|
+
|
|
22
|
+
## [0.6.0] - 2026-01-23
|
|
23
|
+
|
|
24
|
+
### Added
|
|
25
|
+
|
|
26
|
+
- `refine()` validator for custom predicate-based validation
|
|
27
|
+
- `transform()` function for value transformation
|
|
28
|
+
- Exported type inference utilities: `ExtractValidatorType`, `Validator`, `JudgmentResult`
|
|
29
|
+
|
|
30
|
+
### Changed
|
|
31
|
+
|
|
32
|
+
- Overhauled README documentation with "Real World Examples" and better structure
|
|
33
|
+
|
|
8
34
|
## [0.5.0] - 2026-01-16
|
|
9
35
|
|
|
10
36
|
### Added
|
package/README.md
CHANGED
|
@@ -15,6 +15,31 @@
|
|
|
15
15
|
- **Composable**: Build complex validators from simple ones
|
|
16
16
|
- **Dual module support**: Works with both ESM and CommonJS
|
|
17
17
|
|
|
18
|
+
## Table of Contents
|
|
19
|
+
|
|
20
|
+
- [Installation](#installation)
|
|
21
|
+
- [Quick Start](#quick-start)
|
|
22
|
+
- [Usage](#usage)
|
|
23
|
+
- [Basic Validation](#basic-validation)
|
|
24
|
+
- [Object Validation](#object-validation)
|
|
25
|
+
- [Safe Judgment](#safe-judgment-no-exceptions)
|
|
26
|
+
- [Union Types](#union-types)
|
|
27
|
+
- [Optional and Nullable](#optional-and-nullable)
|
|
28
|
+
- [Available Validators](#available-validators)
|
|
29
|
+
- [Primitive Validators](#primitive-validators)
|
|
30
|
+
- [String Validators](#string-validators)
|
|
31
|
+
- [Complex Validators](#complex-validators)
|
|
32
|
+
- [Literal & Enum Validators](#literal--enum-validators)
|
|
33
|
+
- [Modifier Validators](#modifier-validators)
|
|
34
|
+
- [Type Inference](#type-inference)
|
|
35
|
+
- [Real World Examples](#real-world-examples)
|
|
36
|
+
- [TypeScript Configuration](#typescript-configuration)
|
|
37
|
+
- [Error Handling](#error-handling)
|
|
38
|
+
- [Troubleshooting](#troubleshooting)
|
|
39
|
+
- [Contributing](#contributing)
|
|
40
|
+
- [License](#license)
|
|
41
|
+
- [Changelog](#changelog)
|
|
42
|
+
|
|
18
43
|
## Installation
|
|
19
44
|
|
|
20
45
|
```bash
|
|
@@ -65,7 +90,7 @@ const isEnforcer = isEnforcerValidator.judge(true); // Returns: true
|
|
|
65
90
|
### Object Validation
|
|
66
91
|
|
|
67
92
|
```typescript
|
|
68
|
-
import { str, num, obj, array, email } from 'sibyl-ts';
|
|
93
|
+
import { str, num, obj, array, email, date, bool } from 'sibyl-ts';
|
|
69
94
|
|
|
70
95
|
// Define a complex object validator for MWPSB personnel
|
|
71
96
|
const inspectorValidator = obj({
|
|
@@ -200,7 +225,10 @@ idPatternValidator.judge('INS-042'); // ✓
|
|
|
200
225
|
|
|
201
226
|
- `minLen?: number` - Minimum string length
|
|
202
227
|
- `maxLen?: number` - Maximum string length
|
|
203
|
-
- `pattern?:
|
|
228
|
+
- `pattern?: string` - Regex pattern to match
|
|
229
|
+
- `startsWith?: string` - Ensure string starts with a specific prefix
|
|
230
|
+
- `endsWith?: string` - Ensure string ends with a specific suffix
|
|
231
|
+
- `trim?: boolean` - Trim whitespace before validation
|
|
204
232
|
- `coerce?: boolean` - Coerce non-string values to strings
|
|
205
233
|
|
|
206
234
|
---
|
|
@@ -227,6 +255,9 @@ ageValidator.judge(30); // ✓
|
|
|
227
255
|
|
|
228
256
|
- `min?: number` - Minimum value
|
|
229
257
|
- `max?: number` - Maximum value
|
|
258
|
+
- `int?: boolean` - Ensure value is an integer
|
|
259
|
+
- `positive?: boolean` - Ensure value is positive (> 0)
|
|
260
|
+
- `negative?: boolean` - Ensure value is negative (< 0)
|
|
230
261
|
- `coerce?: boolean` - Coerce strings to numbers
|
|
231
262
|
|
|
232
263
|
---
|
|
@@ -460,7 +491,7 @@ partialEnforcerValidator.judge({}); // ✓ Empty object is valid
|
|
|
460
491
|
Creates a validator that omits specific properties from an object validator.
|
|
461
492
|
|
|
462
493
|
```typescript
|
|
463
|
-
import { obj, omit, str, num, bool } from 'sibyl-ts';
|
|
494
|
+
import { obj, omit, str, num, bool, email } from 'sibyl-ts';
|
|
464
495
|
|
|
465
496
|
// Full inspector profile
|
|
466
497
|
const inspectorValidator = obj({
|
|
@@ -498,6 +529,41 @@ publicProfileValidator.judge({
|
|
|
498
529
|
|
|
499
530
|
---
|
|
500
531
|
|
|
532
|
+
#### `pick(objectValidator, keys)`
|
|
533
|
+
|
|
534
|
+
Creates a validator that picks only specific properties from an object validator.
|
|
535
|
+
|
|
536
|
+
```typescript
|
|
537
|
+
import { obj, pick, str, num, email } from 'sibyl-ts';
|
|
538
|
+
|
|
539
|
+
// Full inspector profile
|
|
540
|
+
const inspectorValidator = obj({
|
|
541
|
+
name: str(),
|
|
542
|
+
crimeCoefficient: num({ min: 0, max: 300 }),
|
|
543
|
+
email: email(),
|
|
544
|
+
securityClearance: str(),
|
|
545
|
+
});
|
|
546
|
+
|
|
547
|
+
// Basic profile - pick only non-sensitive fields
|
|
548
|
+
const basicProfileValidator = pick(inspectorValidator, ['name', 'email']);
|
|
549
|
+
|
|
550
|
+
// Only name and email are kept
|
|
551
|
+
const result = basicProfileValidator.judge({
|
|
552
|
+
name: 'Akane Tsunemori',
|
|
553
|
+
email: 'akane.tsunemori@mwpsb.go.jp',
|
|
554
|
+
crimeCoefficient: 28,
|
|
555
|
+
securityClearance: 'Level 1',
|
|
556
|
+
});
|
|
557
|
+
// result: { name: 'Akane Tsunemori', email: 'akane.tsunemori@mwpsb.go.jp' }
|
|
558
|
+
```
|
|
559
|
+
|
|
560
|
+
**Parameters:**
|
|
561
|
+
|
|
562
|
+
- `objectValidator` - An object validator created with `obj()`
|
|
563
|
+
- `keys` - Array of property names to pick
|
|
564
|
+
|
|
565
|
+
---
|
|
566
|
+
|
|
501
567
|
#### `tuple([...validators])`
|
|
502
568
|
|
|
503
569
|
Fixed-length array (tuple) validation.
|
|
@@ -729,6 +795,150 @@ hueColorValidator.judge(undefined); // ✓
|
|
|
729
795
|
|
|
730
796
|
**Type:** `T | null | undefined`
|
|
731
797
|
|
|
798
|
+
---
|
|
799
|
+
|
|
800
|
+
#### `refine(validator, predicate, message)`
|
|
801
|
+
|
|
802
|
+
Refine a validation with a custom predicate function.
|
|
803
|
+
|
|
804
|
+
```typescript
|
|
805
|
+
import { refine, num } from 'sibyl-ts';
|
|
806
|
+
|
|
807
|
+
// Ensure crime coefficient is an integer
|
|
808
|
+
const integerCoefficientValidator = refine(
|
|
809
|
+
num({ min: 0, max: 300 }),
|
|
810
|
+
(val) => Number.isInteger(val),
|
|
811
|
+
'Crime Coefficient must be an integer'
|
|
812
|
+
);
|
|
813
|
+
|
|
814
|
+
integerCoefficientValidator.judge(100); // ✓
|
|
815
|
+
integerCoefficientValidator.judge(100.5); // ✗ Crime Coefficient must be an integer
|
|
816
|
+
```
|
|
817
|
+
|
|
818
|
+
**Parameters:**
|
|
819
|
+
|
|
820
|
+
- `validator` - The base validator
|
|
821
|
+
- `predicate` - Function returning true if valid, false otherwise
|
|
822
|
+
- `message` - Custom error message when predicate fails
|
|
823
|
+
|
|
824
|
+
---
|
|
825
|
+
|
|
826
|
+
#### `transform(validator, transformFn)`
|
|
827
|
+
|
|
828
|
+
Transform a value after validation.
|
|
829
|
+
|
|
830
|
+
```typescript
|
|
831
|
+
import { transform, str } from 'sibyl-ts';
|
|
832
|
+
|
|
833
|
+
// Transform string to uppercase
|
|
834
|
+
const upperCaseValidator = transform(str(), (val) => val.toUpperCase());
|
|
835
|
+
upperCaseValidator.judge('hello'); // 'HELLO'
|
|
836
|
+
|
|
837
|
+
// Transform string to number
|
|
838
|
+
const numberParserValidator = transform(str(), (val) => parseInt(val, 10));
|
|
839
|
+
numberParserValidator.judge('123'); // 123
|
|
840
|
+
```
|
|
841
|
+
|
|
842
|
+
**Parameters:**
|
|
843
|
+
|
|
844
|
+
- `validator` - The base validator
|
|
845
|
+
- `transformFn` - Function that takes the validated value and returns the transformed value
|
|
846
|
+
|
|
847
|
+
## Type Inference
|
|
848
|
+
|
|
849
|
+
Extract TypeScript types from validators using `ExtractValidatorType`:
|
|
850
|
+
|
|
851
|
+
```typescript
|
|
852
|
+
import { obj, str, num, array, ExtractValidatorType } from 'sibyl-ts';
|
|
853
|
+
|
|
854
|
+
// Define an inspector validator
|
|
855
|
+
const inspectorValidator = obj({
|
|
856
|
+
name: str(),
|
|
857
|
+
crimeCoefficient: num({ min: 0, max: 300 }),
|
|
858
|
+
roles: array(str()),
|
|
859
|
+
});
|
|
860
|
+
|
|
861
|
+
// Extract the type
|
|
862
|
+
type Inspector = ExtractValidatorType<typeof inspectorValidator>;
|
|
863
|
+
// { name: string; crimeCoefficient: number; roles: string[] }
|
|
864
|
+
|
|
865
|
+
// Use in your application
|
|
866
|
+
function processInspector(inspector: Inspector) {
|
|
867
|
+
console.log(`Processing ${inspector.name}`);
|
|
868
|
+
}
|
|
869
|
+
```
|
|
870
|
+
|
|
871
|
+
## Real World Examples
|
|
872
|
+
|
|
873
|
+
### Form Validation
|
|
874
|
+
|
|
875
|
+
```typescript
|
|
876
|
+
import { obj, str, num, email, optional } from 'sibyl-ts';
|
|
877
|
+
|
|
878
|
+
const registrationFormValidator = obj({
|
|
879
|
+
username: str({ minLen: 3, maxLen: 20, pattern: /^[a-zA-Z0-9_]+$/ }),
|
|
880
|
+
email: email(),
|
|
881
|
+
password: str({ minLen: 8 }),
|
|
882
|
+
age: num({ min: 18 }),
|
|
883
|
+
bio: optional(str({ maxLen: 500 })),
|
|
884
|
+
});
|
|
885
|
+
|
|
886
|
+
function handleFormSubmit(formData: unknown) {
|
|
887
|
+
const result = registrationFormValidator.tryJudge(formData);
|
|
888
|
+
if (result.type === 'error') {
|
|
889
|
+
return { errors: result.issues };
|
|
890
|
+
}
|
|
891
|
+
return { user: result.data };
|
|
892
|
+
}
|
|
893
|
+
```
|
|
894
|
+
|
|
895
|
+
### API Response Validation
|
|
896
|
+
|
|
897
|
+
```typescript
|
|
898
|
+
import { obj, str, num, array, nullable } from 'sibyl-ts';
|
|
899
|
+
|
|
900
|
+
const apiResponseValidator = obj({
|
|
901
|
+
status: str(),
|
|
902
|
+
data: obj({
|
|
903
|
+
users: array(
|
|
904
|
+
obj({
|
|
905
|
+
id: num(),
|
|
906
|
+
name: str(),
|
|
907
|
+
email: str(),
|
|
908
|
+
lastLogin: nullable(str()),
|
|
909
|
+
})
|
|
910
|
+
),
|
|
911
|
+
pagination: obj({
|
|
912
|
+
page: num(),
|
|
913
|
+
totalPages: num(),
|
|
914
|
+
}),
|
|
915
|
+
}),
|
|
916
|
+
});
|
|
917
|
+
|
|
918
|
+
async function fetchUsers() {
|
|
919
|
+
const response = await fetch('/api/users');
|
|
920
|
+
const json = await response.json();
|
|
921
|
+
return apiResponseValidator.judge(json); // Type-safe response!
|
|
922
|
+
}
|
|
923
|
+
```
|
|
924
|
+
|
|
925
|
+
### Environment Variable Validation
|
|
926
|
+
|
|
927
|
+
```typescript
|
|
928
|
+
import { obj, str, num, transform } from 'sibyl-ts';
|
|
929
|
+
|
|
930
|
+
const envValidator = obj({
|
|
931
|
+
NODE_ENV: str({ pattern: /^(development|production|test)$/ }),
|
|
932
|
+
PORT: transform(str(), (val) => parseInt(val, 10)),
|
|
933
|
+
DATABASE_URL: str({ minLen: 1 }),
|
|
934
|
+
API_KEY: str({ minLen: 32 }),
|
|
935
|
+
});
|
|
936
|
+
|
|
937
|
+
// Validate at startup
|
|
938
|
+
const env = envValidator.judge(process.env);
|
|
939
|
+
console.log(`Server starting on port ${env.PORT}`);
|
|
940
|
+
```
|
|
941
|
+
|
|
732
942
|
## TypeScript Configuration
|
|
733
943
|
|
|
734
944
|
For best results, enable strict mode in your `tsconfig.json`:
|
package/dist/cjs/index.d.ts
CHANGED
|
@@ -1,4 +1,7 @@
|
|
|
1
1
|
export * from './validators';
|
|
2
2
|
export * from './error';
|
|
3
3
|
export * from './withTryJudge';
|
|
4
|
+
export * from './refine';
|
|
5
|
+
export * from './transform';
|
|
6
|
+
export type { Validator, ExtractValidatorType, JudgmentResult } from './common';
|
|
4
7
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/cjs/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,cAAc,SAAS,CAAC;AACxB,cAAc,gBAAgB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,cAAc,SAAS,CAAC;AACxB,cAAc,gBAAgB,CAAC;AAC/B,cAAc,UAAU,CAAC;AACzB,cAAc,aAAa,CAAC;AAC5B,YAAY,EAAE,SAAS,EAAE,oBAAoB,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC"}
|
package/dist/cjs/index.js
CHANGED
|
@@ -17,4 +17,6 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
17
17
|
__exportStar(require("./validators"), exports);
|
|
18
18
|
__exportStar(require("./error"), exports);
|
|
19
19
|
__exportStar(require("./withTryJudge"), exports);
|
|
20
|
+
__exportStar(require("./refine"), exports);
|
|
21
|
+
__exportStar(require("./transform"), exports);
|
|
20
22
|
//# sourceMappingURL=index.js.map
|
package/dist/cjs/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,+CAA6B;AAC7B,0CAAwB;AACxB,iDAA+B"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,+CAA6B;AAC7B,0CAAwB;AACxB,iDAA+B;AAC/B,2CAAyB;AACzB,8CAA4B"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"refine.d.ts","sourceRoot":"","sources":["../../src/refine.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAGrC,eAAO,MAAM,MAAM,GAAI,CAAC,EACtB,WAAW,SAAS,CAAC,CAAC,CAAC,EACvB,WAAW,CAAC,KAAK,EAAE,CAAC,KAAK,OAAO,EAChC,SAAS,MAAM,KACd,SAAS,CAAC,CAAC,CAiBb,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.refine = void 0;
|
|
4
|
+
const error_1 = require("./error");
|
|
5
|
+
const withTryJudge_1 = require("./withTryJudge");
|
|
6
|
+
const refine = (validator, predicate, message) => {
|
|
7
|
+
return (0, withTryJudge_1.withTryJudge)({
|
|
8
|
+
judge(value) {
|
|
9
|
+
const judged = validator.judge(value);
|
|
10
|
+
if (!predicate(judged)) {
|
|
11
|
+
throw new error_1.JudgmentError([
|
|
12
|
+
{
|
|
13
|
+
message,
|
|
14
|
+
path: '',
|
|
15
|
+
},
|
|
16
|
+
]);
|
|
17
|
+
}
|
|
18
|
+
return judged;
|
|
19
|
+
},
|
|
20
|
+
});
|
|
21
|
+
};
|
|
22
|
+
exports.refine = refine;
|
|
23
|
+
//# sourceMappingURL=refine.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"refine.js","sourceRoot":"","sources":["../../src/refine.ts"],"names":[],"mappings":";;;AAAA,mCAAwC;AAExC,iDAA8C;AAEvC,MAAM,MAAM,GAAG,CACpB,SAAuB,EACvB,SAAgC,EAChC,OAAe,EACD,EAAE;IAChB,OAAO,IAAA,2BAAY,EAAC;QAClB,KAAK,CAAC,KAAK;YACT,MAAM,MAAM,GAAG,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YAEtC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC;gBACvB,MAAM,IAAI,qBAAa,CAAC;oBACtB;wBACE,OAAO;wBACP,IAAI,EAAE,EAAE;qBACT;iBACF,CAAC,CAAC;YACL,CAAC;YAED,OAAO,MAAM,CAAC;QAChB,CAAC;KACF,CAAC,CAAC;AACL,CAAC,CAAC;AArBW,QAAA,MAAM,UAqBjB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transform.d.ts","sourceRoot":"","sources":["../../src/transform.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAGrC,eAAO,MAAM,SAAS,GAAI,CAAC,EAAE,CAAC,EAC5B,WAAW,SAAS,CAAC,CAAC,CAAC,EACvB,aAAa,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,KAC3B,SAAS,CAAC,CAAC,CAOb,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.transform = void 0;
|
|
4
|
+
const withTryJudge_1 = require("./withTryJudge");
|
|
5
|
+
const transform = (validator, transformFn) => {
|
|
6
|
+
return (0, withTryJudge_1.withTryJudge)({
|
|
7
|
+
judge: (value) => {
|
|
8
|
+
const validatedValue = validator.judge(value);
|
|
9
|
+
return transformFn(validatedValue);
|
|
10
|
+
},
|
|
11
|
+
});
|
|
12
|
+
};
|
|
13
|
+
exports.transform = transform;
|
|
14
|
+
//# sourceMappingURL=transform.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transform.js","sourceRoot":"","sources":["../../src/transform.ts"],"names":[],"mappings":";;;AACA,iDAA8C;AAEvC,MAAM,SAAS,GAAG,CACvB,SAAuB,EACvB,WAA4B,EACd,EAAE;IAChB,OAAO,IAAA,2BAAY,EAAC;QAClB,KAAK,EAAE,CAAC,KAAc,EAAK,EAAE;YAC3B,MAAM,cAAc,GAAG,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YAC9C,OAAO,WAAW,CAAC,cAAc,CAAC,CAAC;QACrC,CAAC;KACF,CAAC,CAAC;AACL,CAAC,CAAC;AAVW,QAAA,SAAS,aAUpB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"number.d.ts","sourceRoot":"","sources":["../../../src/validators/number.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAK3C,KAAK,aAAa,GAAG;IACnB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB,CAAC;AAUF,eAAO,MAAM,GAAG,GAAI,OAAO,aAAa,KAAG,SAAS,CAAC,MAAM,
|
|
1
|
+
{"version":3,"file":"number.d.ts","sourceRoot":"","sources":["../../../src/validators/number.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAK3C,KAAK,aAAa,GAAG;IACnB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB,CAAC;AAUF,eAAO,MAAM,GAAG,GAAI,OAAO,aAAa,KAAG,SAAS,CAAC,MAAM,CA0C1D,CAAC"}
|
|
@@ -24,6 +24,15 @@ const num = (opts) => {
|
|
|
24
24
|
},
|
|
25
25
|
]);
|
|
26
26
|
}
|
|
27
|
+
if (opts?.int && !Number.isInteger(val)) {
|
|
28
|
+
throw new error_1.JudgmentError([{ message: 'Value is not an integer', path: '' }]);
|
|
29
|
+
}
|
|
30
|
+
if (opts?.positive && val <= 0) {
|
|
31
|
+
throw new error_1.JudgmentError([{ message: 'Value is not positive', path: '' }]);
|
|
32
|
+
}
|
|
33
|
+
if (opts?.negative && val >= 0) {
|
|
34
|
+
throw new error_1.JudgmentError([{ message: 'Value is not negative', path: '' }]);
|
|
35
|
+
}
|
|
27
36
|
if (opts?.min && val < opts.min) {
|
|
28
37
|
throw new error_1.JudgmentError([
|
|
29
38
|
{ message: `Value is too small, expected at least ${opts.min}`, path: '' },
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"number.js","sourceRoot":"","sources":["../../../src/validators/number.ts"],"names":[],"mappings":";;;AACA,kDAA+C;AAC/C,oCAAyC;AACzC,kDAA+C;
|
|
1
|
+
{"version":3,"file":"number.js","sourceRoot":"","sources":["../../../src/validators/number.ts"],"names":[],"mappings":";;;AACA,kDAA+C;AAC/C,oCAAyC;AACzC,kDAA+C;AAW/C,MAAM,YAAY,GAAG,CAAC,KAAc,EAAU,EAAE;IAC9C,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IAC9B,IAAI,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;QAC1B,MAAM,IAAI,qBAAa,CAAC,CAAC,EAAE,OAAO,EAAE,qCAAqC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;IAC1F,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC,CAAC;AAEK,MAAM,GAAG,GAAG,CAAC,IAAoB,EAAqB,EAAE;IAC7D,OAAO,IAAA,2BAAY,EAAC;QAClB,KAAK,CAAC,KAAK;YACT,MAAM,GAAG,GAAG,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;YAEvD,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;gBAC5B,MAAM,SAAS,GAAG,IAAA,2BAAY,EAAC,GAAG,CAAC,CAAC;gBACpC,MAAM,IAAI,qBAAa,CAAC;oBACtB;wBACE,OAAO,EAAE,YAAY,SAAS,mBAAmB;wBACjD,IAAI,EAAE,EAAE;qBACT;iBACF,CAAC,CAAC;YACL,CAAC;YAED,IAAI,IAAI,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC;gBACxC,MAAM,IAAI,qBAAa,CAAC,CAAC,EAAE,OAAO,EAAE,yBAAyB,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;YAC9E,CAAC;YAED,IAAI,IAAI,EAAE,QAAQ,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC;gBAC/B,MAAM,IAAI,qBAAa,CAAC,CAAC,EAAE,OAAO,EAAE,uBAAuB,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;YAC5E,CAAC;YAED,IAAI,IAAI,EAAE,QAAQ,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC;gBAC/B,MAAM,IAAI,qBAAa,CAAC,CAAC,EAAE,OAAO,EAAE,uBAAuB,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;YAC5E,CAAC;YAED,IAAI,IAAI,EAAE,GAAG,IAAI,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;gBAChC,MAAM,IAAI,qBAAa,CAAC;oBACtB,EAAE,OAAO,EAAE,yCAAyC,IAAI,CAAC,GAAG,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE;iBAC3E,CAAC,CAAC;YACL,CAAC;YAED,IAAI,IAAI,EAAE,GAAG,IAAI,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;gBAChC,MAAM,IAAI,qBAAa,CAAC;oBACtB,EAAE,OAAO,EAAE,sCAAsC,IAAI,CAAC,GAAG,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE;iBACxE,CAAC,CAAC;YACL,CAAC;YAED,OAAO,GAAG,CAAC;QACb,CAAC;KACF,CAAC,CAAC;AACL,CAAC,CAAC;AA1CW,QAAA,GAAG,OA0Cd"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/validators/object/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAC;AACzB,cAAc,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/validators/object/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAC;AACzB,cAAc,QAAQ,CAAC;AACvB,cAAc,QAAQ,CAAC;AACvB,cAAc,WAAW,CAAC"}
|
|
@@ -15,6 +15,7 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
|
15
15
|
};
|
|
16
16
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
17
|
__exportStar(require("./object"), exports);
|
|
18
|
-
__exportStar(require("./partial"), exports);
|
|
19
18
|
__exportStar(require("./omit"), exports);
|
|
19
|
+
__exportStar(require("./pick"), exports);
|
|
20
|
+
__exportStar(require("./partial"), exports);
|
|
20
21
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/validators/object/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,2CAAyB;AACzB,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/validators/object/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,2CAAyB;AACzB,yCAAuB;AACvB,yCAAuB;AACvB,4CAA0B"}
|
|
@@ -1,6 +1,3 @@
|
|
|
1
1
|
import type { Validator } from '../../common';
|
|
2
|
-
export type InferObjectType<Schema extends Record<string, Validator>> = {
|
|
3
|
-
[K in keyof Schema]: Schema[K] extends Validator<infer T> ? T : never;
|
|
4
|
-
};
|
|
5
2
|
export declare const obj: <T extends Record<string, unknown>>(schema: { [K in keyof T]: Validator<T[K]>; }) => Validator<T>;
|
|
6
3
|
//# sourceMappingURL=object.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"object.d.ts","sourceRoot":"","sources":["../../../../src/validators/object/object.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"object.d.ts","sourceRoot":"","sources":["../../../../src/validators/object/object.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAK9C,eAAO,MAAM,GAAG,GAAI,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,QAAQ,GAC5D,CAAC,IAAI,MAAM,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAChC,KAAG,SAAS,CAAC,CAAC,CA6Dd,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"object.js","sourceRoot":"","sources":["../../../../src/validators/object/object.ts"],"names":[],"mappings":";;;AACA,qDAAkD;AAClD,uCAAgE;AAChE,qDAAkD;
|
|
1
|
+
{"version":3,"file":"object.js","sourceRoot":"","sources":["../../../../src/validators/object/object.ts"],"names":[],"mappings":";;;AACA,qDAAkD;AAClD,uCAAgE;AAChE,qDAAkD;AAE3C,MAAM,GAAG,GAAG,CAAoC,MAEtD,EAAgB,EAAE;IACjB,OAAO,IAAA,2BAAY,EAAC;QAClB,KAAK,CAAC,KAAK;YACT,IACE,KAAK,KAAK,IAAI;gBACd,KAAK,KAAK,SAAS;gBACnB,OAAO,KAAK,KAAK,QAAQ;gBACzB,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;gBACpB,KAAK,YAAY,IAAI,EACrB,CAAC;gBACD,MAAM,SAAS,GAAG,IAAA,2BAAY,EAAC,KAAK,CAAC,CAAC;gBACtC,MAAM,IAAI,qBAAa,CAAC;oBACtB;wBACE,OAAO,EAAE,YAAY,SAAS,mBAAmB;wBACjD,IAAI,EAAE,EAAE;qBACT;iBACF,CAAC,CAAC;YACL,CAAC;YAED,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,CAItD,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,SAAS,CAAkC,EAAE,EAAE;gBACzD,MAAM,UAAU,GAAG,KAAK,CAAC,GAAyB,CAAC,CAAC;gBAEpD,IAAI,CAAC;oBACH,MAAM,WAAW,GAAG,SAAS,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;oBAChD,OAAO;wBACL,GAAG,GAAG;wBACN,MAAM,EAAE,EAAE,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,WAAW,EAAE;qBAC9C,CAAC;gBACJ,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,IAAI,KAAK,YAAY,qBAAa,EAAE,CAAC;wBACnC,MAAM,cAAc,GAAG,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;4BAClD,OAAO,EAAE,KAAK,CAAC,OAAO;4BACtB,IAAI,EAAE,KAAK,CAAC,IAAI;gCACd,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;oCAC1B,CAAC,CAAC,GAAG,GAAG,GAAG,KAAK,CAAC,IAAI,EAAE;oCACvB,CAAC,CAAC,GAAG,GAAG,IAAI,KAAK,CAAC,IAAI,EAAE;gCAC1B,CAAC,CAAC,GAAG;yBACR,CAAC,CAAC,CAAC;wBACJ,OAAO;4BACL,GAAG,GAAG;4BACN,MAAM,EAAE,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,GAAG,cAAc,CAAC;yBAC3C,CAAC;oBACJ,CAAC;yBAAM,CAAC;wBACN,MAAM,KAAK,CAAC;oBACd,CAAC;gBACH,CAAC;YACH,CAAC,EACD,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,CAC3B,CAAC;YAEF,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACtB,MAAM,IAAI,qBAAa,CAAC,MAAM,CAAC,CAAC;YAClC,CAAC;YAED,OAAO,MAAW,CAAC;QACrB,CAAC;KACF,CAAC,CAAC;AACL,CAAC,CAAC;AA/DW,QAAA,GAAG,OA+Dd"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { Validator } from '../../common';
|
|
2
|
+
type ArrToLiteral<T extends readonly unknown[]> = T[number];
|
|
3
|
+
export declare const pick: <T extends Record<string, unknown>, K extends readonly (keyof T)[]>(validator: Validator<T>, keys: K) => Validator<Pick<T, ArrToLiteral<K>>>;
|
|
4
|
+
export {};
|
|
5
|
+
//# sourceMappingURL=pick.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pick.d.ts","sourceRoot":"","sources":["../../../../src/validators/object/pick.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAKzC,KAAK,YAAY,CAAC,CAAC,SAAS,SAAS,OAAO,EAAE,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC;AAE5D,eAAO,MAAM,IAAI,GAAI,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC,SAAS,SAAS,CAAC,MAAM,CAAC,CAAC,EAAE,EACpF,WAAW,SAAS,CAAC,CAAC,CAAC,EACvB,MAAM,CAAC,KACN,SAAS,CAAC,IAAI,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC,CA0DpC,CAAC"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.pick = void 0;
|
|
4
|
+
const error_1 = require("../../error");
|
|
5
|
+
const getValueType_1 = require("../../getValueType");
|
|
6
|
+
const withTryJudge_1 = require("../../withTryJudge");
|
|
7
|
+
const pick = (validator, keys) => {
|
|
8
|
+
const keysSet = new Set(keys);
|
|
9
|
+
return (0, withTryJudge_1.withTryJudge)({
|
|
10
|
+
judge(value) {
|
|
11
|
+
if (value === null ||
|
|
12
|
+
value === undefined ||
|
|
13
|
+
typeof value !== 'object' ||
|
|
14
|
+
Array.isArray(value) ||
|
|
15
|
+
value instanceof Date) {
|
|
16
|
+
const valueType = (0, getValueType_1.getValueType)(value);
|
|
17
|
+
throw new error_1.JudgmentError([
|
|
18
|
+
{
|
|
19
|
+
message: `Value is ${valueType}, expected object`,
|
|
20
|
+
path: '',
|
|
21
|
+
},
|
|
22
|
+
]);
|
|
23
|
+
}
|
|
24
|
+
const result = validator.tryJudge(value);
|
|
25
|
+
if (result.type === 'success') {
|
|
26
|
+
// Functional approach: filter entries and rebuild object
|
|
27
|
+
const filtered = Object.fromEntries(Object.entries(result.data).filter(([key]) => keysSet.has(key)));
|
|
28
|
+
return filtered;
|
|
29
|
+
}
|
|
30
|
+
// Filter out errors for non-picked keys
|
|
31
|
+
const pickedErrors = result.issues.filter((issue) => {
|
|
32
|
+
// Extract the root key from the path
|
|
33
|
+
const rootKey = issue.path.split('.')[0].split('[')[0];
|
|
34
|
+
// If path is empty (root error), we keep it if reasonable, but for objects usually errors have paths
|
|
35
|
+
if (!rootKey)
|
|
36
|
+
return true;
|
|
37
|
+
return keysSet.has(rootKey);
|
|
38
|
+
});
|
|
39
|
+
if (pickedErrors.length > 0) {
|
|
40
|
+
throw new error_1.JudgmentError(pickedErrors);
|
|
41
|
+
}
|
|
42
|
+
// If all errors were in non-picked fields, we might still have a partial valid object?
|
|
43
|
+
// But `Validator<T>` implies we need a valid `T` to pick from?
|
|
44
|
+
// The `omit` implementation logic tries to return partial data if errors were omitted.
|
|
45
|
+
// Similarly here, if errors are in non-picked keys, we can try to return the picked part of `value`.
|
|
46
|
+
// BUT `value` might be partial or invalid.
|
|
47
|
+
// Safest is to extract picked keys from `value` (which we effectively established is an object).
|
|
48
|
+
const filtered = Object.fromEntries(Object.entries(value).filter(([key]) => keysSet.has(key)));
|
|
49
|
+
return filtered;
|
|
50
|
+
},
|
|
51
|
+
});
|
|
52
|
+
};
|
|
53
|
+
exports.pick = pick;
|
|
54
|
+
//# sourceMappingURL=pick.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pick.js","sourceRoot":"","sources":["../../../../src/validators/object/pick.ts"],"names":[],"mappings":";;;AACA,uCAA4C;AAC5C,qDAAkD;AAClD,qDAAkD;AAI3C,MAAM,IAAI,GAAG,CAClB,SAAuB,EACvB,IAAO,EAC8B,EAAE;IACvC,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,IAAyB,CAAC,CAAC;IAEnD,OAAO,IAAA,2BAAY,EAAC;QAClB,KAAK,CAAC,KAAK;YACT,IACE,KAAK,KAAK,IAAI;gBACd,KAAK,KAAK,SAAS;gBACnB,OAAO,KAAK,KAAK,QAAQ;gBACzB,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;gBACpB,KAAK,YAAY,IAAI,EACrB,CAAC;gBACD,MAAM,SAAS,GAAG,IAAA,2BAAY,EAAC,KAAK,CAAC,CAAC;gBACtC,MAAM,IAAI,qBAAa,CAAC;oBACtB;wBACE,OAAO,EAAE,YAAY,SAAS,mBAAmB;wBACjD,IAAI,EAAE,EAAE;qBACT;iBACF,CAAC,CAAC;YACL,CAAC;YAED,MAAM,MAAM,GAAG,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;YAEzC,IAAI,MAAM,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;gBAC9B,yDAAyD;gBACzD,MAAM,QAAQ,GAAG,MAAM,CAAC,WAAW,CACjC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAChE,CAAC;gBACF,OAAO,QAAoC,CAAC;YAC9C,CAAC;YAED,wCAAwC;YACxC,MAAM,YAAY,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE;gBAClD,qCAAqC;gBACrC,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;gBACvD,qGAAqG;gBACrG,IAAI,CAAC,OAAO;oBAAE,OAAO,IAAI,CAAC;gBAC1B,OAAO,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YAC9B,CAAC,CAAC,CAAC;YAEH,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC5B,MAAM,IAAI,qBAAa,CAAC,YAAY,CAAC,CAAC;YACxC,CAAC;YAED,uFAAuF;YACvF,+DAA+D;YAC/D,uFAAuF;YACvF,qGAAqG;YACrG,2CAA2C;YAC3C,iGAAiG;YAEjG,MAAM,QAAQ,GAAG,MAAM,CAAC,WAAW,CACjC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAC1D,CAAC;YAEF,OAAO,QAAoC,CAAC;QAC9C,CAAC;KACF,CAAC,CAAC;AACL,CAAC,CAAC;AA7DW,QAAA,IAAI,QA6Df"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"string.d.ts","sourceRoot":"","sources":["../../../../src/validators/string/string.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAK9C,KAAK,aAAa,GAAG;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB,CAAC;AAIF,eAAO,MAAM,GAAG,GAAI,OAAO,aAAa,KAAG,SAAS,CAAC,MAAM,
|
|
1
|
+
{"version":3,"file":"string.d.ts","sourceRoot":"","sources":["../../../../src/validators/string/string.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAK9C,KAAK,aAAa,GAAG;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB,CAAC;AAIF,eAAO,MAAM,GAAG,GAAI,OAAO,aAAa,KAAG,SAAS,CAAC,MAAM,CAgD1D,CAAC"}
|
|
@@ -8,9 +8,9 @@ const coerceString = (value) => String(value);
|
|
|
8
8
|
const str = (opts) => {
|
|
9
9
|
return (0, withTryJudge_1.withTryJudge)({
|
|
10
10
|
judge(value) {
|
|
11
|
-
const
|
|
12
|
-
if (typeof
|
|
13
|
-
const valueType = (0, getValueType_1.getValueType)(
|
|
11
|
+
const rawVal = opts?.coerce ? coerceString(value) : value;
|
|
12
|
+
if (typeof rawVal !== 'string') {
|
|
13
|
+
const valueType = (0, getValueType_1.getValueType)(rawVal);
|
|
14
14
|
throw new error_1.JudgmentError([
|
|
15
15
|
{
|
|
16
16
|
message: `Value is ${valueType}, expected string`,
|
|
@@ -18,6 +18,7 @@ const str = (opts) => {
|
|
|
18
18
|
},
|
|
19
19
|
]);
|
|
20
20
|
}
|
|
21
|
+
const val = opts?.trim ? rawVal.trim() : rawVal;
|
|
21
22
|
if (opts?.minLen && val.length < opts.minLen) {
|
|
22
23
|
throw new error_1.JudgmentError([
|
|
23
24
|
{ message: `Value is too short, expected at least ${opts.minLen} characters`, path: '' },
|
|
@@ -28,6 +29,16 @@ const str = (opts) => {
|
|
|
28
29
|
{ message: `Value is too long, expected at most ${opts.maxLen} characters`, path: '' },
|
|
29
30
|
]);
|
|
30
31
|
}
|
|
32
|
+
if (opts?.startsWith && !val.startsWith(opts.startsWith)) {
|
|
33
|
+
throw new error_1.JudgmentError([
|
|
34
|
+
{ message: `Value does not start with '${opts.startsWith}'`, path: '' },
|
|
35
|
+
]);
|
|
36
|
+
}
|
|
37
|
+
if (opts?.endsWith && !val.endsWith(opts.endsWith)) {
|
|
38
|
+
throw new error_1.JudgmentError([
|
|
39
|
+
{ message: `Value does not end with '${opts.endsWith}'`, path: '' },
|
|
40
|
+
]);
|
|
41
|
+
}
|
|
31
42
|
if (opts?.pattern && !new RegExp(opts.pattern).test(val)) {
|
|
32
43
|
throw new error_1.JudgmentError([{ message: 'Value does not match the pattern', path: '' }]);
|
|
33
44
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"string.js","sourceRoot":"","sources":["../../../../src/validators/string/string.ts"],"names":[],"mappings":";;;AACA,qDAAkD;AAClD,uCAA4C;AAC5C,qDAAkD;
|
|
1
|
+
{"version":3,"file":"string.js","sourceRoot":"","sources":["../../../../src/validators/string/string.ts"],"names":[],"mappings":";;;AACA,qDAAkD;AAClD,uCAA4C;AAC5C,qDAAkD;AAYlD,MAAM,YAAY,GAAG,CAAC,KAAc,EAAU,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAExD,MAAM,GAAG,GAAG,CAAC,IAAoB,EAAqB,EAAE;IAC7D,OAAO,IAAA,2BAAY,EAAC;QAClB,KAAK,CAAC,KAAK;YACT,MAAM,MAAM,GAAG,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;YAE1D,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;gBAC/B,MAAM,SAAS,GAAG,IAAA,2BAAY,EAAC,MAAM,CAAC,CAAC;gBACvC,MAAM,IAAI,qBAAa,CAAC;oBACtB;wBACE,OAAO,EAAE,YAAY,SAAS,mBAAmB;wBACjD,IAAI,EAAE,EAAE;qBACT;iBACF,CAAC,CAAC;YACL,CAAC;YAED,MAAM,GAAG,GAAG,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC;YAEhD,IAAI,IAAI,EAAE,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;gBAC7C,MAAM,IAAI,qBAAa,CAAC;oBACtB,EAAE,OAAO,EAAE,yCAAyC,IAAI,CAAC,MAAM,aAAa,EAAE,IAAI,EAAE,EAAE,EAAE;iBACzF,CAAC,CAAC;YACL,CAAC;YAED,IAAI,IAAI,EAAE,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;gBAC7C,MAAM,IAAI,qBAAa,CAAC;oBACtB,EAAE,OAAO,EAAE,uCAAuC,IAAI,CAAC,MAAM,aAAa,EAAE,IAAI,EAAE,EAAE,EAAE;iBACvF,CAAC,CAAC;YACL,CAAC;YAED,IAAI,IAAI,EAAE,UAAU,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;gBACzD,MAAM,IAAI,qBAAa,CAAC;oBACtB,EAAE,OAAO,EAAE,8BAA8B,IAAI,CAAC,UAAU,GAAG,EAAE,IAAI,EAAE,EAAE,EAAE;iBACxE,CAAC,CAAC;YACL,CAAC;YAED,IAAI,IAAI,EAAE,QAAQ,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;gBACnD,MAAM,IAAI,qBAAa,CAAC;oBACtB,EAAE,OAAO,EAAE,4BAA4B,IAAI,CAAC,QAAQ,GAAG,EAAE,IAAI,EAAE,EAAE,EAAE;iBACpE,CAAC,CAAC;YACL,CAAC;YAED,IAAI,IAAI,EAAE,OAAO,IAAI,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;gBACzD,MAAM,IAAI,qBAAa,CAAC,CAAC,EAAE,OAAO,EAAE,kCAAkC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;YACvF,CAAC;YAED,OAAO,GAAG,CAAC;QACb,CAAC;KACF,CAAC,CAAC;AACL,CAAC,CAAC;AAhDW,QAAA,GAAG,OAgDd"}
|
package/dist/esm/index.d.ts
CHANGED
|
@@ -1,4 +1,7 @@
|
|
|
1
1
|
export * from './validators';
|
|
2
2
|
export * from './error';
|
|
3
3
|
export * from './withTryJudge';
|
|
4
|
+
export * from './refine';
|
|
5
|
+
export * from './transform';
|
|
6
|
+
export type { Validator, ExtractValidatorType, JudgmentResult } from './common';
|
|
4
7
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/esm/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,cAAc,SAAS,CAAC;AACxB,cAAc,gBAAgB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,cAAc,SAAS,CAAC;AACxB,cAAc,gBAAgB,CAAC;AAC/B,cAAc,UAAU,CAAC;AACzB,cAAc,aAAa,CAAC;AAC5B,YAAY,EAAE,SAAS,EAAE,oBAAoB,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC"}
|
package/dist/esm/index.js
CHANGED
package/dist/esm/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,cAAc,SAAS,CAAC;AACxB,cAAc,gBAAgB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,cAAc,SAAS,CAAC;AACxB,cAAc,gBAAgB,CAAC;AAC/B,cAAc,UAAU,CAAC;AACzB,cAAc,aAAa,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"refine.d.ts","sourceRoot":"","sources":["../../src/refine.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAGrC,eAAO,MAAM,MAAM,GAAI,CAAC,EACtB,WAAW,SAAS,CAAC,CAAC,CAAC,EACvB,WAAW,CAAC,KAAK,EAAE,CAAC,KAAK,OAAO,EAChC,SAAS,MAAM,KACd,SAAS,CAAC,CAAC,CAiBb,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { JudgmentError } from './error';
|
|
2
|
+
import { withTryJudge } from './withTryJudge';
|
|
3
|
+
export const refine = (validator, predicate, message) => {
|
|
4
|
+
return withTryJudge({
|
|
5
|
+
judge(value) {
|
|
6
|
+
const judged = validator.judge(value);
|
|
7
|
+
if (!predicate(judged)) {
|
|
8
|
+
throw new JudgmentError([
|
|
9
|
+
{
|
|
10
|
+
message,
|
|
11
|
+
path: '',
|
|
12
|
+
},
|
|
13
|
+
]);
|
|
14
|
+
}
|
|
15
|
+
return judged;
|
|
16
|
+
},
|
|
17
|
+
});
|
|
18
|
+
};
|
|
19
|
+
//# sourceMappingURL=refine.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"refine.js","sourceRoot":"","sources":["../../src/refine.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAExC,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAE9C,MAAM,CAAC,MAAM,MAAM,GAAG,CACpB,SAAuB,EACvB,SAAgC,EAChC,OAAe,EACD,EAAE;IAChB,OAAO,YAAY,CAAC;QAClB,KAAK,CAAC,KAAK;YACT,MAAM,MAAM,GAAG,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YAEtC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC;gBACvB,MAAM,IAAI,aAAa,CAAC;oBACtB;wBACE,OAAO;wBACP,IAAI,EAAE,EAAE;qBACT;iBACF,CAAC,CAAC;YACL,CAAC;YAED,OAAO,MAAM,CAAC;QAChB,CAAC;KACF,CAAC,CAAC;AACL,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transform.d.ts","sourceRoot":"","sources":["../../src/transform.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAGrC,eAAO,MAAM,SAAS,GAAI,CAAC,EAAE,CAAC,EAC5B,WAAW,SAAS,CAAC,CAAC,CAAC,EACvB,aAAa,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,KAC3B,SAAS,CAAC,CAAC,CAOb,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { withTryJudge } from './withTryJudge';
|
|
2
|
+
export const transform = (validator, transformFn) => {
|
|
3
|
+
return withTryJudge({
|
|
4
|
+
judge: (value) => {
|
|
5
|
+
const validatedValue = validator.judge(value);
|
|
6
|
+
return transformFn(validatedValue);
|
|
7
|
+
},
|
|
8
|
+
});
|
|
9
|
+
};
|
|
10
|
+
//# sourceMappingURL=transform.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transform.js","sourceRoot":"","sources":["../../src/transform.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAE9C,MAAM,CAAC,MAAM,SAAS,GAAG,CACvB,SAAuB,EACvB,WAA4B,EACd,EAAE;IAChB,OAAO,YAAY,CAAC;QAClB,KAAK,EAAE,CAAC,KAAc,EAAK,EAAE;YAC3B,MAAM,cAAc,GAAG,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YAC9C,OAAO,WAAW,CAAC,cAAc,CAAC,CAAC;QACrC,CAAC;KACF,CAAC,CAAC;AACL,CAAC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"number.d.ts","sourceRoot":"","sources":["../../../src/validators/number.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAK3C,KAAK,aAAa,GAAG;IACnB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB,CAAC;AAUF,eAAO,MAAM,GAAG,GAAI,OAAO,aAAa,KAAG,SAAS,CAAC,MAAM,
|
|
1
|
+
{"version":3,"file":"number.d.ts","sourceRoot":"","sources":["../../../src/validators/number.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAK3C,KAAK,aAAa,GAAG;IACnB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB,CAAC;AAUF,eAAO,MAAM,GAAG,GAAI,OAAO,aAAa,KAAG,SAAS,CAAC,MAAM,CA0C1D,CAAC"}
|
|
@@ -21,6 +21,15 @@ export const num = (opts) => {
|
|
|
21
21
|
},
|
|
22
22
|
]);
|
|
23
23
|
}
|
|
24
|
+
if (opts?.int && !Number.isInteger(val)) {
|
|
25
|
+
throw new JudgmentError([{ message: 'Value is not an integer', path: '' }]);
|
|
26
|
+
}
|
|
27
|
+
if (opts?.positive && val <= 0) {
|
|
28
|
+
throw new JudgmentError([{ message: 'Value is not positive', path: '' }]);
|
|
29
|
+
}
|
|
30
|
+
if (opts?.negative && val >= 0) {
|
|
31
|
+
throw new JudgmentError([{ message: 'Value is not negative', path: '' }]);
|
|
32
|
+
}
|
|
24
33
|
if (opts?.min && val < opts.min) {
|
|
25
34
|
throw new JudgmentError([
|
|
26
35
|
{ message: `Value is too small, expected at least ${opts.min}`, path: '' },
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"number.js","sourceRoot":"","sources":["../../../src/validators/number.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"number.js","sourceRoot":"","sources":["../../../src/validators/number.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAW/C,MAAM,YAAY,GAAG,CAAC,KAAc,EAAU,EAAE;IAC9C,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IAC9B,IAAI,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;QAC1B,MAAM,IAAI,aAAa,CAAC,CAAC,EAAE,OAAO,EAAE,qCAAqC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;IAC1F,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,GAAG,GAAG,CAAC,IAAoB,EAAqB,EAAE;IAC7D,OAAO,YAAY,CAAC;QAClB,KAAK,CAAC,KAAK;YACT,MAAM,GAAG,GAAG,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;YAEvD,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;gBAC5B,MAAM,SAAS,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC;gBACpC,MAAM,IAAI,aAAa,CAAC;oBACtB;wBACE,OAAO,EAAE,YAAY,SAAS,mBAAmB;wBACjD,IAAI,EAAE,EAAE;qBACT;iBACF,CAAC,CAAC;YACL,CAAC;YAED,IAAI,IAAI,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC;gBACxC,MAAM,IAAI,aAAa,CAAC,CAAC,EAAE,OAAO,EAAE,yBAAyB,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;YAC9E,CAAC;YAED,IAAI,IAAI,EAAE,QAAQ,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC;gBAC/B,MAAM,IAAI,aAAa,CAAC,CAAC,EAAE,OAAO,EAAE,uBAAuB,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;YAC5E,CAAC;YAED,IAAI,IAAI,EAAE,QAAQ,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC;gBAC/B,MAAM,IAAI,aAAa,CAAC,CAAC,EAAE,OAAO,EAAE,uBAAuB,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;YAC5E,CAAC;YAED,IAAI,IAAI,EAAE,GAAG,IAAI,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;gBAChC,MAAM,IAAI,aAAa,CAAC;oBACtB,EAAE,OAAO,EAAE,yCAAyC,IAAI,CAAC,GAAG,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE;iBAC3E,CAAC,CAAC;YACL,CAAC;YAED,IAAI,IAAI,EAAE,GAAG,IAAI,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;gBAChC,MAAM,IAAI,aAAa,CAAC;oBACtB,EAAE,OAAO,EAAE,sCAAsC,IAAI,CAAC,GAAG,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE;iBACxE,CAAC,CAAC;YACL,CAAC;YAED,OAAO,GAAG,CAAC;QACb,CAAC;KACF,CAAC,CAAC;AACL,CAAC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/validators/object/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAC;AACzB,cAAc,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/validators/object/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAC;AACzB,cAAc,QAAQ,CAAC;AACvB,cAAc,QAAQ,CAAC;AACvB,cAAc,WAAW,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/validators/object/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAC;AACzB,cAAc,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/validators/object/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAC;AACzB,cAAc,QAAQ,CAAC;AACvB,cAAc,QAAQ,CAAC;AACvB,cAAc,WAAW,CAAC"}
|
|
@@ -1,6 +1,3 @@
|
|
|
1
1
|
import type { Validator } from '../../common';
|
|
2
|
-
export type InferObjectType<Schema extends Record<string, Validator>> = {
|
|
3
|
-
[K in keyof Schema]: Schema[K] extends Validator<infer T> ? T : never;
|
|
4
|
-
};
|
|
5
2
|
export declare const obj: <T extends Record<string, unknown>>(schema: { [K in keyof T]: Validator<T[K]>; }) => Validator<T>;
|
|
6
3
|
//# sourceMappingURL=object.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"object.d.ts","sourceRoot":"","sources":["../../../../src/validators/object/object.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"object.d.ts","sourceRoot":"","sources":["../../../../src/validators/object/object.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAK9C,eAAO,MAAM,GAAG,GAAI,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,QAAQ,GAC5D,CAAC,IAAI,MAAM,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAChC,KAAG,SAAS,CAAC,CAAC,CA6Dd,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"object.js","sourceRoot":"","sources":["../../../../src/validators/object/object.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,aAAa,EAAsB,MAAM,aAAa,CAAC;AAChE,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"object.js","sourceRoot":"","sources":["../../../../src/validators/object/object.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,aAAa,EAAsB,MAAM,aAAa,CAAC;AAChE,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAElD,MAAM,CAAC,MAAM,GAAG,GAAG,CAAoC,MAEtD,EAAgB,EAAE;IACjB,OAAO,YAAY,CAAC;QAClB,KAAK,CAAC,KAAK;YACT,IACE,KAAK,KAAK,IAAI;gBACd,KAAK,KAAK,SAAS;gBACnB,OAAO,KAAK,KAAK,QAAQ;gBACzB,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;gBACpB,KAAK,YAAY,IAAI,EACrB,CAAC;gBACD,MAAM,SAAS,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;gBACtC,MAAM,IAAI,aAAa,CAAC;oBACtB;wBACE,OAAO,EAAE,YAAY,SAAS,mBAAmB;wBACjD,IAAI,EAAE,EAAE;qBACT;iBACF,CAAC,CAAC;YACL,CAAC;YAED,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,CAItD,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,SAAS,CAAkC,EAAE,EAAE;gBACzD,MAAM,UAAU,GAAG,KAAK,CAAC,GAAyB,CAAC,CAAC;gBAEpD,IAAI,CAAC;oBACH,MAAM,WAAW,GAAG,SAAS,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;oBAChD,OAAO;wBACL,GAAG,GAAG;wBACN,MAAM,EAAE,EAAE,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,WAAW,EAAE;qBAC9C,CAAC;gBACJ,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,IAAI,KAAK,YAAY,aAAa,EAAE,CAAC;wBACnC,MAAM,cAAc,GAAG,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;4BAClD,OAAO,EAAE,KAAK,CAAC,OAAO;4BACtB,IAAI,EAAE,KAAK,CAAC,IAAI;gCACd,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;oCAC1B,CAAC,CAAC,GAAG,GAAG,GAAG,KAAK,CAAC,IAAI,EAAE;oCACvB,CAAC,CAAC,GAAG,GAAG,IAAI,KAAK,CAAC,IAAI,EAAE;gCAC1B,CAAC,CAAC,GAAG;yBACR,CAAC,CAAC,CAAC;wBACJ,OAAO;4BACL,GAAG,GAAG;4BACN,MAAM,EAAE,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,GAAG,cAAc,CAAC;yBAC3C,CAAC;oBACJ,CAAC;yBAAM,CAAC;wBACN,MAAM,KAAK,CAAC;oBACd,CAAC;gBACH,CAAC;YACH,CAAC,EACD,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,CAC3B,CAAC;YAEF,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACtB,MAAM,IAAI,aAAa,CAAC,MAAM,CAAC,CAAC;YAClC,CAAC;YAED,OAAO,MAAW,CAAC;QACrB,CAAC;KACF,CAAC,CAAC;AACL,CAAC,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { Validator } from '../../common';
|
|
2
|
+
type ArrToLiteral<T extends readonly unknown[]> = T[number];
|
|
3
|
+
export declare const pick: <T extends Record<string, unknown>, K extends readonly (keyof T)[]>(validator: Validator<T>, keys: K) => Validator<Pick<T, ArrToLiteral<K>>>;
|
|
4
|
+
export {};
|
|
5
|
+
//# sourceMappingURL=pick.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pick.d.ts","sourceRoot":"","sources":["../../../../src/validators/object/pick.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAKzC,KAAK,YAAY,CAAC,CAAC,SAAS,SAAS,OAAO,EAAE,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC;AAE5D,eAAO,MAAM,IAAI,GAAI,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC,SAAS,SAAS,CAAC,MAAM,CAAC,CAAC,EAAE,EACpF,WAAW,SAAS,CAAC,CAAC,CAAC,EACvB,MAAM,CAAC,KACN,SAAS,CAAC,IAAI,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC,CA0DpC,CAAC"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { JudgmentError } from '../../error';
|
|
2
|
+
import { getValueType } from '../../getValueType';
|
|
3
|
+
import { withTryJudge } from '../../withTryJudge';
|
|
4
|
+
export const pick = (validator, keys) => {
|
|
5
|
+
const keysSet = new Set(keys);
|
|
6
|
+
return withTryJudge({
|
|
7
|
+
judge(value) {
|
|
8
|
+
if (value === null ||
|
|
9
|
+
value === undefined ||
|
|
10
|
+
typeof value !== 'object' ||
|
|
11
|
+
Array.isArray(value) ||
|
|
12
|
+
value instanceof Date) {
|
|
13
|
+
const valueType = getValueType(value);
|
|
14
|
+
throw new JudgmentError([
|
|
15
|
+
{
|
|
16
|
+
message: `Value is ${valueType}, expected object`,
|
|
17
|
+
path: '',
|
|
18
|
+
},
|
|
19
|
+
]);
|
|
20
|
+
}
|
|
21
|
+
const result = validator.tryJudge(value);
|
|
22
|
+
if (result.type === 'success') {
|
|
23
|
+
// Functional approach: filter entries and rebuild object
|
|
24
|
+
const filtered = Object.fromEntries(Object.entries(result.data).filter(([key]) => keysSet.has(key)));
|
|
25
|
+
return filtered;
|
|
26
|
+
}
|
|
27
|
+
// Filter out errors for non-picked keys
|
|
28
|
+
const pickedErrors = result.issues.filter((issue) => {
|
|
29
|
+
// Extract the root key from the path
|
|
30
|
+
const rootKey = issue.path.split('.')[0].split('[')[0];
|
|
31
|
+
// If path is empty (root error), we keep it if reasonable, but for objects usually errors have paths
|
|
32
|
+
if (!rootKey)
|
|
33
|
+
return true;
|
|
34
|
+
return keysSet.has(rootKey);
|
|
35
|
+
});
|
|
36
|
+
if (pickedErrors.length > 0) {
|
|
37
|
+
throw new JudgmentError(pickedErrors);
|
|
38
|
+
}
|
|
39
|
+
// If all errors were in non-picked fields, we might still have a partial valid object?
|
|
40
|
+
// But `Validator<T>` implies we need a valid `T` to pick from?
|
|
41
|
+
// The `omit` implementation logic tries to return partial data if errors were omitted.
|
|
42
|
+
// Similarly here, if errors are in non-picked keys, we can try to return the picked part of `value`.
|
|
43
|
+
// BUT `value` might be partial or invalid.
|
|
44
|
+
// Safest is to extract picked keys from `value` (which we effectively established is an object).
|
|
45
|
+
const filtered = Object.fromEntries(Object.entries(value).filter(([key]) => keysSet.has(key)));
|
|
46
|
+
return filtered;
|
|
47
|
+
},
|
|
48
|
+
});
|
|
49
|
+
};
|
|
50
|
+
//# sourceMappingURL=pick.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pick.js","sourceRoot":"","sources":["../../../../src/validators/object/pick.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAIlD,MAAM,CAAC,MAAM,IAAI,GAAG,CAClB,SAAuB,EACvB,IAAO,EAC8B,EAAE;IACvC,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,IAAyB,CAAC,CAAC;IAEnD,OAAO,YAAY,CAAC;QAClB,KAAK,CAAC,KAAK;YACT,IACE,KAAK,KAAK,IAAI;gBACd,KAAK,KAAK,SAAS;gBACnB,OAAO,KAAK,KAAK,QAAQ;gBACzB,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;gBACpB,KAAK,YAAY,IAAI,EACrB,CAAC;gBACD,MAAM,SAAS,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;gBACtC,MAAM,IAAI,aAAa,CAAC;oBACtB;wBACE,OAAO,EAAE,YAAY,SAAS,mBAAmB;wBACjD,IAAI,EAAE,EAAE;qBACT;iBACF,CAAC,CAAC;YACL,CAAC;YAED,MAAM,MAAM,GAAG,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;YAEzC,IAAI,MAAM,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;gBAC9B,yDAAyD;gBACzD,MAAM,QAAQ,GAAG,MAAM,CAAC,WAAW,CACjC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAChE,CAAC;gBACF,OAAO,QAAoC,CAAC;YAC9C,CAAC;YAED,wCAAwC;YACxC,MAAM,YAAY,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE;gBAClD,qCAAqC;gBACrC,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;gBACvD,qGAAqG;gBACrG,IAAI,CAAC,OAAO;oBAAE,OAAO,IAAI,CAAC;gBAC1B,OAAO,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YAC9B,CAAC,CAAC,CAAC;YAEH,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC5B,MAAM,IAAI,aAAa,CAAC,YAAY,CAAC,CAAC;YACxC,CAAC;YAED,uFAAuF;YACvF,+DAA+D;YAC/D,uFAAuF;YACvF,qGAAqG;YACrG,2CAA2C;YAC3C,iGAAiG;YAEjG,MAAM,QAAQ,GAAG,MAAM,CAAC,WAAW,CACjC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAC1D,CAAC;YAEF,OAAO,QAAoC,CAAC;QAC9C,CAAC;KACF,CAAC,CAAC;AACL,CAAC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"string.d.ts","sourceRoot":"","sources":["../../../../src/validators/string/string.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAK9C,KAAK,aAAa,GAAG;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB,CAAC;AAIF,eAAO,MAAM,GAAG,GAAI,OAAO,aAAa,KAAG,SAAS,CAAC,MAAM,
|
|
1
|
+
{"version":3,"file":"string.d.ts","sourceRoot":"","sources":["../../../../src/validators/string/string.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAK9C,KAAK,aAAa,GAAG;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB,CAAC;AAIF,eAAO,MAAM,GAAG,GAAI,OAAO,aAAa,KAAG,SAAS,CAAC,MAAM,CAgD1D,CAAC"}
|
|
@@ -5,9 +5,9 @@ const coerceString = (value) => String(value);
|
|
|
5
5
|
export const str = (opts) => {
|
|
6
6
|
return withTryJudge({
|
|
7
7
|
judge(value) {
|
|
8
|
-
const
|
|
9
|
-
if (typeof
|
|
10
|
-
const valueType = getValueType(
|
|
8
|
+
const rawVal = opts?.coerce ? coerceString(value) : value;
|
|
9
|
+
if (typeof rawVal !== 'string') {
|
|
10
|
+
const valueType = getValueType(rawVal);
|
|
11
11
|
throw new JudgmentError([
|
|
12
12
|
{
|
|
13
13
|
message: `Value is ${valueType}, expected string`,
|
|
@@ -15,6 +15,7 @@ export const str = (opts) => {
|
|
|
15
15
|
},
|
|
16
16
|
]);
|
|
17
17
|
}
|
|
18
|
+
const val = opts?.trim ? rawVal.trim() : rawVal;
|
|
18
19
|
if (opts?.minLen && val.length < opts.minLen) {
|
|
19
20
|
throw new JudgmentError([
|
|
20
21
|
{ message: `Value is too short, expected at least ${opts.minLen} characters`, path: '' },
|
|
@@ -25,6 +26,16 @@ export const str = (opts) => {
|
|
|
25
26
|
{ message: `Value is too long, expected at most ${opts.maxLen} characters`, path: '' },
|
|
26
27
|
]);
|
|
27
28
|
}
|
|
29
|
+
if (opts?.startsWith && !val.startsWith(opts.startsWith)) {
|
|
30
|
+
throw new JudgmentError([
|
|
31
|
+
{ message: `Value does not start with '${opts.startsWith}'`, path: '' },
|
|
32
|
+
]);
|
|
33
|
+
}
|
|
34
|
+
if (opts?.endsWith && !val.endsWith(opts.endsWith)) {
|
|
35
|
+
throw new JudgmentError([
|
|
36
|
+
{ message: `Value does not end with '${opts.endsWith}'`, path: '' },
|
|
37
|
+
]);
|
|
38
|
+
}
|
|
28
39
|
if (opts?.pattern && !new RegExp(opts.pattern).test(val)) {
|
|
29
40
|
throw new JudgmentError([{ message: 'Value does not match the pattern', path: '' }]);
|
|
30
41
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"string.js","sourceRoot":"","sources":["../../../../src/validators/string/string.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"string.js","sourceRoot":"","sources":["../../../../src/validators/string/string.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAYlD,MAAM,YAAY,GAAG,CAAC,KAAc,EAAU,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAE/D,MAAM,CAAC,MAAM,GAAG,GAAG,CAAC,IAAoB,EAAqB,EAAE;IAC7D,OAAO,YAAY,CAAC;QAClB,KAAK,CAAC,KAAK;YACT,MAAM,MAAM,GAAG,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;YAE1D,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;gBAC/B,MAAM,SAAS,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;gBACvC,MAAM,IAAI,aAAa,CAAC;oBACtB;wBACE,OAAO,EAAE,YAAY,SAAS,mBAAmB;wBACjD,IAAI,EAAE,EAAE;qBACT;iBACF,CAAC,CAAC;YACL,CAAC;YAED,MAAM,GAAG,GAAG,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC;YAEhD,IAAI,IAAI,EAAE,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;gBAC7C,MAAM,IAAI,aAAa,CAAC;oBACtB,EAAE,OAAO,EAAE,yCAAyC,IAAI,CAAC,MAAM,aAAa,EAAE,IAAI,EAAE,EAAE,EAAE;iBACzF,CAAC,CAAC;YACL,CAAC;YAED,IAAI,IAAI,EAAE,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;gBAC7C,MAAM,IAAI,aAAa,CAAC;oBACtB,EAAE,OAAO,EAAE,uCAAuC,IAAI,CAAC,MAAM,aAAa,EAAE,IAAI,EAAE,EAAE,EAAE;iBACvF,CAAC,CAAC;YACL,CAAC;YAED,IAAI,IAAI,EAAE,UAAU,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;gBACzD,MAAM,IAAI,aAAa,CAAC;oBACtB,EAAE,OAAO,EAAE,8BAA8B,IAAI,CAAC,UAAU,GAAG,EAAE,IAAI,EAAE,EAAE,EAAE;iBACxE,CAAC,CAAC;YACL,CAAC;YAED,IAAI,IAAI,EAAE,QAAQ,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;gBACnD,MAAM,IAAI,aAAa,CAAC;oBACtB,EAAE,OAAO,EAAE,4BAA4B,IAAI,CAAC,QAAQ,GAAG,EAAE,IAAI,EAAE,EAAE,EAAE;iBACpE,CAAC,CAAC;YACL,CAAC;YAED,IAAI,IAAI,EAAE,OAAO,IAAI,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;gBACzD,MAAM,IAAI,aAAa,CAAC,CAAC,EAAE,OAAO,EAAE,kCAAkC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;YACvF,CAAC;YAED,OAAO,GAAG,CAAC;QACb,CAAC;KACF,CAAC,CAAC;AACL,CAAC,CAAC"}
|