sibyl-ts 0.6.1 → 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 +8 -0
- package/README.md +42 -1
- 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/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/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/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,14 @@ 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
|
+
|
|
8
16
|
## [0.6.1] - 2026-01-23
|
|
9
17
|
|
|
10
18
|
### Fixed
|
package/README.md
CHANGED
|
@@ -225,7 +225,10 @@ idPatternValidator.judge('INS-042'); // ✓
|
|
|
225
225
|
|
|
226
226
|
- `minLen?: number` - Minimum string length
|
|
227
227
|
- `maxLen?: number` - Maximum string length
|
|
228
|
-
- `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
|
|
229
232
|
- `coerce?: boolean` - Coerce non-string values to strings
|
|
230
233
|
|
|
231
234
|
---
|
|
@@ -252,6 +255,9 @@ ageValidator.judge(30); // ✓
|
|
|
252
255
|
|
|
253
256
|
- `min?: number` - Minimum value
|
|
254
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)
|
|
255
261
|
- `coerce?: boolean` - Coerce strings to numbers
|
|
256
262
|
|
|
257
263
|
---
|
|
@@ -523,6 +529,41 @@ publicProfileValidator.judge({
|
|
|
523
529
|
|
|
524
530
|
---
|
|
525
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
|
+
|
|
526
567
|
#### `tuple([...validators])`
|
|
527
568
|
|
|
528
569
|
Fixed-length array (tuple) validation.
|
|
@@ -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"}
|
|
@@ -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"}
|
|
@@ -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"}
|
|
@@ -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"}
|